schema-shield 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +38 -12
- package/dist/formats.d.ts.map +1 -1
- package/dist/index.d.ts +14 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1445 -447
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/index.mjs +1445 -447
- package/dist/keywords/array-keywords.d.ts.map +1 -1
- package/dist/keywords/object-keywords.d.ts.map +1 -1
- package/dist/keywords/other-keywords.d.ts.map +1 -1
- package/dist/keywords/string-keywords.d.ts.map +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/deep-freeze.d.ts +5 -0
- package/dist/utils/deep-freeze.d.ts.map +1 -0
- package/dist/utils/has-changed.d.ts +2 -0
- package/dist/utils/has-changed.d.ts.map +1 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/{utils.d.ts → utils/main-utils.d.ts} +3 -6
- package/dist/utils/main-utils.d.ts.map +1 -0
- package/dist/utils/pattern-matcher.d.ts +3 -0
- package/dist/utils/pattern-matcher.d.ts.map +1 -0
- package/lib/formats.ts +402 -84
- package/lib/index.ts +494 -46
- package/lib/keywords/array-keywords.ts +215 -21
- package/lib/keywords/number-keywords.ts +1 -1
- package/lib/keywords/object-keywords.ts +218 -113
- package/lib/keywords/other-keywords.ts +229 -76
- package/lib/keywords/string-keywords.ts +97 -7
- package/lib/types.ts +4 -5
- package/lib/utils/deep-freeze.ts +208 -0
- package/lib/utils/has-changed.ts +51 -0
- package/lib/utils/index.ts +4 -0
- package/lib/utils/main-utils.ts +190 -0
- package/lib/utils/pattern-matcher.ts +66 -0
- package/package.json +1 -1
- package/dist/utils.d.ts.map +0 -1
- package/lib/utils.ts +0 -362
package/dist/index.min.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWYWxpZGF0aW9uRXJyb3IiLCJFcnJvciIsIm1lc3NhZ2UiLCJpdGVtIiwia2V5d29yZCIsImNhdXNlIiwic2NoZW1hUGF0aCIsImluc3RhbmNlUGF0aCIsImRhdGEiLCJzY2hlbWEiLCJfZ2V0Q2F1c2UiLCJwb2ludGVyIiwiaW5zdGFuY2VQb2ludGVyIiwidGhpcyIsImdldENhdXNlIiwiX2dldFRyZWUiLCJ0cmVlIiwiZ2V0VHJlZSIsImdldFBhdGgiLCJGQUlMX0ZBU1RfREVGSU5FX0VSUk9SIiwiZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXkiLCJrZXkiLCJmYWlsRmFzdCIsIktleXdvcmRFcnJvciIsImdldE5hbWVkRnVuY3Rpb24iLCJvcHRpb25zIiwiaGFzQ2hhbmdlZCIsInByZXYiLCJjdXJyZW50IiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiaSIsIk9iamVjdCIsImlzIiwiaXNPYmplY3QiLCJkZWVwQ2xvbmUiLCJvYmoiLCJjbG9uZUNsYXNzSW5zdGFuY2VzIiwic2VlbiIsIldlYWtNYXAiLCJoYXMiLCJnZXQiLCJjbG9uZSIsInN0cnVjdHVyZWRDbG9uZSIsInNldCIsImwiLCJEYXRlIiwiZ2V0VGltZSIsIlJlZ0V4cCIsInNvdXJjZSIsImZsYWdzIiwiTWFwIiwidmFsdWUiLCJlbnRyaWVzIiwiU2V0IiwidmFsdWVzIiwiYWRkIiwiQXJyYXlCdWZmZXIiLCJzbGljZSIsImlzVmlldyIsImNvbnN0cnVjdG9yIiwiYnVmZmVyIiwiQnVmZmVyIiwiZnJvbSIsIlByb21pc2UiLCJXZWFrU2V0IiwiY3JlYXRlIiwiZ2V0UHJvdG90eXBlT2YiLCJrZXlzIiwiUmVmbGVjdCIsIm93bktleXMiLCJkZXNjcmlwdG9ycyIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZXNjcmlwdG9yIiwiZGVmaW5lUHJvcGVydHkiLCJpc0NvbXBpbGVkU2NoZW1hIiwic3ViU2NoZW1hIiwibmFtZSIsImZuIiwiVVVJRF9SRUdFWCIsIkRVUkFUSU9OX1JFR0VYIiwiREFURV9USU1FX1JFR0VYIiwiVVJJX1JFR0VYIiwiRU1BSUxfUkVHRVgiLCJJUFY0X1JFR0VYIiwiSVBWNl9SRUdFWCIsIklQVjZfU0hPUlRfUkVHRVgiLCJJUFY2X0ZVTExfUkVHRVgiLCJJUFY2X0lOVkFMSURfQ0hBUl9SRUdFWCIsIklQVjZfRkFTVF9GQUlMX1JFR0VYIiwiSE9TVE5BTUVfUkVHRVgiLCJEQVRFX1JFR0VYIiwiSlNPTl9QT0lOVEVSX1JFR0VYIiwiUkVMQVRJVkVfSlNPTl9QT0lOVEVSX1JFR0VYIiwiVElNRV9SRUdFWCIsIlVSSV9SRUZFUkVOQ0VfUkVHRVgiLCJVUklfVEVNUExBVEVfUkVHRVgiLCJJUklfUkVHRVgiLCJJUklfUkVGRVJFTkNFX1JFR0VYIiwiSUROX0VNQUlMX1JFR0VYIiwiSUROX0hPU1ROQU1FX1JFR0VYIiwiQkFDS19TTEFTSF9SRUdFWCIsIkRBWVNfSU5fTU9OVEgiLCJGb3JtYXRzIiwibWF0Y2giLCJ5ZWFyU3RyIiwibW9udGhTdHIiLCJkYXlTdHIiLCJob3VyU3RyIiwibWludXRlU3RyIiwic2Vjb25kU3RyIiwieWVhciIsIk51bWJlciIsIm1vbnRoIiwiZGF5IiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsIm1heERheXMiLCJ1cmkiLCJ0ZXN0IiwiZW1haWwiLCJpcHY0IiwiaXB2NiIsImluZGV4T2YiLCJoYXNJcHY0IiwiYWRkcmVzc1BhcnRzIiwic3BsaXQiLCJpcHY0UGFydCIsInBvcCIsImlzU2hvcnRlbmVkIiwiaXB2NlBhcnQiLCJqb2luIiwiaXNJcHY2VmFsaWQiLCJoYXNJbnZhbGlkQ2hhciIsImhvc3RuYW1lIiwiZGF0ZSIsImV4ZWMiLCJyZWdleCIsImUiLCJ0aW1lIiwiZHVyYXRpb24iLCJ1dWlkIiwiaXJpIiwiVHlwZXMiLCJvYmplY3QiLCJhcnJheSIsInN0cmluZyIsIm51bWJlciIsImludGVnZXIiLCJib29sZWFuIiwibnVsbCIsInRpbWVzdGFtcCIsImludDgiLCJ1bml0OCIsImludDE2IiwidW5pdDE2IiwiaW50MzIiLCJ1bml0MzIiLCJmbG9hdDMyIiwiZmxvYXQ2NCIsImtleXdvcmRzIiwicmVxdWlyZWQiLCJkZWZpbmVFcnJvciIsImhhc093blByb3BlcnR5IiwicHJvcGVydGllcyIsInByb3BLZXlzIiwiX3Byb3BLZXlzIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwicmVxdWlyZWRLZXlzIiwiX3JlcXVpcmVkS2V5cyIsInNjaGVtYVByb3AiLCJwcm90b3R5cGUiLCJjYWxsIiwiZXJyb3IiLCIkdmFsaWRhdGUiLCJkZWZhdWx0IiwidmFsdWVTY2hlbWEiLCJ2YWxpZGF0ZSIsIm1heFByb3BlcnRpZXMiLCJtaW5Qcm9wZXJ0aWVzIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJhcElzQ29tcGlsZWQiLCJfYXBJc0NvbXBpbGVkIiwicGF0dGVybkxpc3QiLCJfcGF0dGVyblByb3BlcnRpZXNMaXN0IiwicGF0dGVyblByb3BlcnRpZXMiLCJwYXR0ZXJuIiwicHVzaCIsImoiLCJwYXR0ZXJucyIsImRhdGFLZXlzIiwicCIsInBhdHRlcm5LZXkiLCJwcm9wZXJ0eU5hbWVzIiwicG4iLCJkZXBlbmRlbmNpZXMiLCJkZXBlbmRlbmN5IiwidGhlbiIsImVsc2UiLCJkZWZpbml0aW9ucyIsIiRpZCIsIiRzY2hlbWEiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwiJGNvbW1lbnQiLCJleGFtcGxlcyIsImNvbnRlbnRNZWRpYVR5cGUiLCJjb250ZW50RW5jb2RpbmciLCJkaXNjcmltaW5hdG9yIiwibnVsbGFibGUiLCJpdGVtcyIsInNjaGVtYUl0ZW1zIiwiZGF0YUxlbmd0aCIsInNjaGVtYUl0ZW1zTGVuZ3RoIiwiaXRlbXNMZW5ndGgiLCJzY2hlbWFJdGVtIiwiZWxlbWVudHMiLCJlbGVtZW50c1NjaGVtYSIsIm1pbkl0ZW1zIiwibWF4SXRlbXMiLCJhZGRpdGlvbmFsSXRlbXMiLCJ1bmlxdWVJdGVtcyIsImxlbiIsInByaW1pdGl2ZVNlZW4iLCJ0eXBlIiwiY29udGFpbnMiLCJtaW5MZW5ndGgiLCJtYXhMZW5ndGgiLCJwYXR0ZXJuUmVnZXhwIiwiX3BhdHRlcm5SZWdleHAiLCJmb3JtYXQiLCJpbnN0YW5jZSIsImZvcm1hdFZhbGlkYXRlIiwiX2Zvcm1hdFZhbGlkYXRlIiwiZ2V0Rm9ybWF0IiwibWluaW11bSIsIm1pbiIsImV4Y2x1c2l2ZU1pbmltdW0iLCJtYXhpbXVtIiwibWF4IiwiZXhjbHVzaXZlTWF4aW11bSIsIm11bHRpcGxlT2YiLCJxdW90aWVudCIsImlzRmluaXRlIiwiYSIsImIiLCJlcHNpbG9uIiwiTWF0aCIsImFicyIsImFyZUNsb3NlRW5vdWdoIiwicm91bmQiLCJlbnVtIiwibGlzdCIsImVudW1JdGVtIiwiYWxsT2YiLCJCb29sZWFuIiwiYW55T2YiLCJvbmVPZiIsInZhbGlkQ291bnQiLCJzdWIiLCJjb25zdCIsImlmIiwibm90IiwiJHJlZiIsIl9yZXNvbHZlZFJlZiIsInJlZlBhdGgiLCJ0YXJnZXRTY2hlbWEiLCJnZXRTY2hlbWFSZWYiLCJnZXRTY2hlbWFCeUlkIiwidHlwZXMiLCJmb3JtYXRzIiwiaW1tdXRhYmxlIiwicm9vdFNjaGVtYSIsImlkUmVnaXN0cnkiLCJ2YWxpZGF0b3IiLCJhZGRUeXBlIiwiYWRkS2V5d29yZCIsImFkZEZvcm1hdCIsIm92ZXJ3cml0ZSIsImdldFR5cGUiLCJnZXRLZXl3b3JkIiwicGF0aCIsInJvb3QiLCJzdGFydHNXaXRoIiwicGFydHMiLCJwYXJ0IiwiZGVjb2RlVVJJQ29tcG9uZW50IiwicmVwbGFjZSIsImluY2x1ZGVzIiwiZGVmcyIsImVuZHNXaXRoIiwicmVzb2x2ZVBhdGgiLCJpZCIsImNvbXBpbGUiLCJjbGVhciIsImNvbXBpbGVkU2NoZW1hIiwiY29tcGlsZVNjaGVtYSIsImxpbmtSZWZlcmVuY2VzIiwiaXNTY2hlbWFMaWtlIiwiY2xvbmVkRGF0YSIsInJlcyIsInZhbGlkIiwicmVmVmFsaWRhdG9yIiwidmFsaWRhdG9ycyIsImFjdGl2ZU5hbWVzIiwiZGVmaW5lVHlwZUVycm9yIiwibWFwIiwidCIsInRyaW0iLCJ0eXBlRnVuY3Rpb25zIiwidHlwZU5hbWVzIiwiY29tYmluZWRUeXBlVmFsaWRhdG9yIiwidHlwZU1ldGhvZE5hbWUiLCJzaW5nbGVUeXBlRm4iLCJ0eXBlQWRhcHRlciIsIl9zIiwib3RoZXJLZXlzIiwia2V5T3JkZXIiLCJrZXl3b3JkRm4iLCJmbk5hbWUiLCJsaXRlcmFsS2V5d29yZHMiLCJzdWJLZXkiLCJ2IiwiY29tcG9zaXRlTmFtZSIsIm1hc3RlclZhbGlkYXRvciIsInN0YWNrIiwibm9kZSIsInRhcmdldCIsIl9kYXRhIl0sInNvdXJjZXMiOlsiLi4vbGliL3V0aWxzLnRzIiwiLi4vbGliL2Zvcm1hdHMudHMiLCIuLi9saWIvdHlwZXMudHMiLCIuLi9saWIva2V5d29yZHMudHMiLCIuLi9saWIva2V5d29yZHMvb2JqZWN0LWtleXdvcmRzLnRzIiwiLi4vbGliL2tleXdvcmRzL2FycmF5LWtleXdvcmRzLnRzIiwiLi4vbGliL2tleXdvcmRzL3N0cmluZy1rZXl3b3Jkcy50cyIsIi4uL2xpYi9rZXl3b3Jkcy9udW1iZXIta2V5d29yZHMudHMiLCIuLi9saWIva2V5d29yZHMvb3RoZXIta2V5d29yZHMudHMiLCIuLi9saWIvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcGlsZWRTY2hlbWEgfSBmcm9tIFwiLi9pbmRleFwiO1xuXG5pbnRlcmZhY2UgRXJyb3JUcmVlIHtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBrZXl3b3JkOiBzdHJpbmc7XG4gIGl0ZW0/OiBzdHJpbmcgfCBudW1iZXI7XG4gIHNjaGVtYVBhdGg6IHN0cmluZztcbiAgaW5zdGFuY2VQYXRoOiBzdHJpbmc7XG4gIGRhdGE/OiBhbnk7XG4gIGNhdXNlPzogRXJyb3JUcmVlO1xufVxuXG5leHBvcnQgY2xhc3MgVmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGl0ZW0/OiBzdHJpbmcgfCBudW1iZXI7XG4gIGtleXdvcmQ6IHN0cmluZztcbiAgY2F1c2U/OiBWYWxpZGF0aW9uRXJyb3I7XG4gIHNjaGVtYVBhdGg6IHN0cmluZyA9IFwiXCI7XG4gIGluc3RhbmNlUGF0aDogc3RyaW5nID0gXCJcIjtcbiAgZGF0YT86IGFueTtcbiAgc2NoZW1hPzogQ29tcGlsZWRTY2hlbWE7XG5cbiAgcHJpdmF0ZSBfZ2V0Q2F1c2UocG9pbnRlciA9IFwiI1wiLCBpbnN0YW5jZVBvaW50ZXIgPSBcIiNcIik6IFZhbGlkYXRpb25FcnJvciB7XG4gICAgbGV0IHNjaGVtYVBhdGggPSBgJHtwb2ludGVyfS8ke3RoaXMua2V5d29yZH1gO1xuICAgIGxldCBpbnN0YW5jZVBhdGggPSBgJHtpbnN0YW5jZVBvaW50ZXJ9YDtcbiAgICBpZiAodHlwZW9mIHRoaXMuaXRlbSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLml0ZW0gPT09IFwic3RyaW5nXCIgJiYgdGhpcy5pdGVtIGluIHRoaXMuc2NoZW1hKSB7XG4gICAgICAgIHNjaGVtYVBhdGggKz0gYC8ke3RoaXMuaXRlbX1gO1xuICAgICAgfVxuICAgICAgaW5zdGFuY2VQYXRoICs9IGAvJHt0aGlzLml0ZW19YDtcbiAgICB9XG5cbiAgICB0aGlzLmluc3RhbmNlUGF0aCA9IGluc3RhbmNlUGF0aDtcbiAgICB0aGlzLnNjaGVtYVBhdGggPSBzY2hlbWFQYXRoO1xuXG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gY2F1c2Ugb3IgdGhlIGNhdXNlIGlzIG5vdCBhIFZhbGlkYXRpb25FcnJvciwgcmV0dXJuIHRoaXNcbiAgICBpZiAoIXRoaXMuY2F1c2UgfHwgISh0aGlzLmNhdXNlIGluc3RhbmNlb2YgVmFsaWRhdGlvbkVycm9yKSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY2F1c2UuX2dldENhdXNlKHNjaGVtYVBhdGgsIGluc3RhbmNlUGF0aCk7XG4gIH1cblxuICBnZXRDYXVzZSgpOiBWYWxpZGF0aW9uRXJyb3Ige1xuICAgIHJldHVybiB0aGlzLl9nZXRDYXVzZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0VHJlZSgpOiBFcnJvclRyZWUge1xuICAgIGNvbnN0IHRyZWU6IEVycm9yVHJlZSA9IHtcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgIGtleXdvcmQ6IHRoaXMua2V5d29yZCxcbiAgICAgIGl0ZW06IHRoaXMuaXRlbSxcbiAgICAgIHNjaGVtYVBhdGg6IHRoaXMuc2NoZW1hUGF0aCxcbiAgICAgIGluc3RhbmNlUGF0aDogdGhpcy5pbnN0YW5jZVBhdGgsXG4gICAgICBkYXRhOiB0aGlzLmRhdGFcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuY2F1c2UpIHtcbiAgICAgIHRyZWUuY2F1c2UgPSB0aGlzLmNhdXNlLl9nZXRUcmVlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyZWU7XG4gIH1cblxuICBnZXRUcmVlKCk6IEVycm9yVHJlZSB7XG4gICAgdGhpcy5nZXRDYXVzZSgpO1xuICAgIHJldHVybiB0aGlzLl9nZXRUcmVlKCk7XG4gIH1cblxuICBnZXRQYXRoKCkge1xuICAgIGNvbnN0IGNhdXNlID0gdGhpcy5nZXRDYXVzZSgpO1xuICAgIHJldHVybiB7XG4gICAgICBzY2hlbWFQYXRoOiBjYXVzZS5zY2hlbWFQYXRoLFxuICAgICAgaW5zdGFuY2VQYXRoOiBjYXVzZS5pbnN0YW5jZVBhdGhcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVmaW5lRXJyb3JPcHRpb25zIHtcbiAgaXRlbT86IGFueTsgLy8gRmluYWwgaXRlbSBpbiB0aGUgc2NoZW1hUGF0aFxuICBjYXVzZT86IFZhbGlkYXRpb25FcnJvciB8IHRydWU7IC8vIENhdXNlIG9mIHRoZSBlcnJvclxuICBkYXRhPzogYW55OyAvLyBEYXRhIHRoYXQgY2F1c2VkIHRoZSBlcnJvclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlZmluZUVycm9yRnVuY3Rpb24ge1xuICAobWVzc2FnZTogc3RyaW5nLCBvcHRpb25zPzogRGVmaW5lRXJyb3JPcHRpb25zKTpcbiAgICB8IFZhbGlkYXRpb25FcnJvclxuICAgIHwgdm9pZFxuICAgIHwgdHJ1ZTtcbn1cbmNvbnN0IEZBSUxfRkFTVF9ERUZJTkVfRVJST1I6IERlZmluZUVycm9yRnVuY3Rpb24gPSAoKSA9PiB0cnVlO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXkoXG4gIGtleTogc3RyaW5nLFxuICBzY2hlbWE6IENvbXBpbGVkU2NoZW1hLFxuICBmYWlsRmFzdDogYm9vbGVhblxuKSB7XG4gIGlmIChmYWlsRmFzdCkge1xuICAgIHJldHVybiBGQUlMX0ZBU1RfREVGSU5FX0VSUk9SO1xuICB9XG5cbiAgY29uc3QgS2V5d29yZEVycm9yID0gbmV3IFZhbGlkYXRpb25FcnJvcihgSW52YWxpZCAke2tleX1gKTtcbiAgS2V5d29yZEVycm9yLmtleXdvcmQgPSBrZXk7XG4gIEtleXdvcmRFcnJvci5zY2hlbWEgPSBzY2hlbWE7XG5cbiAgY29uc3QgZGVmaW5lRXJyb3I6IERlZmluZUVycm9yRnVuY3Rpb24gPSAobWVzc2FnZSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgS2V5d29yZEVycm9yLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIEtleXdvcmRFcnJvci5pdGVtID0gb3B0aW9ucy5pdGVtO1xuICAgIEtleXdvcmRFcnJvci5jYXVzZSA9XG4gICAgICBvcHRpb25zLmNhdXNlICYmIG9wdGlvbnMuY2F1c2UgIT09IHRydWUgPyBvcHRpb25zLmNhdXNlIDogdW5kZWZpbmVkO1xuICAgIEtleXdvcmRFcnJvci5kYXRhID0gb3B0aW9ucy5kYXRhO1xuICAgIHJldHVybiBLZXl3b3JkRXJyb3I7XG4gIH07XG5cbiAgcmV0dXJuIGdldE5hbWVkRnVuY3Rpb248RGVmaW5lRXJyb3JGdW5jdGlvbj4oXG4gICAgYGRlZmluZUVycm9yXyR7a2V5fWAsXG4gICAgZGVmaW5lRXJyb3JcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0NoYW5nZWQocHJldjogYW55LCBjdXJyZW50OiBhbnkpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkocHJldikpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50KSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChwcmV2Lmxlbmd0aCAhPT0gY3VycmVudC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3VycmVudC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGhhc0NoYW5nZWQocHJldltpXSwgY3VycmVudFtpXSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBwcmV2ID09PSBcIm9iamVjdFwiICYmIHByZXYgIT09IG51bGwpIHtcbiAgICBpZiAodHlwZW9mIGN1cnJlbnQgIT09IFwib2JqZWN0XCIgfHwgY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gY3VycmVudCkge1xuICAgICAgaWYgKGhhc0NoYW5nZWQocHJldltrZXldLCBjdXJyZW50W2tleV0pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IGluIHByZXYpIHtcbiAgICAgIGlmIChoYXNDaGFuZ2VkKHByZXZba2V5XSwgY3VycmVudFtrZXldKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmlzKHByZXYsIGN1cnJlbnQpID09PSBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KGRhdGEpIHtcbiAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmIGRhdGEgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkoZGF0YSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcmVDbG9zZUVub3VnaChhLCBiLCBlcHNpbG9uID0gMWUtMTUpIHtcbiAgcmV0dXJuIE1hdGguYWJzKGEgLSBiKSA8PSBlcHNpbG9uICogTWF0aC5tYXgoTWF0aC5hYnMoYSksIE1hdGguYWJzKGIpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVURjE2TGVuZ3RoKHN0cikge1xuICBsZXQgbGVuZ3RoID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjb2RlUG9pbnQgPSBzdHIuY29kZVBvaW50QXQoaSk7XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4ZmZmZikge1xuICAgICAgaSsrO1xuICAgIH1cbiAgICBsZW5ndGgrKztcbiAgfVxuICByZXR1cm4gbGVuZ3RoO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVlcENsb25lPFQ+KFxuICBvYmo6IFQsXG4gIGNsb25lQ2xhc3NJbnN0YW5jZXMgPSBmYWxzZSxcbiAgc2VlbiA9IG5ldyBXZWFrTWFwKClcbik6IFQge1xuICBpZiAodHlwZW9mIG9iaiA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBpZiAoc2Vlbi5oYXMob2JqKSkge1xuICAgIHJldHVybiBzZWVuLmdldChvYmopO1xuICB9XG5cbiAgbGV0IGNsb25lOiBhbnk7XG5cbiAgaWYgKHR5cGVvZiBzdHJ1Y3R1cmVkQ2xvbmUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNsb25lID0gc3RydWN0dXJlZENsb25lKG9iaik7XG4gICAgc2Vlbi5zZXQob2JqLCBjbG9uZSk7XG4gICAgcmV0dXJuIGNsb25lO1xuICB9XG5cbiAgc3dpdGNoICh0cnVlKSB7XG4gICAgY2FzZSBBcnJheS5pc0FycmF5KG9iaik6IHtcbiAgICAgIGNsb25lID0gW107XG4gICAgICBzZWVuLnNldChvYmosIGNsb25lKTtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gb2JqLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBjbG9uZVtpXSA9IGRlZXBDbG9uZShvYmpbaV0sIGNsb25lQ2xhc3NJbnN0YW5jZXMsIHNlZW4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cbiAgICBjYXNlIG9iaiBpbnN0YW5jZW9mIERhdGU6IHtcbiAgICAgIGNsb25lID0gbmV3IERhdGUob2JqLmdldFRpbWUoKSk7XG4gICAgICBzZWVuLnNldChvYmosIGNsb25lKTtcbiAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9XG4gICAgY2FzZSBvYmogaW5zdGFuY2VvZiBSZWdFeHA6IHtcbiAgICAgIGNsb25lID0gbmV3IFJlZ0V4cChvYmouc291cmNlLCBvYmouZmxhZ3MpO1xuICAgICAgc2Vlbi5zZXQob2JqLCBjbG9uZSk7XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIGNhc2Ugb2JqIGluc3RhbmNlb2YgTWFwOiB7XG4gICAgICBjbG9uZSA9IG5ldyBNYXAoKTtcbiAgICAgIHNlZW4uc2V0KG9iaiwgY2xvbmUpO1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygb2JqLmVudHJpZXMoKSkge1xuICAgICAgICBjbG9uZS5zZXQoXG4gICAgICAgICAgZGVlcENsb25lKGtleSwgY2xvbmVDbGFzc0luc3RhbmNlcywgc2VlbiksXG4gICAgICAgICAgZGVlcENsb25lKHZhbHVlLCBjbG9uZUNsYXNzSW5zdGFuY2VzLCBzZWVuKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cbiAgICBjYXNlIG9iaiBpbnN0YW5jZW9mIFNldDoge1xuICAgICAgY2xvbmUgPSBuZXcgU2V0KCk7XG4gICAgICBzZWVuLnNldChvYmosIGNsb25lKTtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygb2JqLnZhbHVlcygpKSB7XG4gICAgICAgIGNsb25lLmFkZChkZWVwQ2xvbmUodmFsdWUsIGNsb25lQ2xhc3NJbnN0YW5jZXMsIHNlZW4pKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9XG4gICAgY2FzZSBvYmogaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcjoge1xuICAgICAgY2xvbmUgPSBvYmouc2xpY2UoMCk7XG4gICAgICBzZWVuLnNldChvYmosIGNsb25lKTtcbiAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9XG4gICAgLy8gVHlwZWRBcnJheXMgYW5kIERhdGFWaWV3XG4gICAgY2FzZSBBcnJheUJ1ZmZlci5pc1ZpZXcob2JqKToge1xuICAgICAgY2xvbmUgPSBuZXcgKG9iaiBhcyBhbnkpLmNvbnN0cnVjdG9yKG9iai5idWZmZXIuc2xpY2UoMCkpO1xuICAgICAgc2Vlbi5zZXQob2JqLCBjbG9uZSk7XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIC8vIE5vZGUuanMgQnVmZmVyXG4gICAgY2FzZSB0eXBlb2YgQnVmZmVyICE9PSBcInVuZGVmaW5lZFwiICYmIG9iaiBpbnN0YW5jZW9mIEJ1ZmZlcjoge1xuICAgICAgY2xvbmUgPSBCdWZmZXIuZnJvbShvYmogYXMgYW55KTtcbiAgICAgIHNlZW4uc2V0KG9iaiwgY2xvbmUpO1xuICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cbiAgICBjYXNlIG9iaiBpbnN0YW5jZW9mIEVycm9yOiB7XG4gICAgICBjbG9uZSA9IG5ldyAob2JqIGFzIGFueSkuY29uc3RydWN0b3Iob2JqLm1lc3NhZ2UpO1xuICAgICAgc2Vlbi5zZXQob2JqLCBjbG9uZSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gTm9uIGNsb25hYmxlIG9iamVjdHNcbiAgICBjYXNlIG9iaiBpbnN0YW5jZW9mIFByb21pc2UgfHxcbiAgICAgIG9iaiBpbnN0YW5jZW9mIFdlYWtNYXAgfHxcbiAgICAgIG9iaiBpbnN0YW5jZW9mIFdlYWtTZXQ6IHtcbiAgICAgIGNsb25lID0gb2JqO1xuICAgICAgc2Vlbi5zZXQob2JqLCBjbG9uZSk7XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIC8vIEluc3RhbmNlIG9mIGEgY2xhc3NcbiAgICBjYXNlIG9iai5jb25zdHJ1Y3RvciAmJiBvYmouY29uc3RydWN0b3IgIT09IE9iamVjdDoge1xuICAgICAgaWYgKCFjbG9uZUNsYXNzSW5zdGFuY2VzKSB7XG4gICAgICAgIGNsb25lID0gb2JqO1xuICAgICAgICBzZWVuLnNldChvYmosIGNsb25lKTtcbiAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgICAgfVxuICAgICAgY2xvbmUgPSBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopKTtcbiAgICAgIHNlZW4uc2V0KG9iaiwgY2xvbmUpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gUGxhaW4gb2JqZWN0c1xuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGNsb25lID0ge307XG4gICAgICBzZWVuLnNldChvYmosIGNsb25lKTtcblxuICAgICAgY29uc3Qga2V5cyA9IFJlZmxlY3Qub3duS2V5cyhvYmopO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgICBjbG9uZVtrZXkgYXMgc3RyaW5nXSA9IGRlZXBDbG9uZShcbiAgICAgICAgICAob2JqIGFzIGFueSlba2V5IGFzIHN0cmluZ10sXG4gICAgICAgICAgY2xvbmVDbGFzc0luc3RhbmNlcyxcbiAgICAgICAgICBzZWVuXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZGVzY3JpcHRvcnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvYmopO1xuICBmb3IgKGNvbnN0IGtleSBvZiBSZWZsZWN0Lm93bktleXMoZGVzY3JpcHRvcnMpKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JzW2tleSBhcyBzdHJpbmddO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikge1xuICAgICAgZGVzY3JpcHRvci52YWx1ZSA9IGRlZXBDbG9uZShkZXNjcmlwdG9yLnZhbHVlLCBjbG9uZUNsYXNzSW5zdGFuY2VzLCBzZWVuKTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNsb25lLCBrZXksIGRlc2NyaXB0b3IpO1xuICB9XG5cbiAgcmV0dXJuIGNsb25lO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb21waWxlZFNjaGVtYShzdWJTY2hlbWE6IGFueSk6IHN1YlNjaGVtYSBpcyBDb21waWxlZFNjaGVtYSB7XG4gIHJldHVybiBpc09iamVjdChzdWJTY2hlbWEpICYmIFwiJHZhbGlkYXRlXCIgaW4gc3ViU2NoZW1hO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZWRGdW5jdGlvbjxUPihuYW1lOiBzdHJpbmcsIGZuOiBUKTogVCB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sIFwibmFtZVwiLCB7IHZhbHVlOiBuYW1lIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVBhdGgocm9vdDogYW55LCBwYXRoOiBzdHJpbmcpOiBhbnkge1xuICBpZiAoIXBhdGggfHwgcGF0aCA9PT0gXCIjXCIpIHtcbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIC8vIEpTT04gUG9pbnRlclxuICBpZiAocGF0aC5zdGFydHNXaXRoKFwiIy9cIikpIHtcbiAgICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIvXCIpLnNsaWNlKDEpO1xuICAgIGxldCBjdXJyZW50ID0gcm9vdDtcblxuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgY29uc3QgZGVjb2RlZFVyaVBhcnQgPSBkZWNvZGVVUklDb21wb25lbnQocGFydCk7XG4gICAgICBjb25zdCBrZXkgPSBkZWNvZGVkVXJpUGFydC5yZXBsYWNlKC9+MS9nLCBcIi9cIikucmVwbGFjZSgvfjAvZywgXCJ+XCIpO1xuXG4gICAgICBpZiAoY3VycmVudCAmJiB0eXBlb2YgY3VycmVudCA9PT0gXCJvYmplY3RcIiAmJiBrZXkgaW4gY3VycmVudCkge1xuICAgICAgICBjdXJyZW50ID0gY3VycmVudFtrZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY3VycmVudDtcbiAgfVxuXG4gIC8vIFNpbXBsZSBsb29rdXAgYnkgZGVmaW5pdGlvbiBuYW1lIChub24tc3RhbmRhcmQsIGJ1dCB1c2VmdWwpXG4gIGlmICghcGF0aC5pbmNsdWRlcyhcIiNcIikpIHtcbiAgICBpZiAocm9vdC5kZWZpbml0aW9ucyAmJiByb290LmRlZmluaXRpb25zW3BhdGhdKSB7XG4gICAgICByZXR1cm4gcm9vdC5kZWZpbml0aW9uc1twYXRoXTtcbiAgICB9XG4gICAgaWYgKHJvb3QuZGVmcyAmJiByb290LmRlZnNbcGF0aF0pIHtcbiAgICAgIHJldHVybiByb290LmRlZnNbcGF0aF07XG4gICAgfVxuXG4gICAgaWYgKHJvb3QuJGlkICYmIHR5cGVvZiByb290LiRpZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgaWYgKHJvb3QuJGlkID09PSBwYXRoIHx8IHJvb3QuJGlkLmVuZHNXaXRoKFwiL1wiICsgcGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIHJvb3Q7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuO1xufVxuIiwiaW1wb3J0IHsgRm9ybWF0RnVuY3Rpb24gfSBmcm9tIFwiLi9pbmRleFwiO1xuXG4vLyBSZWdleCBoZWxwZXJzXG5jb25zdCBVVUlEX1JFR0VYID1cbiAgL15bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kL2k7XG4vLyBJU08gODYwMSBEdXJhdGlvbiAoUDNZNk00RFQxMkgzME01UylcbmNvbnN0IERVUkFUSU9OX1JFR0VYID1cbiAgL15QKD8hJCkoKFxcZCtZKT8oXFxkK00pPyhcXGQrVyk/KFxcZCtEKT8pKFQoPz1cXGQpKFxcZCtIKT8oXFxkK00pPyhcXGQrUyk/KT8kLztcbmNvbnN0IERBVEVfVElNRV9SRUdFWCA9XG4gIC9eKFxcZHs0fSktKDBbMC05XXwxWzAtMl0pLShcXGR7Mn0pVCgwWzAtOV18MVxcZHwyWzAtM10pOihbMC01XVxcZCk6KCg/OlswLTVdXFxkfDYwKSkoPzouXFxkKyk/KD86KFsrLV0pKDBbMC05XXwxXFxkfDJbMC0zXSk6KFswLTVdXFxkKXxaKT8kL2k7XG5jb25zdCBVUklfUkVHRVggPSAvXlthLXpBLVpdW2EtekEtWjAtOStcXC0uXSo6W15cXHNdKiQvO1xuY29uc3QgRU1BSUxfUkVHRVggPVxuICAvXig/IVxcLikoPyEuKlxcLiQpW2EtejAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dezEsMjB9KD86XFwuW2EtejAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dezEsMjF9KXswLDJ9QFthLXowLTldKD86W2EtejAtOS1dezAsNjF9W2EtejAtOV0pPyg/OlxcLlthLXowLTldKD86W2EtejAtOS1dezAsNjB9W2EtejAtOV0pPyl7MCwzfSQvaTtcbmNvbnN0IElQVjRfUkVHRVggPVxuICAvXig/Oig/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9fFsxLTldWzAtOV18WzAtOV0pXFwuKXszfSg/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9fFsxLTldWzAtOV18WzAtOV0pJC87XG5jb25zdCBJUFY2X1JFR0VYID0gLyg/Olxccyt8Ojo6K3xeXFx3ezUsfXxcXHd7NX0kfF46ezF9XFx3fFxcdzp7MX0kKS87XG5jb25zdCBJUFY2X1NIT1JUX1JFR0VYID0gL15bMC05YS1mQS1GOi5dKiQvO1xuY29uc3QgSVBWNl9GVUxMX1JFR0VYID0gL14oPzooPzpbMC05YS1mQS1GXXsxLDR9Oil7N30oPzpbMC05YS1mQS1GXXsxLDR9fDopKSQvO1xuY29uc3QgSVBWNl9JTlZBTElEX0NIQVJfUkVHRVggPSAvKD86WzAtOWEtZkEtRl17NSx9fFxcRFswLTlhLWZBLUZdezN9OikvO1xuY29uc3QgSVBWNl9GQVNUX0ZBSUxfUkVHRVggPVxuICAvXig/Oig/Oig/OlswLTlhLWZBLUZdezEsNH0oPzo6fCQpKXsxLDZ9KSl8KD86OjooPzpbMC05YS1mQS1GXXsxLDR9KSl7MCw1fSQvO1xuY29uc3QgSE9TVE5BTUVfUkVHRVggPVxuICAvXlthLXowLTldW2EtejAtOS1dezAsNjJ9KD86XFwuW2EtejAtOV1bYS16MC05LV17MCw2Mn0pKlthLXowLTldJC9pO1xuY29uc3QgREFURV9SRUdFWCA9IC9eKFxcZHs0fSktKFxcZHsyfSktKFxcZHsyfSkkLztcbmNvbnN0IEpTT05fUE9JTlRFUl9SRUdFWCA9IC9eXFwvKD86W15+XXx+MHx+MSkqJC87XG5jb25zdCBSRUxBVElWRV9KU09OX1BPSU5URVJfUkVHRVggPSAvXihbMC05XSspKCN8XFwvKD86W15+XXx+MHx+MSkqKT8kLztcbmNvbnN0IFRJTUVfUkVHRVggPVxuICAvXihbMDFdXFxkfDJbMC0zXSk6KFswLTVdXFxkKTooWzAtNV1cXGQpKFxcLlxcZCspPyhafChbKy1dKShbMDFdXFxkfDJbMC0zXSk6KFswLTVdXFxkKSkkLztcbmNvbnN0IFVSSV9SRUZFUkVOQ0VfUkVHRVggPVxuICAvXigoW146Lz8jXSspOik/KFxcL1xcLyhbXi8/I10qKSk/KFtePyNdKikoXFw/KFteI10qKSk/KCMoKD8hW14jXSpcXFxcKVteI10qKSk/L2k7XG5jb25zdCBVUklfVEVNUExBVEVfUkVHRVggPSAvXig/Oltee31dfFxce1tefV0rXFx9KSokLztcbmNvbnN0IElSSV9SRUdFWCA9IC9eW2EtekEtWl1bYS16QS1aMC05K1xcLS5dKjpbXlxcc10qJC87XG5jb25zdCBJUklfUkVGRVJFTkNFX1JFR0VYID1cbiAgL14oKFteOi8/I10rKTopPyhcXC9cXC8oW14vPyNdKikpPyhbXj8jXSopKFxcPyhbXiNdKikpPygjKCg/IVteI10qXFxcXClbXiNdKikpPy9pO1xuY29uc3QgSUROX0VNQUlMX1JFR0VYID0gL15bXkBcXHNdK0BbXkBcXHNdK1xcLlteQFxcc10rJC87XG5jb25zdCBJRE5fSE9TVE5BTUVfUkVHRVggPSAvXlteXFxzIUAjJCVeJiooKV8rXFw9XFxbXFxde307JzpcIlxcXFx8LDw+XFwvP10rJC87XG5jb25zdCBCQUNLX1NMQVNIX1JFR0VYID0gL1xcXFwvO1xuXG5jb25zdCBEQVlTX0lOX01PTlRIID0gWzMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdO1xuXG5leHBvcnQgY29uc3QgRm9ybWF0czogUmVjb3JkPHN0cmluZywgRm9ybWF0RnVuY3Rpb24gfCBmYWxzZT4gPSB7XG4gIFtcImRhdGUtdGltZVwiXShkYXRhKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBkYXRhLm1hdGNoKERBVEVfVElNRV9SRUdFWCk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IFssIHllYXJTdHIsIG1vbnRoU3RyLCBkYXlTdHIsIGhvdXJTdHIsIG1pbnV0ZVN0ciwgc2Vjb25kU3RyXSA9IG1hdGNoO1xuXG4gICAgY29uc3QgeWVhciA9IE51bWJlcih5ZWFyU3RyKTtcbiAgICBjb25zdCBtb250aCA9IE51bWJlcihtb250aFN0cik7XG4gICAgY29uc3QgZGF5ID0gTnVtYmVyKGRheVN0cik7XG4gICAgY29uc3QgaG91ciA9IE51bWJlcihob3VyU3RyKTtcbiAgICBjb25zdCBtaW51dGUgPSBOdW1iZXIobWludXRlU3RyKTtcbiAgICBjb25zdCBzZWNvbmQgPSBOdW1iZXIoc2Vjb25kU3RyKTtcblxuICAgIC8vIE1lcyAx4oCTMTJcbiAgICBpZiAobW9udGggPCAxIHx8IG1vbnRoID4gMTIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gRMOtYSA+PSAxXG4gICAgaWYgKGRheSA8IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXhEYXlzID1cbiAgICAgIG1vbnRoID09PSAyXG4gICAgICAgID8geWVhciAlIDQgPT09IDAgJiYgKHllYXIgJSAxMDAgIT09IDAgfHwgeWVhciAlIDQwMCA9PT0gMClcbiAgICAgICAgICA/IDI5XG4gICAgICAgICAgOiAyOFxuICAgICAgICA6IERBWVNfSU5fTU9OVEhbbW9udGggLSAxXTtcblxuICAgIGlmICghbWF4RGF5cyB8fCBkYXkgPiBtYXhEYXlzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gTGVhcCBzZWNvbmRzIChzaSBxdWllcmVzIHNlZ3VpciBwZXJtaXRpZW5kbyA2MClcbiAgICBpZiAoc2Vjb25kID09PSA2MCAmJiAobWludXRlICE9PSA1OSB8fCBob3VyICE9PSAyMykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgdXJpKGRhdGEpIHtcbiAgICByZXR1cm4gVVJJX1JFR0VYLnRlc3QoZGF0YSk7XG4gIH0sXG4gIGVtYWlsKGRhdGEpIHtcbiAgICByZXR1cm4gRU1BSUxfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcbiAgaXB2NChkYXRhKSB7XG4gICAgLy8gTWF0Y2hlcyBhIHN0cmluZyBmb3JtZWQgYnkgNCBudW1iZXJzIGJldHdlZW4gMCBhbmQgMjU1IHNlcGFyYXRlZCBieSBkb3RzIHdpdGhvdXQgbGVhZGluZyB6ZXJvc1xuICAgIHJldHVybiBJUFY0X1JFR0VYLnRlc3QoZGF0YSk7XG4gIH0sXG5cbiAgLy8gaXB2NjogaXNNeUlwVmFsaWQoeyB2ZXJzaW9uOiA2IH0pLFxuICBpcHY2KGRhdGEpIHtcbiAgICBpZiAoZGF0YSA9PT0gXCI6OlwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5pbmRleE9mKFwiOlwiKSA9PT0gLTEgfHwgSVBWNl9SRUdFWC50ZXN0KGRhdGEpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzSXB2NCA9IGRhdGEuaW5kZXhPZihcIi5cIikgIT09IC0xO1xuICAgIGxldCBhZGRyZXNzUGFydHMgPSBkYXRhO1xuXG4gICAgaWYgKGhhc0lwdjQpIHtcbiAgICAgIGFkZHJlc3NQYXJ0cyA9IGRhdGEuc3BsaXQoXCI6XCIpO1xuICAgICAgY29uc3QgaXB2NFBhcnQgPSBhZGRyZXNzUGFydHMucG9wKCk7XG4gICAgICBpZiAoIUlQVjRfUkVHRVgudGVzdChpcHY0UGFydCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGlzU2hvcnRlbmVkID0gZGF0YS5pbmRleE9mKFwiOjpcIikgIT09IC0xO1xuICAgIGNvbnN0IGlwdjZQYXJ0ID0gaGFzSXB2NCA/IGFkZHJlc3NQYXJ0cy5qb2luKFwiOlwiKSA6IGRhdGE7XG5cbiAgICBpZiAoaXNTaG9ydGVuZWQpIHtcbiAgICAgIGlmIChpcHY2UGFydC5zcGxpdChcIjo6XCIpLmxlbmd0aCAtIDEgPiAxKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFJUFY2X1NIT1JUX1JFR0VYLnRlc3QoaXB2NlBhcnQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIElQVjZfRkFTVF9GQUlMX1JFR0VYLnRlc3QoaXB2NlBhcnQpO1xuICAgIH1cblxuICAgIGNvbnN0IGlzSXB2NlZhbGlkID0gSVBWNl9GVUxMX1JFR0VYLnRlc3QoaXB2NlBhcnQpO1xuICAgIGNvbnN0IGhhc0ludmFsaWRDaGFyID0gSVBWNl9JTlZBTElEX0NIQVJfUkVHRVgudGVzdChpcHY2UGFydCk7XG5cbiAgICBpZiAoaGFzSXB2NCkge1xuICAgICAgcmV0dXJuIGlzSXB2NlZhbGlkIHx8ICFoYXNJbnZhbGlkQ2hhcjtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNJcHY2VmFsaWQgJiYgIWhhc0ludmFsaWRDaGFyO1xuICB9LFxuXG4gIGhvc3RuYW1lKGRhdGEpIHtcbiAgICByZXR1cm4gSE9TVE5BTUVfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcbiAgZGF0ZShkYXRhKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBEQVRFX1JFR0VYLmV4ZWMoZGF0YSk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IFssIHllYXJTdHIsIG1vbnRoU3RyLCBkYXlTdHJdID0gbWF0Y2g7XG4gICAgY29uc3QgeWVhciA9IE51bWJlcih5ZWFyU3RyKTtcbiAgICBjb25zdCBtb250aCA9IE51bWJlcihtb250aFN0cik7XG4gICAgY29uc3QgZGF5ID0gTnVtYmVyKGRheVN0cik7XG5cbiAgICBpZiAobW9udGggPCAxIHx8IG1vbnRoID4gMTIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGRheSA8IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXhEYXlzID1cbiAgICAgIG1vbnRoID09PSAyXG4gICAgICAgID8geWVhciAlIDQgPT09IDAgJiYgKHllYXIgJSAxMDAgIT09IDAgfHwgeWVhciAlIDQwMCA9PT0gMClcbiAgICAgICAgICA/IDI5XG4gICAgICAgICAgOiAyOFxuICAgICAgICA6IERBWVNfSU5fTU9OVEhbbW9udGggLSAxXTtcblxuICAgIHJldHVybiAhIW1heERheXMgJiYgZGF5IDw9IG1heERheXM7XG4gIH0sXG4gIHJlZ2V4KGRhdGEpIHtcbiAgICB0cnkge1xuICAgICAgbmV3IFJlZ0V4cChkYXRhKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG4gIFwianNvbi1wb2ludGVyXCIoZGF0YSkge1xuICAgIGlmIChkYXRhID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gSlNPTl9QT0lOVEVSX1JFR0VYLnRlc3QoZGF0YSk7XG4gIH0sXG4gIFwicmVsYXRpdmUtanNvbi1wb2ludGVyXCIoZGF0YSkge1xuICAgIGlmIChkYXRhID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gUkVMQVRJVkVfSlNPTl9QT0lOVEVSX1JFR0VYLnRlc3QoZGF0YSk7XG4gIH0sXG4gIHRpbWUoZGF0YSkge1xuICAgIHJldHVybiBUSU1FX1JFR0VYLnRlc3QoZGF0YSk7XG4gIH0sXG4gIFwidXJpLXJlZmVyZW5jZVwiKGRhdGEpIHtcbiAgICBpZiAoQkFDS19TTEFTSF9SRUdFWC50ZXN0KGRhdGEpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIFVSSV9SRUZFUkVOQ0VfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcblxuICBcInVyaS10ZW1wbGF0ZVwiKGRhdGEpIHtcbiAgICByZXR1cm4gVVJJX1RFTVBMQVRFX1JFR0VYLnRlc3QoZGF0YSk7XG4gIH0sXG5cbiAgZHVyYXRpb24oZGF0YSkge1xuICAgIHJldHVybiBEVVJBVElPTl9SRUdFWC50ZXN0KGRhdGEpO1xuICB9LFxuXG4gIHV1aWQoZGF0YSkge1xuICAgIHJldHVybiBVVUlEX1JFR0VYLnRlc3QoZGF0YSk7XG4gIH0sXG5cbiAgLy8gSVJJIGlzIGxpa2UgVVJJIGJ1dCBhbGxvd3MgVW5pY29kZS4gV2UgcmV1c2UgYSBwZXJtaXNzaXZlIGxvZ2ljLlxuICBpcmkoZGF0YSkge1xuICAgIHJldHVybiBJUklfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcblxuICBcImlyaS1yZWZlcmVuY2VcIihkYXRhKSB7XG4gICAgaWYgKEJBQ0tfU0xBU0hfUkVHRVgudGVzdChkYXRhKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gSVJJX1JFRkVSRU5DRV9SRUdFWC50ZXN0KGRhdGEpO1xuICB9LFxuXG4gIC8vIEJlc3QtZWZmb3J0IHN0cnVjdHVyYWwgdmFsaWRhdGlvbiBmb3IgSUROIChubyBwdW55Y29kZS90YWJsZXMpXG4gIFwiaWRuLWVtYWlsXCIoZGF0YSkge1xuICAgIHJldHVybiBJRE5fRU1BSUxfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcblxuICBcImlkbi1ob3N0bmFtZVwiKGRhdGEpIHtcbiAgICAvLyBBbGxvd3MgdW5pY29kZSwgZm9yYmlkcyBzcGFjZXMgYW5kIHR5cGljYWwgaW52YWxpZCBVUkwgY2hhcnNcbiAgICByZXR1cm4gSUROX0hPU1ROQU1FX1JFR0VYLnRlc3QoZGF0YSk7XG4gIH1cbn07XG4iLCJpbXBvcnQgeyBUeXBlRnVuY3Rpb24gfSBmcm9tIFwiLi9pbmRleFwiO1xuaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgY29uc3QgVHlwZXM6IFJlY29yZDxzdHJpbmcsIFR5cGVGdW5jdGlvbiB8IGZhbHNlPiA9IHtcbiAgb2JqZWN0KGRhdGEpIHtcbiAgICByZXR1cm4gaXNPYmplY3QoZGF0YSk7XG4gIH0sXG4gIGFycmF5KGRhdGEpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShkYXRhKTtcbiAgfSxcbiAgc3RyaW5nKGRhdGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCI7XG4gIH0sXG4gIG51bWJlcihkYXRhKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcIm51bWJlclwiO1xuICB9LFxuICBpbnRlZ2VyKGRhdGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwibnVtYmVyXCIgJiYgZGF0YSAlIDEgPT09IDA7XG4gIH0sXG4gIGJvb2xlYW4oZGF0YSkge1xuICAgIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gXCJib29sZWFuXCI7XG4gIH0sXG4gIG51bGwoZGF0YSkge1xuICAgIHJldHVybiBkYXRhID09PSBudWxsO1xuICB9LFxuXG4gIC8vIE5vdCBpbXBsZW1lbnRlZCB5ZXRcbiAgdGltZXN0YW1wOiBmYWxzZSxcbiAgaW50ODogZmFsc2UsXG4gIHVuaXQ4OiBmYWxzZSxcbiAgaW50MTY6IGZhbHNlLFxuICB1bml0MTY6IGZhbHNlLFxuICBpbnQzMjogZmFsc2UsXG4gIHVuaXQzMjogZmFsc2UsXG4gIGZsb2F0MzI6IGZhbHNlLFxuICBmbG9hdDY0OiBmYWxzZVxufTtcbiIsImltcG9ydCB7IEFycmF5S2V5d29yZHMgfSBmcm9tIFwiLi9rZXl3b3Jkcy9hcnJheS1rZXl3b3Jkc1wiO1xuaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4vaW5kZXhcIjtcbmltcG9ydCB7IE51bWJlcktleXdvcmRzIH0gZnJvbSBcIi4va2V5d29yZHMvbnVtYmVyLWtleXdvcmRzXCI7XG5pbXBvcnQgeyBPYmplY3RLZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzL29iamVjdC1rZXl3b3Jkc1wiO1xuaW1wb3J0IHsgT3RoZXJLZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzL290aGVyLWtleXdvcmRzXCI7XG5pbXBvcnQgeyBTdHJpbmdLZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzL3N0cmluZy1rZXl3b3Jkc1wiO1xuXG5leHBvcnQgY29uc3Qga2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbiB8IGZhbHNlPiA9IHtcbiAgLi4uT2JqZWN0S2V5d29yZHMsXG4gIC4uLkFycmF5S2V5d29yZHMsXG4gIC4uLlN0cmluZ0tleXdvcmRzLFxuICAuLi5OdW1iZXJLZXl3b3JkcyxcbiAgLi4uT3RoZXJLZXl3b3Jkc1xufTtcbiIsImltcG9ydCB7IGRlZXBDbG9uZSwgaXNDb21waWxlZFNjaGVtYSwgaXNPYmplY3QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5cbmV4cG9ydCBjb25zdCBPYmplY3RLZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uIHwgZmFsc2U+ID0ge1xuICByZXF1aXJlZChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZW1hLnJlcXVpcmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBzY2hlbWEucmVxdWlyZWRbaV07XG4gICAgICBpZiAoIWRhdGEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJSZXF1aXJlZCBwcm9wZXJ0eSBpcyBtaXNzaW5nXCIsIHtcbiAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBwcm9wZXJ0aWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHByb3BLZXlzID0gKHNjaGVtYSBhcyBhbnkpLl9wcm9wS2V5cyBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIXByb3BLZXlzKSB7XG4gICAgICBwcm9wS2V5cyA9IE9iamVjdC5rZXlzKHNjaGVtYS5wcm9wZXJ0aWVzIHx8IHt9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzY2hlbWEsIFwiX3Byb3BLZXlzXCIsIHtcbiAgICAgICAgdmFsdWU6IHByb3BLZXlzLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBsZXQgcmVxdWlyZWRLZXlzID0gKHNjaGVtYSBhcyBhbnkpLl9yZXF1aXJlZEtleXMgYXNcbiAgICAgIHwgc3RyaW5nW11cbiAgICAgIHwgbnVsbFxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHJlcXVpcmVkS2V5cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXF1aXJlZEtleXMgPSBBcnJheS5pc0FycmF5KHNjaGVtYS5yZXF1aXJlZCkgPyBzY2hlbWEucmVxdWlyZWQgOiBudWxsO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNjaGVtYSwgXCJfcmVxdWlyZWRLZXlzXCIsIHtcbiAgICAgICAgdmFsdWU6IHJlcXVpcmVkS2V5cyxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWlyZWQgPSByZXF1aXJlZEtleXMgfHwgW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBwcm9wS2V5c1tpXTtcbiAgICAgIGNvbnN0IHNjaGVtYVByb3AgPSBzY2hlbWEucHJvcGVydGllc1trZXldO1xuXG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICByZXF1aXJlZC5sZW5ndGggJiZcbiAgICAgICAgICByZXF1aXJlZC5pbmRleE9mKGtleSkgIT09IC0xICYmXG4gICAgICAgICAgaXNPYmplY3Qoc2NoZW1hUHJvcCkgJiZcbiAgICAgICAgICBcImRlZmF1bHRcIiBpbiBzY2hlbWFQcm9wXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hUHJvcC4kdmFsaWRhdGUoc2NoZW1hUHJvcC5kZWZhdWx0KTtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkRlZmF1bHQgcHJvcGVydHkgaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgICAgIGl0ZW06IGtleSxcbiAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgICBkYXRhOiBzY2hlbWFQcm9wLmRlZmF1bHRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkYXRhW2tleV0gPSBkZWVwQ2xvbmUoc2NoZW1hUHJvcC5kZWZhdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBzY2hlbWFQcm9wID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICBpZiAoc2NoZW1hUHJvcCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBub3QgYWxsb3dlZFwiLCB7XG4gICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNjaGVtYVByb3AgJiYgXCIkdmFsaWRhdGVcIiBpbiBzY2hlbWFQcm9wKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hUHJvcC4kdmFsaWRhdGUoZGF0YVtrZXldKTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUHJvcGVydHkgaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcbiAgdmFsdWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWVTY2hlbWEgPSBzY2hlbWEudmFsdWVzO1xuICAgIGNvbnN0IHZhbGlkYXRlID0gdmFsdWVTY2hlbWEgJiYgdmFsdWVTY2hlbWEuJHZhbGlkYXRlO1xuICAgIGlmICh0eXBlb2YgdmFsaWRhdGUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhkYXRhKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICBjb25zdCBlcnJvciA9IHZhbGlkYXRlKGRhdGFba2V5XSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUHJvcGVydHkgaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1heFByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghaXNPYmplY3QoZGF0YSkgfHwgT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoIDw9IHNjaGVtYS5tYXhQcm9wZXJ0aWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVG9vIG1hbnkgcHJvcGVydGllc1wiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgbWluUHJvcGVydGllcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSB8fCBPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPj0gc2NoZW1hLm1pblByb3BlcnRpZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJUb28gZmV3IHByb3BlcnRpZXNcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIGFkZGl0aW9uYWxQcm9wZXJ0aWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGRhdGEpO1xuXG4gICAgbGV0IGFwSXNDb21waWxlZCA9IChzY2hlbWEgYXMgYW55KS5fYXBJc0NvbXBpbGVkIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGFwSXNDb21waWxlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhcElzQ29tcGlsZWQgPSBpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcyk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9hcElzQ29tcGlsZWRcIiwge1xuICAgICAgICB2YWx1ZTogYXBJc0NvbXBpbGVkLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGV0IHBhdHRlcm5MaXN0ID0gKHNjaGVtYSBhcyBhbnkpLl9wYXR0ZXJuUHJvcGVydGllc0xpc3QgYXNcbiAgICAgIHwgeyByZWdleDogUmVnRXhwOyBrZXk6IHN0cmluZyB9W11cbiAgICAgIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHNjaGVtYS5wYXR0ZXJuUHJvcGVydGllcyAmJiAhcGF0dGVybkxpc3QpIHtcbiAgICAgIHBhdHRlcm5MaXN0ID0gW107XG4gICAgICBmb3IgKGNvbnN0IHBhdHRlcm4gaW4gc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzKSB7XG4gICAgICAgIHBhdHRlcm5MaXN0LnB1c2goe1xuICAgICAgICAgIHJlZ2V4OiBuZXcgUmVnRXhwKHBhdHRlcm4sIFwidVwiKSxcbiAgICAgICAgICBrZXk6IHBhdHRlcm5cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9wYXR0ZXJuUHJvcGVydGllc0xpc3RcIiwge1xuICAgICAgICB2YWx1ZTogcGF0dGVybkxpc3QsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG5cbiAgICAgIGlmIChzY2hlbWEucHJvcGVydGllcyAmJiBzY2hlbWEucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocGF0dGVybkxpc3QgJiYgcGF0dGVybkxpc3QubGVuZ3RoKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHBhdHRlcm5MaXN0Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgaWYgKHBhdHRlcm5MaXN0W2pdLnJlZ2V4LnRlc3Qoa2V5KSkge1xuICAgICAgICAgICAgbWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFkZGl0aW9uYWwgcHJvcGVydGllcyBhcmUgbm90IGFsbG93ZWRcIiwge1xuICAgICAgICAgIGl0ZW06IGtleSxcbiAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhcElzQ29tcGlsZWQgJiYgaXNDb21waWxlZFNjaGVtYShzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMpKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLiR2YWxpZGF0ZShkYXRhW2tleV0pO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBZGRpdGlvbmFsIHByb3BlcnRpZXMgYXJlIGludmFsaWRcIiwge1xuICAgICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG4gIHBhdHRlcm5Qcm9wZXJ0aWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHBhdHRlcm5MaXN0ID0gKHNjaGVtYSBhcyBhbnkpLl9wYXR0ZXJuUHJvcGVydGllc0xpc3QgYXNcbiAgICAgIHwgeyByZWdleDogUmVnRXhwOyBrZXk6IHN0cmluZyB9W11cbiAgICAgIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFwYXR0ZXJuTGlzdCkge1xuICAgICAgcGF0dGVybkxpc3QgPSBbXTtcbiAgICAgIGNvbnN0IHBhdHRlcm5zID0gT2JqZWN0LmtleXMoc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzIHx8IHt9KTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVybnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcGF0dGVybiA9IHBhdHRlcm5zW2ldO1xuICAgICAgICBwYXR0ZXJuTGlzdC5wdXNoKHtcbiAgICAgICAgICByZWdleDogbmV3IFJlZ0V4cChwYXR0ZXJuLCBcInVcIiksXG4gICAgICAgICAga2V5OiBwYXR0ZXJuXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNjaGVtYSwgXCJfcGF0dGVyblByb3BlcnRpZXNMaXN0XCIsIHtcbiAgICAgICAgdmFsdWU6IHBhdHRlcm5MaXN0LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YUtleXMgPSBPYmplY3Qua2V5cyhkYXRhKTtcblxuICAgIGZvciAobGV0IHAgPSAwOyBwIDwgcGF0dGVybkxpc3QubGVuZ3RoOyBwKyspIHtcbiAgICAgIGNvbnN0IHsgcmVnZXgsIGtleTogcGF0dGVybktleSB9ID0gcGF0dGVybkxpc3RbcF07XG4gICAgICBjb25zdCBzY2hlbWFQcm9wID0gc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzW3BhdHRlcm5LZXldO1xuXG4gICAgICBpZiAodHlwZW9mIHNjaGVtYVByb3AgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIGlmIChzY2hlbWFQcm9wID09PSBmYWxzZSkge1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YUtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGRhdGFLZXlzW2ldO1xuICAgICAgICAgICAgaWYgKHJlZ2V4LnRlc3Qoa2V5KSkge1xuICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBub3QgYWxsb3dlZFwiLCB7XG4gICAgICAgICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYVByb3ApIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGtleSA9IGRhdGFLZXlzW2ldO1xuICAgICAgICAgIGlmIChyZWdleC50ZXN0KGtleSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hUHJvcC4kdmFsaWRhdGUoZGF0YVtrZXldKTtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG4gIHByb3BlcnR5TmFtZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwbiA9IHNjaGVtYS5wcm9wZXJ0eU5hbWVzO1xuXG4gICAgaWYgKHR5cGVvZiBwbiA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGlmIChwbiA9PT0gZmFsc2UgJiYgT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0aWVzIGFyZSBub3QgYWxsb3dlZFwiLCB7IGRhdGEgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdGUgPSBwbiAmJiBwbi4kdmFsaWRhdGU7XG4gICAgaWYgKHR5cGVvZiB2YWxpZGF0ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVycm9yID0gdmFsaWRhdGUoa2V5KTtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBuYW1lIGlzIGludmFsaWRcIiwge1xuICAgICAgICAgIGl0ZW06IGtleSxcbiAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBkZXBlbmRlbmNpZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBzY2hlbWEuZGVwZW5kZW5jaWVzKSB7XG4gICAgICBpZiAoa2V5IGluIGRhdGEgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZXBlbmRlbmN5ID0gc2NoZW1hLmRlcGVuZGVuY2llc1trZXldO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGVwZW5kZW5jeSkpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZXBlbmRlbmN5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKCEoZGVwZW5kZW5jeVtpXSBpbiBkYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiRGVwZW5kZW5jeSBpcyBub3Qgc2F0aXNmaWVkXCIsIHtcbiAgICAgICAgICAgICAgaXRlbTogaSxcbiAgICAgICAgICAgICAgZGF0YTogZGVwZW5kZW5jeVtpXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBkZXBlbmRlbmN5ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICBpZiAoZGVwZW5kZW5jeSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkRlcGVuZGVuY3kgaXMgbm90IHNhdGlzZmllZFwiLCB7IGRhdGE6IGRlcGVuZGVuY3kgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZGVwZW5kZW5jeSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBpZiAoZGVwZW5kZW5jeSBpbiBkYXRhKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiRGVwZW5kZW5jeSBpcyBub3Qgc2F0aXNmaWVkXCIsIHsgZGF0YTogZGVwZW5kZW5jeSB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVycm9yID0gZGVwZW5kZW5jeS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiRGVwZW5kZW5jeSBpcyBub3Qgc2F0aXNmaWVkXCIsIHtcbiAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgZGF0YVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgLy8gUmVxdWlyZWQgYnkgb3RoZXIga2V5d29yZHMgYnV0IG5vdCB1c2VkIGFzIGEgZnVuY3Rpb24gaXRzZWxmXG4gIHRoZW46IGZhbHNlLFxuICBlbHNlOiBmYWxzZSxcbiAgZGVmYXVsdDogZmFsc2UsXG5cbiAgLy8gTm90IGltcGxlbWVudGVkIHlldFxuICBkZWZpbml0aW9uczogZmFsc2UsXG4gICRpZDogZmFsc2UsXG4gICRzY2hlbWE6IGZhbHNlLFxuXG4gIC8vIE1ldGFkYXRhIGtleXdvcmRzIChub3QgdXNlZCBhcyBhIGZ1bmN0aW9uKVxuICB0aXRsZTogZmFsc2UsXG4gIGRlc2NyaXB0aW9uOiBmYWxzZSxcbiAgJGNvbW1lbnQ6IGZhbHNlLFxuICBleGFtcGxlczogZmFsc2UsXG4gIGNvbnRlbnRNZWRpYVR5cGU6IGZhbHNlLFxuICBjb250ZW50RW5jb2Rpbmc6IGZhbHNlLFxuXG4gIC8vIE5vdCBzdXBwb3J0ZWQgT3BlbiBBUEkga2V5d29yZHNcbiAgZGlzY3JpbWluYXRvcjogZmFsc2UsXG4gIG51bGxhYmxlOiBmYWxzZVxufTtcbiIsImltcG9ydCB7IGhhc0NoYW5nZWQsIGlzQ29tcGlsZWRTY2hlbWEsIGlzT2JqZWN0IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmltcG9ydCB7IEtleXdvcmRGdW5jdGlvbiB9IGZyb20gXCIuLi9pbmRleFwiO1xuXG5leHBvcnQgY29uc3QgQXJyYXlLZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uPiA9IHtcbiAgLy8gbGliL2tleXdvcmRzL2FycmF5LWtleXdvcmRzLnRzXG4gIGl0ZW1zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzY2hlbWFJdGVtcyA9IHNjaGVtYS5pdGVtcztcbiAgICBjb25zdCBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7XG5cbiAgICBpZiAodHlwZW9mIHNjaGVtYUl0ZW1zID09PSBcImJvb2xlYW5cIikge1xuICAgICAgaWYgKHNjaGVtYUl0ZW1zID09PSBmYWxzZSAmJiBkYXRhTGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtcyBhcmUgbm90IGFsbG93ZWRcIiwgeyBkYXRhIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYUl0ZW1zKSkge1xuICAgICAgY29uc3Qgc2NoZW1hSXRlbXNMZW5ndGggPSBzY2hlbWFJdGVtcy5sZW5ndGg7XG4gICAgICBjb25zdCBpdGVtc0xlbmd0aCA9XG4gICAgICAgIHNjaGVtYUl0ZW1zTGVuZ3RoIDwgZGF0YUxlbmd0aCA/IHNjaGVtYUl0ZW1zTGVuZ3RoIDogZGF0YUxlbmd0aDtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtc0xlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYUl0ZW0gPSBzY2hlbWFJdGVtc1tpXTtcblxuICAgICAgICBpZiAodHlwZW9mIHNjaGVtYUl0ZW0gPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgaWYgKHNjaGVtYUl0ZW0gPT09IGZhbHNlICYmIGRhdGFbaV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbSBpcyBub3QgYWxsb3dlZFwiLCB7XG4gICAgICAgICAgICAgIGl0ZW06IGksXG4gICAgICAgICAgICAgIGRhdGE6IGRhdGFbaV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbGlkYXRlID0gc2NoZW1hSXRlbSAmJiBzY2hlbWFJdGVtLiR2YWxpZGF0ZTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWxpZGF0ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSB2YWxpZGF0ZShkYXRhW2ldKTtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW0gaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgICAgIGl0ZW06IGksXG4gICAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgICAgZGF0YTogZGF0YVtpXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZGF0ZSA9IHNjaGVtYUl0ZW1zICYmIHNjaGVtYUl0ZW1zLiR2YWxpZGF0ZTtcbiAgICBpZiAodHlwZW9mIHZhbGlkYXRlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFMZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZXJyb3IgPSB2YWxpZGF0ZShkYXRhW2ldKTtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtIGlzIGludmFsaWRcIiwge1xuICAgICAgICAgIGl0ZW06IGksXG4gICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgIGRhdGE6IGRhdGFbaV1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGVsZW1lbnRzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50c1NjaGVtYSA9IHNjaGVtYS5lbGVtZW50cztcbiAgICBjb25zdCB2YWxpZGF0ZSA9IGVsZW1lbnRzU2NoZW1hICYmIGVsZW1lbnRzU2NoZW1hLiR2YWxpZGF0ZTtcbiAgICBpZiAodHlwZW9mIHZhbGlkYXRlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtaW5JdGVtcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpIHx8IGRhdGEubGVuZ3RoID49IHNjaGVtYS5taW5JdGVtcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGlzIHRvbyBzaG9ydFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgbWF4SXRlbXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSB8fCBkYXRhLmxlbmd0aCA8PSBzY2hlbWEubWF4SXRlbXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpcyB0b28gbG9uZ1wiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgYWRkaXRpb25hbEl0ZW1zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIXNjaGVtYS5pdGVtcyB8fCBpc09iamVjdChzY2hlbWEuaXRlbXMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMgPT09IGZhbHNlKSB7XG4gICAgICBpZiAoZGF0YS5sZW5ndGggPiBzY2hlbWEuaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGlzIHRvbyBsb25nXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNPYmplY3Qoc2NoZW1hLmFkZGl0aW9uYWxJdGVtcykpIHtcbiAgICAgIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBzY2hlbWEuaXRlbXMubGVuZ3RoOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmFkZGl0aW9uYWxJdGVtcy4kdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtIGlzIGludmFsaWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICAgIGRhdGE6IGRhdGFbaV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgdW5pcXVlSXRlbXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSB8fCAhc2NoZW1hLnVuaXF1ZUl0ZW1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbGVuID0gZGF0YS5sZW5ndGg7XG4gICAgaWYgKGxlbiA8PSAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcHJpbWl0aXZlU2VlbiA9IG5ldyBTZXQ8YW55PigpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgY29uc3QgaXRlbSA9IGRhdGFbaV07XG4gICAgICBjb25zdCB0eXBlID0gdHlwZW9mIGl0ZW07XG5cbiAgICAgIGlmIChcbiAgICAgICAgaXRlbSA9PT0gbnVsbCB8fFxuICAgICAgICB0eXBlID09PSBcInN0cmluZ1wiIHx8XG4gICAgICAgIHR5cGUgPT09IFwibnVtYmVyXCIgfHxcbiAgICAgICAgdHlwZSA9PT0gXCJib29sZWFuXCJcbiAgICAgICkge1xuICAgICAgICBpZiAocHJpbWl0aXZlU2Vlbi5oYXMoaXRlbSkpIHtcbiAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtcyBhcmUgbm90IHVuaXF1ZVwiLCB7IGRhdGE6IGl0ZW0gfSk7XG4gICAgICAgIH1cbiAgICAgICAgcHJpbWl0aXZlU2Vlbi5hZGQoaXRlbSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXRlbSAmJiB0eXBlb2YgaXRlbSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGk7IGorKykge1xuICAgICAgICAgIGNvbnN0IHByZXYgPSBkYXRhW2pdO1xuICAgICAgICAgIGlmIChwcmV2ICYmIHR5cGVvZiBwcmV2ID09PSBcIm9iamVjdFwiICYmICFoYXNDaGFuZ2VkKHByZXYsIGl0ZW0pKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtcyBhcmUgbm90IHVuaXF1ZVwiLCB7IGRhdGE6IGl0ZW0gfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNvbnRhaW5zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuY29udGFpbnMgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBpZiAoc2NoZW1hLmNvbnRhaW5zKSB7XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgaXRlbVwiLCB7IGRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBtdXN0IG5vdCBjb250YWluIGFueSBpdGVtc1wiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5jb250YWlucy4kdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgaXRlbVwiLCB7IGRhdGEgfSk7XG4gIH1cbn07XG4iLCJpbXBvcnQgeyBGb3JtYXRGdW5jdGlvbiwgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5cbmV4cG9ydCBjb25zdCBTdHJpbmdLZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uPiA9IHtcbiAgbWluTGVuZ3RoKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgfHwgZGF0YS5sZW5ndGggPj0gc2NoZW1hLm1pbkxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIHNob3J0ZXIgdGhhbiB0aGUgbWluaW11bSBsZW5ndGhcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIG1heExlbmd0aChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiIHx8IGRhdGEubGVuZ3RoIDw9IHNjaGVtYS5tYXhMZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBsb25nZXIgdGhhbiB0aGUgbWF4aW11bSBsZW5ndGhcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIHBhdHRlcm4oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBwYXR0ZXJuUmVnZXhwID0gKHNjaGVtYSBhcyBhbnkpLl9wYXR0ZXJuUmVnZXhwIGFzIFJlZ0V4cCB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIXBhdHRlcm5SZWdleHApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBhdHRlcm5SZWdleHAgPSBuZXcgUmVnRXhwKHNjaGVtYS5wYXR0ZXJuLCBcInVcIik7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzY2hlbWEsIFwiX3BhdHRlcm5SZWdleHBcIiwge1xuICAgICAgICAgIHZhbHVlOiBwYXR0ZXJuUmVnZXhwLFxuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb25cIiwge1xuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgY2F1c2U6IGVycm9yXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXR0ZXJuUmVnZXhwLnRlc3QoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgcGF0dGVyblwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgLy8gVGFrZSBpbnRvIGFjY291bnQgdGhhdCBpZiB3ZSByZWNlaXZlIGEgZm9ybWF0IHRoYXQgaXMgbm90IGRlZmluZWQsIHdlXG4gIC8vIHdpbGwgbm90IHRocm93IGFuIGVycm9yLCB3ZSBqdXN0IGlnbm9yZSBpdC5cbiAgZm9ybWF0KHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGZvcm1hdFZhbGlkYXRlID0gKHNjaGVtYSBhcyBhbnkpLl9mb3JtYXRWYWxpZGF0ZSBhc1xuICAgICAgfCBGb3JtYXRGdW5jdGlvblxuICAgICAgfCBmYWxzZVxuICAgICAgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoZm9ybWF0VmFsaWRhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9ybWF0VmFsaWRhdGUgPSBpbnN0YW5jZS5nZXRGb3JtYXQoc2NoZW1hLmZvcm1hdCk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9mb3JtYXRWYWxpZGF0ZVwiLCB7XG4gICAgICAgIHZhbHVlOiBmb3JtYXRWYWxpZGF0ZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFmb3JtYXRWYWxpZGF0ZSB8fCBmb3JtYXRWYWxpZGF0ZShkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGRvZXMgbm90IG1hdGNoIHRoZSBmb3JtYXRcIiwgeyBkYXRhIH0pO1xuICB9XG59O1xuIiwiaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5pbXBvcnQgeyBhcmVDbG9zZUVub3VnaCB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5leHBvcnQgY29uc3QgTnVtYmVyS2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbj4gPSB7XG4gIG1pbmltdW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbWluID0gc2NoZW1hLm1pbmltdW07XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuZXhjbHVzaXZlTWluaW11bSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgbWluID0gc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gKyAxZS0xNTtcbiAgICB9IGVsc2UgaWYgKHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtID09PSB0cnVlKSB7XG4gICAgICBtaW4gKz0gMWUtMTU7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgPCBtaW4pIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgbWluaW11bVwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIG1heGltdW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbWF4ID0gc2NoZW1hLm1heGltdW07XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgbWF4ID0gc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0gLSAxZS0xNTtcbiAgICB9IGVsc2UgaWYgKHNjaGVtYS5leGNsdXNpdmVNYXhpbXVtID09PSB0cnVlKSB7XG4gICAgICBtYXggLT0gMWUtMTU7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgPiBtYXgpIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bVwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIG11bHRpcGxlT2Yoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBxdW90aWVudCA9IGRhdGEgLyBzY2hlbWEubXVsdGlwbGVPZjtcblxuICAgIGlmICghaXNGaW5pdGUocXVvdGllbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFhcmVDbG9zZUVub3VnaChxdW90aWVudCwgTWF0aC5yb3VuZChxdW90aWVudCkpKSB7XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgbXVsdGlwbGVPZlwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIGV4Y2x1c2l2ZU1pbmltdW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgZGF0YSAhPT0gXCJudW1iZXJcIiB8fFxuICAgICAgdHlwZW9mIHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtICE9PSBcIm51bWJlclwiIHx8XG4gICAgICBcIm1pbmltdW1cIiBpbiBzY2hlbWFcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSA8PSBzY2hlbWEuZXhjbHVzaXZlTWluaW11bSArIDFlLTE1KSB7XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGV4Y2x1c2l2ZU1pbmltdW1cIik7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIGV4Y2x1c2l2ZU1heGltdW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgZGF0YSAhPT0gXCJudW1iZXJcIiB8fFxuICAgICAgdHlwZW9mIHNjaGVtYS5leGNsdXNpdmVNYXhpbXVtICE9PSBcIm51bWJlclwiIHx8XG4gICAgICBcIm1heGltdW1cIiBpbiBzY2hlbWFcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSA+PSBzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSkge1xuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFxuICAgICAgICBcIlZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgZXhjbHVzaXZlTWF4aW11bVwiLFxuICAgICAgICB7IGRhdGEgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cbn07XG4iLCJpbXBvcnQgeyBoYXNDaGFuZ2VkLCBpc0NvbXBpbGVkU2NoZW1hLCBpc09iamVjdCB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5pbXBvcnQgeyBLZXl3b3JkRnVuY3Rpb24gfSBmcm9tIFwiLi4vaW5kZXhcIjtcblxuZXhwb3J0IGNvbnN0IE90aGVyS2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbj4gPSB7XG4gIGVudW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGNvbnN0IGxpc3QgPSBzY2hlbWEuZW51bTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZW51bUl0ZW0gPSBsaXN0W2ldO1xuXG4gICAgICBpZiAoZW51bUl0ZW0gPT09IGRhdGEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIGVudW1JdGVtICE9PSBudWxsICYmXG4gICAgICAgIGRhdGEgIT09IG51bGwgJiZcbiAgICAgICAgdHlwZW9mIGVudW1JdGVtID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICFoYXNDaGFuZ2VkKGVudW1JdGVtLCBkYXRhKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3Qgb25lIG9mIHRoZSBhbGxvd2VkIHZhbHVlc1wiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgYWxsT2Yoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZW1hLmFsbE9mLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaXNPYmplY3Qoc2NoZW1hLmFsbE9mW2ldKSkge1xuICAgICAgICBpZiAoXCIkdmFsaWRhdGVcIiBpbiBzY2hlbWEuYWxsT2ZbaV0pIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5hbGxPZltpXS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBjYXVzZTogZXJyb3IsIGRhdGEgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHNjaGVtYS5hbGxPZltpXSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgaWYgKEJvb2xlYW4oZGF0YSkgIT09IHNjaGVtYS5hbGxPZltpXSkge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhICE9PSBzY2hlbWEuYWxsT2ZbaV0pIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgYW55T2Yoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZW1hLmFueU9mLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaXNPYmplY3Qoc2NoZW1hLmFueU9mW2ldKSkge1xuICAgICAgICBpZiAoXCIkdmFsaWRhdGVcIiBpbiBzY2hlbWEuYW55T2ZbaV0pIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5hbnlPZltpXS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodHlwZW9mIHNjaGVtYS5hbnlPZltpXSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICBpZiAoQm9vbGVhbihkYXRhKSA9PT0gc2NoZW1hLmFueU9mW2ldKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRhdGEgPT09IHNjaGVtYS5hbnlPZltpXSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgb25lT2Yoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGNvbnN0IGxpc3QgPSBzY2hlbWEub25lT2Y7XG4gICAgbGV0IHZhbGlkQ291bnQgPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBzdWIgPSBsaXN0W2ldO1xuXG4gICAgICBpZiAoaXNPYmplY3Qoc3ViKSkge1xuICAgICAgICBpZiAoXCIkdmFsaWRhdGVcIiBpbiBzdWIpIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHN1Yi4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgdmFsaWRDb3VudCsrO1xuICAgICAgICAgICAgaWYgKHZhbGlkQ291bnQgPiAxKSB7XG4gICAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhbGlkQ291bnQrKztcbiAgICAgICAgaWYgKHZhbGlkQ291bnQgPiAxKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBzdWIgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIGlmIChCb29sZWFuKGRhdGEpID09PSBzdWIpIHtcbiAgICAgICAgICB2YWxpZENvdW50Kys7XG4gICAgICAgICAgaWYgKHZhbGlkQ291bnQgPiAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEgPT09IHN1Yikge1xuICAgICAgICB2YWxpZENvdW50Kys7XG4gICAgICAgIGlmICh2YWxpZENvdW50ID4gMSkge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsaWRDb3VudCA9PT0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgY29uc3Qoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmIChkYXRhID09PSBzY2hlbWEuY29uc3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAoaXNPYmplY3QoZGF0YSkgJiZcbiAgICAgICAgaXNPYmplY3Qoc2NoZW1hLmNvbnN0KSAmJlxuICAgICAgICAhaGFzQ2hhbmdlZChkYXRhLCBzY2hlbWEuY29uc3QpKSB8fFxuICAgICAgKEFycmF5LmlzQXJyYXkoZGF0YSkgJiZcbiAgICAgICAgQXJyYXkuaXNBcnJheShzY2hlbWEuY29uc3QpICYmXG4gICAgICAgICFoYXNDaGFuZ2VkKGRhdGEsIHNjaGVtYS5jb25zdCkpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgaWYoc2NoZW1hLCBkYXRhKSB7XG4gICAgaWYgKFwidGhlblwiIGluIHNjaGVtYSA9PT0gZmFsc2UgJiYgXCJlbHNlXCIgaW4gc2NoZW1hID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHNjaGVtYS5pZiA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGlmIChzY2hlbWEuaWYpIHtcbiAgICAgICAgaWYgKGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLnRoZW4pKSB7XG4gICAgICAgICAgcmV0dXJuIHNjaGVtYS50aGVuLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS5lbHNlKSkge1xuICAgICAgICByZXR1cm4gc2NoZW1hLmVsc2UuJHZhbGlkYXRlKGRhdGEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghaXNDb21waWxlZFNjaGVtYShzY2hlbWEuaWYpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3IgPSBzY2hlbWEuaWYuJHZhbGlkYXRlKGRhdGEpO1xuICAgIGlmICghZXJyb3IpIHtcbiAgICAgIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS50aGVuKSkge1xuICAgICAgICByZXR1cm4gc2NoZW1hLnRoZW4uJHZhbGlkYXRlKGRhdGEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWEuZWxzZSkpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS5lbHNlLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0sXG5cbiAgbm90KHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIHNjaGVtYS5ub3QgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBpZiAoc2NoZW1hLm5vdCkge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpc09iamVjdChzY2hlbWEubm90KSkge1xuICAgICAgaWYgKFwiJHZhbGlkYXRlXCIgaW4gc2NoZW1hLm5vdCkge1xuICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5ub3QuJHZhbGlkYXRlKGRhdGEpO1xuICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgY2F1c2U6IGVycm9yLCBkYXRhIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICAkcmVmKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKHNjaGVtYS5fcmVzb2x2ZWRSZWYpIHtcbiAgICAgIHJldHVybiBzY2hlbWEuX3Jlc29sdmVkUmVmKGRhdGEpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlZlBhdGggPSBzY2hlbWEuJHJlZjtcbiAgICBsZXQgdGFyZ2V0U2NoZW1hID0gaW5zdGFuY2UuZ2V0U2NoZW1hUmVmKHJlZlBhdGgpO1xuXG4gICAgaWYgKCF0YXJnZXRTY2hlbWEpIHtcbiAgICAgIHRhcmdldFNjaGVtYSA9IGluc3RhbmNlLmdldFNjaGVtYUJ5SWQocmVmUGF0aCk7XG4gICAgfVxuXG4gICAgaWYgKCF0YXJnZXRTY2hlbWEpIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihgTWlzc2luZyByZWZlcmVuY2U6ICR7cmVmUGF0aH1gKTtcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldFNjaGVtYS4kdmFsaWRhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzY2hlbWEuX3Jlc29sdmVkUmVmID0gdGFyZ2V0U2NoZW1hLiR2YWxpZGF0ZTtcbiAgICByZXR1cm4gc2NoZW1hLl9yZXNvbHZlZFJlZihkYXRhKTtcbiAgfVxufTtcbiIsIi8qKioqKioqKioqKioqKioqKiogUGF0aDogbGliL2luZGV4LnRzICoqKioqKioqKioqKioqKioqKi9cbmltcG9ydCB7XG4gIERlZmluZUVycm9yRnVuY3Rpb24sXG4gIFZhbGlkYXRpb25FcnJvcixcbiAgZGVlcENsb25lLFxuICBnZXREZWZpbmVkRXJyb3JGdW5jdGlvbkZvcktleSxcbiAgZ2V0TmFtZWRGdW5jdGlvbixcbiAgaXNPYmplY3QsXG4gIHJlc29sdmVQYXRoXG59IGZyb20gXCIuL3V0aWxzXCI7XG5cbmltcG9ydCB7IEZvcm1hdHMgfSBmcm9tIFwiLi9mb3JtYXRzXCI7XG5pbXBvcnQgeyBUeXBlcyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBrZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzXCI7XG5cbmV4cG9ydCB7IFZhbGlkYXRpb25FcnJvciB9IGZyb20gXCIuL3V0aWxzXCI7XG5leHBvcnQgeyBkZWVwQ2xvbmUgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgdHlwZSBSZXN1bHQgPSB2b2lkIHwgVmFsaWRhdGlvbkVycm9yIHwgdHJ1ZTtcblxuZXhwb3J0IGludGVyZmFjZSBLZXl3b3JkRnVuY3Rpb24ge1xuICAoXG4gICAgc2NoZW1hOiBDb21waWxlZFNjaGVtYSxcbiAgICBkYXRhOiBhbnksXG4gICAgZGVmaW5lRXJyb3I6IERlZmluZUVycm9yRnVuY3Rpb24sXG4gICAgaW5zdGFuY2U6IFNjaGVtYVNoaWVsZFxuICApOiBSZXN1bHQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZUZ1bmN0aW9uIHtcbiAgKGRhdGE6IGFueSk6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybWF0RnVuY3Rpb24ge1xuICAoZGF0YTogYW55KTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0ZUZ1bmN0aW9uIHtcbiAgKGRhdGE6IGFueSk6IFJlc3VsdDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21waWxlZFNjaGVtYSB7XG4gICR2YWxpZGF0ZT86IFZhbGlkYXRlRnVuY3Rpb247XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0b3Ige1xuICAoZGF0YTogYW55KToge1xuICAgIGRhdGE6IGFueTtcbiAgICBlcnJvcjogVmFsaWRhdGlvbkVycm9yIHwgbnVsbCB8IHRydWU7XG4gICAgdmFsaWQ6IGJvb2xlYW47XG4gIH07XG4gIGNvbXBpbGVkU2NoZW1hOiBDb21waWxlZFNjaGVtYTtcbn1cblxuaW50ZXJmYWNlIFZhbGlkYXRvckl0ZW0ge1xuICBmbjogS2V5d29yZEZ1bmN0aW9uO1xuICBkZWZpbmVFcnJvcjogRGVmaW5lRXJyb3JGdW5jdGlvbjtcbn1cblxuZXhwb3J0IGNsYXNzIFNjaGVtYVNoaWVsZCB7XG4gIHByaXZhdGUgdHlwZXM6IFJlY29yZDxzdHJpbmcsIFR5cGVGdW5jdGlvbiB8IGZhbHNlPiA9IHt9O1xuICBwcml2YXRlIGZvcm1hdHM6IFJlY29yZDxzdHJpbmcsIEZvcm1hdEZ1bmN0aW9uIHwgZmFsc2U+ID0ge307XG4gIHByaXZhdGUga2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbiB8IGZhbHNlPiA9IHt9O1xuICBwcml2YXRlIGltbXV0YWJsZSA9IGZhbHNlO1xuICBwcml2YXRlIHJvb3RTY2hlbWE6IENvbXBpbGVkU2NoZW1hIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaWRSZWdpc3RyeTogTWFwPHN0cmluZywgQ29tcGlsZWRTY2hlbWE+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGZhaWxGYXN0OiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgaW1tdXRhYmxlID0gZmFsc2UsXG4gICAgZmFpbEZhc3QgPSB0cnVlXG4gIH06IHtcbiAgICBpbW11dGFibGU/OiBib29sZWFuO1xuICAgIGZhaWxGYXN0PzogYm9vbGVhbjtcbiAgfSA9IHt9KSB7XG4gICAgdGhpcy5pbW11dGFibGUgPSBpbW11dGFibGU7XG4gICAgdGhpcy5mYWlsRmFzdCA9IGZhaWxGYXN0O1xuXG4gICAgZm9yIChjb25zdCBbdHlwZSwgdmFsaWRhdG9yXSBvZiBPYmplY3QuZW50cmllcyhUeXBlcykpIHtcbiAgICAgIGlmICh2YWxpZGF0b3IpIHtcbiAgICAgICAgdGhpcy5hZGRUeXBlKHR5cGUsIHZhbGlkYXRvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBba2V5d29yZCwgdmFsaWRhdG9yXSBvZiBPYmplY3QuZW50cmllcyhrZXl3b3JkcykpIHtcbiAgICAgIHRoaXMuYWRkS2V5d29yZChrZXl3b3JkLCB2YWxpZGF0b3IgYXMgS2V5d29yZEZ1bmN0aW9uKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtmb3JtYXQsIHZhbGlkYXRvcl0gb2YgT2JqZWN0LmVudHJpZXMoRm9ybWF0cykpIHtcbiAgICAgIGlmICh2YWxpZGF0b3IpIHtcbiAgICAgICAgdGhpcy5hZGRGb3JtYXQoZm9ybWF0LCB2YWxpZGF0b3IgYXMgRm9ybWF0RnVuY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZFR5cGUobmFtZTogc3RyaW5nLCB2YWxpZGF0b3I6IFR5cGVGdW5jdGlvbiwgb3ZlcndyaXRlID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy50eXBlc1tuYW1lXSAmJiAhb3ZlcndyaXRlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBUeXBlIFwiJHtuYW1lfVwiIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuICAgIHRoaXMudHlwZXNbbmFtZV0gPSB2YWxpZGF0b3I7XG4gIH1cblxuICBnZXRUeXBlKHR5cGU6IHN0cmluZyk6IFR5cGVGdW5jdGlvbiB8IGZhbHNlIHtcbiAgICByZXR1cm4gdGhpcy50eXBlc1t0eXBlXTtcbiAgfVxuXG4gIGFkZEZvcm1hdChuYW1lOiBzdHJpbmcsIHZhbGlkYXRvcjogRm9ybWF0RnVuY3Rpb24sIG92ZXJ3cml0ZSA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuZm9ybWF0c1tuYW1lXSAmJiAhb3ZlcndyaXRlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBGb3JtYXQgXCIke25hbWV9XCIgYWxyZWFkeSBleGlzdHNgKTtcbiAgICB9XG4gICAgdGhpcy5mb3JtYXRzW25hbWVdID0gdmFsaWRhdG9yO1xuICB9XG5cbiAgZ2V0Rm9ybWF0KGZvcm1hdDogc3RyaW5nKTogRm9ybWF0RnVuY3Rpb24gfCBmYWxzZSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0c1tmb3JtYXRdO1xuICB9XG5cbiAgYWRkS2V5d29yZChuYW1lOiBzdHJpbmcsIHZhbGlkYXRvcjogS2V5d29yZEZ1bmN0aW9uLCBvdmVyd3JpdGUgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLmtleXdvcmRzW25hbWVdICYmICFvdmVyd3JpdGUpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYEtleXdvcmQgXCIke25hbWV9XCIgYWxyZWFkeSBleGlzdHNgKTtcbiAgICB9XG4gICAgdGhpcy5rZXl3b3Jkc1tuYW1lXSA9IHZhbGlkYXRvcjtcbiAgfVxuXG4gIGdldEtleXdvcmQoa2V5d29yZDogc3RyaW5nKTogS2V5d29yZEZ1bmN0aW9uIHwgZmFsc2Uge1xuICAgIHJldHVybiB0aGlzLmtleXdvcmRzW2tleXdvcmRdO1xuICB9XG5cbiAgZ2V0U2NoZW1hUmVmKHBhdGg6IHN0cmluZyk6IENvbXBpbGVkU2NoZW1hIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMucm9vdFNjaGVtYSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gcmVzb2x2ZVBhdGgodGhpcy5yb290U2NoZW1hLCBwYXRoKTtcbiAgfVxuXG4gIGdldFNjaGVtYUJ5SWQoaWQ6IHN0cmluZyk6IENvbXBpbGVkU2NoZW1hIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5pZFJlZ2lzdHJ5LmdldChpZCk7XG4gIH1cblxuICBjb21waWxlKHNjaGVtYTogYW55KTogVmFsaWRhdG9yIHtcbiAgICB0aGlzLmlkUmVnaXN0cnkuY2xlYXIoKTtcbiAgICBjb25zdCBjb21waWxlZFNjaGVtYSA9IHRoaXMuY29tcGlsZVNjaGVtYShzY2hlbWEpO1xuICAgIHRoaXMucm9vdFNjaGVtYSA9IGNvbXBpbGVkU2NoZW1hO1xuICAgIHRoaXMubGlua1JlZmVyZW5jZXMoY29tcGlsZWRTY2hlbWEpO1xuXG4gICAgaWYgKCFjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUpIHtcbiAgICAgIGlmICh0aGlzLmlzU2NoZW1hTGlrZShzY2hlbWEpID09PSBmYWxzZSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFwiSW52YWxpZCBzY2hlbWFcIik7XG4gICAgICB9XG5cbiAgICAgIGNvbXBpbGVkU2NoZW1hLiR2YWxpZGF0ZSA9IGdldE5hbWVkRnVuY3Rpb248VmFsaWRhdGVGdW5jdGlvbj4oXG4gICAgICAgIFwiVmFsaWRhdGVfQW55XCIsXG4gICAgICAgICgpID0+IHt9XG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkYXRlOiBWYWxpZGF0b3IgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICB0aGlzLnJvb3RTY2hlbWEgPSBjb21waWxlZFNjaGVtYTtcblxuICAgICAgY29uc3QgY2xvbmVkRGF0YSA9IHRoaXMuaW1tdXRhYmxlID8gZGVlcENsb25lKGRhdGEpIDogZGF0YTtcbiAgICAgIGNvbnN0IHJlcyA9IGNvbXBpbGVkU2NoZW1hLiR2YWxpZGF0ZSEoY2xvbmVkRGF0YSk7XG5cbiAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgcmV0dXJuIHsgZGF0YTogY2xvbmVkRGF0YSwgZXJyb3I6IHJlcywgdmFsaWQ6IGZhbHNlIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IGRhdGE6IGNsb25lZERhdGEsIGVycm9yOiBudWxsLCB2YWxpZDogdHJ1ZSB9O1xuICAgIH07XG5cbiAgICB2YWxpZGF0ZS5jb21waWxlZFNjaGVtYSA9IGNvbXBpbGVkU2NoZW1hO1xuICAgIHJldHVybiB2YWxpZGF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgY29tcGlsZVNjaGVtYShzY2hlbWE6IFBhcnRpYWw8Q29tcGlsZWRTY2hlbWE+IHwgYW55KTogQ29tcGlsZWRTY2hlbWEge1xuICAgIGlmICghaXNPYmplY3Qoc2NoZW1hKSkge1xuICAgICAgaWYgKHNjaGVtYSA9PT0gdHJ1ZSkge1xuICAgICAgICBzY2hlbWEgPSB7IGFueU9mOiBbe31dIH07IC8vIEFsd2F5cyB2YWxpZFxuICAgICAgfSBlbHNlIGlmIChzY2hlbWEgPT09IGZhbHNlKSB7XG4gICAgICAgIHNjaGVtYSA9IHsgb25lT2Y6IFtdIH07IC8vIEFsd2F5cyBpbnZhbGlkXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY2hlbWEgPSB7IG9uZU9mOiBbc2NoZW1hXSB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbXBpbGVkU2NoZW1hOiBDb21waWxlZFNjaGVtYSA9IGRlZXBDbG9uZShzY2hlbWEpIGFzIENvbXBpbGVkU2NoZW1hO1xuXG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuJGlkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aGlzLmlkUmVnaXN0cnkuc2V0KHNjaGVtYS4kaWQsIGNvbXBpbGVkU2NoZW1hKTtcbiAgICB9XG5cbiAgICBpZiAoXCIkcmVmXCIgaW4gc2NoZW1hKSB7XG4gICAgICBjb25zdCByZWZWYWxpZGF0b3IgPSB0aGlzLmdldEtleXdvcmQoXCIkcmVmXCIpO1xuICAgICAgaWYgKHJlZlZhbGlkYXRvcikge1xuICAgICAgICBjb25zdCBkZWZpbmVFcnJvciA9IGdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5KFxuICAgICAgICAgIFwiJHJlZlwiLFxuICAgICAgICAgIHNjaGVtYVtcIiRyZWZcIl0sXG4gICAgICAgICAgdGhpcy5mYWlsRmFzdFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbXBpbGVkU2NoZW1hLiR2YWxpZGF0ZSA9IGdldE5hbWVkRnVuY3Rpb248VmFsaWRhdGVGdW5jdGlvbj4oXG4gICAgICAgICAgXCJWYWxpZGF0ZV9SZWZlcmVuY2VcIixcbiAgICAgICAgICAoZGF0YSkgPT5cbiAgICAgICAgICAgIChyZWZWYWxpZGF0b3IgYXMgS2V5d29yZEZ1bmN0aW9uKShcbiAgICAgICAgICAgICAgY29tcGlsZWRTY2hlbWEsXG4gICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgIGRlZmluZUVycm9yLFxuICAgICAgICAgICAgICB0aGlzXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29tcGlsZWRTY2hlbWE7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdG9yczogVmFsaWRhdG9ySXRlbVtdID0gW107XG4gICAgY29uc3QgYWN0aXZlTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAoXCJ0eXBlXCIgaW4gc2NoZW1hKSB7XG4gICAgICBjb25zdCBkZWZpbmVUeXBlRXJyb3IgPSBnZXREZWZpbmVkRXJyb3JGdW5jdGlvbkZvcktleShcbiAgICAgICAgXCJ0eXBlXCIsXG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgdGhpcy5mYWlsRmFzdFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHR5cGVzID0gQXJyYXkuaXNBcnJheShzY2hlbWEudHlwZSlcbiAgICAgICAgPyBzY2hlbWEudHlwZVxuICAgICAgICA6IHNjaGVtYS50eXBlLnNwbGl0KFwiLFwiKS5tYXAoKHQ6IHN0cmluZykgPT4gdC50cmltKCkpO1xuXG4gICAgICBjb25zdCB0eXBlRnVuY3Rpb25zOiBUeXBlRnVuY3Rpb25bXSA9IFtdO1xuICAgICAgY29uc3QgdHlwZU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHlwZXMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gdGhpcy5nZXRUeXBlKHR5cGUpO1xuICAgICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgICAgdHlwZUZ1bmN0aW9ucy5wdXNoKHZhbGlkYXRvcik7XG4gICAgICAgICAgdHlwZU5hbWVzLnB1c2godmFsaWRhdG9yLm5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlRnVuY3Rpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBnZXREZWZpbmVkRXJyb3JGdW5jdGlvbkZvcktleShcbiAgICAgICAgICBcInR5cGVcIixcbiAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgdGhpcy5mYWlsRmFzdFxuICAgICAgICApKFwiSW52YWxpZCB0eXBlIGZvciBzY2hlbWFcIiwgeyBkYXRhOiBzY2hlbWEudHlwZSB9KTtcbiAgICAgIH1cblxuICAgICAgbGV0IGNvbWJpbmVkVHlwZVZhbGlkYXRvcjogVmFsaWRhdGVGdW5jdGlvbjtcbiAgICAgIGxldCB0eXBlTWV0aG9kTmFtZSA9IFwiXCI7XG5cbiAgICAgIGlmICh0eXBlRnVuY3Rpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICB0eXBlTWV0aG9kTmFtZSA9IHR5cGVOYW1lc1swXTtcbiAgICAgICAgY29uc3Qgc2luZ2xlVHlwZUZuID0gdHlwZUZ1bmN0aW9uc1swXTtcbiAgICAgICAgY29tYmluZWRUeXBlVmFsaWRhdG9yID0gKGRhdGEpID0+IHtcbiAgICAgICAgICBpZiAoIXNpbmdsZVR5cGVGbihkYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZVR5cGVFcnJvcihcIkludmFsaWQgdHlwZVwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZU1ldGhvZE5hbWUgPSB0eXBlTmFtZXMuam9pbihcIl9PUl9cIik7XG4gICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBlRnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodHlwZUZ1bmN0aW9uc1tpXShkYXRhKSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0eXBlQWRhcHRlcjogS2V5d29yZEZ1bmN0aW9uID0gKF9zLCBkYXRhKSA9PlxuICAgICAgICBjb21iaW5lZFR5cGVWYWxpZGF0b3IoZGF0YSk7XG5cbiAgICAgIHZhbGlkYXRvcnMucHVzaCh7XG4gICAgICAgIGZuOiBnZXROYW1lZEZ1bmN0aW9uKHR5cGVNZXRob2ROYW1lLCB0eXBlQWRhcHRlciksXG4gICAgICAgIGRlZmluZUVycm9yOiBkZWZpbmVUeXBlRXJyb3JcbiAgICAgIH0pO1xuICAgICAgYWN0aXZlTmFtZXMucHVzaCh0eXBlTWV0aG9kTmFtZSk7XG4gICAgfVxuXG4gICAgY29uc3QgeyB0eXBlLCAkaWQsICRyZWYsICR2YWxpZGF0ZSwgcmVxdWlyZWQsIC4uLm90aGVyS2V5cyB9ID0gc2NoZW1hOyAvLyBFeGNsdWRlIGhhbmRsZWQga2V5c1xuXG4gICAgLy8gSW4gaGVyZSB3ZSBjcmVhdGUgYW4gYXJyYXkgb2Yga2V5cyBwdXR0aW5nIHRoZSByZXF1aXJlIGtleXdvcmQgbGFzdFxuICAgIC8vIFRoaXMgaXMgdG8gZW5zdXJlIHJlcXVpcmVkIHByb3BlcnRpZXMgYXJlIGNoZWNrZWQgYWZ0ZXIgZGVmYXVsdHMgYXJlIGFwcGxpZWRcbiAgICBjb25zdCBrZXlPcmRlciA9IHJlcXVpcmVkXG4gICAgICA/IFsuLi5PYmplY3Qua2V5cyhvdGhlcktleXMpLCBcInJlcXVpcmVkXCJdXG4gICAgICA6IE9iamVjdC5rZXlzKG90aGVyS2V5cyk7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5T3JkZXIpIHtcbiAgICAgIGNvbnN0IGtleXdvcmRGbiA9IHRoaXMuZ2V0S2V5d29yZChrZXkpO1xuXG4gICAgICBpZiAoa2V5d29yZEZuKSB7XG4gICAgICAgIGNvbnN0IGRlZmluZUVycm9yID0gZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXkoXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIHNjaGVtYVtrZXldLFxuICAgICAgICAgIHRoaXMuZmFpbEZhc3RcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZm5OYW1lID0ga2V5d29yZEZuLm5hbWUgfHwga2V5O1xuXG4gICAgICAgIHZhbGlkYXRvcnMucHVzaCh7XG4gICAgICAgICAgZm46IGtleXdvcmRGbiBhcyBLZXl3b3JkRnVuY3Rpb24sXG4gICAgICAgICAgZGVmaW5lRXJyb3JcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYWN0aXZlTmFtZXMucHVzaChmbk5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGxpdGVyYWxLZXl3b3JkcyA9IFtcImVudW1cIiwgXCJjb25zdFwiLCBcImRlZmF1bHRcIiwgXCJleGFtcGxlc1wiXTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlPcmRlcikge1xuICAgICAgaWYgKGxpdGVyYWxLZXl3b3Jkcy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0KHNjaGVtYVtrZXldKSkge1xuICAgICAgICBpZiAoa2V5ID09PSBcInByb3BlcnRpZXNcIikge1xuICAgICAgICAgIGZvciAoY29uc3Qgc3ViS2V5IG9mIE9iamVjdC5rZXlzKHNjaGVtYVtrZXldKSkge1xuICAgICAgICAgICAgY29tcGlsZWRTY2hlbWFba2V5XVtzdWJLZXldID0gdGhpcy5jb21waWxlU2NoZW1hKFxuICAgICAgICAgICAgICBzY2hlbWFba2V5XVtzdWJLZXldXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb21waWxlZFNjaGVtYVtrZXldID0gdGhpcy5jb21waWxlU2NoZW1hKHNjaGVtYVtrZXldKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYVtrZXldKSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVtYVtrZXldLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNTY2hlbWFMaWtlKHNjaGVtYVtrZXldW2ldKSkge1xuICAgICAgICAgICAgY29tcGlsZWRTY2hlbWFba2V5XVtpXSA9IHRoaXMuY29tcGlsZVNjaGVtYShzY2hlbWFba2V5XVtpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2YWxpZGF0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNvbXBpbGVkU2NoZW1hO1xuICAgIH1cblxuICAgIGlmICh2YWxpZGF0b3JzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgdiA9IHZhbGlkYXRvcnNbMF07XG4gICAgICBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uKGFjdGl2ZU5hbWVzWzBdLCAoZGF0YSkgPT5cbiAgICAgICAgdi5mbihjb21waWxlZFNjaGVtYSwgZGF0YSwgdi5kZWZpbmVFcnJvciwgdGhpcylcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbXBvc2l0ZU5hbWUgPSBcIlZhbGlkYXRlX1wiICsgYWN0aXZlTmFtZXMuam9pbihcIl9BTkRfXCIpO1xuXG4gICAgICBjb25zdCBtYXN0ZXJWYWxpZGF0b3I6IFZhbGlkYXRlRnVuY3Rpb24gPSAoZGF0YSkgPT4ge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbGlkYXRvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB2ID0gdmFsaWRhdG9yc1tpXTtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHYuZm4oY29tcGlsZWRTY2hlbWEsIGRhdGEsIHYuZGVmaW5lRXJyb3IsIHRoaXMpO1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9O1xuXG4gICAgICBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uKFxuICAgICAgICBjb21wb3NpdGVOYW1lLFxuICAgICAgICBtYXN0ZXJWYWxpZGF0b3JcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBpbGVkU2NoZW1hIGFzIENvbXBpbGVkU2NoZW1hO1xuICB9XG5cbiAgaXNTY2hlbWFMaWtlKHN1YlNjaGVtYTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKGlzT2JqZWN0KHN1YlNjaGVtYSkpIHtcbiAgICAgIGlmIChcInR5cGVcIiBpbiBzdWJTY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IHN1YktleSBpbiBzdWJTY2hlbWEpIHtcbiAgICAgICAgaWYgKHN1YktleSBpbiB0aGlzLmtleXdvcmRzKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBsaW5rUmVmZXJlbmNlcyhyb290OiBDb21waWxlZFNjaGVtYSkge1xuICAgIGNvbnN0IHN0YWNrOiBhbnlbXSA9IFtyb290XTtcblxuICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBub2RlID0gc3RhY2sucG9wKCk7XG5cbiAgICAgIGlmICghbm9kZSB8fCB0eXBlb2Ygbm9kZSAhPT0gXCJvYmplY3RcIikgY29udGludWU7XG5cbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIG5vZGUuJHJlZiA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICB0eXBlb2Ygbm9kZS4kdmFsaWRhdGUgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICBub2RlLiR2YWxpZGF0ZS5uYW1lID09PSBcIlZhbGlkYXRlX1JlZmVyZW5jZVwiXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcmVmUGF0aCA9IG5vZGUuJHJlZiBhcyBzdHJpbmc7XG5cbiAgICAgICAgbGV0IHRhcmdldDogYW55ID0gdGhpcy5nZXRTY2hlbWFSZWYocmVmUGF0aCk7XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgdGFyZ2V0ID0gdGhpcy5nZXRTY2hlbWFCeUlkKHJlZlBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgaWYgKHRhcmdldCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgbm9kZS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uKFwiVmFsaWRhdGVfUmVmX1RydWVcIiwgKCkgPT4ge30pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBkZWZpbmVFcnJvciA9IGdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5KFxuICAgICAgICAgICAgICBcIiRyZWZcIixcbiAgICAgICAgICAgICAgbm9kZSBhcyBhbnksXG4gICAgICAgICAgICAgIHRoaXMuZmFpbEZhc3RcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIG5vZGUuJHZhbGlkYXRlID0gZ2V0TmFtZWRGdW5jdGlvbihcbiAgICAgICAgICAgICAgXCJWYWxpZGF0ZV9SZWZfRmFsc2VcIixcbiAgICAgICAgICAgICAgKF9kYXRhOiBhbnkpID0+IGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXQgJiYgdHlwZW9mIHRhcmdldC4kdmFsaWRhdGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIG5vZGUuJHZhbGlkYXRlID0gdGFyZ2V0LiR2YWxpZGF0ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBub2RlKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gbm9kZVtrZXldO1xuICAgICAgICBpZiAoIXZhbHVlKSBjb250aW51ZTtcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB2ID0gdmFsdWVbaV07XG4gICAgICAgICAgICBpZiAodiAmJiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICBzdGFjay5wdXNoKHYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBzdGFjay5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiTUFZTyxJQUFNQSxFQUFOLGNBQThCQyxNQUNuQ0MsUUFDQUMsS0FDQUMsUUFDQUMsTUFDQUMsV0FBcUIsR0FDckJDLGFBQXVCLEdBQ3ZCQyxLQUNBQyxPQUVRQyxVQUFVQyxFQUFVLElBQUtDLEVBQWtCLEtBQ2pELElBQUlOLEVBQWEsR0FBR0ssS0FBV0UsS0FBS1QsVUFDaENHLEVBQWUsR0FBR0ssSUFZdEIsWUFYeUIsSUFBZEMsS0FBS1YsT0FDVyxpQkFBZFUsS0FBS1YsTUFBcUJVLEtBQUtWLFFBQVFVLEtBQUtKLFNBQ3JESCxHQUFjLElBQUlPLEtBQUtWLFFBRXpCSSxHQUFnQixJQUFJTSxLQUFLVixRQUczQlUsS0FBS04sYUFBZUEsRUFDcEJNLEtBQUtQLFdBQWFBLEVBR2JPLEtBQUtSLE9BQVdRLEtBQUtSLGlCQUFpQkwsRUFJcENhLEtBQUtSLE1BQU1LLFVBQVVKLEVBQVlDLEdBSC9CTSxJQUlYLENBRUFDLFdBQ0UsT0FBT0QsS0FBS0gsV0FDZCxDQUVRSyxXQUNOLE1BQU1DLEVBQWtCLENBQ3RCZCxRQUFTVyxLQUFLWCxRQUNkRSxRQUFTUyxLQUFLVCxRQUNkRCxLQUFNVSxLQUFLVixLQUNYRyxXQUFZTyxLQUFLUCxXQUNqQkMsYUFBY00sS0FBS04sYUFDbkJDLEtBQU1LLEtBQUtMLE1BT2IsT0FKSUssS0FBS1IsUUFDUFcsRUFBS1gsTUFBUVEsS0FBS1IsTUFBTVUsWUFHbkJDLENBQ1QsQ0FFQUMsVUFFRSxPQURBSixLQUFLQyxXQUNFRCxLQUFLRSxVQUNkLENBRUFHLFVBQ0UsTUFBTWIsRUFBUVEsS0FBS0MsV0FDbkIsTUFBTyxDQUNMUixXQUFZRCxFQUFNQyxXQUNsQkMsYUFBY0YsRUFBTUUsYUFFeEIsR0FlSVksRUFBOEMsS0FBTSxFQUVuRCxTQUFTQyxFQUNkQyxFQUNBWixFQUNBYSxHQUVBLEdBQUlBLEVBQ0YsT0FBT0gsRUFHVCxNQUFNSSxFQUFlLElBQUl2QixFQUFnQixXQUFXcUIsS0FDcERFLEVBQWFuQixRQUFVaUIsRUFDdkJFLEVBQWFkLE9BQVNBLEVBV3RCLE9BQU9lLEVBQ0wsZUFBZUgsSUFWd0IsQ0FBQ25CLEVBQVN1QixFQUFVLENBQUMsS0FDNURGLEVBQWFyQixRQUFVQSxFQUN2QnFCLEVBQWFwQixLQUFPc0IsRUFBUXRCLEtBQzVCb0IsRUFBYWxCLE1BQ1hvQixFQUFRcEIsUUFBMkIsSUFBbEJvQixFQUFRcEIsTUFBaUJvQixFQUFRcEIsV0FBUSxFQUM1RGtCLEVBQWFmLEtBQU9pQixFQUFRakIsS0FDckJlLEdBT1gsQ0FFTyxTQUFTRyxFQUFXQyxFQUFXQyxHQUNwQyxHQUFJQyxNQUFNQyxRQUFRSCxHQUFPLENBQ3ZCLElBQStCLElBQTNCRSxNQUFNQyxRQUFRRixHQUNoQixPQUFPLEVBR1QsR0FBSUQsRUFBS0ksU0FBV0gsRUFBUUcsT0FDMUIsT0FBTyxFQUdULFFBQVNDLEVBQUksRUFBR0EsRUFBSUosRUFBUUcsT0FBUUMsSUFDbEMsR0FBSU4sRUFBV0MsRUFBS0ssR0FBSUosRUFBUUksSUFDOUIsT0FBTyxFQUlYLE9BQU8sQ0FDVCxDQUVBLEdBQW9CLGlCQUFUTCxHQUE4QixPQUFUQSxFQUFlLENBQzdDLEdBQXVCLGlCQUFaQyxHQUFvQyxPQUFaQSxFQUNqQyxPQUFPLEVBR1QsVUFBV1AsS0FBT08sRUFDaEIsR0FBSUYsRUFBV0MsRUFBS04sR0FBTU8sRUFBUVAsSUFDaEMsT0FBTyxFQUlYLFVBQVdBLEtBQU9NLEVBQ2hCLEdBQUlELEVBQVdDLEVBQUtOLEdBQU1PLEVBQVFQLElBQ2hDLE9BQU8sRUFJWCxPQUFPLENBQ1QsQ0FFQSxPQUFvQyxJQUE3QlksT0FBT0MsR0FBR1AsRUFBTUMsRUFDekIsQ0FFTyxTQUFTTyxFQUFTM0IsR0FDdkIsTUFBdUIsaUJBQVRBLEdBQThCLE9BQVRBLElBQWtCcUIsTUFBTUMsUUFBUXRCLEVBQ3JFLENBa0JPLFNBQVM0QixFQUNkQyxFQUNBQyxHQUFzQixFQUN0QkMsRUFBTyxJQUFJQyxTQUVYLEdBQUksTUFBT0gsR0FBc0QsaUJBQVJBLEVBQ3ZELE9BQU9BLEVBR1QsR0FBSUUsRUFBS0UsSUFBSUosR0FDWCxPQUFPRSxFQUFLRyxJQUFJTCxHQUdsQixJQUFJTSxFQUVKLEdBQStCLG1CQUFwQkMsZ0JBR1QsT0FGQUQsRUFBUUMsZ0JBQWdCUCxHQUN4QkUsRUFBS00sSUFBSVIsRUFBS00sR0FDUEEsRUFHVCxRQUFRLEdBQ04sS0FBS2QsTUFBTUMsUUFBUU8sR0FDakJNLEVBQVEsR0FDUkosRUFBS00sSUFBSVIsRUFBS00sR0FDZCxRQUFTWCxFQUFJLEVBQUdjLEVBQUlULEVBQUlOLE9BQVFDLEVBQUljLEVBQUdkLElBQ3JDVyxFQUFNWCxHQUFLSSxFQUFVQyxFQUFJTCxHQUFJTSxFQUFxQkMsR0FFcEQsT0FBT0ksRUFFVCxLQUFLTixhQUFlVSxLQUdsQixPQUZBSixFQUFRLElBQUlJLEtBQUtWLEVBQUlXLFdBQ3JCVCxFQUFLTSxJQUFJUixFQUFLTSxHQUNQQSxFQUVULEtBQUtOLGFBQWVZLE9BR2xCLE9BRkFOLEVBQVEsSUFBSU0sT0FBT1osRUFBSWEsT0FBUWIsRUFBSWMsT0FDbkNaLEVBQUtNLElBQUlSLEVBQUtNLEdBQ1BBLEVBRVQsS0FBS04sYUFBZWUsSUFDbEJULEVBQVEsSUFBSVMsSUFDWmIsRUFBS00sSUFBSVIsRUFBS00sR0FDZCxVQUFZdEIsRUFBS2dDLEtBQVVoQixFQUFJaUIsVUFDN0JYLEVBQU1FLElBQ0pULEVBQVVmLEVBQUtpQixFQUFxQkMsR0FDcENILEVBQVVpQixFQUFPZixFQUFxQkMsSUFHMUMsT0FBT0ksRUFFVCxLQUFLTixhQUFla0IsSUFDbEJaLEVBQVEsSUFBSVksSUFDWmhCLEVBQUtNLElBQUlSLEVBQUtNLEdBQ2QsVUFBV1UsS0FBU2hCLEVBQUltQixTQUN0QmIsRUFBTWMsSUFBSXJCLEVBQVVpQixFQUFPZixFQUFxQkMsSUFFbEQsT0FBT0ksRUFFVCxLQUFLTixhQUFlcUIsWUFHbEIsT0FGQWYsRUFBUU4sRUFBSXNCLE1BQU0sR0FDbEJwQixFQUFLTSxJQUFJUixFQUFLTSxHQUNQQSxFQUdULEtBQUtlLFlBQVlFLE9BQU92QixHQUd0QixPQUZBTSxFQUFRLElBQUtOLEVBQVl3QixZQUFZeEIsRUFBSXlCLE9BQU9ILE1BQU0sSUFDdERwQixFQUFLTSxJQUFJUixFQUFLTSxHQUNQQSxFQUdULElBQXVCLG9CQUFYb0IsUUFBMEIxQixhQUFlMEIsT0FHbkQsT0FGQXBCLEVBQVFvQixPQUFPQyxLQUFLM0IsR0FDcEJFLEVBQUtNLElBQUlSLEVBQUtNLEdBQ1BBLEVBRVQsS0FBS04sYUFBZXBDLE1BQ2xCMEMsRUFBUSxJQUFLTixFQUFZd0IsWUFBWXhCLEVBQUluQyxTQUN6Q3FDLEVBQUtNLElBQUlSLEVBQUtNLEdBQ2QsTUFHRixLQUFLTixhQUFlNEIsU0FDbEI1QixhQUFlRyxTQUNmSCxhQUFlNkIsUUFHZixPQUZBdkIsRUFBUU4sRUFDUkUsRUFBS00sSUFBSVIsRUFBS00sR0FDUEEsRUFHVCxLQUFLTixFQUFJd0IsYUFBZXhCLEVBQUl3QixjQUFnQjVCLE9BQzFDLElBQUtLLEVBR0gsT0FGQUssRUFBUU4sRUFDUkUsRUFBS00sSUFBSVIsRUFBS00sR0FDUEEsRUFFVEEsRUFBUVYsT0FBT2tDLE9BQU9sQyxPQUFPbUMsZUFBZS9CLElBQzVDRSxFQUFLTSxJQUFJUixFQUFLTSxHQUNkLE1BSUYsUUFBUyxDQUNQQSxFQUFRLENBQUMsRUFDVEosRUFBS00sSUFBSVIsRUFBS00sR0FFZCxNQUFNMEIsRUFBT0MsUUFBUUMsUUFBUWxDLEdBQzdCLFFBQVNMLEVBQUksRUFBR2MsRUFBSXVCLEVBQUt0QyxPQUFRQyxFQUFJYyxFQUFHZCxJQUFLLENBQzNDLE1BQU1YLEVBQU1nRCxFQUFLckMsR0FDakJXLEVBQU10QixHQUFpQmUsRUFDcEJDLEVBQVloQixHQUNiaUIsRUFDQUMsRUFFSixDQUNBLE9BQU9JLENBQ1QsRUFHRixNQUFNNkIsRUFBY3ZDLE9BQU93QywwQkFBMEJwQyxHQUNyRCxVQUFXaEIsS0FBT2lELFFBQVFDLFFBQVFDLEdBQWMsQ0FDOUMsTUFBTUUsRUFBYUYsRUFBWW5ELEdBQzNCLFVBQVdxRCxJQUNiQSxFQUFXckIsTUFBUWpCLEVBQVVzQyxFQUFXckIsTUFBT2YsRUFBcUJDLElBRXRFTixPQUFPMEMsZUFBZWhDLEVBQU90QixFQUFLcUQsRUFDcEMsQ0FFQSxPQUFPL0IsQ0FDVCxDQUVPLFNBQVNpQyxFQUFpQkMsR0FDL0IsT0FBTzFDLEVBQVMwQyxJQUFjLGNBQWVBLENBQy9DLENBRU8sU0FBU3JELEVBQW9Cc0QsRUFBY0MsR0FDaEQsT0FBTzlDLE9BQU8wQyxlQUFlSSxFQUFJLE9BQVEsQ0FBRTFCLE1BQU95QixHQUNwRCxDQzVUQSxJQUFNRSxFQUNKLGtFQUVJQyxFQUNKLHdFQUNJQyxFQUNKLHVJQUNJQyxFQUFZLG9DQUNaQyxFQUNKLHNMQUNJQyxFQUNKLGtIQUNJQyxFQUFhLDhDQUNiQyxFQUFtQixtQkFDbkJDLEVBQWtCLHVEQUNsQkMsRUFBMEIsd0NBQzFCQyxFQUNKLDZFQUNJQyxFQUNKLG1FQUNJQyxFQUFhLDRCQUNiQyxFQUFxQixzQkFDckJDLEVBQThCLG1DQUM5QkMsRUFDSixtRkFDSUMsRUFDSiw2RUFDSUMsRUFBcUIseUJBQ3JCQyxFQUFZLG9DQUNaQyxFQUNKLDZFQUNJQyxFQUFrQiw2QkFDbEJDLEVBQXFCLDRDQUNyQkMsRUFBbUIsS0FFbkJDLEVBQWdCLENBQUMsR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLEdBQUksR0FBSSxHQUFJLElBRXREQyxFQUFrRCxDQUM3RCxZQUFjaEcsR0FDWixNQUFNaUcsRUFBUWpHLEVBQUtpRyxNQUFNdkIsR0FDekIsSUFBS3VCLEVBQ0gsT0FBTyxFQUdULE1BQU8sQ0FBRUMsRUFBU0MsRUFBVUMsRUFBUUMsRUFBU0MsRUFBV0MsR0FBYU4sRUFFL0RPLEVBQU9DLE9BQU9QLEdBQ2RRLEVBQVFELE9BQU9OLEdBQ2ZRLEVBQU1GLE9BQU9MLEdBQ2JRLEVBQU9ILE9BQU9KLEdBQ2RRLEVBQVNKLE9BQU9ILEdBQ2hCUSxFQUFTTCxPQUFPRixHQUd0QixHQUFJRyxFQUFRLEdBQUtBLEVBQVEsR0FDdkIsT0FBTyxFQUdULEdBQUlDLEVBQU0sRUFDUixPQUFPLEVBR1QsTUFBTUksRUFDTSxJQUFWTCxFQUNJRixFQUFPLEdBQU0sR0FBTUEsRUFBTyxLQUFRLEdBQUtBLEVBQU8sS0FBUSxFQUVwRCxHQURBLEdBRUZULEVBQWNXLEVBQVEsR0FFNUIsU0FBS0ssR0FBV0osRUFBTUksS0FLUCxLQUFYRCxHQUE2QixLQUFYRCxHQUEwQixLQUFURCxFQUt6QyxFQUNBSSxJQUFJaEgsR0FDSzJFLEVBQVVzQyxLQUFLakgsR0FFeEJrSCxNQUFNbEgsR0FDRzRFLEVBQVlxQyxLQUFLakgsR0FFMUJtSCxLQUFLbkgsR0FFSTZFLEVBQVdvQyxLQUFLakgsR0FJekJvSCxLQUFLcEgsR0FDSCxHQUFhLE9BQVRBLEVBQ0YsT0FBTyxFQUdULElBQTBCLElBQXRCQSxFQUFLcUgsUUFBUSxNQUFldkMsRUFBV21DLEtBQUtqSCxHQUM5QyxPQUFPLEVBR1QsTUFBTXNILEdBQWdDLElBQXRCdEgsRUFBS3FILFFBQVEsS0FDN0IsSUFBSUUsRUFBZXZILEVBRW5CLEdBQUlzSCxFQUFTLENBQ1hDLEVBQWV2SCxFQUFLd0gsTUFBTSxLQUMxQixNQUFNQyxFQUFXRixFQUFhRyxNQUM5QixJQUFLN0MsRUFBV29DLEtBQUtRLEdBQ25CLE9BQU8sQ0FFWCxDQUVBLE1BQU1FLEdBQXFDLElBQXZCM0gsRUFBS3FILFFBQVEsTUFDM0JPLEVBQVdOLEVBQVVDLEVBQWFNLEtBQUssS0FBTzdILEVBRXBELEdBQUkySCxFQUNGLFFBQUlDLEVBQVNKLE1BQU0sTUFBTWpHLE9BQVMsRUFBSSxPQUlqQ3dELEVBQWlCa0MsS0FBS1csSUFJcEIxQyxFQUFxQitCLEtBQUtXLElBR25DLE1BQU1FLEVBQWM5QyxFQUFnQmlDLEtBQUtXLEdBQ25DRyxFQUFpQjlDLEVBQXdCZ0MsS0FBS1csR0FFcEQsT0FBSU4sRUFDS1EsSUFBZ0JDLEVBR2xCRCxJQUFnQkMsQ0FDekIsRUFFQUMsU0FBU2hJLEdBQ0FtRixFQUFlOEIsS0FBS2pILEdBRTdCaUksS0FBS2pJLEdBQ0gsTUFBTWlHLEVBQVFiLEVBQVc4QyxLQUFLbEksR0FDOUIsSUFBS2lHLEVBQ0gsT0FBTyxFQUdULE1BQU8sQ0FBRUMsRUFBU0MsRUFBVUMsR0FBVUgsRUFDaENPLEVBQU9DLE9BQU9QLEdBQ2RRLEVBQVFELE9BQU9OLEdBQ2ZRLEVBQU1GLE9BQU9MLEdBRW5CLEdBQUlNLEVBQVEsR0FBS0EsRUFBUSxHQUN2QixPQUFPLEVBRVQsR0FBSUMsRUFBTSxFQUNSLE9BQU8sRUFHVCxNQUFNSSxFQUNNLElBQVZMLEVBQ0lGLEVBQU8sR0FBTSxHQUFNQSxFQUFPLEtBQVEsR0FBS0EsRUFBTyxLQUFRLEVBRXBELEdBREEsR0FFRlQsRUFBY1csRUFBUSxHQUU1QixRQUFTSyxHQUFXSixHQUFPSSxDQUM3QixFQUNBb0IsTUFBTW5JLEdBQ0osSUFFRSxPQURBLElBQUl5QyxPQUFPekMsSUFDSixDQUNULE9BQVNvSSxHQUNQLE9BQU8sQ0FDVCxDQUNGLEVBQ0EsZUFBZXBJLEdBQ0EsS0FBVEEsR0FJR3FGLEVBQW1CNEIsS0FBS2pILEdBRWpDLHdCQUF3QkEsR0FDVCxLQUFUQSxHQUlHc0YsRUFBNEIyQixLQUFLakgsR0FFMUNxSSxLQUFLckksR0FDSXVGLEVBQVcwQixLQUFLakgsR0FFekIsZ0JBQWdCQSxJQUNWOEYsRUFBaUJtQixLQUFLakgsSUFJbkJ3RixFQUFvQnlCLEtBQUtqSCxHQUdsQyxlQUFlQSxHQUNOeUYsRUFBbUJ3QixLQUFLakgsR0FHakNzSSxTQUFTdEksR0FDQXlFLEVBQWV3QyxLQUFLakgsR0FHN0J1SSxLQUFLdkksR0FDSXdFLEVBQVd5QyxLQUFLakgsR0FJekJ3SSxJQUFJeEksR0FDSzBGLEVBQVV1QixLQUFLakgsR0FHeEIsZ0JBQWdCQSxJQUNWOEYsRUFBaUJtQixLQUFLakgsSUFHbkIyRixFQUFvQnNCLEtBQUtqSCxHQUlsQyxZQUFZQSxHQUNINEYsRUFBZ0JxQixLQUFLakgsR0FHOUIsZUFBZUEsR0FFTjZGLEVBQW1Cb0IsS0FBS2pILElDdk90QnlJLEVBQThDLENBQ3pEQyxPQUFPMUksR0FDRTJCLEVBQVMzQixHQUVsQjJJLE1BQU0zSSxHQUNHcUIsTUFBTUMsUUFBUXRCLEdBRXZCNEksT0FBTzVJLEdBQ2tCLGlCQUFUQSxFQUVoQjZJLE9BQU83SSxHQUNrQixpQkFBVEEsRUFFaEI4SSxRQUFROUksR0FDaUIsaUJBQVRBLEdBQXFCQSxFQUFPLEdBQU0sRUFFbEQrSSxRQUFRL0ksR0FDaUIsa0JBQVRBLEVBRWhCZ0osS0FBS2hKLEdBQ2EsT0FBVEEsRUFJVGlKLFdBQVcsRUFDWEMsTUFBTSxFQUNOQyxPQUFPLEVBQ1BDLE9BQU8sRUFDUEMsUUFBUSxFQUNSQyxPQUFPLEVBQ1BDLFFBQVEsRUFDUkMsU0FBUyxFQUNUQyxTQUFTLEdDNUJFQyxFQUFvRCxJQ0hNLENBQ3JFQyxTQUFTMUosRUFBUUQsRUFBTTRKLEdBQ3JCLEdBQUtqSSxFQUFTM0IsR0FJZCxRQUFTd0IsRUFBSSxFQUFHQSxFQUFJdkIsRUFBTzBKLFNBQVNwSSxPQUFRQyxJQUFLLENBQy9DLE1BQU1YLEVBQU1aLEVBQU8wSixTQUFTbkksR0FDNUIsSUFBS3hCLEVBQUs2SixlQUFlaEosR0FDdkIsT0FBTytJLEVBQVksK0JBQWdDLENBQ2pEakssS0FBTWtCLEVBQ05iLEtBQU1BLEVBQUthLElBR2pCLENBR0YsRUFFQWlKLFdBQVc3SixFQUFRRCxFQUFNNEosR0FDdkIsSUFBS2pJLEVBQVMzQixHQUNaLE9BR0YsSUFBSStKLEVBQVk5SixFQUFlK0osVUFDMUJELElBQ0hBLEVBQVd0SSxPQUFPb0MsS0FBSzVELEVBQU82SixZQUFjLENBQUMsR0FDN0NySSxPQUFPMEMsZUFBZWxFLEVBQVEsWUFBYSxDQUN6QzRDLE1BQU9rSCxFQUNQRSxZQUFZLEVBQ1pDLGNBQWMsRUFDZEMsVUFBVSxLQUlkLElBQUlDLEVBQWdCbkssRUFBZW9LLG1CQUlkLElBQWpCRCxJQUNGQSxFQUFlL0ksTUFBTUMsUUFBUXJCLEVBQU8wSixVQUFZMUosRUFBTzBKLFNBQVcsS0FDbEVsSSxPQUFPMEMsZUFBZWxFLEVBQVEsZ0JBQWlCLENBQzdDNEMsTUFBT3VILEVBQ1BILFlBQVksRUFDWkMsY0FBYyxFQUNkQyxVQUFVLEtBSWQsTUFBTVIsRUFBV1MsR0FBZ0IsR0FFakMsUUFBUzVJLEVBQUksRUFBR0EsRUFBSXVJLEVBQVN4SSxPQUFRQyxJQUFLLENBQ3hDLE1BQU1YLEVBQU1rSixFQUFTdkksR0FDZjhJLEVBQWFySyxFQUFPNkosV0FBV2pKLEdBRXJDLEdBQUtZLE9BQU84SSxVQUFVVixlQUFlVyxLQUFLeEssRUFBTWEsSUFvQmhELEdBQTBCLGtCQUFmeUosR0FVWCxHQUFJQSxHQUFjLGNBQWVBLEVBQVksQ0FDM0MsTUFBTUcsRUFBUUgsRUFBV0ksVUFBVTFLLEVBQUthLElBQ3hDLEdBQUk0SixFQUNGLE9BQU9iLEVBQVksc0JBQXVCLENBQ3hDakssS0FBTWtCLEVBQ05oQixNQUFPNEssRUFDUHpLLEtBQU1BLEVBQUthLElBR2pCLE9BbEJFLElBQW1CLElBQWZ5SixFQUNGLE9BQU9WLEVBQVksMEJBQTJCLENBQzVDakssS0FBTWtCLEVBQ05iLEtBQU1BLEVBQUthLFVBdkJmLEdBQ0U4SSxFQUFTcEksU0FDaUIsSUFBMUJvSSxFQUFTdEMsUUFBUXhHLElBQ2pCYyxFQUFTMkksSUFDVCxZQUFhQSxFQUNiLENBQ0EsTUFBTUcsRUFBUUgsRUFBV0ksVUFBVUosRUFBV0ssU0FDOUMsR0FBSUYsRUFDRixPQUFPYixFQUFZLDhCQUErQixDQUNoRGpLLEtBQU1rQixFQUNOaEIsTUFBTzRLLEVBQ1B6SyxLQUFNc0ssRUFBV0ssVUFHckIzSyxFQUFLYSxHQUFPZSxFQUFVMEksRUFBV0ssUUFDbkMsQ0F3QkosQ0FHRixFQUNBM0gsT0FBTy9DLEVBQVFELEVBQU00SixHQUNuQixJQUFLakksRUFBUzNCLEdBQ1osT0FHRixNQUFNNEssRUFBYzNLLEVBQU8rQyxPQUNyQjZILEVBQVdELEdBQWVBLEVBQVlGLFVBQzVDLEdBQXdCLG1CQUFiRyxFQUNULE9BR0YsTUFBTWhILEVBQU9wQyxPQUFPb0MsS0FBSzdELEdBQ3pCLFFBQVN3QixFQUFJLEVBQUdBLEVBQUlxQyxFQUFLdEMsT0FBUUMsSUFBSyxDQUNwQyxNQUFNWCxFQUFNZ0QsRUFBS3JDLEdBQ1hpSixFQUFRSSxFQUFTN0ssRUFBS2EsSUFDNUIsR0FBSTRKLEVBQ0YsT0FBT2IsRUFBWSxzQkFBdUIsQ0FDeENqSyxLQUFNa0IsRUFDTmhCLE1BQU80SyxFQUNQekssS0FBTUEsRUFBS2EsSUFHakIsQ0FDRixFQUVBaUssY0FBYzdLLEVBQVFELEVBQU00SixHQUMxQixHQUFLakksRUFBUzNCLE1BQVN5QixPQUFPb0MsS0FBSzdELEdBQU11QixRQUFVdEIsRUFBTzZLLGVBSTFELE9BQU9sQixFQUFZLHNCQUF1QixDQUFFNUosUUFDOUMsRUFFQStLLGNBQWM5SyxFQUFRRCxFQUFNNEosR0FDMUIsR0FBS2pJLEVBQVMzQixNQUFTeUIsT0FBT29DLEtBQUs3RCxHQUFNdUIsUUFBVXRCLEVBQU84SyxlQUkxRCxPQUFPbkIsRUFBWSxxQkFBc0IsQ0FBRTVKLFFBQzdDLEVBRUFnTCxxQkFBcUIvSyxFQUFRRCxFQUFNNEosR0FDakMsSUFBS2pJLEVBQVMzQixHQUNaLE9BR0YsTUFBTTZELEVBQU9wQyxPQUFPb0MsS0FBSzdELEdBRXpCLElBQUlpTCxFQUFnQmhMLEVBQWVpTCxtQkFDZCxJQUFqQkQsSUFDRkEsRUFBZTdHLEVBQWlCbkUsRUFBTytLLHNCQUN2Q3ZKLE9BQU8wQyxlQUFlbEUsRUFBUSxnQkFBaUIsQ0FDN0M0QyxNQUFPb0ksRUFDUGhCLFlBQVksS0FJaEIsSUFBSWtCLEVBQWVsTCxFQUFlbUwsdUJBSWxDLEdBQUluTCxFQUFPb0wsb0JBQXNCRixFQUFhLENBQzVDQSxFQUFjLEdBQ2QsVUFBV0csS0FBV3JMLEVBQU9vTCxrQkFDM0JGLEVBQVlJLEtBQUssQ0FDZnBELE1BQU8sSUFBSTFGLE9BQU82SSxFQUFTLEtBQzNCekssSUFBS3lLLElBR1Q3SixPQUFPMEMsZUFBZWxFLEVBQVEseUJBQTBCLENBQ3RENEMsTUFBT3NJLEVBQ1BsQixZQUFZLEdBRWhCLENBRUEsUUFBU3pJLEVBQUksRUFBR0EsRUFBSXFDLEVBQUt0QyxPQUFRQyxJQUFLLENBQ3BDLE1BQU1YLEVBQU1nRCxFQUFLckMsR0FFakIsSUFBSXZCLEVBQU82SixhQUFjN0osRUFBTzZKLFdBQVdELGVBQWVoSixHQUExRCxDQUlBLEdBQUlzSyxHQUFlQSxFQUFZNUosT0FBUSxDQUNyQyxJQUFJMEUsR0FBUSxFQUNaLFFBQVN1RixFQUFJLEVBQUdBLEVBQUlMLEVBQVk1SixPQUFRaUssSUFDdEMsR0FBSUwsRUFBWUssR0FBR3JELE1BQU1sQixLQUFLcEcsR0FBTSxDQUNsQ29GLEdBQVEsRUFDUixLQUNGLENBRUYsR0FBSUEsRUFDRixRQUVKLENBRUEsSUFBb0MsSUFBaENoRyxFQUFPK0sscUJBQ1QsT0FBT3BCLEVBQVksd0NBQXlDLENBQzFEakssS0FBTWtCLEVBQ05iLEtBQU1BLEVBQUthLEtBSWYsR0FBSW9LLEdBQWdCN0csRUFBaUJuRSxFQUFPK0ssc0JBQXVCLENBQ2pFLE1BQU1QLEVBQVF4SyxFQUFPK0sscUJBQXFCTixVQUFVMUssRUFBS2EsSUFDekQsR0FBSTRKLEVBQ0YsT0FBT2IsRUFBWSxvQ0FBcUMsQ0FDdERqSyxLQUFNa0IsRUFDTmhCLE1BQU80SyxFQUNQekssS0FBTUEsRUFBS2EsSUFHakIsQ0EvQkEsQ0FnQ0YsQ0FHRixFQUNBd0ssa0JBQWtCcEwsRUFBUUQsRUFBTTRKLEdBQzlCLElBQUtqSSxFQUFTM0IsR0FDWixPQUdGLElBQUltTCxFQUFlbEwsRUFBZW1MLHVCQUlsQyxJQUFLRCxFQUFhLENBQ2hCQSxFQUFjLEdBQ2QsTUFBTU0sRUFBV2hLLE9BQU9vQyxLQUFLNUQsRUFBT29MLG1CQUFxQixDQUFDLEdBQzFELFFBQVM3SixFQUFJLEVBQUdBLEVBQUlpSyxFQUFTbEssT0FBUUMsSUFBSyxDQUN4QyxNQUFNOEosRUFBVUcsRUFBU2pLLEdBQ3pCMkosRUFBWUksS0FBSyxDQUNmcEQsTUFBTyxJQUFJMUYsT0FBTzZJLEVBQVMsS0FDM0J6SyxJQUFLeUssR0FFVCxDQUNBN0osT0FBTzBDLGVBQWVsRSxFQUFRLHlCQUEwQixDQUN0RDRDLE1BQU9zSSxFQUNQbEIsWUFBWSxHQUVoQixDQUVBLE1BQU15QixFQUFXakssT0FBT29DLEtBQUs3RCxHQUU3QixRQUFTMkwsRUFBSSxFQUFHQSxFQUFJUixFQUFZNUosT0FBUW9LLElBQUssQ0FDM0MsTUFBTXhELE1BQUVBLEVBQU90SCxJQUFLK0ssR0FBZVQsRUFBWVEsR0FDekNyQixFQUFhckssRUFBT29MLGtCQUFrQk8sR0FFNUMsR0FBMEIsa0JBQWZ0QixHQWVYLEdBQUksY0FBZUEsRUFDakIsUUFBUzlJLEVBQUksRUFBR0EsRUFBSWtLLEVBQVNuSyxPQUFRQyxJQUFLLENBQ3hDLE1BQU1YLEVBQU02SyxFQUFTbEssR0FDckIsR0FBSTJHLEVBQU1sQixLQUFLcEcsR0FBTSxDQUNuQixNQUFNNEosRUFBUUgsRUFBV0ksVUFBVTFLLEVBQUthLElBQ3hDLEdBQUk0SixFQUNGLE9BQU9iLEVBQVksc0JBQXVCLENBQ3hDakssS0FBTWtCLEVBQ05oQixNQUFPNEssRUFDUHpLLEtBQU1BLEVBQUthLElBR2pCLENBQ0YsT0EzQkEsSUFBbUIsSUFBZnlKLEVBQ0YsUUFBUzlJLEVBQUksRUFBR0EsRUFBSWtLLEVBQVNuSyxPQUFRQyxJQUFLLENBQ3hDLE1BQU1YLEVBQU02SyxFQUFTbEssR0FDckIsR0FBSTJHLEVBQU1sQixLQUFLcEcsR0FDYixPQUFPK0ksRUFBWSwwQkFBMkIsQ0FDNUNqSyxLQUFNa0IsRUFDTmIsS0FBTUEsRUFBS2EsSUFHakIsQ0FvQk4sQ0FHRixFQUNBZ0wsY0FBYzVMLEVBQVFELEVBQU00SixHQUMxQixJQUFLakksRUFBUzNCLEdBQ1osT0FHRixNQUFNOEwsRUFBSzdMLEVBQU80TCxjQUVsQixHQUFrQixrQkFBUEMsRUFDVCxPQUFXLElBQVBBLEdBQWdCckssT0FBT29DLEtBQUs3RCxHQUFNdUIsT0FBUyxFQUN0Q3FJLEVBQVksNkJBQThCLENBQUU1SixjQUVyRCxFQUdGLE1BQU02SyxFQUFXaUIsR0FBTUEsRUFBR3BCLFVBQzFCLEdBQXdCLG1CQUFiRyxFQUlYLFVBQVdoSyxLQUFPYixFQUFNLENBQ3RCLElBQUt5QixPQUFPOEksVUFBVVYsZUFBZVcsS0FBS3hLLEVBQU1hLEdBQzlDLFNBRUYsTUFBTTRKLEVBQVFJLEVBQVNoSyxHQUN2QixHQUFJNEosRUFDRixPQUFPYixFQUFZLDJCQUE0QixDQUM3Q2pLLEtBQU1rQixFQUNOaEIsTUFBTzRLLEVBQ1B6SyxLQUFNQSxFQUFLYSxJQUdqQixDQUNGLEVBRUFrTCxhQUFhOUwsRUFBUUQsRUFBTTRKLEdBQ3pCLEdBQUtqSSxFQUFTM0IsR0FJZCxVQUFXYSxLQUFPWixFQUFPOEwsYUFBYyxDQUNyQyxHQUFJbEwsS0FBT2IsSUFBUyxFQUNsQixTQUdGLE1BQU1nTSxFQUFhL0wsRUFBTzhMLGFBQWFsTCxHQUN2QyxHQUFJUSxNQUFNQyxRQUFRMEssR0FBYSxDQUM3QixRQUFTeEssRUFBSSxFQUFHQSxFQUFJd0ssRUFBV3pLLE9BQVFDLElBQ3JDLEtBQU13SyxFQUFXeEssS0FBTXhCLEdBQ3JCLE9BQU80SixFQUFZLDhCQUErQixDQUNoRGpLLEtBQU02QixFQUNOeEIsS0FBTWdNLEVBQVd4SyxLQUl2QixRQUNGLENBQ0EsR0FBMEIsa0JBQWZ3SyxFQUEwQixDQUNuQyxHQUFJQSxFQUNGLFNBRUYsT0FBT3BDLEVBQVksOEJBQStCLENBQUU1SixLQUFNZ00sR0FDNUQsQ0FFQSxHQUEwQixpQkFBZkEsRUFBeUIsQ0FDbEMsR0FBSUEsS0FBY2hNLEVBQ2hCLFNBRUYsT0FBTzRKLEVBQVksOEJBQStCLENBQUU1SixLQUFNZ00sR0FDNUQsQ0FDQSxNQUFNdkIsRUFBUXVCLEVBQVd0QixVQUFVMUssR0FDbkMsR0FBSXlLLEVBQ0YsT0FBT2IsRUFBWSw4QkFBK0IsQ0FDaEQvSixNQUFPNEssRUFDUHpLLFFBR04sQ0FHRixFQUdBaU0sTUFBTSxFQUNOQyxNQUFNLEVBQ052QixTQUFTLEVBR1R3QixhQUFhLEVBQ2JDLEtBQUssRUFDTEMsU0FBUyxFQUdUQyxPQUFPLEVBQ1BDLGFBQWEsRUFDYkMsVUFBVSxFQUNWQyxVQUFVLEVBQ1ZDLGtCQUFrQixFQUNsQkMsaUJBQWlCLEVBR2pCQyxlQUFlLEVBQ2ZDLFVBQVUsTUM3WGtELENBRTVEQyxNQUFNN00sRUFBUUQsRUFBTTRKLEdBQ2xCLElBQUt2SSxNQUFNQyxRQUFRdEIsR0FDakIsT0FHRixNQUFNK00sRUFBYzlNLEVBQU82TSxNQUNyQkUsRUFBYWhOLEVBQUt1QixPQUV4QixHQUEyQixrQkFBaEJ3TCxFQUNULE9BQW9CLElBQWhCQSxHQUF5QkMsRUFBYSxFQUNqQ3BELEVBQVksOEJBQStCLENBQUU1SixjQUV0RCxFQUdGLEdBQUlxQixNQUFNQyxRQUFReUwsR0FBYyxDQUM5QixNQUFNRSxFQUFvQkYsRUFBWXhMLE9BQ2hDMkwsRUFDSkQsRUFBb0JELEVBQWFDLEVBQW9CRCxFQUV2RCxRQUFTeEwsRUFBSSxFQUFHQSxFQUFJMEwsRUFBYTFMLElBQUssQ0FDcEMsTUFBTTJMLEVBQWFKLEVBQVl2TCxHQUUvQixHQUEwQixrQkFBZjJMLEVBQTBCLENBQ25DLElBQW1CLElBQWZBLFFBQW9DLElBQVpuTixFQUFLd0IsR0FDL0IsT0FBT29JLEVBQVksNEJBQTZCLENBQzlDakssS0FBTTZCLEVBQ054QixLQUFNQSxFQUFLd0IsS0FHZixRQUNGLENBRUEsTUFBTXFKLEVBQVdzQyxHQUFjQSxFQUFXekMsVUFDMUMsR0FBd0IsbUJBQWJHLEVBQXlCLENBQ2xDLE1BQU1KLEVBQVFJLEVBQVM3SyxFQUFLd0IsSUFDNUIsR0FBSWlKLEVBQ0YsT0FBT2IsRUFBWSx3QkFBeUIsQ0FDMUNqSyxLQUFNNkIsRUFDTjNCLE1BQU80SyxFQUNQekssS0FBTUEsRUFBS3dCLElBR2pCLENBQ0YsQ0FFQSxNQUNGLENBRUEsTUFBTXFKLEVBQVdrQyxHQUFlQSxFQUFZckMsVUFDNUMsR0FBd0IsbUJBQWJHLEVBSVgsUUFBU3JKLEVBQUksRUFBR0EsRUFBSXdMLEVBQVl4TCxJQUFLLENBQ25DLE1BQU1pSixFQUFRSSxFQUFTN0ssRUFBS3dCLElBQzVCLEdBQUlpSixFQUNGLE9BQU9iLEVBQVksd0JBQXlCLENBQzFDakssS0FBTTZCLEVBQ04zQixNQUFPNEssRUFDUHpLLEtBQU1BLEVBQUt3QixJQUdqQixDQUNGLEVBRUE0TCxTQUFTbk4sRUFBUUQsRUFBTTRKLEdBQ3JCLElBQUt2SSxNQUFNQyxRQUFRdEIsR0FDakIsT0FHRixNQUFNcU4sRUFBaUJwTixFQUFPbU4sU0FDeEJ2QyxFQUFXd0MsR0FBa0JBLEVBQWUzQyxVQUNsRCxHQUF3QixtQkFBYkcsRUFJWCxRQUFTckosRUFBSSxFQUFHQSxFQUFJeEIsRUFBS3VCLE9BQVFDLElBQUssQ0FDcEMsTUFBTWlKLEVBQVFJLEVBQVM3SyxFQUFLd0IsSUFDNUIsR0FBSWlKLEVBQ0YsT0FBT2IsRUFBWSx3QkFBeUIsQ0FDMUNqSyxLQUFNNkIsRUFDTjNCLE1BQU80SyxFQUNQekssS0FBTUEsRUFBS3dCLElBR2pCLENBQ0YsRUFFQThMLFNBQVNyTixFQUFRRCxFQUFNNEosR0FDckIsR0FBS3ZJLE1BQU1DLFFBQVF0QixNQUFTQSxFQUFLdUIsUUFBVXRCLEVBQU9xTixVQUlsRCxPQUFPMUQsRUFBWSxxQkFBc0IsQ0FBRTVKLFFBQzdDLEVBRUF1TixTQUFTdE4sRUFBUUQsRUFBTTRKLEdBQ3JCLEdBQUt2SSxNQUFNQyxRQUFRdEIsTUFBU0EsRUFBS3VCLFFBQVV0QixFQUFPc04sVUFJbEQsT0FBTzNELEVBQVksb0JBQXFCLENBQUU1SixRQUM1QyxFQUVBd04sZ0JBQWdCdk4sRUFBUUQsRUFBTTRKLEdBQzVCLEdBQUszSixFQUFPNk0sUUFBU25MLEVBQVMxQixFQUFPNk0sT0FBckMsQ0FJQSxJQUErQixJQUEzQjdNLEVBQU91TixnQkFDVCxPQUFJeE4sRUFBS3VCLE9BQVN0QixFQUFPNk0sTUFBTXZMLE9BQ3RCcUksRUFBWSxvQkFBcUIsQ0FBRTVKLGNBRTVDLEVBR0YsR0FBSTJCLEVBQVMxQixFQUFPdU4sa0JBQ2xCLEdBQUlwSixFQUFpQm5FLEVBQU91TixpQkFBa0IsQ0FDNUMsUUFBU2hNLEVBQUl2QixFQUFPNk0sTUFBTXZMLE9BQVFDLEVBQUl4QixFQUFLdUIsT0FBUUMsSUFBSyxDQUN0RCxNQUFNaUosRUFBUXhLLEVBQU91TixnQkFBZ0I5QyxVQUFVMUssRUFBS3dCLElBQ3BELEdBQUlpSixFQUNGLE9BQU9iLEVBQVksd0JBQXlCLENBQzFDakssS0FBTTZCLEVBQ04zQixNQUFPNEssRUFDUHpLLEtBQU1BLEVBQUt3QixJQUdqQixDQUNBLE1BQ0YsT0F0QkYsQ0E0QkYsRUFFQWlNLFlBQVl4TixFQUFRRCxFQUFNNEosR0FDeEIsSUFBS3ZJLE1BQU1DLFFBQVF0QixLQUFVQyxFQUFPd04sWUFDbEMsT0FHRixNQUFNQyxFQUFNMU4sRUFBS3VCLE9BQ2pCLEdBQUltTSxHQUFPLEVBQ1QsT0FHRixNQUFNQyxFQUFnQixJQUFJNUssSUFFMUIsUUFBU3ZCLEVBQUksRUFBR0EsRUFBSWtNLEVBQUtsTSxJQUFLLENBQzVCLE1BQU03QixFQUFPSyxFQUFLd0IsR0FDWm9NLFNBQWNqTyxFQUVwQixHQUNXLE9BQVRBLEdBQ1MsV0FBVGlPLEdBQ1MsV0FBVEEsR0FDUyxZQUFUQSxHQVNGLEdBQUlqTyxHQUF3QixpQkFBVEEsRUFDakIsUUFBUzZMLEVBQUksRUFBR0EsRUFBSWhLLEVBQUdnSyxJQUFLLENBQzFCLE1BQU1ySyxFQUFPbkIsRUFBS3dMLEdBQ2xCLEdBQUlySyxHQUF3QixpQkFBVEEsSUFBc0JELEVBQVdDLEVBQU14QixHQUN4RCxPQUFPaUssRUFBWSw2QkFBOEIsQ0FBRTVKLEtBQU1MLEdBRTdELE1BbkJGLENBTUUsR0FBSWdPLEVBQWMxTCxJQUFJdEMsR0FDcEIsT0FBT2lLLEVBQVksNkJBQThCLENBQUU1SixLQUFNTCxJQUUzRGdPLEVBQWMxSyxJQUFJdEQsRUFFcEIsQ0FVRixDQUNGLEVBRUFrTyxTQUFTNU4sRUFBUUQsRUFBTTRKLEdBQ3JCLEdBQUt2SSxNQUFNQyxRQUFRdEIsR0FBbkIsQ0FHQSxHQUErQixrQkFBcEJDLEVBQU80TixTQUNoQixPQUFJNU4sRUFBTzROLFNBQ1csSUFBaEI3TixFQUFLdUIsT0FDQXFJLEVBQVksdUNBQXdDLENBQUU1SixjQUUvRCxFQUdLNEosRUFBWSxtQ0FBb0MsQ0FBRTVKLFNBRzNELFFBQVN3QixFQUFJLEVBQUdBLEVBQUl4QixFQUFLdUIsT0FBUUMsSUFBSyxDQUVwQyxJQURjdkIsRUFBTzROLFNBQVNuRCxVQUFVMUssRUFBS3dCLElBRTNDLE1BR0osQ0FFQSxPQUFPb0ksRUFBWSx1Q0FBd0MsQ0FBRTVKLFFBcEI3RCxDQXFCRixNQzlNNkQsQ0FDN0Q4TixVQUFVN04sRUFBUUQsRUFBTTRKLEdBQ3RCLEtBQW9CLGlCQUFUNUosR0FBcUJBLEVBQUt1QixRQUFVdEIsRUFBTzZOLFdBSXRELE9BQU9sRSxFQUFZLDJDQUE0QyxDQUFFNUosUUFDbkUsRUFFQStOLFVBQVU5TixFQUFRRCxFQUFNNEosR0FDdEIsS0FBb0IsaUJBQVQ1SixHQUFxQkEsRUFBS3VCLFFBQVV0QixFQUFPOE4sV0FJdEQsT0FBT25FLEVBQVksMENBQTJDLENBQUU1SixRQUNsRSxFQUVBc0wsUUFBUXJMLEVBQVFELEVBQU00SixHQUNwQixHQUFvQixpQkFBVDVKLEVBQ1QsT0FHRixJQUFJZ08sRUFBaUIvTixFQUFlZ08sZUFDcEMsSUFBS0QsRUFDSCxJQUNFQSxFQUFnQixJQUFJdkwsT0FBT3hDLEVBQU9xTCxRQUFTLEtBQzNDN0osT0FBTzBDLGVBQWVsRSxFQUFRLGlCQUFrQixDQUM5QzRDLE1BQU9tTCxFQUNQL0QsWUFBWSxFQUNaQyxjQUFjLEVBQ2RDLFVBQVUsR0FFZCxPQUFTTSxHQUNQLE9BQU9iLEVBQVksNkJBQThCLENBQy9DNUosT0FDQUgsTUFBTzRLLEdBRVgsQ0FHRixPQUFJdUQsRUFBYy9HLEtBQUtqSCxRQUF2QixFQUlPNEosRUFBWSxtQ0FBb0MsQ0FBRTVKLFFBQzNELEVBSUFrTyxPQUFPak8sRUFBUUQsRUFBTTRKLEVBQWF1RSxHQUNoQyxHQUFvQixpQkFBVG5PLEVBQ1QsT0FHRixJQUFJb08sRUFBa0JuTyxFQUFlb08sZ0JBZXJDLFlBVnVCLElBQW5CRCxJQUNGQSxFQUFpQkQsRUFBU0csVUFBVXJPLEVBQU9pTyxRQUMzQ3pNLE9BQU8wQyxlQUFlbEUsRUFBUSxrQkFBbUIsQ0FDL0M0QyxNQUFPdUwsRUFDUG5FLFlBQVksRUFDWkMsY0FBYyxFQUNkQyxVQUFVLEtBSVRpRSxJQUFrQkEsRUFBZXBPLEdBSS9CNEosRUFBWSxrQ0FBbUMsQ0FBRTVKLGNBSnhELENBS0YsTUN6RTZELENBQzdEdU8sUUFBUXRPLEVBQVFELEVBQU00SixFQUFhdUUsR0FDakMsR0FBb0IsaUJBQVRuTyxFQUNULE9BR0YsSUFBSXdPLEVBQU12TyxFQUFPc08sUUFPakIsTUFOdUMsaUJBQTVCdE8sRUFBT3dPLGlCQUNoQkQsRUFBTXZPLEVBQU93TyxpQkFBbUIsT0FDSyxJQUE1QnhPLEVBQU93TyxtQkFDaEJELEdBQU8sT0FHTHhPLEVBQU93TyxFQUNGNUUsRUFBWSxpQ0FBa0MsQ0FBRTVKLGNBRHpELENBS0YsRUFFQTBPLFFBQVF6TyxFQUFRRCxFQUFNNEosRUFBYXVFLEdBQ2pDLEdBQW9CLGlCQUFUbk8sRUFDVCxPQUdGLElBQUkyTyxFQUFNMU8sRUFBT3lPLFFBT2pCLE1BTnVDLGlCQUE1QnpPLEVBQU8yTyxpQkFDaEJELEVBQU0xTyxFQUFPMk8saUJBQW1CLE9BQ0ssSUFBNUIzTyxFQUFPMk8sbUJBQ2hCRCxHQUFPLE9BR0wzTyxFQUFPMk8sRUFDRi9FLEVBQVksb0NBQXFDLENBQUU1SixjQUQ1RCxDQUtGLEVBRUE2TyxXQUFXNU8sRUFBUUQsRUFBTTRKLEVBQWF1RSxHQUNwQyxHQUFvQixpQkFBVG5PLEVBQ1QsT0FHRixNQUFNOE8sRUFBVzlPLEVBQU9DLEVBQU80TyxXQUUvQixPQUFLRSxTQUFTRCxHUHFIWCxTQUF3QkUsRUFBR0MsRUFBR0MsRUFBVSxPQUM3QyxPQUFPQyxLQUFLQyxJQUFJSixFQUFJQyxJQUFNQyxFQUFVQyxLQUFLUixJQUFJUSxLQUFLQyxJQUFJSixHQUFJRyxLQUFLQyxJQUFJSCxHQUNyRSxDT25IU0ksQ0FBZVAsRUFBVUssS0FBS0csTUFBTVIsU0FBekMsRUFDU2xGLEVBQVksNENBQTZDLENBQUU1SixjQUxwRSxDQVNGLEVBRUF5TyxpQkFBaUJ4TyxFQUFRRCxFQUFNNEosRUFBYXVFLEdBQzFDLEdBQ2tCLGlCQUFUbk8sR0FDNEIsaUJBQTVCQyxFQUFPd08sb0JBQ2QsWUFBYXhPLEdBS2YsT0FBSUQsR0FBUUMsRUFBT3dPLGlCQUFtQixNQUM3QjdFLEVBQVksNERBRHJCLENBS0YsRUFFQWdGLGlCQUFpQjNPLEVBQVFELEVBQU00SixFQUFhdUUsR0FDMUMsR0FDa0IsaUJBQVRuTyxHQUM0QixpQkFBNUJDLEVBQU8yTyxvQkFDZCxZQUFhM08sR0FLZixPQUFJRCxHQUFRQyxFQUFPMk8saUJBQ1ZoRixFQUNMLHlEQUNBLENBQUU1SixjQUhOLENBUUYsTUN6RjRELENBQzVEdVAsS0FBS3RQLEVBQVFELEVBQU00SixHQUNqQixNQUFNNEYsRUFBT3ZQLEVBQU9zUCxLQUVwQixRQUFTL04sRUFBSSxFQUFHQSxFQUFJZ08sRUFBS2pPLE9BQVFDLElBQUssQ0FDcEMsTUFBTWlPLEVBQVdELEVBQUtoTyxHQUV0QixHQUFJaU8sSUFBYXpQLEVBQ2YsT0FHRixHQUNlLE9BQWJ5UCxHQUNTLE9BQVR6UCxHQUNvQixpQkFBYnlQLEdBQ1MsaUJBQVR6UCxJQUNOa0IsRUFBV3VPLEVBQVV6UCxHQUV0QixNQUVKLENBRUEsT0FBTzRKLEVBQVkseUNBQTBDLENBQUU1SixRQUNqRSxFQUVBMFAsTUFBTXpQLEVBQVFELEVBQU00SixHQUNsQixRQUFTcEksRUFBSSxFQUFHQSxFQUFJdkIsRUFBT3lQLE1BQU1uTyxPQUFRQyxJQUN2QyxHQUFJRyxFQUFTMUIsRUFBT3lQLE1BQU1sTyxLQUN4QixHQUFJLGNBQWV2QixFQUFPeVAsTUFBTWxPLEdBQUksQ0FDbEMsTUFBTWlKLEVBQVF4SyxFQUFPeVAsTUFBTWxPLEdBQUdrSixVQUFVMUssR0FDeEMsR0FBSXlLLEVBQ0YsT0FBT2IsRUFBWSxxQkFBc0IsQ0FBRS9KLE1BQU80SyxFQUFPekssUUFFN0QsT0FJRixHQUErQixrQkFBcEJDLEVBQU95UCxNQUFNbE8sSUFPeEIsR0FBSXhCLElBQVNDLEVBQU95UCxNQUFNbE8sR0FDeEIsT0FBT29JLEVBQVkscUJBQXNCLENBQUU1SixjQVAzQyxHQUFJMlAsUUFBUTNQLEtBQVVDLEVBQU95UCxNQUFNbE8sR0FDakMsT0FBT29JLEVBQVkscUJBQXNCLENBQUU1SixRQVduRCxFQUVBNFAsTUFBTTNQLEVBQVFELEVBQU00SixHQUNsQixRQUFTcEksRUFBSSxFQUFHQSxFQUFJdkIsRUFBTzJQLE1BQU1yTyxPQUFRQyxJQUFLLENBQzVDLEdBQUlHLEVBQVMxQixFQUFPMlAsTUFBTXBPLElBQUssQ0FDN0IsR0FBSSxjQUFldkIsRUFBTzJQLE1BQU1wTyxHQUFJLENBRWxDLElBRGN2QixFQUFPMlAsTUFBTXBPLEdBQUdrSixVQUFVMUssR0FFdEMsT0FFRixRQUNGLENBQ0EsTUFDRixDQUNFLEdBQStCLGtCQUFwQkMsRUFBTzJQLE1BQU1wTyxJQUNsQm1PLFFBQVEzUCxLQUFVQyxFQUFPMlAsTUFBTXBPLEdBQ2pDLE9BSUosR0FBSXhCLElBQVNDLEVBQU8yUCxNQUFNcE8sR0FDeEIsTUFHTixDQUVBLE9BQU9vSSxFQUFZLHFCQUFzQixDQUFFNUosUUFDN0MsRUFFQTZQLE1BQU01UCxFQUFRRCxFQUFNNEosR0FDbEIsTUFBTTRGLEVBQU92UCxFQUFPNFAsTUFDcEIsSUFBSUMsRUFBYSxFQUVqQixRQUFTdE8sRUFBSSxFQUFHQSxFQUFJZ08sRUFBS2pPLE9BQVFDLElBQUssQ0FDcEMsTUFBTXVPLEVBQU1QLEVBQUtoTyxHQUVqQixHQUFJRyxFQUFTb08sR0FBYixDQUNFLEdBQUksY0FBZUEsRUFBSyxDQUV0QixJQURjQSxFQUFJckYsVUFBVTFLLEtBRTFCOFAsSUFDSUEsRUFBYSxHQUNmLE9BQU9sRyxFQUFZLHFCQUFzQixDQUFFNUosU0FHL0MsUUFDRixDQUVBLEdBREE4UCxJQUNJQSxFQUFhLEVBQ2YsT0FBT2xHLEVBQVkscUJBQXNCLENBQUU1SixRQUcvQyxNQUVBLEdBQW1CLGtCQUFSK1AsR0FVWCxHQUFJL1AsSUFBUytQLElBQ1hELElBQ0lBLEVBQWEsR0FDZixPQUFPbEcsRUFBWSxxQkFBc0IsQ0FBRTVKLGNBWjdDLEdBQUkyUCxRQUFRM1AsS0FBVStQLElBQ3BCRCxJQUNJQSxFQUFhLEdBQ2YsT0FBT2xHLEVBQVkscUJBQXNCLENBQUU1SixRQVluRCxDQUVBLEdBQW1CLElBQWY4UCxFQUlKLE9BQU9sRyxFQUFZLHFCQUFzQixDQUFFNUosUUFDN0MsRUFFQWdRLE1BQU0vUCxFQUFRRCxFQUFNNEosR0FDbEIsR0FBSTVKLElBQVNDLEVBQU8rUCxTQUtqQnJPLEVBQVMzQixJQUNSMkIsRUFBUzFCLEVBQU8rUCxTQUNmOU8sRUFBV2xCLEVBQU1DLEVBQU8rUCxRQUMxQjNPLE1BQU1DLFFBQVF0QixJQUNicUIsTUFBTUMsUUFBUXJCLEVBQU8rUCxTQUNwQjlPLEVBQVdsQixFQUFNQyxFQUFPK1AsUUFJN0IsT0FBT3BHLEVBQVkscUJBQXNCLENBQUU1SixRQUM3QyxFQUVBaVEsR0FBR2hRLEVBQVFELEdBQ1QsR0FBSSxTQUFVQyxJQUFXLEdBQVMsU0FBVUEsSUFBVyxFQUNyRCxPQUVGLEdBQXlCLGtCQUFkQSxFQUFPZ1EsR0FBa0IsQ0FDbEMsR0FBSWhRLEVBQU9nUSxJQUNULEdBQUk3TCxFQUFpQm5FLEVBQU9nTSxNQUMxQixPQUFPaE0sRUFBT2dNLEtBQUt2QixVQUFVMUssUUFFakMsR0FBV29FLEVBQWlCbkUsRUFBT2lNLE1BQ2pDLE9BQU9qTSxFQUFPaU0sS0FBS3hCLFVBQVUxSyxHQUUvQixNQUNGLENBRUEsSUFBS29FLEVBQWlCbkUsRUFBT2dRLElBQzNCLE9BSUYsT0FEY2hRLEVBQU9nUSxHQUFHdkYsVUFBVTFLLEdBTzVCb0UsRUFBaUJuRSxFQUFPaU0sTUFDbkJqTSxFQUFPaU0sS0FBS3hCLFVBQVUxSyxRQUUvQixFQVJJb0UsRUFBaUJuRSxFQUFPZ00sTUFDbkJoTSxFQUFPZ00sS0FBS3ZCLFVBQVUxSyxRQUUvQixDQU9KLEVBRUFrUSxJQUFJalEsRUFBUUQsRUFBTTRKLEdBQ2hCLEdBQTBCLGtCQUFmM0osRUFBT2lRLElBQ2hCLE9BQUlqUSxFQUFPaVEsSUFDRnRHLEVBQVkscUJBQXNCLENBQUU1SixjQUU3QyxFQUdGLEdBQUkyQixFQUFTMUIsRUFBT2lRLEtBQU0sQ0FDeEIsR0FBSSxjQUFlalEsRUFBT2lRLElBQUssQ0FDN0IsTUFBTXpGLEVBQVF4SyxFQUFPaVEsSUFBSXhGLFVBQVUxSyxHQUNuQyxPQUFLeUssT0FHTCxFQUZTYixFQUFZLHFCQUFzQixDQUFFL0osTUFBTzRLLEVBQU96SyxRQUc3RCxDQUNBLE9BQU80SixFQUFZLHFCQUFzQixDQUFFNUosUUFDN0MsQ0FFQSxPQUFPNEosRUFBWSxxQkFBc0IsQ0FBRTVKLFFBQzdDLEVBRUFtUSxLQUFLbFEsRUFBUUQsRUFBTTRKLEVBQWF1RSxHQUM5QixHQUFJbE8sRUFBT21RLGFBQ1QsT0FBT25RLEVBQU9tUSxhQUFhcFEsR0FHN0IsTUFBTXFRLEVBQVVwUSxFQUFPa1EsS0FDdkIsSUFBSUcsRUFBZW5DLEVBQVNvQyxhQUFhRixHQU16QyxPQUpLQyxJQUNIQSxFQUFlbkMsRUFBU3FDLGNBQWNILElBR25DQyxFQUlBQSxFQUFhNUYsV0FJbEJ6SyxFQUFPbVEsYUFBZUUsRUFBYTVGLFVBQzVCekssRUFBT21RLGFBQWFwUSxTQUwzQixFQUhTNEosRUFBWSxzQkFBc0J5RyxJQVM3QyxJLGdCQ3hLSyxNQUNHSSxNQUE4QyxDQUFDLEVBQy9DQyxRQUFrRCxDQUFDLEVBQ25EaEgsU0FBb0QsQ0FBQyxFQUNyRGlILFdBQVksRUFDWkMsV0FBb0MsS0FDcENDLFdBQTBDLElBQUlqTyxJQUM5QzlCLFVBQW9CLEVBRTVCdUMsYUFBWXNOLFVBQ1ZBLEdBQVksRUFBQTdQLFNBQ1pBLEdBQVcsR0FJVCxDQUFDLEdBQ0hULEtBQUtzUSxVQUFZQSxFQUNqQnRRLEtBQUtTLFNBQVdBLEVBRWhCLFVBQVk4TSxFQUFNa0QsS0FBY3JQLE9BQU9xQixRQUFRMkYsR0FDekNxSSxHQUNGelEsS0FBSzBRLFFBQVFuRCxFQUFNa0QsR0FJdkIsVUFBWWxSLEVBQVNrUixLQUFjclAsT0FBT3FCLFFBQVE0RyxHQUNoRHJKLEtBQUsyUSxXQUFXcFIsRUFBU2tSLEdBRzNCLFVBQVk1QyxFQUFRNEMsS0FBY3JQLE9BQU9xQixRQUFRa0QsR0FDM0M4SyxHQUNGelEsS0FBSzRRLFVBQVUvQyxFQUFRNEMsRUFHN0IsQ0FFQUMsUUFBUXpNLEVBQWN3TSxFQUF5QkksR0FBWSxHQUN6RCxHQUFJN1EsS0FBS29RLE1BQU1uTSxLQUFVNE0sRUFDdkIsTUFBTSxJQUFJMVIsRUFBZ0IsU0FBUzhFLHFCQUVyQ2pFLEtBQUtvUSxNQUFNbk0sR0FBUXdNLENBQ3JCLENBRUFLLFFBQVF2RCxHQUNOLE9BQU92TixLQUFLb1EsTUFBTTdDLEVBQ3BCLENBRUFxRCxVQUFVM00sRUFBY3dNLEVBQTJCSSxHQUFZLEdBQzdELEdBQUk3USxLQUFLcVEsUUFBUXBNLEtBQVU0TSxFQUN6QixNQUFNLElBQUkxUixFQUFnQixXQUFXOEUscUJBRXZDakUsS0FBS3FRLFFBQVFwTSxHQUFRd00sQ0FDdkIsQ0FFQXhDLFVBQVVKLEdBQ1IsT0FBTzdOLEtBQUtxUSxRQUFReEMsRUFDdEIsQ0FFQThDLFdBQVcxTSxFQUFjd00sRUFBNEJJLEdBQVksR0FDL0QsR0FBSTdRLEtBQUtxSixTQUFTcEYsS0FBVTRNLEVBQzFCLE1BQU0sSUFBSTFSLEVBQWdCLFlBQVk4RSxxQkFFeENqRSxLQUFLcUosU0FBU3BGLEdBQVF3TSxDQUN4QixDQUVBTSxXQUFXeFIsR0FDVCxPQUFPUyxLQUFLcUosU0FBUzlKLEVBQ3ZCLENBRUEyUSxhQUFhYyxHQUNYLEdBQUtoUixLQUFLdVEsV0FHVixPVDRMRyxTQUFxQlUsRUFBV0QsR0FDckMsSUFBS0EsR0FBaUIsTUFBVEEsRUFDWCxPQUFPQyxFQUlULEdBQUlELEVBQUtFLFdBQVcsTUFBTyxDQUN6QixNQUFNQyxFQUFRSCxFQUFLN0osTUFBTSxLQUFLckUsTUFBTSxHQUNwQyxJQUFJL0IsRUFBVWtRLEVBRWQsVUFBV0csS0FBUUQsRUFBTyxDQUN4QixNQUNNM1EsRUFEaUI2USxtQkFBbUJELEdBQ2ZFLFFBQVEsTUFBTyxLQUFLQSxRQUFRLE1BQU8sS0FFOUQsSUFBSXZRLEdBQThCLGlCQUFaQSxLQUF3QlAsS0FBT08sR0FHbkQsT0FGQUEsRUFBVUEsRUFBUVAsRUFJdEIsQ0FDQSxPQUFPTyxDQUNULENBR0EsSUFBS2lRLEVBQUtPLFNBQVMsS0FBTSxDQUN2QixHQUFJTixFQUFLbkYsYUFBZW1GLEVBQUtuRixZQUFZa0YsR0FDdkMsT0FBT0MsRUFBS25GLFlBQVlrRixHQUUxQixHQUFJQyxFQUFLTyxNQUFRUCxFQUFLTyxLQUFLUixHQUN6QixPQUFPQyxFQUFLTyxLQUFLUixHQUduQixHQUFJQyxFQUFLbEYsS0FBMkIsaUJBQWJrRixFQUFLbEYsTUFDdEJrRixFQUFLbEYsTUFBUWlGLEdBQVFDLEVBQUtsRixJQUFJMEYsU0FBUyxJQUFNVCxJQUMvQyxPQUFPQyxDQUdiLENBR0YsQ1NwT1dTLENBQVkxUixLQUFLdVEsV0FBWVMsRUFDdEMsQ0FFQWIsY0FBY3dCLEdBQ1osT0FBTzNSLEtBQUt3USxXQUFXM08sSUFBSThQLEVBQzdCLENBRUFDLFFBQVFoUyxHQUNOSSxLQUFLd1EsV0FBV3FCLFFBQ2hCLE1BQU1DLEVBQWlCOVIsS0FBSytSLGNBQWNuUyxHQUkxQyxHQUhBSSxLQUFLdVEsV0FBYXVCLEVBQ2xCOVIsS0FBS2dTLGVBQWVGLElBRWZBLEVBQWV6SCxVQUFXLENBQzdCLElBQWtDLElBQTlCckssS0FBS2lTLGFBQWFyUyxHQUNwQixNQUFNLElBQUlULEVBQWdCLGtCQUc1QjJTLEVBQWV6SCxVQUFZMUosRUFDekIsZUFDQSxPQUVKLENBRUEsTUFBTTZKLEVBQXVCN0ssSUFDM0JLLEtBQUt1USxXQUFhdUIsRUFFbEIsTUFBTUksRUFBYWxTLEtBQUtzUSxVQUFZL08sRUFBVTVCLEdBQVFBLEVBQ2hEd1MsRUFBTUwsRUFBZXpILFVBQVc2SCxHQUV0QyxPQUFJQyxFQUNLLENBQUV4UyxLQUFNdVMsRUFBWTlILE1BQU8rSCxFQUFLQyxPQUFPLEdBR3pDLENBQUV6UyxLQUFNdVMsRUFBWTlILE1BQU8sS0FBTWdJLE9BQU8sRUFBSyxFQUl0RCxPQURBNUgsRUFBU3NILGVBQWlCQSxFQUNuQnRILENBQ1QsQ0FFUXVILGNBQWNuUyxHQUNmMEIsRUFBUzFCLEtBRVZBLEdBRGEsSUFBWEEsRUFDTyxDQUFFMlAsTUFBTyxDQUFDLENBQUMsS0FDQSxJQUFYM1AsRUFDQSxDQUFFNFAsTUFBTyxJQUVULENBQUVBLE1BQU8sQ0FBQzVQLEtBSXZCLE1BQU1rUyxFQUFpQ3ZRLEVBQVUzQixHQU1qRCxHQUowQixpQkFBZkEsRUFBT21NLEtBQ2hCL0wsS0FBS3dRLFdBQVd4TyxJQUFJcEMsRUFBT21NLElBQUsrRixHQUc5QixTQUFVbFMsRUFBUSxDQUNwQixNQUFNeVMsRUFBZXJTLEtBQUsrUSxXQUFXLFFBQ3JDLEdBQUlzQixFQUFjLENBQ2hCLE1BQU05SSxFQUFjaEosRUFDbEIsT0FDQVgsRUFBYSxLQUNiSSxLQUFLUyxVQUdQcVIsRUFBZXpILFVBQVkxSixFQUN6QixxQkFDQ2hCLEdBQ0UwUyxFQUNDUCxFQUNBblMsRUFDQTRKLEVBQ0F2SixNQUdSLENBQ0EsT0FBTzhSLENBQ1QsQ0FFQSxNQUFNUSxFQUE4QixHQUM5QkMsRUFBd0IsR0FFOUIsR0FBSSxTQUFVM1MsRUFBUSxDQUNwQixNQUFNNFMsRUFBa0JqUyxFQUN0QixPQUNBWCxFQUNBSSxLQUFLUyxVQUVEMlAsRUFBUXBQLE1BQU1DLFFBQVFyQixFQUFPMk4sTUFDL0IzTixFQUFPMk4sS0FDUDNOLEVBQU8yTixLQUFLcEcsTUFBTSxLQUFLc0wsSUFBS0MsR0FBY0EsRUFBRUMsUUFFMUNDLEVBQWdDLEdBQ2hDQyxFQUFzQixHQUU1QixVQUFXdEYsS0FBUTZDLEVBQU8sQ0FDeEIsTUFBTUssRUFBWXpRLEtBQUs4USxRQUFRdkQsR0FDM0JrRCxJQUNGbUMsRUFBYzFILEtBQUt1RixHQUNuQm9DLEVBQVUzSCxLQUFLdUYsRUFBVXhNLE1BRTdCLENBRUEsR0FBNkIsSUFBekIyTyxFQUFjMVIsT0FDaEIsTUFBTVgsRUFDSixPQUNBWCxFQUNBSSxLQUFLUyxTQUhERixDQUlKLDBCQUEyQixDQUFFWixLQUFNQyxFQUFPMk4sT0FHOUMsSUFBSXVGLEVBQ0FDLEVBQWlCLEdBRXJCLEdBQTZCLElBQXpCSCxFQUFjMVIsT0FBYyxDQUM5QjZSLEVBQWlCRixFQUFVLEdBQzNCLE1BQU1HLEVBQWVKLEVBQWMsR0FDbkNFLEVBQXlCblQsSUFDdkIsSUFBS3FULEVBQWFyVCxHQUNoQixPQUFPNlMsRUFBZ0IsZUFBZ0IsQ0FBRTdTLFFBQzNDLENBRUosTUFDRW9ULEVBQWlCRixFQUFVckwsS0FBSyxRQUNoQ3NMLEVBQXlCblQsSUFDdkIsUUFBU3dCLEVBQUksRUFBR0EsRUFBSXlSLEVBQWMxUixPQUFRQyxJQUN4QyxHQUFJeVIsRUFBY3pSLEdBQUd4QixHQUNuQixPQUdKLE9BQU82UyxFQUFnQixlQUFnQixDQUFFN1MsUUFBTSxFQUluRCxNQUFNc1QsRUFBK0IsQ0FBQ0MsRUFBSXZULElBQ3hDbVQsRUFBc0JuVCxHQUV4QjJTLEVBQVdwSCxLQUFLLENBQ2RoSCxHQUFJdkQsRUFBaUJvUyxFQUFnQkUsR0FDckMxSixZQUFhaUosSUFFZkQsRUFBWXJILEtBQUs2SCxFQUNuQixDQUVBLE1BQU14RixLQUFFQSxFQUFBeEIsSUFBTUEsRUFBQStELEtBQUtBLEVBQUF6RixVQUFNQSxFQUFBZixTQUFXQSxLQUFhNkosR0FBY3ZULEVBSXpEd1QsRUFBVzlKLEVBQ2IsSUFBSWxJLE9BQU9vQyxLQUFLMlAsR0FBWSxZQUM1Qi9SLE9BQU9vQyxLQUFLMlAsR0FDaEIsVUFBVzNTLEtBQU80UyxFQUFVLENBQzFCLE1BQU1DLEVBQVlyVCxLQUFLK1EsV0FBV3ZRLEdBRWxDLEdBQUk2UyxFQUFXLENBQ2IsTUFBTTlKLEVBQWNoSixFQUNsQkMsRUFDQVosRUFBT1ksR0FDUFIsS0FBS1MsVUFFRDZTLEVBQVNELEVBQVVwUCxNQUFRekQsRUFFakM4UixFQUFXcEgsS0FBSyxDQUNkaEgsR0FBSW1QLEVBQ0o5SixnQkFHRmdKLEVBQVlySCxLQUFLb0ksRUFDbkIsQ0FDRixDQUVBLE1BQU1DLEVBQWtCLENBQUMsT0FBUSxRQUFTLFVBQVcsWUFDckQsVUFBVy9TLEtBQU80UyxFQUNoQixJQUFJRyxFQUFnQmhDLFNBQVMvUSxHQUc3QixHQUFJYyxFQUFTMUIsRUFBT1ksSUFBcEIsQ0FDRSxHQUFZLGVBQVJBLEVBQXNCLENBQ3hCLFVBQVdnVCxLQUFVcFMsT0FBT29DLEtBQUs1RCxFQUFPWSxJQUN0Q3NSLEVBQWV0UixHQUFLZ1QsR0FBVXhULEtBQUsrUixjQUNqQ25TLEVBQU9ZLEdBQUtnVCxJQUdoQixRQUNGLENBQ0ExQixFQUFldFIsR0FBT1IsS0FBSytSLGNBQWNuUyxFQUFPWSxHQUVsRCxNQUVBLEdBQUlRLE1BQU1DLFFBQVFyQixFQUFPWSxJQUN2QixRQUFTVyxFQUFJLEVBQUdBLEVBQUl2QixFQUFPWSxHQUFLVSxPQUFRQyxJQUNsQ25CLEtBQUtpUyxhQUFhclMsRUFBT1ksR0FBS1csTUFDaEMyUSxFQUFldFIsR0FBS1csR0FBS25CLEtBQUsrUixjQUFjblMsRUFBT1ksR0FBS1csVUFPaEUsR0FBMEIsSUFBdEJtUixFQUFXcFIsT0FDYixPQUFPNFEsRUFHVCxHQUEwQixJQUF0QlEsRUFBV3BSLE9BQWMsQ0FDM0IsTUFBTXVTLEVBQUluQixFQUFXLEdBQ3JCUixFQUFlekgsVUFBWTFKLEVBQWlCNFIsRUFBWSxHQUFLNVMsR0FDM0Q4VCxFQUFFdlAsR0FBRzROLEVBQWdCblMsRUFBTThULEVBQUVsSyxZQUFhdkosTUFFOUMsS0FBTyxDQUNMLE1BQU0wVCxFQUFnQixZQUFjbkIsRUFBWS9LLEtBQUssU0FFL0NtTSxFQUFxQ2hVLElBQ3pDLFFBQVN3QixFQUFJLEVBQUdBLEVBQUltUixFQUFXcFIsT0FBUUMsSUFBSyxDQUMxQyxNQUFNc1MsRUFBSW5CLEVBQVduUixHQUNmaUosRUFBUXFKLEVBQUV2UCxHQUFHNE4sRUFBZ0JuUyxFQUFNOFQsRUFBRWxLLFlBQWF2SixNQUN4RCxHQUFJb0ssRUFDRixPQUFPQSxDQUVYLENBQ0EsRUFHRjBILEVBQWV6SCxVQUFZMUosRUFDekIrUyxFQUNBQyxFQUVKLENBRUEsT0FBTzdCLENBQ1QsQ0FFQUcsYUFBYWpPLEdBQ1gsR0FBSTFDLEVBQVMwQyxHQUFZLENBQ3ZCLEdBQUksU0FBVUEsRUFDWixPQUFPLEVBR1QsUUFBU3dQLEtBQVV4UCxFQUNqQixHQUFJd1AsS0FBVXhULEtBQUtxSixTQUNqQixPQUFPLENBR2IsQ0FDQSxPQUFPLENBQ1QsQ0FFUTJJLGVBQWVmLEdBQ3JCLE1BQU0yQyxFQUFlLENBQUMzQyxHQUV0QixLQUFPMkMsRUFBTTFTLE9BQVMsR0FBRyxDQUN2QixNQUFNMlMsRUFBT0QsRUFBTXZNLE1BRW5CLEdBQUt3TSxHQUF3QixpQkFBVEEsRUFBcEIsQ0FFQSxHQUN1QixpQkFBZEEsRUFBSy9ELE1BQ2MsbUJBQW5CK0QsRUFBS3hKLFdBQ1ksdUJBQXhCd0osRUFBS3hKLFVBQVVwRyxLQUNmLENBQ0EsTUFBTStMLEVBQVU2RCxFQUFLL0QsS0FFckIsSUFBSWdFLEVBQWM5VCxLQUFLa1EsYUFBYUYsR0FLcEMsUUFKc0IsSUFBWDhELElBQ1RBLEVBQVM5VCxLQUFLbVEsY0FBY0gsSUFHUixrQkFBWDhELEVBQXNCLENBQy9CLElBQWUsSUFBWEEsRUFDRkQsRUFBS3hKLFVBQVkxSixFQUFpQixvQkFBcUIsWUFDbEQsQ0FDTCxNQUFNNEksRUFBY2hKLEVBQ2xCLE9BQ0FzVCxFQUNBN1QsS0FBS1MsVUFHUG9ULEVBQUt4SixVQUFZMUosRUFDZixxQkFDQ29ULEdBQWV4SyxFQUFZLHNCQUVoQyxDQUNBLFFBQ0YsQ0FFSXVLLEdBQXNDLG1CQUFyQkEsRUFBT3pKLFlBQzFCd0osRUFBS3hKLFVBQVl5SixFQUFPekosVUFFNUIsQ0FFQSxVQUFXN0osS0FBT3FULEVBQU0sQ0FDdEIsTUFBTXJSLEVBQVFxUixFQUFLclQsR0FDbkIsR0FBS2dDLEVBRUwsR0FBSXhCLE1BQU1DLFFBQVF1QixHQUNoQixRQUFTckIsRUFBSSxFQUFHQSxFQUFJcUIsRUFBTXRCLE9BQVFDLElBQUssQ0FDckMsTUFBTXNTLEVBQUlqUixFQUFNckIsR0FDWnNTLEdBQWtCLGlCQUFOQSxHQUNkRyxFQUFNMUksS0FBS3VJLEVBRWYsS0FDMEIsaUJBQVZqUixHQUNoQm9SLEVBQU0xSSxLQUFLMUksRUFFZixDQW5EdUMsQ0FvRHpDLENBQ0YsRyJ9
|
|
1
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWYWxpZGF0aW9uRXJyb3IiLCJFcnJvciIsIm1lc3NhZ2UiLCJpdGVtIiwia2V5d29yZCIsImNhdXNlIiwic2NoZW1hUGF0aCIsImluc3RhbmNlUGF0aCIsImRhdGEiLCJzY2hlbWEiLCJfZ2V0Q2F1c2UiLCJwb2ludGVyIiwiaW5zdGFuY2VQb2ludGVyIiwidGhpcyIsImdldENhdXNlIiwiX2dldFRyZWUiLCJ0cmVlIiwiZ2V0VHJlZSIsImdldFBhdGgiLCJGQUlMX0ZBU1RfREVGSU5FX0VSUk9SIiwiZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXkiLCJrZXkiLCJmYWlsRmFzdCIsIktleXdvcmRFcnJvciIsImdldE5hbWVkRnVuY3Rpb24iLCJvcHRpb25zIiwiaXNDb21waWxlZFNjaGVtYSIsInN1YlNjaGVtYSIsIkFycmF5IiwiaXNBcnJheSIsIm5hbWUiLCJmbiIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwidmFsdWUiLCJVVUlEX1JFR0VYIiwiRFVSQVRJT05fUkVHRVgiLCJVUklfUkVHRVgiLCJFTUFJTF9SRUdFWCIsIkhPU1ROQU1FX1JFR0VYIiwiREFURV9SRUdFWCIsIlRJTUVfUkVHRVgiLCJVUklfUkVGRVJFTkNFX1JFR0VYIiwiSVJJX1JFR0VYIiwiSVJJX1JFRkVSRU5DRV9SRUdFWCIsIklETl9FTUFJTF9SRUdFWCIsIklETl9IT1NUTkFNRV9SRUdFWCIsIkRBWVNfSU5fTU9OVEgiLCJwYXJzZVR3b0RpZ2l0cyIsImluZGV4IiwiZmlyc3QiLCJjaGFyQ29kZUF0Iiwic2Vjb25kIiwiaXNWYWxpZElwdjRSYW5nZSIsInN0YXJ0IiwiZW5kIiwic2VnbWVudENvdW50Iiwic2VnbWVudFN0YXJ0IiwiaSIsInNlZ21lbnRMZW5ndGgiLCJqIiwiZGlnaXQiLCJGb3JtYXRzIiwibGVuZ3RoIiwidENvZGUiLCJ5ZWFyIiwiYSIsImIiLCJjIiwiZCIsInBhcnNlRm91ckRpZ2l0cyIsIm1vbnRoIiwiZGF5IiwiaG91ciIsIm1pbnV0ZSIsImN1cnNvciIsIm9mZnNldFNpZ24iLCJvZmZzZXRIb3VyIiwib2Zmc2V0TWludXRlIiwiZnJhY1N0YXJ0IiwiY29kZSIsInR6Q29kZSIsIm1heERheXMiLCJ1dGNUb3RhbE1pbnV0ZXMiLCJvZmZzZXRUb3RhbE1pbnV0ZXMiLCJ1cmkiLCJ0ZXN0IiwiZW1haWwiLCJpcHY0IiwiaXNWYWxpZElwdjQiLCJpcHY2IiwiaGFzQ29sb24iLCJoYXNEb3VibGVDb2xvbiIsImhleHRldENvdW50IiwiaXNWYWxpZElwdjYiLCJob3N0bmFtZSIsImRhdGUiLCJtYXRjaCIsImV4ZWMiLCJ5ZWFyU3RyIiwibW9udGhTdHIiLCJkYXlTdHIiLCJOdW1iZXIiLCJyZWdleCIsIlJlZ0V4cCIsImUiLCJuZXh0IiwiaXNWYWxpZEpzb25Qb2ludGVyIiwiaXNWYWxpZFJlbGF0aXZlSnNvblBvaW50ZXIiLCJ0aW1lIiwiaW5jbHVkZXMiLCJjbG9zZUluZGV4IiwiaW5kZXhPZiIsImlzVmFsaWRVcmlUZW1wbGF0ZSIsImR1cmF0aW9uIiwidXVpZCIsImlyaSIsIlR5cGVzIiwib2JqZWN0IiwiYXJyYXkiLCJzdHJpbmciLCJudW1iZXIiLCJpbnRlZ2VyIiwiYm9vbGVhbiIsIm51bGwiLCJ0aW1lc3RhbXAiLCJpbnQ4IiwidWludDgiLCJpbnQxNiIsInVpbnQxNiIsImludDMyIiwidWludDMyIiwiZmxvYXQzMiIsImZsb2F0NjQiLCJoYXNDaGFuZ2VkIiwicHJldiIsImN1cnJlbnQiLCJpcyIsImlzVW5pcXVlUHJpbWl0aXZlIiwiZ2V0QXJyYXlCdWNrZXRLZXkiLCJsYXN0IiwiZmlyc3RUeXBlIiwibGFzdFR5cGUiLCJmaXJzdEFycmF5TWFya2VyIiwiZmlyc3RTaWduYXR1cmUiLCJnZXRQcmltaXRpdmVBcnJheVNpZ25hdHVyZSIsImxhc3RBcnJheU1hcmtlciIsImxhc3RTaWduYXR1cmUiLCJnZXRPYmplY3RTaGFwZUtleSIsImtleXMiLCJzb3J0Iiwiam9pbiIsInNpZ25hdHVyZSIsImlzTmFOIiwiQXJyYXlLZXl3b3JkcyIsIml0ZW1zIiwiZGVmaW5lRXJyb3IiLCJzY2hlbWFJdGVtcyIsImRhdGFMZW5ndGgiLCJzY2hlbWFJdGVtc0xlbmd0aCIsIml0ZW1zTGVuZ3RoIiwic2NoZW1hSXRlbSIsInZhbGlkYXRlIiwiJHZhbGlkYXRlIiwiZXJyb3IiLCJlbGVtZW50cyIsImVsZW1lbnRzU2NoZW1hIiwibWluSXRlbXMiLCJtYXhJdGVtcyIsImFkZGl0aW9uYWxJdGVtcyIsInR1cGxlTGVuZ3RoIiwiX3R1cGxlSXRlbXNMZW5ndGgiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJ1bmlxdWVJdGVtcyIsImxlbiIsImxlZnQiLCJyaWdodCIsInByaW1pdGl2ZVNlZW4iLCJTZXQiLCJwcmltaXRpdmVBcnJheVNpZ25hdHVyZXMiLCJhcnJheUJ1Y2tldHMiLCJvYmplY3RCdWNrZXRzIiwiaGFzIiwiYWRkIiwiTWFwIiwiYnVja2V0S2V5IiwiY2FuZGlkYXRlcyIsImdldCIsInNldCIsInB1c2giLCJjb250YWlucyIsImNvbnRhaW5zVmFsaWRhdGUiLCJkZWVwQ2xvbmVVbmZyZWV6ZSIsIm9iaiIsImNsb25lQ2xhc3NJbnN0YW5jZXMiLCJzZWVuIiwiV2Vha01hcCIsInNvdXJjZSIsInN0cnVjdHVyZWRDbG9uZSIsIkJ1ZmZlciIsInByb3RvIiwiZ2V0UHJvdG90eXBlT2YiLCJwcm90b3R5cGUiLCJpc1BsYWluT2JqZWN0IiwiRGF0ZSIsIkFycmF5QnVmZmVyIiwiaXNWaWV3IiwiY2xvbmVkIiwiY2xvbmUiLCJsIiwiZ2V0VGltZSIsImZsYWdzIiwiZW50cmllcyIsInZhbHVlcyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJidWZmZXIiLCJmcm9tIiwiUHJvbWlzZSIsIldlYWtTZXQiLCJjcmVhdGUiLCJSZWZsZWN0Iiwib3duS2V5cyIsImRlc2NyaXB0b3JzIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlc2NyaXB0b3IiLCJOdW1iZXJLZXl3b3JkcyIsIm1pbmltdW0iLCJpbnN0YW5jZSIsIm1pbiIsImV4Y2x1c2l2ZU1pbmltdW0iLCJtYXhpbXVtIiwibWF4IiwiZXhjbHVzaXZlTWF4aW11bSIsIm11bHRpcGxlT2YiLCJxdW90aWVudCIsImlzRmluaXRlIiwiZXBzaWxvbiIsIk1hdGgiLCJhYnMiLCJhcmVDbG9zZUVub3VnaCIsInJvdW5kIiwiUkVHRVhfTUVUQV9DSEFSUyIsImhhc1JlZ2V4TWV0YSIsIlBBVFRFUk5fQ0FDSEUiLCJjb21waWxlUGF0dGVybk1hdGNoZXIiLCJwYXR0ZXJuIiwiY2FjaGVkIiwiY29tcGlsZWQiLCJfdmFsdWUiLCJwYXR0ZXJuTGVuZ3RoIiwiaW5uZXIiLCJzdGFydHNXaXRoIiwiZW5kc1dpdGgiLCJQQVRURVJOX0tFWV9DQUNIRV9MSU1JVCIsImdldFBhdHRlcm5Qcm9wZXJ0eUVudHJpZXMiLCJfcGF0dGVyblByb3BlcnR5RW50cmllcyIsInBhdHRlcm5Qcm9wZXJ0aWVzIiwicGF0dGVybktleXMiLCJjb21waWxlZE1hdGNoZXIiLCJzY2hlbWFQcm9wIiwiZ2V0UGF0dGVybktleU1hdGNoSW5kZXhlcyIsImNhY2hlIiwiX3BhdHRlcm5LZXlNYXRjaEluZGV4Q2FjaGUiLCJpbmRleGVzIiwic2l6ZSIsImdldEJyYW5jaEVudHJpZXMiLCJjYWNoZUtleSIsImtpbmQiLCJrZXl3b3JkcyIsInJlcXVpcmVkIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwicHJvcGVydGllcyIsInByb3BLZXlzIiwiX3Byb3BLZXlzIiwicmVxdWlyZWRTZXQiLCJfcmVxdWlyZWRTZXQiLCJkZWZhdWx0IiwidmFsdWVTY2hlbWEiLCJtYXhQcm9wZXJ0aWVzIiwiY291bnQiLCJtaW5Qcm9wZXJ0aWVzIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJhcFZhbGlkYXRlIiwiX2FwVmFsaWRhdGUiLCJwYXR0ZXJuRW50cmllcyIsIm1hdGNoaW5nSW5kZXhlcyIsInByb3BlcnR5TmFtZXMiLCJwbiIsImRlcGVuZGVuY2llcyIsImRlcGVuZGVuY3kiLCJ0aGVuIiwiZWxzZSIsImRlZmluaXRpb25zIiwiJGlkIiwiJHNjaGVtYSIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCIkY29tbWVudCIsImV4YW1wbGVzIiwiY29udGVudE1lZGlhVHlwZSIsImNvbnRlbnRFbmNvZGluZyIsImRpc2NyaW1pbmF0b3IiLCJudWxsYWJsZSIsIm1pbkxlbmd0aCIsIm1heExlbmd0aCIsInBhdHRlcm5NYXRjaCIsIl9wYXR0ZXJuTWF0Y2giLCJwYXR0ZXJuTWF0Y2hDYWNoZSIsIl9wYXR0ZXJuTWF0Y2hDYWNoZSIsImlzTWF0Y2giLCJmb3JtYXQiLCJmb3JtYXRWYWxpZGF0ZSIsIl9mb3JtYXRWYWxpZGF0ZSIsImZvcm1hdFJlc3VsdENhY2hlRW5hYmxlZCIsIl9mb3JtYXRSZXN1bHRDYWNoZUVuYWJsZWQiLCJmb3JtYXRSZXN1bHRDYWNoZSIsIl9mb3JtYXRSZXN1bHRDYWNoZSIsImdldEZvcm1hdCIsImlzRGVmYXVsdEZvcm1hdFZhbGlkYXRvciIsImlzVmFsaWQiLCJlbnVtIiwiZW51bUNhY2hlIiwiX2VudW1DYWNoZSIsInByaW1pdGl2ZVNldCIsIm9iamVjdFZhbHVlcyIsImxpc3QiLCJlbnVtSXRlbSIsImFsbE9mIiwiYnJhbmNoZXMiLCJvbmx5QnJhbmNoIiwiYnJhbmNoIiwiYW55T2YiLCJvbmVPZiIsInZhbGlkQ291bnQiLCJjb25zdCIsImlmIiwibm90IiwiJHJlZiIsIl9yZXNvbHZlZFJlZiIsInJlZlBhdGgiLCJ0YXJnZXRTY2hlbWEiLCJnZXRTY2hlbWFSZWYiLCJnZXRTY2hlbWFCeUlkIiwidHlwZXMiLCJmb3JtYXRzIiwiaW1tdXRhYmxlIiwicm9vdFNjaGVtYSIsImlkUmVnaXN0cnkiLCJ0eXBlIiwidmFsaWRhdG9yIiwiYWRkVHlwZSIsImFkZEtleXdvcmQiLCJhZGRGb3JtYXQiLCJvdmVyd3JpdGUiLCJnZXRUeXBlIiwiZ2V0S2V5d29yZCIsInBhdGgiLCJyb290IiwicGFydHMiLCJzcGxpdCIsInBhcnQiLCJkZWNvZGVVUklDb21wb25lbnQiLCJyZXBsYWNlIiwiZGVmcyIsInJlc29sdmVQYXRoIiwiaWQiLCJjb21waWxlIiwiY2xlYXIiLCJjb21waWxlZFNjaGVtYSIsImNvbXBpbGVTY2hlbWEiLCJfaGFzUmVmIiwibGlua1JlZmVyZW5jZXMiLCJpc1NjaGVtYUxpa2UiLCJjbG9uZWREYXRhIiwicmVzIiwidmFsaWQiLCJpc1RyaXZpYWxBbHdheXNWYWxpZFN1YnNjaGVtYSIsInNoYWxsb3dBcnJheUVxdWFscyIsImZsYXR0ZW5Bc3NvY2lhdGl2ZUJyYW5jaGVzIiwib3V0IiwibmVzdGVkIiwiZmxhdHRlblNpbmdsZVdyYXBwZXJPbmVPZiIsIm5vcm1hbGl6ZVNjaGVtYUZvckNvbXBpbGUiLCJub3JtYWxpemVkIiwic2NoZW1hS2V5cyIsImhhc09ubHlLZXkiLCJzZXROb3JtYWxpemVkIiwiZmxhdHRlbmVkQWxsT2YiLCJmaWx0ZXIiLCJmbGF0dGVuZWRBbnlPZiIsImZsYXR0ZW5lZE9uZU9mIiwibWFya1NjaGVtYUhhc1JlZiIsInNob3VsZFNraXBLZXl3b3JkIiwiaGFzUmVxdWlyZWREZWZhdWx0cyIsImlzRGVmYXVsdFR5cGVWYWxpZGF0b3IiLCJzY2hlbWFIYXNSZWYiLCJyZWZWYWxpZGF0b3IiLCJ2YWxpZGF0b3JzIiwiYWN0aXZlTmFtZXMiLCJkZWZpbmVUeXBlRXJyb3IiLCJtYXAiLCJ0IiwidHJpbSIsInR5cGVGdW5jdGlvbnMiLCJ0eXBlTmFtZXMiLCJkZWZhdWx0VHlwZU5hbWVzIiwiY29tYmluZWRUeXBlVmFsaWRhdG9yIiwiYWxsVHlwZXNEZWZhdWx0IiwidHlwZU1ldGhvZE5hbWUiLCJzaW5nbGVUeXBlTmFtZSIsImlzSW50ZWdlciIsInNpbmdsZVR5cGVGbiIsImFsbG93c09iamVjdCIsImFsbG93c0FycmF5IiwiYWxsb3dzU3RyaW5nIiwiYWxsb3dzTnVtYmVyIiwiYWxsb3dzSW50ZWdlciIsImFsbG93c0Jvb2xlYW4iLCJhbGxvd3NOdWxsIiwiZGF0YVR5cGUiLCJvdGhlcktleXMiLCJrZXlPcmRlciIsImtleXdvcmRGbiIsImZuTmFtZSIsImxpdGVyYWxLZXl3b3JkcyIsImNvbXBpbGVkU3ViU2NoZW1hIiwic3ViS2V5IiwidiIsImNvbXBvc2l0ZU5hbWUiLCJtYXN0ZXJWYWxpZGF0b3IiLCJzdGFjayIsIm5vZGUiLCJwb3AiLCJ0YXJnZXQiLCJfZGF0YSJdLCJzb3VyY2VzIjpbIi4uL2xpYi91dGlscy9tYWluLXV0aWxzLnRzIiwiLi4vbGliL2Zvcm1hdHMudHMiLCIuLi9saWIvdHlwZXMudHMiLCIuLi9saWIvdXRpbHMvaGFzLWNoYW5nZWQudHMiLCIuLi9saWIva2V5d29yZHMvYXJyYXkta2V5d29yZHMudHMiLCIuLi9saWIvdXRpbHMvZGVlcC1mcmVlemUudHMiLCIuLi9saWIva2V5d29yZHMvbnVtYmVyLWtleXdvcmRzLnRzIiwiLi4vbGliL3V0aWxzL3BhdHRlcm4tbWF0Y2hlci50cyIsIi4uL2xpYi9rZXl3b3Jkcy9vYmplY3Qta2V5d29yZHMudHMiLCIuLi9saWIva2V5d29yZHMvb3RoZXIta2V5d29yZHMudHMiLCIuLi9saWIva2V5d29yZHMudHMiLCIuLi9saWIva2V5d29yZHMvc3RyaW5nLWtleXdvcmRzLnRzIiwiLi4vbGliL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBpbGVkU2NoZW1hIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5cbmludGVyZmFjZSBFcnJvclRyZWUge1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGtleXdvcmQ6IHN0cmluZztcbiAgaXRlbT86IHN0cmluZyB8IG51bWJlcjtcbiAgc2NoZW1hUGF0aDogc3RyaW5nO1xuICBpbnN0YW5jZVBhdGg6IHN0cmluZztcbiAgZGF0YT86IGFueTtcbiAgY2F1c2U/OiBFcnJvclRyZWU7XG59XG5cbmV4cG9ydCBjbGFzcyBWYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgaXRlbT86IHN0cmluZyB8IG51bWJlcjtcbiAga2V5d29yZDogc3RyaW5nO1xuICBjYXVzZT86IFZhbGlkYXRpb25FcnJvcjtcbiAgc2NoZW1hUGF0aDogc3RyaW5nID0gXCJcIjtcbiAgaW5zdGFuY2VQYXRoOiBzdHJpbmcgPSBcIlwiO1xuICBkYXRhPzogYW55O1xuICBzY2hlbWE/OiBDb21waWxlZFNjaGVtYTtcblxuICBwcml2YXRlIF9nZXRDYXVzZShwb2ludGVyID0gXCIjXCIsIGluc3RhbmNlUG9pbnRlciA9IFwiI1wiKTogVmFsaWRhdGlvbkVycm9yIHtcbiAgICBsZXQgc2NoZW1hUGF0aCA9IGAke3BvaW50ZXJ9LyR7dGhpcy5rZXl3b3JkfWA7XG4gICAgbGV0IGluc3RhbmNlUGF0aCA9IGAke2luc3RhbmNlUG9pbnRlcn1gO1xuICAgIGlmICh0eXBlb2YgdGhpcy5pdGVtICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuaXRlbSA9PT0gXCJzdHJpbmdcIiAmJiB0aGlzLml0ZW0gaW4gdGhpcy5zY2hlbWEpIHtcbiAgICAgICAgc2NoZW1hUGF0aCArPSBgLyR7dGhpcy5pdGVtfWA7XG4gICAgICB9XG4gICAgICBpbnN0YW5jZVBhdGggKz0gYC8ke3RoaXMuaXRlbX1gO1xuICAgIH1cblxuICAgIHRoaXMuaW5zdGFuY2VQYXRoID0gaW5zdGFuY2VQYXRoO1xuICAgIHRoaXMuc2NoZW1hUGF0aCA9IHNjaGVtYVBhdGg7XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBubyBjYXVzZSBvciB0aGUgY2F1c2UgaXMgbm90IGEgVmFsaWRhdGlvbkVycm9yLCByZXR1cm4gdGhpc1xuICAgIGlmICghdGhpcy5jYXVzZSB8fCAhKHRoaXMuY2F1c2UgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jYXVzZS5fZ2V0Q2F1c2Uoc2NoZW1hUGF0aCwgaW5zdGFuY2VQYXRoKTtcbiAgfVxuXG4gIGdldENhdXNlKCk6IFZhbGlkYXRpb25FcnJvciB7XG4gICAgcmV0dXJuIHRoaXMuX2dldENhdXNlKCk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRUcmVlKCk6IEVycm9yVHJlZSB7XG4gICAgY29uc3QgdHJlZTogRXJyb3JUcmVlID0ge1xuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAga2V5d29yZDogdGhpcy5rZXl3b3JkLFxuICAgICAgaXRlbTogdGhpcy5pdGVtLFxuICAgICAgc2NoZW1hUGF0aDogdGhpcy5zY2hlbWFQYXRoLFxuICAgICAgaW5zdGFuY2VQYXRoOiB0aGlzLmluc3RhbmNlUGF0aCxcbiAgICAgIGRhdGE6IHRoaXMuZGF0YVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5jYXVzZSkge1xuICAgICAgdHJlZS5jYXVzZSA9IHRoaXMuY2F1c2UuX2dldFRyZWUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJlZTtcbiAgfVxuXG4gIGdldFRyZWUoKTogRXJyb3JUcmVlIHtcbiAgICB0aGlzLmdldENhdXNlKCk7XG4gICAgcmV0dXJuIHRoaXMuX2dldFRyZWUoKTtcbiAgfVxuXG4gIGdldFBhdGgoKSB7XG4gICAgY29uc3QgY2F1c2UgPSB0aGlzLmdldENhdXNlKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjaGVtYVBhdGg6IGNhdXNlLnNjaGVtYVBhdGgsXG4gICAgICBpbnN0YW5jZVBhdGg6IGNhdXNlLmluc3RhbmNlUGF0aFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZWZpbmVFcnJvck9wdGlvbnMge1xuICBpdGVtPzogYW55OyAvLyBGaW5hbCBpdGVtIGluIHRoZSBzY2hlbWFQYXRoXG4gIGNhdXNlPzogVmFsaWRhdGlvbkVycm9yIHwgdHJ1ZTsgLy8gQ2F1c2Ugb2YgdGhlIGVycm9yXG4gIGRhdGE/OiBhbnk7IC8vIERhdGEgdGhhdCBjYXVzZWQgdGhlIGVycm9yXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVmaW5lRXJyb3JGdW5jdGlvbiB7XG4gIChcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IERlZmluZUVycm9yT3B0aW9uc1xuICApOiBWYWxpZGF0aW9uRXJyb3IgfCB2b2lkIHwgdHJ1ZTtcbn1cbmNvbnN0IEZBSUxfRkFTVF9ERUZJTkVfRVJST1I6IERlZmluZUVycm9yRnVuY3Rpb24gPSAoKSA9PiB0cnVlO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXkoXG4gIGtleTogc3RyaW5nLFxuICBzY2hlbWE6IENvbXBpbGVkU2NoZW1hLFxuICBmYWlsRmFzdDogYm9vbGVhblxuKSB7XG4gIGlmIChmYWlsRmFzdCkge1xuICAgIHJldHVybiBGQUlMX0ZBU1RfREVGSU5FX0VSUk9SO1xuICB9XG5cbiAgY29uc3QgS2V5d29yZEVycm9yID0gbmV3IFZhbGlkYXRpb25FcnJvcihgSW52YWxpZCAke2tleX1gKTtcbiAgS2V5d29yZEVycm9yLmtleXdvcmQgPSBrZXk7XG4gIEtleXdvcmRFcnJvci5zY2hlbWEgPSBzY2hlbWE7XG5cbiAgY29uc3QgZGVmaW5lRXJyb3I6IERlZmluZUVycm9yRnVuY3Rpb24gPSAobWVzc2FnZSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgS2V5d29yZEVycm9yLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIEtleXdvcmRFcnJvci5pdGVtID0gb3B0aW9ucy5pdGVtO1xuICAgIEtleXdvcmRFcnJvci5jYXVzZSA9XG4gICAgICBvcHRpb25zLmNhdXNlICYmIG9wdGlvbnMuY2F1c2UgIT09IHRydWUgPyBvcHRpb25zLmNhdXNlIDogdW5kZWZpbmVkO1xuICAgIEtleXdvcmRFcnJvci5kYXRhID0gb3B0aW9ucy5kYXRhO1xuICAgIHJldHVybiBLZXl3b3JkRXJyb3I7XG4gIH07XG5cbiAgcmV0dXJuIGdldE5hbWVkRnVuY3Rpb248RGVmaW5lRXJyb3JGdW5jdGlvbj4oXG4gICAgYGRlZmluZUVycm9yXyR7a2V5fWAsXG4gICAgZGVmaW5lRXJyb3JcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVURjE2TGVuZ3RoKHN0cikge1xuICBsZXQgbGVuZ3RoID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjb2RlUG9pbnQgPSBzdHIuY29kZVBvaW50QXQoaSk7XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4ZmZmZikge1xuICAgICAgaSsrO1xuICAgIH1cbiAgICBsZW5ndGgrKztcbiAgfVxuICByZXR1cm4gbGVuZ3RoO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb21waWxlZFNjaGVtYShzdWJTY2hlbWE6IGFueSk6IHN1YlNjaGVtYSBpcyBDb21waWxlZFNjaGVtYSB7XG4gIHJldHVybiAoXG4gICAgISFzdWJTY2hlbWEgJiZcbiAgICB0eXBlb2Ygc3ViU2NoZW1hID09PSBcIm9iamVjdFwiICYmXG4gICAgIUFycmF5LmlzQXJyYXkoc3ViU2NoZW1hKSAmJlxuICAgIFwiJHZhbGlkYXRlXCIgaW4gc3ViU2NoZW1hXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROYW1lZEZ1bmN0aW9uPFQ+KG5hbWU6IHN0cmluZywgZm46IFQpOiBUIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwgXCJuYW1lXCIsIHsgdmFsdWU6IG5hbWUgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUGF0aChyb290OiBhbnksIHBhdGg6IHN0cmluZyk6IGFueSB7XG4gIGlmICghcGF0aCB8fCBwYXRoID09PSBcIiNcIikge1xuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgLy8gSlNPTiBQb2ludGVyXG4gIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCIjL1wiKSkge1xuICAgIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi9cIikuc2xpY2UoMSk7XG4gICAgbGV0IGN1cnJlbnQgPSByb290O1xuXG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICBjb25zdCBkZWNvZGVkVXJpUGFydCA9IGRlY29kZVVSSUNvbXBvbmVudChwYXJ0KTtcbiAgICAgIGNvbnN0IGtleSA9IGRlY29kZWRVcmlQYXJ0LnJlcGxhY2UoL34xL2csIFwiL1wiKS5yZXBsYWNlKC9+MC9nLCBcIn5cIik7XG5cbiAgICAgIGlmIChjdXJyZW50ICYmIHR5cGVvZiBjdXJyZW50ID09PSBcIm9iamVjdFwiICYmIGtleSBpbiBjdXJyZW50KSB7XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG5cbiAgLy8gU2ltcGxlIGxvb2t1cCBieSBkZWZpbml0aW9uIG5hbWUgKG5vbi1zdGFuZGFyZCwgYnV0IHVzZWZ1bClcbiAgaWYgKCFwYXRoLmluY2x1ZGVzKFwiI1wiKSkge1xuICAgIGlmIChyb290LmRlZmluaXRpb25zICYmIHJvb3QuZGVmaW5pdGlvbnNbcGF0aF0pIHtcbiAgICAgIHJldHVybiByb290LmRlZmluaXRpb25zW3BhdGhdO1xuICAgIH1cbiAgICBpZiAocm9vdC5kZWZzICYmIHJvb3QuZGVmc1twYXRoXSkge1xuICAgICAgcmV0dXJuIHJvb3QuZGVmc1twYXRoXTtcbiAgICB9XG5cbiAgICBpZiAocm9vdC4kaWQgJiYgdHlwZW9mIHJvb3QuJGlkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAocm9vdC4kaWQgPT09IHBhdGggfHwgcm9vdC4kaWQuZW5kc1dpdGgoXCIvXCIgKyBwYXRoKSkge1xuICAgICAgICByZXR1cm4gcm9vdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcmVDbG9zZUVub3VnaChhOiBudW1iZXIsIGI6IG51bWJlciwgZXBzaWxvbiA9IDFlLTE1KTogYm9vbGVhbiB7XG4gIHJldHVybiBNYXRoLmFicyhhIC0gYikgPD0gZXBzaWxvbiAqIE1hdGgubWF4KE1hdGguYWJzKGEpLCBNYXRoLmFicyhiKSk7XG59XG4iLCJpbXBvcnQgeyBGb3JtYXRGdW5jdGlvbiB9IGZyb20gXCIuL2luZGV4XCI7XG5cbi8vIFJlZ2V4IGhlbHBlcnNcbmNvbnN0IFVVSURfUkVHRVggPVxuICAvXlswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQvaTtcbi8vIElTTyA4NjAxIER1cmF0aW9uIChQM1k2TTREVDEySDMwTTVTKVxuY29uc3QgRFVSQVRJT05fUkVHRVggPVxuICAvXlAoPyEkKSgoXFxkK1kpPyhcXGQrTSk/KFxcZCtXKT8oXFxkK0QpPykoVCg/PVxcZCkoXFxkK0gpPyhcXGQrTSk/KFxcZCtTKT8pPyQvO1xuY29uc3QgVVJJX1JFR0VYID0gL15bYS16QS1aXVthLXpBLVowLTkrXFwtLl0qOlteXFxzXSokLztcbmNvbnN0IEVNQUlMX1JFR0VYID1cbiAgL14oPyFcXC4pKD8hLipcXC4kKVthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXXsxLDIwfSg/OlxcLlthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXXsxLDIxfSl7MCwyfUBbYS16MC05XSg/OlthLXowLTktXXswLDYxfVthLXowLTldKT8oPzpcXC5bYS16MC05XSg/OlthLXowLTktXXswLDYwfVthLXowLTldKT8pezAsM30kL2k7XG5jb25zdCBIT1NUTkFNRV9SRUdFWCA9XG4gIC9eW2EtejAtOV1bYS16MC05LV17MCw2Mn0oPzpcXC5bYS16MC05XVthLXowLTktXXswLDYyfSkqW2EtejAtOV0kL2k7XG5jb25zdCBEQVRFX1JFR0VYID0gL14oXFxkezR9KS0oXFxkezJ9KS0oXFxkezJ9KSQvO1xuY29uc3QgVElNRV9SRUdFWCA9XG4gIC9eKFswMV1cXGR8MlswLTNdKTooWzAtNV1cXGQpOihbMC01XVxcZCkoXFwuXFxkKyk/KFp8KFsrLV0pKFswMV1cXGR8MlswLTNdKTooWzAtNV1cXGQpKSQvO1xuY29uc3QgVVJJX1JFRkVSRU5DRV9SRUdFWCA9XG4gIC9eKChbXjovPyNdKyk6KT8oXFwvXFwvKFteLz8jXSopKT8oW14/I10qKShcXD8oW14jXSopKT8oIygoPyFbXiNdKlxcXFwpW14jXSopKT8vaTtcbmNvbnN0IElSSV9SRUdFWCA9IC9eW2EtekEtWl1bYS16QS1aMC05K1xcLS5dKjpbXlxcc10qJC87XG5jb25zdCBJUklfUkVGRVJFTkNFX1JFR0VYID1cbiAgL14oKFteOi8/I10rKTopPyhcXC9cXC8oW14vPyNdKikpPyhbXj8jXSopKFxcPyhbXiNdKikpPygjKCg/IVteI10qXFxcXClbXiNdKikpPy9pO1xuY29uc3QgSUROX0VNQUlMX1JFR0VYID0gL15bXkBcXHNdK0BbXkBcXHNdK1xcLlteQFxcc10rJC87XG5jb25zdCBJRE5fSE9TVE5BTUVfUkVHRVggPSAvXlteXFxzIUAjJCVeJiooKV8rXFw9XFxbXFxde307JzpcIlxcXFx8LDw+XFwvP10rJC87XG5cbmNvbnN0IERBWVNfSU5fTU9OVEggPSBbMzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMV07XG5cbmZ1bmN0aW9uIGlzRGlnaXRDaGFyQ29kZShjb2RlOiBudW1iZXIpIHtcbiAgcmV0dXJuIGNvZGUgPj0gNDggJiYgY29kZSA8PSA1Nztcbn1cblxuZnVuY3Rpb24gcGFyc2VUd29EaWdpdHMoZGF0YTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSB7XG4gIGNvbnN0IGZpcnN0ID0gZGF0YS5jaGFyQ29kZUF0KGluZGV4KSAtIDQ4O1xuICBjb25zdCBzZWNvbmQgPSBkYXRhLmNoYXJDb2RlQXQoaW5kZXggKyAxKSAtIDQ4O1xuXG4gIGlmIChmaXJzdCA8IDAgfHwgZmlyc3QgPiA5IHx8IHNlY29uZCA8IDAgfHwgc2Vjb25kID4gOSkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIHJldHVybiBmaXJzdCAqIDEwICsgc2Vjb25kO1xufVxuXG5mdW5jdGlvbiBwYXJzZUZvdXJEaWdpdHMoZGF0YTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSB7XG4gIGNvbnN0IGEgPSBkYXRhLmNoYXJDb2RlQXQoaW5kZXgpIC0gNDg7XG4gIGNvbnN0IGIgPSBkYXRhLmNoYXJDb2RlQXQoaW5kZXggKyAxKSAtIDQ4O1xuICBjb25zdCBjID0gZGF0YS5jaGFyQ29kZUF0KGluZGV4ICsgMikgLSA0ODtcbiAgY29uc3QgZCA9IGRhdGEuY2hhckNvZGVBdChpbmRleCArIDMpIC0gNDg7XG5cbiAgaWYgKFxuICAgIGEgPCAwIHx8XG4gICAgYSA+IDkgfHxcbiAgICBiIDwgMCB8fFxuICAgIGIgPiA5IHx8XG4gICAgYyA8IDAgfHxcbiAgICBjID4gOSB8fFxuICAgIGQgPCAwIHx8XG4gICAgZCA+IDlcbiAgKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgcmV0dXJuIGEgKiAxMDAwICsgYiAqIDEwMCArIGMgKiAxMCArIGQ7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRJcHY0UmFuZ2UoZGF0YTogc3RyaW5nLCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikge1xuICBsZXQgc2VnbWVudENvdW50ID0gMDtcbiAgbGV0IHNlZ21lbnRTdGFydCA9IHN0YXJ0O1xuXG4gIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykge1xuICAgIGlmIChpICE9PSBlbmQgJiYgZGF0YS5jaGFyQ29kZUF0KGkpICE9PSA0Nikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VnbWVudExlbmd0aCA9IGkgLSBzZWdtZW50U3RhcnQ7XG4gICAgaWYgKHNlZ21lbnRMZW5ndGggPCAxIHx8IHNlZ21lbnRMZW5ndGggPiAzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHNlZ21lbnRMZW5ndGggPiAxICYmIGRhdGEuY2hhckNvZGVBdChzZWdtZW50U3RhcnQpID09PSA0OCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCB2YWx1ZSA9IDA7XG4gICAgZm9yIChsZXQgaiA9IHNlZ21lbnRTdGFydDsgaiA8IGk7IGorKykge1xuICAgICAgY29uc3QgZGlnaXQgPSBkYXRhLmNoYXJDb2RlQXQoaikgLSA0ODtcbiAgICAgIGlmIChkaWdpdCA8IDAgfHwgZGlnaXQgPiA5KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdmFsdWUgPSB2YWx1ZSAqIDEwICsgZGlnaXQ7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID4gMjU1KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2VnbWVudENvdW50Kys7XG4gICAgc2VnbWVudFN0YXJ0ID0gaSArIDE7XG4gIH1cblxuICByZXR1cm4gc2VnbWVudENvdW50ID09PSA0O1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkSXB2NChkYXRhOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGlzVmFsaWRJcHY0UmFuZ2UoZGF0YSwgMCwgZGF0YS5sZW5ndGgpO1xufVxuXG5mdW5jdGlvbiBpc0hleENoYXJDb2RlKGNvZGU6IG51bWJlcikge1xuICByZXR1cm4gKFxuICAgIChjb2RlID49IDQ4ICYmIGNvZGUgPD0gNTcpIHx8XG4gICAgKGNvZGUgPj0gNjUgJiYgY29kZSA8PSA3MCkgfHxcbiAgICAoY29kZSA+PSA5NyAmJiBjb2RlIDw9IDEwMilcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZElwdjYoZGF0YTogc3RyaW5nKSB7XG4gIGNvbnN0IGxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbGV0IGhhc0NvbG9uID0gZmFsc2U7XG4gIGxldCBoYXNEb3VibGVDb2xvbiA9IGZhbHNlO1xuICBsZXQgaGV4dGV0Q291bnQgPSAwO1xuICBsZXQgaSA9IDA7XG5cbiAgd2hpbGUgKGkgPCBsZW5ndGgpIHtcbiAgICBpZiAoZGF0YS5jaGFyQ29kZUF0KGkpID09PSA1OCkge1xuICAgICAgaGFzQ29sb24gPSB0cnVlO1xuXG4gICAgICBpZiAoaSArIDEgPCBsZW5ndGggJiYgZGF0YS5jaGFyQ29kZUF0KGkgKyAxKSA9PT0gNTgpIHtcbiAgICAgICAgaWYgKGhhc0RvdWJsZUNvbG9uKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaGFzRG91YmxlQ29sb24gPSB0cnVlO1xuICAgICAgICBpICs9IDI7XG5cbiAgICAgICAgaWYgKGkgPT09IGxlbmd0aCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWdtZW50U3RhcnQgPSBpO1xuICAgIGxldCBzZWdtZW50TGVuZ3RoID0gMDtcblxuICAgIHdoaWxlIChpIDwgbGVuZ3RoICYmIGlzSGV4Q2hhckNvZGUoZGF0YS5jaGFyQ29kZUF0KGkpKSkge1xuICAgICAgc2VnbWVudExlbmd0aCsrO1xuICAgICAgaWYgKHNlZ21lbnRMZW5ndGggPiA0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaSsrO1xuICAgIH1cblxuICAgIGlmIChzZWdtZW50TGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGkgPCBsZW5ndGggJiYgZGF0YS5jaGFyQ29kZUF0KGkpID09PSA0Nikge1xuICAgICAgaWYgKCFoYXNDb2xvbikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNWYWxpZElwdjRSYW5nZShkYXRhLCBzZWdtZW50U3RhcnQsIGxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFzRG91YmxlQ29sb24pIHtcbiAgICAgICAgcmV0dXJuIGhleHRldENvdW50IDwgNjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGhleHRldENvdW50ID09PSA2O1xuICAgIH1cblxuICAgIGhleHRldENvdW50Kys7XG4gICAgaWYgKGhleHRldENvdW50ID4gOCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChpID09PSBsZW5ndGgpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChkYXRhLmNoYXJDb2RlQXQoaSkgIT09IDU4KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaGFzQ29sb24gPSB0cnVlO1xuICAgIGkrKztcblxuICAgIGlmIChpID09PSBsZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5jaGFyQ29kZUF0KGkpID09PSA1OCkge1xuICAgICAgaWYgKGhhc0RvdWJsZUNvbG9uKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaGFzRG91YmxlQ29sb24gPSB0cnVlO1xuICAgICAgaSsrO1xuXG4gICAgICBpZiAoaSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghaGFzQ29sb24pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoaGFzRG91YmxlQ29sb24pIHtcbiAgICByZXR1cm4gaGV4dGV0Q291bnQgPCA4O1xuICB9XG5cbiAgcmV0dXJuIGhleHRldENvdW50ID09PSA4O1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkSnNvblBvaW50ZXIoZGF0YTogc3RyaW5nKSB7XG4gIGlmIChkYXRhID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoZGF0YS5jaGFyQ29kZUF0KDApICE9PSA0Nykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAxOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChkYXRhLmNoYXJDb2RlQXQoaSkgIT09IDEyNikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dCA9IGRhdGEuY2hhckNvZGVBdChpICsgMSk7XG4gICAgaWYgKG5leHQgIT09IDQ4ICYmIG5leHQgIT09IDQ5KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaSsrO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRSZWxhdGl2ZUpzb25Qb2ludGVyKGRhdGE6IHN0cmluZykge1xuICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGxldCBpID0gMDtcbiAgd2hpbGUgKGkgPCBkYXRhLmxlbmd0aCkge1xuICAgIGNvbnN0IGNvZGUgPSBkYXRhLmNoYXJDb2RlQXQoaSk7XG4gICAgaWYgKGNvZGUgPCA0OCB8fCBjb2RlID4gNTcpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpKys7XG4gIH1cblxuICBpZiAoaSA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChpID09PSBkYXRhLmxlbmd0aCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGRhdGEuY2hhckNvZGVBdChpKSA9PT0gMzUpIHtcbiAgICByZXR1cm4gaSArIDEgPT09IGRhdGEubGVuZ3RoO1xuICB9XG5cbiAgaWYgKGRhdGEuY2hhckNvZGVBdChpKSAhPT0gNDcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKGkgPSBpICsgMTsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZGF0YS5jaGFyQ29kZUF0KGkpICE9PSAxMjYpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHQgPSBkYXRhLmNoYXJDb2RlQXQoaSArIDEpO1xuICAgIGlmIChuZXh0ICE9PSA0OCAmJiBuZXh0ICE9PSA0OSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGkrKztcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkVXJpVGVtcGxhdGUoZGF0YTogc3RyaW5nKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNvZGUgPSBkYXRhLmNoYXJDb2RlQXQoaSk7XG5cbiAgICBpZiAoY29kZSA9PT0gMTI1KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgIT09IDEyMykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY2xvc2VJbmRleCA9IGRhdGEuaW5kZXhPZihcIn1cIiwgaSArIDEpO1xuICAgIGlmIChjbG9zZUluZGV4ID09PSAtMSB8fCBjbG9zZUluZGV4ID09PSBpICsgMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGkgPSBjbG9zZUluZGV4O1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBjb25zdCBGb3JtYXRzOiBSZWNvcmQ8c3RyaW5nLCBGb3JtYXRGdW5jdGlvbiB8IGZhbHNlPiA9IHtcbiAgW1wiZGF0ZS10aW1lXCJdKGRhdGEpIHtcbiAgICBjb25zdCBsZW5ndGggPSBkYXRhLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoIDwgMTkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBkYXRhLmNoYXJDb2RlQXQoNCkgIT09IDQ1IHx8XG4gICAgICBkYXRhLmNoYXJDb2RlQXQoNykgIT09IDQ1IHx8XG4gICAgICBkYXRhLmNoYXJDb2RlQXQoMTMpICE9PSA1OCB8fFxuICAgICAgZGF0YS5jaGFyQ29kZUF0KDE2KSAhPT0gNThcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB0Q29kZSA9IGRhdGEuY2hhckNvZGVBdCgxMCk7XG4gICAgaWYgKHRDb2RlICE9PSA4NCAmJiB0Q29kZSAhPT0gMTE2KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgeWVhciA9IHBhcnNlRm91ckRpZ2l0cyhkYXRhLCAwKTtcbiAgICBjb25zdCBtb250aCA9IHBhcnNlVHdvRGlnaXRzKGRhdGEsIDUpO1xuICAgIGNvbnN0IGRheSA9IHBhcnNlVHdvRGlnaXRzKGRhdGEsIDgpO1xuICAgIGNvbnN0IGhvdXIgPSBwYXJzZVR3b0RpZ2l0cyhkYXRhLCAxMSk7XG4gICAgY29uc3QgbWludXRlID0gcGFyc2VUd29EaWdpdHMoZGF0YSwgMTQpO1xuICAgIGNvbnN0IHNlY29uZCA9IHBhcnNlVHdvRGlnaXRzKGRhdGEsIDE3KTtcblxuICAgIGlmIChcbiAgICAgIHllYXIgPCAwIHx8XG4gICAgICBtb250aCA8IDAgfHxcbiAgICAgIGRheSA8IDAgfHxcbiAgICAgIGhvdXIgPCAwIHx8XG4gICAgICBtaW51dGUgPCAwIHx8XG4gICAgICBzZWNvbmQgPCAwXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGhvdXIgPiAyMyB8fCBtaW51dGUgPiA1OSB8fCBzZWNvbmQgPiA2MCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBjdXJzb3IgPSAxOTtcbiAgICBsZXQgb2Zmc2V0U2lnbjogXCIrXCIgfCBcIi1cIiB8IG51bGwgPSBudWxsO1xuICAgIGxldCBvZmZzZXRIb3VyID0gMDtcbiAgICBsZXQgb2Zmc2V0TWludXRlID0gMDtcblxuICAgIGlmIChjdXJzb3IgPCBsZW5ndGggJiYgZGF0YS5jaGFyQ29kZUF0KGN1cnNvcikgPT09IDQ2KSB7XG4gICAgICBjdXJzb3IrKztcbiAgICAgIGNvbnN0IGZyYWNTdGFydCA9IGN1cnNvcjtcbiAgICAgIHdoaWxlIChjdXJzb3IgPCBsZW5ndGggJiYgaXNEaWdpdENoYXJDb2RlKGRhdGEuY2hhckNvZGVBdChjdXJzb3IpKSkge1xuICAgICAgICBjdXJzb3IrKztcbiAgICAgIH1cblxuICAgICAgaWYgKGN1cnNvciA9PT0gZnJhY1N0YXJ0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY3Vyc29yIDwgbGVuZ3RoKSB7XG4gICAgICBjb25zdCB0ekNvZGUgPSBkYXRhLmNoYXJDb2RlQXQoY3Vyc29yKTtcblxuICAgICAgaWYgKHR6Q29kZSA9PT0gOTAgfHwgdHpDb2RlID09PSAxMjIpIHtcbiAgICAgICAgY3Vyc29yKys7XG4gICAgICB9IGVsc2UgaWYgKHR6Q29kZSA9PT0gNDMgfHwgdHpDb2RlID09PSA0NSkge1xuICAgICAgICBvZmZzZXRTaWduID0gdHpDb2RlID09PSA0MyA/IFwiK1wiIDogXCItXCI7XG5cbiAgICAgICAgaWYgKGN1cnNvciArIDYgPiBsZW5ndGggfHwgZGF0YS5jaGFyQ29kZUF0KGN1cnNvciArIDMpICE9PSA1OCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9mZnNldEhvdXIgPSBwYXJzZVR3b0RpZ2l0cyhkYXRhLCBjdXJzb3IgKyAxKTtcbiAgICAgICAgb2Zmc2V0TWludXRlID0gcGFyc2VUd29EaWdpdHMoZGF0YSwgY3Vyc29yICsgNCk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIG9mZnNldEhvdXIgPCAwIHx8XG4gICAgICAgICAgb2Zmc2V0TWludXRlIDwgMCB8fFxuICAgICAgICAgIG9mZnNldEhvdXIgPiAyMyB8fFxuICAgICAgICAgIG9mZnNldE1pbnV0ZSA+IDU5XG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnNvciArPSA2O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjdXJzb3IgIT09IGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIE1lcyAx4oCTMTJcbiAgICBpZiAobW9udGggPCAxIHx8IG1vbnRoID4gMTIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gRMOtYSA+PSAxXG4gICAgaWYgKGRheSA8IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXhEYXlzID1cbiAgICAgIG1vbnRoID09PSAyXG4gICAgICAgID8geWVhciAlIDQgPT09IDAgJiYgKHllYXIgJSAxMDAgIT09IDAgfHwgeWVhciAlIDQwMCA9PT0gMClcbiAgICAgICAgICA/IDI5XG4gICAgICAgICAgOiAyOFxuICAgICAgICA6IERBWVNfSU5fTU9OVEhbbW9udGggLSAxXTtcblxuICAgIGlmICghbWF4RGF5cyB8fCBkYXkgPiBtYXhEYXlzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHNlY29uZCA9PT0gNjApIHtcbiAgICAgIGxldCB1dGNUb3RhbE1pbnV0ZXMgPSBob3VyICogNjAgKyBtaW51dGU7XG5cbiAgICAgIGlmIChvZmZzZXRTaWduKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldFRvdGFsTWludXRlcyA9IG9mZnNldEhvdXIgKiA2MCArIG9mZnNldE1pbnV0ZTtcbiAgICAgICAgdXRjVG90YWxNaW51dGVzICs9XG4gICAgICAgICAgb2Zmc2V0U2lnbiA9PT0gXCIrXCIgPyAtb2Zmc2V0VG90YWxNaW51dGVzIDogb2Zmc2V0VG90YWxNaW51dGVzO1xuICAgICAgICB1dGNUb3RhbE1pbnV0ZXMgJT0gMjQgKiA2MDtcbiAgICAgICAgaWYgKHV0Y1RvdGFsTWludXRlcyA8IDApIHtcbiAgICAgICAgICB1dGNUb3RhbE1pbnV0ZXMgKz0gMjQgKiA2MDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodXRjVG90YWxNaW51dGVzICE9PSAyMyAqIDYwICsgNTkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICB1cmkoZGF0YSkge1xuICAgIHJldHVybiBVUklfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcbiAgZW1haWwoZGF0YSkge1xuICAgIHJldHVybiBFTUFJTF9SRUdFWC50ZXN0KGRhdGEpO1xuICB9LFxuICBpcHY0KGRhdGEpIHtcbiAgICByZXR1cm4gaXNWYWxpZElwdjQoZGF0YSk7XG4gIH0sXG5cbiAgaXB2NihkYXRhKSB7XG4gICAgcmV0dXJuIGlzVmFsaWRJcHY2KGRhdGEpO1xuICB9LFxuXG4gIGhvc3RuYW1lKGRhdGEpIHtcbiAgICByZXR1cm4gSE9TVE5BTUVfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcbiAgZGF0ZShkYXRhKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBEQVRFX1JFR0VYLmV4ZWMoZGF0YSk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IFssIHllYXJTdHIsIG1vbnRoU3RyLCBkYXlTdHJdID0gbWF0Y2g7XG4gICAgY29uc3QgeWVhciA9IE51bWJlcih5ZWFyU3RyKTtcbiAgICBjb25zdCBtb250aCA9IE51bWJlcihtb250aFN0cik7XG4gICAgY29uc3QgZGF5ID0gTnVtYmVyKGRheVN0cik7XG5cbiAgICBpZiAobW9udGggPCAxIHx8IG1vbnRoID4gMTIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGRheSA8IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXhEYXlzID1cbiAgICAgIG1vbnRoID09PSAyXG4gICAgICAgID8geWVhciAlIDQgPT09IDAgJiYgKHllYXIgJSAxMDAgIT09IDAgfHwgeWVhciAlIDQwMCA9PT0gMClcbiAgICAgICAgICA/IDI5XG4gICAgICAgICAgOiAyOFxuICAgICAgICA6IERBWVNfSU5fTU9OVEhbbW9udGggLSAxXTtcblxuICAgIHJldHVybiAhIW1heERheXMgJiYgZGF5IDw9IG1heERheXM7XG4gIH0sXG4gIHJlZ2V4KGRhdGEpIHtcbiAgICB0cnkge1xuICAgICAgbmV3IFJlZ0V4cChkYXRhKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG4gIFwianNvbi1wb2ludGVyXCIoZGF0YSkge1xuICAgIHJldHVybiBpc1ZhbGlkSnNvblBvaW50ZXIoZGF0YSk7XG4gIH0sXG4gIFwicmVsYXRpdmUtanNvbi1wb2ludGVyXCIoZGF0YSkge1xuICAgIHJldHVybiBpc1ZhbGlkUmVsYXRpdmVKc29uUG9pbnRlcihkYXRhKTtcbiAgfSxcbiAgdGltZShkYXRhKSB7XG4gICAgcmV0dXJuIFRJTUVfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcbiAgXCJ1cmktcmVmZXJlbmNlXCIoZGF0YSkge1xuICAgIGlmIChkYXRhLmluY2x1ZGVzKFwiXFxcXFwiKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBVUklfUkVGRVJFTkNFX1JFR0VYLnRlc3QoZGF0YSk7XG4gIH0sXG5cbiAgXCJ1cmktdGVtcGxhdGVcIihkYXRhKSB7XG4gICAgcmV0dXJuIGlzVmFsaWRVcmlUZW1wbGF0ZShkYXRhKTtcbiAgfSxcblxuICBkdXJhdGlvbihkYXRhKSB7XG4gICAgcmV0dXJuIERVUkFUSU9OX1JFR0VYLnRlc3QoZGF0YSk7XG4gIH0sXG5cbiAgdXVpZChkYXRhKSB7XG4gICAgcmV0dXJuIFVVSURfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcblxuICAvLyBJUkkgaXMgbGlrZSBVUkkgYnV0IGFsbG93cyBVbmljb2RlLiBXZSByZXVzZSBhIHBlcm1pc3NpdmUgbG9naWMuXG4gIGlyaShkYXRhKSB7XG4gICAgcmV0dXJuIElSSV9SRUdFWC50ZXN0KGRhdGEpO1xuICB9LFxuXG4gIFwiaXJpLXJlZmVyZW5jZVwiKGRhdGEpIHtcbiAgICBpZiAoZGF0YS5pbmNsdWRlcyhcIlxcXFxcIikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIElSSV9SRUZFUkVOQ0VfUkVHRVgudGVzdChkYXRhKTtcbiAgfSxcblxuICAvLyBCZXN0LWVmZm9ydCBzdHJ1Y3R1cmFsIHZhbGlkYXRpb24gZm9yIElETiAobm8gcHVueWNvZGUvdGFibGVzKVxuICBcImlkbi1lbWFpbFwiKGRhdGEpIHtcbiAgICByZXR1cm4gSUROX0VNQUlMX1JFR0VYLnRlc3QoZGF0YSk7XG4gIH0sXG5cbiAgXCJpZG4taG9zdG5hbWVcIihkYXRhKSB7XG4gICAgLy8gQWxsb3dzIHVuaWNvZGUsIGZvcmJpZHMgc3BhY2VzIGFuZCB0eXBpY2FsIGludmFsaWQgVVJMIGNoYXJzXG4gICAgcmV0dXJuIElETl9IT1NUTkFNRV9SRUdFWC50ZXN0KGRhdGEpO1xuICB9XG59O1xuIiwiaW1wb3J0IHsgVHlwZUZ1bmN0aW9uIH0gZnJvbSBcIi4vaW5kZXhcIjtcblxuZXhwb3J0IGNvbnN0IFR5cGVzOiBSZWNvcmQ8c3RyaW5nLCBUeXBlRnVuY3Rpb24gfCBmYWxzZT4gPSB7XG4gIG9iamVjdChkYXRhKSB7XG4gICAgcmV0dXJuIGRhdGEgIT09IG51bGwgJiYgdHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoZGF0YSk7XG4gIH0sXG4gIGFycmF5KGRhdGEpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShkYXRhKTtcbiAgfSxcbiAgc3RyaW5nKGRhdGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCI7XG4gIH0sXG4gIG51bWJlcihkYXRhKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcIm51bWJlclwiO1xuICB9LFxuICBpbnRlZ2VyKGRhdGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwibnVtYmVyXCIgJiYgZGF0YSAlIDEgPT09IDA7XG4gIH0sXG4gIGJvb2xlYW4oZGF0YSkge1xuICAgIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gXCJib29sZWFuXCI7XG4gIH0sXG4gIG51bGwoZGF0YSkge1xuICAgIHJldHVybiBkYXRhID09PSBudWxsO1xuICB9LFxuXG4gIC8vIE5vdCBpbXBsZW1lbnRlZCB5ZXRcbiAgdGltZXN0YW1wOiBmYWxzZSxcbiAgaW50ODogZmFsc2UsXG4gIHVpbnQ4OiBmYWxzZSxcbiAgaW50MTY6IGZhbHNlLFxuICB1aW50MTY6IGZhbHNlLFxuICBpbnQzMjogZmFsc2UsXG4gIHVpbnQzMjogZmFsc2UsXG4gIGZsb2F0MzI6IGZhbHNlLFxuICBmbG9hdDY0OiBmYWxzZVxufTtcbiIsIi8vIFV0aWxpdHkgZnVuY3Rpb24gdG8gY2hlY2sgaWYgZGVwZW5kZW5jaWVzIGhhdmUgY2hhbmdlZCByZWN1cnNpdmVseVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHNvbmFyanMvY29nbml0aXZlLWNvbXBsZXhpdHlcbmV4cG9ydCBmdW5jdGlvbiBoYXNDaGFuZ2VkKHByZXY6IGFueSwgY3VycmVudDogYW55KSB7XG4gIGlmIChPYmplY3QuaXMocHJldiwgY3VycmVudCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShwcmV2KSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGN1cnJlbnQpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHByZXYubGVuZ3RoICE9PSBjdXJyZW50Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJyZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGFzQ2hhbmdlZChwcmV2W2ldLCBjdXJyZW50W2ldKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIHByZXYgPT09IFwib2JqZWN0XCIgJiYgcHJldiAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlb2YgY3VycmVudCAhPT0gXCJvYmplY3RcIiB8fCBjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBjdXJyZW50KSB7XG4gICAgICBpZiAoaGFzQ2hhbmdlZChwcmV2W2tleV0sIGN1cnJlbnRba2V5XSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gcHJldikge1xuICAgICAgaWYgKGtleSBpbiBjdXJyZW50KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFzQ2hhbmdlZChwcmV2W2tleV0sIHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG4iLCJpbXBvcnQgeyBpc0NvbXBpbGVkU2NoZW1hIH0gZnJvbSBcIi4uL3V0aWxzL21haW4tdXRpbHNcIjtcblxuaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5pbXBvcnQgeyBoYXNDaGFuZ2VkIH0gZnJvbSBcIi4uL3V0aWxzL2hhcy1jaGFuZ2VkXCI7XG5cbmZ1bmN0aW9uIGlzVW5pcXVlUHJpbWl0aXZlKHZhbHVlOiBhbnkpIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSA9PT0gbnVsbCB8fFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCJcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0QXJyYXlCdWNrZXRLZXkodmFsdWU6IGFueVtdKTogc3RyaW5nIHtcbiAgY29uc3QgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFwiMFwiO1xuICB9XG5cbiAgY29uc3QgZmlyc3QgPSB2YWx1ZVswXTtcbiAgY29uc3QgbGFzdCA9IHZhbHVlW2xlbmd0aCAtIDFdO1xuICBjb25zdCBmaXJzdFR5cGUgPSBmaXJzdCA9PT0gbnVsbCA/IFwibnVsbFwiIDogdHlwZW9mIGZpcnN0O1xuICBjb25zdCBsYXN0VHlwZSA9IGxhc3QgPT09IG51bGwgPyBcIm51bGxcIiA6IHR5cGVvZiBsYXN0O1xuXG4gIGxldCBmaXJzdEFycmF5TWFya2VyID0gXCJcIjtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZmlyc3QpKSB7XG4gICAgY29uc3QgZmlyc3RTaWduYXR1cmUgPSBnZXRQcmltaXRpdmVBcnJheVNpZ25hdHVyZShmaXJzdCk7XG4gICAgZmlyc3RBcnJheU1hcmtlciA9IGZpcnN0U2lnbmF0dXJlID09PSBudWxsID8gYGE6JHtmaXJzdC5sZW5ndGh9YCA6IGZpcnN0U2lnbmF0dXJlO1xuICB9XG5cbiAgbGV0IGxhc3RBcnJheU1hcmtlciA9IFwiXCI7XG4gIGlmIChBcnJheS5pc0FycmF5KGxhc3QpKSB7XG4gICAgY29uc3QgbGFzdFNpZ25hdHVyZSA9IGdldFByaW1pdGl2ZUFycmF5U2lnbmF0dXJlKGxhc3QpO1xuICAgIGxhc3RBcnJheU1hcmtlciA9IGxhc3RTaWduYXR1cmUgPT09IG51bGwgPyBgYToke2xhc3QubGVuZ3RofWAgOiBsYXN0U2lnbmF0dXJlO1xuICB9XG5cbiAgcmV0dXJuIGAke2xlbmd0aH06JHtmaXJzdFR5cGV9OiR7Zmlyc3RBcnJheU1hcmtlcn06JHtsYXN0VHlwZX06JHtsYXN0QXJyYXlNYXJrZXJ9YDtcbn1cblxuZnVuY3Rpb24gZ2V0T2JqZWN0U2hhcGVLZXkodmFsdWU6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBzdHJpbmcge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpLnNvcnQoKTtcbiAgcmV0dXJuIGAke2tleXMubGVuZ3RofToke2tleXMuam9pbihcIlxcdTAwMDFcIil9YDtcbn1cblxuZnVuY3Rpb24gZ2V0UHJpbWl0aXZlQXJyYXlTaWduYXR1cmUodmFsdWU6IGFueVtdKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcblxuICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFwiYTowXCI7XG4gIH1cblxuICBpZiAoIWlzVW5pcXVlUHJpbWl0aXZlKHZhbHVlWzBdKSB8fCAhaXNVbmlxdWVQcmltaXRpdmUodmFsdWVbbGVuZ3RoIC0gMV0pKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBsZXQgc2lnbmF0dXJlID0gYGE6JHtsZW5ndGh9OmA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGl0ZW0gPSB2YWx1ZVtpXTtcblxuICAgIGlmIChpdGVtID09PSBudWxsKSB7XG4gICAgICBzaWduYXR1cmUgKz0gXCJsO1wiO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBzaWduYXR1cmUgKz0gYHMke2l0ZW0ubGVuZ3RofToke2l0ZW19O2A7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGl0ZW0gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4oaXRlbSkpIHtcbiAgICAgICAgc2lnbmF0dXJlICs9IFwibjpOYU47XCI7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoT2JqZWN0LmlzKGl0ZW0sIC0wKSkge1xuICAgICAgICBzaWduYXR1cmUgKz0gXCJuOi0wO1wiO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgc2lnbmF0dXJlICs9IGBuOiR7aXRlbX07YDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHNpZ25hdHVyZSArPSBpdGVtID8gXCJiOjE7XCIgOiBcImI6MDtcIjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHNpZ25hdHVyZTtcbn1cblxuZXhwb3J0IGNvbnN0IEFycmF5S2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbj4gPSB7XG4gIC8vIGxpYi9rZXl3b3Jkcy9hcnJheS1rZXl3b3Jkcy50c1xuICBpdGVtcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2NoZW1hSXRlbXMgPSBzY2hlbWEuaXRlbXM7XG4gICAgY29uc3QgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuXG4gICAgaWYgKHR5cGVvZiBzY2hlbWFJdGVtcyA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGlmIChzY2hlbWFJdGVtcyA9PT0gZmFsc2UgJiYgZGF0YUxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbXMgYXJlIG5vdCBhbGxvd2VkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWFJdGVtcykpIHtcbiAgICAgIGNvbnN0IHNjaGVtYUl0ZW1zTGVuZ3RoID0gc2NoZW1hSXRlbXMubGVuZ3RoO1xuICAgICAgY29uc3QgaXRlbXNMZW5ndGggPVxuICAgICAgICBzY2hlbWFJdGVtc0xlbmd0aCA8IGRhdGFMZW5ndGggPyBzY2hlbWFJdGVtc0xlbmd0aCA6IGRhdGFMZW5ndGg7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXNMZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBzY2hlbWFJdGVtID0gc2NoZW1hSXRlbXNbaV07XG5cbiAgICAgICAgaWYgKHR5cGVvZiBzY2hlbWFJdGVtID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgIGlmIChzY2hlbWFJdGVtID09PSBmYWxzZSAmJiBkYXRhW2ldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW0gaXMgbm90IGFsbG93ZWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWxpZGF0ZSA9IHNjaGVtYUl0ZW0gJiYgc2NoZW1hSXRlbS4kdmFsaWRhdGU7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsaWRhdGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtIGlzIGludmFsaWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICAgIGRhdGE6IGRhdGFbaV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdGUgPSBzY2hlbWFJdGVtcyAmJiBzY2hlbWFJdGVtcy4kdmFsaWRhdGU7XG4gICAgaWYgKHR5cGVvZiB2YWxpZGF0ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBlbGVtZW50cyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudHNTY2hlbWEgPSBzY2hlbWEuZWxlbWVudHM7XG4gICAgY29uc3QgdmFsaWRhdGUgPSBlbGVtZW50c1NjaGVtYSAmJiBlbGVtZW50c1NjaGVtYS4kdmFsaWRhdGU7XG4gICAgaWYgKHR5cGVvZiB2YWxpZGF0ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHZhbGlkYXRlKGRhdGFbaV0pO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW0gaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgaXRlbTogaSxcbiAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgZGF0YTogZGF0YVtpXVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWluSXRlbXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSB8fCBkYXRhLmxlbmd0aCA+PSBzY2hlbWEubWluSXRlbXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpcyB0b28gc2hvcnRcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIG1heEl0ZW1zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkgfHwgZGF0YS5sZW5ndGggPD0gc2NoZW1hLm1heEl0ZW1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXMgdG9vIGxvbmdcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIGFkZGl0aW9uYWxJdGVtcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpIHx8ICFBcnJheS5pc0FycmF5KHNjaGVtYS5pdGVtcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgdHVwbGVMZW5ndGggPSAoc2NoZW1hIGFzIGFueSkuX3R1cGxlSXRlbXNMZW5ndGggYXMgbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0dXBsZUxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0dXBsZUxlbmd0aCA9IHNjaGVtYS5pdGVtcy5sZW5ndGg7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl90dXBsZUl0ZW1zTGVuZ3RoXCIsIHtcbiAgICAgICAgdmFsdWU6IHR1cGxlTGVuZ3RoLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5sZW5ndGggPD0gdHVwbGVMZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2NoZW1hLmFkZGl0aW9uYWxJdGVtcyA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGlzIHRvbyBsb25nXCIsIHsgZGF0YSB9KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBzY2hlbWEuYWRkaXRpb25hbEl0ZW1zICYmXG4gICAgICB0eXBlb2Ygc2NoZW1hLmFkZGl0aW9uYWxJdGVtcyA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkoc2NoZW1hLmFkZGl0aW9uYWxJdGVtcylcbiAgICApIHtcbiAgICAgIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSB0dXBsZUxlbmd0aDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMuJHZhbGlkYXRlKGRhdGFbaV0pO1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgICAgaXRlbTogaSxcbiAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIHVuaXF1ZUl0ZW1zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkgfHwgIXNjaGVtYS51bmlxdWVJdGVtcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxlbiA9IGRhdGEubGVuZ3RoO1xuICAgIGlmIChsZW4gPD0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChsZW4gPD0gOCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBjb25zdCBsZWZ0ID0gZGF0YVtpXTtcblxuICAgICAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBsZW47IGorKykge1xuICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gZGF0YVtqXTtcblxuICAgICAgICAgIGlmIChsZWZ0ID09PSByaWdodCkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbXMgYXJlIG5vdCB1bmlxdWVcIiwgeyBkYXRhOiByaWdodCB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgbGVmdCA9PT0gXCJudW1iZXJcIiAmJlxuICAgICAgICAgICAgdHlwZW9mIHJpZ2h0ID09PSBcIm51bWJlclwiICYmXG4gICAgICAgICAgICBOdW1iZXIuaXNOYU4obGVmdCkgJiZcbiAgICAgICAgICAgIE51bWJlci5pc05hTihyaWdodClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW1zIGFyZSBub3QgdW5pcXVlXCIsIHsgZGF0YTogcmlnaHQgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgbGVmdCAmJlxuICAgICAgICAgICAgcmlnaHQgJiZcbiAgICAgICAgICAgIHR5cGVvZiBsZWZ0ID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICB0eXBlb2YgcmlnaHQgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgICFoYXNDaGFuZ2VkKGxlZnQsIHJpZ2h0KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbXMgYXJlIG5vdCB1bmlxdWVcIiwgeyBkYXRhOiByaWdodCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByaW1pdGl2ZVNlZW4gPSBuZXcgU2V0PGFueT4oKTtcbiAgICBsZXQgcHJpbWl0aXZlQXJyYXlTaWduYXR1cmVzOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYXJyYXlCdWNrZXRzOiBNYXA8c3RyaW5nLCBhbnlbXT4gfCB1bmRlZmluZWQ7XG4gICAgbGV0IG9iamVjdEJ1Y2tldHM6IE1hcDxzdHJpbmcsIGFueVtdPiB8IHVuZGVmaW5lZDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSBkYXRhW2ldO1xuXG4gICAgICBpZiAoaXNVbmlxdWVQcmltaXRpdmUoaXRlbSkpIHtcbiAgICAgICAgaWYgKHByaW1pdGl2ZVNlZW4uaGFzKGl0ZW0pKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbXMgYXJlIG5vdCB1bmlxdWVcIiwgeyBkYXRhOiBpdGVtIH0pO1xuICAgICAgICB9XG4gICAgICAgIHByaW1pdGl2ZVNlZW4uYWRkKGl0ZW0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpdGVtIHx8IHR5cGVvZiBpdGVtICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgICAgICBjb25zdCBzaWduYXR1cmUgPSBnZXRQcmltaXRpdmVBcnJheVNpZ25hdHVyZShpdGVtKTtcbiAgICAgICAgaWYgKHNpZ25hdHVyZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmICghcHJpbWl0aXZlQXJyYXlTaWduYXR1cmVzKSB7XG4gICAgICAgICAgICBwcmltaXRpdmVBcnJheVNpZ25hdHVyZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocHJpbWl0aXZlQXJyYXlTaWduYXR1cmVzLmhhcyhzaWduYXR1cmUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtcyBhcmUgbm90IHVuaXF1ZVwiLCB7IGRhdGE6IGl0ZW0gfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcHJpbWl0aXZlQXJyYXlTaWduYXR1cmVzLmFkZChzaWduYXR1cmUpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFhcnJheUJ1Y2tldHMpIHtcbiAgICAgICAgICBhcnJheUJ1Y2tldHMgPSBuZXcgTWFwPHN0cmluZywgYW55W10+KCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBidWNrZXRLZXkgPSBnZXRBcnJheUJ1Y2tldEtleShpdGVtKTtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZXMgPSBhcnJheUJ1Y2tldHMuZ2V0KGJ1Y2tldEtleSk7XG5cbiAgICAgICAgaWYgKCFjYW5kaWRhdGVzKSB7XG4gICAgICAgICAgY2FuZGlkYXRlcyA9IFtdO1xuICAgICAgICAgIGFycmF5QnVja2V0cy5zZXQoYnVja2V0S2V5LCBjYW5kaWRhdGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY2FuZGlkYXRlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIGlmICghaGFzQ2hhbmdlZChjYW5kaWRhdGVzW2pdLCBpdGVtKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbXMgYXJlIG5vdCB1bmlxdWVcIiwgeyBkYXRhOiBpdGVtIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNhbmRpZGF0ZXMucHVzaChpdGVtKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghb2JqZWN0QnVja2V0cykge1xuICAgICAgICBvYmplY3RCdWNrZXRzID0gbmV3IE1hcDxzdHJpbmcsIGFueVtdPigpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBidWNrZXRLZXkgPSBnZXRPYmplY3RTaGFwZUtleShpdGVtKTtcbiAgICAgIGxldCBjYW5kaWRhdGVzID0gb2JqZWN0QnVja2V0cy5nZXQoYnVja2V0S2V5KTtcblxuICAgICAgaWYgKCFjYW5kaWRhdGVzKSB7XG4gICAgICAgIGNhbmRpZGF0ZXMgPSBbXTtcbiAgICAgICAgb2JqZWN0QnVja2V0cy5zZXQoYnVja2V0S2V5LCBjYW5kaWRhdGVzKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjYW5kaWRhdGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmICghaGFzQ2hhbmdlZChjYW5kaWRhdGVzW2pdLCBpdGVtKSkge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW1zIGFyZSBub3QgdW5pcXVlXCIsIHsgZGF0YTogaXRlbSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjYW5kaWRhdGVzLnB1c2goaXRlbSk7XG4gICAgfVxuICB9LFxuXG4gIGNvbnRhaW5zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuY29udGFpbnMgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBpZiAoc2NoZW1hLmNvbnRhaW5zKSB7XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgaXRlbVwiLCB7IGRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBtdXN0IG5vdCBjb250YWluIGFueSBpdGVtc1wiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udGFpbnNWYWxpZGF0ZSA9IHNjaGVtYS5jb250YWlucy4kdmFsaWRhdGU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlcnJvciA9IGNvbnRhaW5zVmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgaXRlbVwiLCB7IGRhdGEgfSk7XG4gIH1cbn07XG4iLCJleHBvcnQgZnVuY3Rpb24gZGVlcEZyZWV6ZShcbiAgb2JqOiBhbnksXG4gIGZyZWV6ZUNsYXNzSW5zdGFuY2VzOiBib29sZWFuID0gZmFsc2UsXG4gIHNlZW4gPSBuZXcgV2Vha1NldCgpXG4pOiBhbnkge1xuICBpZiAoXG4gICAgb2JqID09PSBudWxsIHx8XG4gICAgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIiB8fFxuICAgIHNlZW4uaGFzKG9iaikgfHxcbiAgICBPYmplY3QuaXNGcm96ZW4ob2JqKVxuICApIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgc2Vlbi5hZGQob2JqKTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBvYmoubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBkZWVwRnJlZXplKG9ialtpXSwgZnJlZXplQ2xhc3NJbnN0YW5jZXMsIHNlZW4pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwcm9wcyA9IFJlZmxlY3Qub3duS2V5cyhvYmopO1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gcHJvcHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBkZWVwRnJlZXplKG9ialtwcm9wc1tpXV0sIGZyZWV6ZUNsYXNzSW5zdGFuY2VzLCBzZWVuKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgb2JqZWN0IGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgKG5vdCBhIHBsYWluIG9iamVjdCBvciBhcnJheSkgd2UgbmVlZCB0byBmcmVlemUgdGhlIHByb3RvdHlwZVxuICAgIGlmIChmcmVlemVDbGFzc0luc3RhbmNlcykge1xuICAgICAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKTtcbiAgICAgIGlmIChwcm90byAmJiBwcm90byAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgICAgICBkZWVwRnJlZXplKHByb3RvLCBmcmVlemVDbGFzc0luc3RhbmNlcywgc2Vlbik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgT2JqZWN0LmZyZWV6ZShvYmopO1xuXG4gIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgcmV0dXJuIHByb3RvID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvID09PSBudWxsO1xufVxuXG5leHBvcnQgeyBpc1BsYWluT2JqZWN0IH07XG5cbmZ1bmN0aW9uIGNhblVzZVN0cnVjdHVyZWRDbG9uZSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2Ygc3RydWN0dXJlZENsb25lICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIiAmJiB2YWx1ZSBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHxcbiAgICBpc1BsYWluT2JqZWN0KHZhbHVlKSB8fFxuICAgIHZhbHVlIGluc3RhbmNlb2YgRGF0ZSB8fFxuICAgIHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwIHx8XG4gICAgdmFsdWUgaW5zdGFuY2VvZiBNYXAgfHxcbiAgICB2YWx1ZSBpbnN0YW5jZW9mIFNldCB8fFxuICAgIHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHxcbiAgICBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWVwQ2xvbmVVbmZyZWV6ZTxUPihcbiAgb2JqOiBULFxuICBjbG9uZUNsYXNzSW5zdGFuY2VzID0gZmFsc2UsXG4gIHNlZW4gPSBuZXcgV2Vha01hcCgpXG4pOiBUIHtcbiAgaWYgKHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgfHwgb2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgY29uc3Qgc291cmNlID0gb2JqIGFzIGFueTtcblxuICBpZiAoc2Vlbi5oYXMoc291cmNlKSkge1xuICAgIHJldHVybiBzZWVuLmdldChzb3VyY2UpO1xuICB9XG5cbiAgaWYgKGNhblVzZVN0cnVjdHVyZWRDbG9uZShzb3VyY2UpKSB7XG4gICAgY29uc3QgY2xvbmVkID0gc3RydWN0dXJlZENsb25lKHNvdXJjZSk7XG4gICAgc2Vlbi5zZXQoc291cmNlLCBjbG9uZWQpO1xuICAgIHJldHVybiBjbG9uZWQ7XG4gIH1cblxuICBsZXQgY2xvbmU6IGFueTtcblxuICBzd2l0Y2ggKHRydWUpIHtcbiAgICBjYXNlIEFycmF5LmlzQXJyYXkoc291cmNlKToge1xuICAgICAgY2xvbmUgPSBbXTtcbiAgICAgIHNlZW4uc2V0KHNvdXJjZSwgY2xvbmUpO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBzb3VyY2UubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGNsb25lW2ldID0gZGVlcENsb25lVW5mcmVlemUoc291cmNlW2ldLCBjbG9uZUNsYXNzSW5zdGFuY2VzLCBzZWVuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9XG4gICAgY2FzZSBzb3VyY2UgaW5zdGFuY2VvZiBEYXRlOiB7XG4gICAgICBjbG9uZSA9IG5ldyBEYXRlKHNvdXJjZS5nZXRUaW1lKCkpO1xuICAgICAgc2Vlbi5zZXQoc291cmNlLCBjbG9uZSk7XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIGNhc2Ugc291cmNlIGluc3RhbmNlb2YgUmVnRXhwOiB7XG4gICAgICBjbG9uZSA9IG5ldyBSZWdFeHAoc291cmNlLnNvdXJjZSwgc291cmNlLmZsYWdzKTtcbiAgICAgIHNlZW4uc2V0KHNvdXJjZSwgY2xvbmUpO1xuICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cbiAgICBjYXNlIHNvdXJjZSBpbnN0YW5jZW9mIE1hcDoge1xuICAgICAgY2xvbmUgPSBuZXcgTWFwKCk7XG4gICAgICBzZWVuLnNldChzb3VyY2UsIGNsb25lKTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHNvdXJjZS5lbnRyaWVzKCkpIHtcbiAgICAgICAgY2xvbmUuc2V0KFxuICAgICAgICAgIGRlZXBDbG9uZVVuZnJlZXplKGtleSwgY2xvbmVDbGFzc0luc3RhbmNlcywgc2VlbiksXG4gICAgICAgICAgZGVlcENsb25lVW5mcmVlemUodmFsdWUsIGNsb25lQ2xhc3NJbnN0YW5jZXMsIHNlZW4pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIGNhc2Ugc291cmNlIGluc3RhbmNlb2YgU2V0OiB7XG4gICAgICBjbG9uZSA9IG5ldyBTZXQoKTtcbiAgICAgIHNlZW4uc2V0KHNvdXJjZSwgY2xvbmUpO1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBzb3VyY2UudmFsdWVzKCkpIHtcbiAgICAgICAgY2xvbmUuYWRkKGRlZXBDbG9uZVVuZnJlZXplKHZhbHVlLCBjbG9uZUNsYXNzSW5zdGFuY2VzLCBzZWVuKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIGNhc2Ugc291cmNlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI6IHtcbiAgICAgIGNsb25lID0gc291cmNlLnNsaWNlKDApO1xuICAgICAgc2Vlbi5zZXQoc291cmNlLCBjbG9uZSk7XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIC8vIFR5cGVkQXJyYXlzIGFuZCBEYXRhVmlld1xuICAgIGNhc2UgQXJyYXlCdWZmZXIuaXNWaWV3KHNvdXJjZSk6IHtcbiAgICAgIGNsb25lID0gbmV3IHNvdXJjZS5jb25zdHJ1Y3Rvcihzb3VyY2UuYnVmZmVyLnNsaWNlKDApKTtcbiAgICAgIHNlZW4uc2V0KHNvdXJjZSwgY2xvbmUpO1xuICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cbiAgICAvLyBOb2RlLmpzIEJ1ZmZlclxuICAgIGNhc2UgdHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzb3VyY2UgaW5zdGFuY2VvZiBCdWZmZXI6IHtcbiAgICAgIGNsb25lID0gQnVmZmVyLmZyb20oc291cmNlKTtcbiAgICAgIHNlZW4uc2V0KHNvdXJjZSwgY2xvbmUpO1xuICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cbiAgICBjYXNlIHNvdXJjZSBpbnN0YW5jZW9mIEVycm9yOiB7XG4gICAgICBjbG9uZSA9IG5ldyBzb3VyY2UuY29uc3RydWN0b3Ioc291cmNlLm1lc3NhZ2UpO1xuICAgICAgc2Vlbi5zZXQoc291cmNlLCBjbG9uZSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gTm9uIGNsb25hYmxlIG9iamVjdHNcbiAgICBjYXNlIHNvdXJjZSBpbnN0YW5jZW9mIFByb21pc2UgfHxcbiAgICAgIHNvdXJjZSBpbnN0YW5jZW9mIFdlYWtNYXAgfHxcbiAgICAgIHNvdXJjZSBpbnN0YW5jZW9mIFdlYWtTZXQ6IHtcbiAgICAgIGNsb25lID0gc291cmNlO1xuICAgICAgc2Vlbi5zZXQoc291cmNlLCBjbG9uZSk7XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIC8vIEluc3RhbmNlIG9mIGEgY2xhc3NcbiAgICBjYXNlIHNvdXJjZS5jb25zdHJ1Y3RvciAmJiBzb3VyY2UuY29uc3RydWN0b3IgIT09IE9iamVjdDoge1xuICAgICAgaWYgKCFjbG9uZUNsYXNzSW5zdGFuY2VzKSB7XG4gICAgICAgIGNsb25lID0gc291cmNlO1xuICAgICAgICBzZWVuLnNldChzb3VyY2UsIGNsb25lKTtcbiAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgICAgfVxuICAgICAgY2xvbmUgPSBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihzb3VyY2UpKTtcbiAgICAgIHNlZW4uc2V0KHNvdXJjZSwgY2xvbmUpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gUGxhaW4gb2JqZWN0c1xuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGNsb25lID0ge307XG4gICAgICBzZWVuLnNldChzb3VyY2UsIGNsb25lKTtcblxuICAgICAgY29uc3Qga2V5cyA9IFJlZmxlY3Qub3duS2V5cyhzb3VyY2UpO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgICBjbG9uZVtrZXkgYXMgc3RyaW5nXSA9IGRlZXBDbG9uZVVuZnJlZXplKFxuICAgICAgICAgIHNvdXJjZVtrZXkgYXMgc3RyaW5nXSxcbiAgICAgICAgICBjbG9uZUNsYXNzSW5zdGFuY2VzLFxuICAgICAgICAgIHNlZW5cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBkZXNjcmlwdG9ycyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSk7XG4gIGZvciAoY29uc3Qga2V5IG9mIFJlZmxlY3Qub3duS2V5cyhkZXNjcmlwdG9ycykpIHtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gZGVzY3JpcHRvcnNba2V5IGFzIHN0cmluZ107XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSB7XG4gICAgICBkZXNjcmlwdG9yLnZhbHVlID0gZGVlcENsb25lVW5mcmVlemUoXG4gICAgICAgIGRlc2NyaXB0b3IudmFsdWUsXG4gICAgICAgIGNsb25lQ2xhc3NJbnN0YW5jZXMsXG4gICAgICAgIHNlZW5cbiAgICAgICk7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbG9uZSwga2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxuXG4gIHJldHVybiBjbG9uZTtcbn1cbiIsImltcG9ydCB7IEtleXdvcmRGdW5jdGlvbiB9IGZyb20gXCIuLi9pbmRleFwiO1xuaW1wb3J0IHsgYXJlQ2xvc2VFbm91Z2ggfSBmcm9tIFwiLi4vdXRpbHMvaW5kZXhcIjtcblxuZXhwb3J0IGNvbnN0IE51bWJlcktleXdvcmRzOiBSZWNvcmQ8c3RyaW5nLCBLZXl3b3JkRnVuY3Rpb24+ID0ge1xuICBtaW5pbXVtKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG1pbiA9IHNjaGVtYS5taW5pbXVtO1xuICAgIGlmICh0eXBlb2Ygc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIG1pbiA9IHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtICsgMWUtMTU7XG4gICAgfSBlbHNlIGlmIChzY2hlbWEuZXhjbHVzaXZlTWluaW11bSA9PT0gdHJ1ZSkge1xuICAgICAgbWluICs9IDFlLTE1O1xuICAgIH1cblxuICAgIGlmIChkYXRhIDwgbWluKSB7XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBsZXNzIHRoYW4gdGhlIG1pbmltdW1cIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBtYXhpbXVtKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG1heCA9IHNjaGVtYS5tYXhpbXVtO1xuICAgIGlmICh0eXBlb2Ygc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIG1heCA9IHNjaGVtYS5leGNsdXNpdmVNYXhpbXVtIC0gMWUtMTU7XG4gICAgfSBlbHNlIGlmIChzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSA9PT0gdHJ1ZSkge1xuICAgICAgbWF4IC09IDFlLTE1O1xuICAgIH1cblxuICAgIGlmIChkYXRhID4gbWF4KSB7XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW1cIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBtdWx0aXBsZU9mKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcXVvdGllbnQgPSBkYXRhIC8gc2NoZW1hLm11bHRpcGxlT2Y7XG5cbiAgICBpZiAoIWlzRmluaXRlKHF1b3RpZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghYXJlQ2xvc2VFbm91Z2gocXVvdGllbnQsIE1hdGgucm91bmQocXVvdGllbnQpKSkge1xuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlIG11bHRpcGxlT2ZcIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBleGNsdXNpdmVNaW5pbXVtKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIgfHxcbiAgICAgIHR5cGVvZiBzY2hlbWEuZXhjbHVzaXZlTWluaW11bSAhPT0gXCJudW1iZXJcIiB8fFxuICAgICAgXCJtaW5pbXVtXCIgaW4gc2NoZW1hXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgPD0gc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gKyAxZS0xNSkge1xuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBleGNsdXNpdmVNaW5pbXVtXCIpO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBleGNsdXNpdmVNYXhpbXVtKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIgfHxcbiAgICAgIHR5cGVvZiBzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSAhPT0gXCJudW1iZXJcIiB8fFxuICAgICAgXCJtYXhpbXVtXCIgaW4gc2NoZW1hXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgPj0gc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcbiAgICAgICAgXCJWYWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGV4Y2x1c2l2ZU1heGltdW1cIixcbiAgICAgICAgeyBkYXRhIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG59O1xuIiwiY29uc3QgUkVHRVhfTUVUQV9DSEFSUyA9IC9bXFxcXC5eJCorPygpW1xcXXt9fF0vO1xuXG5mdW5jdGlvbiBoYXNSZWdleE1ldGEodmFsdWU6IHN0cmluZykge1xuICByZXR1cm4gUkVHRVhfTUVUQV9DSEFSUy50ZXN0KHZhbHVlKTtcbn1cblxuY29uc3QgUEFUVEVSTl9DQUNIRSA9IG5ldyBNYXA8c3RyaW5nLCBDb21waWxlZFBhdHRlcm5NYXRjaGVyPigpO1xuXG5leHBvcnQgdHlwZSBDb21waWxlZFBhdHRlcm5NYXRjaGVyID0gUmVnRXhwIHwgKCh2YWx1ZTogc3RyaW5nKSA9PiBib29sZWFuKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVQYXR0ZXJuTWF0Y2hlcihwYXR0ZXJuOiBzdHJpbmcpOiBDb21waWxlZFBhdHRlcm5NYXRjaGVyIHtcbiAgY29uc3QgY2FjaGVkID0gUEFUVEVSTl9DQUNIRS5nZXQocGF0dGVybik7XG4gIGlmIChjYWNoZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG5cbiAgbGV0IGNvbXBpbGVkOiBDb21waWxlZFBhdHRlcm5NYXRjaGVyO1xuXG4gIGlmIChwYXR0ZXJuLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbXBpbGVkID0gKF92YWx1ZTogc3RyaW5nKSA9PiB0cnVlO1xuICB9IGVsc2UgaWYgKCFoYXNSZWdleE1ldGEocGF0dGVybikpIHtcbiAgICBjb21waWxlZCA9ICh2YWx1ZTogc3RyaW5nKSA9PiB2YWx1ZS5pbmNsdWRlcyhwYXR0ZXJuKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwYXR0ZXJuTGVuZ3RoID0gcGF0dGVybi5sZW5ndGg7XG5cbiAgICBpZiAocGF0dGVybkxlbmd0aCA+PSAyICYmIHBhdHRlcm5bMF0gPT09IFwiXlwiICYmIHBhdHRlcm5bcGF0dGVybkxlbmd0aCAtIDFdID09PSBcIiRcIikge1xuICAgICAgY29uc3QgaW5uZXIgPSBwYXR0ZXJuLnNsaWNlKDEsIC0xKTtcbiAgICAgIGlmICghaGFzUmVnZXhNZXRhKGlubmVyKSkge1xuICAgICAgICBpZiAoaW5uZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29tcGlsZWQgPSAodmFsdWU6IHN0cmluZykgPT4gdmFsdWUubGVuZ3RoID09PSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbXBpbGVkID0gKHZhbHVlOiBzdHJpbmcpID0+IHZhbHVlID09PSBpbm5lcjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcGlsZWQgPSBuZXcgUmVnRXhwKHBhdHRlcm4sIFwidVwiKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHBhdHRlcm5bMF0gPT09IFwiXlwiKSB7XG4gICAgICBjb25zdCBpbm5lciA9IHBhdHRlcm4uc2xpY2UoMSk7XG4gICAgICBpZiAoIWhhc1JlZ2V4TWV0YShpbm5lcikpIHtcbiAgICAgICAgaWYgKGlubmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbXBpbGVkID0gKF92YWx1ZTogc3RyaW5nKSA9PiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbXBpbGVkID0gKHZhbHVlOiBzdHJpbmcpID0+IHZhbHVlLnN0YXJ0c1dpdGgoaW5uZXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21waWxlZCA9IG5ldyBSZWdFeHAocGF0dGVybiwgXCJ1XCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocGF0dGVybltwYXR0ZXJuTGVuZ3RoIC0gMV0gPT09IFwiJFwiKSB7XG4gICAgICBjb25zdCBpbm5lciA9IHBhdHRlcm4uc2xpY2UoMCwgLTEpO1xuICAgICAgaWYgKCFoYXNSZWdleE1ldGEoaW5uZXIpKSB7XG4gICAgICAgIGlmIChpbm5lci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBjb21waWxlZCA9IChfdmFsdWU6IHN0cmluZykgPT4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21waWxlZCA9ICh2YWx1ZTogc3RyaW5nKSA9PiB2YWx1ZS5lbmRzV2l0aChpbm5lcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBpbGVkID0gbmV3IFJlZ0V4cChwYXR0ZXJuLCBcInVcIik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbXBpbGVkID0gbmV3IFJlZ0V4cChwYXR0ZXJuLCBcInVcIik7XG4gICAgfVxuICB9XG5cbiAgUEFUVEVSTl9DQUNIRS5zZXQocGF0dGVybiwgY29tcGlsZWQpO1xuICByZXR1cm4gY29tcGlsZWQ7XG59XG4iLCJpbXBvcnQgeyBpc0NvbXBpbGVkU2NoZW1hIH0gZnJvbSBcIi4uL3V0aWxzL21haW4tdXRpbHNcIjtcblxuaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5pbXBvcnQgeyBkZWVwQ2xvbmVVbmZyZWV6ZSB9IGZyb20gXCIuLi91dGlscy9kZWVwLWZyZWV6ZVwiO1xuaW1wb3J0IHsgY29tcGlsZVBhdHRlcm5NYXRjaGVyIH0gZnJvbSBcIi4uL3V0aWxzL3BhdHRlcm4tbWF0Y2hlclwiO1xuXG5jb25zdCBQQVRURVJOX0tFWV9DQUNIRV9MSU1JVCA9IDUxMjtcblxudHlwZSBQYXR0ZXJuUHJvcGVydHlFbnRyeSA9IHtcbiAgc2NoZW1hUHJvcDogYW55O1xuICBtYXRjaDogKGtleTogc3RyaW5nKSA9PiBib29sZWFuO1xufTtcblxuZnVuY3Rpb24gZ2V0UGF0dGVyblByb3BlcnR5RW50cmllcyhzY2hlbWE6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgbGV0IGVudHJpZXMgPSAoc2NoZW1hIGFzIGFueSkuX3BhdHRlcm5Qcm9wZXJ0eUVudHJpZXMgYXNcbiAgICB8IFBhdHRlcm5Qcm9wZXJ0eUVudHJ5W11cbiAgICB8IHVuZGVmaW5lZDtcblxuICBpZiAoZW50cmllcykge1xuICAgIHJldHVybiBlbnRyaWVzO1xuICB9XG5cbiAgaWYgKFxuICAgICFzY2hlbWEucGF0dGVyblByb3BlcnRpZXMgfHxcbiAgICB0eXBlb2Ygc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzICE9PSBcIm9iamVjdFwiIHx8XG4gICAgQXJyYXkuaXNBcnJheShzY2hlbWEucGF0dGVyblByb3BlcnRpZXMpXG4gICkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBwYXR0ZXJuS2V5cyA9IE9iamVjdC5rZXlzKHNjaGVtYS5wYXR0ZXJuUHJvcGVydGllcyk7XG4gIGVudHJpZXMgPSBuZXcgQXJyYXkocGF0dGVybktleXMubGVuZ3RoKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdHRlcm5LZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0gcGF0dGVybktleXNbaV07XG4gICAgY29uc3QgY29tcGlsZWRNYXRjaGVyID0gY29tcGlsZVBhdHRlcm5NYXRjaGVyKGtleSk7XG4gICAgY29uc3QgbWF0Y2ggPVxuICAgICAgY29tcGlsZWRNYXRjaGVyIGluc3RhbmNlb2YgUmVnRXhwXG4gICAgICAgID8gKHZhbHVlOiBzdHJpbmcpID0+IGNvbXBpbGVkTWF0Y2hlci50ZXN0KHZhbHVlKVxuICAgICAgICA6IGNvbXBpbGVkTWF0Y2hlcjtcblxuICAgIGVudHJpZXNbaV0gPSB7XG4gICAgICBzY2hlbWFQcm9wOiBzY2hlbWEucGF0dGVyblByb3BlcnRpZXNba2V5XSxcbiAgICAgIG1hdGNoXG4gICAgfTtcbiAgfVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzY2hlbWEsIFwiX3BhdHRlcm5Qcm9wZXJ0eUVudHJpZXNcIiwge1xuICAgIHZhbHVlOiBlbnRyaWVzLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pO1xuXG4gIHJldHVybiBlbnRyaWVzO1xufVxuXG5mdW5jdGlvbiBnZXRQYXR0ZXJuS2V5TWF0Y2hJbmRleGVzKFxuICBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGtleTogc3RyaW5nLFxuICBlbnRyaWVzOiBQYXR0ZXJuUHJvcGVydHlFbnRyeVtdXG4pIHtcbiAgbGV0IGNhY2hlID0gKHNjaGVtYSBhcyBhbnkpLl9wYXR0ZXJuS2V5TWF0Y2hJbmRleENhY2hlIGFzXG4gICAgfCBNYXA8c3RyaW5nLCBudW1iZXJbXT5cbiAgICB8IHVuZGVmaW5lZDtcblxuICBpZiAoY2FjaGUpIHtcbiAgICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXJbXT4oKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9wYXR0ZXJuS2V5TWF0Y2hJbmRleENhY2hlXCIsIHtcbiAgICAgIHZhbHVlOiBjYWNoZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgaW5kZXhlczogbnVtYmVyW10gPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZW50cmllc1tpXS5tYXRjaChrZXkpKSB7XG4gICAgICBpbmRleGVzLnB1c2goaSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNhY2hlLnNpemUgPCBQQVRURVJOX0tFWV9DQUNIRV9MSU1JVCkge1xuICAgIGNhY2hlLnNldChrZXksIGluZGV4ZXMpO1xuICB9XG5cbiAgcmV0dXJuIGluZGV4ZXM7XG59XG5cbmV4cG9ydCBjb25zdCBPYmplY3RLZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uIHwgZmFsc2U+ID0ge1xuICByZXF1aXJlZChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVtYS5yZXF1aXJlZC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0gc2NoZW1hLnJlcXVpcmVkW2ldO1xuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJSZXF1aXJlZCBwcm9wZXJ0eSBpcyBtaXNzaW5nXCIsIHtcbiAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBwcm9wZXJ0aWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBwcm9wS2V5cyA9IChzY2hlbWEgYXMgYW55KS5fcHJvcEtleXMgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFwcm9wS2V5cykge1xuICAgICAgcHJvcEtleXMgPSBPYmplY3Qua2V5cyhzY2hlbWEucHJvcGVydGllcyB8fCB7fSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9wcm9wS2V5c1wiLCB7XG4gICAgICAgIHZhbHVlOiBwcm9wS2V5cyxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGV0IHJlcXVpcmVkU2V0ID0gKHNjaGVtYSBhcyBhbnkpLl9yZXF1aXJlZFNldCBhc1xuICAgICAgfCBTZXQ8c3RyaW5nPlxuICAgICAgfCBudWxsXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBpZiAocmVxdWlyZWRTZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVxdWlyZWRTZXQgPSBBcnJheS5pc0FycmF5KHNjaGVtYS5yZXF1aXJlZClcbiAgICAgICAgPyBuZXcgU2V0PHN0cmluZz4oc2NoZW1hLnJlcXVpcmVkKVxuICAgICAgICA6IG51bGw7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9yZXF1aXJlZFNldFwiLCB7XG4gICAgICAgIHZhbHVlOiByZXF1aXJlZFNldCxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0gcHJvcEtleXNbaV07XG4gICAgICBjb25zdCBzY2hlbWFQcm9wID0gc2NoZW1hLnByb3BlcnRpZXNba2V5XTtcblxuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcmVxdWlyZWRTZXQgJiZcbiAgICAgICAgICByZXF1aXJlZFNldC5oYXMoa2V5KSAmJlxuICAgICAgICAgIHNjaGVtYVByb3AgJiZcbiAgICAgICAgICB0eXBlb2Ygc2NoZW1hUHJvcCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICFBcnJheS5pc0FycmF5KHNjaGVtYVByb3ApICYmXG4gICAgICAgICAgXCJkZWZhdWx0XCIgaW4gc2NoZW1hUHJvcFxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IChzY2hlbWFQcm9wIGFzIGFueSkuJHZhbGlkYXRlKHNjaGVtYVByb3AuZGVmYXVsdCk7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJEZWZhdWx0IHByb3BlcnR5IGlzIGludmFsaWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgICAgZGF0YTogc2NoZW1hUHJvcC5kZWZhdWx0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGF0YVtrZXldID0gZGVlcENsb25lVW5mcmVlemUoc2NoZW1hUHJvcC5kZWZhdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBzY2hlbWFQcm9wID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICBpZiAoc2NoZW1hUHJvcCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBub3QgYWxsb3dlZFwiLCB7XG4gICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNjaGVtYVByb3AgJiYgXCIkdmFsaWRhdGVcIiBpbiBzY2hlbWFQcm9wKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hUHJvcC4kdmFsaWRhdGUoZGF0YVtrZXldKTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUHJvcGVydHkgaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcbiAgdmFsdWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlU2NoZW1hID0gc2NoZW1hLnZhbHVlcztcbiAgICBjb25zdCB2YWxpZGF0ZSA9IHZhbHVlU2NoZW1hICYmIHZhbHVlU2NoZW1hLiR2YWxpZGF0ZTtcbiAgICBpZiAodHlwZW9mIHZhbGlkYXRlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlcnJvciA9IHZhbGlkYXRlKGRhdGFba2V5XSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUHJvcGVydHkgaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1heFByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY291bnQrKztcbiAgICAgIGlmIChjb3VudCA+IHNjaGVtYS5tYXhQcm9wZXJ0aWVzKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlRvbyBtYW55IHByb3BlcnRpZXNcIiwgeyBkYXRhIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBtaW5Qcm9wZXJ0aWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBjb3VudCA9IDA7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvdW50Kys7XG4gICAgICBpZiAoY291bnQgPj0gc2NoZW1hLm1pblByb3BlcnRpZXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlRvbyBmZXcgcHJvcGVydGllc1wiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgYWRkaXRpb25hbFByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGFwVmFsaWRhdGUgPSAoc2NoZW1hIGFzIGFueSkuX2FwVmFsaWRhdGUgYXNcbiAgICAgIHwgKChkYXRhOiBhbnkpID0+IGFueSlcbiAgICAgIHwgbnVsbFxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGFwVmFsaWRhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYXBWYWxpZGF0ZSA9IGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLmFkZGl0aW9uYWxQcm9wZXJ0aWVzKVxuICAgICAgICA/IHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcy4kdmFsaWRhdGVcbiAgICAgICAgOiBudWxsO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNjaGVtYSwgXCJfYXBWYWxpZGF0ZVwiLCB7XG4gICAgICAgIHZhbHVlOiBhcFZhbGlkYXRlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXR0ZXJuRW50cmllcyA9IGdldFBhdHRlcm5Qcm9wZXJ0eUVudHJpZXMoc2NoZW1hKTtcblxuICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgc2NoZW1hLnByb3BlcnRpZXMgJiZcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNjaGVtYS5wcm9wZXJ0aWVzLCBrZXkpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXR0ZXJuRW50cmllcyAmJiBwYXR0ZXJuRW50cmllcy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKGdldFBhdHRlcm5LZXlNYXRjaEluZGV4ZXMoc2NoZW1hLCBrZXksIHBhdHRlcm5FbnRyaWVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQWRkaXRpb25hbCBwcm9wZXJ0aWVzIGFyZSBub3QgYWxsb3dlZFwiLCB7XG4gICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFwVmFsaWRhdGUpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBhcFZhbGlkYXRlKGRhdGFba2V5XSk7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFkZGl0aW9uYWwgcHJvcGVydGllcyBhcmUgaW52YWxpZFwiLCB7XG4gICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcbiAgcGF0dGVyblByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGF0dGVybkVudHJpZXMgPSBnZXRQYXR0ZXJuUHJvcGVydHlFbnRyaWVzKHNjaGVtYSk7XG4gICAgaWYgKCFwYXR0ZXJuRW50cmllcyB8fCBwYXR0ZXJuRW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXRjaGluZ0luZGV4ZXMgPSBnZXRQYXR0ZXJuS2V5TWF0Y2hJbmRleGVzKHNjaGVtYSwga2V5LCBwYXR0ZXJuRW50cmllcyk7XG5cbiAgICAgIGlmIChtYXRjaGluZ0luZGV4ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMgPT09IGZhbHNlICYmXG4gICAgICAgICAgIShzY2hlbWEucHJvcGVydGllcyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2NoZW1hLnByb3BlcnRpZXMsIGtleSkpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFkZGl0aW9uYWwgcHJvcGVydGllcyBhcmUgbm90IGFsbG93ZWRcIiwge1xuICAgICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBtYXRjaGluZ0luZGV4ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hUHJvcCA9IHBhdHRlcm5FbnRyaWVzW21hdGNoaW5nSW5kZXhlc1tqXV0uc2NoZW1hUHJvcDtcblxuICAgICAgICBpZiAodHlwZW9mIHNjaGVtYVByb3AgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgaWYgKHNjaGVtYVByb3AgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBub3QgYWxsb3dlZFwiLCB7XG4gICAgICAgICAgICAgIGl0ZW06IGtleSxcbiAgICAgICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYVByb3ApIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYVByb3AuJHZhbGlkYXRlKGRhdGFba2V5XSk7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuICBwcm9wZXJ0eU5hbWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBuID0gc2NoZW1hLnByb3BlcnR5TmFtZXM7XG5cbiAgICBpZiAodHlwZW9mIHBuID09PSBcImJvb2xlYW5cIikge1xuICAgICAgaWYgKHBuID09PSBmYWxzZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0aWVzIGFyZSBub3QgYWxsb3dlZFwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZGF0ZSA9IHBuICYmIHBuLiR2YWxpZGF0ZTtcbiAgICBpZiAodHlwZW9mIHZhbGlkYXRlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgZXJyb3IgPSB2YWxpZGF0ZShrZXkpO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlByb3BlcnR5IG5hbWUgaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGRlcGVuZGVuY2llcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBzY2hlbWEuZGVwZW5kZW5jaWVzKSB7XG4gICAgICBpZiAoa2V5IGluIGRhdGEgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZXBlbmRlbmN5ID0gc2NoZW1hLmRlcGVuZGVuY2llc1trZXldO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGVwZW5kZW5jeSkpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZXBlbmRlbmN5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKCEoZGVwZW5kZW5jeVtpXSBpbiBkYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiRGVwZW5kZW5jeSBpcyBub3Qgc2F0aXNmaWVkXCIsIHtcbiAgICAgICAgICAgICAgaXRlbTogaSxcbiAgICAgICAgICAgICAgZGF0YTogZGVwZW5kZW5jeVtpXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBkZXBlbmRlbmN5ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICBpZiAoZGVwZW5kZW5jeSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkRlcGVuZGVuY3kgaXMgbm90IHNhdGlzZmllZFwiLCB7IGRhdGE6IGRlcGVuZGVuY3kgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZGVwZW5kZW5jeSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBpZiAoZGVwZW5kZW5jeSBpbiBkYXRhKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiRGVwZW5kZW5jeSBpcyBub3Qgc2F0aXNmaWVkXCIsIHsgZGF0YTogZGVwZW5kZW5jeSB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVycm9yID0gZGVwZW5kZW5jeS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiRGVwZW5kZW5jeSBpcyBub3Qgc2F0aXNmaWVkXCIsIHtcbiAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgZGF0YVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgLy8gUmVxdWlyZWQgYnkgb3RoZXIga2V5d29yZHMgYnV0IG5vdCB1c2VkIGFzIGEgZnVuY3Rpb24gaXRzZWxmXG4gIHRoZW46IGZhbHNlLFxuICBlbHNlOiBmYWxzZSxcbiAgZGVmYXVsdDogZmFsc2UsXG5cbiAgLy8gTm90IGltcGxlbWVudGVkIHlldFxuICBkZWZpbml0aW9uczogZmFsc2UsXG4gICRpZDogZmFsc2UsXG4gICRzY2hlbWE6IGZhbHNlLFxuXG4gIC8vIE1ldGFkYXRhIGtleXdvcmRzIChub3QgdXNlZCBhcyBhIGZ1bmN0aW9uKVxuICB0aXRsZTogZmFsc2UsXG4gIGRlc2NyaXB0aW9uOiBmYWxzZSxcbiAgJGNvbW1lbnQ6IGZhbHNlLFxuICBleGFtcGxlczogZmFsc2UsXG4gIGNvbnRlbnRNZWRpYVR5cGU6IGZhbHNlLFxuICBjb250ZW50RW5jb2Rpbmc6IGZhbHNlLFxuXG4gIC8vIE5vdCBzdXBwb3J0ZWQgT3BlbiBBUEkga2V5d29yZHNcbiAgZGlzY3JpbWluYXRvcjogZmFsc2UsXG4gIG51bGxhYmxlOiBmYWxzZVxufTtcbiIsImltcG9ydCB7IGlzQ29tcGlsZWRTY2hlbWEgfSBmcm9tIFwiLi4vdXRpbHMvbWFpbi11dGlsc1wiO1xuXG5pbXBvcnQgeyBLZXl3b3JkRnVuY3Rpb24gfSBmcm9tIFwiLi4vaW5kZXhcIjtcbmltcG9ydCB7IGhhc0NoYW5nZWQgfSBmcm9tIFwiLi4vdXRpbHMvaGFzLWNoYW5nZWRcIjtcblxudHlwZSBCcmFuY2hFbnRyeSA9XG4gIHwgeyBraW5kOiBcInZhbGlkYXRlXCI7IHZhbGlkYXRlOiAoZGF0YTogYW55KSA9PiBhbnkgfVxuICB8IHsga2luZDogXCJhbHdheXNWYWxpZFwiIH1cbiAgfCB7IGtpbmQ6IFwiYWx3YXlzSW52YWxpZFwiIH1cbiAgfCB7IGtpbmQ6IFwibGl0ZXJhbFwiOyB2YWx1ZTogYW55IH07XG5cbmZ1bmN0aW9uIHRvQnJhbmNoRW50cnkoaXRlbTogYW55KTogQnJhbmNoRW50cnkge1xuICBpZiAoaXRlbSAmJiB0eXBlb2YgaXRlbSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIGl0ZW0gJiYgdHlwZW9mIGl0ZW0uJHZhbGlkYXRlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiB7IGtpbmQ6IFwidmFsaWRhdGVcIiwgdmFsaWRhdGU6IGl0ZW0uJHZhbGlkYXRlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsga2luZDogXCJhbHdheXNWYWxpZFwiIH07XG4gIH1cblxuICBpZiAodHlwZW9mIGl0ZW0gPT09IFwiYm9vbGVhblwiKSB7XG4gICAgcmV0dXJuIHsga2luZDogaXRlbSA/IFwiYWx3YXlzVmFsaWRcIiA6IFwiYWx3YXlzSW52YWxpZFwiIH07XG4gIH1cblxuICByZXR1cm4geyBraW5kOiBcImxpdGVyYWxcIiwgdmFsdWU6IGl0ZW0gfTtcbn1cblxuZnVuY3Rpb24gZ2V0QnJhbmNoRW50cmllcyhzY2hlbWE6IGFueSwga2V5OiBcImFsbE9mXCIgfCBcImFueU9mXCIgfCBcIm9uZU9mXCIpIHtcbiAgY29uc3QgY2FjaGVLZXkgPSBgXyR7a2V5fUJyYW5jaEVudHJpZXNgO1xuICBsZXQgZW50cmllcyA9IHNjaGVtYVtjYWNoZUtleV0gYXMgQnJhbmNoRW50cnlbXSB8IHVuZGVmaW5lZDtcblxuICBpZiAoZW50cmllcykge1xuICAgIHJldHVybiBlbnRyaWVzO1xuICB9XG5cbiAgY29uc3Qgc291cmNlID0gc2NoZW1hW2tleV0gfHwgW107XG4gIGVudHJpZXMgPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykge1xuICAgIGVudHJpZXMucHVzaCh0b0JyYW5jaEVudHJ5KHNvdXJjZVtpXSkpO1xuICB9XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNjaGVtYSwgY2FjaGVLZXksIHtcbiAgICB2YWx1ZTogZW50cmllcyxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIHdyaXRhYmxlOiBmYWxzZVxuICB9KTtcblxuICByZXR1cm4gZW50cmllcztcbn1cblxuZXhwb3J0IGNvbnN0IE90aGVyS2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbj4gPSB7XG4gIGVudW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGxldCBlbnVtQ2FjaGUgPSAoc2NoZW1hIGFzIGFueSkuX2VudW1DYWNoZSBhc1xuICAgICAgfCB7IHByaW1pdGl2ZVNldDogU2V0PGFueT47IG9iamVjdFZhbHVlczogYW55W10gfVxuICAgICAgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIWVudW1DYWNoZSkge1xuICAgICAgY29uc3QgcHJpbWl0aXZlU2V0ID0gbmV3IFNldDxhbnk+KCk7XG4gICAgICBjb25zdCBvYmplY3RWYWx1ZXM6IGFueVtdID0gW107XG4gICAgICBjb25zdCBsaXN0ID0gc2NoZW1hLmVudW07XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBlbnVtSXRlbSA9IGxpc3RbaV07XG4gICAgICAgIGlmIChlbnVtSXRlbSAhPT0gbnVsbCAmJiB0eXBlb2YgZW51bUl0ZW0gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBvYmplY3RWYWx1ZXMucHVzaChlbnVtSXRlbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJpbWl0aXZlU2V0LmFkZChlbnVtSXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZW51bUNhY2hlID0geyBwcmltaXRpdmVTZXQsIG9iamVjdFZhbHVlcyB9O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNjaGVtYSwgXCJfZW51bUNhY2hlXCIsIHtcbiAgICAgICAgdmFsdWU6IGVudW1DYWNoZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgISh0eXBlb2YgZGF0YSA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNOYU4oZGF0YSkpICYmXG4gICAgICBlbnVtQ2FjaGUucHJpbWl0aXZlU2V0LmhhcyhkYXRhKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChkYXRhICE9PSBudWxsICYmIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAvLyBDb25zZXJ2YXRpdmUgZXhhY3Qtc2VtYW50aWNzIHBhdGguXG4gICAgICAvLyBGdXR1cmUgb3B0LWluIG9wdGltaXphdGlvbjogc3RydWN0dXJhbCBoYXNoaW5nIGJ1Y2tldHMgZm9yIGxhcmdlIGVudW1zLlxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnVtQ2FjaGUub2JqZWN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghaGFzQ2hhbmdlZChlbnVtQ2FjaGUub2JqZWN0VmFsdWVzW2ldLCBkYXRhKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCBvbmUgb2YgdGhlIGFsbG93ZWQgdmFsdWVzXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICBhbGxPZihzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgY29uc3QgYnJhbmNoZXMgPSBnZXRCcmFuY2hFbnRyaWVzKHNjaGVtYSwgXCJhbGxPZlwiKTtcblxuICAgIGlmIChicmFuY2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IG9ubHlCcmFuY2ggPSBicmFuY2hlc1swXTtcblxuICAgICAgaWYgKG9ubHlCcmFuY2gua2luZCA9PT0gXCJ2YWxpZGF0ZVwiKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gb25seUJyYW5jaC52YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgY2F1c2U6IGVycm9yLCBkYXRhIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG9ubHlCcmFuY2gua2luZCA9PT0gXCJhbHdheXNWYWxpZFwiKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG9ubHlCcmFuY2gua2luZCA9PT0gXCJhbHdheXNJbnZhbGlkXCIpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEgIT09IG9ubHlCcmFuY2gudmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnJhbmNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGJyYW5jaCA9IGJyYW5jaGVzW2ldO1xuXG4gICAgICBpZiAoYnJhbmNoLmtpbmQgPT09IFwidmFsaWRhdGVcIikge1xuICAgICAgICBjb25zdCBlcnJvciA9IGJyYW5jaC52YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgY2F1c2U6IGVycm9yLCBkYXRhIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoYnJhbmNoLmtpbmQgPT09IFwiYWx3YXlzVmFsaWRcIikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJyYW5jaC5raW5kID09PSBcImFsd2F5c0ludmFsaWRcIikge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YSAhPT0gYnJhbmNoLnZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIGFueU9mKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBjb25zdCBicmFuY2hlcyA9IGdldEJyYW5jaEVudHJpZXMoc2NoZW1hLCBcImFueU9mXCIpO1xuXG4gICAgaWYgKGJyYW5jaGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3Qgb25seUJyYW5jaCA9IGJyYW5jaGVzWzBdO1xuXG4gICAgICBpZiAob25seUJyYW5jaC5raW5kID09PSBcInZhbGlkYXRlXCIpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBvbmx5QnJhbmNoLnZhbGlkYXRlKGRhdGEpO1xuICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbmx5QnJhbmNoLmtpbmQgPT09IFwiYWx3YXlzVmFsaWRcIikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChvbmx5QnJhbmNoLmtpbmQgPT09IFwiYWx3YXlzSW52YWxpZFwiKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhID09PSBvbmx5QnJhbmNoLnZhbHVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJyYW5jaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBicmFuY2ggPSBicmFuY2hlc1tpXTtcblxuICAgICAgaWYgKGJyYW5jaC5raW5kID09PSBcInZhbGlkYXRlXCIpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBicmFuY2gudmFsaWRhdGUoZGF0YSk7XG4gICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChicmFuY2gua2luZCA9PT0gXCJhbHdheXNWYWxpZFwiKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGJyYW5jaC5raW5kID09PSBcImFsd2F5c0ludmFsaWRcIikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEgPT09IGJyYW5jaC52YWx1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICBvbmVPZihzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgY29uc3QgYnJhbmNoZXMgPSBnZXRCcmFuY2hFbnRyaWVzKHNjaGVtYSwgXCJvbmVPZlwiKTtcblxuICAgIGlmIChicmFuY2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IG9ubHlCcmFuY2ggPSBicmFuY2hlc1swXTtcblxuICAgICAgaWYgKG9ubHlCcmFuY2gua2luZCA9PT0gXCJ2YWxpZGF0ZVwiKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gb25seUJyYW5jaC52YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAob25seUJyYW5jaC5raW5kID09PSBcImFsd2F5c1ZhbGlkXCIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAob25seUJyYW5jaC5raW5kID09PSBcImFsd2F5c0ludmFsaWRcIikge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YSA9PT0gb25seUJyYW5jaC52YWx1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgbGV0IHZhbGlkQ291bnQgPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBicmFuY2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYnJhbmNoID0gYnJhbmNoZXNbaV07XG4gICAgICBsZXQgaXNWYWxpZCA9IGZhbHNlO1xuXG4gICAgICBpZiAoYnJhbmNoLmtpbmQgPT09IFwidmFsaWRhdGVcIikge1xuICAgICAgICBpc1ZhbGlkID0gIWJyYW5jaC52YWxpZGF0ZShkYXRhKTtcbiAgICAgIH0gZWxzZSBpZiAoYnJhbmNoLmtpbmQgPT09IFwiYWx3YXlzVmFsaWRcIikge1xuICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoYnJhbmNoLmtpbmQgPT09IFwiYWx3YXlzSW52YWxpZFwiKSB7XG4gICAgICAgIGlzVmFsaWQgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlzVmFsaWQgPSBkYXRhID09PSBicmFuY2gudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAgIHZhbGlkQ291bnQrKztcbiAgICAgICAgaWYgKHZhbGlkQ291bnQgPiAxKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2YWxpZENvdW50ID09PSAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICBjb25zdChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKGRhdGEgPT09IHNjaGVtYS5jb25zdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChkYXRhICYmXG4gICAgICAgIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICFBcnJheS5pc0FycmF5KGRhdGEpICYmXG4gICAgICAgIHNjaGVtYS5jb25zdCAmJlxuICAgICAgICB0eXBlb2Ygc2NoZW1hLmNvbnN0ID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICFBcnJheS5pc0FycmF5KHNjaGVtYS5jb25zdCkgJiZcbiAgICAgICAgIWhhc0NoYW5nZWQoZGF0YSwgc2NoZW1hLmNvbnN0KSkgfHxcbiAgICAgIChBcnJheS5pc0FycmF5KGRhdGEpICYmXG4gICAgICAgIEFycmF5LmlzQXJyYXkoc2NoZW1hLmNvbnN0KSAmJlxuICAgICAgICAhaGFzQ2hhbmdlZChkYXRhLCBzY2hlbWEuY29uc3QpKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIGlmKHNjaGVtYSwgZGF0YSkge1xuICAgIGlmIChcInRoZW5cIiBpbiBzY2hlbWEgPT09IGZhbHNlICYmIFwiZWxzZVwiIGluIHNjaGVtYSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuaWYgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBpZiAoc2NoZW1hLmlmKSB7XG4gICAgICAgIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS50aGVuKSkge1xuICAgICAgICAgIHJldHVybiBzY2hlbWEudGhlbi4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWEuZWxzZSkpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS5lbHNlLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLmlmKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmlmLiR2YWxpZGF0ZShkYXRhKTtcbiAgICBpZiAoIWVycm9yKSB7XG4gICAgICBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWEudGhlbikpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS50aGVuLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLmVsc2UpKSB7XG4gICAgICAgIHJldHVybiBzY2hlbWEuZWxzZS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9LFxuXG4gIG5vdChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEubm90ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgaWYgKHNjaGVtYS5ub3QpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBzY2hlbWEubm90ICYmXG4gICAgICB0eXBlb2Ygc2NoZW1hLm5vdCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkoc2NoZW1hLm5vdClcbiAgICApIHtcbiAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYS5ub3QpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSAoc2NoZW1hLm5vdCBhcyBhbnkpLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gICRyZWYoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAoc2NoZW1hLl9yZXNvbHZlZFJlZikge1xuICAgICAgaWYgKHNjaGVtYS4kdmFsaWRhdGUgIT09IHNjaGVtYS5fcmVzb2x2ZWRSZWYpIHtcbiAgICAgICAgc2NoZW1hLiR2YWxpZGF0ZSA9IHNjaGVtYS5fcmVzb2x2ZWRSZWY7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzY2hlbWEuX3Jlc29sdmVkUmVmKGRhdGEpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlZlBhdGggPSBzY2hlbWEuJHJlZjtcbiAgICBsZXQgdGFyZ2V0U2NoZW1hID0gaW5zdGFuY2UuZ2V0U2NoZW1hUmVmKHJlZlBhdGgpO1xuXG4gICAgaWYgKCF0YXJnZXRTY2hlbWEpIHtcbiAgICAgIHRhcmdldFNjaGVtYSA9IGluc3RhbmNlLmdldFNjaGVtYUJ5SWQocmVmUGF0aCk7XG4gICAgfVxuXG4gICAgaWYgKCF0YXJnZXRTY2hlbWEpIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihgTWlzc2luZyByZWZlcmVuY2U6ICR7cmVmUGF0aH1gKTtcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldFNjaGVtYS4kdmFsaWRhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzY2hlbWEuX3Jlc29sdmVkUmVmID0gdGFyZ2V0U2NoZW1hLiR2YWxpZGF0ZTtcbiAgICBzY2hlbWEuJHZhbGlkYXRlID0gc2NoZW1hLl9yZXNvbHZlZFJlZjtcbiAgICByZXR1cm4gc2NoZW1hLl9yZXNvbHZlZFJlZihkYXRhKTtcbiAgfVxufTtcbiIsImltcG9ydCB7IEFycmF5S2V5d29yZHMgfSBmcm9tIFwiLi9rZXl3b3Jkcy9hcnJheS1rZXl3b3Jkc1wiO1xuaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4vaW5kZXhcIjtcbmltcG9ydCB7IE51bWJlcktleXdvcmRzIH0gZnJvbSBcIi4va2V5d29yZHMvbnVtYmVyLWtleXdvcmRzXCI7XG5pbXBvcnQgeyBPYmplY3RLZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzL29iamVjdC1rZXl3b3Jkc1wiO1xuaW1wb3J0IHsgT3RoZXJLZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzL290aGVyLWtleXdvcmRzXCI7XG5pbXBvcnQgeyBTdHJpbmdLZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzL3N0cmluZy1rZXl3b3Jkc1wiO1xuXG5leHBvcnQgY29uc3Qga2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbiB8IGZhbHNlPiA9IHtcbiAgLi4uT2JqZWN0S2V5d29yZHMsXG4gIC4uLkFycmF5S2V5d29yZHMsXG4gIC4uLlN0cmluZ0tleXdvcmRzLFxuICAuLi5OdW1iZXJLZXl3b3JkcyxcbiAgLi4uT3RoZXJLZXl3b3Jkc1xufTtcbiIsImltcG9ydCB7IEZvcm1hdEZ1bmN0aW9uLCBLZXl3b3JkRnVuY3Rpb24gfSBmcm9tIFwiLi4vaW5kZXhcIjtcbmltcG9ydCB7IGNvbXBpbGVQYXR0ZXJuTWF0Y2hlciB9IGZyb20gXCIuLi91dGlscy9wYXR0ZXJuLW1hdGNoZXJcIjtcblxuY29uc3QgUEFUVEVSTl9NQVRDSF9DQUNIRV9MSU1JVCA9IDUxMjtcbmNvbnN0IEZPUk1BVF9SRVNVTFRfQ0FDSEVfTElNSVQgPSA1MTI7XG5cbmV4cG9ydCBjb25zdCBTdHJpbmdLZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uPiA9IHtcbiAgbWluTGVuZ3RoKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgfHwgZGF0YS5sZW5ndGggPj0gc2NoZW1hLm1pbkxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIHNob3J0ZXIgdGhhbiB0aGUgbWluaW11bSBsZW5ndGhcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIG1heExlbmd0aChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiIHx8IGRhdGEubGVuZ3RoIDw9IHNjaGVtYS5tYXhMZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBsb25nZXIgdGhhbiB0aGUgbWF4aW11bSBsZW5ndGhcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIHBhdHRlcm4oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBwYXR0ZXJuTWF0Y2ggPSAoc2NoZW1hIGFzIGFueSkuX3BhdHRlcm5NYXRjaCBhc1xuICAgICAgfCAoKHZhbHVlOiBzdHJpbmcpID0+IGJvb2xlYW4pXG4gICAgICB8IHVuZGVmaW5lZDtcblxuICAgIGxldCBwYXR0ZXJuTWF0Y2hDYWNoZSA9IChzY2hlbWEgYXMgYW55KS5fcGF0dGVybk1hdGNoQ2FjaGUgYXNcbiAgICAgIHwgTWFwPHN0cmluZywgYm9vbGVhbj5cbiAgICAgIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFwYXR0ZXJuTWF0Y2gpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbXBpbGVkID0gY29tcGlsZVBhdHRlcm5NYXRjaGVyKHNjaGVtYS5wYXR0ZXJuKTtcbiAgICAgICAgcGF0dGVybk1hdGNoID1cbiAgICAgICAgICBjb21waWxlZCBpbnN0YW5jZW9mIFJlZ0V4cFxuICAgICAgICAgICAgPyAodmFsdWU6IHN0cmluZykgPT4gY29tcGlsZWQudGVzdCh2YWx1ZSlcbiAgICAgICAgICAgIDogY29tcGlsZWQ7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNjaGVtYSwgXCJfcGF0dGVybk1hdGNoXCIsIHtcbiAgICAgICAgICB2YWx1ZTogcGF0dGVybk1hdGNoLFxuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb25cIiwge1xuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgY2F1c2U6IGVycm9yXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcGF0dGVybk1hdGNoQ2FjaGUpIHtcbiAgICAgIHBhdHRlcm5NYXRjaENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIGJvb2xlYW4+KCk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9wYXR0ZXJuTWF0Y2hDYWNoZVwiLCB7XG4gICAgICAgIHZhbHVlOiBwYXR0ZXJuTWF0Y2hDYWNoZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChwYXR0ZXJuTWF0Y2hDYWNoZS5oYXMoZGF0YSkpIHtcbiAgICAgIGlmIChwYXR0ZXJuTWF0Y2hDYWNoZS5nZXQoZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgcGF0dGVyblwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNNYXRjaCA9IHBhdHRlcm5NYXRjaChkYXRhKTtcbiAgICBpZiAocGF0dGVybk1hdGNoQ2FjaGUuc2l6ZSA8IFBBVFRFUk5fTUFUQ0hfQ0FDSEVfTElNSVQpIHtcbiAgICAgIHBhdHRlcm5NYXRjaENhY2hlLnNldChkYXRhLCBpc01hdGNoKTtcbiAgICB9XG5cbiAgICBpZiAoaXNNYXRjaCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGRvZXMgbm90IG1hdGNoIHRoZSBwYXR0ZXJuXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICAvLyBUYWtlIGludG8gYWNjb3VudCB0aGF0IGlmIHdlIHJlY2VpdmUgYSBmb3JtYXQgdGhhdCBpcyBub3QgZGVmaW5lZCwgd2VcbiAgLy8gd2lsbCBub3QgdGhyb3cgYW4gZXJyb3IsIHdlIGp1c3QgaWdub3JlIGl0LlxuICBmb3JtYXQoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgZm9ybWF0VmFsaWRhdGUgPSAoc2NoZW1hIGFzIGFueSkuX2Zvcm1hdFZhbGlkYXRlIGFzXG4gICAgICB8IEZvcm1hdEZ1bmN0aW9uXG4gICAgICB8IGZhbHNlXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZm9ybWF0UmVzdWx0Q2FjaGVFbmFibGVkID0gKHNjaGVtYSBhcyBhbnkpLl9mb3JtYXRSZXN1bHRDYWNoZUVuYWJsZWQgYXNcbiAgICAgIHwgYm9vbGVhblxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGZvcm1hdFJlc3VsdENhY2hlID0gKHNjaGVtYSBhcyBhbnkpLl9mb3JtYXRSZXN1bHRDYWNoZSBhc1xuICAgICAgfCBNYXA8c3RyaW5nLCBib29sZWFuPlxuICAgICAgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoZm9ybWF0VmFsaWRhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9ybWF0VmFsaWRhdGUgPSBpbnN0YW5jZS5nZXRGb3JtYXQoc2NoZW1hLmZvcm1hdCk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9mb3JtYXRWYWxpZGF0ZVwiLCB7XG4gICAgICAgIHZhbHVlOiBmb3JtYXRWYWxpZGF0ZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFmb3JtYXRWYWxpZGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChmb3JtYXRSZXN1bHRDYWNoZUVuYWJsZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9ybWF0UmVzdWx0Q2FjaGVFbmFibGVkID0gaW5zdGFuY2UuaXNEZWZhdWx0Rm9ybWF0VmFsaWRhdG9yKFxuICAgICAgICBzY2hlbWEuZm9ybWF0LFxuICAgICAgICBmb3JtYXRWYWxpZGF0ZVxuICAgICAgKTtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNjaGVtYSwgXCJfZm9ybWF0UmVzdWx0Q2FjaGVFbmFibGVkXCIsIHtcbiAgICAgICAgdmFsdWU6IGZvcm1hdFJlc3VsdENhY2hlRW5hYmxlZCxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFmb3JtYXRSZXN1bHRDYWNoZUVuYWJsZWQpIHtcbiAgICAgIGlmIChmb3JtYXRWYWxpZGF0ZShkYXRhKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGRvZXMgbm90IG1hdGNoIHRoZSBmb3JtYXRcIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIGlmICghZm9ybWF0UmVzdWx0Q2FjaGUpIHtcbiAgICAgIGZvcm1hdFJlc3VsdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIGJvb2xlYW4+KCk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9mb3JtYXRSZXN1bHRDYWNoZVwiLCB7XG4gICAgICAgIHZhbHVlOiBmb3JtYXRSZXN1bHRDYWNoZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChmb3JtYXRSZXN1bHRDYWNoZS5oYXMoZGF0YSkpIHtcbiAgICAgIGlmIChmb3JtYXRSZXN1bHRDYWNoZS5nZXQoZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgZm9ybWF0XCIsIHsgZGF0YSB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBpc1ZhbGlkID0gZm9ybWF0VmFsaWRhdGUoZGF0YSk7XG4gICAgaWYgKGZvcm1hdFJlc3VsdENhY2hlLnNpemUgPCBGT1JNQVRfUkVTVUxUX0NBQ0hFX0xJTUlUKSB7XG4gICAgICBmb3JtYXRSZXN1bHRDYWNoZS5zZXQoZGF0YSwgaXNWYWxpZCk7XG4gICAgfVxuXG4gICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgZm9ybWF0XCIsIHsgZGF0YSB9KTtcbiAgfVxufTtcbiIsIi8qKioqKioqKioqKioqKioqKiogUGF0aDogbGliL2luZGV4LnRzICoqKioqKioqKioqKioqKioqKi9cbmltcG9ydCB7XG4gIERlZmluZUVycm9yRnVuY3Rpb24sXG4gIFZhbGlkYXRpb25FcnJvcixcbiAgZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXksXG4gIGdldE5hbWVkRnVuY3Rpb24sXG4gIHJlc29sdmVQYXRoXG59IGZyb20gXCIuL3V0aWxzL21haW4tdXRpbHNcIjtcblxuaW1wb3J0IHsgRm9ybWF0cyB9IGZyb20gXCIuL2Zvcm1hdHNcIjtcbmltcG9ydCB7IFR5cGVzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGtleXdvcmRzIH0gZnJvbSBcIi4va2V5d29yZHNcIjtcbmltcG9ydCB7IGRlZXBDbG9uZVVuZnJlZXplIH0gZnJvbSBcIi4vdXRpbHMvZGVlcC1mcmVlemVcIjtcblxuZXhwb3J0IHsgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSBcIi4vdXRpbHMvbWFpbi11dGlsc1wiO1xuZXhwb3J0IHsgZGVlcENsb25lVW5mcmVlemUgYXMgZGVlcENsb25lIH0gZnJvbSBcIi4vdXRpbHMvZGVlcC1mcmVlemVcIjtcblxuZXhwb3J0IHR5cGUgUmVzdWx0ID0gdm9pZCB8IFZhbGlkYXRpb25FcnJvciB8IHRydWU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2V5d29yZEZ1bmN0aW9uIHtcbiAgKFxuICAgIHNjaGVtYTogQ29tcGlsZWRTY2hlbWEsXG4gICAgZGF0YTogYW55LFxuICAgIGRlZmluZUVycm9yOiBEZWZpbmVFcnJvckZ1bmN0aW9uLFxuICAgIGluc3RhbmNlOiBTY2hlbWFTaGllbGRcbiAgKTogUmVzdWx0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVGdW5jdGlvbiB7XG4gIChkYXRhOiBhbnkpOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdEZ1bmN0aW9uIHtcbiAgKGRhdGE6IGFueSk6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGVGdW5jdGlvbiB7XG4gIChkYXRhOiBhbnkpOiBSZXN1bHQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGlsZWRTY2hlbWEge1xuICAkdmFsaWRhdGU/OiBWYWxpZGF0ZUZ1bmN0aW9uO1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdG9yIHtcbiAgKGRhdGE6IGFueSk6IHtcbiAgICBkYXRhOiBhbnk7XG4gICAgZXJyb3I6IFZhbGlkYXRpb25FcnJvciB8IG51bGwgfCB0cnVlO1xuICAgIHZhbGlkOiBib29sZWFuO1xuICB9O1xuICBjb21waWxlZFNjaGVtYTogQ29tcGlsZWRTY2hlbWE7XG59XG5cbmludGVyZmFjZSBWYWxpZGF0b3JJdGVtIHtcbiAgbmFtZTogc3RyaW5nO1xuICB2YWxpZGF0ZTogVmFsaWRhdGVGdW5jdGlvbjtcbn1cblxuZXhwb3J0IGNsYXNzIFNjaGVtYVNoaWVsZCB7XG4gIHByaXZhdGUgdHlwZXM6IFJlY29yZDxzdHJpbmcsIFR5cGVGdW5jdGlvbiB8IGZhbHNlPiA9IHt9O1xuICBwcml2YXRlIGZvcm1hdHM6IFJlY29yZDxzdHJpbmcsIEZvcm1hdEZ1bmN0aW9uIHwgZmFsc2U+ID0ge307XG4gIHByaXZhdGUga2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbiB8IGZhbHNlPiA9IHt9O1xuICBwcml2YXRlIGltbXV0YWJsZSA9IGZhbHNlO1xuICBwcml2YXRlIHJvb3RTY2hlbWE6IENvbXBpbGVkU2NoZW1hIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaWRSZWdpc3RyeTogTWFwPHN0cmluZywgQ29tcGlsZWRTY2hlbWE+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGZhaWxGYXN0OiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgaW1tdXRhYmxlID0gZmFsc2UsXG4gICAgZmFpbEZhc3QgPSB0cnVlXG4gIH06IHtcbiAgICBpbW11dGFibGU/OiBib29sZWFuO1xuICAgIGZhaWxGYXN0PzogYm9vbGVhbjtcbiAgfSA9IHt9KSB7XG4gICAgdGhpcy5pbW11dGFibGUgPSBpbW11dGFibGU7XG4gICAgdGhpcy5mYWlsRmFzdCA9IGZhaWxGYXN0O1xuXG4gICAgZm9yIChjb25zdCBbdHlwZSwgdmFsaWRhdG9yXSBvZiBPYmplY3QuZW50cmllcyhUeXBlcykpIHtcbiAgICAgIGlmICh2YWxpZGF0b3IpIHtcbiAgICAgICAgdGhpcy5hZGRUeXBlKHR5cGUsIHZhbGlkYXRvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBba2V5d29yZCwgdmFsaWRhdG9yXSBvZiBPYmplY3QuZW50cmllcyhrZXl3b3JkcykpIHtcbiAgICAgIHRoaXMuYWRkS2V5d29yZChrZXl3b3JkLCB2YWxpZGF0b3IgYXMgS2V5d29yZEZ1bmN0aW9uKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtmb3JtYXQsIHZhbGlkYXRvcl0gb2YgT2JqZWN0LmVudHJpZXMoRm9ybWF0cykpIHtcbiAgICAgIGlmICh2YWxpZGF0b3IpIHtcbiAgICAgICAgdGhpcy5hZGRGb3JtYXQoZm9ybWF0LCB2YWxpZGF0b3IgYXMgRm9ybWF0RnVuY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZFR5cGUobmFtZTogc3RyaW5nLCB2YWxpZGF0b3I6IFR5cGVGdW5jdGlvbiwgb3ZlcndyaXRlID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy50eXBlc1tuYW1lXSAmJiAhb3ZlcndyaXRlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBUeXBlIFwiJHtuYW1lfVwiIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuICAgIHRoaXMudHlwZXNbbmFtZV0gPSB2YWxpZGF0b3I7XG4gIH1cblxuICBnZXRUeXBlKHR5cGU6IHN0cmluZyk6IFR5cGVGdW5jdGlvbiB8IGZhbHNlIHtcbiAgICByZXR1cm4gdGhpcy50eXBlc1t0eXBlXTtcbiAgfVxuXG4gIGFkZEZvcm1hdChuYW1lOiBzdHJpbmcsIHZhbGlkYXRvcjogRm9ybWF0RnVuY3Rpb24sIG92ZXJ3cml0ZSA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuZm9ybWF0c1tuYW1lXSAmJiAhb3ZlcndyaXRlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBGb3JtYXQgXCIke25hbWV9XCIgYWxyZWFkeSBleGlzdHNgKTtcbiAgICB9XG4gICAgdGhpcy5mb3JtYXRzW25hbWVdID0gdmFsaWRhdG9yO1xuICB9XG5cbiAgZ2V0Rm9ybWF0KGZvcm1hdDogc3RyaW5nKTogRm9ybWF0RnVuY3Rpb24gfCBmYWxzZSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0c1tmb3JtYXRdO1xuICB9XG5cbiAgaXNEZWZhdWx0Rm9ybWF0VmFsaWRhdG9yKGZvcm1hdDogc3RyaW5nLCB2YWxpZGF0b3I6IEZvcm1hdEZ1bmN0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChGb3JtYXRzIGFzIFJlY29yZDxzdHJpbmcsIEZvcm1hdEZ1bmN0aW9uIHwgZmFsc2U+KVtmb3JtYXRdID09PSB2YWxpZGF0b3I7XG4gIH1cblxuICBhZGRLZXl3b3JkKG5hbWU6IHN0cmluZywgdmFsaWRhdG9yOiBLZXl3b3JkRnVuY3Rpb24sIG92ZXJ3cml0ZSA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMua2V5d29yZHNbbmFtZV0gJiYgIW92ZXJ3cml0ZSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgS2V5d29yZCBcIiR7bmFtZX1cIiBhbHJlYWR5IGV4aXN0c2ApO1xuICAgIH1cbiAgICB0aGlzLmtleXdvcmRzW25hbWVdID0gdmFsaWRhdG9yO1xuICB9XG5cbiAgZ2V0S2V5d29yZChrZXl3b3JkOiBzdHJpbmcpOiBLZXl3b3JkRnVuY3Rpb24gfCBmYWxzZSB7XG4gICAgcmV0dXJuIHRoaXMua2V5d29yZHNba2V5d29yZF07XG4gIH1cblxuICBnZXRTY2hlbWFSZWYocGF0aDogc3RyaW5nKTogQ29tcGlsZWRTY2hlbWEgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5yb290U2NoZW1hKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiByZXNvbHZlUGF0aCh0aGlzLnJvb3RTY2hlbWEsIHBhdGgpO1xuICB9XG5cbiAgZ2V0U2NoZW1hQnlJZChpZDogc3RyaW5nKTogQ29tcGlsZWRTY2hlbWEgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmlkUmVnaXN0cnkuZ2V0KGlkKTtcbiAgfVxuXG4gIGNvbXBpbGUoc2NoZW1hOiBhbnkpOiBWYWxpZGF0b3Ige1xuICAgIHRoaXMuaWRSZWdpc3RyeS5jbGVhcigpO1xuICAgIGNvbnN0IGNvbXBpbGVkU2NoZW1hID0gdGhpcy5jb21waWxlU2NoZW1hKHNjaGVtYSk7XG4gICAgdGhpcy5yb290U2NoZW1hID0gY29tcGlsZWRTY2hlbWE7XG4gICAgaWYgKChjb21waWxlZFNjaGVtYSBhcyBhbnkpLl9oYXNSZWYgPT09IHRydWUpIHtcbiAgICAgIHRoaXMubGlua1JlZmVyZW5jZXMoY29tcGlsZWRTY2hlbWEpO1xuICAgIH1cblxuICAgIGlmICghY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlKSB7XG4gICAgICBpZiAoc2NoZW1hID09PSBmYWxzZSkge1xuICAgICAgICBjb25zdCBkZWZpbmVFcnJvciA9IGdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5KFxuICAgICAgICAgIFwib25lT2ZcIixcbiAgICAgICAgICBjb21waWxlZFNjaGVtYSxcbiAgICAgICAgICB0aGlzLmZhaWxGYXN0XG4gICAgICAgICk7XG5cbiAgICAgICAgY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlID0gZ2V0TmFtZWRGdW5jdGlvbjxWYWxpZGF0ZUZ1bmN0aW9uPihcbiAgICAgICAgICBcIlZhbGlkYXRlX0ZhbHNlXCIsXG4gICAgICAgICAgKGRhdGEpID0+IGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChzY2hlbWEgPT09IHRydWUpIHtcbiAgICAgICAgY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlID0gZ2V0TmFtZWRGdW5jdGlvbjxWYWxpZGF0ZUZ1bmN0aW9uPihcbiAgICAgICAgICBcIlZhbGlkYXRlX0FueVwiLFxuICAgICAgICAgICgpID0+IHt9XG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNTY2hlbWFMaWtlKHNjaGVtYSkgPT09IGZhbHNlKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXCJJbnZhbGlkIHNjaGVtYVwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBpbGVkU2NoZW1hLiR2YWxpZGF0ZSA9IGdldE5hbWVkRnVuY3Rpb248VmFsaWRhdGVGdW5jdGlvbj4oXG4gICAgICAgICAgXCJWYWxpZGF0ZV9BbnlcIixcbiAgICAgICAgICAoKSA9PiB7fVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkYXRlOiBWYWxpZGF0b3IgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICB0aGlzLnJvb3RTY2hlbWEgPSBjb21waWxlZFNjaGVtYTtcblxuICAgICAgY29uc3QgY2xvbmVkRGF0YSA9IHRoaXMuaW1tdXRhYmxlID8gZGVlcENsb25lVW5mcmVlemUoZGF0YSkgOiBkYXRhO1xuICAgICAgY29uc3QgcmVzID0gY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlIShjbG9uZWREYXRhKTtcblxuICAgICAgaWYgKHJlcykge1xuICAgICAgICByZXR1cm4geyBkYXRhOiBjbG9uZWREYXRhLCBlcnJvcjogcmVzLCB2YWxpZDogZmFsc2UgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgZGF0YTogY2xvbmVkRGF0YSwgZXJyb3I6IG51bGwsIHZhbGlkOiB0cnVlIH07XG4gICAgfTtcblxuICAgIHZhbGlkYXRlLmNvbXBpbGVkU2NoZW1hID0gY29tcGlsZWRTY2hlbWE7XG4gICAgcmV0dXJuIHZhbGlkYXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1BsYWluT2JqZWN0KHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1RyaXZpYWxBbHdheXNWYWxpZFN1YnNjaGVtYSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHZhbHVlID09PSB0cnVlIHx8XG4gICAgICAodGhpcy5pc1BsYWluT2JqZWN0KHZhbHVlKSAmJiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNoYWxsb3dBcnJheUVxdWFscyhhOiBhbnlbXSwgYjogYW55W10pOiBib29sZWFuIHtcbiAgICBpZiAoYSA9PT0gYikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBmbGF0dGVuQXNzb2NpYXRpdmVCcmFuY2hlcyhcbiAgICBrZXk6IFwiYWxsT2ZcIiB8IFwiYW55T2ZcIixcbiAgICBicmFuY2hlczogYW55W11cbiAgKTogYW55W10ge1xuICAgIGNvbnN0IG91dDogYW55W10gPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnJhbmNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSBicmFuY2hlc1tpXTtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5pc1BsYWluT2JqZWN0KGl0ZW0pICYmXG4gICAgICAgIE9iamVjdC5rZXlzKGl0ZW0pLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBBcnJheS5pc0FycmF5KGl0ZW1ba2V5XSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBuZXN0ZWQgPSB0aGlzLmZsYXR0ZW5Bc3NvY2lhdGl2ZUJyYW5jaGVzKGtleSwgaXRlbVtrZXldKTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuZXN0ZWQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBvdXQucHVzaChuZXN0ZWRbal0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgb3V0LnB1c2goaXRlbSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIHByaXZhdGUgZmxhdHRlblNpbmdsZVdyYXBwZXJPbmVPZihicmFuY2hlczogYW55W10pOiBhbnlbXSB7XG4gICAgbGV0IGN1cnJlbnQgPSBicmFuY2hlcztcblxuICAgIHdoaWxlIChjdXJyZW50Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgaXRlbSA9IGN1cnJlbnRbMF07XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaXNQbGFpbk9iamVjdChpdGVtKSAmJlxuICAgICAgICBPYmplY3Qua2V5cyhpdGVtKS5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgQXJyYXkuaXNBcnJheShpdGVtLm9uZU9mKVxuICAgICAgKSB7XG4gICAgICAgIGN1cnJlbnQgPSBpdGVtLm9uZU9mO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVTY2hlbWFGb3JDb21waWxlKHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55Pik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGxldCBub3JtYWxpemVkID0gc2NoZW1hO1xuICAgIGNvbnN0IHNjaGVtYUtleXMgPSBPYmplY3Qua2V5cyhzY2hlbWEpO1xuICAgIGNvbnN0IGhhc09ubHlLZXkgPSAoa2V5OiBzdHJpbmcpID0+XG4gICAgICBzY2hlbWFLZXlzLmxlbmd0aCA9PT0gMSAmJiBzY2hlbWFLZXlzWzBdID09PSBrZXk7XG5cbiAgICBjb25zdCBzZXROb3JtYWxpemVkID0gKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG4gICAgICBpZiAobm9ybWFsaXplZCA9PT0gc2NoZW1hKSB7XG4gICAgICAgIG5vcm1hbGl6ZWQgPSB7IC4uLnNjaGVtYSB9O1xuICAgICAgfVxuICAgICAgbm9ybWFsaXplZFtrZXldID0gdmFsdWU7XG4gICAgfTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYS5hbGxPZikpIHtcbiAgICAgIGNvbnN0IGZsYXR0ZW5lZEFsbE9mID0gdGhpcy5mbGF0dGVuQXNzb2NpYXRpdmVCcmFuY2hlcyhcbiAgICAgICAgXCJhbGxPZlwiLFxuICAgICAgICBzY2hlbWEuYWxsT2ZcbiAgICAgICkuZmlsdGVyKFxuICAgICAgICAoaXRlbSkgPT5cbiAgICAgICAgICAhKFxuICAgICAgICAgICAgdGhpcy5pc1BsYWluT2JqZWN0KGl0ZW0pICYmIE9iamVjdC5rZXlzKGl0ZW0pLmxlbmd0aCA9PT0gMFxuICAgICAgICAgIClcbiAgICAgICk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgaGFzT25seUtleShcImFsbE9mXCIpICYmXG4gICAgICAgIGZsYXR0ZW5lZEFsbE9mLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICB0aGlzLmlzUGxhaW5PYmplY3QoZmxhdHRlbmVkQWxsT2ZbMF0pXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZsYXR0ZW5lZEFsbE9mWzBdO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuc2hhbGxvd0FycmF5RXF1YWxzKGZsYXR0ZW5lZEFsbE9mLCBzY2hlbWEuYWxsT2YpKSB7XG4gICAgICAgIHNldE5vcm1hbGl6ZWQoXCJhbGxPZlwiLCBmbGF0dGVuZWRBbGxPZik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hLmFueU9mKSkge1xuICAgICAgY29uc3QgZmxhdHRlbmVkQW55T2YgPSB0aGlzLmZsYXR0ZW5Bc3NvY2lhdGl2ZUJyYW5jaGVzKFxuICAgICAgICBcImFueU9mXCIsXG4gICAgICAgIHNjaGVtYS5hbnlPZlxuICAgICAgKTtcblxuICAgICAgaWYgKFxuICAgICAgICBoYXNPbmx5S2V5KFwiYW55T2ZcIikgJiZcbiAgICAgICAgZmxhdHRlbmVkQW55T2YubGVuZ3RoID09PSAxICYmXG4gICAgICAgIHRoaXMuaXNQbGFpbk9iamVjdChmbGF0dGVuZWRBbnlPZlswXSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmxhdHRlbmVkQW55T2ZbMF07XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5zaGFsbG93QXJyYXlFcXVhbHMoZmxhdHRlbmVkQW55T2YsIHNjaGVtYS5hbnlPZikpIHtcbiAgICAgICAgc2V0Tm9ybWFsaXplZChcImFueU9mXCIsIGZsYXR0ZW5lZEFueU9mKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEub25lT2YpKSB7XG4gICAgICBjb25zdCBmbGF0dGVuZWRPbmVPZiA9IHRoaXMuZmxhdHRlblNpbmdsZVdyYXBwZXJPbmVPZihzY2hlbWEub25lT2YpO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGhhc09ubHlLZXkoXCJvbmVPZlwiKSAmJlxuICAgICAgICBmbGF0dGVuZWRPbmVPZi5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgdGhpcy5pc1BsYWluT2JqZWN0KGZsYXR0ZW5lZE9uZU9mWzBdKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmbGF0dGVuZWRPbmVPZlswXTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLnNoYWxsb3dBcnJheUVxdWFscyhmbGF0dGVuZWRPbmVPZiwgc2NoZW1hLm9uZU9mKSkge1xuICAgICAgICBzZXROb3JtYWxpemVkKFwib25lT2ZcIiwgZmxhdHRlbmVkT25lT2YpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVkO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXJrU2NoZW1hSGFzUmVmKHNjaGVtYTogQ29tcGlsZWRTY2hlbWEpIHtcbiAgICBpZiAoKHNjaGVtYSBhcyBhbnkpLl9oYXNSZWYgPT09IHRydWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NoZW1hLCBcIl9oYXNSZWZcIiwge1xuICAgICAgdmFsdWU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2VcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkU2tpcEtleXdvcmQoc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHZhbHVlID0gc2NoZW1hW2tleV07XG5cbiAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgY2FzZSBcInJlcXVpcmVkXCI6XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDA7XG4gICAgICBjYXNlIFwidW5pcXVlSXRlbXNcIjpcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBmYWxzZTtcbiAgICAgIGNhc2UgXCJwcm9wZXJ0aWVzXCI6XG4gICAgICBjYXNlIFwicGF0dGVyblByb3BlcnRpZXNcIjpcbiAgICAgIGNhc2UgXCJkZXBlbmRlbmNpZXNcIjpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB0aGlzLmlzUGxhaW5PYmplY3QodmFsdWUpICYmXG4gICAgICAgICAgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMFxuICAgICAgICApO1xuICAgICAgY2FzZSBcInByb3BlcnR5TmFtZXNcIjpcbiAgICAgIGNhc2UgXCJpdGVtc1wiOlxuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHRydWU7XG4gICAgICBjYXNlIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjpcbiAgICAgICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHZhbHVlID09PSBmYWxzZSAmJlxuICAgICAgICAgIHRoaXMuaXNQbGFpbk9iamVjdChzY2hlbWEucGF0dGVyblByb3BlcnRpZXMpICYmXG4gICAgICAgICAgT2JqZWN0LmtleXMoc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzKS5sZW5ndGggPiAwXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwiYWRkaXRpb25hbEl0ZW1zXCI6XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSB8fCAhQXJyYXkuaXNBcnJheShzY2hlbWEuaXRlbXMpO1xuICAgICAgY2FzZSBcImFsbE9mXCI6IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAodGhpcy5pc1RyaXZpYWxBbHdheXNWYWxpZFN1YnNjaGVtYSh2YWx1ZVtpXSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY2FzZSBcImFueU9mXCI6IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAodGhpcy5pc1RyaXZpYWxBbHdheXNWYWxpZFN1YnNjaGVtYSh2YWx1ZVtpXSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhc1JlcXVpcmVkRGVmYXVsdHMoc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogYm9vbGVhbiB7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IHNjaGVtYS5wcm9wZXJ0aWVzO1xuICAgIGlmICghdGhpcy5pc1BsYWluT2JqZWN0KHByb3BlcnRpZXMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByb3BlcnRpZXMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgc3ViU2NoZW1hID0gcHJvcGVydGllc1trZXlzW2ldXTtcbiAgICAgIGlmICh0aGlzLmlzUGxhaW5PYmplY3Qoc3ViU2NoZW1hKSAmJiBcImRlZmF1bHRcIiBpbiBzdWJTY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0RlZmF1bHRUeXBlVmFsaWRhdG9yKHR5cGU6IHN0cmluZywgdmFsaWRhdG9yOiBUeXBlRnVuY3Rpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFR5cGVzIGFzIFJlY29yZDxzdHJpbmcsIFR5cGVGdW5jdGlvbiB8IGZhbHNlPilbdHlwZV0gPT09IHZhbGlkYXRvcjtcbiAgfVxuXG4gIHByaXZhdGUgY29tcGlsZVNjaGVtYShzY2hlbWE6IFBhcnRpYWw8Q29tcGlsZWRTY2hlbWE+IHwgYW55KTogQ29tcGlsZWRTY2hlbWEge1xuICAgIGlmICghc2NoZW1hIHx8IHR5cGVvZiBzY2hlbWEgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShzY2hlbWEpKSB7XG4gICAgICBpZiAoc2NoZW1hID09PSB0cnVlKSB7XG4gICAgICAgIHNjaGVtYSA9IHsgYW55T2Y6IFt7fV0gfTsgLy8gQWx3YXlzIHZhbGlkXG4gICAgICB9IGVsc2UgaWYgKHNjaGVtYSA9PT0gZmFsc2UpIHtcbiAgICAgICAgc2NoZW1hID0geyBvbmVPZjogW10gfTsgLy8gQWx3YXlzIGludmFsaWRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNjaGVtYSA9IHsgb25lT2Y6IFtzY2hlbWFdIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2NoZW1hID0gdGhpcy5ub3JtYWxpemVTY2hlbWFGb3JDb21waWxlKHNjaGVtYSk7XG5cbiAgICBjb25zdCBjb21waWxlZFNjaGVtYTogQ29tcGlsZWRTY2hlbWEgPSBkZWVwQ2xvbmVVbmZyZWV6ZShcbiAgICAgIHNjaGVtYVxuICAgICkgYXMgQ29tcGlsZWRTY2hlbWE7XG5cbiAgICBsZXQgc2NoZW1hSGFzUmVmID0gZmFsc2U7XG5cbiAgICBpZiAodHlwZW9mIHNjaGVtYS4kaWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRoaXMuaWRSZWdpc3RyeS5zZXQoc2NoZW1hLiRpZCwgY29tcGlsZWRTY2hlbWEpO1xuICAgIH1cblxuICAgIGlmIChcIiRyZWZcIiBpbiBzY2hlbWEpIHtcbiAgICAgIHNjaGVtYUhhc1JlZiA9IHRydWU7XG4gICAgICBjb25zdCByZWZWYWxpZGF0b3IgPSB0aGlzLmdldEtleXdvcmQoXCIkcmVmXCIpO1xuICAgICAgaWYgKHJlZlZhbGlkYXRvcikge1xuICAgICAgICBjb25zdCBkZWZpbmVFcnJvciA9IGdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5KFxuICAgICAgICAgIFwiJHJlZlwiLFxuICAgICAgICAgIHNjaGVtYVtcIiRyZWZcIl0sXG4gICAgICAgICAgdGhpcy5mYWlsRmFzdFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbXBpbGVkU2NoZW1hLiR2YWxpZGF0ZSA9IGdldE5hbWVkRnVuY3Rpb248VmFsaWRhdGVGdW5jdGlvbj4oXG4gICAgICAgICAgXCJWYWxpZGF0ZV9SZWZlcmVuY2VcIixcbiAgICAgICAgICAoZGF0YSkgPT5cbiAgICAgICAgICAgIChyZWZWYWxpZGF0b3IgYXMgS2V5d29yZEZ1bmN0aW9uKShcbiAgICAgICAgICAgICAgY29tcGlsZWRTY2hlbWEsXG4gICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgIGRlZmluZUVycm9yLFxuICAgICAgICAgICAgICB0aGlzXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubWFya1NjaGVtYUhhc1JlZihjb21waWxlZFNjaGVtYSk7XG4gICAgICByZXR1cm4gY29tcGlsZWRTY2hlbWE7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdG9yczogVmFsaWRhdG9ySXRlbVtdID0gW107XG4gICAgY29uc3QgYWN0aXZlTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAoXCJ0eXBlXCIgaW4gc2NoZW1hKSB7XG4gICAgICBjb25zdCBkZWZpbmVUeXBlRXJyb3IgPSBnZXREZWZpbmVkRXJyb3JGdW5jdGlvbkZvcktleShcbiAgICAgICAgXCJ0eXBlXCIsXG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgdGhpcy5mYWlsRmFzdFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHR5cGVzID0gQXJyYXkuaXNBcnJheShzY2hlbWEudHlwZSlcbiAgICAgICAgPyBzY2hlbWEudHlwZVxuICAgICAgICA6IHNjaGVtYS50eXBlLnNwbGl0KFwiLFwiKS5tYXAoKHQ6IHN0cmluZykgPT4gdC50cmltKCkpO1xuXG4gICAgICBjb25zdCB0eXBlRnVuY3Rpb25zOiBUeXBlRnVuY3Rpb25bXSA9IFtdO1xuICAgICAgY29uc3QgdHlwZU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgY29uc3QgZGVmYXVsdFR5cGVOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGxldCBhbGxUeXBlc0RlZmF1bHQgPSB0cnVlO1xuXG4gICAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHlwZXMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gdGhpcy5nZXRUeXBlKHR5cGUpO1xuICAgICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgICAgdHlwZUZ1bmN0aW9ucy5wdXNoKHZhbGlkYXRvcik7XG4gICAgICAgICAgdHlwZU5hbWVzLnB1c2godmFsaWRhdG9yLm5hbWUpO1xuICAgICAgICAgIGlmICh0aGlzLmlzRGVmYXVsdFR5cGVWYWxpZGF0b3IodHlwZSwgdmFsaWRhdG9yKSkge1xuICAgICAgICAgICAgZGVmYXVsdFR5cGVOYW1lcy5wdXNoKHR5cGUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhbGxUeXBlc0RlZmF1bHQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVGdW5jdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IGdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5KFxuICAgICAgICAgIFwidHlwZVwiLFxuICAgICAgICAgIHNjaGVtYSxcbiAgICAgICAgICB0aGlzLmZhaWxGYXN0XG4gICAgICAgICkoXCJJbnZhbGlkIHR5cGUgZm9yIHNjaGVtYVwiLCB7IGRhdGE6IHNjaGVtYS50eXBlIH0pO1xuICAgICAgfVxuXG4gICAgICBsZXQgY29tYmluZWRUeXBlVmFsaWRhdG9yOiBWYWxpZGF0ZUZ1bmN0aW9uO1xuICAgICAgbGV0IHR5cGVNZXRob2ROYW1lID0gXCJcIjtcblxuICAgICAgaWYgKHR5cGVGdW5jdGlvbnMubGVuZ3RoID09PSAxICYmIGFsbFR5cGVzRGVmYXVsdCkge1xuICAgICAgICBjb25zdCBzaW5nbGVUeXBlTmFtZSA9IGRlZmF1bHRUeXBlTmFtZXNbMF07XG4gICAgICAgIHR5cGVNZXRob2ROYW1lID0gc2luZ2xlVHlwZU5hbWU7XG5cbiAgICAgICAgc3dpdGNoIChzaW5nbGVUeXBlTmFtZSkge1xuICAgICAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChkYXRhID09PSBudWxsIHx8IHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lVHlwZUVycm9yKFwiSW52YWxpZCB0eXBlXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgICAgICAgY29tYmluZWRUeXBlVmFsaWRhdG9yID0gKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmluZVR5cGVFcnJvcihcIkludmFsaWQgdHlwZVwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICBjb21iaW5lZFR5cGVWYWxpZGF0b3IgPSAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lVHlwZUVycm9yKFwiSW52YWxpZCB0eXBlXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImludGVnZXJcIjpcbiAgICAgICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJudW1iZXJcIiB8fCAhTnVtYmVyLmlzSW50ZWdlcihkYXRhKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lVHlwZUVycm9yKFwiSW52YWxpZCB0eXBlXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJudWxsXCI6XG4gICAgICAgICAgICBjb21iaW5lZFR5cGVWYWxpZGF0b3IgPSAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoZGF0YSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgY29uc3Qgc2luZ2xlVHlwZUZuID0gdHlwZUZ1bmN0aW9uc1swXTtcbiAgICAgICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghc2luZ2xlVHlwZUZuKGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmluZVR5cGVFcnJvcihcIkludmFsaWQgdHlwZVwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVGdW5jdGlvbnMubGVuZ3RoID4gMSAmJiBhbGxUeXBlc0RlZmF1bHQpIHtcbiAgICAgICAgdHlwZU1ldGhvZE5hbWUgPSBkZWZhdWx0VHlwZU5hbWVzLmpvaW4oXCJfT1JfXCIpO1xuXG4gICAgICAgIGNvbnN0IGFsbG93c09iamVjdCA9IGRlZmF1bHRUeXBlTmFtZXMuaW5jbHVkZXMoXCJvYmplY3RcIik7XG4gICAgICAgIGNvbnN0IGFsbG93c0FycmF5ID0gZGVmYXVsdFR5cGVOYW1lcy5pbmNsdWRlcyhcImFycmF5XCIpO1xuICAgICAgICBjb25zdCBhbGxvd3NTdHJpbmcgPSBkZWZhdWx0VHlwZU5hbWVzLmluY2x1ZGVzKFwic3RyaW5nXCIpO1xuICAgICAgICBjb25zdCBhbGxvd3NOdW1iZXIgPSBkZWZhdWx0VHlwZU5hbWVzLmluY2x1ZGVzKFwibnVtYmVyXCIpO1xuICAgICAgICBjb25zdCBhbGxvd3NJbnRlZ2VyID0gZGVmYXVsdFR5cGVOYW1lcy5pbmNsdWRlcyhcImludGVnZXJcIik7XG4gICAgICAgIGNvbnN0IGFsbG93c0Jvb2xlYW4gPSBkZWZhdWx0VHlwZU5hbWVzLmluY2x1ZGVzKFwiYm9vbGVhblwiKTtcbiAgICAgICAgY29uc3QgYWxsb3dzTnVsbCA9IGRlZmF1bHRUeXBlTmFtZXMuaW5jbHVkZXMoXCJudWxsXCIpO1xuXG4gICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgY29uc3QgZGF0YVR5cGUgPSB0eXBlb2YgZGF0YTtcblxuICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgaWYgKGFsbG93c051bWJlciB8fCAoYWxsb3dzSW50ZWdlciAmJiBOdW1iZXIuaXNJbnRlZ2VyKGRhdGEpKSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgaWYgKGFsbG93c1N0cmluZykge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgIGlmIChhbGxvd3NCb29sZWFuKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGRlZmluZVR5cGVFcnJvcihcIkludmFsaWQgdHlwZVwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGRhdGFUeXBlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBpZiAoZGF0YSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBpZiAoYWxsb3dzTnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgICAgICBpZiAoYWxsb3dzQXJyYXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lVHlwZUVycm9yKFwiSW52YWxpZCB0eXBlXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGFsbG93c09iamVjdCkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmICh0eXBlRnVuY3Rpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICB0eXBlTWV0aG9kTmFtZSA9IHR5cGVOYW1lc1swXTtcbiAgICAgICAgY29uc3Qgc2luZ2xlVHlwZUZuID0gdHlwZUZ1bmN0aW9uc1swXTtcbiAgICAgICAgY29tYmluZWRUeXBlVmFsaWRhdG9yID0gKGRhdGEpID0+IHtcbiAgICAgICAgICBpZiAoIXNpbmdsZVR5cGVGbihkYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZVR5cGVFcnJvcihcIkludmFsaWQgdHlwZVwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZU1ldGhvZE5hbWUgPSB0eXBlTmFtZXMuam9pbihcIl9PUl9cIik7XG4gICAgICAgIGNvbWJpbmVkVHlwZVZhbGlkYXRvciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBlRnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodHlwZUZ1bmN0aW9uc1tpXShkYXRhKSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICB2YWxpZGF0b3JzLnB1c2goe1xuICAgICAgICBuYW1lOiB0eXBlTWV0aG9kTmFtZSxcbiAgICAgICAgdmFsaWRhdGU6IGdldE5hbWVkRnVuY3Rpb24odHlwZU1ldGhvZE5hbWUsIGNvbWJpbmVkVHlwZVZhbGlkYXRvcilcbiAgICAgIH0pO1xuICAgICAgYWN0aXZlTmFtZXMucHVzaCh0eXBlTWV0aG9kTmFtZSk7XG4gICAgfVxuXG4gICAgY29uc3QgeyB0eXBlLCAkaWQsICRyZWYsICR2YWxpZGF0ZSwgcmVxdWlyZWQsIC4uLm90aGVyS2V5cyB9ID0gc2NoZW1hOyAvLyBFeGNsdWRlIGhhbmRsZWQga2V5c1xuXG4gICAgLy8gSW4gaGVyZSB3ZSBjcmVhdGUgYW4gYXJyYXkgb2Yga2V5cyBwdXR0aW5nIHRoZSByZXF1aXJlIGtleXdvcmQgbGFzdFxuICAgIC8vIFRoaXMgaXMgdG8gZW5zdXJlIHJlcXVpcmVkIHByb3BlcnRpZXMgYXJlIGNoZWNrZWQgYWZ0ZXIgZGVmYXVsdHMgYXJlIGFwcGxpZWRcbiAgICBjb25zdCBrZXlPcmRlciA9IHJlcXVpcmVkXG4gICAgICA/IHRoaXMuaGFzUmVxdWlyZWREZWZhdWx0cyhzY2hlbWEpXG4gICAgICAgID8gWy4uLk9iamVjdC5rZXlzKG90aGVyS2V5cyksIFwicmVxdWlyZWRcIl1cbiAgICAgICAgOiBbXCJyZXF1aXJlZFwiLCAuLi5PYmplY3Qua2V5cyhvdGhlcktleXMpXVxuICAgICAgOiBPYmplY3Qua2V5cyhvdGhlcktleXMpO1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5T3JkZXIpIHtcbiAgICAgIGNvbnN0IGtleXdvcmRGbiA9IHRoaXMuZ2V0S2V5d29yZChrZXkpO1xuXG4gICAgICBpZiAoIWtleXdvcmRGbikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc2hvdWxkU2tpcEtleXdvcmQoc2NoZW1hLCBrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWZpbmVFcnJvciA9IGdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5KFxuICAgICAgICBrZXksXG4gICAgICAgIHNjaGVtYVtrZXldLFxuICAgICAgICB0aGlzLmZhaWxGYXN0XG4gICAgICApO1xuICAgICAgY29uc3QgZm5OYW1lID0ga2V5d29yZEZuLm5hbWUgfHwga2V5O1xuXG4gICAgICB2YWxpZGF0b3JzLnB1c2goe1xuICAgICAgICBuYW1lOiBmbk5hbWUsXG4gICAgICAgIHZhbGlkYXRlOiBnZXROYW1lZEZ1bmN0aW9uPFZhbGlkYXRlRnVuY3Rpb24+KGZuTmFtZSwgKGRhdGEpID0+XG4gICAgICAgICAgKGtleXdvcmRGbiBhcyBLZXl3b3JkRnVuY3Rpb24pKGNvbXBpbGVkU2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgdGhpcylcbiAgICAgICAgKVxuICAgICAgfSk7XG5cbiAgICAgIGFjdGl2ZU5hbWVzLnB1c2goZm5OYW1lKTtcbiAgICB9XG5cbiAgICBjb25zdCBsaXRlcmFsS2V5d29yZHMgPSBbXCJlbnVtXCIsIFwiY29uc3RcIiwgXCJkZWZhdWx0XCIsIFwiZXhhbXBsZXNcIl07XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5T3JkZXIpIHtcbiAgICAgIGlmIChsaXRlcmFsS2V5d29yZHMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBzY2hlbWFba2V5XSAmJlxuICAgICAgICB0eXBlb2Ygc2NoZW1hW2tleV0gPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoc2NoZW1hW2tleV0pXG4gICAgICApIHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJwcm9wZXJ0aWVzXCIpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHN1YktleSBvZiBPYmplY3Qua2V5cyhzY2hlbWFba2V5XSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBpbGVkU3ViU2NoZW1hID0gdGhpcy5jb21waWxlU2NoZW1hKFxuICAgICAgICAgICAgICBzY2hlbWFba2V5XVtzdWJLZXldXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoKGNvbXBpbGVkU3ViU2NoZW1hIGFzIGFueSkuX2hhc1JlZiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICBzY2hlbWFIYXNSZWYgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb21waWxlZFNjaGVtYVtrZXldW3N1YktleV0gPSBjb21waWxlZFN1YlNjaGVtYTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcGlsZWRTdWJTY2hlbWEgPSB0aGlzLmNvbXBpbGVTY2hlbWEoc2NoZW1hW2tleV0pO1xuICAgICAgICBpZiAoKGNvbXBpbGVkU3ViU2NoZW1hIGFzIGFueSkuX2hhc1JlZiA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHNjaGVtYUhhc1JlZiA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb21waWxlZFNjaGVtYVtrZXldID0gY29tcGlsZWRTdWJTY2hlbWE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWFba2V5XSkpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlbWFba2V5XS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICh0aGlzLmlzU2NoZW1hTGlrZShzY2hlbWFba2V5XVtpXSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBpbGVkU3ViU2NoZW1hID0gdGhpcy5jb21waWxlU2NoZW1hKHNjaGVtYVtrZXldW2ldKTtcbiAgICAgICAgICAgIGlmICgoY29tcGlsZWRTdWJTY2hlbWEgYXMgYW55KS5faGFzUmVmID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgIHNjaGVtYUhhc1JlZiA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbXBpbGVkU2NoZW1hW2tleV1baV0gPSBjb21waWxlZFN1YlNjaGVtYTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNjaGVtYUhhc1JlZikge1xuICAgICAgdGhpcy5tYXJrU2NoZW1hSGFzUmVmKGNvbXBpbGVkU2NoZW1hKTtcbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdG9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBjb21waWxlZFNjaGVtYTtcbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdG9ycy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IHYgPSB2YWxpZGF0b3JzWzBdO1xuICAgICAgY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlID0gZ2V0TmFtZWRGdW5jdGlvbih2Lm5hbWUsIHYudmFsaWRhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb21wb3NpdGVOYW1lID0gXCJWYWxpZGF0ZV9cIiArIGFjdGl2ZU5hbWVzLmpvaW4oXCJfQU5EX1wiKTtcblxuICAgICAgY29uc3QgbWFzdGVyVmFsaWRhdG9yOiBWYWxpZGF0ZUZ1bmN0aW9uID0gKGRhdGEpID0+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxpZGF0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdiA9IHZhbGlkYXRvcnNbaV07XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSB2LnZhbGlkYXRlKGRhdGEpO1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9O1xuXG4gICAgICBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uKFxuICAgICAgICBjb21wb3NpdGVOYW1lLFxuICAgICAgICBtYXN0ZXJWYWxpZGF0b3JcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBpbGVkU2NoZW1hIGFzIENvbXBpbGVkU2NoZW1hO1xuICB9XG5cbiAgaXNTY2hlbWFMaWtlKHN1YlNjaGVtYTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgc3ViU2NoZW1hICYmXG4gICAgICB0eXBlb2Ygc3ViU2NoZW1hID09PSBcIm9iamVjdFwiICYmXG4gICAgICAhQXJyYXkuaXNBcnJheShzdWJTY2hlbWEpXG4gICAgKSB7XG4gICAgICBpZiAoXCJ0eXBlXCIgaW4gc3ViU2NoZW1hKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBzdWJLZXkgaW4gc3ViU2NoZW1hKSB7XG4gICAgICAgIGlmIChzdWJLZXkgaW4gdGhpcy5rZXl3b3Jkcykge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgbGlua1JlZmVyZW5jZXMocm9vdDogQ29tcGlsZWRTY2hlbWEpIHtcbiAgICBjb25zdCBzdGFjazogYW55W10gPSBbcm9vdF07XG5cbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgbm9kZSA9IHN0YWNrLnBvcCgpO1xuXG4gICAgICBpZiAoIW5vZGUgfHwgdHlwZW9mIG5vZGUgIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuXG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBub2RlLiRyZWYgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgdHlwZW9mIG5vZGUuJHZhbGlkYXRlID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgbm9kZS4kdmFsaWRhdGUubmFtZSA9PT0gXCJWYWxpZGF0ZV9SZWZlcmVuY2VcIlxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHJlZlBhdGggPSBub2RlLiRyZWYgYXMgc3RyaW5nO1xuXG4gICAgICAgIGxldCB0YXJnZXQ6IGFueSA9IHRoaXMuZ2V0U2NoZW1hUmVmKHJlZlBhdGgpO1xuICAgICAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIHRhcmdldCA9IHRoaXMuZ2V0U2NoZW1hQnlJZChyZWZQYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgIGlmICh0YXJnZXQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIG5vZGUuJHZhbGlkYXRlID0gZ2V0TmFtZWRGdW5jdGlvbihcIlZhbGlkYXRlX1JlZl9UcnVlXCIsICgpID0+IHt9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZGVmaW5lRXJyb3IgPSBnZXREZWZpbmVkRXJyb3JGdW5jdGlvbkZvcktleShcbiAgICAgICAgICAgICAgXCIkcmVmXCIsXG4gICAgICAgICAgICAgIG5vZGUgYXMgYW55LFxuICAgICAgICAgICAgICB0aGlzLmZhaWxGYXN0XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBub2RlLiR2YWxpZGF0ZSA9IGdldE5hbWVkRnVuY3Rpb24oXG4gICAgICAgICAgICAgIFwiVmFsaWRhdGVfUmVmX0ZhbHNlXCIsXG4gICAgICAgICAgICAgIChfZGF0YTogYW55KSA9PiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQuJHZhbGlkYXRlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBub2RlLiR2YWxpZGF0ZSA9IHRhcmdldC4kdmFsaWRhdGU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gbm9kZSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG5vZGVba2V5XTtcbiAgICAgICAgaWYgKCF2YWx1ZSkgY29udGludWU7XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdiA9IHZhbHVlW2ldO1xuICAgICAgICAgICAgaWYgKHYgJiYgdHlwZW9mIHYgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgc3RhY2sucHVzaCh2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgc3RhY2sucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ik1BWU8sSUFBTUEsRUFBTixjQUE4QkMsTUFDbkNDLFFBQ0FDLEtBQ0FDLFFBQ0FDLE1BQ0FDLFdBQXFCLEdBQ3JCQyxhQUF1QixHQUN2QkMsS0FDQUMsT0FFUUMsVUFBVUMsRUFBVSxJQUFLQyxFQUFrQixLQUNqRCxJQUFJTixFQUFhLEdBQUdLLEtBQVdFLEtBQUtULFVBQ2hDRyxFQUFlLEdBQUdLLElBWXRCLFlBWHlCLElBQWRDLEtBQUtWLE9BQ1csaUJBQWRVLEtBQUtWLE1BQXFCVSxLQUFLVixRQUFRVSxLQUFLSixTQUNyREgsR0FBYyxJQUFJTyxLQUFLVixRQUV6QkksR0FBZ0IsSUFBSU0sS0FBS1YsUUFHM0JVLEtBQUtOLGFBQWVBLEVBQ3BCTSxLQUFL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
|