@openai/agents-realtime 0.13.2 → 0.13.3

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.
@@ -1,7 +1,7 @@
1
1
  var U = Object.defineProperty;
2
2
  var j = (t, s, e) => s in t ? U(t, s, { enumerable: !0, configurable: !0, writable: !0, value: e }) : t[s] = e;
3
3
  var o = (t, s, e) => j(t, typeof s != "symbol" ? s + "" : s, e);
4
- import { Capability as _, requireBoundSession as N, UserError as b, tool as m, object as y, string as p, applyPatchTool as K, withSandboxSpan as w, isRecord as L, encodeUint8ArrayToBase64 as H, ApplyPatchOperation as z, number as d, boolean as P, prompt as T, Agent as X, SANDBOX_AGENT_BRAND as q, cloneManifest as G, Manifest as Y, normalizeUser as J } from "./index-IC-GtnyH.mjs";
4
+ import { Capability as _, requireBoundSession as N, UserError as b, tool as m, object as y, string as p, applyPatchTool as K, withSandboxSpan as w, isRecord as L, encodeUint8ArrayToBase64 as H, ApplyPatchOperation as z, number as d, boolean as P, prompt as T, Agent as X, SANDBOX_AGENT_BRAND as q, cloneManifest as G, Manifest as Y, normalizeUser as J } from "./index-DQ5Tty94.mjs";
5
5
  function V(t) {
6
6
  return t ? !(typeof t == "object" && t && "constructor" in t && typeof t.constructor == "function" ? t.constructor.name : "").includes("ChatCompletions") : !0;
7
7
  }
