ZGlmZiAtLWdpdCBhL2NvcmUvc3JjL21haW4vamF2YS9icm9va2x5bi9lbnRpdHkvZ3JvdXAvQWJzdHJhY3RNZW1iZXJzaGlwVHJhY2tpbmdQb2xpY3kuamF2YSBiL2NvcmUvc3JjL21haW4vamF2YS9icm9va2x5bi9lbnRpdHkvZ3JvdXAvQWJzdHJhY3RNZW1iZXJzaGlwVHJhY2tpbmdQb2xpY3kuamF2YQppbmRleCA0NWNiOGI2Li4wNDlkNDljIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9tYWluL2phdmEvYnJvb2tseW4vZW50aXR5L2dyb3VwL0Fic3RyYWN0TWVtYmVyc2hpcFRyYWNraW5nUG9saWN5LmphdmEKKysrIGIvY29yZS9zcmMvbWFpbi9qYXZhL2Jyb29rbHluL2VudGl0eS9ncm91cC9BYnN0cmFjdE1lbWJlcnNoaXBUcmFja2luZ1BvbGljeS5qYXZhCkBAIC0xLDI1ICsxLDMwIEBACiBwYWNrYWdlIGJyb29rbHluLmVudGl0eS5ncm91cDsKIAotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudE1hcDsKIAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKK2ltcG9ydCBicm9va2x5bi5jb25maWcuQ29uZmlnS2V5OwogaW1wb3J0IGJyb29rbHluLmVudGl0eS5FbnRpdHk7CiBpbXBvcnQgYnJvb2tseW4uZW50aXR5Lkdyb3VwOworaW1wb3J0IGJyb29rbHluLmVudGl0eS5iYXNpYy5BdHRyaWJ1dGVzOworaW1wb3J0IGJyb29rbHluLmVudGl0eS5iYXNpYy5Db25maWdLZXlzOwogaW1wb3J0IGJyb29rbHluLmVudGl0eS5iYXNpYy5EeW5hbWljR3JvdXA7CiBpbXBvcnQgYnJvb2tseW4uZW50aXR5LnRyYWl0LlN0YXJ0YWJsZTsKIGltcG9ydCBicm9va2x5bi5ldmVudC5TZW5zb3I7CiBpbXBvcnQgYnJvb2tseW4uZXZlbnQuU2Vuc29yRXZlbnQ7CiBpbXBvcnQgYnJvb2tseW4uZXZlbnQuU2Vuc29yRXZlbnRMaXN0ZW5lcjsKIGltcG9ydCBicm9va2x5bi5wb2xpY3kuYmFzaWMuQWJzdHJhY3RQb2xpY3k7Ci1pbXBvcnQgYnJvb2tseW4udXRpbC5mbGFncy5TZXRGcm9tRmxhZzsKK2ltcG9ydCBicm9va2x5bi51dGlsLmNvbGxlY3Rpb25zLk11dGFibGVNYXA7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5yZWZsZWN0LlR5cGVUb2tlbjsKIAogLyoqIGFic3RyYWN0IGNsYXNzIHdoaWNoIGhlbHBzIHRyYWNrIG1lbWJlcnNoaXAgb2YgYSBncm91cCwgaW52b2tpbmcgKGVtcHR5KSBtZXRob2RzIGluIHRoaXMgY2xhc3Mgb24gTUVNQkVSe0FEREVELFJFTU9WRUR9IGV2ZW50cywgYXMgd2VsbCBhcyBTRVJWSUNFX1VQIHt0cnVlLGZhbHNlfSBmb3IgdGhvc2UgbWVtYmVycy4gKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1lbWJlcnNoaXBUcmFja2luZ1BvbGljeSBleHRlbmRzIEFic3RyYWN0UG9saWN5IHsKQEAgLTI3LDE4ICszMiwzNCBAQAogICAgIAogICAgIHByaXZhdGUgR3JvdXAgZ3JvdXA7CiAgICAgCi0gICAgQFNldEZyb21GbGFnCi0gICAgcHJpdmF0ZSBTZXQ8U2Vuc29yPD8+PiBzZW5zb3JzVG9UcmFjazsKKyAgICBwcml2YXRlIENvbmN1cnJlbnRNYXA8U3RyaW5nLE1hcDxTZW5zb3I8T2JqZWN0PiwgT2JqZWN0Pj4gZW50aXR5U2Vuc29yQ2FjaGUgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLCBNYXA8U2Vuc29yPE9iamVjdD4sIE9iamVjdD4+KCk7CisgICAgCisgICAgQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb25maWdLZXk8U2V0PFNlbnNvcjw/Pj4+IFNFTlNPUlNfVE9fVFJBQ0sgPSBDb25maWdLZXlzLm5ld0NvbmZpZ0tleSgKKyAgICAgICAgICAgIG5ldyBUeXBlVG9rZW48U2V0PFNlbnNvcjw/Pj4+KCkge30sCisgICAgICAgICAgICAic2Vuc29yc1RvVHJhY2siLAorICAgICAgICAgICAgIlNlbnNvcnMgb2YgbWVtYmVycyB0byBiZSBtb25pdG9yZWQgKGltcGxpY2l0bHkgYWRkcyBzZXJ2aWNlLXVwIHRvIHRoaXMgbGlzdCwgYnV0IHRoYXQgYmVoYXZpb3VyIG1heSBiZSBkZWxldGVkIGluIGEgc3Vic2VxdWVudCByZWxlYXNlISkiLAorICAgICAgICAgICAgSW1tdXRhYmxlU2V0LjxTZW5zb3I8Pz4+b2YoKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbmZpZ0tleTxCb29sZWFuPiBOT1RJRllfT05fRFVQTElDQVRFUyA9IENvbmZpZ0tleXMubmV3Qm9vbGVhbkNvbmZpZ0tleSgibm90aWZ5T25EdXBsaWNhdGVzIiwKKyAgICAgICAgICAgICJXaGV0aGVyIHRvIG5vdGlmeSBsaXN0ZW5lcnMgd2hlbiBhIHNlbnNvciBpcyBwdWJsaXNoZWQgd2l0aCB0aGUgc2FtZSB2YWx1ZSBhcyBsYXN0IHRpbWUiLAorICAgICAgICAgICAgdHJ1ZSk7CiAgICAgCiAgICAgcHVibGljIEFic3RyYWN0TWVtYmVyc2hpcFRyYWNraW5nUG9saWN5KE1hcDw/LD8+IGZsYWdzKSB7CiAgICAgICAgIHN1cGVyKGZsYWdzKTsKLSAgICAgICAgaWYgKHNlbnNvcnNUb1RyYWNrID09IG51bGwpICBzZW5zb3JzVG9UcmFjayA9IFNldHMubmV3TGlua2VkSGFzaFNldCgpOwogICAgIH0KICAgICAKICAgICBwdWJsaWMgQWJzdHJhY3RNZW1iZXJzaGlwVHJhY2tpbmdQb2xpY3koKSB7Ci0gICAgICAgIHRoaXMoQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSk7CisgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCisgICAgcHJvdGVjdGVkIFNldDxTZW5zb3I8Pz4+IGdldFNlbnNvcnNUb1RyYWNrKCkgeworICAgICAgICByZXR1cm4gSW1tdXRhYmxlU2V0LjxTZW5zb3I8Pz4+YnVpbGRlcigpCisgICAgICAgICAgICAgICAgLmFkZEFsbChnZXRSZXF1aXJlZENvbmZpZyhTRU5TT1JTX1RPX1RSQUNLKSkKKyAgICAgICAgICAgICAgICAuYWRkKEF0dHJpYnV0ZXMuU0VSVklDRV9VUCkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICB9CisgICAgCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgZ3JvdXAgdG8gYmUgdHJhY2tlZDsgdW5zdWJzY3JpYmVzIGZyb20gYW55IHByZXZpb3VzIGdyb3VwLCBhbmQgc3Vic2NyaWJlcyB0byB0aGlzIGdyb3VwLgogICAgICAqIApAQCAtNzMsMTUgKzk0LDExIEBACiAgICAgICAgICAgICBzdWJzY3JpYmVUb0dyb3VwKCk7CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICAvLyBUT0RPIGhhdmluZyAic3Vic2NyaWJlIHRvIGNoYW5nZXMgb25seSIgc2VtYW50aWNzIGFzIHBhcnQgb2Ygc3Vic2NyaXB0aW9uIHdvdWxkIGJlIG11Y2ggY2xlYW5lcgotICAgIC8vIHRoYW4gdGhpcyBsaWdodHdlaWdodCBtYXAKLSAgICBNYXA8U3RyaW5nLEJvb2xlYW4+IGxhc3RLbm93blNlcnZpY2VVcENhY2hlID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgQm9vbGVhbj4oKTsKICAgICAKICAgICBwcm90ZWN0ZWQgdm9pZCBzdWJzY3JpYmVUb0dyb3VwKCkgewogICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbChncm91cCwgIlRoZSBncm91cCBjYW5ub3QgYmUgbnVsbCIpOwogCi0gICAgICAgIExPRy5kZWJ1ZygiU3Vic2NyaWJpbmcgdG8gZ3JvdXAgIitncm91cCsiLCBmb3IgbWVtYmVyQWRkZWQsIG1lbWJlclJlbW92ZWQsIHNlcnZpY2VVcCwgYW5kIHt9Iiwgc2Vuc29yc1RvVHJhY2spOworICAgICAgICBMT0cuZGVidWcoIlN1YnNjcmliaW5nIHRvIGdyb3VwICIrZ3JvdXArIiwgZm9yIG1lbWJlckFkZGVkLCBtZW1iZXJSZW1vdmVkLCBzZXJ2aWNlVXAsIGFuZCB7fSIsIGdldFNlbnNvcnNUb1RyYWNrKCkpOwogICAgICAgICAKICAgICAgICAgc3Vic2NyaWJlKGdyb3VwLCBEeW5hbWljR3JvdXAuTUVNQkVSX0FEREVELCBuZXcgU2Vuc29yRXZlbnRMaXN0ZW5lcjxFbnRpdHk+KCkgewogICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIG9uRXZlbnQoU2Vuc29yRXZlbnQ8RW50aXR5PiBldmVudCkgewpAQCAtOTAsMjEgKzEwNywzNyBAQAogICAgICAgICB9KTsKICAgICAgICAgc3Vic2NyaWJlKGdyb3VwLCBEeW5hbWljR3JvdXAuTUVNQkVSX1JFTU9WRUQsIG5ldyBTZW5zb3JFdmVudExpc3RlbmVyPEVudGl0eT4oKSB7CiAgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgb25FdmVudChTZW5zb3JFdmVudDxFbnRpdHk+IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgbGFzdEtub3duU2VydmljZVVwQ2FjaGUucmVtb3ZlKGV2ZW50LmdldFNvdXJjZSgpKTsKKyAgICAgICAgICAgICAgICBlbnRpdHlTZW5zb3JDYWNoZS5yZW1vdmUoZXZlbnQuZ2V0U291cmNlKCkuZ2V0SWQoKSk7CiAgICAgICAgICAgICAgICAgb25FbnRpdHlFdmVudChFdmVudFR5cGUuRU5USVRZX1JFTU9WRUQsIGV2ZW50LmdldFZhbHVlKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9KTsKLSAgICAgICAgc3Vic2NyaWJlVG9NZW1iZXJzKGdyb3VwLCBTdGFydGFibGUuU0VSVklDRV9VUCwgbmV3IFNlbnNvckV2ZW50TGlzdGVuZXI8Qm9vbGVhbj4oKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgb25FdmVudChTZW5zb3JFdmVudDxCb29sZWFuPiBldmVudCkgewotICAgICAgICAgICAgICAgIGlmIChldmVudC5nZXRWYWx1ZSgpID09IGxhc3RLbm93blNlcnZpY2VVcENhY2hlLnB1dChldmVudC5nZXRTb3VyY2UoKS5nZXRJZCgpLCBldmVudC5nZXRWYWx1ZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGlmIHZhbHVlIGhhcyBub3QgY2hhbmdlZAotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgb25FbnRpdHlFdmVudChFdmVudFR5cGUuRU5USVRZX0NIQU5HRSwgZXZlbnQuZ2V0U291cmNlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZm9yIChTZW5zb3I8Pz4gc2Vuc29yIDogc2Vuc29yc1RvVHJhY2spIHsKKworICAgICAgICBmb3IgKFNlbnNvcjw/PiBzZW5zb3IgOiBnZXRTZW5zb3JzVG9UcmFjaygpKSB7CiAgICAgICAgICAgICBzdWJzY3JpYmVUb01lbWJlcnMoZ3JvdXAsIHNlbnNvciwgbmV3IFNlbnNvckV2ZW50TGlzdGVuZXI8T2JqZWN0PigpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIGhhc1dhcm5lZE9mU2VydmljZVVwID0gZmFsc2U7CisgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIG9uRXZlbnQoU2Vuc29yRXZlbnQ8T2JqZWN0PiBldmVudCkgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5vdGlmeU9uRHVwbGljYXRlcyA9IGdldFJlcXVpcmVkQ29uZmlnKE5PVElGWV9PTl9EVVBMSUNBVEVTKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFN0YXJ0YWJsZS5TRVJWSUNFX1VQLmVxdWFscyhldmVudC5nZXRTZW5zb3IoKSkgJiYgbm90aWZ5T25EdXBsaWNhdGVzICYmICFoYXNXYXJuZWRPZlNlcnZpY2VVcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HLndhcm4oIkRlcHJlY2F0ZWQgYmVoYXZpb3VyOiBub3Qgbm90aWZ5aW5nIG9mIGR1cGxpY2F0ZSB2YWx1ZSBmb3Igc2VydmljZS11cCBpbiB7fSwgZ3JvdXAge30iLCBBYnN0cmFjdE1lbWJlcnNoaXBUcmFja2luZ1BvbGljeS50aGlzLCBncm91cCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoYXNXYXJuZWRPZlNlcnZpY2VVcCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlPbkR1cGxpY2F0ZXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVudGl0eUlkID0gZXZlbnQuZ2V0U291cmNlKCkuZ2V0SWQoKTsKKworICAgICAgICAgICAgICAgICAgICBNYXA8U2Vuc29yPE9iamVjdD4sIE9iamVjdD4gbmV3TWFwID0gTXV0YWJsZU1hcC48U2Vuc29yPE9iamVjdD4sIE9iamVjdD5vZigpOworICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBwdXRJZkFic2VudCByZXR1cm5zIG51bGwgaWYgdGhlIGtleSBpcyBub3QgcHJlc2VudCwgb3IgdGhlICpwcmV2aW91cyogdmFsdWUgaWYgcHJlc2VudAorICAgICAgICAgICAgICAgICAgICBNYXA8U2Vuc29yPE9iamVjdD4sIE9iamVjdD4gc2Vuc29yQ2FjaGUgPSBlbnRpdHlTZW5zb3JDYWNoZS5wdXRJZkFic2VudChlbnRpdHlJZCwgbmV3TWFwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlbnNvckNhY2hlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbnNvckNhY2hlID0gbmV3TWFwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAoIW5vdGlmeU9uRHVwbGljYXRlcyAmJiBPYmplY3RzLmVxdWFsKGV2ZW50LmdldFZhbHVlKCksIHNlbnNvckNhY2hlLnB1dChldmVudC5nZXRTZW5zb3IoKSwgZXZlbnQuZ2V0VmFsdWUoKSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaWYgdmFsdWUgaGFzIG5vdCBjaGFuZ2VkCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICBvbkVudGl0eUV2ZW50KEV2ZW50VHlwZS5FTlRJVFlfQ0hBTkdFLCBldmVudC5nZXRTb3VyY2UoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSk7CmRpZmYgLS1naXQgYS9jb3JlL3NyYy90ZXN0L2phdmEvYnJvb2tseW4vZW50aXR5L2dyb3VwL0R5bmFtaWNDbHVzdGVyVGVzdC5ncm9vdnkgYi9jb3JlL3NyYy90ZXN0L2phdmEvYnJvb2tseW4vZW50aXR5L2dyb3VwL0R5bmFtaWNDbHVzdGVyVGVzdC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNmFiYmMuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvdGVzdC9qYXZhL2Jyb29rbHluL2VudGl0eS9ncm91cC9EeW5hbWljQ2x1c3RlclRlc3QuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNzI2ICswLDAgQEAKLXBhY2thZ2UgYnJvb2tseW4uZW50aXR5Lmdyb3VwCi0KLWltcG9ydCBicm9va2x5bi5lbnRpdHkuYmFzaWMuQXR0cmlidXRlcwotaW1wb3J0IGJyb29rbHluLmVudGl0eS5iYXNpYy5MaWZlY3ljbGUKLQotaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC4qCi0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdAotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcgotCi1pbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlck1ldGhvZAotaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kCi1pbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0Ci0KLWltcG9ydCBicm9va2x5bi5lbnRpdHkuQXBwbGljYXRpb24KLWltcG9ydCBicm9va2x5bi5lbnRpdHkuRW50aXR5Ci1pbXBvcnQgYnJvb2tseW4uZW50aXR5LmJhc2ljLkFwcGxpY2F0aW9uQnVpbGRlcgotaW1wb3J0IGJyb29rbHluLmVudGl0eS5iYXNpYy5Ccm9va2x5blRhc2tUYWdzCi1pbXBvcnQgYnJvb2tseW4uZW50aXR5LmJhc2ljLkVudGl0aWVzCi1pbXBvcnQgYnJvb2tseW4uZW50aXR5LnByb3h5aW5nLkVudGl0eVNwZWMKLWltcG9ydCBicm9va2x5bi5lbnRpdHkudHJhaXQuQ2hhbmdlYWJsZQotaW1wb3J0IGJyb29rbHluLmxvY2F0aW9uLkxvY2F0aW9uCi1pbXBvcnQgYnJvb2tseW4ubG9jYXRpb24uYmFzaWMuU2ltdWxhdGVkTG9jYXRpb24KLWltcG9ydCBicm9va2x5bi5tYW5hZ2VtZW50LlRhc2sKLWltcG9ydCBicm9va2x5bi50ZXN0LlRlc3RVdGlscwotaW1wb3J0IGJyb29rbHluLnRlc3QuZW50aXR5LlRlc3RBcHBsaWNhdGlvbgotaW1wb3J0IGJyb29rbHluLnRlc3QuZW50aXR5LlRlc3RFbnRpdHkKLWltcG9ydCBicm9va2x5bi50ZXN0LmVudGl0eS5UZXN0RW50aXR5SW1wbAotaW1wb3J0IGJyb29rbHluLnV0aWwuR3Jvb3Z5SmF2YU1ldGhvZHMKLWltcG9ydCBicm9va2x5bi51dGlsLmV4Y2VwdGlvbnMuRXhjZXB0aW9ucwotCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVkaWNhdGVzCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdAotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXMKLQotCi1jbGFzcyBEeW5hbWljQ2x1c3RlclRlc3QgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRJTUVPVVRfTVMgPSAyMDAwCi0KLSAgICBUZXN0QXBwbGljYXRpb24gYXBwCi0gICAgU2ltdWxhdGVkTG9jYXRpb24gbG9jCi0gICAgU2ltdWxhdGVkTG9jYXRpb24gbG9jMgotICAgIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKCkKLQotICAgIEBCZWZvcmVNZXRob2QKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgYXBwID0gQXBwbGljYXRpb25CdWlsZGVyLm5ld01hbmFnZWRBcHAoVGVzdEFwcGxpY2F0aW9uLmNsYXNzKTsKLSAgICAgICAgbG9jID0gbmV3IFNpbXVsYXRlZExvY2F0aW9uKCkKLSAgICAgICAgbG9jMiA9IG5ldyBTaW11bGF0ZWRMb2NhdGlvbigpCi0gICAgfQotCi0gICAgQEFmdGVyTWV0aG9kKGFsd2F5c1J1biA9IHRydWUpCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKXsKLSAgICAgICAgaWYgKGFwcCAhPSBudWxsKSBFbnRpdGllcy5kZXN0cm95QWxsKGFwcC5nZXRNYW5hZ2VtZW50Q29udGV4dCgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIGNyZWF0aW9uT2theVdpdGhvdXROZXdFbnRpdHlGYWN0b3J5QXJndW1lbnQoKSB7Ci0gICAgICAgIGFwcC5jcmVhdGVBbmRNYW5hZ2VDaGlsZChFbnRpdHlTcGVjLmNyZWF0ZShEeW5hbWljQ2x1c3Rlci5jbGFzcykpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgY29uc3RydWN0aW9uUmVxdWlyZXNUaGF0TmV3RW50aXR5QXJndW1lbnRJc0FuRW50aXR5RmFjdG9yeSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFwcC5jcmVhdGVBbmRNYW5hZ2VDaGlsZChFbnRpdHlTcGVjLmNyZWF0ZShEeW5hbWljQ2x1c3Rlci5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgLmNvbmZpZ3VyZSgiZmFjdG9yeSIsICJlcnJvciIpKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChFeGNlcHRpb25zLmdldEZpcnN0VGhyb3dhYmxlT2ZUeXBlKGUsIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykgPT0gbnVsbCkgdGhyb3cgZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgc3RhcnRSZXF1aXJlc1RoYXROZXdFbnRpdHlBcmd1bWVudElzR2l2ZW4oKSB7Ci0gICAgICAgIER5bmFtaWNDbHVzdGVyIGMgPSBhcHAuY3JlYXRlQW5kTWFuYWdlQ2hpbGQoRW50aXR5U3BlYy5jcmVhdGUoRHluYW1pY0NsdXN0ZXIuY2xhc3MpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGMuc3RhcnQoW2xvY10pOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKEV4Y2VwdGlvbnMuZ2V0Rmlyc3RUaHJvd2FibGVPZlR5cGUoZSwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzKSA9PSBudWxsKSB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBzdGFydE1ldGhvZEZhaWxzSWZMb2NhdGlvbnNQYXJhbWV0ZXJIYXNNb3JlVGhhbk9uZUVsZW1lbnQoKSB7Ci0gICAgICAgIER5bmFtaWNDbHVzdGVyIGNsdXN0ZXIgPSBhcHAuY3JlYXRlQW5kTWFuYWdlQ2hpbGQoRW50aXR5U3BlYy5jcmVhdGUoRHluYW1pY0NsdXN0ZXIuY2xhc3MpCi0gICAgICAgICAgICAgICAgLmNvbmZpZ3VyZSgiZmFjdG9yeSIsIHsgbmV3IFRlc3RFbnRpdHlJbXBsKCkgfSkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2x1c3Rlci5zdGFydChbIGxvYywgbG9jMiBdKQotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKEV4Y2VwdGlvbnMuZ2V0Rmlyc3RUaHJvd2FibGVPZlR5cGUoZSwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKSA9PSBudWxsKSB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2x1c3Rlckhhc09uZUxvY2F0aW9uQWZ0ZXJTdGFydGluZygpIHsKLSAgICAgICAgRHluYW1pY0NsdXN0ZXIgY2x1c3RlciA9IGFwcC5jcmVhdGVBbmRNYW5hZ2VDaGlsZChFbnRpdHlTcGVjLmNyZWF0ZShEeW5hbWljQ2x1c3Rlci5jbGFzcykKLSAgICAgICAgICAgICAgICAuY29uZmlndXJlKCJmYWN0b3J5IiwgeyBuZXcgVGVzdEVudGl0eUltcGwoKSB9KSk7Ci0gICAgICAgIGNsdXN0ZXIuc3RhcnQoW2xvY10pCi0gICAgICAgIGFzc2VydEVxdWFscyhjbHVzdGVyLmdldExvY2F0aW9ucygpLnNpemUoKSwgMSkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNsdXN0ZXIuZ2V0TG9jYXRpb25zKCkgYXMgTGlzdCwgW2xvY10pCi0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VydmljZVVwQWZ0ZXJTdGFydGluZ1dpdGhOb01lbWJlcnMoKSB7Ci0gICAgICAgIER5bmFtaWNDbHVzdGVyIGNsdXN0ZXIgPSBhcHAuY3JlYXRlQW5kTWFuYWdlQ2hpbGQoRW50aXR5U3BlYy5jcmVhdGUoRHluYW1pY0NsdXN0ZXIuY2xhc3MpCi0gICAgICAgICAgICAgICAgLmNvbmZpZ3VyZShEeW5hbWljQ2x1c3Rlci5NRU1CRVJfU1BFQywgRW50aXR5U3BlYy5jcmVhdGUoVGVzdEVudGl0eS5jbGFzcykpCi0gICAgICAgICAgICAgICAgLmNvbmZpZ3VyZShEeW5hbWljQ2x1c3Rlci5JTklUSUFMX1NJWkUsIDApKQotICAgICAgICBjbHVzdGVyLnN0YXJ0KFtsb2NdKQotICAgICAgICBhc3NlcnRFcXVhbHMoY2x1c3Rlci5nZXRBdHRyaWJ1dGUoQXR0cmlidXRlcy5TRVJWSUNFX1NUQVRFKSwgTGlmZWN5Y2xlLlJVTk5JTkcpCi0gICAgICAgIGFzc2VydFRydWUoY2x1c3Rlci5nZXRBdHRyaWJ1dGUoQXR0cmlidXRlcy5TRVJWSUNFX1VQKSkKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHVzaW5nRW50aXR5U3BlY1Jlc2l6ZUZyb21aZXJvVG9PbmVTdGFydHNBTmV3RW50aXR5QW5kU2V0c0l0c1BhcmVudCgpIHsKLSAgICAgICAgRHluYW1pY0NsdXN0ZXIgY2x1c3RlciA9IGFwcC5jcmVhdGVBbmRNYW5hZ2VDaGlsZChFbnRpdHlTcGVjLmNyZWF0ZShEeW5hbWljQ2x1c3Rlci5jbGFzcykKLSAgICAgICAgICAgICAgICAuY29uZmlndXJlKCJtZW1iZXJTcGVjIiwgRW50aXR5U3BlYy5jcmVhdGUoVGVzdEVudGl0eS5jbGFzcykpKTsKLSAgICAgICAgCi0gICAgICAgIGNsdXN0ZXIuc3RhcnQoW2xvY10pCi0KLSAgICAgICAgY2x1c3Rlci5yZXNpemUoMSkKLSAgICAgICAgRW50aXR5IGVudGl0eSA9IEl0ZXJhYmxlcy5nZXRPbmx5RWxlbWVudChjbHVzdGVyLmdldE1lbWJlcnMoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyBlbnRpdHkuY291bnQsIDEKLSAgICAgICAgYXNzZXJ0RXF1YWxzIGVudGl0eS5wYXJlbnQsIGNsdXN0ZXIKLSAgICAgICAgYXNzZXJ0RXF1YWxzIGVudGl0eS5hcHBsaWNhdGlvbiwgYXBwCi0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCByZXNpemVGcm9tWmVyb1RvT25lU3RhcnRzQU5ld0VudGl0eUFuZFNldHNJdHNQYXJlbnQoKSB7Ci0gICAgICAgIFRlc3RFbnRpdHkgZW50aXR5Ci0gICAgICAgIER5bmFtaWNDbHVzdGVyIGNsdXN0ZXIgPSBhcHAuY3JlYXRlQW5kTWFuYWdlQ2hpbGQoRW50aXR5U3BlYy5jcmVhdGUoRHluYW1pY0NsdXN0ZXIuY2xhc3MpCi0gICAgICAgICAgICAgICAgLmNvbmZpZ3VyZSgiZmFjdG9yeSIsIHsgcHJvcGVydGllcyAtPiBlbnRpdHkgPSBuZXcgVGVzdEVudGl0eUltcGwocHJvcGVydGllcykgfSkpOwotCi0gICAgICAgIGNsdXN0ZXIuc3RhcnQoW2xvY10pCi0KLSAgICAgICAgY2x1c3Rlci5yZXNpemUoMSkKLSAgICAgICAgYXNzZXJ0RXF1YWxzIGVudGl0eS5jb3VudGVyLmdldCgpLCAxCi0gICAgICAgIGFzc2VydEVxdWFscyBlbnRpdHkucGFyZW50LCBjbHVzdGVyCi0gICAgICAgIGFzc2VydEVxdWFscyBlbnRpdHkuYXBwbGljYXRpb24sIGFwcAotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgY3VycmVudFNpemVQcm9wZXJ0eVJlZmxlY3RzQWN0dWFsQ2x1c3RlclNpemUoKSB7Ci0gICAgICAgIER5bmFtaWNDbHVzdGVyIGNsdXN0ZXIgPSBhcHAuY3JlYXRlQW5kTWFuYWdlQ2hpbGQoRW50aXR5U3BlYy5jcmVhdGUoRHluYW1pY0NsdXN0ZXIuY2xhc3MpCi0gICAgICAgICAgICAgICAgLmNvbmZpZ3VyZSgiZmFjdG9yeSIsIHsgcHJvcGVydGllcyAtPiByZXR1cm4gbmV3IFRlc3RFbnRpdHlJbXBsKHByb3BlcnRpZXMpIH0pKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMgY2x1c3Rlci5jdXJyZW50U2l6ZSwgMAotCi0gICAgICAgIGNsdXN0ZXIuc3RhcnQoW2xvY10pCi0gICAgICAgIGFzc2VydEVxdWFscyBjbHVzdGVyLmN1cnJlbnRTaXplLCAxCi0gICAgICAgIGFzc2VydEVxdWFscyBjbHVzdGVyLmdldEF0dHJpYnV0ZShDaGFuZ2VhYmxlLkdST1VQX1NJWkUpLCAxCi0KLSAgICAgICAgaW50IG5ld1NpemUgPSBjbHVzdGVyLnJlc2l6ZSgwKQotICAgICAgICBhc3NlcnRFcXVhbHMgbmV3U2l6ZSwgMAotICAgICAgICBhc3NlcnRFcXVhbHMgbmV3U2l6ZSwgY2x1c3Rlci5jdXJyZW50U2l6ZQotICAgICAgICBhc3NlcnRFcXVhbHMgbmV3U2l6ZSwgY2x1c3Rlci5tZW1iZXJzLnNpemUoKQotICAgICAgICBhc3NlcnRFcXVhbHMgbmV3U2l6ZSwgY2x1c3Rlci5nZXRBdHRyaWJ1dGUoQ2hhbmdlYWJsZS5HUk9VUF9TSVpFKQotCi0gICAgICAgIG5ld1NpemUgPSBjbHVzdGVyLnJlc2l6ZSg0KQotICAgICAgICBhc3NlcnRFcXVhbHMgbmV3U2l6ZSwgNAotICAgICAgICBhc3NlcnRFcXVhbHMgbmV3U2l6ZSwgY2x1c3Rlci5jdXJyZW50U2l6ZQotICAgICAgICBhc3NlcnRFcXVhbHMgbmV3U2l6ZSwgY2x1c3Rlci5tZW1iZXJzLnNpemUoKQotICAgICAgICBhc3NlcnRFcXVhbHMgbmV3U2l6ZSwgY2x1c3Rlci5nZXRBdHRyaWJ1dGUoQ2hhbmdlYWJsZS5HUk9VUF9TSVpFKQotCi0gICAgICAgIG5ld1NpemUgPSBjbHVzdGVyLnJlc2l6ZSgwKQotICAgICAgICBhc3NlcnRFcXVhbHMgbmV3U2l6ZSwgMAotICAgICAgICBhc3NlcnRFcXVhbHMgbmV3U2l6ZSwgY2x1c3Rlci5jdXJyZW50U2l6ZQotICAgICAgICBhc3NlcnRFcXVhbHMgbmV3U2l6ZSwgY2x1c3Rlci5tZW1iZXJzLnNpemUoKQotICAgICAgICBhc3NlcnRFcXVhbHMgbmV3U2l6ZSwgY2x1c3Rlci5nZXRBdHRyaWJ1dGUoQ2hhbmdlYWJsZS5HUk9VUF9TSVpFKQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgY2x1c3RlclNpemVBZnRlclN0YXJ0SXNJbml0aWFsU2l6ZSgpIHsKLSAgICAgICAgRHluYW1pY0NsdXN0ZXIgY2x1c3RlciA9IGFwcC5jcmVhdGVBbmRNYW5hZ2VDaGlsZChFbnRpdHlTcGVjLmNyZWF0ZShEeW5hbWljQ2x1c3Rlci5jbGFzcykKLSAgICAgICAgICAgICAgICAuY29uZmlndXJlKCJmYWN0b3J5IiwgeyBwcm9wZXJ0aWVzIC0+IHJldHVybiBuZXcgVGVzdEVudGl0eUltcGwocHJvcGVydGllcykgfSkKLSAgICAgICAgICAgICAgICAuY29uZmlndXJlKCJpbml0aWFsU2l6ZSIsIDIpKTsKLQotICAgICAgICBjbHVzdGVyLnN0YXJ0KFtsb2NdKQotICAgICAgICBhc3NlcnRFcXVhbHMgY2x1c3Rlci5jdXJyZW50U2l6ZSwgMgotICAgICAgICBhc3NlcnRFcXVhbHMgY2x1c3Rlci5tZW1iZXJzLnNpemUoKSwgMgotICAgICAgICBhc3NlcnRFcXVhbHMgY2x1c3Rlci5nZXRBdHRyaWJ1dGUoQ2hhbmdlYWJsZS5HUk9VUF9TSVpFKSwgMgotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgY2x1c3RlckxvY2F0aW9uSXNQYXNzZWRPblRvRW50aXR5U3RhcnQoKSB7Ci0gICAgICAgIENvbGxlY3Rpb248TG9jYXRpb24+IGxvY2F0aW9ucyA9IFsgbG9jIF0KLSAgICAgICAgVGVzdEVudGl0eSBlbnRpdHkKLSAgICAgICAgZGVmIG5ld0VudGl0eSA9IHsgcHJvcGVydGllcywgY2x1c3RlciAtPgotICAgICAgICAgICAgZW50aXR5ID0gbmV3IFRlc3RFbnRpdHlJbXBsKHBhcmVudDpjbHVzdGVyKSB7Ci0JICAgICAgICAgICAgTGlzdDxMb2NhdGlvbj4gc3Rhc2hlZExvY2F0aW9ucyA9IG51bGwKLQkgICAgICAgICAgICBAT3ZlcnJpZGUKLQkgICAgICAgICAgICB2b2lkIHN0YXJ0KENvbGxlY3Rpb248PyBleHRlbmRzIExvY2F0aW9uPiBsb2MpIHsKLQkgICAgICAgICAgICAgICAgc3VwZXIuc3RhcnQobG9jKQotCSAgICAgICAgICAgICAgICBzdGFzaGVkTG9jYXRpb25zID0gbG9jCi0JICAgICAgICAgICAgfQotCSAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIER5bmFtaWNDbHVzdGVyIGNsdXN0ZXIgPSBhcHAuY3JlYXRlQW5kTWFuYWdlQ2hpbGQoRW50aXR5U3BlYy5jcmVhdGUoRHluYW1pY0NsdXN0ZXIuY2xhc3MpCi0gICAgICAgICAgICAgICAgLmNvbmZpZ3VyZSgiZmFjdG9yeSIsIG5ld0VudGl0eSkKLSAgICAgICAgICAgICAgICAuY29uZmlndXJlKCJpbml0aWFsU2l6ZSIsIDEpKTsKLQotICAgICAgICBjbHVzdGVyLnN0YXJ0KGxvY2F0aW9ucykKLQotICAgICAgICBhc3NlcnROb3ROdWxsIGVudGl0eS5zdGFzaGVkTG9jYXRpb25zCi0gICAgICAgIGFzc2VydEVxdWFscyBlbnRpdHkuc3Rhc2hlZExvY2F0aW9ucy5zaXplKCksIDEKLSAgICAgICAgYXNzZXJ0RXF1YWxzIGVudGl0eS5zdGFzaGVkTG9jYXRpb25zWzBdLCBsb2NhdGlvbnNbMF0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHJlc2l6ZUZyb21PbmVUb1plcm9DaGFuZ2VzQ2x1c3RlclNpemUoKSB7Ci0gICAgICAgIFRlc3RFbnRpdHkgZW50aXR5Ci0gICAgICAgIER5bmFtaWNDbHVzdGVyIGNsdXN0ZXIgPSBhcHAuY3JlYXRlQW5kTWFuYWdlQ2hpbGQoRW50aXR5U3BlYy5jcmVhdGUoRHluYW1pY0NsdXN0ZXIuY2xhc3MpCi0gICAgICAgICAgICAgICAgLmNvbmZpZ3VyZSgiZmFjdG9yeSIsIHsgcHJvcGVydGllcyAtPiBlbnRpdHkgPSBuZXcgVGVzdEVudGl0eUltcGwocHJvcGVydGllcykgfSkKLSAgICAgICAgICAgICAgICAuY29uZmlndXJlKCJpbml0aWFsU2l6ZSIsIDEpKTsKLQotICAgICAgICBjbHVzdGVyLnN0YXJ0KFtsb2NdKQotICAgICAgICBhc3NlcnRFcXVhbHMgY2x1c3Rlci5jdXJyZW50U2l6ZSwgMQotICAgICAgICBhc3NlcnRFcXVhbHMgZW50aXR5LmNvdW50ZXIuZ2V0KCksIDEKLSAgICAgICAgY2x1c3Rlci5yZXNpemUoMCkKLSAgICAgICAgYXNzZXJ0RXF1YWxzIGNsdXN0ZXIuY3VycmVudFNpemUsIDAKLSAgICAgICAgYXNzZXJ0RXF1YWxzIGVudGl0eS5jb3VudGVyLmdldCgpLCAwCi0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBjb25jdXJyZW50UmVzaXplc1RvU2FtZU51bWJlckNyZWF0ZXNDb3JyZWN0TnVtYmVyT2ZOb2RlcygpIHsKLSAgICAgICAgZmluYWwgaW50IE9WRVJIRUFEX01TID0gNTAwCi0gICAgICAgIGZpbmFsIGludCBTVEFSVFVQX1RJTUVfTVMgPSA1MAotICAgICAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIG51bVN0YXJ0ZWQgPSBuZXcgQXRvbWljSW50ZWdlcigwKQotICAgICAgICBEeW5hbWljQ2x1c3RlciBjbHVzdGVyID0gYXBwLmNyZWF0ZUFuZE1hbmFnZUNoaWxkKEVudGl0eVNwZWMuY3JlYXRlKER5bmFtaWNDbHVzdGVyLmNsYXNzKQotICAgICAgICAgICAgICAgIC5jb25maWd1cmUoImZhY3RvcnkiLCB7IAotICAgICAgICAgICAgICAgICAgICBNYXAgZmxhZ3MsIEVudGl0eSBjbHVzdGVyIC0+IAotICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU1RBUlRVUF9USU1FX01TKTsgbnVtU3RhcnRlZC5pbmNyZW1lbnRBbmRHZXQoKTsgbmV3IFRlc3RFbnRpdHlJbXBsKGZsYWdzLCBjbHVzdGVyKQotICAgICAgICAgICAgICAgIH0pKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMgY2x1c3Rlci5jdXJyZW50U2l6ZSwgMAotICAgICAgICBjbHVzdGVyLnN0YXJ0KFtsb2NdKQotCi0gICAgICAgIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdDYWNoZWRUaHJlYWRQb29sKCkKLSAgICAgICAgTGlzdDxUaHJvd2FibGU+IHRocm93YWJsZXMgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8VGhyb3dhYmxlPigpCi0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgaW4gMS4uMTApIHsKLSAgICAgICAgICAgICAgICBleGVjdXRvci5zdWJtaXQoIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXIucmVzaXplKDIpCi0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd2FibGVzLmFkZChlKQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSkKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZXhlY3V0b3Iuc2h1dGRvd24oKQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRvci5hd2FpdFRlcm1pbmF0aW9uKDEwKlNUQVJUVVBfVElNRV9NUytPVkVSSEVBRF9NUywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSkKLSAgICAgICAgICAgIGlmICh0aHJvd2FibGVzLnNpemUoKSA+IDApIHRocm93IHRocm93YWJsZXMuZ2V0KDApCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2x1c3Rlci5jdXJyZW50U2l6ZSwgMikKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjbHVzdGVyLmdldEF0dHJpYnV0ZShDaGFuZ2VhYmxlLkdST1VQX1NJWkUpLCAyKQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bVN0YXJ0ZWQuZ2V0KCksIDIpCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBleGVjdXRvci5zaHV0ZG93bk5vdygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QoZW5hYmxlZCA9IGZhbHNlKQotICAgIHB1YmxpYyB2b2lkIHN0b3BwaW5nVGhlQ2x1c3RlclN0b3BzVGhlRW50aXR5KCkgewotICAgICAgICBUZXN0RW50aXR5IGVudGl0eQotICAgICAgICBEeW5hbWljQ2x1c3RlciBjbHVzdGVyID0gYXBwLmNyZWF0ZUFuZE1hbmFnZUNoaWxkKEVudGl0eVNwZWMuY3JlYXRlKER5bmFtaWNDbHVzdGVyLmNsYXNzKQotICAgICAgICAgICAgICAgIC5jb25maWd1cmUoImZhY3RvcnkiLCB7IHByb3BlcnRpZXMgLT4gZW50aXR5ID0gbmV3IFRlc3RFbnRpdHlJbXBsKHByb3BlcnRpZXMpIH0pCi0gICAgICAgICAgICAgICAgLmNvbmZpZ3VyZSgiaW5pdGlhbFNpemUiLCAxKSk7Ci0KLSAgICAgICAgY2x1c3Rlci5zdGFydChbbG9jXSkKLSAgICAgICAgYXNzZXJ0RXF1YWxzIGVudGl0eS5jb3VudGVyLmdldCgpLCAxCi0gICAgICAgIGNsdXN0ZXIuc3RvcCgpCi0gICAgICAgIGFzc2VydEVxdWFscyBlbnRpdHkuY291bnRlci5nZXQoKSwgMAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgdGVzdHMgdGhlIGZpeCBmb3IgRU5HUi0xODI2LgotICAgICAqLwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgZmFpbGluZ0VudGl0aWVzRG9udEJyZWFrQ2x1c3RlckFjdGlvbnMoKSB7Ci0gICAgICAgIGZpbmFsIGludCBmYWlsTnVtID0gMgotICAgICAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIGNvdW50ZXIgPSBuZXcgQXRvbWljSW50ZWdlcigwKQotICAgICAgICBEeW5hbWljQ2x1c3RlciBjbHVzdGVyID0gYXBwLmNyZWF0ZUFuZE1hbmFnZUNoaWxkKEVudGl0eVNwZWMuY3JlYXRlKER5bmFtaWNDbHVzdGVyLmNsYXNzKQotICAgICAgICAgICAgICAgIC5jb25maWd1cmUoImluaXRpYWxTaXplIiwgMCkKLSAgICAgICAgICAgICAgICAuY29uZmlndXJlKCJmYWN0b3J5IiwgeyBwcm9wZXJ0aWVzIC0+Ci0gICAgICAgICAgICAgICAgICAgIGludCBudW0gPSBjb3VudGVyLmluY3JlbWVudEFuZEdldCgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZhaWxpbmdFbnRpdHkocHJvcGVydGllcywgKG51bT09ZmFpbE51bSkpCi0gICAgICAgICAgICAgICAgfSkpOwotCi0gICAgICAgIGNsdXN0ZXIuc3RhcnQoW2xvY10pCi0gICAgICAgIGNsdXN0ZXIucmVzaXplKDMpCi0gICAgICAgIGFzc2VydEVxdWFscyhjbHVzdGVyLmN1cnJlbnRTaXplLCAyKQotICAgICAgICBhc3NlcnRFcXVhbHMoY2x1c3Rlci5nZXRNZW1iZXJzKCkuc2l6ZSgpLCAyKQotICAgICAgICBmb3IgKEVudGl0eSBtZW1iZXIgOiBjbHVzdGVyLmdldE1lbWJlcnMoKSkgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoKChGYWlsaW5nRW50aXR5KW1lbWJlcikuZmFpbE9uU3RhcnQpCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RJbml0aWFsUXVvcnVtU2l6ZVN1ZmZpY2llbnRGb3JTdGFydHVwKCkgewotICAgICAgICBmaW5hbCBpbnQgZmFpbE51bSA9IDE7Ci0gICAgICAgIGZpbmFsIEF0b21pY0ludGVnZXIgY291bnRlciA9IG5ldyBBdG9taWNJbnRlZ2VyKDApCi0gICAgICAgIER5bmFtaWNDbHVzdGVyIGNsdXN0ZXIgPSBhcHAuY3JlYXRlQW5kTWFuYWdlQ2hpbGQoRW50aXR5U3BlYy5jcmVhdGUoRHluYW1pY0NsdXN0ZXIuY2xhc3MpCi0gICAgICAgICAgICAgICAgLmNvbmZpZ3VyZSgiaW5pdGlhbFNpemUiLCAyKQotICAgICAgICAgICAgICAgIC5jb25maWd1cmUoRHluYW1pY0NsdXN0ZXIuSU5JVElBTF9RVU9SVU1fU0laRSwgMSkKLSAgICAgICAgICAgICAgICAuY29uZmlndXJlKCJmYWN0b3J5IiwgeyBwcm9wZXJ0aWVzIC0+Ci0gICAgICAgICAgICAgICAgICAgIGludCBudW0gPSBjb3VudGVyLmluY3JlbWVudEFuZEdldCgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZhaWxpbmdFbnRpdHkocHJvcGVydGllcywgKG51bT09ZmFpbE51bSkpCi0gICAgICAgICAgICAgICAgfSkpOwotCi0gICAgICAgIGNsdXN0ZXIuc3RhcnQoW2xvY10pCi0gICAgICAgIAotICAgICAgICAvLyBub3RlIHRoYXQgY2hpbGRyZW4gaW5jbHVkZSBxdWFyYW50aW5lIGdyb3VwOyBhbmQgcXVhcmFudGluZWQgbm9kZXMKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNsdXN0ZXIuZ2V0Q3VycmVudFNpemUoKSwgMSkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNsdXN0ZXIuZ2V0TWVtYmVycygpLnNpemUoKSwgMSkKLSAgICAgICAgZm9yIChFbnRpdHkgbWVtYmVyIDogY2x1c3Rlci5nZXRNZW1iZXJzKCkpIHsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKCgoRmFpbGluZ0VudGl0eSltZW1iZXIpLmZhaWxPblN0YXJ0KQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbFF1b3J1bVNpemVEZWZhdWx0c1RvSW5pdGlhbFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgaW50IGZhaWxOdW0gPSAxOwotICAgICAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIGNvdW50ZXIgPSBuZXcgQXRvbWljSW50ZWdlcigwKQotICAgICAgICBEeW5hbWljQ2x1c3RlciBjbHVzdGVyID0gYXBwLmNyZWF0ZUFuZE1hbmFnZUNoaWxkKEVudGl0eVNwZWMuY3JlYXRlKER5bmFtaWNDbHVzdGVyLmNsYXNzKQotICAgICAgICAgICAgICAgIC5jb25maWd1cmUoImluaXRpYWxTaXplIiwgMikKLSAgICAgICAgICAgICAgICAuY29uZmlndXJlKCJmYWN0b3J5IiwgeyBwcm9wZXJ0aWVzIC0+Ci0gICAgICAgICAgICAgICAgICAgIGludCBudW0gPSBjb3VudGVyLmluY3JlbWVudEFuZEdldCgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZhaWxpbmdFbnRpdHkocHJvcGVydGllcywgKG51bT09ZmFpbE51bSkpCi0gICAgICAgICAgICAgICAgfSkpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbHVzdGVyLnN0YXJ0KFtsb2NdKQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHVud3JhcHBlZCA9IEV4Y2VwdGlvbnMuZ2V0Rmlyc3RUaHJvd2FibGVPZlR5cGUoZSwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzKTsKLSAgICAgICAgICAgIGlmICh1bndyYXBwZWQgIT0gbnVsbCAmJiB1bndyYXBwZWQuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJmYWlsZWQgdG8gZ2V0IHRvIGluaXRpYWwgc2l6ZSIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gc3VjY2VzcwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOyAvLyBmYWlsCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIG5vdGUgdGhhdCBjaGlsZHJlbiBpbmNsdWRlIHF1YXJhbnRpbmUgZ3JvdXA7IGFuZCBxdWFyYW50aW5lZCBub2RlcwotICAgICAgICBhc3NlcnRFcXVhbHMoY2x1c3Rlci5nZXRDdXJyZW50U2l6ZSgpLCAxKQotICAgICAgICBhc3NlcnRFcXVhbHMoY2x1c3Rlci5nZXRNZW1iZXJzKCkuc2l6ZSgpLCAxKQotICAgICAgICBmb3IgKEVudGl0eSBtZW1iZXIgOiBjbHVzdGVyLmdldE1lbWJlcnMoKSkgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoKChGYWlsaW5nRW50aXR5KW1lbWJlcikuZmFpbE9uU3RhcnQpCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5RdWFyYW50aW5lRmFpbGVkRW50aXRpZXMoKSB7Ci0gICAgICAgIGZpbmFsIGludCBmYWlsTnVtID0gMgotICAgICAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIGNvdW50ZXIgPSBuZXcgQXRvbWljSW50ZWdlcigwKQotICAgICAgICBEeW5hbWljQ2x1c3RlciBjbHVzdGVyID0gYXBwLmNyZWF0ZUFuZE1hbmFnZUNoaWxkKEVudGl0eVNwZWMuY3JlYXRlKER5bmFtaWNDbHVzdGVyLmNsYXNzKQotICAgICAgICAgICAgICAgIC5jb25maWd1cmUoInF1YXJhbnRpbmVGYWlsZWRFbnRpdGllcyIsIHRydWUpCi0gICAgICAgICAgICAgICAgLmNvbmZpZ3VyZSgiaW5pdGlhbFNpemUiLCAwKQotICAgICAgICAgICAgICAgIC5jb25maWd1cmUoImZhY3RvcnkiLCB7IHByb3BlcnRpZXMgLT4KLSAgICAgICAgICAgICAgICAgICAgaW50IG51bSA9IGNvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmFpbGluZ0VudGl0eShwcm9wZXJ0aWVzLCAobnVtPT1mYWlsTnVtKSkKLSAgICAgICAgICAgICAgICB9KSk7Ci0KLSAgICAgICAgY2x1c3Rlci5zdGFydChbbG9jXSkKLSAgICAgICAgY2x1c3Rlci5yZXNpemUoMykKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNsdXN0ZXIuY3VycmVudFNpemUsIDIpCi0gICAgICAgIGFzc2VydEVxdWFscyhjbHVzdGVyLmdldE1lbWJlcnMoKS5zaXplKCksIDIpCi0gICAgICAgIGFzc2VydEVxdWFscyhJdGVyYWJsZXMuc2l6ZShJdGVyYWJsZXMuZmlsdGVyKGNsdXN0ZXIuZ2V0Q2hpbGRyZW4oKSwgUHJlZGljYXRlcy5pbnN0YW5jZU9mKEZhaWxpbmdFbnRpdHkuY2xhc3MpKSksIDMpCi0gICAgICAgIGNsdXN0ZXIubWVtYmVycy5lYWNoIHsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKCgoRmFpbGluZ0VudGl0eSlpdCkuZmFpbE9uU3RhcnQpCi0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRFcXVhbHMoY2x1c3Rlci5nZXRBdHRyaWJ1dGUoRHluYW1pY0NsdXN0ZXIuUVVBUkFOVElORV9HUk9VUCkubWVtYmVycy5zaXplKCksIDEpCi0gICAgICAgIGNsdXN0ZXIuZ2V0QXR0cmlidXRlKER5bmFtaWNDbHVzdGVyLlFVQVJBTlRJTkVfR1JPVVApLm1lbWJlcnMuZWFjaCB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCgoRmFpbGluZ0VudGl0eSlpdCkuZmFpbE9uU3RhcnQpCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REb05vdFF1YXJhbnRpbmVGYWlsZWRFbnRpdGllcygpIHsKLSAgICAgICAgZmluYWwgaW50IGZhaWxOdW0gPSAyCi0gICAgICAgIGZpbmFsIEF0b21pY0ludGVnZXIgY291bnRlciA9IG5ldyBBdG9taWNJbnRlZ2VyKDApCi0gICAgICAgIER5bmFtaWNDbHVzdGVyIGNsdXN0ZXIgPSBhcHAuY3JlYXRlQW5kTWFuYWdlQ2hpbGQoRW50aXR5U3BlYy5jcmVhdGUoRHluYW1pY0NsdXN0ZXIuY2xhc3MpCi0gICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBpcyBxdWFyYW50aW5lRmFpbGVkRW50aXRpZXM9PXRydWUKLSAgICAgICAgICAgICAgICAuY29uZmlndXJlKCJxdWFyYW50aW5lRmFpbGVkRW50aXRpZXMiLCBmYWxzZSkKLSAgICAgICAgICAgICAgICAuY29uZmlndXJlKCJpbml0aWFsU2l6ZSIsIDApCi0gICAgICAgICAgICAgICAgLmNvbmZpZ3VyZSgiZmFjdG9yeSIsIHsgcHJvcGVydGllcyAtPgotICAgICAgICAgICAgICAgICAgICBpbnQgbnVtID0gY291bnRlci5pbmNyZW1lbnRBbmRHZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGYWlsaW5nRW50aXR5KHByb3BlcnRpZXMsIChudW09PWZhaWxOdW0pKQotICAgICAgICAgICAgICAgIH0pKTsKLQotICAgICAgICBjbHVzdGVyLnN0YXJ0KFtsb2NdKQotICAgICAgICAKLSAgICAgICAgLy8gbm8gcXVhcmFudGluZSBncm91cCwgYXMgYSBjaGlsZAotICAgICAgICBhc3NlcnRFcXVhbHMoY2x1c3Rlci5nZXRDaGlsZHJlbigpLnNpemUoKSwgMCwgImNoaWxkcmVuPSIrY2x1c3Rlci5nZXRDaGlsZHJlbigpKQotICAgICAgICAKLSAgICAgICAgLy8gRmFpbGVkIG5vZGUgd2lsbCBub3QgYmUgYSBtZW1iZXIgb3IgY2hpbGQKLSAgICAgICAgY2x1c3Rlci5yZXNpemUoMykKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNsdXN0ZXIuY3VycmVudFNpemUsIDIpCi0gICAgICAgIGFzc2VydEVxdWFscyhjbHVzdGVyLmdldE1lbWJlcnMoKS5zaXplKCksIDIpCi0gICAgICAgIGFzc2VydEVxdWFscyhjbHVzdGVyLmdldENoaWxkcmVuKCkuc2l6ZSgpLCAyLCAiY2hpbGRyZW49IitjbHVzdGVyLmdldENoaWxkcmVuKCkpCi0gICAgICAgIAotICAgICAgICAvLyBGYWlsZWQgbm9kZSB3aWxsIG5vdCBiZSBtYW5hZ2VkIGVpdGhlcgotICAgICAgICBhc3NlcnRFcXVhbHMoSXRlcmFibGVzLnNpemUoSXRlcmFibGVzLmZpbHRlcihjbHVzdGVyLmdldENoaWxkcmVuKCksIFByZWRpY2F0ZXMuaW5zdGFuY2VPZihGYWlsaW5nRW50aXR5LmNsYXNzKSkpLCAyKQotICAgICAgICBmb3IgKEVudGl0eSBtZW1iZXIgOiBjbHVzdGVyLmdldE1lbWJlcnMoKSkgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoKChGYWlsaW5nRW50aXR5KW1lbWJlcikuZmFpbE9uU3RhcnQpCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIGRlZmF1bHRSZW1vdmFsU3RyYXRlZ3lTaHV0c0Rvd25OZXdlc3RGaXJzdFdoZW5SZXNpemluZygpIHsKLSAgICAgICAgVGVzdEVudGl0eSBlbnRpdHkKLSAgICAgICAgZmluYWwgaW50IGZhaWxOdW0gPSAyCi0gICAgICAgIGZpbmFsIExpc3Q8RW50aXR5PiBjcmVhdGlvbk9yZGVyID0gW10KLSAgICAgICAgRHluYW1pY0NsdXN0ZXIgY2x1c3RlciA9IGFwcC5jcmVhdGVBbmRNYW5hZ2VDaGlsZChFbnRpdHlTcGVjLmNyZWF0ZShEeW5hbWljQ2x1c3Rlci5jbGFzcykKLSAgICAgICAgICAgICAgICAuY29uZmlndXJlKCJpbml0aWFsU2l6ZSIsIDApCi0gICAgICAgICAgICAgICAgLmNvbmZpZ3VyZSgiZmFjdG9yeSIsIHsgcHJvcGVydGllcyAtPgotICAgICAgICAgICAgICAgICAgICBFbnRpdHkgcmVzdWx0ID0gbmV3IFRlc3RFbnRpdHlJbXBsKHByb3BlcnRpZXMpCi0gICAgICAgICAgICAgICAgICAgIGNyZWF0aW9uT3JkZXIgPDwgcmVzdWx0Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQKLSAgICAgICAgICAgICAgICB9KSk7Ci0KLSAgICAgICAgY2x1c3Rlci5zdGFydChbbG9jXSkKLSAgICAgICAgY2x1c3Rlci5yZXNpemUoMSkKLSAgICAgICAgY2x1c3Rlci5yZXNpemUoMikKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNsdXN0ZXIuY3VycmVudFNpemUsIDIpCi0gICAgICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVTZXQuY29weU9mKGNsdXN0ZXIuZ2V0TWVtYmVycygpKSwgSW1tdXRhYmxlU2V0LmNvcHlPZihjcmVhdGlvbk9yZGVyKSwgImFjdHVhbD0iK2NsdXN0ZXIuZ2V0TWVtYmVycygpKQotCi0gICAgICAgIC8vIE5vdyBzdG9wIG9uZQotICAgICAgICBjbHVzdGVyLnJlc2l6ZSgxKQotICAgICAgICBhc3NlcnRFcXVhbHMoY2x1c3Rlci5jdXJyZW50U2l6ZSwgMSkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZUxpc3QuY29weU9mKGNsdXN0ZXIuZ2V0TWVtYmVycygpKSwgY3JlYXRpb25PcmRlci5zdWJMaXN0KDAsIDEpKQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgcmVzaXplTG9nZ2VkQXNFZmZlY3RvckNhbGwoKSB7Ci0gICAgICAgIER5bmFtaWNDbHVzdGVyIGNsdXN0ZXIgPSBhcHAuY3JlYXRlQW5kTWFuYWdlQ2hpbGQoRW50aXR5U3BlYy5jcmVhdGUoRHluYW1pY0NsdXN0ZXIuY2xhc3MpCi0gICAgICAgICAgICAgICAgLmNvbmZpZ3VyZSgiZmFjdG9yeSIsIHsgcHJvcGVydGllcyAtPiByZXR1cm4gbmV3IFRlc3RFbnRpdHlJbXBsKHByb3BlcnRpZXMpIH0pKTsKLQotICAgICAgICBhcHAuc3RhcnQoW2xvY10pCi0gICAgICAgIGNsdXN0ZXIucmVzaXplKDEpCi0KLSAgICAgICAgU2V0PFRhc2s+IHRhc2tzID0gYXBwLmdldE1hbmFnZW1lbnRDb250ZXh0KCkuZ2V0RXhlY3V0aW9uTWFuYWdlcigpLmdldFRhc2tzV2l0aEFsbFRhZ3MoWwotICAgICAgICAgICAgQnJvb2tseW5UYXNrVGFncy50YWdGb3JDb250ZXh0RW50aXR5KGNsdXN0ZXIpLCJFRkZFQ1RPUiJdKQotICAgICAgICBhc3NlcnRFcXVhbHModGFza3Muc2l6ZSgpLCAyKQotICAgICAgICBhc3NlcnRUcnVlKEl0ZXJhYmxlcy5nZXQodGFza3MsIDApLmdldERlc2NyaXB0aW9uKCkuY29udGFpbnMoInN0YXJ0IikpCi0gICAgICAgIGFzc2VydFRydWUoSXRlcmFibGVzLmdldCh0YXNrcywgMSkuZ2V0RGVzY3JpcHRpb24oKS5jb250YWlucygicmVzaXplIikpCi0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RvcHBlZENoaWxkSXNSZW1vdmVGcm9tR3JvdXAoKSB7Ci0gICAgICAgIER5bmFtaWNDbHVzdGVyIGNsdXN0ZXIgPSBhcHAuY3JlYXRlQW5kTWFuYWdlQ2hpbGQoRW50aXR5U3BlYy5jcmVhdGUoRHluYW1pY0NsdXN0ZXIuY2xhc3MpCi0gICAgICAgICAgICAgICAgLmNvbmZpZ3VyZSgiaW5pdGlhbFNpemUiLCAxKQotICAgICAgICAgICAgICAgIC5jb25maWd1cmUoImZhY3RvcnkiLCB7IHByb3BlcnRpZXMgLT4gcmV0dXJuIG5ldyBUZXN0RW50aXR5SW1wbChwcm9wZXJ0aWVzKSB9KSk7Ci0KLSAgICAgICAgY2x1c3Rlci5zdGFydChbbG9jXSkKLQotICAgICAgICBUZXN0RW50aXR5IGNoaWxkID0gSXRlcmFibGVzLmdldChjbHVzdGVyLmdldE1lbWJlcnMoKSwgMCk7Ci0gICAgICAgIGNoaWxkLnN0b3AoKQotICAgICAgICBFbnRpdGllcy51bm1hbmFnZShjaGlsZCkKLQotICAgICAgICBUZXN0VXRpbHMuZXhlY3V0ZVVudGlsU3VjY2VlZHModGltZW91dDpUSU1FT1VUX01TKSB7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShjbHVzdGVyLmdldENoaWxkcmVuKCkuY29udGFpbnMoY2hpbGQpLCAiY2hpbGRyZW49IitjbHVzdGVyLmdldENoaWxkcmVuKCkpCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2x1c3Rlci5jdXJyZW50U2l6ZSwgMCkKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjbHVzdGVyLm1lbWJlcnMuc2l6ZSgpLCAwKQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGx1Z2dhYmxlUmVtb3ZhbFN0cmF0ZWd5SXNVc2VkKCkgewotICAgICAgICBMaXN0PEVudGl0eT4gcmVtb3ZlZEVudGl0aWVzID0gW10KLQotICAgICAgICBDbG9zdXJlIHJlbW92YWxTdHJhdGVneSA9IHsgQ29sbGVjdGlvbjxFbnRpdHk+IGNvbnRlbmRlcnMgLT4KLSAgICAgICAgICAgIEVudGl0eSBjaG9pY2UgPSBJdGVyYWJsZXMuZ2V0KGNvbnRlbmRlcnMsIHJhbmRvbS5uZXh0SW50KGNvbnRlbmRlcnMuc2l6ZSgpKSkKLSAgICAgICAgICAgIHJlbW92ZWRFbnRpdGllcy5hZGQoY2hvaWNlKQotICAgICAgICAgICAgcmV0dXJuIGNob2ljZQotICAgICAgICB9Ci0gICAgICAgIER5bmFtaWNDbHVzdGVyIGNsdXN0ZXIgPSBhcHAuY3JlYXRlQW5kTWFuYWdlQ2hpbGQoRW50aXR5U3BlYy5jcmVhdGUoRHluYW1pY0NsdXN0ZXIuY2xhc3MpCi0gICAgICAgICAgICAgICAgLmNvbmZpZ3VyZSgiZmFjdG9yeSIsIHsgcHJvcGVydGllcyAtPiByZXR1cm4gbmV3IFRlc3RFbnRpdHlJbXBsKHByb3BlcnRpZXMpIH0pCi0gICAgICAgICAgICAgICAgLmNvbmZpZ3VyZSgiaW5pdGlhbFNpemUiLCAxMCkKLSAgICAgICAgICAgICAgICAuY29uZmlndXJlKCJyZW1vdmFsU3RyYXRlZ3kiLCByZW1vdmFsU3RyYXRlZ3kpKTsKLQotICAgICAgICBjbHVzdGVyLnN0YXJ0KFtsb2NdKQotICAgICAgICBTZXQgb3JpZ01lbWJlcnMgPSBjbHVzdGVyLm1lbWJlcnMgYXMgU2V0Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDEwOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgY2x1c3Rlci5yZXNpemUoaSkKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjbHVzdGVyLmdldEF0dHJpYnV0ZShDaGFuZ2VhYmxlLkdST1VQX1NJWkUpLCBpKQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlbW92ZWRFbnRpdGllcy5zaXplKCksIDEwLWkpCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlU2V0LmNvcHlPZihJdGVyYWJsZXMuY29uY2F0KGNsdXN0ZXIubWVtYmVycywgcmVtb3ZlZEVudGl0aWVzKSksIG9yaWdNZW1iZXJzKQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGx1Z2dhYmxlUmVtb3ZhbFN0cmF0ZWd5Q2FuQmVTZXRBZnRlckNvbnN0cnVjdGlvbigpIHsKLSAgICAgICAgTGlzdDxFbnRpdHk+IHJlbW92ZWRFbnRpdGllcyA9IFtdCi0KLSAgICAgICAgQ2xvc3VyZSByZW1vdmFsU3RyYXRlZ3kgPSB7IENvbGxlY3Rpb248RW50aXR5PiBjb250ZW5kZXJzIC0+Ci0gICAgICAgICAgICBFbnRpdHkgY2hvaWNlID0gSXRlcmFibGVzLmdldChjb250ZW5kZXJzLCByYW5kb20ubmV4dEludChjb250ZW5kZXJzLnNpemUoKSkpCi0gICAgICAgICAgICByZW1vdmVkRW50aXRpZXMuYWRkKGNob2ljZSkKLSAgICAgICAgICAgIHJldHVybiBjaG9pY2UKLSAgICAgICAgfQotICAgICAgICBEeW5hbWljQ2x1c3RlciBjbHVzdGVyID0gYXBwLmNyZWF0ZUFuZE1hbmFnZUNoaWxkKEVudGl0eVNwZWMuY3JlYXRlKER5bmFtaWNDbHVzdGVyLmNsYXNzKQotICAgICAgICAgICAgICAgIC5jb25maWd1cmUoImZhY3RvcnkiLCB7IHByb3BlcnRpZXMgLT4gcmV0dXJuIG5ldyBUZXN0RW50aXR5SW1wbChwcm9wZXJ0aWVzKSB9KQotICAgICAgICAgICAgICAgIC5jb25maWd1cmUoImluaXRpYWxTaXplIiwgMTApKTsKLQotICAgICAgICBjbHVzdGVyLnN0YXJ0KFtsb2NdKQotICAgICAgICBTZXQgb3JpZ01lbWJlcnMgPSBjbHVzdGVyLm1lbWJlcnMgYXMgU2V0Ci0KLSAgICAgICAgY2x1c3Rlci5zZXRSZW1vdmFsU3RyYXRlZ3koR3Jvb3Z5SmF2YU1ldGhvZHMuZnVuY3Rpb25Gcm9tQ2xvc3VyZShyZW1vdmFsU3RyYXRlZ3kpKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMTA7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICBjbHVzdGVyLnJlc2l6ZShpKQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNsdXN0ZXIuZ2V0QXR0cmlidXRlKENoYW5nZWFibGUuR1JPVVBfU0laRSksIGkpCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVtb3ZlZEVudGl0aWVzLnNpemUoKSwgMTAtaSkKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVTZXQuY29weU9mKEl0ZXJhYmxlcy5jb25jYXQoY2x1c3Rlci5tZW1iZXJzLCByZW1vdmVkRW50aXRpZXMpKSwgb3JpZ01lbWJlcnMpCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNpemVEb2VzTm90QmxvY2tDYWxsc1RvUXVlcnlHcm91cE1lbWJlcnNoaXAoKSB7Ci0gICAgICAgIENvdW50RG93bkxhdGNoIGV4ZWN1dGluZ0xhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpCi0gICAgICAgIENvdW50RG93bkxhdGNoIGNvbnRpbnVhdGlvbkxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpCi0gICAgICAgIAotICAgICAgICBEeW5hbWljQ2x1c3RlciBjbHVzdGVyID0gYXBwLmNyZWF0ZUFuZE1hbmFnZUNoaWxkKEVudGl0eVNwZWMuY3JlYXRlKER5bmFtaWNDbHVzdGVyLmNsYXNzKQotICAgICAgICAgICAgICAgIC5jb25maWd1cmUoImluaXRpYWxTaXplIiwgMCkKLSAgICAgICAgICAgICAgICAuY29uZmlndXJlKCJmYWN0b3J5IiwgeyBwcm9wZXJ0aWVzIC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpbmdMYXRjaC5jb3VudERvd24oKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWF0aW9uTGF0Y2guYXdhaXQoKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXN0RW50aXR5SW1wbChwcm9wZXJ0aWVzKQotICAgICAgICAgICAgICAgICAgICB9KSk7Ci0KLSAgICAgICAgY2x1c3Rlci5zdGFydChbbG9jXSkKLQotICAgICAgICBUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZCggeyBjbHVzdGVyLnJlc2l6ZSgxKSB9KQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gd2FpdCBmb3IgcmVzaXplIHRvIGJlIGV4ZWN1dGluZwotICAgICAgICAgICAgdGhyZWFkLnN0YXJ0KCkKLSAgICAgICAgICAgIGV4ZWN1dGluZ0xhdGNoLmF3YWl0KFRJTUVPVVRfTVMsIFRpbWVVbml0Lk1JTExJU0VDT05EUykKLQotICAgICAgICAgICAgLy8gZW5zdXJlIGNhbiBzdGlsbCBjYWxsIG1ldGhvZHMgb24gZ3JvdXAsIHRvIHF1ZXJ5L3VwZGF0ZSBtZW1iZXJzaGlwCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2x1c3Rlci5nZXRNZW1iZXJzKCksIFtdKQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNsdXN0ZXIuZ2V0Q3VycmVudFNpemUoKSwgMCkKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKGNsdXN0ZXIuaGFzTWVtYmVyKGNsdXN0ZXIpKQotICAgICAgICAgICAgY2x1c3Rlci5hZGRNZW1iZXIoY2x1c3RlcikKLSAgICAgICAgICAgIGFzc2VydFRydWUoY2x1c3Rlci5yZW1vdmVNZW1iZXIoY2x1c3RlcikpCi0KLSAgICAgICAgICAgIC8vIGFsbG93IHRoZSByZXNpemUgdG8gY29tcGxldGUKLSAgICAgICAgICAgIGNvbnRpbnVhdGlvbkxhdGNoLmNvdW50RG93bigpCi0gICAgICAgICAgICB0aHJlYWQuam9pbihUSU1FT1VUX01TKQotICAgICAgICAgICAgYXNzZXJ0RmFsc2UodGhyZWFkLmlzQWxpdmUoKSkKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHRocmVhZC5pbnRlcnJ1cHQoKQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZXNNZW1iZXIoKSB7Ci0gICAgICAgIER5bmFtaWNDbHVzdGVyIGNsdXN0ZXIgPSBhcHAuY3JlYXRlQW5kTWFuYWdlQ2hpbGQoRW50aXR5U3BlYy5jcmVhdGUoRHluYW1pY0NsdXN0ZXIuY2xhc3MpCi0gICAgICAgICAgICAgICAgLmNvbmZpZ3VyZSgiaW5pdGlhbFNpemUiLCAxKQotICAgICAgICAgICAgICAgIC5jb25maWd1cmUoImZhY3RvcnkiLCB7IHByb3BlcnRpZXMgLT4gcmV0dXJuIG5ldyBUZXN0RW50aXR5SW1wbChwcm9wZXJ0aWVzKSB9KSk7Ci0KLSAgICAgICAgY2x1c3Rlci5zdGFydChbbG9jXSkKLSAgICAgICAgRW50aXR5IG1lbWJlciA9IEl0ZXJhYmxlcy5nZXQoY2x1c3Rlci5tZW1iZXJzLCAwKTsKLQotICAgICAgICBTdHJpbmcgcmVwbGFjZW1lbnRJZCA9IGNsdXN0ZXIucmVwbGFjZU1lbWJlcihtZW1iZXIuZ2V0SWQoKSk7Ci0gICAgICAgIEVudGl0eSByZXBsYWNlbWVudCA9IGNsdXN0ZXIuZ2V0TWFuYWdlbWVudENvbnRleHQoKS5nZXRFbnRpdHlNYW5hZ2VyKCkuZ2V0RW50aXR5KHJlcGxhY2VtZW50SWQpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhjbHVzdGVyLm1lbWJlcnMuc2l6ZSgpLCAxKQotICAgICAgICBhc3NlcnRGYWxzZShjbHVzdGVyLm1lbWJlcnMuY29udGFpbnMobWVtYmVyKSkKLSAgICAgICAgYXNzZXJ0RmFsc2UoY2x1c3Rlci5jaGlsZHJlbi5jb250YWlucyhtZW1iZXIpKQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlcGxhY2VtZW50LCAicmVwbGFjZW1lbnRJZD0iK3JlcGxhY2VtZW50SWQpOwotICAgICAgICBhc3NlcnRUcnVlKGNsdXN0ZXIubWVtYmVycy5jb250YWlucyhyZXBsYWNlbWVudCksICJyZXBsYWNlbWVudD0iK3JlcGxhY2VtZW50KyI7IG1lbWJlcnM9IitjbHVzdGVyLm1lbWJlcnMpOwotICAgICAgICBhc3NlcnRUcnVlKGNsdXN0ZXIuY2hpbGRyZW4uY29udGFpbnMocmVwbGFjZW1lbnQpLCAicmVwbGFjZW1lbnQ9IityZXBsYWNlbWVudCsiOyBjaGlsZHJlbj0iK2NsdXN0ZXIuY2hpbGRyZW4pOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VNZW1iZXJUaHJvd3NJZk1lbWJlcklkRG9lc05vdFJlc29sdmUoKSB7Ci0gICAgICAgIER5bmFtaWNDbHVzdGVyIGNsdXN0ZXIgPSBhcHAuY3JlYXRlQW5kTWFuYWdlQ2hpbGQoRW50aXR5U3BlYy5jcmVhdGUoRHluYW1pY0NsdXN0ZXIuY2xhc3MpCi0gICAgICAgICAgICAgICAgLmNvbmZpZ3VyZSgiaW5pdGlhbFNpemUiLCAxKQotICAgICAgICAgICAgICAgIC5jb25maWd1cmUoImZhY3RvcnkiLCB7IHByb3BlcnRpZXMgLT4gcmV0dXJuIG5ldyBUZXN0RW50aXR5SW1wbChwcm9wZXJ0aWVzKSB9KSk7Ci0KLSAgICAgICAgY2x1c3Rlci5zdGFydChbbG9jXSkKLSAgICAgICAgRW50aXR5IG1lbWJlciA9IEl0ZXJhYmxlcy5nZXQoY2x1c3Rlci5tZW1iZXJzLCAwKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2x1c3Rlci5yZXBsYWNlTWVtYmVyKCJ3cm9uZy5pZCIpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKEV4Y2VwdGlvbnMuZ2V0Rmlyc3RUaHJvd2FibGVPZlR5cGUoZSwgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbi5jbGFzcykgPT0gbnVsbCkgdGhyb3cgZTsKLSAgICAgICAgICAgIGlmICghRXhjZXB0aW9ucy5nZXRGaXJzdFRocm93YWJsZU9mVHlwZShlLCBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uLmNsYXNzKS5nZXRNZXNzYWdlKCkuY29udGFpbnMoImVudGl0eSB3cm9uZy5pZCBjYW5ub3QgYmUgcmVzb2x2ZWQiKSkgdGhyb3cgZTsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydEVxdWFscyhjbHVzdGVyLm1lbWJlcnMgYXMgU2V0LCBJbW11dGFibGVTZXQub2YobWVtYmVyKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZU1lbWJlclRocm93c0lmTm90TWVtYmVyKCkgewotICAgICAgICBEeW5hbWljQ2x1c3RlciBjbHVzdGVyID0gYXBwLmNyZWF0ZUFuZE1hbmFnZUNoaWxkKEVudGl0eVNwZWMuY3JlYXRlKER5bmFtaWNDbHVzdGVyLmNsYXNzKQotICAgICAgICAgICAgICAgIC5jb25maWd1cmUoImluaXRpYWxTaXplIiwgMSkKLSAgICAgICAgICAgICAgICAuY29uZmlndXJlKCJmYWN0b3J5IiwgeyBwcm9wZXJ0aWVzIC0+IHJldHVybiBuZXcgVGVzdEVudGl0eUltcGwocHJvcGVydGllcykgfSkpOwotCi0gICAgICAgIGNsdXN0ZXIuc3RhcnQoW2xvY10pCi0gICAgICAgIEVudGl0eSBtZW1iZXIgPSBJdGVyYWJsZXMuZ2V0KGNsdXN0ZXIubWVtYmVycywgMCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsdXN0ZXIucmVwbGFjZU1lbWJlcihhcHAuZ2V0SWQoKSk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAoRXhjZXB0aW9ucy5nZXRGaXJzdFRocm93YWJsZU9mVHlwZShlLCBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uLmNsYXNzKSA9PSBudWxsKSB0aHJvdyBlOwotICAgICAgICAgICAgaWYgKCFFeGNlcHRpb25zLmdldEZpcnN0VGhyb3dhYmxlT2ZUeXBlKGUsIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24uY2xhc3MpLmdldE1lc3NhZ2UoKS5jb250YWlucygiaXMgbm90IGEgbWVtYmVyIikpIHRocm93IGU7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRFcXVhbHMoY2x1c3Rlci5tZW1iZXJzIGFzIFNldCwgSW1tdXRhYmxlU2V0Lm9mKG1lbWJlcikpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VNZW1iZXJGYWlsc0lmQ2FudFByb3Zpc2lvblJlcGxhY2VtZW50KCkgewotICAgICAgICBmaW5hbCBpbnQgZmFpbE51bSA9IDIKLSAgICAgICAgZmluYWwgQXRvbWljSW50ZWdlciBjb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoMCkKLSAgICAgICAgRHluYW1pY0NsdXN0ZXIgY2x1c3RlciA9IGFwcC5jcmVhdGVBbmRNYW5hZ2VDaGlsZChFbnRpdHlTcGVjLmNyZWF0ZShEeW5hbWljQ2x1c3Rlci5jbGFzcykKLSAgICAgICAgICAgICAgICAuY29uZmlndXJlKCJmYWN0b3J5IiwgeyBwcm9wZXJ0aWVzIC0+IAotICAgICAgICAgICAgICAgICAgICBpbnQgbnVtID0gY291bnRlci5pbmNyZW1lbnRBbmRHZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGYWlsaW5nRW50aXR5KHByb3BlcnRpZXMsIChudW09PWZhaWxOdW0pKQotICAgICAgICAgICAgICAgIH0pKTsKLQotICAgICAgICBjbHVzdGVyLnN0YXJ0KFtsb2NdKQotICAgICAgICBFbnRpdHkgbWVtYmVyID0gSXRlcmFibGVzLmdldChjbHVzdGVyLm1lbWJlcnMsIDApOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbHVzdGVyLnJlcGxhY2VNZW1iZXIobWVtYmVyLmdldElkKCkpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKCFlLnRvU3RyaW5nKCkuY29udGFpbnMoImZhaWxlZCB0byBncm93IikpIHRocm93IGU7Ci0gICAgICAgICAgICBpZiAoRXhjZXB0aW9ucy5nZXRGaXJzdFRocm93YWJsZU9mVHlwZShlLCBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uLmNsYXNzKSAhPSBudWxsKSB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhjbHVzdGVyLm1lbWJlcnMgYXMgU2V0LCBJbW11dGFibGVTZXQub2YobWVtYmVyKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZU1lbWJlclJlbW92ZXNBbmRUaG93c0lmRmFpbFRvU3RvcE9sZCgpIHsKLSAgICAgICAgZmluYWwgaW50IGZhaWxOdW0gPSAxCi0gICAgICAgIGZpbmFsIEF0b21pY0ludGVnZXIgY291bnRlciA9IG5ldyBBdG9taWNJbnRlZ2VyKDApCi0gICAgICAgIER5bmFtaWNDbHVzdGVyIGNsdXN0ZXIgPSBhcHAuY3JlYXRlQW5kTWFuYWdlQ2hpbGQoRW50aXR5U3BlYy5jcmVhdGUoRHluYW1pY0NsdXN0ZXIuY2xhc3MpCi0gICAgICAgICAgICAgICAgLmNvbmZpZ3VyZSgiaW5pdGlhbFNpemUiLCAxKQotICAgICAgICAgICAgICAgIC5jb25maWd1cmUoImZhY3RvcnkiLCB7IHByb3BlcnRpZXMgLT4KLSAgICAgICAgICAgICAgICAgICAgaW50IG51bSA9IGNvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmFpbGluZ0VudGl0eShwcm9wZXJ0aWVzLCBmYWxzZSwgKG51bT09ZmFpbE51bSksIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcykKLSAgICAgICAgICAgICAgICB9KSk7Ci0KLSAgICAgICAgY2x1c3Rlci5zdGFydChbbG9jXSkKLSAgICAgICAgRW50aXR5IG1lbWJlciA9IEl0ZXJhYmxlcy5nZXQoY2x1c3Rlci5tZW1iZXJzLCAwKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2x1c3Rlci5yZXBsYWNlTWVtYmVyKG1lbWJlci5nZXRJZCgpKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChFeGNlcHRpb25zLmdldEZpcnN0VGhyb3dhYmxlT2ZUeXBlKGUsIFN0b3BGYWlsZWRSdW50aW1lRXhjZXB0aW9uLmNsYXNzKSA9PSBudWxsKSB0aHJvdyBlOwotICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChUaHJvd2FibGUgdCA6IFRocm93YWJsZXMuZ2V0Q2F1c2FsQ2hhaW4oZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAodC50b1N0cmluZygpLmNvbnRhaW5zKCJTaW11bGF0aW5nIGVudGl0eSBzdG9wIGZhaWx1cmUiKSkgewotICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZm91bmQpIHRocm93IGU7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RmFsc2UoRW50aXRpZXMuaXNNYW5hZ2VkKG1lbWJlcikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2x1c3Rlci5tZW1iZXJzLnNpemUoKSwgMSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBUaHJvd2FibGUgdW53cmFwRXhjZXB0aW9uKFRocm93YWJsZSBlKSB7Ci0gICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXhlY3V0aW9uRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gdW53cmFwRXhjZXB0aW9uKGUuY2F1c2UpCi0gICAgICAgIH0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySW52b2NhdGlvbkV4Y2VwdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIHVud3JhcEV4Y2VwdGlvbihlLmNhdXNlKQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGUKLSAgICAgICAgfQotICAgIH0KLX0KLQotY2xhc3MgRmFpbGluZ0VudGl0eSBleHRlbmRzIFRlc3RFbnRpdHlJbXBsIHsKLSAgICBmaW5hbCBib29sZWFuIGZhaWxPblN0YXJ0OwotICAgIGZpbmFsIGJvb2xlYW4gZmFpbE9uU3RvcDsKLSAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgRXhjZXB0aW9uPiBleGNlcHRpb25DbGF6ejsKLQotICAgIHB1YmxpYyBGYWlsaW5nRW50aXR5KE1hcCBmbGFncywgYm9vbGVhbiBmYWlsT25TdGFydCkgewotICAgICAgICB0aGlzKGZsYWdzLCBmYWlsT25TdGFydCwgZmFsc2UpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgRmFpbGluZ0VudGl0eShNYXAgZmxhZ3MsIGJvb2xlYW4gZmFpbE9uU3RhcnQsIGJvb2xlYW4gZmFpbE9uU3RvcCkgewotICAgICAgICB0aGlzKGZsYWdzLCBmYWlsT25TdGFydCwgZmFpbE9uU3RvcCwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEZhaWxpbmdFbnRpdHkoTWFwIGZsYWdzLCBib29sZWFuIGZhaWxPblN0YXJ0LCBib29sZWFuIGZhaWxPblN0b3AsIENsYXNzPD8gZXh0ZW5kcyBFeGNlcHRpb24+IGV4Y2VwdGlvbkNsYXp6KSB7Ci0gICAgICAgIHN1cGVyKGZsYWdzKQotICAgICAgICB0aGlzLmZhaWxPblN0YXJ0ID0gZmFpbE9uU3RhcnQ7Ci0gICAgICAgIHRoaXMuZmFpbE9uU3RvcCA9IGZhaWxPblN0b3A7Ci0gICAgICAgIHRoaXMuZXhjZXB0aW9uQ2xhenogPSBleGNlcHRpb25DbGF6ejsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RhcnQoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTG9jYXRpb24+IGxvY3MpIHsKLSAgICAgICAgaWYgKGZhaWxPblN0YXJ0KSB7Ci0gICAgICAgICAgICBFeGNlcHRpb24gZSA9IGV4Y2VwdGlvbkNsYXp6LmdldENvbnN0cnVjdG9yKFN0cmluZy5jbGFzcykubmV3SW5zdGFuY2UoIlNpbXVsYXRpbmcgZW50aXR5IHN0YXJ0IGZhaWx1cmUgZm9yIHRlc3QiKTsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RvcCgpIHsKLSAgICAgICAgaWYgKGZhaWxPblN0b3ApIHsKLSAgICAgICAgICAgIEV4Y2VwdGlvbiBlID0gZXhjZXB0aW9uQ2xhenouZ2V0Q29uc3RydWN0b3IoU3RyaW5nLmNsYXNzKS5uZXdJbnN0YW5jZSgiU2ltdWxhdGluZyBlbnRpdHkgc3RvcCBmYWlsdXJlIGZvciB0ZXN0Iik7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvdGVzdC9qYXZhL2Jyb29rbHluL2VudGl0eS9ncm91cC9EeW5hbWljQ2x1c3RlclRlc3QuamF2YSBiL2NvcmUvc3JjL3Rlc3QvamF2YS9icm9va2x5bi9lbnRpdHkvZ3JvdXAvRHluYW1pY0NsdXN0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU5MDc5ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL3Rlc3QvamF2YS9icm9va2x5bi9lbnRpdHkvZ3JvdXAvRHluYW1pY0NsdXN0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSw3OTAgQEAKK3BhY2thZ2UgYnJvb2tseW4uZW50aXR5Lmdyb3VwOworCitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZU1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CisKK2ltcG9ydCBicm9va2x5bi5lbnRpdHkuRW50aXR5OworaW1wb3J0IGJyb29rbHluLmVudGl0eS5iYXNpYy5BcHBsaWNhdGlvbkJ1aWxkZXI7CitpbXBvcnQgYnJvb2tseW4uZW50aXR5LmJhc2ljLkF0dHJpYnV0ZXM7CitpbXBvcnQgYnJvb2tseW4uZW50aXR5LmJhc2ljLkJyb29rbHluVGFza1RhZ3M7CitpbXBvcnQgYnJvb2tseW4uZW50aXR5LmJhc2ljLkVudGl0aWVzOworaW1wb3J0IGJyb29rbHluLmVudGl0eS5iYXNpYy5FbnRpdHlGYWN0b3J5OworaW1wb3J0IGJyb29rbHluLmVudGl0eS5iYXNpYy5MaWZlY3ljbGU7CitpbXBvcnQgYnJvb2tseW4uZW50aXR5LnByb3h5aW5nLkVudGl0eVNwZWM7CitpbXBvcnQgYnJvb2tseW4uZW50aXR5LnRyYWl0LkNoYW5nZWFibGU7CitpbXBvcnQgYnJvb2tseW4uZW50aXR5LnRyYWl0LkZhaWxpbmdFbnRpdHk7CitpbXBvcnQgYnJvb2tseW4ubG9jYXRpb24uTG9jYXRpb247CitpbXBvcnQgYnJvb2tseW4ubG9jYXRpb24uYmFzaWMuU2ltdWxhdGVkTG9jYXRpb247CitpbXBvcnQgYnJvb2tseW4ubWFuYWdlbWVudC5UYXNrOworaW1wb3J0IGJyb29rbHluLnRlc3QuQXNzZXJ0czsKK2ltcG9ydCBicm9va2x5bi50ZXN0LmVudGl0eS5UZXN0QXBwbGljYXRpb247CitpbXBvcnQgYnJvb2tseW4udGVzdC5lbnRpdHkuVGVzdEVudGl0eTsKK2ltcG9ydCBicm9va2x5bi50ZXN0LmVudGl0eS5UZXN0RW50aXR5SW1wbDsKK2ltcG9ydCBicm9va2x5bi51dGlsLmNvbGxlY3Rpb25zLk11dGFibGVNYXA7CitpbXBvcnQgYnJvb2tseW4udXRpbC5leGNlcHRpb25zLkV4Y2VwdGlvbnM7CitpbXBvcnQgYnJvb2tseW4udXRpbC50aW1lLlRpbWU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkZ1bmN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlZGljYXRlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlRocm93YWJsZXM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkF0b21pY3M7CisKKworcHVibGljIGNsYXNzIER5bmFtaWNDbHVzdGVyVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRU9VVF9NUyA9IDIwMDA7CisKKyAgICBUZXN0QXBwbGljYXRpb24gYXBwOworICAgIFNpbXVsYXRlZExvY2F0aW9uIGxvYzsKKyAgICBTaW11bGF0ZWRMb2NhdGlvbiBsb2MyOworICAgIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKCk7CisKKyAgICBAQmVmb3JlTWV0aG9kCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGFwcCA9IEFwcGxpY2F0aW9uQnVpbGRlci5uZXdNYW5hZ2VkQXBwKFRlc3RBcHBsaWNhdGlvbi5jbGFzcyk7CisgICAgICAgIGxvYyA9IG5ldyBTaW11bGF0ZWRMb2NhdGlvbigpOworICAgICAgICBsb2MyID0gbmV3IFNpbXVsYXRlZExvY2F0aW9uKCk7CisgICAgfQorCisgICAgQEFmdGVyTWV0aG9kKGFsd2F5c1J1biA9IHRydWUpCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKXsKKyAgICAgICAgaWYgKGFwcCAhPSBudWxsKSBFbnRpdGllcy5kZXN0cm95QWxsKGFwcC5nZXRNYW5hZ2VtZW50Q29udGV4dCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNyZWF0aW9uT2theVdpdGhvdXROZXdFbnRpdHlGYWN0b3J5QXJndW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXBwLmNyZWF0ZUFuZE1hbmFnZUNoaWxkKEVudGl0eVNwZWMuY3JlYXRlKER5bmFtaWNDbHVzdGVyLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjb25zdHJ1Y3Rpb25SZXF1aXJlc1RoYXROZXdFbnRpdHlBcmd1bWVudElzQW5FbnRpdHlGYWN0b3J5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhcHAuY3JlYXRlQW5kTWFuYWdlQ2hpbGQoRW50aXR5U3BlYy5jcmVhdGUoRHluYW1pY0NsdXN0ZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC5jb25maWd1cmUoImZhY3RvcnkiLCAiZXJyb3IiKSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAoRXhjZXB0aW9ucy5nZXRGaXJzdFRocm93YWJsZU9mVHlwZShlLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpID09IG51bGwpIHRocm93IGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHN0YXJ0UmVxdWlyZXNUaGF0TmV3RW50aXR5QXJndW1lbnRJc0dpdmVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIER5bmFtaWNDbHVzdGVyIGMgPSBhcHAuY3JlYXRlQW5kTWFuYWdlQ2hpbGQoRW50aXR5U3BlYy5jcmVhdGUoRHluYW1pY0NsdXN0ZXIuY2xhc3MpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGMuc3RhcnQoSW1tdXRhYmxlTGlzdC5vZihsb2MpKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmIChFeGNlcHRpb25zLmdldEZpcnN0VGhyb3dhYmxlT2ZUeXBlKGUsIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcykgPT0gbnVsbCkgdGhyb3cgZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc3RhcnRNZXRob2RGYWlsc0lmTG9jYXRpb25zUGFyYW1ldGVySGFzTW9yZVRoYW5PbmVFbGVtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIER5bmFtaWNDbHVzdGVyIGNsdXN0ZXIgPSBhcHAuY3JlYXRlQW5kTWFuYWdlQ2hpbGQoRW50aXR5U3BlYy5jcmVhdGUoRHluYW1pY0NsdXN0ZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgLmNvbmZpZ3VyZShEeW5hbWljQ2x1c3Rlci5NRU1CRVJfU1BFQywgRW50aXR5U3BlYy5jcmVhdGUoVGVzdEVudGl0eS5jbGFzcykpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsdXN0ZXIuc3RhcnQoSW1tdXRhYmxlTGlzdC5vZihsb2MsIGxvYzIpKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmIChFeGNlcHRpb25zLmdldEZpcnN0VGhyb3dhYmxlT2ZUeXBlKGUsIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykgPT0gbnVsbCkgdGhyb3cgZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsdXN0ZXJIYXNPbmVMb2NhdGlvbkFmdGVyU3RhcnRpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRHluYW1pY0NsdXN0ZXIgY2x1c3RlciA9IGFwcC5jcmVhdGVBbmRNYW5hZ2VDaGlsZChFbnRpdHlTcGVjLmNyZWF0ZShEeW5hbWljQ2x1c3Rlci5jbGFzcykKKyAgICAgICAgICAgICAgICAuY29uZmlndXJlKER5bmFtaWNDbHVzdGVyLk1FTUJFUl9TUEVDLCBFbnRpdHlTcGVjLmNyZWF0ZShUZXN0RW50aXR5LmNsYXNzKSkpOworICAgICAgICBjbHVzdGVyLnN0YXJ0KEltbXV0YWJsZUxpc3Qub2YobG9jKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhjbHVzdGVyLmdldExvY2F0aW9ucygpLnNpemUoKSwgMSk7CisgICAgICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVMaXN0LmNvcHlPZihjbHVzdGVyLmdldExvY2F0aW9ucygpKSwgSW1tdXRhYmxlTGlzdC5vZihsb2MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlVXBBZnRlclN0YXJ0aW5nV2l0aE5vTWVtYmVycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBEeW5hbWljQ2x1c3RlciBjbHVzdGVyID0gYXBwLmNyZWF0ZUFuZE1hbmFnZUNoaWxkKEVudGl0eVNwZWMuY3JlYXRlKER5bmFtaWNDbHVzdGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5jb25maWd1cmUoRHluYW1pY0NsdXN0ZXIuTUVNQkVSX1NQRUMsIEVudGl0eVNwZWMuY3JlYXRlKFRlc3RFbnRpdHkuY2xhc3MpKQorICAgICAgICAgICAgICAgIC5jb25maWd1cmUoRHluYW1pY0NsdXN0ZXIuSU5JVElBTF9TSVpFLCAwKSk7CisgICAgICAgIGNsdXN0ZXIuc3RhcnQoSW1tdXRhYmxlTGlzdC5vZihsb2MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNsdXN0ZXIuZ2V0QXR0cmlidXRlKEF0dHJpYnV0ZXMuU0VSVklDRV9TVEFURSksIExpZmVjeWNsZS5SVU5OSU5HKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjbHVzdGVyLmdldEF0dHJpYnV0ZShBdHRyaWJ1dGVzLlNFUlZJQ0VfVVApKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHVzaW5nRW50aXR5U3BlY1Jlc2l6ZUZyb21aZXJvVG9PbmVTdGFydHNBTmV3RW50aXR5QW5kU2V0c0l0c1BhcmVudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBEeW5hbWljQ2x1c3RlciBjbHVzdGVyID0gYXBwLmNyZWF0ZUFuZE1hbmFnZUNoaWxkKEVudGl0eVNwZWMuY3JlYXRlKER5bmFtaWNDbHVzdGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5jb25maWd1cmUoIm1lbWJlclNwZWMiLCBFbnRpdHlTcGVjLmNyZWF0ZShUZXN0RW50aXR5LmNsYXNzKSkpOworICAgICAgICAKKyAgICAgICAgY2x1c3Rlci5zdGFydChJbW11dGFibGVMaXN0Lm9mKGxvYykpOworCisgICAgICAgIGNsdXN0ZXIucmVzaXplKDEpOworICAgICAgICBUZXN0RW50aXR5IGVudGl0eSA9IChUZXN0RW50aXR5KSBJdGVyYWJsZXMuZ2V0T25seUVsZW1lbnQoY2x1c3Rlci5nZXRNZW1iZXJzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZW50aXR5LmdldENvdW50KCksIDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoZW50aXR5LmdldFBhcmVudCgpLCBjbHVzdGVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGVudGl0eS5nZXRBcHBsaWNhdGlvbigpLCBhcHApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVzaXplRnJvbVplcm9Ub09uZVN0YXJ0c0FOZXdFbnRpdHlBbmRTZXRzSXRzUGFyZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIER5bmFtaWNDbHVzdGVyIGNsdXN0ZXIgPSBhcHAuY3JlYXRlQW5kTWFuYWdlQ2hpbGQoRW50aXR5U3BlYy5jcmVhdGUoRHluYW1pY0NsdXN0ZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgLmNvbmZpZ3VyZSgiZmFjdG9yeSIsIG5ldyBFbnRpdHlGYWN0b3J5KCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIEVudGl0eSBuZXdFbnRpdHkoTWFwIGZsYWdzLCBFbnRpdHkgcGFyZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRlc3RFbnRpdHlJbXBsKGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgfX0pKTsKKworICAgICAgICBjbHVzdGVyLnN0YXJ0KEltbXV0YWJsZUxpc3Qub2YobG9jKSk7CisKKyAgICAgICAgY2x1c3Rlci5yZXNpemUoMSk7CisgICAgICAgIFRlc3RFbnRpdHkgZW50aXR5ID0gKFRlc3RFbnRpdHkpIEl0ZXJhYmxlcy5nZXQoY2x1c3Rlci5nZXRNZW1iZXJzKCksIDApOworICAgICAgICBhc3NlcnRFcXVhbHMoZW50aXR5LmdldENvdW50ZXIoKS5nZXQoKSwgMSk7CisgICAgICAgIGFzc2VydEVxdWFscyhlbnRpdHkuZ2V0UGFyZW50KCksIGNsdXN0ZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZW50aXR5LmdldEFwcGxpY2F0aW9uKCksIGFwcCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjdXJyZW50U2l6ZVByb3BlcnR5UmVmbGVjdHNBY3R1YWxDbHVzdGVyU2l6ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBEeW5hbWljQ2x1c3RlciBjbHVzdGVyID0gYXBwLmNyZWF0ZUFuZE1hbmFnZUNoaWxkKEVudGl0eVNwZWMuY3JlYXRlKER5bmFtaWNDbHVzdGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5jb25maWd1cmUoImZhY3RvcnkiLCBuZXcgRW50aXR5RmFjdG9yeSgpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBFbnRpdHkgbmV3RW50aXR5KE1hcCBmbGFncywgRW50aXR5IHBhcmVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXN0RW50aXR5SW1wbChmbGFncyk7CisgICAgICAgICAgICAgICAgICAgIH19KSk7CisKKworICAgICAgICBhc3NlcnRFcXVhbHMoY2x1c3Rlci5nZXRDdXJyZW50U2l6ZSgpLCAoSW50ZWdlcikwKTsKKworICAgICAgICBjbHVzdGVyLnN0YXJ0KEltbXV0YWJsZUxpc3Qub2YobG9jKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhjbHVzdGVyLmdldEN1cnJlbnRTaXplKCksIChJbnRlZ2VyKTEpOworICAgICAgICBhc3NlcnRFcXVhbHMoY2x1c3Rlci5nZXRBdHRyaWJ1dGUoQ2hhbmdlYWJsZS5HUk9VUF9TSVpFKSwgKEludGVnZXIpMSk7CisKKyAgICAgICAgaW50IG5ld1NpemUgPSBjbHVzdGVyLnJlc2l6ZSgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ld1NpemUsIDApOworICAgICAgICBhc3NlcnRFcXVhbHMoKEludGVnZXIpbmV3U2l6ZSwgY2x1c3Rlci5nZXRDdXJyZW50U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ld1NpemUsIGNsdXN0ZXIuZ2V0TWVtYmVycygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygoSW50ZWdlciluZXdTaXplLCBjbHVzdGVyLmdldEF0dHJpYnV0ZShDaGFuZ2VhYmxlLkdST1VQX1NJWkUpKTsKKworICAgICAgICBuZXdTaXplID0gY2x1c3Rlci5yZXNpemUoNCk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXdTaXplLCA0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKChJbnRlZ2VyKW5ld1NpemUsIGNsdXN0ZXIuZ2V0Q3VycmVudFNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXdTaXplLCBjbHVzdGVyLmdldE1lbWJlcnMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoKEludGVnZXIpbmV3U2l6ZSwgY2x1c3Rlci5nZXRBdHRyaWJ1dGUoQ2hhbmdlYWJsZS5HUk9VUF9TSVpFKSk7CisKKyAgICAgICAgbmV3U2l6ZSA9IGNsdXN0ZXIucmVzaXplKDApOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3U2l6ZSwgMCk7CisgICAgICAgIGFzc2VydEVxdWFscygoSW50ZWdlciluZXdTaXplLCBjbHVzdGVyLmdldEN1cnJlbnRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3U2l6ZSwgY2x1c3Rlci5nZXRNZW1iZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKChJbnRlZ2VyKW5ld1NpemUsIGNsdXN0ZXIuZ2V0QXR0cmlidXRlKENoYW5nZWFibGUuR1JPVVBfU0laRSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY2x1c3RlclNpemVBZnRlclN0YXJ0SXNJbml0aWFsU2l6ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBEeW5hbWljQ2x1c3RlciBjbHVzdGVyID0gYXBwLmNyZWF0ZUFuZE1hbmFnZUNoaWxkKEVudGl0eVNwZWMuY3JlYXRlKER5bmFtaWNDbHVzdGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5jb25maWd1cmUoImZhY3RvcnkiLCBuZXcgRW50aXR5RmFjdG9yeSgpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBFbnRpdHkgbmV3RW50aXR5KE1hcCBmbGFncywgRW50aXR5IHBhcmVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXN0RW50aXR5SW1wbChmbGFncyk7CisgICAgICAgICAgICAgICAgICAgIH19KQorICAgICAgICAgICAgICAgIC5jb25maWd1cmUoImluaXRpYWxTaXplIiwgMikpOworCisgICAgICAgIGNsdXN0ZXIuc3RhcnQoSW1tdXRhYmxlTGlzdC5vZihsb2MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNsdXN0ZXIuZ2V0Q3VycmVudFNpemUoKSwgKEludGVnZXIpMik7CisgICAgICAgIGFzc2VydEVxdWFscyhjbHVzdGVyLmdldE1lbWJlcnMoKS5zaXplKCksIDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoY2x1c3Rlci5nZXRBdHRyaWJ1dGUoQ2hhbmdlYWJsZS5HUk9VUF9TSVpFKSwgKEludGVnZXIpMik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjbHVzdGVyTG9jYXRpb25Jc1Bhc3NlZE9uVG9FbnRpdHlTdGFydCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMaXN0PFNpbXVsYXRlZExvY2F0aW9uPiBsb2NhdGlvbnMgPSBJbW11dGFibGVMaXN0Lm9mKGxvYyk7CisgICAgICAgIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxDb2xsZWN0aW9uPD8gZXh0ZW5kcyBMb2NhdGlvbj4+IHN0YXNoZWRMb2NhdGlvbnMgPSBBdG9taWNzLm5ld1JlZmVyZW5jZSgpOworICAgICAgICAKKyAgICAgICAgRHluYW1pY0NsdXN0ZXIgY2x1c3RlciA9IGFwcC5jcmVhdGVBbmRNYW5hZ2VDaGlsZChFbnRpdHlTcGVjLmNyZWF0ZShEeW5hbWljQ2x1c3Rlci5jbGFzcykKKyAgICAgICAgICAgICAgICAuY29uZmlndXJlKCJmYWN0b3J5IiwgbmV3IEVudGl0eUZhY3RvcnkoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgRW50aXR5IG5ld0VudGl0eShNYXAgZmxhZ3MsIEVudGl0eSBwYXJlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGVzdEVudGl0eUltcGwocGFyZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc3RhcnQoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTG9jYXRpb24+IGxvYykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5zdGFydChsb2MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFzaGVkTG9jYXRpb25zLnNldChsb2MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIH19KQorICAgICAgICAgICAgICAgIC5jb25maWd1cmUoImluaXRpYWxTaXplIiwgMSkpOworCisgICAgICAgIGNsdXN0ZXIuc3RhcnQobG9jYXRpb25zKTsKKyAgICAgICAgVGVzdEVudGl0eSBlbnRpdHkgPSAoVGVzdEVudGl0eSkgSXRlcmFibGVzLmdldChjbHVzdGVyLmdldE1lbWJlcnMoKSwgMCk7CisgICAgICAgIAorICAgICAgICBhc3NlcnROb3ROdWxsKHN0YXNoZWRMb2NhdGlvbnMuZ2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoc3Rhc2hlZExvY2F0aW9ucy5nZXQoKS5zaXplKCksIDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlTGlzdC5jb3B5T2Yoc3Rhc2hlZExvY2F0aW9ucy5nZXQoKSksIGxvY2F0aW9ucyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXNpemVGcm9tT25lVG9aZXJvQ2hhbmdlc0NsdXN0ZXJTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIER5bmFtaWNDbHVzdGVyIGNsdXN0ZXIgPSBhcHAuY3JlYXRlQW5kTWFuYWdlQ2hpbGQoRW50aXR5U3BlYy5jcmVhdGUoRHluYW1pY0NsdXN0ZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgLmNvbmZpZ3VyZSgiZmFjdG9yeSIsIG5ldyBFbnRpdHlGYWN0b3J5KCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIEVudGl0eSBuZXdFbnRpdHkoTWFwIGZsYWdzLCBFbnRpdHkgcGFyZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRlc3RFbnRpdHlJbXBsKGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgfX0pCisgICAgICAgICAgICAgICAgLmNvbmZpZ3VyZSgiaW5pdGlhbFNpemUiLCAxKSk7CisKKyAgICAgICAgY2x1c3Rlci5zdGFydChJbW11dGFibGVMaXN0Lm9mKGxvYykpOworICAgICAgICBUZXN0RW50aXR5IGVudGl0eSA9IChUZXN0RW50aXR5KSBJdGVyYWJsZXMuZ2V0KGNsdXN0ZXIuZ2V0TWVtYmVycygpLCAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNsdXN0ZXIuZ2V0Q3VycmVudFNpemUoKSwgKEludGVnZXIpMSk7CisgICAgICAgIGFzc2VydEVxdWFscyhlbnRpdHkuZ2V0Q291bnRlcigpLmdldCgpLCAxKTsKKyAgICAgICAgCisgICAgICAgIGNsdXN0ZXIucmVzaXplKDApOworICAgICAgICBhc3NlcnRFcXVhbHMoY2x1c3Rlci5nZXRDdXJyZW50U2l6ZSgpLCAoSW50ZWdlcikwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGVudGl0eS5nZXRDb3VudGVyKCkuZ2V0KCksIDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY29uY3VycmVudFJlc2l6ZXNUb1NhbWVOdW1iZXJDcmVhdGVzQ29ycmVjdE51bWJlck9mTm9kZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IE9WRVJIRUFEX01TID0gNTAwOworICAgICAgICBmaW5hbCBpbnQgU1RBUlRVUF9USU1FX01TID0gNTA7CisgICAgICAgIGZpbmFsIEF0b21pY0ludGVnZXIgbnVtU3RhcnRlZCA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworICAgICAgICBmaW5hbCBEeW5hbWljQ2x1c3RlciBjbHVzdGVyID0gYXBwLmNyZWF0ZUFuZE1hbmFnZUNoaWxkKEVudGl0eVNwZWMuY3JlYXRlKER5bmFtaWNDbHVzdGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5jb25maWd1cmUoImZhY3RvcnkiLCBuZXcgRW50aXR5RmFjdG9yeSgpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBFbnRpdHkgbmV3RW50aXR5KE1hcCBmbGFncywgRW50aXR5IHBhcmVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgVGltZS5zbGVlcChTVEFSVFVQX1RJTUVfTVMpOworICAgICAgICAgICAgICAgICAgICAgICAgbnVtU3RhcnRlZC5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGVzdEVudGl0eUltcGwoZmxhZ3MsIHBhcmVudCk7CisgICAgICAgICAgICAgICAgICAgIH19KSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNsdXN0ZXIuZ2V0Q3VycmVudFNpemUoKSwgKEludGVnZXIpMCk7CisgICAgICAgIGNsdXN0ZXIuc3RhcnQoSW1tdXRhYmxlTGlzdC5vZihsb2MpKTsKKworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3Q2FjaGVkVGhyZWFkUG9vbCgpOworICAgICAgICBmaW5hbCBMaXN0PFRocm93YWJsZT4gdGhyb3dhYmxlcyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDxUaHJvd2FibGU+KCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICAgICAgICAgIGV4ZWN1dG9yLnN1Ym1pdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3Rlci5yZXNpemUoMik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93YWJsZXMuYWRkKGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9fSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGV4ZWN1dG9yLnNodXRkb3duKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dG9yLmF3YWl0VGVybWluYXRpb24oMTAqU1RBUlRVUF9USU1FX01TK09WRVJIRUFEX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgICAgIGlmICh0aHJvd2FibGVzLnNpemUoKSA+IDApIHRocm93IEV4Y2VwdGlvbnMucHJvcGFnYXRlKHRocm93YWJsZXMuZ2V0KDApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjbHVzdGVyLmdldEN1cnJlbnRTaXplKCksIChJbnRlZ2VyKTIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNsdXN0ZXIuZ2V0QXR0cmlidXRlKENoYW5nZWFibGUuR1JPVVBfU0laRSksIChJbnRlZ2VyKTIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bVN0YXJ0ZWQuZ2V0KCksIDIpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZXhlY3V0b3Iuc2h1dGRvd25Ob3coKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0KGVuYWJsZWQgPSBmYWxzZSkKKyAgICBwdWJsaWMgdm9pZCBzdG9wcGluZ1RoZUNsdXN0ZXJTdG9wc1RoZUVudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBEeW5hbWljQ2x1c3RlciBjbHVzdGVyID0gYXBwLmNyZWF0ZUFuZE1hbmFnZUNoaWxkKEVudGl0eVNwZWMuY3JlYXRlKER5bmFtaWNDbHVzdGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5jb25maWd1cmUoImZhY3RvcnkiLCBuZXcgRW50aXR5RmFjdG9yeSgpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBFbnRpdHkgbmV3RW50aXR5KE1hcCBmbGFncywgRW50aXR5IHBhcmVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXN0RW50aXR5SW1wbChmbGFncyk7CisgICAgICAgICAgICAgICAgICAgIH19KQorICAgICAgICAgICAgICAgIC5jb25maWd1cmUoImluaXRpYWxTaXplIiwgMSkpOworCisgICAgICAgIGNsdXN0ZXIuc3RhcnQoSW1tdXRhYmxlTGlzdC5vZihsb2MpKTsKKyAgICAgICAgVGVzdEVudGl0eSBlbnRpdHkgPSAoVGVzdEVudGl0eSkgSXRlcmFibGVzLmdldChjbHVzdGVyLmdldE1lbWJlcnMoKSwgMCk7CisgICAgICAgIAorICAgICAgICBhc3NlcnRFcXVhbHMoZW50aXR5LmdldENvdW50ZXIoKS5nZXQoKSwgMSk7CisgICAgICAgIGNsdXN0ZXIuc3RvcCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZW50aXR5LmdldENvdW50ZXIoKS5nZXQoKSwgMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB0ZXN0cyB0aGUgZml4IGZvciBFTkdSLTE4MjYuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBmYWlsaW5nRW50aXRpZXNEb250QnJlYWtDbHVzdGVyQWN0aW9ucygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBpbnQgZmFpbE51bSA9IDI7CisgICAgICAgIGZpbmFsIEF0b21pY0ludGVnZXIgY291bnRlciA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworICAgICAgICBEeW5hbWljQ2x1c3RlciBjbHVzdGVyID0gYXBwLmNyZWF0ZUFuZE1hbmFnZUNoaWxkKEVudGl0eVNwZWMuY3JlYXRlKER5bmFtaWNDbHVzdGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5jb25maWd1cmUoImluaXRpYWxTaXplIiwgMCkKKyAgICAgICAgICAgICAgICAuY29uZmlndXJlKCJmYWN0b3J5IiwgbmV3IEVudGl0eUZhY3RvcnkoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgRW50aXR5IG5ld0VudGl0eShNYXAgZmxhZ3MsIEVudGl0eSBwYXJlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW0gPSBjb3VudGVyLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFwcC5nZXRNYW5hZ2VtZW50Q29udGV4dCgpLmdldEVudGl0eU1hbmFnZXIoKS5jcmVhdGVFbnRpdHkoRW50aXR5U3BlYy5jcmVhdGUoRmFpbGluZ0VudGl0eS5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmZpZ3VyZShmbGFncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmZpZ3VyZShGYWlsaW5nRW50aXR5LkZBSUxfT05fU1RBUlQsIChudW09PWZhaWxOdW0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGFyZW50KHBhcmVudCkpOworICAgICAgICAgICAgICAgICAgICB9fSkpOworCisgICAgICAgIGNsdXN0ZXIuc3RhcnQoSW1tdXRhYmxlTGlzdC5vZihsb2MpKTsKKyAgICAgICAgY2x1c3Rlci5yZXNpemUoMyk7CisgICAgICAgIGFzc2VydEVxdWFscyhjbHVzdGVyLmdldEN1cnJlbnRTaXplKCksIChJbnRlZ2VyKTIpOworICAgICAgICBhc3NlcnRFcXVhbHMoY2x1c3Rlci5nZXRNZW1iZXJzKCkuc2l6ZSgpLCAyKTsKKyAgICAgICAgZm9yIChFbnRpdHkgbWVtYmVyIDogY2x1c3Rlci5nZXRNZW1iZXJzKCkpIHsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCgoRmFpbGluZ0VudGl0eSltZW1iZXIpLmdldENvbmZpZyhGYWlsaW5nRW50aXR5LkZBSUxfT05fU1RBUlQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluaXRpYWxRdW9ydW1TaXplU3VmZmljaWVudEZvclN0YXJ0dXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IGZhaWxOdW0gPSAxOworICAgICAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIGNvdW50ZXIgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKyAgICAgICAgRHluYW1pY0NsdXN0ZXIgY2x1c3RlciA9IGFwcC5jcmVhdGVBbmRNYW5hZ2VDaGlsZChFbnRpdHlTcGVjLmNyZWF0ZShEeW5hbWljQ2x1c3Rlci5jbGFzcykKKyAgICAgICAgICAgICAgICAuY29uZmlndXJlKCJpbml0aWFsU2l6ZSIsIDIpCisgICAgICAgICAgICAgICAgLmNvbmZpZ3VyZShEeW5hbWljQ2x1c3Rlci5JTklUSUFMX1FVT1JVTV9TSVpFLCAxKQorICAgICAgICAgICAgICAgIC5jb25maWd1cmUoImZhY3RvcnkiLCBuZXcgRW50aXR5RmFjdG9yeSgpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBFbnRpdHkgbmV3RW50aXR5KE1hcCBmbGFncywgRW50aXR5IHBhcmVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bSA9IGNvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXBwLmdldE1hbmFnZW1lbnRDb250ZXh0KCkuZ2V0RW50aXR5TWFuYWdlcigpLmNyZWF0ZUVudGl0eShFbnRpdHlTcGVjLmNyZWF0ZShGYWlsaW5nRW50aXR5LmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29uZmlndXJlKGZsYWdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29uZmlndXJlKEZhaWxpbmdFbnRpdHkuRkFJTF9PTl9TVEFSVCwgKG51bT09ZmFpbE51bSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wYXJlbnQocGFyZW50KSk7CisgICAgICAgICAgICAgICAgICAgIH19KSk7CisKKyAgICAgICAgY2x1c3Rlci5zdGFydChJbW11dGFibGVMaXN0Lm9mKGxvYykpOworICAgICAgICAKKyAgICAgICAgLy8gbm90ZSB0aGF0IGNoaWxkcmVuIGluY2x1ZGUgcXVhcmFudGluZSBncm91cDsgYW5kIHF1YXJhbnRpbmVkIG5vZGVzCisgICAgICAgIGFzc2VydEVxdWFscyhjbHVzdGVyLmdldEN1cnJlbnRTaXplKCksIChJbnRlZ2VyKTEpOworICAgICAgICBhc3NlcnRFcXVhbHMoY2x1c3Rlci5nZXRNZW1iZXJzKCkuc2l6ZSgpLCAxKTsKKyAgICAgICAgZm9yIChFbnRpdHkgbWVtYmVyIDogY2x1c3Rlci5nZXRNZW1iZXJzKCkpIHsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCgoRmFpbGluZ0VudGl0eSltZW1iZXIpLmdldENvbmZpZyhGYWlsaW5nRW50aXR5LkZBSUxfT05fU1RBUlQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluaXRpYWxRdW9ydW1TaXplRGVmYXVsdHNUb0luaXRpYWxTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGludCBmYWlsTnVtID0gMTsKKyAgICAgICAgZmluYWwgQXRvbWljSW50ZWdlciBjb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisgICAgICAgIER5bmFtaWNDbHVzdGVyIGNsdXN0ZXIgPSBhcHAuY3JlYXRlQW5kTWFuYWdlQ2hpbGQoRW50aXR5U3BlYy5jcmVhdGUoRHluYW1pY0NsdXN0ZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgLmNvbmZpZ3VyZSgiaW5pdGlhbFNpemUiLCAyKQorICAgICAgICAgICAgICAgIC5jb25maWd1cmUoImZhY3RvcnkiLCBuZXcgRW50aXR5RmFjdG9yeSgpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBFbnRpdHkgbmV3RW50aXR5KE1hcCBmbGFncywgRW50aXR5IHBhcmVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bSA9IGNvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXBwLmdldE1hbmFnZW1lbnRDb250ZXh0KCkuZ2V0RW50aXR5TWFuYWdlcigpLmNyZWF0ZUVudGl0eShFbnRpdHlTcGVjLmNyZWF0ZShGYWlsaW5nRW50aXR5LmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29uZmlndXJlKGZsYWdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29uZmlndXJlKEZhaWxpbmdFbnRpdHkuRkFJTF9PTl9TVEFSVCwgKG51bT09ZmFpbE51bSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wYXJlbnQocGFyZW50KSk7CisgICAgICAgICAgICAgICAgICAgIH19KSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsdXN0ZXIuc3RhcnQoSW1tdXRhYmxlTGlzdC5vZihsb2MpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB1bndyYXBwZWQgPSBFeGNlcHRpb25zLmdldEZpcnN0VGhyb3dhYmxlT2ZUeXBlKGUsIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgICAgICBpZiAodW53cmFwcGVkICE9IG51bGwgJiYgdW53cmFwcGVkLmdldE1lc3NhZ2UoKS5jb250YWlucygiZmFpbGVkIHRvIGdldCB0byBpbml0aWFsIHNpemUiKSkgeworICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3MKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgZTsgLy8gZmFpbAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBub3RlIHRoYXQgY2hpbGRyZW4gaW5jbHVkZSBxdWFyYW50aW5lIGdyb3VwOyBhbmQgcXVhcmFudGluZWQgbm9kZXMKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNsdXN0ZXIuZ2V0Q3VycmVudFNpemUoKSwgKEludGVnZXIpMSk7CisgICAgICAgIGFzc2VydEVxdWFscyhjbHVzdGVyLmdldE1lbWJlcnMoKS5zaXplKCksIDEpOworICAgICAgICBmb3IgKEVudGl0eSBtZW1iZXIgOiBjbHVzdGVyLmdldE1lbWJlcnMoKSkgeworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoKChGYWlsaW5nRW50aXR5KW1lbWJlcikuZ2V0Q29uZmlnKEZhaWxpbmdFbnRpdHkuRkFJTF9PTl9TVEFSVCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FuUXVhcmFudGluZUZhaWxlZEVudGl0aWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGludCBmYWlsTnVtID0gMjsKKyAgICAgICAgZmluYWwgQXRvbWljSW50ZWdlciBjb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisgICAgICAgIER5bmFtaWNDbHVzdGVyIGNsdXN0ZXIgPSBhcHAuY3JlYXRlQW5kTWFuYWdlQ2hpbGQoRW50aXR5U3BlYy5jcmVhdGUoRHluYW1pY0NsdXN0ZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgLmNvbmZpZ3VyZSgicXVhcmFudGluZUZhaWxlZEVudGl0aWVzIiwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAuY29uZmlndXJlKCJpbml0aWFsU2l6ZSIsIDApCisgICAgICAgICAgICAgICAgLmNvbmZpZ3VyZSgiZmFjdG9yeSIsIG5ldyBFbnRpdHlGYWN0b3J5KCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIEVudGl0eSBuZXdFbnRpdHkoTWFwIGZsYWdzLCBFbnRpdHkgcGFyZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtID0gY291bnRlci5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcHAuZ2V0TWFuYWdlbWVudENvbnRleHQoKS5nZXRFbnRpdHlNYW5hZ2VyKCkuY3JlYXRlRW50aXR5KEVudGl0eVNwZWMuY3JlYXRlKEZhaWxpbmdFbnRpdHkuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb25maWd1cmUoZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb25maWd1cmUoRmFpbGluZ0VudGl0eS5GQUlMX09OX1NUQVJULCAobnVtPT1mYWlsTnVtKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhcmVudChwYXJlbnQpKTsKKyAgICAgICAgICAgICAgICAgICAgfX0pKTsKKworICAgICAgICBjbHVzdGVyLnN0YXJ0KEltbXV0YWJsZUxpc3Qub2YobG9jKSk7CisgICAgICAgIGNsdXN0ZXIucmVzaXplKDMpOworICAgICAgICBhc3NlcnRFcXVhbHMoY2x1c3Rlci5nZXRDdXJyZW50U2l6ZSgpLCAoSW50ZWdlcikyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNsdXN0ZXIuZ2V0TWVtYmVycygpLnNpemUoKSwgMik7CisgICAgICAgIGFzc2VydEVxdWFscyhJdGVyYWJsZXMuc2l6ZShJdGVyYWJsZXMuZmlsdGVyKGNsdXN0ZXIuZ2V0Q2hpbGRyZW4oKSwgUHJlZGljYXRlcy5pbnN0YW5jZU9mKEZhaWxpbmdFbnRpdHkuY2xhc3MpKSksIDMpOworICAgICAgICBmb3IgKEVudGl0eSBtZW1iZXIgOiBjbHVzdGVyLmdldE1lbWJlcnMoKSkgeworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoKChGYWlsaW5nRW50aXR5KW1lbWJlcikuZ2V0Q29uZmlnKEZhaWxpbmdFbnRpdHkuRkFJTF9PTl9TVEFSVCkpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNsdXN0ZXIuZ2V0QXR0cmlidXRlKER5bmFtaWNDbHVzdGVyLlFVQVJBTlRJTkVfR1JPVVApLmdldE1lbWJlcnMoKS5zaXplKCksIDEpOworICAgICAgICBmb3IgKEVudGl0eSBtZW1iZXIgOiBjbHVzdGVyLmdldEF0dHJpYnV0ZShEeW5hbWljQ2x1c3Rlci5RVUFSQU5USU5FX0dST1VQKS5nZXRNZW1iZXJzKCkpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoKChGYWlsaW5nRW50aXR5KW1lbWJlcikuZ2V0Q29uZmlnKEZhaWxpbmdFbnRpdHkuRkFJTF9PTl9TVEFSVCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG9Ob3RRdWFyYW50aW5lRmFpbGVkRW50aXRpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IGZhaWxOdW0gPSAyOworICAgICAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIGNvdW50ZXIgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKyAgICAgICAgRHluYW1pY0NsdXN0ZXIgY2x1c3RlciA9IGFwcC5jcmVhdGVBbmRNYW5hZ2VDaGlsZChFbnRpdHlTcGVjLmNyZWF0ZShEeW5hbWljQ2x1c3Rlci5jbGFzcykKKyAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IGlzIHF1YXJhbnRpbmVGYWlsZWRFbnRpdGllcz09dHJ1ZQorICAgICAgICAgICAgICAgIC5jb25maWd1cmUoInF1YXJhbnRpbmVGYWlsZWRFbnRpdGllcyIsIGZhbHNlKQorICAgICAgICAgICAgICAgIC5jb25maWd1cmUoImluaXRpYWxTaXplIiwgMCkKKyAgICAgICAgICAgICAgICAuY29uZmlndXJlKCJmYWN0b3J5IiwgbmV3IEVudGl0eUZhY3RvcnkoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgRW50aXR5IG5ld0VudGl0eShNYXAgZmxhZ3MsIEVudGl0eSBwYXJlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW0gPSBjb3VudGVyLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFwcC5nZXRNYW5hZ2VtZW50Q29udGV4dCgpLmdldEVudGl0eU1hbmFnZXIoKS5jcmVhdGVFbnRpdHkoRW50aXR5U3BlYy5jcmVhdGUoRmFpbGluZ0VudGl0eS5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmZpZ3VyZShmbGFncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmZpZ3VyZShGYWlsaW5nRW50aXR5LkZBSUxfT05fU1RBUlQsIChudW09PWZhaWxOdW0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGFyZW50KHBhcmVudCkpOworICAgICAgICAgICAgICAgICAgICB9fSkpOworCisgICAgICAgIGNsdXN0ZXIuc3RhcnQoSW1tdXRhYmxlTGlzdC5vZihsb2MpKTsKKyAgICAgICAgCisgICAgICAgIC8vIG5vIHF1YXJhbnRpbmUgZ3JvdXAsIGFzIGEgY2hpbGQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNsdXN0ZXIuZ2V0Q2hpbGRyZW4oKS5zaXplKCksIDAsICJjaGlsZHJlbj0iK2NsdXN0ZXIuZ2V0Q2hpbGRyZW4oKSk7CisgICAgICAgIAorICAgICAgICAvLyBGYWlsZWQgbm9kZSB3aWxsIG5vdCBiZSBhIG1lbWJlciBvciBjaGlsZAorICAgICAgICBjbHVzdGVyLnJlc2l6ZSgzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNsdXN0ZXIuZ2V0Q3VycmVudFNpemUoKSwgKEludGVnZXIpMik7CisgICAgICAgIGFzc2VydEVxdWFscyhjbHVzdGVyLmdldE1lbWJlcnMoKS5zaXplKCksIDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoY2x1c3Rlci5nZXRDaGlsZHJlbigpLnNpemUoKSwgMiwgImNoaWxkcmVuPSIrY2x1c3Rlci5nZXRDaGlsZHJlbigpKTsKKyAgICAgICAgCisgICAgICAgIC8vIEZhaWxlZCBub2RlIHdpbGwgbm90IGJlIG1hbmFnZWQgZWl0aGVyCisgICAgICAgIGFzc2VydEVxdWFscyhJdGVyYWJsZXMuc2l6ZShJdGVyYWJsZXMuZmlsdGVyKGNsdXN0ZXIuZ2V0Q2hpbGRyZW4oKSwgUHJlZGljYXRlcy5pbnN0YW5jZU9mKEZhaWxpbmdFbnRpdHkuY2xhc3MpKSksIDIpOworICAgICAgICBmb3IgKEVudGl0eSBtZW1iZXIgOiBjbHVzdGVyLmdldE1lbWJlcnMoKSkgeworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoKChGYWlsaW5nRW50aXR5KW1lbWJlcikuZ2V0Q29uZmlnKEZhaWxpbmdFbnRpdHkuRkFJTF9PTl9TVEFSVCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBkZWZhdWx0UmVtb3ZhbFN0cmF0ZWd5U2h1dHNEb3duTmV3ZXN0Rmlyc3RXaGVuUmVzaXppbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgTGlzdDxFbnRpdHk+IGNyZWF0aW9uT3JkZXIgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAgICAgRHluYW1pY0NsdXN0ZXIgY2x1c3RlciA9IGFwcC5jcmVhdGVBbmRNYW5hZ2VDaGlsZChFbnRpdHlTcGVjLmNyZWF0ZShEeW5hbWljQ2x1c3Rlci5jbGFzcykKKyAgICAgICAgICAgICAgICAuY29uZmlndXJlKCJpbml0aWFsU2l6ZSIsIDApCisgICAgICAgICAgICAgICAgLmNvbmZpZ3VyZSgiZmFjdG9yeSIsIG5ldyBFbnRpdHlGYWN0b3J5KCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIEVudGl0eSBuZXdFbnRpdHkoTWFwIGZsYWdzLCBFbnRpdHkgcGFyZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFbnRpdHkgcmVzdWx0ID0gbmV3IFRlc3RFbnRpdHlJbXBsKGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aW9uT3JkZXIuYWRkKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICB9fSkpOworCisgICAgICAgIGNsdXN0ZXIuc3RhcnQoSW1tdXRhYmxlTGlzdC5vZihsb2MpKTsKKyAgICAgICAgY2x1c3Rlci5yZXNpemUoMSk7CisgICAgICAgIGNsdXN0ZXIucmVzaXplKDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoY2x1c3Rlci5nZXRDdXJyZW50U2l6ZSgpLCAoSW50ZWdlcikyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZVNldC5jb3B5T2YoY2x1c3Rlci5nZXRNZW1iZXJzKCkpLCBJbW11dGFibGVTZXQuY29weU9mKGNyZWF0aW9uT3JkZXIpLCAiYWN0dWFsPSIrY2x1c3Rlci5nZXRNZW1iZXJzKCkpOworCisgICAgICAgIC8vIE5vdyBzdG9wIG9uZQorICAgICAgICBjbHVzdGVyLnJlc2l6ZSgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNsdXN0ZXIuZ2V0Q3VycmVudFNpemUoKSwgKEludGVnZXIpMSk7CisgICAgICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVMaXN0LmNvcHlPZihjbHVzdGVyLmdldE1lbWJlcnMoKSksIGNyZWF0aW9uT3JkZXIuc3ViTGlzdCgwLCAxKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXNpemVMb2dnZWRBc0VmZmVjdG9yQ2FsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBEeW5hbWljQ2x1c3RlciBjbHVzdGVyID0gYXBwLmNyZWF0ZUFuZE1hbmFnZUNoaWxkKEVudGl0eVNwZWMuY3JlYXRlKER5bmFtaWNDbHVzdGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5jb25maWd1cmUoImZhY3RvcnkiLCBuZXcgRW50aXR5RmFjdG9yeSgpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBFbnRpdHkgbmV3RW50aXR5KE1hcCBmbGFncywgRW50aXR5IHBhcmVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXN0RW50aXR5SW1wbChmbGFncyk7CisgICAgICAgICAgICAgICAgICAgIH19KSk7CisKKyAgICAgICAgYXBwLnN0YXJ0KEltbXV0YWJsZUxpc3Qub2YobG9jKSk7CisgICAgICAgIGNsdXN0ZXIucmVzaXplKDEpOworCisgICAgICAgIFNldDxUYXNrPD8+PiB0YXNrcyA9IGFwcC5nZXRNYW5hZ2VtZW50Q29udGV4dCgpLmdldEV4ZWN1dGlvbk1hbmFnZXIoKS5nZXRUYXNrc1dpdGhBbGxUYWdzKEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgICAgICBCcm9va2x5blRhc2tUYWdzLnRhZ0ZvckNvbnRleHRFbnRpdHkoY2x1c3RlciksIkVGRkVDVE9SIikpOworICAgICAgICBhc3NlcnRFcXVhbHModGFza3Muc2l6ZSgpLCAyKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShJdGVyYWJsZXMuZ2V0KHRhc2tzLCAwKS5nZXREZXNjcmlwdGlvbigpLmNvbnRhaW5zKCJzdGFydCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShJdGVyYWJsZXMuZ2V0KHRhc2tzLCAxKS5nZXREZXNjcmlwdGlvbigpLmNvbnRhaW5zKCJyZXNpemUiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RvcHBlZENoaWxkSXNSZW1vdmVGcm9tR3JvdXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRHluYW1pY0NsdXN0ZXIgY2x1c3RlciA9IGFwcC5jcmVhdGVBbmRNYW5hZ2VDaGlsZChFbnRpdHlTcGVjLmNyZWF0ZShEeW5hbWljQ2x1c3Rlci5jbGFzcykKKyAgICAgICAgICAgICAgICAuY29uZmlndXJlKCJpbml0aWFsU2l6ZSIsIDEpCisgICAgICAgICAgICAgICAgLmNvbmZpZ3VyZSgiZmFjdG9yeSIsIG5ldyBFbnRpdHlGYWN0b3J5KCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIEVudGl0eSBuZXdFbnRpdHkoTWFwIGZsYWdzLCBFbnRpdHkgcGFyZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRlc3RFbnRpdHlJbXBsKGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgfX0pKTsKKworICAgICAgICBjbHVzdGVyLnN0YXJ0KEltbXV0YWJsZUxpc3Qub2YobG9jKSk7CisKKyAgICAgICAgZmluYWwgVGVzdEVudGl0eSBjaGlsZCA9IChUZXN0RW50aXR5KSBJdGVyYWJsZXMuZ2V0KGNsdXN0ZXIuZ2V0TWVtYmVycygpLCAwKTsKKyAgICAgICAgY2hpbGQuc3RvcCgpOworICAgICAgICBFbnRpdGllcy51bm1hbmFnZShjaGlsZCk7CisKKyAgICAgICAgQXNzZXJ0cy5zdWNjZWVkc0V2ZW50dWFsbHkoTXV0YWJsZU1hcC5vZigidGltZW91dCIsIFRJTUVPVVRfTVMpLCBuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGNsdXN0ZXIuZ2V0Q2hpbGRyZW4oKS5jb250YWlucyhjaGlsZCksICJjaGlsZHJlbj0iK2NsdXN0ZXIuZ2V0Q2hpbGRyZW4oKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNsdXN0ZXIuZ2V0Q3VycmVudFNpemUoKSwgKEludGVnZXIpMCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNsdXN0ZXIuZ2V0TWVtYmVycygpLnNpemUoKSwgMCk7CisgICAgICAgICAgICB9fSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGx1Z2dhYmxlUmVtb3ZhbFN0cmF0ZWd5SXNVc2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIExpc3Q8RW50aXR5PiByZW1vdmVkRW50aXRpZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICAgICAgICBGdW5jdGlvbjxDb2xsZWN0aW9uPEVudGl0eT4sIEVudGl0eT4gcmVtb3ZhbFN0cmF0ZWd5ID0gbmV3IEZ1bmN0aW9uPENvbGxlY3Rpb248RW50aXR5PiwgRW50aXR5PigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgRW50aXR5IGFwcGx5KENvbGxlY3Rpb248RW50aXR5PiBjb250ZW5kZXJzKSB7CisgICAgICAgICAgICAgICAgRW50aXR5IGNob2ljZSA9IEl0ZXJhYmxlcy5nZXQoY29udGVuZGVycywgcmFuZG9tLm5leHRJbnQoY29udGVuZGVycy5zaXplKCkpKTsKKyAgICAgICAgICAgICAgICByZW1vdmVkRW50aXRpZXMuYWRkKGNob2ljZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNob2ljZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBEeW5hbWljQ2x1c3RlciBjbHVzdGVyID0gYXBwLmNyZWF0ZUFuZE1hbmFnZUNoaWxkKEVudGl0eVNwZWMuY3JlYXRlKER5bmFtaWNDbHVzdGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5jb25maWd1cmUoImZhY3RvcnkiLCBuZXcgRW50aXR5RmFjdG9yeSgpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBFbnRpdHkgbmV3RW50aXR5KE1hcCBmbGFncywgRW50aXR5IHBhcmVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXN0RW50aXR5SW1wbChmbGFncyk7CisgICAgICAgICAgICAgICAgICAgIH19KQorICAgICAgICAgICAgICAgIC5jb25maWd1cmUoImluaXRpYWxTaXplIiwgMTApCisgICAgICAgICAgICAgICAgLmNvbmZpZ3VyZSgicmVtb3ZhbFN0cmF0ZWd5IiwgcmVtb3ZhbFN0cmF0ZWd5KSk7CisKKyAgICAgICAgY2x1c3Rlci5zdGFydChJbW11dGFibGVMaXN0Lm9mKGxvYykpOworICAgICAgICBTZXQgb3JpZ01lbWJlcnMgPSBJbW11dGFibGVTZXQuY29weU9mKGNsdXN0ZXIuZ2V0TWVtYmVycygpKTsKKworICAgICAgICBmb3IgKGludCBpID0gMTA7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBjbHVzdGVyLnJlc2l6ZShpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjbHVzdGVyLmdldEF0dHJpYnV0ZShDaGFuZ2VhYmxlLkdST1VQX1NJWkUpLCAoSW50ZWdlcilpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZW1vdmVkRW50aXRpZXMuc2l6ZSgpLCAxMC1pKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVTZXQuY29weU9mKEl0ZXJhYmxlcy5jb25jYXQoY2x1c3Rlci5nZXRNZW1iZXJzKCksIHJlbW92ZWRFbnRpdGllcykpLCBvcmlnTWVtYmVycyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQbHVnZ2FibGVSZW1vdmFsU3RyYXRlZ3lDYW5CZVNldEFmdGVyQ29uc3RydWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIExpc3Q8RW50aXR5PiByZW1vdmVkRW50aXRpZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICAgICAgICBGdW5jdGlvbjxDb2xsZWN0aW9uPEVudGl0eT4sIEVudGl0eT4gcmVtb3ZhbFN0cmF0ZWd5ID0gbmV3IEZ1bmN0aW9uPENvbGxlY3Rpb248RW50aXR5PiwgRW50aXR5PigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgRW50aXR5IGFwcGx5KENvbGxlY3Rpb248RW50aXR5PiBjb250ZW5kZXJzKSB7CisgICAgICAgICAgICAgICAgRW50aXR5IGNob2ljZSA9IEl0ZXJhYmxlcy5nZXQoY29udGVuZGVycywgcmFuZG9tLm5leHRJbnQoY29udGVuZGVycy5zaXplKCkpKTsKKyAgICAgICAgICAgICAgICByZW1vdmVkRW50aXRpZXMuYWRkKGNob2ljZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNob2ljZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgCisgICAgICAgIER5bmFtaWNDbHVzdGVyIGNsdXN0ZXIgPSBhcHAuY3JlYXRlQW5kTWFuYWdlQ2hpbGQoRW50aXR5U3BlYy5jcmVhdGUoRHluYW1pY0NsdXN0ZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgLmNvbmZpZ3VyZSgiZmFjdG9yeSIsIG5ldyBFbnRpdHlGYWN0b3J5KCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIEVudGl0eSBuZXdFbnRpdHkoTWFwIGZsYWdzLCBFbnRpdHkgcGFyZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRlc3RFbnRpdHlJbXBsKGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgfX0pCisgICAgICAgICAgICAgICAgLmNvbmZpZ3VyZSgiaW5pdGlhbFNpemUiLCAxMCkpOworCisgICAgICAgIGNsdXN0ZXIuc3RhcnQoSW1tdXRhYmxlTGlzdC5vZihsb2MpKTsKKyAgICAgICAgU2V0IG9yaWdNZW1iZXJzID0gSW1tdXRhYmxlU2V0LmNvcHlPZihjbHVzdGVyLmdldE1lbWJlcnMoKSk7CisKKyAgICAgICAgY2x1c3Rlci5zZXRSZW1vdmFsU3RyYXRlZ3kocmVtb3ZhbFN0cmF0ZWd5KTsKKworICAgICAgICBmb3IgKGludCBpID0gMTA7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBjbHVzdGVyLnJlc2l6ZShpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjbHVzdGVyLmdldEF0dHJpYnV0ZShDaGFuZ2VhYmxlLkdST1VQX1NJWkUpLCAoSW50ZWdlcilpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZW1vdmVkRW50aXRpZXMuc2l6ZSgpLCAxMC1pKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVTZXQuY29weU9mKEl0ZXJhYmxlcy5jb25jYXQoY2x1c3Rlci5nZXRNZW1iZXJzKCksIHJlbW92ZWRFbnRpdGllcykpLCBvcmlnTWVtYmVycyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNpemVEb2VzTm90QmxvY2tDYWxsc1RvUXVlcnlHcm91cE1lbWJlcnNoaXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggZXhlY3V0aW5nTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGNvbnRpbnVhdGlvbkxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICAKKyAgICAgICAgZmluYWwgRHluYW1pY0NsdXN0ZXIgY2x1c3RlciA9IGFwcC5jcmVhdGVBbmRNYW5hZ2VDaGlsZChFbnRpdHlTcGVjLmNyZWF0ZShEeW5hbWljQ2x1c3Rlci5jbGFzcykKKyAgICAgICAgICAgICAgICAuY29uZmlndXJlKCJpbml0aWFsU2l6ZSIsIDApCisgICAgICAgICAgICAgICAgLmNvbmZpZ3VyZSgiZmFjdG9yeSIsIG5ldyBFbnRpdHlGYWN0b3J5KCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIEVudGl0eSBuZXdFbnRpdHkoTWFwIGZsYWdzLCBFbnRpdHkgcGFyZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGluZ0xhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVhdGlvbkxhdGNoLmF3YWl0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXN0RW50aXR5SW1wbChmbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5wcm9wYWdhdGUoZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH19KSk7CisKKyAgICAgICAgY2x1c3Rlci5zdGFydChJbW11dGFibGVMaXN0Lm9mKGxvYykpOworCisgICAgICAgIFRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBjbHVzdGVyLnJlc2l6ZSgxKTsKKyAgICAgICAgICAgICAgICB9fSk7CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gd2FpdCBmb3IgcmVzaXplIHRvIGJlIGV4ZWN1dGluZworICAgICAgICAgICAgdGhyZWFkLnN0YXJ0KCk7CisgICAgICAgICAgICBleGVjdXRpbmdMYXRjaC5hd2FpdChUSU1FT1VUX01TLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworCisgICAgICAgICAgICAvLyBlbnN1cmUgY2FuIHN0aWxsIGNhbGwgbWV0aG9kcyBvbiBncm91cCwgdG8gcXVlcnkvdXBkYXRlIG1lbWJlcnNoaXAKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVMaXN0LmNvcHlPZihjbHVzdGVyLmdldE1lbWJlcnMoKSksIEltbXV0YWJsZUxpc3Qub2YoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2x1c3Rlci5nZXRDdXJyZW50U2l6ZSgpLCAoSW50ZWdlcikwKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGNsdXN0ZXIuaGFzTWVtYmVyKGNsdXN0ZXIpKTsKKyAgICAgICAgICAgIGNsdXN0ZXIuYWRkTWVtYmVyKGNsdXN0ZXIpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjbHVzdGVyLnJlbW92ZU1lbWJlcihjbHVzdGVyKSk7CisKKyAgICAgICAgICAgIC8vIGFsbG93IHRoZSByZXNpemUgdG8gY29tcGxldGUKKyAgICAgICAgICAgIGNvbnRpbnVhdGlvbkxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgdGhyZWFkLmpvaW4oVElNRU9VVF9NUyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSh0aHJlYWQuaXNBbGl2ZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRocmVhZC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VzTWVtYmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIER5bmFtaWNDbHVzdGVyIGNsdXN0ZXIgPSBhcHAuY3JlYXRlQW5kTWFuYWdlQ2hpbGQoRW50aXR5U3BlYy5jcmVhdGUoRHluYW1pY0NsdXN0ZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgLmNvbmZpZ3VyZSgiaW5pdGlhbFNpemUiLCAxKQorICAgICAgICAgICAgICAgIC5jb25maWd1cmUoImZhY3RvcnkiLCBuZXcgRW50aXR5RmFjdG9yeSgpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBFbnRpdHkgbmV3RW50aXR5KE1hcCBmbGFncywgRW50aXR5IHBhcmVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXN0RW50aXR5SW1wbChmbGFncyk7CisgICAgICAgICAgICAgICAgICAgIH19KSk7CisKKyAgICAgICAgY2x1c3Rlci5zdGFydChJbW11dGFibGVMaXN0Lm9mKGxvYykpOworICAgICAgICBFbnRpdHkgbWVtYmVyID0gSXRlcmFibGVzLmdldChjbHVzdGVyLmdldE1lbWJlcnMoKSwgMCk7CisKKyAgICAgICAgU3RyaW5nIHJlcGxhY2VtZW50SWQgPSBjbHVzdGVyLnJlcGxhY2VNZW1iZXIobWVtYmVyLmdldElkKCkpOworICAgICAgICBFbnRpdHkgcmVwbGFjZW1lbnQgPSBhcHAuZ2V0TWFuYWdlbWVudENvbnRleHQoKS5nZXRFbnRpdHlNYW5hZ2VyKCkuZ2V0RW50aXR5KHJlcGxhY2VtZW50SWQpOworCisgICAgICAgIGFzc2VydEVxdWFscyhjbHVzdGVyLmdldE1lbWJlcnMoKS5zaXplKCksIDEpOworICAgICAgICBhc3NlcnRGYWxzZShjbHVzdGVyLmdldE1lbWJlcnMoKS5jb250YWlucyhtZW1iZXIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY2x1c3Rlci5nZXRDaGlsZHJlbigpLmNvbnRhaW5zKG1lbWJlcikpOworICAgICAgICBhc3NlcnROb3ROdWxsKHJlcGxhY2VtZW50LCAicmVwbGFjZW1lbnRJZD0iK3JlcGxhY2VtZW50SWQpOworICAgICAgICBhc3NlcnRUcnVlKGNsdXN0ZXIuZ2V0TWVtYmVycygpLmNvbnRhaW5zKHJlcGxhY2VtZW50KSwgInJlcGxhY2VtZW50PSIrcmVwbGFjZW1lbnQrIjsgbWVtYmVycz0iK2NsdXN0ZXIuZ2V0TWVtYmVycygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjbHVzdGVyLmdldENoaWxkcmVuKCkuY29udGFpbnMocmVwbGFjZW1lbnQpLCAicmVwbGFjZW1lbnQ9IityZXBsYWNlbWVudCsiOyBjaGlsZHJlbj0iK2NsdXN0ZXIuZ2V0Q2hpbGRyZW4oKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZU1lbWJlclRocm93c0lmTWVtYmVySWREb2VzTm90UmVzb2x2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBEeW5hbWljQ2x1c3RlciBjbHVzdGVyID0gYXBwLmNyZWF0ZUFuZE1hbmFnZUNoaWxkKEVudGl0eVNwZWMuY3JlYXRlKER5bmFtaWNDbHVzdGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5jb25maWd1cmUoImluaXRpYWxTaXplIiwgMSkKKyAgICAgICAgICAgICAgICAuY29uZmlndXJlKCJmYWN0b3J5IiwgbmV3IEVudGl0eUZhY3RvcnkoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgRW50aXR5IG5ld0VudGl0eShNYXAgZmxhZ3MsIEVudGl0eSBwYXJlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGVzdEVudGl0eUltcGwoZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICB9fSkpOworCisgICAgICAgIGNsdXN0ZXIuc3RhcnQoSW1tdXRhYmxlTGlzdC5vZihsb2MpKTsKKyAgICAgICAgRW50aXR5IG1lbWJlciA9IEl0ZXJhYmxlcy5nZXQoY2x1c3Rlci5nZXRNZW1iZXJzKCksIDApOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbHVzdGVyLnJlcGxhY2VNZW1iZXIoIndyb25nLmlkIik7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAoRXhjZXB0aW9ucy5nZXRGaXJzdFRocm93YWJsZU9mVHlwZShlLCBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uLmNsYXNzKSA9PSBudWxsKSB0aHJvdyBlOworICAgICAgICAgICAgaWYgKCFFeGNlcHRpb25zLmdldEZpcnN0VGhyb3dhYmxlT2ZUeXBlKGUsIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24uY2xhc3MpLmdldE1lc3NhZ2UoKS5jb250YWlucygiZW50aXR5IHdyb25nLmlkIGNhbm5vdCBiZSByZXNvbHZlZCIpKSB0aHJvdyBlOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZVNldC5jb3B5T2YoY2x1c3Rlci5nZXRNZW1iZXJzKCkpLCBJbW11dGFibGVTZXQub2YobWVtYmVyKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZU1lbWJlclRocm93c0lmTm90TWVtYmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIER5bmFtaWNDbHVzdGVyIGNsdXN0ZXIgPSBhcHAuY3JlYXRlQW5kTWFuYWdlQ2hpbGQoRW50aXR5U3BlYy5jcmVhdGUoRHluYW1pY0NsdXN0ZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgLmNvbmZpZ3VyZSgiaW5pdGlhbFNpemUiLCAxKQorICAgICAgICAgICAgICAgIC5jb25maWd1cmUoImZhY3RvcnkiLCBuZXcgRW50aXR5RmFjdG9yeSgpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBFbnRpdHkgbmV3RW50aXR5KE1hcCBmbGFncywgRW50aXR5IHBhcmVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXN0RW50aXR5SW1wbChmbGFncyk7CisgICAgICAgICAgICAgICAgICAgIH19KSk7CisKKyAgICAgICAgY2x1c3Rlci5zdGFydChJbW11dGFibGVMaXN0Lm9mKGxvYykpOworICAgICAgICBFbnRpdHkgbWVtYmVyID0gSXRlcmFibGVzLmdldChjbHVzdGVyLmdldE1lbWJlcnMoKSwgMCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsdXN0ZXIucmVwbGFjZU1lbWJlcihhcHAuZ2V0SWQoKSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAoRXhjZXB0aW9ucy5nZXRGaXJzdFRocm93YWJsZU9mVHlwZShlLCBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uLmNsYXNzKSA9PSBudWxsKSB0aHJvdyBlOworICAgICAgICAgICAgaWYgKCFFeGNlcHRpb25zLmdldEZpcnN0VGhyb3dhYmxlT2ZUeXBlKGUsIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24uY2xhc3MpLmdldE1lc3NhZ2UoKS5jb250YWlucygiaXMgbm90IGEgbWVtYmVyIikpIHRocm93IGU7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlU2V0LmNvcHlPZihjbHVzdGVyLmdldE1lbWJlcnMoKSksIEltbXV0YWJsZVNldC5vZihtZW1iZXIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlTWVtYmVyRmFpbHNJZkNhbnRQcm92aXNpb25SZXBsYWNlbWVudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBpbnQgZmFpbE51bSA9IDI7CisgICAgICAgIGZpbmFsIEF0b21pY0ludGVnZXIgY291bnRlciA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworICAgICAgICBEeW5hbWljQ2x1c3RlciBjbHVzdGVyID0gYXBwLmNyZWF0ZUFuZE1hbmFnZUNoaWxkKEVudGl0eVNwZWMuY3JlYXRlKER5bmFtaWNDbHVzdGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5jb25maWd1cmUoImZhY3RvcnkiLCBuZXcgRW50aXR5RmFjdG9yeSgpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBFbnRpdHkgbmV3RW50aXR5KE1hcCBmbGFncywgRW50aXR5IHBhcmVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bSA9IGNvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXBwLmdldE1hbmFnZW1lbnRDb250ZXh0KCkuZ2V0RW50aXR5TWFuYWdlcigpLmNyZWF0ZUVudGl0eShFbnRpdHlTcGVjLmNyZWF0ZShGYWlsaW5nRW50aXR5LmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29uZmlndXJlKGZsYWdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29uZmlndXJlKEZhaWxpbmdFbnRpdHkuRkFJTF9PTl9TVEFSVCwgKG51bT09ZmFpbE51bSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wYXJlbnQocGFyZW50KSk7CisgICAgICAgICAgICAgICAgICAgIH19KSk7CisKKyAgICAgICAgY2x1c3Rlci5zdGFydChJbW11dGFibGVMaXN0Lm9mKGxvYykpOworICAgICAgICBFbnRpdHkgbWVtYmVyID0gSXRlcmFibGVzLmdldChjbHVzdGVyLmdldE1lbWJlcnMoKSwgMCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsdXN0ZXIucmVwbGFjZU1lbWJlcihtZW1iZXIuZ2V0SWQoKSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAoIWUudG9TdHJpbmcoKS5jb250YWlucygiZmFpbGVkIHRvIGdyb3ciKSkgdGhyb3cgZTsKKyAgICAgICAgICAgIGlmIChFeGNlcHRpb25zLmdldEZpcnN0VGhyb3dhYmxlT2ZUeXBlKGUsIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24uY2xhc3MpICE9IG51bGwpIHRocm93IGU7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZVNldC5jb3B5T2YoY2x1c3Rlci5nZXRNZW1iZXJzKCkpLCBJbW11dGFibGVTZXQub2YobWVtYmVyKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZU1lbWJlclJlbW92ZXNBbmRUaG93c0lmRmFpbFRvU3RvcE9sZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBpbnQgZmFpbE51bSA9IDE7CisgICAgICAgIGZpbmFsIEF0b21pY0ludGVnZXIgY291bnRlciA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworICAgICAgICBEeW5hbWljQ2x1c3RlciBjbHVzdGVyID0gYXBwLmNyZWF0ZUFuZE1hbmFnZUNoaWxkKEVudGl0eVNwZWMuY3JlYXRlKER5bmFtaWNDbHVzdGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5jb25maWd1cmUoImluaXRpYWxTaXplIiwgMSkKKyAgICAgICAgICAgICAgICAuY29uZmlndXJlKCJmYWN0b3J5IiwgbmV3IEVudGl0eUZhY3RvcnkoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZSBwdWJsaWMgRW50aXR5IG5ld0VudGl0eShNYXAgZmxhZ3MsIEVudGl0eSBwYXJlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW0gPSBjb3VudGVyLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFwcC5nZXRNYW5hZ2VtZW50Q29udGV4dCgpLmdldEVudGl0eU1hbmFnZXIoKS5jcmVhdGVFbnRpdHkoRW50aXR5U3BlYy5jcmVhdGUoRmFpbGluZ0VudGl0eS5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmZpZ3VyZShmbGFncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmZpZ3VyZShGYWlsaW5nRW50aXR5LkZBSUxfT05fU1RPUCwgKG51bT09ZmFpbE51bSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wYXJlbnQocGFyZW50KSk7CisgICAgICAgICAgICAgICAgICAgIH19KSk7CisKKyAgICAgICAgY2x1c3Rlci5zdGFydChJbW11dGFibGVMaXN0Lm9mKGxvYykpOworICAgICAgICBFbnRpdHkgbWVtYmVyID0gSXRlcmFibGVzLmdldChjbHVzdGVyLmdldE1lbWJlcnMoKSwgMCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsdXN0ZXIucmVwbGFjZU1lbWJlcihtZW1iZXIuZ2V0SWQoKSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAoRXhjZXB0aW9ucy5nZXRGaXJzdFRocm93YWJsZU9mVHlwZShlLCBTdG9wRmFpbGVkUnVudGltZUV4Y2VwdGlvbi5jbGFzcykgPT0gbnVsbCkgdGhyb3cgZTsKKyAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoVGhyb3dhYmxlIHQgOiBUaHJvd2FibGVzLmdldENhdXNhbENoYWluKGUpKSB7CisgICAgICAgICAgICAgICAgaWYgKHQudG9TdHJpbmcoKS5jb250YWlucygiU2ltdWxhdGluZyBlbnRpdHkgc3RvcCBmYWlsdXJlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB0aHJvdyBlOworICAgICAgICB9CisgICAgICAgIGFzc2VydEZhbHNlKEVudGl0aWVzLmlzTWFuYWdlZChtZW1iZXIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNsdXN0ZXIuZ2V0TWVtYmVycygpLnNpemUoKSwgMSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBUaHJvd2FibGUgdW53cmFwRXhjZXB0aW9uKFRocm93YWJsZSBlKSB7CisgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXhlY3V0aW9uRXhjZXB0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gdW53cmFwRXhjZXB0aW9uKGUuZ2V0Q2F1c2UoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySW52b2NhdGlvbkV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIHVud3JhcEV4Y2VwdGlvbihlLmdldENhdXNlKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy90ZXN0L2phdmEvYnJvb2tseW4vZW50aXR5L2dyb3VwL01lbWJlcnNoaXBUcmFja2luZ1BvbGljeVRlc3QuamF2YSBiL2NvcmUvc3JjL3Rlc3QvamF2YS9icm9va2x5bi9lbnRpdHkvZ3JvdXAvTWVtYmVyc2hpcFRyYWNraW5nUG9saWN5VGVzdC5qYXZhCmluZGV4IDJkMDhlZjEuLmU1OTczNTggMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL3Rlc3QvamF2YS9icm9va2x5bi9lbnRpdHkvZ3JvdXAvTWVtYmVyc2hpcFRyYWNraW5nUG9saWN5VGVzdC5qYXZhCisrKyBiL2NvcmUvc3JjL3Rlc3QvamF2YS9icm9va2x5bi9lbnRpdHkvZ3JvdXAvTWVtYmVyc2hpcFRyYWNraW5nUG9saWN5VGVzdC5qYXZhCkBAIC0xNiw4ICsxNiwxMCBAQAogaW1wb3J0IGJyb29rbHluLmVudGl0eS5iYXNpYy5FbnRpdGllczsKIGltcG9ydCBicm9va2x5bi5lbnRpdHkucHJveHlpbmcuRW50aXR5U3BlYzsKIGltcG9ydCBicm9va2x5bi5lbnRpdHkudHJhaXQuU3RhcnRhYmxlOworaW1wb3J0IGJyb29rbHluLmV2ZW50LlNlbnNvcjsKIGltcG9ydCBicm9va2x5bi5sb2NhdGlvbi5iYXNpYy5TaW11bGF0ZWRMb2NhdGlvbjsKIGltcG9ydCBicm9va2x5bi5tYW5hZ2VtZW50LkVudGl0eU1hbmFnZXI7CitpbXBvcnQgYnJvb2tseW4ucG9saWN5LlBvbGljeVNwZWM7CiBpbXBvcnQgYnJvb2tseW4udGVzdC5Bc3NlcnRzOwogaW1wb3J0IGJyb29rbHluLnRlc3QuZW50aXR5LlRlc3RBcHBsaWNhdGlvbjsKIGltcG9ydCBicm9va2x5bi50ZXN0LmVudGl0eS5UZXN0RW50aXR5OwpAQCAtMTMyLDYgKzEzNCwzMiBAQAogCiAgICAgICAgIGFzc2VydFJlY29yZHNFdmVudHVhbGx5KHBvbGljeTIsIFJlY29yZC5uZXdBZGRlZChlMSksIFJlY29yZC5uZXdDaGFuZ2VkKGUxKSk7CiAgICAgfQorICAgIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vdE5vdGlmaWVkT2ZFeHRyYVRyYWNrZWRTZW5zb3JzSWZOb25EdXBsaWNhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVGVzdEVudGl0eSBlMSA9IGNyZWF0ZUFuZE1hbmFnZUNoaWxkT2YoZ3JvdXApOworICAgICAgICAKKyAgICAgICAgUG9saWN5U3BlYzxSZWNvcmRpbmdNZW1iZXJzaGlwVHJhY2tpbmdQb2xpY3k+IG5vbkR1cGxpY2F0ZVRyYWNraW5nUG9saWN5U3BlYyA9IAorICAgICAgICAgICAgICAgIFBvbGljeVNwZWMuY3JlYXRlKFJlY29yZGluZ01lbWJlcnNoaXBUcmFja2luZ1BvbGljeS5jbGFzcykKKyAgICAgICAgICAgICAgICAuY29uZmlndXJlKEFic3RyYWN0TWVtYmVyc2hpcFRyYWNraW5nUG9saWN5LlNFTlNPUlNfVE9fVFJBQ0ssIEltbXV0YWJsZVNldC48U2Vuc29yPD8+Pm9mKFRlc3RFbnRpdHkuTkFNRSkpCisgICAgICAgICAgICAgICAgLmNvbmZpZ3VyZShBYnN0cmFjdE1lbWJlcnNoaXBUcmFja2luZ1BvbGljeS5OT1RJRllfT05fRFVQTElDQVRFUywgZmFsc2UpOworICAgICAgICAKKyAgICAgICAgUmVjb3JkaW5nTWVtYmVyc2hpcFRyYWNraW5nUG9saWN5IG5vbkR1cGxpY2F0ZVRyYWNraW5nUG9saWN5ID0gZ3JvdXAuYWRkUG9saWN5KG5vbkR1cGxpY2F0ZVRyYWNraW5nUG9saWN5U3BlYyk7CisgICAgICAgIGdyb3VwLmFkZFBvbGljeShub25EdXBsaWNhdGVUcmFja2luZ1BvbGljeSk7CisgICAgICAgIG5vbkR1cGxpY2F0ZVRyYWNraW5nUG9saWN5LnNldEdyb3VwKGdyb3VwKTsKKworICAgICAgICBlMS5zZXRBdHRyaWJ1dGUoVGVzdEVudGl0eS5OQU1FLCAibXluYW1lIik7CisKKyAgICAgICAgYXNzZXJ0UmVjb3Jkc0V2ZW50dWFsbHkobm9uRHVwbGljYXRlVHJhY2tpbmdQb2xpY3ksIFJlY29yZC5uZXdBZGRlZChlMSksIFJlY29yZC5uZXdDaGFuZ2VkKGUxKSk7CisgICAgICAgIAorICAgICAgICBlMS5zZXRBdHRyaWJ1dGUoVGVzdEVudGl0eS5OQU1FLCAibXluYW1lIik7CisgICAgICAgIAorICAgICAgICBhc3NlcnRSZWNvcmRzQ29udGludWFsbHkobm9uRHVwbGljYXRlVHJhY2tpbmdQb2xpY3ksIFJlY29yZC5uZXdBZGRlZChlMSksIFJlY29yZC5uZXdDaGFuZ2VkKGUxKSk7CisgICAgICAgIAorICAgICAgICBlMS5zZXRBdHRyaWJ1dGUoVGVzdEVudGl0eS5OQU1FLCAibXluZXduYW1lIik7CisgICAgICAgIAorICAgICAgICBhc3NlcnRSZWNvcmRzRXZlbnR1YWxseShub25EdXBsaWNhdGVUcmFja2luZ1BvbGljeSwgUmVjb3JkLm5ld0FkZGVkKGUxKSwgUmVjb3JkLm5ld0NoYW5nZWQoZTEpLCBSZWNvcmQubmV3Q2hhbmdlZChlMSkpOworICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBhc3NlcnRSZWNvcmRzRXZlbnR1YWxseShmaW5hbCBSZWNvcmQuLi4gZXhwZWN0ZWQpIHsKICAgICAgICAgYXNzZXJ0UmVjb3Jkc0V2ZW50dWFsbHkocG9saWN5LCBleHBlY3RlZCk7CkBAIC0xNTMsMTUgKzE4MSwyNCBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBhc3NlcnRSZWNvcmRzQ29udGludWFsbHkoZmluYWwgUmVjb3JkLi4uIGV4cGVjdGVkKSB7CisgICAgICAgIGFzc2VydFJlY29yZHNDb250aW51YWxseShwb2xpY3ksIGV4cGVjdGVkKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFJlY29yZHNDb250aW51YWxseShmaW5hbCBSZWNvcmRpbmdNZW1iZXJzaGlwVHJhY2tpbmdQb2xpY3kgcG9saWN5LCBmaW5hbCBSZWNvcmQuLi4gZXhwZWN0ZWQpIHsKICAgICAgICAgQXNzZXJ0cy5zdWNjZWVkc0NvbnRpbnVhbGx5KEltbXV0YWJsZU1hcC5vZigidGltZW91dCIsIDEwMCksIG5ldyBSdW5uYWJsZSgpIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocG9saWN5LnJlY29yZHMsIEltbXV0YWJsZUxpc3QuY29weU9mKGV4cGVjdGVkKSwgImFjdHVhbD0iK3BvbGljeS5yZWNvcmRzKTsKICAgICAgICAgICAgIH19KTsKICAgICB9CiAKLSAgICBzdGF0aWMgY2xhc3MgUmVjb3JkaW5nTWVtYmVyc2hpcFRyYWNraW5nUG9saWN5IGV4dGVuZHMgQWJzdHJhY3RNZW1iZXJzaGlwVHJhY2tpbmdQb2xpY3kgeworICAgIC8vIE5lZWRzIHRvIGJlIHB1YmxpYyB3aGVuIGluc3RhbnRpYXRlZCBmcm9tIGEgc3BlYyAoaS5lLiBieSBJbnRlcm5hbFBvbGljeUZhY3RvcnkpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZWNvcmRpbmdNZW1iZXJzaGlwVHJhY2tpbmdQb2xpY3kgZXh0ZW5kcyBBYnN0cmFjdE1lbWJlcnNoaXBUcmFja2luZ1BvbGljeSB7CiAgICAgICAgIGZpbmFsIExpc3Q8UmVjb3JkPiByZWNvcmRzID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PFJlY29yZD4oKTsKIAorICAgICAgICBwdWJsaWMgUmVjb3JkaW5nTWVtYmVyc2hpcFRyYWNraW5nUG9saWN5KCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgfQorICAgICAgICAKICAgICAgICAgcHVibGljIFJlY29yZGluZ01lbWJlcnNoaXBUcmFja2luZ1BvbGljeShNdXRhYmxlTWFwPFN0cmluZywgPz4gZmxhZ3MpIHsKICAgICAgICAgICAgIHN1cGVyKGZsYWdzKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvZG9jcy9fc2NyaXB0cy9oZWxwLnR4dCBiL2RvY3MvX3NjcmlwdHMvaGVscC50eHQKaW5kZXggZjZlNGFlNS4uMGE0MWE3YiAxMDA2NDQKLS0tIGEvZG9jcy9fc2NyaXB0cy9oZWxwLnR4dAorKysgYi9kb2NzL19zY3JpcHRzL2hlbHAudHh0CkBAIC05LDgxICs5LDggQEAKICAgICB3aWxsIGJ1aWxkIHRoZSBzaXRlIGluIF9zaXRlIGluY2x1ZGluZyBqYXZhZG9jIGZvciBvZmZsaW5lIGJyb3dzaW5nCiAKIAorUmVsZWFzZSBQcm9jZXNzCis9PT09PT09PT09PT09PT0KIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBEZXByZWNhdGlvbiBXYXJuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwotIyBUaGUgZm9sbG93aW5nIGNvbnRlbnQgaGFzIGJlZW4gc3VwZXJzZWRlZCwgYW5kIHdpbGwgYmUgcmVtb3ZlZCBzaG9ydGx5ICAgICAgIwotIyBQbGVhc2UgdmlldyAvZGV2L3RpcHMvcmVsZWFzZS5tZCBvciBzZWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwotIyBodHRwOi8vYnJvb2tseW5jZW50cmFsLmdpdGh1Yi5pby92LzAuNi4wLVNOQVBTSE9UL2Rldi90aXBzL3JlbGVhc2UuaHRtbCAgICAgIwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0KLUdPIExJVkUgKFNOQVBTSE9UKQotLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXRvIG1ha2UgdGhlIGRvY3MgbGl2ZSB5b3UgYnVpbGQuc2ggdGhlbiBwdXNoIF9zaXRlIHRvIGdpdGh1YiBicm9va2x5bmNlbnRyYWwvYnJvb2tseW5jZW50cmFsLmdpdGh1Yi5jb20KLXRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIGNvdmVyIHRoaXMsIGFzc3VtaW5nIGJyb29rbHluY2VudHJhbC5naXRodWIuY29tIGlzIGEgc2libGluZyBkaXIgdG8gdGhlIGJyb29rbHluIHByb2plY3QsCi1hbmQgeW91IGFyZSBpbiB0aGUgZG9jcyBkaXIKLQotCi11cGRhdGluZyBhIHNuYXBzaG90IHZlcnNpb24sIGluIC92L1ZFUlNJT04vIG9uIHRoZSBzZXJ2ZXI6Ci0KLWV4cG9ydCBUQVJHRVQ9YHB3ZCAtUGAvLi4vLi4vYnJvb2tseW5jZW50cmFsLmdpdGh1Yi5jb20KLWV4cG9ydCBCVj0wLjcuMC1TTkFQU0hPVCAgICMgQlJPT0tMWU5fVkVSU0lPTgotCi0jIG1ha2Ugc3VyZSByZXBvIGlzIGF0IGxhdGVzdAotcHVzaGQgJFRBUkdFVAotZ2l0IHB1bGwKLXBvcGQKLQotIyBidWlsZCwgY29weQotaWYgWyAhIC1mICRUQVJHRVQvaW5kZXguaHRtbCBdIDsgdGhlbiBlY2hvICJjb3VsZCBub3QgZmluZCBkb2NzIGluICRUQVJHRVQiIDsgZXhpdCAxIDsgZmkKLV9zY3JpcHRzL2J1aWxkLnNoIHx8IHsgZWNobyAiZmFpbGVkIHRvIGJ1aWxkIGRvY3MiIDsgZXhpdCAxIDsgfQotcm0gLXJmICRUQVJHRVQvdi8kQlYKLW1rZGlyICRUQVJHRVQvdi8kQlYKLWNwIC1yIF9zaXRlLyogJFRBUkdFVC92LyRCVi8KLQotIyBhbmQgcHVzaAotcHVzaGQgJFRBUkdFVAotZ2l0IGFkZCAtQSAuCi1naXQgY29tbWl0IC1tICJ1cGRhdGVkIHZlcnNpb24gZG9jcyBmb3IgdmVyc2lvbiAkQlYiCi1naXQgcHVzaAotcG9wZAotCi0KLVJFTEVBU0UKLS0tLS0tLS0KLQotd2hlbiB3ZSBkbyBhIFJFTEVBU0Ugd2UgbXVzdCBydW4gdGhlIGFib3ZlIGZvciBlLmcuIEJWPTAuNC4wCi1BTkQgbXVzdCB1cGRhdGUgdGhlIGZpbGVzIGluIHRoZSByb290IGRpciBvZiBicm9va2x5bmNlbnRyYWwuZ2l0aHViLmNvbQotCi10aGUgY29tbWFuZHMgYmVsb3cgZG8gdGhpcyAoYmFzaWNhbGx5IGxpa2UgdGhlIHByb2Nlc3MgYWJvdmUgYnV0IAotd2l0aCAvIGluIHBsYWNlIG9mIC92LyRCViBhbmQgb3ZlcnJpZGluZyB1cmwgaW4gX2NvbmZpZy55bWwgCi13aXRoIHRoZSAtLXVybCBhcmcgYmVsb3cpOgotCi0KLSMgcmVtb3ZlIG9sZCByb290IGZpbGVzCi1wdXNoZCAkVEFSR0VUCi1pZiBbIC1mIHN0YXJ0L2luZGV4Lmh0bWwgXSA7IHRoZW4KLSAgZm9yIHggaW4gKiA7IGRvIGlmIFtbICR4ICE9ICJ2IiBdXSA7IHRoZW4gcm0gLXJmICR4IDsgZmkgOyBkb25lCi1lbHNlCi0gIGVjaG8gSU4gV1JPTkcgRElSRUNUT1JZICRUQVJHRVQgLSBleHBvcnQgVEFSR0VUIHRvIGNvbnRpbnVlCi0gIGV4aXQgMQotZmkKLXBvcGQKLQotIyBidWlsZCBmb3IgaG9zdGluZyBvZiAvIHJhdGhlciB0aGFuIC92L1ZFUlNJT04vCi1fc2NyaXB0cy9idWlsZC5zaCAtLXVybCAiIiB8fCB7IGVjaG8gImZhaWxlZCB0byBidWlsZCBkb2NzIiA7IGV4aXQgMSA7IH0KLWNwIC1yIF9zaXRlLyogJFRBUkdFVC8KLQotIyBhbmQgZ2l0IHB1c2gKLXB1c2hkICRUQVJHRVQKLWdpdCBhZGQgLUEgLgotZ2l0IGNvbW1pdCAtbSAidXBkYXRlZCByb290IGRvY3MgZm9yIHZlcnNpb24gJEJWIgotZ2l0IHB1c2gKLXBvcGQKLQotCi0vLyBFTkQKK0RvY3MgcmVsZWFzZSBpbnN0cnVjdGlvbnMgY2FuIGJlIGZvdW5kIGF0OgoraHR0cDovL2Jyb29rbHluY2VudHJhbC5naXRodWIuaW8vZGV2L3RpcHMvcmVsZWFzZS5odG1sCmRpZmYgLS1naXQgYS9kb2NzL3VzZS9ndWlkZS9sb2NhdGlvbnMvaW5kZXgubWQgYi9kb2NzL3VzZS9ndWlkZS9sb2NhdGlvbnMvaW5kZXgubWQKaW5kZXggOTU3MGFhNC4uMWMwNjY4ZSAxMDA2NDQKLS0tIGEvZG9jcy91c2UvZ3VpZGUvbG9jYXRpb25zL2luZGV4Lm1kCisrKyBiL2RvY3MvdXNlL2d1aWRlL2xvY2F0aW9ucy9pbmRleC5tZApAQCAtMTEsOSArMTEsMTEgQEAKIAogQnJvb2tseW4gbG9va3MgZm9yIExvY2F0aW9uIGNvbmZpZ3VyYXRpb24gaW4gYH4vLmJyb29rbHluL2Jyb29rbHluLnByb3BlcnRpZXNgLgogCi0jIyMgTXVzdCBoYXZlIGFuIFNTSCBrZXkKKyMjIFNldHRpbmcgdXAgYW4gU1NIIGtleQogCi1UbyBhY2Nlc3MgYW55IGxvY2F0aW9ucywgQnJvb2tseW4gbXVzdCBoYXZlIGFjY2VzcyB0byBhbiBTU0gga2V5LiBCeSBkZWZhdWx0IEJyb29rbHluIGxvb2tzIGZvciBhIGtleSBhdCBgfi8uc3NoL2lkX3JzYWAgYW5kIGB+Ly5zc2gvaWRfZHNhYC4KK1doaWxlIHNvbWUgbG9jYXRpb25zIGNhbiBiZSBhY2Nlc3NlZCB1c2luZyAqdXNlcjpwYXNzd29yZCogY3JlZGVudGlhbHMgaXQgaXMgbW9yZSBjb21tb24gdG8gdXNlIGF1dGhlbnRpY2F0aW9uIGtleXMuCisKK1RvIHVzZSBrZXlmaWxlIGJhc2VkIGF1dGhlbnRpY2F0aW9uLCBCcm9va2x5biByZXF1aXJlcyB0aGF0IHRoZSBtYW5hZ2VtZW50IG1hY2hpbmUgaGFzIGFuIFNTSCBrZXkuIEJ5IGRlZmF1bHQgQnJvb2tseW4gbG9va3MgZm9yIGEga2V5IGF0IGB+Ly5zc2gvaWRfcnNhYCBhbmQgYH4vLnNzaC9pZF9kc2FgLgogCiBJZiB5b3UgZG8gbm90IGFscmVhZHkgaGF2ZSBhbiBTU0gga2V5IGluc3RhbGxlZCwgY3JlYXRlIGEgbmV3IGlkX3JzYSBrZXk6CiAKQEAgLTI4LDYwICszMCw2NyBAQAogCiAjIyBMb2NhbGhvc3QKIAotVG8gYWxsb3cgQnJvb2tseW4gdG8gYWNjZXNzIGxvY2Fob3N0IHRoZSBTU0gga2V5IG11c3QgYmUgYWRkZWQgdG8gdGhlIGBhdXRob3JpemVkX2tleXNgIG9uIHRoYXQgbWFjaGluZS4KK0Jyb29rbHluIGNhbiBhY2Nlc3MgbG9jYWxob3N0IGlmIHRoZXJlIGlzIGFuIFNTSCBrZXkgb24gdGhlIG1hY2hpbmUgYW5kIGlmIHRoZSBTU0gga2V5IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBsaXN0IG9mICBgYXV0aG9yaXplZF9rZXlzYCBvbiB0aGF0IG1hY2hpbmUuCiAKIHslIGhpZ2hsaWdodCBiYXNoICV9CiAjIF9BcHBlbmRzXyBpZF9yc2EucHViIHRvIGF1dGhvcml6ZWRfa2V5cy4gT3RoZXIga2V5cyBhcmUgdW5hZmZlY3RlZC4KICQgY2F0IH4vLnNzaC9pZF9yc2EucHViID4+IH4vLnNzaC9hdXRob3JpemVkX2tleXMKIHslIGVuZGhpZ2hsaWdodCAlfQogCi0oTWFjT1MgdXNlcj86IEluIGFkZGl0aW9uIHRvIHRoZSBhYm92ZSwgZW5hYmxlICdSZW1vdGUgTG9naW4nIGluIFN5c3RlbSBQcmVmZXJlbmNlcyA+Ci0gU2hhcmluZy4pCitNYWNPUyB1c2VyPyBJbiBhZGRpdGlvbiB0byB0aGUgYWJvdmUsIGVuYWJsZSAnUmVtb3RlIExvZ2luJyBpbiBTeXN0ZW0gUHJlZmVyZW5jZXMgPgorIFNoYXJpbmcuCiAKIAogIyMgQ2xvdWQgRW5kcG9pbnRzICh2aWEgamNsb3VkcykKIAotW0FwYWNoZSBqY2xvdWRzXShodHRwOi8vd3d3LmpjbG91ZHMub3JnKSBpcyBhIG11bHRpLWNsb3VkIGxpYnJhcnkgdGhhdCBCcm9va2x5biB1c2VzIHRvIGFjY2VzcyBbbWFueSBjbG91ZHNdKGh0dHA6Ly93d3cuamNsb3Vkcy5vcmcvZG9jdW1lbnRhdGlvbi9yZWZlcmVuY2Uvc3VwcG9ydGVkLXByb3ZpZGVycy8pLgorW0FwYWNoZSBqY2xvdWRzXShodHRwOi8vd3d3LmpjbG91ZHMub3JnKSBpcyBhIG11bHRpLWNsb3VkIGxpYnJhcnkgdGhhdCBCcm9va2x5biB1c2VzIHRvIGFjY2VzcyBtYW55IGNsb3Vkcy4gVGhlIFtmdWxsIGxpc3Qgb2Ygc3VwcG9ydGVkIHByb3ZpZGVyc10oaHR0cDovL2pjbG91ZHMuYXBhY2hlLm9yZy9yZWZlcmVuY2UvcHJvdmlkZXJzLykgaXMgYXZhaWxhYmxlIG9uIGpjbG91ZHMuYXBhY2hlLm9yZy4KKworQWRkIHlvdXIgY2xvdWQgcHJvdmlkZXIncyAoQVBJKSBjcmVkZW50aWFscyB0byBgYnJvb2tseW4ucHJvcGVydGllc2AgYW5kIGNyZWF0ZSBhbiBTU0gga2V5IG9uIHRoZSBtYW5hZ2VtZW50IG1hY2hpbmUuCisKK1NvbWUgY2xvdWRzIHByb3ZpZGUgYm90aCBBUEkga2V5cyBhbmQgU1NIIGtleXMuIEluIHRoaXMgY2FzZSBhZGQgb25seSB0aGUgQVBJIGNyZWRlbnRpYWxzIHRvIGBicm9va2x5bi5wcm9wZXJ0aWVzYC4gKGpjbG91ZHMgd2lsbCB0cmFuc3BhcmVudGx5IHVzZSB0aGUgQVBJIGNyZWRlbnRpYWxzIHRvIHNldHVwIGFjY2VzcyB1c2luZyB0aGUgbWFuYWdlbWVudCBtYWNoaW5lJ3MgU1NIIGtleS4pCiAKICMjIyBFeGFtcGxlOiBBV1MgVmlyZ2luaWEgTGFyZ2UgQ2VudG9zCiAKIHslIGhpZ2hsaWdodCBiYXNoICV9CisjIyBTbmlwcGV0IGZyb20gfi8uYnJvb2tseW4vYnJvb2tseW4ucHJvcGVydGllcy4KKwogIyBQcm92aWRlIGpjbG91ZHMgd2l0aCBBV1MgQVBJIGNyZWRlbnRpYWxzLgotYnJvb2tseW4uamNsb3Vkcy5hd3MtZWMyLmlkZW50aXR5ID0gQUtBX1lPVVJfQUNDRVNTX0tFWV9JRAotYnJvb2tseW4uamNsb3Vkcy5hd3MtZWMyLmNyZWRlbnRpYWwgPSBZb3VyU2VjcmV0S2V5V2hpY2hJc0FCYXNlNjRFbmNvZGVkU3RyaW5nCiticm9va2x5bi5sb2NhdGlvbi5qY2xvdWRzLmF3cy1lYzIuaWRlbnRpdHkgPSBBS0FfWU9VUl9BQ0NFU1NfS0VZX0lECiticm9va2x5bi5sb2NhdGlvbi5qY2xvdWRzLmF3cy1lYzIuY3JlZGVudGlhbCA9IFlvdXJTZWNyZXRLZXlXaGljaElzQUJhc2U2NEVuY29kZWRTdHJpbmcKIAogIyBOYW1lIHRoaXMgbG9jYXRpb24gJ0FXUyBWaXJnaW5pYSBMYXJnZSBDZW50b3MnIGFuZCB3aXJlIHRvIEFXUyBVUy1FYXN0LTEKIGJyb29rbHluLmxvY2F0aW9uLm5hbWVkLkFXU1wgVmlyZ2luaWFcIExhcmdlXCBDZW50b3MgPSBqY2xvdWRzOmF3cy1lYzI6dXMtZWFzdC0xCiAKLSMgU3BlY2lmeSBpbWFnZSwgdXNlciBhbmQgbWluaW11bSByYW0gc2l6ZSAoaWUgaW5zdGFuY2Ugc2l6ZSkKKyMgKFVzaW5nIHRoZSBzYW1lIG5hbWUpIHNwZWNpZnkgaW1hZ2UsIHVzZXIgYW5kIG1pbmltdW0gcmFtIHNpemUgKGllIGluc3RhbmNlIHNpemUpCiBicm9va2x5bi5sb2NhdGlvbi5uYW1lZC5BV1NcIFZpcmdpbmlhXCBMYXJnZVwgQ2VudG9zLmltYWdlSWQ9dXMtZWFzdC0xL2FtaS03ZDdiZmMxNAogYnJvb2tseW4ubG9jYXRpb24ubmFtZWQuQVdTXCBWaXJnaW5pYVwgTGFyZ2VcIENlbnRvcy51c2VyPXJvb3QKIGJyb29rbHluLmxvY2F0aW9uLm5hbWVkLkFXU1wgVmlyZ2luaWFcIExhcmdlXCBDZW50b3MubWluUmFtPTQwOTYKIAotIyBTbmlwcGV0IGZyb20gfi8uYnJvb2tseW4vYnJvb2tseW4ucHJvcGVydGllcy4KKwogeyUgZW5kaGlnaGxpZ2h0ICV9CiAKLVRoaXMgd2lsbCAgYXBwZWFyIGFzICdBV1MgVmlyZ2luaWEgTGFyZ2UgQ2VudG9zJyBpbiB0aGUgd2ViIGNvbnNvbGUsIGJ1dCB3aWxsIG5lZWQgdG8gYmUgZXNjYXBlZCBvbiB0aGUgY29tbWFuZCBsaW5lOiAgYEFXU1wgVmlyZ2luaWFcIExhcmdlXCBDZW50b3NgLgorVGhpcyB3aWxsICBhcHBlYXIgYXMgJ0FXUyBWaXJnaW5pYSBMYXJnZSBDZW50b3MnIGluIHRoZSB3ZWIgY29uc29sZSwgYnV0IHdpbGwgbmVlZCB0byBiZSBlc2NhcGVkIG9uIHRoZSBjb21tYW5kIGxpbmUgYXM6ICBgQVdTXCBWaXJnaW5pYVwgTGFyZ2VcIENlbnRvc2AuCiAKIFNlZSB0aGUgR2V0dGluZyBTdGFydGVkIFt0ZW1wbGF0ZSBicm9va2x5bi5wcm9wZXJ0aWVzXSgvdXNlL2d1aWRlL3F1aWNrc3RhcnQvYnJvb2tseW4ucHJvcGVydGllcykgZm9yIG1vcmUgZXhhbXBsZXMgb2YgdXNpbmcgY2xvdWQgZW5kcG9pbnRzLgogCiAKICMjIEZpeGVkIEluZnJhc3RydWN0dXJlCiAKLUJyaW5nLWluZyB5b3VyIG93biBub2RlcyAoQllPTikgdG8gQnJvb2tseW4gaXMgc3RyYWlnaHRmb3J3YXJkLgorQnJpbmdpbmcgeW91ciBvd24gbm9kZXMgKEJZT04pIHRvIEJyb29rbHluIGlzIHN0cmFpZ2h0Zm9yd2FyZC4KIAogWW91IHdpbGwgbmVlZCB0aGUgSVAgYWRkcmVzc2VzIG9mIHRoZSBub2RlcyBhbmQgdGhlIGFjY2VzcyBjcmVkZW50aWFscy4gQm90aCBTU0ggYW5kIHBhc3N3b3JkIGJhc2VkIGxvZ2luIGFyZSBzdXBwb3J0ZWQuCiAKICMjIyBFeGFtcGxlOiBPbi1QcmVtIElyb24KIAogeyUgaGlnaGxpZ2h0IGJhc2ggJX0KKyMjIFNuaXBwZXQgZnJvbSB+Ly5icm9va2x5bi9icm9va2x5bi5wcm9wZXJ0aWVzLgorCiAjIFVzZSB0aGUgYnlvbiBwcmVmaXgsIGFuZCBwcm92aWRlIHRoZSBJUCBhZGRyZXNzcyAob3IgSVAgcmFuZ2VzKQogYnJvb2tseW4ubG9jYXRpb24ubmFtZWQuT24tUHJlbVwgSXJvblwgRXhhbXBsZT1ieW9uOihob3N0cz0iMTAuOS4xLjEsMTAuOS4xLjIscHJvZHVzZXIyQDEwLjkuMi57MTAsMTEsMjAtMjl9IikKIGJyb29rbHluLmxvY2F0aW9uLm5hbWVkLk9uLVByZW1cIElyb25cIEV4YW1wbGUudXNlcj1wcm9kdXNlcjEKIGJyb29rbHluLmxvY2F0aW9uLm5hbWVkLk9uLVByZW1cIElyb25cIEV4YW1wbGUucHJpdmF0ZUtleUZpbGU9fi8uc3NoL3Byb2R1c2VyX2lkX3JzYQogYnJvb2tseW4ubG9jYXRpb24ubmFtZWQuT24tUHJlbVwgSXJvblwgRXhhbXBsZS5wcml2YXRlS2V5UGFzc3BocmFzZT1zM2NyM3RwYXNzcGhyYXNlCiAKLSMgU25pcHBldCBmcm9tIH4vLmJyb29rbHluL2Jyb29rbHluLnByb3BlcnRpZXMuCiB7JSBlbmRoaWdobGlnaHQgJX0KIAogCmRpZmYgLS1naXQgYS9kb2NzL3VzZS9ndWlkZS9xdWlja3N0YXJ0L2Jyb29rbHluLnByb3BlcnRpZXMgYi9kb2NzL3VzZS9ndWlkZS9xdWlja3N0YXJ0L2Jyb29rbHluLnByb3BlcnRpZXMKaW5kZXggNTNiNDc5YS4uMDhhOWQ3YyAxMDA2NDQKLS0tIGEvZG9jcy91c2UvZ3VpZGUvcXVpY2tzdGFydC9icm9va2x5bi5wcm9wZXJ0aWVzCisrKyBiL2RvY3MvdXNlL2d1aWRlL3F1aWNrc3RhcnQvYnJvb2tseW4ucHJvcGVydGllcwpAQCAtNiwyMiArNiwxMyBAQAogCiAjIEl0J3MgZ3JlYXQgdG8gaGF2ZSB5b3UgaGVyZS4KIAotIyBHZXR0aW5nIFN0YXJ0ZWQgb3B0aW9ucyBoYXZlIGJlZW4gcHVsbGVkIHRvIHRoZSB0b3AuIFRoZXkgYXJlIHJlcGVhdGVkIGZ1cnRoZXIgZG93bi4KLSMgV2hlbiB5b3UgYXJlIGhhcHB5IHdpdGggd2hhdCBCcm9va2x5biBkb2VzLCBhbmQgaG93IHRvIHVzZSBpdCwgeW91IGNhbiBkZWxldGUgdGhlCi0jIEdldHRpbmcgU3RhcnRlZCBTZWN0aW9uIGNvbXBsZXRlbHksIGFuZCB1c2UgdGhlIGZ1bGwgb3B0aW9ucyBiZWxvdyB0byBzZXR1cCB5b3VyIAotIyBjb25maWd1cmF0aW9uLgotCi0jIChUaGVyZSdzIGEgZm9ybWF0dGluZyBndWlkZSBhdCB0aGUgdmVyeSBib3R0b20uKQorIyBHZXR0aW5nIFN0YXJ0ZWQgb3B0aW9ucyBoYXZlIGJlZW4gcHVsbGVkIHRvIHRoZSB0b3AuIFRoZXJlJ3MgYSBmb3JtYXR0aW5nIGd1aWRlIGF0IHRoZQorIyB2ZXJ5IGJvdHRvbS4KIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBHZXR0aW5nIFN0YXJ0ZWQgT3B0aW9ucyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKLSMgQnkgZGVmYXVsdCB3ZSBoYXZlIEFXUyBhbmQgUmFja3NwYWNlIChub24tVUspIHNldCB1cCAoYnV0IHdpdGggaW52YWxpZCBjcmVkZW50aWFscyEpCi0jIEZvciBlYWNoIG9mIHRob3NlLCBlaXRoZXIgc2V0IHRoZSBjcmVkZW50aWFscyBpbW1lZGlhdGVseSBiZWxvdwotIyBvciByZW1vdmUgdGhlIGNvcnJlc3BvbmRpbmcgImxvY2F0aW9uLm5hbWVkIiBsaW5lcyBmYXIgYmVsb3cgCi0jIChpLmUuIGxvb2sgZm9yICBicm9va2x5bi5sb2NhdGlvbi5uYW1lZC4uLj0uLi48YXdzPi4uICBvciA9Li4uPGNsb3Vkc2VydmVycz4uLi4gKQotCi0jIEZvciBvdGhlciBjbG91ZHMsIEFERCBjb3JyZXNwb25kaW5nIGlkZW50aXR5IGFuZCBjcmVkZW50aWFsIGxpbmVzIAotIyBhbmQgZW5hYmxlIHRoZSAiYnJvb2tseW4ubG9jYXRpb24ubmFtZWQiIGxpbmUocykgc2V0dXAgZmFyIGJlbG93CisjIEJ5IGRlZmF1bHQgd2UgaGF2ZSBBV1Mgc2V0IHVwIChidXQgd2l0aCBpbnZhbGlkIGNyZWRlbnRpYWxzISkuICBNYW55LCBtYW55IG90aGVyCisjIHByb3ZpZGVycyBhcmUgc3VwcG9ydGVkLgogCiAjIyBBbWF6b24gRUMyIENyZWRlbnRpYWxzCiAjIFRoZXNlIHNob3VsZCBiZSBhbiAiQWNjZXNzIEtleSBJRCIgYW5kICJTZWNyZXQgQWNjZXNzIEtleSIgZm9yIHlvdXIgYWNjb3VudC4KQEAgLTMwLDE4ICsyMSwyOCBAQAogYnJvb2tseW4ubG9jYXRpb24uamNsb3Vkcy5hd3MtZWMyLmlkZW50aXR5ID0gQUtBX1lPVVJfQUNDRVNTX0tFWV9JRAogYnJvb2tseW4ubG9jYXRpb24uamNsb3Vkcy5hd3MtZWMyLmNyZWRlbnRpYWwgPSA8YWNjZXNzLWtleS1oZXgtZGlnaXRzPgogCi0jIEluc3RydWN0aW9ucyBmb3IgbWFueSBvdGhlciBjbG91ZHMgKHB1YmxpYyBhbmQgcHJpdmF0ZSkgYXJlIGJlbG93LgotCiAjIEJld2FyZSBvZiB0cmFpbGluZyBzcGFjZXMgaW4geW91ciBjbG91ZCBjcmVkZW50aWFscy4gVGhpcyB3aWxsIGNhdXNlIHVuZXhwZWN0ZWQKICMgNDAxOiB1bmF1dGhvcml6ZWQgcmVzcG9uc2VzLgogCi0jIyBTU0gga2V5IGZvciBsb2NhbGhvc3QgCisjIyBVc2luZyBPdGhlciBDbG91ZHMKKyMgMS4gQ2FzdCB5b3VyIGV5ZXMgZG93biB0aGlzIGRvY3VtZW50IHRvIGZpbmQgeW91ciBwcmVmZXJyZWQgY2xvdWQgaW4gdGhlIE5hbWVkIExvY2F0aW9ucworIyAgICBzZWN0aW9uLCBhbmQgdGhlIGV4YW1wbGVzLgorIyAyLiBVbmNvbW1lbnQgdGhlIHJlbGV2YW50IGxpbmUocykgZm9yIHlvdXIgcHJvdmlkZXIuCisjIDMuIEFERCAgLS5pZGVudGl0eSBhbmQgLS5jcmVkZW50aWFsIGxpbmVzIGZvciB5b3VyIHByb3ZpZGVyLCBzaW1pbGFyIHRvIHRoZSBBV1Mgb25lcyBhYm92ZSwKKyMgICAgcmVwbGFjaW5nICdhd3MtZWMyJyB3aXRoIGpjbG91ZCdzIGlkIGZvciB5b3VyIGNsb3VkLgorCisKKyMjIERlcGxveWluZyB0byBMb2NhbGhvc3QKKyMjIHNlZTogYnJvb2tseW5jZW50cmFsLmdpdGh1Yi5pby91c2UvZ3VpZGUvbG9jYXRpb25zLworIwogIyMgfi8uc3NoL2lkX3JzYSBpcyBCcm9va2x5bidzIGRlZmF1bHQgbG9jYXRpb24KLSMjIFBhc3NwaHJhc2VzIGFyZSBzdXBwb3J0ZWQsIGJ1dCBub3QgcmVxdWlyZWQKICMgYnJvb2tseW4ubG9jYXRpb24ubG9jYWxob3N0LnByaXZhdGVLZXlGaWxlID0gfi8uc3NoL2lkX3JzYQorIyMgUGFzc3BocmFzZXMgYXJlIHN1cHBvcnRlZCwgYnV0IG5vdCByZXF1aXJlZAogIyBicm9va2x5bi5sb2NhdGlvbi5sb2NhbGhvc3QucHJpdmF0ZUtleVBhc3NwaHJhc2UgPSBzM2NyM3RwYXNzcGhyYXNlCiAKLSMjIEdlb3NjYWxpbmcgU2VydmljZSAoVXNlZCBmb3IgZ2xvYmFsIHdlYiBmYWJyaWMgZGVtbykgaHR0cHM6Ly93d3cuZ2Vvc2NhbGluZy5jb20vZG5zMi8KKyMjIEdlb3NjYWxpbmcgU2VydmljZSAtIHVzZWQgZm9yIHRoZSBHbG9iYWwgV2ViIEZhYnJpYyBkZW1vCisjIyBzZWU6IGJyb29rbHluY2VudHJhbC5naXRodWIuaW8vdXNlL2V4YW1wbGVzL2dsb2JhbC13ZWItZmFicmljLyBhbmQKKyMjIGh0dHBzOi8vd3d3Lmdlb3NjYWxpbmcuY29tL2RuczIvCiAjIyBvdGhlciBzZXJ2aWNlcyBtYXkgdGFrZSBzaW1pbGFyIGNvbmZpZ3VyYXRpb24gc2ltaWxhcmx5OyBvciBjYW4gdXN1YWxseSBiZSBzZXQgaW4gWUFNTAogIyBicm9va2x5bi5nZW9zY2FsaW5nLnVzZXJuYW1lID0gVVNFUk5BTUUKICMgYnJvb2tseW4uZ2Vvc2NhbGluZy5wYXNzd29yZCA9IFBBU1NXT1JECkBAIC01MiwxMCArNTMsOSBAQAogCiAjIFRoYXQncyBpdCwgYWx0aG91Z2ggeW91IG1heSB3YW50IHRvIHJlYWQgdGhyb3VnaCB0aGVzZSBvcHRpb25zLi4uCiAKLQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQnJvb2tseW4gT3B0aW9ucyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKLSMjIEJyb29rbHluIE1nbXQgQmFzZSBEaXJlY3Rvcnk6IHNwZWNpZnkgd2hlcmUgbWdtdCBkYXRhIHNob3VsZCBiZSBzdG9yZWQgb24gdGhpcyBzZXJ2ZXI7IAorIyMgQnJvb2tseW4gTWFuYWdlbWVudCBCYXNlIERpcmVjdG9yeTogc3BlY2lmeSB3aGVyZSBtYW5hZ2VtZW50IGRhdGEgc2hvdWxkIGJlIHN0b3JlZCBvbiB0aGlzIHNlcnZlcjsKICMjIH4vLmJyb29rbHluLyBpcyB0aGUgZGVmYXVsdCBidXQgeW91IGNvdWxkIHVzZSBzb21ldGhpbmcgbGlrZSAvb3B0L2Jyb29rbHluL3N0YXRlLwogIyMgKHByb3ZpZGVkIHRoaXMgcHJvY2VzcyBoYXMgd3JpdGUgcGVybWlzc2lvbnMpIAogIyBicm9va2x5bi5iYXNlLmRpcj1+Ly5icm9va2x5bi8KQEAgLTkxLDExICs5MSwxMSBAQAogIyMgbWFueSBjbG91ZCBtYWNoaW5lcyBkb24ndCBoYXZlIHN1ZmZpY2llbnQgZW50cm9weSBmb3IgbG90cyBvZiBlbmNyeXB0ZWQgbmV0d29ya2luZywgc28gZmFrZSBpdDoKICMgYnJvb2tseW4ubG9jYXRpb24uamNsb3Vkcy5pbnN0YWxsRGV2VXJhbmRvbT10cnVlCiAKLSMjIFRoaXMgc2V0cyBhIHByb3BlcnR5IGZvciBhbGwgQVdTIG1hY2hpbmVzLiBSZWNvbW1lbmRlZCB0byBhdm9pZCBnZXR0aW5nIG0xLm1pY3JvcyAhCisjIyBTZXRzIGEgbWluaW1pdW0gcmFtIHByb3BlcnR5IGZvciBhbGwgamNsb3VkcyBsb2NhdGlvbnMuIFJlY29tbWVuZGVkIHRvIGF2b2lkIGdldHRpbmcgbTEubWljcm9zIG9uIEFXUyEKIGJyb29rbHluLmxvY2F0aW9uLmpjbG91ZHMubWluUmFtID0gMjA0OAogCi0jIyBCeSBkZWZhdWx0IGl0IHdpbGwgc2V0IHVwIGEgdXNlciB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHVzZXIgcnVubmluZyBvbiB0aGUgYnJvb2tseW4gc2VydmVyLCAKLSMjIGJ1dCB5b3UgY2FuIGZvcmNlIGEgdXNlciBoZXJlOgorIyMgV2hlbiBzZXR0aW5nIHVwIGEgbmV3IGNsb3VkIG1hY2hpbmUgQnJvb2tseW4gY3JlYXRlcyBhIHVzZXIgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSB1c2VyIHJ1bm5pbmcKKyMjIEJyb29rbHluIG9uIHRoZSBtYW5hZ2VtZW50IHNlcnZlciwgYnV0IHlvdSBjYW4gZm9yY2UgYSBkaWZmZXJlbnQgdXNlciBoZXJlOgogIyBicm9va2x5bi5sb2NhdGlvbi5qY2xvdWRzLnVzZXI9YnJvb2tseW4KICMjIEFuZCB5b3UgY2FuIGZvcmNlIGEgcGFzc3dvcmQgb3Iga2V5IChieSBkZWZhdWx0IGl0IHdpbGwgdXNlIHRoZSBrZXlzIGluIH4vLnNzaC9pZF9yc2F7LC5wdWJ9CiAjIGJyb29rbHluLmxvY2F0aW9uLmpjbG91ZHMucGFzc3dvcmQ9czNjcjN0CkBAIC0xMDMsNyArMTAzLDcgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIE5hbWVkIExvY2F0aW9ucyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKICMgTmFtZWQgbG9jYXRpb25zIGFwcGVhciBpbiB0aGUgd2ViIGNvbnNvbGUuIElmIHVzaW5nIHRoZSBjb21tYW5kIGxpbmUgb3IgWUFNTCBpdCBtYXkgYmUgCi0jIGp1c3QgYXMgZWFzeSB0byB1c2UgdGhlIGpjbG91ZHM6PHByb3ZpZGVyPiBsb2NhdGlvbnMgYW5kIHNwZWNpZnkgYWRkJ2wgcHJvcGVydGllcyB0aGVyZS4gCisjIGp1c3QgYXMgZWFzeSB0byB1c2UgdGhlIGpjbG91ZHM6PHByb3ZpZGVyPiBsb2NhdGlvbnMgYW5kIHNwZWNpZnkgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRoZXJlLgogCiAjIyBFeGFtcGxlOiBBV1MgVmlyZ2luaWEgdXNpbmcgUmlnaHRzY2FsZSA2LjMgNjRiaXQgQ2VudG9zIEFNSSBhbmQgTGFyZ2UgSW5zdGFuY2VzCiAjIGJyb29rbHluLmxvY2F0aW9uLm5hbWVkLmF3cy12YS1jZW50b3MtbGFyZ2UgPSBqY2xvdWRzOmF3cy1lYzI6dXMtZWFzdC0xCkBAIC0xMjUsNyArMTI1LDcgQEAKIGJyb29rbHluLmxvY2F0aW9uLm5hbWVkLmF3cy1pcmVsYW5kID0gamNsb3Vkczphd3MtZWMyOmV1LXdlc3QtMQogYnJvb2tseW4ubG9jYXRpb24ubmFtZWQuYXdzLXRva3lvID0gamNsb3Vkczphd3MtZWMyOmFwLW5vcnRoZWFzdC0xCiAKLSMjIFNpbWlsYXJseSwgZm9yIEdvb2dsZSBDb21wdXRlCisjIyBHb29nbGUgQ29tcHV0ZQogIyMgTm90ZSBhdCBwcmVzZW50IHlvdSBoYXZlIHRvIGNyZWF0ZSBhbmQgZG93bmxvYWQgdGhlIFAxMiBrZXkgZnJvbSB0aGUgR29vZ2xlICJBUElzICYgYXV0aCAtPiBSZWdpc3RlcmVkIEFwcHMiIGludGVyZmFjZSwKICMjIHRoZW4gY29udmVydCB0byBQRU0gcHJpdmF0ZSBrZXkgZm9ybWF0IHVzaW5nICBgb3BlbnNzbCBwa2NzMTIgLWluIENlcnRpZmljYXRlcy5wMTIgLW91dCBDZXJ0aWZpY2F0ZXMucGVtIC1ub2Rlc2AKICMjIHRoZW4gZW1iZWQgdGhhdCBvbiBvbmUgbGluZSBhcyB0aGUgJ2NyZWRlbnRpYWwsIHJlcGxhY2luZyBuZXcgbGluZXMgd2l0aCBcbiBhcyBiZWxvdwpAQCAtMTQ2LDEzICsxNDYsMTMgQEAKICMjIGdjZSBpbWFnZXMgb2Z0ZW4gc3RhcnQgd2l0aCBpcHRhYmxlcyB0dXJuZWQgb247IHR1cm4gaXQgb2ZmIAogIyBicm9va2x5bi5sb2NhdGlvbi5qY2xvdWRzLmdvb2dsZS1jb21wdXRlLWVuZ2luZS5zdG9wSXB0YWJsZXM9dHJ1ZQogCi0jIyBTaW1pbGFybHksIGhlcmUgYXJlIGRlZmluaXRpb25zIGZvciBIUCBDbG91ZCAtIGFsc28gVWJ1bnR1IDEyLjA0IExUUworIyMgSFAgQ2xvdWQgLSBhbHNvIFVidW50dSAxMi4wNCBMVFMKICMjIFlvdSBzcGVjaWZ5IHlvdXIgSFAgQ3JlZGVudGlhbHMgbGlrZSB0aGlzOgogIyBicm9va2x5bi5sb2NhdGlvbi5qY2xvdWRzLmhwY2xvdWQtY29tcHV0ZS5pZGVudGl0eSA9IHByb2plY3RuYW1lOnVzZXJuYW1lCiAjIGJyb29rbHluLmxvY2F0aW9uLmpjbG91ZHMuaHBjbG91ZC1jb21wdXRlLmNyZWRlbnRpYWwgPSBwYXNzd29yZAogIyMgd2hlcmUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGFyZSB0aGUgc2FtZSBhcyBsb2dnaW5nIGluIHRvIHRoZSB3ZWIgY29uc29sZSwgYW5kCiAjIyBwcm9qZWN0bmFtZSBjYW4gYmUgZm91bmQgaGVyZTogaHR0cHM6Ly9hY2NvdW50LmhwY2xvdWQuY29tL3Byb2plY3RzCi0joGJyb29rbHluLmxvY2F0aW9uLm5hbWVkLkhQXCBDbG91ZFwgQXJpem9uYS0xID0gamNsb3VkczpocGNsb3VkLWNvbXB1dGU6YXotMS5yZWdpb24tYS5nZW8tMQorI++/vWJyb29rbHluLmxvY2F0aW9uLm5hbWVkLkhQXCBDbG91ZFwgQXJpem9uYS0xID0gamNsb3VkczpocGNsb3VkLWNvbXB1dGU6YXotMS5yZWdpb24tYS5nZW8tMQogIyBicm9va2x5bi5sb2NhdGlvbi5uYW1lZC5IUFwgQ2xvdWRcIEFyaXpvbmEtMS5pbWFnZUlkID0gYXotMS5yZWdpb24tYS5nZW8tMS83NTg0NQogIyBicm9va2x5bi5sb2NhdGlvbi5uYW1lZC5IUFwgQ2xvdWRcIEFyaXpvbmEtMS51c2VyID0gdWJ1bnR1CiAKQEAgLTE3Miw3ICsxNzIsNyBAQAogIyMgQnJvb2tseW4gdXNlcyB0aGUgamNsb3VkcyBtdWx0aS1jbG91ZCBsaWJyYXJ5IHRvIGFjY2VzcyBtYW55IGNsb3Vkcy4KICMjIGh0dHA6Ly93d3cuamNsb3Vkcy5vcmcvZG9jdW1lbnRhdGlvbi9yZWZlcmVuY2Uvc3VwcG9ydGVkLXByb3ZpZGVycy8KIAotIyMgVGVtcGxhdGVzIGZvciBtYW55IG90aGVyIGNsb3VkcywgYnV0IHJlbWVtYmVyIHRoZSBpZGVudGl0eSBhbmQgY3JlZGVudGlhbHM6CisjIyBUZW1wbGF0ZXMgZm9yIG1hbnkgb3RoZXIgY2xvdWRzLCBidXQgcmVtZW1iZXIgdG8gYWRkIGlkZW50aXR5IGFuZCBjcmVkZW50aWFsczoKIAogIyBicm9va2x5bi5sb2NhdGlvbi5uYW1lZC5CbHVlbG9jayA9IGpjbG91ZHM6Ymx1ZWxvY2stdmNsb3VkLXpvbmUwMQogCkBAIC0yMjIsMjMgKzIyMiwyMyBAQAogCiAKICMjIFByb2R1Y3Rpb24gcG9vbCBvZiBtYWNoaW5lcyBmb3IgbXkgYXBwbGljYXRpb24gKGRlcGxveSB0byBuYW1lZDpPbi1QcmVtXCBJcm9uXCBFeGFtcGxlKQotI2Jyb29rbHluLmxvY2F0aW9uLm5hbWVkLk9uLVByZW1cIElyb25cIEV4YW1wbGU9YnlvbjooaG9zdHM9IjEwLjkuMS4xLDEwLjkuMS4yLHByb2R1c2VyMkAxMC45LjIuezEwLDExLDIwLTI5fSIpCi0jYnJvb2tseW4ubG9jYXRpb24ubmFtZWQuT24tUHJlbVwgSXJvblwgRXhhbXBsZS51c2VyPXByb2R1c2VyMQotI2Jyb29rbHluLmxvY2F0aW9uLm5hbWVkLk9uLVByZW1cIElyb25cIEV4YW1wbGUucHJpdmF0ZUtleUZpbGU9fi8uc3NoL3Byb2R1c2VyX2lkX3JzYQotI2Jyb29rbHluLmxvY2F0aW9uLm5hbWVkLk9uLVByZW1cIElyb25cIEV4YW1wbGUucHJpdmF0ZUtleVBhc3NwaHJhc2U9czNjcjN0cGFzc3BocmFzZQorIyBicm9va2x5bi5sb2NhdGlvbi5uYW1lZC5Pbi1QcmVtXCBJcm9uXCBFeGFtcGxlPWJ5b246KGhvc3RzPSIxMC45LjEuMSwxMC45LjEuMixwcm9kdXNlcjJAMTAuOS4yLnsxMCwxMSwyMC0yOX0iKQorIyBicm9va2x5bi5sb2NhdGlvbi5uYW1lZC5Pbi1QcmVtXCBJcm9uXCBFeGFtcGxlLnVzZXI9cHJvZHVzZXIxCisjIGJyb29rbHluLmxvY2F0aW9uLm5hbWVkLk9uLVByZW1cIElyb25cIEV4YW1wbGUucHJpdmF0ZUtleUZpbGU9fi8uc3NoL3Byb2R1c2VyX2lkX3JzYQorIyBicm9va2x5bi5sb2NhdGlvbi5uYW1lZC5Pbi1QcmVtXCBJcm9uXCBFeGFtcGxlLnByaXZhdGVLZXlQYXNzcGhyYXNlPXMzY3IzdHBhc3NwaHJhc2UKIAotIyMgVmFyaW91cyBwcml2YXRlIGNsb3VkcworIyMgVmFyaW91cyBQcml2YXRlIENsb3VkcwogCiAjIyBvcGVuc3RhY2sgaWRlbnRpdHkgYW5kIGNyZWRlbnRpYWwgYXJlIHJhbmRvbSBzdHJpbmdzIG9mIGxldHRlcnMgYW5kIG51bWJlcnMgKFRCQyAtIHN0aWxsIHRoZSBjYXNlPykKLSNicm9va2x5bi5sb2NhdGlvbi5uYW1lZC5NeVwgT3BlbnN0YWNrPWpjbG91ZHM6b3BlbnN0YWNrLW5vdmE6aHR0cHM6Ly85LjkuOS45Ojk5OTkvdjIuMC8KKyMgYnJvb2tseW4ubG9jYXRpb24ubmFtZWQuTXlcIE9wZW5zdGFjaz1qY2xvdWRzOm9wZW5zdGFjay1ub3ZhOmh0dHBzOi8vOS45LjkuOTo5OTk5L3YyLjAvCiAKICMjIGNsb3Vkc3RhY2sgaWRlbnRpdHkgYW5kIGNyZWRlbnRpYWwgYXJlIHJhdGhlciBsb25nIHJhbmRvbSBzdHJpbmdzIG9mIGxldHRlcnMgYW5kIG51bWJlcnMKICMjIHlvdSBnZW5lcmF0ZSB0aGlzIGluIHRoZSBjbG91ZHN0YWNrIGd1aSwgdW5kZXIgYWNjb3VudHMsIHRoZW4gInZpZXcgdXNlcnMiLCB0aGVuICJnZW5lcmF0ZSBrZXkiCiAjIyB1c2UgdGhlICJhcGkga2V5IiBhcyB0aGUgaWRlbnRpdHkgYW5kICJzZWNyZXQga2V5IiBhcyB0aGUgY3JlZGVudGlhbAotI2Jyb29rbHluLmxvY2F0aW9uLm5hbWVkLk15XCBDbG91ZHN0YWNrPWpjbG91ZHM6Y2xvdWRzdGFjazpodHRwOi8vOS45LjkuOTo5OTk5L2NsaWVudC9hcGkvCisjIGJyb29rbHluLmxvY2F0aW9uLm5hbWVkLk15XCBDbG91ZHN0YWNrPWpjbG91ZHM6Y2xvdWRzdGFjazpodHRwOi8vOS45LjkuOTo5OTk5L2NsaWVudC9hcGkvCiAKICMjIGFiaXF1byBpZGVudGl0eSBhbmQgY3JlZGVudGlhbCBhcmUgeW91ciBsb2dpbiB1c2VybmFtZS9wYXNzZWQKLSNicm9va2x5bi5sb2NhdGlvbi5uYW1lZC5NeVwgQWJpcXVvPWpjbG91ZHM6YWJpcXVvOmh0dHA6Ly9kZW1vbnN0cmF0aW9uLmFiaXF1by5jb20vYXBpLworIyBicm9va2x5bi5sb2NhdGlvbi5uYW1lZC5NeVwgQWJpcXVvPWpjbG91ZHM6YWJpcXVvOmh0dHA6Ly9kZW1vbnN0cmF0aW9uLmFiaXF1by5jb20vYXBpLwogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICBGb3JtYXR0aW5nIEd1aWRlICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIApkaWZmIC0tZ2l0IGEvZG9jcy91c2UvZ3VpZGUvcXVpY2tzdGFydC9pbWFnZXMvYWRkLWFwcGxpY2F0aW9uLWNhdGFsb2ctd2ViLWNsdXN0ZXItd2l0aC1kYi1sYXJnZS5wbmcgYi9kb2NzL3VzZS9ndWlkZS9xdWlja3N0YXJ0L2ltYWdlcy9hZGQtYXBwbGljYXRpb24tY2F0YWxvZy13ZWItY2x1c3Rlci13aXRoLWRiLWxhcmdlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTY2YjFhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy91c2UvZ3VpZGUvcXVpY2tzdGFydC9pbWFnZXMvYWRkLWFwcGxpY2F0aW9uLWNhdGFsb2ctd2ViLWNsdXN0ZXItd2l0aC1kYi1sYXJnZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy91c2UvZ3VpZGUvcXVpY2tzdGFydC9pbWFnZXMvYWRkLWFwcGxpY2F0aW9uLWNhdGFsb2ctd2ViLWNsdXN0ZXItd2l0aC1kYi1sb2NhdGlvbi1sYXJnZS5wbmcgYi9kb2NzL3VzZS9ndWlkZS9xdWlja3N0YXJ0L2ltYWdlcy9hZGQtYXBwbGljYXRpb24tY2F0YWxvZy13ZWItY2x1c3Rlci13aXRoLWRiLWxvY2F0aW9uLWxhcmdlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWU5YjBjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy91c2UvZ3VpZGUvcXVpY2tzdGFydC9pbWFnZXMvYWRkLWFwcGxpY2F0aW9uLWNhdGFsb2ctd2ViLWNsdXN0ZXItd2l0aC1kYi1sb2NhdGlvbi1sYXJnZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy91c2UvZ3VpZGUvcXVpY2tzdGFydC9pbWFnZXMvYWRkLWFwcGxpY2F0aW9uLWNhdGFsb2ctd2ViLWNsdXN0ZXItd2l0aC1kYi1sb2NhdGlvbi5wbmcgYi9kb2NzL3VzZS9ndWlkZS9xdWlja3N0YXJ0L2ltYWdlcy9hZGQtYXBwbGljYXRpb24tY2F0YWxvZy13ZWItY2x1c3Rlci13aXRoLWRiLWxvY2F0aW9uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTNmZGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy91c2UvZ3VpZGUvcXVpY2tzdGFydC9pbWFnZXMvYWRkLWFwcGxpY2F0aW9uLWNhdGFsb2ctd2ViLWNsdXN0ZXItd2l0aC1kYi1sb2NhdGlvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy91c2UvZ3VpZGUvcXVpY2tzdGFydC9pbWFnZXMvYWRkLWFwcGxpY2F0aW9uLWNhdGFsb2ctd2ViLWNsdXN0ZXItd2l0aC1kYi5wbmcgYi9kb2NzL3VzZS9ndWlkZS9xdWlja3N0YXJ0L2ltYWdlcy9hZGQtYXBwbGljYXRpb24tY2F0YWxvZy13ZWItY2x1c3Rlci13aXRoLWRiLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmI2ZjQyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy91c2UvZ3VpZGUvcXVpY2tzdGFydC9pbWFnZXMvYWRkLWFwcGxpY2F0aW9uLWNhdGFsb2ctd2ViLWNsdXN0ZXItd2l0aC1kYi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy91c2UvZ3VpZGUvcXVpY2tzdGFydC9pbWFnZXMvYWRkLWFwcGxpY2F0aW9uLW1vZGFsLXlhbWwucG5nIGIvZG9jcy91c2UvZ3VpZGUvcXVpY2tzdGFydC9pbWFnZXMvYWRkLWFwcGxpY2F0aW9uLW1vZGFsLXlhbWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MGI3YWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3VzZS9ndWlkZS9xdWlja3N0YXJ0L2ltYWdlcy9hZGQtYXBwbGljYXRpb24tbW9kYWwteWFtbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy91c2UvZ3VpZGUvcXVpY2tzdGFydC9pbWFnZXMvamJvc3M3LWNsdXN0ZXItcG9saWNpZXMtbGFyZ2UucG5nIGIvZG9jcy91c2UvZ3VpZGUvcXVpY2tzdGFydC9pbWFnZXMvamJvc3M3LWNsdXN0ZXItcG9saWNpZXMtbGFyZ2UucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkODQ0NzcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3VzZS9ndWlkZS9xdWlja3N0YXJ0L2ltYWdlcy9qYm9zczctY2x1c3Rlci1wb2xpY2llcy1sYXJnZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy91c2UvZ3VpZGUvcXVpY2tzdGFydC9pbWFnZXMvamJvc3M3LWNsdXN0ZXItcG9saWNpZXMucG5nIGIvZG9jcy91c2UvZ3VpZGUvcXVpY2tzdGFydC9pbWFnZXMvamJvc3M3LWNsdXN0ZXItcG9saWNpZXMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmODUzMjgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3VzZS9ndWlkZS9xdWlja3N0YXJ0L2ltYWdlcy9qYm9zczctY2x1c3Rlci1wb2xpY2llcy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy91c2UvZ3VpZGUvcXVpY2tzdGFydC9pbWFnZXMvbXktZGItYWN0aXZpdGllcy1sYXJnZS5wbmcgYi9kb2NzL3VzZS9ndWlkZS9xdWlja3N0YXJ0L2ltYWdlcy9teS1kYi1hY3Rpdml0aWVzLWxhcmdlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjE0ZDllCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy91c2UvZ3VpZGUvcXVpY2tzdGFydC9pbWFnZXMvbXktZGItYWN0aXZpdGllcy1sYXJnZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy91c2UvZ3VpZGUvcXVpY2tzdGFydC9pbWFnZXMvbXktZGItYWN0aXZpdGllcy5wbmcgYi9kb2NzL3VzZS9ndWlkZS9xdWlja3N0YXJ0L2ltYWdlcy9teS1kYi1hY3Rpdml0aWVzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjIzMjdjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy91c2UvZ3VpZGUvcXVpY2tzdGFydC9pbWFnZXMvbXktZGItYWN0aXZpdGllcy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy91c2UvZ3VpZGUvcXVpY2tzdGFydC9pbWFnZXMvbXktd2ViLWNsdXN0ZXItc3RhcnRpbmcucG5nIGIvZG9jcy91c2UvZ3VpZGUvcXVpY2tzdGFydC9pbWFnZXMvbXktd2ViLWNsdXN0ZXItc3RhcnRpbmcucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzODliMGIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3VzZS9ndWlkZS9xdWlja3N0YXJ0L2ltYWdlcy9teS13ZWItY2x1c3Rlci1zdGFydGluZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy91c2UvZ3VpZGUvcXVpY2tzdGFydC9pbWFnZXMvbXktd2ViLWNsdXN0ZXItc3RvcC1jb25maXJtLWxhcmdlLnBuZyBiL2RvY3MvdXNlL2d1aWRlL3F1aWNrc3RhcnQvaW1hZ2VzL215LXdlYi1jbHVzdGVyLXN0b3AtY29uZmlybS1sYXJnZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliZGFiNgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvdXNlL2d1aWRlL3F1aWNrc3RhcnQvaW1hZ2VzL215LXdlYi1jbHVzdGVyLXN0b3AtY29uZmlybS1sYXJnZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy91c2UvZ3VpZGUvcXVpY2tzdGFydC9pbWFnZXMvbXktd2ViLWNsdXN0ZXItc3RvcC1jb25maXJtLnBuZyBiL2RvY3MvdXNlL2d1aWRlL3F1aWNrc3RhcnQvaW1hZ2VzL215LXdlYi1jbHVzdGVyLXN0b3AtY29uZmlybS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5YjAwYQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvdXNlL2d1aWRlL3F1aWNrc3RhcnQvaW1hZ2VzL215LXdlYi1jbHVzdGVyLXN0b3AtY29uZmlybS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy91c2UvZ3VpZGUvcXVpY2tzdGFydC9pbWFnZXMvbXktd2ViLXN1bW1hcnktbGFyZ2UucG5nIGIvZG9jcy91c2UvZ3VpZGUvcXVpY2tzdGFydC9pbWFnZXMvbXktd2ViLXN1bW1hcnktbGFyZ2UucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNGJmZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3VzZS9ndWlkZS9xdWlja3N0YXJ0L2ltYWdlcy9teS13ZWItc3VtbWFyeS1sYXJnZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy91c2UvZ3VpZGUvcXVpY2tzdGFydC9pbWFnZXMvbXktd2ViLXN1bW1hcnkucG5nIGIvZG9jcy91c2UvZ3VpZGUvcXVpY2tzdGFydC9pbWFnZXMvbXktd2ViLXN1bW1hcnkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NTc1MmYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3VzZS9ndWlkZS9xdWlja3N0YXJ0L2ltYWdlcy9teS13ZWItc3VtbWFyeS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy91c2UvZ3VpZGUvcXVpY2tzdGFydC9pbWFnZXMvbXktd2ViLnBuZyBiL2RvY3MvdXNlL2d1aWRlL3F1aWNrc3RhcnQvaW1hZ2VzL215LXdlYi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJkNmFjMwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvdXNlL2d1aWRlL3F1aWNrc3RhcnQvaW1hZ2VzL215LXdlYi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy91c2UvZ3VpZGUvcXVpY2tzdGFydC9pbmRleC5tZCBiL2RvY3MvdXNlL2d1aWRlL3F1aWNrc3RhcnQvaW5kZXgubWQKaW5kZXggMzVkYjdmMy4uMjg5YWNkOCAxMDA2NDQKLS0tIGEvZG9jcy91c2UvZ3VpZGUvcXVpY2tzdGFydC9pbmRleC5tZAorKysgYi9kb2NzL3VzZS9ndWlkZS9xdWlja3N0YXJ0L2luZGV4Lm1kCkBAIC03LDMwICs3LDEyIEBACiAKIHslIGluY2x1ZGUgZmllbGRzLm1kICV9CiAKLVRoaXMgZ3VpZGUgd2lsbCB3YWxrIHlvdSB0aHJvdWdoIGRlcGxveWluZyBhbiBhcHBsaWNhdGlvbiB0byBhIHB1YmxpYyBjbG91ZCwgYW5kIG1hbmFnaW5nIHRoYXQgYXBwbGljYXRpb24uCitUaGlzIGd1aWRlIHdpbGwgd2FsayB5b3UgdGhyb3VnaCBkZXBsb3lpbmcgYW4gYXBwbGljYXRpb24gdG8gYSBwdWJsaWMgY2xvdWQuCiAKIFdlIHdpbGwgYmUgZGVwbG95aW5nIGFuIGV4YW1wbGUgMy10aWVyIHdlYiBhcHBsaWNhdGlvbiwgZGVzY3JpYmVkIHVzaW5nIHRoaXMgYmx1ZXByaW50OiAKIAogeyUgaGlnaGxpZ2h0IHlhbWwgJX0KLW5hbWU6IE15IFdlYiBDbHVzdGVyCi1sb2NhdGlvbjogbG9jYWxob3N0Ci0KLXNlcnZpY2VzOgotCi0tIHNlcnZpY2VUeXBlOiBicm9va2x5bi5lbnRpdHkud2ViYXBwLkNvbnRyb2xsZWREeW5hbWljV2ViQXBwQ2x1c3RlcgotICBuYW1lOiBNeSBXZWIKLSAgbG9jYXRpb246IGxvY2FsaG9zdAotICBicm9va2x5bi5jb25maWc6Ci0gICAgd2Fycy5yb290OiBodHRwOi8vc2VhcmNoLm1hdmVuLm9yZy9yZW1vdGVjb250ZW50P2ZpbGVwYXRoPWlvL2Jyb29rbHluL2V4YW1wbGUvYnJvb2tseW4tZXhhbXBsZS1oZWxsby13b3JsZC1zcWwtd2ViYXBwLzAuNi4wLU0yL2Jyb29rbHluLWV4YW1wbGUtaGVsbG8td29ybGQtc3FsLXdlYmFwcC0wLjYuMC1NMi53YXIKLSAgICBqYXZhLnN5c3Byb3BzOiAKLSAgICAgIGJyb29rbHluLmV4YW1wbGUuZGIudXJsOiAkYnJvb2tseW46Zm9ybWF0U3RyaW5nKCJqZGJjOiVzJXM/dXNlcj0lc1xcJnBhc3N3b3JkPSVzIiwKLSAgICAgICAgIGNvbXBvbmVudCgiZGIiKS5hdHRyaWJ1dGVXaGVuUmVhZHkoImRhdGFiYXNlLnVybCIpLCAidmlzaXRvcnMiLCAiYnJvb2tseW4iLCAiYnIwMGsxMW4iKQotCi0tIHNlcnZpY2VUeXBlOiBicm9va2x5bi5lbnRpdHkuZGF0YWJhc2UubXlzcWwuTXlTcWxOb2RlCi0gIGlkOiBkYgotICBuYW1lOiBNeSBEQgotICBicm9va2x5bi5jb25maWc6Ci0gICAgY3JlYXRpb25TY3JpcHRVcmw6IGNsYXNzcGF0aDovL3Zpc2l0b3JzLWNyZWF0aW9uLXNjcmlwdC5zcWwKK3slIHJlYWRqIG15LXdlYi1jbHVzdGVyLnlhbWwgJX0KIHslIGVuZGhpZ2hsaWdodCAlfQogCiAoVGhpcyBpcyB3cml0dGVuIGluIFlBTUwsIGZvbGxvd2luZyB0aGUgW2NhbXAgc3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly93d3cub2FzaXMtb3Blbi5vcmcvY29tbWl0dGVlcy9jYW1wLykuICkKQEAgLTU4LDEyICs0MCwxNCBAQAogCiBUaGlzIHdpbGwgY3JlYXRlIGEgYGJyb29rbHluLXt7IHNpdGUuYnJvb2tseW4tdmVyc2lvbiB9fWAgZm9sZGVyLgogCi1Ob3RlOiB5b3UnbGwgYWxzbyBuZWVkIEphdmEgSlJFIG9yIFNESyBpbnN0YWxsZWQgKHZlcnNpb24gNiBvciBsYXRlcikuCitOb3RlOiBZb3UnbGwgbmVlZCBhIEphdmEgSlJFIG9yIFNESyBpbnN0YWxsZWQgKHZlcnNpb24gNiBvciBsYXRlciksIGFzIEJyb29rbHluIGlzIEphdmEgdW5kZXIgdGhlIGNvdmVycy4KIAogIyMgTGF1bmNoIEJyb29rbHluCiAKIExldCdzIHNldHVwIHNvbWUgcGF0aHMgZm9yIGVhc3kgY29tbWFuZHMuCiAKKyhDbGljayB0aGUgY2xpcGJvYXJkIG9uIHRoZXNlIGNvZGUgc25pcHBldHMgZm9yIGVhc2llciBjJnAuKQorCiB7JSBoaWdobGlnaHQgYmFzaCAlfQogJCBjZCBicm9va2x5bi17eyBzaXRlLmJyb29rbHluLXZlcnNpb24gfX0KICQgQlJPT0tMWU5fRElSPSIkKHB3ZCkiCkBAIC03OCw3ICs2MiwxMCBAQAogCiBCcm9va2x5biB3aWxsIG91dHB1dCB0aGUgYWRkcmVzcyBvZiB0aGUgbWFuYWdlbWVudCBpbnRlcmZhY2U6CiAKLWAuLi4gU3RhcnRlZCBCcm9va2x5biBjb25zb2xlIGF0IGh0dHA6Ly8xMjcuMC4wLjE6ODA4MS9gIChbbGlua10oaHR0cDovLzEyNy4wLjAuMTo4MDgxLykpCisKK2BJTkZPICBTdGFydGluZyBicm9va2x5biB3ZWItY29uc29sZSBvbiBsb29wYmFjayBpbnRlcmZhY2UgYmVjYXVzZSBubyBzZWN1cml0eSBjb25maWcgaXMgc2V0YAorCitgSU5GTyAgU3RhcnRlZCBCcm9va2x5biBjb25zb2xlIGF0IGh0dHA6Ly8xMjcuMC4wLjE6ODA4MS8sIHJ1bm5pbmcgY2xhc3NwYXRoOi8vYnJvb2tseW4ud2FyIGFuZCBbXWAKIAogQnV0IGJlZm9yZSB3ZSByZWFsbHkgdXNlIEJyb29rbHluLCB3ZSBuZWVkIHRvIHNldHVwIHNvbWUgTG9jYXRpb25zLgogIApAQCAtODYsMTkgKzczLDIzIEBACiAKICMjIENvbmZpZ3VyaW5nIGEgTG9jYXRpb24KIAotQnJvb2tseW4gZGVwbG95cyBhcHBsaWNhdGlvbnMgdG8gTG9jYXRpb25zLiBMb2NhdGlvbnMgY2FuIGJlIGNsb3VkcywgbWFjaGluZXMgd2l0aCBmaXhlZCBJUHMgb3IgbG9jYWxob3N0IChmb3IgdGVzdGluZykuCitCcm9va2x5biBkZXBsb3lzIGFwcGxpY2F0aW9ucyB0byBMb2NhdGlvbnMuCisKK0xvY2F0aW9ucyBjYW4gYmUgY2xvdWRzLCBtYWNoaW5lcyB3aXRoIGZpeGVkIElQcyBvciBsb2NhbGhvc3QgKGZvciB0ZXN0aW5nKS4KIAogQnJvb2tseW4gbG9hZHMgTG9jYXRpb24gY29uZmlndXJhdGlvbiAgZnJvbSBgfi8uYnJvb2tseW4vYnJvb2tseW4ucHJvcGVydGllc2AuIAogCi1DcmVhdGUgYSBgLmJyb29rbHluYCBmb2xkZXIgaW4geW91ciBob21lIGRpcmVjdG9yeToKK0NyZWF0ZSBhIGAuYnJvb2tseW5gIGZvbGRlciBpbiB5b3VyIGhvbWUgZGlyZWN0b3J5IGFuZCBkb3dubG9hZCB0aGUgdGVtcGxhdGUgW2Jyb29rbHluLnByb3BlcnRpZXNdKGJyb29rbHluLnByb3BlcnRpZXMpIHRvIHRoYXQgZm9sZGVyLgogCiB7JSBoaWdobGlnaHQgYmFzaCAlfQogJCBta2RpciB+Ly5icm9va2x5bgorJCBjZCB+Ly5icm9va2x5bgorJCB3Z2V0IHt7c2l0ZS51cmx9fS91c2UvZ3VpZGUvcXVpY2tzdGFydC9icm9va2x5bi5wcm9wZXJ0aWVzCiB7JSBlbmRoaWdobGlnaHQgJX0KIAotRG93bmxvYWQgdGhlIHRlbXBsYXRlIFticm9va2x5bi5wcm9wZXJ0aWVzXShicm9va2x5bi5wcm9wZXJ0aWVzKSAgYW5kIHBsYWNlIHRoaXMgaW4gYH4vLmJyb29rbHluYC4gIAorT3BlbiBicm9va2x5bi5wcm9wZXJ0aWVzIGluIGEgdGV4dCBlZGl0b3IgYW5kIGFkZCB5b3VyIGNsb3VkIGNyZWRlbnRpYWxzLgogCi1PcGVuIHRoZSBmaWxlIGluIGEgdGV4dCBlZGl0b3IgYW5kIGFkZCB5b3VyIGNsb3VkIGNyZWRlbnRpYWxzLiBJZiB5b3Ugd291bGQgcmF0aGVyIHRlc3QgQnJvb2tseW4gb24gbG9jYWxob3N0LCBmb2xsb3cgW3RoZXNlIGluc3RydWN0aW9uc10oL3VzZS9ndWlkZS9sb2NhdGlvbnMvKSB0byBlbnN1cmUgdGhhdCB5b3VyIEJyb29rbHluIGNhbiBhY2Nlc3MgeW91ciBtYWNoaW5lLgorSWYgeW91IHdvdWxkIHJhdGhlciB0ZXN0IEJyb29rbHluIG9uIGxvY2FsaG9zdCwgZm9sbG93IFt0aGVzZSBpbnN0cnVjdGlvbnNdKHt7c2l0ZS51cmx9fS91c2UvZ3VpZGUvbG9jYXRpb25zLykgdG8gZW5zdXJlIHRoYXQgeW91ciBCcm9va2x5biBjYW4gYWNjZXNzIHlvdXIgbWFjaGluZS4KIAogUmVzdGFydCBCcm9va2x5bjoKIApAQCAtMTA4LDY2ICs5OSw4MyBAQAogCiAjIyBMYXVuY2hpbmcgYW4gQXBwbGljYXRpb24KIAotVGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byBkZXBsb3kgYSBZQU1MIGJsdWVwcmludDoKK1RoZXJlIGFyZSBzZXZlcmFsIHdheXMgdG8gZGVwbG95IGEgWUFNTCBibHVlcHJpbnQgKGluY2x1ZGluZyBzcGVjaWZ5aW5nIHRoZSBibHVlcHJpbnQgb24gdGhlIGNvbW1hbmQgbGluZSBvciBzdWJtaXR0aW5nIGl0IHZpYSB0aGUgUkVTVCBBUEkpLgogCi0xLiBXZSBjYW4gc3VwcGx5IGEgYmx1ZXByaW50IGZpbGUgYXQgc3RhcnR1cDogYGJyb29rbHluIGxhdW5jaCAtLWFwcCAvcGF0aC90by9teWJsdWVwcmludC55YW1sYAotMS4gV2UgY2FuIGRlcGxveSB1c2luZyB0aGUgd2ViLWNvbnNvbGUuCi0xLiBXZSBjYW4gZGVwbG95IHVzaW5nIHRoZSBicm9va2x5biBSRVNUIGFwaS4KK0ZvciBub3csIHdlIHdpbGwgc2ltcGx5IGNvcHktYW5kLXBhc3RlIHRoZSByYXcgWUFNTCBibHVlcHJpbnQgaW50byB0aGUgd2ViIGNvbnNvbGUuCiAKLVdlIHdpbGwgdXNlIHRoZSBzZWNvbmQgb3B0aW9uIHRvIGRlcGxveSBhIDMtdGllciB3ZWItYXBwLCB1c2luZyB0aGUgWUFNTCBmaWxlIGF0IHRoZSB0b3Agb2YgdGhpcyBwYWdlLgorT3BlbiB0aGUgd2ViIGNvbnNvbGUgKFsxMjcuMC4wLjE6ODA4MV0oaHR0cDovLzEyNy4wLjAuMTo4MDgxKSkuIEFzIEJyb29rbHluIGlzIG5vdCBjdXJyZW50bHkgbWFuYWdpbmcgYW55IGFwcGxpY2F0aW9ucyB0aGUgJ0NyZWF0ZSBBcHBsaWNhdGlvbicgZGlhbG9nIG9wZW5zIGF1dG9tYXRpY2FsbHkuIFNlbGVjdCB0aGUgWUFNTCB0YWIuCiAKLU9uIHRoZSBob21lIHBhZ2Ugb2YgdGhlIEJyb29rbHluIHdlYi1jb25zb2xlLCBjbGljayB0aGUgImFkZCBhcHBsaWNhdGlvbiIgYnV0dG9uIChpZiBubyBhcHBsaWNhdGlvbnMgYXJlIGN1cnJlbnRseSBydW5uaW5nLCB0aGlzIHdpbGwgYmUgb3BlbmVkIGF1dG9tYXRpY2FsbHkpLiBTZWxlY3QgdGhlIFlBTUwgdGFiIGFuZCBwYXN0ZSB5b3VyIFlBTUwgY29kZS4KKyFbQnJvb2tseW4gd2ViIGNvbnNvbGUsIHNob3dpbmcgdGhlIFlBTUwgdGFiIG9mIHRoZSBBZGQgQXBwbGljYXRpb24gZGlhbG9nLl0oaW1hZ2VzL2FkZC1hcHBsaWNhdGlvbi1tb2RhbC15YW1sLnBuZykKIAotIyMjIENob3NlIHlvdXIgY2xvdWQgLyBsb2NhdGlvbgogCi1FZGl0IHRoZSB5YW1sIHRvIHVzZSB0aGUgbG9jYXRpb24geW91IGNvbmZpZ3VyZWQsIGUuZy4gcmVwbGFjZToKKyMjIyBDaG9zZSB5b3VyIENsb3VkIC8gTG9jYXRpb24KKworRWRpdCB0aGUgJ2xvY2F0aW9uJyBwYXJhbWV0ZXIgaW4gdGhlIFlBTUwgdGVtcGxhdGUgKHJlcGVhdGVkIGJlbG93KSB0byB1c2UgdGhlIGxvY2F0aW9uIHlvdSBjb25maWd1cmVkLgorCitGb3IgZXhhbXBsZSwgcmVwbGFjZToKIHslIGhpZ2hsaWdodCB5YW1sICV9Citsb2NhdGlvbjogbG9jYXRpb24KK3slIGVuZGhpZ2hsaWdodCAlfQorCit3aXRoIChvbmUgb2YpOgoreyUgaGlnaGxpZ2h0IHlhbWwgJX0KK2xvY2F0aW9uOiBhd3MtZWMyOnVzLWVhc3QtMQorbG9jYXRpb246IHJhY2tzcGFjZS1jbG91ZHNlcnZlcnMtdXM6T1JECitsb2NhdGlvbjogZ29vZ2xlLWNvbXB1dGUtZW5naW5lOmV1cm9wZS13ZXN0MS1hCiBsb2NhdGlvbjogbG9jYWxob3N0CiB7JSBlbmRoaWdobGlnaHQgJX0KIAotd2l0aDoKKyoqTXkgV2ViIENsdXN0ZXIgQmx1ZXByaW50KioKKwogeyUgaGlnaGxpZ2h0IHlhbWwgJX0KLWxvY2F0aW9uOiBnb29nbGUtY29tcHV0ZS1lbmdpbmU6ZXVyb3BlLXdlc3QxLWEKK3slIHJlYWRqIG15LXdlYi1jbHVzdGVyLnlhbWwgJX0KIHslIGVuZGhpZ2hsaWdodCAlfQogCi1DbGljayAiZmluaXNoIi4gWW91IHNob3VsZCBzZWUgeW91ciBhcHBsaWNhdGlvbiBsaXN0ZWQsIHdpdGggc3RhdHVzICJTVEFSVElORyIuCitQYXN0ZSB0aGUgbW9kaWZpZWQgWUFNTCBpbnRvIHRoZSBkaWFsb2cgYW5kIGNsaWNrICdGaW5pc2gnLgorVGhlIGRpYWxvZyB3aWxsIGNsb3NlIGFuZCBCcm9va2x5biB3aWxsIGJlZ2luIGRlcGxveWluZyB5b3VyIGFwcGxpY2F0aW9uLgogCi0jIyBNb25pdG9yaW5nIGFuZCBtYW5hZ2luZyBhcHBsaWNhdGlvbnMKK1lvdXIgYXBwbGljYXRpb24gd2lsbCBiZSBzaG93biBhcyAnU3RhcnRpbmcnIG9uIHRoZSB3ZWIgY29uc29sZSdzIGZyb250IHBhZ2UuCiAKLUluIHRoZSBCcm9va2x5biB3ZWItY29uc29sZSBjbGlja2luZyBvbiBhbiBhcHBsaWNhdGlvbiBsaXN0ZWQgb24gdGhlIGhvbWUgcGFnZSwgb3IgdGhlIEFwcGxpY2F0aW9ucyB0YWIsIHdpbGwgc2hvdyBhbGwgdGhlIGFwcGxpY2F0aW9ucyBjdXJyZW50bHkgcnVubmluZy4KLQotV2UgY2FuIGV4cGxvcmUgdGhlIG1hbmFnZW1lbnQgaGllcmFyY2h5IG9mIGFuIGFwcGxpY2F0aW9uLCB3aGljaCB3aWxsIHNob3cgdXMgdGhlIGVudGl0aWVzIGl0IGlzIGNvbXBvc2VkIG9mLiBJZiB5b3UgaGF2ZSBkZXBsb3llZCB0aGUgYWJvdmUgWUFNTCwgdGhlbiB5b3UnbGwgc2VlIGEgc3RhbmRhcmQgMy10aWVyIHdlYi1hcHAuIENsaWNraW5nIG9uIHRoZSBDb250cm9sbGVkRHluYW1pY1dlYkFwcENsdXN0ZXIgd2lsbCBzaG93IGlmIHRoZSBjbHVzdGVyIGlzIHJlYWR5IHRvIHNlcnZlIGFuZCwgd2hlbiByZWFkeSwgd2lsbCBwcm92aWRlIGEgd2ViIGFkZHJlc3MgZm9yIHRoZSBmcm9udCBvZiB0aGUgbG9hZGJhbGFuY2VyLgotCi1JZiB0aGUgc2VydmljZS5pc1VwLCB5b3UgY2FuIHZpZXcgdGhlIGRlbW8gd2ViIGFwcGxpY2F0aW9uIGluIHlvdXIgYnJvd3NlciBhdCB0aGUgd2ViYXBwLnVybC4KLQotVGhyb3VnaCB0aGUgQWN0aXZpdGllcyB0YWIsIHlvdSBjYW4gZHJpbGwgaW50byB0aGUgYWN0aXZpdGllcyBlYWNoIGVudGl0eSBpcyBkb2luZyBvciBoYXMgcmVjZW50bHkgZG9uZS4gQ2xpY2sgb24gdGhlIHRhc2sgdG8gc2VlIGl0cyBkZXRhaWxzLCBhbmQgdG8gZHJpbGwgaW50byBpdHMgIkNoaWxkcmVuIFRhc2tzIi4gRm9yIGV4YW1wbGUsIGlmIHlvdSBkcmlsbCBpbnRvIE15U3FsTm9kZSdzIHN0YXJ0IG9wZXJhdGlvbiwgeW91IGNhbiBzZWUgdGhlICJTdGFydCAocHJvY2Vzc2VzKSIsIHRoZW4gImxhdW5jaCIsIGFuZCB0aGVuIHRoZSBzc2ggY29tbWFuZCB1c2VkIGluY2x1ZGluZyB0aGUgc3RkaW4sIHN0ZG91dCBhbmQgc3RkZXJyLgorIVtNeSBXZWIgQ2x1c3RlciBpcyBTVEFSVElORy5dKGltYWdlcy9teS13ZWItY2x1c3Rlci1zdGFydGluZy5wbmcpCiAKIAotIyMgU3RvcHBpbmcgdGhlIGFwcGxpY2F0aW9uCisjIyBNb25pdG9yaW5nIGFuZCBNYW5hZ2luZyBBcHBsaWNhdGlvbnMKIAotVG8gc3RvcCBhbiBhcHBsaWNhdGlvbiwgc2VsZWN0IHRoZSBhcHBsaWNhdGlvbiBpbiB0aGUgdHJlZSB2aWV3LCBjbGljayBvbiB0aGUgRWZmZWN0b3JzIHRhYiwgYW5kIGludm9rZSB0aGUgIlN0b3AiIGVmZmVjdG9yLiBUaGlzIHdpbGwgY2xlYW5seSBzaHV0ZG93biBhbGwgY29tcG9uZW50cyBpbiB0aGUgYXBwbGljYXRpb24uCitDbGljayBvbiB0aGUgYXBwbGljYXRpb24gbmFtZSwgb3Igb3BlbiB0aGUgQXBwbGljYXRpb25zIHRhYi4KIAotIyMjIFRlc3RpbmcgdGhlIFBvbGljaWVzCitXZSBjYW4gZXhwbG9yZSB0aGUgbWFuYWdlbWVudCBoaWVyYXJjaHkgb2YgdGhlIGFwcGxpY2F0aW9uLCB3aGljaCB3aWxsIHNob3cgdXMgdGhlIGVudGl0aWVzIGl0IGlzIGNvbXBvc2VkIG9mLgogCi1Ccm9va2x5biBhdCBpdHMgaGVhcnQgaXMgYSBwb2xpY3kgZHJpdmVuIG1hbmFnZW1lbnQgcGxhbmUgd2hpY2ggY2FuIGltcGxlbWVudCBidXNpbmVzcyBhbmQgdGVjaG5pY2FsIHBvbGljaWVzLgorICogTXkgV2ViIENsdXN0ZXIgKEEgYEJhc2ljQXBwbGljYXRpb25gKQorICAgICAqIE15IERCIChBIGBNeVNxbE5vZGVgKQorICAgICAqIE15IFdlYiAoQSBgQ29udHJvbGxlZER5bmFtaWNXZWJBcHBDbHVzdGVyYCkKKyAgICAgICAgKiBDbHVzdGVyIG9mIEpCb3NzNyBTZXJ2ZXJzIChBIGBEeW5hbWljV2ViQXBwQ2x1c3RlcmApCisgICAgICAgICogTmdpbnhDb250cm9sbGVyIChBbiBgTmdpbnhDb250cm9sbGVyYCkKIAotVGhlIFdlYiBDbHVzdGVyIHdpdGggREIgZGVtbyBjb21lcyBwcmUtY29uZmlndXJlZCB3aXRoIGFuIGBBdXRvU2NhbGVyUG9saWN5YCwgYXR0YWNoZWQgdG8KLXRoZSBjbHVzdGVyIG9mIEpCb3NzNyBzZXJ2ZXJzIGFuZCBhIGB0YXJnZXRzYCBwb2xpY3kgYXR0YWNoZWQgdG8gdGhlIGxvYWRiYWxhbmNlci4gWW91IGNhbgotIG9ic2VydmUgcG9saWNpZXMgdGhpcyBpbiB0aGUgbWFuYWdlbWVudCBjb25zb2xlIHVzaW5nIHRoZSBQb2xpY3kgdGFiIG9mIHRoZSByZWxldmFudAotIGVudGl0eSAoZS5nLiBgRHluYW1pY1dlYkFwcENsdXN0ZXJgIHNob3dzIHRoZSBgQXV0b1NjYWxlclBvbGljeWAuCiAKLVRoZSBjbHVzdGVyIGF1dG9zY2FsZXIgcG9saWN5IHdpbGwgYXV0b21hdGljYWxseSBzY2FsZSB0aGUgY2x1c3RlciB1cCBvciBkb3duIHRvIGJlIHRoZQotcmlnaHQgc2l6ZSBmb3IgdGhlIGN1cnJlbnQgbG9hZC4gKCdPbmUgc2VydmVyJyBpcyB0aGUgbWluaW11bSBzaXplIGFsbG93ZWQgYnkgdGhlIHBvbGljeS4pCi1UaGUgbG9hZGJhbGFuY2VyIHdpbGwgYXV0b21hdGljYWxseSBiZSB1cGRhdGVkIGJ5IHRoZSB0YXJnZXRzIHBvbGljeSBhcyB0aGUgY2x1c3RlciBzaXplCi1jaGFuZ2VzLgogCi1TaXR0aW5nIGlkbGUsIHlvdXIgY2x1c3RlciB3aWxsIG9ubHkgY29udGFpbiBvbmUgc2VydmVyLCBidXQgeW91IGNhbiBjaGVjayB0aGF0IHRoZSBwb2xpY3kKLXdvcmtzICB1c2luZyBhIHRvb2wgbGlrZSBbam1ldGVyXShodHRwOi8vam1ldGVyLmFwYWNoZS5vcmcvKSBwb2ludGVkIGF0IHRoZSBuZ2lueCBlbmRwb2ludAotdG8gY3JlYXRlIGxvYWQgb24gdGhlIGNsdXN0ZXIuCitDbGlja2luZyBvbiB0aGUgJ015IFdlYicgZW50aXR5IHdpbGwgc2hvdyB0aGUgU3VtbWFyeSB0YWIuIEhlcmUgd2UgY2FuIHNlZSBpZiB0aGUgY2x1c3RlciBpcyByZWFkeSB0byBzZXJ2ZSBhbmQsIHdoZW4gcmVhZHksIGdyYWIgdGhlIHdlYiBhZGRyZXNzIGZvciB0aGUgZnJvbnQgb2YgdGhlIGxvYWRiYWxhbmNlci4KKworIVtFeHBsb3JpbmcgTXkgV2ViLl0oaW1hZ2VzL215LXdlYi5wbmcpCisKKworVGhlIEFjdGl2aXR5IHRhYiBhbGxvd3MgdXMgdG8gZHJpbGwgZG93biBpbnRvIHdoYXQgYWN0aXZpdGllcyBlYWNoIGVudGl0eSBpcyBjdXJyZW50bHkgZG9pbmcgb3IgaGFzIHJlY2VudGx5IGRvbmUuIEl0IGlzIHBvc3NpYmxlIHRvIGRyaWxsIGRvd24gdG8gYWxsIGNoaWxkIHRhc2tzLCBhbmQgdmlldyB0aGUgY29tbWFuZHMgaXNzdWVkLCBhbmQgYW55IGVycm9ycyBvciB3YXJuaW5ncyB0aGF0IG9jY3VyZWQuCisKK0RyaWxsIGludG8gdGhlICdNeSBEQicgc3RhcnQgb3BlcmF0aW9uLiBXb3JraW5nIGRvd24gdGhyb3VnaCAgJ1N0YXJ0IChwcm9jZXNzZXMpJywgdGhlbiAnbGF1bmNoJywgd2UgY2FuIGRpc2NvdmVyIHRoZSBzc2ggY29tbWFuZCB1c2VkIGluY2x1ZGluZyB0aGUgc3RkaW4sIHN0ZG91dCBhbmQgc3RkZXJyLgorCitbIVtNeSBEQiBBY3Rpdml0aWVzLl0oaW1hZ2VzL215LWRiLWFjdGl2aXRpZXMucG5nKV0oaW1hZ2VzL215LWRiLWFjdGl2aXRpZXMtbGFyZ2UucG5nKQorCisKKyMjIFN0b3BwaW5nIHRoZSBBcHBsaWNhdGlvbgorCitUbyBzdG9wIGFuIGFwcGxpY2F0aW9uLCBzZWxlY3QgdGhlIGFwcGxpY2F0aW9uIGluIHRoZSB0cmVlIHZpZXcgKHRoZSB0b3Avcm9vdCBlbnRpdHkpLCBjbGljayBvbiB0aGUgRWZmZWN0b3JzIHRhYiwgYW5kIGludm9rZSB0aGUgJ1N0b3AnIGVmZmVjdG9yLiBUaGlzIHdpbGwgY2xlYW5seSBzaHV0ZG93biBhbGwgY29tcG9uZW50cyBpbiB0aGUgYXBwbGljYXRpb24gYW5kIHJldHVybiBhbnkgY2xvdWQgbWFjaGluZXMgdGhhdCB3ZXJlIGJlaW5nIHVzZWQuCisKK1shW015IERCIEFjdGl2aXRpZXMuXShpbWFnZXMvbXktd2ViLWNsdXN0ZXItc3RvcC1jb25maXJtLnBuZyldKGltYWdlcy9teS13ZWItY2x1c3Rlci1zdG9wLWNvbmZpcm0tbGFyZ2UucG5nKQorCiAKICMjIyBOZXh0IAogCi1UaGUgW0VsYXN0aWMgV2ViIENsdXN0ZXIgRXhhbXBsZV0oe3tzaXRlLnVybH19L3VzZS9leGFtcGxlcy93ZWJjbHVzdGVyL2luZGV4Lmh0bWwpIHBhZ2UgCi1kZXRhaWxzIGhvdyB0byBidWlsZCB0aGUgZGVtbyBhcHBsaWNhdGlvbiBmcm9tIHNjcmF0Y2guIEl0IHNob3dzIGhvdyBCcm9va2x5biBjYW4gCi1jb21wbGVtZW50IHlvdXIgYXBwbGljYXRpb24gd2l0aCBwb2xpY3kgZHJpdmVuIG1hbmFnZW1lbnQsIGFuZCBob3cgYW4gYXBwbGljYXRpb24gY2FuIGJlIAotcnVuIHdpdGhvdXQgdXNpbmcgdGhlIHNlcnZpY2UgY2F0YWxvZy4KK1NvIGZhciB3ZSBoYXZlIHRvdWNoZWQgb24gQnJvb2tseW4ncyBhYmlsaXR5IHRvICpkZXBsb3kqIGFuIGFwcGxpY2F0aW9uIGJsdWVwcmludCB0byBhIGNsb3VkIHByb3ZpZGVyLCBidXQgdGhpcyBhIHZlcnkgc21hbGwgcGFydCBvZiBCcm9va2x5bidzIGNhcGFiaWxpdGllcyEKKworQnJvb2tseW4ncyByZWFsIHBvd2VyIGlzIGluIHVzaW5nIFBvbGljaWVzIHRvIGF1dG9tYXRpY2FsbHkgKm1hbmFnZSogYXBwbGljYXRpb25zLiBUaGVyZSBpcyBhbHNvIHRoZSAodmVyeSB1c2VmdWwpIGFiaWxpdHkgdG8gc3RvcmUgYSBjYXRhbG9nIG9mIGFwcGxpY2F0aW9uIGJsdWVwcmludHMsIHJlYWR5IHRvIGdvLgorCitbR2V0dGluZyBTdGFydGVkIC0gUG9saWNpZXMgYW5kIENhdGFsb2dzXShwb2xpY2llcy1hbmQtY2F0YWxvZ3MuaHRtbCkKZGlmZiAtLWdpdCBhL2RvY3MvdXNlL2d1aWRlL3F1aWNrc3RhcnQvbXktd2ViLWNsdXN0ZXIueWFtbCBiL2RvY3MvdXNlL2d1aWRlL3F1aWNrc3RhcnQvbXktd2ViLWNsdXN0ZXIueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmFmYTAwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy91c2UvZ3VpZGUvcXVpY2tzdGFydC9teS13ZWItY2x1c3Rlci55YW1sCkBAIC0wLDAgKzEsMTkgQEAKK25hbWU6IE15IFdlYiBDbHVzdGVyCitsb2NhdGlvbjogbG9jYXRpb24KK3NlcnZpY2VzOgorCistIHNlcnZpY2VUeXBlOiBicm9va2x5bi5lbnRpdHkud2ViYXBwLkNvbnRyb2xsZWREeW5hbWljV2ViQXBwQ2x1c3RlcgorICBuYW1lOiBNeSBXZWIKKyAgYnJvb2tseW4uY29uZmlnOgorICAgIHdhcnMucm9vdDogaHR0cDovL3NlYXJjaC5tYXZlbi5vcmcvcmVtb3RlY29udGVudD9maWxlcGF0aD1pby9icm9va2x5bi9leGFtcGxlL2Jyb29rbHluLWV4YW1wbGUtaGVsbG8td29ybGQtc3FsLXdlYmFwcC97eyBzaXRlLmJyb29rbHluLXZlcnNpb24gfX0vYnJvb2tseW4tZXhhbXBsZS1oZWxsby13b3JsZC1zcWwtd2ViYXBwLXt7IHNpdGUuYnJvb2tseW4tdmVyc2lvbiB9fS53YXIKKyAgICBqYXZhLnN5c3Byb3BzOgorICAgICAgYnJvb2tseW4uZXhhbXBsZS5kYi51cmw6ID4KKyAgICAgICAgJGJyb29rbHluOmZvcm1hdFN0cmluZygiamRiYzolcyVzP3VzZXI9JXNcXCZwYXNzd29yZD0lcyIsCisgICAgICAgIGNvbXBvbmVudCgiZGIiKS5hdHRyaWJ1dGVXaGVuUmVhZHkoImRhdGFzdG9yZS51cmwiKSwKKyAgICAgICAgInZpc2l0b3JzIiwgImJyb29rbHluIiwgImJyMDBrMTFuIikKKworLSBzZXJ2aWNlVHlwZTogYnJvb2tseW4uZW50aXR5LmRhdGFiYXNlLm15c3FsLk15U3FsTm9kZQorICBpZDogZGIKKyAgbmFtZTogTXkgREIKKyAgYnJvb2tseW4uY29uZmlnOgorICAgIGNyZWF0aW9uU2NyaXB0VXJsOiBodHRwczovL2JpdC5seS9icm9va2x5bi12aXNpdG9ycy1jcmVhdGlvbi1zY3JpcHQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3VzZS9ndWlkZS9xdWlja3N0YXJ0L3BvbGljaWVzLWFuZC1jYXRhbG9ncy5tZCBiL2RvY3MvdXNlL2d1aWRlL3F1aWNrc3RhcnQvcG9saWNpZXMtYW5kLWNhdGFsb2dzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYTA2ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3VzZS9ndWlkZS9xdWlja3N0YXJ0L3BvbGljaWVzLWFuZC1jYXRhbG9ncy5tZApAQCAtMCwwICsxLDY2IEBACistLS0KK3RpdGxlOiBHZXR0aW5nIFN0YXJ0ZWQgLSBQb2xpY2llcyBhbmQgQ2F0YWxvZ3MKK2xheW91dDogcGFnZQordG9jOiAuLi9ndWlkZV90b2MuanNvbgorY2F0ZWdvcmllczogW3VzZSwgZ3VpZGVdCistLS0KKworeyUgaW5jbHVkZSBmaWVsZHMubWQgJX0KKworSW4gdGhlIFtwcmV2aW91cyBzdGVwXShpbmRleC5odG1sKSB3ZSBkb3dubG9hZGVkIEJyb29rbHluIGFuZCB1c2VkIGl0IHRvIGRlcGxveSBhbiBhcHBsaWNhdGlvbiB0byBhIGNsb3VkLCBidXQgYXQgaXRzIGhlYXJ0IEJyb29rbHluIGlzIGEgcG9saWN5IGRyaXZlbiAqbWFuYWdlbWVudCogcGxhbmUuCisKK0hlcmUgd2Ugd2lsbCBpbnRyb2R1Y2UgUG9saWNlcyB1c2luZyBhIHNpbXBsZSBkZW1vIGFwcCwgd2hpY2ggd2Ugd2lsbCBsb2FkIGZyb20gYSBTZXJ2aWNlIENhdGFsb2cuCisKKyMjIFNlcnZpY2UgQ2F0YWxvZ3MKKworRG93bmxvYWQgdGhlIHRlbXBsYXRlIFtjYXRhbG9nLnhtbF0oY2F0YWxvZy54bWwpIHRvIHlvdXIgYH4vLmJyb29rbHluL2AgZm9sZGVyLCBhbmQgcmVsYXVuY2ggQnJvb2tseW4uCisKK3slIGhpZ2hsaWdodCBiYXNoICV9CiskIGNkIH4vLmJyb29rbHluCiskIHdnZXQge3tzaXRlLnVybH19L3VzZS9ndWlkZS9xdWlja3N0YXJ0L2NhdGFsb2cueG1sCisKKyQgYnJvb2tseW4gbGF1bmNoCit7JSBlbmRoaWdobGlnaHQgJX0KKworTm93IHdoZW4gd2Ugb3BlbiB0aGUgd2ViIGNvbnNvbGUsIHR3byBhcHBsaWNhdGlvbnMgYXJlIGRpc3BsYXllZCBmcm9tIHRoZSBjYXRhbG9nLgorCitTZWxlY3QgdGhlICdEZW1vIFdlYiBDbHVzdGVyIHdpdGggREInIGFuZCBjbGljayAnTmV4dCcuCisKK1shW1ZpZXdpbmcgQ2F0YWxvZyBlbnRyaWVzIGluIEFkZCBBcHBsaWNhdGlvbiBkaWFsb2cuXShpbWFnZXMvYWRkLWFwcGxpY2F0aW9uLWNhdGFsb2ctd2ViLWNsdXN0ZXItd2l0aC1kYi5wbmcpXShhZGQtYXBwbGljYXRpb24tY2F0YWxvZy13ZWItY2x1c3Rlci13aXRoLWRiLWxhcmdlYS5wbmcpCisKK1NlbGVjdCB0aGUgTG9jYXRpb24gdGhhdCBCcm9va2x5biBzaG91bGQgZGVwbG95IHRvLCBhbmQgbmFtZSB5b3VyIGFwcGxpY2F0aW9uOgorCitbIVtTZWxlY3RpbmcgYSBsb2NhdGlvbiBhbmQgYXBwbGljYXRpb24gbmFtZS5dKGltYWdlcy9hZGQtYXBwbGljYXRpb24tY2F0YWxvZy13ZWItY2x1c3Rlci13aXRoLWRiLWxvY2F0aW9uLnBuZyldKGltYWdlcy9hZGQtYXBwbGljYXRpb24tY2F0YWxvZy13ZWItY2x1c3Rlci13aXRoLWRiLWxvY2F0aW9uLWxhcmdlLnBuZykKKworQ2xpY2sgJ0ZpbmlzaCcgdG8gbGF1bmNoIHRoZSBhcHBsaWNhdGlvbiBhcyBiZWZvcmUuCisKKworIyMjIEV4cGxvcmluZyBhbmQgVGVzdGluZyBQb2xpY2llcworCitUaGUgRGVtbyBXZWIgQ2x1c3RlciB3aXRoIERCIGFwcGxpY2F0aW9uIGlzIHByZS1jb25maWd1cmVkIHdpdGggdHdvIHBvbGljZXMuCisKK1RoZSBhcHAgc2VydmVyIGNsdXN0ZXIgaGFzIGFuIGBBdXRvU2NhbGVyUG9saWN5YCwgYW5kIHRoZSBsb2FkYmFsYW5jZXIgaGFzIGEgYHRhcmdldHNgIHBvbGljeS4KKworVXNlIHRoZSBBcHBsaWNhdGlvbnMgdGFiIGluIHRoZSB3ZWIgY29uc29sZSB0byBkcmlsbCBkb3duIGludG8gdGhlIFBvbGljaWVzIHNlY3Rpb24gb2YgdGhlIENvbnRyb2xsZWREeW5hbWljV2ViQXBwQ2x1c3RlcidzIENsdXN0ZXIgb2YgSkJvc3M3U2VydmVycy4KKworWW91IHdpbGwgc2VlIHRoYXQgdGhlIGBBdXRvU2NhbGVyUG9saWN5YCBpcyBydW5uaW5nLgorCitbIVtJbnNwZWN0aW5nIHRoZSBqYm9zczcgY2x1c3RlciBwb2xpY2llcy5dKGltYWdlcy9qYm9zczctY2x1c3Rlci1wb2xpY2llcy5wbmcpXShpbWFnZXMvamJvc3M3LWNsdXN0ZXItcG9saWNpZXMtbGFyZ2UucG5nKQorCisKK1RoaXMgcG9saWN5IGF1dG9tYXRpY2FsbHkgc2NhbGVzIHRoZSBjbHVzdGVyIHVwIG9yIGRvd24gdG8gYmUgdGhlIHJpZ2h0IHNpemUgZm9yIHRoZSBjbHVzdGVyJ3MgY3VycmVudCBsb2FkLiAoT25lIHNlcnZlciBpcyB0aGUgbWluaW11bSBzaXplIGFsbG93ZWQgYnkgdGhlIHBvbGljeS4pCisKK1RoZSBsb2FkYmFsYW5jZXIncyBgdGFyZ2V0c2AgcG9saWN5IGVuc3VyZXMgdGhhdCB0aGUgbG9hZGJhbGFuY2VyIGlzIHVwZGF0ZWQgYXMgdGhlIGNsdXN0ZXIgc2l6ZSBjaGFuZ2VzLgorCitTaXR0aW5nIGlkbGUsIHRoaXMgY2x1c3RlciB3aWxsIG9ubHkgY29udGFpbiBvbmUgc2VydmVyLCBidXQgeW91IGNhbiB1c2UgYSB0b29sIGxpa2UgW2ptZXRlcl0oaHR0cDovL2ptZXRlci5hcGFjaGUub3JnLykgcG9pbnRlZCBhdCB0aGUgbmdpbnggZW5kcG9pbnQgdG8gY3JlYXRlIGxvYWQgb24gdGhlIGNsdXN0ZXIuIChEb3dubG9hZCBhIFtqbWV0ZXIgdGVzdCBwbGFuXShodHRwczovL2dpdGh1Yi5jb20vYnJvb2tseW5jZW50cmFsL2Jyb29rbHluL2Jsb2IvbWFzdGVyL2V4YW1wbGVzL3NpbXBsZS13ZWItY2x1c3Rlci9yZXNvdXJjZXMvam1ldGVyLXRlc3QtcGxhbi5qbXgpLikKKworQXMgbG9hZCBpcyBhZGRlZCwgQnJvb2tseW4gcmVxdWVzdHMgYSBuZXcgY2xvdWQgbWFjaGluZSwgY3JlYXRlcyBhIG5ldyBhcHAgc2VydmVyLCBhbmQgYWRkcyBpdCB0byB0aGUgY2x1c3Rlci4gQXMgbG9hZCBpcyByZW1vdmVkLCBzZXJ2ZXJzIGFyZSByZW1vdmVkIGZyb20gdGhlIGNsdXN0ZXIsIGFuZCB0aGUgaW5mcmFzdHJ1Y3R1cmUgaXMgaGFuZGVkIGJhY2sgdG8gdGhlIGNsb3VkLgorCisjIyMgTmV4dAorCitUaGUgW0VsYXN0aWMgV2ViIENsdXN0ZXIgRXhhbXBsZV0oe3tzaXRlLnVybH19L3VzZS9leGFtcGxlcy93ZWJjbHVzdGVyL2luZGV4Lmh0bWwpIHBhZ2UKK2RldGFpbHMgaG93IHRvIGJ1aWxkIHRoaXMgZGVtbyBhcHBsaWNhdGlvbiBmcm9tIHNjcmF0Y2ggaW4gSmF2YS4gSXQgc2hvd3MgaW4gbW9yZSBkZXRhaWwgaG93IEJyb29rbHluIGNhbgorY29tcGxlbWVudCB5b3VyIGFwcGxpY2F0aW9uIHdpdGggcG9saWN5IGRyaXZlbiBtYW5hZ2VtZW50LCBhbmQgaG93IGFwcGxpY2F0aW9ucyBjYW4gYmUKK3J1biBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCisKKwpkaWZmIC0tZ2l0IGEvZG9jcy91c2UvZ3VpZGUvcXVpY2tzdGFydC90b2MuanNvbiBiL2RvY3MvdXNlL2d1aWRlL3F1aWNrc3RhcnQvdG9jLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY1ZWRkYgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvdXNlL2d1aWRlL3F1aWNrc3RhcnQvdG9jLmpzb24KQEAgLTAsMCArMSw0IEBACitbeyAidGl0bGUiOiAiRG93bmxvYWQgJiBEZXBsb3kiLAorICAiZmlsZSI6ICAie3sgc2l0ZS51cmwgfX0vdXNlL2d1aWRlL3F1aWNrc3RhcnQvaW5kZXguaHRtbCIgfSwKK3sgInRpdGxlIjogIlBvbGljaWVzICYgQ2F0YWxvZ3MiLAorICAiZmlsZSI6ICAie3sgc2l0ZS51cmwgfX0vdXNlL2d1aWRlL3F1aWNrc3RhcnQvcG9saWNpZXMtYW5kLWNhdGFsb2dzLmh0bWwiIH1dCmRpZmYgLS1naXQgYS9kb2NzL3VzZS9ndWlkZS90b2MuanNvbiBiL2RvY3MvdXNlL2d1aWRlL3RvYy5qc29uCmluZGV4IDhiZGI5NTUuLjdjNGFhMTMgMTAwNjQ0Ci0tLSBhL2RvY3MvdXNlL2d1aWRlL3RvYy5qc29uCisrKyBiL2RvY3MvdXNlL2d1aWRlL3RvYy5qc29uCkBAIC0xLDEyICsxLDE1IEBACiBbCiB7ICJ0aXRsZSI6ICJRdWljayBTdGFydCIsCi0gICJmaWxlIjogICJ7eyBzaXRlLnVybCB9fS91c2UvZ3VpZGUvcXVpY2tzdGFydC9pbmRleC5odG1sIiB9LCAKKyAgImZpbGUiOiAgInt7IHNpdGUudXJsIH19L3VzZS9ndWlkZS9xdWlja3N0YXJ0L2luZGV4Lmh0bWwiLAorICAgImNoaWxkcmVuIjogeyUgcmVhZGogLi9xdWlja3N0YXJ0L3RvYy5qc29uICV9IH0sCiB7ICJ0aXRsZSI6ICJEZWZpbmluZyBBcHBsaWNhdGlvbnMiLAogICAiZmlsZSI6ICAie3sgc2l0ZS51cmwgfX0vdXNlL2d1aWRlL2RlZmluaW5nLWFwcGxpY2F0aW9ucy9iYXNpYy1jb25jZXB0cy5odG1sIiwgCiAgICJjaGlsZHJlbiI6IHslIHJlYWRqIC4vZGVmaW5pbmctYXBwbGljYXRpb25zL3RvYy5qc29uICV9IH0sCiB7ICJ0aXRsZSI6ICJNYW5hZ2VtZW50IiwKICAgImZpbGUiOiAgInt7IHNpdGUudXJsIH19L3VzZS9ndWlkZS9tYW5hZ2VtZW50L2luZGV4Lmh0bWwiICwKICAgImNoaWxkcmVuIjogeyUgcmVhZGogLi9tYW5hZ2VtZW50L3RvYy5qc29uICV9IH0sCit7ICJ0aXRsZSI6ICJMb2NhdGlvbnMiLAorICAiZmlsZSI6ICAie3sgc2l0ZS51cmwgfX0vdXNlL2d1aWRlL2xvY2F0aW9ucy9pbmRleC5odG1sIiB9LAogeyAidGl0bGUiOiAiUG9saWNpZXMiLAogICAiZmlsZSI6ICAie3sgc2l0ZS51cmwgfX0vdXNlL2d1aWRlL3BvbGljaWVzL2luZGV4Lmh0bWwiLAogICAiY2hpbGRyZW4iOiB7JSByZWFkaiAuL3BvbGljaWVzL3RvYy5qc29uICV9IH0sCmRpZmYgLS1naXQgYS9sb2NhdGlvbnMvamNsb3Vkcy9zcmMvbWFpbi9qYXZhL2Jyb29rbHluL2xvY2F0aW9uL2pjbG91ZHMvSmNsb3Vkc0xvY2F0aW9uLmphdmEgYi9sb2NhdGlvbnMvamNsb3Vkcy9zcmMvbWFpbi9qYXZhL2Jyb29rbHluL2xvY2F0aW9uL2pjbG91ZHMvSmNsb3Vkc0xvY2F0aW9uLmphdmEKaW5kZXggMzI4YmFmMy4uZTRjM2ZjZSAxMDA2NDQKLS0tIGEvbG9jYXRpb25zL2pjbG91ZHMvc3JjL21haW4vamF2YS9icm9va2x5bi9sb2NhdGlvbi9qY2xvdWRzL0pjbG91ZHNMb2NhdGlvbi5qYXZhCisrKyBiL2xvY2F0aW9ucy9qY2xvdWRzL3NyYy9tYWluL2phdmEvYnJvb2tseW4vbG9jYXRpb24vamNsb3Vkcy9KY2xvdWRzTG9jYXRpb24uamF2YQpAQCAtNDMsNiArNDMsNyBAQAogaW1wb3J0IG9yZy5qY2xvdWRzLmNvbXB1dGUuZG9tYWluLk5vZGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuamNsb3Vkcy5jb21wdXRlLmRvbWFpbi5Ob2RlTWV0YWRhdGEuU3RhdHVzOwogaW1wb3J0IG9yZy5qY2xvdWRzLmNvbXB1dGUuZG9tYWluLk5vZGVNZXRhZGF0YUJ1aWxkZXI7CitpbXBvcnQgb3JnLmpjbG91ZHMuY29tcHV0ZS5kb21haW4uT3NGYW1pbHk7CiBpbXBvcnQgb3JnLmpjbG91ZHMuY29tcHV0ZS5kb21haW4uVGVtcGxhdGU7CiBpbXBvcnQgb3JnLmpjbG91ZHMuY29tcHV0ZS5kb21haW4uVGVtcGxhdGVCdWlsZGVyOwogaW1wb3J0IG9yZy5qY2xvdWRzLmNvbXB1dGUuZG9tYWluLlRlbXBsYXRlQnVpbGRlclNwZWM7CkBAIC05OSw4ICsxMDAsMTAgQEAKIGltcG9ydCBicm9va2x5bi51dGlsLmV4Y2VwdGlvbnMuRXhjZXB0aW9uczsKIGltcG9ydCBicm9va2x5bi51dGlsLmZsYWdzLlNldEZyb21GbGFnOwogaW1wb3J0IGJyb29rbHluLnV0aWwuZmxhZ3MuVHlwZUNvZXJjaW9uczsKK2ltcG9ydCBicm9va2x5bi51dGlsLmd1YXZhLk1heWJlOwogaW1wb3J0IGJyb29rbHluLnV0aWwuaW50ZXJuYWwuc3NoLlNoZWxsVG9vbDsKIGltcG9ydCBicm9va2x5bi51dGlsLmludGVybmFsLnNzaC5Tc2hUb29sOworaW1wb3J0IGJyb29rbHluLnV0aWwuamF2YWxhbmcuRW51bXM7CiBpbXBvcnQgYnJvb2tseW4udXRpbC5qYXZhbGFuZy5SZWZsZWN0aW9uczsKIGltcG9ydCBicm9va2x5bi51dGlsLm5ldC5DaWRyOwogaW1wb3J0IGJyb29rbHluLnV0aWwubmV0Lk5ldHdvcmtpbmc7CkBAIC04NTEsNiArODU0LDE3IEBACiAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KFRlbXBsYXRlQnVpbGRlciB0YiwgQ29uZmlnQmFnIHByb3BzLCBPYmplY3QgdikgewogICAgICAgICAgICAgICAgICAgICAgICAgdGIuaW1hZ2VOYW1lTWF0Y2hlcygoKENoYXJTZXF1ZW5jZSl2KS50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgfX0pCisgICAgICAgICAgICAucHV0KE9TX0ZBTUlMWSwgbmV3IEN1c3RvbWl6ZVRlbXBsYXRlQnVpbGRlcigpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYXBwbHkoVGVtcGxhdGVCdWlsZGVyIHRiLCBDb25maWdCYWcgcHJvcHMsIE9iamVjdCB2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBNYXliZTxPc0ZhbWlseT4gb3NGYW1pbHkgPSBFbnVtcy52YWx1ZU9mSWdub3JlQ2FzZShPc0ZhbWlseS5jbGFzcywgdi50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvc0ZhbWlseS5pc0Fic2VudCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgIitPU19GQU1JTFkrIiB2YWx1ZSAiK3YpOworICAgICAgICAgICAgICAgICAgICAgICAgdGIub3NGYW1pbHkob3NGYW1pbHkuZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICB9fSkKKyAgICAgICAgICAgIC5wdXQoT1NfVkVSU0lPTl9SRUdFWCwgbmV3IEN1c3RvbWl6ZVRlbXBsYXRlQnVpbGRlcigpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYXBwbHkoVGVtcGxhdGVCdWlsZGVyIHRiLCBDb25maWdCYWcgcHJvcHMsIE9iamVjdCB2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0Yi5vc1ZlcnNpb25NYXRjaGVzKCAoKENoYXJTZXF1ZW5jZSl2KS50b1N0cmluZygpICk7CisgICAgICAgICAgICAgICAgICAgIH19KQogICAgICAgICAgICAgLnB1dChURU1QTEFURV9TUEVDLCBuZXcgQ3VzdG9taXplVGVtcGxhdGVCdWlsZGVyKCkgewogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KFRlbXBsYXRlQnVpbGRlciB0YiwgQ29uZmlnQmFnIHByb3BzLCBPYmplY3QgdikgewogICAgICAgICAgICAgICAgICAgICAgICAgdGIuZnJvbShUZW1wbGF0ZUJ1aWxkZXJTcGVjLnBhcnNlKCgoQ2hhclNlcXVlbmNlKXYpLnRvU3RyaW5nKCkpKTsKQEAgLTg2NCw3ICs4NzgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9uZSBpbiB0aGUgY29kZSwgYnV0IGluY2x1ZGVkIGhlcmUgc28gdGhhdCBpdCBpcyBpbiB0aGUgbWFwICovCiAgICAgICAgICAgICAgICAgICAgIH19KQogICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAKKyAgICAKICAgICAvKiogcHJvcGVydGllcyB3aGljaCBjYXVzZSBjdXN0b21pemF0aW9uIG9mIHRoZSBUZW1wbGF0ZU9wdGlvbnMgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1hcDxDb25maWdLZXk8Pz4sQ3VzdG9taXplVGVtcGxhdGVPcHRpb25zPiBTVVBQT1JURURfVEVNUExBVEVfT1BUSU9OU19QUk9QRVJUSUVTID0gSW1tdXRhYmxlTWFwLjxDb25maWdLZXk8Pz4sQ3VzdG9taXplVGVtcGxhdGVPcHRpb25zPmJ1aWxkZXIoKQogICAgICAgICAgICAgLnB1dChTRUNVUklUWV9HUk9VUFMsIG5ldyBDdXN0b21pemVUZW1wbGF0ZU9wdGlvbnMoKSB7CmRpZmYgLS1naXQgYS9sb2NhdGlvbnMvamNsb3Vkcy9zcmMvbWFpbi9qYXZhL2Jyb29rbHluL2xvY2F0aW9uL2pjbG91ZHMvSmNsb3Vkc0xvY2F0aW9uQ29uZmlnLmphdmEgYi9sb2NhdGlvbnMvamNsb3Vkcy9zcmMvbWFpbi9qYXZhL2Jyb29rbHluL2xvY2F0aW9uL2pjbG91ZHMvSmNsb3Vkc0xvY2F0aW9uQ29uZmlnLmphdmEKaW5kZXggNDk3MjlhMS4uMzQ5NjY3NCAxMDA2NDQKLS0tIGEvbG9jYXRpb25zL2pjbG91ZHMvc3JjL21haW4vamF2YS9icm9va2x5bi9sb2NhdGlvbi9qY2xvdWRzL0pjbG91ZHNMb2NhdGlvbkNvbmZpZy5qYXZhCisrKyBiL2xvY2F0aW9ucy9qY2xvdWRzL3NyYy9tYWluL2phdmEvYnJvb2tseW4vbG9jYXRpb24vamNsb3Vkcy9KY2xvdWRzTG9jYXRpb25Db25maWcuamF2YQpAQCAtMSwxMSArMSwxMSBAQAogcGFja2FnZSBicm9va2x5bi5sb2NhdGlvbi5qY2xvdWRzOwogCi1pbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZTsKIAogaW1wb3J0IG9yZy5qY2xvdWRzLkNvbnN0YW50czsKIGltcG9ydCBvcmcuamNsb3Vkcy5jb21wdXRlLmRvbWFpbi5JbWFnZTsKK2ltcG9ydCBvcmcuamNsb3Vkcy5jb21wdXRlLmRvbWFpbi5Pc0ZhbWlseTsKIGltcG9ydCBvcmcuamNsb3Vkcy5jb21wdXRlLmRvbWFpbi5UZW1wbGF0ZUJ1aWxkZXI7CiBpbXBvcnQgb3JnLmpjbG91ZHMuZG9tYWluLkxvZ2luQ3JlZGVudGlhbHM7CiAKQEAgLTExOCw2ICsxMTgsNyBAQAogICAgICAgICAgICAgIlRhZ3MgdG8gYmUgYXBwbGllZCB3aGVuIGNyZWF0aW5nIGEgVk0sIG9uIHN1cHBvcnRlZCBjbG91ZHMgIiArCiAgICAgICAgICAgICAiKGVpdGhlciBhIHNpbmdsZSB0YWcgYXMgYSBTdHJpbmcsIG9yIGFuIEl0ZXJhYmxlPFN0cmluZz4gb3IgU3RyaW5nW107IiArCiAgICAgICAgICAgICAibm90ZSB0aGlzIGlzIG5vdCBrZXktdmFsdWUgcGFpcnMgKGUuZy4gd2hhdCBBV1MgY2FsbHMgJ3RhZ3MnKSwgZm9yIHRoYXQgc2VlIHVzZXJNZXRhZGF0YSkiLCBudWxsKTsKKwogICAgIEBEZXByZWNhdGVkIC8qKiBAZGVwcmVjYXRlZCBzaW5jZSAwLjcuMCB1c2UgI1NUUklOR19UQUdTICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb25maWdLZXk8T2JqZWN0PiBUQUdTID0gU1RSSU5HX1RBR1M7CiAKQEAgLTE4Nyw2ICsxODgsMTEgQEAKICAgICAgICAgImltYWdlQ2hvb3NlciIsICJBbiBpbWFnZSBjaG9vc2VyIGZ1bmN0aW9uIHRvIGNvbnRyb2wgd2hpY2ggaW1hZ2VzIGFyZSBwcmVmZXJyZWQiLCAKICAgICAgICAgbmV3IEJyb29rbHluSW1hZ2VDaG9vc2VyKCkuY2hvb3NlcigpKTsKIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29uZmlnS2V5PE9zRmFtaWx5PiBPU19GQU1JTFkgPSBDb25maWdLZXlzLm5ld0NvbmZpZ0tleShPc0ZhbWlseS5jbGFzcywgIm9zRmFtaWx5IiwgCisgICAgICAgICJPUyBmYW1pbHksIGUuZy4gQ2VudE9TLCBEZWJpYW4sIFJIRUwsIFVidW50dSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29uZmlnS2V5PFN0cmluZz4gT1NfVkVSU0lPTl9SRUdFWCA9IENvbmZpZ0tleXMubmV3U3RyaW5nQ29uZmlnS2V5KCJvc1ZlcnNpb25SZWdleCIsIAorICAgICAgICAiUmVndWxhciBleHByZXNzaW9uIGZvciB0aGUgT1MgdmVyc2lvbiB0byBsb2FkIik7CisKICAgICAvLyBUT0RPCiAgICAgCiAvLyAgIm5vRGVmYXVsdFNzaEtleXMiIC0gaGludHMgdGhhdCBsb2NhbCBzc2gga2V5cyBzaG91bGQgbm90IGJlIHJlYWQgYXMgZGVmYXVsdHMKZGlmZiAtLWdpdCBhL3NvZnR3YXJlL2Jhc2Uvc3JjL21haW4vamF2YS9icm9va2x5bi9lbnRpdHkvYnJvb2tseW5ub2RlL0Jyb29rbHluTm9kZS5qYXZhIGIvc29mdHdhcmUvYmFzZS9zcmMvbWFpbi9qYXZhL2Jyb29rbHluL2VudGl0eS9icm9va2x5bm5vZGUvQnJvb2tseW5Ob2RlLmphdmEKaW5kZXggZjU4MjgyMC4uY2IyMTMwNyAxMDA2NDQKLS0tIGEvc29mdHdhcmUvYmFzZS9zcmMvbWFpbi9qYXZhL2Jyb29rbHluL2VudGl0eS9icm9va2x5bm5vZGUvQnJvb2tseW5Ob2RlLmphdmEKKysrIGIvc29mdHdhcmUvYmFzZS9zcmMvbWFpbi9qYXZhL2Jyb29rbHluL2VudGl0eS9icm9va2x5bm5vZGUvQnJvb2tseW5Ob2RlLmphdmEKQEAgLTk0LDcgKzk0LDggQEAKIAogICAgIEBTZXRGcm9tRmxhZygibGF1bmNoQ29tbWFuZENyZWF0ZXNQaWRGaWxlIikKICAgICBDb25maWdLZXk8Qm9vbGVhbj4gTEFVTkNIX0NPTU1BTkRfQ1JFQVRFU19QSURfRklMRSA9IENvbmZpZ0tleXMubmV3Qm9vbGVhbkNvbmZpZ0tleSgiYnJvb2tseW5ub2RlLmxhdW5jaC5jb21tYW5kLnBpZC51cGRhdGVkIiwKLSAgICAgICAgIldoZXRoZXIgdGhlIGxhdW5jaCBzY3JpcHQgY3JlYXRlcy91cGRhdGVzIHRoZSBQSUQgZmlsZSwgaWYgbm90IHRoZSBlbnRpdHkgd2lsbCBkbyBzbyIsIAorICAgICAgICAiV2hldGhlciB0aGUgbGF1bmNoIHNjcmlwdCBjcmVhdGVzL3VwZGF0ZXMgdGhlIFBJRCBmaWxlLCBpZiBub3QgdGhlIGVudGl0eSB3aWxsIGRvIHNvLCAiCisgICAgICAgICsgImJ1dCBub3RlIGl0IHdpbGwgbm90IG5lY2Vzc2FyaWx5IGtpbGwgc3ViLXByb2Nlc3NlcyIsIAogICAgICAgICB0cnVlKTsKIAogICAgIEBTZXRGcm9tRmxhZygiYXBwIikKZGlmZiAtLWdpdCBhL3NvZnR3YXJlL2Jhc2Uvc3JjL21haW4vamF2YS9icm9va2x5bi9lbnRpdHkvamF2YS9KYXZhQXBwVXRpbHMuamF2YSBiL3NvZnR3YXJlL2Jhc2Uvc3JjL21haW4vamF2YS9icm9va2x5bi9lbnRpdHkvamF2YS9KYXZhQXBwVXRpbHMuamF2YQppbmRleCBiNWJmYjMxLi5lYjZkMmU1IDEwMDY0NAotLS0gYS9zb2Z0d2FyZS9iYXNlL3NyYy9tYWluL2phdmEvYnJvb2tseW4vZW50aXR5L2phdmEvSmF2YUFwcFV0aWxzLmphdmEKKysrIGIvc29mdHdhcmUvYmFzZS9zcmMvbWFpbi9qYXZhL2Jyb29rbHluL2VudGl0eS9qYXZhL0phdmFBcHBVdGlscy5qYXZhCkBAIC0yMTYsNyArMjE2LDYgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBdG9taWNCb29sZWFuIGluaXRpYWxpemVkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOwogCiAgICAgLyoqIFNldHVwIHJlbmRlcmVyIGhpbnRzIGZvciB0aGUgTVhCZWFuIGF0dHJpYnV0ZXMuICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdCgpIHsKICAgICAgICAgaWYgKGluaXRpYWxpemVkLmdldCgpKSByZXR1cm47CiAgICAgICAgIHN5bmNocm9uaXplZCAoaW5pdGlhbGl6ZWQpIHsKQEAgLTIzMyw4ICsyMzIsOCBAQAogICAgICAgICAgICAgUmVuZGVyZXJIaW50cy5yZWdpc3RlcihVc2VzSmF2YU1YQmVhbnMuU1RBUlRfVElNRSwgUmVuZGVyZXJIaW50cy5kaXNwbGF5VmFsdWUoVGltZS50b0RhdGVTdHJpbmcoKSkpOwogICAgICAgICAgICAgUmVuZGVyZXJIaW50cy5yZWdpc3RlcihVc2VzSmF2YU1YQmVhbnMuVVBfVElNRSwgUmVuZGVyZXJIaW50cy5kaXNwbGF5VmFsdWUoRHVyYXRpb24ubWlsbGlzVG9TdHJpbmdSb3VuZGVkKCkpKTsKICAgICAgICAgICAgIFJlbmRlcmVySGludHMucmVnaXN0ZXIoVXNlc0phdmFNWEJlYW5zLlBST0NFU1NfQ1BVX1RJTUUsIFJlbmRlcmVySGludHMuZGlzcGxheVZhbHVlKER1cmF0aW9uLm1pbGxpc1RvU3RyaW5nUm91bmRlZCgpKSk7Ci0gICAgICAgICAgICBSZW5kZXJlckhpbnRzLnJlZ2lzdGVyKFVzZXNKYXZhTVhCZWFucy5QUk9DRVNTX0NQVV9USU1FX0ZSQUNUSU9OX0xBU1QsIFJlbmRlcmVySGludHMuZGlzcGxheVZhbHVlKER1cmF0aW9uLm1pbGxpc1RvU3RyaW5nUm91bmRlZCgpKSk7Ci0gICAgICAgICAgICBSZW5kZXJlckhpbnRzLnJlZ2lzdGVyKFVzZXNKYXZhTVhCZWFucy5QUk9DRVNTX0NQVV9USU1FX0ZSQUNUSU9OX0lOX1dJTkRPVywgUmVuZGVyZXJIaW50cy5kaXNwbGF5VmFsdWUoRHVyYXRpb24ubWlsbGlzVG9TdHJpbmdSb3VuZGVkKCkpKTsKKyAgICAgICAgICAgIFJlbmRlcmVySGludHMucmVnaXN0ZXIoVXNlc0phdmFNWEJlYW5zLlBST0NFU1NfQ1BVX1RJTUVfRlJBQ1RJT05fTEFTVCwgUmVuZGVyZXJIaW50cy5kaXNwbGF5VmFsdWUoTWF0aEZ1bmN0aW9ucy5wZXJjZW50KDQpKSk7CisgICAgICAgICAgICBSZW5kZXJlckhpbnRzLnJlZ2lzdGVyKFVzZXNKYXZhTVhCZWFucy5QUk9DRVNTX0NQVV9USU1FX0ZSQUNUSU9OX0lOX1dJTkRPVywgUmVuZGVyZXJIaW50cy5kaXNwbGF5VmFsdWUoTWF0aEZ1bmN0aW9ucy5wZXJjZW50KDQpKSk7CiAKICAgICAgICAgICAgIGluaXRpYWxpemVkLnNldCh0cnVlKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdXNhZ2UvY2xpL3NyYy9tYWluL2phdmEvYnJvb2tseW4vY2xpL01haW4uamF2YSBiL3VzYWdlL2NsaS9zcmMvbWFpbi9qYXZhL2Jyb29rbHluL2NsaS9NYWluLmphdmEKaW5kZXggOGQzMmM5My4uZDkwNjlhNCAxMDA2NDQKLS0tIGEvdXNhZ2UvY2xpL3NyYy9tYWluL2phdmEvYnJvb2tseW4vY2xpL01haW4uamF2YQorKysgYi91c2FnZS9jbGkvc3JjL21haW4vamF2YS9icm9va2x5bi9jbGkvTWFpbi5qYXZhCkBAIC01MDEsNyArNTAxLDcgQEAKICAgICAgICAgICAgICAgICBzdG9wQWxsQXBwcyhjdHguZ2V0QXBwbGljYXRpb25zKCkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBCbG9jayBmb3JldmVyIHNvIHRoYXQgQnJvb2tseW4gZG9lc24ndCBleGl0ICh1bnRpbCBzb21lb25lIGRvZXMgY250cmwtYyBvciBraWxsKQotICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJMYXVuY2hlZCBCcm9va2x5bjsgbm93IGJsb2NraW5nIHRvIHdhaXQgZm9yIGNudHJsLWMgb3Iga2lsbCIpOworICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJMYXVuY2hlZCBCcm9va2x5bjsgd2lsbCBub3cgYmxvY2sgdW50aWwgc2h1dGRvd24gaXNzdWVkLiBTaHV0ZG93biB2aWEgR1VJIG9yIEFQSSBvciBwcm9jZXNzIGludGVycnVwdC4iKTsKICAgICAgICAgICAgICAgICB3YWl0VW50aWxJbnRlcnJ1cHRlZCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS91dGlscy9jb21tb24vc3JjL21haW4vamF2YS9icm9va2x5bi91dGlsL2NvbGxlY3Rpb25zL011dGFibGVTZXQuamF2YSBiL3V0aWxzL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2Jyb29rbHluL3V0aWwvY29sbGVjdGlvbnMvTXV0YWJsZVNldC5qYXZhCmluZGV4IDZlNDMxMmEuLmY3OTE5NDkgMTAwNjQ0Ci0tLSBhL3V0aWxzL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2Jyb29rbHluL3V0aWwvY29sbGVjdGlvbnMvTXV0YWJsZVNldC5qYXZhCisrKyBiL3V0aWxzL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2Jyb29rbHluL3V0aWwvY29sbGVjdGlvbnMvTXV0YWJsZVNldC5qYXZhCkBAIC04LDYgKzgsNyBAQAogCiBpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKIAogcHVibGljIGNsYXNzIE11dGFibGVTZXQ8Vj4gZXh0ZW5kcyBMaW5rZWRIYXNoU2V0PFY+IHsKQEAgLTEwOSw2ICsxMTAsNyBAQAogICAgICAgICBwdWJsaWMgTXV0YWJsZVNldDxWPiBidWlsZCgpIHsKICAgICAgICAgICByZXR1cm4gbmV3IE11dGFibGVTZXQ8Vj4ocmVzdWx0KTsKICAgICAgICAgfQorICAgICAgICAKICAgICB9CiAgICAgCiAgICAgcHVibGljIGJvb2xlYW4gYWRkSWZOb3ROdWxsKFYgZSkgewpkaWZmIC0tZ2l0IGEvdXRpbHMvY29tbW9uL3NyYy9tYWluL2phdmEvYnJvb2tseW4vdXRpbC9tYXRoL01hdGhGdW5jdGlvbnMuamF2YSBiL3V0aWxzL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2Jyb29rbHluL3V0aWwvbWF0aC9NYXRoRnVuY3Rpb25zLmphdmEKaW5kZXggYzcwY2RmYy4uZGJmNTYwNCAxMDA2NDQKLS0tIGEvdXRpbHMvY29tbW9uL3NyYy9tYWluL2phdmEvYnJvb2tseW4vdXRpbC9tYXRoL01hdGhGdW5jdGlvbnMuamF2YQorKysgYi91dGlscy9jb21tb24vc3JjL21haW4vamF2YS9icm9va2x5bi91dGlsL21hdGgvTWF0aEZ1bmN0aW9ucy5qYXZhCkBAIC0yLDYgKzIsOCBAQAogCiBpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKIAoraW1wb3J0IGJyb29rbHluLnV0aWwudGV4dC5TdHJpbmdzOworCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5GdW5jdGlvbjsKIAogcHVibGljIGNsYXNzIE1hdGhGdW5jdGlvbnMgewpAQCAtNjEsNSArNjMsMjUgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfTsKICAgICB9Ci0gICAgCisKKyAgICAvKiogcmV0dXJucyBhIHN0cmluZyBvZiB1cCB0byBtYXhMZW4gbGVuZ3RoIChsb25nZXIgaW4gZXh0cmVtZSBjYXNlcykgYWxzbyBjYXBwZWQgYXQgc2lnbmlmaWNhbnREaWdpdHMgc2lnbmlmaWNhbnREaWdpdHMgKi8KKyAgICBwdWJsaWMgc3RhdGljIEZ1bmN0aW9uPE51bWJlciwgU3RyaW5nPiByZWFkYWJsZVN0cmluZyhmaW5hbCBpbnQgc2lnbmlmaWNhbnREaWdpdHMsIGZpbmFsIGludCBtYXhMZW4pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxOdW1iZXIsIFN0cmluZz4oKSB7CisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGFwcGx5KEBOdWxsYWJsZSBOdW1iZXIgaW5wdXQpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5wdXQ9PW51bGwpIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmdzLm1ha2VSZWFsU3RyaW5nKGlucHV0LmRvdWJsZVZhbHVlKCksIG1heExlbiwgc2lnbmlmaWNhbnREaWdpdHMsIDApOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKiByZXR1cm5zIGEgc3RyaW5nIHdoZXJlIHRoZSBpbnB1dCBudW1iZXIgaXMgZXhwcmVzc2VkIGFzIHBlcmNlbnQsIHdpdGggZ2l2ZW4gbnVtYmVyIG9mIHNpZ25pZmljYW50IGRpZ2l0cyAqLworICAgIHB1YmxpYyBzdGF0aWMgRnVuY3Rpb248TnVtYmVyLCBTdHJpbmc+IHBlcmNlbnQoZmluYWwgaW50IHNpZ25pZmljYW50RGlnaXRzKSB7CisgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb248TnVtYmVyLCBTdHJpbmc+KCkgeworICAgICAgICAgICAgcHVibGljIFN0cmluZyBhcHBseShATnVsbGFibGUgTnVtYmVyIGlucHV0KSB7CisgICAgICAgICAgICAgICAgaWYgKGlucHV0PT1udWxsKSByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVhZGFibGVTdHJpbmcoc2lnbmlmaWNhbnREaWdpdHMsIHNpZ25pZmljYW50RGlnaXRzKzMpLmFwcGx5KGlucHV0LmRvdWJsZVZhbHVlKCkgKiAxMDBkKSsiJSI7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCiB9CmRpZmYgLS1naXQgYS91dGlscy9jb21tb24vc3JjL21haW4vamF2YS9icm9va2x5bi91dGlsL3NzaC9JcHRhYmxlc0NvbW1hbmRzLmphdmEgYi91dGlscy9jb21tb24vc3JjL21haW4vamF2YS9icm9va2x5bi91dGlsL3NzaC9JcHRhYmxlc0NvbW1hbmRzLmphdmEKaW5kZXggMmZhYzJhNi4uNmY5NzFhMCAxMDA2NDQKLS0tIGEvdXRpbHMvY29tbW9uL3NyYy9tYWluL2phdmEvYnJvb2tseW4vdXRpbC9zc2gvSXB0YWJsZXNDb21tYW5kcy5qYXZhCisrKyBiL3V0aWxzL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2Jyb29rbHluL3V0aWwvc3NoL0lwdGFibGVzQ29tbWFuZHMuamF2YQpAQCAtMTUsOSArMTUsNyBAQAogICAgICAgICBBQ0NFUFQsIFJFSkVDVCwgRFJPUCwgTE9HCiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMC43OyB1c2Uge0BsaW5rIGJyb29rbHluLnV0aWwubmV0LlByb3RvY29sfQotICAgICAqLworICAgIC8qKiogQGRlcHJlY2F0ZWQgc2luY2UgMC43OyB1c2Uge0BsaW5rIGJyb29rbHluLnV0aWwubmV0LlByb3RvY29sfSAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGVudW0gUHJvdG9jb2wgewogICAgICAgICBUQ1AoInRjcCIpLCBVRFAoInVkcCIpLCBBTEwoImFsbCIpOwpAQCAtMzIsMTggKzMwLDI1IEBACiAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2w7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgYnJvb2tseW4udXRpbC5uZXQuUHJvdG9jb2wgY29udmVydCgpIHsKICAgICAgICAgICAgIHN3aXRjaCAodGhpcykgewotICAgICAgICAgICAgICAgIGNhc2UgVENQIDogcmV0dXJuIGJyb29rbHluLnV0aWwubmV0LlByb3RvY29sLlRDUDsKLSAgICAgICAgICAgICAgICBjYXNlIFVEUCA6IHJldHVybiBicm9va2x5bi51dGlsLm5ldC5Qcm90b2NvbC5VRFA7Ci0gICAgICAgICAgICAgICAgY2FzZSBBTEwgOiByZXR1cm4gYnJvb2tseW4udXRpbC5uZXQuUHJvdG9jb2wuQUxMOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBwcm90b2NvbCAiK3RoaXMpOworICAgICAgICAgICAgICAgIGNhc2UgVENQOiByZXR1cm4gYnJvb2tseW4udXRpbC5uZXQuUHJvdG9jb2wuVENQOworICAgICAgICAgICAgICAgIGNhc2UgVURQOiByZXR1cm4gYnJvb2tseW4udXRpbC5uZXQuUHJvdG9jb2wuVURQOworICAgICAgICAgICAgICAgIGNhc2UgQUxMOiByZXR1cm4gYnJvb2tseW4udXRpbC5uZXQuUHJvdG9jb2wuQUxMOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuZXhwZWN0ZWQgcHJvdG9jb2wgIit0aGlzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAogICAgIEBCZXRhIC8vIGltcGxlbWVudGF0aW9uIG5vdCBwb3J0YWJsZSBhY3Jvc3MgZGlzdHJvcworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGlwdGFibGVzU2VydmljZShTdHJpbmcgY21kKSB7CisgICAgICAgIHJldHVybiBzdWRvKEJhc2hDb21tYW5kcy5hbHRlcm5hdGl2ZXMoCisgICAgICAgICAgICAgICAgQmFzaENvbW1hbmRzLmlmRXhlY3V0YWJsZUVsc2UxKCJzZXJ2aWNlIiwgInNlcnZpY2UgaXB0YWJsZXMgIitjbWQpLAorICAgICAgICAgICAgICAgICIvc2Jpbi9zZXJ2aWNlIGlwdGFibGVzICIgKyBjbWQpKTsKKyAgICB9CisKKyAgICBAQmV0YSAvLyBpbXBsZW1lbnRhdGlvbiBub3QgcG9ydGFibGUgYWNyb3NzIGRpc3Ryb3MKICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBpcHRhYmxlc1NlcnZpY2VTdG9wKCkgewogICAgICAgICByZXR1cm4gaXB0YWJsZXNTZXJ2aWNlKCJzdG9wIik7CiAgICAgfQpAQCAtNjMsMzIgKzY4LDI5IEBACiAgICAgICAgIHJldHVybiBpcHRhYmxlc1NlcnZpY2UoInN0YXR1cyIpOwogICAgIH0KIAotICAgIEBCZXRhIC8vIGltcGxlbWVudGF0aW9uIG5vdCBwb3J0YWJsZSBhY3Jvc3MgZGlzdHJvcwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGlwdGFibGVzU2VydmljZShTdHJpbmcgY21kKSB7Ci0gICAgICAgIHJldHVybiBzdWRvKCIvc2Jpbi9zZXJ2aWNlIGlwdGFibGVzICIrY21kKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjb21tYW5kIHRoYXQgc2F2ZXMgb24gZGlzayBpcHRhYmxlcyBydWxlcywgdG8gbWFrZSB0aGVtIHJlc2lsaWVudCB0byByZWJvb3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvbW1hbmQgdGhhdCBzYXZlcyBvbiBkaXNrIGlwdGFibGVzIHJ1bGVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmVJcHRhYmxlc1J1bGVzKCkgeworICAgICAgICByZXR1cm4gQmFzaENvbW1hbmRzLmFsdGVybmF0aXZlcygKKyAgICAgICAgICAgICAgICBCYXNoQ29tbWFuZHMuaWZFeGVjdXRhYmxlRWxzZTEoImlwdGFibGVzLXNhdmUiLCBzdWRvKCJpcHRhYmxlcy1zYXZlIikpLAorICAgICAgICAgICAgICAgIGlwdGFibGVzU2VydmljZSgic2F2ZSIpKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBjb21tYW5kIHRoYXQgY2xlYW5zIHVwIGlwdGFibGVzIHJ1bGVzLgotICAgICAqIAorICAgICAqCiAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjb21tYW5kIHRoYXQgY2xlYW5zIHVwIGlwdGFibGVzIHJ1bGVzLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsZWFuVXBJcHRhYmxlc1J1bGVzKCkgewogICAgICAgIHJldHVybiBzdWRvKCIvc2Jpbi9pcHRhYmxlcyAtRiIpOwogICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb21tYW5kIHRoYXQgc2F2ZXMgb24gZGlzayBpcHRhYmxlcyBydWxlcywgdG8gbWFrZSB0aGVtIHJlc2lsaWVudCB0byByZWJvb3QuCi0gICAgICogCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjb21tYW5kIHRoYXQgc2F2ZXMgb24gZGlzayBpcHRhYmxlcyBydWxlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZlSXB0YWJsZXNSdWxlcygpIHsKLSAgICAgICByZXR1cm4gc3VkbygiL3NiaW4vc2VydmljZSBpcHRhYmxlcyBzYXZlIik7Ci0gICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgaXB0YWJsZXMgcnVsZXMuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvbW1hbmQgdGhhdCBsaXN0IGFsbCB0aGUgaXB0YWJsZXMgcnVsZXMuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbGlzdElwdGFibGVzUnVsZSgpIHsKQEAgLTk3LDc3ICs5OSw4NCBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgY29tbWFuZCB0aGF0IGluc2VydHMgYSBydWxlIG9uIHRvcCBvZiB0aGUgaXB0YWJsZXMnIHJ1bGVzIHRvIGFsbCBpbnRlcmZhY2VzLgotICAgICAqIAorICAgICAqCiAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjb21tYW5kIHRoYXQgaW5zZXJ0cyBhIHJ1bGUgb24gdG9wIG9mIHRoZSBpcHRhYmxlcycKICAgICAgKiAgICAgICAgIHJ1bGVzLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGluc2VydElwdGFibGVzUnVsZShDaGFpbiBjaGFpbiwgYnJvb2tseW4udXRpbC5uZXQuUHJvdG9jb2wgcHJvdG9jb2wsIGludCBwb3J0LCBQb2xpY3kgcG9saWN5KSB7CiAgICAgICAgIHJldHVybiBhZGRJcHRhYmxlc1J1bGUoIi1JIiwgY2hhaW4sIE9wdGlvbmFsLjxTdHJpbmc+IGFic2VudCgpLCBwcm90b2NvbCwgcG9ydCwgcG9saWN5KTsKICAgICB9Ci0gICAgCisKKyAgICAvKiogQGRlcHJlY2F0ZWQgc2luY2UgMC43LjA7IHVzZSB7QGxpbmsgI2luc2VydElwdGFibGVzUnVsZShDaGFpbiwgYnJvb2tseW4udXRpbC5uZXQuUHJvdG9jb2wsIGludCwgUG9saWN5KX0gKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGluc2VydElwdGFibGVzUnVsZShDaGFpbiBjaGFpbiwgUHJvdG9jb2wgcHJvdG9jb2wsIGludCBwb3J0LCBQb2xpY3kgcG9saWN5KSB7CiAgICAgICAgIHJldHVybiBpbnNlcnRJcHRhYmxlc1J1bGUoY2hhaW4sIHByb3RvY29sLmNvbnZlcnQoKSwgcG9ydCwgcG9saWN5KTsKICAgICB9Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBjb21tYW5kIHRoYXQgaW5zZXJ0cyBhIHJ1bGUgb24gdG9wIG9mIHRoZSBpcHRhYmxlcycgcnVsZXMuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvbW1hbmQgdGhhdCBpbnNlcnRzIGEgcnVsZSBvbiB0b3Agb2YgdGhlIGlwdGFibGVzJwogICAgICAqICAgICAgICAgcnVsZXMuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgaW5zZXJ0SXB0YWJsZXNSdWxlKENoYWluIGNoYWluLCBTdHJpbmcgbmV0d29ya0ludGVyZmFjZSwgYnJvb2tseW4udXRpbC5uZXQuUHJvdG9jb2wgcHJvdG9jb2wsIGludCBwb3J0LCBQb2xpY3kgcG9saWN5KSB7CiAgICAgICAgIHJldHVybiBhZGRJcHRhYmxlc1J1bGUoIi1JIiwgY2hhaW4sIE9wdGlvbmFsLm9mKG5ldHdvcmtJbnRlcmZhY2UpLCBwcm90b2NvbCwgcG9ydCwgcG9saWN5KTsKICAgICB9Ci0gICAgCisKKyAgICAvKiogQGRlcHJlY2F0ZWQgc2luY2UgMC43LjA7IHVzZSB7QGxpbmsgI2luc2VydElwdGFibGVzUnVsZShDaGFpbiwgU3RyaW5nLCBicm9va2x5bi51dGlsLm5ldC5Qcm90b2NvbCwgaW50LCBQb2xpY3kpfSAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgaW5zZXJ0SXB0YWJsZXNSdWxlKENoYWluIGNoYWluLCBTdHJpbmcgbmV0d29ya0ludGVyZmFjZSwgUHJvdG9jb2wgcHJvdG9jb2wsIGludCBwb3J0LCBQb2xpY3kgcG9saWN5KSB7CiAgICAgICAgIHJldHVybiBpbnNlcnRJcHRhYmxlc1J1bGUoY2hhaW4sIG5ldHdvcmtJbnRlcmZhY2UsIHByb3RvY29sLmNvbnZlcnQoKSwgcG9ydCwgcG9saWN5KTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBjb21tYW5kIHRoYXQgYXBwZW5kcyBhIHJ1bGUgdG8gaXB0YWJsZXMgdG8gYWxsIGludGVyZmFjZXMuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvbW1hbmQgdGhhdCBhcHBlbmRzIGEgcnVsZSB0byBpcHRhYmxlcy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBhcHBlbmRJcHRhYmxlc1J1bGUoQ2hhaW4gY2hhaW4sIGJyb29rbHluLnV0aWwubmV0LlByb3RvY29sIHByb3RvY29sLCBpbnQgcG9ydCwgUG9saWN5IHBvbGljeSkgewogICAgICAgICByZXR1cm4gYWRkSXB0YWJsZXNSdWxlKCItQSIsIGNoYWluLCBPcHRpb25hbC48U3RyaW5nPiBhYnNlbnQoKSwgcHJvdG9jb2wsIHBvcnQsIHBvbGljeSk7CiAgICAgfQotICAgIAorCisgICAgLyoqIEBkZXByZWNhdGVkIHNpbmNlIDAuNy4wOyB1c2Uge0BsaW5rICNhcHBlbmRJcHRhYmxlc1J1bGUoQ2hhaW4sIGJyb29rbHluLnV0aWwubmV0LlByb3RvY29sLCBpbnQsIFBvbGljeSl9ICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBhcHBlbmRJcHRhYmxlc1J1bGUoQ2hhaW4gY2hhaW4sIFByb3RvY29sIHByb3RvY29sLCBpbnQgcG9ydCwgUG9saWN5IHBvbGljeSkgewogICAgICAgICByZXR1cm4gYXBwZW5kSXB0YWJsZXNSdWxlKGNoYWluLCBwcm90b2NvbC5jb252ZXJ0KCksIHBvcnQsIHBvbGljeSk7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgY29tbWFuZCB0aGF0IGFwcGVuZHMgYSBydWxlIHRvIGlwdGFibGVzLgotICAgICAqIAorICAgICAqCiAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjb21tYW5kIHRoYXQgYXBwZW5kcyBhIHJ1bGUgdG8gaXB0YWJsZXMuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgYXBwZW5kSXB0YWJsZXNSdWxlKENoYWluIGNoYWluLCBTdHJpbmcgbmV0d29ya0ludGVyZmFjZSwgYnJvb2tseW4udXRpbC5uZXQuUHJvdG9jb2wgcHJvdG9jb2wsIGludCBwb3J0LCBQb2xpY3kgcG9saWN5KSB7CiAgICAgICAgIHJldHVybiBhZGRJcHRhYmxlc1J1bGUoIi1BIiwgY2hhaW4sIE9wdGlvbmFsLm9mKG5ldHdvcmtJbnRlcmZhY2UpLCBwcm90b2NvbCwgcG9ydCwgcG9saWN5KTsKICAgICB9Ci0gICAgCisKKyAgICAvKiogQGRlcHJlY2F0ZWQgc2luY2UgMC43LjA7IHVzZSB7QGxpbmsgI2FwcGVuZElwdGFibGVzUnVsZShDaGFpbiwgU3RyaW5nLCBicm9va2x5bi51dGlsLm5ldC5Qcm90b2NvbCwgaW50LCBQb2xpY3kpfSAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgYXBwZW5kSXB0YWJsZXNSdWxlKENoYWluIGNoYWluLCBTdHJpbmcgbmV0d29ya0ludGVyZmFjZSwgUHJvdG9jb2wgcHJvdG9jb2wsIGludCBwb3J0LCBQb2xpY3kgcG9saWN5KSB7CiAgICAgICAgIHJldHVybiBhcHBlbmRJcHRhYmxlc1J1bGUoY2hhaW4sIG5ldHdvcmtJbnRlcmZhY2UsIHByb3RvY29sLmNvbnZlcnQoKSwgcG9ydCwgcG9saWN5KTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBjb21tYW5kIHRoYXQgY3JlYXRlcyBhIHJ1bGUgdG8gaXB0YWJsZXMuCi0gICAgICogCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjb21tYW5kIHRoYXQgY3JlYXRlcyBhIHJ1bGUgdG8gaXB0YWJsZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvbW1hbmQgdGhhdCBjcmVhdGVzIGEgcnVsZSBmb3IgaXB0YWJsZXMuCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGFkZElwdGFibGVzUnVsZShTdHJpbmcgZGlyZWN0aW9uLCBDaGFpbiBjaGFpbiwgT3B0aW9uYWw8U3RyaW5nPiBuZXR3b3JrSW50ZXJmYWNlLCBicm9va2x5bi51dGlsLm5ldC5Qcm90b2NvbCBwcm90b2NvbCwgaW50IHBvcnQsCi0gICAgICAgICAgICBQb2xpY3kgcG9saWN5KSB7Ci0gICAgICAgIFN0cmluZyBhZGRJcHRhYmxlc1J1bGU7IAotICAgICAgICBpZihuZXR3b3JrSW50ZXJmYWNlLmlzUHJlc2VudCgpKSB7ICAKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRJcHRhYmxlc1J1bGUoU3RyaW5nIGRpcmVjdGlvbiwgQ2hhaW4gY2hhaW4sIE9wdGlvbmFsPFN0cmluZz4gbmV0d29ya0ludGVyZmFjZSwgYnJvb2tseW4udXRpbC5uZXQuUHJvdG9jb2wgcHJvdG9jb2wsIGludCBwb3J0LCBQb2xpY3kgcG9saWN5KSB7CisgICAgICAgIFN0cmluZyBhZGRJcHRhYmxlc1J1bGU7CisgICAgICAgIGlmKG5ldHdvcmtJbnRlcmZhY2UuaXNQcmVzZW50KCkpIHsKICAgICAgICAgICAgYWRkSXB0YWJsZXNSdWxlID0gU3RyaW5nLmZvcm1hdCgiL3NiaW4vaXB0YWJsZXMgJXMgJXMgLWkgJXMgLXAgJXMgLS1kcG9ydCAlZCAtaiAlcyIsIGRpcmVjdGlvbiwgY2hhaW4sIG5ldHdvcmtJbnRlcmZhY2UuZ2V0KCksIHByb3RvY29sLCBwb3J0LCBwb2xpY3kpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICBhZGRJcHRhYmxlc1J1bGUgPSBTdHJpbmcuZm9ybWF0KCIvc2Jpbi9pcHRhYmxlcyAlcyAlcyAtcCAlcyAtLWRwb3J0ICVkIC1qICVzIiwgZGlyZWN0aW9uLCBjaGFpbiwKLSAgICAgICAgICAgICAgICAgcHJvdG9jb2wsIHBvcnQsIHBvbGljeSk7CisgICAgICAgICAgIGFkZElwdGFibGVzUnVsZSA9IFN0cmluZy5mb3JtYXQoIi9zYmluL2lwdGFibGVzICVzICVzIC1wICVzIC0tZHBvcnQgJWQgLWogJXMiLCBkaXJlY3Rpb24sIGNoYWluLCBwcm90b2NvbCwgcG9ydCwgcG9saWN5KTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gc3VkbyhhZGRJcHRhYmxlc1J1bGUpOwogICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYWRkSXB0YWJsZXNSdWxlKFN0cmluZyBkaXJlY3Rpb24sIENoYWluIGNoYWluLCBPcHRpb25hbDxTdHJpbmc+IG5ldHdvcmtJbnRlcmZhY2UsIFByb3RvY29sIHByb3RvY29sLCBpbnQgcG9ydCwKLSAgICAgICAgICAgIFBvbGljeSBwb2xpY3kpIHsKKworICAgIC8qKiBAZGVwcmVjYXRlZCBzaW5jZSAwLjcuMDsgdXNlIHtAbGluayAjYWRkSXB0YWJsZXNSdWxlKFN0cmluZywgQ2hhaW4sIE9wdGlvbmFsLCBicm9va2x5bi51dGlsLm5ldC5Qcm90b2NvbCwgaW50LCBQb2xpY3kpfSAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkSXB0YWJsZXNSdWxlKFN0cmluZyBkaXJlY3Rpb24sIENoYWluIGNoYWluLCBPcHRpb25hbDxTdHJpbmc+IG5ldHdvcmtJbnRlcmZhY2UsIFByb3RvY29sIHByb3RvY29sLCBpbnQgcG9ydCwgUG9saWN5IHBvbGljeSkgewogICAgICAgICByZXR1cm4gYWRkSXB0YWJsZXNSdWxlKGRpcmVjdGlvbiwgY2hhaW4sIG5ldHdvcmtJbnRlcmZhY2UsIHByb3RvY29sLmNvbnZlcnQoKSwgcG9ydCwgcG9saWN5KTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3V0aWxzL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2Jyb29rbHluL3V0aWwvdGV4dC9TdHJpbmdzLmphdmEgYi91dGlscy9jb21tb24vc3JjL21haW4vamF2YS9icm9va2x5bi91dGlsL3RleHQvU3RyaW5ncy5qYXZhCmluZGV4IDdkMDI0YTYuLmM3NGM0NTAgMTAwNjQ0Ci0tLSBhL3V0aWxzL2NvbW1vbi9zcmMvbWFpbi9qYXZhL2Jyb29rbHluL3V0aWwvdGV4dC9TdHJpbmdzLmphdmEKKysrIGIvdXRpbHMvY29tbW9uL3NyYy9tYWluL2phdmEvYnJvb2tseW4vdXRpbC90ZXh0L1N0cmluZ3MuamF2YQpAQCAtMzI4LDEwICszMjgsMTIgQEAKIAkgKiBAcGFyYW0gc2tpcERlY2ltYWxUaHJlc2hob2xkIGlmIHBvc2l0aXZlIGl0IHdpbGwgbm90IGFkZCBhIGRlY2ltYWwgcGFydCBpZiB0aGUgZnJhY3Rpb25hbCBwYXJ0IGlzIGxlc3MgdGhhbiB0aGlzIHRocmVzaGhvbGQKIAkgKiAgICAoYnV0IGZvciBhIHZhbHVlIDMuMDAwMDEgaXQgd291bGQgc2hvdyB6ZXJvZXMsIGUuZy4gd2l0aCAzIHByZWNpc2lvbiBhbmQgcG9zaXRpdmUgdGhyZXNoaG9sZCA8PSAwLjAwMDAxIGl0IHdvdWxkIHNob3cgMy4wMCk7CiAJICogICAgaWYgemVybyBvciBuZWdhdGl2ZSB0aGVuIGRlY2ltYWwgZGlnaXRzIGFyZSBhbHdheXMgc2hvd24KLQkgKiBAcGFyYW0gdXNlRUZvclNtYWxsTnVtYmVycyB3aGV0aGVyIHRvIHVzZSBFIG5vdGF0aW9uIGZvciBudW1iZXJzIG5lYXIgemVybworCSAqIEBwYXJhbSB1c2VFRm9yU21hbGxOdW1iZXJzIHdoZXRoZXIgdG8gdXNlIEUgbm90YXRpb24gZm9yIG51bWJlcnMgbmVhciB6ZXJvIChlLmcuIDAuMDAxKQogCSAqIEByZXR1cm4gc3VjaCBhIHN0cmluZwogCSAqLwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VSZWFsU3RyaW5nKGRvdWJsZSB4LCBpbnQgbWF4bGVuLCBpbnQgcHJlYywgaW50IGxlZnRQYWRMZW4sIGRvdWJsZSBza2lwRGVjaW1hbFRocmVzaGhvbGQsIGJvb2xlYW4gdXNlRUZvclNtYWxsTnVtYmVycykgeworCSAgICBpZiAoeDwwKSByZXR1cm4gCisJICAgICAgICAiLSIrbWFrZVJlYWxTdHJpbmcoLXgsIG1heGxlbiwgcHJlYywgbGVmdFBhZExlbik7CiAJCU51bWJlckZvcm1hdCBkZiA9IERlY2ltYWxGb3JtYXQuZ2V0SW5zdGFuY2UoKTsJCQogCQkvL2RmLnNldE1heGltdW1GcmFjdGlvbkRpZ2l0cyhtYXhsZW4pOwogCQlkZi5zZXRNaW5pbXVtRnJhY3Rpb25EaWdpdHMoMCk7CmRpZmYgLS1naXQgYS91dGlscy9jb21tb24vc3JjL3Rlc3QvamF2YS9icm9va2x5bi91dGlsL21hdGgvTWF0aEZ1bmN0aW9uc1Rlc3QuamF2YSBiL3V0aWxzL2NvbW1vbi9zcmMvdGVzdC9qYXZhL2Jyb29rbHluL3V0aWwvbWF0aC9NYXRoRnVuY3Rpb25zVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1Y2YxMmMKLS0tIC9kZXYvbnVsbAorKysgYi91dGlscy9jb21tb24vc3JjL3Rlc3QvamF2YS9icm9va2x5bi91dGlsL21hdGgvTWF0aEZ1bmN0aW9uc1Rlc3QuamF2YQpAQCAtMCwwICsxLDI0IEBACitwYWNrYWdlIGJyb29rbHluLnV0aWwubWF0aDsKKworaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKKworcHVibGljIGNsYXNzIE1hdGhGdW5jdGlvbnNUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhNYXRoRnVuY3Rpb25zLnBsdXMoMykuYXBwbHkoNCksIChJbnRlZ2VyKTcpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKE1hdGhGdW5jdGlvbnMucGx1cygwLjMpLmFwcGx5KDAuNCkuZG91YmxlVmFsdWUoKSwgMC43LCAwLjAwMDAwMDAxKTsKKyAgICB9CisgICAgCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZGFibGVTdHJpbmcoKSB7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoTWF0aEZ1bmN0aW9ucy5yZWFkYWJsZVN0cmluZygzLCA1KS5hcHBseSgwLjAxMjM0NTYpLCAiMS4yM0UtMiIpOworICAgIH0KKyAgICAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQZXJjZW50KCkgeworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKE1hdGhGdW5jdGlvbnMucGVyY2VudCgzKS5hcHBseSgwLjAxMjM0NTYpLCAiMS4yMyUiKTsKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS91dGlscy9jb21tb24vc3JjL3Rlc3QvamF2YS9icm9va2x5bi91dGlsL3RleHQvU3RyaW5nc1Rlc3QuamF2YSBiL3V0aWxzL2NvbW1vbi9zcmMvdGVzdC9qYXZhL2Jyb29rbHluL3V0aWwvdGV4dC9TdHJpbmdzVGVzdC5qYXZhCmluZGV4IGIxN2JlZmEuLjlmOWI2M2IgMTAwNjQ0Ci0tLSBhL3V0aWxzL2NvbW1vbi9zcmMvdGVzdC9qYXZhL2Jyb29rbHluL3V0aWwvdGV4dC9TdHJpbmdzVGVzdC5qYXZhCisrKyBiL3V0aWxzL2NvbW1vbi9zcmMvdGVzdC9qYXZhL2Jyb29rbHluL3V0aWwvdGV4dC9TdHJpbmdzVGVzdC5qYXZhCkBAIC0yOTAsNSArMjkwLDIzIEBACiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoU3RyaW5ncy5nZXRXb3JkQ291bnQoImhlbGxvIHdvcmxkIFxuaXQncyBtZSFcbiIsIHRydWUpLCAzKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhTdHJpbmdzLmdldFdvcmRDb3VudCgiaGVsbG8gd29ybGQgXG5pdCdzIG1lIVxuIiwgZmFsc2UpLCA0KTsKICAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYWtlUmVhbFN0cmluZygpIHsKKyAgICAgICAgLy8gbGVzcyBwcmVjaXNpb24gPSBsZXNzIGxlbmd0aAorICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFN0cmluZ3MubWFrZVJlYWxTdHJpbmcoMS4yMzQ1NmQsIDQsIDIsIDApLCAiMS4yIik7CisgICAgICAgIC8vIHByZWNpc2lvbiB0cnVtcHMgbGVuZ3RoLCBhbmQgcm91bmRzCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoU3RyaW5ncy5tYWtlUmVhbFN0cmluZygxLjIzNDU2ZCwgNCwgNSwgMCksICIxLjIzNDYiKTsKKyAgICAgICAgLy8gdXNlcyBFIG5vdGF0aW9uIHdoZW4gbmVlZGVkCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoU3RyaW5ncy5tYWtlUmVhbFN0cmluZygxMjM0NTYsIDIsIDIsIDApLCAiMS4yRTUiKTsKKyAgICAgICAgLy8gYW5kIHdvcmtzIHdpdGggbmVnYXRpdmVzCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoU3RyaW5ncy5tYWtlUmVhbFN0cmluZygtMTIzNDU2LCAyLCAyLCAwKSwgIi0xLjJFNSIpOworICAgICAgICAvLyBhbmQgdmVyeSBzbWFsbCBuZWdhdGl2ZXMKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhTdHJpbmdzLm1ha2VSZWFsU3RyaW5nKC0wLjAwMDAwMDAwMDEyMzQ1NiwgMiwgMiwgMCksICItMS4yRS0xMCIpOworICAgICAgICAvLyBhbmQgMAorICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFN0cmluZ3MubWFrZVJlYWxTdHJpbmcoMC4wZCwgNCwgMiwgMCksICIwIik7CisgICAgICAgIC8vIHNraXBzIEUgbm90YXRpb24gYW5kIGdpdmVzIGV4dHJhIHByZWNpc2lvbiB3aGVuIGl0J3MgZnJlZQorICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFN0cmluZ3MubWFrZVJlYWxTdHJpbmcoMTIzNDU2LCA4LCAyLCAwKSwgIjEyMzQ1NiIpOworICAgIH0KICAgICAKIH0K