@cartanova/qgrid-cli 2.2.1 → 2.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/bundle/dist/application/qgrid/conv-routing.js +2 -6
  2. package/bundle/dist/application/qgrid/qgrid.dispatcher.js +74 -43
  3. package/bundle/dist/application/qgrid/token-subscriber.js +14 -1
  4. package/bundle/dist/application/qgrid/tool-emulation.js +25 -20
  5. package/bundle/dist/application/request-log/request-log.model.js +54 -8
  6. package/bundle/dist/sonamu.config.js +11 -2
  7. package/bundle/dist/testing/global.js +5 -2
  8. package/bundle/dist/utils/providers/anthropic/anthropic-constants.js +30 -0
  9. package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +215 -0
  10. package/bundle/dist/utils/providers/anthropic/claude-session.js +220 -0
  11. package/bundle/dist/utils/providers/anthropic/stream-json-adapter.js +177 -0
  12. package/bundle/dist/utils/providers/common/model-cost.js +35 -18
  13. package/bundle/dist/utils/providers/openai/openai-refresh.js +21 -9
  14. package/bundle/src/application/qgrid/conv-routing.test.ts +85 -0
  15. package/bundle/src/application/qgrid/conv-routing.ts +3 -2
  16. package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +110 -0
  17. package/bundle/src/application/qgrid/qgrid.dispatcher.ts +112 -64
  18. package/bundle/src/application/qgrid/token-subscriber.ts +23 -1
  19. package/bundle/src/application/qgrid/tool-emulation.test.ts +46 -0
  20. package/bundle/src/application/qgrid/tool-emulation.ts +15 -3
  21. package/bundle/src/application/request-log/request-log.model.ts +98 -13
  22. package/bundle/src/sonamu.config.ts +13 -2
  23. package/bundle/src/testing/global.ts +16 -2
  24. package/bundle/src/utils/providers/anthropic/anthropic-constants.ts +38 -0
  25. package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.test.ts +564 -0
  26. package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +365 -0
  27. package/bundle/src/utils/providers/anthropic/claude-session.test.ts +263 -0
  28. package/bundle/src/utils/providers/anthropic/claude-session.ts +327 -0
  29. package/bundle/src/utils/providers/anthropic/stream-json-adapter.test.ts +373 -0
  30. package/bundle/src/utils/providers/anthropic/stream-json-adapter.ts +344 -0
  31. package/bundle/src/utils/providers/common/model-cost.test.ts +39 -0
  32. package/bundle/src/utils/providers/common/model-cost.ts +107 -19
  33. package/bundle/src/utils/providers/common/provider-dispatcher.ts +13 -2
  34. package/bundle/src/utils/providers/openai/openai-refresh.ts +34 -9
  35. package/package.json +1 -1
@@ -33,11 +33,7 @@ function decideConvRouting(input) {
33
33
  epoch: coord.epoch
34
34
  } : void 0,
35
35
  reuseInput: eligible ? buildDeltaInput(input) : void 0,
36
- coldInput: [{
37
- type: "text",
38
- text: input.prompt,
39
- text_elements: []
40
- }],
36
+ coldInput: buildDeltaInput(input),
41
37
  coldHistory: history,
42
38
  systemHash: sysHash
43
39
  };
