@cartanova/qgrid-cli 2.7.7 → 2.7.9

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.
Files changed (37) hide show
  1. package/bundle/dist/application/qgrid/qgrid.frame.js +63 -28
  2. package/bundle/dist/application/qgrid/qgrid.types.js +6 -3
  3. package/bundle/dist/application/request-log/request-log.model.js +2 -2
  4. package/bundle/dist/sonamu.config.js +3 -1
  5. package/bundle/dist/utils/providers/openai/openai-callback-relay.js +86 -0
  6. package/bundle/src/application/qgrid/qgrid-oauth-redirect.test.ts +71 -8
  7. package/bundle/src/application/qgrid/qgrid.frame.test.ts +43 -0
  8. package/bundle/src/application/qgrid/qgrid.frame.ts +72 -26
  9. package/bundle/src/application/qgrid/qgrid.types.ts +4 -1
  10. package/bundle/src/application/request-log/request-log.model.test.ts +25 -0
  11. package/bundle/src/application/request-log/request-log.model.ts +3 -1
  12. package/bundle/src/application/sonamu.generated.http +7 -3
  13. package/bundle/src/sonamu.config.ts +2 -0
  14. package/bundle/src/utils/providers/openai/openai-callback-relay.test.ts +109 -0
  15. package/bundle/src/utils/providers/openai/openai-callback-relay.ts +105 -0
  16. package/bundle/web-dist/client/assets/{index-CokxkK2G.js → index-D59Q_9Z4.js} +3 -3
  17. package/bundle/web-dist/client/assets/{logs-Ckqp98Y3.js → logs-BHVfI8ut.js} +1 -1
  18. package/bundle/web-dist/client/assets/{monit-u0pMHbyf.js → monit-EkLxH1oN.js} +1 -1
  19. package/bundle/web-dist/client/assets/{routes-DobxbCAV.js → routes-Kbvuclip.js} +2 -2
  20. package/bundle/web-dist/client/assets/{settings-C8rfyi9z.js → settings-B4uTFP3J.js} +1 -1
  21. package/bundle/web-dist/client/assets/{show-FbUQYs4L.js → show-BjIdSPTd.js} +1 -1
  22. package/bundle/web-dist/client/assets/tokens-BbCSxbFu.js +1 -0
  23. package/bundle/web-dist/client/assets/use-oauth-login-flow-4OltfVAd.js +1 -0
  24. package/bundle/web-dist/client/index.html +1 -1
  25. package/bundle/web-dist/server/assets/{routes-B9X0lvjQ.js → routes-Ct3I9263.js} +3 -2
  26. package/bundle/web-dist/server/assets/{tokens-CyItE-L-.js → tokens-PR42jF1J.js} +3 -2
  27. package/bundle/web-dist/server/assets/{use-oauth-login-flow-CItVKngs.js → use-oauth-login-flow-C-33Z5HA.js} +16 -10
  28. package/bundle/web-dist/server/entry-server.generated.js +3 -3
  29. package/dist/cli.js +10 -11
  30. package/package.json +1 -1
  31. package/skills/qgrid/references/ai-sdk-provider-contract.md +2 -0
  32. package/skills/qgrid/references/cli-env-and-server-boot.md +1 -1
  33. package/skills/qgrid/references/openai-codex-runtime.md +12 -5
  34. package/skills/qgrid/references/request-log-run-lifecycle.md +2 -0
  35. package/skills/qgrid/references/token-auth-quota-lifecycle.md +2 -0
  36. package/bundle/web-dist/client/assets/tokens-DFwEavFD.js +0 -1
  37. package/bundle/web-dist/client/assets/use-oauth-login-flow-D-9h3WUt.js +0 -1
@@ -293,7 +293,7 @@ var RequestLogModelClass = class extends BaseModelClass {
293
293
  tool_call_count: 0,
294
294
  is_image_generation: params.is_image_generation ?? false,
295
295
  json_schema: params.json_schema ?? null,
296
- is_structured: params.json_schema !== null && params.json_schema !== void 0,
296
+ is_structured: params.is_structured ?? (params.json_schema !== null && params.json_schema !== void 0),
297
297
  ...params.history !== void 0 ? { history: params.history } : {},
298
298
  ...params.tools !== void 0 ? { tools: params.tools } : {}
299
299
  });
@@ -577,4 +577,4 @@ const RequestLogModel = new RequestLogModelClass();
577
577
  //#endregion
578
578
  export { MICRO_USD, RequestLogModel };
579
579
 