@@ -639,4 +639,4 @@ function Ee(t) {
639
639
  export {
640
640
  W as SandboxAgent
641
641
  };
642
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtQms4WklOQlgubWpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9hZ2VudHMtY29yZS9kaXN0L3NhbmRib3gvY2FwYWJpbGl0aWVzL3RyYW5zcG9ydC5tanMiLCIuLi8uLi8uLi9hZ2VudHMtY29yZS9kaXN0L3NhbmRib3gvY2FwYWJpbGl0aWVzL2NvbXBhY3Rpb24ubWpzIiwiLi4vLi4vLi4vYWdlbnRzLWNvcmUvZGlzdC9zYW5kYm94L2NhcGFiaWxpdGllcy9maWxlc3lzdGVtLm1qcyIsIi4uLy4uLy4uL2FnZW50cy1jb3JlL2Rpc3Qvc2FuZGJveC9jYXBhYmlsaXRpZXMvc2hlbGwubWpzIiwiLi4vLi4vLi4vYWdlbnRzLWNvcmUvZGlzdC9zYW5kYm94L2NhcGFiaWxpdGllcy9za2lsbHMubWpzIiwiLi4vLi4vLi4vYWdlbnRzLWNvcmUvZGlzdC9zYW5kYm94L2NhcGFiaWxpdGllcy9pbmRleC5tanMiLCIuLi8uLi8uLi9hZ2VudHMtY29yZS9kaXN0L3NhbmRib3gvYWdlbnQubWpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c1Jlc3BvbnNlc0NvbXBhY3Rpb25UcmFuc3BvcnQobW9kZWxJbnN0YW5jZSkge1xuICAgIGlmICghbW9kZWxJbnN0YW5jZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgY29uc3RydWN0b3JOYW1lID0gdHlwZW9mIG1vZGVsSW5zdGFuY2UgPT09ICdvYmplY3QnICYmXG4gICAgICAgIG1vZGVsSW5zdGFuY2UgJiZcbiAgICAgICAgJ2NvbnN0cnVjdG9yJyBpbiBtb2RlbEluc3RhbmNlICYmXG4gICAgICAgIHR5cGVvZiBtb2RlbEluc3RhbmNlLmNvbnN0cnVjdG9yID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gbW9kZWxJbnN0YW5jZS5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgIDogJyc7XG4gICAgcmV0dXJuICFjb25zdHJ1Y3Rvck5hbWUuaW5jbHVkZXMoJ0NoYXRDb21wbGV0aW9ucycpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzQXBwbHlQYXRjaFRyYW5zcG9ydChtb2RlbEluc3RhbmNlKSB7XG4gICAgcmV0dXJuIHN1cHBvcnRzU3RydWN0dXJlZFRvb2xPdXRwdXRUcmFuc3BvcnQobW9kZWxJbnN0YW5jZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydHNTdHJ1Y3R1cmVkVG9vbE91dHB1dFRyYW5zcG9ydChtb2RlbEluc3RhbmNlKSB7XG4gICAgaWYgKCFtb2RlbEluc3RhbmNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgY29uc3RydWN0b3JOYW1lID0gdHlwZW9mIG1vZGVsSW5zdGFuY2UgPT09ICdvYmplY3QnICYmXG4gICAgICAgIG1vZGVsSW5zdGFuY2UgJiZcbiAgICAgICAgJ2NvbnN0cnVjdG9yJyBpbiBtb2RlbEluc3RhbmNlICYmXG4gICAgICAgIHR5cGVvZiBtb2RlbEluc3RhbmNlLmNvbnN0cnVjdG9yID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gbW9kZWxJbnN0YW5jZS5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgIDogJyc7XG4gICAgcmV0dXJuICFjb25zdHJ1Y3Rvck5hbWUuaW5jbHVkZXMoJ0NoYXRDb21wbGV0aW9ucycpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHJhbnNwb3J0Lm1qcy5tYXAiLCJpbXBvcnQgeyBDYXBhYmlsaXR5IH0gZnJvbSBcIi4vYmFzZS5tanNcIjtcbmltcG9ydCB7IHN1cHBvcnRzUmVzcG9uc2VzQ29tcGFjdGlvblRyYW5zcG9ydCB9IGZyb20gXCIuL3RyYW5zcG9ydC5tanNcIjtcbmV4cG9ydCBjbGFzcyBDb21wYWN0aW9uUG9saWN5IHtcbn1cbmV4cG9ydCBjbGFzcyBTdGF0aWNDb21wYWN0aW9uUG9saWN5IGV4dGVuZHMgQ29tcGFjdGlvblBvbGljeSB7XG4gICAgdGhyZXNob2xkO1xuICAgIGNvbnN0cnVjdG9yKHRocmVzaG9sZCA9IDI0MDAwMCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnRocmVzaG9sZCA9IHRocmVzaG9sZDtcbiAgICB9XG4gICAgY29tcGFjdFRocmVzaG9sZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhyZXNob2xkO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBEeW5hbWljQ29tcGFjdGlvblBvbGljeSBleHRlbmRzIENvbXBhY3Rpb25Qb2xpY3kge1xuICAgIHRocmVzaG9sZFJhdGlvO1xuICAgIGZhbGxiYWNrVGhyZXNob2xkO1xuICAgIGNvbnN0cnVjdG9yKHRocmVzaG9sZFJhdGlvID0gMC45LCBmYWxsYmFja1RocmVzaG9sZCA9IDI0MDAwMCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnRocmVzaG9sZFJhdGlvID0gdGhyZXNob2xkUmF0aW87XG4gICAgICAgIHRoaXMuZmFsbGJhY2tUaHJlc2hvbGQgPSBmYWxsYmFja1RocmVzaG9sZDtcbiAgICB9XG4gICAgY29tcGFjdFRocmVzaG9sZChtb2RlbCkge1xuICAgICAgICBpZiAoIW1vZGVsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mYWxsYmFja1RocmVzaG9sZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtb2RlbEluZm8gPSBDb21wYWN0aW9uTW9kZWxJbmZvLmZvck1vZGVsKG1vZGVsKTtcbiAgICAgICAgaWYgKCFtb2RlbEluZm8pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZhbGxiYWNrVGhyZXNob2xkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKG1vZGVsSW5mby5jb250ZXh0V2luZG93ICogdGhpcy50aHJlc2hvbGRSYXRpbyk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIENvbXBhY3Rpb25Nb2RlbEluZm8ge1xuICAgIGNvbnRleHRXaW5kb3c7XG4gICAgY29uc3RydWN0b3IoY29udGV4dFdpbmRvdykge1xuICAgICAgICB0aGlzLmNvbnRleHRXaW5kb3cgPSBjb250ZXh0V2luZG93O1xuICAgIH1cbiAgICBzdGF0aWMgZm9yTW9kZWwobW9kZWwpIHtcbiAgICAgICAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgZ2V0U2FuZGJveENvbXBhY3Rpb25Nb2RlbENhbmRpZGF0ZXMobW9kZWwpKSB7XG4gICAgICAgICAgICBpZiAoU0FOREJPWF9DT05URVhUX1dJTkRPV1NfMU0uaGFzKGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBhY3Rpb25Nb2RlbEluZm8oMTA0NzU3Nik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoU0FOREJPWF9DT05URVhUX1dJTkRPV1NfNDAwSy5oYXMoY2FuZGlkYXRlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGFjdGlvbk1vZGVsSW5mbyg0MDAwMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFNBTkRCT1hfQ09OVEVYVF9XSU5ET1dTXzIwMEsuaGFzKGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBhY3Rpb25Nb2RlbEluZm8oMjAwMDAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChTQU5EQk9YX0NPTlRFWFRfV0lORE9XU18xMjhLLmhhcyhjYW5kaWRhdGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wYWN0aW9uTW9kZWxJbmZvKDEyODAwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG5jbGFzcyBDb21wYWN0aW9uQ2FwYWJpbGl0eSBleHRlbmRzIENhcGFiaWxpdHkge1xuICAgIHR5cGUgPSAnY29tcGFjdGlvbic7XG4gICAgcG9saWN5O1xuICAgIGNvbnN0cnVjdG9yKHBvbGljeSA9IG5ldyBEeW5hbWljQ29tcGFjdGlvblBvbGljeSgpKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucG9saWN5ID0gcG9saWN5O1xuICAgIH1cbiAgICBzYW1wbGluZ1BhcmFtcyhzYW1wbGluZ1BhcmFtcykge1xuICAgICAgICBpZiAoc2FtcGxpbmdQYXJhbXMubW9kZWxJbnN0YW5jZSAmJlxuICAgICAgICAgICAgIXN1cHBvcnRzUmVzcG9uc2VzQ29tcGFjdGlvblRyYW5zcG9ydChzYW1wbGluZ1BhcmFtcy5tb2RlbEluc3RhbmNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1vZGVsID0gdHlwZW9mIHNhbXBsaW5nUGFyYW1zLm1vZGVsID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyBzYW1wbGluZ1BhcmFtcy5tb2RlbFxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZXh0X21hbmFnZW1lbnQ6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjb21wYWN0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgY29tcGFjdF90aHJlc2hvbGQ6IHRoaXMucG9saWN5LmNvbXBhY3RUaHJlc2hvbGQobW9kZWwpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwcm9jZXNzQ29udGV4dChjb250ZXh0KSB7XG4gICAgICAgIGxldCBsYXN0Q29tcGFjdGlvbkluZGV4ID0gLTE7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb250ZXh0Lmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICAgICAgaWYgKGNvbnRleHRbaW5kZXhdLnR5cGUgPT09ICdjb21wYWN0aW9uJykge1xuICAgICAgICAgICAgICAgIGxhc3RDb21wYWN0aW9uSW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobGFzdENvbXBhY3Rpb25JbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250ZXh0LnNsaWNlKGxhc3RDb21wYWN0aW9uSW5kZXgpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21wYWN0aW9uKGFyZ3MgPSB7fSkge1xuICAgIHJldHVybiBuZXcgQ29tcGFjdGlvbkNhcGFiaWxpdHkoYXJncy5wb2xpY3kpO1xufVxuZnVuY3Rpb24gZ2V0U2FuZGJveENvbXBhY3Rpb25Nb2RlbENhbmRpZGF0ZXMobW9kZWwpIHtcbiAgICBjb25zdCB0cmltbWVkID0gbW9kZWwudHJpbSgpO1xuICAgIGlmICghdHJpbW1lZCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IHdpdGhvdXRQcm92aWRlclByZWZpeCA9IHRyaW1tZWQuaW5jbHVkZXMoJy8nKVxuICAgICAgICA/IHRyaW1tZWQuc2xpY2UodHJpbW1lZC5sYXN0SW5kZXhPZignLycpICsgMSlcbiAgICAgICAgOiB0cmltbWVkO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB3aXRob3V0UHJvdmlkZXJQcmVmaXgudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCB3aXRob3V0UGlubmVkRGF0ZSA9IG5vcm1hbGl6ZWQucmVwbGFjZSgvLVxcZHs0fS1cXGR7Mn0tXFxkezJ9JC91LCAnJyk7XG4gICAgcmV0dXJuIFsuLi5uZXcgU2V0KFtub3JtYWxpemVkLCB3aXRob3V0UGlubmVkRGF0ZV0pXTtcbn1cbmNvbnN0IFNBTkRCT1hfQ09OVEVYVF9XSU5ET1dTXzFNID0gbmV3IFNldChbXG4gICAgJ2dwdC01LjYnLFxuICAgICdncHQtNS42LXNvbCcsXG4gICAgJ2dwdC01LjYtdGVycmEnLFxuICAgICdncHQtNS42LWx1bmEnLFxuICAgICdncHQtNS40JyxcbiAgICAnZ3B0LTUuNC0yMDI2LTAzLTA1JyxcbiAgICAnZ3B0LTUuNC1wcm8nLFxuICAgICdncHQtNS40LXByby0yMDI2LTAzLTA1JyxcbiAgICAnZ3B0LTQuMScsXG4gICAgJ2dwdC00LjEtMjAyNS0wNC0xNCcsXG4gICAgJ2dwdC00LjEtbWluaScsXG4gICAgJ2dwdC00LjEtbWluaS0yMDI1LTA0LTE0JyxcbiAgICAnZ3B0LTQuMS1uYW5vJyxcbiAgICAnZ3B0LTQuMS1uYW5vLTIwMjUtMDQtMTQnLFxuXSk7XG5jb25zdCBTQU5EQk9YX0NPTlRFWFRfV0lORE9XU180MDBLID0gbmV3IFNldChbXG4gICAgJ2dwdC01JyxcbiAgICAnZ3B0LTUtY29kZXgnLFxuICAgICdncHQtNS1taW5pJyxcbiAgICAnZ3B0LTUtbmFubycsXG4gICAgJ2dwdC01LXBybycsXG4gICAgJ2dwdC01LjEnLFxuICAgICdncHQtNS4xLWNvZGV4JyxcbiAgICAnZ3B0LTUuMS1jb2RleC1tYXgnLFxuICAgICdncHQtNS4xLWNvZGV4LW1pbmknLFxuICAgICdncHQtNS4yJyxcbiAgICAnZ3B0LTUuMi1jb2RleCcsXG4gICAgJ2dwdC01LjItY29kZXgtY3liZXInLFxuICAgICdncHQtNS4yLXBybycsXG4gICAgJ2dwdC01LjMtY29kZXgnLFxuICAgICdncHQtNS4zLWNvZGV4LXNwYXJrJyxcbiAgICAnZ3B0LTUuNC1taW5pJyxcbiAgICAnZ3B0LTUuNC1uYW5vJyxcbl0pO1xuY29uc3QgU0FOREJPWF9DT05URVhUX1dJTkRPV1NfMjAwSyA9IG5ldyBTZXQoW1xuICAgICdjb2RleC1taW5pLWxhdGVzdCcsXG4gICAgJ28xJyxcbiAgICAnbzEtMjAyNC0xMi0xNycsXG4gICAgJ28xLXBybycsXG4gICAgJ28zJyxcbiAgICAnbzMtMjAyNS0wNC0xNicsXG4gICAgJ28zLW1pbmknLFxuICAgICdvMy1wcm8nLFxuICAgICdvMy1kZWVwLXJlc2VhcmNoJyxcbiAgICAnbzQtbWluaScsXG4gICAgJ280LW1pbmktMjAyNS0wNC0xNicsXG4gICAgJ280LW1pbmktZGVlcC1yZXNlYXJjaCcsXG5dKTtcbmNvbnN0IFNBTkRCT1hfQ09OVEVYVF9XSU5ET1dTXzEyOEsgPSBuZXcgU2V0KFtcbiAgICAnZ3B0LTRvJyxcbiAgICAnZ3B0LTRvLTIwMjQtMDgtMDYnLFxuICAgICdncHQtNG8tbWluaScsXG4gICAgJ2dwdC00by1taW5pLTIwMjQtMDctMTgnLFxuICAgICdncHQtNS1jaGF0LWxhdGVzdCcsXG4gICAgJ2dwdC01LjEtY2hhdC1sYXRlc3QnLFxuICAgICdncHQtNS4yLWNoYXQtbGF0ZXN0JyxcbiAgICAnZ3B0LTUuMy1jaGF0LWxhdGVzdCcsXG5dKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbXBhY3Rpb24ubWpzLm1hcCIsImltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuaW1wb3J0IHsgVXNlckVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9ycy5tanNcIjtcbmltcG9ydCB7IGFwcGx5UGF0Y2hUb29sLCB0b29sLCB9IGZyb20gXCIuLi8uLi90b29sLm1qc1wiO1xuaW1wb3J0IHsgQXBwbHlQYXRjaE9wZXJhdGlvbiB9IGZyb20gXCIuLi8uLi90eXBlcy9wcm90b2NvbC5tanNcIjtcbmltcG9ydCB7IGVuY29kZVVpbnQ4QXJyYXlUb0Jhc2U2NCB9IGZyb20gXCIuLi8uLi91dGlscy9iYXNlNjQubWpzXCI7XG5pbXBvcnQgeyB3aXRoU2FuZGJveFNwYW4gfSBmcm9tIFwiLi4vcnVudGltZS9zcGFucy5tanNcIjtcbmltcG9ydCB7IGlzUmVjb3JkIH0gZnJvbSBcIi4uL3NoYXJlZC90eXBlR3VhcmRzLm1qc1wiO1xuaW1wb3J0IHsgQ2FwYWJpbGl0eSwgcmVxdWlyZUJvdW5kU2Vzc2lvbiwgfSBmcm9tIFwiLi9iYXNlLm1qc1wiO1xuaW1wb3J0IHsgc3VwcG9ydHNBcHBseVBhdGNoVHJhbnNwb3J0LCBzdXBwb3J0c1N0cnVjdHVyZWRUb29sT3V0cHV0VHJhbnNwb3J0LCB9IGZyb20gXCIuL3RyYW5zcG9ydC5tanNcIjtcbmNvbnN0IGFwcGx5UGF0Y2hGdW5jdGlvblBhcmFtZXRlcnMgPSB7XG4gICAgdHlwZTogJ29iamVjdCcsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgICBwYXRjaDoge1xuICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0EgZnJlZWZvcm0gYXBwbHlfcGF0Y2ggcGF5bG9hZCB3cmFwcGVkIGluICoqKiBCZWdpbiBQYXRjaCBhbmQgKioqIEVuZCBQYXRjaC4nLFxuICAgICAgICB9LFxuICAgICAgICBvcGVyYXRpb246IHtcbiAgICAgICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdBIHNpbmdsZSBzdHJ1Y3R1cmVkIGFwcGx5X3BhdGNoIG9wZXJhdGlvbi4nLFxuICAgICAgICB9LFxuICAgICAgICBvcGVyYXRpb25zOiB7XG4gICAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgICAgaXRlbXM6IHsgdHlwZTogJ29iamVjdCcgfSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnU3RydWN0dXJlZCBhcHBseV9wYXRjaCBvcGVyYXRpb25zIHRvIGFwcGx5IGluIG9yZGVyLicsXG4gICAgICAgIH0sXG4gICAgICAgIGNvbW1hbmQ6IHtcbiAgICAgICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ09wdGlvbmFsIFtcImFwcGx5X3BhdGNoXCIsIHBhdGNoXSBjb21tYW5kIHR1cGxlIGZvcm0uJyxcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICBlbnVtOiBbJ2NyZWF0ZV9maWxlJywgJ3VwZGF0ZV9maWxlJywgJ2RlbGV0ZV9maWxlJ10sXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBwYXRjaCBvcGVyYXRpb24gdG8gYXBwbHkuJyxcbiAgICAgICAgfSxcbiAgICAgICAgcGF0aDoge1xuICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBzYW5kYm94IGZpbGUgcGF0aCB0byBwYXRjaC4nLFxuICAgICAgICB9LFxuICAgICAgICBkaWZmOiB7XG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIFY0QSBwYXRjaCBkaWZmIGZvciBjcmVhdGVfZmlsZSBhbmQgdXBkYXRlX2ZpbGUgb3BlcmF0aW9ucy4nLFxuICAgICAgICB9LFxuICAgICAgICBtb3ZlVG86IHtcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdPcHRpb25hbCBkZXN0aW5hdGlvbiBwYXRoIGZvciB1cGRhdGVfZmlsZSBtb3ZlIG9wZXJhdGlvbnMuJyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHJlcXVpcmVkOiBbXSxcbiAgICBhZGRpdGlvbmFsUHJvcGVydGllczogdHJ1ZSxcbn07XG5jb25zdCBCRUdJTl9QQVRDSCA9ICcqKiogQmVnaW4gUGF0Y2gnO1xuY29uc3QgRU5EX1BBVENIID0gJyoqKiBFbmQgUGF0Y2gnO1xuY29uc3QgQUREX0ZJTEUgPSAnKioqIEFkZCBGaWxlOiAnO1xuY29uc3QgREVMRVRFX0ZJTEUgPSAnKioqIERlbGV0ZSBGaWxlOiAnO1xuY29uc3QgVVBEQVRFX0ZJTEUgPSAnKioqIFVwZGF0ZSBGaWxlOiAnO1xuY29uc3QgTU9WRV9UTyA9ICcqKiogTW92ZSB0bzogJztcbmZ1bmN0aW9uIHRvRXJyb3JNZXNzYWdlKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yLm1lc3NhZ2UgfHwgZXJyb3IudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGVycm9yKTtcbiAgICB9XG4gICAgY2F0Y2gge1xuICAgICAgICByZXR1cm4gU3RyaW5nKGVycm9yKTtcbiAgICB9XG59XG5mdW5jdGlvbiByZW5kZXJJbWFnZUZvclRleHRUcmFuc3BvcnQob3V0cHV0KSB7XG4gICAgaWYgKHR5cGVvZiBvdXRwdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfVxuICAgIGNvbnN0IGltYWdlID0gb3V0cHV0LmltYWdlO1xuICAgIGlmICh0eXBlb2YgaW1hZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBpbWFnZTtcbiAgICB9XG4gICAgaWYgKCFpc1JlY29yZChpbWFnZSkpIHtcbiAgICAgICAgcmV0dXJuICdObyBpbWFnZSBkYXRhIHdhcyByZXR1cm5lZCBieSB0aGUgc2FuZGJveCBzZXNzaW9uLic7XG4gICAgfVxuICAgIGNvbnN0IGltYWdlUmVjb3JkID0gaW1hZ2U7XG4gICAgaWYgKHR5cGVvZiBpbWFnZVJlY29yZC51cmwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBpbWFnZVJlY29yZC51cmw7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgaW1hZ2VSZWNvcmQuZmlsZUlkID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gYE9wZW5BSSBmaWxlIHJlZmVyZW5jZTogJHtpbWFnZVJlY29yZC5maWxlSWR9YDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBpbWFnZVJlY29yZC5kYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBtZWRpYVR5cGUgPSB0eXBlb2YgaW1hZ2VSZWNvcmQubWVkaWFUeXBlID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyBpbWFnZVJlY29yZC5tZWRpYVR5cGVcbiAgICAgICAgICAgIDogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7XG4gICAgICAgIHJldHVybiBgZGF0YToke21lZGlhVHlwZX07YmFzZTY0LCR7aW1hZ2VSZWNvcmQuZGF0YX1gO1xuICAgIH1cbiAgICBpZiAoaW1hZ2VSZWNvcmQuZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgY29uc3QgbWVkaWFUeXBlID0gdHlwZW9mIGltYWdlUmVjb3JkLm1lZGlhVHlwZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgID8gaW1hZ2VSZWNvcmQubWVkaWFUeXBlXG4gICAgICAgICAgICA6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nO1xuICAgICAgICByZXR1cm4gYGRhdGE6JHttZWRpYVR5cGV9O2Jhc2U2NCwke2VuY29kZVVpbnQ4QXJyYXlUb0Jhc2U2NChpbWFnZVJlY29yZC5kYXRhKX1gO1xuICAgIH1cbiAgICByZXR1cm4gJ05vIGltYWdlIGRhdGEgd2FzIHJldHVybmVkIGJ5IHRoZSBzYW5kYm94IHNlc3Npb24uJztcbn1cbmZ1bmN0aW9uIHJlbmRlclZpZXdJbWFnZUVycm9yKHBhdGgsIGVycm9yKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IHRvRXJyb3JNZXNzYWdlKGVycm9yKTtcbiAgICBpZiAoL25vdCBmb3VuZC9pdS50ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICAgIHJldHVybiBgaW1hZ2UgcGF0aCBcXGAke3BhdGh9XFxgIHdhcyBub3QgZm91bmRgO1xuICAgIH1cbiAgICBpZiAoL25vdCBhIGZpbGUvaXUudGVzdChtZXNzYWdlKSkge1xuICAgICAgICByZXR1cm4gYGltYWdlIHBhdGggXFxgJHtwYXRofVxcYCBpcyBub3QgYSBmaWxlYDtcbiAgICB9XG4gICAgaWYgKC9leGNlZWRzIHRoZSAxMCBNQiBsaW1pdHxleGNlZWRlZCB0aGUgYWxsb3dlZCBzaXplL2l1LnRlc3QobWVzc2FnZSkpIHtcbiAgICAgICAgcmV0dXJuIGBpbWFnZSBwYXRoIFxcYCR7cGF0aH1cXGAgZXhjZWVkZWQgdGhlIGFsbG93ZWQgc2l6ZSBvZiAxME1COyByZXNpemUgb3IgY29tcHJlc3MgdGhlIGltYWdlIGFuZCB0cnkgYWdhaW5gO1xuICAgIH1cbiAgICBpZiAoL3Vuc3VwcG9ydGVkIGltYWdlIGZvcm1hdHxub3QgYSBzdXBwb3J0ZWQgaW1hZ2UvaXUudGVzdChtZXNzYWdlKSkge1xuICAgICAgICByZXR1cm4gYGltYWdlIHBhdGggXFxgJHtwYXRofVxcYCBpcyBub3QgYSBzdXBwb3J0ZWQgaW1hZ2UgZmlsZWA7XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubmFtZSA6IHR5cGVvZiBlcnJvcjtcbiAgICByZXR1cm4gYHVuYWJsZSB0byByZWFkIGltYWdlIGF0IFxcYCR7cGF0aH1cXGA6ICR7bmFtZX1gO1xufVxuZnVuY3Rpb24gcGFyc2VBcHBseVBhdGNoSW5wdXQocmF3SW5wdXQpIHtcbiAgICBjb25zdCB0cmltbWVkSW5wdXQgPSByYXdJbnB1dC50cmltU3RhcnQoKTtcbiAgICBpZiAodHJpbW1lZElucHV0LnN0YXJ0c1dpdGgoQkVHSU5fUEFUQ0gpKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUZyZWVmb3JtUGF0Y2godHJpbW1lZElucHV0KTtcbiAgICB9XG4gICAgbGV0IHBheWxvYWQ7XG4gICAgdHJ5IHtcbiAgICAgICAgcGF5bG9hZCA9IEpTT04ucGFyc2UocmF3SW5wdXQpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiBgSW52YWxpZCBhcHBseV9wYXRjaCBKU09OOiAke3RvRXJyb3JNZXNzYWdlKGVycm9yKX1gLFxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VBcHBseVBhdGNoUGF5bG9hZChwYXlsb2FkKTtcbn1cbmZ1bmN0aW9uIHBhcnNlQXBwbHlQYXRjaFBheWxvYWQocGF5bG9hZCkge1xuICAgIGlmICh0eXBlb2YgcGF5bG9hZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlRnJlZWZvcm1QYXRjaChwYXlsb2FkKTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGF5bG9hZCkpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlU3RydWN0dXJlZE9wZXJhdGlvbnMocGF5bG9hZCk7XG4gICAgfVxuICAgIGlmICghaXNSZWNvcmQocGF5bG9hZCkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiAnYXBwbHlfcGF0Y2ggaW5wdXQgbXVzdCBiZSBhbiBvYmplY3Qgb3IgYXJyYXkuJyxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwYXlsb2FkLnBhdGNoID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gcGFyc2VGcmVlZm9ybVBhdGNoKHBheWxvYWQucGF0Y2gpO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXlsb2FkLmNvbW1hbmQpKSB7XG4gICAgICAgIGNvbnN0IFtjb21tYW5kTmFtZSwgcGF0Y2hdID0gcGF5bG9hZC5jb21tYW5kO1xuICAgICAgICBpZiAoY29tbWFuZE5hbWUgPT09ICdhcHBseV9wYXRjaCcgJiYgdHlwZW9mIHBhdGNoID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlRnJlZWZvcm1QYXRjaChwYXRjaCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGF5bG9hZC5vcGVyYXRpb25zKSkge1xuICAgICAgICByZXR1cm4gcGFyc2VTdHJ1Y3R1cmVkT3BlcmF0aW9ucyhwYXlsb2FkLm9wZXJhdGlvbnMpO1xuICAgIH1cbiAgICBpZiAocGF5bG9hZC5vcGVyYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gcGFyc2VTdHJ1Y3R1cmVkT3BlcmF0aW9ucyhbcGF5bG9hZC5vcGVyYXRpb25dKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlU3RydWN0dXJlZE9wZXJhdGlvbnMoW3BheWxvYWRdKTtcbn1cbmZ1bmN0aW9uIHBhcnNlU3RydWN0dXJlZE9wZXJhdGlvbnMocGF5bG9hZHMpIHtcbiAgICBjb25zdCBvcGVyYXRpb25zID0gW107XG4gICAgZm9yIChjb25zdCBwYXlsb2FkIG9mIHBheWxvYWRzKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEFwcGx5UGF0Y2hPcGVyYXRpb24uc2FmZVBhcnNlKHBheWxvYWQpO1xuICAgICAgICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlcnJvcjogYEludmFsaWQgYXBwbHlfcGF0Y2ggb3BlcmF0aW9uOiAke3BhcnNlZC5lcnJvci5tZXNzYWdlfWAsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIG9wZXJhdGlvbnMucHVzaChwYXJzZWQuZGF0YSk7XG4gICAgfVxuICAgIGlmIChvcGVyYXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIGVycm9yOiAnYXBwbHlfcGF0Y2ggaW5wdXQgbXVzdCBpbmNsdWRlIGFuIG9wZXJhdGlvbi4nIH07XG4gICAgfVxuICAgIHJldHVybiB7IG9rOiB0cnVlLCBvcGVyYXRpb25zIH07XG59XG5mdW5jdGlvbiBwYXJzZUZyZWVmb3JtUGF0Y2gocmF3UGF0Y2gpIHtcbiAgICBjb25zdCBsaW5lcyA9IHJhd1BhdGNoLnNwbGl0KC9cXHI/XFxuLyk7XG4gICAgaWYgKGxpbmVzLmF0KC0xKSA9PT0gJycpIHtcbiAgICAgICAgbGluZXMucG9wKCk7XG4gICAgfVxuICAgIGlmIChsaW5lc1swXSAhPT0gQkVHSU5fUEFUQ0gpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiBgYXBwbHlfcGF0Y2ggaW5wdXQgbXVzdCBzdGFydCB3aXRoIFwiJHtCRUdJTl9QQVRDSH1cIi5gLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAobGluZXMubGVuZ3RoIDwgMiB8fCBsaW5lcy5hdCgtMSkgIT09IEVORF9QQVRDSCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6IGBhcHBseV9wYXRjaCBpbnB1dCBtdXN0IGVuZCB3aXRoIFwiJHtFTkRfUEFUQ0h9XCIuYCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29uc3Qgb3BlcmF0aW9ucyA9IFtdO1xuICAgIGxldCBpbmRleCA9IDE7XG4gICAgd2hpbGUgKGluZGV4IDwgbGluZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICBjb25zdCBsaW5lID0gbGluZXNbaW5kZXhdO1xuICAgICAgICBsZXQgcGFyc2VkO1xuICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKEFERF9GSUxFKSkge1xuICAgICAgICAgICAgcGFyc2VkID0gcGFyc2VBZGRGaWxlUGF0Y2gobGluZXMsIGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoREVMRVRFX0ZJTEUpKSB7XG4gICAgICAgICAgICBwYXJzZWQgPSBwYXJzZURlbGV0ZUZpbGVQYXRjaChsaW5lcywgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aChVUERBVEVfRklMRSkpIHtcbiAgICAgICAgICAgIHBhcnNlZCA9IHBhcnNlVXBkYXRlRmlsZVBhdGNoKGxpbmVzLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlcnJvcjogYEludmFsaWQgYXBwbHlfcGF0Y2ggZmlsZSBvcGVyYXRpb24gaGVhZGVyOiAke2xpbmV9YCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCdlcnJvcicgaW4gcGFyc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIGVycm9yOiBwYXJzZWQuZXJyb3IgfTtcbiAgICAgICAgfVxuICAgICAgICBvcGVyYXRpb25zLnB1c2gocGFyc2VkLm9wZXJhdGlvbik7XG4gICAgICAgIGluZGV4ID0gcGFyc2VkLm5leHRJbmRleDtcbiAgICB9XG4gICAgaWYgKG9wZXJhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogJ2FwcGx5X3BhdGNoIGlucHV0IG11c3QgaW5jbHVkZSBhdCBsZWFzdCBvbmUgZmlsZSBvcGVyYXRpb24uJyxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgb2s6IHRydWUsIG9wZXJhdGlvbnMgfTtcbn1cbmZ1bmN0aW9uIHBhcnNlQWRkRmlsZVBhdGNoKGxpbmVzLCBpbmRleCkge1xuICAgIGNvbnN0IHBhdGggPSBwYXJzZVBhdGNoSGVhZGVyKGxpbmVzW2luZGV4XSwgQUREX0ZJTEUpO1xuICAgIGlmICghcGF0aCkge1xuICAgICAgICByZXR1cm4geyBlcnJvcjogYE1pc3NpbmcgcGF0aCBpbiBhcHBseV9wYXRjaCBoZWFkZXI6ICR7bGluZXNbaW5kZXhdfWAgfTtcbiAgICB9XG4gICAgaW5kZXggKz0gMTtcbiAgICBjb25zdCBkaWZmTGluZXMgPSBbXTtcbiAgICB3aGlsZSAoaW5kZXggPCBsaW5lcy5sZW5ndGggLSAxICYmICFpc0ZpbGVPcGVyYXRpb25IZWFkZXIobGluZXNbaW5kZXhdKSkge1xuICAgICAgICBjb25zdCBsaW5lID0gbGluZXNbaW5kZXhdO1xuICAgICAgICBpZiAoIWxpbmUuc3RhcnRzV2l0aCgnKycpKSB7XG4gICAgICAgICAgICByZXR1cm4geyBlcnJvcjogYEludmFsaWQgQWRkIEZpbGUgbGluZTogJHtsaW5lfWAgfTtcbiAgICAgICAgfVxuICAgICAgICBkaWZmTGluZXMucHVzaChsaW5lKTtcbiAgICAgICAgaW5kZXggKz0gMTtcbiAgICB9XG4gICAgaWYgKGRpZmZMaW5lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVycm9yOiBgQWRkIEZpbGUgcGF0Y2ggZm9yICR7cGF0aH0gbXVzdCBpbmNsdWRlIGF0IGxlYXN0IG9uZSArIGxpbmUuYCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgb3BlcmF0aW9uOiB7XG4gICAgICAgICAgICB0eXBlOiAnY3JlYXRlX2ZpbGUnLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIGRpZmY6IGpvaW5EaWZmKGRpZmZMaW5lcyksXG4gICAgICAgIH0sXG4gICAgICAgIG5leHRJbmRleDogaW5kZXgsXG4gICAgfTtcbn1cbmZ1bmN0aW9uIHBhcnNlRGVsZXRlRmlsZVBhdGNoKGxpbmVzLCBpbmRleCkge1xuICAgIGNvbnN0IHBhdGggPSBwYXJzZVBhdGNoSGVhZGVyKGxpbmVzW2luZGV4XSwgREVMRVRFX0ZJTEUpO1xuICAgIGlmICghcGF0aCkge1xuICAgICAgICByZXR1cm4geyBlcnJvcjogYE1pc3NpbmcgcGF0aCBpbiBhcHBseV9wYXRjaCBoZWFkZXI6ICR7bGluZXNbaW5kZXhdfWAgfTtcbiAgICB9XG4gICAgaW5kZXggKz0gMTtcbiAgICBpZiAoaW5kZXggPCBsaW5lcy5sZW5ndGggLSAxICYmICFpc0ZpbGVPcGVyYXRpb25IZWFkZXIobGluZXNbaW5kZXhdKSkge1xuICAgICAgICByZXR1cm4geyBlcnJvcjogYERlbGV0ZSBGaWxlIHBhdGNoIGZvciAke3BhdGh9IG11c3Qgbm90IGluY2x1ZGUgYSBkaWZmLmAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgb3BlcmF0aW9uOiB7XG4gICAgICAgICAgICB0eXBlOiAnZGVsZXRlX2ZpbGUnLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgfSxcbiAgICAgICAgbmV4dEluZGV4OiBpbmRleCxcbiAgICB9O1xufVxuZnVuY3Rpb24gcGFyc2VVcGRhdGVGaWxlUGF0Y2gobGluZXMsIGluZGV4KSB7XG4gICAgY29uc3QgcGF0aCA9IHBhcnNlUGF0Y2hIZWFkZXIobGluZXNbaW5kZXhdLCBVUERBVEVfRklMRSk7XG4gICAgaWYgKCFwYXRoKSB7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBgTWlzc2luZyBwYXRoIGluIGFwcGx5X3BhdGNoIGhlYWRlcjogJHtsaW5lc1tpbmRleF19YCB9O1xuICAgIH1cbiAgICBpbmRleCArPSAxO1xuICAgIGxldCBtb3ZlVG87XG4gICAgaWYgKGluZGV4IDwgbGluZXMubGVuZ3RoIC0gMSAmJiBsaW5lc1tpbmRleF0uc3RhcnRzV2l0aChNT1ZFX1RPKSkge1xuICAgICAgICBjb25zdCBwYXJzZWRNb3ZlVG8gPSBwYXJzZVBhdGNoSGVhZGVyKGxpbmVzW2luZGV4XSwgTU9WRV9UTyk7XG4gICAgICAgIGlmICghcGFyc2VkTW92ZVRvKSB7XG4gICAgICAgICAgICByZXR1cm4geyBlcnJvcjogYE1pc3NpbmcgcGF0aCBpbiBhcHBseV9wYXRjaCBoZWFkZXI6ICR7bGluZXNbaW5kZXhdfWAgfTtcbiAgICAgICAgfVxuICAgICAgICBtb3ZlVG8gPSBwYXJzZWRNb3ZlVG87XG4gICAgICAgIGluZGV4ICs9IDE7XG4gICAgfVxuICAgIGNvbnN0IGRpZmZMaW5lcyA9IFtdO1xuICAgIHdoaWxlIChpbmRleCA8IGxpbmVzLmxlbmd0aCAtIDEgJiYgIWlzRmlsZU9wZXJhdGlvbkhlYWRlcihsaW5lc1tpbmRleF0pKSB7XG4gICAgICAgIGRpZmZMaW5lcy5wdXNoKGxpbmVzW2luZGV4XSk7XG4gICAgICAgIGluZGV4ICs9IDE7XG4gICAgfVxuICAgIGlmIChkaWZmTGluZXMubGVuZ3RoID09PSAwICYmICFtb3ZlVG8pIHtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IGBVcGRhdGUgRmlsZSBwYXRjaCBmb3IgJHtwYXRofSBtdXN0IGluY2x1ZGUgYSBodW5rLmAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgb3BlcmF0aW9uOiB7XG4gICAgICAgICAgICB0eXBlOiAndXBkYXRlX2ZpbGUnLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIGRpZmY6IGRpZmZMaW5lcy5sZW5ndGggPiAwID8gam9pbkRpZmYoZGlmZkxpbmVzKSA6ICcnLFxuICAgICAgICAgICAgLi4uKG1vdmVUbyA/IHsgbW92ZVRvIH0gOiB7fSksXG4gICAgICAgIH0sXG4gICAgICAgIG5leHRJbmRleDogaW5kZXgsXG4gICAgfTtcbn1cbmZ1bmN0aW9uIHBhcnNlUGF0Y2hIZWFkZXIobGluZSwgcHJlZml4KSB7XG4gICAgY29uc3QgcGF0aCA9IGxpbmUuc2xpY2UocHJlZml4Lmxlbmd0aCkudHJpbSgpO1xuICAgIHJldHVybiBwYXRoID8gcGF0aCA6IG51bGw7XG59XG5mdW5jdGlvbiBpc0ZpbGVPcGVyYXRpb25IZWFkZXIobGluZSkge1xuICAgIHJldHVybiAobGluZS5zdGFydHNXaXRoKEFERF9GSUxFKSB8fFxuICAgICAgICBsaW5lLnN0YXJ0c1dpdGgoREVMRVRFX0ZJTEUpIHx8XG4gICAgICAgIGxpbmUuc3RhcnRzV2l0aChVUERBVEVfRklMRSkpO1xufVxuZnVuY3Rpb24gam9pbkRpZmYobGluZXMpIHtcbiAgICByZXR1cm4gYCR7bGluZXMuam9pbignXFxuJyl9XFxuYDtcbn1cbmFzeW5jIGZ1bmN0aW9uIGFwcGx5UGF0Y2hPcGVyYXRpb24oZWRpdG9yLCBvcGVyYXRpb24sIHJ1bkNvbnRleHQpIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICAgIHN3aXRjaCAob3BlcmF0aW9uLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2NyZWF0ZV9maWxlJzpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBhd2FpdCBlZGl0b3IuY3JlYXRlRmlsZShvcGVyYXRpb24sIHsgcnVuQ29udGV4dCB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3VwZGF0ZV9maWxlJzpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBhd2FpdCBlZGl0b3IudXBkYXRlRmlsZShvcGVyYXRpb24sIHsgcnVuQ29udGV4dCB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RlbGV0ZV9maWxlJzpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBhd2FpdCBlZGl0b3IuZGVsZXRlRmlsZShvcGVyYXRpb24sIHsgcnVuQ29udGV4dCB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdVbnN1cHBvcnRlZCBhcHBseV9wYXRjaCBvcGVyYXRpb24uJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGBGYWlsZWQgdG8gYXBwbHkgcGF0Y2g6ICR7dG9FcnJvck1lc3NhZ2UoZXJyb3IpfWA7XG4gICAgfVxuICAgIGlmIChyZXN1bHQ/LnN0YXR1cyA9PT0gJ2ZhaWxlZCcpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5vdXRwdXQgPyBgUGF0Y2ggZmFpbGVkOiAke3Jlc3VsdC5vdXRwdXR9YCA6ICdQYXRjaCBmYWlsZWQuJztcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdD8ub3V0cHV0ID8/ICdQYXRjaCBhcHBsaWVkLic7XG59XG5hc3luYyBmdW5jdGlvbiBhcHBseVBhdGNoT3BlcmF0aW9ucyhlZGl0b3IsIG9wZXJhdGlvbnMsIHJ1bkNvbnRleHQpIHtcbiAgICBjb25zdCBvdXRwdXRzID0gW107XG4gICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBhcHBseVBhdGNoT3BlcmF0aW9uKGVkaXRvciwgb3BlcmF0aW9uLCBydW5Db250ZXh0KTtcbiAgICAgICAgaWYgKG91dHB1dCkge1xuICAgICAgICAgICAgb3V0cHV0cy5wdXNoKG91dHB1dCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dHMuam9pbignXFxuJykgfHwgJ1BhdGNoIGFwcGxpZWQuJztcbn1cbmZ1bmN0aW9uIGFwcGx5UGF0Y2hGdW5jdGlvblRvb2woZWRpdG9yKSB7XG4gICAgY29uc3QgZmFsbGJhY2tUb29sID0ge1xuICAgICAgICB0eXBlOiAnZnVuY3Rpb24nLFxuICAgICAgICBuYW1lOiAnYXBwbHlfcGF0Y2gnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ0FwcGxpZXMgYSBjcmVhdGUsIHVwZGF0ZSwgbW92ZSwgb3IgZGVsZXRlIGZpbGUgcGF0Y2ggaW4gdGhlIHNhbmRib3ggd29ya3NwYWNlLiBBY2NlcHRzIGEgZnJlZWZvcm0gcGF0Y2ggc3RyaW5nIG9yIHN0cnVjdHVyZWQgYXBwbHlfcGF0Y2ggb3BlcmF0aW9ucy4nLFxuICAgICAgICBwYXJhbWV0ZXJzOiBhcHBseVBhdGNoRnVuY3Rpb25QYXJhbWV0ZXJzLFxuICAgICAgICBzdHJpY3Q6IGZhbHNlLFxuICAgICAgICBkZWZlckxvYWRpbmc6IGZhbHNlLFxuICAgICAgICBuZWVkc0FwcHJvdmFsOiBhc3luYyAoKSA9PiBmYWxzZSxcbiAgICAgICAgaXNFbmFibGVkOiBhc3luYyAoKSA9PiB0cnVlLFxuICAgICAgICBpbnZva2U6IGFzeW5jIChydW5Db250ZXh0LCBpbnB1dCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VBcHBseVBhdGNoSW5wdXQoaW5wdXQpO1xuICAgICAgICAgICAgaWYgKCFwYXJzZWQub2spIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VkLmVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGFwcGx5UGF0Y2hPcGVyYXRpb25zKGVkaXRvciwgcGFyc2VkLm9wZXJhdGlvbnMsIHJ1bkNvbnRleHQpO1xuICAgICAgICB9LFxuICAgIH07XG4gICAgcmV0dXJuIGZhbGxiYWNrVG9vbDtcbn1cbmNsYXNzIEZpbGVzeXN0ZW1DYXBhYmlsaXR5IGV4dGVuZHMgQ2FwYWJpbGl0eSB7XG4gICAgdHlwZSA9ICdmaWxlc3lzdGVtJztcbiAgICBjb25maWd1cmVUb29scztcbiAgICBjb25zdHJ1Y3RvcihhcmdzID0ge30pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb25maWd1cmVUb29scyA9IGFyZ3MuY29uZmlndXJlVG9vbHM7XG4gICAgfVxuICAgIHRvb2xzKCkge1xuICAgICAgICBjb25zdCBzZXNzaW9uID0gcmVxdWlyZUJvdW5kU2Vzc2lvbih0aGlzLnR5cGUsIHRoaXMuX3Nlc3Npb24pO1xuICAgICAgICBjb25zdCBlZGl0b3IgPSBzZXNzaW9uLmNyZWF0ZUVkaXRvcj8uKHRoaXMuX3J1bkFzKTtcbiAgICAgICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ0ZpbGVzeXN0ZW0gc2FuZGJveCBzZXNzaW9ucyBtdXN0IHByb3ZpZGUgY3JlYXRlRWRpdG9yKCkuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG9vbHMgPSBbXTtcbiAgICAgICAgY29uc3Qgdmlld0ltYWdlID0gYXN5bmMgKHBhdGgpID0+IHtcbiAgICAgICAgICAgIGlmICghc2Vzc2lvbi52aWV3SW1hZ2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdGaWxlc3lzdGVtIHNhbmRib3ggc2Vzc2lvbnMgbXVzdCBwcm92aWRlIHZpZXdJbWFnZSgpLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgd2l0aFNhbmRib3hTcGFuKCdzYW5kYm94LnZpZXdfaW1hZ2UnLCB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHJ1bl9hczogdGhpcy5fcnVuQXMsXG4gICAgICAgICAgICAgICAgfSwgYXN5bmMgKCkgPT4gYXdhaXQgc2Vzc2lvbi52aWV3SW1hZ2Uoe1xuICAgICAgICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICAgICAgICBydW5BczogdGhpcy5fcnVuQXMsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlbmRlclZpZXdJbWFnZUVycm9yKHBhdGgsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHN1cHBvcnRzU3RydWN0dXJlZFRvb2xPdXRwdXRUcmFuc3BvcnQodGhpcy5fbW9kZWxJbnN0YW5jZSkpIHtcbiAgICAgICAgICAgIHRvb2xzLnB1c2godG9vbCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ3ZpZXdfaW1hZ2UnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnUmV0dXJucyBhbiBpbWFnZSBvdXRwdXQgZnJvbSBhIGxvY2FsIHBhdGggaW4gdGhlIHNhbmRib3ggd29ya3NwYWNlLicsXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyczogei5vYmplY3Qoe1xuICAgICAgICAgICAgICAgICAgICBwYXRoOiB6LnN0cmluZygpLmRlc2NyaWJlKCdMb2NhbCBmaWxlc3lzdGVtIHBhdGggdG8gYW4gaW1hZ2UgZmlsZScpLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IHBhdGgsIH0pID0+IGF3YWl0IHZpZXdJbWFnZShwYXRoKSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRvb2xzLnB1c2godG9vbCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ3ZpZXdfaW1hZ2UnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnUmV0dXJucyBhbiBpbWFnZSBmcm9tIGEgbG9jYWwgcGF0aCBpbiB0aGUgc2FuZGJveCB3b3Jrc3BhY2UgYXMgYSBkYXRhIFVSTCBvciByZWZlcmVuY2Ugc3RyaW5nLicsXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyczogei5vYmplY3Qoe1xuICAgICAgICAgICAgICAgICAgICBwYXRoOiB6LnN0cmluZygpLmRlc2NyaWJlKCdMb2NhbCBmaWxlc3lzdGVtIHBhdGggdG8gYW4gaW1hZ2UgZmlsZScpLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IHBhdGggfSkgPT4gcmVuZGVySW1hZ2VGb3JUZXh0VHJhbnNwb3J0KGF3YWl0IHZpZXdJbWFnZShwYXRoKSksXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN1cHBvcnRzQXBwbHlQYXRjaFRyYW5zcG9ydCh0aGlzLl9tb2RlbEluc3RhbmNlKSkge1xuICAgICAgICAgICAgdG9vbHMucHVzaChhcHBseVBhdGNoVG9vbCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2FwcGx5X3BhdGNoJyxcbiAgICAgICAgICAgICAgICBlZGl0b3IsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0b29scy5wdXNoKGFwcGx5UGF0Y2hGdW5jdGlvblRvb2woZWRpdG9yKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlndXJlVG9vbHMgPyB0aGlzLmNvbmZpZ3VyZVRvb2xzKFsuLi50b29sc10pIDogdG9vbHM7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGZpbGVzeXN0ZW0oYXJncyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBGaWxlc3lzdGVtQ2FwYWJpbGl0eShhcmdzKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZpbGVzeXN0ZW0ubWpzLm1hcCIsImltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuaW1wb3J0IHsgVXNlckVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9ycy5tanNcIjtcbmltcG9ydCB7IHRvb2wgfSBmcm9tIFwiLi4vLi4vdG9vbC5tanNcIjtcbmltcG9ydCB7IHdpdGhTYW5kYm94U3BhbiB9IGZyb20gXCIuLi9ydW50aW1lL3NwYW5zLm1qc1wiO1xuaW1wb3J0IHsgQ2FwYWJpbGl0eSwgcmVxdWlyZUJvdW5kU2Vzc2lvbiwgfSBmcm9tIFwiLi9iYXNlLm1qc1wiO1xuY29uc3QgREVGQVVMVF9FWEVDX1lJRUxEX1RJTUVfTVMgPSAxMF8wMDA7XG5jb25zdCBERUZBVUxUX1dSSVRFX1NURElOX1lJRUxEX1RJTUVfTVMgPSAyNTA7XG5jb25zdCBTSEVMTF9JTlNUUlVDVElPTlMgPSBbXG4gICAgJ1doZW4gdXNpbmcgdGhlIHNoZWxsOicsXG4gICAgJy0gVXNlIGBleGVjX2NvbW1hbmRgIGZvciBzaGVsbCBleGVjdXRpb24uJyxcbiAgICAnLSBJZiBhdmFpbGFibGUsIHVzZSBgd3JpdGVfc3RkaW5gIHRvIGludGVyYWN0IHdpdGggb3IgcG9sbCBydW5uaW5nIHNlc3Npb25zLicsXG4gICAgJy0gVG8gaW50ZXJydXB0IGEgbG9uZy1ydW5uaW5nIHByb2Nlc3MgdmlhIGB3cml0ZV9zdGRpbmAsIHN0YXJ0IGl0IHdpdGggYHR0eT10cnVlYCBhbmQgc2VuZCBDdHJsLUMgKGBcXFxcdTAwMDNgKS4nLFxuICAgICctIFByZWZlciBgcmdgIGFuZCBgcmcgLS1maWxlc2AgZm9yIHRleHQvZmlsZSBkaXNjb3Zlcnkgd2hlbiBhdmFpbGFibGUuJyxcbiAgICAnLSBBdm9pZCB1c2luZyBQeXRob24gc2NyaXB0cyBqdXN0IHRvIHByaW50IGxhcmdlIGZpbGUgY2h1bmtzLicsXG5dLmpvaW4oJ1xcbicpO1xuY2xhc3MgU2hlbGxDYXBhYmlsaXR5IGV4dGVuZHMgQ2FwYWJpbGl0eSB7XG4gICAgdHlwZSA9ICdzaGVsbCc7XG4gICAgY29uZmlndXJlVG9vbHM7XG4gICAgY29uc3RydWN0b3IoYXJncyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuY29uZmlndXJlVG9vbHMgPSBhcmdzLmNvbmZpZ3VyZVRvb2xzO1xuICAgIH1cbiAgICB0b29scygpIHtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IHJlcXVpcmVCb3VuZFNlc3Npb24odGhpcy50eXBlLCB0aGlzLl9zZXNzaW9uKTtcbiAgICAgICAgaWYgKCFzZXNzaW9uLmV4ZWNDb21tYW5kKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdTaGVsbCBzYW5kYm94IHNlc3Npb25zIG11c3QgcHJvdmlkZSBleGVjQ29tbWFuZCgpLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvb2xzID0gW1xuICAgICAgICAgICAgdG9vbCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2V4ZWNfY29tbWFuZCcsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdSdW5zIGEgY29tbWFuZCBpbiBhIFBUWSwgcmV0dXJuaW5nIG91dHB1dCBvciBhIHNlc3Npb24gSUQgZm9yIG9uZ29pbmcgaW50ZXJhY3Rpb24uJyxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB6Lm9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIGNtZDogei5zdHJpbmcoKS5taW4oMSkuZGVzY3JpYmUoJ1NoZWxsIGNvbW1hbmQgdG8gZXhlY3V0ZS4nKSxcbiAgICAgICAgICAgICAgICAgICAgd29ya2RpcjogelxuICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmluZygpXG4gICAgICAgICAgICAgICAgICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmRlc2NyaWJlKCdPcHRpb25hbCB3b3JraW5nIGRpcmVjdG9yeSB0byBydW4gdGhlIGNvbW1hbmQgaW47IGRlZmF1bHRzIHRvIHRoZSB0dXJuIGN3ZC4nKSxcbiAgICAgICAgICAgICAgICAgICAgc2hlbGw6IHpcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZXNjcmliZShcIlNoZWxsIGJpbmFyeSB0byBsYXVuY2guIERlZmF1bHRzIHRvIHRoZSB1c2VyJ3MgZGVmYXVsdCBzaGVsbC5cIiksXG4gICAgICAgICAgICAgICAgICAgIGxvZ2luOiB6XG4gICAgICAgICAgICAgICAgICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdCh0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmRlc2NyaWJlKCdXaGV0aGVyIHRvIHJ1biB0aGUgc2hlbGwgd2l0aCAtbC8taSBzZW1hbnRpY3MuIERlZmF1bHRzIHRvIHRydWUuJyksXG4gICAgICAgICAgICAgICAgICAgIHR0eTogelxuICAgICAgICAgICAgICAgICAgICAgICAgLmJvb2xlYW4oKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHQoZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGVzY3JpYmUoJ1doZXRoZXIgdG8gYWxsb2NhdGUgYSBUVFkgZm9yIHRoZSBjb21tYW5kLiBEZWZhdWx0cyB0byBmYWxzZSAocGxhaW4gcGlwZXMpOyBzZXQgdG8gdHJ1ZSB0byBvcGVuIGEgUFRZIGFuZCBhY2Nlc3MgVFRZIHByb2Nlc3MuJyksXG4gICAgICAgICAgICAgICAgICAgIHlpZWxkX3RpbWVfbXM6IHpcbiAgICAgICAgICAgICAgICAgICAgICAgIC5udW1iZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmludCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAubWluKDApXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdChERUZBVUxUX0VYRUNfWUlFTERfVElNRV9NUylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZXNjcmliZSgnSG93IGxvbmcgdG8gd2FpdCAoaW4gbWlsbGlzZWNvbmRzKSBmb3Igb3V0cHV0IGJlZm9yZSB5aWVsZGluZy4nKSxcbiAgICAgICAgICAgICAgICAgICAgbWF4X291dHB1dF90b2tlbnM6IHpcbiAgICAgICAgICAgICAgICAgICAgICAgIC5udW1iZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmludCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAubWluKDEpXG4gICAgICAgICAgICAgICAgICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmRlc2NyaWJlKCdNYXhpbXVtIG51bWJlciBvZiB0b2tlbnMgdG8gcmV0dXJuLiBFeGNlc3Mgb3V0cHV0IHdpbGwgYmUgdHJ1bmNhdGVkLicpLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IGNtZCwgd29ya2Rpciwgc2hlbGwsIGxvZ2luLCB0dHksIHlpZWxkX3RpbWVfbXMsIG1heF9vdXRwdXRfdG9rZW5zLCB9KSA9PiBhd2FpdCB3aXRoU2FuZGJveFNwYW4oJ3NhbmRib3guZXhlYycsIHtcbiAgICAgICAgICAgICAgICAgICAgY21kLFxuICAgICAgICAgICAgICAgICAgICB3b3JrZGlyLFxuICAgICAgICAgICAgICAgICAgICBzaGVsbCxcbiAgICAgICAgICAgICAgICAgICAgbG9naW4sXG4gICAgICAgICAgICAgICAgICAgIHR0eSxcbiAgICAgICAgICAgICAgICAgICAgcnVuX2FzOiB0aGlzLl9ydW5BcyxcbiAgICAgICAgICAgICAgICB9LCBhc3luYyAoKSA9PiBhd2FpdCBzZXNzaW9uLmV4ZWNDb21tYW5kKHtcbiAgICAgICAgICAgICAgICAgICAgY21kLFxuICAgICAgICAgICAgICAgICAgICB3b3JrZGlyLFxuICAgICAgICAgICAgICAgICAgICBzaGVsbCxcbiAgICAgICAgICAgICAgICAgICAgbG9naW4sXG4gICAgICAgICAgICAgICAgICAgIHR0eSxcbiAgICAgICAgICAgICAgICAgICAgeWllbGRUaW1lTXM6IHlpZWxkX3RpbWVfbXMsXG4gICAgICAgICAgICAgICAgICAgIG1heE91dHB1dFRva2VuczogbWF4X291dHB1dF90b2tlbnMsXG4gICAgICAgICAgICAgICAgICAgIHJ1bkFzOiB0aGlzLl9ydW5BcyxcbiAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKHNlc3Npb24uc3VwcG9ydHNQdHk/LigpICYmIHNlc3Npb24ud3JpdGVTdGRpbikge1xuICAgICAgICAgICAgdG9vbHMucHVzaCh0b29sKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnd3JpdGVfc3RkaW4nLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnV3JpdGVzIGNoYXJhY3RlcnMgdG8gYW4gZXhpc3RpbmcgdW5pZmllZCBleGVjIHNlc3Npb24gYW5kIHJldHVybnMgcmVjZW50IG91dHB1dC4nLFxuICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IHoub2JqZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbl9pZDogelxuICAgICAgICAgICAgICAgICAgICAgICAgLm51bWJlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAuaW50KClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZXNjcmliZSgnSWRlbnRpZmllciBvZiB0aGUgcnVubmluZyB1bmlmaWVkIGV4ZWMgc2Vzc2lvbi4nKSxcbiAgICAgICAgICAgICAgICAgICAgY2hhcnM6IHpcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHQoJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGVzY3JpYmUoJ0J5dGVzIHRvIHdyaXRlIHRvIHN0ZGluIChtYXkgYmUgZW1wdHkgdG8gcG9sbCkuJyksXG4gICAgICAgICAgICAgICAgICAgIHlpZWxkX3RpbWVfbXM6IHpcbiAgICAgICAgICAgICAgICAgICAgICAgIC5udW1iZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmludCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAubWluKDApXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdChERUZBVUxUX1dSSVRFX1NURElOX1lJRUxEX1RJTUVfTVMpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGVzY3JpYmUoJ0hvdyBsb25nIHRvIHdhaXQgKGluIG1pbGxpc2Vjb25kcykgZm9yIG91dHB1dCBiZWZvcmUgeWllbGRpbmcuJyksXG4gICAgICAgICAgICAgICAgICAgIG1heF9vdXRwdXRfdG9rZW5zOiB6XG4gICAgICAgICAgICAgICAgICAgICAgICAubnVtYmVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5pbnQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1pbigxKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZXNjcmliZSgnTWF4aW11bSBudW1iZXIgb2YgdG9rZW5zIHRvIHJldHVybi4gRXhjZXNzIG91dHB1dCB3aWxsIGJlIHRydW5jYXRlZC4nKSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBleGVjdXRlOiBhc3luYyAoeyBzZXNzaW9uX2lkLCBjaGFycywgeWllbGRfdGltZV9tcywgbWF4X291dHB1dF90b2tlbnMsIH0pID0+IGF3YWl0IHdpdGhTYW5kYm94U3Bhbignc2FuZGJveC53cml0ZV9zdGRpbicsIHtcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbl9pZCxcbiAgICAgICAgICAgICAgICB9LCBhc3luYyAoKSA9PiBhd2FpdCBzZXNzaW9uLndyaXRlU3RkaW4oe1xuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQ6IHNlc3Npb25faWQsXG4gICAgICAgICAgICAgICAgICAgIGNoYXJzLFxuICAgICAgICAgICAgICAgICAgICB5aWVsZFRpbWVNczogeWllbGRfdGltZV9tcyxcbiAgICAgICAgICAgICAgICAgICAgbWF4T3V0cHV0VG9rZW5zOiBtYXhfb3V0cHV0X3Rva2VucyxcbiAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlndXJlVG9vbHMgPyB0aGlzLmNvbmZpZ3VyZVRvb2xzKFsuLi50b29sc10pIDogdG9vbHM7XG4gICAgfVxuICAgIGluc3RydWN0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIFNIRUxMX0lOU1RSVUNUSU9OUztcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gc2hlbGwoYXJncyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBTaGVsbENhcGFiaWxpdHkoYXJncyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaGVsbC5tanMubWFwIiwiaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5pbXBvcnQgeyB0b29sIH0gZnJvbSBcIi4uLy4uL3Rvb2wubWpzXCI7XG5pbXBvcnQgeyBkaXIsIGZpbGUsIGlzRGlyLCBpc0RpcmVjdG9yeUxpa2VFbnRyeSwgfSBmcm9tIFwiLi4vZW50cmllcy9pbmRleC5tanNcIjtcbmltcG9ydCB7IFNhbmRib3hTa2lsbHNDb25maWdFcnJvciB9IGZyb20gXCIuLi9lcnJvcnMubWpzXCI7XG5pbXBvcnQgeyBub3JtYWxpemVSZWxhdGl2ZVBhdGggfSBmcm9tIFwiLi4vbWFuaWZlc3QubWpzXCI7XG5pbXBvcnQgeyBwcm9tcHQgfSBmcm9tIFwiLi4vcnVudGltZS9wcm9tcHRzLm1qc1wiO1xuaW1wb3J0IHsgQ2FwYWJpbGl0eSwgcmVxdWlyZUJvdW5kU2Vzc2lvbiB9IGZyb20gXCIuL2Jhc2UubWpzXCI7XG5jbGFzcyBTa2lsbHNDYXBhYmlsaXR5IGV4dGVuZHMgQ2FwYWJpbGl0eSB7XG4gICAgdHlwZSA9ICdza2lsbHMnO1xuICAgIHNraWxscztcbiAgICBmcm9tO1xuICAgIGxhenlGcm9tO1xuICAgIGluZGV4O1xuICAgIHNraWxsc1BhdGg7XG4gICAgY29uc3RydWN0b3IoYXJncykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNraWxscyA9IGFyZ3Muc2tpbGxzID8/IFtdO1xuICAgICAgICB0aGlzLmZyb20gPSBhcmdzLmZyb207XG4gICAgICAgIHRoaXMubGF6eUZyb20gPSBhcmdzLmxhenlGcm9tO1xuICAgICAgICB0aGlzLmluZGV4ID0gYXJncy5pbmRleDtcbiAgICAgICAgdGhpcy5za2lsbHNQYXRoID0gbm9ybWFsaXplUmVsYXRpdmVQYXRoKGFyZ3Muc2tpbGxzUGF0aCA/PyAnLmFnZW50cycpO1xuICAgICAgICB2YWxpZGF0ZVNraWxsc0NhcGFiaWxpdHkodGhpcyk7XG4gICAgfVxuICAgIHRvb2xzKCkge1xuICAgICAgICBpZiAoIXRoaXMubGF6eUZyb20pIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXNzaW9uID0gcmVxdWlyZUJvdW5kU2Vzc2lvbih0aGlzLnR5cGUsIHRoaXMuX3Nlc3Npb24pO1xuICAgICAgICBpZiAoIXNlc3Npb24ucGF0aEV4aXN0cyB8fCAhc2Vzc2lvbi5tYXRlcmlhbGl6ZUVudHJ5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgU2FuZGJveFNraWxsc0NvbmZpZ0Vycm9yKCdTa2lsbHMgc2FuZGJveCBzZXNzaW9ucyBtdXN0IHByb3ZpZGUgcGF0aEV4aXN0cygpIGFuZCBtYXRlcmlhbGl6ZUVudHJ5KCkuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHRvb2woe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdsb2FkX3NraWxsJyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0xvYWQgYSBzaW5nbGUgbGF6aWx5IGNvbmZpZ3VyZWQgc2tpbGwgaW50byB0aGUgc2FuZGJveCBzbyBpdHMgU0tJTEwubWQsIHNjcmlwdHMsIHJlZmVyZW5jZXMsIGFuZCBhc3NldHMgY2FuIGJlIHJlYWQgZnJvbSB0aGUgd29ya3NwYWNlLicsXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyczogei5vYmplY3Qoe1xuICAgICAgICAgICAgICAgICAgICBza2lsbF9uYW1lOiB6XG4gICAgICAgICAgICAgICAgICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5taW4oMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZXNjcmliZSgnTmFtZSBvZiB0aGUgbGF6aWx5IGNvbmZpZ3VyZWQgc2tpbGwgdG8gbWF0ZXJpYWxpemUuJyksXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgc2tpbGxfbmFtZSwgfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IHJlc29sdmVMYXp5U2tpbGxNYXRjaCh0aGlzLCBza2lsbF9uYW1lLCBzZXNzaW9uLnN0YXRlLm1hbmlmZXN0KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVsYXRpdmVTa2lsbFBhdGggPSBub3JtYWxpemVSZWxhdGl2ZVBhdGgobWF0Y2gucGF0aCA/PyBtYXRjaC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb25QYXRoID0gam9pblJlbGF0aXZlUGF0aHModGhpcy5za2lsbHNQYXRoLCByZWxhdGl2ZVNraWxsUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNraWxsTWFya2Rvd25QYXRoID0gam9pblJlbGF0aXZlUGF0aHMoZGVzdGluYXRpb25QYXRoLCAnU0tJTEwubWQnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF3YWl0IHNlc3Npb24ucGF0aEV4aXN0cyhza2lsbE1hcmtkb3duUGF0aCwgdGhpcy5fcnVuQXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogJ2FscmVhZHlfbG9hZGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lsbF9uYW1lOiBtYXRjaC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGRlc3RpbmF0aW9uUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgc2Vzc2lvbi5tYXRlcmlhbGl6ZUVudHJ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGRlc3RpbmF0aW9uUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5OiByZXNvbHZlTGF6eVNraWxsRW50cnkodGhpcy5sYXp5RnJvbS5zb3VyY2UsIHJlbGF0aXZlU2tpbGxQYXRoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkFzOiB0aGlzLl9ydW5BcyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdsb2FkZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2tpbGxfbmFtZTogbWF0Y2gubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGRlc3RpbmF0aW9uUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgIF07XG4gICAgfVxuICAgIHByb2Nlc3NNYW5pZmVzdChtYW5pZmVzdCkge1xuICAgICAgICBjb25zdCBleGlzdGluZ1BhdGhzID0gbmV3IFNldChPYmplY3Qua2V5cyhtYW5pZmVzdC5lbnRyaWVzKS5tYXAoKHBhdGgpID0+IG5vcm1hbGl6ZVJlbGF0aXZlUGF0aChwYXRoKSkpO1xuICAgICAgICBpZiAodGhpcy5sYXp5RnJvbSkge1xuICAgICAgICAgICAgY29uc3Qgb3ZlcmxhcHMgPSBbLi4uZXhpc3RpbmdQYXRoc11cbiAgICAgICAgICAgICAgICAuZmlsdGVyKChwYXRoKSA9PiBwYXRoc092ZXJsYXAocGF0aCwgdGhpcy5za2lsbHNQYXRoKSlcbiAgICAgICAgICAgICAgICAuc29ydCgpO1xuICAgICAgICAgICAgaWYgKG92ZXJsYXBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2FuZGJveFNraWxsc0NvbmZpZ0Vycm9yKGBza2lsbHMgbGF6eUZyb20gcGF0aCBvdmVybGFwcyBleGlzdGluZyBtYW5pZmVzdCBlbnRyaWVzOiAke292ZXJsYXBzLmpvaW4oJywgJyl9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbWFuaWZlc3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZnJvbSkge1xuICAgICAgICAgICAgY29uc3Qgb3ZlcmxhcCA9IFsuLi5leGlzdGluZ1BhdGhzXS5maW5kKChwYXRoKSA9PiBwYXRoc092ZXJsYXAocGF0aCwgdGhpcy5za2lsbHNQYXRoKSk7XG4gICAgICAgICAgICBpZiAob3ZlcmxhcCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBTYW5kYm94U2tpbGxzQ29uZmlnRXJyb3IoYHNraWxscyBwYXRoIG92ZXJsYXBzIGV4aXN0aW5nIG1hbmlmZXN0IGVudHJpZXM6ICR7b3ZlcmxhcH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1hbmlmZXN0LmVudHJpZXNbdGhpcy5za2lsbHNQYXRoXSA9IHRoaXMuZnJvbTtcbiAgICAgICAgICAgIHJldHVybiBtYW5pZmVzdDtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHNraWxsIG9mIHRoaXMuc2tpbGxzKSB7XG4gICAgICAgICAgICBjb25zdCBza2lsbFBhdGggPSBqb2luUmVsYXRpdmVQYXRocyh0aGlzLnNraWxsc1BhdGgsIHNraWxsLm5hbWUpO1xuICAgICAgICAgICAgY29uc3Qgb3ZlcmxhcCA9IFsuLi5leGlzdGluZ1BhdGhzXS5maW5kKChwYXRoKSA9PiBwYXRoc092ZXJsYXAocGF0aCwgc2tpbGxQYXRoKSk7XG4gICAgICAgICAgICBpZiAob3ZlcmxhcCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBTYW5kYm94U2tpbGxzQ29uZmlnRXJyb3IoYHNraWxsIHBhdGggb3ZlcmxhcHMgZXhpc3RpbmcgbWFuaWZlc3QgZW50cmllczogJHtza2lsbFBhdGh9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtYW5pZmVzdC5lbnRyaWVzW3NraWxsUGF0aF0gPSByZW5kZXJTa2lsbERlc2NyaXB0b3Ioc2tpbGwpO1xuICAgICAgICAgICAgZXhpc3RpbmdQYXRocy5hZGQoc2tpbGxQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWFuaWZlc3Q7XG4gICAgfVxuICAgIGFzeW5jIGluc3RydWN0aW9ucyhtYW5pZmVzdCkge1xuICAgICAgICBjb25zdCBtZXRhZGF0YSA9IHJlc29sdmVTa2lsbHNNZXRhZGF0YSh0aGlzLCBhd2FpdCB0aGlzLnJlc29sdmVSdW50aW1lTWV0YWRhdGEobWFuaWZlc3QpLCBtYW5pZmVzdCk7XG4gICAgICAgIGlmIChtZXRhZGF0YS5sZW5ndGggPT09IDAgJiYgdGhpcy5mcm9tKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVuZGVyU2tpbGxzRGlzY292ZXJ5SW5zdHJ1Y3Rpb25zKHRoaXMuc2tpbGxzUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlbmRlclNraWxsc0luc3RydWN0aW9ucyh7XG4gICAgICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgICAgIGxhenk6IEJvb2xlYW4odGhpcy5sYXp5RnJvbSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyByZXNvbHZlUnVudGltZU1ldGFkYXRhKF9tYW5pZmVzdCkge1xuICAgICAgICBpZiAoIXRoaXMuZnJvbSB8fCAhdGhpcy5fc2Vzc2lvbj8ubGlzdERpciB8fCAhdGhpcy5fc2Vzc2lvbi5yZWFkRmlsZSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGxldCBlbnRyaWVzO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZW50cmllcyA9IGF3YWl0IHRoaXMuX3Nlc3Npb24ubGlzdERpcih7XG4gICAgICAgICAgICAgICAgcGF0aDogdGhpcy5za2lsbHNQYXRoLFxuICAgICAgICAgICAgICAgIHJ1bkFzOiB0aGlzLl9ydW5BcyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXRhZGF0YSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS50eXBlICE9PSAnZGlyJykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNvbnRlbnQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBhd2FpdCB0aGlzLl9zZXNzaW9uLnJlYWRGaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogam9pblJlbGF0aXZlUGF0aHMoZW50cnkucGF0aCwgJ1NLSUxMLm1kJyksXG4gICAgICAgICAgICAgICAgICAgIHJ1bkFzOiB0aGlzLl9ydW5BcyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG1hcmtkb3duID0gdHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgPyBjb250ZW50XG4gICAgICAgICAgICAgICAgOiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoY29udGVudCk7XG4gICAgICAgICAgICBjb25zdCBmcm9udG1hdHRlciA9IHBhcnNlU2tpbGxGcm9udG1hdHRlcihtYXJrZG93bik7XG4gICAgICAgICAgICBtZXRhZGF0YS5wdXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBmcm9udG1hdHRlci5uYW1lID8/IGVudHJ5Lm5hbWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGZyb250bWF0dGVyLmRlc2NyaXB0aW9uID8/ICdObyBkZXNjcmlwdGlvbiBwcm92aWRlZC4nLFxuICAgICAgICAgICAgICAgIHBhdGg6IGVudHJ5Lm5hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWV0YWRhdGE7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHNraWxscyhhcmdzKSB7XG4gICAgcmV0dXJuIG5ldyBTa2lsbHNDYXBhYmlsaXR5KGFyZ3MpO1xufVxuY29uc3QgU0tJTExTX1NFQ1RJT05fSU5UUk8gPSBwcm9tcHQgYFxuQSBza2lsbCBpcyBhIHNldCBvZiBsb2NhbCBpbnN0cnVjdGlvbnMgdG8gZm9sbG93IHRoYXQgaXMgc3RvcmVkIGluIGEgXFxgU0tJTEwubWRcXGAgZmlsZS4gQmVsb3cgaXMgdGhlIGxpc3Qgb2Ygc2tpbGxzIHRoYXQgY2FuIGJlIHVzZWQuIEVhY2ggZW50cnkgaW5jbHVkZXMgYSBuYW1lLCBkZXNjcmlwdGlvbiwgYW5kIGZpbGUgcGF0aCBzbyB5b3UgY2FuIG9wZW4gdGhlIHNvdXJjZSBmb3IgZnVsbCBpbnN0cnVjdGlvbnMgd2hlbiB1c2luZyBhIHNwZWNpZmljIHNraWxsLlxuYDtcbmNvbnN0IEhPV19UT19VU0VfU0tJTExTX1NFQ1RJT04gPSBwcm9tcHQgYFxuIyMjIEhvdyB0byB1c2Ugc2tpbGxzXG4tIERpc2NvdmVyeTogVGhlIGxpc3QgYWJvdmUgaXMgdGhlIHNraWxscyBhdmFpbGFibGUgaW4gdGhpcyBzZXNzaW9uIChuYW1lICsgZGVzY3JpcHRpb24gKyBmaWxlIHBhdGgpLiBTa2lsbCBib2RpZXMgbGl2ZSBvbiBkaXNrIGF0IHRoZSBsaXN0ZWQgcGF0aHMuXG4tIFRyaWdnZXIgcnVsZXM6IElmIHRoZSB1c2VyIG5hbWVzIGEgc2tpbGwgKHdpdGggXFxgJFNraWxsTmFtZVxcYCBvciBwbGFpbiB0ZXh0KSBPUiB0aGUgdGFzayBjbGVhcmx5IG1hdGNoZXMgYSBza2lsbCdzIGRlc2NyaXB0aW9uIHNob3duIGFib3ZlLCB5b3UgbXVzdCB1c2UgdGhhdCBza2lsbCBmb3IgdGhhdCB0dXJuLiBNdWx0aXBsZSBtZW50aW9ucyBtZWFuIHVzZSB0aGVtIGFsbC4gRG8gbm90IGNhcnJ5IHNraWxscyBhY3Jvc3MgdHVybnMgdW5sZXNzIHJlLW1lbnRpb25lZC5cbi0gTWlzc2luZy9ibG9ja2VkOiBJZiBhIG5hbWVkIHNraWxsIGlzbid0IGluIHRoZSBsaXN0IG9yIHRoZSBwYXRoIGNhbid0IGJlIHJlYWQsIHNheSBzbyBicmllZmx5IGFuZCBjb250aW51ZSB3aXRoIHRoZSBiZXN0IGZhbGxiYWNrLlxuLSBIb3cgdG8gdXNlIGEgc2tpbGwgKHByb2dyZXNzaXZlIGRpc2Nsb3N1cmUpOlxuICAxKSBBZnRlciBkZWNpZGluZyB0byB1c2UgYSBza2lsbCwgb3BlbiBpdHMgXFxgU0tJTEwubWRcXGAuIFJlYWQgb25seSBlbm91Z2ggdG8gZm9sbG93IHRoZSB3b3JrZmxvdy5cbiAgMikgSWYgXFxgU0tJTEwubWRcXGAgcG9pbnRzIHRvIGV4dHJhIGZvbGRlcnMgc3VjaCBhcyBcXGByZWZlcmVuY2VzL1xcYCwgbG9hZCBvbmx5IHRoZSBzcGVjaWZpYyBmaWxlcyBuZWVkZWQgZm9yIHRoZSByZXF1ZXN0OyBkb24ndCBidWxrLWxvYWQgZXZlcnl0aGluZy5cbiAgMykgSWYgXFxgc2NyaXB0cy9cXGAgZXhpc3QsIHByZWZlciBydW5uaW5nIG9yIHBhdGNoaW5nIHRoZW0gaW5zdGVhZCBvZiByZXR5cGluZyBsYXJnZSBjb2RlIGJsb2Nrcy5cbiAgNCkgSWYgXFxgYXNzZXRzL1xcYCBvciB0ZW1wbGF0ZXMgZXhpc3QsIHJldXNlIHRoZW0gaW5zdGVhZCBvZiByZWNyZWF0aW5nIGZyb20gc2NyYXRjaC5cbi0gQ29vcmRpbmF0aW9uIGFuZCBzZXF1ZW5jaW5nOlxuICAtIElmIG11bHRpcGxlIHNraWxscyBhcHBseSwgY2hvb3NlIHRoZSBtaW5pbWFsIHNldCB0aGF0IGNvdmVycyB0aGUgcmVxdWVzdCBhbmQgc3RhdGUgdGhlIG9yZGVyIHlvdSdsbCB1c2UgdGhlbS5cbiAgLSBBbm5vdW5jZSB3aGljaCBza2lsbChzKSB5b3UncmUgdXNpbmcgYW5kIHdoeSAob25lIHNob3J0IGxpbmUpLiBJZiB5b3Ugc2tpcCBhbiBvYnZpb3VzIHNraWxsLCBzYXkgd2h5LlxuLSBDb250ZXh0IGh5Z2llbmU6XG4gIC0gS2VlcCBjb250ZXh0IHNtYWxsOiBzdW1tYXJpemUgbG9uZyBzZWN0aW9ucyBpbnN0ZWFkIG9mIHBhc3RpbmcgdGhlbTsgb25seSBsb2FkIGV4dHJhIGZpbGVzIHdoZW4gbmVlZGVkLlxuICAtIEF2b2lkIGRlZXAgcmVmZXJlbmNlLWNoYXNpbmc6IHByZWZlciBvcGVuaW5nIG9ubHkgZmlsZXMgZGlyZWN0bHkgbGlua2VkIGZyb20gXFxgU0tJTEwubWRcXGAgdW5sZXNzIHlvdSdyZSBibG9ja2VkLlxuICAtIFdoZW4gdmFyaWFudHMgZXhpc3QgKGZyYW1ld29ya3MsIHByb3ZpZGVycywgZG9tYWlucyksIHBpY2sgb25seSB0aGUgcmVsZXZhbnQgcmVmZXJlbmNlIGZpbGUocykgYW5kIG5vdGUgdGhhdCBjaG9pY2UuXG4tIFNhZmV0eSBhbmQgZmFsbGJhY2s6IElmIGEgc2tpbGwgY2FuJ3QgYmUgYXBwbGllZCBjbGVhbmx5IChtaXNzaW5nIGZpbGVzLCB1bmNsZWFyIGluc3RydWN0aW9ucyksIHN0YXRlIHRoZSBpc3N1ZSwgcGljayB0aGUgbmV4dC1iZXN0IGFwcHJvYWNoLCBhbmQgY29udGludWUuXG5gO1xuY29uc3QgSE9XX1RPX1VTRV9MQVpZX1NLSUxMU19TRUNUSU9OID0gcHJvbXB0IGBcbiMjIyBIb3cgdG8gdXNlIHNraWxsc1xuLSBEaXNjb3Zlcnk6IFRoZSBsaXN0IGFib3ZlIGlzIHRoZSBza2lsbCBpbmRleCBhdmFpbGFibGUgaW4gdGhpcyBzZXNzaW9uIChuYW1lICsgZGVzY3JpcHRpb24gKyB3b3Jrc3BhY2UgcGF0aCkuIEluIGxhenkgbW9kZSwgdGhvc2UgcGF0aHMgYXJlIGxvYWRlZCBvbiBkZW1hbmQgaW5zdGVhZCBvZiBiZWluZyBwcmVzZW50IHVwIGZyb250LlxuLSBUcmlnZ2VyIHJ1bGVzOiBJZiB0aGUgdXNlciBuYW1lcyBhIHNraWxsICh3aXRoIFxcYCRTa2lsbE5hbWVcXGAgb3IgcGxhaW4gdGV4dCkgT1IgdGhlIHRhc2sgY2xlYXJseSBtYXRjaGVzIGEgc2tpbGwncyBkZXNjcmlwdGlvbiBzaG93biBhYm92ZSwgeW91IG11c3QgdXNlIHRoYXQgc2tpbGwgZm9yIHRoYXQgdHVybi4gTXVsdGlwbGUgbWVudGlvbnMgbWVhbiB1c2UgdGhlbSBhbGwuIERvIG5vdCBjYXJyeSBza2lsbHMgYWNyb3NzIHR1cm5zIHVubGVzcyByZS1tZW50aW9uZWQuXG4tIE1pc3NpbmcvYmxvY2tlZDogSWYgYSBuYW1lZCBza2lsbCBpc24ndCBpbiB0aGUgbGlzdCBvciB0aGUgcGF0aCBjYW4ndCBiZSByZWFkLCBzYXkgc28gYnJpZWZseSBhbmQgY29udGludWUgd2l0aCB0aGUgYmVzdCBmYWxsYmFjay5cbi0gSG93IHRvIHVzZSBhIHNraWxsIChwcm9ncmVzc2l2ZSBkaXNjbG9zdXJlKTpcbiAgMSkgQWZ0ZXIgZGVjaWRpbmcgdG8gdXNlIGEgbGF6eSBza2lsbCwgY2FsbCBcXGBsb2FkX3NraWxsXFxgIGZvciB0aGF0IHNraWxsIGZpcnN0LCB0aGVuIG9wZW4gaXRzIFxcYFNLSUxMLm1kXFxgLlxuICAyKSBJZiBcXGBTS0lMTC5tZFxcYCBwb2ludHMgdG8gZXh0cmEgZm9sZGVycyBzdWNoIGFzIFxcYHJlZmVyZW5jZXMvXFxgLCBsb2FkIG9ubHkgdGhlIHNwZWNpZmljIGZpbGVzIG5lZWRlZCBmb3IgdGhlIHJlcXVlc3Q7IGRvbid0IGJ1bGstbG9hZCBldmVyeXRoaW5nLlxuICAzKSBJZiBcXGBzY3JpcHRzL1xcYCBleGlzdCwgcHJlZmVyIHJ1bm5pbmcgb3IgcGF0Y2hpbmcgdGhlbSBpbnN0ZWFkIG9mIHJldHlwaW5nIGxhcmdlIGNvZGUgYmxvY2tzLlxuICA0KSBJZiBcXGBhc3NldHMvXFxgIG9yIHRlbXBsYXRlcyBleGlzdCwgcmV1c2UgdGhlbSBpbnN0ZWFkIG9mIHJlY3JlYXRpbmcgZnJvbSBzY3JhdGNoLlxuLSBDb29yZGluYXRpb24gYW5kIHNlcXVlbmNpbmc6XG4gIC0gSWYgbXVsdGlwbGUgc2tpbGxzIGFwcGx5LCBjaG9vc2UgdGhlIG1pbmltYWwgc2V0IHRoYXQgY292ZXJzIHRoZSByZXF1ZXN0IGFuZCBzdGF0ZSB0aGUgb3JkZXIgeW91J2xsIHVzZSB0aGVtLlxuICAtIEFubm91bmNlIHdoaWNoIHNraWxsKHMpIHlvdSdyZSB1c2luZyBhbmQgd2h5IChvbmUgc2hvcnQgbGluZSkuIElmIHlvdSBza2lwIGFuIG9idmlvdXMgc2tpbGwsIHNheSB3aHkuXG4tIENvbnRleHQgaHlnaWVuZTpcbiAgLSBLZWVwIGNvbnRleHQgc21hbGw6IHN1bW1hcml6ZSBsb25nIHNlY3Rpb25zIGluc3RlYWQgb2YgcGFzdGluZyB0aGVtOyBvbmx5IGxvYWQgZXh0cmEgZmlsZXMgd2hlbiBuZWVkZWQuXG4gIC0gQXZvaWQgZGVlcCByZWZlcmVuY2UtY2hhc2luZzogcHJlZmVyIG9wZW5pbmcgb25seSBmaWxlcyBkaXJlY3RseSBsaW5rZWQgZnJvbSBcXGBTS0lMTC5tZFxcYCB1bmxlc3MgeW91J3JlIGJsb2NrZWQuXG4gIC0gV2hlbiB2YXJpYW50cyBleGlzdCAoZnJhbWV3b3JrcywgcHJvdmlkZXJzLCBkb21haW5zKSwgcGljayBvbmx5IHRoZSByZWxldmFudCByZWZlcmVuY2UgZmlsZShzKSBhbmQgbm90ZSB0aGF0IGNob2ljZS5cbi0gU2FmZXR5IGFuZCBmYWxsYmFjazogSWYgYSBza2lsbCBjYW4ndCBiZSBhcHBsaWVkIGNsZWFubHkgKG1pc3NpbmcgZmlsZXMsIHVuY2xlYXIgaW5zdHJ1Y3Rpb25zKSwgc3RhdGUgdGhlIGlzc3VlLCBwaWNrIHRoZSBuZXh0LWJlc3QgYXBwcm9hY2gsIGFuZCBjb250aW51ZS5cbmA7XG5mdW5jdGlvbiB2YWxpZGF0ZVNraWxsc0NhcGFiaWxpdHkoY2FwYWJpbGl0eSkge1xuICAgIGNvbnN0IGNvbmZpZ3VyZWRTb3VyY2VzID0gW1xuICAgICAgICBjYXBhYmlsaXR5LnNraWxscy5sZW5ndGggPiAwLFxuICAgICAgICBCb29sZWFuKGNhcGFiaWxpdHkuZnJvbSksXG4gICAgICAgIEJvb2xlYW4oY2FwYWJpbGl0eS5sYXp5RnJvbSksXG4gICAgXS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuICAgIGlmIChjb25maWd1cmVkU291cmNlcyA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgU2FuZGJveFNraWxsc0NvbmZpZ0Vycm9yKCdza2lsbHMgY2FwYWJpbGl0eSByZXF1aXJlcyBgc2tpbGxzYCwgYGZyb21gLCBvciBgbGF6eUZyb21gLicpO1xuICAgIH1cbiAgICBpZiAoY29uZmlndXJlZFNvdXJjZXMgPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBTYW5kYm94U2tpbGxzQ29uZmlnRXJyb3IoJ3NraWxscyBjYXBhYmlsaXR5IGFjY2VwdHMgb25seSBvbmUgb2YgYHNraWxsc2AsIGBmcm9tYCwgb3IgYGxhenlGcm9tYC4nKTtcbiAgICB9XG4gICAgaWYgKGNhcGFiaWxpdHkuZnJvbSAmJiAhaXNEaXJlY3RvcnlMaWtlRW50cnkoY2FwYWJpbGl0eS5mcm9tKSkge1xuICAgICAgICB0aHJvdyBuZXcgU2FuZGJveFNraWxsc0NvbmZpZ0Vycm9yKCdza2lsbHMgZnJvbSBtdXN0IGJlIGEgZGlyZWN0b3J5LWxpa2UgZW50cnkgc3VjaCBhcyBkaXIsIGdpdF9yZXBvLCBvciBtb3VudC4nKTtcbiAgICB9XG4gICAgY29uc3Qgc2VlblNraWxsTmFtZXMgPSBuZXcgU2V0KCk7XG4gICAgZm9yIChjb25zdCBza2lsbCBvZiBjYXBhYmlsaXR5LnNraWxscykge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IG5vcm1hbGl6ZVJlbGF0aXZlUGF0aChza2lsbC5uYW1lKTtcbiAgICAgICAgaWYgKHNlZW5Ta2lsbE5hbWVzLmhhcyhub3JtYWxpemVkTmFtZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBTYW5kYm94U2tpbGxzQ29uZmlnRXJyb3IoYGR1cGxpY2F0ZSBza2lsbCBuYW1lOiAke3NraWxsLm5hbWV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgc2VlblNraWxsTmFtZXMuYWRkKG5vcm1hbGl6ZWROYW1lKTtcbiAgICB9XG59XG5mdW5jdGlvbiByZW5kZXJTa2lsbERlc2NyaXB0b3Ioc2tpbGwpIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHtcbiAgICAgICAgJ1NLSUxMLm1kJzogbm9ybWFsaXplU2tpbGxDb250ZW50KHNraWxsLmNvbnRlbnQpLFxuICAgIH07XG4gICAgaWYgKHNraWxsLnNjcmlwdHMgJiYgT2JqZWN0LmtleXMoc2tpbGwuc2NyaXB0cykubGVuZ3RoID4gMCkge1xuICAgICAgICBjaGlsZHJlbi5zY3JpcHRzID0gZGlyKHtcbiAgICAgICAgICAgIGNoaWxkcmVuOiBza2lsbC5zY3JpcHRzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHNraWxsLnJlZmVyZW5jZXMgJiYgT2JqZWN0LmtleXMoc2tpbGwucmVmZXJlbmNlcykubGVuZ3RoID4gMCkge1xuICAgICAgICBjaGlsZHJlbi5yZWZlcmVuY2VzID0gZGlyKHtcbiAgICAgICAgICAgIGNoaWxkcmVuOiBza2lsbC5yZWZlcmVuY2VzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHNraWxsLmFzc2V0cyAmJiBPYmplY3Qua2V5cyhza2lsbC5hc3NldHMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY2hpbGRyZW4uYXNzZXRzID0gZGlyKHtcbiAgICAgICAgICAgIGNoaWxkcmVuOiBza2lsbC5hc3NldHMsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZGlyKHtcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgfSk7XG59XG5mdW5jdGlvbiBub3JtYWxpemVTa2lsbENvbnRlbnQoY29udGVudCkge1xuICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycgfHwgY29udGVudCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIGZpbGUoe1xuICAgICAgICAgICAgY29udGVudCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBjb250ZW50O1xufVxuZnVuY3Rpb24gcmVzb2x2ZVNraWxsc01ldGFkYXRhKGNhcGFiaWxpdHksIHJ1bnRpbWVNZXRhZGF0YSA9IFtdLCBtYW5pZmVzdCkge1xuICAgIGlmIChjYXBhYmlsaXR5LnNraWxscy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBjYXBhYmlsaXR5LnNraWxsc1xuICAgICAgICAgICAgLm1hcCgoc2tpbGwpID0+ICh7XG4gICAgICAgICAgICBuYW1lOiBza2lsbC5uYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHNraWxsLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgcGF0aDogam9pblJlbGF0aXZlUGF0aHMoY2FwYWJpbGl0eS5za2lsbHNQYXRoLCBza2lsbC5uYW1lKSxcbiAgICAgICAgfSkpXG4gICAgICAgICAgICAuc29ydCgobGVmdCwgcmlnaHQpID0+IGxlZnQubmFtZS5sb2NhbGVDb21wYXJlKHJpZ2h0Lm5hbWUpKTtcbiAgICB9XG4gICAgY29uc3QgY29uZmlndXJlZEluZGV4ID0gcmVzb2x2ZUxhenlTa2lsbEluZGV4KGNhcGFiaWxpdHkubGF6eUZyb20sIG1hbmlmZXN0LCBjYXBhYmlsaXR5LnNraWxsc1BhdGgpID8/XG4gICAgICAgIGNhcGFiaWxpdHkuaW5kZXggPz9cbiAgICAgICAgKHJ1bnRpbWVNZXRhZGF0YS5sZW5ndGggPiAwID8gcnVudGltZU1ldGFkYXRhIDogdW5kZWZpbmVkKSA/P1xuICAgICAgICBkZXJpdmVJbmRleEZyb21EaXJFbnRyeShjYXBhYmlsaXR5LmZyb20pO1xuICAgIHJldHVybiBjb25maWd1cmVkSW5kZXhcbiAgICAgICAgLm1hcCgoc2tpbGwpID0+ICh7XG4gICAgICAgIC4uLnNraWxsLFxuICAgICAgICBwYXRoOiBqb2luUmVsYXRpdmVQYXRocyhjYXBhYmlsaXR5LnNraWxsc1BhdGgsIHNraWxsLnBhdGggPz8gbm9ybWFsaXplUmVsYXRpdmVQYXRoKHNraWxsLm5hbWUpKSxcbiAgICB9KSlcbiAgICAgICAgLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0Lm5hbWUubG9jYWxlQ29tcGFyZShyaWdodC5uYW1lKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTa2lsbEZyb250bWF0dGVyKG1hcmtkb3duKSB7XG4gICAgY29uc3QgbGluZXMgPSBtYXJrZG93bi5zcGxpdCgvXFxyP1xcbi8pO1xuICAgIGlmIChsaW5lc1swXT8udHJpbSgpICE9PSAnLS0tJykge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IGVuZEluZGV4ID0gbGluZXMuZmluZEluZGV4KChsaW5lLCBpbmRleCkgPT4gaW5kZXggPiAwICYmIGxpbmUudHJpbSgpID09PSAnLS0tJyk7XG4gICAgaWYgKGVuZEluZGV4ID09PSAtMSkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IG1ldGFkYXRhID0ge307XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzLnNsaWNlKDEsIGVuZEluZGV4KSkge1xuICAgICAgICBjb25zdCBzdHJpcHBlZCA9IGxpbmUudHJpbSgpO1xuICAgICAgICBjb25zdCBkZWxpbWl0ZXJJbmRleCA9IHN0cmlwcGVkLmluZGV4T2YoJzonKTtcbiAgICAgICAgaWYgKCFzdHJpcHBlZCB8fCBzdHJpcHBlZC5zdGFydHNXaXRoKCcjJykgfHwgZGVsaW1pdGVySW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXkgPSBzdHJpcHBlZC5zbGljZSgwLCBkZWxpbWl0ZXJJbmRleCkudHJpbSgpO1xuICAgICAgICBjb25zdCByYXdWYWx1ZSA9IHN0cmlwcGVkLnNsaWNlKGRlbGltaXRlckluZGV4ICsgMSkudHJpbSgpO1xuICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbWV0YWRhdGFba2V5XSA9IHVucXVvdGVGcm9udG1hdHRlclZhbHVlKHJhd1ZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xufVxuZnVuY3Rpb24gdW5xdW90ZUZyb250bWF0dGVyVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUubGVuZ3RoID49IDIgJiZcbiAgICAgICAgdmFsdWVbMF0gPT09IHZhbHVlW3ZhbHVlLmxlbmd0aCAtIDFdICYmXG4gICAgICAgICh2YWx1ZVswXSA9PT0gJ1wiJyB8fCB2YWx1ZVswXSA9PT0gXCInXCIpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5zbGljZSgxLCAtMSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVMYXp5U2tpbGxJbmRleChsYXp5U291cmNlLCBtYW5pZmVzdCwgc2tpbGxzUGF0aCA9ICcuYWdlbnRzJykge1xuICAgIGlmICghbGF6eVNvdXJjZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAobGF6eVNvdXJjZS5pbmRleCkge1xuICAgICAgICByZXR1cm4gbGF6eVNvdXJjZS5pbmRleDtcbiAgICB9XG4gICAgaWYgKGxhenlTb3VyY2UuZ2V0SW5kZXggJiYgbWFuaWZlc3QpIHtcbiAgICAgICAgY29uc3QgZGVyaXZlZEluZGV4ID0gbGF6eVNvdXJjZS5nZXRJbmRleChtYW5pZmVzdCwgc2tpbGxzUGF0aCk7XG4gICAgICAgIHJldHVybiBkZXJpdmVkSW5kZXgubGVuZ3RoID4gMCA/IGRlcml2ZWRJbmRleCA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZGVyaXZlZEluZGV4ID0gZGVyaXZlSW5kZXhGcm9tRGlyRW50cnkobGF6eVNvdXJjZS5zb3VyY2UpO1xuICAgIHJldHVybiBkZXJpdmVkSW5kZXgubGVuZ3RoID4gMCA/IGRlcml2ZWRJbmRleCA6IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIGRlcml2ZUluZGV4RnJvbURpckVudHJ5KGVudHJ5KSB7XG4gICAgaWYgKCFlbnRyeSB8fCAhaXNEaXIoZW50cnkpIHx8ICFlbnRyeS5jaGlsZHJlbikge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhlbnRyeS5jaGlsZHJlbilcbiAgICAgICAgLmZpbHRlcigoWywgY2hpbGRdKSA9PiBjaGlsZC50eXBlID09PSAnZGlyJylcbiAgICAgICAgLm1hcCgoW25hbWUsIGNoaWxkXSkgPT4gKHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246IGNoaWxkLmRlc2NyaXB0aW9uID8/ICdObyBkZXNjcmlwdGlvbiBwcm92aWRlZC4nLFxuICAgIH0pKTtcbn1cbmZ1bmN0aW9uIHJlbmRlclNraWxsc0Rpc2NvdmVyeUluc3RydWN0aW9ucyhza2lsbHNQYXRoKSB7XG4gICAgcmV0dXJuIHByb21wdCBgXG4jIyBTa2lsbHNcbiR7U0tJTExTX1NFQ1RJT05fSU5UUk99XG5cbiMjIyBTa2lsbCBzb3VyY2Vcbi0gU2tpbGxzIGFyZSBtYXRlcmlhbGl6ZWQgdW5kZXIgJHtza2lsbHNQYXRofS4gRGlzY292ZXIgYXZhaWxhYmxlIHNraWxscyBieSBpbnNwZWN0aW5nIGNoaWxkIGRpcmVjdG9yaWVzIGFuZCB0aGVpciBTS0lMTC5tZCBmaWxlcyBhdCBydW50aW1lLlxuXG4ke0hPV19UT19VU0VfU0tJTExTX1NFQ1RJT059XG5gO1xufVxuZnVuY3Rpb24gcmVuZGVyU2tpbGxzSW5zdHJ1Y3Rpb25zKGFyZ3MpIHtcbiAgICBjb25zdCBhdmFpbGFibGVTa2lsbHMgPSBhcmdzLm1ldGFkYXRhXG4gICAgICAgIC5tYXAoKHNraWxsKSA9PiBgLSAke3NraWxsLm5hbWV9OiAke3NraWxsLmRlc2NyaXB0aW9ufSAoZmlsZTogJHtza2lsbC5wYXRoID8/IHNraWxsLm5hbWV9KWApXG4gICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICBjb25zdCBsYXp5TG9hZGluZ0luc3RydWN0aW9ucyA9IGFyZ3MubGF6eVxuICAgICAgICA/IHByb21wdCBgXG4jIyMgTGF6eSBsb2FkaW5nXG4tIFRoZXNlIHNraWxscyBhcmUgaW5kZXhlZCBmb3IgcGxhbm5pbmcsIGJ1dCB0aGV5IGFyZSBub3QgbWF0ZXJpYWxpemVkIGluIHRoZSB3b3Jrc3BhY2UgeWV0LlxuLSBDYWxsIFxcYGxvYWRfc2tpbGxcXGAgd2l0aCBhIHNpbmdsZSBza2lsbCBuYW1lIGZyb20gdGhlIGxpc3QgYmVmb3JlIHJlYWRpbmcgaXRzIFxcYFNLSUxMLm1kXFxgIG9yIG90aGVyIGZpbGVzIGZyb20gdGhlIHdvcmtzcGFjZS5cbi0gXFxgbG9hZF9za2lsbFxcYCBzdGFnZXMgZXhhY3RseSBvbmUgc2tpbGwgdW5kZXIgdGhlIGxpc3RlZCBwYXRoLiBJZiB5b3UgbmVlZCBtb3JlIHRoYW4gb25lIHNraWxsLCBjYWxsIGl0IG11bHRpcGxlIHRpbWVzLlxuYFxuICAgICAgICA6ICcnO1xuICAgIGNvbnN0IHVzYWdlSW5zdHJ1Y3Rpb25zID0gYXJncy5sYXp5XG4gICAgICAgID8gSE9XX1RPX1VTRV9MQVpZX1NLSUxMU19TRUNUSU9OXG4gICAgICAgIDogSE9XX1RPX1VTRV9TS0lMTFNfU0VDVElPTjtcbiAgICBjb25zdCBsYXp5TG9hZGluZ1NlY3Rpb24gPSBsYXp5TG9hZGluZ0luc3RydWN0aW9uc1xuICAgICAgICA/IGAke2xhenlMb2FkaW5nSW5zdHJ1Y3Rpb25zfVxcblxcbmBcbiAgICAgICAgOiAnJztcbiAgICByZXR1cm4gcHJvbXB0IGBcbiMjIFNraWxsc1xuJHtTS0lMTFNfU0VDVElPTl9JTlRST31cblxuIyMjIEF2YWlsYWJsZSBza2lsbHNcbiR7YXZhaWxhYmxlU2tpbGxzfVxuXG4ke2xhenlMb2FkaW5nU2VjdGlvbn0ke3VzYWdlSW5zdHJ1Y3Rpb25zfVxuYDtcbn1cbmZ1bmN0aW9uIHJlc29sdmVMYXp5U2tpbGxNYXRjaChjYXBhYmlsaXR5LCBza2lsbE5hbWUsIG1hbmlmZXN0KSB7XG4gICAgY29uc3QgaW5kZXggPSByZXNvbHZlTGF6eVNraWxsSW5kZXgoY2FwYWJpbGl0eS5sYXp5RnJvbSwgbWFuaWZlc3QsIGNhcGFiaWxpdHkuc2tpbGxzUGF0aCkgPz9cbiAgICAgICAgY2FwYWJpbGl0eS5pbmRleCA/P1xuICAgICAgICBbXTtcbiAgICBjb25zdCBtYXRjaGVzID0gaW5kZXguZmlsdGVyKChza2lsbCkgPT4ge1xuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBub3JtYWxpemVSZWxhdGl2ZVBhdGgoc2tpbGwucGF0aCA/PyBza2lsbC5uYW1lKTtcbiAgICAgICAgY29uc3QgcGF0aEJhc2VOYW1lID0gcmVsYXRpdmVQYXRoLnNwbGl0KCcvJykucG9wKCkgPz8gcmVsYXRpdmVQYXRoO1xuICAgICAgICByZXR1cm4gKHNraWxsLm5hbWUgPT09IHNraWxsTmFtZSB8fFxuICAgICAgICAgICAgcmVsYXRpdmVQYXRoID09PSBza2lsbE5hbWUgfHxcbiAgICAgICAgICAgIHBhdGhCYXNlTmFtZSA9PT0gc2tpbGxOYW1lKTtcbiAgICB9KTtcbiAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFNhbmRib3hTa2lsbHNDb25maWdFcnJvcihgbGF6eSBza2lsbCBub3QgZm91bmQ6ICR7c2tpbGxOYW1lfWApO1xuICAgIH1cbiAgICBpZiAobWF0Y2hlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBTYW5kYm94U2tpbGxzQ29uZmlnRXJyb3IoYGxhenkgc2tpbGwgbmFtZSBpcyBhbWJpZ3VvdXM6ICR7c2tpbGxOYW1lfWApO1xuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hlc1swXTtcbn1cbmZ1bmN0aW9uIGpvaW5SZWxhdGl2ZVBhdGhzKGxlZnQsIHJpZ2h0KSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZExlZnQgPSBub3JtYWxpemVSZWxhdGl2ZVBhdGgobGVmdCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFJpZ2h0ID0gbm9ybWFsaXplUmVsYXRpdmVQYXRoKHJpZ2h0KTtcbiAgICBpZiAoIW5vcm1hbGl6ZWRMZWZ0KSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkUmlnaHQ7XG4gICAgfVxuICAgIGlmICghbm9ybWFsaXplZFJpZ2h0KSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkTGVmdDtcbiAgICB9XG4gICAgcmV0dXJuIGAke25vcm1hbGl6ZWRMZWZ0fS8ke25vcm1hbGl6ZWRSaWdodH1gO1xufVxuZnVuY3Rpb24gam9pblNvdXJjZVBhdGgoc291cmNlUm9vdCwgcmVsYXRpdmVQYXRoKSB7XG4gICAgY29uc3QgdHJpbW1lZFJvb3QgPSBzb3VyY2VSb290LnJlcGxhY2UoL1tcXFxcL10rJC8sICcnKTtcbiAgICBpZiAoIXRyaW1tZWRSb290KSB7XG4gICAgICAgIHJldHVybiByZWxhdGl2ZVBhdGg7XG4gICAgfVxuICAgIHJldHVybiBgJHt0cmltbWVkUm9vdH0vJHtyZWxhdGl2ZVBhdGh9YDtcbn1cbmZ1bmN0aW9uIHJlc29sdmVMYXp5U2tpbGxFbnRyeShzb3VyY2UsIHJlbGF0aXZlU2tpbGxQYXRoKSB7XG4gICAgaWYgKHNvdXJjZS50eXBlID09PSAnbG9jYWxfZGlyJykge1xuICAgICAgICBpZiAoIXNvdXJjZS5zcmMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBTYW5kYm94U2tpbGxzQ29uZmlnRXJyb3IoJ0xhenkgc2tpbGwgbG9jYWxfZGlyIHNvdXJjZXMgcmVxdWlyZSBhIGNvbmNyZXRlIHNyYyB2YWx1ZS4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uc291cmNlLFxuICAgICAgICAgICAgdHlwZTogJ2xvY2FsX2RpcicsXG4gICAgICAgICAgICBzcmM6IGpvaW5Tb3VyY2VQYXRoKHNvdXJjZS5zcmMsIHJlbGF0aXZlU2tpbGxQYXRoKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHNvdXJjZS50eXBlID09PSAnZ2l0X3JlcG8nKSB7XG4gICAgICAgIGNvbnN0IGJhc2VTdWJwYXRoID0gc291cmNlLnN1YnBhdGhcbiAgICAgICAgICAgID8gbm9ybWFsaXplUmVsYXRpdmVQYXRoKHNvdXJjZS5zdWJwYXRoKVxuICAgICAgICAgICAgOiAnJztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnNvdXJjZSxcbiAgICAgICAgICAgIHR5cGU6ICdnaXRfcmVwbycsXG4gICAgICAgICAgICBzdWJwYXRoOiBqb2luUmVsYXRpdmVQYXRocyhiYXNlU3VicGF0aCwgcmVsYXRpdmVTa2lsbFBhdGgpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAoc291cmNlLnR5cGUgPT09ICdkaXInKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gcmVhZERpckNoaWxkKHNvdXJjZSwgcmVsYXRpdmVTa2lsbFBhdGgpO1xuICAgICAgICBpZiAoIWNoaWxkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgU2FuZGJveFNraWxsc0NvbmZpZ0Vycm9yKGBsYXp5IHNraWxsIHNvdXJjZSBwYXRoIG5vdCBmb3VuZDogJHtyZWxhdGl2ZVNraWxsUGF0aH1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgfVxuICAgIHRocm93IG5ldyBTYW5kYm94U2tpbGxzQ29uZmlnRXJyb3IoYExhenkgc2tpbGwgc291cmNlIHR5cGUgaXMgbm90IHN1cHBvcnRlZCB5ZXQ6ICR7c291cmNlLnR5cGV9YCk7XG59XG5mdW5jdGlvbiByZWFkRGlyQ2hpbGQoc291cmNlLCByZWxhdGl2ZVNraWxsUGF0aCkge1xuICAgIGxldCBjdXJyZW50ID0gc291cmNlO1xuICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiBub3JtYWxpemVSZWxhdGl2ZVBhdGgocmVsYXRpdmVTa2lsbFBhdGgpLnNwbGl0KCcvJykpIHtcbiAgICAgICAgaWYgKCFzZWdtZW50KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWN1cnJlbnQgfHwgIWlzRGlyKGN1cnJlbnQpIHx8ICFjdXJyZW50LmNoaWxkcmVuKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNoaWxkcmVuW3NlZ21lbnRdO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudDtcbn1cbmZ1bmN0aW9uIHBhdGhzT3ZlcmxhcChsZWZ0LCByaWdodCkge1xuICAgIHJldHVybiAobGVmdCA9PT0gcmlnaHQgfHxcbiAgICAgICAgbGVmdC5zdGFydHNXaXRoKGAke3JpZ2h0fS9gKSB8fFxuICAgICAgICByaWdodC5zdGFydHNXaXRoKGAke2xlZnR9L2ApKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNraWxscy5tanMubWFwIiwiaW1wb3J0IHsgY29tcGFjdGlvbiB9IGZyb20gXCIuL2NvbXBhY3Rpb24ubWpzXCI7XG5pbXBvcnQgeyBmaWxlc3lzdGVtIH0gZnJvbSBcIi4vZmlsZXN5c3RlbS5tanNcIjtcbmltcG9ydCB7IHNoZWxsIH0gZnJvbSBcIi4vc2hlbGwubWpzXCI7XG5leHBvcnQgeyBDYXBhYmlsaXR5IH0gZnJvbSBcIi4vYmFzZS5tanNcIjtcbmV4cG9ydCB7IENvbXBhY3Rpb25Nb2RlbEluZm8sIENvbXBhY3Rpb25Qb2xpY3ksIER5bmFtaWNDb21wYWN0aW9uUG9saWN5LCBTdGF0aWNDb21wYWN0aW9uUG9saWN5LCBjb21wYWN0aW9uLCB9IGZyb20gXCIuL2NvbXBhY3Rpb24ubWpzXCI7XG5leHBvcnQgeyBmaWxlc3lzdGVtIH0gZnJvbSBcIi4vZmlsZXN5c3RlbS5tanNcIjtcbmV4cG9ydCB7IG1lbW9yeSB9IGZyb20gXCIuL21lbW9yeS5tanNcIjtcbmV4cG9ydCB7IEluTWVtb3J5TWVtb3J5U3RvcmUgfSBmcm9tIFwiLi4vbWVtb3J5L3N0b3JhZ2UubWpzXCI7XG5leHBvcnQgeyBzaGVsbCB9IGZyb20gXCIuL3NoZWxsLm1qc1wiO1xuZXhwb3J0IHsgc2tpbGxzIH0gZnJvbSBcIi4vc2tpbGxzLm1qc1wiO1xuZnVuY3Rpb24gZGVmYXVsdENhcGFiaWxpdGllcygpIHtcbiAgICByZXR1cm4gW2ZpbGVzeXN0ZW0oKSwgc2hlbGwoKSwgY29tcGFjdGlvbigpXTtcbn1cbmV4cG9ydCBjb25zdCBDYXBhYmlsaXRpZXMgPSB7XG4gICAgZGVmYXVsdDogZGVmYXVsdENhcGFiaWxpdGllcyxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwIiwiaW1wb3J0IHsgQWdlbnQgfSBmcm9tIFwiLi4vYWdlbnQubWpzXCI7XG5pbXBvcnQgeyBTQU5EQk9YX0FHRU5UX0JSQU5EIH0gZnJvbSBcIi4vYnJhbmQubWpzXCI7XG5pbXBvcnQgeyBDYXBhYmlsaXRpZXMgfSBmcm9tIFwiLi9jYXBhYmlsaXRpZXMvaW5kZXgubWpzXCI7XG5pbXBvcnQgeyBjbG9uZU1hbmlmZXN0LCBNYW5pZmVzdCB9IGZyb20gXCIuL21hbmlmZXN0Lm1qc1wiO1xuaW1wb3J0IHsgbm9ybWFsaXplVXNlciB9IGZyb20gXCIuL3VzZXJzLm1qc1wiO1xuZXhwb3J0IGNsYXNzIFNhbmRib3hBZ2VudCBleHRlbmRzIEFnZW50IHtcbiAgICBbU0FOREJPWF9BR0VOVF9CUkFORF0gPSB0cnVlO1xuICAgIGRlZmF1bHRNYW5pZmVzdDtcbiAgICBiYXNlSW5zdHJ1Y3Rpb25zO1xuICAgIGNhcGFiaWxpdGllcztcbiAgICBydW5BcztcbiAgICBydW50aW1lTWFuaWZlc3Q7XG4gICAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZyk7XG4gICAgICAgIGlmIChjb25maWcuYmFzZUluc3RydWN0aW9ucyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICB0eXBlb2YgY29uZmlnLmJhc2VJbnN0cnVjdGlvbnMgIT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICB0eXBlb2YgY29uZmlnLmJhc2VJbnN0cnVjdGlvbnMgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1NhbmRib3hBZ2VudCBiYXNlSW5zdHJ1Y3Rpb25zIG11c3QgYmUgYSBzdHJpbmcgb3IgZnVuY3Rpb24uJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZWZhdWx0TWFuaWZlc3QgPSBjb25maWcuZGVmYXVsdE1hbmlmZXN0XG4gICAgICAgICAgICA/IGNsb25lTWFuaWZlc3QoY29uZmlnLmRlZmF1bHRNYW5pZmVzdClcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmJhc2VJbnN0cnVjdGlvbnMgPSBjb25maWcuYmFzZUluc3RydWN0aW9ucztcbiAgICAgICAgdGhpcy5jYXBhYmlsaXRpZXMgPSBjb25maWcuY2FwYWJpbGl0aWVzID8/IENhcGFiaWxpdGllcy5kZWZhdWx0KCk7XG4gICAgICAgIHRoaXMucnVuQXMgPSBub3JtYWxpemVSdW5Bcyhjb25maWcucnVuQXMpO1xuICAgICAgICB0aGlzLnJ1bnRpbWVNYW5pZmVzdCA9IHRoaXMuZGVmYXVsdE1hbmlmZXN0ID8/IG5ldyBNYW5pZmVzdCgpO1xuICAgIH1cbiAgICBjbG9uZShjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94QWdlbnQoe1xuICAgICAgICAgICAgbmFtZTogY29uZmlnLm5hbWUgPz8gdGhpcy5uYW1lLFxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zOiBjb25maWcuaW5zdHJ1Y3Rpb25zID8/IHRoaXMuaW5zdHJ1Y3Rpb25zLFxuICAgICAgICAgICAgcHJvbXB0OiBjb25maWcucHJvbXB0ID8/IHRoaXMucHJvbXB0LFxuICAgICAgICAgICAgaGFuZG9mZkRlc2NyaXB0aW9uOiBjb25maWcuaGFuZG9mZkRlc2NyaXB0aW9uID8/IHRoaXMuaGFuZG9mZkRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgaGFuZG9mZnM6IGNvbmZpZy5oYW5kb2ZmcyA/PyB0aGlzLmhhbmRvZmZzLFxuICAgICAgICAgICAgbW9kZWw6IGNvbmZpZy5tb2RlbCA/PyB0aGlzLm1vZGVsLFxuICAgICAgICAgICAgbW9kZWxTZXR0aW5nczogY29uZmlnLm1vZGVsU2V0dGluZ3MgPz8gdGhpcy5tb2RlbFNldHRpbmdzLFxuICAgICAgICAgICAgdG9vbHM6IGNvbmZpZy50b29scyA/PyB0aGlzLnRvb2xzLFxuICAgICAgICAgICAgbWNwU2VydmVyczogY29uZmlnLm1jcFNlcnZlcnMgPz8gdGhpcy5tY3BTZXJ2ZXJzLFxuICAgICAgICAgICAgbWNwQ29uZmlnOiBjb25maWcubWNwQ29uZmlnID8/IHRoaXMubWNwQ29uZmlnLFxuICAgICAgICAgICAgaW5wdXRHdWFyZHJhaWxzOiBjb25maWcuaW5wdXRHdWFyZHJhaWxzID8/IHRoaXMuaW5wdXRHdWFyZHJhaWxzLFxuICAgICAgICAgICAgb3V0cHV0R3VhcmRyYWlsczogY29uZmlnLm91dHB1dEd1YXJkcmFpbHMgPz8gdGhpcy5vdXRwdXRHdWFyZHJhaWxzLFxuICAgICAgICAgICAgb3V0cHV0VHlwZTogY29uZmlnLm91dHB1dFR5cGUgPz8gdGhpcy5vdXRwdXRUeXBlLFxuICAgICAgICAgICAgdG9vbFVzZUJlaGF2aW9yOiBjb25maWcudG9vbFVzZUJlaGF2aW9yID8/IHRoaXMudG9vbFVzZUJlaGF2aW9yLFxuICAgICAgICAgICAgcmVzZXRUb29sQ2hvaWNlOiBjb25maWcucmVzZXRUb29sQ2hvaWNlID8/IHRoaXMucmVzZXRUb29sQ2hvaWNlLFxuICAgICAgICAgICAgZGVmYXVsdE1hbmlmZXN0OiBjb25maWcuZGVmYXVsdE1hbmlmZXN0ID8/IHRoaXMuZGVmYXVsdE1hbmlmZXN0LFxuICAgICAgICAgICAgYmFzZUluc3RydWN0aW9uczogY29uZmlnLmJhc2VJbnN0cnVjdGlvbnMgPz8gdGhpcy5iYXNlSW5zdHJ1Y3Rpb25zLFxuICAgICAgICAgICAgY2FwYWJpbGl0aWVzOiBjb25maWcuY2FwYWJpbGl0aWVzID8/IHRoaXMuY2FwYWJpbGl0aWVzLFxuICAgICAgICAgICAgcnVuQXM6IGNvbmZpZy5ydW5BcyA/PyB0aGlzLnJ1bkFzLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5mdW5jdGlvbiBub3JtYWxpemVSdW5BcyhydW5Bcykge1xuICAgIGlmIChydW5BcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcnVuQXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IHRyaW1tZWQgPSBydW5Bcy50cmltKCk7XG4gICAgICAgIGlmICghdHJpbW1lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignU2FuZGJveEFnZW50IHJ1bkFzIG11c3QgYmUgbm9uLWVtcHR5LicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmltbWVkO1xuICAgIH1cbiAgICByZXR1cm4gbm9ybWFsaXplVXNlcihydW5Bcyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hZ2VudC5tanMubWFwIl0sIm5hbWVzIjpbInN1cHBvcnRzUmVzcG9uc2VzQ29tcGFjdGlvblRyYW5zcG9ydCIsIm1vZGVsSW5zdGFuY2UiLCJzdXBwb3J0c0FwcGx5UGF0Y2hUcmFuc3BvcnQiLCJzdXBwb3J0c1N0cnVjdHVyZWRUb29sT3V0cHV0VHJhbnNwb3J0IiwiQ29tcGFjdGlvblBvbGljeSIsIkR5bmFtaWNDb21wYWN0aW9uUG9saWN5IiwidGhyZXNob2xkUmF0aW8iLCJmYWxsYmFja1RocmVzaG9sZCIsIl9fcHVibGljRmllbGQiLCJtb2RlbCIsIm1vZGVsSW5mbyIsIkNvbXBhY3Rpb25Nb2RlbEluZm8iLCJjb250ZXh0V2luZG93IiwiY2FuZGlkYXRlIiwiZ2V0U2FuZGJveENvbXBhY3Rpb25Nb2RlbENhbmRpZGF0ZXMiLCJTQU5EQk9YX0NPTlRFWFRfV0lORE9XU18xTSIsIlNBTkRCT1hfQ09OVEVYVF9XSU5ET1dTXzQwMEsiLCJTQU5EQk9YX0NPTlRFWFRfV0lORE9XU18yMDBLIiwiU0FOREJPWF9DT05URVhUX1dJTkRPV1NfMTI4SyIsIkNvbXBhY3Rpb25DYXBhYmlsaXR5IiwiQ2FwYWJpbGl0eSIsInBvbGljeSIsInNhbXBsaW5nUGFyYW1zIiwiY29udGV4dCIsImxhc3RDb21wYWN0aW9uSW5kZXgiLCJpbmRleCIsImNvbXBhY3Rpb24iLCJhcmdzIiwidHJpbW1lZCIsIm5vcm1hbGl6ZWQiLCJ3aXRob3V0UGlubmVkRGF0ZSIsImFwcGx5UGF0Y2hGdW5jdGlvblBhcmFtZXRlcnMiLCJCRUdJTl9QQVRDSCIsIkVORF9QQVRDSCIsIkFERF9GSUxFIiwiREVMRVRFX0ZJTEUiLCJVUERBVEVfRklMRSIsIk1PVkVfVE8iLCJ0b0Vycm9yTWVzc2FnZSIsImVycm9yIiwicmVuZGVySW1hZ2VGb3JUZXh0VHJhbnNwb3J0Iiwib3V0cHV0IiwiaW1hZ2UiLCJpc1JlY29yZCIsImltYWdlUmVjb3JkIiwiZW5jb2RlVWludDhBcnJheVRvQmFzZTY0IiwicmVuZGVyVmlld0ltYWdlRXJyb3IiLCJwYXRoIiwibWVzc2FnZSIsIm5hbWUiLCJwYXJzZUFwcGx5UGF0Y2hJbnB1dCIsInJhd0lucHV0IiwidHJpbW1lZElucHV0IiwicGFyc2VGcmVlZm9ybVBhdGNoIiwicGF5bG9hZCIsInBhcnNlQXBwbHlQYXRjaFBheWxvYWQiLCJwYXJzZVN0cnVjdHVyZWRPcGVyYXRpb25zIiwiY29tbWFuZE5hbWUiLCJwYXRjaCIsInBheWxvYWRzIiwib3BlcmF0aW9ucyIsInBhcnNlZCIsIkFwcGx5UGF0Y2hPcGVyYXRpb24iLCJyYXdQYXRjaCIsImxpbmVzIiwibGluZSIsInBhcnNlQWRkRmlsZVBhdGNoIiwicGFyc2VEZWxldGVGaWxlUGF0Y2giLCJwYXJzZVVwZGF0ZUZpbGVQYXRjaCIsInBhcnNlUGF0Y2hIZWFkZXIiLCJkaWZmTGluZXMiLCJpc0ZpbGVPcGVyYXRpb25IZWFkZXIiLCJqb2luRGlmZiIsIm1vdmVUbyIsInBhcnNlZE1vdmVUbyIsInByZWZpeCIsImFwcGx5UGF0Y2hPcGVyYXRpb24iLCJlZGl0b3IiLCJvcGVyYXRpb24iLCJydW5Db250ZXh0IiwicmVzdWx0IiwiYXBwbHlQYXRjaE9wZXJhdGlvbnMiLCJvdXRwdXRzIiwiYXBwbHlQYXRjaEZ1bmN0aW9uVG9vbCIsImlucHV0IiwiRmlsZXN5c3RlbUNhcGFiaWxpdHkiLCJzZXNzaW9uIiwicmVxdWlyZUJvdW5kU2Vzc2lvbiIsIl9hIiwiVXNlckVycm9yIiwidG9vbHMiLCJ2aWV3SW1hZ2UiLCJ3aXRoU2FuZGJveFNwYW4iLCJ0b29sIiwiei5vYmplY3QiLCJ6LnN0cmluZyIsImFwcGx5UGF0Y2hUb29sIiwiZmlsZXN5c3RlbSIsIkRFRkFVTFRfRVhFQ19ZSUVMRF9USU1FX01TIiwiREVGQVVMVF9XUklURV9TVERJTl9ZSUVMRF9USU1FX01TIiwiU0hFTExfSU5TVFJVQ1RJT05TIiwiU2hlbGxDYXBhYmlsaXR5IiwielxuICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmluZyIsInpcbiAgICAgICAgICAgICAgICAgICAgICAgIC5ib29sZWFuIiwielxuICAgICAgICAgICAgICAgICAgICAgICAgLm51bWJlciIsImNtZCIsIndvcmtkaXIiLCJzaGVsbCIsImxvZ2luIiwidHR5IiwieWllbGRfdGltZV9tcyIsIm1heF9vdXRwdXRfdG9rZW5zIiwic2Vzc2lvbl9pZCIsImNoYXJzIiwicHJvbXB0IiwiZGVmYXVsdENhcGFiaWxpdGllcyIsIkNhcGFiaWxpdGllcyIsIlNhbmRib3hBZ2VudCIsIl9iIiwiQWdlbnQiLCJTQU5EQk9YX0FHRU5UX0JSQU5EIiwiY29uZmlnIiwiY2xvbmVNYW5pZmVzdCIsIm5vcm1hbGl6ZVJ1bkFzIiwiTWFuaWZlc3QiLCJydW5BcyIsIm5vcm1hbGl6ZVVzZXIiXSwibWFwcGluZ3MiOiI7Ozs7QUFBTyxTQUFTQSxFQUFxQ0MsR0FBZTtBQUNoRSxTQUFLQSxJQVNFLEVBTmlCLE9BQU9BLEtBQWtCLFlBQzdDQSxLQUNBLGlCQUFpQkEsS0FDakIsT0FBT0EsRUFBYyxlQUFnQixhQUNuQ0EsRUFBYyxZQUFZLE9BQzFCLElBQ2tCLFNBQVMsaUJBQWlCLElBUnZDO0FBU2Y7QUFDTyxTQUFTQyxFQUE0QkQsR0FBZTtBQUN2RCxTQUFPRSxFQUFzQ0Ys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
642
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtdE9TSEg3djgubWpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9hZ2VudHMtY29yZS9kaXN0L3NhbmRib3gvY2FwYWJpbGl0aWVzL3RyYW5zcG9ydC5tanMiLCIuLi8uLi8uLi9hZ2VudHMtY29yZS9kaXN0L3NhbmRib3gvY2FwYWJpbGl0aWVzL2NvbXBhY3Rpb24ubWpzIiwiLi4vLi4vLi4vYWdlbnRzLWNvcmUvZGlzdC9zYW5kYm94L2NhcGFiaWxpdGllcy9maWxlc3lzdGVtLm1qcyIsIi4uLy4uLy4uL2FnZW50cy1jb3JlL2Rpc3Qvc2FuZGJveC9jYXBhYmlsaXRpZXMvc2hlbGwubWpzIiwiLi4vLi4vLi4vYWdlbnRzLWNvcmUvZGlzdC9zYW5kYm94L2NhcGFiaWxpdGllcy9za2lsbHMubWpzIiwiLi4vLi4vLi4vYWdlbnRzLWNvcmUvZGlzdC9zYW5kYm94L2NhcGFiaWxpdGllcy9pbmRleC5tanMiLCIuLi8uLi8uLi9hZ2VudHMtY29yZS9kaXN0L3NhbmRib3gvYWdlbnQubWpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c1Jlc3BvbnNlc0NvbXBhY3Rpb25UcmFuc3BvcnQobW9kZWxJbnN0YW5jZSkge1xuICAgIGlmICghbW9kZWxJbnN0YW5jZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgY29uc3RydWN0b3JOYW1lID0gdHlwZW9mIG1vZGVsSW5zdGFuY2UgPT09ICdvYmplY3QnICYmXG4gICAgICAgIG1vZGVsSW5zdGFuY2UgJiZcbiAgICAgICAgJ2NvbnN0cnVjdG9yJyBpbiBtb2RlbEluc3RhbmNlICYmXG4gICAgICAgIHR5cGVvZiBtb2RlbEluc3RhbmNlLmNvbnN0cnVjdG9yID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gbW9kZWxJbnN0YW5jZS5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgIDogJyc7XG4gICAgcmV0dXJuICFjb25zdHJ1Y3Rvck5hbWUuaW5jbHVkZXMoJ0NoYXRDb21wbGV0aW9ucycpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzQXBwbHlQYXRjaFRyYW5zcG9ydChtb2RlbEluc3RhbmNlKSB7XG4gICAgcmV0dXJuIHN1cHBvcnRzU3RydWN0dXJlZFRvb2xPdXRwdXRUcmFuc3BvcnQobW9kZWxJbnN0YW5jZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydHNTdHJ1Y3R1cmVkVG9vbE91dHB1dFRyYW5zcG9ydChtb2RlbEluc3RhbmNlKSB7XG4gICAgaWYgKCFtb2RlbEluc3RhbmNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgY29uc3RydWN0b3JOYW1lID0gdHlwZW9mIG1vZGVsSW5zdGFuY2UgPT09ICdvYmplY3QnICYmXG4gICAgICAgIG1vZGVsSW5zdGFuY2UgJiZcbiAgICAgICAgJ2NvbnN0cnVjdG9yJyBpbiBtb2RlbEluc3RhbmNlICYmXG4gICAgICAgIHR5cGVvZiBtb2RlbEluc3RhbmNlLmNvbnN0cnVjdG9yID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gbW9kZWxJbnN0YW5jZS5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgIDogJyc7XG4gICAgcmV0dXJuICFjb25zdHJ1Y3Rvck5hbWUuaW5jbHVkZXMoJ0NoYXRDb21wbGV0aW9ucycpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHJhbnNwb3J0Lm1qcy5tYXAiLCJpbXBvcnQgeyBDYXBhYmlsaXR5IH0gZnJvbSBcIi4vYmFzZS5tanNcIjtcbmltcG9ydCB7IHN1cHBvcnRzUmVzcG9uc2VzQ29tcGFjdGlvblRyYW5zcG9ydCB9IGZyb20gXCIuL3RyYW5zcG9ydC5tanNcIjtcbmV4cG9ydCBjbGFzcyBDb21wYWN0aW9uUG9saWN5IHtcbn1cbmV4cG9ydCBjbGFzcyBTdGF0aWNDb21wYWN0aW9uUG9saWN5IGV4dGVuZHMgQ29tcGFjdGlvblBvbGljeSB7XG4gICAgdGhyZXNob2xkO1xuICAgIGNvbnN0cnVjdG9yKHRocmVzaG9sZCA9IDI0MDAwMCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnRocmVzaG9sZCA9IHRocmVzaG9sZDtcbiAgICB9XG4gICAgY29tcGFjdFRocmVzaG9sZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhyZXNob2xkO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBEeW5hbWljQ29tcGFjdGlvblBvbGljeSBleHRlbmRzIENvbXBhY3Rpb25Qb2xpY3kge1xuICAgIHRocmVzaG9sZFJhdGlvO1xuICAgIGZhbGxiYWNrVGhyZXNob2xkO1xuICAgIGNvbnN0cnVjdG9yKHRocmVzaG9sZFJhdGlvID0gMC45LCBmYWxsYmFja1RocmVzaG9sZCA9IDI0MDAwMCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnRocmVzaG9sZFJhdGlvID0gdGhyZXNob2xkUmF0aW87XG4gICAgICAgIHRoaXMuZmFsbGJhY2tUaHJlc2hvbGQgPSBmYWxsYmFja1RocmVzaG9sZDtcbiAgICB9XG4gICAgY29tcGFjdFRocmVzaG9sZChtb2RlbCkge1xuICAgICAgICBpZiAoIW1vZGVsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mYWxsYmFja1RocmVzaG9sZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtb2RlbEluZm8gPSBDb21wYWN0aW9uTW9kZWxJbmZvLmZvck1vZGVsKG1vZGVsKTtcbiAgICAgICAgaWYgKCFtb2RlbEluZm8pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZhbGxiYWNrVGhyZXNob2xkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKG1vZGVsSW5mby5jb250ZXh0V2luZG93ICogdGhpcy50aHJlc2hvbGRSYXRpbyk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIENvbXBhY3Rpb25Nb2RlbEluZm8ge1xuICAgIGNvbnRleHRXaW5kb3c7XG4gICAgY29uc3RydWN0b3IoY29udGV4dFdpbmRvdykge1xuICAgICAgICB0aGlzLmNvbnRleHRXaW5kb3cgPSBjb250ZXh0V2luZG93O1xuICAgIH1cbiAgICBzdGF0aWMgZm9yTW9kZWwobW9kZWwpIHtcbiAgICAgICAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgZ2V0U2FuZGJveENvbXBhY3Rpb25Nb2RlbENhbmRpZGF0ZXMobW9kZWwpKSB7XG4gICAgICAgICAgICBpZiAoU0FOREJPWF9DT05URVhUX1dJTkRPV1NfMU0uaGFzKGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBhY3Rpb25Nb2RlbEluZm8oMTA0NzU3Nik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoU0FOREJPWF9DT05URVhUX1dJTkRPV1NfNDAwSy5oYXMoY2FuZGlkYXRlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGFjdGlvbk1vZGVsSW5mbyg0MDAwMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFNBTkRCT1hfQ09OVEVYVF9XSU5ET1dTXzIwMEsuaGFzKGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBhY3Rpb25Nb2RlbEluZm8oMjAwMDAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChTQU5EQk9YX0NPTlRFWFRfV0lORE9XU18xMjhLLmhhcyhjYW5kaWRhdGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wYWN0aW9uTW9kZWxJbmZvKDEyODAwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG5jbGFzcyBDb21wYWN0aW9uQ2FwYWJpbGl0eSBleHRlbmRzIENhcGFiaWxpdHkge1xuICAgIHR5cGUgPSAnY29tcGFjdGlvbic7XG4gICAgcG9saWN5O1xuICAgIGNvbnN0cnVjdG9yKHBvbGljeSA9IG5ldyBEeW5hbWljQ29tcGFjdGlvblBvbGljeSgpKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucG9saWN5ID0gcG9saWN5O1xuICAgIH1cbiAgICBzYW1wbGluZ1BhcmFtcyhzYW1wbGluZ1BhcmFtcykge1xuICAgICAgICBpZiAoc2FtcGxpbmdQYXJhbXMubW9kZWxJbnN0YW5jZSAmJlxuICAgICAgICAgICAgIXN1cHBvcnRzUmVzcG9uc2VzQ29tcGFjdGlvblRyYW5zcG9ydChzYW1wbGluZ1BhcmFtcy5tb2RlbEluc3RhbmNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1vZGVsID0gdHlwZW9mIHNhbXBsaW5nUGFyYW1zLm1vZGVsID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyBzYW1wbGluZ1BhcmFtcy5tb2RlbFxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZXh0X21hbmFnZW1lbnQ6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjb21wYWN0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgY29tcGFjdF90aHJlc2hvbGQ6IHRoaXMucG9saWN5LmNvbXBhY3RUaHJlc2hvbGQobW9kZWwpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwcm9jZXNzQ29udGV4dChjb250ZXh0KSB7XG4gICAgICAgIGxldCBsYXN0Q29tcGFjdGlvbkluZGV4ID0gLTE7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb250ZXh0Lmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICAgICAgaWYgKGNvbnRleHRbaW5kZXhdLnR5cGUgPT09ICdjb21wYWN0aW9uJykge1xuICAgICAgICAgICAgICAgIGxhc3RDb21wYWN0aW9uSW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobGFzdENvbXBhY3Rpb25JbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250ZXh0LnNsaWNlKGxhc3RDb21wYWN0aW9uSW5kZXgpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21wYWN0aW9uKGFyZ3MgPSB7fSkge1xuICAgIHJldHVybiBuZXcgQ29tcGFjdGlvbkNhcGFiaWxpdHkoYXJncy5wb2xpY3kpO1xufVxuZnVuY3Rpb24gZ2V0U2FuZGJveENvbXBhY3Rpb25Nb2RlbENhbmRpZGF0ZXMobW9kZWwpIHtcbiAgICBjb25zdCB0cmltbWVkID0gbW9kZWwudHJpbSgpO1xuICAgIGlmICghdHJpbW1lZCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IHdpdGhvdXRQcm92aWRlclByZWZpeCA9IHRyaW1tZWQuaW5jbHVkZXMoJy8nKVxuICAgICAgICA/IHRyaW1tZWQuc2xpY2UodHJpbW1lZC5sYXN0SW5kZXhPZignLycpICsgMSlcbiAgICAgICAgOiB0cmltbWVkO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB3aXRob3V0UHJvdmlkZXJQcmVmaXgudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCB3aXRob3V0UGlubmVkRGF0ZSA9IG5vcm1hbGl6ZWQucmVwbGFjZSgvLVxcZHs0fS1cXGR7Mn0tXFxkezJ9JC91LCAnJyk7XG4gICAgcmV0dXJuIFsuLi5uZXcgU2V0KFtub3JtYWxpemVkLCB3aXRob3V0UGlubmVkRGF0ZV0pXTtcbn1cbmNvbnN0IFNBTkRCT1hfQ09OVEVYVF9XSU5ET1dTXzFNID0gbmV3IFNldChbXG4gICAgJ2dwdC01LjYnLFxuICAgICdncHQtNS42LXNvbCcsXG4gICAgJ2dwdC01LjYtdGVycmEnLFxuICAgICdncHQtNS42LWx1bmEnLFxuICAgICdncHQtNS40JyxcbiAgICAnZ3B0LTUuNC0yMDI2LTAzLTA1JyxcbiAgICAnZ3B0LTUuNC1wcm8nLFxuICAgICdncHQtNS40LXByby0yMDI2LTAzLTA1JyxcbiAgICAnZ3B0LTQuMScsXG4gICAgJ2dwdC00LjEtMjAyNS0wNC0xNCcsXG4gICAgJ2dwdC00LjEtbWluaScsXG4gICAgJ2dwdC00LjEtbWluaS0yMDI1LTA0LTE0JyxcbiAgICAnZ3B0LTQuMS1uYW5vJyxcbiAgICAnZ3B0LTQuMS1uYW5vLTIwMjUtMDQtMTQnLFxuXSk7XG5jb25zdCBTQU5EQk9YX0NPTlRFWFRfV0lORE9XU180MDBLID0gbmV3IFNldChbXG4gICAgJ2dwdC01JyxcbiAgICAnZ3B0LTUtY29kZXgnLFxuICAgICdncHQtNS1taW5pJyxcbiAgICAnZ3B0LTUtbmFubycsXG4gICAgJ2dwdC01LXBybycsXG4gICAgJ2dwdC01LjEnLFxuICAgICdncHQtNS4xLWNvZGV4JyxcbiAgICAnZ3B0LTUuMS1jb2RleC1tYXgnLFxuICAgICdncHQtNS4xLWNvZGV4LW1pbmknLFxuICAgICdncHQtNS4yJyxcbiAgICAnZ3B0LTUuMi1jb2RleCcsXG4gICAgJ2dwdC01LjItY29kZXgtY3liZXInLFxuICAgICdncHQtNS4yLXBybycsXG4gICAgJ2dwdC01LjMtY29kZXgnLFxuICAgICdncHQtNS4zLWNvZGV4LXNwYXJrJyxcbiAgICAnZ3B0LTUuNC1taW5pJyxcbiAgICAnZ3B0LTUuNC1uYW5vJyxcbl0pO1xuY29uc3QgU0FOREJPWF9DT05URVhUX1dJTkRPV1NfMjAwSyA9IG5ldyBTZXQoW1xuICAgICdjb2RleC1taW5pLWxhdGVzdCcsXG4gICAgJ28xJyxcbiAgICAnbzEtMjAyNC0xMi0xNycsXG4gICAgJ28xLXBybycsXG4gICAgJ28zJyxcbiAgICAnbzMtMjAyNS0wNC0xNicsXG4gICAgJ28zLW1pbmknLFxuICAgICdvMy1wcm8nLFxuICAgICdvMy1kZWVwLXJlc2VhcmNoJyxcbiAgICAnbzQtbWluaScsXG4gICAgJ280LW1pbmktMjAyNS0wNC0xNicsXG4gICAgJ280LW1pbmktZGVlcC1yZXNlYXJjaCcsXG5dKTtcbmNvbnN0IFNBTkRCT1hfQ09OVEVYVF9XSU5ET1dTXzEyOEsgPSBuZXcgU2V0KFtcbiAgICAnZ3B0LTRvJyxcbiAgICAnZ3B0LTRvLTIwMjQtMDgtMDYnLFxuICAgICdncHQtNG8tbWluaScsXG4gICAgJ2dwdC00by1taW5pLTIwMjQtMDctMTgnLFxuICAgICdncHQtNS1jaGF0LWxhdGVzdCcsXG4gICAgJ2dwdC01LjEtY2hhdC1sYXRlc3QnLFxuICAgICdncHQtNS4yLWNoYXQtbGF0ZXN0JyxcbiAgICAnZ3B0LTUuMy1jaGF0LWxhdGVzdCcsXG5dKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbXBhY3Rpb24ubWpzLm1hcCIsImltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuaW1wb3J0IHsgVXNlckVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9ycy5tanNcIjtcbmltcG9ydCB7IGFwcGx5UGF0Y2hUb29sLCB0b29sLCB9IGZyb20gXCIuLi8uLi90b29sLm1qc1wiO1xuaW1wb3J0IHsgQXBwbHlQYXRjaE9wZXJhdGlvbiB9IGZyb20gXCIuLi8uLi90eXBlcy9wcm90b2NvbC5tanNcIjtcbmltcG9ydCB7IGVuY29kZVVpbnQ4QXJyYXlUb0Jhc2U2NCB9IGZyb20gXCIuLi8uLi91dGlscy9iYXNlNjQubWpzXCI7XG5pbXBvcnQgeyB3aXRoU2FuZGJveFNwYW4gfSBmcm9tIFwiLi4vcnVudGltZS9zcGFucy5tanNcIjtcbmltcG9ydCB7IGlzUmVjb3JkIH0gZnJvbSBcIi4uL3NoYXJlZC90eXBlR3VhcmRzLm1qc1wiO1xuaW1wb3J0IHsgQ2FwYWJpbGl0eSwgcmVxdWlyZUJvdW5kU2Vzc2lvbiwgfSBmcm9tIFwiLi9iYXNlLm1qc1wiO1xuaW1wb3J0IHsgc3VwcG9ydHNBcHBseVBhdGNoVHJhbnNwb3J0LCBzdXBwb3J0c1N0cnVjdHVyZWRUb29sT3V0cHV0VHJhbnNwb3J0LCB9IGZyb20gXCIuL3RyYW5zcG9ydC5tanNcIjtcbmNvbnN0IGFwcGx5UGF0Y2hGdW5jdGlvblBhcmFtZXRlcnMgPSB7XG4gICAgdHlwZTogJ29iamVjdCcsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgICBwYXRjaDoge1xuICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0EgZnJlZWZvcm0gYXBwbHlfcGF0Y2ggcGF5bG9hZCB3cmFwcGVkIGluICoqKiBCZWdpbiBQYXRjaCBhbmQgKioqIEVuZCBQYXRjaC4nLFxuICAgICAgICB9LFxuICAgICAgICBvcGVyYXRpb246IHtcbiAgICAgICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdBIHNpbmdsZSBzdHJ1Y3R1cmVkIGFwcGx5X3BhdGNoIG9wZXJhdGlvbi4nLFxuICAgICAgICB9LFxuICAgICAgICBvcGVyYXRpb25zOiB7XG4gICAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgICAgaXRlbXM6IHsgdHlwZTogJ29iamVjdCcgfSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnU3RydWN0dXJlZCBhcHBseV9wYXRjaCBvcGVyYXRpb25zIHRvIGFwcGx5IGluIG9yZGVyLicsXG4gICAgICAgIH0sXG4gICAgICAgIGNvbW1hbmQ6IHtcbiAgICAgICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ09wdGlvbmFsIFtcImFwcGx5X3BhdGNoXCIsIHBhdGNoXSBjb21tYW5kIHR1cGxlIGZvcm0uJyxcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICBlbnVtOiBbJ2NyZWF0ZV9maWxlJywgJ3VwZGF0ZV9maWxlJywgJ2RlbGV0ZV9maWxlJ10sXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBwYXRjaCBvcGVyYXRpb24gdG8gYXBwbHkuJyxcbiAgICAgICAgfSxcbiAgICAgICAgcGF0aDoge1xuICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBzYW5kYm94IGZpbGUgcGF0aCB0byBwYXRjaC4nLFxuICAgICAgICB9LFxuICAgICAgICBkaWZmOiB7XG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIFY0QSBwYXRjaCBkaWZmIGZvciBjcmVhdGVfZmlsZSBhbmQgdXBkYXRlX2ZpbGUgb3BlcmF0aW9ucy4nLFxuICAgICAgICB9LFxuICAgICAgICBtb3ZlVG86IHtcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdPcHRpb25hbCBkZXN0aW5hdGlvbiBwYXRoIGZvciB1cGRhdGVfZmlsZSBtb3ZlIG9wZXJhdGlvbnMuJyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHJlcXVpcmVkOiBbXSxcbiAgICBhZGRpdGlvbmFsUHJvcGVydGllczogdHJ1ZSxcbn07XG5jb25zdCBCRUdJTl9QQVRDSCA9ICcqKiogQmVnaW4gUGF0Y2gnO1xuY29uc3QgRU5EX1BBVENIID0gJyoqKiBFbmQgUGF0Y2gnO1xuY29uc3QgQUREX0ZJTEUgPSAnKioqIEFkZCBGaWxlOiAnO1xuY29uc3QgREVMRVRFX0ZJTEUgPSAnKioqIERlbGV0ZSBGaWxlOiAnO1xuY29uc3QgVVBEQVRFX0ZJTEUgPSAnKioqIFVwZGF0ZSBGaWxlOiAnO1xuY29uc3QgTU9WRV9UTyA9ICcqKiogTW92ZSB0bzogJztcbmZ1bmN0aW9uIHRvRXJyb3JNZXNzYWdlKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yLm1lc3NhZ2UgfHwgZXJyb3IudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGVycm9yKTtcbiAgICB9XG4gICAgY2F0Y2gge1xuICAgICAgICByZXR1cm4gU3RyaW5nKGVycm9yKTtcbiAgICB9XG59XG5mdW5jdGlvbiByZW5kZXJJbWFnZUZvclRleHRUcmFuc3BvcnQob3V0cHV0KSB7XG4gICAgaWYgKHR5cGVvZiBvdXRwdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfVxuICAgIGNvbnN0IGltYWdlID0gb3V0cHV0LmltYWdlO1xuICAgIGlmICh0eXBlb2YgaW1hZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBpbWFnZTtcbiAgICB9XG4gICAgaWYgKCFpc1JlY29yZChpbWFnZSkpIHtcbiAgICAgICAgcmV0dXJuICdObyBpbWFnZSBkYXRhIHdhcyByZXR1cm5lZCBieSB0aGUgc2FuZGJveCBzZXNzaW9uLic7XG4gICAgfVxuICAgIGNvbnN0IGltYWdlUmVjb3JkID0gaW1hZ2U7XG4gICAgaWYgKHR5cGVvZiBpbWFnZVJlY29yZC51cmwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBpbWFnZVJlY29yZC51cmw7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgaW1hZ2VSZWNvcmQuZmlsZUlkID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gYE9wZW5BSSBmaWxlIHJlZmVyZW5jZTogJHtpbWFnZVJlY29yZC5maWxlSWR9YDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBpbWFnZVJlY29yZC5kYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBtZWRpYVR5cGUgPSB0eXBlb2YgaW1hZ2VSZWNvcmQubWVkaWFUeXBlID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyBpbWFnZVJlY29yZC5tZWRpYVR5cGVcbiAgICAgICAgICAgIDogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7XG4gICAgICAgIHJldHVybiBgZGF0YToke21lZGlhVHlwZX07YmFzZTY0LCR7aW1hZ2VSZWNvcmQuZGF0YX1gO1xuICAgIH1cbiAgICBpZiAoaW1hZ2VSZWNvcmQuZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgY29uc3QgbWVkaWFUeXBlID0gdHlwZW9mIGltYWdlUmVjb3JkLm1lZGlhVHlwZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgID8gaW1hZ2VSZWNvcmQubWVkaWFUeXBlXG4gICAgICAgICAgICA6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nO1xuICAgICAgICByZXR1cm4gYGRhdGE6JHttZWRpYVR5cGV9O2Jhc2U2NCwke2VuY29kZVVpbnQ4QXJyYXlUb0Jhc2U2NChpbWFnZVJlY29yZC5kYXRhKX1gO1xuICAgIH1cbiAgICByZXR1cm4gJ05vIGltYWdlIGRhdGEgd2FzIHJldHVybmVkIGJ5IHRoZSBzYW5kYm94IHNlc3Npb24uJztcbn1cbmZ1bmN0aW9uIHJlbmRlclZpZXdJbWFnZUVycm9yKHBhdGgsIGVycm9yKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IHRvRXJyb3JNZXNzYWdlKGVycm9yKTtcbiAgICBpZiAoL25vdCBmb3VuZC9pdS50ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICAgIHJldHVybiBgaW1hZ2UgcGF0aCBcXGAke3BhdGh9XFxgIHdhcyBub3QgZm91bmRgO1xuICAgIH1cbiAgICBpZiAoL25vdCBhIGZpbGUvaXUudGVzdChtZXNzYWdlKSkge1xuICAgICAgICByZXR1cm4gYGltYWdlIHBhdGggXFxgJHtwYXRofVxcYCBpcyBub3QgYSBmaWxlYDtcbiAgICB9XG4gICAgaWYgKC9leGNlZWRzIHRoZSAxMCBNQiBsaW1pdHxleGNlZWRlZCB0aGUgYWxsb3dlZCBzaXplL2l1LnRlc3QobWVzc2FnZSkpIHtcbiAgICAgICAgcmV0dXJuIGBpbWFnZSBwYXRoIFxcYCR7cGF0aH1cXGAgZXhjZWVkZWQgdGhlIGFsbG93ZWQgc2l6ZSBvZiAxME1COyByZXNpemUgb3IgY29tcHJlc3MgdGhlIGltYWdlIGFuZCB0cnkgYWdhaW5gO1xuICAgIH1cbiAgICBpZiAoL3Vuc3VwcG9ydGVkIGltYWdlIGZvcm1hdHxub3QgYSBzdXBwb3J0ZWQgaW1hZ2UvaXUudGVzdChtZXNzYWdlKSkge1xuICAgICAgICByZXR1cm4gYGltYWdlIHBhdGggXFxgJHtwYXRofVxcYCBpcyBub3QgYSBzdXBwb3J0ZWQgaW1hZ2UgZmlsZWA7XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubmFtZSA6IHR5cGVvZiBlcnJvcjtcbiAgICByZXR1cm4gYHVuYWJsZSB0byByZWFkIGltYWdlIGF0IFxcYCR7cGF0aH1cXGA6ICR7bmFtZX1gO1xufVxuZnVuY3Rpb24gcGFyc2VBcHBseVBhdGNoSW5wdXQocmF3SW5wdXQpIHtcbiAgICBjb25zdCB0cmltbWVkSW5wdXQgPSByYXdJbnB1dC50cmltU3RhcnQoKTtcbiAgICBpZiAodHJpbW1lZElucHV0LnN0YXJ0c1dpdGgoQkVHSU5fUEFUQ0gpKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUZyZWVmb3JtUGF0Y2godHJpbW1lZElucHV0KTtcbiAgICB9XG4gICAgbGV0IHBheWxvYWQ7XG4gICAgdHJ5IHtcbiAgICAgICAgcGF5bG9hZCA9IEpTT04ucGFyc2UocmF3SW5wdXQpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiBgSW52YWxpZCBhcHBseV9wYXRjaCBKU09OOiAke3RvRXJyb3JNZXNzYWdlKGVycm9yKX1gLFxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VBcHBseVBhdGNoUGF5bG9hZChwYXlsb2FkKTtcbn1cbmZ1bmN0aW9uIHBhcnNlQXBwbHlQYXRjaFBheWxvYWQocGF5bG9hZCkge1xuICAgIGlmICh0eXBlb2YgcGF5bG9hZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlRnJlZWZvcm1QYXRjaChwYXlsb2FkKTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGF5bG9hZCkpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlU3RydWN0dXJlZE9wZXJhdGlvbnMocGF5bG9hZCk7XG4gICAgfVxuICAgIGlmICghaXNSZWNvcmQocGF5bG9hZCkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiAnYXBwbHlfcGF0Y2ggaW5wdXQgbXVzdCBiZSBhbiBvYmplY3Qgb3IgYXJyYXkuJyxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwYXlsb2FkLnBhdGNoID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gcGFyc2VGcmVlZm9ybVBhdGNoKHBheWxvYWQucGF0Y2gpO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXlsb2FkLmNvbW1hbmQpKSB7XG4gICAgICAgIGNvbnN0IFtjb21tYW5kTmFtZSwgcGF0Y2hdID0gcGF5bG9hZC5jb21tYW5kO1xuICAgICAgICBpZiAoY29tbWFuZE5hbWUgPT09ICdhcHBseV9wYXRjaCcgJiYgdHlwZW9mIHBhdGNoID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlRnJlZWZvcm1QYXRjaChwYXRjaCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGF5bG9hZC5vcGVyYXRpb25zKSkge1xuICAgICAgICByZXR1cm4gcGFyc2VTdHJ1Y3R1cmVkT3BlcmF0aW9ucyhwYXlsb2FkLm9wZXJhdGlvbnMpO1xuICAgIH1cbiAgICBpZiAocGF5bG9hZC5vcGVyYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gcGFyc2VTdHJ1Y3R1cmVkT3BlcmF0aW9ucyhbcGF5bG9hZC5vcGVyYXRpb25dKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlU3RydWN0dXJlZE9wZXJhdGlvbnMoW3BheWxvYWRdKTtcbn1cbmZ1bmN0aW9uIHBhcnNlU3RydWN0dXJlZE9wZXJhdGlvbnMocGF5bG9hZHMpIHtcbiAgICBjb25zdCBvcGVyYXRpb25zID0gW107XG4gICAgZm9yIChjb25zdCBwYXlsb2FkIG9mIHBheWxvYWRzKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEFwcGx5UGF0Y2hPcGVyYXRpb24uc2FmZVBhcnNlKHBheWxvYWQpO1xuICAgICAgICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlcnJvcjogYEludmFsaWQgYXBwbHlfcGF0Y2ggb3BlcmF0aW9uOiAke3BhcnNlZC5lcnJvci5tZXNzYWdlfWAsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIG9wZXJhdGlvbnMucHVzaChwYXJzZWQuZGF0YSk7XG4gICAgfVxuICAgIGlmIChvcGVyYXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIGVycm9yOiAnYXBwbHlfcGF0Y2ggaW5wdXQgbXVzdCBpbmNsdWRlIGFuIG9wZXJhdGlvbi4nIH07XG4gICAgfVxuICAgIHJldHVybiB7IG9rOiB0cnVlLCBvcGVyYXRpb25zIH07XG59XG5mdW5jdGlvbiBwYXJzZUZyZWVmb3JtUGF0Y2gocmF3UGF0Y2gpIHtcbiAgICBjb25zdCBsaW5lcyA9IHJhd1BhdGNoLnNwbGl0KC9cXHI/XFxuLyk7XG4gICAgaWYgKGxpbmVzLmF0KC0xKSA9PT0gJycpIHtcbiAgICAgICAgbGluZXMucG9wKCk7XG4gICAgfVxuICAgIGlmIChsaW5lc1swXSAhPT0gQkVHSU5fUEFUQ0gpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiBgYXBwbHlfcGF0Y2ggaW5wdXQgbXVzdCBzdGFydCB3aXRoIFwiJHtCRUdJTl9QQVRDSH1cIi5gLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAobGluZXMubGVuZ3RoIDwgMiB8fCBsaW5lcy5hdCgtMSkgIT09IEVORF9QQVRDSCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6IGBhcHBseV9wYXRjaCBpbnB1dCBtdXN0IGVuZCB3aXRoIFwiJHtFTkRfUEFUQ0h9XCIuYCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29uc3Qgb3BlcmF0aW9ucyA9IFtdO1xuICAgIGxldCBpbmRleCA9IDE7XG4gICAgd2hpbGUgKGluZGV4IDwgbGluZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICBjb25zdCBsaW5lID0gbGluZXNbaW5kZXhdO1xuICAgICAgICBsZXQgcGFyc2VkO1xuICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKEFERF9GSUxFKSkge1xuICAgICAgICAgICAgcGFyc2VkID0gcGFyc2VBZGRGaWxlUGF0Y2gobGluZXMsIGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoREVMRVRFX0ZJTEUpKSB7XG4gICAgICAgICAgICBwYXJzZWQgPSBwYXJzZURlbGV0ZUZpbGVQYXRjaChsaW5lcywgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aChVUERBVEVfRklMRSkpIHtcbiAgICAgICAgICAgIHBhcnNlZCA9IHBhcnNlVXBkYXRlRmlsZVBhdGNoKGxpbmVzLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlcnJvcjogYEludmFsaWQgYXBwbHlfcGF0Y2ggZmlsZSBvcGVyYXRpb24gaGVhZGVyOiAke2xpbmV9YCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCdlcnJvcicgaW4gcGFyc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIGVycm9yOiBwYXJzZWQuZXJyb3IgfTtcbiAgICAgICAgfVxuICAgICAgICBvcGVyYXRpb25zLnB1c2gocGFyc2VkLm9wZXJhdGlvbik7XG4gICAgICAgIGluZGV4ID0gcGFyc2VkLm5leHRJbmRleDtcbiAgICB9XG4gICAgaWYgKG9wZXJhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogJ2FwcGx5X3BhdGNoIGlucHV0IG11c3QgaW5jbHVkZSBhdCBsZWFzdCBvbmUgZmlsZSBvcGVyYXRpb24uJyxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgb2s6IHRydWUsIG9wZXJhdGlvbnMgfTtcbn1cbmZ1bmN0aW9uIHBhcnNlQWRkRmlsZVBhdGNoKGxpbmVzLCBpbmRleCkge1xuICAgIGNvbnN0IHBhdGggPSBwYXJzZVBhdGNoSGVhZGVyKGxpbmVzW2luZGV4XSwgQUREX0ZJTEUpO1xuICAgIGlmICghcGF0aCkge1xuICAgICAgICByZXR1cm4geyBlcnJvcjogYE1pc3NpbmcgcGF0aCBpbiBhcHBseV9wYXRjaCBoZWFkZXI6ICR7bGluZXNbaW5kZXhdfWAgfTtcbiAgICB9XG4gICAgaW5kZXggKz0gMTtcbiAgICBjb25zdCBkaWZmTGluZXMgPSBbXTtcbiAgICB3aGlsZSAoaW5kZXggPCBsaW5lcy5sZW5ndGggLSAxICYmICFpc0ZpbGVPcGVyYXRpb25IZWFkZXIobGluZXNbaW5kZXhdKSkge1xuICAgICAgICBjb25zdCBsaW5lID0gbGluZXNbaW5kZXhdO1xuICAgICAgICBpZiAoIWxpbmUuc3RhcnRzV2l0aCgnKycpKSB7XG4gICAgICAgICAgICByZXR1cm4geyBlcnJvcjogYEludmFsaWQgQWRkIEZpbGUgbGluZTogJHtsaW5lfWAgfTtcbiAgICAgICAgfVxuICAgICAgICBkaWZmTGluZXMucHVzaChsaW5lKTtcbiAgICAgICAgaW5kZXggKz0gMTtcbiAgICB9XG4gICAgaWYgKGRpZmZMaW5lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVycm9yOiBgQWRkIEZpbGUgcGF0Y2ggZm9yICR7cGF0aH0gbXVzdCBpbmNsdWRlIGF0IGxlYXN0IG9uZSArIGxpbmUuYCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgb3BlcmF0aW9uOiB7XG4gICAgICAgICAgICB0eXBlOiAnY3JlYXRlX2ZpbGUnLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIGRpZmY6IGpvaW5EaWZmKGRpZmZMaW5lcyksXG4gICAgICAgIH0sXG4gICAgICAgIG5leHRJbmRleDogaW5kZXgsXG4gICAgfTtcbn1cbmZ1bmN0aW9uIHBhcnNlRGVsZXRlRmlsZVBhdGNoKGxpbmVzLCBpbmRleCkge1xuICAgIGNvbnN0IHBhdGggPSBwYXJzZVBhdGNoSGVhZGVyKGxpbmVzW2luZGV4XSwgREVMRVRFX0ZJTEUpO1xuICAgIGlmICghcGF0aCkge1xuICAgICAgICByZXR1cm4geyBlcnJvcjogYE1pc3NpbmcgcGF0aCBpbiBhcHBseV9wYXRjaCBoZWFkZXI6ICR7bGluZXNbaW5kZXhdfWAgfTtcbiAgICB9XG4gICAgaW5kZXggKz0gMTtcbiAgICBpZiAoaW5kZXggPCBsaW5lcy5sZW5ndGggLSAxICYmICFpc0ZpbGVPcGVyYXRpb25IZWFkZXIobGluZXNbaW5kZXhdKSkge1xuICAgICAgICByZXR1cm4geyBlcnJvcjogYERlbGV0ZSBGaWxlIHBhdGNoIGZvciAke3BhdGh9IG11c3Qgbm90IGluY2x1ZGUgYSBkaWZmLmAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgb3BlcmF0aW9uOiB7XG4gICAgICAgICAgICB0eXBlOiAnZGVsZXRlX2ZpbGUnLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgfSxcbiAgICAgICAgbmV4dEluZGV4OiBpbmRleCxcbiAgICB9O1xufVxuZnVuY3Rpb24gcGFyc2VVcGRhdGVGaWxlUGF0Y2gobGluZXMsIGluZGV4KSB7XG4gICAgY29uc3QgcGF0aCA9IHBhcnNlUGF0Y2hIZWFkZXIobGluZXNbaW5kZXhdLCBVUERBVEVfRklMRSk7XG4gICAgaWYgKCFwYXRoKSB7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBgTWlzc2luZyBwYXRoIGluIGFwcGx5X3BhdGNoIGhlYWRlcjogJHtsaW5lc1tpbmRleF19YCB9O1xuICAgIH1cbiAgICBpbmRleCArPSAxO1xuICAgIGxldCBtb3ZlVG87XG4gICAgaWYgKGluZGV4IDwgbGluZXMubGVuZ3RoIC0gMSAmJiBsaW5lc1tpbmRleF0uc3RhcnRzV2l0aChNT1ZFX1RPKSkge1xuICAgICAgICBjb25zdCBwYXJzZWRNb3ZlVG8gPSBwYXJzZVBhdGNoSGVhZGVyKGxpbmVzW2luZGV4XSwgTU9WRV9UTyk7XG4gICAgICAgIGlmICghcGFyc2VkTW92ZVRvKSB7XG4gICAgICAgICAgICByZXR1cm4geyBlcnJvcjogYE1pc3NpbmcgcGF0aCBpbiBhcHBseV9wYXRjaCBoZWFkZXI6ICR7bGluZXNbaW5kZXhdfWAgfTtcbiAgICAgICAgfVxuICAgICAgICBtb3ZlVG8gPSBwYXJzZWRNb3ZlVG87XG4gICAgICAgIGluZGV4ICs9IDE7XG4gICAgfVxuICAgIGNvbnN0IGRpZmZMaW5lcyA9IFtdO1xuICAgIHdoaWxlIChpbmRleCA8IGxpbmVzLmxlbmd0aCAtIDEgJiYgIWlzRmlsZU9wZXJhdGlvbkhlYWRlcihsaW5lc1tpbmRleF0pKSB7XG4gICAgICAgIGRpZmZMaW5lcy5wdXNoKGxpbmVzW2luZGV4XSk7XG4gICAgICAgIGluZGV4ICs9IDE7XG4gICAgfVxuICAgIGlmIChkaWZmTGluZXMubGVuZ3RoID09PSAwICYmICFtb3ZlVG8pIHtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IGBVcGRhdGUgRmlsZSBwYXRjaCBmb3IgJHtwYXRofSBtdXN0IGluY2x1ZGUgYSBodW5rLmAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgb3BlcmF0aW9uOiB7XG4gICAgICAgICAgICB0eXBlOiAndXBkYXRlX2ZpbGUnLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIGRpZmY6IGRpZmZMaW5lcy5sZW5ndGggPiAwID8gam9pbkRpZmYoZGlmZkxpbmVzKSA6ICcnLFxuICAgICAgICAgICAgLi4uKG1vdmVUbyA/IHsgbW92ZVRvIH0gOiB7fSksXG4gICAgICAgIH0sXG4gICAgICAgIG5leHRJbmRleDogaW5kZXgsXG4gICAgfTtcbn1cbmZ1bmN0aW9uIHBhcnNlUGF0Y2hIZWFkZXIobGluZSwgcHJlZml4KSB7XG4gICAgY29uc3QgcGF0aCA9IGxpbmUuc2xpY2UocHJlZml4Lmxlbmd0aCkudHJpbSgpO1xuICAgIHJldHVybiBwYXRoID8gcGF0aCA6IG51bGw7XG59XG5mdW5jdGlvbiBpc0ZpbGVPcGVyYXRpb25IZWFkZXIobGluZSkge1xuICAgIHJldHVybiAobGluZS5zdGFydHNXaXRoKEFERF9GSUxFKSB8fFxuICAgICAgICBsaW5lLnN0YXJ0c1dpdGgoREVMRVRFX0ZJTEUpIHx8XG4gICAgICAgIGxpbmUuc3RhcnRzV2l0aChVUERBVEVfRklMRSkpO1xufVxuZnVuY3Rpb24gam9pbkRpZmYobGluZXMpIHtcbiAgICByZXR1cm4gYCR7bGluZXMuam9pbignXFxuJyl9XFxuYDtcbn1cbmFzeW5jIGZ1bmN0aW9uIGFwcGx5UGF0Y2hPcGVyYXRpb24oZWRpdG9yLCBvcGVyYXRpb24sIHJ1bkNvbnRleHQpIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICAgIHN3aXRjaCAob3BlcmF0aW9uLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2NyZWF0ZV9maWxlJzpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBhd2FpdCBlZGl0b3IuY3JlYXRlRmlsZShvcGVyYXRpb24sIHsgcnVuQ29udGV4dCB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3VwZGF0ZV9maWxlJzpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBhd2FpdCBlZGl0b3IudXBkYXRlRmlsZShvcGVyYXRpb24sIHsgcnVuQ29udGV4dCB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RlbGV0ZV9maWxlJzpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBhd2FpdCBlZGl0b3IuZGVsZXRlRmlsZShvcGVyYXRpb24sIHsgcnVuQ29udGV4dCB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdVbnN1cHBvcnRlZCBhcHBseV9wYXRjaCBvcGVyYXRpb24uJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGBGYWlsZWQgdG8gYXBwbHkgcGF0Y2g6ICR7dG9FcnJvck1lc3NhZ2UoZXJyb3IpfWA7XG4gICAgfVxuICAgIGlmIChyZXN1bHQ/LnN0YXR1cyA9PT0gJ2ZhaWxlZCcpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5vdXRwdXQgPyBgUGF0Y2ggZmFpbGVkOiAke3Jlc3VsdC5vdXRwdXR9YCA6ICdQYXRjaCBmYWlsZWQuJztcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdD8ub3V0cHV0ID8/ICdQYXRjaCBhcHBsaWVkLic7XG59XG5hc3luYyBmdW5jdGlvbiBhcHBseVBhdGNoT3BlcmF0aW9ucyhlZGl0b3IsIG9wZXJhdGlvbnMsIHJ1bkNvbnRleHQpIHtcbiAgICBjb25zdCBvdXRwdXRzID0gW107XG4gICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBhcHBseVBhdGNoT3BlcmF0aW9uKGVkaXRvciwgb3BlcmF0aW9uLCBydW5Db250ZXh0KTtcbiAgICAgICAgaWYgKG91dHB1dCkge1xuICAgICAgICAgICAgb3V0cHV0cy5wdXNoKG91dHB1dCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dHMuam9pbignXFxuJykgfHwgJ1BhdGNoIGFwcGxpZWQuJztcbn1cbmZ1bmN0aW9uIGFwcGx5UGF0Y2hGdW5jdGlvblRvb2woZWRpdG9yKSB7XG4gICAgY29uc3QgZmFsbGJhY2tUb29sID0ge1xuICAgICAgICB0eXBlOiAnZnVuY3Rpb24nLFxuICAgICAgICBuYW1lOiAnYXBwbHlfcGF0Y2gnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ0FwcGxpZXMgYSBjcmVhdGUsIHVwZGF0ZSwgbW92ZSwgb3IgZGVsZXRlIGZpbGUgcGF0Y2ggaW4gdGhlIHNhbmRib3ggd29ya3NwYWNlLiBBY2NlcHRzIGEgZnJlZWZvcm0gcGF0Y2ggc3RyaW5nIG9yIHN0cnVjdHVyZWQgYXBwbHlfcGF0Y2ggb3BlcmF0aW9ucy4nLFxuICAgICAgICBwYXJhbWV0ZXJzOiBhcHBseVBhdGNoRnVuY3Rpb25QYXJhbWV0ZXJzLFxuICAgICAgICBzdHJpY3Q6IGZhbHNlLFxuICAgICAgICBkZWZlckxvYWRpbmc6IGZhbHNlLFxuICAgICAgICBuZWVkc0FwcHJvdmFsOiBhc3luYyAoKSA9PiBmYWxzZSxcbiAgICAgICAgaXNFbmFibGVkOiBhc3luYyAoKSA9PiB0cnVlLFxuICAgICAgICBpbnZva2U6IGFzeW5jIChydW5Db250ZXh0LCBpbnB1dCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VBcHBseVBhdGNoSW5wdXQoaW5wdXQpO1xuICAgICAgICAgICAgaWYgKCFwYXJzZWQub2spIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VkLmVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGFwcGx5UGF0Y2hPcGVyYXRpb25zKGVkaXRvciwgcGFyc2VkLm9wZXJhdGlvbnMsIHJ1bkNvbnRleHQpO1xuICAgICAgICB9LFxuICAgIH07XG4gICAgcmV0dXJuIGZhbGxiYWNrVG9vbDtcbn1cbmNsYXNzIEZpbGVzeXN0ZW1DYXBhYmlsaXR5IGV4dGVuZHMgQ2FwYWJpbGl0eSB7XG4gICAgdHlwZSA9ICdmaWxlc3lzdGVtJztcbiAgICBjb25maWd1cmVUb29scztcbiAgICBjb25zdHJ1Y3RvcihhcmdzID0ge30pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb25maWd1cmVUb29scyA9IGFyZ3MuY29uZmlndXJlVG9vbHM7XG4gICAgfVxuICAgIHRvb2xzKCkge1xuICAgICAgICBjb25zdCBzZXNzaW9uID0gcmVxdWlyZUJvdW5kU2Vzc2lvbih0aGlzLnR5cGUsIHRoaXMuX3Nlc3Npb24pO1xuICAgICAgICBjb25zdCBlZGl0b3IgPSBzZXNzaW9uLmNyZWF0ZUVkaXRvcj8uKHRoaXMuX3J1bkFzKTtcbiAgICAgICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ0ZpbGVzeXN0ZW0gc2FuZGJveCBzZXNzaW9ucyBtdXN0IHByb3ZpZGUgY3JlYXRlRWRpdG9yKCkuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG9vbHMgPSBbXTtcbiAgICAgICAgY29uc3Qgdmlld0ltYWdlID0gYXN5bmMgKHBhdGgpID0+IHtcbiAgICAgICAgICAgIGlmICghc2Vzc2lvbi52aWV3SW1hZ2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdGaWxlc3lzdGVtIHNhbmRib3ggc2Vzc2lvbnMgbXVzdCBwcm92aWRlIHZpZXdJbWFnZSgpLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgd2l0aFNhbmRib3hTcGFuKCdzYW5kYm94LnZpZXdfaW1hZ2UnLCB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHJ1bl9hczogdGhpcy5fcnVuQXMsXG4gICAgICAgICAgICAgICAgfSwgYXN5bmMgKCkgPT4gYXdhaXQgc2Vzc2lvbi52aWV3SW1hZ2Uoe1xuICAgICAgICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICAgICAgICBydW5BczogdGhpcy5fcnVuQXMsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlbmRlclZpZXdJbWFnZUVycm9yKHBhdGgsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHN1cHBvcnRzU3RydWN0dXJlZFRvb2xPdXRwdXRUcmFuc3BvcnQodGhpcy5fbW9kZWxJbnN0YW5jZSkpIHtcbiAgICAgICAgICAgIHRvb2xzLnB1c2godG9vbCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ3ZpZXdfaW1hZ2UnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnUmV0dXJucyBhbiBpbWFnZSBvdXRwdXQgZnJvbSBhIGxvY2FsIHBhdGggaW4gdGhlIHNhbmRib3ggd29ya3NwYWNlLicsXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyczogei5vYmplY3Qoe1xuICAgICAgICAgICAgICAgICAgICBwYXRoOiB6LnN0cmluZygpLmRlc2NyaWJlKCdMb2NhbCBmaWxlc3lzdGVtIHBhdGggdG8gYW4gaW1hZ2UgZmlsZScpLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IHBhdGgsIH0pID0+IGF3YWl0IHZpZXdJbWFnZShwYXRoKSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRvb2xzLnB1c2godG9vbCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ3ZpZXdfaW1hZ2UnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnUmV0dXJucyBhbiBpbWFnZSBmcm9tIGEgbG9jYWwgcGF0aCBpbiB0aGUgc2FuZGJveCB3b3Jrc3BhY2UgYXMgYSBkYXRhIFVSTCBvciByZWZlcmVuY2Ugc3RyaW5nLicsXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyczogei5vYmplY3Qoe1xuICAgICAgICAgICAgICAgICAgICBwYXRoOiB6LnN0cmluZygpLmRlc2NyaWJlKCdMb2NhbCBmaWxlc3lzdGVtIHBhdGggdG8gYW4gaW1hZ2UgZmlsZScpLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IHBhdGggfSkgPT4gcmVuZGVySW1hZ2VGb3JUZXh0VHJhbnNwb3J0KGF3YWl0IHZpZXdJbWFnZShwYXRoKSksXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN1cHBvcnRzQXBwbHlQYXRjaFRyYW5zcG9ydCh0aGlzLl9tb2RlbEluc3RhbmNlKSkge1xuICAgICAgICAgICAgdG9vbHMucHVzaChhcHBseVBhdGNoVG9vbCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2FwcGx5X3BhdGNoJyxcbiAgICAgICAgICAgICAgICBlZGl0b3IsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0b29scy5wdXNoKGFwcGx5UGF0Y2hGdW5jdGlvblRvb2woZWRpdG9yKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlndXJlVG9vbHMgPyB0aGlzLmNvbmZpZ3VyZVRvb2xzKFsuLi50b29sc10pIDogdG9vbHM7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGZpbGVzeXN0ZW0oYXJncyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBGaWxlc3lzdGVtQ2FwYWJpbGl0eShhcmdzKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZpbGVzeXN0ZW0ubWpzLm1hcCIsImltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuaW1wb3J0IHsgVXNlckVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9ycy5tanNcIjtcbmltcG9ydCB7IHRvb2wgfSBmcm9tIFwiLi4vLi4vdG9vbC5tanNcIjtcbmltcG9ydCB7IHdpdGhTYW5kYm94U3BhbiB9IGZyb20gXCIuLi9ydW50aW1lL3NwYW5zLm1qc1wiO1xuaW1wb3J0IHsgQ2FwYWJpbGl0eSwgcmVxdWlyZUJvdW5kU2Vzc2lvbiwgfSBmcm9tIFwiLi9iYXNlLm1qc1wiO1xuY29uc3QgREVGQVVMVF9FWEVDX1lJRUxEX1RJTUVfTVMgPSAxMF8wMDA7XG5jb25zdCBERUZBVUxUX1dSSVRFX1NURElOX1lJRUxEX1RJTUVfTVMgPSAyNTA7XG5jb25zdCBTSEVMTF9JTlNUUlVDVElPTlMgPSBbXG4gICAgJ1doZW4gdXNpbmcgdGhlIHNoZWxsOicsXG4gICAgJy0gVXNlIGBleGVjX2NvbW1hbmRgIGZvciBzaGVsbCBleGVjdXRpb24uJyxcbiAgICAnLSBJZiBhdmFpbGFibGUsIHVzZSBgd3JpdGVfc3RkaW5gIHRvIGludGVyYWN0IHdpdGggb3IgcG9sbCBydW5uaW5nIHNlc3Npb25zLicsXG4gICAgJy0gVG8gaW50ZXJydXB0IGEgbG9uZy1ydW5uaW5nIHByb2Nlc3MgdmlhIGB3cml0ZV9zdGRpbmAsIHN0YXJ0IGl0IHdpdGggYHR0eT10cnVlYCBhbmQgc2VuZCBDdHJsLUMgKGBcXFxcdTAwMDNgKS4nLFxuICAgICctIFByZWZlciBgcmdgIGFuZCBgcmcgLS1maWxlc2AgZm9yIHRleHQvZmlsZSBkaXNjb3Zlcnkgd2hlbiBhdmFpbGFibGUuJyxcbiAgICAnLSBBdm9pZCB1c2luZyBQeXRob24gc2NyaXB0cyBqdXN0IHRvIHByaW50IGxhcmdlIGZpbGUgY2h1bmtzLicsXG5dLmpvaW4oJ1xcbicpO1xuY2xhc3MgU2hlbGxDYXBhYmlsaXR5IGV4dGVuZHMgQ2FwYWJpbGl0eSB7XG4gICAgdHlwZSA9ICdzaGVsbCc7XG4gICAgY29uZmlndXJlVG9vbHM7XG4gICAgY29uc3RydWN0b3IoYXJncyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuY29uZmlndXJlVG9vbHMgPSBhcmdzLmNvbmZpZ3VyZVRvb2xzO1xuICAgIH1cbiAgICB0b29scygpIHtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IHJlcXVpcmVCb3VuZFNlc3Npb24odGhpcy50eXBlLCB0aGlzLl9zZXNzaW9uKTtcbiAgICAgICAgaWYgKCFzZXNzaW9uLmV4ZWNDb21tYW5kKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdTaGVsbCBzYW5kYm94IHNlc3Npb25zIG11c3QgcHJvdmlkZSBleGVjQ29tbWFuZCgpLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvb2xzID0gW1xuICAgICAgICAgICAgdG9vbCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2V4ZWNfY29tbWFuZCcsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdSdW5zIGEgY29tbWFuZCBpbiBhIFBUWSwgcmV0dXJuaW5nIG91dHB1dCBvciBhIHNlc3Npb24gSUQgZm9yIG9uZ29pbmcgaW50ZXJhY3Rpb24uJyxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB6Lm9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIGNtZDogei5zdHJpbmcoKS5taW4oMSkuZGVzY3JpYmUoJ1NoZWxsIGNvbW1hbmQgdG8gZXhlY3V0ZS4nKSxcbiAgICAgICAgICAgICAgICAgICAgd29ya2RpcjogelxuICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmluZygpXG4gICAgICAgICAgICAgICAgICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmRlc2NyaWJlKCdPcHRpb25hbCB3b3JraW5nIGRpcmVjdG9yeSB0byBydW4gdGhlIGNvbW1hbmQgaW47IGRlZmF1bHRzIHRvIHRoZSB0dXJuIGN3ZC4nKSxcbiAgICAgICAgICAgICAgICAgICAgc2hlbGw6IHpcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZXNjcmliZShcIlNoZWxsIGJpbmFyeSB0byBsYXVuY2guIERlZmF1bHRzIHRvIHRoZSB1c2VyJ3MgZGVmYXVsdCBzaGVsbC5cIiksXG4gICAgICAgICAgICAgICAgICAgIGxvZ2luOiB6XG4gICAgICAgICAgICAgICAgICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdCh0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmRlc2NyaWJlKCdXaGV0aGVyIHRvIHJ1biB0aGUgc2hlbGwgd2l0aCAtbC8taSBzZW1hbnRpY3MuIERlZmF1bHRzIHRvIHRydWUuJyksXG4gICAgICAgICAgICAgICAgICAgIHR0eTogelxuICAgICAgICAgICAgICAgICAgICAgICAgLmJvb2xlYW4oKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHQoZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGVzY3JpYmUoJ1doZXRoZXIgdG8gYWxsb2NhdGUgYSBUVFkgZm9yIHRoZSBjb21tYW5kLiBEZWZhdWx0cyB0byBmYWxzZSAocGxhaW4gcGlwZXMpOyBzZXQgdG8gdHJ1ZSB0byBvcGVuIGEgUFRZIGFuZCBhY2Nlc3MgVFRZIHByb2Nlc3MuJyksXG4gICAgICAgICAgICAgICAgICAgIHlpZWxkX3RpbWVfbXM6IHpcbiAgICAgICAgICAgICAgICAgICAgICAgIC5udW1iZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmludCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAubWluKDApXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdChERUZBVUxUX0VYRUNfWUlFTERfVElNRV9NUylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZXNjcmliZSgnSG93IGxvbmcgdG8gd2FpdCAoaW4gbWlsbGlzZWNvbmRzKSBmb3Igb3V0cHV0IGJlZm9yZSB5aWVsZGluZy4nKSxcbiAgICAgICAgICAgICAgICAgICAgbWF4X291dHB1dF90b2tlbnM6IHpcbiAgICAgICAgICAgICAgICAgICAgICAgIC5udW1iZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmludCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAubWluKDEpXG4gICAgICAgICAgICAgICAgICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmRlc2NyaWJlKCdNYXhpbXVtIG51bWJlciBvZiB0b2tlbnMgdG8gcmV0dXJuLiBFeGNlc3Mgb3V0cHV0IHdpbGwgYmUgdHJ1bmNhdGVkLicpLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IGNtZCwgd29ya2Rpciwgc2hlbGwsIGxvZ2luLCB0dHksIHlpZWxkX3RpbWVfbXMsIG1heF9vdXRwdXRfdG9rZW5zLCB9KSA9PiBhd2FpdCB3aXRoU2FuZGJveFNwYW4oJ3NhbmRib3guZXhlYycsIHtcbiAgICAgICAgICAgICAgICAgICAgY21kLFxuICAgICAgICAgICAgICAgICAgICB3b3JrZGlyLFxuICAgICAgICAgICAgICAgICAgICBzaGVsbCxcbiAgICAgICAgICAgICAgICAgICAgbG9naW4sXG4gICAgICAgICAgICAgICAgICAgIHR0eSxcbiAgICAgICAgICAgICAgICAgICAgcnVuX2FzOiB0aGlzLl9ydW5BcyxcbiAgICAgICAgICAgICAgICB9LCBhc3luYyAoKSA9PiBhd2FpdCBzZXNzaW9uLmV4ZWNDb21tYW5kKHtcbiAgICAgICAgICAgICAgICAgICAgY21kLFxuICAgICAgICAgICAgICAgICAgICB3b3JrZGlyLFxuICAgICAgICAgICAgICAgICAgICBzaGVsbCxcbiAgICAgICAgICAgICAgICAgICAgbG9naW4sXG4gICAgICAgICAgICAgICAgICAgIHR0eSxcbiAgICAgICAgICAgICAgICAgICAgeWllbGRUaW1lTXM6IHlpZWxkX3RpbWVfbXMsXG4gICAgICAgICAgICAgICAgICAgIG1heE91dHB1dFRva2VuczogbWF4X291dHB1dF90b2tlbnMsXG4gICAgICAgICAgICAgICAgICAgIHJ1bkFzOiB0aGlzLl9ydW5BcyxcbiAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKHNlc3Npb24uc3VwcG9ydHNQdHk/LigpICYmIHNlc3Npb24ud3JpdGVTdGRpbikge1xuICAgICAgICAgICAgdG9vbHMucHVzaCh0b29sKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnd3JpdGVfc3RkaW4nLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnV3JpdGVzIGNoYXJhY3RlcnMgdG8gYW4gZXhpc3RpbmcgdW5pZmllZCBleGVjIHNlc3Npb24gYW5kIHJldHVybnMgcmVjZW50IG91dHB1dC4nLFxuICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IHoub2JqZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbl9pZDogelxuICAgICAgICAgICAgICAgICAgICAgICAgLm51bWJlcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAuaW50KClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZXNjcmliZSgnSWRlbnRpZmllciBvZiB0aGUgcnVubmluZyB1bmlmaWVkIGV4ZWMgc2Vzc2lvbi4nKSxcbiAgICAgICAgICAgICAgICAgICAgY2hhcnM6IHpcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHQoJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGVzY3JpYmUoJ0J5dGVzIHRvIHdyaXRlIHRvIHN0ZGluIChtYXkgYmUgZW1wdHkgdG8gcG9sbCkuJyksXG4gICAgICAgICAgICAgICAgICAgIHlpZWxkX3RpbWVfbXM6IHpcbiAgICAgICAgICAgICAgICAgICAgICAgIC5udW1iZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmludCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAubWluKDApXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdChERUZBVUxUX1dSSVRFX1NURElOX1lJRUxEX1RJTUVfTVMpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZGVzY3JpYmUoJ0hvdyBsb25nIHRvIHdhaXQgKGluIG1pbGxpc2Vjb25kcykgZm9yIG91dHB1dCBiZWZvcmUgeWllbGRpbmcuJyksXG4gICAgICAgICAgICAgICAgICAgIG1heF9vdXRwdXRfdG9rZW5zOiB6XG4gICAgICAgICAgICAgICAgICAgICAgICAubnVtYmVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5pbnQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1pbigxKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZXNjcmliZSgnTWF4aW11bSBudW1iZXIgb2YgdG9rZW5zIHRvIHJldHVybi4gRXhjZXNzIG91dHB1dCB3aWxsIGJlIHRydW5jYXRlZC4nKSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBleGVjdXRlOiBhc3luYyAoeyBzZXNzaW9uX2lkLCBjaGFycywgeWllbGRfdGltZV9tcywgbWF4X291dHB1dF90b2tlbnMsIH0pID0+IGF3YWl0IHdpdGhTYW5kYm94U3Bhbignc2FuZGJveC53cml0ZV9zdGRpbicsIHtcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbl9pZCxcbiAgICAgICAgICAgICAgICB9LCBhc3luYyAoKSA9PiBhd2FpdCBzZXNzaW9uLndyaXRlU3RkaW4oe1xuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQ6IHNlc3Npb25faWQsXG4gICAgICAgICAgICAgICAgICAgIGNoYXJzLFxuICAgICAgICAgICAgICAgICAgICB5aWVsZFRpbWVNczogeWllbGRfdGltZV9tcyxcbiAgICAgICAgICAgICAgICAgICAgbWF4T3V0cHV0VG9rZW5zOiBtYXhfb3V0cHV0X3Rva2VucyxcbiAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlndXJlVG9vbHMgPyB0aGlzLmNvbmZpZ3VyZVRvb2xzKFsuLi50b29sc10pIDogdG9vbHM7XG4gICAgfVxuICAgIGluc3RydWN0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIFNIRUxMX0lOU1RSVUNUSU9OUztcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gc2hlbGwoYXJncyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBTaGVsbENhcGFiaWxpdHkoYXJncyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaGVsbC5tanMubWFwIiwiaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5pbXBvcnQgeyB0b29sIH0gZnJvbSBcIi4uLy4uL3Rvb2wubWpzXCI7XG5pbXBvcnQgeyBkaXIsIGZpbGUsIGlzRGlyLCBpc0RpcmVjdG9yeUxpa2VFbnRyeSwgfSBmcm9tIFwiLi4vZW50cmllcy9pbmRleC5tanNcIjtcbmltcG9ydCB7IFNhbmRib3hTa2lsbHNDb25maWdFcnJvciB9IGZyb20gXCIuLi9lcnJvcnMubWpzXCI7XG5pbXBvcnQgeyBub3JtYWxpemVSZWxhdGl2ZVBhdGggfSBmcm9tIFwiLi4vbWFuaWZlc3QubWpzXCI7XG5pbXBvcnQgeyBwcm9tcHQgfSBmcm9tIFwiLi4vcnVudGltZS9wcm9tcHRzLm1qc1wiO1xuaW1wb3J0IHsgQ2FwYWJpbGl0eSwgcmVxdWlyZUJvdW5kU2Vzc2lvbiB9IGZyb20gXCIuL2Jhc2UubWpzXCI7XG5jbGFzcyBTa2lsbHNDYXBhYmlsaXR5IGV4dGVuZHMgQ2FwYWJpbGl0eSB7XG4gICAgdHlwZSA9ICdza2lsbHMnO1xuICAgIHNraWxscztcbiAgICBmcm9tO1xuICAgIGxhenlGcm9tO1xuICAgIGluZGV4O1xuICAgIHNraWxsc1BhdGg7XG4gICAgY29uc3RydWN0b3IoYXJncykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNraWxscyA9IGFyZ3Muc2tpbGxzID8/IFtdO1xuICAgICAgICB0aGlzLmZyb20gPSBhcmdzLmZyb207XG4gICAgICAgIHRoaXMubGF6eUZyb20gPSBhcmdzLmxhenlGcm9tO1xuICAgICAgICB0aGlzLmluZGV4ID0gYXJncy5pbmRleDtcbiAgICAgICAgdGhpcy5za2lsbHNQYXRoID0gbm9ybWFsaXplUmVsYXRpdmVQYXRoKGFyZ3Muc2tpbGxzUGF0aCA/PyAnLmFnZW50cycpO1xuICAgICAgICB2YWxpZGF0ZVNraWxsc0NhcGFiaWxpdHkodGhpcyk7XG4gICAgfVxuICAgIHRvb2xzKCkge1xuICAgICAgICBpZiAoIXRoaXMubGF6eUZyb20pIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXNzaW9uID0gcmVxdWlyZUJvdW5kU2Vzc2lvbih0aGlzLnR5cGUsIHRoaXMuX3Nlc3Npb24pO1xuICAgICAgICBpZiAoIXNlc3Npb24ucGF0aEV4aXN0cyB8fCAhc2Vzc2lvbi5tYXRlcmlhbGl6ZUVudHJ5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgU2FuZGJveFNraWxsc0NvbmZpZ0Vycm9yKCdTa2lsbHMgc2FuZGJveCBzZXNzaW9ucyBtdXN0IHByb3ZpZGUgcGF0aEV4aXN0cygpIGFuZCBtYXRlcmlhbGl6ZUVudHJ5KCkuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHRvb2woe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdsb2FkX3NraWxsJyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0xvYWQgYSBzaW5nbGUgbGF6aWx5IGNvbmZpZ3VyZWQgc2tpbGwgaW50byB0aGUgc2FuZGJveCBzbyBpdHMgU0tJTEwubWQsIHNjcmlwdHMsIHJlZmVyZW5jZXMsIGFuZCBhc3NldHMgY2FuIGJlIHJlYWQgZnJvbSB0aGUgd29ya3NwYWNlLicsXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyczogei5vYmplY3Qoe1xuICAgICAgICAgICAgICAgICAgICBza2lsbF9uYW1lOiB6XG4gICAgICAgICAgICAgICAgICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5taW4oMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5kZXNjcmliZSgnTmFtZSBvZiB0aGUgbGF6aWx5IGNvbmZpZ3VyZWQgc2tpbGwgdG8gbWF0ZXJpYWxpemUuJyksXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgc2tpbGxfbmFtZSwgfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IHJlc29sdmVMYXp5U2tpbGxNYXRjaCh0aGlzLCBza2lsbF9uYW1lLCBzZXNzaW9uLnN0YXRlLm1hbmlmZXN0KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVsYXRpdmVTa2lsbFBhdGggPSBub3JtYWxpemVSZWxhdGl2ZVBhdGgobWF0Y2gucGF0aCA/PyBtYXRjaC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb25QYXRoID0gam9pblJlbGF0aXZlUGF0aHModGhpcy5za2lsbHNQYXRoLCByZWxhdGl2ZVNraWxsUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNraWxsTWFya2Rvd25QYXRoID0gam9pblJlbGF0aXZlUGF0aHMoZGVzdGluYXRpb25QYXRoLCAnU0tJTEwubWQnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF3YWl0IHNlc3Npb24ucGF0aEV4aXN0cyhza2lsbE1hcmtkb3duUGF0aCwgdGhpcy5fcnVuQXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogJ2FscmVhZHlfbG9hZGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lsbF9uYW1lOiBtYXRjaC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGRlc3RpbmF0aW9uUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgc2Vzc2lvbi5tYXRlcmlhbGl6ZUVudHJ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGRlc3RpbmF0aW9uUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5OiByZXNvbHZlTGF6eVNraWxsRW50cnkodGhpcy5sYXp5RnJvbS5zb3VyY2UsIHJlbGF0aXZlU2tpbGxQYXRoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkFzOiB0aGlzLl9ydW5BcyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdsb2FkZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2tpbGxfbmFtZTogbWF0Y2gubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGRlc3RpbmF0aW9uUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgIF07XG4gICAgfVxuICAgIHByb2Nlc3NNYW5pZmVzdChtYW5pZmVzdCkge1xuICAgICAgICBjb25zdCBleGlzdGluZ1BhdGhzID0gbmV3IFNldChPYmplY3Qua2V5cyhtYW5pZmVzdC5lbnRyaWVzKS5tYXAoKHBhdGgpID0+IG5vcm1hbGl6ZVJlbGF0aXZlUGF0aChwYXRoKSkpO1xuICAgICAgICBpZiAodGhpcy5sYXp5RnJvbSkge1xuICAgICAgICAgICAgY29uc3Qgb3ZlcmxhcHMgPSBbLi4uZXhpc3RpbmdQYXRoc11cbiAgICAgICAgICAgICAgICAuZmlsdGVyKChwYXRoKSA9PiBwYXRoc092ZXJsYXAocGF0aCwgdGhpcy5za2lsbHNQYXRoKSlcbiAgICAgICAgICAgICAgICAuc29ydCgpO1xuICAgICAgICAgICAgaWYgKG92ZXJsYXBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2FuZGJveFNraWxsc0NvbmZpZ0Vycm9yKGBza2lsbHMgbGF6eUZyb20gcGF0aCBvdmVybGFwcyBleGlzdGluZyBtYW5pZmVzdCBlbnRyaWVzOiAke292ZXJsYXBzLmpvaW4oJywgJyl9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbWFuaWZlc3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZnJvbSkge1xuICAgICAgICAgICAgY29uc3Qgb3ZlcmxhcCA9IFsuLi5leGlzdGluZ1BhdGhzXS5maW5kKChwYXRoKSA9PiBwYXRoc092ZXJsYXAocGF0aCwgdGhpcy5za2lsbHNQYXRoKSk7XG4gICAgICAgICAgICBpZiAob3ZlcmxhcCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBTYW5kYm94U2tpbGxzQ29uZmlnRXJyb3IoYHNraWxscyBwYXRoIG92ZXJsYXBzIGV4aXN0aW5nIG1hbmlmZXN0IGVudHJpZXM6ICR7b3ZlcmxhcH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1hbmlmZXN0LmVudHJpZXNbdGhpcy5za2lsbHNQYXRoXSA9IHRoaXMuZnJvbTtcbiAgICAgICAgICAgIHJldHVybiBtYW5pZmVzdDtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHNraWxsIG9mIHRoaXMuc2tpbGxzKSB7XG4gICAgICAgICAgICBjb25zdCBza2lsbFBhdGggPSBqb2luUmVsYXRpdmVQYXRocyh0aGlzLnNraWxsc1BhdGgsIHNraWxsLm5hbWUpO1xuICAgICAgICAgICAgY29uc3Qgb3ZlcmxhcCA9IFsuLi5leGlzdGluZ1BhdGhzXS5maW5kKChwYXRoKSA9PiBwYXRoc092ZXJsYXAocGF0aCwgc2tpbGxQYXRoKSk7XG4gICAgICAgICAgICBpZiAob3ZlcmxhcCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBTYW5kYm94U2tpbGxzQ29uZmlnRXJyb3IoYHNraWxsIHBhdGggb3ZlcmxhcHMgZXhpc3RpbmcgbWFuaWZlc3QgZW50cmllczogJHtza2lsbFBhdGh9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtYW5pZmVzdC5lbnRyaWVzW3NraWxsUGF0aF0gPSByZW5kZXJTa2lsbERlc2NyaXB0b3Ioc2tpbGwpO1xuICAgICAgICAgICAgZXhpc3RpbmdQYXRocy5hZGQoc2tpbGxQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWFuaWZlc3Q7XG4gICAgfVxuICAgIGFzeW5jIGluc3RydWN0aW9ucyhtYW5pZmVzdCkge1xuICAgICAgICBjb25zdCBtZXRhZGF0YSA9IHJlc29sdmVTa2lsbHNNZXRhZGF0YSh0aGlzLCBhd2FpdCB0aGlzLnJlc29sdmVSdW50aW1lTWV0YWRhdGEobWFuaWZlc3QpLCBtYW5pZmVzdCk7XG4gICAgICAgIGlmIChtZXRhZGF0YS5sZW5ndGggPT09IDAgJiYgdGhpcy5mcm9tKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVuZGVyU2tpbGxzRGlzY292ZXJ5SW5zdHJ1Y3Rpb25zKHRoaXMuc2tpbGxzUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlbmRlclNraWxsc0luc3RydWN0aW9ucyh7XG4gICAgICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgICAgIGxhenk6IEJvb2xlYW4odGhpcy5sYXp5RnJvbSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyByZXNvbHZlUnVudGltZU1ldGFkYXRhKF9tYW5pZmVzdCkge1xuICAgICAgICBpZiAoIXRoaXMuZnJvbSB8fCAhdGhpcy5fc2Vzc2lvbj8ubGlzdERpciB8fCAhdGhpcy5fc2Vzc2lvbi5yZWFkRmlsZSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGxldCBlbnRyaWVzO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZW50cmllcyA9IGF3YWl0IHRoaXMuX3Nlc3Npb24ubGlzdERpcih7XG4gICAgICAgICAgICAgICAgcGF0aDogdGhpcy5za2lsbHNQYXRoLFxuICAgICAgICAgICAgICAgIHJ1bkFzOiB0aGlzLl9ydW5BcyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXRhZGF0YSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS50eXBlICE9PSAnZGlyJykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNvbnRlbnQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBhd2FpdCB0aGlzLl9zZXNzaW9uLnJlYWRGaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogam9pblJlbGF0aXZlUGF0aHMoZW50cnkucGF0aCwgJ1NLSUxMLm1kJyksXG4gICAgICAgICAgICAgICAgICAgIHJ1bkFzOiB0aGlzLl9ydW5BcyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG1hcmtkb3duID0gdHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgPyBjb250ZW50XG4gICAgICAgICAgICAgICAgOiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoY29udGVudCk7XG4gICAgICAgICAgICBjb25zdCBmcm9udG1hdHRlciA9IHBhcnNlU2tpbGxGcm9udG1hdHRlcihtYXJrZG93bik7XG4gICAgICAgICAgICBtZXRhZGF0YS5wdXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBmcm9udG1hdHRlci5uYW1lID8/IGVudHJ5Lm5hbWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGZyb250bWF0dGVyLmRlc2NyaXB0aW9uID8/ICdObyBkZXNjcmlwdGlvbiBwcm92aWRlZC4nLFxuICAgICAgICAgICAgICAgIHBhdGg6IGVudHJ5Lm5hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWV0YWRhdGE7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHNraWxscyhhcmdzKSB7XG4gICAgcmV0dXJuIG5ldyBTa2lsbHNDYXBhYmlsaXR5KGFyZ3MpO1xufVxuY29uc3QgU0tJTExTX1NFQ1RJT05fSU5UUk8gPSBwcm9tcHQgYFxuQSBza2lsbCBpcyBhIHNldCBvZiBsb2NhbCBpbnN0cnVjdGlvbnMgdG8gZm9sbG93IHRoYXQgaXMgc3RvcmVkIGluIGEgXFxgU0tJTEwubWRcXGAgZmlsZS4gQmVsb3cgaXMgdGhlIGxpc3Qgb2Ygc2tpbGxzIHRoYXQgY2FuIGJlIHVzZWQuIEVhY2ggZW50cnkgaW5jbHVkZXMgYSBuYW1lLCBkZXNjcmlwdGlvbiwgYW5kIGZpbGUgcGF0aCBzbyB5b3UgY2FuIG9wZW4gdGhlIHNvdXJjZSBmb3IgZnVsbCBpbnN0cnVjdGlvbnMgd2hlbiB1c2luZyBhIHNwZWNpZmljIHNraWxsLlxuYDtcbmNvbnN0IEhPV19UT19VU0VfU0tJTExTX1NFQ1RJT04gPSBwcm9tcHQgYFxuIyMjIEhvdyB0byB1c2Ugc2tpbGxzXG4tIERpc2NvdmVyeTogVGhlIGxpc3QgYWJvdmUgaXMgdGhlIHNraWxscyBhdmFpbGFibGUgaW4gdGhpcyBzZXNzaW9uIChuYW1lICsgZGVzY3JpcHRpb24gKyBmaWxlIHBhdGgpLiBTa2lsbCBib2RpZXMgbGl2ZSBvbiBkaXNrIGF0IHRoZSBsaXN0ZWQgcGF0aHMuXG4tIFRyaWdnZXIgcnVsZXM6IElmIHRoZSB1c2VyIG5hbWVzIGEgc2tpbGwgKHdpdGggXFxgJFNraWxsTmFtZVxcYCBvciBwbGFpbiB0ZXh0KSBPUiB0aGUgdGFzayBjbGVhcmx5IG1hdGNoZXMgYSBza2lsbCdzIGRlc2NyaXB0aW9uIHNob3duIGFib3ZlLCB5b3UgbXVzdCB1c2UgdGhhdCBza2lsbCBmb3IgdGhhdCB0dXJuLiBNdWx0aXBsZSBtZW50aW9ucyBtZWFuIHVzZSB0aGVtIGFsbC4gRG8gbm90IGNhcnJ5IHNraWxscyBhY3Jvc3MgdHVybnMgdW5sZXNzIHJlLW1lbnRpb25lZC5cbi0gTWlzc2luZy9ibG9ja2VkOiBJZiBhIG5hbWVkIHNraWxsIGlzbid0IGluIHRoZSBsaXN0IG9yIHRoZSBwYXRoIGNhbid0IGJlIHJlYWQsIHNheSBzbyBicmllZmx5IGFuZCBjb250aW51ZSB3aXRoIHRoZSBiZXN0IGZhbGxiYWNrLlxuLSBIb3cgdG8gdXNlIGEgc2tpbGwgKHByb2dyZXNzaXZlIGRpc2Nsb3N1cmUpOlxuICAxKSBBZnRlciBkZWNpZGluZyB0byB1c2UgYSBza2lsbCwgb3BlbiBpdHMgXFxgU0tJTEwubWRcXGAuIFJlYWQgb25seSBlbm91Z2ggdG8gZm9sbG93IHRoZSB3b3JrZmxvdy5cbiAgMikgSWYgXFxgU0tJTEwubWRcXGAgcG9pbnRzIHRvIGV4dHJhIGZvbGRlcnMgc3VjaCBhcyBcXGByZWZlcmVuY2VzL1xcYCwgbG9hZCBvbmx5IHRoZSBzcGVjaWZpYyBmaWxlcyBuZWVkZWQgZm9yIHRoZSByZXF1ZXN0OyBkb24ndCBidWxrLWxvYWQgZXZlcnl0aGluZy5cbiAgMykgSWYgXFxgc2NyaXB0cy9cXGAgZXhpc3QsIHByZWZlciBydW5uaW5nIG9yIHBhdGNoaW5nIHRoZW0gaW5zdGVhZCBvZiByZXR5cGluZyBsYXJnZSBjb2RlIGJsb2Nrcy5cbiAgNCkgSWYgXFxgYXNzZXRzL1xcYCBvciB0ZW1wbGF0ZXMgZXhpc3QsIHJldXNlIHRoZW0gaW5zdGVhZCBvZiByZWNyZWF0aW5nIGZyb20gc2NyYXRjaC5cbi0gQ29vcmRpbmF0aW9uIGFuZCBzZXF1ZW5jaW5nOlxuICAtIElmIG11bHRpcGxlIHNraWxscyBhcHBseSwgY2hvb3NlIHRoZSBtaW5pbWFsIHNldCB0aGF0IGNvdmVycyB0aGUgcmVxdWVzdCBhbmQgc3RhdGUgdGhlIG9yZGVyIHlvdSdsbCB1c2UgdGhlbS5cbiAgLSBBbm5vdW5jZSB3aGljaCBza2lsbChzKSB5b3UncmUgdXNpbmcgYW5kIHdoeSAob25lIHNob3J0IGxpbmUpLiBJZiB5b3Ugc2tpcCBhbiBvYnZpb3VzIHNraWxsLCBzYXkgd2h5LlxuLSBDb250ZXh0IGh5Z2llbmU6XG4gIC0gS2VlcCBjb250ZXh0IHNtYWxsOiBzdW1tYXJpemUgbG9uZyBzZWN0aW9ucyBpbnN0ZWFkIG9mIHBhc3RpbmcgdGhlbTsgb25seSBsb2FkIGV4dHJhIGZpbGVzIHdoZW4gbmVlZGVkLlxuICAtIEF2b2lkIGRlZXAgcmVmZXJlbmNlLWNoYXNpbmc6IHByZWZlciBvcGVuaW5nIG9ubHkgZmlsZXMgZGlyZWN0bHkgbGlua2VkIGZyb20gXFxgU0tJTEwubWRcXGAgdW5sZXNzIHlvdSdyZSBibG9ja2VkLlxuICAtIFdoZW4gdmFyaWFudHMgZXhpc3QgKGZyYW1ld29ya3MsIHByb3ZpZGVycywgZG9tYWlucyksIHBpY2sgb25seSB0aGUgcmVsZXZhbnQgcmVmZXJlbmNlIGZpbGUocykgYW5kIG5vdGUgdGhhdCBjaG9pY2UuXG4tIFNhZmV0eSBhbmQgZmFsbGJhY2s6IElmIGEgc2tpbGwgY2FuJ3QgYmUgYXBwbGllZCBjbGVhbmx5IChtaXNzaW5nIGZpbGVzLCB1bmNsZWFyIGluc3RydWN0aW9ucyksIHN0YXRlIHRoZSBpc3N1ZSwgcGljayB0aGUgbmV4dC1iZXN0IGFwcHJvYWNoLCBhbmQgY29udGludWUuXG5gO1xuY29uc3QgSE9XX1RPX1VTRV9MQVpZX1NLSUxMU19TRUNUSU9OID0gcHJvbXB0IGBcbiMjIyBIb3cgdG8gdXNlIHNraWxsc1xuLSBEaXNjb3Zlcnk6IFRoZSBsaXN0IGFib3ZlIGlzIHRoZSBza2lsbCBpbmRleCBhdmFpbGFibGUgaW4gdGhpcyBzZXNzaW9uIChuYW1lICsgZGVzY3JpcHRpb24gKyB3b3Jrc3BhY2UgcGF0aCkuIEluIGxhenkgbW9kZSwgdGhvc2UgcGF0aHMgYXJlIGxvYWRlZCBvbiBkZW1hbmQgaW5zdGVhZCBvZiBiZWluZyBwcmVzZW50IHVwIGZyb250LlxuLSBUcmlnZ2VyIHJ1bGVzOiBJZiB0aGUgdXNlciBuYW1lcyBhIHNraWxsICh3aXRoIFxcYCRTa2lsbE5hbWVcXGAgb3IgcGxhaW4gdGV4dCkgT1IgdGhlIHRhc2sgY2xlYXJseSBtYXRjaGVzIGEgc2tpbGwncyBkZXNjcmlwdGlvbiBzaG93biBhYm92ZSwgeW91IG11c3QgdXNlIHRoYXQgc2tpbGwgZm9yIHRoYXQgdHVybi4gTXVsdGlwbGUgbWVudGlvbnMgbWVhbiB1c2UgdGhlbSBhbGwuIERvIG5vdCBjYXJyeSBza2lsbHMgYWNyb3NzIHR1cm5zIHVubGVzcyByZS1tZW50aW9uZWQuXG4tIE1pc3NpbmcvYmxvY2tlZDogSWYgYSBuYW1lZCBza2lsbCBpc24ndCBpbiB0aGUgbGlzdCBvciB0aGUgcGF0aCBjYW4ndCBiZSByZWFkLCBzYXkgc28gYnJpZWZseSBhbmQgY29udGludWUgd2l0aCB0aGUgYmVzdCBmYWxsYmFjay5cbi0gSG93IHRvIHVzZSBhIHNraWxsIChwcm9ncmVzc2l2ZSBkaXNjbG9zdXJlKTpcbiAgMSkgQWZ0ZXIgZGVjaWRpbmcgdG8gdXNlIGEgbGF6eSBza2lsbCwgY2FsbCBcXGBsb2FkX3NraWxsXFxgIGZvciB0aGF0IHNraWxsIGZpcnN0LCB0aGVuIG9wZW4gaXRzIFxcYFNLSUxMLm1kXFxgLlxuICAyKSBJZiBcXGBTS0lMTC5tZFxcYCBwb2ludHMgdG8gZXh0cmEgZm9sZGVycyBzdWNoIGFzIFxcYHJlZmVyZW5jZXMvXFxgLCBsb2FkIG9ubHkgdGhlIHNwZWNpZmljIGZpbGVzIG5lZWRlZCBmb3IgdGhlIHJlcXVlc3Q7IGRvbid0IGJ1bGstbG9hZCBldmVyeXRoaW5nLlxuICAzKSBJZiBcXGBzY3JpcHRzL1xcYCBleGlzdCwgcHJlZmVyIHJ1bm5pbmcgb3IgcGF0Y2hpbmcgdGhlbSBpbnN0ZWFkIG9mIHJldHlwaW5nIGxhcmdlIGNvZGUgYmxvY2tzLlxuICA0KSBJZiBcXGBhc3NldHMvXFxgIG9yIHRlbXBsYXRlcyBleGlzdCwgcmV1c2UgdGhlbSBpbnN0ZWFkIG9mIHJlY3JlYXRpbmcgZnJvbSBzY3JhdGNoLlxuLSBDb29yZGluYXRpb24gYW5kIHNlcXVlbmNpbmc6XG4gIC0gSWYgbXVsdGlwbGUgc2tpbGxzIGFwcGx5LCBjaG9vc2UgdGhlIG1pbmltYWwgc2V0IHRoYXQgY292ZXJzIHRoZSByZXF1ZXN0IGFuZCBzdGF0ZSB0aGUgb3JkZXIgeW91J2xsIHVzZSB0aGVtLlxuICAtIEFubm91bmNlIHdoaWNoIHNraWxsKHMpIHlvdSdyZSB1c2luZyBhbmQgd2h5IChvbmUgc2hvcnQgbGluZSkuIElmIHlvdSBza2lwIGFuIG9idmlvdXMgc2tpbGwsIHNheSB3aHkuXG4tIENvbnRleHQgaHlnaWVuZTpcbiAgLSBLZWVwIGNvbnRleHQgc21hbGw6IHN1bW1hcml6ZSBsb25nIHNlY3Rpb25zIGluc3RlYWQgb2YgcGFzdGluZyB0aGVtOyBvbmx5IGxvYWQgZXh0cmEgZmlsZXMgd2hlbiBuZWVkZWQuXG4gIC0gQXZvaWQgZGVlcCByZWZlcmVuY2UtY2hhc2luZzogcHJlZmVyIG9wZW5pbmcgb25seSBmaWxlcyBkaXJlY3RseSBsaW5rZWQgZnJvbSBcXGBTS0lMTC5tZFxcYCB1bmxlc3MgeW91J3JlIGJsb2NrZWQuXG4gIC0gV2hlbiB2YXJpYW50cyBleGlzdCAoZnJhbWV3b3JrcywgcHJvdmlkZXJzLCBkb21haW5zKSwgcGljayBvbmx5IHRoZSByZWxldmFudCByZWZlcmVuY2UgZmlsZShzKSBhbmQgbm90ZSB0aGF0IGNob2ljZS5cbi0gU2FmZXR5IGFuZCBmYWxsYmFjazogSWYgYSBza2lsbCBjYW4ndCBiZSBhcHBsaWVkIGNsZWFubHkgKG1pc3NpbmcgZmlsZXMsIHVuY2xlYXIgaW5zdHJ1Y3Rpb25zKSwgc3RhdGUgdGhlIGlzc3VlLCBwaWNrIHRoZSBuZXh0LWJlc3QgYXBwcm9hY2gsIGFuZCBjb250aW51ZS5cbmA7XG5mdW5jdGlvbiB2YWxpZGF0ZVNraWxsc0NhcGFiaWxpdHkoY2FwYWJpbGl0eSkge1xuICAgIGNvbnN0IGNvbmZpZ3VyZWRTb3VyY2VzID0gW1xuICAgICAgICBjYXBhYmlsaXR5LnNraWxscy5sZW5ndGggPiAwLFxuICAgICAgICBCb29sZWFuKGNhcGFiaWxpdHkuZnJvbSksXG4gICAgICAgIEJvb2xlYW4oY2FwYWJpbGl0eS5sYXp5RnJvbSksXG4gICAgXS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuICAgIGlmIChjb25maWd1cmVkU291cmNlcyA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgU2FuZGJveFNraWxsc0NvbmZpZ0Vycm9yKCdza2lsbHMgY2FwYWJpbGl0eSByZXF1aXJlcyBgc2tpbGxzYCwgYGZyb21gLCBvciBgbGF6eUZyb21gLicpO1xuICAgIH1cbiAgICBpZiAoY29uZmlndXJlZFNvdXJjZXMgPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBTYW5kYm94U2tpbGxzQ29uZmlnRXJyb3IoJ3NraWxscyBjYXBhYmlsaXR5IGFjY2VwdHMgb25seSBvbmUgb2YgYHNraWxsc2AsIGBmcm9tYCwgb3IgYGxhenlGcm9tYC4nKTtcbiAgICB9XG4gICAgaWYgKGNhcGFiaWxpdHkuZnJvbSAmJiAhaXNEaXJlY3RvcnlMaWtlRW50cnkoY2FwYWJpbGl0eS5mcm9tKSkge1xuICAgICAgICB0aHJvdyBuZXcgU2FuZGJveFNraWxsc0NvbmZpZ0Vycm9yKCdza2lsbHMgZnJvbSBtdXN0IGJlIGEgZGlyZWN0b3J5LWxpa2UgZW50cnkgc3VjaCBhcyBkaXIsIGdpdF9yZXBvLCBvciBtb3VudC4nKTtcbiAgICB9XG4gICAgY29uc3Qgc2VlblNraWxsTmFtZXMgPSBuZXcgU2V0KCk7XG4gICAgZm9yIChjb25zdCBza2lsbCBvZiBjYXBhYmlsaXR5LnNraWxscykge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IG5vcm1hbGl6ZVJlbGF0aXZlUGF0aChza2lsbC5uYW1lKTtcbiAgICAgICAgaWYgKHNlZW5Ta2lsbE5hbWVzLmhhcyhub3JtYWxpemVkTmFtZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBTYW5kYm94U2tpbGxzQ29uZmlnRXJyb3IoYGR1cGxpY2F0ZSBza2lsbCBuYW1lOiAke3NraWxsLm5hbWV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgc2VlblNraWxsTmFtZXMuYWRkKG5vcm1hbGl6ZWROYW1lKTtcbiAgICB9XG59XG5mdW5jdGlvbiByZW5kZXJTa2lsbERlc2NyaXB0b3Ioc2tpbGwpIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHtcbiAgICAgICAgJ1NLSUxMLm1kJzogbm9ybWFsaXplU2tpbGxDb250ZW50KHNraWxsLmNvbnRlbnQpLFxuICAgIH07XG4gICAgaWYgKHNraWxsLnNjcmlwdHMgJiYgT2JqZWN0LmtleXMoc2tpbGwuc2NyaXB0cykubGVuZ3RoID4gMCkge1xuICAgICAgICBjaGlsZHJlbi5zY3JpcHRzID0gZGlyKHtcbiAgICAgICAgICAgIGNoaWxkcmVuOiBza2lsbC5zY3JpcHRzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHNraWxsLnJlZmVyZW5jZXMgJiYgT2JqZWN0LmtleXMoc2tpbGwucmVmZXJlbmNlcykubGVuZ3RoID4gMCkge1xuICAgICAgICBjaGlsZHJlbi5yZWZlcmVuY2VzID0gZGlyKHtcbiAgICAgICAgICAgIGNoaWxkcmVuOiBza2lsbC5yZWZlcmVuY2VzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHNraWxsLmFzc2V0cyAmJiBPYmplY3Qua2V5cyhza2lsbC5hc3NldHMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY2hpbGRyZW4uYXNzZXRzID0gZGlyKHtcbiAgICAgICAgICAgIGNoaWxkcmVuOiBza2lsbC5hc3NldHMsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZGlyKHtcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgfSk7XG59XG5mdW5jdGlvbiBub3JtYWxpemVTa2lsbENvbnRlbnQoY29udGVudCkge1xuICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycgfHwgY29udGVudCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIGZpbGUoe1xuICAgICAgICAgICAgY29udGVudCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBjb250ZW50O1xufVxuZnVuY3Rpb24gcmVzb2x2ZVNraWxsc01ldGFkYXRhKGNhcGFiaWxpdHksIHJ1bnRpbWVNZXRhZGF0YSA9IFtdLCBtYW5pZmVzdCkge1xuICAgIGlmIChjYXBhYmlsaXR5LnNraWxscy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBjYXBhYmlsaXR5LnNraWxsc1xuICAgICAgICAgICAgLm1hcCgoc2tpbGwpID0+ICh7XG4gICAgICAgICAgICBuYW1lOiBza2lsbC5uYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHNraWxsLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgcGF0aDogam9pblJlbGF0aXZlUGF0aHMoY2FwYWJpbGl0eS5za2lsbHNQYXRoLCBza2lsbC5uYW1lKSxcbiAgICAgICAgfSkpXG4gICAgICAgICAgICAuc29ydCgobGVmdCwgcmlnaHQpID0+IGxlZnQubmFtZS5sb2NhbGVDb21wYXJlKHJpZ2h0Lm5hbWUpKTtcbiAgICB9XG4gICAgY29uc3QgY29uZmlndXJlZEluZGV4ID0gcmVzb2x2ZUxhenlTa2lsbEluZGV4KGNhcGFiaWxpdHkubGF6eUZyb20sIG1hbmlmZXN0LCBjYXBhYmlsaXR5LnNraWxsc1BhdGgpID8/XG4gICAgICAgIGNhcGFiaWxpdHkuaW5kZXggPz9cbiAgICAgICAgKHJ1bnRpbWVNZXRhZGF0YS5sZW5ndGggPiAwID8gcnVudGltZU1ldGFkYXRhIDogdW5kZWZpbmVkKSA/P1xuICAgICAgICBkZXJpdmVJbmRleEZyb21EaXJFbnRyeShjYXBhYmlsaXR5LmZyb20pO1xuICAgIHJldHVybiBjb25maWd1cmVkSW5kZXhcbiAgICAgICAgLm1hcCgoc2tpbGwpID0+ICh7XG4gICAgICAgIC4uLnNraWxsLFxuICAgICAgICBwYXRoOiBqb2luUmVsYXRpdmVQYXRocyhjYXBhYmlsaXR5LnNraWxsc1BhdGgsIHNraWxsLnBhdGggPz8gbm9ybWFsaXplUmVsYXRpdmVQYXRoKHNraWxsLm5hbWUpKSxcbiAgICB9KSlcbiAgICAgICAgLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0Lm5hbWUubG9jYWxlQ29tcGFyZShyaWdodC5uYW1lKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTa2lsbEZyb250bWF0dGVyKG1hcmtkb3duKSB7XG4gICAgY29uc3QgbGluZXMgPSBtYXJrZG93bi5zcGxpdCgvXFxyP1xcbi8pO1xuICAgIGlmIChsaW5lc1swXT8udHJpbSgpICE9PSAnLS0tJykge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IGVuZEluZGV4ID0gbGluZXMuZmluZEluZGV4KChsaW5lLCBpbmRleCkgPT4gaW5kZXggPiAwICYmIGxpbmUudHJpbSgpID09PSAnLS0tJyk7XG4gICAgaWYgKGVuZEluZGV4ID09PSAtMSkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IG1ldGFkYXRhID0ge307XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzLnNsaWNlKDEsIGVuZEluZGV4KSkge1xuICAgICAgICBjb25zdCBzdHJpcHBlZCA9IGxpbmUudHJpbSgpO1xuICAgICAgICBjb25zdCBkZWxpbWl0ZXJJbmRleCA9IHN0cmlwcGVkLmluZGV4T2YoJzonKTtcbiAgICAgICAgaWYgKCFzdHJpcHBlZCB8fCBzdHJpcHBlZC5zdGFydHNXaXRoKCcjJykgfHwgZGVsaW1pdGVySW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXkgPSBzdHJpcHBlZC5zbGljZSgwLCBkZWxpbWl0ZXJJbmRleCkudHJpbSgpO1xuICAgICAgICBjb25zdCByYXdWYWx1ZSA9IHN0cmlwcGVkLnNsaWNlKGRlbGltaXRlckluZGV4ICsgMSkudHJpbSgpO1xuICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbWV0YWRhdGFba2V5XSA9IHVucXVvdGVGcm9udG1hdHRlclZhbHVlKHJhd1ZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xufVxuZnVuY3Rpb24gdW5xdW90ZUZyb250bWF0dGVyVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUubGVuZ3RoID49IDIgJiZcbiAgICAgICAgdmFsdWVbMF0gPT09IHZhbHVlW3ZhbHVlLmxlbmd0aCAtIDFdICYmXG4gICAgICAgICh2YWx1ZVswXSA9PT0gJ1wiJyB8fCB2YWx1ZVswXSA9PT0gXCInXCIpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5zbGljZSgxLCAtMSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVMYXp5U2tpbGxJbmRleChsYXp5U291cmNlLCBtYW5pZmVzdCwgc2tpbGxzUGF0aCA9ICcuYWdlbnRzJykge1xuICAgIGlmICghbGF6eVNvdXJjZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAobGF6eVNvdXJjZS5pbmRleCkge1xuICAgICAgICByZXR1cm4gbGF6eVNvdXJjZS5pbmRleDtcbiAgICB9XG4gICAgaWYgKGxhenlTb3VyY2UuZ2V0SW5kZXggJiYgbWFuaWZlc3QpIHtcbiAgICAgICAgY29uc3QgZGVyaXZlZEluZGV4ID0gbGF6eVNvdXJjZS5nZXRJbmRleChtYW5pZmVzdCwgc2tpbGxzUGF0aCk7XG4gICAgICAgIHJldHVybiBkZXJpdmVkSW5kZXgubGVuZ3RoID4gMCA/IGRlcml2ZWRJbmRleCA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZGVyaXZlZEluZGV4ID0gZGVyaXZlSW5kZXhGcm9tRGlyRW50cnkobGF6eVNvdXJjZS5zb3VyY2UpO1xuICAgIHJldHVybiBkZXJpdmVkSW5kZXgubGVuZ3RoID4gMCA/IGRlcml2ZWRJbmRleCA6IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIGRlcml2ZUluZGV4RnJvbURpckVudHJ5KGVudHJ5KSB7XG4gICAgaWYgKCFlbnRyeSB8fCAhaXNEaXIoZW50cnkpIHx8ICFlbnRyeS5jaGlsZHJlbikge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhlbnRyeS5jaGlsZHJlbilcbiAgICAgICAgLmZpbHRlcigoWywgY2hpbGRdKSA9PiBjaGlsZC50eXBlID09PSAnZGlyJylcbiAgICAgICAgLm1hcCgoW25hbWUsIGNoaWxkXSkgPT4gKHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246IGNoaWxkLmRlc2NyaXB0aW9uID8/ICdObyBkZXNjcmlwdGlvbiBwcm92aWRlZC4nLFxuICAgIH0pKTtcbn1cbmZ1bmN0aW9uIHJlbmRlclNraWxsc0Rpc2NvdmVyeUluc3RydWN0aW9ucyhza2lsbHNQYXRoKSB7XG4gICAgcmV0dXJuIHByb21wdCBgXG4jIyBTa2lsbHNcbiR7U0tJTExTX1NFQ1RJT05fSU5UUk99XG5cbiMjIyBTa2lsbCBzb3VyY2Vcbi0gU2tpbGxzIGFyZSBtYXRlcmlhbGl6ZWQgdW5kZXIgJHtza2lsbHNQYXRofS4gRGlzY292ZXIgYXZhaWxhYmxlIHNraWxscyBieSBpbnNwZWN0aW5nIGNoaWxkIGRpcmVjdG9yaWVzIGFuZCB0aGVpciBTS0lMTC5tZCBmaWxlcyBhdCBydW50aW1lLlxuXG4ke0hPV19UT19VU0VfU0tJTExTX1NFQ1RJT059XG5gO1xufVxuZnVuY3Rpb24gcmVuZGVyU2tpbGxzSW5zdHJ1Y3Rpb25zKGFyZ3MpIHtcbiAgICBjb25zdCBhdmFpbGFibGVTa2lsbHMgPSBhcmdzLm1ldGFkYXRhXG4gICAgICAgIC5tYXAoKHNraWxsKSA9PiBgLSAke3NraWxsLm5hbWV9OiAke3NraWxsLmRlc2NyaXB0aW9ufSAoZmlsZTogJHtza2lsbC5wYXRoID8/IHNraWxsLm5hbWV9KWApXG4gICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICBjb25zdCBsYXp5TG9hZGluZ0luc3RydWN0aW9ucyA9IGFyZ3MubGF6eVxuICAgICAgICA/IHByb21wdCBgXG4jIyMgTGF6eSBsb2FkaW5nXG4tIFRoZXNlIHNraWxscyBhcmUgaW5kZXhlZCBmb3IgcGxhbm5pbmcsIGJ1dCB0aGV5IGFyZSBub3QgbWF0ZXJpYWxpemVkIGluIHRoZSB3b3Jrc3BhY2UgeWV0LlxuLSBDYWxsIFxcYGxvYWRfc2tpbGxcXGAgd2l0aCBhIHNpbmdsZSBza2lsbCBuYW1lIGZyb20gdGhlIGxpc3QgYmVmb3JlIHJlYWRpbmcgaXRzIFxcYFNLSUxMLm1kXFxgIG9yIG90aGVyIGZpbGVzIGZyb20gdGhlIHdvcmtzcGFjZS5cbi0gXFxgbG9hZF9za2lsbFxcYCBzdGFnZXMgZXhhY3RseSBvbmUgc2tpbGwgdW5kZXIgdGhlIGxpc3RlZCBwYXRoLiBJZiB5b3UgbmVlZCBtb3JlIHRoYW4gb25lIHNraWxsLCBjYWxsIGl0IG11bHRpcGxlIHRpbWVzLlxuYFxuICAgICAgICA6ICcnO1xuICAgIGNvbnN0IHVzYWdlSW5zdHJ1Y3Rpb25zID0gYXJncy5sYXp5XG4gICAgICAgID8gSE9XX1RPX1VTRV9MQVpZX1NLSUxMU19TRUNUSU9OXG4gICAgICAgIDogSE9XX1RPX1VTRV9TS0lMTFNfU0VDVElPTjtcbiAgICBjb25zdCBsYXp5TG9hZGluZ1NlY3Rpb24gPSBsYXp5TG9hZGluZ0luc3RydWN0aW9uc1xuICAgICAgICA/IGAke2xhenlMb2FkaW5nSW5zdHJ1Y3Rpb25zfVxcblxcbmBcbiAgICAgICAgOiAnJztcbiAgICByZXR1cm4gcHJvbXB0IGBcbiMjIFNraWxsc1xuJHtTS0lMTFNfU0VDVElPTl9JTlRST31cblxuIyMjIEF2YWlsYWJsZSBza2lsbHNcbiR7YXZhaWxhYmxlU2tpbGxzfVxuXG4ke2xhenlMb2FkaW5nU2VjdGlvbn0ke3VzYWdlSW5zdHJ1Y3Rpb25zfVxuYDtcbn1cbmZ1bmN0aW9uIHJlc29sdmVMYXp5U2tpbGxNYXRjaChjYXBhYmlsaXR5LCBza2lsbE5hbWUsIG1hbmlmZXN0KSB7XG4gICAgY29uc3QgaW5kZXggPSByZXNvbHZlTGF6eVNraWxsSW5kZXgoY2FwYWJpbGl0eS5sYXp5RnJvbSwgbWFuaWZlc3QsIGNhcGFiaWxpdHkuc2tpbGxzUGF0aCkgPz9cbiAgICAgICAgY2FwYWJpbGl0eS5pbmRleCA/P1xuICAgICAgICBbXTtcbiAgICBjb25zdCBtYXRjaGVzID0gaW5kZXguZmlsdGVyKChza2lsbCkgPT4ge1xuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBub3JtYWxpemVSZWxhdGl2ZVBhdGgoc2tpbGwucGF0aCA/PyBza2lsbC5uYW1lKTtcbiAgICAgICAgY29uc3QgcGF0aEJhc2VOYW1lID0gcmVsYXRpdmVQYXRoLnNwbGl0KCcvJykucG9wKCkgPz8gcmVsYXRpdmVQYXRoO1xuICAgICAgICByZXR1cm4gKHNraWxsLm5hbWUgPT09IHNraWxsTmFtZSB8fFxuICAgICAgICAgICAgcmVsYXRpdmVQYXRoID09PSBza2lsbE5hbWUgfHxcbiAgICAgICAgICAgIHBhdGhCYXNlTmFtZSA9PT0gc2tpbGxOYW1lKTtcbiAgICB9KTtcbiAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFNhbmRib3hTa2lsbHNDb25maWdFcnJvcihgbGF6eSBza2lsbCBub3QgZm91bmQ6ICR7c2tpbGxOYW1lfWApO1xuICAgIH1cbiAgICBpZiAobWF0Y2hlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBTYW5kYm94U2tpbGxzQ29uZmlnRXJyb3IoYGxhenkgc2tpbGwgbmFtZSBpcyBhbWJpZ3VvdXM6ICR7c2tpbGxOYW1lfWApO1xuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hlc1swXTtcbn1cbmZ1bmN0aW9uIGpvaW5SZWxhdGl2ZVBhdGhzKGxlZnQsIHJpZ2h0KSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZExlZnQgPSBub3JtYWxpemVSZWxhdGl2ZVBhdGgobGVmdCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFJpZ2h0ID0gbm9ybWFsaXplUmVsYXRpdmVQYXRoKHJpZ2h0KTtcbiAgICBpZiAoIW5vcm1hbGl6ZWRMZWZ0KSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkUmlnaHQ7XG4gICAgfVxuICAgIGlmICghbm9ybWFsaXplZFJpZ2h0KSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkTGVmdDtcbiAgICB9XG4gICAgcmV0dXJuIGAke25vcm1hbGl6ZWRMZWZ0fS8ke25vcm1hbGl6ZWRSaWdodH1gO1xufVxuZnVuY3Rpb24gam9pblNvdXJjZVBhdGgoc291cmNlUm9vdCwgcmVsYXRpdmVQYXRoKSB7XG4gICAgY29uc3QgdHJpbW1lZFJvb3QgPSBzb3VyY2VSb290LnJlcGxhY2UoL1tcXFxcL10rJC8sICcnKTtcbiAgICBpZiAoIXRyaW1tZWRSb290KSB7XG4gICAgICAgIHJldHVybiByZWxhdGl2ZVBhdGg7XG4gICAgfVxuICAgIHJldHVybiBgJHt0cmltbWVkUm9vdH0vJHtyZWxhdGl2ZVBhdGh9YDtcbn1cbmZ1bmN0aW9uIHJlc29sdmVMYXp5U2tpbGxFbnRyeShzb3VyY2UsIHJlbGF0aXZlU2tpbGxQYXRoKSB7XG4gICAgaWYgKHNvdXJjZS50eXBlID09PSAnbG9jYWxfZGlyJykge1xuICAgICAgICBpZiAoIXNvdXJjZS5zcmMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBTYW5kYm94U2tpbGxzQ29uZmlnRXJyb3IoJ0xhenkgc2tpbGwgbG9jYWxfZGlyIHNvdXJjZXMgcmVxdWlyZSBhIGNvbmNyZXRlIHNyYyB2YWx1ZS4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uc291cmNlLFxuICAgICAgICAgICAgdHlwZTogJ2xvY2FsX2RpcicsXG4gICAgICAgICAgICBzcmM6IGpvaW5Tb3VyY2VQYXRoKHNvdXJjZS5zcmMsIHJlbGF0aXZlU2tpbGxQYXRoKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHNvdXJjZS50eXBlID09PSAnZ2l0X3JlcG8nKSB7XG4gICAgICAgIGNvbnN0IGJhc2VTdWJwYXRoID0gc291cmNlLnN1YnBhdGhcbiAgICAgICAgICAgID8gbm9ybWFsaXplUmVsYXRpdmVQYXRoKHNvdXJjZS5zdWJwYXRoKVxuICAgICAgICAgICAgOiAnJztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnNvdXJjZSxcbiAgICAgICAgICAgIHR5cGU6ICdnaXRfcmVwbycsXG4gICAgICAgICAgICBzdWJwYXRoOiBqb2luUmVsYXRpdmVQYXRocyhiYXNlU3VicGF0aCwgcmVsYXRpdmVTa2lsbFBhdGgpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAoc291cmNlLnR5cGUgPT09ICdkaXInKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gcmVhZERpckNoaWxkKHNvdXJjZSwgcmVsYXRpdmVTa2lsbFBhdGgpO1xuICAgICAgICBpZiAoIWNoaWxkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgU2FuZGJveFNraWxsc0NvbmZpZ0Vycm9yKGBsYXp5IHNraWxsIHNvdXJjZSBwYXRoIG5vdCBmb3VuZDogJHtyZWxhdGl2ZVNraWxsUGF0aH1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgfVxuICAgIHRocm93IG5ldyBTYW5kYm94U2tpbGxzQ29uZmlnRXJyb3IoYExhenkgc2tpbGwgc291cmNlIHR5cGUgaXMgbm90IHN1cHBvcnRlZCB5ZXQ6ICR7c291cmNlLnR5cGV9YCk7XG59XG5mdW5jdGlvbiByZWFkRGlyQ2hpbGQoc291cmNlLCByZWxhdGl2ZVNraWxsUGF0aCkge1xuICAgIGxldCBjdXJyZW50ID0gc291cmNlO1xuICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiBub3JtYWxpemVSZWxhdGl2ZVBhdGgocmVsYXRpdmVTa2lsbFBhdGgpLnNwbGl0KCcvJykpIHtcbiAgICAgICAgaWYgKCFzZWdtZW50KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWN1cnJlbnQgfHwgIWlzRGlyKGN1cnJlbnQpIHx8ICFjdXJyZW50LmNoaWxkcmVuKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNoaWxkcmVuW3NlZ21lbnRdO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudDtcbn1cbmZ1bmN0aW9uIHBhdGhzT3ZlcmxhcChsZWZ0LCByaWdodCkge1xuICAgIHJldHVybiAobGVmdCA9PT0gcmlnaHQgfHxcbiAgICAgICAgbGVmdC5zdGFydHNXaXRoKGAke3JpZ2h0fS9gKSB8fFxuICAgICAgICByaWdodC5zdGFydHNXaXRoKGAke2xlZnR9L2ApKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNraWxscy5tanMubWFwIiwiaW1wb3J0IHsgY29tcGFjdGlvbiB9IGZyb20gXCIuL2NvbXBhY3Rpb24ubWpzXCI7XG5pbXBvcnQgeyBmaWxlc3lzdGVtIH0gZnJvbSBcIi4vZmlsZXN5c3RlbS5tanNcIjtcbmltcG9ydCB7IHNoZWxsIH0gZnJvbSBcIi4vc2hlbGwubWpzXCI7XG5leHBvcnQgeyBDYXBhYmlsaXR5IH0gZnJvbSBcIi4vYmFzZS5tanNcIjtcbmV4cG9ydCB7IENvbXBhY3Rpb25Nb2RlbEluZm8sIENvbXBhY3Rpb25Qb2xpY3ksIER5bmFtaWNDb21wYWN0aW9uUG9saWN5LCBTdGF0aWNDb21wYWN0aW9uUG9saWN5LCBjb21wYWN0aW9uLCB9IGZyb20gXCIuL2NvbXBhY3Rpb24ubWpzXCI7XG5leHBvcnQgeyBmaWxlc3lzdGVtIH0gZnJvbSBcIi4vZmlsZXN5c3RlbS5tanNcIjtcbmV4cG9ydCB7IG1lbW9yeSB9IGZyb20gXCIuL21lbW9yeS5tanNcIjtcbmV4cG9ydCB7IEluTWVtb3J5TWVtb3J5U3RvcmUgfSBmcm9tIFwiLi4vbWVtb3J5L3N0b3JhZ2UubWpzXCI7XG5leHBvcnQgeyBzaGVsbCB9IGZyb20gXCIuL3NoZWxsLm1qc1wiO1xuZXhwb3J0IHsgc2tpbGxzIH0gZnJvbSBcIi4vc2tpbGxzLm1qc1wiO1xuZnVuY3Rpb24gZGVmYXVsdENhcGFiaWxpdGllcygpIHtcbiAgICByZXR1cm4gW2ZpbGVzeXN0ZW0oKSwgc2hlbGwoKSwgY29tcGFjdGlvbigpXTtcbn1cbmV4cG9ydCBjb25zdCBDYXBhYmlsaXRpZXMgPSB7XG4gICAgZGVmYXVsdDogZGVmYXVsdENhcGFiaWxpdGllcyxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwIiwiaW1wb3J0IHsgQWdlbnQgfSBmcm9tIFwiLi4vYWdlbnQubWpzXCI7XG5pbXBvcnQgeyBTQU5EQk9YX0FHRU5UX0JSQU5EIH0gZnJvbSBcIi4vYnJhbmQubWpzXCI7XG5pbXBvcnQgeyBDYXBhYmlsaXRpZXMgfSBmcm9tIFwiLi9jYXBhYmlsaXRpZXMvaW5kZXgubWpzXCI7XG5pbXBvcnQgeyBjbG9uZU1hbmlmZXN0LCBNYW5pZmVzdCB9IGZyb20gXCIuL21hbmlmZXN0Lm1qc1wiO1xuaW1wb3J0IHsgbm9ybWFsaXplVXNlciB9IGZyb20gXCIuL3VzZXJzLm1qc1wiO1xuZXhwb3J0IGNsYXNzIFNhbmRib3hBZ2VudCBleHRlbmRzIEFnZW50IHtcbiAgICBbU0FOREJPWF9BR0VOVF9CUkFORF0gPSB0cnVlO1xuICAgIGRlZmF1bHRNYW5pZmVzdDtcbiAgICBiYXNlSW5zdHJ1Y3Rpb25zO1xuICAgIGNhcGFiaWxpdGllcztcbiAgICBydW5BcztcbiAgICBydW50aW1lTWFuaWZlc3Q7XG4gICAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZyk7XG4gICAgICAgIGlmIChjb25maWcuYmFzZUluc3RydWN0aW9ucyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICB0eXBlb2YgY29uZmlnLmJhc2VJbnN0cnVjdGlvbnMgIT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICB0eXBlb2YgY29uZmlnLmJhc2VJbnN0cnVjdGlvbnMgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1NhbmRib3hBZ2VudCBiYXNlSW5zdHJ1Y3Rpb25zIG11c3QgYmUgYSBzdHJpbmcgb3IgZnVuY3Rpb24uJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZWZhdWx0TWFuaWZlc3QgPSBjb25maWcuZGVmYXVsdE1hbmlmZXN0XG4gICAgICAgICAgICA/IGNsb25lTWFuaWZlc3QoY29uZmlnLmRlZmF1bHRNYW5pZmVzdClcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmJhc2VJbnN0cnVjdGlvbnMgPSBjb25maWcuYmFzZUluc3RydWN0aW9ucztcbiAgICAgICAgdGhpcy5jYXBhYmlsaXRpZXMgPSBjb25maWcuY2FwYWJpbGl0aWVzID8/IENhcGFiaWxpdGllcy5kZWZhdWx0KCk7XG4gICAgICAgIHRoaXMucnVuQXMgPSBub3JtYWxpemVSdW5Bcyhjb25maWcucnVuQXMpO1xuICAgICAgICB0aGlzLnJ1bnRpbWVNYW5pZmVzdCA9IHRoaXMuZGVmYXVsdE1hbmlmZXN0ID8/IG5ldyBNYW5pZmVzdCgpO1xuICAgIH1cbiAgICBjbG9uZShjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94QWdlbnQoe1xuICAgICAgICAgICAgbmFtZTogY29uZmlnLm5hbWUgPz8gdGhpcy5uYW1lLFxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zOiBjb25maWcuaW5zdHJ1Y3Rpb25zID8/IHRoaXMuaW5zdHJ1Y3Rpb25zLFxuICAgICAgICAgICAgcHJvbXB0OiBjb25maWcucHJvbXB0ID8/IHRoaXMucHJvbXB0LFxuICAgICAgICAgICAgaGFuZG9mZkRlc2NyaXB0aW9uOiBjb25maWcuaGFuZG9mZkRlc2NyaXB0aW9uID8/IHRoaXMuaGFuZG9mZkRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgaGFuZG9mZnM6IGNvbmZpZy5oYW5kb2ZmcyA/PyB0aGlzLmhhbmRvZmZzLFxuICAgICAgICAgICAgbW9kZWw6IGNvbmZpZy5tb2RlbCA/PyB0aGlzLm1vZGVsLFxuICAgICAgICAgICAgbW9kZWxTZXR0aW5nczogY29uZmlnLm1vZGVsU2V0dGluZ3MgPz8gdGhpcy5tb2RlbFNldHRpbmdzLFxuICAgICAgICAgICAgdG9vbHM6IGNvbmZpZy50b29scyA/PyB0aGlzLnRvb2xzLFxuICAgICAgICAgICAgbWNwU2VydmVyczogY29uZmlnLm1jcFNlcnZlcnMgPz8gdGhpcy5tY3BTZXJ2ZXJzLFxuICAgICAgICAgICAgbWNwQ29uZmlnOiBjb25maWcubWNwQ29uZmlnID8/IHRoaXMubWNwQ29uZmlnLFxuICAgICAgICAgICAgaW5wdXRHdWFyZHJhaWxzOiBjb25maWcuaW5wdXRHdWFyZHJhaWxzID8/IHRoaXMuaW5wdXRHdWFyZHJhaWxzLFxuICAgICAgICAgICAgb3V0cHV0R3VhcmRyYWlsczogY29uZmlnLm91dHB1dEd1YXJkcmFpbHMgPz8gdGhpcy5vdXRwdXRHdWFyZHJhaWxzLFxuICAgICAgICAgICAgb3V0cHV0VHlwZTogY29uZmlnLm91dHB1dFR5cGUgPz8gdGhpcy5vdXRwdXRUeXBlLFxuICAgICAgICAgICAgdG9vbFVzZUJlaGF2aW9yOiBjb25maWcudG9vbFVzZUJlaGF2aW9yID8/IHRoaXMudG9vbFVzZUJlaGF2aW9yLFxuICAgICAgICAgICAgcmVzZXRUb29sQ2hvaWNlOiBjb25maWcucmVzZXRUb29sQ2hvaWNlID8/IHRoaXMucmVzZXRUb29sQ2hvaWNlLFxuICAgICAgICAgICAgZGVmYXVsdE1hbmlmZXN0OiBjb25maWcuZGVmYXVsdE1hbmlmZXN0ID8/IHRoaXMuZGVmYXVsdE1hbmlmZXN0LFxuICAgICAgICAgICAgYmFzZUluc3RydWN0aW9uczogY29uZmlnLmJhc2VJbnN0cnVjdGlvbnMgPz8gdGhpcy5iYXNlSW5zdHJ1Y3Rpb25zLFxuICAgICAgICAgICAgY2FwYWJpbGl0aWVzOiBjb25maWcuY2FwYWJpbGl0aWVzID8/IHRoaXMuY2FwYWJpbGl0aWVzLFxuICAgICAgICAgICAgcnVuQXM6IGNvbmZpZy5ydW5BcyA/PyB0aGlzLnJ1bkFzLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5mdW5jdGlvbiBub3JtYWxpemVSdW5BcyhydW5Bcykge1xuICAgIGlmIChydW5BcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcnVuQXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IHRyaW1tZWQgPSBydW5Bcy50cmltKCk7XG4gICAgICAgIGlmICghdHJpbW1lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignU2FuZGJveEFnZW50IHJ1bkFzIG11c3QgYmUgbm9uLWVtcHR5LicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmltbWVkO1xuICAgIH1cbiAgICByZXR1cm4gbm9ybWFsaXplVXNlcihydW5Bcyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hZ2VudC5tanMubWFwIl0sIm5hbWVzIjpbInN1cHBvcnRzUmVzcG9uc2VzQ29tcGFjdGlvblRyYW5zcG9ydCIsIm1vZGVsSW5zdGFuY2UiLCJzdXBwb3J0c0FwcGx5UGF0Y2hUcmFuc3BvcnQiLCJzdXBwb3J0c1N0cnVjdHVyZWRUb29sT3V0cHV0VHJhbnNwb3J0IiwiQ29tcGFjdGlvblBvbGljeSIsIkR5bmFtaWNDb21wYWN0aW9uUG9saWN5IiwidGhyZXNob2xkUmF0aW8iLCJmYWxsYmFja1RocmVzaG9sZCIsIl9fcHVibGljRmllbGQiLCJtb2RlbCIsIm1vZGVsSW5mbyIsIkNvbXBhY3Rpb25Nb2RlbEluZm8iLCJjb250ZXh0V2luZG93IiwiY2FuZGlkYXRlIiwiZ2V0U2FuZGJveENvbXBhY3Rpb25Nb2RlbENhbmRpZGF0ZXMiLCJTQU5EQk9YX0NPTlRFWFRfV0lORE9XU18xTSIsIlNBTkRCT1hfQ09OVEVYVF9XSU5ET1dTXzQwMEsiLCJTQU5EQk9YX0NPTlRFWFRfV0lORE9XU18yMDBLIiwiU0FOREJPWF9DT05URVhUX1dJTkRPV1NfMTI4SyIsIkNvbXBhY3Rpb25DYXBhYmlsaXR5IiwiQ2FwYWJpbGl0eSIsInBvbGljeSIsInNhbXBsaW5nUGFyYW1zIiwiY29udGV4dCIsImxhc3RDb21wYWN0aW9uSW5kZXgiLCJpbmRleCIsImNvbXBhY3Rpb24iLCJhcmdzIiwidHJpbW1lZCIsIm5vcm1hbGl6ZWQiLCJ3aXRob3V0UGlubmVkRGF0ZSIsImFwcGx5UGF0Y2hGdW5jdGlvblBhcmFtZXRlcnMiLCJCRUdJTl9QQVRDSCIsIkVORF9QQVRDSCIsIkFERF9GSUxFIiwiREVMRVRFX0ZJTEUiLCJVUERBVEVfRklMRSIsIk1PVkVfVE8iLCJ0b0Vycm9yTWVzc2FnZSIsImVycm9yIiwicmVuZGVySW1hZ2VGb3JUZXh0VHJhbnNwb3J0Iiwib3V0cHV0IiwiaW1hZ2UiLCJpc1JlY29yZCIsImltYWdlUmVjb3JkIiwiZW5jb2RlVWludDhBcnJheVRvQmFzZTY0IiwicmVuZGVyVmlld0ltYWdlRXJyb3IiLCJwYXRoIiwibWVzc2FnZSIsIm5hbWUiLCJwYXJzZUFwcGx5UGF0Y2hJbnB1dCIsInJhd0lucHV0IiwidHJpbW1lZElucHV0IiwicGFyc2VGcmVlZm9ybVBhdGNoIiwicGF5bG9hZCIsInBhcnNlQXBwbHlQYXRjaFBheWxvYWQiLCJwYXJzZVN0cnVjdHVyZWRPcGVyYXRpb25zIiwiY29tbWFuZE5hbWUiLCJwYXRjaCIsInBheWxvYWRzIiwib3BlcmF0aW9ucyIsInBhcnNlZCIsIkFwcGx5UGF0Y2hPcGVyYXRpb24iLCJyYXdQYXRjaCIsImxpbmVzIiwibGluZSIsInBhcnNlQWRkRmlsZVBhdGNoIiwicGFyc2VEZWxldGVGaWxlUGF0Y2giLCJwYXJzZVVwZGF0ZUZpbGVQYXRjaCIsInBhcnNlUGF0Y2hIZWFkZXIiLCJkaWZmTGluZXMiLCJpc0ZpbGVPcGVyYXRpb25IZWFkZXIiLCJqb2luRGlmZiIsIm1vdmVUbyIsInBhcnNlZE1vdmVUbyIsInByZWZpeCIsImFwcGx5UGF0Y2hPcGVyYXRpb24iLCJlZGl0b3IiLCJvcGVyYXRpb24iLCJydW5Db250ZXh0IiwicmVzdWx0IiwiYXBwbHlQYXRjaE9wZXJhdGlvbnMiLCJvdXRwdXRzIiwiYXBwbHlQYXRjaEZ1bmN0aW9uVG9vbCIsImlucHV0IiwiRmlsZXN5c3RlbUNhcGFiaWxpdHkiLCJzZXNzaW9uIiwicmVxdWlyZUJvdW5kU2Vzc2lvbiIsIl9hIiwiVXNlckVycm9yIiwidG9vbHMiLCJ2aWV3SW1hZ2UiLCJ3aXRoU2FuZGJveFNwYW4iLCJ0b29sIiwiei5vYmplY3QiLCJ6LnN0cmluZyIsImFwcGx5UGF0Y2hUb29sIiwiZmlsZXN5c3RlbSIsIkRFRkFVTFRfRVhFQ19ZSUVMRF9USU1FX01TIiwiREVGQVVMVF9XUklURV9TVERJTl9ZSUVMRF9USU1FX01TIiwiU0hFTExfSU5TVFJVQ1RJT05TIiwiU2hlbGxDYXBhYmlsaXR5IiwielxuICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmluZyIsInpcbiAgICAgICAgICAgICAgICAgICAgICAgIC5ib29sZWFuIiwielxuICAgICAgICAgICAgICAgICAgICAgICAgLm51bWJlciIsImNtZCIsIndvcmtkaXIiLCJzaGVsbCIsImxvZ2luIiwidHR5IiwieWllbGRfdGltZV9tcyIsIm1heF9vdXRwdXRfdG9rZW5zIiwic2Vzc2lvbl9pZCIsImNoYXJzIiwicHJvbXB0IiwiZGVmYXVsdENhcGFiaWxpdGllcyIsIkNhcGFiaWxpdGllcyIsIlNhbmRib3hBZ2VudCIsIl9iIiwiQWdlbnQiLCJTQU5EQk9YX0FHRU5UX0JSQU5EIiwiY29uZmlnIiwiY2xvbmVNYW5pZmVzdCIsIm5vcm1hbGl6ZVJ1bkFzIiwiTWFuaWZlc3QiLCJydW5BcyIsIm5vcm1hbGl6ZVVzZXIiXSwibWFwcGluZ3MiOiI7Ozs7QUFBTyxTQUFTQSxFQUFxQ0MsR0FBZTtBQUNoRSxTQUFLQSxJQVNFLEVBTmlCLE9BQU9BLEtBQWtCLFlBQzdDQSxLQUNBLGlCQUFpQkEsS0FDakIsT0FBT0EsRUFBYyxlQUFnQixhQUNuQ0EsRUFBYyxZQUFZLE9BQzFCLElBQ2tCLFNBQVMsaUJBQWlCLElBUnZDO0FBU2Y7QUFDTyxTQUFTQyxFQUE0QkQsR0FBZTtBQUN2RCxTQUFPRSxFQUFzQ0Ys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