@@ -65,4 +61,4 @@ function issueConvContext(threadCoord, decision) {
65
61
  //#endregion
66
62
  export { decideConvRouting, issueConvContext, systemHash };
67
63
 
68
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udi1yb3V0aW5nLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHBsaWNhdGlvbi9xZ3JpZC9jb252LXJvdXRpbmcudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBjb252LXJvdXRpbmcg4oCUIGNvbnZlcnNhdGlvbig9Y29kZXggdGhyZWFkKSDsnqzsgqzsmqnsnYQg7JyE7ZWcIHRocmVhZCDsooztkZwg6rKA7KadL+q1rOyEsS5cbiAqXG4gKiDrqqntkZw6IHRocmVhZCg9Y29udmVyc2F0aW9uX2lkPXByb21wdF9jYWNoZV9rZXkp66W8IOyerOyCrOyaqe2VtCBPcGVuQUkgcHJvbXB0IGNhY2hpbmcg7KCB7KSRLlxuICogLSDtm4Tsho0gdHVybjog6riw7KG0IHRocmVhZCDsl5AgZGVsdGEo66eI7KeA66eJIHVzZXIgLyB0b29sIOqysOqzvCnrp4wg67O064OEIChoaXN0b3J5IGluamVjdCDsl4bsnYwpLlxuICogLSDssqsgdHVybiAvIOqygOymnSDsi6TtjKg6IOyDiCB0aHJlYWQgKyBoaXN0b3J5IGluamVjdCAo7Y+067CxLCDsoJXtmZXshLEg67O07KG0KS5cbiAqXG4gKiDsi53rs4Q6IOyEnOuyhCDrsJzquIkg67aI7Yis66qFIHRocmVhZCDsooztkZwoUWdyaWRUaHJlYWRDb29yZCnrpbwg7YG065286rCAIOq3uOuMgOuhnCDtmozshqEuXG4gKiDqsoDspp06IHN5c3RlbUhhc2go64uk66W4IOuMgO2ZlCDsmKTsoJHsho0g7LCo64uoKSArIChkaXNwYXRjaGVy7J2YKSBlcG9jaC93b3JrZXIg7IOd7KG0LlxuICovXG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5cbmltcG9ydCB7IHR5cGUgSnNvblZhbHVlIH0gZnJvbSBcIi4uLy4uL2NvZGV4LXByb3RvY29sL3NlcmRlX2pzb24vSnNvblZhbHVlXCI7XG5pbXBvcnQgeyB0eXBlIFVzZXJJbnB1dCB9IGZyb20gXCIuLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Vc2VySW5wdXRcIjtcbmltcG9ydCB7IHR5cGUgUmV1c2VUaHJlYWRDb29yZCB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3Byb3ZpZGVyLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IHR5cGUgUWdyaWRUaHJlYWRDb29yZCwgdHlwZSBRdWVyeUlucHV0LCB0eXBlIFFncmlkVG9vbFJlc3VsdElucHV0IH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHN5c3RlbUhhc2goc3lzdGVtPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNyZWF0ZUhhc2goXCJzaGEyNTZcIilcbiAgICAudXBkYXRlKHN5c3RlbSA/PyBcIlwiKVxuICAgIC5kaWdlc3QoXCJoZXhcIilcbiAgICAuc2xpY2UoMCwgMTYpO1xufVxuXG4vLyB0b29sIOqysOqzvOulvCDri6TsnYwgdHVybiDsnZggaW5wdXQgdGV4dCDroZwg67OA7ZmYIChjb2RleCB0dXJuL3N0YXJ0LmlucHV0IOydgCBVc2VySW5wdXQg66eMIOuwm+ydjCkuXG5mdW5jdGlvbiB0b29sUmVzdWx0c1RvVGV4dCh0b29sUmVzdWx0czogUWdyaWRUb29sUmVzdWx0SW5wdXRbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVzID0gdG9vbFJlc3VsdHMubWFwKCh0cikgPT4ge1xuICAgIGNvbnN0IG5hbWUgPSB0ci50b29sTmFtZSA/IGAgKCR7dHIudG9vbE5hbWV9KWAgOiBcIlwiO1xuICAgIGNvbnN0IGVyck1hcmsgPSB0ci5pc0Vycm9yID8gXCIgW2Vycm9yXVwiIDogXCJcIjtcbiAgICByZXR1cm4gYFRvb2wgcmVzdWx0IGZvciBjYWxsICR7dHIudG9vbENhbGxJZH0ke25hbWV9JHtlcnJNYXJrfTogJHt0ci5vdXRwdXR9YDtcbiAgfSk7XG4gIHJldHVybiBgJHtsaW5lcy5qb2luKFwiXFxuXCIpfVxcblxcbk5vdyBjb250aW51ZSBhbnN3ZXJpbmcgdGhlIHVzZXIncyByZXF1ZXN0IHVzaW5nIHRoZXNlIHJlc3VsdHMuYDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb252RGVjaXNpb24ge1xuICAvLyBkaXNwYXRjaGVyIOuhnCDrhJjquLggcmV1c2Ug7KKM7ZGcICjqsoDspp0g7Ya16rO8IOyLnOyXkOunjCkuIGRpc3BhdGNoZXIg6rCAIGVwb2NoL3dvcmtlciDsg53sobQg7J6s6rKA7KadIO2bhCDtj7TrsLEg6rCA64qlLlxuICByZXVzZT86IFJldXNlVGhyZWFkQ29vcmQ7XG4gIC8vIOyerOyCrOyaqSDshLHqs7Ug7IucIHR1cm4vc3RhcnQg7JeQIOuztOuCvCBpbnB1dCDigJQgZGVsdGEo66eI7KeA66eJIHVzZXIvdG9vbCDqsrDqs7wp66eMLiByZXVzZSDqsIAg7J6I7J2EIOuVjOunjCDshKTsoJUuXG4gIHJldXNlSW5wdXQ/OiBBcnJheTxVc2VySW5wdXQ+O1xuICAvLyDssqsgdHVybiAvIOyerOyCrOyaqSDtj7TrsLEg7IucIOuztOuCvCBpbnB1dCDigJQg7KCE7LK0IHByb21wdC4g7ZWt7IOBIOyEpOyglSjtj7TrsLEg7JWI7KCE66edKS5cbiAgY29sZElucHV0OiBBcnJheTxVc2VySW5wdXQ+O1xuICAvLyDsg4ggdGhyZWFkIOydvCDrlYwgaW5qZWN0IO2VoCDsoITssrQgaGlzdG9yeS4g7J6s7IKs7JqpIOyEseqztSDsi5zsl5QgZGlzcGF0Y2hlciDqsIAg7JWIIOyTtOuLpCh0aHJlYWQg6rCAIOydtOuvuCDriITsoIEpLlxuICBjb2xkSGlzdG9yeT86IEFycmF5PEpzb25WYWx1ZT47XG4gIC8vIOydtCDsmpTssq0g7Iuc7KCQ7J2YIHN5c3RlbSDtlbTsi5wgKOydkeuLteyXkOyEnCB0aHJlYWQg7KKM7ZGcIOuwnOq4iSDsi5wg7IKs7JqpKS5cbiAgc3lzdGVtSGFzaDogc3RyaW5nO1xufVxuXG4vLyB0aHJlYWQg7KKM7ZGcICsg65Ok7Ja07JioIOyalOyyreycvOuhnCBcIuyerOyCrOyaqSDqsIDriqXtlZzqsIBcIuulvCDtjJDsoJXtlZjqs6AsIHJldXNlL2NvbGQg7JaR7Kq9IHBheWxvYWQg66W8IOq1rOyEse2VnOuLpC5cbi8vIGRpc3BhdGNoZXIg64uo7J2YIGVwb2NoL3dvcmtlciDsg53sobQg6rKA7Kad7J2AIOyXrOq4sOyEnCDrqrsg7ZWY66+A66GcKOyDge2DnCDsl4bsnYwpIHJldXNlIOyijO2RnCArIOuRkCBwYXlsb2FkIOulvFxuLy8g66qo65GQIOuEmOq4sOqzoCwgZGlzcGF0Y2hlciDsnZggYWNxdWlyZVJldXNlV29ya2VyIOqysOqzvOyXkCDrlLDrnbwgcmV1c2UoZGVsdGEpIOuYkOuKlCBjb2xkKOyghOyytCkg66W8IOqzoOuluOuLpC5cbi8vIOyWkeyqveydhCDri6Qg65Ok6rOgIOqwgOyVvCByZXVzZSDqsIAg7Iuk7Yyo66GcIO2PtOuwseuPvOuPhCDsoITssrQgaGlzdG9yeSDroZwg66y466el7J2EIOuzteq1rO2VoCDsiJgg7J6I64ukLlxuZXhwb3J0IGZ1bmN0aW9uIGRlY2lkZUNvbnZSb3V0aW5nKGlucHV0OiBRdWVyeUlucHV0KTogQ29udkRlY2lzaW9uIHtcbiAgY29uc3Qgc3lzSGFzaCA9IHN5c3RlbUhhc2goaW5wdXQuc3lzdGVtKTtcbiAgY29uc3QgaGlzdG9yeTogQXJyYXk8SnNvblZhbHVlPiB8IHVuZGVmaW5lZCA9IGlucHV0Lmhpc3RvcnlcbiAgICA/IChKU09OLnBhcnNlKGlucHV0Lmhpc3RvcnkpIGFzIEFycmF5PEpzb25WYWx1ZT4pXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgY29vcmQgPSBpbnB1dC5ydW5Db250ZXh0Py50aHJlYWRDb29yZDtcblxuICAvLyDsnqzsgqzsmqkg7J6Q6rKpOiDsooztkZwg7KG07J6sICsgc3lzdGVtIOuPmeydvC4gc2Vzc2lvbktleSDqsqnrpqwgKyBzeXN0ZW1IYXNoIOuhnCDrjIDtmZQg64+Z7J287ISx7J20XG4gIC8vIOuztOyepeuQmOqzoCwg6rO17Ya1IHByZWZpeCDripQgY29kZXgg6rCAIHByb21wdF9jYWNoZV9rZXkg6rOg7KCV7Jy866GcIOyVjOyVhOyEnCDsupDsi5ztlZzri6QuXG4gIGNvbnN0IGVsaWdpYmxlID0gY29vcmQgIT09IHVuZGVmaW5lZCAmJiBjb29yZC5zeXN0ZW1IYXNoID09PSBzeXNIYXNoO1xuXG4gIHJldHVybiB7XG4gICAgcmV1c2U6XG4gICAgICBlbGlnaWJsZSAmJiBjb29yZFxuICAgICAgICA/IHsgd29ya2VySWQ6IGNvb3JkLndvcmtlcklkLCB0aHJlYWRJZDogY29vcmQudGhyZWFkSWQsIGVwb2NoOiBjb29yZC5lcG9jaCB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIC8vIOyerOyCrOyaqSB0dXJuIOydgCBkZWx0YSjrp4jsp4Drp4kgdXNlci90b29sIOqysOqzvCnrp4wg4oCUIHRocmVhZCDqsIAg7J2066+4IOydtOyghCB0dXJuIOuTpOydhCDriITsoIEuXG4gICAgcmV1c2VJbnB1dDogZWxpZ2libGUgPyBidWlsZERlbHRhSW5wdXQoaW5wdXQpIDogdW5kZWZpbmVkLFxuICAgIC8vIOyyqyB0dXJuIC8g7Y+067CxOiDsoITssrQgcHJvbXB0ICsgaGlzdG9yeSBpbmplY3QuXG4gICAgY29sZElucHV0OiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dDogaW5wdXQucHJvbXB0LCB0ZXh0X2VsZW1lbnRzOiBbXSB9XSxcbiAgICBjb2xkSGlzdG9yeTogaGlzdG9yeSxcbiAgICBzeXN0ZW1IYXNoOiBzeXNIYXNoLFxuICB9O1xufVxuXG4vLyDtm4Tsho0gdHVybiDsnZggaW5wdXQ6IHRvb2wg6rKw6rO86rCAIOyeiOycvOuptCDqt7jqsbggdGV4dCDroZwsIOyXhuycvOuptCDrp4jsp4Drp4kgdXNlcihwcm9tcHQpLlxuZnVuY3Rpb24gYnVpbGREZWx0YUlucHV0KGlucHV0OiBRdWVyeUlucHV0KTogQXJyYXk8VXNlcklucHV0PiB7XG4gIGlmIChpbnB1dC50b29sUmVzdWx0cyAmJiBpbnB1dC50b29sUmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiB0b29sUmVzdWx0c1RvVGV4dChpbnB1dC50b29sUmVzdWx0cyksIHRleHRfZWxlbWVudHM6IFtdIH1dO1xuICB9XG4gIHJldHVybiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dDogaW5wdXQucHJvbXB0LCB0ZXh0X2VsZW1lbnRzOiBbXSB9XTtcbn1cblxuLy8g7J2R64u1IHRocmVhZENvb3JkICsg7JqU7LKtIOyLnOygkCDsoJXrs7TroZwg64uk7J2MIHRocmVhZCDsooztkZzrpbwg67Cc6riJ7ZWc64ukLlxuZXhwb3J0IGZ1bmN0aW9uIGlzc3VlQ29udkNvbnRleHQoXG4gIHRocmVhZENvb3JkOiBSZXVzZVRocmVhZENvb3JkLFxuICBkZWNpc2lvbjogQ29udkRlY2lzaW9uLFxuKTogUWdyaWRUaHJlYWRDb29yZCB7XG4gIHJldHVybiB7XG4gICAgd29ya2VySWQ6IHRocmVhZENvb3JkLndvcmtlcklkLFxuICAgIHRocmVhZElkOiB0aHJlYWRDb29yZC50aHJlYWRJZCxcbiAgICBlcG9jaDogdGhyZWFkQ29vcmQuZXBvY2gsXG4gICAgc3lzdGVtSGFzaDogZGVjaXNpb24uc3lzdGVtSGFzaCxcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQWlCQSxTQUFnQixXQUFXLFFBQXlCO0FBQ2xELFFBQU8sV0FBVyxTQUFTLENBQ3hCLE9BQU8sVUFBVSxHQUFHLENBQ3BCLE9BQU8sTUFBTSxDQUNiLE1BQU0sR0FBRyxHQUFHOztBQUlqQixTQUFTLGtCQUFrQixhQUE2QztBQU10RSxRQUFPLEdBTE8sWUFBWSxLQUFLLE9BQU87RUFDcEMsTUFBTSxPQUFPLEdBQUcsV0FBVyxLQUFLLEdBQUcsU0FBUyxLQUFLO0VBQ2pELE1BQU0sVUFBVSxHQUFHLFVBQVUsYUFBYTtBQUMxQyxTQUFPLHdCQUF3QixHQUFHLGFBQWEsT0FBTyxRQUFRLElBQUksR0FBRztHQUNyRSxDQUNjLEtBQUssS0FBSyxDQUFDOztBQW9CN0IsU0FBZ0Isa0JBQWtCLE9BQWlDO0NBQ2pFLE1BQU0sVUFBVSxXQUFXLE1BQU0sT0FBTztDQUN4QyxNQUFNLFVBQXdDLE1BQU0sVUFDL0MsS0FBSyxNQUFNLE1BQU0sUUFBUSxHQUMxQjtDQUVKLE1BQU0sUUFBUSxNQUFNLFlBQVk7Q0FJaEMsTUFBTSxXQUFXLFVBQVUsVUFBYSxNQUFNLGVBQWU7QUFFN0QsUUFBTztFQUNMLE9BQ0UsWUFBWSxRQUNSO0dBQUUsVUFBVSxNQUFNO0dBQVUsVUFBVSxNQUFNO0dBQVUsT0FBTyxNQUFNO0dBQU8sR0FDMUU7RUFFTixZQUFZLFdBQVcsZ0JBQWdCLE1BQU0sR0FBRztFQUVoRCxXQUFXLENBQUM7R0FBRSxNQUFNO0dBQVEsTUFBTSxNQUFNO0dBQVEsZUFBZSxFQUFFO0dBQUUsQ0FBQztFQUNwRSxhQUFhO0VBQ2IsWUFBWTtFQUNiOztBQUlILFNBQVMsZ0JBQWdCLE9BQXFDO0FBQzVELEtBQUksTUFBTSxlQUFlLE1BQU0sWUFBWSxTQUFTLEVBQ2xELFFBQU8sQ0FBQztFQUFFLE1BQU07RUFBUSxNQUFNLGtCQUFrQixNQUFNLFlBQVk7RUFBRSxlQUFlLEVBQUU7RUFBRSxDQUFDO0FBRTFGLFFBQU8sQ0FBQztFQUFFLE1BQU07RUFBUSxNQUFNLE1BQU07RUFBUSxlQUFlLEVBQUU7RUFBRSxDQUFDOztBQUlsRSxTQUFnQixpQkFDZCxhQUNBLFVBQ2tCO0FBQ2xCLFFBQU87RUFDTCxVQUFVLFlBQVk7RUFDdEIsVUFBVSxZQUFZO0VBQ3RCLE9BQU8sWUFBWTtFQUNuQixZQUFZLFNBQVM7RUFDdEIifQ==
64
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udi1yb3V0aW5nLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHBsaWNhdGlvbi9xZ3JpZC9jb252LXJvdXRpbmcudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBjb252LXJvdXRpbmcg4oCUIGNvbnZlcnNhdGlvbig9Y29kZXggdGhyZWFkKSDsnqzsgqzsmqnsnYQg7JyE7ZWcIHRocmVhZCDsooztkZwg6rKA7KadL+q1rOyEsS5cbiAqXG4gKiDrqqntkZw6IHRocmVhZCg9Y29udmVyc2F0aW9uX2lkPXByb21wdF9jYWNoZV9rZXkp66W8IOyerOyCrOyaqe2VtCBPcGVuQUkgcHJvbXB0IGNhY2hpbmcg7KCB7KSRLlxuICogLSDtm4Tsho0gdHVybjog6riw7KG0IHRocmVhZCDsl5AgZGVsdGEo66eI7KeA66eJIHVzZXIgLyB0b29sIOqysOqzvCnrp4wg67O064OEIChoaXN0b3J5IGluamVjdCDsl4bsnYwpLlxuICogLSDssqsgdHVybiAvIOqygOymnSDsi6TtjKg6IOyDiCB0aHJlYWQgKyBoaXN0b3J5IGluamVjdCAo7Y+067CxLCDsoJXtmZXshLEg67O07KG0KS5cbiAqXG4gKiDsi53rs4Q6IOyEnOuyhCDrsJzquIkg67aI7Yis66qFIHRocmVhZCDsooztkZwoUWdyaWRUaHJlYWRDb29yZCnrpbwg7YG065286rCAIOq3uOuMgOuhnCDtmozshqEuXG4gKiDqsoDspp06IHN5c3RlbUhhc2go64uk66W4IOuMgO2ZlCDsmKTsoJHsho0g7LCo64uoKSArIChkaXNwYXRjaGVy7J2YKSBlcG9jaC93b3JrZXIg7IOd7KG0LlxuICovXG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5cbmltcG9ydCB7IHR5cGUgSnNvblZhbHVlIH0gZnJvbSBcIi4uLy4uL2NvZGV4LXByb3RvY29sL3NlcmRlX2pzb24vSnNvblZhbHVlXCI7XG5pbXBvcnQgeyB0eXBlIFVzZXJJbnB1dCB9IGZyb20gXCIuLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Vc2VySW5wdXRcIjtcbmltcG9ydCB7IHR5cGUgUmV1c2VUaHJlYWRDb29yZCB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3Byb3ZpZGVyLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IHR5cGUgUWdyaWRUaHJlYWRDb29yZCwgdHlwZSBRdWVyeUlucHV0LCB0eXBlIFFncmlkVG9vbFJlc3VsdElucHV0IH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHN5c3RlbUhhc2goc3lzdGVtPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNyZWF0ZUhhc2goXCJzaGEyNTZcIilcbiAgICAudXBkYXRlKHN5c3RlbSA/PyBcIlwiKVxuICAgIC5kaWdlc3QoXCJoZXhcIilcbiAgICAuc2xpY2UoMCwgMTYpO1xufVxuXG4vLyB0b29sIOqysOqzvOulvCDri6TsnYwgdHVybiDsnZggaW5wdXQgdGV4dCDroZwg67OA7ZmYIChjb2RleCB0dXJuL3N0YXJ0LmlucHV0IOydgCBVc2VySW5wdXQg66eMIOuwm+ydjCkuXG5mdW5jdGlvbiB0b29sUmVzdWx0c1RvVGV4dCh0b29sUmVzdWx0czogUWdyaWRUb29sUmVzdWx0SW5wdXRbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVzID0gdG9vbFJlc3VsdHMubWFwKCh0cikgPT4ge1xuICAgIGNvbnN0IG5hbWUgPSB0ci50b29sTmFtZSA/IGAgKCR7dHIudG9vbE5hbWV9KWAgOiBcIlwiO1xuICAgIGNvbnN0IGVyck1hcmsgPSB0ci5pc0Vycm9yID8gXCIgW2Vycm9yXVwiIDogXCJcIjtcbiAgICByZXR1cm4gYFRvb2wgcmVzdWx0IGZvciBjYWxsICR7dHIudG9vbENhbGxJZH0ke25hbWV9JHtlcnJNYXJrfTogJHt0ci5vdXRwdXR9YDtcbiAgfSk7XG4gIHJldHVybiBgJHtsaW5lcy5qb2luKFwiXFxuXCIpfVxcblxcbk5vdyBjb250aW51ZSBhbnN3ZXJpbmcgdGhlIHVzZXIncyByZXF1ZXN0IHVzaW5nIHRoZXNlIHJlc3VsdHMuYDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb252RGVjaXNpb24ge1xuICAvLyBkaXNwYXRjaGVyIOuhnCDrhJjquLggcmV1c2Ug7KKM7ZGcICjqsoDspp0g7Ya16rO8IOyLnOyXkOunjCkuIGRpc3BhdGNoZXIg6rCAIGVwb2NoL3dvcmtlciDsg53sobQg7J6s6rKA7KadIO2bhCDtj7TrsLEg6rCA64qlLlxuICByZXVzZT86IFJldXNlVGhyZWFkQ29vcmQ7XG4gIC8vIOyerOyCrOyaqSDshLHqs7Ug7IucIHR1cm4vc3RhcnQg7JeQIOuztOuCvCBpbnB1dCDigJQgZGVsdGEo66eI7KeA66eJIHVzZXIvdG9vbCDqsrDqs7wp66eMLiByZXVzZSDqsIAg7J6I7J2EIOuVjOunjCDshKTsoJUuXG4gIHJldXNlSW5wdXQ/OiBBcnJheTxVc2VySW5wdXQ+O1xuICAvLyDssqsgdHVybiAvIOyerOyCrOyaqSDtj7TrsLEg7IucIOuztOuCvCBpbnB1dCDigJQg7KCE7LK0IHByb21wdC4g7ZWt7IOBIOyEpOyglSjtj7TrsLEg7JWI7KCE66edKS5cbiAgY29sZElucHV0OiBBcnJheTxVc2VySW5wdXQ+O1xuICAvLyDsg4ggdGhyZWFkIOydvCDrlYwgaW5qZWN0IO2VoCDsoITssrQgaGlzdG9yeS4g7J6s7IKs7JqpIOyEseqztSDsi5zsl5QgZGlzcGF0Y2hlciDqsIAg7JWIIOyTtOuLpCh0aHJlYWQg6rCAIOydtOuvuCDriITsoIEpLlxuICBjb2xkSGlzdG9yeT86IEFycmF5PEpzb25WYWx1ZT47XG4gIC8vIOydtCDsmpTssq0g7Iuc7KCQ7J2YIHN5c3RlbSDtlbTsi5wgKOydkeuLteyXkOyEnCB0aHJlYWQg7KKM7ZGcIOuwnOq4iSDsi5wg7IKs7JqpKS5cbiAgc3lzdGVtSGFzaDogc3RyaW5nO1xufVxuXG4vLyB0aHJlYWQg7KKM7ZGcICsg65Ok7Ja07JioIOyalOyyreycvOuhnCBcIuyerOyCrOyaqSDqsIDriqXtlZzqsIBcIuulvCDtjJDsoJXtlZjqs6AsIHJldXNlL2NvbGQg7JaR7Kq9IHBheWxvYWQg66W8IOq1rOyEse2VnOuLpC5cbi8vIGRpc3BhdGNoZXIg64uo7J2YIGVwb2NoL3dvcmtlciDsg53sobQg6rKA7Kad7J2AIOyXrOq4sOyEnCDrqrsg7ZWY66+A66GcKOyDge2DnCDsl4bsnYwpIHJldXNlIOyijO2RnCArIOuRkCBwYXlsb2FkIOulvFxuLy8g66qo65GQIOuEmOq4sOqzoCwgZGlzcGF0Y2hlciDsnZggYWNxdWlyZVJldXNlV29ya2VyIOqysOqzvOyXkCDrlLDrnbwgcmV1c2UoZGVsdGEpIOuYkOuKlCBjb2xkKOyghOyytCkg66W8IOqzoOuluOuLpC5cbi8vIOyWkeyqveydhCDri6Qg65Ok6rOgIOqwgOyVvCByZXVzZSDqsIAg7Iuk7Yyo66GcIO2PtOuwseuPvOuPhCDsoITssrQgaGlzdG9yeSDroZwg66y466el7J2EIOuzteq1rO2VoCDsiJgg7J6I64ukLlxuZXhwb3J0IGZ1bmN0aW9uIGRlY2lkZUNvbnZSb3V0aW5nKGlucHV0OiBRdWVyeUlucHV0KTogQ29udkRlY2lzaW9uIHtcbiAgY29uc3Qgc3lzSGFzaCA9IHN5c3RlbUhhc2goaW5wdXQuc3lzdGVtKTtcbiAgY29uc3QgaGlzdG9yeTogQXJyYXk8SnNvblZhbHVlPiB8IHVuZGVmaW5lZCA9IGlucHV0Lmhpc3RvcnlcbiAgICA/IChKU09OLnBhcnNlKGlucHV0Lmhpc3RvcnkpIGFzIEFycmF5PEpzb25WYWx1ZT4pXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgY29vcmQgPSBpbnB1dC5ydW5Db250ZXh0Py50aHJlYWRDb29yZDtcblxuICAvLyDsnqzsgqzsmqkg7J6Q6rKpOiDsooztkZwg7KG07J6sICsgc3lzdGVtIOuPmeydvC4gc2Vzc2lvbktleSDqsqnrpqwgKyBzeXN0ZW1IYXNoIOuhnCDrjIDtmZQg64+Z7J287ISx7J20XG4gIC8vIOuztOyepeuQmOqzoCwg6rO17Ya1IHByZWZpeCDripQgY29kZXgg6rCAIHByb21wdF9jYWNoZV9rZXkg6rOg7KCV7Jy866GcIOyVjOyVhOyEnCDsupDsi5ztlZzri6QuXG4gIGNvbnN0IGVsaWdpYmxlID0gY29vcmQgIT09IHVuZGVmaW5lZCAmJiBjb29yZC5zeXN0ZW1IYXNoID09PSBzeXNIYXNoO1xuXG4gIHJldHVybiB7XG4gICAgcmV1c2U6XG4gICAgICBlbGlnaWJsZSAmJiBjb29yZFxuICAgICAgICA/IHsgd29ya2VySWQ6IGNvb3JkLndvcmtlcklkLCB0aHJlYWRJZDogY29vcmQudGhyZWFkSWQsIGVwb2NoOiBjb29yZC5lcG9jaCB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIC8vIOyerOyCrOyaqSB0dXJuIOydgCBkZWx0YSjrp4jsp4Drp4kgdXNlci90b29sIOqysOqzvCnrp4wg4oCUIHRocmVhZCDqsIAg7J2066+4IOydtOyghCB0dXJuIOuTpOydhCDriITsoIEuXG4gICAgcmV1c2VJbnB1dDogZWxpZ2libGUgPyBidWlsZERlbHRhSW5wdXQoaW5wdXQpIDogdW5kZWZpbmVkLFxuICAgIC8vIOyyqyB0dXJuIC8g7Y+067CxOiDsoITssrQgcHJvbXB0ICsgaGlzdG9yeSBpbmplY3QuIHRvb2wg6rKw6rO8IGZvbGxvdy11cCDsnbQgY29sZCDroZwg65ao7Ja07KC464+EXG4gICAgLy8g7Iuk7ZaJIHVzZXIg7KSE7JeQ64qUIFwi7J20IOqysOqzvOuhnCDqs4Tsho0g64u17ZWY6528XCLripQgY29udGludWF0aW9uIOydtCDrk6TslrTqsIDslbwg7ZWc64ukLlxuICAgIGNvbGRJbnB1dDogYnVpbGREZWx0YUlucHV0KGlucHV0KSxcbiAgICBjb2xkSGlzdG9yeTogaGlzdG9yeSxcbiAgICBzeXN0ZW1IYXNoOiBzeXNIYXNoLFxuICB9O1xufVxuXG4vLyDtm4Tsho0gdHVybiDsnZggaW5wdXQ6IHRvb2wg6rKw6rO86rCAIOyeiOycvOuptCDqt7jqsbggdGV4dCDroZwsIOyXhuycvOuptCDrp4jsp4Drp4kgdXNlcihwcm9tcHQpLlxuZnVuY3Rpb24gYnVpbGREZWx0YUlucHV0KGlucHV0OiBRdWVyeUlucHV0KTogQXJyYXk8VXNlcklucHV0PiB7XG4gIGlmIChpbnB1dC50b29sUmVzdWx0cyAmJiBpbnB1dC50b29sUmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiB0b29sUmVzdWx0c1RvVGV4dChpbnB1dC50b29sUmVzdWx0cyksIHRleHRfZWxlbWVudHM6IFtdIH1dO1xuICB9XG4gIHJldHVybiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dDogaW5wdXQucHJvbXB0LCB0ZXh0X2VsZW1lbnRzOiBbXSB9XTtcbn1cblxuLy8g7J2R64u1IHRocmVhZENvb3JkICsg7JqU7LKtIOyLnOygkCDsoJXrs7TroZwg64uk7J2MIHRocmVhZCDsooztkZzrpbwg67Cc6riJ7ZWc64ukLlxuZXhwb3J0IGZ1bmN0aW9uIGlzc3VlQ29udkNvbnRleHQoXG4gIHRocmVhZENvb3JkOiBSZXVzZVRocmVhZENvb3JkLFxuICBkZWNpc2lvbjogQ29udkRlY2lzaW9uLFxuKTogUWdyaWRUaHJlYWRDb29yZCB7XG4gIHJldHVybiB7XG4gICAgd29ya2VySWQ6IHRocmVhZENvb3JkLndvcmtlcklkLFxuICAgIHRocmVhZElkOiB0aHJlYWRDb29yZC50aHJlYWRJZCxcbiAgICBlcG9jaDogdGhyZWFkQ29vcmQuZXBvY2gsXG4gICAgc3lzdGVtSGFzaDogZGVjaXNpb24uc3lzdGVtSGFzaCxcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQWlCQSxTQUFnQixXQUFXLFFBQXlCO0FBQ2xELFFBQU8sV0FBVyxTQUFTLENBQ3hCLE9BQU8sVUFBVSxHQUFHLENBQ3BCLE9BQU8sTUFBTSxDQUNiLE1BQU0sR0FBRyxHQUFHOztBQUlqQixTQUFTLGtCQUFrQixhQUE2QztBQU10RSxRQUFPLEdBTE8sWUFBWSxLQUFLLE9BQU87RUFDcEMsTUFBTSxPQUFPLEdBQUcsV0FBVyxLQUFLLEdBQUcsU0FBUyxLQUFLO0VBQ2pELE1BQU0sVUFBVSxHQUFHLFVBQVUsYUFBYTtBQUMxQyxTQUFPLHdCQUF3QixHQUFHLGFBQWEsT0FBTyxRQUFRLElBQUksR0FBRztHQUNyRSxDQUNjLEtBQUssS0FBSyxDQUFDOztBQW9CN0IsU0FBZ0Isa0JBQWtCLE9BQWlDO0NBQ2pFLE1BQU0sVUFBVSxXQUFXLE1BQU0sT0FBTztDQUN4QyxNQUFNLFVBQXdDLE1BQU0sVUFDL0MsS0FBSyxNQUFNLE1BQU0sUUFBUSxHQUMxQjtDQUVKLE1BQU0sUUFBUSxNQUFNLFlBQVk7Q0FJaEMsTUFBTSxXQUFXLFVBQVUsVUFBYSxNQUFNLGVBQWU7QUFFN0QsUUFBTztFQUNMLE9BQ0UsWUFBWSxRQUNSO0dBQUUsVUFBVSxNQUFNO0dBQVUsVUFBVSxNQUFNO0dBQVUsT0FBTyxNQUFNO0dBQU8sR0FDMUU7RUFFTixZQUFZLFdBQVcsZ0JBQWdCLE1BQU0sR0FBRztFQUdoRCxXQUFXLGdCQUFnQixNQUFNO0VBQ2pDLGFBQWE7RUFDYixZQUFZO0VBQ2I7O0FBSUgsU0FBUyxnQkFBZ0IsT0FBcUM7QUFDNUQsS0FBSSxNQUFNLGVBQWUsTUFBTSxZQUFZLFNBQVMsRUFDbEQsUUFBTyxDQUFDO0VBQUUsTUFBTTtFQUFRLE1BQU0sa0JBQWtCLE1BQU0sWUFBWTtFQUFFLGVBQWUsRUFBRTtFQUFFLENBQUM7QUFFMUYsUUFBTyxDQUFDO0VBQUUsTUFBTTtFQUFRLE1BQU0sTUFBTTtFQUFRLGVBQWUsRUFBRTtFQUFFLENBQUM7O0FBSWxFLFNBQWdCLGlCQUNkLGFBQ0EsVUFDa0I7QUFDbEIsUUFBTztFQUNMLFVBQVUsWUFBWTtFQUN0QixVQUFVLFlBQVk7RUFDdEIsT0FBTyxZQUFZO0VBQ25CLFlBQVksU0FBUztFQUN0QiJ9
@@ -1,6 +1,7 @@
1
1
  import "../../_virtual/_rolldown/runtime.js";
2
2
  import { decideConvRouting, issueConvContext } from "./conv-routing.js";
3
3
  import { calculateCostUsd } from "../../utils/providers/common/model-cost.js";
4
+ import { canonicalAnthropicModel } from "../../utils/providers/anthropic/anthropic-constants.js";
4
5
  import { getAccessToken, getExpiresAt, getRefreshToken } from "../../utils/providers/common/credentials.js";
5
6
  import { strictify } from "../../utils/providers/common/strictifier.js";
6
7
  import { ProcessError, QuotaError, TimeoutError, maskToken } from "./qgrid.types.js";
@@ -34,12 +35,17 @@ const QGRID_CLAUDE_SETTINGS = {
34
35
  cleanupPeriodDays: 1
35
36
  };
36
37
  const REFRESH_SAFETY_MS = 6e4;
38
+ function buildStrictOutputSchema(input) {
39
+ const outputSchema = input.tools?.length ? buildToolCallSchema(input.tools) : input.jsonSchema ? JSON.parse(input.jsonSchema) : void 0;
40
+ return outputSchema ? strictify(outputSchema) : void 0;
41
+ }
37
42
  var QgridDispatcherClass = class {
38
43
  tokens = /* @__PURE__ */ new Map();
39
44
  requestCounts = /* @__PURE__ */ new Map();
40
45
  rrIndex = 0;
41
46
  subscriber = null;
42
47
  openaiDispatcher = null;
48
+ anthropicDispatcher = null;
43
49
  constructor() {
44
50
  const settingsJson = JSON.stringify(QGRID_CLAUDE_SETTINGS, null, 2);
45
51
  mkdirSync(`${CLAUDE_CWD}/.claude`, { recursive: true });
@@ -79,7 +85,7 @@ var QgridDispatcherClass = class {
79
85
  }
80
86
  async query(input, timeoutMs) {
81
87
  if (input.tools?.length && input.jsonSchema) throw new ProcessError("tools and jsonSchema cannot be used together");
82
- const outputSchema = input.tools?.length ? buildToolCallSchema(input.tools) : input.jsonSchema ? JSON.parse(input.jsonSchema) : void 0;
88
+ const outputSchema = buildStrictOutputSchema(input);
83
89
  if (input.model?.includes("/")) {
84
90
  const [provider, model] = input.model.split("/", 2);
85
91
  assert(model, "unknown model");
@@ -89,7 +95,7 @@ var QgridDispatcherClass = class {
89
95
  const result = await this.openaiDispatcher.generate({
90
96
  model,
91
97
  systemPrompt: input.system,
92
- outputSchema: outputSchema ? strictify(outputSchema) : void 0,
98
+ outputSchema,
93
99
  effort: input.effort,
94
100
  verbosity: input.verbosity,
95
101
  reasoningSummary: input.reasoningSummary,
@@ -100,26 +106,25 @@ var QgridDispatcherClass = class {
100
106
  reuseInput: decision.reuseInput
101
107
  });
102
108
  const issuedCoord = issueConvContext(result.threadCoord, decision);
103
- return applyToolCallEmulation({
104
- text: result.text,
105
- tokenName: result.tokenName,
106
- model: result.model,
107
- usage: {
108
- input_tokens: result.usage.inputTokens,
109
- output_tokens: result.usage.outputTokens,
110
- cache_creation_input_tokens: 0,
111
- cache_read_input_tokens: result.usage.cachedInputTokens
112
- },
113
- durationMs: result.durationMs,
114
- costUsd: calculateCostUsd(result.model, {
115
- inputTokens: result.usage.inputTokens,
116
- outputTokens: result.usage.outputTokens,
117
- cachedInputTokens: result.usage.cachedInputTokens
118
- })
119
- }, input.tools, issuedCoord);
109
+ return applyToolCallEmulation(toEmulationResult(result), input.tools, issuedCoord);
120
110
  }
121
111
  }
122
- const executionInput = outputSchema && input.tools?.length ? {
112
+ if (this.anthropicDispatcher) {
113
+ const decision = decideConvRouting(input);
114
+ const result = await this.anthropicDispatcher.generate({
115
+ model: input.model,
116
+ systemPrompt: input.system,
117
+ outputSchema,
118
+ effort: input.effort,
119
+ coldInput: decision.coldInput,
120
+ coldHistory: decision.coldHistory,
121
+ reuse: decision.reuse,
122
+ reuseInput: decision.reuseInput
123
+ });
124
+ const issuedCoord = issueConvContext(result.threadCoord, decision);
125
+ return applyToolCallEmulation(toEmulationResult(result), input.tools, issuedCoord);
126
+ }
127
+ const executionInput = outputSchema ? {
123
128
  ...input,
124
129
  jsonSchema: JSON.stringify(outputSchema)
125
130
  } : input;
@@ -138,11 +143,34 @@ var QgridDispatcherClass = class {
138
143
  return applyToolCallEmulation({
139
144
  ...await executeClaude(executionInput, token, timeoutMs ?? DEFAULT_TIMEOUT_MS),
140
145
  tokenName: electedToken.name,
141
- model: input.model ?? DEFAULT_MODEL
146
+ model: canonicalAnthropicModel(input.model)
142
147
  }, input.tools);
143
148
  }
144
149
  async queryStream(input, cb) {
145
150
  if (!input.model?.startsWith("openai/")) {
151
+ if (this.anthropicDispatcher) {
152
+ const outputSchema = buildStrictOutputSchema(input);
153
+ const decision = decideConvRouting(input);
154
+ await this.anthropicDispatcher.generateStream({
155
+ model: input.model,
156
+ systemPrompt: input.system,
157
+ outputSchema,
158
+ effort: input.effort,
159
+ coldInput: decision.coldInput,
160
+ coldHistory: decision.coldHistory,
161
+ reuse: decision.reuse,
162
+ reuseInput: decision.reuseInput
163
+ }, {
164
+ onDelta: cb.onDelta,
165
+ onThreadId: cb.onThreadId,
166
+ onComplete: (turnResult) => {
167
+ const issuedCoord = issueConvContext(turnResult.threadCoord, decision);
168
+ cb.onComplete(applyToolCallEmulation(toEmulationResult(turnResult), input.tools, issuedCoord));
169
+ },
170
+ onError: cb.onError
171
+ });
172
+ return;
173
+ }
146
174
  const result = await this.query(input);
147
175
  cb.onComplete(result);
148
176
  return;
@@ -150,12 +178,12 @@ var QgridDispatcherClass = class {
150
178
  const [, model] = input.model.split("/", 2);
151
179
  if (!model) throw new ProcessError("unknown model");
152
180
  if (!this.openaiDispatcher) throw new QuotaError("OpenAI dispatcher not initialized");
153
- const outputSchema = input.tools?.length ? buildToolCallSchema(input.tools) : input.jsonSchema ? JSON.parse(input.jsonSchema) : void 0;
181
+ const outputSchema = buildStrictOutputSchema(input);
154
182
  const decision = decideConvRouting(input);
155
183
  await this.openaiDispatcher.generateStream({
156
184
  model,
157
185
  systemPrompt: input.system,
158
- outputSchema: outputSchema ? strictify(outputSchema) : void 0,
186
+ outputSchema,
159
187
  effort: input.effort,
160
188
  verbosity: input.verbosity,
161
189
  reasoningSummary: input.reasoningSummary,
@@ -170,29 +198,32 @@ var QgridDispatcherClass = class {
170
198
  onTurnId: cb.onTurnId,
171
199
  onComplete: (turnResult) => {
172
200
  const issuedCoord = issueConvContext(turnResult.threadCoord, decision);
173
- const applied = applyToolCallEmulation({
174
- text: turnResult.text,
175
- tokenName: turnResult.tokenName,
176
- model: turnResult.model,
177
- usage: {
178
- input_tokens: turnResult.usage.inputTokens,
179
- output_tokens: turnResult.usage.outputTokens,
180
- cache_creation_input_tokens: 0,
181
- cache_read_input_tokens: turnResult.usage.cachedInputTokens
182
- },
183
- durationMs: turnResult.durationMs,
184
- costUsd: calculateCostUsd(turnResult.model, {
185
- inputTokens: turnResult.usage.inputTokens,
186
- outputTokens: turnResult.usage.outputTokens,
187
- cachedInputTokens: turnResult.usage.cachedInputTokens
188
- })
189
- }, input.tools, issuedCoord);
190
- cb.onComplete(applied);
201
+ cb.onComplete(applyToolCallEmulation(toEmulationResult(turnResult), input.tools, issuedCoord));
191
202
  },
192
203
  onError: cb.onError
193
204
  });
194
205
  }
195
206
  };
207
+ function toEmulationResult(result) {
208
+ return {
209
+ text: result.text,
210
+ tokenName: result.tokenName,
211
+ model: result.model,
212
+ usage: {
213
+ input_tokens: result.usage.inputTokens,
214
+ output_tokens: result.usage.outputTokens,
215
+ cache_creation_input_tokens: result.usage.cacheCreationInputTokens ?? 0,
216
+ cache_read_input_tokens: result.usage.cachedInputTokens
217
+ },
218
+ durationMs: result.durationMs,
219
+ costUsd: result.costUsd !== void 0 && result.costUsd > 0 ? result.costUsd : calculateCostUsd(result.model, {
220
+ inputTokens: result.usage.inputTokens,
221
+ outputTokens: result.usage.outputTokens,
222
+ cachedInputTokens: result.usage.cachedInputTokens,
223
+ cacheCreationInputTokens: result.usage.cacheCreationInputTokens ?? 0
224
+ })
225
+ };
226
+ }
196
227
  async function executeClaude(input, token, timeoutMs) {
197
228
  const rawModel = input.model ?? DEFAULT_MODEL;
198
229
  const model = rawModel.includes("/") ? rawModel.split("/").pop() : rawModel;
@@ -316,6 +347,6 @@ async function executeClaude(input, token, timeoutMs) {
316
347
  }
317
348
  const QgridDispatcher = new QgridDispatcherClass();
318
349
  //#endregion
319
- export { QgridDispatcher, QgridDispatcherClass };
350
+ export { QgridDispatcher, QgridDispatcherClass, buildStrictOutputSchema };
320
351
 
321
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZGlzcGF0Y2hlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZGlzcGF0Y2hlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJub2RlOmFzc2VydFwiO1xuLyoqXG4gKiBRZ3JpZERpc3BhdGNoZXIg4oCUIE9BdXRoIO2GoO2BsCDshKDtg50gKyBjbGF1ZGUgQ0xJIGZyZXNoIHNwYXduIOuUlOyKpO2MqOyymCDsi7HquIDthLQuXG4gKlxuICogLSDrp6Qg7JqU7LKt66eI64ukIOyDiCBjbGF1ZGUgQ0xJIO2UhOuhnOyEuOyKpCBzcGF3biDihpIg7J2R64u1IO2bhCDsooXro4xcbiAqIC0gbGVhc3QtdXNlZCByb3VuZC1yb2JpbiDsnLzroZwg7Yag7YGwIOyEoO2DnVxuICogLSDrqZTrqqjrpqwg7LqQ7IucIChNYXA8aWQsIFRva2VuU3Vic2V0QT4pIOuKlCBUb2tlblN1YnNjcmliZXIg6rCAIHBnIExJU1RFTi9OT1RJRlkg66GcIOqwseyLoFxuICogLSBxdWVyeSDsi5wgZXhwaXJlc19hdCDruYTqtZAg4oaSIOyehOuwlSDsi5wgcHJlZW1wdGl2ZSByZWZyZXNoXG4gKiAtIFF1b3RhRXJyb3Ig64qUIOq3uOuMgOuhnCDsg4HsnIQg7KCE7YyMICjsnpDrj5kgZmFpbG92ZXIg7JeG7J2MLCBVSSDsl5DshJwg7IiY64+ZIO2GoOq4gClcbiAqXG4gKiBlbnYgYWxsb3dsaXN0OiBQQVRILCBUTVBESVIsIENMQVVERV9DT0RFX09BVVRIX1RPS0VOLCBDTEFVREVfQ09ORklHX0RJUlxuICogICArIENMQVVERV9DT0RFX0RJU0FCTEVfKiArIENMQVVERV9DT0RFX0FUVFJJQlVUSU9OX0hFQURFUlxuICovXG5pbXBvcnQgeyBzcGF3biB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IG1rZGlyU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5cbmltcG9ydCB7IHR5cGUgSnNvblZhbHVlIH0gZnJvbSBcIi4uLy4uL2NvZGV4LXByb3RvY29sL3NlcmRlX2pzb24vSnNvblZhbHVlXCI7XG5pbXBvcnQge1xuICBnZXRBY2Nlc3NUb2tlbixcbiAgZ2V0RXhwaXJlc0F0LFxuICBnZXRSZWZyZXNoVG9rZW4sXG59IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL2NyZWRlbnRpYWxzXCI7XG5pbXBvcnQgeyBjYWxjdWxhdGVDb3N0VXNkIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vbW9kZWwtY29zdFwiO1xuaW1wb3J0IHsgc3RyaWN0aWZ5IH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vc3RyaWN0aWZpZXJcIjtcbmltcG9ydCB7IHR5cGUgT3BlbkFJRGlzcGF0Y2hlciB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvb3BlbmFpL29wZW5haS1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuU3Vic2V0QSB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBkZWNpZGVDb252Um91dGluZywgaXNzdWVDb252Q29udGV4dCB9IGZyb20gXCIuL2NvbnYtcm91dGluZ1wiO1xuaW1wb3J0IHsgdHlwZSBRdWVyeUlucHV0LCB0eXBlIFF1ZXJ5T3V0cHV0LCB0eXBlIFRva2VuU3RhdHMgfSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuaW1wb3J0IHsgbWFza1Rva2VuLCBQcm9jZXNzRXJyb3IsIFF1b3RhRXJyb3IsIFRpbWVvdXRFcnJvciB9IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuU3Vic2NyaWJlciB9IGZyb20gXCIuL3Rva2VuLXN1YnNjcmliZXJcIjtcbmltcG9ydCB7IGFwcGx5VG9vbENhbGxFbXVsYXRpb24sIGJ1aWxkVG9vbENhbGxTY2hlbWEgfSBmcm9tIFwiLi90b29sLWVtdWxhdGlvblwiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIl0pO1xuXG5jb25zdCBERUZBVUxUX01PREVMID0gXCJzb25uZXRcIjtcbmNvbnN0IERFRkFVTFRfVElNRU9VVF9NUyA9IDYwMF8wMDA7XG5jb25zdCBERUZBVUxUX0VGRk9SVCA9IFwiaGlnaFwiO1xuXG4vLyBjbGF1ZGUgQ0xJIOydmCBjd2QuIOydtCDqsr3roZzsnZggLmNsYXVkZS9zZXR0aW5ncy5qc29uIOydtCBwcm9qZWN0IHNjb3BlIOuhnCDroZzrk5zrkJjslrRcbi8vIO2YueyLnOudvOuPhCDsnojsnYQgdXNlciBzY29wZSAofi8uY2xhdWRlL3NldHRpbmdzLmpzb24p66W8IOuNruyWtOyUgCAoLS1zZXR0aW5nLXNvdXJjZXMgcHJvamVjdCDsmYAg7ZWo6ruYKS5cbmNvbnN0IENMQVVERV9DV0QgPSBcIi90bXAvcWdyaWRcIjtcblxuLy8g6riA66Gc67KMIHVzZXIgY29uZmlnIOqyqeumrCDqsr3roZwuIChDQ+yXkOyEnCDtmZjqsr3rs4DsiJjroZwg7J2964qU67OA7IiYKVxuY29uc3QgQ0xBVURFX0NPTkZJR19ESVIgPSBcIi90bXAvcWdyaWQtY29uZmlnXCI7XG5cbi8vIHFncmlkIOyghOyaqSBwcm9qZWN0L2dsb2JhbCBzZXR0aW5ncyDigJQgdXNlciBzY29wZSDqsqnrpqzsmqlcbmNvbnN0IFFHUklEX0NMQVVERV9TRVRUSU5HUyA9IHtcbiAgYWx3YXlzVGhpbmtpbmdFbmFibGVkOiBmYWxzZSwgLy8gdGhpbmtpbmcgYmxvY2sg7LCo64uoXG4gIGluY2x1ZGVHaXRJbnN0cnVjdGlvbnM6IGZhbHNlLCAvLyBzeXN0ZW0gcHJvbXB0IOydmCBnaXQg6rCA7J2065OcIOygnOqxsFxuICBjbGVhbnVwUGVyaW9kRGF5czogMSxcbn07XG5cbi8vIO2GoO2BsCDrp4zro4wg7J6E67CVIOyehOqzhOqwkiDigJQgdG9rZW4uZXhwaXJlZEF07J20IDHrtoQg7JWI7JeQIOunjOujjOuQnOuLpOuptCBxdWVyeSDsi5wg7LK07YGs7ZWY6rOgIHJlZnJlc2guXG5jb25zdCBSRUZSRVNIX1NBRkVUWV9NUyA9IDYwXzAwMDtcblxuZXhwb3J0IGNsYXNzIFFncmlkRGlzcGF0Y2hlckNsYXNzIHtcbiAgdG9rZW5zID0gbmV3IE1hcDxudW1iZXIsIFRva2VuU3Vic2V0QT4oKTtcblxuICAvLyBrZXnquLDrsJgodG9rZW5OYW1lKSDriITsoIEg7Lm07Jq07YSwLiB0b2tlbiDsnbQgT0F1dGggcmVmcmVzaCDroZwg66Gc7YWM7J207Yq465CY64+EIHRva2VuTmFtZSDsnYAg67aI67OA7J206528IOy5tOyatO2EsCDsnKDsp4DrkKhcbiAgcmVxdWVzdENvdW50cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIHJySW5kZXggPSAwO1xuXG4gIC8vIHNvbmFtdS5jb25maWcgb25TdGFydCDsl5DshJwg7LKY66as7ZWY64qUIOuzgOyImFxuICBzdWJzY3JpYmVyOiBUb2tlblN1YnNjcmliZXIgfCBudWxsID0gbnVsbDtcbiAgb3BlbmFpRGlzcGF0Y2hlcjogT3BlbkFJRGlzcGF0Y2hlciB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGNvbnN0IHNldHRpbmdzSnNvbiA9IEpTT04uc3RyaW5naWZ5KFFHUklEX0NMQVVERV9TRVRUSU5HUywgbnVsbCwgMik7XG5cbiAgICBta2RpclN5bmMoYCR7Q0xBVURFX0NXRH0vLmNsYXVkZWAsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIHdyaXRlRmlsZVN5bmMoYCR7Q0xBVURFX0NXRH0vLmNsYXVkZS9zZXR0aW5ncy5qc29uYCwgc2V0dGluZ3NKc29uKTtcblxuICAgIG1rZGlyU3luYyhDTEFVREVfQ09ORklHX0RJUiwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgd3JpdGVGaWxlU3luYyhgJHtDTEFVREVfQ09ORklHX0RJUn0vLmNsYXVkZS5qc29uYCwgXCJ7fVwiKTtcbiAgICB3cml0ZUZpbGVTeW5jKGAke0NMQVVERV9DT05GSUdfRElSfS9zZXR0aW5ncy5qc29uYCwgc2V0dGluZ3NKc29uKTtcbiAgfVxuXG4gIGNvdW50T2YobmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0Q291bnRzLmdldChuYW1lKSA/PyAwO1xuICB9XG5cbiAgLy8gVG9rZW5TdWJzY3JpYmVyIOy9nOuwsSDigJQg7LqQ7IucIG11dGF0aW9uXG4gIHVwc2VydENhY2hlKGlkOiBudW1iZXIsIHJvdzogVG9rZW5TdWJzZXRBKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbnMuc2V0KGlkLCByb3cpO1xuICB9XG5cbiAgcmVtb3ZlQ2FjaGUoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudG9rZW5zLmRlbGV0ZShpZCk7XG4gIH1cblxuICByZXBsYWNlQ2FjaGUocm93czogVG9rZW5TdWJzZXRBW10pOiB2b2lkIHtcbiAgICB0aGlzLnRva2VucyA9IG5ldyBNYXAocm93cy5tYXAoKHIpID0+IFtyLmlkLCByXSkpO1xuICB9XG5cbiAgZ2V0U3RhdHMoKTogVG9rZW5TdGF0c1tdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMudG9rZW5zLnZhbHVlcygpXS5tYXAoKHIpID0+ICh7XG4gICAgICB0b2tlbjogbWFza1Rva2VuKGdldEFjY2Vzc1Rva2VuKHIuY3JlZGVudGlhbHMpKSxcbiAgICAgIG5hbWU6IHIubmFtZSxcbiAgICAgIHByb3ZpZGVyOiByLnByb3ZpZGVyLFxuICAgICAgcmVxdWVzdHM6IHRoaXMuY291bnRPZihyLm5hbWUpLFxuICAgIH0pKTtcbiAgfVxuXG4gIHNlbGVjdFRva2VuKHByb3ZpZGVyID0gXCJhbnRocm9waWNcIik6IFRva2VuU3Vic2V0QSB8IG51bGwge1xuICAgIGNvbnN0IHJvd3MgPSBbLi4udGhpcy50b2tlbnMudmFsdWVzKCldLmZpbHRlcigocikgPT4gci5wcm92aWRlciA9PT0gcHJvdmlkZXIpO1xuICAgIGlmIChyb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBtaW5Db3VudCA9IE1hdGgubWluKC4uLnJvd3MubWFwKChyKSA9PiB0aGlzLmNvdW50T2Yoci5uYW1lKSkpO1xuICAgIGNvbnN0IGlkbGUgPSByb3dzLmZpbHRlcigocikgPT4gdGhpcy5jb3VudE9mKHIubmFtZSkgPT09IG1pbkNvdW50KTtcbiAgICBjb25zdCBwaWNrZWQgPSBpZGxlW3RoaXMucnJJbmRleCAlIGlkbGUubGVuZ3RoXSE7XG4gICAgdGhpcy5yckluZGV4Kys7XG4gICAgcmV0dXJuIHBpY2tlZDtcbiAgfVxuXG4gIGFzeW5jIHF1ZXJ5KGlucHV0OiBRdWVyeUlucHV0LCB0aW1lb3V0TXM/OiBudW1iZXIpOiBQcm9taXNlPFF1ZXJ5T3V0cHV0PiB7XG4gICAgaWYgKGlucHV0LnRvb2xzPy5sZW5ndGggJiYgaW5wdXQuanNvblNjaGVtYSkge1xuICAgICAgdGhyb3cgbmV3IFByb2Nlc3NFcnJvcihcInRvb2xzIGFuZCBqc29uU2NoZW1hIGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dFNjaGVtYSA9IGlucHV0LnRvb2xzPy5sZW5ndGhcbiAgICAgID8gYnVpbGRUb29sQ2FsbFNjaGVtYShpbnB1dC50b29scylcbiAgICAgIDogaW5wdXQuanNvblNjaGVtYVxuICAgICAgICA/IChKU09OLnBhcnNlKGlucHV0Lmpzb25TY2hlbWEpIGFzIEpzb25WYWx1ZSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBwcm92aWRlciBwcmVmaXggcm91dGluZzogJ29wZW5haS9ncHQtNS40JyDihpIgT3BlbkFJRGlzcGF0Y2hlclxuICAgIGlmIChpbnB1dC5tb2RlbD8uaW5jbHVkZXMoXCIvXCIpKSB7XG4gICAgICBjb25zdCBbcHJvdmlkZXIsIG1vZGVsXSA9IGlucHV0Lm1vZGVsLnNwbGl0KFwiL1wiLCAyKTtcbiAgICAgIGFzc2VydChtb2RlbCwgXCJ1bmtub3duIG1vZGVsXCIpO1xuICAgICAgaWYgKHByb3ZpZGVyID09PSBcIm9wZW5haVwiKSB7XG4gICAgICAgIGlmICghdGhpcy5vcGVuYWlEaXNwYXRjaGVyKSB0aHJvdyBuZXcgUXVvdGFFcnJvcihcIk9wZW5BSSBkaXNwYXRjaGVyIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMub3BlbmFpRGlzcGF0Y2hlci5nZW5lcmF0ZSh7XG4gICAgICAgICAgbW9kZWw6IG1vZGVsLFxuICAgICAgICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgICAgICAgIG91dHB1dFNjaGVtYTogb3V0cHV0U2NoZW1hXG4gICAgICAgICAgICA/IChzdHJpY3RpZnkob3V0cHV0U2NoZW1hIGFzIFBhcmFtZXRlcnM8dHlwZW9mIHN0cmljdGlmeT5bMF0pIGFzIEpzb25WYWx1ZSlcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGVmZm9ydDogaW5wdXQuZWZmb3J0LFxuICAgICAgICAgIHZlcmJvc2l0eTogaW5wdXQudmVyYm9zaXR5LFxuICAgICAgICAgIHJlYXNvbmluZ1N1bW1hcnk6IGlucHV0LnJlYXNvbmluZ1N1bW1hcnksXG4gICAgICAgICAgc2VydmljZVRpZXI6IGlucHV0LnNlcnZpY2VUaWVyLFxuICAgICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICAgIGNvbGRIaXN0b3J5OiBkZWNpc2lvbi5jb2xkSGlzdG9yeSxcbiAgICAgICAgICByZXVzZTogZGVjaXNpb24ucmV1c2UsXG4gICAgICAgICAgcmV1c2VJbnB1dDogZGVjaXNpb24ucmV1c2VJbnB1dCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaXNzdWVkQ29vcmQgPSBpc3N1ZUNvbnZDb250ZXh0KHJlc3VsdC50aHJlYWRDb29yZCwgZGVjaXNpb24pO1xuICAgICAgICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbihcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0ZXh0OiByZXN1bHQudGV4dCxcbiAgICAgICAgICAgIHRva2VuTmFtZTogcmVzdWx0LnRva2VuTmFtZSxcbiAgICAgICAgICAgIG1vZGVsOiByZXN1bHQubW9kZWwsXG4gICAgICAgICAgICB1c2FnZToge1xuICAgICAgICAgICAgICBpbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5pbnB1dFRva2VucyxcbiAgICAgICAgICAgICAgb3V0cHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLm91dHB1dFRva2VucyxcbiAgICAgICAgICAgICAgY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zOiAwLFxuICAgICAgICAgICAgICBjYWNoZV9yZWFkX2lucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGR1cmF0aW9uTXM6IHJlc3VsdC5kdXJhdGlvbk1zLFxuICAgICAgICAgICAgY29zdFVzZDogY2FsY3VsYXRlQ29zdFVzZChyZXN1bHQubW9kZWwsIHtcbiAgICAgICAgICAgICAgaW5wdXRUb2tlbnM6IHJlc3VsdC51c2FnZS5pbnB1dFRva2VucyxcbiAgICAgICAgICAgICAgb3V0cHV0VG9rZW5zOiByZXN1bHQudXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgICAgICAgICBjYWNoZWRJbnB1dFRva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBpbnB1dC50b29scyxcbiAgICAgICAgICBpc3N1ZWRDb29yZCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBleGVjdXRpb25JbnB1dCA9XG4gICAgICBvdXRwdXRTY2hlbWEgJiYgaW5wdXQudG9vbHM/Lmxlbmd0aFxuICAgICAgICA/IHsgLi4uaW5wdXQsIGpzb25TY2hlbWE6IEpTT04uc3RyaW5naWZ5KG91dHB1dFNjaGVtYSkgfVxuICAgICAgICA6IGlucHV0O1xuXG4gICAgLy8gQW50aHJvcGljICjquLDsobQgY2xhdWRlIC1wIOqyveuhnClcbiAgICBjb25zdCBlbGVjdGVkVG9rZW4gPSB0aGlzLnNlbGVjdFRva2VuKCk7XG4gICAgaWYgKCFlbGVjdGVkVG9rZW4pIHRocm93IG5ldyBRdW90YUVycm9yKFwiTm8gdG9rZW5zIGF2YWlsYWJsZVwiKTtcblxuICAgIC8vIGF3YWl0IOyghOyXkCBjb3VudCDshKDrsJjsmIEuIOuzkeugrCDsmpTssq3snbQg64+Z7Iuc7JeQIOuPhOywqe2VtOuPhCDqsIHsnpAg64uk66W4IO2GoO2BsOydhCDqs6DrpbTrj4TroZ0uXG4gICAgdGhpcy5yZXF1ZXN0Q291bnRzLnNldChlbGVjdGVkVG9rZW4ubmFtZSwgdGhpcy5jb3VudE9mKGVsZWN0ZWRUb2tlbi5uYW1lKSArIDEpO1xuXG4gICAgbGV0IHRva2VuID0gZ2V0QWNjZXNzVG9rZW4oZWxlY3RlZFRva2VuLmNyZWRlbnRpYWxzKTtcbiAgICAvLyBleHBpcmVzX2F0IOyehOuwleydtOuptCBwcmVlbXB0aXZlIHJlZnJlc2hcbiAgICBjb25zdCBleHBpcmVzQXQgPSBnZXRFeHBpcmVzQXQoZWxlY3RlZFRva2VuLmNyZWRlbnRpYWxzKTtcbiAgICBpZiAoXG4gICAgICBleHBpcmVzQXQgJiZcbiAgICAgIGV4cGlyZXNBdCAtIERhdGUubm93KCkgPCBSRUZSRVNIX1NBRkVUWV9NUyAmJlxuICAgICAgZ2V0UmVmcmVzaFRva2VuKGVsZWN0ZWRUb2tlbi5jcmVkZW50aWFscylcbiAgICApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgUWdyaWRGcmFtZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi9xZ3JpZC5mcmFtZVwiKTtcbiAgICAgICAgdG9rZW4gPSBhd2FpdCBRZ3JpZEZyYW1lLnJlZnJlc2hUb2tlbihlbGVjdGVkVG9rZW4pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIud2FybihgcmVmcmVzaCBmYWlsZWQgZm9yICR7ZWxlY3RlZFRva2VuLm5hbWV9OiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxvZ2dlci5pbmZvKGDihpIgJHtlbGVjdGVkVG9rZW4ubmFtZX0gKG1vZGVsOiAke2lucHV0Lm1vZGVsID8/IERFRkFVTFRfTU9ERUx9KWApO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY3V0ZUNsYXVkZShleGVjdXRpb25JbnB1dCwgdG9rZW4sIHRpbWVvdXRNcyA/PyBERUZBVUxUX1RJTUVPVVRfTVMpO1xuICAgIHJldHVybiBhcHBseVRvb2xDYWxsRW11bGF0aW9uKFxuICAgICAgeyAuLi5yZXN1bHQsIHRva2VuTmFtZTogZWxlY3RlZFRva2VuLm5hbWUsIG1vZGVsOiBpbnB1dC5tb2RlbCA/PyBERUZBVUxUX01PREVMIH0sXG4gICAgICBpbnB1dC50b29scyxcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgcXVlcnlTdHJlYW0oXG4gICAgaW5wdXQ6IFF1ZXJ5SW5wdXQsXG4gICAgY2I6IHtcbiAgICAgIG9uRGVsdGE6ICh0ZXh0OiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgICBvbkNvbXBsZXRlOiAocmVzdWx0OiBRdWVyeU91dHB1dCkgPT4gdm9pZDtcbiAgICAgIG9uRXJyb3I6IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG4gICAgICBvblRocmVhZElkPzogKHRocmVhZElkOiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgICBvblR1cm5JZD86ICh0dXJuSWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgICB9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWlucHV0Lm1vZGVsPy5zdGFydHNXaXRoKFwib3BlbmFpL1wiKSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5xdWVyeShpbnB1dCk7XG4gICAgICBjYi5vbkNvbXBsZXRlKHJlc3VsdCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgWywgbW9kZWxdID0gaW5wdXQubW9kZWwuc3BsaXQoXCIvXCIsIDIpO1xuICAgIGlmICghbW9kZWwpIHRocm93IG5ldyBQcm9jZXNzRXJyb3IoXCJ1bmtub3duIG1vZGVsXCIpO1xuICAgIGlmICghdGhpcy5vcGVuYWlEaXNwYXRjaGVyKSB0aHJvdyBuZXcgUXVvdGFFcnJvcihcIk9wZW5BSSBkaXNwYXRjaGVyIG5vdCBpbml0aWFsaXplZFwiKTtcblxuICAgIGNvbnN0IG91dHB1dFNjaGVtYSA9IGlucHV0LnRvb2xzPy5sZW5ndGhcbiAgICAgID8gYnVpbGRUb29sQ2FsbFNjaGVtYShpbnB1dC50b29scylcbiAgICAgIDogaW5wdXQuanNvblNjaGVtYVxuICAgICAgICA/IChKU09OLnBhcnNlKGlucHV0Lmpzb25TY2hlbWEpIGFzIEpzb25WYWx1ZSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBkZWNpc2lvbiA9IGRlY2lkZUNvbnZSb3V0aW5nKGlucHV0KTtcbiAgICBhd2FpdCB0aGlzLm9wZW5haURpc3BhdGNoZXIuZ2VuZXJhdGVTdHJlYW0oXG4gICAgICB7XG4gICAgICAgIG1vZGVsLFxuICAgICAgICBzeXN0ZW1Qcm9tcHQ6IGlucHV0LnN5c3RlbSxcbiAgICAgICAgb3V0cHV0U2NoZW1hOiBvdXRwdXRTY2hlbWFcbiAgICAgICAgICA/IChzdHJpY3RpZnkob3V0cHV0U2NoZW1hIGFzIFBhcmFtZXRlcnM8dHlwZW9mIHN0cmljdGlmeT5bMF0pIGFzIEpzb25WYWx1ZSlcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgZWZmb3J0OiBpbnB1dC5lZmZvcnQsXG4gICAgICAgIHZlcmJvc2l0eTogaW5wdXQudmVyYm9zaXR5LFxuICAgICAgICByZWFzb25pbmdTdW1tYXJ5OiBpbnB1dC5yZWFzb25pbmdTdW1tYXJ5LFxuICAgICAgICBzZXJ2aWNlVGllcjogaW5wdXQuc2VydmljZVRpZXIsXG4gICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgIHJldXNlOiBkZWNpc2lvbi5yZXVzZSxcbiAgICAgICAgcmV1c2VJbnB1dDogZGVjaXNpb24ucmV1c2VJbnB1dCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG9uRGVsdGE6IGNiLm9uRGVsdGEsXG4gICAgICAgIG9uVGhyZWFkSWQ6IGNiLm9uVGhyZWFkSWQsXG4gICAgICAgIG9uVHVybklkOiBjYi5vblR1cm5JZCxcbiAgICAgICAgb25Db21wbGV0ZTogKHR1cm5SZXN1bHQpID0+IHtcbiAgICAgICAgICBjb25zdCBpc3N1ZWRDb29yZCA9IGlzc3VlQ29udkNvbnRleHQodHVyblJlc3VsdC50aHJlYWRDb29yZCwgZGVjaXNpb24pO1xuICAgICAgICAgIGNvbnN0IGFwcGxpZWQgPSBhcHBseVRvb2xDYWxsRW11bGF0aW9uKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0ZXh0OiB0dXJuUmVzdWx0LnRleHQsXG4gICAgICAgICAgICAgIHRva2VuTmFtZTogdHVyblJlc3VsdC50b2tlbk5hbWUsXG4gICAgICAgICAgICAgIG1vZGVsOiB0dXJuUmVzdWx0Lm1vZGVsLFxuICAgICAgICAgICAgICB1c2FnZToge1xuICAgICAgICAgICAgICAgIGlucHV0X3Rva2VuczogdHVyblJlc3VsdC51c2FnZS5pbnB1dFRva2VucyxcbiAgICAgICAgICAgICAgICBvdXRwdXRfdG9rZW5zOiB0dXJuUmVzdWx0LnVzYWdlLm91dHB1dFRva2VucyxcbiAgICAgICAgICAgICAgICBjYWNoZV9jcmVhdGlvbl9pbnB1dF90b2tlbnM6IDAsXG4gICAgICAgICAgICAgICAgY2FjaGVfcmVhZF9pbnB1dF90b2tlbnM6IHR1cm5SZXN1bHQudXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uTXM6IHR1cm5SZXN1bHQuZHVyYXRpb25NcyxcbiAgICAgICAgICAgICAgY29zdFVzZDogY2FsY3VsYXRlQ29zdFVzZCh0dXJuUmVzdWx0Lm1vZGVsLCB7XG4gICAgICAgICAgICAgICAgaW5wdXRUb2tlbnM6IHR1cm5SZXN1bHQudXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICAgICAgICAgICAgb3V0cHV0VG9rZW5zOiB0dXJuUmVzdWx0LnVzYWdlLm91dHB1dFRva2VucyxcbiAgICAgICAgICAgICAgICBjYWNoZWRJbnB1dFRva2VuczogdHVyblJlc3VsdC51c2FnZS5jYWNoZWRJbnB1dFRva2VucyxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5wdXQudG9vbHMsXG4gICAgICAgICAgICBpc3N1ZWRDb29yZCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNiLm9uQ29tcGxldGUoYXBwbGllZCk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRXJyb3I6IGNiLm9uRXJyb3IsXG4gICAgICB9LFxuICAgICk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUNsYXVkZShcbiAgaW5wdXQ6IFF1ZXJ5SW5wdXQsXG4gIHRva2VuOiBzdHJpbmcsXG4gIHRpbWVvdXRNczogbnVtYmVyLFxuKTogUHJvbWlzZTxPbWl0PFF1ZXJ5T3V0cHV0LCBcImNvbnRlbnRcIiB8IFwiZmluaXNoUmVhc29uXCI+PiB7XG4gIGNvbnN0IHJhd01vZGVsID0gaW5wdXQubW9kZWwgPz8gREVGQVVMVF9NT0RFTDtcbiAgY29uc3QgbW9kZWwgPSByYXdNb2RlbC5pbmNsdWRlcyhcIi9cIikgPyByYXdNb2RlbC5zcGxpdChcIi9cIikucG9wKCkhIDogcmF3TW9kZWw7XG4gIGNvbnN0IHRpbWVvdXQgPSBpbnB1dC50aW1lb3V0ID8/IHRpbWVvdXRNcztcbiAgY29uc3QgdXNlU3RydWN0dXJlZE91dHB1dCA9IGlucHV0Lmpzb25TY2hlbWEgJiYgaW5wdXQuanNvblNjaGVtYS5sZW5ndGggPiAwO1xuXG4gIC8vIC0tdG9vbHMgXCJcIiDroZwg66qo65OgIHRvb2wg7J2EIOq4sOuzuCDssKjri6guIHN0cnVjdHVyZWQgb3V0cHV0IOyTsOuptCBTdHJ1Y3R1cmVkT3V0cHV0IOunjCDtmZTsnbTtirjrpqzsiqTtirguXG4gIC8vIC0tdG9vbHMgXCJcIiDripQg67CY65Oc7IucIOuSpOyXkCDri6Trpbgg7ZSM656Y6re46rCAIOyZgOyVvCBDTEkg7YyM7Iux7J20IOu5iCDrrLjsnpDsl7TroZwg7J247IudXG4gIGNvbnN0IHRvb2xBcmdzID0gdXNlU3RydWN0dXJlZE91dHB1dFxuICAgID8gW1wiLS10b29sc1wiLCBcIlwiLCBcIi0tYWxsb3dlZC10b29sc1wiLCBcIlN0cnVjdHVyZWRPdXRwdXRcIl1cbiAgICA6IFtcIi0tdG9vbHNcIiwgXCJcIl07XG5cbiAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbXG4gICAgXCItcFwiLFxuICAgIC4uLnRvb2xBcmdzLFxuICAgIFwiLS1kaXNhbGxvd2VkVG9vbHNcIixcbiAgICAvLyBDQ+yXkOyEnCDsnpDrj5kg7Zmc7ISx7ZmU65CY64qUIGRlZmVycmVkIOuPhOq1rC4g7Yag7YGwIOy1nOygge2ZlOulvOychO2VtCDssKjri6hcbiAgICAuLi4oW1wiTW9uaXRvclwiLCBcIlB1c2hOb3RpZmljYXRpb25cIiwgXCJSZW1vdGVUcmlnZ2VyXCJdIGFzIGNvbnN0KSxcbiAgICBcIi0tb3V0cHV0LWZvcm1hdFwiLFxuICAgIFwic3RyZWFtLWpzb25cIixcbiAgICBcIi0tdmVyYm9zZVwiLFxuICAgIC8vIC0tbWF4LXR1cm5zOiBzdHJ1Y3R1cmVkIG91dHB1dCDsnYAgdG9vbF91c2UgKyB0b29sX3Jlc3VsdCDroZwgMu2EtCDshozruYRcbiAgICBcIi0tbWF4LXR1cm5zXCIsXG4gICAgdXNlU3RydWN0dXJlZE91dHB1dCA/IFwiMlwiIDogXCIxXCIsXG4gICAgXCItLXBlcm1pc3Npb24tbW9kZVwiLFxuICAgIFwiYnlwYXNzUGVybWlzc2lvbnNcIixcbiAgICBcIi0tc2V0dGluZy1zb3VyY2VzXCIsXG4gICAgXCJwcm9qZWN0XCIsXG4gICAgXCItLW1vZGVsXCIsXG4gICAgbW9kZWwsXG4gICAgLy8gLS1zeXN0ZW0tcHJvbXB064qUIOuwmOuTnOyLnCDrqoXsi5ztlbTslbztlaguIOyYteyFmCDsg53rnrUg7IucIEND6rCAIGRlZmF1bHQgc3lzdGVtIHByb21wdOulvCDsnpDrj5nsnLzroZwg7KO87J6F7ZWoKDIzaylcbiAgICBcIi0tc3lzdGVtLXByb21wdFwiLFxuICAgIGlucHV0LnN5c3RlbSA/PyBcIlwiLFxuICAgIFwiLS10aGlua2luZ1wiLFxuICAgIFwiZGlzYWJsZWRcIixcbiAgICBcIi0tZWZmb3J0XCIsXG4gICAgaW5wdXQuZWZmb3J0ID8/IERFRkFVTFRfRUZGT1JULFxuICAgIFwiLS1uby1zZXNzaW9uLXBlcnNpc3RlbmNlXCIsXG4gICAgLy8g66qo65OgIHNraWxscyDruYTtmZzshLHtmZRcbiAgICBcIi0tZGlzYWJsZS1zbGFzaC1jb21tYW5kc1wiLFxuICBdO1xuICBpZiAodXNlU3RydWN0dXJlZE91dHB1dCkge1xuICAgIGFyZ3MucHVzaChcIi0tanNvbi1zY2hlbWFcIiwgaW5wdXQuanNvblNjaGVtYSEpO1xuICB9XG4gIGFyZ3MucHVzaChpbnB1dC5wcm9tcHQpO1xuXG4gIGNvbnN0IGVudjogTm9kZUpTLlByb2Nlc3NFbnYgPSB7XG4gICAgUEFUSDogcHJvY2Vzcy5lbnYuUEFUSCxcbiAgICBUTVBESVI6IHByb2Nlc3MuZW52LlRNUERJUixcbiAgICBDTEFVREVfQ09ERV9PQVVUSF9UT0tFTjogdG9rZW4sXG4gICAgLy8gQ0xBVURFX0NPTkZJR19ESVIg7ZmY6rK967OA7IiY66GcIOyjvOyehVxuICAgIENMQVVERV9DT05GSUdfRElSLFxuICAgIENMQVVERV9DT0RFX0RJU0FCTEVfQVVUT19NRU1PUlk6IFwiMVwiLFxuICAgIENMQVVERV9DT0RFX0RJU0FCTEVfQURBUFRJVkVfVEhJTktJTkc6IFwiMVwiLFxuICAgIENMQVVERV9DT0RFX0RJU0FCTEVfMU1fQ09OVEVYVDogXCIxXCIsXG4gICAgQ0xBVURFX0NPREVfRElTQUJMRV9DTEFVREVfTURTOiBcIjFcIixcbiAgICBDTEFVREVfQ09ERV9BVFRSSUJVVElPTl9IRUFERVI6IFwiMFwiLFxuICB9O1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZTxPbWl0PFF1ZXJ5T3V0cHV0LCBcImNvbnRlbnRcIiB8IFwiZmluaXNoUmVhc29uXCI+PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bihcImNsYXVkZVwiLCBhcmdzLCB7XG4gICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwicGlwZVwiLCBcImlnbm9yZVwiXSxcbiAgICAgIGVudixcbiAgICAgIC8vIOqyqeumrCAo65GQIOuLqOqzhCk6XG4gICAgICAvLyAxLiBDTEFVREVfQ1dEIOKAlCBwcm9qZWN0IHNjb3BlIOqyqeumrCAoY3dkIOydmCAuY2xhdWRlL3NldHRpbmdzLmpzb24pXG4gICAgICAvLyAyLiBDTEFVREVfQ09ORklHX0RJUiDigJQgdXNlciBzY29wZSDqsqnrpqwgY3dkIOqyqeumrOunjOycvOuhoCDrtoDsobEuXG4gICAgICBjd2Q6IENMQVVERV9DV0QsXG4gICAgfSk7XG5cbiAgICBsZXQgYnVmZmVyID0gXCJcIjtcbiAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICBjaGlsZC5raWxsKCk7XG4gICAgICByZWplY3QobmV3IFRpbWVvdXRFcnJvcihgVGltZW91dCBhZnRlciAke3RpbWVvdXQgLyAxMDAwfXMgKHRva2VuOiAke21hc2tUb2tlbih0b2tlbil9KWApKTtcbiAgICB9LCB0aW1lb3V0KTtcblxuICAgIGNoaWxkLnN0ZG91dD8ub24oXCJkYXRhXCIsIChkOiBCdWZmZXIpID0+IHtcbiAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICBidWZmZXIgKz0gZC50b1N0cmluZygpO1xuICAgICAgY29uc3QgbGluZXMgPSBidWZmZXIuc3BsaXQoXCJcXG5cIik7XG4gICAgICBidWZmZXIgPSBsaW5lcy5wb3AoKSA/PyBcIlwiO1xuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgIGlmICghbGluZS50cmltKCkpIGNvbnRpbnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGogPSBKU09OLnBhcnNlKGxpbmUpO1xuICAgICAgICAgIGlmIChqLnR5cGUgPT09IFwicmVzdWx0XCIgJiYgIXNldHRsZWQpIHtcbiAgICAgICAgICAgIC8vIC0tanNvbi1zY2hlbWEg7IKs7JqpIOyLnCBzdHJ1Y3R1cmVkX291dHB1dCDsl5Ag7YyM7Iux65CcIOqwneyytOqwgCDsmKjri6Qg4oaSIOyasOyEoCDsgqzsmqlcbiAgICAgICAgICAgIGxldCB0ZXh0OiBzdHJpbmc7XG4gICAgICAgICAgICBpZiAoai5zdHJ1Y3R1cmVkX291dHB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHRleHQgPSBKU09OLnN0cmluZ2lmeShqLnN0cnVjdHVyZWRfb3V0cHV0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRleHQgPSAoai5yZXN1bHQgPz8gXCJcIilcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXmBgYCg/Ompzb24pP1xccypcXG4/L2ksIFwiXCIpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcbj9gYGBcXHMqJC9pLCBcIlwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRleHQuc3RhcnRzV2l0aChcIllvdSd2ZSBoaXRcIikpIHtcbiAgICAgICAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICAgIHJlamVjdChuZXcgUXVvdGFFcnJvcihgUXVvdGEgZXhoYXVzdGVkICh0b2tlbjogJHttYXNrVG9rZW4odG9rZW4pfSlgKSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdSA9IGoudXNhZ2UgPz8ge307XG4gICAgICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgICAgdXNhZ2U6IHtcbiAgICAgICAgICAgICAgICBpbnB1dF90b2tlbnM6IHUuaW5wdXRfdG9rZW5zID8/IDAsXG4gICAgICAgICAgICAgICAgb3V0cHV0X3Rva2VuczogdS5vdXRwdXRfdG9rZW5zID8/IDAsXG4gICAgICAgICAgICAgICAgY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zOiB1LmNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2VucyA/PyAwLFxuICAgICAgICAgICAgICAgIGNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zOiB1LmNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zID8/IDAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uTXM6IGouZHVyYXRpb25fbXMgPz8gMCxcbiAgICAgICAgICAgICAgY29zdFVzZDogai50b3RhbF9jb3N0X3VzZCA/PyAwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHt9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjaGlsZC5vbihcImNsb3NlXCIsICgpID0+IHtcbiAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICByZWplY3QobmV3IFByb2Nlc3NFcnJvcihgQ0xJIHByb2Nlc3MgY2xvc2VkIHdpdGhvdXQgcmVzdWx0ICh0b2tlbjogJHttYXNrVG9rZW4odG9rZW4pfSlgKSk7XG4gICAgfSk7XG5cbiAgICBjaGlsZC5vbihcImVycm9yXCIsIChlcnIpID0+IHtcbiAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICByZWplY3QobmV3IFByb2Nlc3NFcnJvcihgQ0xJIHByb2Nlc3MgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9ICh0b2tlbjogJHttYXNrVG9rZW4odG9rZW4pfSlgKSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5leHBvcnQgY29uc3QgUWdyaWREaXNwYXRjaGVyID0gbmV3IFFncmlkRGlzcGF0Y2hlckNsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtDQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFFBQVEsQ0FBQztBQUVuQyxNQUFNLGdCQUFnQjtBQUN0QixNQUFNLHFCQUFxQjtBQUMzQixNQUFNLGlCQUFpQjtBQUl2QixNQUFNLGFBQWE7QUFHbkIsTUFBTSxvQkFBb0I7QUFHMUIsTUFBTSx3QkFBd0I7Q0FDNUIsdUJBQXVCO0NBQ3ZCLHdCQUF3QjtDQUN4QixtQkFBbUI7Q0FDcEI7QUFHRCxNQUFNLG9CQUFvQjtBQUUxQixJQUFhLHVCQUFiLE1BQWtDO0NBQ2hDLHlCQUFTLElBQUksS0FBMkI7Q0FHeEMsZ0NBQWdCLElBQUksS0FBcUI7Q0FDekMsVUFBVTtDQUdWLGFBQXFDO0NBQ3JDLG1CQUE0QztDQUU1QyxjQUFjO0VBQ1osTUFBTSxlQUFlLEtBQUssVUFBVSx1QkFBdUIsTUFBTSxFQUFFO0FBRW5FLFlBQVUsR0FBRyxXQUFXLFdBQVcsRUFBRSxXQUFXLE1BQU0sQ0FBQztBQUN2RCxnQkFBYyxHQUFHLFdBQVcseUJBQXlCLGFBQWE7QUFFbEUsWUFBVSxtQkFBbUIsRUFBRSxXQUFXLE1BQU0sQ0FBQztBQUNqRCxnQkFBYyxHQUFHLGtCQUFrQixnQkFBZ0IsS0FBSztBQUN4RCxnQkFBYyxHQUFHLGtCQUFr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
352
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZGlzcGF0Y2hlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZGlzcGF0Y2hlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJub2RlOmFzc2VydFwiO1xuLyoqXG4gKiBRZ3JpZERpc3BhdGNoZXIg4oCUIE9BdXRoIO2GoO2BsCDshKDtg50gKyBjbGF1ZGUgQ0xJIGZyZXNoIHNwYXduIOuUlOyKpO2MqOyymCDsi7HquIDthLQuXG4gKlxuICogLSDrp6Qg7JqU7LKt66eI64ukIOyDiCBjbGF1ZGUgQ0xJIO2UhOuhnOyEuOyKpCBzcGF3biDihpIg7J2R64u1IO2bhCDsooXro4xcbiAqIC0gbGVhc3QtdXNlZCByb3VuZC1yb2JpbiDsnLzroZwg7Yag7YGwIOyEoO2DnVxuICogLSDrqZTrqqjrpqwg7LqQ7IucIChNYXA8aWQsIFRva2VuU3Vic2V0QT4pIOuKlCBUb2tlblN1YnNjcmliZXIg6rCAIHBnIExJU1RFTi9OT1RJRlkg66GcIOqwseyLoFxuICogLSBxdWVyeSDsi5wgZXhwaXJlc19hdCDruYTqtZAg4oaSIOyehOuwlSDsi5wgcHJlZW1wdGl2ZSByZWZyZXNoXG4gKiAtIFF1b3RhRXJyb3Ig64qUIOq3uOuMgOuhnCDsg4HsnIQg7KCE7YyMICjsnpDrj5kgZmFpbG92ZXIg7JeG7J2MLCBVSSDsl5DshJwg7IiY64+ZIO2GoOq4gClcbiAqXG4gKiBlbnYgYWxsb3dsaXN0OiBQQVRILCBUTVBESVIsIENMQVVERV9DT0RFX09BVVRIX1RPS0VOLCBDTEFVREVfQ09ORklHX0RJUlxuICogICArIENMQVVERV9DT0RFX0RJU0FCTEVfKiArIENMQVVERV9DT0RFX0FUVFJJQlVUSU9OX0hFQURFUlxuICovXG5pbXBvcnQgeyBzcGF3biB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IG1rZGlyU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5cbmltcG9ydCB7IHR5cGUgSnNvblZhbHVlIH0gZnJvbSBcIi4uLy4uL2NvZGV4LXByb3RvY29sL3NlcmRlX2pzb24vSnNvblZhbHVlXCI7XG5pbXBvcnQgeyBjYW5vbmljYWxBbnRocm9waWNNb2RlbCB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvYW50aHJvcGljL2FudGhyb3BpYy1jb25zdGFudHNcIjtcbmltcG9ydCB7IHR5cGUgQW50aHJvcGljRGlzcGF0Y2hlciB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvYW50aHJvcGljL2FudGhyb3BpYy1kaXNwYXRjaGVyXCI7XG5pbXBvcnQge1xuICBnZXRBY2Nlc3NUb2tlbixcbiAgZ2V0RXhwaXJlc0F0LFxuICBnZXRSZWZyZXNoVG9rZW4sXG59IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL2NyZWRlbnRpYWxzXCI7XG5pbXBvcnQgeyBjYWxjdWxhdGVDb3N0VXNkIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vbW9kZWwtY29zdFwiO1xuaW1wb3J0IHsgdHlwZSBHZW5lcmF0ZVJlc3VsdCB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3Byb3ZpZGVyLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IHN0cmljdGlmeSB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3N0cmljdGlmaWVyXCI7XG5pbXBvcnQgeyB0eXBlIE9wZW5BSURpc3BhdGNoZXIgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL29wZW5haS9vcGVuYWktZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNldEEgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgZGVjaWRlQ29udlJvdXRpbmcsIGlzc3VlQ29udkNvbnRleHQgfSBmcm9tIFwiLi9jb252LXJvdXRpbmdcIjtcbmltcG9ydCB7IHR5cGUgUXVlcnlJbnB1dCwgdHlwZSBRdWVyeU91dHB1dCwgdHlwZSBUb2tlblN0YXRzIH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IG1hc2tUb2tlbiwgUHJvY2Vzc0Vycm9yLCBRdW90YUVycm9yLCBUaW1lb3V0RXJyb3IgfSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNjcmliZXIgfSBmcm9tIFwiLi90b2tlbi1zdWJzY3JpYmVyXCI7XG5pbXBvcnQgeyBhcHBseVRvb2xDYWxsRW11bGF0aW9uLCBidWlsZFRvb2xDYWxsU2NoZW1hIH0gZnJvbSBcIi4vdG9vbC1lbXVsYXRpb25cIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCJdKTtcblxuY29uc3QgREVGQVVMVF9NT0RFTCA9IFwic29ubmV0XCI7XG5jb25zdCBERUZBVUxUX1RJTUVPVVRfTVMgPSA2MDBfMDAwO1xuY29uc3QgREVGQVVMVF9FRkZPUlQgPSBcImhpZ2hcIjtcblxuLy8gY2xhdWRlIENMSSDsnZggY3dkLiDsnbQg6rK966Gc7J2YIC5jbGF1ZGUvc2V0dGluZ3MuanNvbiDsnbQgcHJvamVjdCBzY29wZSDroZwg66Gc65Oc65CY7Ja0XG4vLyDtmLnsi5zrnbzrj4Qg7J6I7J2EIHVzZXIgc2NvcGUgKH4vLmNsYXVkZS9zZXR0aW5ncy5qc29uKeulvCDrja7slrTslIAgKC0tc2V0dGluZy1zb3VyY2VzIHByb2plY3Qg7JmAIO2VqOq7mCkuXG5jb25zdCBDTEFVREVfQ1dEID0gXCIvdG1wL3FncmlkXCI7XG5cbi8vIOq4gOuhnOuyjCB1c2VyIGNvbmZpZyDqsqnrpqwg6rK966GcLiAoQ0Psl5DshJwg7ZmY6rK967OA7IiY66GcIOydveuKlOuzgOyImClcbmNvbnN0IENMQVVERV9DT05GSUdfRElSID0gXCIvdG1wL3FncmlkLWNvbmZpZ1wiO1xuXG4vLyBxZ3JpZCDsoITsmqkgcHJvamVjdC9nbG9iYWwgc2V0dGluZ3Mg4oCUIHVzZXIgc2NvcGUg6rKp66as7JqpXG5jb25zdCBRR1JJRF9DTEFVREVfU0VUVElOR1MgPSB7XG4gIGFsd2F5c1RoaW5raW5nRW5hYmxlZDogZmFsc2UsIC8vIHRoaW5raW5nIGJsb2NrIOywqOuLqFxuICBpbmNsdWRlR2l0SW5zdHJ1Y3Rpb25zOiBmYWxzZSwgLy8gc3lzdGVtIHByb21wdCDsnZggZ2l0IOqwgOydtOuTnCDsoJzqsbBcbiAgY2xlYW51cFBlcmlvZERheXM6IDEsXG59O1xuXG4vLyDthqDtgbAg66eM66OMIOyehOuwlSDsnoTqs4TqsJIg4oCUIHRva2VuLmV4cGlyZWRBdOydtCAx67aEIOyViOyXkCDrp4zro4zrkJzri6TrqbQgcXVlcnkg7IucIOyytO2BrO2VmOqzoCByZWZyZXNoLlxuY29uc3QgUkVGUkVTSF9TQUZFVFlfTVMgPSA2MF8wMDA7XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFN0cmljdE91dHB1dFNjaGVtYShcbiAgaW5wdXQ6IFBpY2s8UXVlcnlJbnB1dCwgXCJ0b29sc1wiIHwgXCJqc29uU2NoZW1hXCI+LFxuKTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgb3V0cHV0U2NoZW1hID0gaW5wdXQudG9vbHM/Lmxlbmd0aFxuICAgID8gYnVpbGRUb29sQ2FsbFNjaGVtYShpbnB1dC50b29scylcbiAgICA6IGlucHV0Lmpzb25TY2hlbWFcbiAgICAgID8gKEpTT04ucGFyc2UoaW5wdXQuanNvblNjaGVtYSkgYXMgSnNvblZhbHVlKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIG91dHB1dFNjaGVtYVxuICAgID8gKHN0cmljdGlmeShvdXRwdXRTY2hlbWEgYXMgUGFyYW1ldGVyczx0eXBlb2Ygc3RyaWN0aWZ5PlswXSkgYXMgSnNvblZhbHVlKVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY2xhc3MgUWdyaWREaXNwYXRjaGVyQ2xhc3Mge1xuICB0b2tlbnMgPSBuZXcgTWFwPG51bWJlciwgVG9rZW5TdWJzZXRBPigpO1xuXG4gIC8vIGtleeq4sOuwmCh0b2tlbk5hbWUpIOuIhOyggSDsubTsmrTthLAuIHRva2VuIOydtCBPQXV0aCByZWZyZXNoIOuhnCDroZzthYzsnbTtirjrkJjrj4QgdG9rZW5OYW1lIOydgCDrtojrs4DsnbTrnbwg7Lm07Jq07YSwIOycoOyngOuQqFxuICByZXF1ZXN0Q291bnRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgcnJJbmRleCA9IDA7XG5cbiAgLy8gc29uYW11LmNvbmZpZyBvblN0YXJ0IOyXkOyEnCDsspjrpqztlZjripQg67OA7IiYXG4gIHN1YnNjcmliZXI6IFRva2VuU3Vic2NyaWJlciB8IG51bGwgPSBudWxsO1xuICBvcGVuYWlEaXNwYXRjaGVyOiBPcGVuQUlEaXNwYXRjaGVyIHwgbnVsbCA9IG51bGw7XG4gIGFudGhyb3BpY0Rpc3BhdGNoZXI6IEFudGhyb3BpY0Rpc3BhdGNoZXIgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBjb25zdCBzZXR0aW5nc0pzb24gPSBKU09OLnN0cmluZ2lmeShRR1JJRF9DTEFVREVfU0VUVElOR1MsIG51bGwsIDIpO1xuXG4gICAgbWtkaXJTeW5jKGAke0NMQVVERV9DV0R9Ly5jbGF1ZGVgLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB3cml0ZUZpbGVTeW5jKGAke0NMQVVERV9DV0R9Ly5jbGF1ZGUvc2V0dGluZ3MuanNvbmAsIHNldHRpbmdzSnNvbik7XG5cbiAgICBta2RpclN5bmMoQ0xBVURFX0NPTkZJR19ESVIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIHdyaXRlRmlsZVN5bmMoYCR7Q0xBVURFX0NPTkZJR19ESVJ9Ly5jbGF1ZGUuanNvbmAsIFwie31cIik7XG4gICAgd3JpdGVGaWxlU3luYyhgJHtDTEFVREVfQ09ORklHX0RJUn0vc2V0dGluZ3MuanNvbmAsIHNldHRpbmdzSnNvbik7XG4gIH1cblxuICBjb3VudE9mKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdENvdW50cy5nZXQobmFtZSkgPz8gMDtcbiAgfVxuXG4gIC8vIFRva2VuU3Vic2NyaWJlciDsvZzrsLEg4oCUIOy6kOyLnCBtdXRhdGlvblxuICB1cHNlcnRDYWNoZShpZDogbnVtYmVyLCByb3c6IFRva2VuU3Vic2V0QSk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5zLnNldChpZCwgcm93KTtcbiAgfVxuXG4gIHJlbW92ZUNhY2hlKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnRva2Vucy5kZWxldGUoaWQpO1xuICB9XG5cbiAgcmVwbGFjZUNhY2hlKHJvd3M6IFRva2VuU3Vic2V0QVtdKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbnMgPSBuZXcgTWFwKHJvd3MubWFwKChyKSA9PiBbci5pZCwgcl0pKTtcbiAgfVxuXG4gIGdldFN0YXRzKCk6IFRva2VuU3RhdHNbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnRva2Vucy52YWx1ZXMoKV0ubWFwKChyKSA9PiAoe1xuICAgICAgdG9rZW46IG1hc2tUb2tlbihnZXRBY2Nlc3NUb2tlbihyLmNyZWRlbnRpYWxzKSksXG4gICAgICBuYW1lOiByLm5hbWUsXG4gICAgICBwcm92aWRlcjogci5wcm92aWRlcixcbiAgICAgIHJlcXVlc3RzOiB0aGlzLmNvdW50T2Yoci5uYW1lKSxcbiAgICB9KSk7XG4gIH1cblxuICBzZWxlY3RUb2tlbihwcm92aWRlciA9IFwiYW50aHJvcGljXCIpOiBUb2tlblN1YnNldEEgfCBudWxsIHtcbiAgICBjb25zdCByb3dzID0gWy4uLnRoaXMudG9rZW5zLnZhbHVlcygpXS5maWx0ZXIoKHIpID0+IHIucHJvdmlkZXIgPT09IHByb3ZpZGVyKTtcbiAgICBpZiAocm93cy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgbWluQ291bnQgPSBNYXRoLm1pbiguLi5yb3dzLm1hcCgocikgPT4gdGhpcy5jb3VudE9mKHIubmFtZSkpKTtcbiAgICBjb25zdCBpZGxlID0gcm93cy5maWx0ZXIoKHIpID0+IHRoaXMuY291bnRPZihyLm5hbWUpID09PSBtaW5Db3VudCk7XG4gICAgY29uc3QgcGlja2VkID0gaWRsZVt0aGlzLnJySW5kZXggJSBpZGxlLmxlbmd0aF0hO1xuICAgIHRoaXMucnJJbmRleCsrO1xuICAgIHJldHVybiBwaWNrZWQ7XG4gIH1cblxuICBhc3luYyBxdWVyeShpbnB1dDogUXVlcnlJbnB1dCwgdGltZW91dE1zPzogbnVtYmVyKTogUHJvbWlzZTxRdWVyeU91dHB1dD4ge1xuICAgIGlmIChpbnB1dC50b29scz8ubGVuZ3RoICYmIGlucHV0Lmpzb25TY2hlbWEpIHtcbiAgICAgIHRocm93IG5ldyBQcm9jZXNzRXJyb3IoXCJ0b29scyBhbmQganNvblNjaGVtYSBjYW5ub3QgYmUgdXNlZCB0b2dldGhlclwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBvdXRwdXRTY2hlbWEgPSBidWlsZFN0cmljdE91dHB1dFNjaGVtYShpbnB1dCk7XG5cbiAgICAvLyBwcm92aWRlciBwcmVmaXggcm91dGluZzogJ29wZW5haS9ncHQtNS40JyDihpIgT3BlbkFJRGlzcGF0Y2hlclxuICAgIGlmIChpbnB1dC5tb2RlbD8uaW5jbHVkZXMoXCIvXCIpKSB7XG4gICAgICBjb25zdCBbcHJvdmlkZXIsIG1vZGVsXSA9IGlucHV0Lm1vZGVsLnNwbGl0KFwiL1wiLCAyKTtcbiAgICAgIGFzc2VydChtb2RlbCwgXCJ1bmtub3duIG1vZGVsXCIpO1xuICAgICAgaWYgKHByb3ZpZGVyID09PSBcIm9wZW5haVwiKSB7XG4gICAgICAgIGlmICghdGhpcy5vcGVuYWlEaXNwYXRjaGVyKSB0aHJvdyBuZXcgUXVvdGFFcnJvcihcIk9wZW5BSSBkaXNwYXRjaGVyIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMub3BlbmFpRGlzcGF0Y2hlci5nZW5lcmF0ZSh7XG4gICAgICAgICAgbW9kZWw6IG1vZGVsLFxuICAgICAgICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgICAgICAgIG91dHB1dFNjaGVtYSxcbiAgICAgICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgICAgICB2ZXJib3NpdHk6IGlucHV0LnZlcmJvc2l0eSxcbiAgICAgICAgICByZWFzb25pbmdTdW1tYXJ5OiBpbnB1dC5yZWFzb25pbmdTdW1tYXJ5LFxuICAgICAgICAgIHNlcnZpY2VUaWVyOiBpbnB1dC5zZXJ2aWNlVGllcixcbiAgICAgICAgICBjb2xkSW5wdXQ6IGRlY2lzaW9uLmNvbGRJbnB1dCxcbiAgICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgICAgcmV1c2U6IGRlY2lzaW9uLnJldXNlLFxuICAgICAgICAgIHJldXNlSW5wdXQ6IGRlY2lzaW9uLnJldXNlSW5wdXQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGlzc3VlZENvb3JkID0gaXNzdWVDb252Q29udGV4dChyZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKTtcbiAgICAgICAgcmV0dXJuIGFwcGx5VG9vbENhbGxFbXVsYXRpb24odG9FbXVsYXRpb25SZXN1bHQocmVzdWx0KSwgaW5wdXQudG9vbHMsIGlzc3VlZENvb3JkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBbnRocm9waWMg4oCUIEFudGhyb3BpY0Rpc3BhdGNoZXIo66mA7Yuw7YS0IHNlc3Npb24gcmVzdW1lKSDqsr3roZwuIE9wZW5BSSDqsr3roZzsmYAg64+Z7ZiVLlxuICAgIGlmICh0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIpIHtcbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hbnRocm9waWNEaXNwYXRjaGVyLmdlbmVyYXRlKHtcbiAgICAgICAgLy8gbW9kZWwg66+47KeA7KCV7J2066m0IEFudGhyb3BpY0Rpc3BhdGNoZXIg6rCAIEFOVEhST1BJQ19ERUZBVUxUX01PREVMIOyggeyaqSDigJQgXCJzb25uZXRcIiDrs4Tsua3snYRcbiAgICAgICAgLy8g6rCV7KCc66GcIOuBvOybjCBkaXNwYXRjaGVyIGRlZmF1bHQg66W8IOyjveydtOyngCDslYrripTri6QuIHByZWZpeCDsoJXqt5ztmZTrj4QgZGlzcGF0Y2hlciDrgrTrtoDsl5DshJwuXG4gICAgICAgIG1vZGVsOiBpbnB1dC5tb2RlbCxcbiAgICAgICAgc3lzdGVtUHJvbXB0OiBpbnB1dC5zeXN0ZW0sXG4gICAgICAgIG91dHB1dFNjaGVtYSxcbiAgICAgICAgZWZmb3J0OiBpbnB1dC5lZmZvcnQsXG4gICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgIHJldXNlOiBkZWNpc2lvbi5yZXVzZSxcbiAgICAgICAgcmV1c2VJbnB1dDogZGVjaXNpb24ucmV1c2VJbnB1dCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBpc3N1ZWRDb29yZCA9IGlzc3VlQ29udkNvbnRleHQocmVzdWx0LnRocmVhZENvb3JkLCBkZWNpc2lvbik7XG4gICAgICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdChyZXN1bHQpLCBpbnB1dC50b29scywgaXNzdWVkQ29vcmQpO1xuICAgIH1cblxuICAgIC8vIO2PtOuwsTogQW50aHJvcGljRGlzcGF0Y2hlciDrr7jstIjquLDtmZQg7IucIOq4sOyhtCBzdGF0ZWxlc3MgY2xhdWRlIC1wIOqyveuhnCjrqYDti7DthLQg7JeG7J2MKS5cbiAgICBjb25zdCBleGVjdXRpb25JbnB1dCA9IG91dHB1dFNjaGVtYVxuICAgICAgPyB7IC4uLmlucHV0LCBqc29uU2NoZW1hOiBKU09OLnN0cmluZ2lmeShvdXRwdXRTY2hlbWEpIH1cbiAgICAgIDogaW5wdXQ7XG5cbiAgICBjb25zdCBlbGVjdGVkVG9rZW4gPSB0aGlzLnNlbGVjdFRva2VuKCk7XG4gICAgaWYgKCFlbGVjdGVkVG9rZW4pIHRocm93IG5ldyBRdW90YUVycm9yKFwiTm8gdG9rZW5zIGF2YWlsYWJsZVwiKTtcblxuICAgIC8vIGF3YWl0IOyghOyXkCBjb3VudCDshKDrsJjsmIEuIOuzkeugrCDsmpTssq3snbQg64+Z7Iuc7JeQIOuPhOywqe2VtOuPhCDqsIHsnpAg64uk66W4IO2GoO2BsOydhCDqs6DrpbTrj4TroZ0uXG4gICAgdGhpcy5yZXF1ZXN0Q291bnRzLnNldChlbGVjdGVkVG9rZW4ubmFtZSwgdGhpcy5jb3VudE9mKGVsZWN0ZWRUb2tlbi5uYW1lKSArIDEpO1xuXG4gICAgbGV0IHRva2VuID0gZ2V0QWNjZXNzVG9rZW4oZWxlY3RlZFRva2VuLmNyZWRlbnRpYWxzKTtcbiAgICAvLyBleHBpcmVzX2F0IOyehOuwleydtOuptCBwcmVlbXB0aXZlIHJlZnJlc2hcbiAgICBjb25zdCBleHBpcmVzQXQgPSBnZXRFeHBpcmVzQXQoZWxlY3RlZFRva2VuLmNyZWRlbnRpYWxzKTtcbiAgICBpZiAoXG4gICAgICBleHBpcmVzQXQgJiZcbiAgICAgIGV4cGlyZXNBdCAtIERhdGUubm93KCkgPCBSRUZSRVNIX1NBRkVUWV9NUyAmJlxuICAgICAgZ2V0UmVmcmVzaFRva2VuKGVsZWN0ZWRUb2tlbi5jcmVkZW50aWFscylcbiAgICApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgUWdyaWRGcmFtZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi9xZ3JpZC5mcmFtZVwiKTtcbiAgICAgICAgdG9rZW4gPSBhd2FpdCBRZ3JpZEZyYW1lLnJlZnJlc2hUb2tlbihlbGVjdGVkVG9rZW4pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIud2FybihgcmVmcmVzaCBmYWlsZWQgZm9yICR7ZWxlY3RlZFRva2VuLm5hbWV9OiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxvZ2dlci5pbmZvKGDihpIgJHtlbGVjdGVkVG9rZW4ubmFtZX0gKG1vZGVsOiAke2lucHV0Lm1vZGVsID8/IERFRkFVTFRfTU9ERUx9KWApO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY3V0ZUNsYXVkZShleGVjdXRpb25JbnB1dCwgdG9rZW4sIHRpbWVvdXRNcyA/PyBERUZBVUxUX1RJTUVPVVRfTVMpO1xuICAgIHJldHVybiBhcHBseVRvb2xDYWxsRW11bGF0aW9uKFxuICAgICAgLy8gbW9kZWwg64+EIGNhbm9uaWNhbCDroZwg4oCUIGZhbGxiYWNrIOuPhCBjb3N0L+2RnOq4sOqwgCBtYWluIOqyveuhnOyZgCDsnbzsuZjtlZjqsowuXG4gICAgICB7IC4uLnJlc3VsdCwgdG9rZW5OYW1lOiBlbGVjdGVkVG9rZW4ubmFtZSwgbW9kZWw6IGNhbm9uaWNhbEFudGhyb3BpY01vZGVsKGlucHV0Lm1vZGVsKSB9LFxuICAgICAgaW5wdXQudG9vbHMsXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHF1ZXJ5U3RyZWFtKFxuICAgIGlucHV0OiBRdWVyeUlucHV0LFxuICAgIGNiOiB7XG4gICAgICBvbkRlbHRhOiAodGV4dDogc3RyaW5nKSA9PiB2b2lkO1xuICAgICAgb25Db21wbGV0ZTogKHJlc3VsdDogUXVlcnlPdXRwdXQpID0+IHZvaWQ7XG4gICAgICBvbkVycm9yOiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xuICAgICAgb25UaHJlYWRJZD86ICh0aHJlYWRJZDogc3RyaW5nKSA9PiB2b2lkO1xuICAgICAgb25UdXJuSWQ/OiAodHVybklkOiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgfSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQW50aHJvcGljIOyKpO2KuOumrOuwjTogb3BlbmFpLyBwcmVmaXgg6rCAIOyVhOuLiOuptCBhbnRocm9waWMg6rK966GcLlxuICAgIGlmICghaW5wdXQubW9kZWw/LnN0YXJ0c1dpdGgoXCJvcGVuYWkvXCIpKSB7XG4gICAgICAvLyBBbnRocm9waWNEaXNwYXRjaGVyIOqwgCDsnojsnLzrqbQg7Iuk7KCcIGRlbHRhIOyKpO2KuOumrOuwjS4g7JeG7Jy866m0IOq4sOyhtCBxdWVyeSgpIO2PtOuwsShkZWx0YSDsl4bsnYwpLlxuICAgICAgaWYgKHRoaXMuYW50aHJvcGljRGlzcGF0Y2hlcikge1xuICAgICAgICBjb25zdCBvdXRwdXRTY2hlbWEgPSBidWlsZFN0cmljdE91dHB1dFNjaGVtYShpbnB1dCk7XG4gICAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQpO1xuICAgICAgICBhd2FpdCB0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIuZ2VuZXJhdGVTdHJlYW0oXG4gICAgICAgICAge1xuICAgICAgICAgICAgLy8gbW9kZWwg66+47KeA7KCVIOyLnCBkaXNwYXRjaGVyIOqwgCBBTlRIUk9QSUNfREVGQVVMVF9NT0RFTCDsoIHsmqkuIHByZWZpeCDsoJXqt5ztmZTrj4Qg64K067aA7JeQ7IScLlxuICAgICAgICAgICAgbW9kZWw6IGlucHV0Lm1vZGVsLFxuICAgICAgICAgICAgc3lzdGVtUHJvbXB0OiBpbnB1dC5zeXN0ZW0sXG4gICAgICAgICAgICBvdXRwdXRTY2hlbWEsXG4gICAgICAgICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICAgICAgY29sZEhpc3Rvcnk6IGRlY2lzaW9uLmNvbGRIaXN0b3J5LFxuICAgICAgICAgICAgcmV1c2U6IGRlY2lzaW9uLnJldXNlLFxuICAgICAgICAgICAgcmV1c2VJbnB1dDogZGVjaXNpb24ucmV1c2VJbnB1dCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9uRGVsdGE6IGNiLm9uRGVsdGEsXG4gICAgICAgICAgICBvblRocmVhZElkOiBjYi5vblRocmVhZElkLFxuICAgICAgICAgICAgb25Db21wbGV0ZTogKHR1cm5SZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgaXNzdWVkQ29vcmQgPSBpc3N1ZUNvbnZDb250ZXh0KHR1cm5SZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKTtcbiAgICAgICAgICAgICAgY2Iub25Db21wbGV0ZShcbiAgICAgICAgICAgICAgICBhcHBseVRvb2xDYWxsRW11bGF0aW9uKHRvRW11bGF0aW9uUmVzdWx0KHR1cm5SZXN1bHQpLCBpbnB1dC50b29scywgaXNzdWVkQ29vcmQpLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uRXJyb3I6IGNiLm9uRXJyb3IsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5xdWVyeShpbnB1dCk7XG4gICAgICBjYi5vbkNvbXBsZXRlKHJlc3VsdCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgWywgbW9kZWxdID0gaW5wdXQubW9kZWwuc3BsaXQoXCIvXCIsIDIpO1xuICAgIGlmICghbW9kZWwpIHRocm93IG5ldyBQcm9jZXNzRXJyb3IoXCJ1bmtub3duIG1vZGVsXCIpO1xuICAgIGlmICghdGhpcy5vcGVuYWlEaXNwYXRjaGVyKSB0aHJvdyBuZXcgUXVvdGFFcnJvcihcIk9wZW5BSSBkaXNwYXRjaGVyIG5vdCBpbml0aWFsaXplZFwiKTtcblxuICAgIGNvbnN0IG91dHB1dFNjaGVtYSA9IGJ1aWxkU3RyaWN0T3V0cHV0U2NoZW1hKGlucHV0KTtcblxuICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQpO1xuICAgIGF3YWl0IHRoaXMub3BlbmFpRGlzcGF0Y2hlci5nZW5lcmF0ZVN0cmVhbShcbiAgICAgIHtcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgICAgICBvdXRwdXRTY2hlbWEsXG4gICAgICAgIGVmZm9ydDogaW5wdXQuZWZmb3J0LFxuICAgICAgICB2ZXJib3NpdHk6IGlucHV0LnZlcmJvc2l0eSxcbiAgICAgICAgcmVhc29uaW5nU3VtbWFyeTogaW5wdXQucmVhc29uaW5nU3VtbWFyeSxcbiAgICAgICAgc2VydmljZVRpZXI6IGlucHV0LnNlcnZpY2VUaWVyLFxuICAgICAgICBjb2xkSW5wdXQ6IGRlY2lzaW9uLmNvbGRJbnB1dCxcbiAgICAgICAgY29sZEhpc3Rvcnk6IGRlY2lzaW9uLmNvbGRIaXN0b3J5LFxuICAgICAgICByZXVzZTogZGVjaXNpb24ucmV1c2UsXG4gICAgICAgIHJldXNlSW5wdXQ6IGRlY2lzaW9uLnJldXNlSW5wdXQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBvbkRlbHRhOiBjYi5vbkRlbHRhLFxuICAgICAgICBvblRocmVhZElkOiBjYi5vblRocmVhZElkLFxuICAgICAgICBvblR1cm5JZDogY2Iub25UdXJuSWQsXG4gICAgICAgIG9uQ29tcGxldGU6ICh0dXJuUmVzdWx0KSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNzdWVkQ29vcmQgPSBpc3N1ZUNvbnZDb250ZXh0KHR1cm5SZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKTtcbiAgICAgICAgICBjYi5vbkNvbXBsZXRlKFxuICAgICAgICAgICAgYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdCh0dXJuUmVzdWx0KSwgaW5wdXQudG9vbHMsIGlzc3VlZENvb3JkKSxcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBjYi5vbkVycm9yLFxuICAgICAgfSxcbiAgICApO1xuICB9XG59XG5cbi8vIEdlbmVyYXRlUmVzdWx0KHByb3ZpZGVyIGRpc3BhdGNoZXIg7J2R64u1KeulvCBhcHBseVRvb2xDYWxsRW11bGF0aW9uIOyeheugpSBzaGFwZSDroZwg66ek7ZWR7ZWc64ukLlxuLy8gT3BlbkFJL0FudGhyb3BpYywgcXVlcnkvcXVlcnlTdHJlYW0gNCDqsr3roZzqsIAg64+Z7J287ZWY6rKMIOyTtOuLpC5cbi8vIEFudGhyb3BpYyBhZGFwdGVyIOuKlCBjYWNoZSBjcmVhdGlvbiDsnYQgaW5wdXRUb2tlbnMg7JeQIO2PrO2VqO2VtCDtkZzspIDtmZTtlZjqs6AsIOuzhOuPhCDtlYTrk5zsl5Drj4Qg67O07KG07ZWc64ukLlxuLy8gcGVyLXJlcXVlc3QgY29zdCDripQgQ2xhdWRlIENvZGUg6rCAIOykgCB0b3RhbF9jb3N0X3VzZCDrpbwg7Jqw7ISgIOyCrOyaqe2VmOqzoCBmYWxsYmFjayDqs4TsgrDrp4wg6rO17Ya1IGNvc3Qg7ZWo7IiY66W8IOyTtOuLpC5cbmZ1bmN0aW9uIHRvRW11bGF0aW9uUmVzdWx0KFxuICByZXN1bHQ6IEdlbmVyYXRlUmVzdWx0LFxuKTogT21pdDxRdWVyeU91dHB1dCwgXCJjb250ZW50XCIgfCBcImZpbmlzaFJlYXNvblwiIHwgXCJydW5Db250ZXh0XCI+IHtcbiAgcmV0dXJuIHtcbiAgICB0ZXh0OiByZXN1bHQudGV4dCxcbiAgICB0b2tlbk5hbWU6IHJlc3VsdC50b2tlbk5hbWUsXG4gICAgbW9kZWw6IHJlc3VsdC5tb2RlbCxcbiAgICB1c2FnZToge1xuICAgICAgaW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICBvdXRwdXRfdG9rZW5zOiByZXN1bHQudXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zID8/IDAsXG4gICAgICBjYWNoZV9yZWFkX2lucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgIH0sXG4gICAgZHVyYXRpb25NczogcmVzdWx0LmR1cmF0aW9uTXMsXG4gICAgY29zdFVzZDpcbiAgICAgIHJlc3VsdC5jb3N0VXNkICE9PSB1bmRlZmluZWQgJiYgcmVzdWx0LmNvc3RVc2QgPiAwXG4gICAgICAgID8gcmVzdWx0LmNvc3RVc2RcbiAgICAgICAgOiBjYWxjdWxhdGVDb3N0VXNkKHJlc3VsdC5tb2RlbCwge1xuICAgICAgICAgICAgaW5wdXRUb2tlbnM6IHJlc3VsdC51c2FnZS5pbnB1dFRva2VucyxcbiAgICAgICAgICAgIG91dHB1dFRva2VuczogcmVzdWx0LnVzYWdlLm91dHB1dFRva2VucyxcbiAgICAgICAgICAgIGNhY2hlZElucHV0VG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMsXG4gICAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMgPz8gMCxcbiAgICAgICAgICB9KSxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUNsYXVkZShcbiAgaW5wdXQ6IFF1ZXJ5SW5wdXQsXG4gIHRva2VuOiBzdHJpbmcsXG4gIHRpbWVvdXRNczogbnVtYmVyLFxuKTogUHJvbWlzZTxPbWl0PFF1ZXJ5T3V0cHV0LCBcImNvbnRlbnRcIiB8IFwiZmluaXNoUmVhc29uXCI+PiB7XG4gIGNvbnN0IHJhd01vZGVsID0gaW5wdXQubW9kZWwgPz8gREVGQVVMVF9NT0RFTDtcbiAgY29uc3QgbW9kZWwgPSByYXdNb2RlbC5pbmNsdWRlcyhcIi9cIikgPyByYXdNb2RlbC5zcGxpdChcIi9cIikucG9wKCkhIDogcmF3TW9kZWw7XG4gIGNvbnN0IHRpbWVvdXQgPSBpbnB1dC50aW1lb3V0ID8/IHRpbWVvdXRNcztcbiAgY29uc3QgdXNlU3RydWN0dXJlZE91dHB1dCA9IGlucHV0Lmpzb25TY2hlbWEgJiYgaW5wdXQuanNvblNjaGVtYS5sZW5ndGggPiAwO1xuXG4gIC8vIC0tdG9vbHMgXCJcIiDroZwg66qo65OgIHRvb2wg7J2EIOq4sOuzuCDssKjri6guIHN0cnVjdHVyZWQgb3V0cHV0IOyTsOuptCBTdHJ1Y3R1cmVkT3V0cHV0IOunjCDtmZTsnbTtirjrpqzsiqTtirguXG4gIC8vIC0tdG9vbHMgXCJcIiDripQg67CY65Oc7IucIOuSpOyXkCDri6Trpbgg7ZSM656Y6re46rCAIOyZgOyVvCBDTEkg7YyM7Iux7J20IOu5iCDrrLjsnpDsl7TroZwg7J247IudXG4gIGNvbnN0IHRvb2xBcmdzID0gdXNlU3RydWN0dXJlZE91dHB1dFxuICAgID8gW1wiLS10b29sc1wiLCBcIlwiLCBcIi0tYWxsb3dlZC10b29sc1wiLCBcIlN0cnVjdHVyZWRPdXRwdXRcIl1cbiAgICA6IFtcIi0tdG9vbHNcIiwgXCJcIl07XG5cbiAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbXG4gICAgXCItcFwiLFxuICAgIC4uLnRvb2xBcmdzLFxuICAgIFwiLS1kaXNhbGxvd2VkVG9vbHNcIixcbiAgICAvLyBDQ+yXkOyEnCDsnpDrj5kg7Zmc7ISx7ZmU65CY64qUIGRlZmVycmVkIOuPhOq1rC4g7Yag7YGwIOy1nOygge2ZlOulvOychO2VtCDssKjri6hcbiAgICAuLi4oW1wiTW9uaXRvclwiLCBcIlB1c2hOb3RpZmljYXRpb25cIiwgXCJSZW1vdGVUcmlnZ2VyXCJdIGFzIGNvbnN0KSxcbiAgICBcIi0tb3V0cHV0LWZvcm1hdFwiLFxuICAgIFwic3RyZWFtLWpzb25cIixcbiAgICBcIi0tdmVyYm9zZVwiLFxuICAgIC8vIC0tbWF4LXR1cm5zOiBzdHJ1Y3R1cmVkIG91dHB1dCDsnYAgdG9vbF91c2UgKyB0b29sX3Jlc3VsdCDroZwgMu2EtCDshozruYRcbiAgICBcIi0tbWF4LXR1cm5zXCIsXG4gICAgdXNlU3RydWN0dXJlZE91dHB1dCA/IFwiMlwiIDogXCIxXCIsXG4gICAgXCItLXBlcm1pc3Npb24tbW9kZVwiLFxuICAgIFwiYnlwYXNzUGVybWlzc2lvbnNcIixcbiAgICBcIi0tc2V0dGluZy1zb3VyY2VzXCIsXG4gICAgXCJwcm9qZWN0XCIsXG4gICAgXCItLW1vZGVsXCIsXG4gICAgbW9kZWwsXG4gICAgLy8gLS1zeXN0ZW0tcHJvbXB064qUIOuwmOuTnOyLnCDrqoXsi5ztlbTslbztlaguIOyYteyFmCDsg53rnrUg7IucIEND6rCAIGRlZmF1bHQgc3lzdGVtIHByb21wdOulvCDsnpDrj5nsnLzroZwg7KO87J6F7ZWoKDIzaylcbiAgICBcIi0tc3lzdGVtLXByb21wdFwiLFxuICAgIGlucHV0LnN5c3RlbSA/PyBcIlwiLFxuICAgIFwiLS10aGlua2luZ1wiLFxuICAgIFwiZGlzYWJsZWRcIixcbiAgICBcIi0tZWZmb3J0XCIsXG4gICAgaW5wdXQuZWZmb3J0ID8/IERFRkFVTFRfRUZGT1JULFxuICAgIFwiLS1uby1zZXNzaW9uLXBlcnNpc3RlbmNlXCIsXG4gICAgLy8g66qo65OgIHNraWxscyDruYTtmZzshLHtmZRcbiAgICBcIi0tZGlzYWJsZS1zbGFzaC1jb21tYW5kc1wiLFxuICBdO1xuICBpZiAodXNlU3RydWN0dXJlZE91dHB1dCkge1xuICAgIGFyZ3MucHVzaChcIi0tanNvbi1zY2hlbWFcIiwgaW5wdXQuanNvblNjaGVtYSEpO1xuICB9XG4gIGFyZ3MucHVzaChpbnB1dC5wcm9tcHQpO1xuXG4gIGNvbnN0IGVudjogTm9kZUpTLlByb2Nlc3NFbnYgPSB7XG4gICAgUEFUSDogcHJvY2Vzcy5lbnYuUEFUSCxcbiAgICBUTVBESVI6IHByb2Nlc3MuZW52LlRNUERJUixcbiAgICBDTEFVREVfQ09ERV9PQVVUSF9UT0tFTjogdG9rZW4sXG4gICAgLy8gQ0xBVURFX0NPTkZJR19ESVIg7ZmY6rK967OA7IiY66GcIOyjvOyehVxuICAgIENMQVVERV9DT05GSUdfRElSLFxuICAgIENMQVVERV9DT0RFX0RJU0FCTEVfQVVUT19NRU1PUlk6IFwiMVwiLFxuICAgIENMQVVERV9DT0RFX0RJU0FCTEVfQURBUFRJVkVfVEhJTktJTkc6IFwiMVwiLFxuICAgIENMQVVERV9DT0RFX0RJU0FCTEVfMU1fQ09OVEVYVDogXCIxXCIsXG4gICAgQ0xBVURFX0NPREVfRElTQUJMRV9DTEFVREVfTURTOiBcIjFcIixcbiAgICBDTEFVREVfQ09ERV9BVFRSSUJVVElPTl9IRUFERVI6IFwiMFwiLFxuICB9O1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZTxPbWl0PFF1ZXJ5T3V0cHV0LCBcImNvbnRlbnRcIiB8IFwiZmluaXNoUmVhc29uXCI+PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bihcImNsYXVkZVwiLCBhcmdzLCB7XG4gICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwicGlwZVwiLCBcImlnbm9yZVwiXSxcbiAgICAgIGVudixcbiAgICAgIC8vIOqyqeumrCAo65GQIOuLqOqzhCk6XG4gICAgICAvLyAxLiBDTEFVREVfQ1dEIOKAlCBwcm9qZWN0IHNjb3BlIOqyqeumrCAoY3dkIOydmCAuY2xhdWRlL3NldHRpbmdzLmpzb24pXG4gICAgICAvLyAyLiBDTEFVREVfQ09ORklHX0RJUiDigJQgdXNlciBzY29wZSDqsqnrpqwgY3dkIOqyqeumrOunjOycvOuhoCDrtoDsobEuXG4gICAgICBjd2Q6IENMQVVERV9DV0QsXG4gICAgfSk7XG5cbiAgICBsZXQgYnVmZmVyID0gXCJcIjtcbiAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICBjaGlsZC5raWxsKCk7XG4gICAgICByZWplY3QobmV3IFRpbWVvdXRFcnJvcihgVGltZW91dCBhZnRlciAke3RpbWVvdXQgLyAxMDAwfXMgKHRva2VuOiAke21hc2tUb2tlbih0b2tlbil9KWApKTtcbiAgICB9LCB0aW1lb3V0KTtcblxuICAgIGNoaWxkLnN0ZG91dD8ub24oXCJkYXRhXCIsIChkOiBCdWZmZXIpID0+IHtcbiAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICBidWZmZXIgKz0gZC50b1N0cmluZygpO1xuICAgICAgY29uc3QgbGluZXMgPSBidWZmZXIuc3BsaXQoXCJcXG5cIik7XG4gICAgICBidWZmZXIgPSBsaW5lcy5wb3AoKSA/PyBcIlwiO1xuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgIGlmICghbGluZS50cmltKCkpIGNvbnRpbnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGogPSBKU09OLnBhcnNlKGxpbmUpO1xuICAgICAgICAgIGlmIChqLnR5cGUgPT09IFwicmVzdWx0XCIgJiYgIXNldHRsZWQpIHtcbiAgICAgICAgICAgIC8vIC0tanNvbi1zY2hlbWEg7IKs7JqpIOyLnCBzdHJ1Y3R1cmVkX291dHB1dCDsl5Ag7YyM7Iux65CcIOqwneyytOqwgCDsmKjri6Qg4oaSIOyasOyEoCDsgqzsmqlcbiAgICAgICAgICAgIGxldCB0ZXh0OiBzdHJpbmc7XG4gICAgICAgICAgICBpZiAoai5zdHJ1Y3R1cmVkX291dHB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHRleHQgPSBKU09OLnN0cmluZ2lmeShqLnN0cnVjdHVyZWRfb3V0cHV0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRleHQgPSAoai5yZXN1bHQgPz8gXCJcIilcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXmBgYCg/Ompzb24pP1xccypcXG4/L2ksIFwiXCIpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcbj9gYGBcXHMqJC9pLCBcIlwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRleHQuc3RhcnRzV2l0aChcIllvdSd2ZSBoaXRcIikpIHtcbiAgICAgICAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICAgIHJlamVjdChuZXcgUXVvdGFFcnJvcihgUXVvdGEgZXhoYXVzdGVkICh0b2tlbjogJHttYXNrVG9rZW4odG9rZW4pfSlgKSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdSA9IGoudXNhZ2UgPz8ge307XG4gICAgICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgICAgdXNhZ2U6IHtcbiAgICAgICAgICAgICAgICBpbnB1dF90b2tlbnM6IHUuaW5wdXRfdG9rZW5zID8/IDAsXG4gICAgICAgICAgICAgICAgb3V0cHV0X3Rva2VuczogdS5vdXRwdXRfdG9rZW5zID8/IDAsXG4gICAgICAgICAgICAgICAgY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zOiB1LmNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2VucyA/PyAwLFxuICAgICAgICAgICAgICAgIGNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zOiB1LmNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zID8/IDAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uTXM6IGouZHVyYXRpb25fbXMgPz8gMCxcbiAgICAgICAgICAgICAgY29zdFVzZDogai50b3RhbF9jb3N0X3VzZCA/PyAwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHt9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjaGlsZC5vbihcImNsb3NlXCIsICgpID0+IHtcbiAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICByZWplY3QobmV3IFByb2Nlc3NFcnJvcihgQ0xJIHByb2Nlc3MgY2xvc2VkIHdpdGhvdXQgcmVzdWx0ICh0b2tlbjogJHttYXNrVG9rZW4odG9rZW4pfSlgKSk7XG4gICAgfSk7XG5cbiAgICBjaGlsZC5vbihcImVycm9yXCIsIChlcnIpID0+IHtcbiAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICByZWplY3QobmV3IFByb2Nlc3NFcnJvcihgQ0xJIHByb2Nlc3MgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9ICh0b2tlbjogJHttYXNrVG9rZW4odG9rZW4pfSlgKSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5leHBvcnQgY29uc3QgUWdyaWREaXNwYXRjaGVyID0gbmV3IFFncmlkRGlzcGF0Y2hlckNsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxQ0EsTUFBTSxTQUFTLFVBQVUsQ0FBQyxRQUFRLENBQUM7QUFFbkMsTUFBTSxnQkFBZ0I7QUFDdEIsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSxpQkFBaUI7QUFJdkIsTUFBTSxhQUFhO0FBR25CLE1BQU0sb0JBQW9CO0FBRzFCLE1BQU0sd0JBQXdCO0NBQzVCLHVCQUF1QjtDQUN2Qix3QkFBd0I7Q0FDeEIsbUJBQW1CO0NBQ3BCO0FBR0QsTUFBTSxvQkFBb0I7QUFFMUIsU0FBZ0Isd0JBQ2QsT0FDdUI7Q0FDdkIsTUFBTSxlQUFlLE1BQU0sT0FBTyxTQUM5QixvQkFBb0IsTUFBTSxNQUFNLEdBQ2hDLE1BQU0sYUFDSCxLQUFLLE1BQU0sTUFBTSxXQUFXLEdBQzdCO0FBRU4sUUFBTyxlQUNGLFVBQVUsYUFBZ0QsR0FDM0Q7O0FBR04sSUFBYSx1QkFBYixNQUFrQztDQUNoQyx5QkFBUyxJQUFJLEtBQTJCO0NBR3hDLGdDQUFnQixJQUFJLEtBQXFCO0NBQ3pDLFVBQVU7Q0FHVixhQUFxQztDQUNyQyxtQkFBNEM7Q0FDNUMsc0JBQWtEO0NBRWxELGNBQWM7RUFDWixNQUFNLGVBQWUsS0FBSyxVQUFVLHVCQUF1QixNQUFNLEVBQUU7QUFFbkUsWUFBVSxHQUFHLFdBQVcsV0FBVyxFQUFFLFdBQVcsTUFBTSxDQUFDO0FBQ3ZELGdCQUFjLEdBQUcsV0FBVyx5QkFBeUIsYUFBYTtBQUVsRSxZQUFVLG1CQUFtQixFQUFFLFdBQVcsTUFBTSxDQUFDO0FBQ2pELGdCQUFjLEdBQUcsa0JBQWtCLGdCQUFnQixLQUFLO0FBQ3hELGdC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
@@ -126,6 +126,7 @@ var TokenSubscriber = class {
126
126
  if (payload.op === "DELETE") {
127
127
  this.dispatcher.removeCache(payload.id);
128
128
  this.dispatcher.openaiDispatcher?.onTokenRemoved(payload.id).catch((e) => logger.warn(`openai worker remove failed: ${e.message}`));
129
+ this.dispatcher.anthropicDispatcher?.onTokenRemoved(payload.id);
129
130
  logger.info(`NOTIFY ${payload.op} id=${payload.id} → removed from cache`);
130
131
  return;
131
132
  }
@@ -133,6 +134,7 @@ var TokenSubscriber = class {
133
134
  if (!row) {
134
135
  this.dispatcher.removeCache(payload.id);
135
136
  this.dispatcher.openaiDispatcher?.onTokenRemoved(payload.id).catch((e) => logger.warn(`openai worker remove failed: ${e.message}`));
137
+ this.dispatcher.anthropicDispatcher?.onTokenRemoved(payload.id);
136
138
  logger.info(`NOTIFY ${payload.op} id=${payload.id} → missing, removed from cache`);
137
139
  return;
138
140
  }
@@ -144,16 +146,27 @@ var TokenSubscriber = class {
144
146
  this.dispatcher.openaiDispatcher?.onTokenActivated(payload.id);
145
147
  this.dispatcher.openaiDispatcher?.onTokenUpdated(payload.id, row.name, creds).catch((e) => logger.warn(`openai worker update failed: ${e.message}`));
146
148
  } else this.dispatcher.openaiDispatcher?.onTokenDeactivated(payload.id);
149
+ } else if (row.provider === "anthropic") {
150
+ const creds = row.credentials;
151
+ if (payload.op === "INSERT" && row.active) this.dispatcher.anthropicDispatcher?.onTokenAdded(payload.id, row.name, creds);
152
+ else if (row.active) this.dispatcher.anthropicDispatcher?.onTokenUpdated(payload.id, row.name, creds);
153
+ else this.dispatcher.anthropicDispatcher?.onTokenRemoved(payload.id);
147
154
  }
148
155
  logger.info(`NOTIFY ${payload.op} id=${payload.id} (${row.name}) active=${row.active}`);
149
156
  }
150
157
  async reconcile() {
151
158
  const rows = await TokenModel.findActive("A");
152
159
  this.dispatcher.replaceCache(rows);
160
+ const anthropicRows = rows.filter((r) => r.provider === "anthropic").map((r) => ({
161
+ id: r.id,
162
+ name: r.name,
163
+ credentials: r.credentials
164
+ }));
165
+ this.dispatcher.anthropicDispatcher?.replaceTokens(anthropicRows);
153
166
  this.lastReconcileAt = /* @__PURE__ */ new Date();
154
167
  }
155
168
  };
156
169
  //#endregion
157
170
  export { TokenSubscriber };
158
171
 
159
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tc3Vic2NyaWJlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvdG9rZW4tc3Vic2NyaWJlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogdG9rZW5zX2NoYW5nZWQgTElTVEVOIHN1YnNjcmliZXIuICovXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgQ2xpZW50LCB0eXBlIENsaWVudENvbmZpZyB9IGZyb20gXCJwZ1wiO1xuXG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIE9wZW5BSUNyZWRlbnRpYWxzIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIFFncmlkRGlzcGF0Y2hlckNsYXNzIH0gZnJvbSBcIi4vcWdyaWQuZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgdHlwZSBTdWJzY3JpYmVyU3RhdHVzIH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwic3Vic2NyaWJlclwiXSk7XG5cbmNvbnN0IFRPS0VOU19DSEFOR0VEID0gXCJ0b2tlbnNfY2hhbmdlZFwiO1xuY29uc3QgUkVDT05DSUxFX0lOVEVSVkFMX01TID0gMTAgKiA2MCAqIDEwMDA7XG5jb25zdCBDT05ORUNUSU9OX1RJTUVPVVRfTVMgPSA1XzAwMDtcbmNvbnN0IEJBQ0tPRkZfQkFTRV9NUyA9IDUwMDtcbmNvbnN0IEJBQ0tPRkZfQ0FQX01TID0gMzBfMDAwO1xuXG50eXBlIFBheWxvYWQgPSB7IG9wOiBcIklOU0VSVFwiIHwgXCJVUERBVEVcIiB8IFwiREVMRVRFXCI7IGlkOiBudW1iZXIgfTtcblxuZXhwb3J0IGNsYXNzIFRva2VuU3Vic2NyaWJlciB7XG4gIGNsaWVudDogQ2xpZW50IHwgbnVsbCA9IG51bGw7XG4gIHJlY29uY2lsZVRpbWVyOiBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsO1xuICByZWNvbm5lY3RUaW1lcjogTm9kZUpTLlRpbWVvdXQgfCBudWxsID0gbnVsbDtcbiAgc2h1dGRvd25SZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgYXR0ZW1wdCA9IDA7XG4gIGNvbm5lY3RlZEF0OiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gIGxhc3RSZWNvbmNpbGVBdDogRGF0ZSB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBjb25uQ29uZmlnOiBDbGllbnRDb25maWcsXG4gICAgcHVibGljIGRpc3BhdGNoZXI6IFFncmlkRGlzcGF0Y2hlckNsYXNzLFxuICApIHt9XG5cbiAgYXN5bmMgc3RhcnQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdGhpcy5zaHV0ZG93blJlcXVlc3RlZCA9IGZhbHNlO1xuICAgIHRoaXMuZW5zdXJlUmVjb25jaWxlVGltZXIoKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbm5lY3RBbmRSZWNvbmNpbGUoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBzdWJzY3JpYmVyIHN0YXJ0IGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX0sIHNjaGVkdWxpbmcgcmV0cnlgKTtcbiAgICAgIHRoaXMucmV0cnlMYXRlcigpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zaHV0ZG93blJlcXVlc3RlZCA9IHRydWU7XG4gICAgaWYgKHRoaXMucmVjb25jaWxlVGltZXIpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5yZWNvbmNpbGVUaW1lcik7XG4gICAgICB0aGlzLnJlY29uY2lsZVRpbWVyID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMucmVjb25uZWN0VGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlY29ubmVjdFRpbWVyKTtcbiAgICAgIHRoaXMucmVjb25uZWN0VGltZXIgPSBudWxsO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmNsb3NlQ2xpZW50KCk7XG4gIH1cblxuICBzdGF0dXMoKTogU3Vic2NyaWJlclN0YXR1cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbm5lY3RlZDogdGhpcy5jbGllbnQgIT09IG51bGwgJiYgdGhpcy5yZWNvbm5lY3RUaW1lciA9PT0gbnVsbCxcbiAgICAgIGNvbm5lY3RlZEF0OiB0aGlzLmNvbm5lY3RlZEF0LFxuICAgICAgbGFzdFJlY29uY2lsZUF0OiB0aGlzLmxhc3RSZWNvbmNpbGVBdCxcbiAgICAgIGF0dGVtcHQ6IHRoaXMuYXR0ZW1wdCxcbiAgICB9O1xuICB9XG5cbiAgZW5zdXJlUmVjb25jaWxlVGltZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVjb25jaWxlVGltZXIpIHJldHVybjtcblxuICAgIC8vIExJU1RFTi9OT1RJRlkg64qUIOuBiuq4tCDrj5nslYgg7Jyg7Iuk65CgIOyImCDsnojslrQg7KO86riw7KCB7Jy866GcIERCIOq4sOykgOycvOuhnCDrp57stpjri6QuXG4gICAgdGhpcy5yZWNvbmNpbGVUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRoaXMucmVjb25jaWxlKCkuY2F0Y2goKGUpID0+XG4gICAgICAgIGxvZ2dlci53YXJuKGBwZXJpb2RpYyByZWNvbmNpbGUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApLFxuICAgICAgKTtcbiAgICB9LCBSRUNPTkNJTEVfSU5URVJWQUxfTVMpO1xuICB9XG5cbiAgYXN5bmMgY29ubmVjdEFuZFJlY29uY2lsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmNvbm5lY3RBbmRMaXN0ZW4oKTtcbiAgICBhd2FpdCB0aGlzLnJlY29uY2lsZSgpO1xuICAgIHRoaXMuYXR0ZW1wdCA9IDA7XG4gIH1cblxuICBhc3luYyBjb25uZWN0QW5kTGlzdGVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBDbGllbnQoe1xuICAgICAgLi4udGhpcy5jb25uQ29uZmlnLFxuICAgICAgY29ubmVjdGlvblRpbWVvdXRNaWxsaXM6IENPTk5FQ1RJT05fVElNRU9VVF9NUyxcbiAgICAgIGtlZXBBbGl2ZTogdHJ1ZSxcbiAgICAgIGtlZXBBbGl2ZUluaXRpYWxEZWxheU1pbGxpczogMTBfMDAwLFxuICAgICAgYXBwbGljYXRpb25fbmFtZTogXCJxZ3JpZC1saXN0ZW5lclwiLFxuICAgIH0pO1xuXG4gICAgY2xpZW50Lm9uKFwiZXJyb3JcIiwgKGUpID0+IHtcbiAgICAgIGxvZ2dlci53YXJuKGBzdWJzY3JpYmVyIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICAgIHRoaXMucmV0cnlMYXRlcigpO1xuICAgIH0pO1xuICAgIGNsaWVudC5vbihcImVuZFwiLCAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuc2h1dGRvd25SZXF1ZXN0ZWQpIHRoaXMucmV0cnlMYXRlcigpO1xuICAgIH0pO1xuICAgIGNsaWVudC5vbihcIm5vdGlmaWNhdGlvblwiLCAobXNnKSA9PiB7XG4gICAgICBpZiAobXNnLmNoYW5uZWwgIT09IFRPS0VOU19DSEFOR0VEIHx8ICFtc2cucGF5bG9hZCkgcmV0dXJuO1xuICAgICAgdGhpcy5oYW5kbGVOb3RpZmljYXRpb24obXNnLnBheWxvYWQpLmNhdGNoKChlKSA9PlxuICAgICAgICBsb2dnZXIud2FybihgaGFuZGxlIE5PVElGWSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNsaWVudC5jb25uZWN0KCk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXCJTRVQgc3RhdGVtZW50X3RpbWVvdXQgPSAwXCIpO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFwiU0VUIGlkbGVfaW5fdHJhbnNhY3Rpb25fc2Vzc2lvbl90aW1lb3V0ID0gMFwiKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShgTElTVEVOICR7Y2xpZW50LmVzY2FwZUlkZW50aWZpZXIoVE9LRU5TX0NIQU5HRUQpfWApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNsaWVudC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgIGF3YWl0IGNsaWVudC5lbmQoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICAgIHRoaXMuY29ubmVjdGVkQXQgPSBuZXcgRGF0ZSgpO1xuICAgIGxvZ2dlci5pbmZvKGBzdWJzY3JpYmVkIHRvICR7VE9LRU5TX0NIQU5HRUR9YCk7XG4gIH1cblxuICByZXRyeUxhdGVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNodXRkb3duUmVxdWVzdGVkKSByZXR1cm47XG4gICAgaWYgKHRoaXMucmVjb25uZWN0VGltZXIpIHJldHVybjtcblxuICAgIHZvaWQgdGhpcy5jbG9zZUNsaWVudCgpO1xuICAgIHRoaXMuYXR0ZW1wdCArPSAxO1xuICAgIGNvbnN0IGNhcCA9IE1hdGgubWluKEJBQ0tPRkZfQkFTRV9NUyAqIDIgKiogdGhpcy5hdHRlbXB0LCBCQUNLT0ZGX0NBUF9NUyk7XG4gICAgY29uc3QgZGVsYXkgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjYXApO1xuICAgIGxvZ2dlci5pbmZvKGByZWNvbm5lY3RpbmcgaW4gJHtkZWxheX1tcyAoYXR0ZW1wdCAke3RoaXMuYXR0ZW1wdH0pYCk7XG4gICAgdGhpcy5yZWNvbm5lY3RUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5yZWNvbm5lY3RUaW1lciA9IG51bGw7XG4gICAgICB0aGlzLmNvbm5lY3RBbmRSZWNvbmNpbGUoKS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICBsb2dnZXIud2Fybihgc3Vic2NyaWJlciByZWNvbm5lY3QgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICB0aGlzLnJldHJ5TGF0ZXIoKTtcbiAgICAgIH0pO1xuICAgIH0sIGRlbGF5KTtcbiAgfVxuXG4gIGFzeW5jIGNsb3NlQ2xpZW50KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuY2xpZW50O1xuICAgIGlmICghY2xpZW50KSByZXR1cm47XG5cbiAgICB0aGlzLmNsaWVudCA9IG51bGw7XG4gICAgY2xpZW50LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIGF3YWl0IGNsaWVudC5lbmQoKS5jYXRjaCgoKSA9PiB7fSk7XG4gIH1cblxuICBhc3luYyBoYW5kbGVOb3RpZmljYXRpb24ocGF5bG9hZEpzb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBheWxvYWQgPSBKU09OLnBhcnNlKHBheWxvYWRKc29uKSBhcyBQYXlsb2FkO1xuICAgIGlmIChwYXlsb2FkLm9wID09PSBcIkRFTEVURVwiKSB7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIucmVtb3ZlQ2FjaGUocGF5bG9hZC5pZCk7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlclxuICAgICAgICA/Lm9uVG9rZW5SZW1vdmVkKHBheWxvYWQuaWQpXG4gICAgICAgIC5jYXRjaCgoZSkgPT4gbG9nZ2VyLndhcm4oYG9wZW5haSB3b3JrZXIgcmVtb3ZlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSk7XG4gICAgICBsb2dnZXIuaW5mbyhgTk9USUZZICR7cGF5bG9hZC5vcH0gaWQ9JHtwYXlsb2FkLmlkfSDihpIgcmVtb3ZlZCBmcm9tIGNhY2hlYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJvdyA9IGF3YWl0IFRva2VuTW9kZWwuZmluZE9uZShcIkFcIiwgeyBpZDogcGF5bG9hZC5pZCB9KTtcbiAgICBpZiAoIXJvdykge1xuICAgICAgdGhpcy5kaXNwYXRjaGVyLnJlbW92ZUNhY2hlKHBheWxvYWQuaWQpO1xuICAgICAgdGhpcy5kaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXJcbiAgICAgICAgPy5vblRva2VuUmVtb3ZlZChwYXlsb2FkLmlkKVxuICAgICAgICAuY2F0Y2goKGUpID0+IGxvZ2dlci53YXJuKGBvcGVuYWkgd29ya2VyIHJlbW92ZSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCkpO1xuICAgICAgbG9nZ2VyLmluZm8oYE5PVElGWSAke3BheWxvYWQub3B9IGlkPSR7cGF5bG9hZC5pZH0g4oaSIG1pc3NpbmcsIHJlbW92ZWQgZnJvbSBjYWNoZWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZGlzcGF0Y2hlci51cHNlcnRDYWNoZShwYXlsb2FkLmlkLCByb3cpO1xuXG4gICAgaWYgKHJvdy5wcm92aWRlciA9PT0gXCJvcGVuYWlcIikge1xuICAgICAgY29uc3QgY3JlZHMgPSByb3cuY3JlZGVudGlhbHMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBpZiAocGF5bG9hZC5vcCA9PT0gXCJJTlNFUlRcIikge1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlclxuICAgICAgICAgID8ub25Ub2tlbkFkZGVkKHBheWxvYWQuaWQsIHJvdy5uYW1lLCBjcmVkcyBhcyBPcGVuQUlDcmVkZW50aWFscylcbiAgICAgICAgICAuY2F0Y2goKGUpID0+IGxvZ2dlci53YXJuKGBvcGVuYWkgd29ya2VyIHNwYXduIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSk7XG4gICAgICB9IGVsc2UgaWYgKHJvdy5hY3RpdmUpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXI/Lm9uVG9rZW5BY3RpdmF0ZWQocGF5bG9hZC5pZCk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyXG4gICAgICAgICAgPy5vblRva2VuVXBkYXRlZChwYXlsb2FkLmlkLCByb3cubmFtZSwgY3JlZHMgYXMgT3BlbkFJQ3JlZGVudGlhbHMpXG4gICAgICAgICAgLmNhdGNoKChlKSA9PiBsb2dnZXIud2Fybihgb3BlbmFpIHdvcmtlciB1cGRhdGUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyPy5vblRva2VuRGVhY3RpdmF0ZWQocGF5bG9hZC5pZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGxvZ2dlci5pbmZvKGBOT1RJRlkgJHtwYXlsb2FkLm9wfSBpZD0ke3BheWxvYWQuaWR9ICgke3Jvdy5uYW1lfSkgYWN0aXZlPSR7cm93LmFjdGl2ZX1gKTtcbiAgfVxuXG4gIGFzeW5jIHJlY29uY2lsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kQWN0aXZlKFwiQVwiKTtcbiAgICB0aGlzLmRpc3BhdGNoZXIucmVwbGFjZUNhY2hlKHJvd3MpO1xuICAgIHRoaXMubGFzdFJlY29uY2lsZUF0ID0gbmV3IERhdGUoKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFTQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsYUFBYSxDQUFDO0FBRWpELE1BQU0saUJBQWlCO0FBQ3ZCLE1BQU0sd0JBQXdCLE1BQVU7QUFDeEMsTUFBTSx3QkFBd0I7QUFDOUIsTUFBTSxrQkFBa0I7QUFDeEIsTUFBTSxpQkFBaUI7QUFJdkIsSUFBYSxrQkFBYixNQUE2QjtDQUMzQixTQUF3QjtDQUN4QixpQkFBd0M7Q0FDeEMsaUJBQXdDO0NBQ3hDLG9CQUFvQjtDQUNwQixVQUFVO0NBQ1YsY0FBMkI7Q0FDM0Isa0JBQStCO0NBRS9CLFlBQ0UsWUFDQSxZQUNBO0FBRk8sT0FBQSxhQUFBO0FBQ0EsT0FBQSxhQUFBOztDQUdULE1BQU0sUUFBMEI7QUFDOUIsT0FBSyxvQkFBb0I7QUFDekIsT0FBSyxzQkFBc0I7QUFFM0IsTUFBSTtBQUNGLFNBQU0sS0FBSyxxQkFBcUI7QUFDaEMsVUFBTztXQUNBLEdBQUc7QUFDVixVQUFPLEtBQUssNEJBQTZCLEVBQVksUUFBUSxvQkFBb0I7QUFDakYsUUFBSyxZQUFZO0FBQ2pCLFVBQU87OztDQUlYLE1BQU0sT0FBc0I7QUFDMUIsT0FBSyxvQkFBb0I7QUFDekIsTUFBSSxLQUFLLGdCQUFnQjtBQUN2QixpQkFBYyxLQUFLLGVBQWU7QUFDbEMsUUFBSyxpQkFBaUI7O0FBRXhCLE1BQUksS0FBSyxnQkFBZ0I7QUFDdkIsZ0JBQWEsS0FBSyxlQUFlO0FBQ2pDLFFBQUssaUJBQWlCOztBQUV4QixRQUFNLEtBQUssYUFBYTs7Q0FHMUIsU0FBMkI7QUFDekIsU0FBTztHQUNMLFdBQVcsS0FBSyxXQUFXLFFBQVEsS0FBSyxtQkFBbUI7R0FDM0QsYUFBYSxLQUFLO0dBQ2xCLGlCQUFpQixLQUFLO0dBQ3RCLFNBQVMsS0FBSztHQUNmOztDQUdILHVCQUE2QjtBQUMzQixNQUFJLEtBQUssZUFBZ0I7QUFHekIsT0FBSyxpQkFBaUIsa0JBQWtCO0FBQ3RDLFFBQUssV0FBVyxDQUFDLE9BQU8sTUFDdEIsT0FBTyxLQUFLLDhCQUErQixFQUFZLFVBQVUsQ0FDbEU7S0FDQSxzQkFBc0I7O0NBRzNCLE1BQU0sc0JBQXFDO0FBQ3pDLFFBQU0sS0FBSyxrQkFBa0I7QUFDN0IsUUFBTSxLQUFLLFdBQVc7QUFDdEIsT0FBSyxVQUFVOztDQUdqQixNQUFNLG1CQUFrQztFQUN0QyxNQUFNLFNBQVMsSUFBSSxPQUFPO0dBQ3hCLEdBQUcsS0FBSztHQUNSLHlCQUF5QjtHQUN6QixXQUFXO0dBQ1gsNkJBQTZCO0dBQzdCLGtCQUFrQjtHQUNuQixDQUFDO0FBRUYsU0FBTyxHQUFHLFVBQVUsTUFBTTtBQUN4QixVQUFPLEtBQUsscUJBQXFCLEVBQUUsVUFBVTtBQUM3QyxRQUFLLFlBQVk7SUFDakI7QUFDRixTQUFPLEdBQUcsYUFBYTtBQUNyQixPQUFJLENBQUMsS0FBSyxrQkFBbUIsTUFBSyxZQUFZO0lBQzlDO0FBQ0YsU0FBTyxHQUFHLGlCQUFpQixRQUFRO0FBQ2pDLE9BQUksSUFBSSxZQUFZLGtCQUFrQixDQUFDLElBQUksUUFBUztBQUNwRCxRQUFLLG1CQUFtQixJQUFJLFFBQVEsQ0FBQyxPQUFPLE1BQzFDLE9BQU8sS0FBSyx5QkFBMEIsRUFBWSxVQUFVLENBQzdEO0lBQ0Q7QUFFRixNQUFJO0FBQ0YsU0FBTSxPQUFPLFNBQVM7QUFDdEIsU0FBTSxPQUFPLE1BQU0sNEJBQTRCO0FBQy9DLFNBQU0sT0FBTyxNQUFNLDhDQUE4QztBQUNqRSxTQUFNLE9BQU8sTUFBTSxVQUFVLE9BQU8saUJBQWlCLGVBQWUsR0FBRztXQUNoRSxHQUFHO0FBQ1YsVUFBTyxvQkFBb0I7QUFDM0IsU0FBTSxPQUFPLEtBQUssQ0FBQyxZQUFZLEdBQUc7QUFDbEMsU0FBTTs7QUFHUixPQUFLLFNBQVM7QUFDZCxPQUFLLDhCQUFjLElBQUksTUFBTTtBQUM3QixTQUFPLEtBQUssaUJBQWlCLGlCQUFpQjs7Q0FHaEQsYUFBbUI7QUFDakIsTUFBSSxLQUFLLGtCQUFtQjtBQUM1QixNQUFJLEtBQUssZUFBZ0I7QUFFekIsRUFBSyxLQUFLLGFBQWE7QUFDdkIsT0FBSyxXQUFXO0VBQ2hCLE1BQU0sTUFBTSxLQUFLLElBQUksa0JBQWtCLEtBQUssS0FBSyxTQUFTLGVBQWU7RUFDekUsTUFBTSxRQUFRLEtBQUssTUFBTSxLQUFLLFFBQVEsR0FBRyxJQUFJO0FBQzdDLFNBQU8sS0FBSyxtQkFBbUIsTUFBTSxjQUFjLEtBQUssUUFBUSxHQUFHO0FBQ25FLE9BQUssaUJBQWlCLGlCQUFpQjtBQUNyQyxRQUFLLGlCQUFpQjtBQUN0QixRQUFLLHFCQUFxQixDQUFDLE9BQU8sTUFBTTtBQUN0QyxXQUFPLEtBQUssZ0NBQWlDLEVBQVksVUFBVTtBQUNuRSxTQUFLLFlBQVk7S0FDakI7S0FDRCxNQUFNOztDQUdYLE1BQU0sY0FBNkI7RUFDakMsTUFBTSxTQUFTLEtBQUs7QUFDcEIsTUFBSSxDQUFDLE9BQVE7QUFFYixPQUFLLFNBQVM7QUFDZCxTQUFPLG9CQUFvQjtBQUMzQixRQUFNLE9BQU8sS0FBSyxDQUFDLFlBQVksR0FBRzs7Q0FHcEMsTUFBTSxtQkFBbUIsYUFBb0M7RUFDM0QsTUFBTSxVQUFVLEtBQUssTUFBTSxZQUFZO0FBQ3ZDLE1BQUksUUFBUSxPQUFPLFVBQVU7QUFDM0IsUUFBSyxXQUFXLFlBQVksUUFBUSxHQUFHO0FBQ3ZDLFFBQUssV0FBVyxrQkFDWixlQUFlLFFBQVEsR0FBRyxDQUMzQixPQUFPLE1BQU0sT0FBTyxLQUFLLGdDQUFpQyxFQUFZLFVBQVUsQ0FBQztBQUNwRixVQUFPLEtBQUssVUFBVSxRQUFRLEdBQUcsTUFBTSxRQUFRLEdBQUcsdUJBQXVCO0FBQ3pFOztFQUVGLE1BQU0sTUFBTSxNQUFNLFdBQVcsUUFBUSxLQUFLLEVBQUUsSUFBSSxRQUFRLElBQUksQ0FBQztBQUM3RCxNQUFJLENBQUMsS0FBSztBQUNSLFFBQUssV0FBVyxZQUFZLFFBQVEsR0FBRztBQUN2QyxRQUFLLFdBQVcsa0JBQ1osZUFBZSxRQUFRLEdBQUcsQ0FDM0IsT0FBTyxNQUFNLE9BQU8sS0FBSyxnQ0FBaUMsRUFBWSxVQUFVLENBQUM7QUFDcEYsVUFBTyxLQUFLLFVBQVUsUUFBUSxHQUFHLE1BQU0sUUFBUSxHQUFHLGdDQUFnQztBQUNsRjs7QUFHRixPQUFLLFdBQVcsWUFBWSxRQUFRLElBQUksSUFBSTtBQUU1QyxNQUFJLElBQUksYUFBYSxVQUFVO0dBQzdCLE1BQU0sUUFBUSxJQUFJO0FBQ2xCLE9BQUksUUFBUSxPQUFPLFNBQ2pCLE1BQUssV0FBVyxrQkFDWixhQUFhLFFBQVEsSUFBSSxJQUFJLE1BQU0sTUFBMkIsQ0FDL0QsT0FBTyxNQUFNLE9BQU8sS0FBSywrQkFBZ0MsRUFBWSxVQUFVLENBQUM7WUFDMUUsSUFBSSxRQUFRO0FBQ3JCLFNBQUssV0FBVyxrQkFBa0IsaUJBQWlCLFFBQVEsR0FBRztBQUM5RCxTQUFLLFdBQVcsa0JBQ1osZUFBZSxRQUFRLElBQUksSUFBSSxNQUFNLE1BQTJCLENBQ2pFLE9BQU8sTUFBTSxPQUFPLEtBQUssZ0NBQWlDLEVBQVksVUFBVSxDQUFDO1NBRXBGLE1BQUssV0FBVyxrQkFBa0IsbUJBQW1CLFFBQVEsR0FBRzs7QUFHcEUsU0FBTyxLQUFLLFVBQVUsUUFBUSxHQUFHLE1BQU0sUUFBUSxHQUFHLElBQUksSUFBSSxLQUFLLFdBQVcsSUFBSSxTQUFTOztDQUd6RixNQUFNLFlBQTJCO0VBQy9CLE1BQU0sT0FBTyxNQUFNLFdBQVcsV0FBVyxJQUFJO0FBQzdDLE9BQUssV0FBVyxhQUFhLEtBQUs7QUFDbEMsT0FBSyxrQ0FBa0IsSUFBSSxNQUFNIn0=
172
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tc3Vic2NyaWJlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvdG9rZW4tc3Vic2NyaWJlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogdG9rZW5zX2NoYW5nZWQgTElTVEVOIHN1YnNjcmliZXIuICovXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgQ2xpZW50LCB0eXBlIENsaWVudENvbmZpZyB9IGZyb20gXCJwZ1wiO1xuXG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIEFudGhyb3BpY0NyZWRlbnRpYWxzLCB0eXBlIE9wZW5BSUNyZWRlbnRpYWxzIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIFFncmlkRGlzcGF0Y2hlckNsYXNzIH0gZnJvbSBcIi4vcWdyaWQuZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgdHlwZSBTdWJzY3JpYmVyU3RhdHVzIH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwic3Vic2NyaWJlclwiXSk7XG5cbmNvbnN0IFRPS0VOU19DSEFOR0VEID0gXCJ0b2tlbnNfY2hhbmdlZFwiO1xuY29uc3QgUkVDT05DSUxFX0lOVEVSVkFMX01TID0gMTAgKiA2MCAqIDEwMDA7XG5jb25zdCBDT05ORUNUSU9OX1RJTUVPVVRfTVMgPSA1XzAwMDtcbmNvbnN0IEJBQ0tPRkZfQkFTRV9NUyA9IDUwMDtcbmNvbnN0IEJBQ0tPRkZfQ0FQX01TID0gMzBfMDAwO1xuXG50eXBlIFBheWxvYWQgPSB7IG9wOiBcIklOU0VSVFwiIHwgXCJVUERBVEVcIiB8IFwiREVMRVRFXCI7IGlkOiBudW1iZXIgfTtcblxuZXhwb3J0IGNsYXNzIFRva2VuU3Vic2NyaWJlciB7XG4gIGNsaWVudDogQ2xpZW50IHwgbnVsbCA9IG51bGw7XG4gIHJlY29uY2lsZVRpbWVyOiBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsO1xuICByZWNvbm5lY3RUaW1lcjogTm9kZUpTLlRpbWVvdXQgfCBudWxsID0gbnVsbDtcbiAgc2h1dGRvd25SZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgYXR0ZW1wdCA9IDA7XG4gIGNvbm5lY3RlZEF0OiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gIGxhc3RSZWNvbmNpbGVBdDogRGF0ZSB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBjb25uQ29uZmlnOiBDbGllbnRDb25maWcsXG4gICAgcHVibGljIGRpc3BhdGNoZXI6IFFncmlkRGlzcGF0Y2hlckNsYXNzLFxuICApIHt9XG5cbiAgYXN5bmMgc3RhcnQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdGhpcy5zaHV0ZG93blJlcXVlc3RlZCA9IGZhbHNlO1xuICAgIHRoaXMuZW5zdXJlUmVjb25jaWxlVGltZXIoKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbm5lY3RBbmRSZWNvbmNpbGUoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBzdWJzY3JpYmVyIHN0YXJ0IGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX0sIHNjaGVkdWxpbmcgcmV0cnlgKTtcbiAgICAgIHRoaXMucmV0cnlMYXRlcigpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zaHV0ZG93blJlcXVlc3RlZCA9IHRydWU7XG4gICAgaWYgKHRoaXMucmVjb25jaWxlVGltZXIpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5yZWNvbmNpbGVUaW1lcik7XG4gICAgICB0aGlzLnJlY29uY2lsZVRpbWVyID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMucmVjb25uZWN0VGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlY29ubmVjdFRpbWVyKTtcbiAgICAgIHRoaXMucmVjb25uZWN0VGltZXIgPSBudWxsO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmNsb3NlQ2xpZW50KCk7XG4gIH1cblxuICBzdGF0dXMoKTogU3Vic2NyaWJlclN0YXR1cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbm5lY3RlZDogdGhpcy5jbGllbnQgIT09IG51bGwgJiYgdGhpcy5yZWNvbm5lY3RUaW1lciA9PT0gbnVsbCxcbiAgICAgIGNvbm5lY3RlZEF0OiB0aGlzLmNvbm5lY3RlZEF0LFxuICAgICAgbGFzdFJlY29uY2lsZUF0OiB0aGlzLmxhc3RSZWNvbmNpbGVBdCxcbiAgICAgIGF0dGVtcHQ6IHRoaXMuYXR0ZW1wdCxcbiAgICB9O1xuICB9XG5cbiAgZW5zdXJlUmVjb25jaWxlVGltZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVjb25jaWxlVGltZXIpIHJldHVybjtcblxuICAgIC8vIExJU1RFTi9OT1RJRlkg64qUIOuBiuq4tCDrj5nslYgg7Jyg7Iuk65CgIOyImCDsnojslrQg7KO86riw7KCB7Jy866GcIERCIOq4sOykgOycvOuhnCDrp57stpjri6QuXG4gICAgdGhpcy5yZWNvbmNpbGVUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRoaXMucmVjb25jaWxlKCkuY2F0Y2goKGUpID0+XG4gICAgICAgIGxvZ2dlci53YXJuKGBwZXJpb2RpYyByZWNvbmNpbGUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApLFxuICAgICAgKTtcbiAgICB9LCBSRUNPTkNJTEVfSU5URVJWQUxfTVMpO1xuICB9XG5cbiAgYXN5bmMgY29ubmVjdEFuZFJlY29uY2lsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmNvbm5lY3RBbmRMaXN0ZW4oKTtcbiAgICBhd2FpdCB0aGlzLnJlY29uY2lsZSgpO1xuICAgIHRoaXMuYXR0ZW1wdCA9IDA7XG4gIH1cblxuICBhc3luYyBjb25uZWN0QW5kTGlzdGVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBDbGllbnQoe1xuICAgICAgLi4udGhpcy5jb25uQ29uZmlnLFxuICAgICAgY29ubmVjdGlvblRpbWVvdXRNaWxsaXM6IENPTk5FQ1RJT05fVElNRU9VVF9NUyxcbiAgICAgIGtlZXBBbGl2ZTogdHJ1ZSxcbiAgICAgIGtlZXBBbGl2ZUluaXRpYWxEZWxheU1pbGxpczogMTBfMDAwLFxuICAgICAgYXBwbGljYXRpb25fbmFtZTogXCJxZ3JpZC1saXN0ZW5lclwiLFxuICAgIH0pO1xuXG4gICAgY2xpZW50Lm9uKFwiZXJyb3JcIiwgKGUpID0+IHtcbiAgICAgIGxvZ2dlci53YXJuKGBzdWJzY3JpYmVyIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICAgIHRoaXMucmV0cnlMYXRlcigpO1xuICAgIH0pO1xuICAgIGNsaWVudC5vbihcImVuZFwiLCAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuc2h1dGRvd25SZXF1ZXN0ZWQpIHRoaXMucmV0cnlMYXRlcigpO1xuICAgIH0pO1xuICAgIGNsaWVudC5vbihcIm5vdGlmaWNhdGlvblwiLCAobXNnKSA9PiB7XG4gICAgICBpZiAobXNnLmNoYW5uZWwgIT09IFRPS0VOU19DSEFOR0VEIHx8ICFtc2cucGF5bG9hZCkgcmV0dXJuO1xuICAgICAgdGhpcy5oYW5kbGVOb3RpZmljYXRpb24obXNnLnBheWxvYWQpLmNhdGNoKChlKSA9PlxuICAgICAgICBsb2dnZXIud2FybihgaGFuZGxlIE5PVElGWSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNsaWVudC5jb25uZWN0KCk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXCJTRVQgc3RhdGVtZW50X3RpbWVvdXQgPSAwXCIpO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFwiU0VUIGlkbGVfaW5fdHJhbnNhY3Rpb25fc2Vzc2lvbl90aW1lb3V0ID0gMFwiKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShgTElTVEVOICR7Y2xpZW50LmVzY2FwZUlkZW50aWZpZXIoVE9LRU5TX0NIQU5HRUQpfWApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNsaWVudC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgIGF3YWl0IGNsaWVudC5lbmQoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICAgIHRoaXMuY29ubmVjdGVkQXQgPSBuZXcgRGF0ZSgpO1xuICAgIGxvZ2dlci5pbmZvKGBzdWJzY3JpYmVkIHRvICR7VE9LRU5TX0NIQU5HRUR9YCk7XG4gIH1cblxuICByZXRyeUxhdGVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNodXRkb3duUmVxdWVzdGVkKSByZXR1cm47XG4gICAgaWYgKHRoaXMucmVjb25uZWN0VGltZXIpIHJldHVybjtcblxuICAgIHZvaWQgdGhpcy5jbG9zZUNsaWVudCgpO1xuICAgIHRoaXMuYXR0ZW1wdCArPSAxO1xuICAgIGNvbnN0IGNhcCA9IE1hdGgubWluKEJBQ0tPRkZfQkFTRV9NUyAqIDIgKiogdGhpcy5hdHRlbXB0LCBCQUNLT0ZGX0NBUF9NUyk7XG4gICAgY29uc3QgZGVsYXkgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjYXApO1xuICAgIGxvZ2dlci5pbmZvKGByZWNvbm5lY3RpbmcgaW4gJHtkZWxheX1tcyAoYXR0ZW1wdCAke3RoaXMuYXR0ZW1wdH0pYCk7XG4gICAgdGhpcy5yZWNvbm5lY3RUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5yZWNvbm5lY3RUaW1lciA9IG51bGw7XG4gICAgICB0aGlzLmNvbm5lY3RBbmRSZWNvbmNpbGUoKS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICBsb2dnZXIud2Fybihgc3Vic2NyaWJlciByZWNvbm5lY3QgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICB0aGlzLnJldHJ5TGF0ZXIoKTtcbiAgICAgIH0pO1xuICAgIH0sIGRlbGF5KTtcbiAgfVxuXG4gIGFzeW5jIGNsb3NlQ2xpZW50KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuY2xpZW50O1xuICAgIGlmICghY2xpZW50KSByZXR1cm47XG5cbiAgICB0aGlzLmNsaWVudCA9IG51bGw7XG4gICAgY2xpZW50LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIGF3YWl0IGNsaWVudC5lbmQoKS5jYXRjaCgoKSA9PiB7fSk7XG4gIH1cblxuICBhc3luYyBoYW5kbGVOb3RpZmljYXRpb24ocGF5bG9hZEpzb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBheWxvYWQgPSBKU09OLnBhcnNlKHBheWxvYWRKc29uKSBhcyBQYXlsb2FkO1xuICAgIGlmIChwYXlsb2FkLm9wID09PSBcIkRFTEVURVwiKSB7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIucmVtb3ZlQ2FjaGUocGF5bG9hZC5pZCk7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlclxuICAgICAgICA/Lm9uVG9rZW5SZW1vdmVkKHBheWxvYWQuaWQpXG4gICAgICAgIC5jYXRjaCgoZSkgPT4gbG9nZ2VyLndhcm4oYG9wZW5haSB3b3JrZXIgcmVtb3ZlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSk7XG4gICAgICAvLyBhbnRocm9waWMg7Yag7YGwIOydtOuypO2KuOuKlCDrj5nquLAodm9pZCkg4oCUIHByb3ZpZGVyIOulvCDrqqjrpbTrr4DroZwg66y07ZW07ZWY6rKMIO2VreyDgSDsoJzqsbAg7Iuc64+ELlxuICAgICAgdGhpcy5kaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXI/Lm9uVG9rZW5SZW1vdmVkKHBheWxvYWQuaWQpO1xuICAgICAgbG9nZ2VyLmluZm8oYE5PVElGWSAke3BheWxvYWQub3B9IGlkPSR7cGF5bG9hZC5pZH0g4oaSIHJlbW92ZWQgZnJvbSBjYWNoZWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByb3cgPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRPbmUoXCJBXCIsIHsgaWQ6IHBheWxvYWQuaWQgfSk7XG4gICAgaWYgKCFyb3cpIHtcbiAgICAgIHRoaXMuZGlzcGF0Y2hlci5yZW1vdmVDYWNoZShwYXlsb2FkLmlkKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyXG4gICAgICAgID8ub25Ub2tlblJlbW92ZWQocGF5bG9hZC5pZClcbiAgICAgICAgLmNhdGNoKChlKSA9PiBsb2dnZXIud2Fybihgb3BlbmFpIHdvcmtlciByZW1vdmUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy5vblRva2VuUmVtb3ZlZChwYXlsb2FkLmlkKTtcbiAgICAgIGxvZ2dlci5pbmZvKGBOT1RJRlkgJHtwYXlsb2FkLm9wfSBpZD0ke3BheWxvYWQuaWR9IOKGkiBtaXNzaW5nLCByZW1vdmVkIGZyb20gY2FjaGVgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRpc3BhdGNoZXIudXBzZXJ0Q2FjaGUocGF5bG9hZC5pZCwgcm93KTtcblxuICAgIGlmIChyb3cucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpIHtcbiAgICAgIGNvbnN0IGNyZWRzID0gcm93LmNyZWRlbnRpYWxzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgaWYgKHBheWxvYWQub3AgPT09IFwiSU5TRVJUXCIpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXJcbiAgICAgICAgICA/Lm9uVG9rZW5BZGRlZChwYXlsb2FkLmlkLCByb3cubmFtZSwgY3JlZHMgYXMgT3BlbkFJQ3JlZGVudGlhbHMpXG4gICAgICAgICAgLmNhdGNoKChlKSA9PiBsb2dnZXIud2Fybihgb3BlbmFpIHdvcmtlciBzcGF3biBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCkpO1xuICAgICAgfSBlbHNlIGlmIChyb3cuYWN0aXZlKSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyPy5vblRva2VuQWN0aXZhdGVkKHBheWxvYWQuaWQpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlclxuICAgICAgICAgID8ub25Ub2tlblVwZGF0ZWQocGF5bG9hZC5pZCwgcm93Lm5hbWUsIGNyZWRzIGFzIE9wZW5BSUNyZWRlbnRpYWxzKVxuICAgICAgICAgIC5jYXRjaCgoZSkgPT4gbG9nZ2VyLndhcm4oYG9wZW5haSB3b3JrZXIgdXBkYXRlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcj8ub25Ub2tlbkRlYWN0aXZhdGVkKHBheWxvYWQuaWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocm93LnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKSB7XG4gICAgICAvLyBhbnRocm9waWMg7Yag7YGwIOydtOuypO2KuOuKlCDrj5nquLAodm9pZCkuIHdvcmtlciDqsIAg7JeG6rOgIO2SgChNYXAp66eMIOq0gOumrO2VmOuvgOuhnCDri6jsiJw6XG4gICAgICAvLyAgSU5TRVJUIOKGkiDstpTqsIAsIGFjdGl2ZSDrqbQg6rCx7IugKG9uVG9rZW5VcGRhdGVkIOqwgCBpZGVudGl0eSDrs4Dqsr3rj4Qg7LKY66asKSwgaW5hY3RpdmUg66m0IO2SgOyXkOyEnCDsoJzqsbAuXG4gICAgICAvLyAgKOuzhOuPhCBhY3RpdmF0ZS9kZWFjdGl2YXRlIOy9nOuwseydtCDsl4bslrQgYWN0aXZlIO2GoOq4gOydhCBhZGQvcmVtb3ZlIOuhnCDrp6TtlZEuKVxuICAgICAgY29uc3QgY3JlZHMgPSByb3cuY3JlZGVudGlhbHMgYXMgQW50aHJvcGljQ3JlZGVudGlhbHM7XG4gICAgICBpZiAocGF5bG9hZC5vcCA9PT0gXCJJTlNFUlRcIiAmJiByb3cuYWN0aXZlKSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy5vblRva2VuQWRkZWQocGF5bG9hZC5pZCwgcm93Lm5hbWUsIGNyZWRzKTtcbiAgICAgIH0gZWxzZSBpZiAocm93LmFjdGl2ZSkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlcj8ub25Ub2tlblVwZGF0ZWQocGF5bG9hZC5pZCwgcm93Lm5hbWUsIGNyZWRzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGluYWN0aXZlIOuptCBJTlNFUlQg65OgIFVQREFURSDrk6Ag7ZKA7JeQIOuEo+yngCDslYrripTri6QuXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy5vblRva2VuUmVtb3ZlZChwYXlsb2FkLmlkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbG9nZ2VyLmluZm8oYE5PVElGWSAke3BheWxvYWQub3B9IGlkPSR7cGF5bG9hZC5pZH0gKCR7cm93Lm5hbWV9KSBhY3RpdmU9JHtyb3cuYWN0aXZlfWApO1xuICB9XG5cbiAgYXN5bmMgcmVjb25jaWxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRBY3RpdmUoXCJBXCIpO1xuICAgIHRoaXMuZGlzcGF0Y2hlci5yZXBsYWNlQ2FjaGUocm93cyk7XG4gICAgLy8gTk9USUZZIOycoOyLpCDrjIDruYQ6IEFudGhyb3BpY0Rpc3BhdGNoZXIg7ZKA64+EIERCIGFjdGl2ZSBhbnRocm9waWMg7Yag7YGwIOq4sOykgOycvOuhnCDsnqzrj5nquLDtmZQuXG4gICAgLy8gKHJvd3Mg64qUIGFjdGl2ZSDrp4wg4oCUIGluYWN0aXZlL+yCreygnOuQnCDthqDtgbDsnYAg7Jes6riwIOyXhuycvOuvgOuhnCByZXBsYWNlVG9rZW5zIOqwgCDtkoDsl5DshJwg7KCc6rGw7ZWc64ukLilcbiAgICBjb25zdCBhbnRocm9waWNSb3dzID0gcm93c1xuICAgICAgLmZpbHRlcigocikgPT4gci5wcm92aWRlciA9PT0gXCJhbnRocm9waWNcIilcbiAgICAgIC5tYXAoKHIpID0+ICh7IGlkOiByLmlkLCBuYW1lOiByLm5hbWUsIGNyZWRlbnRpYWxzOiByLmNyZWRlbnRpYWxzIGFzIEFudGhyb3BpY0NyZWRlbnRpYWxzIH0pKTtcbiAgICB0aGlzLmRpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlcj8ucmVwbGFjZVRva2VucyhhbnRocm9waWNSb3dzKTtcbiAgICB0aGlzLmxhc3RSZWNvbmNpbGVBdCA9IG5ldyBEYXRlKCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBU0EsTUFBTSxTQUFTLFVBQVUsQ0FBQyxTQUFTLGFBQWEsQ0FBQztBQUVqRCxNQUFNLGlCQUFpQjtBQUN2QixNQUFNLHdCQUF3QixNQUFVO0FBQ3hDLE1BQU0sd0JBQXdCO0FBQzlCLE1BQU0sa0JBQWtCO0FBQ3hCLE1BQU0saUJBQWlCO0FBSXZCLElBQWEsa0JBQWIsTUFBNkI7Q0FDM0IsU0FBd0I7Q0FDeEIsaUJBQXdDO0NBQ3hDLGlCQUF3QztDQUN4QyxvQkFBb0I7Q0FDcEIsVUFBVTtDQUNWLGNBQTJCO0NBQzNCLGtCQUErQjtDQUUvQixZQUNFLFlBQ0EsWUFDQTtBQUZPLE9BQUEsYUFBQTtBQUNBLE9BQUEsYUFBQTs7Q0FHVCxNQUFNLFFBQTBCO0FBQzlCLE9BQUssb0JBQW9CO0FBQ3pCLE9BQUssc0JBQXNCO0FBRTNCLE1BQUk7QUFDRixTQUFNLEtBQUsscUJBQXFCO0FBQ2hDLFVBQU87V0FDQSxHQUFHO0FBQ1YsVUFBTyxLQUFLLDRCQUE2QixFQUFZLFFBQVEsb0JBQW9CO0FBQ2pGLFFBQUssWUFBWTtB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
@@ -9,31 +9,36 @@ function buildToolCallSchema(tools) {
9
9
  }).join("\n");
10
10
  return {
11
11
  type: "object",
12
+ description: "Use this schema only through StructuredOutput. Do not invoke listed client tools as native Claude Code tools. To request client-side tool execution, set action to tool_call and include toolCalls. Use action answer only when no further client tool result is needed.",
12
13
  properties: {
13
14
  action: {
14
15
  type: "string",
15
- enum: ["answer", "tool_call"]
16
+ enum: ["answer", "tool_call"],
17
+ description: "Use tool_call to request client-side tool execution through this structured output. Use answer only for a final answer."
16
18
  },
17
19
  answer: { anyOf: [{ type: "string" }, { type: "null" }] },
18
- toolCalls: { anyOf: [{
19
- type: "array",
20
- items: {
21
- type: "object",
22
- properties: {
23
- toolName: {
24
- type: "string",
25
- enum: tools.map((tool) => tool.name),
26
- description: toolDescriptions
20
+ toolCalls: {
21
+ description: "Client-side tool calls requested through structured output. Do not call these tools as native Claude Code tools.",
22
+ anyOf: [{
23
+ type: "array",
24
+ items: {
25
+ type: "object",
26
+ properties: {
27
+ toolName: {
28
+ type: "string",
29
+ enum: tools.map((tool) => tool.name),
30
+ description: `Client-side tool name to request through structured output. Do not call this as a native Claude Code tool.\n${toolDescriptions}`
31
+ },
32
+ args: {
33
+ type: "string",
34
+ description: "Tool arguments as a JSON string for the client-side tool."
35
+ }
27
36
  },
28
- args: {
29
- type: "string",
30
- description: "Tool arguments as JSON string"
31
- }
32
- },
33
- required: ["toolName", "args"],
34
- additionalProperties: false
35
- }
36
- }, { type: "null" }] }
37
+ required: ["toolName", "args"],
38
+ additionalProperties: false
39
+ }
40
+ }, { type: "null" }]
41
+ }
37
42
  },
38
43
  required: [
39
44
  "action",
@@ -104,4 +109,4 @@ function applyToolCallEmulation(result, tools, threadCoord) {
104
109
  //#endregion
105
110
  export { applyToolCallEmulation, buildToolCallSchema };
106
111
 
107
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC1lbXVsYXRpb24uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3Rvb2wtZW11bGF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5cbmltcG9ydCB7IHR5cGUgSnNvblZhbHVlIH0gZnJvbSBcIi4uLy4uL2NvZGV4LXByb3RvY29sL3NlcmRlX2pzb24vSnNvblZhbHVlXCI7XG5pbXBvcnQge1xuICB0eXBlIFFncmlkQ29udGVudCxcbiAgdHlwZSBRZ3JpZFRocmVhZENvb3JkLFxuICB0eXBlIFFncmlkVG9vbCxcbiAgdHlwZSBRdWVyeU91dHB1dCxcbn0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwidG9vbC1lbXVsYXRpb25cIl0pO1xuXG50eXBlIFRvb2xDYWxsUmVzcG9uc2UgPSB7XG4gIGFjdGlvbjogXCJhbnN3ZXJcIiB8IFwidG9vbF9jYWxsXCI7XG4gIGFuc3dlcj86IHN0cmluZyB8IG51bGw7XG4gIHRvb2xDYWxscz86IEFycmF5PHsgdG9vbE5hbWU6IHN0cmluZzsgYXJnczogc3RyaW5nIH0+IHwgbnVsbDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFRvb2xDYWxsU2NoZW1hKHRvb2xzOiBRZ3JpZFRvb2xbXSk6IEpzb25WYWx1ZSB7XG4gIGNvbnN0IHRvb2xEZXNjcmlwdGlvbnMgPSB0b29sc1xuICAgIC5tYXAoKHRvb2wpID0+IHtcbiAgICAgIGNvbnN0IHNjaGVtYSA9IEpTT04uc3RyaW5naWZ5KHRvb2wuaW5wdXRTY2hlbWEpO1xuICAgICAgcmV0dXJuIGAtICR7dG9vbC5uYW1lfTogJHt0b29sLmRlc2NyaXB0aW9uID8/IFwiXCJ9XFxuICBpbnB1dFNjaGVtYTogJHtzY2hlbWF9YDtcbiAgICB9KVxuICAgIC5qb2luKFwiXFxuXCIpO1xuXG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJvYmplY3RcIixcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICBhY3Rpb246IHsgdHlwZTogXCJzdHJpbmdcIiwgZW51bTogW1wiYW5zd2VyXCIsIFwidG9vbF9jYWxsXCJdIH0sXG4gICAgICBhbnN3ZXI6IHsgYW55T2Y6IFt7IHR5cGU6IFwic3RyaW5nXCIgfSwgeyB0eXBlOiBcIm51bGxcIiB9XSB9LFxuICAgICAgdG9vbENhbGxzOiB7XG4gICAgICAgIGFueU9mOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgaXRlbXM6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgIHRvb2xOYW1lOiB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgZW51bTogdG9vbHMubWFwKCh0b29sKSA9PiB0b29sLm5hbWUpLFxuICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHRvb2xEZXNjcmlwdGlvbnMsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhcmdzOiB7IHR5cGU6IFwic3RyaW5nXCIsIGRlc2NyaXB0aW9uOiBcIlRvb2wgYXJndW1lbnRzIGFzIEpTT04gc3RyaW5nXCIgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IFtcInRvb2xOYW1lXCIsIFwiYXJnc1wiXSxcbiAgICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgdHlwZTogXCJudWxsXCIgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICByZXF1aXJlZDogW1wiYWN0aW9uXCIsIFwiYW5zd2VyXCIsIFwidG9vbENhbGxzXCJdLFxuICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5VG9vbENhbGxFbXVsYXRpb24oXG4gIHJlc3VsdDogT21pdDxRdWVyeU91dHB1dCwgXCJjb250ZW50XCIgfCBcImZpbmlzaFJlYXNvblwiIHwgXCJydW5Db250ZXh0XCI+LFxuICB0b29scz86IFFncmlkVG9vbFtdLFxuICB0aHJlYWRDb29yZD86IFFncmlkVGhyZWFkQ29vcmQsXG4pOiBRdWVyeU91dHB1dCB7XG4gIC8vIHRocmVhZCDsnqzsgqzsmqkg7KKM7ZGc66W8IHJ1bkNvbnRleHQg66GcIOyLpOyWtCDsmKzrprDri6QgKGF1dG8g66qo65Oc64qUIHJlcXVlc3RMb2dJZCDsl4bsnbQgdGhyZWFkQ29vcmQg66eMKS5cbiAgY29uc3QgcnVuQ29udGV4dCA9IHRocmVhZENvb3JkID8geyB0aHJlYWRDb29yZCB9IDogdW5kZWZpbmVkO1xuXG4gIGlmICghdG9vbHM/Lmxlbmd0aCkge1xuICAgIGNvbnN0IGNvbnRlbnQ6IFFncmlkQ29udGVudFtdID0gW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IHJlc3VsdC50ZXh0IH1dO1xuICAgIHJldHVybiB7IC4uLnJlc3VsdCwgY29udGVudCwgZmluaXNoUmVhc29uOiBcInN0b3BcIiwgcnVuQ29udGV4dCB9O1xuICB9XG5cbiAgbGV0IHBhcnNlZDogVG9vbENhbGxSZXNwb25zZTtcbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHJlc3VsdC50ZXh0KSBhcyBUb29sQ2FsbFJlc3BvbnNlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nZ2VyLndhcm4oYHRvb2wtY2FsbCBlbXVsYXRpb24gcGFyc2UgZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gdGV4dDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVzdWx0LFxuICAgICAgY29udGVudDogW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IHJlc3VsdC50ZXh0IH1dLFxuICAgICAgZmluaXNoUmVhc29uOiBcInN0b3BcIixcbiAgICAgIHJ1bkNvbnRleHQsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChwYXJzZWQuYWN0aW9uID09PSBcInRvb2xfY2FsbFwiKSB7XG4gICAgY29uc3QgdG9vbENhbGxzID0gcGFyc2VkLnRvb2xDYWxscyA/PyBbXTtcbiAgICBjb25zdCBjb250ZW50OiBRZ3JpZENvbnRlbnRbXSA9IHRvb2xDYWxscy5tYXAoKHRvb2xDYWxsKSA9PiB7XG4gICAgICBpZiAoIXRvb2xzLnNvbWUoKHRvb2wpID0+IHRvb2wubmFtZSA9PT0gdG9vbENhbGwudG9vbE5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5rbm93biBlbXVsYXRlZCB0b29sOiAke3Rvb2xDYWxsLnRvb2xOYW1lfWApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcInRvb2wtY2FsbFwiLFxuICAgICAgICB0b29sQ2FsbElkOiBgY2FsbF8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDEwKX1gLFxuICAgICAgICB0b29sTmFtZTogdG9vbENhbGwudG9vbE5hbWUsXG4gICAgICAgIGlucHV0OiB0b29sQ2FsbC5hcmdzLFxuICAgICAgfTtcbiAgICB9KTtcbiAgICByZXR1cm4geyAuLi5yZXN1bHQsIGNvbnRlbnQsIGZpbmlzaFJlYXNvbjogXCJ0b29sLWNhbGxzXCIsIHJ1bkNvbnRleHQgfTtcbiAgfVxuXG4gIGNvbnN0IHRleHQgPSBwYXJzZWQuYW5zd2VyID8/IHJlc3VsdC50ZXh0O1xuICByZXR1cm4ge1xuICAgIC4uLnJlc3VsdCxcbiAgICB0ZXh0LFxuICAgIGNvbnRlbnQ6IFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0IH1dLFxuICAgIGZpbmlzaFJlYXNvbjogXCJzdG9wXCIsXG4gICAgcnVuQ29udGV4dCxcbiAgfTtcbn1cbiJdLCJtYXBwaW5n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
112
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC1lbXVsYXRpb24uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3Rvb2wtZW11bGF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5cbmltcG9ydCB7IHR5cGUgSnNvblZhbHVlIH0gZnJvbSBcIi4uLy4uL2NvZGV4LXByb3RvY29sL3NlcmRlX2pzb24vSnNvblZhbHVlXCI7XG5pbXBvcnQge1xuICB0eXBlIFFncmlkQ29udGVudCxcbiAgdHlwZSBRZ3JpZFRocmVhZENvb3JkLFxuICB0eXBlIFFncmlkVG9vbCxcbiAgdHlwZSBRdWVyeU91dHB1dCxcbn0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwidG9vbC1lbXVsYXRpb25cIl0pO1xuXG50eXBlIFRvb2xDYWxsUmVzcG9uc2UgPSB7XG4gIGFjdGlvbjogXCJhbnN3ZXJcIiB8IFwidG9vbF9jYWxsXCI7XG4gIGFuc3dlcj86IHN0cmluZyB8IG51bGw7XG4gIHRvb2xDYWxscz86IEFycmF5PHsgdG9vbE5hbWU6IHN0cmluZzsgYXJnczogc3RyaW5nIH0+IHwgbnVsbDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFRvb2xDYWxsU2NoZW1hKHRvb2xzOiBRZ3JpZFRvb2xbXSk6IEpzb25WYWx1ZSB7XG4gIGNvbnN0IHRvb2xEZXNjcmlwdGlvbnMgPSB0b29sc1xuICAgIC5tYXAoKHRvb2wpID0+IHtcbiAgICAgIGNvbnN0IHNjaGVtYSA9IEpTT04uc3RyaW5naWZ5KHRvb2wuaW5wdXRTY2hlbWEpO1xuICAgICAgcmV0dXJuIGAtICR7dG9vbC5uYW1lfTogJHt0b29sLmRlc2NyaXB0aW9uID8/IFwiXCJ9XFxuICBpbnB1dFNjaGVtYTogJHtzY2hlbWF9YDtcbiAgICB9KVxuICAgIC5qb2luKFwiXFxuXCIpO1xuXG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJvYmplY3RcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiVXNlIHRoaXMgc2NoZW1hIG9ubHkgdGhyb3VnaCBTdHJ1Y3R1cmVkT3V0cHV0LiBEbyBub3QgaW52b2tlIGxpc3RlZCBjbGllbnQgdG9vbHMgYXMgbmF0aXZlIENsYXVkZSBDb2RlIHRvb2xzLiBUbyByZXF1ZXN0IGNsaWVudC1zaWRlIHRvb2wgZXhlY3V0aW9uLCBzZXQgYWN0aW9uIHRvIHRvb2xfY2FsbCBhbmQgaW5jbHVkZSB0b29sQ2FsbHMuIFVzZSBhY3Rpb24gYW5zd2VyIG9ubHkgd2hlbiBubyBmdXJ0aGVyIGNsaWVudCB0b29sIHJlc3VsdCBpcyBuZWVkZWQuXCIsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgYWN0aW9uOiB7XG4gICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGVudW06IFtcImFuc3dlclwiLCBcInRvb2xfY2FsbFwiXSxcbiAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgXCJVc2UgdG9vbF9jYWxsIHRvIHJlcXVlc3QgY2xpZW50LXNpZGUgdG9vbCBleGVjdXRpb24gdGhyb3VnaCB0aGlzIHN0cnVjdHVyZWQgb3V0cHV0LiBVc2UgYW5zd2VyIG9ubHkgZm9yIGEgZmluYWwgYW5zd2VyLlwiLFxuICAgICAgfSxcbiAgICAgIGFuc3dlcjogeyBhbnlPZjogW3sgdHlwZTogXCJzdHJpbmdcIiB9LCB7IHR5cGU6IFwibnVsbFwiIH1dIH0sXG4gICAgICB0b29sQ2FsbHM6IHtcbiAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgXCJDbGllbnQtc2lkZSB0b29sIGNhbGxzIHJlcXVlc3RlZCB0aHJvdWdoIHN0cnVjdHVyZWQgb3V0cHV0LiBEbyBub3QgY2FsbCB0aGVzZSB0b29scyBhcyBuYXRpdmUgQ2xhdWRlIENvZGUgdG9vbHMuXCIsXG4gICAgICAgIGFueU9mOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgaXRlbXM6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgIHRvb2xOYW1lOiB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgZW51bTogdG9vbHMubWFwKCh0b29sKSA9PiB0b29sLm5hbWUpLFxuICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGBDbGllbnQtc2lkZSB0b29sIG5hbWUgdG8gcmVxdWVzdCB0aHJvdWdoIHN0cnVjdHVyZWQgb3V0cHV0LiBEbyBub3QgY2FsbCB0aGlzIGFzIGEgbmF0aXZlIENsYXVkZSBDb2RlIHRvb2wuXFxuJHt0b29sRGVzY3JpcHRpb25zfWAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVG9vbCBhcmd1bWVudHMgYXMgYSBKU09OIHN0cmluZyBmb3IgdGhlIGNsaWVudC1zaWRlIHRvb2wuXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IFtcInRvb2xOYW1lXCIsIFwiYXJnc1wiXSxcbiAgICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgdHlwZTogXCJudWxsXCIgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICByZXF1aXJlZDogW1wiYWN0aW9uXCIsIFwiYW5zd2VyXCIsIFwidG9vbENhbGxzXCJdLFxuICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5VG9vbENhbGxFbXVsYXRpb24oXG4gIHJlc3VsdDogT21pdDxRdWVyeU91dHB1dCwgXCJjb250ZW50XCIgfCBcImZpbmlzaFJlYXNvblwiIHwgXCJydW5Db250ZXh0XCI+LFxuICB0b29scz86IFFncmlkVG9vbFtdLFxuICB0aHJlYWRDb29yZD86IFFncmlkVGhyZWFkQ29vcmQsXG4pOiBRdWVyeU91dHB1dCB7XG4gIC8vIHRocmVhZCDsnqzsgqzsmqkg7KKM7ZGc66W8IHJ1bkNvbnRleHQg66GcIOyLpOyWtCDsmKzrprDri6QgKGF1dG8g66qo65Oc64qUIHJlcXVlc3RMb2dJZCDsl4bsnbQgdGhyZWFkQ29vcmQg66eMKS5cbiAgY29uc3QgcnVuQ29udGV4dCA9IHRocmVhZENvb3JkID8geyB0aHJlYWRDb29yZCB9IDogdW5kZWZpbmVkO1xuXG4gIGlmICghdG9vbHM/Lmxlbmd0aCkge1xuICAgIGNvbnN0IGNvbnRlbnQ6IFFncmlkQ29udGVudFtdID0gW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IHJlc3VsdC50ZXh0IH1dO1xuICAgIHJldHVybiB7IC4uLnJlc3VsdCwgY29udGVudCwgZmluaXNoUmVhc29uOiBcInN0b3BcIiwgcnVuQ29udGV4dCB9O1xuICB9XG5cbiAgbGV0IHBhcnNlZDogVG9vbENhbGxSZXNwb25zZTtcbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHJlc3VsdC50ZXh0KSBhcyBUb29sQ2FsbFJlc3BvbnNlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nZ2VyLndhcm4oYHRvb2wtY2FsbCBlbXVsYXRpb24gcGFyc2UgZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gdGV4dDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVzdWx0LFxuICAgICAgY29udGVudDogW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IHJlc3VsdC50ZXh0IH1dLFxuICAgICAgZmluaXNoUmVhc29uOiBcInN0b3BcIixcbiAgICAgIHJ1bkNvbnRleHQsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChwYXJzZWQuYWN0aW9uID09PSBcInRvb2xfY2FsbFwiKSB7XG4gICAgY29uc3QgdG9vbENhbGxzID0gcGFyc2VkLnRvb2xDYWxscyA/PyBbXTtcbiAgICBjb25zdCBjb250ZW50OiBRZ3JpZENvbnRlbnRbXSA9IHRvb2xDYWxscy5tYXAoKHRvb2xDYWxsKSA9PiB7XG4gICAgICBpZiAoIXRvb2xzLnNvbWUoKHRvb2wpID0+IHRvb2wubmFtZSA9PT0gdG9vbENhbGwudG9vbE5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5rbm93biBlbXVsYXRlZCB0b29sOiAke3Rvb2xDYWxsLnRvb2xOYW1lfWApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcInRvb2wtY2FsbFwiLFxuICAgICAgICB0b29sQ2FsbElkOiBgY2FsbF8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDEwKX1gLFxuICAgICAgICB0b29sTmFtZTogdG9vbENhbGwudG9vbE5hbWUsXG4gICAgICAgIGlucHV0OiB0b29sQ2FsbC5hcmdzLFxuICAgICAgfTtcbiAgICB9KTtcbiAgICByZXR1cm4geyAuLi5yZXN1bHQsIGNvbnRlbnQsIGZpbmlzaFJlYXNvbjogXCJ0b29sLWNhbGxzXCIsIHJ1bkNvbnRleHQgfTtcbiAgfVxuXG4gIGNvbnN0IHRleHQgPSBwYXJzZWQuYW5zd2VyID8/IHJlc3VsdC50ZXh0O1xuICByZXR1cm4ge1xuICAgIC4uLnJlc3VsdCxcbiAgICB0ZXh0LFxuICAgIGNvbnRlbnQ6IFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0IH1dLFxuICAgIGZpbmlzaFJlYXNvbjogXCJzdG9wXCIsXG4gICAgcnVuQ29udGV4dCxcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7O0FBVUEsTUFBTSxTQUFTLFVBQVUsQ0FBQyxTQUFTLGlCQUFpQixDQUFDO0FBUXJELFNBQWdCLG9CQUFvQixPQUErQjtDQUNqRSxNQUFNLG1CQUFtQixNQUN0QixLQUFLLFNBQVM7RUFDYixNQUFNLFNBQVMsS0FBSyxVQUFVLEtBQUssWUFBWTtBQUMvQyxTQUFPLEtBQUssS0FBSyxLQUFLLElBQUksS0FBSyxlQUFlLEdBQUcsbUJBQW1CO0dBQ3BFLENBQ0QsS0FBSyxLQUFLO0FBRWIsUUFBTztFQUNMLE1BQU07RUFDTixhQUNFO0VBQ0YsWUFBWTtHQUNWLFFBQVE7SUFDTixNQUFNO0lBQ04sTUFBTSxDQUFDLFVBQVUsWUFBWTtJQUM3QixhQUNFO0lBQ0g7R0FDRCxRQUFRLEVBQUUsT0FBTyxDQUFDLEVBQUUsTUFBTSxVQUFVLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQyxFQUFFO0dBQ3pELFdBQVc7SUFDVCxhQUNFO0lBQ0YsT0FBTyxDQUNMO0tBQ0UsTUFBTTtLQUNOLE9BQU87TUFDTCxNQUFNO01BQ04sWUFBWTtPQUNWLFVBQVU7UUFDUixNQUFNO1FBQ04sTUFBTSxNQUFNLEtBQUssU0FBUyxLQUFLLEtBQUs7UUFDcEMsYUFBYSwrR0FBK0c7UUFDN0g7T0FDRCxNQUFNO1FBQ0osTUFBTTtRQUNOLGFBQWE7UUFDZDtPQUNGO01BQ0QsVUFBVSxDQUFDLFlBQVksT0FBTztNQUM5QixzQkFBc0I7TUFDdkI7S0FDRixFQUNELEVBQUUsTUFBTSxRQUFRLENBQ2pCO0lBQ0Y7R0FDRjtFQUNELFVBQVU7R0FBQztHQUFVO0dBQVU7R0FBWTtFQUMzQyxzQkFBc0I7RUFDdkI7O0FBR0gsU0FBZ0IsdUJBQ2QsUUFDQSxPQUNBLGFBQ2E7Q0FFYixNQUFNLGFBQWEsY0FBYyxFQUFFLGFBQWEsR0FBRztBQUVuRCxLQUFJLENBQUMsT0FBTyxRQUFRO0VBQ2xCLE1BQU0sVUFBMEIsQ0FBQztHQUFFLE1BQU07R0FBUSxNQUFNLE9BQU87R0FBTSxDQUFDO0FBQ3JFLFNBQU87R0FBRSxHQUFHO0dBQVE7R0FBUyxjQUFjO0dBQVE7R0FBWTs7Q0FHakUsSUFBSTtBQUNKLEtBQUk7QUFDRixXQUFTLEtBQUssTUFBTSxPQUFPLEtBQUs7VUFDekIsR0FBRztBQUNWLFNBQU8sS0FBSywyREFBNEQsRUFBWSxVQUFVO0FBQzlGLFNBQU87R0FDTCxHQUFHO0dBQ0gsU0FBUyxDQUFDO0lBQUUsTUFBTTtJQUFRLE1BQU0sT0FBTztJQUFNLENBQUM7R0FDOUMsY0FBYztHQUNkO0dBQ0Q7O0FBR0gsS0FBSSxPQUFPLFdBQVcsYUFBYTtFQUVqQyxNQUFNLFdBRFksT0FBTyxhQUFhLEVBQUUsRUFDRSxLQUFLLGFBQWE7QUFDMUQsT0FBSSxDQUFDLE1BQU0sTUFBTSxTQUFTLEtBQUssU0FBUyxTQUFTLFNBQVMsQ0FDeEQsT0FBTSxJQUFJLE1BQU0sMEJBQTBCLFNBQVMsV0FBVztBQUdoRSxVQUFPO0lBQ0wsTUFBTTtJQUNOLFlBQVksUUFBUSxLQUFLLFFBQVEsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRztJQUMzRCxVQUFVLFNBQVM7SUFDbkIsT0FBTyxTQUFTO0lBQ2pCO0lBQ0Q7QUFDRixTQUFPO0dBQUUsR0FBRztHQUFRO0dBQVMsY0FBYztHQUFjO0dBQVk7O0NBR3ZFLE1BQU0sT0FBTyxPQUFPLFVBQVUsT0FBTztBQUNyQyxRQUFPO0VBQ0wsR0FBRztFQUNIO0VBQ0EsU0FBUyxDQUFDO0dBQUUsTUFBTTtHQUFRO0dBQU0sQ0FBQztFQUNqQyxjQUFjO0VBQ2Q7RUFDRCJ9