580
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1sb2cubW9kZWwuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3JlcXVlc3QtbG9nL3JlcXVlc3QtbG9nLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpzb25TY2hlbWFUb1pvZCB9IGZyb20gXCJqc29uLXNjaGVtYS10by16b2RcIjtcbmltcG9ydCB7XG4gIGFwaSxcbiAgYXNBcnJheSxcbiAgQmFkUmVxdWVzdEV4Y2VwdGlvbixcbiAgQmFzZU1vZGVsQ2xhc3MsXG4gIHR5cGUgTGlzdFJlc3VsdCxcbiAgTm90Rm91bmRFeGNlcHRpb24sXG4gIFB1cmksXG4gIHRyYW5zYWN0aW9uYWwsXG59IGZyb20gXCJzb25hbXVcIjtcblxuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IGNhbGN1bGF0ZUNvc3RVc2QgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9tb2RlbC1jb3N0XCI7XG5pbXBvcnQgeyB0eXBlIFJlcXVlc3RMb2dTdWJzZXRLZXksIHR5cGUgUmVxdWVzdExvZ1N1YnNldE1hcHBpbmcgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgcmVxdWVzdExvZ0xvYWRlclF1ZXJpZXMsIHJlcXVlc3RMb2dTdWJzZXRRdWVyaWVzIH0gZnJvbSBcIi4uL3NvbmFtdS5nZW5lcmF0ZWQuc3NvXCI7XG5pbXBvcnQge1xuICByZW5kZXJKc29uU2NoZW1hWm9kU2hhcGVUZXh0LFxuICByZW5kZXJQYXJzZWRKc29uU2NoZW1hVHlwZVRleHQsXG59IGZyb20gXCIuL2pzb24tc2NoZW1hLXR5cGUtdGV4dFwiO1xuaW1wb3J0IHtcbiAgdHlwZSBSZXF1ZXN0TG9nTGlzdFBhcmFtcyxcbiAgdHlwZSBSZXF1ZXN0TG9nU2F2ZVBhcmFtcyxcbiAgdHlwZSBUb29sRGVmaW5pdGlvbnMsXG4gIHR5cGUgVG9vbFZpZXcsXG59IGZyb20gXCIuL3JlcXVlc3QtbG9nLnR5cGVzXCI7XG5pbXBvcnQgeyBmb3JtYXRab2RDb2RlIH0gZnJvbSBcIi4vem9kLWNvZGUtZm9ybWF0XCI7XG5cbi8vIGNvc3RfdXNk64qUIOygleyImCBtaWNyby1VU0TroZwg7KCA7J6lLiDsi6TsoJwgVVNEID0gY29zdF91c2QgLyBNSUNST19VU0QuXG5leHBvcnQgY29uc3QgTUlDUk9fVVNEID0gMV8wMDBfMDAwO1xuY29uc3QgUkVRVUVTVF9MT0dfUlVOX0xPQ0tfQ0xBU1NfSUQgPSA3MTg7XG5jb25zdCBUT09MX0VOVU1fVkFMVUVfTElNSVQgPSA2O1xuXG5mdW5jdGlvbiBkZWNvZGVTdG9yZWRUb29scyh2YWx1ZTogdW5rbm93bik6IFRvb2xEZWZpbml0aW9ucyB8IG51bGwge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHZhbHVlIGFzIFRvb2xEZWZpbml0aW9ucztcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSkgYXMgVG9vbERlZmluaXRpb25zO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG50eXBlIFRvb2xSZXN1bHRDb250aW51YXRpb24gPSB7XG4gIHRvb2xDYWxsSWQ6IHN0cmluZztcbiAgb3V0cHV0OiBzdHJpbmc7XG4gIGlzRXJyb3I/OiBib29sZWFuO1xufTtcblxudHlwZSBSZXF1ZXN0TG9nU3RlcEFnZ3JlZ2F0ZSA9IHtcbiAgaW5wdXRfdG9rZW5zOiBudW1iZXI7XG4gIG91dHB1dF90b2tlbnM6IG51bWJlcjtcbiAgY2FjaGVfcmVhZF90b2tlbnM6IG51bWJlcjtcbiAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vucz86IG51bWJlcjtcbiAgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zPzogbnVtYmVyO1xuICBkdXJhdGlvbl9tczogbnVtYmVyO1xuICBmYWxsYmFja19jb3VudDogbnVtYmVyO1xuICBjb3N0X3VzZDogbnVtYmVyO1xuICBjb3N0X3NvdXJjZT86IHN0cmluZztcbn07XG5cbmNvbnN0IFNURVBfQUdHUkVHQVRFX1NFTEVDVCA9IHtcbiAgaW5wdXRfdG9rZW5zOiBcImlucHV0X3Rva2Vuc1wiLFxuICBvdXRwdXRfdG9rZW5zOiBcIm91dHB1dF90b2tlbnNcIixcbiAgY2FjaGVfcmVhZF90b2tlbnM6IFwiY2FjaGVfcmVhZF90b2tlbnNcIixcbiAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBcImNhY2hlX2NyZWF0aW9uX3Rva2Vuc1wiLFxuICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM6IFwiY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zXCIsXG4gIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2VuczogXCJjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnNcIixcbiAgZHVyYXRpb25fbXM6IFwiZHVyYXRpb25fbXNcIixcbiAgZmFsbGJhY2tfY291bnQ6IFwiZmFsbGJhY2tfY291bnRcIixcbiAgY29zdF91c2Q6IFwiY29zdF91c2RcIixcbiAgY29zdF9zb3VyY2U6IFwiY29zdF9zb3VyY2VcIixcbn0gYXMgY29uc3Q7XG5cbmZ1bmN0aW9uIGFnZ3JlZ2F0ZUdlbmVyYXRlU3RlcFJvd3Mocm93czogQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KTogUmVxdWVzdExvZ1N0ZXBBZ2dyZWdhdGUge1xuICBjb25zdCBzdW0gPSAoZmllbGQ6IHN0cmluZyk6IG51bWJlciA9PlxuICAgIHJvd3MucmVkdWNlKCh0b3RhbCwgcm93KSA9PiB0b3RhbCArIE51bWJlcihyb3dbZmllbGRdID8/IDApLCAwKTtcbiAgY29uc3Qgb3B0aW9uYWxTdW0gPSAoZmllbGQ6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCA9PlxuICAgIHJvd3Muc29tZSgocm93KSA9PiByb3dbZmllbGRdICE9PSBudWxsICYmIHJvd1tmaWVsZF0gIT09IHVuZGVmaW5lZCkgPyBzdW0oZmllbGQpIDogdW5kZWZpbmVkO1xuICBjb25zdCBjb2xsYXBzZSA9IChmaWVsZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgICBjb25zdCB2YWx1ZXMgPSBbXG4gICAgICAuLi5uZXcgU2V0KFxuICAgICAgICByb3dzXG4gICAgICAgICAgLm1hcCgocm93KSA9PiByb3dbZmllbGRdKVxuICAgICAgICAgIC5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS5sZW5ndGggPiAwKSxcbiAgICAgICksXG4gICAgXTtcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdmFsdWVzLmxlbmd0aCA9PT0gMSA/IHZhbHVlc1swXSA6IFwibWl4ZWRcIjtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBpbnB1dF90b2tlbnM6IHN1bShcImlucHV0X3Rva2Vuc1wiKSxcbiAgICBvdXRwdXRfdG9rZW5zOiBzdW0oXCJvdXRwdXRfdG9rZW5zXCIpLFxuICAgIGNhY2hlX3JlYWRfdG9rZW5zOiBzdW0oXCJjYWNoZV9yZWFkX3Rva2Vuc1wiKSxcbiAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IHN1bShcImNhY2hlX2NyZWF0aW9uX3Rva2Vuc1wiKSxcbiAgICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM6IG9wdGlvbmFsU3VtKFwiY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zXCIpLFxuICAgIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2Vuczogb3B0aW9uYWxTdW0oXCJjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnNcIiksXG4gICAgZHVyYXRpb25fbXM6IHN1bShcImR1cmF0aW9uX21zXCIpLFxuICAgIGZhbGxiYWNrX2NvdW50OiBzdW0oXCJmYWxsYmFja19jb3VudFwiKSxcbiAgICBjb3N0X3VzZDogc3VtKFwiY29zdF91c2RcIiksXG4gICAgY29zdF9zb3VyY2U6IGNvbGxhcHNlKFwiY29zdF9zb3VyY2VcIiksXG4gIH07XG59XG5cbnR5cGUgUmVxdWVzdExvZ1VzYWdlUm93ID0ge1xuICB0b2tlbl9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgbW9kZWxfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gIGlucHV0X3Rva2VuczogbnVtYmVyO1xuICBvdXRwdXRfdG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlX3JlYWRfdG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogbnVtYmVyO1xuICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuICBjb3N0X3VzZD86IG51bWJlciB8IG51bGw7XG4gIGNvc3Rfc291cmNlPzogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmZ1bmN0aW9uIGlzQW50aHJvcGljVXNhZ2VSb3cocm93OiBQaWNrPFJlcXVlc3RMb2dVc2FnZVJvdywgXCJ0b2tlbl9uYW1lXCIgfCBcIm1vZGVsX25hbWVcIj4pOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICByb3cudG9rZW5fbmFtZT8uc3RhcnRzV2l0aChcImFudGhyb3BpYy9cIikgPT09IHRydWUgfHxcbiAgICByb3cubW9kZWxfbmFtZT8uc3RhcnRzV2l0aChcImNsYXVkZS1cIikgPT09IHRydWUgfHxcbiAgICByb3cubW9kZWxfbmFtZT8uc3RhcnRzV2l0aChcImFudGhyb3BpYy9jbGF1ZGUtXCIpID09PSB0cnVlXG4gICk7XG59XG5cbmZ1bmN0aW9uIGNhbm9uaWNhbE1vZGVsTmFtZShtb2RlbE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBtb2RlbE5hbWUuaW5jbHVkZXMoXCIvXCIpID8gbW9kZWxOYW1lLnNwbGl0KFwiL1wiKS5wb3AoKSEgOiBtb2RlbE5hbWU7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZWRVc2FnZUZvckNvc3Qocm93OiBSZXF1ZXN0TG9nVXNhZ2VSb3cpOiB7XG4gIG1vZGVsOiBzdHJpbmcgfCBudWxsO1xuICBpbnB1dFRva2VuczogbnVtYmVyO1xuICBvdXRwdXRUb2tlbnM6IG51bWJlcjtcbiAgY2FjaGVkSW5wdXRUb2tlbnM6IG51bWJlcjtcbiAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtPzogbnVtYmVyO1xuICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaD86IG51bWJlcjtcbn0ge1xuICBjb25zdCBjYWNoZVJlYWQgPSByb3cuY2FjaGVfcmVhZF90b2tlbnM7XG4gIGNvbnN0IGNhY2hlQ3JlYXRpb24gPSByb3cuY2FjaGVfY3JlYXRpb25fdG9rZW5zO1xuICBjb25zdCBzdG9yZWRJbnB1dCA9IHJvdy5pbnB1dF90b2tlbnM7XG4gIGNvbnN0IGxlZ2FjeUFudGhyb3BpY1NwbGl0SW5wdXQgPVxuICAgIGlzQW50aHJvcGljVXNhZ2VSb3cocm93KSAmJiBzdG9yZWRJbnB1dCA8IGNhY2hlUmVhZCArIGNhY2hlQ3JlYXRpb247XG4gIHJldHVybiB7XG4gICAgbW9kZWw6IHJvdy5tb2RlbF9uYW1lID8gY2Fub25pY2FsTW9kZWxOYW1lKHJvdy5tb2RlbF9uYW1lKSA6IG51bGwsXG4gICAgaW5wdXRUb2tlbnM6IGxlZ2FjeUFudGhyb3BpY1NwbGl0SW5wdXQgPyBzdG9yZWRJbnB1dCArIGNhY2hlUmVhZCArIGNhY2hlQ3JlYXRpb24gOiBzdG9yZWRJbnB1dCxcbiAgICBvdXRwdXRUb2tlbnM6IHJvdy5vdXRwdXRfdG9rZW5zLFxuICAgIGNhY2hlZElucHV0VG9rZW5zOiBjYWNoZVJlYWQsXG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiBjYWNoZUNyZWF0aW9uLFxuICAgIC4uLihyb3cuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zICE9PSBudWxsICYmIHJvdy5jYWNoZV9jcmVhdGlvbl81bV90b2tlbnMgIT09IHVuZGVmaW5lZFxuICAgICAgPyB7IGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtOiByb3cuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zIH1cbiAgICAgIDoge30pLFxuICAgIC4uLihyb3cuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zICE9PSBudWxsICYmIHJvdy5jYWNoZV9jcmVhdGlvbl8xaF90b2tlbnMgIT09IHVuZGVmaW5lZFxuICAgICAgPyB7IGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoOiByb3cuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zIH1cbiAgICAgIDoge30pLFxuICB9O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVMZWdhY3lBbnRocm9waWNSb3c8VCBleHRlbmRzIFJlcXVlc3RMb2dVc2FnZVJvdz4ocm93OiBUKTogVCB7XG4gIC8vIOyDiCByb3cg64qUIOuLueyLnOydmCBwcm92aWRlci/qsIDqsqntkZwg67mE7Jqp7J2EIO2ZleyglSDsoIDsnqXtlZzri6QuIO2YhOyerCDqsIDqsqntkZzroZwg642u7Ja07JOw7KeAIOyViuuKlOuLpC5cbiAgaWYgKHJvdy5jb3N0X3NvdXJjZSkgcmV0dXJuIHJvdztcbiAgY29uc3QgdXNhZ2UgPSBub3JtYWxpemVkVXNhZ2VGb3JDb3N0KHJvdyk7XG4gIGlmICh1c2FnZS5pbnB1dFRva2VucyA9PT0gcm93LmlucHV0X3Rva2VucykgcmV0dXJuIHJvdztcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHsgLi4ucm93LCBpbnB1dF90b2tlbnM6IHVzYWdlLmlucHV0VG9rZW5zIH07XG4gIGlmICh1c2FnZS5tb2RlbCkge1xuICAgIG5vcm1hbGl6ZWQuY29zdF91c2QgPSBNYXRoLnJvdW5kKGNhbGN1bGF0ZUNvc3RVc2QodXNhZ2UubW9kZWwsIHVzYWdlKSAqIE1JQ1JPX1VTRCk7XG4gIH1cbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59XG5cbi8qKlxuICogYG9yZGVyQnlgIGVudW0g6rCSKGDsu6zrn7wt67Cp7ZalYCnsnYQg7KCV66CsIOygiOuhnCDsmK7quLTri6QuXG4gKlxuICogZW51bSDsnbQgMTgg7KKF7J206528IOy8gOydtOyKpOulvCDsnbzsnbzsnbQg7KCB64qUIOuMgOyLoCDtjIzsi7HtlZjrkJgsIOy7rOufvOydgCDslYTrnpgg66qp66Gd7Jy866GcIO2VnOygle2VnOuLpCDigJRcbiAqIOusuOyekOyXtOydhCDqt7jrjIDroZwg7Lus65+866qF7JeQIOuEmOq4sOuptCBlbnVtIOydtCDrsJTrgJQg65WMIOqygOymnSDsl4bripQg7Iud67OE7J6Q6rCAIFNRTCDroZwg7Z2Y65+s65Og64ukLlxuICog66qp66Gd7JeQIOyXhuuKlCDqsJLsnYAg6riw67O4IOygleugrChpZCBkZXNjKeuhnCDrlqjslrTsp4Tri6QuXG4gKi9cbmNvbnN0IE9SREVSQUJMRV9DT0xVTU5TID0ge1xuICBpZDogXCJyZXF1ZXN0X2xvZ3MuaWRcIixcbiAgY3JlYXRlZF9hdDogXCJyZXF1ZXN0X2xvZ3MuY3JlYXRlZF9hdFwiLFxuICB0dGZ0X21zOiBcInJlcXVlc3RfbG9ncy50dGZ0X21zXCIsXG4gIGR1cmF0aW9uX21zOiBcInJlcXVlc3RfbG9ncy5kdXJhdGlvbl9tc1wiLFxuICBpbnB1dF90b2tlbnM6IFwicmVxdWVzdF9sb2dzLmlucHV0X3Rva2Vuc1wiLFxuICBvdXRwdXRfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5vdXRwdXRfdG9rZW5zXCIsXG4gIGNhY2hlX3JlYWRfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5jYWNoZV9yZWFkX3Rva2Vuc1wiLFxuICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IFwicmVxdWVzdF9sb2dzLmNhY2hlX2NyZWF0aW9uX3Rva2Vuc1wiLFxuICBjb3N0X3VzZDogXCJyZXF1ZXN0X2xvZ3MuY29zdF91c2RcIixcbn0gYXMgY29uc3Q7XG5cbmZ1bmN0aW9uIGFwcGx5T3JkZXJCeShcbiAgcWI6IFJldHVyblR5cGU8UmVxdWVzdExvZ01vZGVsQ2xhc3NbXCJnZXRTdWJzZXRRdWVyaWVzXCJdPltcInFiXCJdLFxuICBvcmRlckJ5OiBzdHJpbmcsXG4pOiB2b2lkIHtcbiAgY29uc3Qgc2VwYXJhdG9yID0gb3JkZXJCeS5sYXN0SW5kZXhPZihcIi1cIik7XG4gIGNvbnN0IGtleSA9IG9yZGVyQnkuc2xpY2UoMCwgc2VwYXJhdG9yKSBhcyBrZXlvZiB0eXBlb2YgT1JERVJBQkxFX0NPTFVNTlM7XG4gIGNvbnN0IGRpcmVjdGlvbiA9IG9yZGVyQnkuc2xpY2Uoc2VwYXJhdG9yICsgMSkgPT09IFwiYXNjXCIgPyBcImFzY1wiIDogXCJkZXNjXCI7XG4gIGNvbnN0IGNvbHVtbiA9IE9SREVSQUJMRV9DT0xVTU5TW2tleV07XG5cbiAgaWYgKCFjb2x1bW4pIHtcbiAgICBxYi5vcmRlckJ5KFwicmVxdWVzdF9sb2dzLmlkXCIsIFwiZGVzY1wiKTtcbiAgICByZXR1cm47XG4gIH1cbiAgcWIub3JkZXJCeShjb2x1bW4sIGRpcmVjdGlvbik7XG4gIC8vIOuPmeygkCDtlonsnZgg7Iic7ISc6rCAIO2OmOydtOyngOuniOuLpCDtnZTrk6Trpqzsp4Ag7JWK6rKMIOqzoOycoCDsu6zrn7zsnLzroZwgdGllLWJyZWFrIO2VnOuLpC5cbiAgaWYgKGtleSAhPT0gXCJpZFwiKSBxYi5vcmRlckJ5KFwicmVxdWVzdF9sb2dzLmlkXCIsIFwiZGVzY1wiKTtcbn1cblxuLypcbiAgUmVxdWVzdExvZyBNb2RlbFxuKi9cbmNsYXNzIFJlcXVlc3RMb2dNb2RlbENsYXNzIGV4dGVuZHMgQmFzZU1vZGVsQ2xhc3M8XG4gIFJlcXVlc3RMb2dTdWJzZXRLZXksXG4gIFJlcXVlc3RMb2dTdWJzZXRNYXBwaW5nLFxuICB0eXBlb2YgcmVxdWVzdExvZ1N1YnNldFF1ZXJpZXMsXG4gIHR5cGVvZiByZXF1ZXN0TG9nTG9hZGVyUXVlcmllc1xuPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiUmVxdWVzdExvZ1wiLCByZXF1ZXN0TG9nU3Vic2V0UXVlcmllcywgcmVxdWVzdExvZ0xvYWRlclF1ZXJpZXMpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0sIHJlc291cmNlTmFtZTogXCJSZXF1ZXN0TG9nXCIgfSlcbiAgYXN5bmMgZmluZEJ5SWQ8VCBleHRlbmRzIFJlcXVlc3RMb2dTdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBpZDogbnVtYmVyLFxuICApOiBQcm9taXNlPFJlcXVlc3RMb2dTdWJzZXRNYXBwaW5nW1RdPiB7XG4gICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCB0aGlzLmZpbmRNYW55KHN1YnNldCwge1xuICAgICAgaWQsXG4gICAgICBudW06IDEsXG4gICAgICBwYWdlOiAxLFxuICAgIH0pO1xuICAgIGlmICghcm93c1swXSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFNEKFwiZXJyb3IuZW50aXR5Tm90Rm91bmRcIikoXCJSZXF1ZXN0TG9nXCIsIGlkKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJvd3NbMF07XG4gIH1cblxuICBhc3luYyBmaW5kT25lPFQgZXh0ZW5kcyBSZXF1ZXN0TG9nU3Vic2V0S2V5PihcbiAgICBzdWJzZXQ6IFQsXG4gICAgbGlzdFBhcmFtczogUmVxdWVzdExvZ0xpc3RQYXJhbXMsXG4gICk6IFByb21pc2U8UmVxdWVzdExvZ1N1YnNldE1hcHBpbmdbVF0gfCBudWxsPiB7XG4gICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCB0aGlzLmZpbmRNYW55KHN1YnNldCwge1xuICAgICAgLi4ubGlzdFBhcmFtcyxcbiAgICAgIG51bTogMSxcbiAgICAgIHBhZ2U6IDEsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcm93c1swXSA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIOuqqeuhnSDtlYTthLDsnZgg64uo7J28IOygleydmC4gZmluZE1hbnkg7JmAIHRvdGFsQ29zdCDqsIAg6rCZ7J2AIOyhsOqxtOydhCDrs7Trj4TroZ0g6rO17Jyg7ZWc64ukIOKAlFxuICAgKiDtmZTrqbTsl5DshJwg7ZWE7YSw66W8IOqxuOuptCDtlokg7IiY7JmAIOu5hOyaqeydtCDtlajqu5gg7KKB7ZiA7KC47JW8IO2VmOuKlOuNsCwg65GQIOy/vOumrOqwgCDqsIHsnpAg7ZWE7YSw66W8XG4gICAqIOq1rO2YhO2VmOuptCDtlZzsqr3sl5Ag7LaV7J2EIOy2lOqwgO2VoCDrlYwg7KGw7Jqp7Z6IIOyWtOq4i+uCnOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXBwbHlMaXN0RmlsdGVycyhcbiAgICBxYjogUmV0dXJuVHlwZTxSZXF1ZXN0TG9nTW9kZWxDbGFzc1tcImdldFN1YnNldFF1ZXJpZXNcIl0+W1wicWJcIl0sXG4gICAgcGFyYW1zOiBSZXF1ZXN0TG9nTGlzdFBhcmFtcyxcbiAgKTogdm9pZCB7XG4gICAgaWYgKHBhcmFtcy5pZCkge1xuICAgICAgcWIud2hlcmVJbihcInJlcXVlc3RfbG9ncy5pZFwiLCBhc0FycmF5KHBhcmFtcy5pZCkpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMudG9rZW5fbmFtZSkge1xuICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MudG9rZW5fbmFtZVwiLCBwYXJhbXMudG9rZW5fbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5wcm9qZWN0X25hbWVfaXNfbnVsbCkge1xuICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MucHJvamVjdF9uYW1lXCIsIG51bGwpO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLnByb2plY3RfbmFtZV9pc19ub3RfbnVsbCkge1xuICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MucHJvamVjdF9uYW1lXCIsIFwiIT1cIiwgbnVsbCk7XG4gICAgfSBlbHNlIGlmIChwYXJhbXMucHJvamVjdF9uYW1lKSB7XG4gICAgICBxYi53aGVyZShcInJlcXVlc3RfbG9ncy5wcm9qZWN0X25hbWVcIiwgcGFyYW1zLnByb2plY3RfbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5tb2RlbF9uYW1lKSB7XG4gICAgICBxYi53aGVyZShcInJlcXVlc3RfbG9ncy5tb2RlbF9uYW1lXCIsIHBhcmFtcy5tb2RlbF9uYW1lKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnNlYXJjaCAmJiBwYXJhbXMua2V5d29yZCAmJiBwYXJhbXMua2V5d29yZC5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAocGFyYW1zLnNlYXJjaCA9PT0gXCJpZFwiKSB7XG4gICAgICAgIHFiLndoZXJlKFwicmVxdWVzdF9sb2dzLmlkXCIsIE51bWJlcihwYXJhbXMua2V5d29yZCkpO1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXMuc2VhcmNoID09PSBcInRva2VuX25hbWVcIikge1xuICAgICAgICBxYi53aGVyZShcInJlcXVlc3RfbG9ncy50b2tlbl9uYW1lXCIsIFwibGlrZVwiLCBgJSR7cGFyYW1zLmtleXdvcmR9JWApO1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXMuc2VhcmNoID09PSBcInVzZXJfcHJvbXB0XCIpIHtcbiAgICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MudXNlcl9wcm9tcHRcIiwgXCJsaWtlXCIsIGAlJHtwYXJhbXMua2V5d29yZH0lYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcImVycm9yLnVua25vd25TZWFyY2hGaWVsZFwiKShwYXJhbXMuc2VhcmNoKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0sIHJlc291cmNlTmFtZTogXCJSZXF1ZXN0TG9nc1wiIH0pXG4gIGFzeW5jIGZpbmRNYW55PFQgZXh0ZW5kcyBSZXF1ZXN0TG9nU3Vic2V0S2V5LCBMUCBleHRlbmRzIFJlcXVlc3RMb2dMaXN0UGFyYW1zPihcbiAgICBzdWJzZXQ6IFQsXG4gICAgcmF3UGFyYW1zPzogTFAsXG4gICk6IFByb21pc2U8TGlzdFJlc3VsdDxMUCwgUmVxdWVzdExvZ1N1YnNldE1hcHBpbmdbVF0+PiB7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgbnVtOiAyNCxcbiAgICAgIHBhZ2U6IDEsXG4gICAgICBzZWFyY2g6IFwiaWRcIiBhcyBjb25zdCxcbiAgICAgIG9yZGVyQnk6IFwiaWQtZGVzY1wiIGFzIGNvbnN0LFxuICAgICAgLi4ucmF3UGFyYW1zLFxuICAgIH0gc2F0aXNmaWVzIFJlcXVlc3RMb2dMaXN0UGFyYW1zO1xuXG4gICAgY29uc3QgeyBxYiwgb25TdWJzZXQ6IF8gfSA9IHRoaXMuZ2V0U3Vic2V0UXVlcmllcyhzdWJzZXQpO1xuXG4gICAgdGhpcy5hcHBseUxpc3RGaWx0ZXJzKHFiLCBwYXJhbXMpO1xuXG4gICAgaWYgKHBhcmFtcy5vcmRlckJ5KSBhcHBseU9yZGVyQnkocWIsIHBhcmFtcy5vcmRlckJ5KTtcblxuICAgIGNvbnN0IGVuaGFuY2VycyA9IHRoaXMuY3JlYXRlRW5oYW5jZXJzKHtcbiAgICAgIEE6IChyb3cpID0+IG5vcm1hbGl6ZUxlZ2FjeUFudGhyb3BpY1Jvdyhyb3cpLFxuICAgICAgQzogKHJvdykgPT4gbm9ybWFsaXplTGVnYWN5QW50aHJvcGljUm93KHJvdyksXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlU3Vic2V0UXVlcnkoe1xuICAgICAgc3Vic2V0LFxuICAgICAgcWIsXG4gICAgICBwYXJhbXMsXG4gICAgICBlbmhhbmNlcnMsXG4gICAgICBkZWJ1ZzogZmFsc2UsXG4gICAgfSk7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgc2F2ZShzcGE6IFJlcXVlc3RMb2dTYXZlUGFyYW1zW10pOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcblxuICAgIC8vIHJlZ2lzdGVyXG4gICAgc3BhLmZvckVhY2goKHNwKSA9PiB7XG4gICAgICB3ZGIudWJSZWdpc3RlcihcInJlcXVlc3RfbG9nc1wiLCBzcCk7XG4gICAgfSk7XG5cbiAgICAvLyB0cmFuc2FjdGlvblxuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgY29uc3QgaWRzID0gYXdhaXQgdHJ4LnViVXBzZXJ0KFwicmVxdWVzdF9sb2dzXCIpO1xuXG4gICAgICByZXR1cm4gaWRzO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOy1nOq3vCDqtazqsITsnZggcHJvdmlkZXIg67OEIOqyveufiSDthrXqs4Qo66qo64uI7YSw66eB7JqpKS4gcHJvdmlkZXIg64qUIHJlcXVlc3RlZF9tb2RlbF9uYW1lIOydmFxuICAgKiBcIm9wZW5haS8uLi5cIiB8IFwiYW50aHJvcGljLy4uLlwiIHByZWZpeCDroZwg7YyQ7KCV7ZWc64ukIOKAlCBzZXJ2aW5nIG1vZGVsX25hbWUg7J2AIHByZWZpeCDqsIBcbiAgICog7JeG6rOgLCBydW5uaW5nIOy0iOq4sOyXlCDslYTsp4Eg67mE7Ja0IOyeiOuLpC4g7KeR6rOE64qUIEpTIOyXkOyEnCDtlZzri6Q6IO2PtOungSDso7zquLDqsIAg64qQ7Iqo7ZWY6rOgXG4gICAqIOq1rOqwhOydtCDsp6fslYQgcm93IOyImOqwgCDsnpHsnLzrqbAsIHByZWZpeCBDQVNFIOyLneydhCDsv7zrpqwg67mM642U7JeQIOuwleyngCDslYrslYTrj4Qg65Cc64ukLlxuICAgKi9cbiAgYXN5bmMgcHJvdmlkZXJTdGF0c1NpbmNlKHNpbmNlOiBEYXRlKTogUHJvbWlzZTxcbiAgICBBcnJheTx7XG4gICAgICBwcm92aWRlcjogc3RyaW5nO1xuICAgICAgcmVxdWVzdHM6IG51bWJlcjtcbiAgICAgIGVycm9yczogbnVtYmVyO1xuICAgICAgaW5wdXRUb2tlbnM6IG51bWJlcjtcbiAgICAgIGNhY2hlUmVhZFRva2VuczogbnVtYmVyO1xuICAgIH0+XG4gID4ge1xuICAgIGNvbnN0IHJkYiA9IHRoaXMuZ2V0UHVyaShcInJcIik7XG4gICAgY29uc3Qgcm93cyA9IChhd2FpdCByZGJcbiAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dzXCIpXG4gICAgICAuc2VsZWN0KHtcbiAgICAgICAgcmVxdWVzdGVkX21vZGVsX25hbWU6IFwicmVxdWVzdF9sb2dzLnJlcXVlc3RlZF9tb2RlbF9uYW1lXCIsXG4gICAgICAgIHN0YXR1czogXCJyZXF1ZXN0X2xvZ3Muc3RhdHVzXCIsXG4gICAgICAgIGlucHV0X3Rva2VuczogXCJyZXF1ZXN0X2xvZ3MuaW5wdXRfdG9rZW5zXCIsXG4gICAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5jYWNoZV9yZWFkX3Rva2Vuc1wiLFxuICAgICAgfSlcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9ncy5jcmVhdGVkX2F0XCIsIFwiPj1cIiwgc2luY2UpKSBhcyB1bmtub3duIGFzIEFycmF5PHtcbiAgICAgIHJlcXVlc3RlZF9tb2RlbF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgICBpbnB1dF90b2tlbnM6IG51bWJlcjtcbiAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiBudW1iZXI7XG4gICAgfT47XG5cbiAgICBjb25zdCBieVByb3ZpZGVyID0gbmV3IE1hcDxcbiAgICAgIHN0cmluZyxcbiAgICAgIHsgcmVxdWVzdHM6IG51bWJlcjsgZXJyb3JzOiBudW1iZXI7IGlucHV0VG9rZW5zOiBudW1iZXI7IGNhY2hlUmVhZFRva2VuczogbnVtYmVyIH1cbiAgICA+KCk7XG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgY29uc3QgbW9kZWwgPSByb3cucmVxdWVzdGVkX21vZGVsX25hbWUgPz8gXCJcIjtcbiAgICAgIGNvbnN0IHByb3ZpZGVyID0gbW9kZWwuc3RhcnRzV2l0aChcIm9wZW5haS9cIilcbiAgICAgICAgPyBcIm9wZW5haVwiXG4gICAgICAgIDogbW9kZWwuc3RhcnRzV2l0aChcImFudGhyb3BpYy9cIilcbiAgICAgICAgICA/IFwiYW50aHJvcGljXCJcbiAgICAgICAgICA6IFwidW5rbm93blwiO1xuICAgICAgY29uc3QgYWdnID0gYnlQcm92aWRlci5nZXQocHJvdmlkZXIpID8/IHtcbiAgICAgICAgcmVxdWVzdHM6IDAsXG4gICAgICAgIGVycm9yczogMCxcbiAgICAgICAgaW5wdXRUb2tlbnM6IDAsXG4gICAgICAgIGNhY2hlUmVhZFRva2VuczogMCxcbiAgICAgIH07XG4gICAgICBhZ2cucmVxdWVzdHMgKz0gMTtcbiAgICAgIGlmIChyb3cuc3RhdHVzID09PSBcImVycm9yXCIpIGFnZy5lcnJvcnMgKz0gMTtcbiAgICAgIGFnZy5pbnB1dFRva2VucyArPSByb3cuaW5wdXRfdG9rZW5zO1xuICAgICAgYWdnLmNhY2hlUmVhZFRva2VucyArPSByb3cuY2FjaGVfcmVhZF90b2tlbnM7XG4gICAgICBieVByb3ZpZGVyLnNldChwcm92aWRlciwgYWdnKTtcbiAgICB9XG4gICAgcmV0dXJuIFsuLi5ieVByb3ZpZGVyLmVudHJpZXMoKV1cbiAgICAgIC5tYXAoKFtwcm92aWRlciwgYWdnXSkgPT4gKHsgcHJvdmlkZXIsIC4uLmFnZyB9KSlcbiAgICAgIC50b1NvcnRlZCgoYSwgYikgPT4gYS5wcm92aWRlci5sb2NhbGVDb21wYXJlKGIucHJvdmlkZXIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzdHJ1Y3R1cmVkIG91dHB1dCDsmpTssq3snZggSlNPTiBTY2hlbWEg66W8IO2RnOyLnOyaqSDtg4DsnoUg7YWN7Iqk7Yq466GcIOuzgO2ZmO2VnOuLpC5cbiAgICogdHlwZXNjcmlwdCDripQg6rCE6rKw7ZWcIGB0eXBlYCDshKDslrgsIHpvZCDripQg7J6s6rWs7ISx65CcIHpvZCDtkZztmITsi53snbTri6Qg4oCUIOybkOuzuCB6b2RcbiAgICog7IaM7Iqk64qUIHdpcmUg66W8IOqxtOuEiOyYpOupsCDshozsi6TrkJjrr4DroZwgcmVmaW5lL3RyYW5zZm9ybSDrpZjripQg67O17JuQ65CY7KeAIOyViuuKlOuLpC5cbiAgICog7Iqk7YKk66eI6rCAIOyXhuqxsOuCmCDrs4DtmZgg7Iuk7Yyo66m0IG51bGwg4oCUIO2ZlOuptOydgCDtlbTri7kg67iU66GdIO2RnOyLnOulvCDsg53rnrXtlZzri6QuXG4gICAqL1xuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyByZXNwb25zZVR5cGVUcyhpZDogbnVtYmVyKTogUHJvbWlzZTx7XG4gICAgdHlwZXNjcmlwdDogc3RyaW5nIHwgbnVsbDtcbiAgICB6b2Q6IHN0cmluZyB8IG51bGw7XG4gIH0+IHtcbiAgICBjb25zdCByZGIgPSB0aGlzLmdldFB1cmkoXCJyXCIpO1xuICAgIGNvbnN0IHJvd3MgPSAoYXdhaXQgcmRiXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nc1wiKVxuICAgICAgLnNlbGVjdCh7IGpzb25fc2NoZW1hOiBcInJlcXVlc3RfbG9ncy5qc29uX3NjaGVtYVwiIH0pXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ3MuaWRcIiwgaWQpKSBhcyB1bmtub3duIGFzIEFycmF5PHsganNvbl9zY2hlbWE6IHN0cmluZyB8IG51bGwgfT47XG4gICAgY29uc3Qgc2NoZW1hID0gcm93c1swXT8uanNvbl9zY2hlbWE7XG4gICAgaWYgKCFzY2hlbWEpIHJldHVybiB7IHR5cGVzY3JpcHQ6IG51bGwsIHpvZDogbnVsbCB9O1xuXG4gICAgbGV0IHBhcnNlZDogdW5rbm93bjtcbiAgICB0cnkge1xuICAgICAgcGFyc2VkID0gSlNPTi5wYXJzZShzY2hlbWEpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHsgdHlwZXNjcmlwdDogbnVsbCwgem9kOiBudWxsIH07XG4gICAgfVxuICAgIGxldCB6b2Q6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICB6b2QgPSBmb3JtYXRab2RDb2RlKFxuICAgICAgICBqc29uU2NoZW1hVG9ab2QocGFyc2VkIGFzIFBhcmFtZXRlcnM8dHlwZW9mIGpzb25TY2hlbWFUb1pvZD5bMF0sIHsgbW9kdWxlOiBcIm5vbmVcIiB9KSxcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB6b2QgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4geyB0eXBlc2NyaXB0OiByZW5kZXJQYXJzZWRKc29uU2NoZW1hVHlwZVRleHQocGFyc2VkKSwgem9kIH07XG4gIH1cblxuICAvLyDilIDilIAgVG9vbCBDb250cmFjdCBWaWV3XG5cbiAgLyoqXG4gICAqIOyalOyyreyXkCDsnqXssKnrkJwgdG9vbCDqs4Tslb3snYQgZGV0YWlsIO2ZlOuptOyaqeycvOuhnCDstpXslb3tlZzri6QuIEpTT05CIOuKlCDsnbTrr7ggZGVjb2RlIOuQnFxuICAgKiDrsLDsl7TroZwg7Jik66mwIOusuOyekOyXtOyduCDqsr3smrDrp4wg67Cp7Ja07KCB7Jy866GcIHBhcnNlIO2VnOuLpC4g7KCA7J6l65CcIFFncmlkVG9vbCDqs4Tslb3snYBcbiAgICog7KCE7IiYIOqygOyCrOuhnCDtmZXsnbjrkJDsnLzrr4DroZwg7ZWt66qp67OEIOuztOygleydtOuCmCB1bnJlYWRhYmxlIHNlbnRpbmVsIOydgCDrp4zrk6Tsp4Ag7JWK64qU64ukLlxuICAgKiDri6Trp4wgYFFncmlkVG9vbC5pbnB1dFNjaGVtYWAg64qUIGB6LnVua25vd24oKWAg7J206528IO2CpOqwgCDsl4bqsbDrgpggbnVsbCDsnbgg6rCS64+EXG4gICAqIHdpcmUg6rKA7Kad7J2EIO2GteqzvO2VmOuvgOuhnCDruYgg7Iqk7YKk66eI66GcIOygleq3nO2ZlO2VnOuLpCDigJQgU0RLIOuKlCBge31gIOuhnCDssYTsm4wg67O064K464ukLlxuICAgKi9cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgdG9vbHNWaWV3KGlkOiBudW1iZXIpOiBQcm9taXNlPFRvb2xWaWV3W10+IHtcbiAgICBjb25zdCByb3cgPSAoYXdhaXQgdGhpcy5nZXRQdXJpKFwiclwiKVxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ3NcIilcbiAgICAgIC5zZWxlY3QoeyB0b29sczogXCJyZXF1ZXN0X2xvZ3MudG9vbHNcIiB9KVxuICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dzLmlkXCIsIGlkKVxuICAgICAgLmZpcnN0KCkpIGFzIHsgdG9vbHM6IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCB0b29scyA9IGRlY29kZVN0b3JlZFRvb2xzKHJvdz8udG9vbHMpO1xuICAgIGlmICghdG9vbHMpIHJldHVybiBbXTtcblxuICAgIHJldHVybiB0b29scy5tYXAoKHRvb2wpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0U2NoZW1hID0gKHRvb2wuaW5wdXRTY2hlbWEgPz8ge30pIGFzIHtcbiAgICAgICAgcHJvcGVydGllcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGlucHV0Wm9kID0gcmVuZGVySnNvblNjaGVtYVpvZFNoYXBlVGV4dChpbnB1dFNjaGVtYSwgVE9PTF9FTlVNX1ZBTFVFX0xJTUlUKTtcbiAgICAgIGNvbnN0IGZ1bGxJbnB1dFpvZCA9IHJlbmRlckpzb25TY2hlbWFab2RTaGFwZVRleHQoaW5wdXRTY2hlbWEpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiB0b29sLm5hbWUsXG4gICAgICAgIC4uLih0b29sLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQgPyB7IGRlc2NyaXB0aW9uOiB0b29sLmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAgIHBhcmFtZXRlckNvdW50OiBPYmplY3Qua2V5cyhpbnB1dFNjaGVtYS5wcm9wZXJ0aWVzID8/IHt9KS5sZW5ndGgsXG4gICAgICAgIGlucHV0Wm9kLFxuICAgICAgICAuLi4oaW5wdXRab2QgIT09IGZ1bGxJbnB1dFpvZCA/IHsgZnVsbElucHV0Wm9kIH0gOiB7fSksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJ1biBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYXN5bmMgY3JlYXRlUnVuKHBhcmFtczoge1xuICAgIHVzZXJfcHJvbXB0OiBzdHJpbmc7XG4gICAgc3lzdGVtX3Byb21wdD86IHN0cmluZyB8IG51bGw7XG4gICAgcmVxdWVzdGVkX21vZGVsX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIGVmZm9ydD86IHN0cmluZyB8IG51bGw7XG4gICAgcHJvamVjdF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICBoaXN0b3J5PzogdW5rbm93bjtcbiAgICB0b29scz86IFRvb2xEZWZpbml0aW9ucztcbiAgICBpc19pbWFnZV9nZW5lcmF0aW9uPzogYm9vbGVhbjtcbiAgICBqc29uX3NjaGVtYT86IHN0cmluZyB8IG51bGw7XG4gIH0pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG4gICAgd2RiLnViUmVnaXN0ZXIoXCJyZXF1ZXN0X2xvZ3NcIiwge1xuICAgICAgdXNlcl9wcm9tcHQ6IHBhcmFtcy51c2VyX3Byb21wdCxcbiAgICAgIHN5c3RlbV9wcm9tcHQ6IHBhcmFtcy5zeXN0ZW1fcHJvbXB0ID8/IG51bGwsXG4gICAgICAvLyBwcm92aWRlciDsi6Ttlokg7KCE7J2066+A66GcIHNlcnZpbmcgbW9kZWzsnYAg7JWE7KeBIOyVjCDsiJgg7JeG64ukLlxuICAgICAgcmVxdWVzdGVkX21vZGVsX25hbWU6IHBhcmFtcy5yZXF1ZXN0ZWRfbW9kZWxfbmFtZSA/PyBudWxsLFxuICAgICAgbW9kZWxfbmFtZTogbnVsbCxcbiAgICAgIGVmZm9ydDogcGFyYW1zLmVmZm9ydCA/PyBudWxsLFxuICAgICAgcHJvamVjdF9uYW1lOiBwYXJhbXMucHJvamVjdF9uYW1lID8/IG51bGwsXG4gICAgICBzdGF0dXM6IFwicnVubmluZ1wiLFxuICAgICAgcmVzcG9uc2U6IFwiXCIsXG4gICAgICBpbnB1dF90b2tlbnM6IDAsXG4gICAgICBvdXRwdXRfdG9rZW5zOiAwLFxuICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IDAsXG4gICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IDAsXG4gICAgICBkdXJhdGlvbl9tczogMCxcbiAgICAgIHRvb2xfY2FsbF9jb3VudDogMCxcbiAgICAgIC8vIOydtOuvuOyngCB0dXJuIOyLneuzhChSMTMpLiBydW4g6rK966GcKHRvb2xzK2ltYWdlIOyhsO2VqSnrj4QgYXV0byDqsr3roZzsmYAg64+Z7J287ZWY6rKMIOuniO2CuS5cbiAgICAgIGlzX2ltYWdlX2dlbmVyYXRpb246IHBhcmFtcy5pc19pbWFnZV9nZW5lcmF0aW9uID8/IGZhbHNlLFxuICAgICAganNvbl9zY2hlbWE6IHBhcmFtcy5qc29uX3NjaGVtYSA/PyBudWxsLFxuICAgICAgaXNfc3RydWN0dXJlZDogcGFyYW1zLmpzb25fc2NoZW1hICE9PSBudWxsICYmIHBhcmFtcy5qc29uX3NjaGVtYSAhPT0gdW5kZWZpbmVkLFxuICAgICAgLi4uKHBhcmFtcy5oaXN0b3J5ICE9PSB1bmRlZmluZWQgPyB7IGhpc3Rvcnk6IHBhcmFtcy5oaXN0b3J5IGFzIHsgdHlwZTogc3RyaW5nIH1bXSB9IDoge30pLFxuICAgICAgLi4uKHBhcmFtcy50b29scyAhPT0gdW5kZWZpbmVkID8geyB0b29sczogcGFyYW1zLnRvb2xzIH0gOiB7fSksXG4gICAgfSk7XG4gICAgcmV0dXJuIHdkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICBjb25zdCBpZHMgPSBhd2FpdCB0cngudWJVcHNlcnQoXCJyZXF1ZXN0X2xvZ3NcIik7XG4gICAgICByZXR1cm4gaWRzWzBdITtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGFwcGVuZFN0ZXAocmVxdWVzdExvZ0lkOiBudW1iZXIsIHN0ZXA6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHdkYi51YlJlZ2lzdGVyKFwicmVxdWVzdF9sb2dfc3RlcHNcIiwgeyByZXF1ZXN0X2xvZ19pZDogcmVxdWVzdExvZ0lkLCAuLi5zdGVwIH0pO1xuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgY29uc3QgaWRzID0gYXdhaXQgdHJ4LnViVXBzZXJ0KFwicmVxdWVzdF9sb2dfc3RlcHNcIik7XG4gICAgICBpZiAoc3RlcC50eXBlID09PSBcInRvb2xfY2FsbFwiKSB7XG4gICAgICAgIGF3YWl0IHRyeC5mcm9tKFwicmVxdWVzdF9sb2dzXCIpLndoZXJlKFwiaWRcIiwgcmVxdWVzdExvZ0lkKS5pbmNyZW1lbnQoXCJ0b29sX2NhbGxfY291bnRcIiwgMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaWRzWzBdITtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZpbmlzaFJ1bihcbiAgICByZXF1ZXN0TG9nSWQ6IG51bWJlcixcbiAgICBwYXJhbXM6IHtcbiAgICAgIHN0YXR1czogc3RyaW5nO1xuICAgICAgcmVzcG9uc2U/OiBzdHJpbmc7XG4gICAgICB0b2tlbl9uYW1lPzogc3RyaW5nO1xuICAgICAgaW5wdXRfdG9rZW5zPzogbnVtYmVyO1xuICAgICAgb3V0cHV0X3Rva2Vucz86IG51bWJlcjtcbiAgICAgIGNhY2hlX3JlYWRfdG9rZW5zPzogbnVtYmVyO1xuICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zPzogbnVtYmVyO1xuICAgICAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2Vucz86IG51bWJlciB8IG51bGw7XG4gICAgICBkdXJhdGlvbl9tcz86IG51bWJlcjtcbiAgICAgIHJlcXVlc3RlZF9tb2RlbF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAgIG1vZGVsX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgICAgZmFsbGJhY2tfY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgICAgY29zdF91c2Q/OiBudW1iZXIgfCBudWxsO1xuICAgICAgY29zdF9zb3VyY2U/OiBzdHJpbmcgfCBudWxsO1xuICAgICAgaGlzdG9yeT86IHVua25vd247XG4gICAgICBlcnJvcl9tZXNzYWdlPzogc3RyaW5nO1xuICAgICAgdG9vbF9jYWxsX2NvdW50PzogbnVtYmVyO1xuICAgICAgaW1hZ2VfY29zdF91c2Q/OiBudW1iZXIgfCBudWxsO1xuICAgICAgaW1hZ2VfY29zdF9tZXRob2Q/OiBzdHJpbmcgfCBudWxsO1xuICAgICAgcmVzcG9uc2VfanNvbl9vaz86IGJvb2xlYW4gfCBudWxsO1xuICAgIH0sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChwYXJhbXMuc3RhdHVzID09PSBcInN1Y2NlZWRlZFwiICYmICFwYXJhbXMudG9rZW5fbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwidG9rZW5OYW1lIGlzIHJlcXVpcmVkIGZvciBzdWNjZWVkZWQgcnVuc1wiKTtcbiAgICB9XG4gICAgY29uc3QgdXBkYXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgaWQ6IHJlcXVlc3RMb2dJZCwgc3RhdHVzOiBwYXJhbXMuc3RhdHVzIH07XG4gICAgY29uc3QgZmllbGRzID0gW1xuICAgICAgXCJyZXNwb25zZVwiLFxuICAgICAgXCJ0b2tlbl9uYW1lXCIsXG4gICAgICBcImlucHV0X3Rva2Vuc1wiLFxuICAgICAgXCJvdXRwdXRfdG9rZW5zXCIsXG4gICAgICBcImNhY2hlX3JlYWRfdG9rZW5zXCIsXG4gICAgICBcImNhY2hlX2NyZWF0aW9uX3Rva2Vuc1wiLFxuICAgICAgXCJjYWNoZV9jcmVhdGlvbl81bV90b2tlbnNcIixcbiAgICAgIFwiY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zXCIsXG4gICAgICBcImR1cmF0aW9uX21zXCIsXG4gICAgICBcInJlcXVlc3RlZF9tb2RlbF9uYW1lXCIsXG4gICAgICBcIm1vZGVsX25hbWVcIixcbiAgICAgIFwiZmFsbGJhY2tfY291bnRcIixcbiAgICAgIFwiY29zdF91c2RcIixcbiAgICAgIFwiY29zdF9zb3VyY2VcIixcbiAgICAgIFwiZXJyb3JfbWVzc2FnZVwiLFxuICAgICAgXCJ0b29sX2NhbGxfY291bnRcIixcbiAgICAgIFwiaW1hZ2VfY29zdF91c2RcIixcbiAgICAgIFwiaW1hZ2VfY29zdF9tZXRob2RcIixcbiAgICAgIFwicmVzcG9uc2VfanNvbl9va1wiLFxuICAgIF0gYXMgY29uc3Q7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgZmllbGRzKSB7XG4gICAgICBpZiAocGFyYW1zW2tleV0gIT09IHVuZGVmaW5lZCkgdXBkYXRlW2tleV0gPSBwYXJhbXNba2V5XTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5oaXN0b3J5ICE9PSB1bmRlZmluZWQpIHVwZGF0ZS5oaXN0b3J5ID0gcGFyYW1zLmhpc3Rvcnk7XG4gICAgdXBkYXRlLnR0ZnRfbXMgPSAoYXdhaXQgdGhpcy5maXJzdEdlbmVyYXRlU3RlcFR0ZnQocmVxdWVzdExvZ0lkKSkgPz8gMDtcblxuICAgIC8vIOyEnOuyhCBydW4g6rK966Gc64qUIHN0ZXAg7JeQ7IScIO2Zleygle2VnCBleGFjdCBjb3N0IOulvCDrhJjquLTri6QuIOyZuOu2gC9sZWdhY3kgY2FsbGVyIOqwgCDruYTsmqnsnYRcbiAgICAvLyDsg53rnrXtlZwg6rK97Jqw7JeQ66eMIOyggOyepeuQnCDrqqjrjbgrdXNhZ2Ug66GcIOqzhOyCsO2VnOuLpC5cbiAgICBpZiAoXG4gICAgICBwYXJhbXMuY29zdF91c2QgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgcGFyYW1zLmlucHV0X3Rva2VucyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBwYXJhbXMub3V0cHV0X3Rva2VucyAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICBjb25zdCByb3cgPSBhd2FpdCB0aGlzLmdldFB1cmkoXCJyXCIpXG4gICAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dzXCIpXG4gICAgICAgIC5zZWxlY3QoeyBtb2RlbF9uYW1lOiBcIm1vZGVsX25hbWVcIiB9KVxuICAgICAgICAud2hlcmUoXCJpZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAgIC5maXJzdCgpO1xuICAgICAgY29uc3QgZWZmZWN0aXZlTW9kZWxOYW1lID0gcGFyYW1zLm1vZGVsX25hbWUgPz8gcm93Py5tb2RlbF9uYW1lO1xuICAgICAgaWYgKGVmZmVjdGl2ZU1vZGVsTmFtZSkge1xuICAgICAgICBjb25zdCBtb2RlbCA9IGNhbm9uaWNhbE1vZGVsTmFtZShlZmZlY3RpdmVNb2RlbE5hbWUpO1xuICAgICAgICBjb25zdCB1c2FnZSA9IG5vcm1hbGl6ZWRVc2FnZUZvckNvc3Qoe1xuICAgICAgICAgIHRva2VuX25hbWU6IHBhcmFtcy50b2tlbl9uYW1lLFxuICAgICAgICAgIG1vZGVsX25hbWU6IGVmZmVjdGl2ZU1vZGVsTmFtZSxcbiAgICAgICAgICBpbnB1dF90b2tlbnM6IHBhcmFtcy5pbnB1dF90b2tlbnMsXG4gICAgICAgICAgb3V0cHV0X3Rva2VuczogcGFyYW1zLm91dHB1dF90b2tlbnMsXG4gICAgICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IHBhcmFtcy5jYWNoZV9yZWFkX3Rva2VucyA/PyAwLFxuICAgICAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogcGFyYW1zLmNhY2hlX2NyZWF0aW9uX3Rva2VucyA/PyAwLFxuICAgICAgICAgIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2VuczogcGFyYW1zLmNhY2hlX2NyZWF0aW9uXzVtX3Rva2VucyxcbiAgICAgICAgICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IHBhcmFtcy5jYWNoZV9jcmVhdGlvbl8xaF90b2tlbnMsXG4gICAgICAgIH0pO1xuICAgICAgICB1cGRhdGUuY29zdF91c2QgPSBNYXRoLnJvdW5kKFxuICAgICAgICAgIGNhbGN1bGF0ZUNvc3RVc2QobW9kZWwsIHtcbiAgICAgICAgICAgIGlucHV0VG9rZW5zOiB1c2FnZS5pbnB1dFRva2VucyxcbiAgICAgICAgICAgIG91dHB1dFRva2VuczogdXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVkSW5wdXRUb2tlbnM6IHVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiB1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMsXG4gICAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bTogdXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zNW0sXG4gICAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaDogdXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWgsXG4gICAgICAgICAgfSkgKiAxXzAwMF8wMDAsXG4gICAgICAgICk7XG4gICAgICAgIHVwZGF0ZS5jb3N0X3NvdXJjZSA9IFwicHJpY2luZ190YWJsZVwiO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG4gICAgd2RiLnViUmVnaXN0ZXIoXCJyZXF1ZXN0X2xvZ3NcIiwgdXBkYXRlKTtcbiAgICBhd2FpdCB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgYXdhaXQgdHJ4LnViVXBzZXJ0KFwicmVxdWVzdF9sb2dzXCIpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZmlyc3RHZW5lcmF0ZVN0ZXBUdGZ0KHJlcXVlc3RMb2dJZDogbnVtYmVyKTogUHJvbWlzZTxudW1iZXIgfCBudWxsPiB7XG4gICAgY29uc3Qgcm93ID0gYXdhaXQgdGhpcy5nZXRQdXJpKFwiclwiKVxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKVxuICAgICAgLnNlbGVjdCh7IHR0ZnRfbXM6IFwidHRmdF9tc1wiIH0pXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19pZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAud2hlcmUoXCJ0eXBlXCIsIFwiZ2VuZXJhdGVcIilcbiAgICAgIC53aGVyZShcInR0ZnRfbXNcIiwgXCIhPVwiLCBudWxsKVxuICAgICAgLm9yZGVyQnkoXCJzdGVwX2luZGV4XCIsIFwiYXNjXCIpXG4gICAgICAub3JkZXJCeShcImlkXCIsIFwiYXNjXCIpXG4gICAgICAuZmlyc3QoKTtcbiAgICByZXR1cm4gcm93Py50dGZ0X21zID09PSBudWxsIHx8IHJvdz8udHRmdF9tcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IE51bWJlcihyb3cudHRmdF9tcyk7XG4gIH1cblxuICBhc3luYyBhZ2dyZWdhdGVTdGVwVXNhZ2UocmVxdWVzdExvZ0lkOiBudW1iZXIpOiBQcm9taXNlPFJlcXVlc3RMb2dTdGVwQWdncmVnYXRlPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHRoaXMuZ2V0UHVyaShcInJcIilcbiAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dfc3RlcHNcIilcbiAgICAgIC5zZWxlY3QoU1RFUF9BR0dSRUdBVEVfU0VMRUNUKVxuICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dfaWRcIiwgcmVxdWVzdExvZ0lkKVxuICAgICAgLndoZXJlKFwidHlwZVwiLCBcImdlbmVyYXRlXCIpO1xuICAgIHJldHVybiBhZ2dyZWdhdGVHZW5lcmF0ZVN0ZXBSb3dzKHJvd3MgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBzdGFsZSBjYW5kaWRhdGVzLCB0aGVuIGV4cGlyZXMgZWFjaCBydW4gaW4gaXRzIG93biBzaG9ydCB0cmFuc2FjdGlvbi5cbiAgICogVGhlIGNhbmRpZGF0ZSBxdWVyeSBpcyBvbmx5IGEgaGludDsgdGhlIHRyYW5zYWN0aW9uYWwgb3BlcmF0aW9uIHJlY2hlY2tzIGl0XG4gICAqIGFmdGVyIGFjcXVpcmluZyB0aGUgYWR2aXNvcnkgbG9jayBzaGFyZWQgd2l0aCB0b29sIGZvbGxvdy11cHMuXG4gICAqL1xuICBhc3luYyBleHBpcmVTdGFsZVRvb2xXYWl0aW5nUnVucyhcbiAgICB0aHJlc2hvbGRNczogbnVtYmVyLFxuICAgIGVycm9yTWVzc2FnZTogc3RyaW5nLFxuICAgIGxpbWl0OiBudW1iZXIgPSAxMCxcbiAgKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIGNvbnN0IHRocmVzaG9sZCA9IG5ldyBEYXRlKERhdGUubm93KCkgLSB0aHJlc2hvbGRNcyk7XG4gICAgY29uc3QgY2FuZGlkYXRlSWRzID0gYXdhaXQgdGhpcy5maW5kU3RhbGVUb29sV2FpdGluZ1J1bkNhbmRpZGF0ZXModGhyZXNob2xkLCBsaW1pdCk7XG4gICAgY29uc3QgZXhwaXJlZElkczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHJlcXVlc3RMb2dJZCBvZiBjYW5kaWRhdGVJZHMpIHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLnRyeUV4cGlyZVN0YWxlVG9vbFdhaXRpbmdSdW4ocmVxdWVzdExvZ0lkLCB0aHJlc2hvbGQsIGVycm9yTWVzc2FnZSkpIHtcbiAgICAgICAgZXhwaXJlZElkcy5wdXNoKHJlcXVlc3RMb2dJZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBleHBpcmVkSWRzO1xuICB9XG5cbiAgYXN5bmMgZmluZFN0YWxlVG9vbFdhaXRpbmdSdW5DYW5kaWRhdGVzKHRocmVzaG9sZDogRGF0ZSwgbGltaXQ6IG51bWJlcik6IFByb21pc2U8bnVtYmVyW10+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5nZXRQdXJpKFwid1wiKVxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ3NcIilcbiAgICAgIC5qb2luKFwicmVxdWVzdF9sb2dfc3RlcHNcIiwgXCJyZXF1ZXN0X2xvZ3MuaWRcIiwgXCJyZXF1ZXN0X2xvZ19zdGVwcy5yZXF1ZXN0X2xvZ19pZFwiKVxuICAgICAgLmRpc3RpbmN0KFwicmVxdWVzdF9sb2dzLmlkXCIpXG4gICAgICAuc2VsZWN0KHsgaWQ6IFwicmVxdWVzdF9sb2dzLmlkXCIgfSlcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9ncy5zdGF0dXNcIiwgXCJydW5uaW5nXCIpXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19zdGVwcy50eXBlXCIsIFwidG9vbF9jYWxsXCIpXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19zdGVwcy5jcmVhdGVkX2F0XCIsIFwiPFwiLCB0aHJlc2hvbGQpXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19zdGVwcy50b29sX3Jlc3VsdFwiLCBudWxsKVxuICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dfc3RlcHMuZXJyb3JcIiwgbnVsbClcbiAgICAgIC5saW1pdChsaW1pdCk7XG4gICAgcmV0dXJuIHJvd3MubWFwKCh7IGlkIH0pID0+IGlkKTtcbiAgfVxuXG4gIEB0cmFuc2FjdGlvbmFsKHsgZGJQcmVzZXQ6IFwid1wiIH0pXG4gIGFzeW5jIHRyeUV4cGlyZVN0YWxlVG9vbFdhaXRpbmdSdW4oXG4gICAgcmVxdWVzdExvZ0lkOiBudW1iZXIsXG4gICAgdGhyZXNob2xkOiBEYXRlLFxuICAgIGVycm9yTWVzc2FnZTogc3RyaW5nLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIGNvbnN0IGxvY2tSZXN1bHQgPSAoYXdhaXQgd2RiLmtuZXgucmF3KFwiU0VMRUNUIHBnX3RyeV9hZHZpc29yeV94YWN0X2xvY2soPywgPykgQVMgYWNxdWlyZWRcIiwgW1xuICAgICAgUkVRVUVTVF9MT0dfUlVOX0xPQ0tfQ0xBU1NfSUQsXG4gICAgICByZXF1ZXN0TG9nSWQsXG4gICAgXSkpIGFzIHsgcm93cz86IEFycmF5PHsgYWNxdWlyZWQ/OiBib29sZWFuIH0+IH07XG4gICAgaWYgKGxvY2tSZXN1bHQucm93cz8uWzBdPy5hY3F1aXJlZCAhPT0gdHJ1ZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gVGhlIGZvbGxvdy11cCBwYXRoIHVzZXMgdGhlIHNhbWUgd3JpdGVyIHRyYW5zYWN0aW9uIGxvY2suIFJlY2hlY2sgYWZ0ZXJcbiAgICAvLyBsb2NraW5nIHNvIGEgcmVzdWx0IGNvbW1pdHRlZCBkdXJpbmcgY2FuZGlkYXRlIGRpc2NvdmVyeSBtYWtlcyB0aGlzIGEgbm8tb3AuXG4gICAgY29uc3QgdW5yZXNvbHZlZCA9IGF3YWl0IHdkYlxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKVxuICAgICAgLnNlbGVjdCh7IGlkOiBcImlkXCIgfSlcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9nX2lkXCIsIHJlcXVlc3RMb2dJZClcbiAgICAgIC53aGVyZShcInR5cGVcIiwgXCJ0b29sX2NhbGxcIilcbiAgICAgIC53aGVyZShcImNyZWF0ZWRfYXRcIiwgXCI8XCIsIHRocmVzaG9sZClcbiAgICAgIC53aGVyZShcInRvb2xfcmVzdWx0XCIsIG51bGwpXG4gICAgICAud2hlcmUoXCJlcnJvclwiLCBudWxsKVxuICAgICAgLmZpcnN0KCk7XG4gICAgaWYgKCF1bnJlc29sdmVkKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBzdGVwUm93cyA9IGF3YWl0IHdkYlxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKVxuICAgICAgLnNlbGVjdChTVEVQX0FHR1JFR0FURV9TRUxFQ1QpXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19pZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAud2hlcmUoXCJ0eXBlXCIsIFwiZ2VuZXJhdGVcIik7XG4gICAgY29uc3QgYWdncmVnYXRlID0gYWdncmVnYXRlR2VuZXJhdGVTdGVwUm93cyhzdGVwUm93cyBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pO1xuICAgIGNvbnN0IGZpcnN0VHRmdCA9IGF3YWl0IHdkYlxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKVxuICAgICAgLnNlbGVjdCh7IHR0ZnRfbXM6IFwidHRmdF9tc1wiIH0pXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19pZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAud2hlcmUoXCJ0eXBlXCIsIFwiZ2VuZXJhdGVcIilcbiAgICAgIC53aGVyZShcInR0ZnRfbXNcIiwgXCIhPVwiLCBudWxsKVxuICAgICAgLm9yZGVyQnkoXCJzdGVwX2luZGV4XCIsIFwiYXNjXCIpXG4gICAgICAub3JkZXJCeShcImlkXCIsIFwiYXNjXCIpXG4gICAgICAuZmlyc3QoKTtcblxuICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCB3ZGJcbiAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dzXCIpXG4gICAgICAud2hlcmUoXCJpZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAud2hlcmUoXCJzdGF0dXNcIiwgXCJydW5uaW5nXCIpXG4gICAgICAudXBkYXRlKHtcbiAgICAgICAgc3RhdHVzOiBcImVycm9yXCIsXG4gICAgICAgIGVycm9yX21lc3NhZ2U6IGVycm9yTWVzc2FnZSxcbiAgICAgICAgaW5wdXRfdG9rZW5zOiBhZ2dyZWdhdGUuaW5wdXRfdG9rZW5zLFxuICAgICAgICBvdXRwdXRfdG9rZW5zOiBhZ2dyZWdhdGUub3V0cHV0X3Rva2VucyxcbiAgICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IGFnZ3JlZ2F0ZS5jYWNoZV9yZWFkX3Rva2VucyxcbiAgICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBhZ2dyZWdhdGUuY2FjaGVfY3JlYXRpb25fdG9rZW5zLFxuICAgICAgICAuLi4oYWdncmVnYXRlLmNhY2hlX2NyZWF0aW9uXzVtX3Rva2VucyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB7IGNhY2hlX2NyZWF0aW9uXzVtX3Rva2VuczogYWdncmVnYXRlLmNhY2hlX2NyZWF0aW9uXzVtX3Rva2VucyB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIC4uLihhZ2dyZWdhdGUuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHsgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zOiBhZ2dyZWdhdGUuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgZHVyYXRpb25fbXM6IGFnZ3JlZ2F0ZS5kdXJhdGlvbl9tcyxcbiAgICAgICAgZmFsbGJhY2tfY291bnQ6IGFnZ3JlZ2F0ZS5mYWxsYmFja19jb3VudCxcbiAgICAgICAgY29zdF91c2Q6IGFnZ3JlZ2F0ZS5jb3N0X3VzZCxcbiAgICAgICAgLi4uKGFnZ3JlZ2F0ZS5jb3N0X3NvdXJjZSAhPT0gdW5kZWZpbmVkID8geyBjb3N0X3NvdXJjZTogYWdncmVnYXRlLmNvc3Rfc291cmNlIH0gOiB7fSksXG4gICAgICAgIHR0ZnRfbXM6XG4gICAgICAgICAgZmlyc3RUdGZ0Py50dGZ0X21zID09PSBudWxsIHx8IGZpcnN0VHRmdD8udHRmdF9tcyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IDBcbiAgICAgICAgICAgIDogTnVtYmVyKGZpcnN0VHRmdC50dGZ0X21zKSxcbiAgICAgIH0pO1xuICAgIHJldHVybiB1cGRhdGVkID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGEgbmF0aXZlIHFncmlkIHRvb2wgZm9sbG93LXVwIGFuZCBjb21wdXRlcyBpdHMgbmV4dCBzdGVwIGluZGV4IHdoaWxlXG4gICAqIGhvbGRpbmcgdGhlIHBlci1ydW4gYWR2aXNvcnkgbG9jayBzaGFyZWQgd2l0aCBzdGFsZSBjbGVhbnVwLlxuICAgKi9cbiAgQHRyYW5zYWN0aW9uYWwoeyBkYlByZXNldDogXCJ3XCIgfSlcbiAgYXN5bmMgY29udGludWVUb29sUnVuKFxuICAgIHJlcXVlc3RMb2dJZDogbnVtYmVyLFxuICAgIHRvb2xSZXN1bHRzOiBUb29sUmVzdWx0Q29udGludWF0aW9uW10sXG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICBhd2FpdCB3ZGIua25leC5yYXcoXCJTRUxFQ1QgcGdfYWR2aXNvcnlfeGFjdF9sb2NrKD8sID8pXCIsIFtcbiAgICAgIFJFUVVFU1RfTE9HX1JVTl9MT0NLX0NMQVNTX0lELFxuICAgICAgcmVxdWVzdExvZ0lkLFxuICAgIF0pO1xuXG4gICAgY29uc3QgcnVuID0gYXdhaXQgd2RiXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nc1wiKVxuICAgICAgLnNlbGVjdCh7IHN0YXR1czogXCJzdGF0dXNcIiB9KVxuICAgICAgLndoZXJlKFwiaWRcIiwgcmVxdWVzdExvZ0lkKVxuICAgICAgLmZpcnN0KCk7XG4gICAgaWYgKCFydW4pIHRocm93IG5ldyBFcnJvcihgcmVxdWVzdCBsb2cgcnVuICR7cmVxdWVzdExvZ0lkfSBub3QgZm91bmRgKTtcbiAgICBpZiAocnVuLnN0YXR1cyAhPT0gXCJydW5uaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgcmVxdWVzdCBsb2cgcnVuICR7cmVxdWVzdExvZ0lkfSBpcyBhbHJlYWR5ICR7cnVuLnN0YXR1c31gKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiB0b29sUmVzdWx0cykge1xuICAgICAgYXdhaXQgd2RiXG4gICAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dfc3RlcHNcIilcbiAgICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dfaWRcIiwgcmVxdWVzdExvZ0lkKVxuICAgICAgICAud2hlcmUoXCJ0b29sX2NhbGxfaWRcIiwgcmVzdWx0LnRvb2xDYWxsSWQpXG4gICAgICAgIC53aGVyZShcInR5cGVcIiwgXCJ0b29sX2NhbGxcIilcbiAgICAgICAgLnVwZGF0ZShyZXN1bHQuaXNFcnJvciA/IHsgZXJyb3I6IHJlc3VsdC5vdXRwdXQgfSA6IHsgdG9vbF9yZXN1bHQ6IHJlc3VsdC5vdXRwdXQgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgcm93ID0gYXdhaXQgd2RiXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nX3N0ZXBzXCIpXG4gICAgICAuc2VsZWN0KHsgbWF4X3N0ZXA6IFB1cmkubWF4KFwic3RlcF9pbmRleFwiKSB9KVxuICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dfaWRcIiwgcmVxdWVzdExvZ0lkKVxuICAgICAgLmZpcnN0KCk7XG4gICAgcmV0dXJuIChyb3c/Lm1heF9zdGVwID8/IC0xKSArIDE7XG4gIH1cblxuICAvKipcbiAgICog7ZmU66m0IO2RnOyLnOyaqSDstJ0g67mE7JqpLiDrqqnroZ3qs7wg6rCZ7J2AIO2VhO2EsOulvCDsoIHsmqntlZzri6QuXG4gICAqXG4gICAqIOyghOyytOulvCDsobDqsbQg7JeG7J20IFNVTSDtlZwg65KkLCBgY29zdF9zb3VyY2VgIOqwgCDsl4bripQgbGVnYWN5IHJvdyDsnZgg7LCo7JWh66eMIOuztOygle2VnOuLpC5cbiAgICog7KGw6rG0IOyXhuuKlCBTVU0g7J207Ja07JW8IGAocHJvamVjdF9uYW1lLCBjb3N0X3VzZClgIOy7pOuyhOungSDsnbjrjbHsiqTqsIAgSW5kZXggT25seSBTY2FuIOydhFxuICAgKiDtg4Tri6Qg4oCUIGBjb3N0X3NvdXJjZSBJUyBOT1QgTlVMTGAg7J2EIOqxuOuptCDqt7gg7Lus65+87J20IOyduOuNseyKpOyXkCDsl4bslrQgaGVhcCDsnYQg64uk7IucIOu0kOyVvFxuICAgKiDtlZjrr4DroZwg7ZSM656Y64SI6rCAIOyduOuNseyKpOulvCDrsoTrpqzqs6Agc2VxIHNjYW4g7Jy866GcIOuPjOyVhOqwhOuLpCjsi6TsuKEgMjMwbXMg4oaSIDgxNG1zKS5cbiAgICpcbiAgICogbGVnYWN5IOuztOygleydhCDrgqjqsqjrkZQg7J207JygOiDrsLHtlYTroZwg6riw7KG0IGxlZ2FjeSDripQgMCDsnbQg65CY7JeI7KeA66eMLCDsmbjrtoAg66Gc6rGw6rCAXG4gICAqIGBBcHBlbmRTdGVwSW5wdXRgL2BGaW5pc2hSdW5JbnB1dGAg7Jy866GcIGNvc3RTb3VyY2Ug7JeG7J20IOuEo+ycvOuptCDri6Tsi5wg7IOd6ri4IOyImCDsnojri6QuXG4gICAqIOq3uOufsCByb3cg64qUIOyggOyepeqwkiDrjIDsi6Ag7ZiE7J6sIOqwgOqyqe2RnCDsnqzqs4TsgrDqsJLsnbQg66ee7Jy866+A66GcIOywqOyVoeydhCDrjZTtlZzri6QuXG4gICAqXG4gICAqIO2VhO2EsCDsobDqsbTsnYQg7Jes6riw7IScIOuLpOyLnCDqtaztmITtlZjsp4Ag7JWK6rOgIGBhcHBseUxpc3RGaWx0ZXJzYCDrpbwg6rO17Jyg7ZWY64qUIOqyg+ydtCDtlbXsi6zsnbTri6Qg4oCUXG4gICAqIOuRkCDsv7zrpqzqsIAg6rCB7J6QIO2VhO2EsOulvCDqsIDsp4DrqbQg7ZmU66m07JeQ7IScIO2VhO2EsOulvCDqsbjsl4jsnYQg65WMIO2WiSDsiJjsmYAg67mE7Jqp7J20IOyhsOyaqe2eiCDslrTquIvrgpzri6QuXG4gICAqL1xuICBhc3luYyB0b3RhbENvc3QocmF3UGFyYW1zOiBSZXF1ZXN0TG9nTGlzdFBhcmFtcyA9IHsgbnVtOiAwLCBwYWdlOiAxIH0pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIG51bTogMCxcbiAgICAgIHBhZ2U6IDEsXG4gICAgICBzZWFyY2g6IFwiaWRcIiBhcyBjb25zdCxcbiAgICAgIC4uLnJhd1BhcmFtcyxcbiAgICB9IHNhdGlzZmllcyBSZXF1ZXN0TG9nTGlzdFBhcmFtcztcblxuICAgIGNvbnN0IHsgcWI6IHRvdGFsUWIgfSA9IHRoaXMuZ2V0U3Vic2V0UXVlcmllcyhcIkNcIik7XG4gICAgdGhpcy5hcHBseUxpc3RGaWx0ZXJzKHRvdGFsUWIsIHBhcmFtcyk7XG4gICAgLy8gc3Vic2V0IHFiIOuKlCDsu6zrn7wg66qp66Gd7J20IOydtOuvuCBTRUxFQ1Qg7JeQIOuwle2YgCDsnojslrQg7KeR6rOE66W8IOyWueycvOuptCBHUk9VUCBCWSDsl5Drn6zqsIAg64Kc64ukLlxuICAgIC8vIGV4ZWN1dGVDb3VudFF1ZXJ5IOyZgCDqsJnsnYAg67Cp7Iud7Jy866GcIHNlbGVjdCDrpbwg67mE7Jqw6rOgIOynkeqzhOunjCDrgqjquLTri6QuXG4gICAgY29uc3Qgc3RvcmVkID0gYXdhaXQgdG90YWxRYlxuICAgICAgLmNsZWFyKFwic2VsZWN0XCIpXG4gICAgICAvLyDsnYzsiJgg7KCA7J6l6rCSKOqzvOqxsCDrsoTqt7gp7J2AIDAg7Jy866GcIOuIjOufrOyEnCDrjZTtlZzri6Qg4oCUIEpTIOyqvSBNYXRoLm1heCDsmYAg6rCZ7J2AIOq3nOy5mS5cbiAgICAgIC5zZWxlY3Qoe1xuICAgICAgICB0b3RhbDogUHVyaS5yYXdOdW1iZXIoXCJDT0FMRVNDRShTVU0oR1JFQVRFU1QocmVxdWVzdF9sb2dzLmNvc3RfdXNkLCAwKSksIDApXCIpLFxuICAgICAgfSlcbiAgICAgIC5maXJzdCgpO1xuXG4gICAgY29uc3QgeyBxYjogbGVnYWN5UWIgfSA9IHRoaXMuZ2V0U3Vic2V0UXVlcmllcyhcIkNcIik7XG4gICAgdGhpcy5hcHBseUxpc3RGaWx0ZXJzKGxlZ2FjeVFiLCBwYXJhbXMpO1xuICAgIGNvbnN0IGxlZ2FjeVJvd3MgPSBhd2FpdCBsZWdhY3lRYlxuICAgICAgLndoZXJlUmF3KFwicmVxdWVzdF9sb2dzLmNvc3Rfc291cmNlIElTIE5VTEwgT1IgcmVxdWVzdF9sb2dzLmNvc3RfdXNkIElTIE5VTExcIilcbiAgICAgIC5jbGVhcihcInNlbGVjdFwiKVxuICAgICAgLnNlbGVjdCh7XG4gICAgICAgIHRva2VuX25hbWU6IFwicmVxdWVzdF9sb2dzLnRva2VuX25hbWVcIixcbiAgICAgICAgbW9kZWxfbmFtZTogXCJyZXF1ZXN0X2xvZ3MubW9kZWxfbmFtZVwiLFxuICAgICAgICBpbnB1dF90b2tlbnM6IFwicmVxdWVzdF9sb2dzLmlucHV0X3Rva2Vuc1wiLFxuICAgICAgICBvdXRwdXRfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5vdXRwdXRfdG9rZW5zXCIsXG4gICAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5jYWNoZV9yZWFkX3Rva2Vuc1wiLFxuICAgICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IFwicmVxdWVzdF9sb2dzLmNhY2hlX2NyZWF0aW9uX3Rva2Vuc1wiLFxuICAgICAgICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM6IFwicmVxdWVzdF9sb2dzLmNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vuc1wiLFxuICAgICAgICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IFwicmVxdWVzdF9sb2dzLmNhY2hlX2NyZWF0aW9uXzFoX3Rva2Vuc1wiLFxuICAgICAgICBjb3N0X3VzZDogXCJyZXF1ZXN0X2xvZ3MuY29zdF91c2RcIixcbiAgICAgIH0pO1xuXG4gICAgY29uc3Qgc3RvcmVkVG90YWwgPSBOdW1iZXIoc3RvcmVkPy50b3RhbCA/PyAwKSAvIE1JQ1JPX1VTRDtcblxuICAgIC8vIGxlZ2FjeSByb3cg64qUIOychCBTVU0g7JeQIOyggOyepeqwkuycvOuhnCDsnbTrr7gg7Y+s7ZWo65CY7Ja0IOyeiOuLpC4g7J6s6rOE7IKw6rCS6rO87J2YIOywqOyVoeunjCDrjZTtlZzri6QuXG4gICAgcmV0dXJuIGxlZ2FjeVJvd3MucmVkdWNlKChzdW0sIHJvdykgPT4ge1xuICAgICAgY29uc3QgYWxyZWFkeVN1bW1lZCA9IE1hdGgubWF4KHJvdy5jb3N0X3VzZCA/PyAwLCAwKSAvIE1JQ1JPX1VTRDtcbiAgICAgIGNvbnN0IHVzYWdlID0gbm9ybWFsaXplZFVzYWdlRm9yQ29zdChyb3cpO1xuICAgICAgaWYgKCF1c2FnZS5tb2RlbCkgcmV0dXJuIHN1bTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHN1bSArXG4gICAgICAgIGNhbGN1bGF0ZUNvc3RVc2QodXNhZ2UubW9kZWwsIHtcbiAgICAgICAgICBpbnB1dFRva2VuczogdXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICAgICAgb3V0cHV0VG9rZW5zOiB1c2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgICAgICAgY2FjaGVkSW5wdXRUb2tlbnM6IHVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogdXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zLFxuICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtOiB1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bSxcbiAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaDogdXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWgsXG4gICAgICAgIH0pIC1cbiAgICAgICAgYWxyZWFkeVN1bW1lZFxuICAgICAgKTtcbiAgICB9LCBzdG9yZWRUb3RhbCk7XG4gIH1cblxuICBhc3luYyBkaXN0aW5jdFByb2plY3ROYW1lcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHRoaXMuZ2V0UHVyaShcInJcIilcbiAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dzXCIpXG4gICAgICAuZGlzdGluY3QoXCJwcm9qZWN0X25hbWVcIilcbiAgICAgIC53aGVyZShcInByb2plY3RfbmFtZVwiLCBcIiE9XCIsIG51bGwpXG4gICAgICAub3JkZXJCeShcInByb2plY3RfbmFtZVwiLCBcImFzY1wiKVxuICAgICAgLnNlbGVjdCh7XG4gICAgICAgIHByb2plY3RfbmFtZTogXCJwcm9qZWN0X25hbWVcIixcbiAgICAgIH0pO1xuICAgIHJldHVybiByb3dzLm1hcCgocikgPT4gci5wcm9qZWN0X25hbWUhKTtcbiAgfVxuXG4gIGFzeW5jIGRpc3RpbmN0TW9kZWxOYW1lcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHRoaXMuZ2V0UHVyaShcInJcIilcbiAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dzXCIpXG4gICAgICAuZGlzdGluY3QoXCJtb2RlbF9uYW1lXCIpXG4gICAgICAud2hlcmUoXCJtb2RlbF9uYW1lXCIsIFwiIT1cIiwgbnVsbClcbiAgICAgIC5vcmRlckJ5KFwibW9kZWxfbmFtZVwiLCBcImFzY1wiKVxuICAgICAgLnNlbGVjdCh7XG4gICAgICAgIG1vZGVsX25hbWU6IFwibW9kZWxfbmFtZVwiLFxuICAgICAgfSk7XG4gICAgcmV0dXJuIHJvd3MubWFwKChyKSA9PiByLm1vZGVsX25hbWUhKTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBkZWwoaWRzOiBudW1iZXJbXSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcblxuICAgIC8vIHRyYW5zYWN0aW9uXG4gICAgYXdhaXQgd2RiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgIGF3YWl0IHRyeFxuICAgICAgICAudGFibGUoXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKVxuICAgICAgICAud2hlcmVJbihcInJlcXVlc3RfbG9nX3N0ZXBzLnJlcXVlc3RfbG9nX2lkXCIsIGlkcylcbiAgICAgICAgLmRlbGV0ZSgpO1xuICAgICAgcmV0dXJuIHRyeC50YWJsZShcInJlcXVlc3RfbG9nc1wiKS53aGVyZUluKFwicmVxdWVzdF9sb2dzLmlkXCIsIGlkcykuZGVsZXRlKCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaWRzLmxlbmd0aDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgUmVxdWVzdExvZ01vZGVsID0gbmV3IFJlcXVlc3RMb2dNb2RlbENsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUE2QkEsTUFBYSxZQUFZO0FBQ3pCLE1BQU0sZ0NBQWdDO0FBQ3RDLE1BQU0sd0JBQXdCO0FBRTlCLFNBQVMsa0JBQWtCLE9BQXdDO0NBQ2pFLElBQUksQ0FBQyxPQUFPLE9BQU87Q0FDbkIsSUFBSSxPQUFPLFVBQVUsVUFBVSxPQUFPO0NBQ3RDLElBQUk7RUFDRixPQUFPLEtBQUssTUFBTSxLQUFLO0NBQ3pCLFFBQVE7RUFDTixPQUFPO0NBQ1Q7QUFDRjtBQXFCQSxNQUFNLHdCQUF3QjtDQUM1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
580
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1sb2cubW9kZWwuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3JlcXVlc3QtbG9nL3JlcXVlc3QtbG9nLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpzb25TY2hlbWFUb1pvZCB9IGZyb20gXCJqc29uLXNjaGVtYS10by16b2RcIjtcbmltcG9ydCB7XG4gIGFwaSxcbiAgYXNBcnJheSxcbiAgQmFkUmVxdWVzdEV4Y2VwdGlvbixcbiAgQmFzZU1vZGVsQ2xhc3MsXG4gIHR5cGUgTGlzdFJlc3VsdCxcbiAgTm90Rm91bmRFeGNlcHRpb24sXG4gIFB1cmksXG4gIHRyYW5zYWN0aW9uYWwsXG59IGZyb20gXCJzb25hbXVcIjtcblxuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IGNhbGN1bGF0ZUNvc3RVc2QgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9tb2RlbC1jb3N0XCI7XG5pbXBvcnQgeyB0eXBlIFJlcXVlc3RMb2dTdWJzZXRLZXksIHR5cGUgUmVxdWVzdExvZ1N1YnNldE1hcHBpbmcgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgcmVxdWVzdExvZ0xvYWRlclF1ZXJpZXMsIHJlcXVlc3RMb2dTdWJzZXRRdWVyaWVzIH0gZnJvbSBcIi4uL3NvbmFtdS5nZW5lcmF0ZWQuc3NvXCI7XG5pbXBvcnQge1xuICByZW5kZXJKc29uU2NoZW1hWm9kU2hhcGVUZXh0LFxuICByZW5kZXJQYXJzZWRKc29uU2NoZW1hVHlwZVRleHQsXG59IGZyb20gXCIuL2pzb24tc2NoZW1hLXR5cGUtdGV4dFwiO1xuaW1wb3J0IHtcbiAgdHlwZSBSZXF1ZXN0TG9nTGlzdFBhcmFtcyxcbiAgdHlwZSBSZXF1ZXN0TG9nU2F2ZVBhcmFtcyxcbiAgdHlwZSBUb29sRGVmaW5pdGlvbnMsXG4gIHR5cGUgVG9vbFZpZXcsXG59IGZyb20gXCIuL3JlcXVlc3QtbG9nLnR5cGVzXCI7XG5pbXBvcnQgeyBmb3JtYXRab2RDb2RlIH0gZnJvbSBcIi4vem9kLWNvZGUtZm9ybWF0XCI7XG5cbi8vIGNvc3RfdXNk64qUIOygleyImCBtaWNyby1VU0TroZwg7KCA7J6lLiDsi6TsoJwgVVNEID0gY29zdF91c2QgLyBNSUNST19VU0QuXG5leHBvcnQgY29uc3QgTUlDUk9fVVNEID0gMV8wMDBfMDAwO1xuY29uc3QgUkVRVUVTVF9MT0dfUlVOX0xPQ0tfQ0xBU1NfSUQgPSA3MTg7XG5jb25zdCBUT09MX0VOVU1fVkFMVUVfTElNSVQgPSA2O1xuXG5mdW5jdGlvbiBkZWNvZGVTdG9yZWRUb29scyh2YWx1ZTogdW5rbm93bik6IFRvb2xEZWZpbml0aW9ucyB8IG51bGwge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHZhbHVlIGFzIFRvb2xEZWZpbml0aW9ucztcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSkgYXMgVG9vbERlZmluaXRpb25zO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG50eXBlIFRvb2xSZXN1bHRDb250aW51YXRpb24gPSB7XG4gIHRvb2xDYWxsSWQ6IHN0cmluZztcbiAgb3V0cHV0OiBzdHJpbmc7XG4gIGlzRXJyb3I/OiBib29sZWFuO1xufTtcblxudHlwZSBSZXF1ZXN0TG9nU3RlcEFnZ3JlZ2F0ZSA9IHtcbiAgaW5wdXRfdG9rZW5zOiBudW1iZXI7XG4gIG91dHB1dF90b2tlbnM6IG51bWJlcjtcbiAgY2FjaGVfcmVhZF90b2tlbnM6IG51bWJlcjtcbiAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vucz86IG51bWJlcjtcbiAgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zPzogbnVtYmVyO1xuICBkdXJhdGlvbl9tczogbnVtYmVyO1xuICBmYWxsYmFja19jb3VudDogbnVtYmVyO1xuICBjb3N0X3VzZDogbnVtYmVyO1xuICBjb3N0X3NvdXJjZT86IHN0cmluZztcbn07XG5cbmNvbnN0IFNURVBfQUdHUkVHQVRFX1NFTEVDVCA9IHtcbiAgaW5wdXRfdG9rZW5zOiBcImlucHV0X3Rva2Vuc1wiLFxuICBvdXRwdXRfdG9rZW5zOiBcIm91dHB1dF90b2tlbnNcIixcbiAgY2FjaGVfcmVhZF90b2tlbnM6IFwiY2FjaGVfcmVhZF90b2tlbnNcIixcbiAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBcImNhY2hlX2NyZWF0aW9uX3Rva2Vuc1wiLFxuICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM6IFwiY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zXCIsXG4gIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2VuczogXCJjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnNcIixcbiAgZHVyYXRpb25fbXM6IFwiZHVyYXRpb25fbXNcIixcbiAgZmFsbGJhY2tfY291bnQ6IFwiZmFsbGJhY2tfY291bnRcIixcbiAgY29zdF91c2Q6IFwiY29zdF91c2RcIixcbiAgY29zdF9zb3VyY2U6IFwiY29zdF9zb3VyY2VcIixcbn0gYXMgY29uc3Q7XG5cbmZ1bmN0aW9uIGFnZ3JlZ2F0ZUdlbmVyYXRlU3RlcFJvd3Mocm93czogQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KTogUmVxdWVzdExvZ1N0ZXBBZ2dyZWdhdGUge1xuICBjb25zdCBzdW0gPSAoZmllbGQ6IHN0cmluZyk6IG51bWJlciA9PlxuICAgIHJvd3MucmVkdWNlKCh0b3RhbCwgcm93KSA9PiB0b3RhbCArIE51bWJlcihyb3dbZmllbGRdID8/IDApLCAwKTtcbiAgY29uc3Qgb3B0aW9uYWxTdW0gPSAoZmllbGQ6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCA9PlxuICAgIHJvd3Muc29tZSgocm93KSA9PiByb3dbZmllbGRdICE9PSBudWxsICYmIHJvd1tmaWVsZF0gIT09IHVuZGVmaW5lZCkgPyBzdW0oZmllbGQpIDogdW5kZWZpbmVkO1xuICBjb25zdCBjb2xsYXBzZSA9IChmaWVsZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgICBjb25zdCB2YWx1ZXMgPSBbXG4gICAgICAuLi5uZXcgU2V0KFxuICAgICAgICByb3dzXG4gICAgICAgICAgLm1hcCgocm93KSA9PiByb3dbZmllbGRdKVxuICAgICAgICAgIC5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS5sZW5ndGggPiAwKSxcbiAgICAgICksXG4gICAgXTtcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdmFsdWVzLmxlbmd0aCA9PT0gMSA/IHZhbHVlc1swXSA6IFwibWl4ZWRcIjtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBpbnB1dF90b2tlbnM6IHN1bShcImlucHV0X3Rva2Vuc1wiKSxcbiAgICBvdXRwdXRfdG9rZW5zOiBzdW0oXCJvdXRwdXRfdG9rZW5zXCIpLFxuICAgIGNhY2hlX3JlYWRfdG9rZW5zOiBzdW0oXCJjYWNoZV9yZWFkX3Rva2Vuc1wiKSxcbiAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IHN1bShcImNhY2hlX2NyZWF0aW9uX3Rva2Vuc1wiKSxcbiAgICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM6IG9wdGlvbmFsU3VtKFwiY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zXCIpLFxuICAgIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2Vuczogb3B0aW9uYWxTdW0oXCJjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnNcIiksXG4gICAgZHVyYXRpb25fbXM6IHN1bShcImR1cmF0aW9uX21zXCIpLFxuICAgIGZhbGxiYWNrX2NvdW50OiBzdW0oXCJmYWxsYmFja19jb3VudFwiKSxcbiAgICBjb3N0X3VzZDogc3VtKFwiY29zdF91c2RcIiksXG4gICAgY29zdF9zb3VyY2U6IGNvbGxhcHNlKFwiY29zdF9zb3VyY2VcIiksXG4gIH07XG59XG5cbnR5cGUgUmVxdWVzdExvZ1VzYWdlUm93ID0ge1xuICB0b2tlbl9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgbW9kZWxfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gIGlucHV0X3Rva2VuczogbnVtYmVyO1xuICBvdXRwdXRfdG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlX3JlYWRfdG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogbnVtYmVyO1xuICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuICBjb3N0X3VzZD86IG51bWJlciB8IG51bGw7XG4gIGNvc3Rfc291cmNlPzogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmZ1bmN0aW9uIGlzQW50aHJvcGljVXNhZ2VSb3cocm93OiBQaWNrPFJlcXVlc3RMb2dVc2FnZVJvdywgXCJ0b2tlbl9uYW1lXCIgfCBcIm1vZGVsX25hbWVcIj4pOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICByb3cudG9rZW5fbmFtZT8uc3RhcnRzV2l0aChcImFudGhyb3BpYy9cIikgPT09IHRydWUgfHxcbiAgICByb3cubW9kZWxfbmFtZT8uc3RhcnRzV2l0aChcImNsYXVkZS1cIikgPT09IHRydWUgfHxcbiAgICByb3cubW9kZWxfbmFtZT8uc3RhcnRzV2l0aChcImFudGhyb3BpYy9jbGF1ZGUtXCIpID09PSB0cnVlXG4gICk7XG59XG5cbmZ1bmN0aW9uIGNhbm9uaWNhbE1vZGVsTmFtZShtb2RlbE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBtb2RlbE5hbWUuaW5jbHVkZXMoXCIvXCIpID8gbW9kZWxOYW1lLnNwbGl0KFwiL1wiKS5wb3AoKSEgOiBtb2RlbE5hbWU7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZWRVc2FnZUZvckNvc3Qocm93OiBSZXF1ZXN0TG9nVXNhZ2VSb3cpOiB7XG4gIG1vZGVsOiBzdHJpbmcgfCBudWxsO1xuICBpbnB1dFRva2VuczogbnVtYmVyO1xuICBvdXRwdXRUb2tlbnM6IG51bWJlcjtcbiAgY2FjaGVkSW5wdXRUb2tlbnM6IG51bWJlcjtcbiAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtPzogbnVtYmVyO1xuICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaD86IG51bWJlcjtcbn0ge1xuICBjb25zdCBjYWNoZVJlYWQgPSByb3cuY2FjaGVfcmVhZF90b2tlbnM7XG4gIGNvbnN0IGNhY2hlQ3JlYXRpb24gPSByb3cuY2FjaGVfY3JlYXRpb25fdG9rZW5zO1xuICBjb25zdCBzdG9yZWRJbnB1dCA9IHJvdy5pbnB1dF90b2tlbnM7XG4gIGNvbnN0IGxlZ2FjeUFudGhyb3BpY1NwbGl0SW5wdXQgPVxuICAgIGlzQW50aHJvcGljVXNhZ2VSb3cocm93KSAmJiBzdG9yZWRJbnB1dCA8IGNhY2hlUmVhZCArIGNhY2hlQ3JlYXRpb247XG4gIHJldHVybiB7XG4gICAgbW9kZWw6IHJvdy5tb2RlbF9uYW1lID8gY2Fub25pY2FsTW9kZWxOYW1lKHJvdy5tb2RlbF9uYW1lKSA6IG51bGwsXG4gICAgaW5wdXRUb2tlbnM6IGxlZ2FjeUFudGhyb3BpY1NwbGl0SW5wdXQgPyBzdG9yZWRJbnB1dCArIGNhY2hlUmVhZCArIGNhY2hlQ3JlYXRpb24gOiBzdG9yZWRJbnB1dCxcbiAgICBvdXRwdXRUb2tlbnM6IHJvdy5vdXRwdXRfdG9rZW5zLFxuICAgIGNhY2hlZElucHV0VG9rZW5zOiBjYWNoZVJlYWQsXG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiBjYWNoZUNyZWF0aW9uLFxuICAgIC4uLihyb3cuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zICE9PSBudWxsICYmIHJvdy5jYWNoZV9jcmVhdGlvbl81bV90b2tlbnMgIT09IHVuZGVmaW5lZFxuICAgICAgPyB7IGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtOiByb3cuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zIH1cbiAgICAgIDoge30pLFxuICAgIC4uLihyb3cuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zICE9PSBudWxsICYmIHJvdy5jYWNoZV9jcmVhdGlvbl8xaF90b2tlbnMgIT09IHVuZGVmaW5lZFxuICAgICAgPyB7IGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoOiByb3cuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zIH1cbiAgICAgIDoge30pLFxuICB9O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVMZWdhY3lBbnRocm9waWNSb3c8VCBleHRlbmRzIFJlcXVlc3RMb2dVc2FnZVJvdz4ocm93OiBUKTogVCB7XG4gIC8vIOyDiCByb3cg64qUIOuLueyLnOydmCBwcm92aWRlci/qsIDqsqntkZwg67mE7Jqp7J2EIO2ZleyglSDsoIDsnqXtlZzri6QuIO2YhOyerCDqsIDqsqntkZzroZwg642u7Ja07JOw7KeAIOyViuuKlOuLpC5cbiAgaWYgKHJvdy5jb3N0X3NvdXJjZSkgcmV0dXJuIHJvdztcbiAgY29uc3QgdXNhZ2UgPSBub3JtYWxpemVkVXNhZ2VGb3JDb3N0KHJvdyk7XG4gIGlmICh1c2FnZS5pbnB1dFRva2VucyA9PT0gcm93LmlucHV0X3Rva2VucykgcmV0dXJuIHJvdztcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHsgLi4ucm93LCBpbnB1dF90b2tlbnM6IHVzYWdlLmlucHV0VG9rZW5zIH07XG4gIGlmICh1c2FnZS5tb2RlbCkge1xuICAgIG5vcm1hbGl6ZWQuY29zdF91c2QgPSBNYXRoLnJvdW5kKGNhbGN1bGF0ZUNvc3RVc2QodXNhZ2UubW9kZWwsIHVzYWdlKSAqIE1JQ1JPX1VTRCk7XG4gIH1cbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59XG5cbi8qKlxuICogYG9yZGVyQnlgIGVudW0g6rCSKGDsu6zrn7wt67Cp7ZalYCnsnYQg7KCV66CsIOygiOuhnCDsmK7quLTri6QuXG4gKlxuICogZW51bSDsnbQgMTgg7KKF7J206528IOy8gOydtOyKpOulvCDsnbzsnbzsnbQg7KCB64qUIOuMgOyLoCDtjIzsi7HtlZjrkJgsIOy7rOufvOydgCDslYTrnpgg66qp66Gd7Jy866GcIO2VnOygle2VnOuLpCDigJRcbiAqIOusuOyekOyXtOydhCDqt7jrjIDroZwg7Lus65+866qF7JeQIOuEmOq4sOuptCBlbnVtIOydtCDrsJTrgJQg65WMIOqygOymnSDsl4bripQg7Iud67OE7J6Q6rCAIFNRTCDroZwg7Z2Y65+s65Og64ukLlxuICog66qp66Gd7JeQIOyXhuuKlCDqsJLsnYAg6riw67O4IOygleugrChpZCBkZXNjKeuhnCDrlqjslrTsp4Tri6QuXG4gKi9cbmNvbnN0IE9SREVSQUJMRV9DT0xVTU5TID0ge1xuICBpZDogXCJyZXF1ZXN0X2xvZ3MuaWRcIixcbiAgY3JlYXRlZF9hdDogXCJyZXF1ZXN0X2xvZ3MuY3JlYXRlZF9hdFwiLFxuICB0dGZ0X21zOiBcInJlcXVlc3RfbG9ncy50dGZ0X21zXCIsXG4gIGR1cmF0aW9uX21zOiBcInJlcXVlc3RfbG9ncy5kdXJhdGlvbl9tc1wiLFxuICBpbnB1dF90b2tlbnM6IFwicmVxdWVzdF9sb2dzLmlucHV0X3Rva2Vuc1wiLFxuICBvdXRwdXRfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5vdXRwdXRfdG9rZW5zXCIsXG4gIGNhY2hlX3JlYWRfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5jYWNoZV9yZWFkX3Rva2Vuc1wiLFxuICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IFwicmVxdWVzdF9sb2dzLmNhY2hlX2NyZWF0aW9uX3Rva2Vuc1wiLFxuICBjb3N0X3VzZDogXCJyZXF1ZXN0X2xvZ3MuY29zdF91c2RcIixcbn0gYXMgY29uc3Q7XG5cbmZ1bmN0aW9uIGFwcGx5T3JkZXJCeShcbiAgcWI6IFJldHVyblR5cGU8UmVxdWVzdExvZ01vZGVsQ2xhc3NbXCJnZXRTdWJzZXRRdWVyaWVzXCJdPltcInFiXCJdLFxuICBvcmRlckJ5OiBzdHJpbmcsXG4pOiB2b2lkIHtcbiAgY29uc3Qgc2VwYXJhdG9yID0gb3JkZXJCeS5sYXN0SW5kZXhPZihcIi1cIik7XG4gIGNvbnN0IGtleSA9IG9yZGVyQnkuc2xpY2UoMCwgc2VwYXJhdG9yKSBhcyBrZXlvZiB0eXBlb2YgT1JERVJBQkxFX0NPTFVNTlM7XG4gIGNvbnN0IGRpcmVjdGlvbiA9IG9yZGVyQnkuc2xpY2Uoc2VwYXJhdG9yICsgMSkgPT09IFwiYXNjXCIgPyBcImFzY1wiIDogXCJkZXNjXCI7XG4gIGNvbnN0IGNvbHVtbiA9IE9SREVSQUJMRV9DT0xVTU5TW2tleV07XG5cbiAgaWYgKCFjb2x1bW4pIHtcbiAgICBxYi5vcmRlckJ5KFwicmVxdWVzdF9sb2dzLmlkXCIsIFwiZGVzY1wiKTtcbiAgICByZXR1cm47XG4gIH1cbiAgcWIub3JkZXJCeShjb2x1bW4sIGRpcmVjdGlvbik7XG4gIC8vIOuPmeygkCDtlonsnZgg7Iic7ISc6rCAIO2OmOydtOyngOuniOuLpCDtnZTrk6Trpqzsp4Ag7JWK6rKMIOqzoOycoCDsu6zrn7zsnLzroZwgdGllLWJyZWFrIO2VnOuLpC5cbiAgaWYgKGtleSAhPT0gXCJpZFwiKSBxYi5vcmRlckJ5KFwicmVxdWVzdF9sb2dzLmlkXCIsIFwiZGVzY1wiKTtcbn1cblxuLypcbiAgUmVxdWVzdExvZyBNb2RlbFxuKi9cbmNsYXNzIFJlcXVlc3RMb2dNb2RlbENsYXNzIGV4dGVuZHMgQmFzZU1vZGVsQ2xhc3M8XG4gIFJlcXVlc3RMb2dTdWJzZXRLZXksXG4gIFJlcXVlc3RMb2dTdWJzZXRNYXBwaW5nLFxuICB0eXBlb2YgcmVxdWVzdExvZ1N1YnNldFF1ZXJpZXMsXG4gIHR5cGVvZiByZXF1ZXN0TG9nTG9hZGVyUXVlcmllc1xuPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiUmVxdWVzdExvZ1wiLCByZXF1ZXN0TG9nU3Vic2V0UXVlcmllcywgcmVxdWVzdExvZ0xvYWRlclF1ZXJpZXMpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0sIHJlc291cmNlTmFtZTogXCJSZXF1ZXN0TG9nXCIgfSlcbiAgYXN5bmMgZmluZEJ5SWQ8VCBleHRlbmRzIFJlcXVlc3RMb2dTdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBpZDogbnVtYmVyLFxuICApOiBQcm9taXNlPFJlcXVlc3RMb2dTdWJzZXRNYXBwaW5nW1RdPiB7XG4gICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCB0aGlzLmZpbmRNYW55KHN1YnNldCwge1xuICAgICAgaWQsXG4gICAgICBudW06IDEsXG4gICAgICBwYWdlOiAxLFxuICAgIH0pO1xuICAgIGlmICghcm93c1swXSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFNEKFwiZXJyb3IuZW50aXR5Tm90Rm91bmRcIikoXCJSZXF1ZXN0TG9nXCIsIGlkKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJvd3NbMF07XG4gIH1cblxuICBhc3luYyBmaW5kT25lPFQgZXh0ZW5kcyBSZXF1ZXN0TG9nU3Vic2V0S2V5PihcbiAgICBzdWJzZXQ6IFQsXG4gICAgbGlzdFBhcmFtczogUmVxdWVzdExvZ0xpc3RQYXJhbXMsXG4gICk6IFByb21pc2U8UmVxdWVzdExvZ1N1YnNldE1hcHBpbmdbVF0gfCBudWxsPiB7XG4gICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCB0aGlzLmZpbmRNYW55KHN1YnNldCwge1xuICAgICAgLi4ubGlzdFBhcmFtcyxcbiAgICAgIG51bTogMSxcbiAgICAgIHBhZ2U6IDEsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcm93c1swXSA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIOuqqeuhnSDtlYTthLDsnZgg64uo7J28IOygleydmC4gZmluZE1hbnkg7JmAIHRvdGFsQ29zdCDqsIAg6rCZ7J2AIOyhsOqxtOydhCDrs7Trj4TroZ0g6rO17Jyg7ZWc64ukIOKAlFxuICAgKiDtmZTrqbTsl5DshJwg7ZWE7YSw66W8IOqxuOuptCDtlokg7IiY7JmAIOu5hOyaqeydtCDtlajqu5gg7KKB7ZiA7KC47JW8IO2VmOuKlOuNsCwg65GQIOy/vOumrOqwgCDqsIHsnpAg7ZWE7YSw66W8XG4gICAqIOq1rO2YhO2VmOuptCDtlZzsqr3sl5Ag7LaV7J2EIOy2lOqwgO2VoCDrlYwg7KGw7Jqp7Z6IIOyWtOq4i+uCnOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXBwbHlMaXN0RmlsdGVycyhcbiAgICBxYjogUmV0dXJuVHlwZTxSZXF1ZXN0TG9nTW9kZWxDbGFzc1tcImdldFN1YnNldFF1ZXJpZXNcIl0+W1wicWJcIl0sXG4gICAgcGFyYW1zOiBSZXF1ZXN0TG9nTGlzdFBhcmFtcyxcbiAgKTogdm9pZCB7XG4gICAgaWYgKHBhcmFtcy5pZCkge1xuICAgICAgcWIud2hlcmVJbihcInJlcXVlc3RfbG9ncy5pZFwiLCBhc0FycmF5KHBhcmFtcy5pZCkpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMudG9rZW5fbmFtZSkge1xuICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MudG9rZW5fbmFtZVwiLCBwYXJhbXMudG9rZW5fbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5wcm9qZWN0X25hbWVfaXNfbnVsbCkge1xuICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MucHJvamVjdF9uYW1lXCIsIG51bGwpO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLnByb2plY3RfbmFtZV9pc19ub3RfbnVsbCkge1xuICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MucHJvamVjdF9uYW1lXCIsIFwiIT1cIiwgbnVsbCk7XG4gICAgfSBlbHNlIGlmIChwYXJhbXMucHJvamVjdF9uYW1lKSB7XG4gICAgICBxYi53aGVyZShcInJlcXVlc3RfbG9ncy5wcm9qZWN0X25hbWVcIiwgcGFyYW1zLnByb2plY3RfbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5tb2RlbF9uYW1lKSB7XG4gICAgICBxYi53aGVyZShcInJlcXVlc3RfbG9ncy5tb2RlbF9uYW1lXCIsIHBhcmFtcy5tb2RlbF9uYW1lKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnNlYXJjaCAmJiBwYXJhbXMua2V5d29yZCAmJiBwYXJhbXMua2V5d29yZC5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAocGFyYW1zLnNlYXJjaCA9PT0gXCJpZFwiKSB7XG4gICAgICAgIHFiLndoZXJlKFwicmVxdWVzdF9sb2dzLmlkXCIsIE51bWJlcihwYXJhbXMua2V5d29yZCkpO1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXMuc2VhcmNoID09PSBcInRva2VuX25hbWVcIikge1xuICAgICAgICBxYi53aGVyZShcInJlcXVlc3RfbG9ncy50b2tlbl9uYW1lXCIsIFwibGlrZVwiLCBgJSR7cGFyYW1zLmtleXdvcmR9JWApO1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXMuc2VhcmNoID09PSBcInVzZXJfcHJvbXB0XCIpIHtcbiAgICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MudXNlcl9wcm9tcHRcIiwgXCJsaWtlXCIsIGAlJHtwYXJhbXMua2V5d29yZH0lYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcImVycm9yLnVua25vd25TZWFyY2hGaWVsZFwiKShwYXJhbXMuc2VhcmNoKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0sIHJlc291cmNlTmFtZTogXCJSZXF1ZXN0TG9nc1wiIH0pXG4gIGFzeW5jIGZpbmRNYW55PFQgZXh0ZW5kcyBSZXF1ZXN0TG9nU3Vic2V0S2V5LCBMUCBleHRlbmRzIFJlcXVlc3RMb2dMaXN0UGFyYW1zPihcbiAgICBzdWJzZXQ6IFQsXG4gICAgcmF3UGFyYW1zPzogTFAsXG4gICk6IFByb21pc2U8TGlzdFJlc3VsdDxMUCwgUmVxdWVzdExvZ1N1YnNldE1hcHBpbmdbVF0+PiB7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgbnVtOiAyNCxcbiAgICAgIHBhZ2U6IDEsXG4gICAgICBzZWFyY2g6IFwiaWRcIiBhcyBjb25zdCxcbiAgICAgIG9yZGVyQnk6IFwiaWQtZGVzY1wiIGFzIGNvbnN0LFxuICAgICAgLi4ucmF3UGFyYW1zLFxuICAgIH0gc2F0aXNmaWVzIFJlcXVlc3RMb2dMaXN0UGFyYW1zO1xuXG4gICAgY29uc3QgeyBxYiwgb25TdWJzZXQ6IF8gfSA9IHRoaXMuZ2V0U3Vic2V0UXVlcmllcyhzdWJzZXQpO1xuXG4gICAgdGhpcy5hcHBseUxpc3RGaWx0ZXJzKHFiLCBwYXJhbXMpO1xuXG4gICAgaWYgKHBhcmFtcy5vcmRlckJ5KSBhcHBseU9yZGVyQnkocWIsIHBhcmFtcy5vcmRlckJ5KTtcblxuICAgIGNvbnN0IGVuaGFuY2VycyA9IHRoaXMuY3JlYXRlRW5oYW5jZXJzKHtcbiAgICAgIEE6IChyb3cpID0+IG5vcm1hbGl6ZUxlZ2FjeUFudGhyb3BpY1Jvdyhyb3cpLFxuICAgICAgQzogKHJvdykgPT4gbm9ybWFsaXplTGVnYWN5QW50aHJvcGljUm93KHJvdyksXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlU3Vic2V0UXVlcnkoe1xuICAgICAgc3Vic2V0LFxuICAgICAgcWIsXG4gICAgICBwYXJhbXMsXG4gICAgICBlbmhhbmNlcnMsXG4gICAgICBkZWJ1ZzogZmFsc2UsXG4gICAgfSk7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgc2F2ZShzcGE6IFJlcXVlc3RMb2dTYXZlUGFyYW1zW10pOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcblxuICAgIC8vIHJlZ2lzdGVyXG4gICAgc3BhLmZvckVhY2goKHNwKSA9PiB7XG4gICAgICB3ZGIudWJSZWdpc3RlcihcInJlcXVlc3RfbG9nc1wiLCBzcCk7XG4gICAgfSk7XG5cbiAgICAvLyB0cmFuc2FjdGlvblxuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgY29uc3QgaWRzID0gYXdhaXQgdHJ4LnViVXBzZXJ0KFwicmVxdWVzdF9sb2dzXCIpO1xuXG4gICAgICByZXR1cm4gaWRzO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOy1nOq3vCDqtazqsITsnZggcHJvdmlkZXIg67OEIOqyveufiSDthrXqs4Qo66qo64uI7YSw66eB7JqpKS4gcHJvdmlkZXIg64qUIHJlcXVlc3RlZF9tb2RlbF9uYW1lIOydmFxuICAgKiBcIm9wZW5haS8uLi5cIiB8IFwiYW50aHJvcGljLy4uLlwiIHByZWZpeCDroZwg7YyQ7KCV7ZWc64ukIOKAlCBzZXJ2aW5nIG1vZGVsX25hbWUg7J2AIHByZWZpeCDqsIBcbiAgICog7JeG6rOgLCBydW5uaW5nIOy0iOq4sOyXlCDslYTsp4Eg67mE7Ja0IOyeiOuLpC4g7KeR6rOE64qUIEpTIOyXkOyEnCDtlZzri6Q6IO2PtOungSDso7zquLDqsIAg64qQ7Iqo7ZWY6rOgXG4gICAqIOq1rOqwhOydtCDsp6fslYQgcm93IOyImOqwgCDsnpHsnLzrqbAsIHByZWZpeCBDQVNFIOyLneydhCDsv7zrpqwg67mM642U7JeQIOuwleyngCDslYrslYTrj4Qg65Cc64ukLlxuICAgKi9cbiAgYXN5bmMgcHJvdmlkZXJTdGF0c1NpbmNlKHNpbmNlOiBEYXRlKTogUHJvbWlzZTxcbiAgICBBcnJheTx7XG4gICAgICBwcm92aWRlcjogc3RyaW5nO1xuICAgICAgcmVxdWVzdHM6IG51bWJlcjtcbiAgICAgIGVycm9yczogbnVtYmVyO1xuICAgICAgaW5wdXRUb2tlbnM6IG51bWJlcjtcbiAgICAgIGNhY2hlUmVhZFRva2VuczogbnVtYmVyO1xuICAgIH0+XG4gID4ge1xuICAgIGNvbnN0IHJkYiA9IHRoaXMuZ2V0UHVyaShcInJcIik7XG4gICAgY29uc3Qgcm93cyA9IChhd2FpdCByZGJcbiAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dzXCIpXG4gICAgICAuc2VsZWN0KHtcbiAgICAgICAgcmVxdWVzdGVkX21vZGVsX25hbWU6IFwicmVxdWVzdF9sb2dzLnJlcXVlc3RlZF9tb2RlbF9uYW1lXCIsXG4gICAgICAgIHN0YXR1czogXCJyZXF1ZXN0X2xvZ3Muc3RhdHVzXCIsXG4gICAgICAgIGlucHV0X3Rva2VuczogXCJyZXF1ZXN0X2xvZ3MuaW5wdXRfdG9rZW5zXCIsXG4gICAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5jYWNoZV9yZWFkX3Rva2Vuc1wiLFxuICAgICAgfSlcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9ncy5jcmVhdGVkX2F0XCIsIFwiPj1cIiwgc2luY2UpKSBhcyB1bmtub3duIGFzIEFycmF5PHtcbiAgICAgIHJlcXVlc3RlZF9tb2RlbF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgICBpbnB1dF90b2tlbnM6IG51bWJlcjtcbiAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiBudW1iZXI7XG4gICAgfT47XG5cbiAgICBjb25zdCBieVByb3ZpZGVyID0gbmV3IE1hcDxcbiAgICAgIHN0cmluZyxcbiAgICAgIHsgcmVxdWVzdHM6IG51bWJlcjsgZXJyb3JzOiBudW1iZXI7IGlucHV0VG9rZW5zOiBudW1iZXI7IGNhY2hlUmVhZFRva2VuczogbnVtYmVyIH1cbiAgICA+KCk7XG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgY29uc3QgbW9kZWwgPSByb3cucmVxdWVzdGVkX21vZGVsX25hbWUgPz8gXCJcIjtcbiAgICAgIGNvbnN0IHByb3ZpZGVyID0gbW9kZWwuc3RhcnRzV2l0aChcIm9wZW5haS9cIilcbiAgICAgICAgPyBcIm9wZW5haVwiXG4gICAgICAgIDogbW9kZWwuc3RhcnRzV2l0aChcImFudGhyb3BpYy9cIilcbiAgICAgICAgICA/IFwiYW50aHJvcGljXCJcbiAgICAgICAgICA6IFwidW5rbm93blwiO1xuICAgICAgY29uc3QgYWdnID0gYnlQcm92aWRlci5nZXQocHJvdmlkZXIpID8/IHtcbiAgICAgICAgcmVxdWVzdHM6IDAsXG4gICAgICAgIGVycm9yczogMCxcbiAgICAgICAgaW5wdXRUb2tlbnM6IDAsXG4gICAgICAgIGNhY2hlUmVhZFRva2VuczogMCxcbiAgICAgIH07XG4gICAgICBhZ2cucmVxdWVzdHMgKz0gMTtcbiAgICAgIGlmIChyb3cuc3RhdHVzID09PSBcImVycm9yXCIpIGFnZy5lcnJvcnMgKz0gMTtcbiAgICAgIGFnZy5pbnB1dFRva2VucyArPSByb3cuaW5wdXRfdG9rZW5zO1xuICAgICAgYWdnLmNhY2hlUmVhZFRva2VucyArPSByb3cuY2FjaGVfcmVhZF90b2tlbnM7XG4gICAgICBieVByb3ZpZGVyLnNldChwcm92aWRlciwgYWdnKTtcbiAgICB9XG4gICAgcmV0dXJuIFsuLi5ieVByb3ZpZGVyLmVudHJpZXMoKV1cbiAgICAgIC5tYXAoKFtwcm92aWRlciwgYWdnXSkgPT4gKHsgcHJvdmlkZXIsIC4uLmFnZyB9KSlcbiAgICAgIC50b1NvcnRlZCgoYSwgYikgPT4gYS5wcm92aWRlci5sb2NhbGVDb21wYXJlKGIucHJvdmlkZXIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzdHJ1Y3R1cmVkIG91dHB1dCDsmpTssq3snZggSlNPTiBTY2hlbWEg66W8IO2RnOyLnOyaqSDtg4DsnoUg7YWN7Iqk7Yq466GcIOuzgO2ZmO2VnOuLpC5cbiAgICogdHlwZXNjcmlwdCDripQg6rCE6rKw7ZWcIGB0eXBlYCDshKDslrgsIHpvZCDripQg7J6s6rWs7ISx65CcIHpvZCDtkZztmITsi53snbTri6Qg4oCUIOybkOuzuCB6b2RcbiAgICog7IaM7Iqk64qUIHdpcmUg66W8IOqxtOuEiOyYpOupsCDshozsi6TrkJjrr4DroZwgcmVmaW5lL3RyYW5zZm9ybSDrpZjripQg67O17JuQ65CY7KeAIOyViuuKlOuLpC5cbiAgICog7Iqk7YKk66eI6rCAIOyXhuqxsOuCmCDrs4DtmZgg7Iuk7Yyo66m0IG51bGwg4oCUIO2ZlOuptOydgCDtlbTri7kg67iU66GdIO2RnOyLnOulvCDsg53rnrXtlZzri6QuXG4gICAqL1xuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyByZXNwb25zZVR5cGVUcyhpZDogbnVtYmVyKTogUHJvbWlzZTx7XG4gICAgdHlwZXNjcmlwdDogc3RyaW5nIHwgbnVsbDtcbiAgICB6b2Q6IHN0cmluZyB8IG51bGw7XG4gIH0+IHtcbiAgICBjb25zdCByZGIgPSB0aGlzLmdldFB1cmkoXCJyXCIpO1xuICAgIGNvbnN0IHJvd3MgPSAoYXdhaXQgcmRiXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nc1wiKVxuICAgICAgLnNlbGVjdCh7IGpzb25fc2NoZW1hOiBcInJlcXVlc3RfbG9ncy5qc29uX3NjaGVtYVwiIH0pXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ3MuaWRcIiwgaWQpKSBhcyB1bmtub3duIGFzIEFycmF5PHsganNvbl9zY2hlbWE6IHN0cmluZyB8IG51bGwgfT47XG4gICAgY29uc3Qgc2NoZW1hID0gcm93c1swXT8uanNvbl9zY2hlbWE7XG4gICAgaWYgKCFzY2hlbWEpIHJldHVybiB7IHR5cGVzY3JpcHQ6IG51bGwsIHpvZDogbnVsbCB9O1xuXG4gICAgbGV0IHBhcnNlZDogdW5rbm93bjtcbiAgICB0cnkge1xuICAgICAgcGFyc2VkID0gSlNPTi5wYXJzZShzY2hlbWEpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHsgdHlwZXNjcmlwdDogbnVsbCwgem9kOiBudWxsIH07XG4gICAgfVxuICAgIGxldCB6b2Q6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICB6b2QgPSBmb3JtYXRab2RDb2RlKFxuICAgICAgICBqc29uU2NoZW1hVG9ab2QocGFyc2VkIGFzIFBhcmFtZXRlcnM8dHlwZW9mIGpzb25TY2hlbWFUb1pvZD5bMF0sIHsgbW9kdWxlOiBcIm5vbmVcIiB9KSxcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB6b2QgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4geyB0eXBlc2NyaXB0OiByZW5kZXJQYXJzZWRKc29uU2NoZW1hVHlwZVRleHQocGFyc2VkKSwgem9kIH07XG4gIH1cblxuICAvLyDilIDilIAgVG9vbCBDb250cmFjdCBWaWV3XG5cbiAgLyoqXG4gICAqIOyalOyyreyXkCDsnqXssKnrkJwgdG9vbCDqs4Tslb3snYQgZGV0YWlsIO2ZlOuptOyaqeycvOuhnCDstpXslb3tlZzri6QuIEpTT05CIOuKlCDsnbTrr7ggZGVjb2RlIOuQnFxuICAgKiDrsLDsl7TroZwg7Jik66mwIOusuOyekOyXtOyduCDqsr3smrDrp4wg67Cp7Ja07KCB7Jy866GcIHBhcnNlIO2VnOuLpC4g7KCA7J6l65CcIFFncmlkVG9vbCDqs4Tslb3snYBcbiAgICog7KCE7IiYIOqygOyCrOuhnCDtmZXsnbjrkJDsnLzrr4DroZwg7ZWt66qp67OEIOuztOygleydtOuCmCB1bnJlYWRhYmxlIHNlbnRpbmVsIOydgCDrp4zrk6Tsp4Ag7JWK64qU64ukLlxuICAgKiDri6Trp4wgYFFncmlkVG9vbC5pbnB1dFNjaGVtYWAg64qUIGB6LnVua25vd24oKWAg7J206528IO2CpOqwgCDsl4bqsbDrgpggbnVsbCDsnbgg6rCS64+EXG4gICAqIHdpcmUg6rKA7Kad7J2EIO2GteqzvO2VmOuvgOuhnCDruYgg7Iqk7YKk66eI66GcIOygleq3nO2ZlO2VnOuLpCDigJQgU0RLIOuKlCBge31gIOuhnCDssYTsm4wg67O064K464ukLlxuICAgKi9cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgdG9vbHNWaWV3KGlkOiBudW1iZXIpOiBQcm9taXNlPFRvb2xWaWV3W10+IHtcbiAgICBjb25zdCByb3cgPSAoYXdhaXQgdGhpcy5nZXRQdXJpKFwiclwiKVxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ3NcIilcbiAgICAgIC5zZWxlY3QoeyB0b29sczogXCJyZXF1ZXN0X2xvZ3MudG9vbHNcIiB9KVxuICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dzLmlkXCIsIGlkKVxuICAgICAgLmZpcnN0KCkpIGFzIHsgdG9vbHM6IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCB0b29scyA9IGRlY29kZVN0b3JlZFRvb2xzKHJvdz8udG9vbHMpO1xuICAgIGlmICghdG9vbHMpIHJldHVybiBbXTtcblxuICAgIHJldHVybiB0b29scy5tYXAoKHRvb2wpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0U2NoZW1hID0gKHRvb2wuaW5wdXRTY2hlbWEgPz8ge30pIGFzIHtcbiAgICAgICAgcHJvcGVydGllcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGlucHV0Wm9kID0gcmVuZGVySnNvblNjaGVtYVpvZFNoYXBlVGV4dChpbnB1dFNjaGVtYSwgVE9PTF9FTlVNX1ZBTFVFX0xJTUlUKTtcbiAgICAgIGNvbnN0IGZ1bGxJbnB1dFpvZCA9IHJlbmRlckpzb25TY2hlbWFab2RTaGFwZVRleHQoaW5wdXRTY2hlbWEpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiB0b29sLm5hbWUsXG4gICAgICAgIC4uLih0b29sLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQgPyB7IGRlc2NyaXB0aW9uOiB0b29sLmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAgIHBhcmFtZXRlckNvdW50OiBPYmplY3Qua2V5cyhpbnB1dFNjaGVtYS5wcm9wZXJ0aWVzID8/IHt9KS5sZW5ndGgsXG4gICAgICAgIGlucHV0Wm9kLFxuICAgICAgICAuLi4oaW5wdXRab2QgIT09IGZ1bGxJbnB1dFpvZCA/IHsgZnVsbElucHV0Wm9kIH0gOiB7fSksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJ1biBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYXN5bmMgY3JlYXRlUnVuKHBhcmFtczoge1xuICAgIHVzZXJfcHJvbXB0OiBzdHJpbmc7XG4gICAgc3lzdGVtX3Byb21wdD86IHN0cmluZyB8IG51bGw7XG4gICAgcmVxdWVzdGVkX21vZGVsX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIGVmZm9ydD86IHN0cmluZyB8IG51bGw7XG4gICAgcHJvamVjdF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICBoaXN0b3J5PzogdW5rbm93bjtcbiAgICB0b29scz86IFRvb2xEZWZpbml0aW9ucztcbiAgICBpc19pbWFnZV9nZW5lcmF0aW9uPzogYm9vbGVhbjtcbiAgICBpc19zdHJ1Y3R1cmVkPzogYm9vbGVhbjtcbiAgICBqc29uX3NjaGVtYT86IHN0cmluZyB8IG51bGw7XG4gIH0pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG4gICAgd2RiLnViUmVnaXN0ZXIoXCJyZXF1ZXN0X2xvZ3NcIiwge1xuICAgICAgdXNlcl9wcm9tcHQ6IHBhcmFtcy51c2VyX3Byb21wdCxcbiAgICAgIHN5c3RlbV9wcm9tcHQ6IHBhcmFtcy5zeXN0ZW1fcHJvbXB0ID8/IG51bGwsXG4gICAgICAvLyBwcm92aWRlciDsi6Ttlokg7KCE7J2066+A66GcIHNlcnZpbmcgbW9kZWzsnYAg7JWE7KeBIOyVjCDsiJgg7JeG64ukLlxuICAgICAgcmVxdWVzdGVkX21vZGVsX25hbWU6IHBhcmFtcy5yZXF1ZXN0ZWRfbW9kZWxfbmFtZSA/PyBudWxsLFxuICAgICAgbW9kZWxfbmFtZTogbnVsbCxcbiAgICAgIGVmZm9ydDogcGFyYW1zLmVmZm9ydCA/PyBudWxsLFxuICAgICAgcHJvamVjdF9uYW1lOiBwYXJhbXMucHJvamVjdF9uYW1lID8/IG51bGwsXG4gICAgICBzdGF0dXM6IFwicnVubmluZ1wiLFxuICAgICAgcmVzcG9uc2U6IFwiXCIsXG4gICAgICBpbnB1dF90b2tlbnM6IDAsXG4gICAgICBvdXRwdXRfdG9rZW5zOiAwLFxuICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IDAsXG4gICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IDAsXG4gICAgICBkdXJhdGlvbl9tczogMCxcbiAgICAgIHRvb2xfY2FsbF9jb3VudDogMCxcbiAgICAgIC8vIOydtOuvuOyngCB0dXJuIOyLneuzhChSMTMpLiBydW4g6rK966GcKHRvb2xzK2ltYWdlIOyhsO2VqSnrj4QgYXV0byDqsr3roZzsmYAg64+Z7J287ZWY6rKMIOuniO2CuS5cbiAgICAgIGlzX2ltYWdlX2dlbmVyYXRpb246IHBhcmFtcy5pc19pbWFnZV9nZW5lcmF0aW9uID8/IGZhbHNlLFxuICAgICAganNvbl9zY2hlbWE6IHBhcmFtcy5qc29uX3NjaGVtYSA/PyBudWxsLFxuICAgICAgaXNfc3RydWN0dXJlZDpcbiAgICAgICAgcGFyYW1zLmlzX3N0cnVjdHVyZWQgPz8gKHBhcmFtcy5qc29uX3NjaGVtYSAhPT0gbnVsbCAmJiBwYXJhbXMuanNvbl9zY2hlbWEgIT09IHVuZGVmaW5lZCksXG4gICAgICAuLi4ocGFyYW1zLmhpc3RvcnkgIT09IHVuZGVmaW5lZCA/IHsgaGlzdG9yeTogcGFyYW1zLmhpc3RvcnkgYXMgeyB0eXBlOiBzdHJpbmcgfVtdIH0gOiB7fSksXG4gICAgICAuLi4ocGFyYW1zLnRvb2xzICE9PSB1bmRlZmluZWQgPyB7IHRvb2xzOiBwYXJhbXMudG9vbHMgfSA6IHt9KSxcbiAgICB9KTtcbiAgICByZXR1cm4gd2RiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgIGNvbnN0IGlkcyA9IGF3YWl0IHRyeC51YlVwc2VydChcInJlcXVlc3RfbG9nc1wiKTtcbiAgICAgIHJldHVybiBpZHNbMF0hO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgYXBwZW5kU3RlcChyZXF1ZXN0TG9nSWQ6IG51bWJlciwgc3RlcDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG4gICAgd2RiLnViUmVnaXN0ZXIoXCJyZXF1ZXN0X2xvZ19zdGVwc1wiLCB7IHJlcXVlc3RfbG9nX2lkOiByZXF1ZXN0TG9nSWQsIC4uLnN0ZXAgfSk7XG4gICAgcmV0dXJuIHdkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICBjb25zdCBpZHMgPSBhd2FpdCB0cngudWJVcHNlcnQoXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKTtcbiAgICAgIGlmIChzdGVwLnR5cGUgPT09IFwidG9vbF9jYWxsXCIpIHtcbiAgICAgICAgYXdhaXQgdHJ4LmZyb20oXCJyZXF1ZXN0X2xvZ3NcIikud2hlcmUoXCJpZFwiLCByZXF1ZXN0TG9nSWQpLmluY3JlbWVudChcInRvb2xfY2FsbF9jb3VudFwiLCAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpZHNbMF0hO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZmluaXNoUnVuKFxuICAgIHJlcXVlc3RMb2dJZDogbnVtYmVyLFxuICAgIHBhcmFtczoge1xuICAgICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgICByZXNwb25zZT86IHN0cmluZztcbiAgICAgIHRva2VuX25hbWU/OiBzdHJpbmc7XG4gICAgICBpbnB1dF90b2tlbnM/OiBudW1iZXI7XG4gICAgICBvdXRwdXRfdG9rZW5zPzogbnVtYmVyO1xuICAgICAgY2FjaGVfcmVhZF90b2tlbnM/OiBudW1iZXI7XG4gICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM/OiBudW1iZXI7XG4gICAgICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuICAgICAgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcbiAgICAgIGR1cmF0aW9uX21zPzogbnVtYmVyO1xuICAgICAgcmVxdWVzdGVkX21vZGVsX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgICAgbW9kZWxfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgICBmYWxsYmFja19jb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgICBjb3N0X3VzZD86IG51bWJlciB8IG51bGw7XG4gICAgICBjb3N0X3NvdXJjZT86IHN0cmluZyB8IG51bGw7XG4gICAgICBoaXN0b3J5PzogdW5rbm93bjtcbiAgICAgIGVycm9yX21lc3NhZ2U/OiBzdHJpbmc7XG4gICAgICB0b29sX2NhbGxfY291bnQ/OiBudW1iZXI7XG4gICAgICBpbWFnZV9jb3N0X3VzZD86IG51bWJlciB8IG51bGw7XG4gICAgICBpbWFnZV9jb3N0X21ldGhvZD86IHN0cmluZyB8IG51bGw7XG4gICAgICByZXNwb25zZV9qc29uX29rPzogYm9vbGVhbiB8IG51bGw7XG4gICAgfSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHBhcmFtcy5zdGF0dXMgPT09IFwic3VjY2VlZGVkXCIgJiYgIXBhcmFtcy50b2tlbl9uYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0b2tlbk5hbWUgaXMgcmVxdWlyZWQgZm9yIHN1Y2NlZWRlZCBydW5zXCIpO1xuICAgIH1cbiAgICBjb25zdCB1cGRhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyBpZDogcmVxdWVzdExvZ0lkLCBzdGF0dXM6IHBhcmFtcy5zdGF0dXMgfTtcbiAgICBjb25zdCBmaWVsZHMgPSBbXG4gICAgICBcInJlc3BvbnNlXCIsXG4gICAgICBcInRva2VuX25hbWVcIixcbiAgICAgIFwiaW5wdXRfdG9rZW5zXCIsXG4gICAgICBcIm91dHB1dF90b2tlbnNcIixcbiAgICAgIFwiY2FjaGVfcmVhZF90b2tlbnNcIixcbiAgICAgIFwiY2FjaGVfY3JlYXRpb25fdG9rZW5zXCIsXG4gICAgICBcImNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vuc1wiLFxuICAgICAgXCJjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnNcIixcbiAgICAgIFwiZHVyYXRpb25fbXNcIixcbiAgICAgIFwicmVxdWVzdGVkX21vZGVsX25hbWVcIixcbiAgICAgIFwibW9kZWxfbmFtZVwiLFxuICAgICAgXCJmYWxsYmFja19jb3VudFwiLFxuICAgICAgXCJjb3N0X3VzZFwiLFxuICAgICAgXCJjb3N0X3NvdXJjZVwiLFxuICAgICAgXCJlcnJvcl9tZXNzYWdlXCIsXG4gICAgICBcInRvb2xfY2FsbF9jb3VudFwiLFxuICAgICAgXCJpbWFnZV9jb3N0X3VzZFwiLFxuICAgICAgXCJpbWFnZV9jb3N0X21ldGhvZFwiLFxuICAgICAgXCJyZXNwb25zZV9qc29uX29rXCIsXG4gICAgXSBhcyBjb25zdDtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBmaWVsZHMpIHtcbiAgICAgIGlmIChwYXJhbXNba2V5XSAhPT0gdW5kZWZpbmVkKSB1cGRhdGVba2V5XSA9IHBhcmFtc1trZXldO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmhpc3RvcnkgIT09IHVuZGVmaW5lZCkgdXBkYXRlLmhpc3RvcnkgPSBwYXJhbXMuaGlzdG9yeTtcbiAgICB1cGRhdGUudHRmdF9tcyA9IChhd2FpdCB0aGlzLmZpcnN0R2VuZXJhdGVTdGVwVHRmdChyZXF1ZXN0TG9nSWQpKSA/PyAwO1xuXG4gICAgLy8g7ISc67KEIHJ1biDqsr3roZzripQgc3RlcCDsl5DshJwg7ZmV7KCV7ZWcIGV4YWN0IGNvc3Qg66W8IOuEmOq4tOuLpC4g7Jm467aAL2xlZ2FjeSBjYWxsZXIg6rCAIOu5hOyaqeydhFxuICAgIC8vIOyDneuete2VnCDqsr3smrDsl5Drp4wg7KCA7J6l65CcIOuqqOuNuCt1c2FnZSDroZwg6rOE7IKw7ZWc64ukLlxuICAgIGlmIChcbiAgICAgIHBhcmFtcy5jb3N0X3VzZCA9PT0gdW5kZWZpbmVkICYmXG4gICAgICBwYXJhbXMuaW5wdXRfdG9rZW5zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHBhcmFtcy5vdXRwdXRfdG9rZW5zICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIGNvbnN0IHJvdyA9IGF3YWl0IHRoaXMuZ2V0UHVyaShcInJcIilcbiAgICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ3NcIilcbiAgICAgICAgLnNlbGVjdCh7IG1vZGVsX25hbWU6IFwibW9kZWxfbmFtZVwiIH0pXG4gICAgICAgIC53aGVyZShcImlkXCIsIHJlcXVlc3RMb2dJZClcbiAgICAgICAgLmZpcnN0KCk7XG4gICAgICBjb25zdCBlZmZlY3RpdmVNb2RlbE5hbWUgPSBwYXJhbXMubW9kZWxfbmFtZSA/PyByb3c/Lm1vZGVsX25hbWU7XG4gICAgICBpZiAoZWZmZWN0aXZlTW9kZWxOYW1lKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gY2Fub25pY2FsTW9kZWxOYW1lKGVmZmVjdGl2ZU1vZGVsTmFtZSk7XG4gICAgICAgIGNvbnN0IHVzYWdlID0gbm9ybWFsaXplZFVzYWdlRm9yQ29zdCh7XG4gICAgICAgICAgdG9rZW5fbmFtZTogcGFyYW1zLnRva2VuX25hbWUsXG4gICAgICAgICAgbW9kZWxfbmFtZTogZWZmZWN0aXZlTW9kZWxOYW1lLFxuICAgICAgICAgIGlucHV0X3Rva2VuczogcGFyYW1zLmlucHV0X3Rva2VucyxcbiAgICAgICAgICBvdXRwdXRfdG9rZW5zOiBwYXJhbXMub3V0cHV0X3Rva2VucyxcbiAgICAgICAgICBjYWNoZV9yZWFkX3Rva2VuczogcGFyYW1zLmNhY2hlX3JlYWRfdG9rZW5zID8/IDAsXG4gICAgICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBwYXJhbXMuY2FjaGVfY3JlYXRpb25fdG9rZW5zID8/IDAsXG4gICAgICAgICAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiBwYXJhbXMuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zLFxuICAgICAgICAgIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2VuczogcGFyYW1zLmNhY2hlX2NyZWF0aW9uXzFoX3Rva2VucyxcbiAgICAgICAgfSk7XG4gICAgICAgIHVwZGF0ZS5jb3N0X3VzZCA9IE1hdGgucm91bmQoXG4gICAgICAgICAgY2FsY3VsYXRlQ29zdFVzZChtb2RlbCwge1xuICAgICAgICAgICAgaW5wdXRUb2tlbnM6IHVzYWdlLmlucHV0VG9rZW5zLFxuICAgICAgICAgICAgb3V0cHV0VG9rZW5zOiB1c2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgICAgICAgICBjYWNoZWRJbnB1dFRva2VuczogdXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMsXG4gICAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IHVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VucyxcbiAgICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtOiB1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bSxcbiAgICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoOiB1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaCxcbiAgICAgICAgICB9KSAqIDFfMDAwXzAwMCxcbiAgICAgICAgKTtcbiAgICAgICAgdXBkYXRlLmNvc3Rfc291cmNlID0gXCJwcmljaW5nX3RhYmxlXCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICB3ZGIudWJSZWdpc3RlcihcInJlcXVlc3RfbG9nc1wiLCB1cGRhdGUpO1xuICAgIGF3YWl0IHdkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICBhd2FpdCB0cngudWJVcHNlcnQoXCJyZXF1ZXN0X2xvZ3NcIik7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBmaXJzdEdlbmVyYXRlU3RlcFR0ZnQocmVxdWVzdExvZ0lkOiBudW1iZXIpOiBQcm9taXNlPG51bWJlciB8IG51bGw+IHtcbiAgICBjb25zdCByb3cgPSBhd2FpdCB0aGlzLmdldFB1cmkoXCJyXCIpXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nX3N0ZXBzXCIpXG4gICAgICAuc2VsZWN0KHsgdHRmdF9tczogXCJ0dGZ0X21zXCIgfSlcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9nX2lkXCIsIHJlcXVlc3RMb2dJZClcbiAgICAgIC53aGVyZShcInR5cGVcIiwgXCJnZW5lcmF0ZVwiKVxuICAgICAgLndoZXJlKFwidHRmdF9tc1wiLCBcIiE9XCIsIG51bGwpXG4gICAgICAub3JkZXJCeShcInN0ZXBfaW5kZXhcIiwgXCJhc2NcIilcbiAgICAgIC5vcmRlckJ5KFwiaWRcIiwgXCJhc2NcIilcbiAgICAgIC5maXJzdCgpO1xuICAgIHJldHVybiByb3c/LnR0ZnRfbXMgPT09IG51bGwgfHwgcm93Py50dGZ0X21zID09PSB1bmRlZmluZWQgPyBudWxsIDogTnVtYmVyKHJvdy50dGZ0X21zKTtcbiAgfVxuXG4gIGFzeW5jIGFnZ3JlZ2F0ZVN0ZXBVc2FnZShyZXF1ZXN0TG9nSWQ6IG51bWJlcik6IFByb21pc2U8UmVxdWVzdExvZ1N0ZXBBZ2dyZWdhdGU+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5nZXRQdXJpKFwiclwiKVxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKVxuICAgICAgLnNlbGVjdChTVEVQX0FHR1JFR0FURV9TRUxFQ1QpXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19pZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAud2hlcmUoXCJ0eXBlXCIsIFwiZ2VuZXJhdGVcIik7XG4gICAgcmV0dXJuIGFnZ3JlZ2F0ZUdlbmVyYXRlU3RlcFJvd3Mocm93cyBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHN0YWxlIGNhbmRpZGF0ZXMsIHRoZW4gZXhwaXJlcyBlYWNoIHJ1biBpbiBpdHMgb3duIHNob3J0IHRyYW5zYWN0aW9uLlxuICAgKiBUaGUgY2FuZGlkYXRlIHF1ZXJ5IGlzIG9ubHkgYSBoaW50OyB0aGUgdHJhbnNhY3Rpb25hbCBvcGVyYXRpb24gcmVjaGVja3MgaXRcbiAgICogYWZ0ZXIgYWNxdWlyaW5nIHRoZSBhZHZpc29yeSBsb2NrIHNoYXJlZCB3aXRoIHRvb2wgZm9sbG93LXVwcy5cbiAgICovXG4gIGFzeW5jIGV4cGlyZVN0YWxlVG9vbFdhaXRpbmdSdW5zKFxuICAgIHRocmVzaG9sZE1zOiBudW1iZXIsXG4gICAgZXJyb3JNZXNzYWdlOiBzdHJpbmcsXG4gICAgbGltaXQ6IG51bWJlciA9IDEwLFxuICApOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgY29uc3QgdGhyZXNob2xkID0gbmV3IERhdGUoRGF0ZS5ub3coKSAtIHRocmVzaG9sZE1zKTtcbiAgICBjb25zdCBjYW5kaWRhdGVJZHMgPSBhd2FpdCB0aGlzLmZpbmRTdGFsZVRvb2xXYWl0aW5nUnVuQ2FuZGlkYXRlcyh0aHJlc2hvbGQsIGxpbWl0KTtcbiAgICBjb25zdCBleHBpcmVkSWRzOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcmVxdWVzdExvZ0lkIG9mIGNhbmRpZGF0ZUlkcykge1xuICAgICAgaWYgKGF3YWl0IHRoaXMudHJ5RXhwaXJlU3RhbGVUb29sV2FpdGluZ1J1bihyZXF1ZXN0TG9nSWQsIHRocmVzaG9sZCwgZXJyb3JNZXNzYWdlKSkge1xuICAgICAgICBleHBpcmVkSWRzLnB1c2gocmVxdWVzdExvZ0lkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGV4cGlyZWRJZHM7XG4gIH1cblxuICBhc3luYyBmaW5kU3RhbGVUb29sV2FpdGluZ1J1bkNhbmRpZGF0ZXModGhyZXNob2xkOiBEYXRlLCBsaW1pdDogbnVtYmVyKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0aGlzLmdldFB1cmkoXCJ3XCIpXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nc1wiKVxuICAgICAgLmpvaW4oXCJyZXF1ZXN0X2xvZ19zdGVwc1wiLCBcInJlcXVlc3RfbG9ncy5pZFwiLCBcInJlcXVlc3RfbG9nX3N0ZXBzLnJlcXVlc3RfbG9nX2lkXCIpXG4gICAgICAuZGlzdGluY3QoXCJyZXF1ZXN0X2xvZ3MuaWRcIilcbiAgICAgIC5zZWxlY3QoeyBpZDogXCJyZXF1ZXN0X2xvZ3MuaWRcIiB9KVxuICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dzLnN0YXR1c1wiLCBcInJ1bm5pbmdcIilcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9nX3N0ZXBzLnR5cGVcIiwgXCJ0b29sX2NhbGxcIilcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9nX3N0ZXBzLmNyZWF0ZWRfYXRcIiwgXCI8XCIsIHRocmVzaG9sZClcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9nX3N0ZXBzLnRvb2xfcmVzdWx0XCIsIG51bGwpXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19zdGVwcy5lcnJvclwiLCBudWxsKVxuICAgICAgLmxpbWl0KGxpbWl0KTtcbiAgICByZXR1cm4gcm93cy5tYXAoKHsgaWQgfSkgPT4gaWQpO1xuICB9XG5cbiAgQHRyYW5zYWN0aW9uYWwoeyBkYlByZXNldDogXCJ3XCIgfSlcbiAgYXN5bmMgdHJ5RXhwaXJlU3RhbGVUb29sV2FpdGluZ1J1bihcbiAgICByZXF1ZXN0TG9nSWQ6IG51bWJlcixcbiAgICB0aHJlc2hvbGQ6IERhdGUsXG4gICAgZXJyb3JNZXNzYWdlOiBzdHJpbmcsXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG4gICAgY29uc3QgbG9ja1Jlc3VsdCA9IChhd2FpdCB3ZGIua25leC5yYXcoXCJTRUxFQ1QgcGdfdHJ5X2Fkdmlzb3J5X3hhY3RfbG9jayg/LCA/KSBBUyBhY3F1aXJlZFwiLCBbXG4gICAgICBSRVFVRVNUX0xPR19SVU5fTE9DS19DTEFTU19JRCxcbiAgICAgIHJlcXVlc3RMb2dJZCxcbiAgICBdKSkgYXMgeyByb3dzPzogQXJyYXk8eyBhY3F1aXJlZD86IGJvb2xlYW4gfT4gfTtcbiAgICBpZiAobG9ja1Jlc3VsdC5yb3dzPy5bMF0/LmFjcXVpcmVkICE9PSB0cnVlKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBUaGUgZm9sbG93LXVwIHBhdGggdXNlcyB0aGUgc2FtZSB3cml0ZXIgdHJhbnNhY3Rpb24gbG9jay4gUmVjaGVjayBhZnRlclxuICAgIC8vIGxvY2tpbmcgc28gYSByZXN1bHQgY29tbWl0dGVkIGR1cmluZyBjYW5kaWRhdGUgZGlzY292ZXJ5IG1ha2VzIHRoaXMgYSBuby1vcC5cbiAgICBjb25zdCB1bnJlc29sdmVkID0gYXdhaXQgd2RiXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nX3N0ZXBzXCIpXG4gICAgICAuc2VsZWN0KHsgaWQ6IFwiaWRcIiB9KVxuICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dfaWRcIiwgcmVxdWVzdExvZ0lkKVxuICAgICAgLndoZXJlKFwidHlwZVwiLCBcInRvb2xfY2FsbFwiKVxuICAgICAgLndoZXJlKFwiY3JlYXRlZF9hdFwiLCBcIjxcIiwgdGhyZXNob2xkKVxuICAgICAgLndoZXJlKFwidG9vbF9yZXN1bHRcIiwgbnVsbClcbiAgICAgIC53aGVyZShcImVycm9yXCIsIG51bGwpXG4gICAgICAuZmlyc3QoKTtcbiAgICBpZiAoIXVucmVzb2x2ZWQpIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IHN0ZXBSb3dzID0gYXdhaXQgd2RiXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nX3N0ZXBzXCIpXG4gICAgICAuc2VsZWN0KFNURVBfQUdHUkVHQVRFX1NFTEVDVClcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9nX2lkXCIsIHJlcXVlc3RMb2dJZClcbiAgICAgIC53aGVyZShcInR5cGVcIiwgXCJnZW5lcmF0ZVwiKTtcbiAgICBjb25zdCBhZ2dyZWdhdGUgPSBhZ2dyZWdhdGVHZW5lcmF0ZVN0ZXBSb3dzKHN0ZXBSb3dzIGFzIEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pik7XG4gICAgY29uc3QgZmlyc3RUdGZ0ID0gYXdhaXQgd2RiXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nX3N0ZXBzXCIpXG4gICAgICAuc2VsZWN0KHsgdHRmdF9tczogXCJ0dGZ0X21zXCIgfSlcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9nX2lkXCIsIHJlcXVlc3RMb2dJZClcbiAgICAgIC53aGVyZShcInR5cGVcIiwgXCJnZW5lcmF0ZVwiKVxuICAgICAgLndoZXJlKFwidHRmdF9tc1wiLCBcIiE9XCIsIG51bGwpXG4gICAgICAub3JkZXJCeShcInN0ZXBfaW5kZXhcIiwgXCJhc2NcIilcbiAgICAgIC5vcmRlckJ5KFwiaWRcIiwgXCJhc2NcIilcbiAgICAgIC5maXJzdCgpO1xuXG4gICAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IHdkYlxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ3NcIilcbiAgICAgIC53aGVyZShcImlkXCIsIHJlcXVlc3RMb2dJZClcbiAgICAgIC53aGVyZShcInN0YXR1c1wiLCBcInJ1bm5pbmdcIilcbiAgICAgIC51cGRhdGUoe1xuICAgICAgICBzdGF0dXM6IFwiZXJyb3JcIixcbiAgICAgICAgZXJyb3JfbWVzc2FnZTogZXJyb3JNZXNzYWdlLFxuICAgICAgICBpbnB1dF90b2tlbnM6IGFnZ3JlZ2F0ZS5pbnB1dF90b2tlbnMsXG4gICAgICAgIG91dHB1dF90b2tlbnM6IGFnZ3JlZ2F0ZS5vdXRwdXRfdG9rZW5zLFxuICAgICAgICBjYWNoZV9yZWFkX3Rva2VuczogYWdncmVnYXRlLmNhY2hlX3JlYWRfdG9rZW5zLFxuICAgICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IGFnZ3JlZ2F0ZS5jYWNoZV9jcmVhdGlvbl90b2tlbnMsXG4gICAgICAgIC4uLihhZ2dyZWdhdGUuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHsgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiBhZ2dyZWdhdGUuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgLi4uKGFnZ3JlZ2F0ZS5jYWNoZV9jcmVhdGlvbl8xaF90b2tlbnMgIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8geyBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IGFnZ3JlZ2F0ZS5jYWNoZV9jcmVhdGlvbl8xaF90b2tlbnMgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgICBkdXJhdGlvbl9tczogYWdncmVnYXRlLmR1cmF0aW9uX21zLFxuICAgICAgICBmYWxsYmFja19jb3VudDogYWdncmVnYXRlLmZhbGxiYWNrX2NvdW50LFxuICAgICAgICBjb3N0X3VzZDogYWdncmVnYXRlLmNvc3RfdXNkLFxuICAgICAgICAuLi4oYWdncmVnYXRlLmNvc3Rfc291cmNlICE9PSB1bmRlZmluZWQgPyB7IGNvc3Rfc291cmNlOiBhZ2dyZWdhdGUuY29zdF9zb3VyY2UgfSA6IHt9KSxcbiAgICAgICAgdHRmdF9tczpcbiAgICAgICAgICBmaXJzdFR0ZnQ/LnR0ZnRfbXMgPT09IG51bGwgfHwgZmlyc3RUdGZ0Py50dGZ0X21zID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgOiBOdW1iZXIoZmlyc3RUdGZ0LnR0ZnRfbXMpLFxuICAgICAgfSk7XG4gICAgcmV0dXJuIHVwZGF0ZWQgPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgYSBuYXRpdmUgcWdyaWQgdG9vbCBmb2xsb3ctdXAgYW5kIGNvbXB1dGVzIGl0cyBuZXh0IHN0ZXAgaW5kZXggd2hpbGVcbiAgICogaG9sZGluZyB0aGUgcGVyLXJ1biBhZHZpc29yeSBsb2NrIHNoYXJlZCB3aXRoIHN0YWxlIGNsZWFudXAuXG4gICAqL1xuICBAdHJhbnNhY3Rpb25hbCh7IGRiUHJlc2V0OiBcIndcIiB9KVxuICBhc3luYyBjb250aW51ZVRvb2xSdW4oXG4gICAgcmVxdWVzdExvZ0lkOiBudW1iZXIsXG4gICAgdG9vbFJlc3VsdHM6IFRvb2xSZXN1bHRDb250aW51YXRpb25bXSxcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIGF3YWl0IHdkYi5rbmV4LnJhdyhcIlNFTEVDVCBwZ19hZHZpc29yeV94YWN0X2xvY2soPywgPylcIiwgW1xuICAgICAgUkVRVUVTVF9MT0dfUlVOX0xPQ0tfQ0xBU1NfSUQsXG4gICAgICByZXF1ZXN0TG9nSWQsXG4gICAgXSk7XG5cbiAgICBjb25zdCBydW4gPSBhd2FpdCB3ZGJcbiAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dzXCIpXG4gICAgICAuc2VsZWN0KHsgc3RhdHVzOiBcInN0YXR1c1wiIH0pXG4gICAgICAud2hlcmUoXCJpZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAuZmlyc3QoKTtcbiAgICBpZiAoIXJ1bikgdGhyb3cgbmV3IEVycm9yKGByZXF1ZXN0IGxvZyBydW4gJHtyZXF1ZXN0TG9nSWR9IG5vdCBmb3VuZGApO1xuICAgIGlmIChydW4uc3RhdHVzICE9PSBcInJ1bm5pbmdcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGByZXF1ZXN0IGxvZyBydW4gJHtyZXF1ZXN0TG9nSWR9IGlzIGFscmVhZHkgJHtydW4uc3RhdHVzfWApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHRvb2xSZXN1bHRzKSB7XG4gICAgICBhd2FpdCB3ZGJcbiAgICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKVxuICAgICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19pZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAgIC53aGVyZShcInRvb2xfY2FsbF9pZFwiLCByZXN1bHQudG9vbENhbGxJZClcbiAgICAgICAgLndoZXJlKFwidHlwZVwiLCBcInRvb2xfY2FsbFwiKVxuICAgICAgICAudXBkYXRlKHJlc3VsdC5pc0Vycm9yID8geyBlcnJvcjogcmVzdWx0Lm91dHB1dCB9IDogeyB0b29sX3Jlc3VsdDogcmVzdWx0Lm91dHB1dCB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByb3cgPSBhd2FpdCB3ZGJcbiAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dfc3RlcHNcIilcbiAgICAgIC5zZWxlY3QoeyBtYXhfc3RlcDogUHVyaS5tYXgoXCJzdGVwX2luZGV4XCIpIH0pXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19pZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAuZmlyc3QoKTtcbiAgICByZXR1cm4gKHJvdz8ubWF4X3N0ZXAgPz8gLTEpICsgMTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtmZTrqbQg7ZGc7Iuc7JqpIOy0nSDruYTsmqkuIOuqqeuhneqzvCDqsJnsnYAg7ZWE7YSw66W8IOyggeyaqe2VnOuLpC5cbiAgICpcbiAgICog7KCE7LK066W8IOyhsOqxtCDsl4bsnbQgU1VNIO2VnCDrkqQsIGBjb3N0X3NvdXJjZWAg6rCAIOyXhuuKlCBsZWdhY3kgcm93IOydmCDssKjslaHrp4wg67O07KCV7ZWc64ukLlxuICAgKiDsobDqsbQg7JeG64qUIFNVTSDsnbTslrTslbwgYChwcm9qZWN0X25hbWUsIGNvc3RfdXNkKWAg7Luk67KE66eBIOyduOuNseyKpOqwgCBJbmRleCBPbmx5IFNjYW4g7J2EXG4gICAqIO2DhOuLpCDigJQgYGNvc3Rfc291cmNlIElTIE5PVCBOVUxMYCDsnYQg6rG466m0IOq3uCDsu6zrn7zsnbQg7J24642x7Iqk7JeQIOyXhuyWtCBoZWFwIOydhCDri6Tsi5wg67SQ7JW8XG4gICAqIO2VmOuvgOuhnCDtlIzrnpjrhIjqsIAg7J24642x7Iqk66W8IOuyhOumrOqzoCBzZXEgc2NhbiDsnLzroZwg64+M7JWE6rCE64ukKOyLpOy4oSAyMzBtcyDihpIgODE0bXMpLlxuICAgKlxuICAgKiBsZWdhY3kg67O07KCV7J2EIOuCqOqyqOuRlCDsnbTsnKA6IOuwse2VhOuhnCDquLDsobQgbGVnYWN5IOuKlCAwIOydtCDrkJjsl4jsp4Drp4wsIOyZuOu2gCDroZzqsbDqsIBcbiAgICogYEFwcGVuZFN0ZXBJbnB1dGAvYEZpbmlzaFJ1bklucHV0YCDsnLzroZwgY29zdFNvdXJjZSDsl4bsnbQg64Sj7Jy866m0IOuLpOyLnCDsg53quLgg7IiYIOyeiOuLpC5cbiAgICog6re465+wIHJvdyDripQg7KCA7J6l6rCSIOuMgOyLoCDtmITsnqwg6rCA6rKp7ZGcIOyerOqzhOyCsOqwkuydtCDrp57snLzrr4DroZwg7LCo7JWh7J2EIOuNlO2VnOuLpC5cbiAgICpcbiAgICog7ZWE7YSwIOyhsOqxtOydhCDsl6zquLDshJwg64uk7IucIOq1rO2YhO2VmOyngCDslYrqs6AgYGFwcGx5TGlzdEZpbHRlcnNgIOulvCDqs7XsnKDtlZjripQg6rKD7J20IO2VteyLrOydtOuLpCDigJRcbiAgICog65GQIOy/vOumrOqwgCDqsIHsnpAg7ZWE7YSw66W8IOqwgOyngOuptCDtmZTrqbTsl5DshJwg7ZWE7YSw66W8IOqxuOyXiOydhCDrlYwg7ZaJIOyImOyZgCDruYTsmqnsnbQg7KGw7Jqp7Z6IIOyWtOq4i+uCnOuLpC5cbiAgICovXG4gIGFzeW5jIHRvdGFsQ29zdChyYXdQYXJhbXM6IFJlcXVlc3RMb2dMaXN0UGFyYW1zID0geyBudW06IDAsIHBhZ2U6IDEgfSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgbnVtOiAwLFxuICAgICAgcGFnZTogMSxcbiAgICAgIHNlYXJjaDogXCJpZFwiIGFzIGNvbnN0LFxuICAgICAgLi4ucmF3UGFyYW1zLFxuICAgIH0gc2F0aXNmaWVzIFJlcXVlc3RMb2dMaXN0UGFyYW1zO1xuXG4gICAgY29uc3QgeyBxYjogdG90YWxRYiB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKFwiQ1wiKTtcbiAgICB0aGlzLmFwcGx5TGlzdEZpbHRlcnModG90YWxRYiwgcGFyYW1zKTtcbiAgICAvLyBzdWJzZXQgcWIg64qUIOy7rOufvCDrqqnroZ3snbQg7J2066+4IFNFTEVDVCDsl5Ag67CV7ZiAIOyeiOyWtCDsp5Hqs4Trpbwg7Ja57Jy866m0IEdST1VQIEJZIOyXkOufrOqwgCDrgpzri6QuXG4gICAgLy8gZXhlY3V0ZUNvdW50UXVlcnkg7JmAIOqwmeydgCDrsKnsi53snLzroZwgc2VsZWN0IOulvCDruYTsmrDqs6Ag7KeR6rOE66eMIOuCqOq4tOuLpC5cbiAgICBjb25zdCBzdG9yZWQgPSBhd2FpdCB0b3RhbFFiXG4gICAgICAuY2xlYXIoXCJzZWxlY3RcIilcbiAgICAgIC8vIOydjOyImCDsoIDsnqXqsJIo6rO86rGwIOuyhOq3uCnsnYAgMCDsnLzroZwg64iM65+s7IScIOuNlO2VnOuLpCDigJQgSlMg7Kq9IE1hdGgubWF4IOyZgCDqsJnsnYAg6rec7LmZLlxuICAgICAgLnNlbGVjdCh7XG4gICAgICAgIHRvdGFsOiBQdXJpLnJhd051bWJlcihcIkNPQUxFU0NFKFNVTShHUkVBVEVTVChyZXF1ZXN0X2xvZ3MuY29zdF91c2QsIDApKSwgMClcIiksXG4gICAgICB9KVxuICAgICAgLmZpcnN0KCk7XG5cbiAgICBjb25zdCB7IHFiOiBsZWdhY3lRYiB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKFwiQ1wiKTtcbiAgICB0aGlzLmFwcGx5TGlzdEZpbHRlcnMobGVnYWN5UWIsIHBhcmFtcyk7XG4gICAgY29uc3QgbGVnYWN5Um93cyA9IGF3YWl0IGxlZ2FjeVFiXG4gICAgICAud2hlcmVSYXcoXCJyZXF1ZXN0X2xvZ3MuY29zdF9zb3VyY2UgSVMgTlVMTCBPUiByZXF1ZXN0X2xvZ3MuY29zdF91c2QgSVMgTlVMTFwiKVxuICAgICAgLmNsZWFyKFwic2VsZWN0XCIpXG4gICAgICAuc2VsZWN0KHtcbiAgICAgICAgdG9rZW5fbmFtZTogXCJyZXF1ZXN0X2xvZ3MudG9rZW5fbmFtZVwiLFxuICAgICAgICBtb2RlbF9uYW1lOiBcInJlcXVlc3RfbG9ncy5tb2RlbF9uYW1lXCIsXG4gICAgICAgIGlucHV0X3Rva2VuczogXCJyZXF1ZXN0X2xvZ3MuaW5wdXRfdG9rZW5zXCIsXG4gICAgICAgIG91dHB1dF90b2tlbnM6IFwicmVxdWVzdF9sb2dzLm91dHB1dF90b2tlbnNcIixcbiAgICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IFwicmVxdWVzdF9sb2dzLmNhY2hlX3JlYWRfdG9rZW5zXCIsXG4gICAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogXCJyZXF1ZXN0X2xvZ3MuY2FjaGVfY3JlYXRpb25fdG9rZW5zXCIsXG4gICAgICAgIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2VuczogXCJyZXF1ZXN0X2xvZ3MuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zXCIsXG4gICAgICAgIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2VuczogXCJyZXF1ZXN0X2xvZ3MuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zXCIsXG4gICAgICAgIGNvc3RfdXNkOiBcInJlcXVlc3RfbG9ncy5jb3N0X3VzZFwiLFxuICAgICAgfSk7XG5cbiAgICBjb25zdCBzdG9yZWRUb3RhbCA9IE51bWJlcihzdG9yZWQ/LnRvdGFsID8/IDApIC8gTUlDUk9fVVNEO1xuXG4gICAgLy8gbGVnYWN5IHJvdyDripQg7JyEIFNVTSDsl5Ag7KCA7J6l6rCS7Jy866GcIOydtOuvuCDtj6ztlajrkJjslrQg7J6I64ukLiDsnqzqs4TsgrDqsJLqs7zsnZgg7LCo7JWh66eMIOuNlO2VnOuLpC5cbiAgICByZXR1cm4gbGVnYWN5Um93cy5yZWR1Y2UoKHN1bSwgcm93KSA9PiB7XG4gICAgICBjb25zdCBhbHJlYWR5U3VtbWVkID0gTWF0aC5tYXgocm93LmNvc3RfdXNkID8/IDAsIDApIC8gTUlDUk9fVVNEO1xuICAgICAgY29uc3QgdXNhZ2UgPSBub3JtYWxpemVkVXNhZ2VGb3JDb3N0KHJvdyk7XG4gICAgICBpZiAoIXVzYWdlLm1vZGVsKSByZXR1cm4gc3VtO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgc3VtICtcbiAgICAgICAgY2FsY3VsYXRlQ29zdFVzZCh1c2FnZS5tb2RlbCwge1xuICAgICAgICAgIGlucHV0VG9rZW5zOiB1c2FnZS5pbnB1dFRva2VucyxcbiAgICAgICAgICBvdXRwdXRUb2tlbnM6IHVzYWdlLm91dHB1dFRva2VucyxcbiAgICAgICAgICBjYWNoZWRJbnB1dFRva2VuczogdXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMsXG4gICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiB1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMsXG4gICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zNW06IHVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtLFxuICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoOiB1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaCxcbiAgICAgICAgfSkgLVxuICAgICAgICBhbHJlYWR5U3VtbWVkXG4gICAgICApO1xuICAgIH0sIHN0b3JlZFRvdGFsKTtcbiAgfVxuXG4gIGFzeW5jIGRpc3RpbmN0UHJvamVjdE5hbWVzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5nZXRQdXJpKFwiclwiKVxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ3NcIilcbiAgICAgIC5kaXN0aW5jdChcInByb2plY3RfbmFtZVwiKVxuICAgICAgLndoZXJlKFwicHJvamVjdF9uYW1lXCIsIFwiIT1cIiwgbnVsbClcbiAgICAgIC5vcmRlckJ5KFwicHJvamVjdF9uYW1lXCIsIFwiYXNjXCIpXG4gICAgICAuc2VsZWN0KHtcbiAgICAgICAgcHJvamVjdF9uYW1lOiBcInByb2plY3RfbmFtZVwiLFxuICAgICAgfSk7XG4gICAgcmV0dXJuIHJvd3MubWFwKChyKSA9PiByLnByb2plY3RfbmFtZSEpO1xuICB9XG5cbiAgYXN5bmMgZGlzdGluY3RNb2RlbE5hbWVzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5nZXRQdXJpKFwiclwiKVxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ3NcIilcbiAgICAgIC5kaXN0aW5jdChcIm1vZGVsX25hbWVcIilcbiAgICAgIC53aGVyZShcIm1vZGVsX25hbWVcIiwgXCIhPVwiLCBudWxsKVxuICAgICAgLm9yZGVyQnkoXCJtb2RlbF9uYW1lXCIsIFwiYXNjXCIpXG4gICAgICAuc2VsZWN0KHtcbiAgICAgICAgbW9kZWxfbmFtZTogXCJtb2RlbF9uYW1lXCIsXG4gICAgICB9KTtcbiAgICByZXR1cm4gcm93cy5tYXAoKHIpID0+IHIubW9kZWxfbmFtZSEpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIGRlbChpZHM6IG51bWJlcltdKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuXG4gICAgLy8gdHJhbnNhY3Rpb25cbiAgICBhd2FpdCB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgYXdhaXQgdHJ4XG4gICAgICAgIC50YWJsZShcInJlcXVlc3RfbG9nX3N0ZXBzXCIpXG4gICAgICAgIC53aGVyZUluKFwicmVxdWVzdF9sb2dfc3RlcHMucmVxdWVzdF9sb2dfaWRcIiwgaWRzKVxuICAgICAgICAuZGVsZXRlKCk7XG4gICAgICByZXR1cm4gdHJ4LnRhYmxlKFwicmVxdWVzdF9sb2dzXCIpLndoZXJlSW4oXCJyZXF1ZXN0X2xvZ3MuaWRcIiwgaWRzKS5kZWxldGUoKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBpZHMubGVuZ3RoO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBSZXF1ZXN0TG9nTW9kZWwgPSBuZXcgUmVxdWVzdExvZ01vZGVsQ2xhc3MoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQTZCQSxNQUFhLFlBQVk7QUFDekIsTUFBTSxnQ0FBZ0M7QUFDdEMsTUFBTSx3QkFBd0I7QUFFOUIsU0FBUyxrQkFBa0IsT0FBd0M7Q0FDakUsSUFBSSxDQUFDLE9BQU8sT0FBTztDQUNuQixJQUFJLE9BQU8sVUFBVSxVQUFVLE9BQU87Q0FDdEMsSUFBSTtFQUNGLE9BQU8sS0FB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
@@ -2,6 +2,7 @@ import { monitLogSink } from "./application/monit/log-buffer.js";
2
2
  import { QgridDispatcher } from "./application/qgrid/qgrid.dispatcher.js";
3
3
  import { loadSettings, setSettingChangeHandler } from "./application/setting/setting.store.js";
4
4
  import { rescheduleExpiredTokenReminder, startExpiredTokenReminder, stopExpiredTokenReminder } from "./application/qgrid/expired-token-reminder.js";
5
+ import { stopOpenAICallbackRelay } from "./utils/providers/openai/openai-callback-relay.js";
5
6
  import { QgridFrame } from "./application/qgrid/qgrid.frame.js";
6
7
  import { TokenSubscriber } from "./application/qgrid/token-subscriber.js";
7
8
  import { ensureTokensTrigger } from "./application/qgrid/token-trigger-setup.js";
@@ -186,6 +187,7 @@ var sonamu_config_default = defineConfig({
186
187
  const log = getLogger(["qgrid", "startup"]);
187
188
  stopExpiredTokenReminder();
188
189
  stopTokenWindowKeepalive();
190
+ stopOpenAICallbackRelay();
189
191
  setSettingChangeHandler(null);
190
192
  QgridDispatcher.subscriber?.setTokenChangeHandler(null);
191
193
  if (QgridDispatcher.openaiDispatcher) await QgridDispatcher.openaiDispatcher.stop();
@@ -202,4 +204,4 @@ var sonamu_config_default = defineConfig({
202
204
  //#endregion
203
205
  export { sonamu_config_default as default };
204
206
 
205
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LmNvbmZpZy5qcyIsIm5hbWVzIjpbImNhY2hlRHJpdmVycyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9zb25hbXUuY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IGdldENvbnNvbGVTaW5rIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyBnZXRQcmV0dHlGb3JtYXR0ZXIgfSBmcm9tIFwiQGxvZ3RhcGUvcHJldHR5XCI7XG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlSZXBseSwgdHlwZSBGYXN0aWZ5UmVxdWVzdCB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgeyBDYWNoZVByZXNldHMsIGRlZmluZUNvbmZpZyB9IGZyb20gXCJzb25hbXVcIjtcbmltcG9ydCB7IGRyaXZlcnMgYXMgY2FjaGVEcml2ZXJzLCBzdG9yZSB9IGZyb20gXCJzb25hbXUvY2FjaGVcIjtcblxuaW1wb3J0IHsgbW9uaXRMb2dTaW5rIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vbW9uaXQvbG9nLWJ1ZmZlclwiO1xuaW1wb3J0IHtcbiAgcmVzY2hlZHVsZUV4cGlyZWRUb2tlblJlbWluZGVyLFxuICBzdGFydEV4cGlyZWRUb2tlblJlbWluZGVyLFxuICBzdG9wRXhwaXJlZFRva2VuUmVtaW5kZXIsXG59IGZyb20gXCIuL2FwcGxpY2F0aW9uL3FncmlkL2V4cGlyZWQtdG9rZW4tcmVtaW5kZXJcIjtcbmltcG9ydCB7IFFncmlkRGlzcGF0Y2hlciB9IGZyb20gXCIuL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLmRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IFFncmlkRnJhbWUgfSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC5mcmFtZVwiO1xuaW1wb3J0IHsgVG9rZW5TdWJzY3JpYmVyIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vcWdyaWQvdG9rZW4tc3Vic2NyaWJlclwiO1xuaW1wb3J0IHsgZW5zdXJlVG9rZW5zVHJpZ2dlciB9IGZyb20gXCIuL2FwcGxpY2F0aW9uL3FncmlkL3Rva2VuLXRyaWdnZXItc2V0dXBcIjtcbmltcG9ydCB7XG4gIHJlc2NoZWR1bGVUb2tlbldpbmRvd0tlZXBhbGl2ZSxcbiAgc3RhcnRUb2tlbldpbmRvd0tlZXBhbGl2ZSxcbiAgc3RvcFRva2VuV2luZG93S2VlcGFsaXZlLFxufSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC90b2tlbi13aW5kb3cta2VlcGFsaXZlXCI7XG5pbXBvcnQgeyBsb2FkU2V0dGluZ3MsIHNldFNldHRpbmdDaGFuZ2VIYW5kbGVyIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vc2V0dGluZy9zZXR0aW5nLnN0b3JlXCI7XG5pbXBvcnQgeyBoYW5kbGVTZXJ2ZXJFcnJvciB9IGZyb20gXCIuL3NlcnZlci1lcnJvci1oYW5kbGVyXCI7XG5pbXBvcnQgeyBBbnRocm9waWNEaXNwYXRjaGVyIH0gZnJvbSBcIi4vdXRpbHMvcHJvdmlkZXJzL2FudGhyb3BpYy9hbnRocm9waWMtZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgT3BlbkFJRGlzcGF0Y2hlciB9IGZyb20gXCIuL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpc3BhdGNoZXJcIjtcblxuY29uc3QgaG9zdCA9IHByb2Nlc3MuZW52LkhPU1QgPz8gXCJsb2NhbGhvc3RcIjtcbmNvbnN0IHBvcnQgPSBOdW1iZXIocHJvY2Vzcy5lbnYuUE9SVCA/PyA0NDkwMCk7XG5cbmNvbnN0IGNvbm5Db25maWcgPSB7XG4gIGhvc3Q6IHByb2Nlc3MuZW52LlNPTkFNVV9EQl9IT1NUID8/IFwibG9jYWxob3N0XCIsXG4gIHBvcnQ6IE51bWJlcihwcm9jZXNzLmVudi5TT05BTVVfREJfUE9SVCA/PyA1NDMyKSxcbiAgdXNlcjogcHJvY2Vzcy5lbnYuU09OQU1VX0RCX1VTRVIgPz8gXCJwb3N0Z3Jlc1wiLFxuICBwYXNzd29yZDogcHJvY2Vzcy5lbnYuU09OQU1VX0RCX1BBU1NXT1JEID8/IFwicG9zdGdyZXNcIixcbiAgZGF0YWJhc2U6IHByb2Nlc3MuZW52LlNPTkFNVV9EQl9OQU1FID8/IFwicWdyaWRcIixcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7XG4gIHByb2plY3ROYW1lOiBwcm9jZXNzLmVudi5QUk9KRUNUX05BTUUgPz8gXCJRZ3JpZFwiLFxuICBkYXRhYmFzZToge1xuICAgIGRlZmF1bHRPcHRpb25zOiB7XG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLmNvbm5Db25maWcsXG4gICAgICAgIGtlZXBBbGl2ZTogdHJ1ZSxcbiAgICAgICAga2VlcEFsaXZlSW5pdGlhbERlbGF5TWlsbGlzOiAxMDAwMCxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgYXBpOiB7XG4gICAgZGlyOiBcImFwaVwiLFxuICAgIHRpbWV6b25lOiBcIkFzaWEvU2VvdWxcIixcbiAgICByb3V0ZToge1xuICAgICAgcHJlZml4OiBcIi9hcGlcIixcbiAgICB9LFxuICB9LFxuICBpMThuOiB7XG4gICAgZGVmYXVsdExvY2FsZTogXCJrb1wiLFxuICAgIHN1cHBvcnRlZExvY2FsZXM6IFtcImtvXCIsIFwiZW5cIl0sXG4gIH0sXG4gIHN5bmM6IHtcbiAgICB0YXJnZXRzOiBbXCJ3ZWJcIl0sXG4gIH0sXG4gIHRlc3Q6IHtcbiAgICBwYXJhbGxlbDogdHJ1ZSxcbiAgICBtYXhXb3JrZXJzOiA0LFxuICAgIGRldlJ1bm5lcjogeyBlbmFibGVkOiB0cnVlIH0sXG4gIH0sXG4gIGxvZ2dpbmc6IHtcbiAgICBzaW5rczoge1xuICAgICAgY29uc29sZTogZ2V0Q29uc29sZVNpbmsoe1xuICAgICAgICBmb3JtYXR0ZXI6IGdldFByZXR0eUZvcm1hdHRlcih7XG4gICAgICAgICAgdGltZXN0YW1wOiBcInRpbWVcIixcbiAgICAgICAgICBjYXRlZ29yeVdpZHRoOiAyMCxcbiAgICAgICAgICBjYXRlZ29yeVRydW5jYXRlOiBcIm1pZGRsZVwiLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgICAgLy8gTW9uaXQg7YOt7JqpIGluLW1lbW9yeSByaW5nIGJ1ZmZlci4g7Y+s66e37J2AIHNpbmsg67OEIOKAlCDsvZjshpQg7Lac66Cl7J2AIOq3uOuMgOuhnOuLpC5cbiAgICAgIG1vbml0OiBtb25pdExvZ1NpbmssXG4gICAgfSxcbiAgICBsb2dnZXJzOiBbXG4gICAgICAvLyBxZ3JpZCDroZzqt7ggKOyalOyyrSDrtoTrsLAsIG9hdXRoL3VzYWdlIEFQSSlcbiAgICAgIHsgY2F0ZWdvcnk6IFtcInFncmlkXCJdLCBzaW5rczogW1wiY29uc29sZVwiLCBcIm1vbml0XCJdLCBsb3dlc3RMZXZlbDogXCJpbmZvXCIgfSxcbiAgICAgIC8vIHNvbmFtdSDroZzqt7jripQgd2FybmluZyDsnbTsg4Hrp4xcbiAgICAgIHsgY2F0ZWdvcnk6IFtcInNvbmFtdVwiXSwgc2lua3M6IFtcImNvbnNvbGVcIiwgXCJtb25pdFwiXSwgbG93ZXN0TGV2ZWw6IFwid2FybmluZ1wiIH0sXG4gICAgICAvLyBmYXN0aWZ5IOuhnOq3uCDssKjri6hcbiAgICAgIHsgY2F0ZWdvcnk6IFtcImZhc3RpZnlcIl0sIHNpbmtzOiBbXSwgbG93ZXN0TGV2ZWw6IFwiZmF0YWxcIiB9LFxuICAgIF0sXG4gIH0sXG4gIHNlcnZlcjoge1xuICAgIGxpc3RlbjogeyBwb3J0LCBob3N0IH0sXG4gICAgZmFzdGlmeToge1xuICAgICAgYm9keUxpbWl0OiAxMCAqIDEwMjQgKiAxMDI0LFxuICAgIH0sXG4gICAgcGx1Z2luczoge1xuICAgICAgZm9ybWJvZHk6IHRydWUsXG4gICAgICBxczogdHJ1ZSxcbiAgICAgIHNzZTogdHJ1ZSxcbiAgICAgIG11bHRpcGFydDogeyBsaW1pdHM6IHsgZmlsZVNpemU6IDEwMjQgKiAxMDI0ICogMzAgfSB9LFxuICAgICAgc3RhdGljOiB7XG4gICAgICAgIHJvb3Q6IHBhdGguam9pbihpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi8uLi9cIiwgXCJwdWJsaWNcIiksXG4gICAgICAgIHByZWZpeDogXCIvYXBpL3B1YmxpY1wiLFxuICAgICAgfSxcbiAgICAgIGN1c3RvbTogKHNlcnZlcikgPT4ge1xuICAgICAgICBjb25zdCBvYXV0aENhbGxiYWNrID0gYXN5bmMgKHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LCByZXBseTogRmFzdGlmeVJlcGx5KSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBjb2RlLCBzdGF0ZSB9ID0gcmVxdWVzdC5xdWVyeSBhcyB7IGNvZGU/OiBzdHJpbmc7IHN0YXRlPzogc3RyaW5nIH07XG4gICAgICAgICAgaWYgKCFjb2RlIHx8ICFzdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcGx5LnJlZGlyZWN0KFwiLz9vYXV0aD1lcnJvciZyZWFzb249bWlzc2luZ19wYXJhbXNcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gUWdyaWRGcmFtZS5oYW5kbGVPQXV0aENhbGxiYWNrKGNvZGUsIHN0YXRlLCByZXBseSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoXCIvP29hdXRoPWVycm9yJnJlYXNvbj1jYWxsYmFja19mYWlsZWRcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBzZXJ2ZXIuZ2V0KFwiL2NhbGxiYWNrXCIsIG9hdXRoQ2FsbGJhY2spO1xuICAgICAgICBzZXJ2ZXIuZ2V0KFwiL2F1dGgvY2FsbGJhY2tcIiwgb2F1dGhDYWxsYmFjayk7XG4gICAgICB9LFxuICAgIH0sXG4gICAgYXBpQ29uZmlnOiB7XG4gICAgICBjb250ZXh0UHJvdmlkZXI6IChkZWZhdWx0Q29udGV4dCwgcmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmRlZmF1bHRDb250ZXh0LFxuICAgICAgICAgIGlwOiByZXF1ZXN0LmlwLFxuICAgICAgICAgIGJvZHk6IHJlcXVlc3QuYm9keSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBndWFyZEhhbmRsZXI6ICgpID0+IHt9LFxuICAgICAgY2FjaGVDb250cm9sSGFuZGxlcjogKHJlcSkgPT4ge1xuICAgICAgICBzd2l0Y2ggKHJlcS50eXBlKSB7XG4gICAgICAgICAgY2FzZSBcImFzc2V0c1wiOlxuICAgICAgICAgICAgLy8gSGFzaCDtj6ztlajrkJwg7YyM7J28OiDsmIHqtawg7LqQ7IucXG4gICAgICAgICAgICBpZiAocmVxLnBhdGgubWF0Y2goLy1bYS1mMC05XStcXC4vKSkge1xuICAgICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLmltbXV0YWJsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMubG9uZ0xpdmVkO1xuXG4gICAgICAgICAgY2FzZSBcImFwaVwiOlxuICAgICAgICAgICAgLy8gR0VUIOyalOyyreunjCDsupDsi7Eg6rOg66CkXG4gICAgICAgICAgICBpZiAocmVxLm1ldGhvZCA9PT0gXCJHRVRcIikge1xuICAgICAgICAgICAgICAvLyDtirnsoJUg6rK966Gc64qUIOynp+ydgCDsupDsi5xcbiAgICAgICAgICAgICAgaWYgKHJlcS5wYXRoLnN0YXJ0c1dpdGgoXCIvYXBpL3N0YXRpYy1kYXRhXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5zaG9ydExpdmVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChyZXEucGF0aC5zdGFydHNXaXRoKFwiL2FwaS90ZXJtc1wiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMubWVkaXVtTGl2ZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIOq4sOuzuDog7LqQ7IucIOyXhuydjFxuICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5ub0NhY2hlO1xuXG4gICAgICAgICAgY2FzZSBcInNzclwiOlxuICAgICAgICAgICAgLy8gU1NSIO2OmOydtOyngDogMTDstIgg7LqQ7IucXG4gICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLnNzcjtcblxuICAgICAgICAgIGNhc2UgXCJjc3JcIjpcbiAgICAgICAgICAgIC8vIENTUiBmYWxsYmFjayAoaW5kZXguaHRtbCk6IDHrtoQg7LqQ7IucXG4gICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLnNob3J0TGl2ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5ub0NhY2hlO1xuICAgICAgfSxcbiAgICB9LFxuICAgIGNhY2hlOiB7XG4gICAgICBkZWZhdWx0OiBcIm1haW5cIixcbiAgICAgIHN0b3Jlczoge1xuICAgICAgICBtYWluOiBzdG9yZSgpLnVzZUwxTGF5ZXIoY2FjaGVEcml2ZXJzLm1lbW9yeSh7IG1heFNpemU6IFwiNTBtYlwiIH0pKSxcbiAgICAgIH0sXG4gICAgICB0dGw6IFwiNW1cIixcbiAgICAgIHByZWZpeDogXCJcIixcbiAgICB9LFxuICAgIGxpZmVjeWNsZToge1xuICAgICAgb25TdGFydDogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBsb2cgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJzdGFydHVwXCJdKTtcblxuICAgICAgICAvLyBkaXNwYXRjaGVyIOqwgCDsg53shLHsnpDsl5DshJwg7JuM7LukIOyEpOygleydhCDsnb3snLzrr4DroZwg6re4IOyghOyXkCDsmKzroKTslbwg7ZWc64ukLlxuICAgICAgICBhd2FpdCBsb2FkU2V0dGluZ3MoKTtcbiAgICAgICAgLy8g65+w7YOA7J6EIOyEpOyglSDshozruYTsnpDrpbwg7IOB7JyEIOqzhOy4teyXkOyEnCDsl7DqsrDtlbQgc2V0dGluZyDrqqjrk4jsnbQgcWdyaWQg66W8IOyXreywuOyhsO2VmOyngCDslYrqsowg7ZWc64ukLlxuICAgICAgICBzZXRTZXR0aW5nQ2hhbmdlSGFuZGxlcigoa2V5KSA9PiB7XG4gICAgICAgICAgaWYgKGtleSA9PT0gXCJzbGFjay5leHBpcnlSZW1pbmRlck1pbnV0ZXNcIiB8fCBrZXkgPT09IFwic2xhY2sucmVtaW5kZXJzRW5hYmxlZFwiKSB7XG4gICAgICAgICAgICByZXNjaGVkdWxlRXhwaXJlZFRva2VuUmVtaW5kZXIoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGtleSA9PT0gXCJxZ3JpZC50b2tlbldpbmRvd0tlZXBhbGl2ZUVuYWJsZWRcIikge1xuICAgICAgICAgICAgdm9pZCByZXNjaGVkdWxlVG9rZW5XaW5kb3dLZWVwYWxpdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCB0cmlnZ2VyUmVhZHkgPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGVuc3VyZVRva2Vuc1RyaWdnZXIoY29ubkNvbmZpZyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0cmlnZ2VyUmVhZHkgPSBmYWxzZTtcbiAgICAgICAgICBsb2cud2FybihgdHJpZ2dlciBzZXR1cCBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdWJzY3JpYmVyID0gbmV3IFRva2VuU3Vic2NyaWJlcihjb25uQ29uZmlnLCBRZ3JpZERpc3BhdGNoZXIpO1xuICAgICAgICBRZ3JpZERpc3BhdGNoZXIuc3Vic2NyaWJlciA9IHN1YnNjcmliZXI7XG5cbiAgICAgICAgY29uc3Qgc3RhcnRlZCA9IGF3YWl0IHN1YnNjcmliZXIuc3RhcnQoKTtcblxuICAgICAgICAvLyDquLDrj5kg7IOB7YOc66W8IOuCqOq4tOuLpCDigJQgSFRUUCDripQg7J2066+4IOyXtOugpCDsnojslrTshJwsIOykgOu5hCDsoIQg7JqU7LKt7J20IFwi7J6g7IucIO2bhCDrkJjripTsp4BcIlxuICAgICAgICAvLyBcIuyerOyLnOuPhO2VtOuPhCDslYgg65CY64qU7KeAXCLrpbwg6rWs67aE7ZW0IOydkeuLte2VtOyVvCDtlZzri6QoNTAzIHZzIDUwMCkuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgb3BlbmFpRGlzcGF0Y2hlciA9IG5ldyBPcGVuQUlEaXNwYXRjaGVyKCk7XG4gICAgICAgICAgYXdhaXQgb3BlbmFpRGlzcGF0Y2hlci5zdGFydCgpO1xuICAgICAgICAgIFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyID0gb3BlbmFpRGlzcGF0Y2hlcjtcbiAgICAgICAgICBRZ3JpZERpc3BhdGNoZXIuc3RhcnR1cFN0YXRlLm9wZW5haSA9IFwicmVhZHlcIjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIFFncmlkRGlzcGF0Y2hlci5zdGFydHVwU3RhdGUub3BlbmFpID0gXCJmYWlsZWRcIjtcbiAgICAgICAgICBsb2cud2Fybihgb3BlbmFpIGRpc3BhdGNoZXIgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBhbnRocm9waWNEaXNwYXRjaGVyID0gbmV3IEFudGhyb3BpY0Rpc3BhdGNoZXIoKTtcbiAgICAgICAgICBhd2FpdCBhbnRocm9waWNEaXNwYXRjaGVyLnN0YXJ0KCk7XG4gICAgICAgICAgUWdyaWREaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXIgPSBhbnRocm9waWNEaXNwYXRjaGVyO1xuICAgICAgICAgIFFncmlkRGlzcGF0Y2hlci5zdGFydHVwU3RhdGUuYW50aHJvcGljID0gXCJyZWFkeVwiO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgUWdyaWREaXNwYXRjaGVyLnN0YXJ0dXBTdGF0ZS5hbnRocm9waWMgPSBcImZhaWxlZFwiO1xuICAgICAgICAgIGxvZy53YXJuKGBhbnRocm9waWMgZGlzcGF0Y2hlciBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBzdWJzY3JpYmVyLnNldFRva2VuQ2hhbmdlSGFuZGxlcigoKSA9PiB7XG4gICAgICAgICAgdm9pZCByZXNjaGVkdWxlVG9rZW5XaW5kb3dLZWVwYWxpdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN0YXJ0RXhwaXJlZFRva2VuUmVtaW5kZXIoKTtcbiAgICAgICAgdm9pZCBzdGFydFRva2VuV2luZG93S2VlcGFsaXZlKCk7XG5cbiAgICAgICAgY29uc3QgYW50aHJvcGljQ291bnQgPSBRZ3JpZERpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlcj8udG9rZW5Db3VudCA/PyAwO1xuICAgICAgICBjb25zdCBvcGVuYWlDb3VudCA9IFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyPy50b2tlbkNvdW50ID8/IDA7XG5cbiAgICAgICAgbG9nLmluZm8oYGxpc3RlbmluZyBvbiBodHRwOi8vJHtob3N0fToke3BvcnR9YCk7XG4gICAgICAgIGxvZy5pbmZvKGBhbnRocm9waWM6ICR7YW50aHJvcGljQ291bnR9IHRva2VucyByZWFkeWApO1xuICAgICAgICBsb2cuaW5mbyhgb3BlbmFpOiAke29wZW5haUNvdW50fSB0b2tlbnMgcmVhZHlgKTtcbiAgICAgICAgbG9nLmluZm8oXG4gICAgICAgICAgYHN1YnNjcmliZXI6ICR7c3RhcnRlZCA/IFwiTElTVEVOIGFjdGl2ZVwiIDogXCJkZWdyYWRlZFwifSR7dHJpZ2dlclJlYWR5ID8gXCJcIiA6IFwiLCB0cmlnZ2VyIGZhaWxlZFwifWAsXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgb25TaHV0ZG93bjogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBsb2cgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJzdGFydHVwXCJdKTtcbiAgICAgICAgc3RvcEV4cGlyZWRUb2tlblJlbWluZGVyKCk7XG4gICAgICAgIHN0b3BUb2tlbldpbmRvd0tlZXBhbGl2ZSgpO1xuICAgICAgICBzZXRTZXR0aW5nQ2hhbmdlSGFuZGxlcihudWxsKTtcbiAgICAgICAgUWdyaWREaXNwYXRjaGVyLnN1YnNjcmliZXI/LnNldFRva2VuQ2hhbmdlSGFuZGxlcihudWxsKTtcbiAgICAgICAgaWYgKFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyKSB7XG4gICAgICAgICAgYXdhaXQgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXIuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChRZ3JpZERpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlcikge1xuICAgICAgICAgIGF3YWl0IFFncmlkRGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoUWdyaWREaXNwYXRjaGVyLnN1YnNjcmliZXIpIHtcbiAgICAgICAgICBhd2FpdCBRZ3JpZERpc3BhdGNoZXIuc3Vic2NyaWJlci5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nLmluZm8oXCJncmFjZWZ1bCBzaHV0ZG93blwiKTtcbiAgICAgIH0sXG4gICAgICBvbkVycm9yOiAoZXJyb3IsIF9yZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBoYW5kbGVTZXJ2ZXJFcnJvcihlcnJvciwgcmVwbHkpO1xuICAgICAgfSxcbiAgICB9LFxuICB9LFxufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkJBLE1BQU0sT0FBTyxRQUFRLElBQUksUUFBUTtBQUNqQyxNQUFNLE9BQU8sT0FBTyxRQUFRLElBQUksUUFBUSxLQUFLO0FBRTdDLE1BQU0sYUFBYTtDQUNqQixNQUFNLFFBQVEsSUFBSSxrQkFBa0I7Q0FDcEMsTUFBTSxPQUFPLFFBQVEsSUFBSSxrQkFBa0IsSUFBSTtDQUMvQyxNQUFNLFFBQVEsSUFBSSxrQkFBa0I7Q0FDcEMsVUFBVSxRQUFRLElBQUksc0JBQXNCO0NBQzVDLFVBQVUsUUFBUSxJQUFJLGtCQUFrQjtBQUMxQztBQUVBLElBQUEsd0JBQWUsYUFBYTtDQUMxQixhQUFhLFFBQVEsSUFBSSxn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
207
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LmNvbmZpZy5qcyIsIm5hbWVzIjpbImNhY2hlRHJpdmVycyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9zb25hbXUuY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IGdldENvbnNvbGVTaW5rIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyBnZXRQcmV0dHlGb3JtYXR0ZXIgfSBmcm9tIFwiQGxvZ3RhcGUvcHJldHR5XCI7XG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlSZXBseSwgdHlwZSBGYXN0aWZ5UmVxdWVzdCB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgeyBDYWNoZVByZXNldHMsIGRlZmluZUNvbmZpZyB9IGZyb20gXCJzb25hbXVcIjtcbmltcG9ydCB7IGRyaXZlcnMgYXMgY2FjaGVEcml2ZXJzLCBzdG9yZSB9IGZyb20gXCJzb25hbXUvY2FjaGVcIjtcblxuaW1wb3J0IHsgbW9uaXRMb2dTaW5rIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vbW9uaXQvbG9nLWJ1ZmZlclwiO1xuaW1wb3J0IHtcbiAgcmVzY2hlZHVsZUV4cGlyZWRUb2tlblJlbWluZGVyLFxuICBzdGFydEV4cGlyZWRUb2tlblJlbWluZGVyLFxuICBzdG9wRXhwaXJlZFRva2VuUmVtaW5kZXIsXG59IGZyb20gXCIuL2FwcGxpY2F0aW9uL3FncmlkL2V4cGlyZWQtdG9rZW4tcmVtaW5kZXJcIjtcbmltcG9ydCB7IFFncmlkRGlzcGF0Y2hlciB9IGZyb20gXCIuL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLmRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IFFncmlkRnJhbWUgfSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC5mcmFtZVwiO1xuaW1wb3J0IHsgVG9rZW5TdWJzY3JpYmVyIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vcWdyaWQvdG9rZW4tc3Vic2NyaWJlclwiO1xuaW1wb3J0IHsgZW5zdXJlVG9rZW5zVHJpZ2dlciB9IGZyb20gXCIuL2FwcGxpY2F0aW9uL3FncmlkL3Rva2VuLXRyaWdnZXItc2V0dXBcIjtcbmltcG9ydCB7XG4gIHJlc2NoZWR1bGVUb2tlbldpbmRvd0tlZXBhbGl2ZSxcbiAgc3RhcnRUb2tlbldpbmRvd0tlZXBhbGl2ZSxcbiAgc3RvcFRva2VuV2luZG93S2VlcGFsaXZlLFxufSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC90b2tlbi13aW5kb3cta2VlcGFsaXZlXCI7XG5pbXBvcnQgeyBsb2FkU2V0dGluZ3MsIHNldFNldHRpbmdDaGFuZ2VIYW5kbGVyIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vc2V0dGluZy9zZXR0aW5nLnN0b3JlXCI7XG5pbXBvcnQgeyBoYW5kbGVTZXJ2ZXJFcnJvciB9IGZyb20gXCIuL3NlcnZlci1lcnJvci1oYW5kbGVyXCI7XG5pbXBvcnQgeyBBbnRocm9waWNEaXNwYXRjaGVyIH0gZnJvbSBcIi4vdXRpbHMvcHJvdmlkZXJzL2FudGhyb3BpYy9hbnRocm9waWMtZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgc3RvcE9wZW5BSUNhbGxiYWNrUmVsYXkgfSBmcm9tIFwiLi91dGlscy9wcm92aWRlcnMvb3BlbmFpL29wZW5haS1jYWxsYmFjay1yZWxheVwiO1xuaW1wb3J0IHsgT3BlbkFJRGlzcGF0Y2hlciB9IGZyb20gXCIuL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpc3BhdGNoZXJcIjtcblxuY29uc3QgaG9zdCA9IHByb2Nlc3MuZW52LkhPU1QgPz8gXCJsb2NhbGhvc3RcIjtcbmNvbnN0IHBvcnQgPSBOdW1iZXIocHJvY2Vzcy5lbnYuUE9SVCA/PyA0NDkwMCk7XG5cbmNvbnN0IGNvbm5Db25maWcgPSB7XG4gIGhvc3Q6IHByb2Nlc3MuZW52LlNPTkFNVV9EQl9IT1NUID8/IFwibG9jYWxob3N0XCIsXG4gIHBvcnQ6IE51bWJlcihwcm9jZXNzLmVudi5TT05BTVVfREJfUE9SVCA/PyA1NDMyKSxcbiAgdXNlcjogcHJvY2Vzcy5lbnYuU09OQU1VX0RCX1VTRVIgPz8gXCJwb3N0Z3Jlc1wiLFxuICBwYXNzd29yZDogcHJvY2Vzcy5lbnYuU09OQU1VX0RCX1BBU1NXT1JEID8/IFwicG9zdGdyZXNcIixcbiAgZGF0YWJhc2U6IHByb2Nlc3MuZW52LlNPTkFNVV9EQl9OQU1FID8/IFwicWdyaWRcIixcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7XG4gIHByb2plY3ROYW1lOiBwcm9jZXNzLmVudi5QUk9KRUNUX05BTUUgPz8gXCJRZ3JpZFwiLFxuICBkYXRhYmFzZToge1xuICAgIGRlZmF1bHRPcHRpb25zOiB7XG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLmNvbm5Db25maWcsXG4gICAgICAgIGtlZXBBbGl2ZTogdHJ1ZSxcbiAgICAgICAga2VlcEFsaXZlSW5pdGlhbERlbGF5TWlsbGlzOiAxMDAwMCxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgYXBpOiB7XG4gICAgZGlyOiBcImFwaVwiLFxuICAgIHRpbWV6b25lOiBcIkFzaWEvU2VvdWxcIixcbiAgICByb3V0ZToge1xuICAgICAgcHJlZml4OiBcIi9hcGlcIixcbiAgICB9LFxuICB9LFxuICBpMThuOiB7XG4gICAgZGVmYXVsdExvY2FsZTogXCJrb1wiLFxuICAgIHN1cHBvcnRlZExvY2FsZXM6IFtcImtvXCIsIFwiZW5cIl0sXG4gIH0sXG4gIHN5bmM6IHtcbiAgICB0YXJnZXRzOiBbXCJ3ZWJcIl0sXG4gIH0sXG4gIHRlc3Q6IHtcbiAgICBwYXJhbGxlbDogdHJ1ZSxcbiAgICBtYXhXb3JrZXJzOiA0LFxuICAgIGRldlJ1bm5lcjogeyBlbmFibGVkOiB0cnVlIH0sXG4gIH0sXG4gIGxvZ2dpbmc6IHtcbiAgICBzaW5rczoge1xuICAgICAgY29uc29sZTogZ2V0Q29uc29sZVNpbmsoe1xuICAgICAgICBmb3JtYXR0ZXI6IGdldFByZXR0eUZvcm1hdHRlcih7XG4gICAgICAgICAgdGltZXN0YW1wOiBcInRpbWVcIixcbiAgICAgICAgICBjYXRlZ29yeVdpZHRoOiAyMCxcbiAgICAgICAgICBjYXRlZ29yeVRydW5jYXRlOiBcIm1pZGRsZVwiLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgICAgLy8gTW9uaXQg7YOt7JqpIGluLW1lbW9yeSByaW5nIGJ1ZmZlci4g7Y+s66e37J2AIHNpbmsg67OEIOKAlCDsvZjshpQg7Lac66Cl7J2AIOq3uOuMgOuhnOuLpC5cbiAgICAgIG1vbml0OiBtb25pdExvZ1NpbmssXG4gICAgfSxcbiAgICBsb2dnZXJzOiBbXG4gICAgICAvLyBxZ3JpZCDroZzqt7ggKOyalOyyrSDrtoTrsLAsIG9hdXRoL3VzYWdlIEFQSSlcbiAgICAgIHsgY2F0ZWdvcnk6IFtcInFncmlkXCJdLCBzaW5rczogW1wiY29uc29sZVwiLCBcIm1vbml0XCJdLCBsb3dlc3RMZXZlbDogXCJpbmZvXCIgfSxcbiAgICAgIC8vIHNvbmFtdSDroZzqt7jripQgd2FybmluZyDsnbTsg4Hrp4xcbiAgICAgIHsgY2F0ZWdvcnk6IFtcInNvbmFtdVwiXSwgc2lua3M6IFtcImNvbnNvbGVcIiwgXCJtb25pdFwiXSwgbG93ZXN0TGV2ZWw6IFwid2FybmluZ1wiIH0sXG4gICAgICAvLyBmYXN0aWZ5IOuhnOq3uCDssKjri6hcbiAgICAgIHsgY2F0ZWdvcnk6IFtcImZhc3RpZnlcIl0sIHNpbmtzOiBbXSwgbG93ZXN0TGV2ZWw6IFwiZmF0YWxcIiB9LFxuICAgIF0sXG4gIH0sXG4gIHNlcnZlcjoge1xuICAgIGxpc3RlbjogeyBwb3J0LCBob3N0IH0sXG4gICAgZmFzdGlmeToge1xuICAgICAgYm9keUxpbWl0OiAxMCAqIDEwMjQgKiAxMDI0LFxuICAgIH0sXG4gICAgcGx1Z2luczoge1xuICAgICAgZm9ybWJvZHk6IHRydWUsXG4gICAgICBxczogdHJ1ZSxcbiAgICAgIHNzZTogdHJ1ZSxcbiAgICAgIG11bHRpcGFydDogeyBsaW1pdHM6IHsgZmlsZVNpemU6IDEwMjQgKiAxMDI0ICogMzAgfSB9LFxuICAgICAgc3RhdGljOiB7XG4gICAgICAgIHJvb3Q6IHBhdGguam9pbihpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi8uLi9cIiwgXCJwdWJsaWNcIiksXG4gICAgICAgIHByZWZpeDogXCIvYXBpL3B1YmxpY1wiLFxuICAgICAgfSxcbiAgICAgIGN1c3RvbTogKHNlcnZlcikgPT4ge1xuICAgICAgICBjb25zdCBvYXV0aENhbGxiYWNrID0gYXN5bmMgKHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LCByZXBseTogRmFzdGlmeVJlcGx5KSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBjb2RlLCBzdGF0ZSB9ID0gcmVxdWVzdC5xdWVyeSBhcyB7IGNvZGU/OiBzdHJpbmc7IHN0YXRlPzogc3RyaW5nIH07XG4gICAgICAgICAgaWYgKCFjb2RlIHx8ICFzdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcGx5LnJlZGlyZWN0KFwiLz9vYXV0aD1lcnJvciZyZWFzb249bWlzc2luZ19wYXJhbXNcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gUWdyaWRGcmFtZS5oYW5kbGVPQXV0aENhbGxiYWNrKGNvZGUsIHN0YXRlLCByZXBseSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoXCIvP29hdXRoPWVycm9yJnJlYXNvbj1jYWxsYmFja19mYWlsZWRcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBzZXJ2ZXIuZ2V0KFwiL2NhbGxiYWNrXCIsIG9hdXRoQ2FsbGJhY2spO1xuICAgICAgICBzZXJ2ZXIuZ2V0KFwiL2F1dGgvY2FsbGJhY2tcIiwgb2F1dGhDYWxsYmFjayk7XG4gICAgICB9LFxuICAgIH0sXG4gICAgYXBpQ29uZmlnOiB7XG4gICAgICBjb250ZXh0UHJvdmlkZXI6IChkZWZhdWx0Q29udGV4dCwgcmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmRlZmF1bHRDb250ZXh0LFxuICAgICAgICAgIGlwOiByZXF1ZXN0LmlwLFxuICAgICAgICAgIGJvZHk6IHJlcXVlc3QuYm9keSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBndWFyZEhhbmRsZXI6ICgpID0+IHt9LFxuICAgICAgY2FjaGVDb250cm9sSGFuZGxlcjogKHJlcSkgPT4ge1xuICAgICAgICBzd2l0Y2ggKHJlcS50eXBlKSB7XG4gICAgICAgICAgY2FzZSBcImFzc2V0c1wiOlxuICAgICAgICAgICAgLy8gSGFzaCDtj6ztlajrkJwg7YyM7J28OiDsmIHqtawg7LqQ7IucXG4gICAgICAgICAgICBpZiAocmVxLnBhdGgubWF0Y2goLy1bYS1mMC05XStcXC4vKSkge1xuICAgICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLmltbXV0YWJsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMubG9uZ0xpdmVkO1xuXG4gICAgICAgICAgY2FzZSBcImFwaVwiOlxuICAgICAgICAgICAgLy8gR0VUIOyalOyyreunjCDsupDsi7Eg6rOg66CkXG4gICAgICAgICAgICBpZiAocmVxLm1ldGhvZCA9PT0gXCJHRVRcIikge1xuICAgICAgICAgICAgICAvLyDtirnsoJUg6rK966Gc64qUIOynp+ydgCDsupDsi5xcbiAgICAgICAgICAgICAgaWYgKHJlcS5wYXRoLnN0YXJ0c1dpdGgoXCIvYXBpL3N0YXRpYy1kYXRhXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5zaG9ydExpdmVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChyZXEucGF0aC5zdGFydHNXaXRoKFwiL2FwaS90ZXJtc1wiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMubWVkaXVtTGl2ZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIOq4sOuzuDog7LqQ7IucIOyXhuydjFxuICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5ub0NhY2hlO1xuXG4gICAgICAgICAgY2FzZSBcInNzclwiOlxuICAgICAgICAgICAgLy8gU1NSIO2OmOydtOyngDogMTDstIgg7LqQ7IucXG4gICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLnNzcjtcblxuICAgICAgICAgIGNhc2UgXCJjc3JcIjpcbiAgICAgICAgICAgIC8vIENTUiBmYWxsYmFjayAoaW5kZXguaHRtbCk6IDHrtoQg7LqQ7IucXG4gICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLnNob3J0TGl2ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5ub0NhY2hlO1xuICAgICAgfSxcbiAgICB9LFxuICAgIGNhY2hlOiB7XG4gICAgICBkZWZhdWx0OiBcIm1haW5cIixcbiAgICAgIHN0b3Jlczoge1xuICAgICAgICBtYWluOiBzdG9yZSgpLnVzZUwxTGF5ZXIoY2FjaGVEcml2ZXJzLm1lbW9yeSh7IG1heFNpemU6IFwiNTBtYlwiIH0pKSxcbiAgICAgIH0sXG4gICAgICB0dGw6IFwiNW1cIixcbiAgICAgIHByZWZpeDogXCJcIixcbiAgICB9LFxuICAgIGxpZmVjeWNsZToge1xuICAgICAgb25TdGFydDogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBsb2cgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJzdGFydHVwXCJdKTtcblxuICAgICAgICAvLyBkaXNwYXRjaGVyIOqwgCDsg53shLHsnpDsl5DshJwg7JuM7LukIOyEpOygleydhCDsnb3snLzrr4DroZwg6re4IOyghOyXkCDsmKzroKTslbwg7ZWc64ukLlxuICAgICAgICBhd2FpdCBsb2FkU2V0dGluZ3MoKTtcbiAgICAgICAgLy8g65+w7YOA7J6EIOyEpOyglSDshozruYTsnpDrpbwg7IOB7JyEIOqzhOy4teyXkOyEnCDsl7DqsrDtlbQgc2V0dGluZyDrqqjrk4jsnbQgcWdyaWQg66W8IOyXreywuOyhsO2VmOyngCDslYrqsowg7ZWc64ukLlxuICAgICAgICBzZXRTZXR0aW5nQ2hhbmdlSGFuZGxlcigoa2V5KSA9PiB7XG4gICAgICAgICAgaWYgKGtleSA9PT0gXCJzbGFjay5leHBpcnlSZW1pbmRlck1pbnV0ZXNcIiB8fCBrZXkgPT09IFwic2xhY2sucmVtaW5kZXJzRW5hYmxlZFwiKSB7XG4gICAgICAgICAgICByZXNjaGVkdWxlRXhwaXJlZFRva2VuUmVtaW5kZXIoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGtleSA9PT0gXCJxZ3JpZC50b2tlbldpbmRvd0tlZXBhbGl2ZUVuYWJsZWRcIikge1xuICAgICAgICAgICAgdm9pZCByZXNjaGVkdWxlVG9rZW5XaW5kb3dLZWVwYWxpdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCB0cmlnZ2VyUmVhZHkgPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGVuc3VyZVRva2Vuc1RyaWdnZXIoY29ubkNvbmZpZyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0cmlnZ2VyUmVhZHkgPSBmYWxzZTtcbiAgICAgICAgICBsb2cud2FybihgdHJpZ2dlciBzZXR1cCBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdWJzY3JpYmVyID0gbmV3IFRva2VuU3Vic2NyaWJlcihjb25uQ29uZmlnLCBRZ3JpZERpc3BhdGNoZXIpO1xuICAgICAgICBRZ3JpZERpc3BhdGNoZXIuc3Vic2NyaWJlciA9IHN1YnNjcmliZXI7XG5cbiAgICAgICAgY29uc3Qgc3RhcnRlZCA9IGF3YWl0IHN1YnNjcmliZXIuc3RhcnQoKTtcblxuICAgICAgICAvLyDquLDrj5kg7IOB7YOc66W8IOuCqOq4tOuLpCDigJQgSFRUUCDripQg7J2066+4IOyXtOugpCDsnojslrTshJwsIOykgOu5hCDsoIQg7JqU7LKt7J20IFwi7J6g7IucIO2bhCDrkJjripTsp4BcIlxuICAgICAgICAvLyBcIuyerOyLnOuPhO2VtOuPhCDslYgg65CY64qU7KeAXCLrpbwg6rWs67aE7ZW0IOydkeuLte2VtOyVvCDtlZzri6QoNTAzIHZzIDUwMCkuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgb3BlbmFpRGlzcGF0Y2hlciA9IG5ldyBPcGVuQUlEaXNwYXRjaGVyKCk7XG4gICAgICAgICAgYXdhaXQgb3BlbmFpRGlzcGF0Y2hlci5zdGFydCgpO1xuICAgICAgICAgIFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyID0gb3BlbmFpRGlzcGF0Y2hlcjtcbiAgICAgICAgICBRZ3JpZERpc3BhdGNoZXIuc3RhcnR1cFN0YXRlLm9wZW5haSA9IFwicmVhZHlcIjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIFFncmlkRGlzcGF0Y2hlci5zdGFydHVwU3RhdGUub3BlbmFpID0gXCJmYWlsZWRcIjtcbiAgICAgICAgICBsb2cud2Fybihgb3BlbmFpIGRpc3BhdGNoZXIgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBhbnRocm9waWNEaXNwYXRjaGVyID0gbmV3IEFudGhyb3BpY0Rpc3BhdGNoZXIoKTtcbiAgICAgICAgICBhd2FpdCBhbnRocm9waWNEaXNwYXRjaGVyLnN0YXJ0KCk7XG4gICAgICAgICAgUWdyaWREaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXIgPSBhbnRocm9waWNEaXNwYXRjaGVyO1xuICAgICAgICAgIFFncmlkRGlzcGF0Y2hlci5zdGFydHVwU3RhdGUuYW50aHJvcGljID0gXCJyZWFkeVwiO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgUWdyaWREaXNwYXRjaGVyLnN0YXJ0dXBTdGF0ZS5hbnRocm9waWMgPSBcImZhaWxlZFwiO1xuICAgICAgICAgIGxvZy53YXJuKGBhbnRocm9waWMgZGlzcGF0Y2hlciBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBzdWJzY3JpYmVyLnNldFRva2VuQ2hhbmdlSGFuZGxlcigoKSA9PiB7XG4gICAgICAgICAgdm9pZCByZXNjaGVkdWxlVG9rZW5XaW5kb3dLZWVwYWxpdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN0YXJ0RXhwaXJlZFRva2VuUmVtaW5kZXIoKTtcbiAgICAgICAgdm9pZCBzdGFydFRva2VuV2luZG93S2VlcGFsaXZlKCk7XG5cbiAgICAgICAgY29uc3QgYW50aHJvcGljQ291bnQgPSBRZ3JpZERpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlcj8udG9rZW5Db3VudCA/PyAwO1xuICAgICAgICBjb25zdCBvcGVuYWlDb3VudCA9IFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyPy50b2tlbkNvdW50ID8/IDA7XG5cbiAgICAgICAgbG9nLmluZm8oYGxpc3RlbmluZyBvbiBodHRwOi8vJHtob3N0fToke3BvcnR9YCk7XG4gICAgICAgIGxvZy5pbmZvKGBhbnRocm9waWM6ICR7YW50aHJvcGljQ291bnR9IHRva2VucyByZWFkeWApO1xuICAgICAgICBsb2cuaW5mbyhgb3BlbmFpOiAke29wZW5haUNvdW50fSB0b2tlbnMgcmVhZHlgKTtcbiAgICAgICAgbG9nLmluZm8oXG4gICAgICAgICAgYHN1YnNjcmliZXI6ICR7c3RhcnRlZCA/IFwiTElTVEVOIGFjdGl2ZVwiIDogXCJkZWdyYWRlZFwifSR7dHJpZ2dlclJlYWR5ID8gXCJcIiA6IFwiLCB0cmlnZ2VyIGZhaWxlZFwifWAsXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgb25TaHV0ZG93bjogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBsb2cgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJzdGFydHVwXCJdKTtcbiAgICAgICAgc3RvcEV4cGlyZWRUb2tlblJlbWluZGVyKCk7XG4gICAgICAgIHN0b3BUb2tlbldpbmRvd0tlZXBhbGl2ZSgpO1xuICAgICAgICBzdG9wT3BlbkFJQ2FsbGJhY2tSZWxheSgpO1xuICAgICAgICBzZXRTZXR0aW5nQ2hhbmdlSGFuZGxlcihudWxsKTtcbiAgICAgICAgUWdyaWREaXNwYXRjaGVyLnN1YnNjcmliZXI/LnNldFRva2VuQ2hhbmdlSGFuZGxlcihudWxsKTtcbiAgICAgICAgaWYgKFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyKSB7XG4gICAgICAgICAgYXdhaXQgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXIuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChRZ3JpZERpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlcikge1xuICAgICAgICAgIGF3YWl0IFFncmlkRGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoUWdyaWREaXNwYXRjaGVyLnN1YnNjcmliZXIpIHtcbiAgICAgICAgICBhd2FpdCBRZ3JpZERpc3BhdGNoZXIuc3Vic2NyaWJlci5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nLmluZm8oXCJncmFjZWZ1bCBzaHV0ZG93blwiKTtcbiAgICAgIH0sXG4gICAgICBvbkVycm9yOiAoZXJyb3IsIF9yZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBoYW5kbGVTZXJ2ZXJFcnJvcihlcnJvciwgcmVwbHkpO1xuICAgICAgfSxcbiAgICB9LFxuICB9LFxufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQThCQSxNQUFNLE9BQU8sUUFBUSxJQUFJLFFBQVE7QUFDakMsTUFBTSxPQUFPLE9BQU8sUUFBUSxJQUFJLFFBQVEsS0FBSztBQUU3QyxNQUFNLGFBQWE7Q0FDakIsTUFBTSxRQUFRLElBQUksa0JBQWtCO0NBQ3BDLE1BQU0sT0FBTyxRQUFRLElBQUksa0JBQWtCLElBQUk7Q0FD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
@@ -0,0 +1,86 @@
1
+ import { getLogger } from "@logtape/logtape";
2
+ import http from "node:http";
3
+ //#region src/utils/providers/openai/openai-callback-relay.ts
4
+ const logger = getLogger(["qgrid", "oauth"]);
5
+ /**
6
+ * OpenAI matches the Codex CLI client's redirect URIs by exact string, and only these two loopback
7
+ * callbacks are registered. Any other host, port, or path makes /oauth/authorize fail with
8
+ * `invalid_authorize_request` before the login screen renders, so qgrid cannot point the callback
9
+ * at its own configurable server port. Keep in sync with the Codex CLI allow-list (default 1455,
10
+ * fallback 1457).
11
+ */
12
+ const OPENAI_CALLBACK_PORTS = [1455, 1457];
13
+ const OPENAI_CALLBACK_PATH = "/auth/callback";
14
+ function openAICallbackRedirectUri(port) {
15
+ return `http://localhost:${port}${OPENAI_CALLBACK_PATH}`;
16
+ }
17
+ let relay = null;
18
+ function forward(request, response) {
19
+ const current = relay;
20
+ const incoming = new URL(request.url ?? "/", "http://localhost");
21
+ if (!current || incoming.pathname !== "/auth/callback") {
22
+ response.writeHead(404, { "Content-Type": "text/plain; charset=utf-8" });
23
+ response.end("not found");
24
+ return;
25
+ }
26
+ const target = new URL(OPENAI_CALLBACK_PATH, current.dashboardBase);
27
+ for (const field of ["code", "state"]) {
28
+ const value = incoming.searchParams.get(field);
29
+ if (value) target.searchParams.set(field, value);
30
+ }
31
+ response.writeHead(302, {
32
+ Location: target.toString(),
33
+ "Cache-Control": "no-store"
34
+ });
35
+ response.end();
36
+ }
37
+ function listenOn(port) {
38
+ return new Promise((resolve, reject) => {
39
+ const server = http.createServer(forward);
40
+ server.once("error", (error) => {
41
+ server.close();
42
+ if (error.code === "EADDRINUSE" || error.code === "EACCES") resolve(null);
43
+ else reject(error);
44
+ });
45
+ server.listen(port, "127.0.0.1", () => resolve(server));
46
+ });
47
+ }
48
+ /**
49
+ * Opens a short-lived loopback listener on a registered Codex callback port and forwards the
50
+ * authorization code to qgrid own callback route. Returns the redirect URI to put in the authorize
51
+ * request. Repeated logins reuse the running listener and refresh its lifetime.
52
+ */
53
+ async function startOpenAICallbackRelay(dashboardBase, ttlMs, ports = OPENAI_CALLBACK_PORTS) {
54
+ if (relay) {
55
+ relay.dashboardBase = dashboardBase;
56
+ relay.expiryTimer.refresh();
57
+ return relay.redirectUri;
58
+ }
59
+ for (const port of ports) {
60
+ const server = await listenOn(port);
61
+ if (!server) continue;
62
+ const expiryTimer = setTimeout(() => stopOpenAICallbackRelay(), ttlMs);
63
+ expiryTimer.unref();
64
+ const address = server.address();
65
+ const boundPort = typeof address === "object" && address ? address.port : port;
66
+ relay = {
67
+ server,
68
+ redirectUri: openAICallbackRedirectUri(boundPort),
69
+ dashboardBase,
70
+ expiryTimer
71
+ };
72
+ logger.info(`openai oauth callback relay listening on 127.0.0.1:${boundPort}`);
73
+ return relay.redirectUri;
74
+ }
75
+ throw new Error(`OPENAI_CALLBACK_PORTS_UNAVAILABLE_${ports.join("_")}`);
76
+ }
77
+ function stopOpenAICallbackRelay() {
78
+ if (!relay) return;
79
+ clearTimeout(relay.expiryTimer);
80
+ relay.server.close();
81
+ relay = null;
82
+ }
83
+ //#endregion
84
+ export { OPENAI_CALLBACK_PATH, OPENAI_CALLBACK_PORTS, openAICallbackRedirectUri, startOpenAICallbackRelay, stopOpenAICallbackRelay };
85
+
86
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWNhbGxiYWNrLXJlbGF5LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wcm92aWRlcnMvb3BlbmFpL29wZW5haS1jYWxsYmFjay1yZWxheS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgaHR0cCBmcm9tIFwibm9kZTpodHRwXCI7XG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcIm9hdXRoXCJdKTtcblxuLyoqXG4gKiBPcGVuQUkgbWF0Y2hlcyB0aGUgQ29kZXggQ0xJIGNsaWVudCdzIHJlZGlyZWN0IFVSSXMgYnkgZXhhY3Qgc3RyaW5nLCBhbmQgb25seSB0aGVzZSB0d28gbG9vcGJhY2tcbiAqIGNhbGxiYWNrcyBhcmUgcmVnaXN0ZXJlZC4gQW55IG90aGVyIGhvc3QsIHBvcnQsIG9yIHBhdGggbWFrZXMgL29hdXRoL2F1dGhvcml6ZSBmYWlsIHdpdGhcbiAqIGBpbnZhbGlkX2F1dGhvcml6ZV9yZXF1ZXN0YCBiZWZvcmUgdGhlIGxvZ2luIHNjcmVlbiByZW5kZXJzLCBzbyBxZ3JpZCBjYW5ub3QgcG9pbnQgdGhlIGNhbGxiYWNrXG4gKiBhdCBpdHMgb3duIGNvbmZpZ3VyYWJsZSBzZXJ2ZXIgcG9ydC4gS2VlcCBpbiBzeW5jIHdpdGggdGhlIENvZGV4IENMSSBhbGxvdy1saXN0IChkZWZhdWx0IDE0NTUsXG4gKiBmYWxsYmFjayAxNDU3KS5cbiAqL1xuZXhwb3J0IGNvbnN0IE9QRU5BSV9DQUxMQkFDS19QT1JUUyA9IFsxNDU1LCAxNDU3XSBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBPUEVOQUlfQ0FMTEJBQ0tfUEFUSCA9IFwiL2F1dGgvY2FsbGJhY2tcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIG9wZW5BSUNhbGxiYWNrUmVkaXJlY3RVcmkocG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBodHRwOi8vbG9jYWxob3N0OiR7cG9ydH0ke09QRU5BSV9DQUxMQkFDS19QQVRIfWA7XG59XG5cbnR5cGUgUmVsYXkgPSB7XG4gIHNlcnZlcjogaHR0cC5TZXJ2ZXI7XG4gIHJlZGlyZWN0VXJpOiBzdHJpbmc7XG4gIGRhc2hib2FyZEJhc2U6IHN0cmluZztcbiAgZXhwaXJ5VGltZXI6IE5vZGVKUy5UaW1lb3V0O1xufTtcblxubGV0IHJlbGF5OiBSZWxheSB8IG51bGwgPSBudWxsO1xuXG5mdW5jdGlvbiBmb3J3YXJkKHJlcXVlc3Q6IGh0dHAuSW5jb21pbmdNZXNzYWdlLCByZXNwb25zZTogaHR0cC5TZXJ2ZXJSZXNwb25zZSk6IHZvaWQge1xuICBjb25zdCBjdXJyZW50ID0gcmVsYXk7XG4gIGNvbnN0IGluY29taW5nID0gbmV3IFVSTChyZXF1ZXN0LnVybCA/PyBcIi9cIiwgXCJodHRwOi8vbG9jYWxob3N0XCIpO1xuICBpZiAoIWN1cnJlbnQgfHwgaW5jb21pbmcucGF0aG5hbWUgIT09IE9QRU5BSV9DQUxMQkFDS19QQVRIKSB7XG4gICAgcmVzcG9uc2Uud3JpdGVIZWFkKDQwNCwgeyBcIkNvbnRlbnQtVHlwZVwiOiBcInRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLThcIiB9KTtcbiAgICByZXNwb25zZS5lbmQoXCJub3QgZm91bmRcIik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gT25seSB0aGUgdHdvIE9BdXRoIHJlc3VsdCBmaWVsZHMgY3Jvc3Mgb3Zlciwgb250byBhIGZpeGVkIGxvb3BiYWNrIGJhc2UuIFRoZSByZXF1ZXN0IG5ldmVyXG4gIC8vIGNvbnRyaWJ1dGVzIHNjaGVtZSwgYXV0aG9yaXR5LCBvciBwYXRoIGJ5dGVzIHRvIHRoZSByZWRpcmVjdCB0YXJnZXQuXG4gIGNvbnN0IHRhcmdldCA9IG5ldyBVUkwoT1BFTkFJX0NBTExCQUNLX1BBVEgsIGN1cnJlbnQuZGFzaGJvYXJkQmFzZSk7XG4gIGZvciAoY29uc3QgZmllbGQgb2YgW1wiY29kZVwiLCBcInN0YXRlXCJdIGFzIGNvbnN0KSB7XG4gICAgY29uc3QgdmFsdWUgPSBpbmNvbWluZy5zZWFyY2hQYXJhbXMuZ2V0KGZpZWxkKTtcbiAgICBpZiAodmFsdWUpIHRhcmdldC5zZWFyY2hQYXJhbXMuc2V0KGZpZWxkLCB2YWx1ZSk7XG4gIH1cbiAgcmVzcG9uc2Uud3JpdGVIZWFkKDMwMiwgeyBMb2NhdGlvbjogdGFyZ2V0LnRvU3RyaW5nKCksIFwiQ2FjaGUtQ29udHJvbFwiOiBcIm5vLXN0b3JlXCIgfSk7XG4gIHJlc3BvbnNlLmVuZCgpO1xufVxuXG5mdW5jdGlvbiBsaXN0ZW5Pbihwb3J0OiBudW1iZXIpOiBQcm9taXNlPGh0dHAuU2VydmVyIHwgbnVsbD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHNlcnZlciA9IGh0dHAuY3JlYXRlU2VydmVyKGZvcndhcmQpO1xuICAgIHNlcnZlci5vbmNlKFwiZXJyb3JcIiwgKGVycm9yOiBOb2RlSlMuRXJybm9FeGNlcHRpb24pID0+IHtcbiAgICAgIHNlcnZlci5jbG9zZSgpO1xuICAgICAgaWYgKGVycm9yLmNvZGUgPT09IFwiRUFERFJJTlVTRVwiIHx8IGVycm9yLmNvZGUgPT09IFwiRUFDQ0VTXCIpIHJlc29sdmUobnVsbCk7XG4gICAgICBlbHNlIHJlamVjdChlcnJvcik7XG4gICAgfSk7XG4gICAgLy8gQmluZCBsb29wYmFjayBvbmx5LCBsaWtlIHRoZSBDb2RleCBDTEk6IHRoZSByZWxheSBtdXN0IG5vdCBiZSByZWFjaGFibGUgb2ZmLWhvc3QuXG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCBcIjEyNy4wLjAuMVwiLCAoKSA9PiByZXNvbHZlKHNlcnZlcikpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBPcGVucyBhIHNob3J0LWxpdmVkIGxvb3BiYWNrIGxpc3RlbmVyIG9uIGEgcmVnaXN0ZXJlZCBDb2RleCBjYWxsYmFjayBwb3J0IGFuZCBmb3J3YXJkcyB0aGVcbiAqIGF1dGhvcml6YXRpb24gY29kZSB0byBxZ3JpZCBvd24gY2FsbGJhY2sgcm91dGUuIFJldHVybnMgdGhlIHJlZGlyZWN0IFVSSSB0byBwdXQgaW4gdGhlIGF1dGhvcml6ZVxuICogcmVxdWVzdC4gUmVwZWF0ZWQgbG9naW5zIHJldXNlIHRoZSBydW5uaW5nIGxpc3RlbmVyIGFuZCByZWZyZXNoIGl0cyBsaWZldGltZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0T3BlbkFJQ2FsbGJhY2tSZWxheShcbiAgZGFzaGJvYXJkQmFzZTogc3RyaW5nLFxuICB0dGxNczogbnVtYmVyLFxuICBwb3J0czogcmVhZG9ubHkgbnVtYmVyW10gPSBPUEVOQUlfQ0FMTEJBQ0tfUE9SVFMsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAocmVsYXkpIHtcbiAgICByZWxheS5kYXNoYm9hcmRCYXNlID0gZGFzaGJvYXJkQmFzZTtcbiAgICByZWxheS5leHBpcnlUaW1lci5yZWZyZXNoKCk7XG4gICAgcmV0dXJuIHJlbGF5LnJlZGlyZWN0VXJpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwb3J0IG9mIHBvcnRzKSB7XG4gICAgY29uc3Qgc2VydmVyID0gYXdhaXQgbGlzdGVuT24ocG9ydCk7XG4gICAgaWYgKCFzZXJ2ZXIpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgZXhwaXJ5VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHN0b3BPcGVuQUlDYWxsYmFja1JlbGF5KCksIHR0bE1zKTtcbiAgICBleHBpcnlUaW1lci51bnJlZigpO1xuICAgIGNvbnN0IGFkZHJlc3MgPSBzZXJ2ZXIuYWRkcmVzcygpO1xuICAgIGNvbnN0IGJvdW5kUG9ydCA9IHR5cGVvZiBhZGRyZXNzID09PSBcIm9iamVjdFwiICYmIGFkZHJlc3MgPyBhZGRyZXNzLnBvcnQgOiBwb3J0O1xuICAgIHJlbGF5ID0ge1xuICAgICAgc2VydmVyLFxuICAgICAgcmVkaXJlY3RVcmk6IG9wZW5BSUNhbGxiYWNrUmVkaXJlY3RVcmkoYm91bmRQb3J0KSxcbiAgICAgIGRhc2hib2FyZEJhc2UsXG4gICAgICBleHBpcnlUaW1lcixcbiAgICB9O1xuICAgIGxvZ2dlci5pbmZvKGBvcGVuYWkgb2F1dGggY2FsbGJhY2sgcmVsYXkgbGlzdGVuaW5nIG9uIDEyNy4wLjAuMToke2JvdW5kUG9ydH1gKTtcbiAgICByZXR1cm4gcmVsYXkucmVkaXJlY3RVcmk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYE9QRU5BSV9DQUxMQkFDS19QT1JUU19VTkFWQUlMQUJMRV8ke3BvcnRzLmpvaW4oXCJfXCIpfWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RvcE9wZW5BSUNhbGxiYWNrUmVsYXkoKTogdm9pZCB7XG4gIGlmICghcmVsYXkpIHJldHVybjtcbiAgY2xlYXJUaW1lb3V0KHJlbGF5LmV4cGlyeVRpbWVyKTtcbiAgcmVsYXkuc2VydmVyLmNsb3NlKCk7XG4gIHJlbGF5ID0gbnVsbDtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7O0FBSUEsTUFBTSxTQUFTLFVBQVUsQ0FBQyxTQUFTLE9BQU8sQ0FBQzs7Ozs7Ozs7QUFTM0MsTUFBYSx3QkFBd0IsQ0FBQyxNQUFNLElBQUk7QUFDaEQsTUFBYSx1QkFBdUI7QUFFcEMsU0FBZ0IsMEJBQTBCLE1BQXNCO0NBQzlELE9BQU8sb0JBQW9CLE9BQU87QUFDcEM7QUFTQSxJQUFJLFFBQXNCO0FBRTFCLFNBQVMsUUFBUSxTQUErQixVQUFxQztDQUNuRixNQUFNLFVBQVU7Q0FDaEIsTUFBTSxXQUFXLElBQUksSUFBSSxRQUFRLE9BQU8sS0FBSyxrQkFBa0I7Q0FDL0QsSUFBSSxDQUFDLFdBQVcsU0FBUyxhQUFBLGtCQUFtQztFQUMxRCxTQUFTLFVBQVUsS0FBSyxFQUFFLGdCQUFnQiw0QkFBNEIsQ0FBQztFQUN2RSxTQUFTLElBQUksV0FBVztFQUN4QjtDQUNGO0NBSUEsTUFBTSxTQUFTLElBQUksSUFBSSxzQkFBc0IsUUFBUSxhQUFhO0NBQ2xFLEtBQUssTUFBTSxTQUFTLENBQUMsUUFBUSxPQUFPLEdBQVk7RUFDOUMsTUFBTSxRQUFRLFNBQVMsYUFBYSxJQUFJLEtBQUs7RUFDN0MsSUFBSSxPQUFPLE9BQU8sYUFBYSxJQUFJLE9BQU8sS0FBSztDQUNqRDtDQUNBLFNBQVMsVUFBVSxLQUFLO0VBQUUsVUFBVSxPQUFPLFNBQVM7RUFBRyxpQkFBaUI7Q0FBVyxDQUFDO0NBQ3BGLFNBQVMsSUFBSTtBQUNmO0FBRUEsU0FBUyxTQUFTLE1BQTJDO0NBQzNELE9BQU8sSUFBSSxTQUFTLFNBQVMsV0FBVztFQUN0QyxNQUFNLFNBQVMsS0FBSyxhQUFhLE9BQU87RUFDeEMsT0FBTyxLQUFLLFVBQVUsVUFBaUM7R0FDckQsT0FBTyxNQUFNO0dBQ2IsSUFBSSxNQUFNLFNBQVMsZ0JBQWdCLE1BQU0sU0FBUyxVQUFVLFFBQVEsSUFBSTtRQUNuRSxPQUFPLEtBQUs7RUFDbkIsQ0FBQztFQUVELE9BQU8sT0FBTyxNQUFNLG1CQUFtQixRQUFRLE1BQU0sQ0FBQztDQUN4RCxDQUFDO0FBQ0g7Ozs7OztBQU9BLGVBQXNCLHlCQUNwQixlQUNBLE9BQ0EsUUFBMkIsdUJBQ1Y7Q0FDakIsSUFBSSxPQUFPO0VBQ1QsTUFBTSxnQkFBZ0I7RUFDdEIsTUFBTSxZQUFZLFFBQVE7RUFDMUIsT0FBTyxNQUFNO0NBQ2Y7Q0FFQSxLQUFLLE1BQU0sUUFBUSxPQUFPO0VBQ3hCLE1BQU0sU0FBUyxNQUFNLFNBQVMsSUFBSTtFQUNsQyxJQUFJLENBQUMsUUFBUTtFQUViLE1BQU0sY0FBYyxpQkFBaUIsd0JBQXdCLEdBQUcsS0FBSztFQUNyRSxZQUFZLE1BQU07RUFDbEIsTUFBTSxVQUFVLE9BQU8sUUFBUTtFQUMvQixNQUFNLFlBQVksT0FBTyxZQUFZLFlBQVksVUFBVSxRQUFRLE9BQU87RUFDMUUsUUFBUTtHQUNOO0dBQ0EsYUFBYSwwQkFBMEIsU0FBUztHQUNoRDtHQUNBO0VBQ0Y7RUFDQSxPQUFPLEtBQUssc0RBQXNELFdBQVc7RUFDN0UsT0FBTyxNQUFNO0NBQ2Y7Q0FFQSxNQUFNLElBQUksTUFBTSxxQ0FBcUMsTUFBTSxLQUFLLEdBQUcsR0FBRztBQUN4RTtBQUVBLFNBQWdCLDBCQUFnQztDQUM5QyxJQUFJLENBQUMsT0FBTztDQUNaLGFBQWEsTUFBTSxXQUFXO0NBQzlCLE1BQU0sT0FBTyxNQUFNO0NBQ25CLFFBQVE7QUFDViJ9