@cartanova/qgrid-cli 2.10.10 → 2.11.0

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 (313) hide show
  1. package/bundle/dist/_virtual/_rolldown/runtime.js +1 -10
  2. package/bundle/dist/application/monit/log-buffer.js +12 -6
  3. package/bundle/dist/application/monit/monit.frame.js +11 -3
  4. package/bundle/dist/application/monit/monit.types.js +1 -1
  5. package/bundle/dist/application/qgrid/conv-routing.js +9 -6
  6. package/bundle/dist/application/qgrid/expired-token-reminder.js +2 -2
  7. package/bundle/dist/application/qgrid/oauth.js +31 -4
  8. package/bundle/dist/application/qgrid/qgrid-image-generation.js +1 -1
  9. package/bundle/dist/application/qgrid/qgrid-response-format.js +21 -19
  10. package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +40 -33
  11. package/bundle/dist/application/qgrid/qgrid.dispatcher.js +128 -93
  12. package/bundle/dist/application/qgrid/qgrid.frame.js +930 -49
  13. package/bundle/dist/application/qgrid/qgrid.types.js +212 -5
  14. package/bundle/dist/application/qgrid/schema-prompt.js +75 -48
  15. package/bundle/dist/application/qgrid/slack-user-map.js +1 -1
  16. package/bundle/dist/application/qgrid/token-death.js +1 -1
  17. package/bundle/dist/application/qgrid/token-subscriber.js +83 -30
  18. package/bundle/dist/application/qgrid/token-trigger-setup.js +1 -1
  19. package/bundle/dist/application/qgrid/token-window-keepalive.js +8 -6
  20. package/bundle/dist/application/qgrid/tool-emulation-schema.js +13 -13
  21. package/bundle/dist/application/qgrid/tool-emulation.js +19 -15
  22. package/bundle/dist/application/request-log/json-schema-type-text.js +29 -12
  23. package/bundle/dist/application/request-log/request-log.model.js +83 -70
  24. package/bundle/dist/application/request-log/request-log.types.js +1 -1
  25. package/bundle/dist/application/request-log/zod-code-format.js +1 -1
  26. package/bundle/dist/application/request-log-step/request-log-step.model.js +1 -1
  27. package/bundle/dist/application/request-log-step/request-log-step.types.js +1 -1
  28. package/bundle/dist/application/setting/setting.constant.js +1 -1
  29. package/bundle/dist/application/setting/setting.model.js +2 -2
  30. package/bundle/dist/application/setting/setting.store.js +2 -2
  31. package/bundle/dist/application/setting/setting.types.js +1 -1
  32. package/bundle/dist/application/sonamu.generated.js +32 -16
  33. package/bundle/dist/application/sonamu.generated.sso.js +1 -1
  34. package/bundle/dist/application/token/token.model.js +26 -9
  35. package/bundle/dist/application/token/token.types.js +20 -3
  36. package/bundle/dist/i18n/en.js +15 -1
  37. package/bundle/dist/i18n/ko.js +15 -1
  38. package/bundle/dist/i18n/sd.generated.js +1 -1
  39. package/bundle/dist/migrations/20260807133553_manual__backfill_request_log_cost.js +8 -6
  40. package/bundle/dist/server-bootstrap.js +4 -2
  41. package/bundle/dist/server-error-handler.js +1 -1
  42. package/bundle/dist/sonamu.config.js +37 -8
  43. package/bundle/dist/startup-migrations.js +17 -7
  44. package/bundle/dist/testing/global.js +1 -1
  45. package/bundle/dist/testing/schema-bench.js +0 -0
  46. package/bundle/dist/testing/test-database-name.js +1 -1
  47. package/bundle/dist/utils/providers/anthropic/anthropic-constants.js +1 -1
  48. package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +11 -5
  49. package/bundle/dist/utils/providers/anthropic/anthropic-quota.js +4 -4
  50. package/bundle/dist/utils/providers/anthropic/anthropic-thinking.js +1 -1
  51. package/bundle/dist/utils/providers/anthropic/claude-session.js +20 -19
  52. package/bundle/dist/utils/providers/anthropic/fence-strip.js +1 -1
  53. package/bundle/dist/utils/providers/anthropic/stream-json-adapter.js +49 -23
  54. package/bundle/dist/utils/providers/common/credentials.js +5 -1
  55. package/bundle/dist/utils/providers/common/effort.js +3 -3
  56. package/bundle/dist/utils/providers/common/model-cost.js +69 -14
  57. package/bundle/dist/utils/providers/common/provider-types.js +29 -1
  58. package/bundle/dist/utils/providers/common/schema-validation.js +78 -40
  59. package/bundle/dist/utils/providers/common/smooth-weighted-round-robin.js +1 -1
  60. package/bundle/dist/utils/providers/common/strictifier.js +62 -43
  61. package/bundle/dist/utils/providers/common/thinking.js +3 -2
  62. package/bundle/dist/utils/providers/common/ttft.js +1 -1
  63. package/bundle/dist/utils/providers/grok/grok-backend-protocol.js +427 -0
  64. package/bundle/dist/utils/providers/grok/grok-constants.js +55 -0
  65. package/bundle/dist/utils/providers/grok/grok-direct-client.js +196 -0
  66. package/bundle/dist/utils/providers/grok/grok-dispatcher.js +1313 -0
  67. package/bundle/dist/utils/providers/grok/grok-headers.js +118 -0
  68. package/bundle/dist/utils/providers/grok/grok-media-client.js +420 -0
  69. package/bundle/dist/utils/providers/grok/grok-models.js +114 -0
  70. package/bundle/dist/utils/providers/grok/grok-oauth.js +455 -0
  71. package/bundle/dist/utils/providers/grok/grok-quota.js +119 -0
  72. package/bundle/dist/utils/providers/grok/grok-refresh.js +192 -0
  73. package/bundle/dist/utils/providers/grok/grok-types.js +186 -0
  74. package/bundle/dist/utils/providers/grok/grok-voice-client.js +199 -0
  75. package/bundle/dist/utils/providers/grok/index.js +11 -0
  76. package/bundle/dist/utils/providers/openai/openai-backend-protocol.js +111 -83
  77. package/bundle/dist/utils/providers/openai/openai-callback-relay.js +3 -2
  78. package/bundle/dist/utils/providers/openai/openai-constants.js +1 -1
  79. package/bundle/dist/utils/providers/openai/openai-direct-client.js +23 -7
  80. package/bundle/dist/utils/providers/openai/openai-dispatcher.js +143 -106
  81. package/bundle/dist/utils/providers/openai/openai-image-generation.js +48 -33
  82. package/bundle/dist/utils/providers/openai/openai-oauth.js +28 -13
  83. package/bundle/dist/utils/providers/openai/openai-quota.js +38 -27
  84. package/bundle/dist/utils/providers/openai/openai-refresh.js +17 -9
  85. package/bundle/dist/utils/providers/openai/openai-sse.js +1 -1
  86. package/bundle/dist/utils/providers/openai/openai-transport-config.js +1 -1
  87. package/bundle/dist/utils/quiet-hours.js +1 -1
  88. package/bundle/dist/utils/slack-notify.js +14 -8
  89. package/bundle/dist/utils/subset-loaders.js +4 -5
  90. package/bundle/src/application/monit/log-buffer.ts +23 -9
  91. package/bundle/src/application/monit/monit.frame.ts +22 -5
  92. package/bundle/src/application/monit/monit.types.ts +6 -0
  93. package/bundle/src/application/qgrid/conv-routing.test.ts +76 -4
  94. package/bundle/src/application/qgrid/conv-routing.ts +35 -9
  95. package/bundle/src/application/qgrid/expired-token-reminder.ts +9 -1
  96. package/bundle/src/application/qgrid/oauth.ts +51 -15
  97. package/bundle/src/application/qgrid/qgrid-image-generation.ts +9 -0
  98. package/bundle/src/application/qgrid/qgrid-response-format.ts +50 -25
  99. package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +19 -0
  100. package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +84 -40
  101. package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +97 -0
  102. package/bundle/src/application/qgrid/qgrid.dispatcher.ts +274 -126
  103. package/bundle/src/application/qgrid/qgrid.frame.test.ts +1013 -3
  104. package/bundle/src/application/qgrid/qgrid.frame.ts +1415 -60
  105. package/bundle/src/application/qgrid/qgrid.types.ts +335 -0
  106. package/bundle/src/application/qgrid/schema-prompt.ts +105 -41
  107. package/bundle/src/application/qgrid/slack-user-map.ts +5 -0
  108. package/bundle/src/application/qgrid/token-death.ts +4 -0
  109. package/bundle/src/application/qgrid/token-subscriber.test.ts +21 -19
  110. package/bundle/src/application/qgrid/token-subscriber.ts +186 -53
  111. package/bundle/src/application/qgrid/token-trigger-setup.ts +2 -0
  112. package/bundle/src/application/qgrid/token-window-keepalive.ts +49 -6
  113. package/bundle/src/application/qgrid/tool-emulation-schema.ts +33 -29
  114. package/bundle/src/application/qgrid/tool-emulation.ts +52 -27
  115. package/bundle/src/application/request-log/json-schema-type-text.test.ts +5 -5
  116. package/bundle/src/application/request-log/json-schema-type-text.ts +81 -26
  117. package/bundle/src/application/request-log/request-log.model.test.ts +111 -4
  118. package/bundle/src/application/request-log/request-log.model.ts +277 -146
  119. package/bundle/src/application/request-log/request-log.types.ts +6 -0
  120. package/bundle/src/application/request-log/zod-code-format.ts +11 -0
  121. package/bundle/src/application/request-log-step/request-log-step.model.ts +1 -0
  122. package/bundle/src/application/request-log-step/request-log-step.types.ts +2 -0
  123. package/bundle/src/application/setting/setting.constant.ts +9 -0
  124. package/bundle/src/application/setting/setting.model.ts +12 -2
  125. package/bundle/src/application/setting/setting.store.ts +5 -1
  126. package/bundle/src/application/setting/setting.types.ts +8 -0
  127. package/bundle/src/application/sonamu.generated.http +133 -0
  128. package/bundle/src/application/sonamu.generated.sso.ts +2 -0
  129. package/bundle/src/application/sonamu.generated.ts +15 -0
  130. package/bundle/src/application/token/token.identity.test.ts +20 -0
  131. package/bundle/src/application/token/token.model.ts +66 -7
  132. package/bundle/src/application/token/token.types.ts +24 -1
  133. package/bundle/src/i18n/en.ts +19 -0
  134. package/bundle/src/i18n/ko.ts +21 -0
  135. package/bundle/src/i18n/sd.generated.ts +23 -2
  136. package/bundle/src/migrations/20260807133553_manual__backfill_request_log_cost.ts +16 -8
  137. package/bundle/src/server-bootstrap.ts +4 -2
  138. package/bundle/src/server-error-handler.ts +1 -0
  139. package/bundle/src/sonamu.config.ts +69 -7
  140. package/bundle/src/startup-migrations.ts +27 -9
  141. package/bundle/src/testing/global.ts +20 -0
  142. package/bundle/src/testing/schema-bench.ts +105 -30
  143. package/bundle/src/testing/test-database-name.ts +2 -0
  144. package/bundle/src/utils/providers/anthropic/anthropic-constants.ts +8 -0
  145. package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +41 -6
  146. package/bundle/src/utils/providers/anthropic/anthropic-quota.ts +7 -3
  147. package/bundle/src/utils/providers/anthropic/anthropic-thinking.ts +6 -0
  148. package/bundle/src/utils/providers/anthropic/claude-session.ts +58 -24
  149. package/bundle/src/utils/providers/anthropic/fence-strip.ts +11 -0
  150. package/bundle/src/utils/providers/anthropic/stream-json-adapter.ts +110 -45
  151. package/bundle/src/utils/providers/common/credentials.ts +8 -0
  152. package/bundle/src/utils/providers/common/effort.ts +9 -2
  153. package/bundle/src/utils/providers/common/model-cost.test.ts +48 -1
  154. package/bundle/src/utils/providers/common/model-cost.ts +259 -158
  155. package/bundle/src/utils/providers/common/provider-dispatcher.ts +98 -2
  156. package/bundle/src/utils/providers/common/provider-types.ts +46 -3
  157. package/bundle/src/utils/providers/common/schema-validation.test.ts +5 -1
  158. package/bundle/src/utils/providers/common/schema-validation.ts +124 -56
  159. package/bundle/src/utils/providers/common/smooth-weighted-round-robin.ts +4 -0
  160. package/bundle/src/utils/providers/common/strictifier.ts +185 -59
  161. package/bundle/src/utils/providers/common/thinking.ts +2 -2
  162. package/bundle/src/utils/providers/common/ttft.ts +4 -2
  163. package/bundle/src/utils/providers/grok/__fixtures__/golden-responses-1.0.60.json +164 -0
  164. package/bundle/src/utils/providers/grok/grok-backend-protocol.test.ts +325 -0
  165. package/bundle/src/utils/providers/grok/grok-backend-protocol.ts +721 -0
  166. package/bundle/src/utils/providers/grok/grok-constants.ts +105 -0
  167. package/bundle/src/utils/providers/grok/grok-direct-client.test.ts +179 -0
  168. package/bundle/src/utils/providers/grok/grok-direct-client.ts +313 -0
  169. package/bundle/src/utils/providers/grok/grok-dispatcher.test.ts +1395 -0
  170. package/bundle/src/utils/providers/grok/grok-dispatcher.ts +2105 -0
  171. package/bundle/src/utils/providers/grok/grok-headers.test.ts +149 -0
  172. package/bundle/src/utils/providers/grok/grok-headers.ts +199 -0
  173. package/bundle/src/utils/providers/grok/grok-media-client.test.ts +446 -0
  174. package/bundle/src/utils/providers/grok/grok-media-client.ts +703 -0
  175. package/bundle/src/utils/providers/grok/grok-models.test.ts +96 -0
  176. package/bundle/src/utils/providers/grok/grok-models.ts +161 -0
  177. package/bundle/src/utils/providers/grok/grok-oauth.test.ts +406 -0
  178. package/bundle/src/utils/providers/grok/grok-oauth.ts +771 -0
  179. package/bundle/src/utils/providers/grok/grok-quota.test.ts +142 -0
  180. package/bundle/src/utils/providers/grok/grok-quota.ts +198 -0
  181. package/bundle/src/utils/providers/grok/grok-refresh.test.ts +239 -0
  182. package/bundle/src/utils/providers/grok/grok-refresh.ts +325 -0
  183. package/bundle/src/utils/providers/grok/grok-types.test.ts +252 -0
  184. package/bundle/src/utils/providers/grok/grok-types.ts +374 -0
  185. package/bundle/src/utils/providers/grok/grok-voice-client.test.ts +321 -0
  186. package/bundle/src/utils/providers/grok/grok-voice-client.ts +284 -0
  187. package/bundle/src/utils/providers/grok/index.ts +20 -0
  188. package/bundle/src/utils/providers/openai/openai-backend-protocol.ts +221 -137
  189. package/bundle/src/utils/providers/openai/openai-callback-relay.ts +12 -1
  190. package/bundle/src/utils/providers/openai/openai-constants.ts +2 -0
  191. package/bundle/src/utils/providers/openai/openai-direct-client.ts +111 -21
  192. package/bundle/src/utils/providers/openai/openai-dispatcher.ts +322 -169
  193. package/bundle/src/utils/providers/openai/openai-image-generation.ts +116 -36
  194. package/bundle/src/utils/providers/openai/openai-oauth.ts +48 -20
  195. package/bundle/src/utils/providers/openai/openai-quota.ts +77 -46
  196. package/bundle/src/utils/providers/openai/openai-refresh.ts +42 -18
  197. package/bundle/src/utils/providers/openai/openai-sse.ts +27 -3
  198. package/bundle/src/utils/providers/openai/openai-transport-config.ts +2 -0
  199. package/bundle/src/utils/quiet-hours.ts +12 -1
  200. package/bundle/src/utils/slack-notify.ts +44 -13
  201. package/bundle/src/utils/subset-loaders.ts +7 -7
  202. package/bundle/web-dist/client/assets/clsx-5XM_pHvN.js +1 -0
  203. package/bundle/web-dist/client/assets/index-BA7uQ-6c.js +31 -0
  204. package/bundle/web-dist/client/assets/index-Be2qCZmI.css +1 -0
  205. package/bundle/web-dist/client/assets/logs-C47OJGEI.js +1 -0
  206. package/bundle/web-dist/client/assets/monit-BS9no0dU.js +4 -0
  207. package/bundle/web-dist/client/assets/plus-sdACTfH0.js +1 -0
  208. package/bundle/web-dist/client/assets/refresh-cw-CY8o_1cT.js +1 -0
  209. package/bundle/web-dist/client/assets/request-model-BRtFuZvj.js +1 -0
  210. package/bundle/web-dist/client/assets/routes-kqgkUxE8.js +5 -0
  211. package/bundle/web-dist/client/assets/{services.generated-NP-ValHd.js → services.generated-CefiDXEv.js} +5 -5
  212. package/bundle/web-dist/client/assets/settings-DNDvFGSw.js +1 -0
  213. package/bundle/web-dist/client/assets/show-u8Np69q3.js +2 -0
  214. package/bundle/web-dist/client/assets/tokens-QvP410NW.js +1 -0
  215. package/bundle/web-dist/client/assets/total-cost-MnfKU8IN.js +1 -0
  216. package/bundle/web-dist/client/assets/use-oauth-login-flow-Bzdh28Ws.js +1 -0
  217. package/bundle/web-dist/client/assets/use-update-token-mutation-CfJKaxmR.js +1 -0
  218. package/bundle/web-dist/client/assets/vendor-react-CUFFrVN9.js +244 -0
  219. package/bundle/web-dist/client/assets/vendor-tanstack-Bf_jag9G.js +1 -0
  220. package/bundle/web-dist/client/index.html +6 -6
  221. package/bundle/web-dist/server/assets/clsx-D_N5PN_2.js +16 -0
  222. package/bundle/web-dist/server/assets/{lazyRouteComponent-CgBdabgd.js → lazyRouteComponent-D8iTIHyn.js} +129 -2
  223. package/bundle/web-dist/server/assets/logs-B3OTd9hy.js +825 -0
  224. package/bundle/web-dist/server/assets/{monit-ZPt66W5M.js → monit-B2hqorPe.js} +385 -126
  225. package/bundle/web-dist/server/assets/plus-DwG7h9kq.js +28 -0
  226. package/bundle/web-dist/server/assets/{react-dom-Ds75e4Jl.js → react-dom-BIYQzBqG.js} +2 -129
  227. package/bundle/web-dist/server/assets/refresh-cw-mMBkwOq0.js +44 -0
  228. package/bundle/web-dist/server/assets/{request-model-DjGldb-h.js → request-model-I6OdODSH.js} +15 -6
  229. package/bundle/web-dist/server/assets/{routes-Ct-k7nBA.js → routes-B95YlUv2.js} +760 -213
  230. package/bundle/web-dist/server/assets/{services.generated-BA4AcAf5.js → services.generated-DQATJ6qf.js} +12820 -12194
  231. package/bundle/web-dist/server/assets/settings-C3gbGk0m.js +830 -0
  232. package/bundle/web-dist/server/assets/{show-LSFIzvO2.js → show-Bxaj3rhH.js} +1350 -418
  233. package/bundle/web-dist/server/assets/tokens-CZjH3cB7.js +1038 -0
  234. package/bundle/web-dist/server/assets/total-cost-fTE9Xy82.js +18 -0
  235. package/bundle/web-dist/server/assets/use-oauth-login-flow-CKDHgc3U.js +2379 -0
  236. package/bundle/web-dist/server/assets/{use-update-token-mutation-pkArIzCP.js → use-update-token-mutation-BEbgOzaa.js} +1 -1
  237. package/bundle/web-dist/server/entry-server.generated.js +4295 -22810
  238. package/dist/cli.js +9 -9
  239. package/package.json +4 -11
  240. package/postinstall.mjs +12 -0
  241. package/skills/qgrid/SKILL.md +1 -0
  242. package/skills/qgrid/references/cli-env-and-server-boot.md +4 -1
  243. package/skills/qgrid/references/decision-rationale.md +23 -0
  244. package/skills/qgrid/references/grok-runtime.md +89 -0
  245. package/skills/qgrid/references/provider-runtime-differences.md +30 -29
  246. package/skills/qgrid/references/repo-map.md +10 -0
  247. package/skills/qgrid/references/token-auth-quota-lifecycle.md +56 -3
  248. package/bundle/dist/node_modules/.pnpm/@jridgewell_sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.js +0 -406
  249. package/bundle/dist/node_modules/.pnpm/@vitest_expect@4.1.10/node_modules/@vitest/expect/dist/index.js +0 -1507
  250. package/bundle/dist/node_modules/.pnpm/@vitest_pretty-format@4.1.10/node_modules/@vitest/pretty-format/dist/index.js +0 -887
  251. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/chunk-artifact.js +0 -2756
  252. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/index.js +0 -8
  253. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/utils.js +0 -8
  254. package/bundle/dist/node_modules/.pnpm/@vitest_snapshot@4.1.10/node_modules/@vitest/snapshot/dist/index.js +0 -922
  255. package/bundle/dist/node_modules/.pnpm/@vitest_spy@4.1.10/node_modules/@vitest/spy/dist/index.js +0 -386
  256. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.js +0 -121
  257. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/constants.js +0 -51
  258. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/diff.js +0 -1317
  259. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/display.js +0 -561
  260. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/error.js +0 -40
  261. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/helpers.js +0 -272
  262. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/offset.js +0 -27
  263. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/serialize.js +0 -77
  264. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/source-map.js +0 -381
  265. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/timers.js +0 -51
  266. package/bundle/dist/node_modules/.pnpm/chai@6.2.2/node_modules/chai/index.js +0 -2986
  267. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.js +0 -10
  268. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.js +0 -109
  269. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.js +0 -10
  270. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.js +0 -10
  271. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.js +0 -10
  272. package/bundle/dist/node_modules/.pnpm/magic-string@0.30.21/node_modules/magic-string/dist/magic-string.es.js +0 -1126
  273. package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/index.js +0 -21
  274. package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.js +0 -432
  275. package/bundle/dist/node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.js +0 -517
  276. package/bundle/dist/node_modules/.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.js +0 -101
  277. package/bundle/dist/node_modules/.pnpm/vite@8.0.3_@emnapi_core@1.11.2_@emnapi_runtime@1.11.2_@types_node@25.0.7_esbuild@0.27.4_5b35fc1fb85d2af4d105e0d74f940f50/node_modules/vite/dist/node/module-runner.js +0 -1265
  278. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.js +0 -9
  279. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/benchmark.CX_oY03V.js +0 -41
  280. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/evaluatedModules.Dg1zASAC.js +0 -19
  281. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/index.Chj8NDwU.js +0 -202
  282. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/index.DdgEv5B1.js +0 -46
  283. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/rpc.MzXet3jl.js +0 -119
  284. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/test.DNmyFkvJ.js +0 -3044
  285. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/utils.BX5Fg8C4.js +0 -59
  286. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/index.js +0 -28
  287. package/bundle/dist/testing/setup-mocks.js +0 -16
  288. package/bundle/src/testing/setup-mocks.ts +0 -44
  289. package/bundle/web-dist/client/assets/index-Bw2s88Ot.css +0 -1
  290. package/bundle/web-dist/client/assets/index-DZwzUfI-.js +0 -106
  291. package/bundle/web-dist/client/assets/logs-Cog79DU5.js +0 -1
  292. package/bundle/web-dist/client/assets/monit-2auznBys.js +0 -1
  293. package/bundle/web-dist/client/assets/plus-B62CuqT8.js +0 -1
  294. package/bundle/web-dist/client/assets/refresh-cw-NNcU0Cmq.js +0 -1
  295. package/bundle/web-dist/client/assets/request-model-CojtinqK.js +0 -1
  296. package/bundle/web-dist/client/assets/routes-B0lTeLK-.js +0 -5
  297. package/bundle/web-dist/client/assets/settings-D8ZxZGSJ.js +0 -1
  298. package/bundle/web-dist/client/assets/show-CFSERlnM.js +0 -2
  299. package/bundle/web-dist/client/assets/tokens-CZXUyI7O.js +0 -1
  300. package/bundle/web-dist/client/assets/use-oauth-login-flow-hboOs3wG.js +0 -1
  301. package/bundle/web-dist/client/assets/use-update-token-mutation-BQHS0byG.js +0 -1
  302. package/bundle/web-dist/client/assets/vendor-react-DH4kUfK2.js +0 -9
  303. package/bundle/web-dist/client/assets/vendor-tanstack-DJRQAbrY.js +0 -1
  304. package/bundle/web-dist/server/assets/logs-BMyR98rU.js +0 -509
  305. package/bundle/web-dist/server/assets/plus-BZ9I0VgC.js +0 -19
  306. package/bundle/web-dist/server/assets/refresh-cw-CztCFis-.js +0 -23
  307. package/bundle/web-dist/server/assets/settings-CBUZ47Xx.js +0 -461
  308. package/bundle/web-dist/server/assets/tokens-DxrBW512.js +0 -448
  309. package/bundle/web-dist/server/assets/use-oauth-login-flow-Gn8flMK5.js +0 -178
  310. package/dist/cli.d.ts +0 -10
  311. /package/bundle/web-dist/client/assets/{cost-DH2jZbrw.js → cost-DB3HbU7T.js} +0 -0
  312. /package/bundle/web-dist/client/assets/{preload-helper-ca-nBW7U.js → preload-helper-DWTEM3RW.js} +0 -0
  313. /package/bundle/web-dist/server/assets/{cost-eEHeTRT5.js → cost-BC9yzyA9.js} +0 -0
@@ -1,4 +1,6 @@
1
+ import { isJsonObject } from "./provider-types.js";
1
2
  import { SCHEMA_ARRAY_KEYWORDS, SCHEMA_MAP_KEYWORDS, SCHEMA_SINGLE_KEYWORDS, UNSUPPORTED_REFERENCE_KEYWORDS } from "./json-schema-keywords.js";
3
+ import { z } from "zod";
2
4
  //#region src/utils/providers/common/strictifier.ts
3
5
  /**
4
6
  * JSON Schema → OpenAI strict JSON Schema 변환.
@@ -17,7 +19,10 @@ var StrictifierError = class extends Error {
17
19
  this.name = "StrictifierError";
18
20
  }
19
21
  };
20
- function strictify(schema, options = {}) {
22
+ function strictify(input, options = {}) {
23
+ const serialized = JSON.parse(JSON.stringify(input));
24
+ if (!isSchemaObject(serialized)) throw new StrictifierError("schema must be an object", "$");
25
+ const schema = serialized;
21
26
  if (options.provider === "openai" || options.provider === "anthropic") assertNormalizationCompatibility(schema, options.provider);
22
27
  const result = strictifyNode(schema, "$", options.provider);
23
28
  if (options.provider === "openai" || options.provider === "anthropic") assertNormalizationCompatibility(result, options.provider);
@@ -74,7 +79,7 @@ function assertNormalizationCompatibility(schema, provider) {
74
79
  assertUnsupportedReferenceKeywords(current.node, current.path);
75
80
  collectSchemaReference(current, references);
76
81
  if (legacyTuple || prefixTuple) {
77
- if (provider === "anthropic" && (legacyTuple ? itemsValue : prefixItemsValue).length > 0) throw new StrictifierError("positional tuple schemas are not supported on Anthropic because Claude Code cannot preserve item positions", current.path);
82
+ if (provider === "anthropic" && (legacyTuple ? itemsValue : prefixTuple ? prefixItemsValue : []).length > 0) throw new StrictifierError("positional tuple schemas are not supported on Anthropic because Claude Code cannot preserve item positions", current.path);
78
83
  if (!current.normalizable) throw new StrictifierError("positional tuple schemas are not supported in this schema position", current.path);
79
84
  if (ownValue(current.node, "type") !== "array") throw new StrictifierError("positional tuple schemas must declare type \"array\"; express nullable tuples with anyOf", `${current.path}.type`);
80
85
  }
@@ -151,10 +156,11 @@ function assertUnsupportedReferenceKeywords(schema, path) {
151
156
  function collectSchemaReference(current, references) {
152
157
  if (!Object.hasOwn(current.node, "$ref")) return;
153
158
  const reference = current.node.$ref;
154
- if (typeof reference !== "string") throw new StrictifierError("$ref must be a string", `${current.path}.$ref`);
159
+ const referenceText = z.string().safeParse(reference);
160
+ if (!referenceText.success) throw new StrictifierError("$ref must be a string", `${current.path}.$ref`);
155
161
  if (!current.normalizable) throw new StrictifierError("schema references are not supported in this schema position", current.path);
156
162
  references.push({
157
- value: reference,
163
+ value: referenceText.data,
158
164
  path: `${current.path}.$ref`
159
165
  });
160
166
  }
@@ -212,20 +218,23 @@ function decodeJsonPointerToken(rawToken, path) {
212
218
  return token;
213
219
  }
214
220
  function strictifyNode(node, path, provider) {
215
- if (typeof node !== "object" || node === null) return node;
216
221
  let result = strictifySchemaMaps(provider === "openai" ? omitKeys(node, ["$schema"]) : node, path, provider);
217
222
  const type = ownValue(result, "type");
218
223
  if (type === "object" || Object.hasOwn(result, "properties")) result = strictifyObject(result, path, provider);
219
224
  if (type === "array" || Object.hasOwn(result, "items") || Object.hasOwn(result, "prefixItems")) result = strictifyArray(result, path, provider);
220
225
  return strictifySchemaArrays(result, path, provider);
221
226
  }
227
+ /** Boolean and other non-object subschemas pass through unchanged. */
228
+ function strictifySubschema(schema, path, provider) {
229
+ return isSchemaObject(schema) ? strictifyNode(schema, path, provider) : schema;
230
+ }
222
231
  const DEFINITION_MAP_KEYWORDS = ["$defs", "definitions"];
223
232
  function strictifySchemaMaps(node, path, provider) {
224
233
  const result = { ...node };
225
234
  for (const keyword of DEFINITION_MAP_KEYWORDS) {
226
235
  const schemas = ownValue(node, keyword);
227
236
  if (!isSchemaObject(schemas)) continue;
228
- result[keyword] = Object.fromEntries(Object.entries(schemas).map(([name, schema]) => [name, isSchemaObject(schema) ? strictifyNode(schema, `${path}.${keyword}.${name}`, provider) : schema]));
237
+ result[keyword] = Object.fromEntries(Object.entries(schemas).map(([name, schema]) => [name, schema === void 0 ? schema : strictifySubschema(schema, `${path}.${keyword}.${name}`, provider)]));
229
238
  }
230
239
  return result;
231
240
  }
@@ -239,7 +248,8 @@ function strictifySchemaArrays(node, path, provider) {
239
248
  for (const keyword of COMBINATOR_KEYWORDS) {
240
249
  const schemas = ownValue(node, keyword);
241
250
  if (!schemas) continue;
242
- result[keyword] = schemas.map((schema, index) => strictifyNode(schema, `${path}.${keyword}[${index}]`, provider));
251
+ if (!Array.isArray(schemas)) throw new StrictifierError(`${keyword} must be an array of schemas`, `${path}.${keyword}`);
252
+ result[keyword] = schemas.map((schema, index) => strictifySubschema(schema, `${path}.${keyword}[${index}]`, provider));
243
253
  }
244
254
  return result;
245
255
  }
@@ -249,12 +259,15 @@ function strictifyObject(node, path, provider) {
249
259
  ...node,
250
260
  additionalProperties: false
251
261
  };
252
- const existingRequired = new Set(ownValue(node, "required") ?? []);
262
+ if (!isSchemaObject(properties)) throw new StrictifierError("properties must be an object", `${path}.properties`);
263
+ const required = ownValue(node, "required");
264
+ const existingRequired = new Set(Array.isArray(required) ? required.flatMap((key) => z.string().safeParse(key).data ?? []) : []);
253
265
  const allKeys = Object.keys(properties);
254
- const strictProps = Object.fromEntries(allKeys.map((key) => {
266
+ const strictProps = Object.fromEntries(allKeys.flatMap((key) => {
255
267
  const prop = properties[key];
256
- const strictProp = strictifyNode(prop, `${path}.${key}`, provider);
257
- return [key, existingRequired.has(key) ? strictProp : makeNullable(strictProp)];
268
+ if (prop === void 0) return [];
269
+ const strictProp = strictifySubschema(prop, `${path}.${key}`, provider);
270
+ return [[key, existingRequired.has(key) ? strictProp : makeNullable(strictProp)]];
258
271
  }));
259
272
  return {
260
273
  ...node,
@@ -264,15 +277,17 @@ function strictifyObject(node, path, provider) {
264
277
  additionalProperties: false
265
278
  };
266
279
  }
267
- const UNREACHABLE_TUPLE_TAIL_SCHEMA = { type: "string" };
280
+ function unreachableTupleTailSchema() {
281
+ return { type: "string" };
282
+ }
268
283
  function strictifyArray(node, path, provider) {
269
284
  if ((provider === "openai" || provider === "anthropic") && (Array.isArray(ownValue(node, "items")) || Array.isArray(ownValue(node, "prefixItems")))) return normalizeTuple(node, path, provider);
270
285
  const result = { ...node };
271
286
  const items = ownValue(node, "items");
272
- if (Array.isArray(items)) result.items = items.map((schema, index) => strictifyNode(schema, `${path}.items[${index}]`, provider));
273
- else if (items !== void 0) result.items = strictifyNode(items, `${path}.items`, provider);
287
+ if (Array.isArray(items)) result.items = items.map((schema, index) => strictifySubschema(schema, `${path}.items[${index}]`, provider));
288
+ else if (items !== void 0) result.items = strictifySubschema(items, `${path}.items`, provider);
274
289
  const prefixItems = ownValue(node, "prefixItems");
275
- if (Array.isArray(prefixItems)) result.prefixItems = prefixItems.map((schema, index) => strictifyNode(schema, `${path}.prefixItems[${index}]`, provider));
290
+ if (Array.isArray(prefixItems)) result.prefixItems = prefixItems.map((schema, index) => strictifySubschema(schema, `${path}.prefixItems[${index}]`, provider));
276
291
  return result;
277
292
  }
278
293
  function normalizeTuple(node, path, provider) {
@@ -282,7 +297,7 @@ function normalizeTuple(node, path, provider) {
282
297
  const prefixTuple = Array.isArray(prefixItems);
283
298
  if (legacyTuple && prefixTuple) throw new StrictifierError("items and prefixItems tuple forms cannot be combined", path);
284
299
  if (prefixTuple && Object.hasOwn(node, "additionalItems")) throw new StrictifierError("additionalItems cannot be combined with prefixItems", path);
285
- const rawTuple = legacyTuple ? items : prefixItems;
300
+ const rawTuple = legacyTuple ? items : prefixTuple ? prefixItems : [];
286
301
  const tuplePath = legacyTuple ? `${path}.items` : `${path}.prefixItems`;
287
302
  const tuple = rawTuple.map((schema, index) => {
288
303
  if (!isSchemaObject(schema)) throw new StrictifierError("boolean and non-object tuple member schemas are not supported", `${tuplePath}[${index}]`);
@@ -298,18 +313,18 @@ function normalizeTuple(node, path, provider) {
298
313
  if (tail !== void 0 && !hasProviderSchemaEntryPoint(tail)) throw new StrictifierError("an unrestricted tuple rest is not supported", path);
299
314
  const tailMode = tail !== void 0 ? "typed" : rawTail === false ? "closed" : "implicit";
300
315
  const bounds = normalizeTupleBounds(node, tuple.length, tailMode, path);
301
- return {
302
- ...omitKeys(node, [
303
- "items",
304
- "prefixItems",
305
- "additionalItems",
306
- "minItems",
307
- "maxItems"
308
- ]),
309
- ...tuple.length > 0 ? { prefixItems: tuple } : {},
310
- items: tail ?? UNREACHABLE_TUPLE_TAIL_SCHEMA,
311
- ...bounds
312
- };
316
+ const result = omitKeys(node, [
317
+ "items",
318
+ "prefixItems",
319
+ "additionalItems",
320
+ "minItems",
321
+ "maxItems"
322
+ ]);
323
+ if (tuple.length > 0) result.prefixItems = tuple;
324
+ result.items = tail ?? unreachableTupleTailSchema();
325
+ result.minItems = bounds.minItems;
326
+ if (bounds.maxItems !== void 0) result.maxItems = bounds.maxItems;
327
+ return result;
313
328
  }
314
329
  function normalizeTupleBounds(node, tupleLength, tailMode, path) {
315
330
  const callerMinItems = integerBound(ownValue(node, "minItems"), "minItems", path);
@@ -318,18 +333,19 @@ function normalizeTupleBounds(node, tupleLength, tailMode, path) {
318
333
  const minItems = callerMinItems ?? (callerMaxItems === void 0 ? tupleLength : 0);
319
334
  const maxItems = tailMode === "typed" ? callerMaxItems : Math.min(callerMaxItems ?? tupleLength, tupleLength);
320
335
  if (maxItems !== void 0 && minItems > maxItems) throw new StrictifierError("tuple minItems cannot exceed maxItems", path);
321
- return {
322
- minItems,
323
- ...maxItems !== void 0 ? { maxItems } : {}
324
- };
336
+ const bounds = { minItems };
337
+ if (maxItems !== void 0) bounds.maxItems = maxItems;
338
+ return bounds;
325
339
  }
340
+ const nonNegativeSafeInteger = z.number().refine((value) => Number.isSafeInteger(value) && value >= 0);
326
341
  function integerBound(value, keyword, path) {
327
342
  if (value === void 0) return void 0;
328
- if (!Number.isSafeInteger(value) || value < 0) throw new StrictifierError(`${keyword} must be a non-negative safe integer`, path);
329
- return value;
343
+ const bound = nonNegativeSafeInteger.safeParse(value);
344
+ if (!bound.success) throw new StrictifierError(`${keyword} must be a non-negative safe integer`, path);
345
+ return bound.data;
330
346
  }
331
347
  function isSchemaObject(value) {
332
- return typeof value === "object" && value !== null && !Array.isArray(value);
348
+ return isJsonObject(value);
333
349
  }
334
350
  function ownValue(schema, keyword) {
335
351
  return Object.hasOwn(schema, keyword) ? schema[keyword] : void 0;
@@ -349,23 +365,26 @@ function omitKeys(node, keys) {
349
365
  const omitted = new Set(keys);
350
366
  return Object.fromEntries(Object.entries(node).filter(([key]) => !omitted.has(key)));
351
367
  }
368
+ function hasNullVariant(variants) {
369
+ return variants.some((variant) => isSchemaObject(variant) && ownValue(variant, "type") === "null");
370
+ }
352
371
  function makeNullable(schema) {
372
+ const nullSchema = { type: "null" };
373
+ if (!isSchemaObject(schema)) return { anyOf: [schema, nullSchema] };
353
374
  if (ownValue(schema, "type") === "null") return schema;
354
375
  const anyOf = ownValue(schema, "anyOf");
355
376
  if (anyOf) {
356
- const variants = anyOf;
357
- if (variants.some((v) => ownValue(v, "type") === "null")) return schema;
358
- return { anyOf: [...variants, { type: "null" }] };
377
+ if (!Array.isArray(anyOf)) throw new StrictifierError("anyOf must be an array of schemas", "$");
378
+ return hasNullVariant(anyOf) ? schema : { anyOf: [...anyOf, nullSchema] };
359
379
  }
360
380
  const oneOf = ownValue(schema, "oneOf");
361
381
  if (oneOf) {
362
- const variants = oneOf;
363
- if (variants.some((v) => ownValue(v, "type") === "null")) return schema;
364
- return { oneOf: [...variants, { type: "null" }] };
382
+ if (!Array.isArray(oneOf)) throw new StrictifierError("oneOf must be an array of schemas", "$");
383
+ return hasNullVariant(oneOf) ? schema : { oneOf: [...oneOf, nullSchema] };
365
384
  }
366
- return { anyOf: [schema, { type: "null" }] };
385
+ return { anyOf: [schema, nullSchema] };
367
386
  }
368
387
  //#endregion
369
388
  export { StrictifierError, strictify };
370
389
 
371
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaWN0aWZpZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vc3RyaWN0aWZpZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBKU09OIFNjaGVtYSDihpIgT3BlbkFJIHN0cmljdCBKU09OIFNjaGVtYSDrs4DtmZguXG4gKlxuICogT3BlbkFJIFJlc3BvbnNlcyBBUEkgc3RyaWN0IOuqqOuTnCDsmpTqtazsgqztla06XG4gKiAgLSDrqqjrk6Agb2JqZWN0IOyXkCBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2VcbiAqICAtIOuqqOuToCBvYmplY3QgcHJvcGVydGllcyDrpbwgcmVxdWlyZWQg7JeQIO2PrO2VqFxuICogIC0gb3B0aW9uYWwg7ZWE65OcIOKGkiBhbnlPZiBbb3JpZ2luYWwsIHsgdHlwZTogJ251bGwnIH1dIOuhnCByZXF1aXJlZCDsnKDsp4BcbiAqICAtIHJlY3Vyc2l2ZSDsspjrpqwgKG5lc3RlZCBvYmplY3RzLCBhcnJheXMsIGFsbE9mL2FueU9mL29uZU9mKVxuICovXG5cbmltcG9ydCB7XG4gIFNDSEVNQV9BUlJBWV9LRVlXT1JEUyxcbiAgU0NIRU1BX01BUF9LRVlXT1JEUyxcbiAgU0NIRU1BX1NJTkdMRV9LRVlXT1JEUyxcbiAgVU5TVVBQT1JURURfUkVGRVJFTkNFX0tFWVdPUkRTLFxufSBmcm9tIFwiLi9qc29uLXNjaGVtYS1rZXl3b3Jkc1wiO1xuXG5leHBvcnQgdHlwZSBKc29uU2NoZW1hID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RyaWN0aWZpZXJPcHRpb25zIHtcbiAgcHJvdmlkZXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBTdHJpY3RpZmllckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIHBhdGg6IHN0cmluZyxcbiAgKSB7XG4gICAgc3VwZXIoYHN0cmljdGlmaWVyOiAke21lc3NhZ2V9IChhdCAke3BhdGh9KWApO1xuICAgIHRoaXMubmFtZSA9IFwiU3RyaWN0aWZpZXJFcnJvclwiO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpY3RpZnkoc2NoZW1hOiBKc29uU2NoZW1hLCBvcHRpb25zOiBTdHJpY3RpZmllck9wdGlvbnMgPSB7fSk6IEpzb25TY2hlbWEge1xuICBpZiAob3B0aW9ucy5wcm92aWRlciA9PT0gXCJvcGVuYWlcIiB8fCBvcHRpb25zLnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKSB7XG4gICAgYXNzZXJ0Tm9ybWFsaXphdGlvbkNvbXBhdGliaWxpdHkoc2NoZW1hLCBvcHRpb25zLnByb3ZpZGVyKTtcbiAgfVxuICBjb25zdCByZXN1bHQgPSBzdHJpY3RpZnlOb2RlKHNjaGVtYSwgXCIkXCIsIG9wdGlvbnMucHJvdmlkZXIpO1xuICBpZiAob3B0aW9ucy5wcm92aWRlciA9PT0gXCJvcGVuYWlcIiB8fCBvcHRpb25zLnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKSB7XG4gICAgYXNzZXJ0Tm9ybWFsaXphdGlvbkNvbXBhdGliaWxpdHkocmVzdWx0LCBvcHRpb25zLnByb3ZpZGVyKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIOychOy5mCDrqqnroZ3snYAganNvbi1zY2hlbWEta2V5d29yZHMg6rCAIOyGjOycoO2VmOqzoCwg7Jes6riw7ISc64qUIOqwgSDsnITsuZjsnZggYG5vcm1hbGl6YWJsZWAg7Jes67aA66eMIOyWueuKlOuLpC5cbiAqIG5vcm1hbGl6YWJsZT10cnVlIOuKlCBzdHJpY3RpZnlOb2RlIOqwgCDqt7gg7JyE7LmY66W8IOyLpOygnOuhnCDsnqzsnpHshLHtlZzri6TripQg65y77J2064ukLiBgbm90YC9gaWZgIOyymOufvFxuICog7J6s7J6R7ISx7ZWY66m0IGNhbGxlciDsnZjrr7jqsIAg67CU64CM64qUIOychOy5mOuKlCBmYWxzZSDsnbTqs6AsIOq3uCDslYTrnpggdHVwbGUvYCRyZWZgIOuKlCDsoJXqt5ztmZQg64yA7IugIOqxsOu2gOuQnOuLpC5cbiAqXG4gKiBgaXRlbXNgL2BhZGRpdGlvbmFsSXRlbXNgIOuKlCB0dXBsZSDtjJDsoJXqs7wg7ZWo6ruYIOuLpOukhOyVvCDtlbTshJwg7JWE656YIOyInO2ajOyXkOyEnCDqsJzrs4Qg7LKY66as7ZWc64ukLlxuICovXG5jb25zdCBOT05fTk9STUFMSVpBQkxFX1BPU0lUSU9OUyA9IG5ldyBTZXQ8c3RyaW5nPihbXG4gIFwiZGVwZW5kZW50U2NoZW1hc1wiLFxuICBcInBhdHRlcm5Qcm9wZXJ0aWVzXCIsXG4gIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIixcbiAgXCJjb250YWluc1wiLFxuICBcImNvbnRlbnRTY2hlbWFcIixcbiAgXCJlbHNlXCIsXG4gIFwiaWZcIixcbiAgXCJub3RcIixcbiAgXCJwcm9wZXJ0eU5hbWVzXCIsXG4gIFwidGhlblwiLFxuICBcInVuZXZhbHVhdGVkSXRlbXNcIixcbiAgXCJ1bmV2YWx1YXRlZFByb3BlcnRpZXNcIixcbl0pO1xuXG5mdW5jdGlvbiBwb3NpdGlvbkVudHJpZXMoa2V5d29yZHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogUmVhZG9ubHlBcnJheTxyZWFkb25seSBbc3RyaW5nLCBib29sZWFuXT4ge1xuICByZXR1cm4ga2V5d29yZHMubWFwKChrZXl3b3JkKSA9PiBba2V5d29yZCwgIU5PTl9OT1JNQUxJWkFCTEVfUE9TSVRJT05TLmhhcyhrZXl3b3JkKV0gYXMgY29uc3QpO1xufVxuXG5jb25zdCBTQ0hFTUFfU0NBTl9NQVBfS0VZV09SRFMgPSBwb3NpdGlvbkVudHJpZXMoU0NIRU1BX01BUF9LRVlXT1JEUyk7XG5jb25zdCBTQ0hFTUFfU0NBTl9BUlJBWV9LRVlXT1JEUyA9IHBvc2l0aW9uRW50cmllcyhTQ0hFTUFfQVJSQVlfS0VZV09SRFMpO1xuLy8gaXRlbXMvYWRkaXRpb25hbEl0ZW1zIOuKlCB0dXBsZSDrtoTquLDsl5DshJwg7KeB7KCRIOuLpOujqOuvgOuhnCDri6jsnbwg7JyE7LmYIOyKpOy6lOyXkOyEnCDsoJzsmbjtlZzri6QuXG5jb25zdCBTQ0hFTUFfU0NBTl9TSU5HTEVfS0VZV09SRFMgPSBwb3NpdGlvbkVudHJpZXMoXG4gIFNDSEVNQV9TSU5HTEVfS0VZV09SRFMuZmlsdGVyKChrZXl3b3JkKSA9PiBrZXl3b3JkICE9PSBcIml0ZW1zXCIgJiYga2V5d29yZCAhPT0gXCJhZGRpdGlvbmFsSXRlbXNcIiksXG4pO1xuXG4vKipcbiAqIEluc3BlY3QgZXZlcnkgSlNPTiBTY2hlbWEtYmVhcmluZyBwb3NpdGlvbiB3aXRob3V0IHJld3JpdGluZyBpdC5cbiAqXG4gKiBQb3NpdGl2ZSBwb3NpdGlvbnMgYWxyZWFkeSB0cmF2ZXJzZWQgYnkgc3RyaWN0aWZ5Tm9kZSBtYXkgbm9ybWFsaXplIE9wZW5BSSB0dXBsZXMuIFBvc2l0aW9uc1xuICogc3VjaCBhcyBgbm90YCBhbmQgYGlmYCBjYW5ub3QgYmUgdGlnaHRlbmVkIHdpdGhvdXQgY2hhbmdpbmcgY2FsbGVyIHNlbWFudGljcywgc28gcG9zaXRpb25hbFxuICogdHVwbGVzIHRoZXJlIGZhaWwgZXhwbGljaXRseSBpbnN0ZWFkIG9mIGxlYWtpbmcgYW4gdW5zdXBwb3J0ZWQgcHJvdmlkZXIgc2NoZW1hLiBSZWZlcmVuY2VzXG4gKiBmcm9tIHRob3NlIHBvc2l0aW9ucyBhbHNvIGZhaWwgYmVjYXVzZSB0aGVpciBkZWZpbml0aW9ucyBhcmUgbm9ybWFsaXplZCBnbG9iYWxseS5cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0Tm9ybWFsaXphdGlvbkNvbXBhdGliaWxpdHkoXG4gIHNjaGVtYTogSnNvblNjaGVtYSxcbiAgcHJvdmlkZXI6IFwib3BlbmFpXCIgfCBcImFudGhyb3BpY1wiLFxuKTogdm9pZCB7XG4gIGNvbnN0IHJlZmVyZW5jZXM6IEFycmF5PHsgdmFsdWU6IHN0cmluZzsgcGF0aDogc3RyaW5nIH0+ID0gW107XG4gIGNvbnN0IHN0YWNrOiBBcnJheTx7IG5vZGU6IEpzb25TY2hlbWE7IHBhdGg6IHN0cmluZzsgbm9ybWFsaXphYmxlOiBib29sZWFuIH0+ID0gW1xuICAgIHsgbm9kZTogc2NoZW1hLCBwYXRoOiBcIiRcIiwgbm9ybWFsaXphYmxlOiB0cnVlIH0sXG4gIF07XG5cbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBjdXJyZW50ID0gc3RhY2sucG9wKCkhO1xuICAgIGNvbnN0IGl0ZW1zVmFsdWUgPSBvd25WYWx1ZShjdXJyZW50Lm5vZGUsIFwiaXRlbXNcIik7XG4gICAgY29uc3QgcHJlZml4SXRlbXNWYWx1ZSA9IG93blZhbHVlKGN1cnJlbnQubm9kZSwgXCJwcmVmaXhJdGVtc1wiKTtcbiAgICBjb25zdCBsZWdhY3lUdXBsZSA9IEFycmF5LmlzQXJyYXkoaXRlbXNWYWx1ZSk7XG4gICAgY29uc3QgcHJlZml4VHVwbGUgPSBBcnJheS5pc0FycmF5KHByZWZpeEl0ZW1zVmFsdWUpO1xuXG4gICAgYXNzZXJ0VW5zdXBwb3J0ZWRSZWZlcmVuY2VLZXl3b3JkcyhjdXJyZW50Lm5vZGUsIGN1cnJlbnQucGF0aCk7XG4gICAgY29sbGVjdFNjaGVtYVJlZmVyZW5jZShjdXJyZW50LCByZWZlcmVuY2VzKTtcblxuICAgIGlmIChsZWdhY3lUdXBsZSB8fCBwcmVmaXhUdXBsZSkge1xuICAgICAgY29uc3QgdHVwbGUgPSAobGVnYWN5VHVwbGUgPyBpdGVtc1ZhbHVlIDogcHJlZml4SXRlbXNWYWx1ZSkgYXMgdW5rbm93bltdO1xuICAgICAgaWYgKHByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiICYmIHR1cGxlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXG4gICAgICAgICAgXCJwb3NpdGlvbmFsIHR1cGxlIHNjaGVtYXMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gQW50aHJvcGljIGJlY2F1c2UgQ2xhdWRlIENvZGUgY2Fubm90IHByZXNlcnZlIGl0ZW0gcG9zaXRpb25zXCIsXG4gICAgICAgICAgY3VycmVudC5wYXRoLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKCFjdXJyZW50Lm5vcm1hbGl6YWJsZSkge1xuICAgICAgICB0aHJvdyBuZXcgU3RyaWN0aWZpZXJFcnJvcihcbiAgICAgICAgICBcInBvc2l0aW9uYWwgdHVwbGUgc2NoZW1hcyBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIHNjaGVtYSBwb3NpdGlvblwiLFxuICAgICAgICAgIGN1cnJlbnQucGF0aCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChvd25WYWx1ZShjdXJyZW50Lm5vZGUsIFwidHlwZVwiKSAhPT0gXCJhcnJheVwiKSB7XG4gICAgICAgIHRocm93IG5ldyBTdHJpY3RpZmllckVycm9yKFxuICAgICAgICAgICdwb3NpdGlvbmFsIHR1cGxlIHNjaGVtYXMgbXVzdCBkZWNsYXJlIHR5cGUgXCJhcnJheVwiOyBleHByZXNzIG51bGxhYmxlIHR1cGxlcyB3aXRoIGFueU9mJyxcbiAgICAgICAgICBgJHtjdXJyZW50LnBhdGh9LnR5cGVgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2tleXdvcmQsIGtleXdvcmROb3JtYWxpemFibGVdIG9mIFNDSEVNQV9TQ0FOX01BUF9LRVlXT1JEUykge1xuICAgICAgY29uc3Qgc2NoZW1hcyA9IG93blZhbHVlKGN1cnJlbnQubm9kZSwga2V5d29yZCk7XG4gICAgICBpZiAoIWlzU2NoZW1hT2JqZWN0KHNjaGVtYXMpKSBjb250aW51ZTtcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyhzY2hlbWFzKSkge1xuICAgICAgICBpZiAoIWlzU2NoZW1hT2JqZWN0KGNoaWxkKSkgY29udGludWU7XG4gICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgIG5vZGU6IGNoaWxkLFxuICAgICAgICAgIHBhdGg6IGAke2N1cnJlbnQucGF0aH0uJHtrZXl3b3JkfS4ke25hbWV9YCxcbiAgICAgICAgICBub3JtYWxpemFibGU6IGN1cnJlbnQubm9ybWFsaXphYmxlICYmIGtleXdvcmROb3JtYWxpemFibGUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IG93blZhbHVlKGN1cnJlbnQubm9kZSwgXCJkZXBlbmRlbmNpZXNcIik7XG4gICAgaWYgKGlzU2NoZW1hT2JqZWN0KGRlcGVuZGVuY2llcykpIHtcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyhkZXBlbmRlbmNpZXMpKSB7XG4gICAgICAgIGlmICghaXNTY2hlbWFPYmplY3QoY2hpbGQpKSBjb250aW51ZTtcbiAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgbm9kZTogY2hpbGQsXG4gICAgICAgICAgcGF0aDogYCR7Y3VycmVudC5wYXRofS5kZXBlbmRlbmNpZXMuJHtuYW1lfWAsXG4gICAgICAgICAgbm9ybWFsaXphYmxlOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBba2V5d29yZCwga2V5d29yZE5vcm1hbGl6YWJsZV0gb2YgU0NIRU1BX1NDQU5fQVJSQVlfS0VZV09SRFMpIHtcbiAgICAgIGNvbnN0IHNjaGVtYXMgPSBvd25WYWx1ZShjdXJyZW50Lm5vZGUsIGtleXdvcmQpO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHNjaGVtYXMpKSBjb250aW51ZTtcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzY2hlbWFzLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICBjb25zdCBjaGlsZCA9IHNjaGVtYXNbaW5kZXhdO1xuICAgICAgICBpZiAoIWlzU2NoZW1hT2JqZWN0KGNoaWxkKSkgY29udGludWU7XG4gICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgIG5vZGU6IGNoaWxkLFxuICAgICAgICAgIHBhdGg6IGAke2N1cnJlbnQucGF0aH0uJHtrZXl3b3JkfVske2luZGV4fV1gLFxuICAgICAgICAgIG5vcm1hbGl6YWJsZTogY3VycmVudC5ub3JtYWxpemFibGUgJiYga2V5d29yZE5vcm1hbGl6YWJsZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaXRlbXMgPSBvd25WYWx1ZShjdXJyZW50Lm5vZGUsIFwiaXRlbXNcIik7XG4gICAgaWYgKGlzU2NoZW1hT2JqZWN0KGl0ZW1zKSkge1xuICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgIG5vZGU6IGl0ZW1zLFxuICAgICAgICBwYXRoOiBgJHtjdXJyZW50LnBhdGh9Lml0ZW1zYCxcbiAgICAgICAgbm9ybWFsaXphYmxlOiBjdXJyZW50Lm5vcm1hbGl6YWJsZSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpdGVtcykpIHtcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBpdGVtcy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBpdGVtc1tpbmRleF07XG4gICAgICAgIGlmICghaXNTY2hlbWFPYmplY3QoY2hpbGQpKSBjb250aW51ZTtcbiAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgbm9kZTogY2hpbGQsXG4gICAgICAgICAgcGF0aDogYCR7Y3VycmVudC5wYXRofS5pdGVtc1ske2luZGV4fV1gLFxuICAgICAgICAgIG5vcm1hbGl6YWJsZTogY3VycmVudC5ub3JtYWxpemFibGUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGFkZGl0aW9uYWxJdGVtcyA9IG93blZhbHVlKGN1cnJlbnQubm9kZSwgXCJhZGRpdGlvbmFsSXRlbXNcIik7XG4gICAgaWYgKGlzU2NoZW1hT2JqZWN0KGFkZGl0aW9uYWxJdGVtcykpIHtcbiAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICBub2RlOiBhZGRpdGlvbmFsSXRlbXMsXG4gICAgICAgIHBhdGg6IGAke2N1cnJlbnQucGF0aH0uYWRkaXRpb25hbEl0ZW1zYCxcbiAgICAgICAgbm9ybWFsaXphYmxlOiBjdXJyZW50Lm5vcm1hbGl6YWJsZSAmJiBsZWdhY3lUdXBsZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2tleXdvcmQsIGtleXdvcmROb3JtYWxpemFibGVdIG9mIFNDSEVNQV9TQ0FOX1NJTkdMRV9LRVlXT1JEUykge1xuICAgICAgY29uc3QgY2hpbGQgPSBvd25WYWx1ZShjdXJyZW50Lm5vZGUsIGtleXdvcmQpO1xuICAgICAgaWYgKCFpc1NjaGVtYU9iamVjdChjaGlsZCkpIGNvbnRpbnVlO1xuICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgIG5vZGU6IGNoaWxkLFxuICAgICAgICBwYXRoOiBgJHtjdXJyZW50LnBhdGh9LiR7a2V5d29yZH1gLFxuICAgICAgICBub3JtYWxpemFibGU6IGN1cnJlbnQubm9ybWFsaXphYmxlICYmIGtleXdvcmROb3JtYWxpemFibGUsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3NlcnRSZWZlcmVuY2VUYXJnZXRzKHNjaGVtYSwgcmVmZXJlbmNlcyk7XG59XG5cbmZ1bmN0aW9uIGFzc2VydFVuc3VwcG9ydGVkUmVmZXJlbmNlS2V5d29yZHMoc2NoZW1hOiBKc29uU2NoZW1hLCBwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBrZXl3b3JkIG9mIFVOU1VQUE9SVEVEX1JFRkVSRU5DRV9LRVlXT1JEUykge1xuICAgIGlmIChPYmplY3QuaGFzT3duKHNjaGVtYSwga2V5d29yZCkpIHtcbiAgICAgIHRocm93IG5ldyBTdHJpY3RpZmllckVycm9yKGAke2tleXdvcmR9IGlzIG5vdCBzdXBwb3J0ZWRgLCBgJHtwYXRofS4ke2tleXdvcmR9YCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RTY2hlbWFSZWZlcmVuY2UoXG4gIGN1cnJlbnQ6IHsgbm9kZTogSnNvblNjaGVtYTsgcGF0aDogc3RyaW5nOyBub3JtYWxpemFibGU6IGJvb2xlYW4gfSxcbiAgcmVmZXJlbmNlczogQXJyYXk8eyB2YWx1ZTogc3RyaW5nOyBwYXRoOiBzdHJpbmcgfT4sXG4pOiB2b2lkIHtcbiAgaWYgKCFPYmplY3QuaGFzT3duKGN1cnJlbnQubm9kZSwgXCIkcmVmXCIpKSByZXR1cm47XG5cbiAgY29uc3QgcmVmZXJlbmNlID0gY3VycmVudC5ub2RlLiRyZWY7XG4gIGlmICh0eXBlb2YgcmVmZXJlbmNlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXCIkcmVmIG11c3QgYmUgYSBzdHJpbmdcIiwgYCR7Y3VycmVudC5wYXRofS4kcmVmYCk7XG4gIH1cbiAgaWYgKCFjdXJyZW50Lm5vcm1hbGl6YWJsZSkge1xuICAgIHRocm93IG5ldyBTdHJpY3RpZmllckVycm9yKFxuICAgICAgXCJzY2hlbWEgcmVmZXJlbmNlcyBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIHNjaGVtYSBwb3NpdGlvblwiLFxuICAgICAgY3VycmVudC5wYXRoLFxuICAgICk7XG4gIH1cblxuICByZWZlcmVuY2VzLnB1c2goeyB2YWx1ZTogcmVmZXJlbmNlLCBwYXRoOiBgJHtjdXJyZW50LnBhdGh9LiRyZWZgIH0pO1xufVxuXG5mdW5jdGlvbiBhc3NlcnRSZWZlcmVuY2VUYXJnZXRzKFxuICByb290OiBKc29uU2NoZW1hLFxuICByZWZlcmVuY2VzOiBBcnJheTx7IHZhbHVlOiBzdHJpbmc7IHBhdGg6IHN0cmluZyB9Pixcbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IHJlZmVyZW5jZSBvZiByZWZlcmVuY2VzKSB7XG4gICAgY29uc3QgdG9rZW5zID0gcGFyc2VMb2NhbEpzb25Qb2ludGVyKHJlZmVyZW5jZS52YWx1ZSwgcmVmZXJlbmNlLnBhdGgpO1xuICAgIGlmICghaXNEZWZpbml0aW9uUm9vdFBvaW50ZXIodG9rZW5zKSkge1xuICAgICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXG4gICAgICAgIFwiJHJlZiB0YXJnZXQgbXVzdCBiZSB0aGUgZG9jdW1lbnQgcm9vdCBvciBhIGRlZmluaXRpb24gcm9vdFwiLFxuICAgICAgICByZWZlcmVuY2UucGF0aCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJlc29sdmVEZWZpbml0aW9uUm9vdChyb290LCB0b2tlbnMsIHJlZmVyZW5jZS5wYXRoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0RlZmluaXRpb25Sb290UG9pbnRlcih0b2tlbnM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIGlmICh0b2tlbnMubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHRva2Vucy5sZW5ndGggJSAyICE9PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRva2Vucy5sZW5ndGg7IGluZGV4ICs9IDIpIHtcbiAgICBpZiAodG9rZW5zW2luZGV4XSAhPT0gXCIkZGVmc1wiICYmIHRva2Vuc1tpbmRleF0gIT09IFwiZGVmaW5pdGlvbnNcIikgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBwYXJzZUxvY2FsSnNvblBvaW50ZXIocmVmZXJlbmNlOiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgaWYgKHJlZmVyZW5jZSA9PT0gXCIjXCIpIHJldHVybiBbXTtcbiAgaWYgKCFyZWZlcmVuY2Uuc3RhcnRzV2l0aChcIiMvXCIpKSB7XG4gICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXG4gICAgICBcIm9ubHkgbG9jYWwgcm9vdC1yZWxhdGl2ZSBKU09OIFBvaW50ZXIgJHJlZiB2YWx1ZXMgYXJlIHN1cHBvcnRlZFwiLFxuICAgICAgcGF0aCxcbiAgICApO1xuICB9XG5cbiAgbGV0IGZyYWdtZW50OiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgZnJhZ21lbnQgPSBkZWNvZGVVUklDb21wb25lbnQocmVmZXJlbmNlLnNsaWNlKDEpKTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXCIkcmVmIGNvbnRhaW5zIGludmFsaWQgcGVyY2VudCBlbmNvZGluZ1wiLCBwYXRoKTtcbiAgfVxuICBpZiAoIWZyYWdtZW50LnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXG4gICAgICBcIm9ubHkgbG9jYWwgcm9vdC1yZWxhdGl2ZSBKU09OIFBvaW50ZXIgJHJlZiB2YWx1ZXMgYXJlIHN1cHBvcnRlZFwiLFxuICAgICAgcGF0aCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGZyYWdtZW50XG4gICAgLnNsaWNlKDEpXG4gICAgLnNwbGl0KFwiL1wiKVxuICAgIC5tYXAoKHRva2VuKSA9PiBkZWNvZGVKc29uUG9pbnRlclRva2VuKHRva2VuLCBwYXRoKSk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVEZWZpbml0aW9uUm9vdChyb290OiBKc29uU2NoZW1hLCB0b2tlbnM6IHN0cmluZ1tdLCBwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgbGV0IGN1cnJlbnQgPSByb290O1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdG9rZW5zLmxlbmd0aDsgaW5kZXggKz0gMikge1xuICAgIGNvbnN0IGtleXdvcmQgPSB0b2tlbnNbaW5kZXhdITtcbiAgICBjb25zdCBuYW1lID0gdG9rZW5zW2luZGV4ICsgMV0hO1xuICAgIGNvbnN0IGRlZmluaXRpb25zID0gb3duVmFsdWUoY3VycmVudCwga2V5d29yZCk7XG4gICAgaWYgKCFpc1NjaGVtYU9iamVjdChkZWZpbml0aW9ucykgfHwgIU9iamVjdC5oYXNPd24oZGVmaW5pdGlvbnMsIG5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgU3RyaWN0aWZpZXJFcnJvcihcIiRyZWYgZG9lcyBub3QgcmVzb2x2ZSBpbnNpZGUgdGhlIGNhbGxlciBzY2hlbWFcIiwgcGF0aCk7XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IGRlZmluaXRpb25zW25hbWVdO1xuICAgIGlmICghaXNTY2hlbWFPYmplY3QodGFyZ2V0KSkge1xuICAgICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXCIkcmVmIHRhcmdldCBtdXN0IGJlIGFuIG9iamVjdCBzY2hlbWFcIiwgcGF0aCk7XG4gICAgfVxuICAgIGN1cnJlbnQgPSB0YXJnZXQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVjb2RlSnNvblBvaW50ZXJUb2tlbihyYXdUb2tlbjogc3RyaW5nLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgdG9rZW4gPSBcIlwiO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcmF3VG9rZW4ubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgY29uc3QgY2hhcmFjdGVyID0gcmF3VG9rZW5baW5kZXhdITtcbiAgICBpZiAoY2hhcmFjdGVyICE9PSBcIn5cIikge1xuICAgICAgdG9rZW4gKz0gY2hhcmFjdGVyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgZXNjYXBlZCA9IHJhd1Rva2VuW2luZGV4ICsgMV07XG4gICAgaWYgKGVzY2FwZWQgPT09IFwiMFwiKSB7XG4gICAgICB0b2tlbiArPSBcIn5cIjtcbiAgICB9IGVsc2UgaWYgKGVzY2FwZWQgPT09IFwiMVwiKSB7XG4gICAgICB0b2tlbiArPSBcIi9cIjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXCIkcmVmIGNvbnRhaW5zIGFuIGludmFsaWQgSlNPTiBQb2ludGVyIGVzY2FwZVwiLCBwYXRoKTtcbiAgICB9XG4gICAgaW5kZXggKz0gMTtcbiAgfVxuICByZXR1cm4gdG9rZW47XG59XG5cbmZ1bmN0aW9uIHN0cmljdGlmeU5vZGUobm9kZTogSnNvblNjaGVtYSwgcGF0aDogc3RyaW5nLCBwcm92aWRlcj86IHN0cmluZyk6IEpzb25TY2hlbWEge1xuICBpZiAodHlwZW9mIG5vZGUgIT09IFwib2JqZWN0XCIgfHwgbm9kZSA9PT0gbnVsbCkgcmV0dXJuIG5vZGU7XG5cbiAgY29uc3QgZGlhbGVjdE5ldXRyYWxOb2RlID0gcHJvdmlkZXIgPT09IFwib3BlbmFpXCIgPyBvbWl0S2V5cyhub2RlLCBbXCIkc2NoZW1hXCJdKSA6IG5vZGU7XG4gIGxldCByZXN1bHQgPSBzdHJpY3RpZnlTY2hlbWFNYXBzKGRpYWxlY3ROZXV0cmFsTm9kZSwgcGF0aCwgcHJvdmlkZXIpO1xuICBjb25zdCB0eXBlID0gb3duVmFsdWUocmVzdWx0LCBcInR5cGVcIikgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGlmICh0eXBlID09PSBcIm9iamVjdFwiIHx8IE9iamVjdC5oYXNPd24ocmVzdWx0LCBcInByb3BlcnRpZXNcIikpIHtcbiAgICByZXN1bHQgPSBzdHJpY3RpZnlPYmplY3QocmVzdWx0LCBwYXRoLCBwcm92aWRlcik7XG4gIH1cblxuICBpZiAodHlwZSA9PT0gXCJhcnJheVwiIHx8IE9iamVjdC5oYXNPd24ocmVzdWx0LCBcIml0ZW1zXCIpIHx8IE9iamVjdC5oYXNPd24ocmVzdWx0LCBcInByZWZpeEl0ZW1zXCIpKSB7XG4gICAgcmVzdWx0ID0gc3RyaWN0aWZ5QXJyYXkocmVzdWx0LCBwYXRoLCBwcm92aWRlcik7XG4gIH1cblxuICByZXR1cm4gc3RyaWN0aWZ5U2NoZW1hQXJyYXlzKHJlc3VsdCwgcGF0aCwgcHJvdmlkZXIpO1xufVxuXG4vLyDsnqzsnpHshLEg7Yyo7Iqk64qUIOygleydmCDrp7Xrp4wg7J6s6reA7ZWc64ukLiBwcm9wZXJ0aWVzIOuKlCBzdHJpY3RpZnlPYmplY3Qg6rCAIOuzhOuPhOuhnCDsspjrpqztlZjrr4DroZxcbi8vIOqzteycoCDsnITsuZgg66qp66GdKFNDSEVNQV9NQVBfS0VZV09SRFMp6rO8IOydmOuPhOyggeycvOuhnCDrspTsnITqsIAg64uk66W064ukLlxuY29uc3QgREVGSU5JVElPTl9NQVBfS0VZV09SRFMgPSBbXCIkZGVmc1wiLCBcImRlZmluaXRpb25zXCJdIGFzIGNvbnN0O1xuXG5mdW5jdGlvbiBzdHJpY3RpZnlTY2hlbWFNYXBzKG5vZGU6IEpzb25TY2hlbWEsIHBhdGg6IHN0cmluZywgcHJvdmlkZXI/OiBzdHJpbmcpOiBKc29uU2NoZW1hIHtcbiAgY29uc3QgcmVzdWx0ID0geyAuLi5ub2RlIH07XG5cbiAgZm9yIChjb25zdCBrZXl3b3JkIG9mIERFRklOSVRJT05fTUFQX0tFWVdPUkRTKSB7XG4gICAgY29uc3Qgc2NoZW1hcyA9IG93blZhbHVlKG5vZGUsIGtleXdvcmQpO1xuICAgIGlmICghaXNTY2hlbWFPYmplY3Qoc2NoZW1hcykpIGNvbnRpbnVlO1xuXG4gICAgcmVzdWx0W2tleXdvcmRdID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMoc2NoZW1hcykubWFwKChbbmFtZSwgc2NoZW1hXSkgPT4gW1xuICAgICAgICBuYW1lLFxuICAgICAgICBpc1NjaGVtYU9iamVjdChzY2hlbWEpXG4gICAgICAgICAgPyBzdHJpY3RpZnlOb2RlKHNjaGVtYSwgYCR7cGF0aH0uJHtrZXl3b3JkfS4ke25hbWV9YCwgcHJvdmlkZXIpXG4gICAgICAgICAgOiBzY2hlbWEsXG4gICAgICBdKSxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gcHJlZml4SXRlbXMg64qUIHN0cmljdGlmeUFycmF5IOydmCB0dXBsZSDqsr3roZzqsIAg64uk66Oo66+A66GcIOyXrOq4sOyEnOuKlCDsobDtlakga2V5d29yZCDrp4wg7J6s6reA7ZWc64ukLlxuY29uc3QgQ09NQklOQVRPUl9LRVlXT1JEUyA9IFtcImFueU9mXCIsIFwib25lT2ZcIiwgXCJhbGxPZlwiXSBhcyBjb25zdDtcblxuZnVuY3Rpb24gc3RyaWN0aWZ5U2NoZW1hQXJyYXlzKG5vZGU6IEpzb25TY2hlbWEsIHBhdGg6IHN0cmluZywgcHJvdmlkZXI/OiBzdHJpbmcpOiBKc29uU2NoZW1hIHtcbiAgY29uc3QgcmVzdWx0ID0geyAuLi5ub2RlIH07XG5cbiAgZm9yIChjb25zdCBrZXl3b3JkIG9mIENPTUJJTkFUT1JfS0VZV09SRFMpIHtcbiAgICBjb25zdCBzY2hlbWFzID0gb3duVmFsdWUobm9kZSwga2V5d29yZCk7XG4gICAgaWYgKCFzY2hlbWFzKSBjb250aW51ZTtcbiAgICByZXN1bHRba2V5d29yZF0gPSAoc2NoZW1hcyBhcyBKc29uU2NoZW1hW10pLm1hcCgoc2NoZW1hLCBpbmRleCkgPT5cbiAgICAgIHN0cmljdGlmeU5vZGUoc2NoZW1hLCBgJHtwYXRofS4ke2tleXdvcmR9WyR7aW5kZXh9XWAsIHByb3ZpZGVyKSxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gc3RyaWN0aWZ5T2JqZWN0KG5vZGU6IEpzb25TY2hlbWEsIHBhdGg6IHN0cmluZywgcHJvdmlkZXI/OiBzdHJpbmcpOiBKc29uU2NoZW1hIHtcbiAgY29uc3QgcHJvcGVydGllcyA9IG93blZhbHVlKG5vZGUsIFwicHJvcGVydGllc1wiKSBhcyBSZWNvcmQ8c3RyaW5nLCBKc29uU2NoZW1hPiB8IHVuZGVmaW5lZDtcbiAgaWYgKCFwcm9wZXJ0aWVzKSB7XG4gICAgcmV0dXJuIHsgLi4ubm9kZSwgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlIH07XG4gIH1cblxuICBjb25zdCBleGlzdGluZ1JlcXVpcmVkID0gbmV3IFNldCgob3duVmFsdWUobm9kZSwgXCJyZXF1aXJlZFwiKSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW10pO1xuICBjb25zdCBhbGxLZXlzID0gT2JqZWN0LmtleXMocHJvcGVydGllcyk7XG5cbiAgY29uc3Qgc3RyaWN0UHJvcHMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgYWxsS2V5cy5tYXAoKGtleSkgPT4ge1xuICAgICAgY29uc3QgcHJvcCA9IHByb3BlcnRpZXNba2V5XSE7XG4gICAgICBjb25zdCBzdHJpY3RQcm9wID0gc3RyaWN0aWZ5Tm9kZShwcm9wLCBgJHtwYXRofS4ke2tleX1gLCBwcm92aWRlcik7XG5cbiAgICAgIHJldHVybiBba2V5LCBleGlzdGluZ1JlcXVpcmVkLmhhcyhrZXkpID8gc3RyaWN0UHJvcCA6IG1ha2VOdWxsYWJsZShzdHJpY3RQcm9wKV07XG4gICAgfSksXG4gICkgYXMgUmVjb3JkPHN0cmluZywgSnNvblNjaGVtYT47XG5cbiAgY29uc3QgcmVzdWx0OiBKc29uU2NoZW1hID0ge1xuICAgIC4uLm5vZGUsXG4gICAgdHlwZTogXCJvYmplY3RcIixcbiAgICBwcm9wZXJ0aWVzOiBzdHJpY3RQcm9wcyxcbiAgICByZXF1aXJlZDogYWxsS2V5cyxcbiAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2UsXG4gIH07XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuY29uc3QgVU5SRUFDSEFCTEVfVFVQTEVfVEFJTF9TQ0hFTUE6IEpzb25TY2hlbWEgPSB7IHR5cGU6IFwic3RyaW5nXCIgfTtcblxuZnVuY3Rpb24gc3RyaWN0aWZ5QXJyYXkobm9kZTogSnNvblNjaGVtYSwgcGF0aDogc3RyaW5nLCBwcm92aWRlcj86IHN0cmluZyk6IEpzb25TY2hlbWEge1xuICBpZiAoXG4gICAgKHByb3ZpZGVyID09PSBcIm9wZW5haVwiIHx8IHByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKSAmJlxuICAgIChBcnJheS5pc0FycmF5KG93blZhbHVlKG5vZGUsIFwiaXRlbXNcIikpIHx8IEFycmF5LmlzQXJyYXkob3duVmFsdWUobm9kZSwgXCJwcmVmaXhJdGVtc1wiKSkpXG4gICkge1xuICAgIHJldHVybiBub3JtYWxpemVUdXBsZShub2RlLCBwYXRoLCBwcm92aWRlcik7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSB7IC4uLm5vZGUgfTtcbiAgY29uc3QgaXRlbXMgPSBvd25WYWx1ZShub2RlLCBcIml0ZW1zXCIpIGFzIEpzb25TY2hlbWEgfCBKc29uU2NoZW1hW10gfCB1bmRlZmluZWQ7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbXMpKSB7XG4gICAgcmVzdWx0Lml0ZW1zID0gaXRlbXMubWFwKChzY2hlbWEsIGluZGV4KSA9PlxuICAgICAgc3RyaWN0aWZ5Tm9kZShzY2hlbWEsIGAke3BhdGh9Lml0ZW1zWyR7aW5kZXh9XWAsIHByb3ZpZGVyKSxcbiAgICApO1xuICB9IGVsc2UgaWYgKGl0ZW1zICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXN1bHQuaXRlbXMgPSBzdHJpY3RpZnlOb2RlKGl0ZW1zLCBgJHtwYXRofS5pdGVtc2AsIHByb3ZpZGVyKTtcbiAgfVxuXG4gIGNvbnN0IHByZWZpeEl0ZW1zID0gb3duVmFsdWUobm9kZSwgXCJwcmVmaXhJdGVtc1wiKSBhcyBKc29uU2NoZW1hW10gfCB1bmRlZmluZWQ7XG4gIGlmIChBcnJheS5pc0FycmF5KHByZWZpeEl0ZW1zKSkge1xuICAgIHJlc3VsdC5wcmVmaXhJdGVtcyA9IHByZWZpeEl0ZW1zLm1hcCgoc2NoZW1hLCBpbmRleCkgPT5cbiAgICAgIHN0cmljdGlmeU5vZGUoc2NoZW1hLCBgJHtwYXRofS5wcmVmaXhJdGVtc1ske2luZGV4fV1gLCBwcm92aWRlciksXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVR1cGxlKFxuICBub2RlOiBKc29uU2NoZW1hLFxuICBwYXRoOiBzdHJpbmcsXG4gIHByb3ZpZGVyOiBcIm9wZW5haVwiIHwgXCJhbnRocm9waWNcIixcbik6IEpzb25TY2hlbWEge1xuICBjb25zdCBpdGVtcyA9IG93blZhbHVlKG5vZGUsIFwiaXRlbXNcIik7XG4gIGNvbnN0IHByZWZpeEl0ZW1zID0gb3duVmFsdWUobm9kZSwgXCJwcmVmaXhJdGVtc1wiKTtcbiAgY29uc3QgbGVnYWN5VHVwbGUgPSBBcnJheS5pc0FycmF5KGl0ZW1zKTtcbiAgY29uc3QgcHJlZml4VHVwbGUgPSBBcnJheS5pc0FycmF5KHByZWZpeEl0ZW1zKTtcbiAgaWYgKGxlZ2FjeVR1cGxlICYmIHByZWZpeFR1cGxlKSB7XG4gICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXCJpdGVtcyBhbmQgcHJlZml4SXRlbXMgdHVwbGUgZm9ybXMgY2Fubm90IGJlIGNvbWJpbmVkXCIsIHBhdGgpO1xuICB9XG4gIGlmIChwcmVmaXhUdXBsZSAmJiBPYmplY3QuaGFzT3duKG5vZGUsIFwiYWRkaXRpb25hbEl0ZW1zXCIpKSB7XG4gICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXCJhZGRpdGlvbmFsSXRlbXMgY2Fubm90IGJlIGNvbWJpbmVkIHdpdGggcHJlZml4SXRlbXNcIiwgcGF0aCk7XG4gIH1cblxuICBjb25zdCByYXdUdXBsZSA9IChsZWdhY3lUdXBsZSA/IGl0ZW1zIDogcHJlZml4SXRlbXMpIGFzIHVua25vd25bXTtcbiAgY29uc3QgdHVwbGVQYXRoID0gbGVnYWN5VHVwbGUgPyBgJHtwYXRofS5pdGVtc2AgOiBgJHtwYXRofS5wcmVmaXhJdGVtc2A7XG4gIGNvbnN0IHR1cGxlID0gcmF3VHVwbGUubWFwKChzY2hlbWEsIGluZGV4KSA9PiB7XG4gICAgaWYgKCFpc1NjaGVtYU9iamVjdChzY2hlbWEpKSB7XG4gICAgICB0aHJvdyBuZXcgU3RyaWN0aWZpZXJFcnJvcihcbiAgICAgICAgXCJib29sZWFuIGFuZCBub24tb2JqZWN0IHR1cGxlIG1lbWJlciBzY2hlbWFzIGFyZSBub3Qgc3VwcG9ydGVkXCIsXG4gICAgICAgIGAke3R1cGxlUGF0aH1bJHtpbmRleH1dYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IG1lbWJlclBhdGggPSBgJHt0dXBsZVBhdGh9WyR7aW5kZXh9XWA7XG4gICAgY29uc3QgbWVtYmVyID0gc3RyaWN0aWZ5Tm9kZShzY2hlbWEsIG1lbWJlclBhdGgsIHByb3ZpZGVyKTtcbiAgICBpZiAoIWhhc1Byb3ZpZGVyU2NoZW1hRW50cnlQb2ludChtZW1iZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgU3RyaWN0aWZpZXJFcnJvcihcbiAgICAgICAgXCJ0dXBsZSBtZW1iZXIgbXVzdCBkZWZpbmUgYSBwcm92aWRlci1yZXByZXNlbnRhYmxlIHNjaGVtYVwiLFxuICAgICAgICBtZW1iZXJQYXRoLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG1lbWJlcjtcbiAgfSk7XG5cbiAgY29uc3QgcmF3VGFpbCA9IGxlZ2FjeVR1cGxlID8gb3duVmFsdWUobm9kZSwgXCJhZGRpdGlvbmFsSXRlbXNcIikgOiBpdGVtcztcbiAgaWYgKHJhd1RhaWwgPT09IHRydWUpIHtcbiAgICB0aHJvdyBuZXcgU3RyaWN0aWZpZXJFcnJvcihcImFuIHVucmVzdHJpY3RlZCB0dXBsZSByZXN0IGlzIG5vdCBzdXBwb3J0ZWRcIiwgcGF0aCk7XG4gIH1cbiAgaWYgKHJhd1RhaWwgIT09IHVuZGVmaW5lZCAmJiByYXdUYWlsICE9PSBmYWxzZSAmJiAhaXNTY2hlbWFPYmplY3QocmF3VGFpbCkpIHtcbiAgICB0aHJvdyBuZXcgU3RyaWN0aWZpZXJFcnJvcihcInR1cGxlIHJlc3QgbXVzdCBiZSBhbiBvYmplY3Qgc2NoZW1hIG9yIGZhbHNlXCIsIHBhdGgpO1xuICB9XG5cbiAgY29uc3QgdGFpbCA9IGlzU2NoZW1hT2JqZWN0KHJhd1RhaWwpXG4gICAgPyBzdHJpY3RpZnlOb2RlKHJhd1RhaWwsIGxlZ2FjeVR1cGxlID8gYCR7cGF0aH0uYWRkaXRpb25hbEl0ZW1zYCA6IGAke3BhdGh9Lml0ZW1zYCwgcHJvdmlkZXIpXG4gICAgOiB1bmRlZmluZWQ7XG4gIGlmICh0YWlsICE9PSB1bmRlZmluZWQgJiYgIWhhc1Byb3ZpZGVyU2NoZW1hRW50cnlQb2ludCh0YWlsKSkge1xuICAgIHRocm93IG5ldyBTdHJpY3RpZmllckVycm9yKFwiYW4gdW5yZXN0cmljdGVkIHR1cGxlIHJlc3QgaXMgbm90IHN1cHBvcnRlZFwiLCBwYXRoKTtcbiAgfVxuICBjb25zdCB0YWlsTW9kZSA9IHRhaWwgIT09IHVuZGVmaW5lZCA/IFwidHlwZWRcIiA6IHJhd1RhaWwgPT09IGZhbHNlID8gXCJjbG9zZWRcIiA6IFwiaW1wbGljaXRcIjtcbiAgY29uc3QgYm91bmRzID0gbm9ybWFsaXplVHVwbGVCb3VuZHMobm9kZSwgdHVwbGUubGVuZ3RoLCB0YWlsTW9kZSwgcGF0aCk7XG4gIGNvbnN0IGJhc2UgPSBvbWl0S2V5cyhub2RlLCBbXCJpdGVtc1wiLCBcInByZWZpeEl0ZW1zXCIsIFwiYWRkaXRpb25hbEl0ZW1zXCIsIFwibWluSXRlbXNcIiwgXCJtYXhJdGVtc1wiXSk7XG5cbiAgLy8gQW50aHJvcGljIOydgCBhc3NlcnROb3JtYWxpemF0aW9uQ29tcGF0aWJpbGl0eSDqsIAg67mE7Ja0IOyeiOyngCDslYrsnYAgdHVwbGUg7J2EIOydtOuvuCDqsbDrtoDtlojsnLzrr4DroZxcbiAgLy8g7Jes6riwIOuPhOuLrO2VmOuKlCB0dXBsZSDsnYAg67mIIHR1cGxlIOu/kOydtOqzoCwg6re4IOqyveyasCBwcmVmaXhJdGVtcyBzcHJlYWQg64qUIOyekOyXsO2eiCDsg53rnrXrkJzri6Qg4oCUXG4gIC8vIHByb3ZpZGVyIOu2hOq4sCDsl4bsnbQg7ZWcIO2Yle2DnOuhnCDrkZAgcHJvdmlkZXIg66qo65GQ66W8IO2RnO2YhO2VnOuLpC5cbiAgcmV0dXJuIHtcbiAgICAuLi5iYXNlLFxuICAgIC4uLih0dXBsZS5sZW5ndGggPiAwID8geyBwcmVmaXhJdGVtczogdHVwbGUgfSA6IHt9KSxcbiAgICBpdGVtczogdGFpbCA/PyBVTlJFQUNIQUJMRV9UVVBMRV9UQUlMX1NDSEVNQSxcbiAgICAuLi5ib3VuZHMsXG4gIH07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVR1cGxlQm91bmRzKFxuICBub2RlOiBKc29uU2NoZW1hLFxuICB0dXBsZUxlbmd0aDogbnVtYmVyLFxuICB0YWlsTW9kZTogXCJ0eXBlZFwiIHwgXCJjbG9zZWRcIiB8IFwiaW1wbGljaXRcIixcbiAgcGF0aDogc3RyaW5nLFxuKTogeyBtaW5JdGVtczogbnVtYmVyOyBtYXhJdGVtcz86IG51bWJlciB9IHtcbiAgY29uc3QgY2FsbGVyTWluSXRlbXMgPSBpbnRlZ2VyQm91bmQob3duVmFsdWUobm9kZSwgXCJtaW5JdGVtc1wiKSwgXCJtaW5JdGVtc1wiLCBwYXRoKTtcbiAgY29uc3QgY2FsbGVyTWF4SXRlbXMgPSBpbnRlZ2VyQm91bmQob3duVmFsdWUobm9kZSwgXCJtYXhJdGVtc1wiKSwgXCJtYXhJdGVtc1wiLCBwYXRoKTtcbiAgaWYgKHRhaWxNb2RlID09PSBcImltcGxpY2l0XCIgJiYgY2FsbGVyTWF4SXRlbXMgIT09IHVuZGVmaW5lZCAmJiBjYWxsZXJNYXhJdGVtcyA+IHR1cGxlTGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXG4gICAgICBcImltcGxpY2l0IHR1cGxlIHJlc3QgY2Fubm90IGJlIHJlcHJlc2VudGVkIHdoZW4gbWF4SXRlbXMgZXhjZWVkcyB0aGUgdHVwbGUgbGVuZ3RoXCIsXG4gICAgICBwYXRoLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBtaW5JdGVtcyA9IGNhbGxlck1pbkl0ZW1zID8/IChjYWxsZXJNYXhJdGVtcyA9PT0gdW5kZWZpbmVkID8gdHVwbGVMZW5ndGggOiAwKTtcbiAgY29uc3QgbWF4SXRlbXMgPVxuICAgIHRhaWxNb2RlID09PSBcInR5cGVkXCIgPyBjYWxsZXJNYXhJdGVtcyA6IE1hdGgubWluKGNhbGxlck1heEl0ZW1zID8/IHR1cGxlTGVuZ3RoLCB0dXBsZUxlbmd0aCk7XG5cbiAgaWYgKG1heEl0ZW1zICE9PSB1bmRlZmluZWQgJiYgbWluSXRlbXMgPiBtYXhJdGVtcykge1xuICAgIHRocm93IG5ldyBTdHJpY3RpZmllckVycm9yKFwidHVwbGUgbWluSXRlbXMgY2Fubm90IGV4Y2VlZCBtYXhJdGVtc1wiLCBwYXRoKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWluSXRlbXMsXG4gICAgLi4uKG1heEl0ZW1zICE9PSB1bmRlZmluZWQgPyB7IG1heEl0ZW1zIH0gOiB7fSksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGludGVnZXJCb3VuZCh2YWx1ZTogdW5rbm93biwga2V5d29yZDogc3RyaW5nLCBwYXRoOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcih2YWx1ZSkgfHwgKHZhbHVlIGFzIG51bWJlcikgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoYCR7a2V5d29yZH0gbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBzYWZlIGludGVnZXJgLCBwYXRoKTtcbiAgfVxuICByZXR1cm4gdmFsdWUgYXMgbnVtYmVyO1xufVxuXG5mdW5jdGlvbiBpc1NjaGVtYU9iamVjdCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEpzb25TY2hlbWEge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gb3duVmFsdWUoc2NoZW1hOiBKc29uU2NoZW1hLCBrZXl3b3JkOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgcmV0dXJuIE9iamVjdC5oYXNPd24oc2NoZW1hLCBrZXl3b3JkKSA/IHNjaGVtYVtrZXl3b3JkXSA6IHVuZGVmaW5lZDtcbn1cblxuY29uc3QgUFJPVklERVJfU0NIRU1BX0VOVFJZX1BPSU5UX0tFWVdPUkRTID0gbmV3IFNldChbXG4gIFwidHlwZVwiLFxuICBcIiRyZWZcIixcbiAgXCJwcm9wZXJ0aWVzXCIsXG4gIFwiYW55T2ZcIixcbiAgXCJvbmVPZlwiLFxuICBcImFsbE9mXCIsXG5dKTtcblxuZnVuY3Rpb24gaGFzUHJvdmlkZXJTY2hlbWFFbnRyeVBvaW50KHNjaGVtYTogSnNvblNjaGVtYSk6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0LmtleXMoc2NoZW1hKS5zb21lKChrZXkpID0+IFBST1ZJREVSX1NDSEVNQV9FTlRSWV9QT0lOVF9LRVlXT1JEUy5oYXMoa2V5KSk7XG59XG5cbmZ1bmN0aW9uIG9taXRLZXlzKG5vZGU6IEpzb25TY2hlbWEsIGtleXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogSnNvblNjaGVtYSB7XG4gIGNvbnN0IG9taXR0ZWQgPSBuZXcgU2V0KGtleXMpO1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKG5vZGUpLmZpbHRlcigoW2tleV0pID0+ICFvbWl0dGVkLmhhcyhrZXkpKSk7XG59XG5cbmZ1bmN0aW9uIG1ha2VOdWxsYWJsZShzY2hlbWE6IEpzb25TY2hlbWEpOiBKc29uU2NoZW1hIHtcbiAgaWYgKG93blZhbHVlKHNjaGVtYSwgXCJ0eXBlXCIpID09PSBcIm51bGxcIikgcmV0dXJuIHNjaGVtYTtcblxuICBjb25zdCBhbnlPZiA9IG93blZhbHVlKHNjaGVtYSwgXCJhbnlPZlwiKTtcbiAgaWYgKGFueU9mKSB7XG4gICAgY29uc3QgdmFyaWFudHMgPSBhbnlPZiBhcyBKc29uU2NoZW1hW107XG4gICAgY29uc3QgaGFzTnVsbCA9IHZhcmlhbnRzLnNvbWUoKHYpID0+IG93blZhbHVlKHYsIFwidHlwZVwiKSA9PT0gXCJudWxsXCIpO1xuICAgIGlmIChoYXNOdWxsKSByZXR1cm4gc2NoZW1hO1xuICAgIHJldHVybiB7IGFueU9mOiBbLi4udmFyaWFudHMsIHsgdHlwZTogXCJudWxsXCIgfV0gfTtcbiAgfVxuXG4gIGNvbnN0IG9uZU9mID0gb3duVmFsdWUoc2NoZW1hLCBcIm9uZU9mXCIpO1xuICBpZiAob25lT2YpIHtcbiAgICBjb25zdCB2YXJpYW50cyA9IG9uZU9mIGFzIEpzb25TY2hlbWFbXTtcbiAgICBjb25zdCBoYXNOdWxsID0gdmFyaWFudHMuc29tZSgodikgPT4gb3duVmFsdWUodiwgXCJ0eXBlXCIpID09PSBcIm51bGxcIik7XG4gICAgaWYgKGhhc051bGwpIHJldHVybiBzY2hlbWE7XG4gICAgcmV0dXJuIHsgb25lT2Y6IFsuLi52YXJpYW50cywgeyB0eXBlOiBcIm51bGxcIiB9XSB9O1xuICB9XG5cbiAgcmV0dXJuIHsgYW55T2Y6IFtzY2hlbWEsIHsgdHlwZTogXCJudWxsXCIgfV0gfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUF1QkEsSUFBYSxtQkFBYixjQUFzQyxNQUFNO0NBR2pDO0NBRlQs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
390
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaWN0aWZpZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vc3RyaWN0aWZpZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBKU09OIFNjaGVtYSDihpIgT3BlbkFJIHN0cmljdCBKU09OIFNjaGVtYSDrs4DtmZguXG4gKlxuICogT3BlbkFJIFJlc3BvbnNlcyBBUEkgc3RyaWN0IOuqqOuTnCDsmpTqtazsgqztla06XG4gKiAgLSDrqqjrk6Agb2JqZWN0IOyXkCBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2VcbiAqICAtIOuqqOuToCBvYmplY3QgcHJvcGVydGllcyDrpbwgcmVxdWlyZWQg7JeQIO2PrO2VqFxuICogIC0gb3B0aW9uYWwg7ZWE65OcIOKGkiBhbnlPZiBbb3JpZ2luYWwsIHsgdHlwZTogJ251bGwnIH1dIOuhnCByZXF1aXJlZCDsnKDsp4BcbiAqICAtIHJlY3Vyc2l2ZSDsspjrpqwgKG5lc3RlZCBvYmplY3RzLCBhcnJheXMsIGFsbE9mL2FueU9mL29uZU9mKVxuICovXG5cbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7XG4gIFNDSEVNQV9BUlJBWV9LRVlXT1JEUyxcbiAgU0NIRU1BX01BUF9LRVlXT1JEUyxcbiAgU0NIRU1BX1NJTkdMRV9LRVlXT1JEUyxcbiAgVU5TVVBQT1JURURfUkVGRVJFTkNFX0tFWVdPUkRTLFxufSBmcm9tIFwiLi9qc29uLXNjaGVtYS1rZXl3b3Jkc1wiO1xuaW1wb3J0IHtcbiAgaXNKc29uT2JqZWN0LFxuICB0eXBlIEpzb25PYmplY3QsXG4gIHR5cGUgSnNvblZhbHVlLFxuICB0eXBlIFJlYWRvbmx5SnNvbk9iamVjdCxcbn0gZnJvbSBcIi4vcHJvdmlkZXItdHlwZXNcIjtcblxuLyoqIEFuIG9iamVjdC1mb3JtIEpTT04gU2NoZW1hIG5vZGUuIEJvb2xlYW4gc2NoZW1hcyBhbmQgbWFsZm9ybWVkIG1lbWJlcnMgc3RheSBwbGFpbiBKU09OIHZhbHVlcy4gKi9cbmV4cG9ydCB0eXBlIEpzb25TY2hlbWEgPSBKc29uT2JqZWN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0cmljdGlmaWVyT3B0aW9ucyB7XG4gIHByb3ZpZGVyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgU3RyaWN0aWZpZXJFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyBwYXRoOiBzdHJpbmcsXG4gICkge1xuICAgIHN1cGVyKGBzdHJpY3RpZmllcjogJHttZXNzYWdlfSAoYXQgJHtwYXRofSlgKTtcbiAgICB0aGlzLm5hbWUgPSBcIlN0cmljdGlmaWVyRXJyb3JcIjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyaWN0aWZ5KGlucHV0OiBSZWFkb25seUpzb25PYmplY3QsIG9wdGlvbnM6IFN0cmljdGlmaWVyT3B0aW9ucyA9IHt9KTogSnNvblNjaGVtYSB7XG4gIC8vIFdvcmsgb24gdGhlIEpTT04gdGhlIHByb3ZpZGVyIHdpbGwgcmVjZWl2ZTogYSBmcmVzaCBjb3B5LCB3aXRoIHVuZGVmaW5lZCBtZW1iZXJzIGRyb3BwZWQgYXNcbiAgLy8gc2VyaWFsaXphdGlvbiBkcm9wcyB0aGVtLiBKU09OLnBhcnNlIHdpdGhvdXQgYSByZXZpdmVyIHlpZWxkcyBvbmx5IEpTT04gdmFsdWVzLlxuICBjb25zdCBzZXJpYWxpemVkOiBKc29uVmFsdWUgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGlucHV0KSk7XG5cbiAgaWYgKCFpc1NjaGVtYU9iamVjdChzZXJpYWxpemVkKSkgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXCJzY2hlbWEgbXVzdCBiZSBhbiBvYmplY3RcIiwgXCIkXCIpO1xuICBjb25zdCBzY2hlbWEgPSBzZXJpYWxpemVkO1xuXG4gIGlmIChvcHRpb25zLnByb3ZpZGVyID09PSBcIm9wZW5haVwiIHx8IG9wdGlvbnMucHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCIpIHtcbiAgICBhc3NlcnROb3JtYWxpemF0aW9uQ29tcGF0aWJpbGl0eShzY2hlbWEsIG9wdGlvbnMucHJvdmlkZXIpO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0gc3RyaWN0aWZ5Tm9kZShzY2hlbWEsIFwiJFwiLCBvcHRpb25zLnByb3ZpZGVyKTtcblxuICBpZiAob3B0aW9ucy5wcm92aWRlciA9PT0gXCJvcGVuYWlcIiB8fCBvcHRpb25zLnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKSB7XG4gICAgYXNzZXJ0Tm9ybWFsaXphdGlvbkNvbXBhdGliaWxpdHkocmVzdWx0LCBvcHRpb25zLnByb3ZpZGVyKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICog7JyE7LmYIOuqqeuhneydgCBqc29uLXNjaGVtYS1rZXl3b3JkcyDqsIAg7IaM7Jyg7ZWY6rOgLCDsl6zquLDshJzripQg6rCBIOychOy5mOydmCBgbm9ybWFsaXphYmxlYCDsl6zrtoDrp4wg7Ja564qU64ukLlxuICogbm9ybWFsaXphYmxlPXRydWUg64qUIHN0cmljdGlmeU5vZGUg6rCAIOq3uCDsnITsuZjrpbwg7Iuk7KCc66GcIOyerOyekeyEse2VnOuLpOuKlCDrnLvsnbTri6QuIGBub3RgL2BpZmAg7LKY65+8XG4gKiDsnqzsnpHshLHtlZjrqbQgY2FsbGVyIOydmOuvuOqwgCDrsJTrgIzripQg7JyE7LmY64qUIGZhbHNlIOydtOqzoCwg6re4IOyVhOuemCB0dXBsZS9gJHJlZmAg64qUIOygleq3nO2ZlCDrjIDsi6Ag6rGw67aA65Cc64ukLlxuICpcbiAqIGBpdGVtc2AvYGFkZGl0aW9uYWxJdGVtc2Ag64qUIHR1cGxlIO2MkOygleqzvCDtlajqu5gg64uk66SE7JW8IO2VtOyEnCDslYTrnpgg7Iic7ZqM7JeQ7IScIOqwnOuzhCDsspjrpqztlZzri6QuXG4gKi9cbmNvbnN0IE5PTl9OT1JNQUxJWkFCTEVfUE9TSVRJT05TID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgXCJkZXBlbmRlbnRTY2hlbWFzXCIsXG4gIFwicGF0dGVyblByb3BlcnRpZXNcIixcbiAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiLFxuICBcImNvbnRhaW5zXCIsXG4gIFwiY29udGVudFNjaGVtYVwiLFxuICBcImVsc2VcIixcbiAgXCJpZlwiLFxuICBcIm5vdFwiLFxuICBcInByb3BlcnR5TmFtZXNcIixcbiAgXCJ0aGVuXCIsXG4gIFwidW5ldmFsdWF0ZWRJdGVtc1wiLFxuICBcInVuZXZhbHVhdGVkUHJvcGVydGllc1wiLFxuXSk7XG5cbmZ1bmN0aW9uIHBvc2l0aW9uRW50cmllcyhrZXl3b3JkczogcmVhZG9ubHkgc3RyaW5nW10pOiBSZWFkb25seUFycmF5PHJlYWRvbmx5IFtzdHJpbmcsIGJvb2xlYW5dPiB7XG4gIHJldHVybiBrZXl3b3Jkcy5tYXAoKGtleXdvcmQpID0+IFtrZXl3b3JkLCAhTk9OX05PUk1BTElaQUJMRV9QT1NJVElPTlMuaGFzKGtleXdvcmQpXSBhcyBjb25zdCk7XG59XG5cbmNvbnN0IFNDSEVNQV9TQ0FOX01BUF9LRVlXT1JEUyA9IHBvc2l0aW9uRW50cmllcyhTQ0hFTUFfTUFQX0tFWVdPUkRTKTtcbmNvbnN0IFNDSEVNQV9TQ0FOX0FSUkFZX0tFWVdPUkRTID0gcG9zaXRpb25FbnRyaWVzKFNDSEVNQV9BUlJBWV9LRVlXT1JEUyk7XG5cbi8vIGl0ZW1zL2FkZGl0aW9uYWxJdGVtcyDripQgdHVwbGUg67aE6riw7JeQ7IScIOyngeygkSDri6Tro6jrr4DroZwg64uo7J28IOychOy5mCDsiqTsupTsl5DshJwg7KCc7Jm47ZWc64ukLlxuY29uc3QgU0NIRU1BX1NDQU5fU0lOR0xFX0tFWVdPUkRTID0gcG9zaXRpb25FbnRyaWVzKFxuICBTQ0hFTUFfU0lOR0xFX0tFWVdPUkRTLmZpbHRlcigoa2V5d29yZCkgPT4ga2V5d29yZCAhPT0gXCJpdGVtc1wiICYmIGtleXdvcmQgIT09IFwiYWRkaXRpb25hbEl0ZW1zXCIpLFxuKTtcblxuLyoqXG4gKiBJbnNwZWN0IGV2ZXJ5IEpTT04gU2NoZW1hLWJlYXJpbmcgcG9zaXRpb24gd2l0aG91dCByZXdyaXRpbmcgaXQuXG4gKlxuICogUG9zaXRpdmUgcG9zaXRpb25zIGFscmVhZHkgdHJhdmVyc2VkIGJ5IHN0cmljdGlmeU5vZGUgbWF5IG5vcm1hbGl6ZSBPcGVuQUkgdHVwbGVzLiBQb3NpdGlvbnNcbiAqIHN1Y2ggYXMgYG5vdGAgYW5kIGBpZmAgY2Fubm90IGJlIHRpZ2h0ZW5lZCB3aXRob3V0IGNoYW5naW5nIGNhbGxlciBzZW1hbnRpY3MsIHNvIHBvc2l0aW9uYWxcbiAqIHR1cGxlcyB0aGVyZSBmYWlsIGV4cGxpY2l0bHkgaW5zdGVhZCBvZiBsZWFraW5nIGFuIHVuc3VwcG9ydGVkIHByb3ZpZGVyIHNjaGVtYS4gUmVmZXJlbmNlc1xuICogZnJvbSB0aG9zZSBwb3NpdGlvbnMgYWxzbyBmYWlsIGJlY2F1c2UgdGhlaXIgZGVmaW5pdGlvbnMgYXJlIG5vcm1hbGl6ZWQgZ2xvYmFsbHkuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydE5vcm1hbGl6YXRpb25Db21wYXRpYmlsaXR5KFxuICBzY2hlbWE6IEpzb25TY2hlbWEsXG4gIHByb3ZpZGVyOiBcIm9wZW5haVwiIHwgXCJhbnRocm9waWNcIixcbik6IHZvaWQge1xuICBjb25zdCByZWZlcmVuY2VzOiBBcnJheTx7IHZhbHVlOiBzdHJpbmc7IHBhdGg6IHN0cmluZyB9PiA9IFtdO1xuXG4gIGNvbnN0IHN0YWNrOiBBcnJheTx7IG5vZGU6IEpzb25TY2hlbWE7IHBhdGg6IHN0cmluZzsgbm9ybWFsaXphYmxlOiBib29sZWFuIH0+ID0gW1xuICAgIHsgbm9kZTogc2NoZW1hLCBwYXRoOiBcIiRcIiwgbm9ybWFsaXphYmxlOiB0cnVlIH0sXG4gIF07XG5cbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBjdXJyZW50ID0gc3RhY2sucG9wKCkhO1xuICAgIGNvbnN0IGl0ZW1zVmFsdWUgPSBvd25WYWx1ZShjdXJyZW50Lm5vZGUsIFwiaXRlbXNcIik7XG4gICAgY29uc3QgcHJlZml4SXRlbXNWYWx1ZSA9IG93blZhbHVlKGN1cnJlbnQubm9kZSwgXCJwcmVmaXhJdGVtc1wiKTtcbiAgICBjb25zdCBsZWdhY3lUdXBsZSA9IEFycmF5LmlzQXJyYXkoaXRlbXNWYWx1ZSk7XG4gICAgY29uc3QgcHJlZml4VHVwbGUgPSBBcnJheS5pc0FycmF5KHByZWZpeEl0ZW1zVmFsdWUpO1xuXG4gICAgYXNzZXJ0VW5zdXBwb3J0ZWRSZWZlcmVuY2VLZXl3b3JkcyhjdXJyZW50Lm5vZGUsIGN1cnJlbnQucGF0aCk7XG4gICAgY29sbGVjdFNjaGVtYVJlZmVyZW5jZShjdXJyZW50LCByZWZlcmVuY2VzKTtcblxuICAgIGlmIChsZWdhY3lUdXBsZSB8fCBwcmVmaXhUdXBsZSkge1xuICAgICAgY29uc3QgdHVwbGUgPSBsZWdhY3lUdXBsZSA/IGl0ZW1zVmFsdWUgOiBwcmVmaXhUdXBsZSA/IHByZWZpeEl0ZW1zVmFsdWUgOiBbXTtcblxuICAgICAgaWYgKHByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiICYmIHR1cGxlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXG4gICAgICAgICAgXCJwb3NpdGlvbmFsIHR1cGxlIHNjaGVtYXMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gQW50aHJvcGljIGJlY2F1c2UgQ2xhdWRlIENvZGUgY2Fubm90IHByZXNlcnZlIGl0ZW0gcG9zaXRpb25zXCIsXG4gICAgICAgICAgY3VycmVudC5wYXRoLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWN1cnJlbnQubm9ybWFsaXphYmxlKSB7XG4gICAgICAgIHRocm93IG5ldyBTdHJpY3RpZmllckVycm9yKFxuICAgICAgICAgIFwicG9zaXRpb25hbCB0dXBsZSBzY2hlbWFzIGFyZSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgc2NoZW1hIHBvc2l0aW9uXCIsXG4gICAgICAgICAgY3VycmVudC5wYXRoLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAob3duVmFsdWUoY3VycmVudC5ub2RlLCBcInR5cGVcIikgIT09IFwiYXJyYXlcIikge1xuICAgICAgICB0aHJvdyBuZXcgU3RyaWN0aWZpZXJFcnJvcihcbiAgICAgICAgICAncG9zaXRpb25hbCB0dXBsZSBzY2hlbWFzIG11c3QgZGVjbGFyZSB0eXBlIFwiYXJyYXlcIjsgZXhwcmVzcyBudWxsYWJsZSB0dXBsZXMgd2l0aCBhbnlPZicsXG4gICAgICAgICAgYCR7Y3VycmVudC5wYXRofS50eXBlYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXl3b3JkLCBrZXl3b3JkTm9ybWFsaXphYmxlXSBvZiBTQ0hFTUFfU0NBTl9NQVBfS0VZV09SRFMpIHtcbiAgICAgIGNvbnN0IHNjaGVtYXMgPSBvd25WYWx1ZShjdXJyZW50Lm5vZGUsIGtleXdvcmQpO1xuXG4gICAgICBpZiAoIWlzU2NoZW1hT2JqZWN0KHNjaGVtYXMpKSBjb250aW51ZTtcblxuICAgICAgZm9yIChjb25zdCBbbmFtZSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKHNjaGVtYXMpKSB7XG4gICAgICAgIGlmICghaXNTY2hlbWFPYmplY3QoY2hpbGQpKSBjb250aW51ZTtcbiAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgbm9kZTogY2hpbGQsXG4gICAgICAgICAgcGF0aDogYCR7Y3VycmVudC5wYXRofS4ke2tleXdvcmR9LiR7bmFtZX1gLFxuICAgICAgICAgIG5vcm1hbGl6YWJsZTogY3VycmVudC5ub3JtYWxpemFibGUgJiYga2V5d29yZE5vcm1hbGl6YWJsZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gb3duVmFsdWUoY3VycmVudC5ub2RlLCBcImRlcGVuZGVuY2llc1wiKTtcblxuICAgIGlmIChpc1NjaGVtYU9iamVjdChkZXBlbmRlbmNpZXMpKSB7XG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBjaGlsZF0gb2YgT2JqZWN0LmVudHJpZXMoZGVwZW5kZW5jaWVzKSkge1xuICAgICAgICBpZiAoIWlzU2NoZW1hT2JqZWN0KGNoaWxkKSkgY29udGludWU7XG4gICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgIG5vZGU6IGNoaWxkLFxuICAgICAgICAgIHBhdGg6IGAke2N1cnJlbnQucGF0aH0uZGVwZW5kZW5jaWVzLiR7bmFtZX1gLFxuICAgICAgICAgIG5vcm1hbGl6YWJsZTogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2tleXdvcmQsIGtleXdvcmROb3JtYWxpemFibGVdIG9mIFNDSEVNQV9TQ0FOX0FSUkFZX0tFWVdPUkRTKSB7XG4gICAgICBjb25zdCBzY2hlbWFzID0gb3duVmFsdWUoY3VycmVudC5ub2RlLCBrZXl3b3JkKTtcblxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHNjaGVtYXMpKSBjb250aW51ZTtcblxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHNjaGVtYXMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gc2NoZW1hc1tpbmRleF07XG5cbiAgICAgICAgaWYgKCFpc1NjaGVtYU9iamVjdChjaGlsZCkpIGNvbnRpbnVlO1xuICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICBub2RlOiBjaGlsZCxcbiAgICAgICAgICBwYXRoOiBgJHtjdXJyZW50LnBhdGh9LiR7a2V5d29yZH1bJHtpbmRleH1dYCxcbiAgICAgICAgICBub3JtYWxpemFibGU6IGN1cnJlbnQubm9ybWFsaXphYmxlICYmIGtleXdvcmROb3JtYWxpemFibGUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGl0ZW1zID0gb3duVmFsdWUoY3VycmVudC5ub2RlLCBcIml0ZW1zXCIpO1xuXG4gICAgaWYgKGlzU2NoZW1hT2JqZWN0KGl0ZW1zKSkge1xuICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgIG5vZGU6IGl0ZW1zLFxuICAgICAgICBwYXRoOiBgJHtjdXJyZW50LnBhdGh9Lml0ZW1zYCxcbiAgICAgICAgbm9ybWFsaXphYmxlOiBjdXJyZW50Lm5vcm1hbGl6YWJsZSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpdGVtcykpIHtcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBpdGVtcy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBpdGVtc1tpbmRleF07XG5cbiAgICAgICAgaWYgKCFpc1NjaGVtYU9iamVjdChjaGlsZCkpIGNvbnRpbnVlO1xuICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICBub2RlOiBjaGlsZCxcbiAgICAgICAgICBwYXRoOiBgJHtjdXJyZW50LnBhdGh9Lml0ZW1zWyR7aW5kZXh9XWAsXG4gICAgICAgICAgbm9ybWFsaXphYmxlOiBjdXJyZW50Lm5vcm1hbGl6YWJsZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYWRkaXRpb25hbEl0ZW1zID0gb3duVmFsdWUoY3VycmVudC5ub2RlLCBcImFkZGl0aW9uYWxJdGVtc1wiKTtcblxuICAgIGlmIChpc1NjaGVtYU9iamVjdChhZGRpdGlvbmFsSXRlbXMpKSB7XG4gICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgbm9kZTogYWRkaXRpb25hbEl0ZW1zLFxuICAgICAgICBwYXRoOiBgJHtjdXJyZW50LnBhdGh9LmFkZGl0aW9uYWxJdGVtc2AsXG4gICAgICAgIG5vcm1hbGl6YWJsZTogY3VycmVudC5ub3JtYWxpemFibGUgJiYgbGVnYWN5VHVwbGUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXl3b3JkLCBrZXl3b3JkTm9ybWFsaXphYmxlXSBvZiBTQ0hFTUFfU0NBTl9TSU5HTEVfS0VZV09SRFMpIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gb3duVmFsdWUoY3VycmVudC5ub2RlLCBrZXl3b3JkKTtcblxuICAgICAgaWYgKCFpc1NjaGVtYU9iamVjdChjaGlsZCkpIGNvbnRpbnVlO1xuICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgIG5vZGU6IGNoaWxkLFxuICAgICAgICBwYXRoOiBgJHtjdXJyZW50LnBhdGh9LiR7a2V5d29yZH1gLFxuICAgICAgICBub3JtYWxpemFibGU6IGN1cnJlbnQubm9ybWFsaXphYmxlICYmIGtleXdvcmROb3JtYWxpemFibGUsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3NlcnRSZWZlcmVuY2VUYXJnZXRzKHNjaGVtYSwgcmVmZXJlbmNlcyk7XG59XG5cbmZ1bmN0aW9uIGFzc2VydFVuc3VwcG9ydGVkUmVmZXJlbmNlS2V5d29yZHMoc2NoZW1hOiBKc29uU2NoZW1hLCBwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBrZXl3b3JkIG9mIFVOU1VQUE9SVEVEX1JFRkVSRU5DRV9LRVlXT1JEUykge1xuICAgIGlmIChPYmplY3QuaGFzT3duKHNjaGVtYSwga2V5d29yZCkpIHtcbiAgICAgIHRocm93IG5ldyBTdHJpY3RpZmllckVycm9yKGAke2tleXdvcmR9IGlzIG5vdCBzdXBwb3J0ZWRgLCBgJHtwYXRofS4ke2tleXdvcmR9YCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RTY2hlbWFSZWZlcmVuY2UoXG4gIGN1cnJlbnQ6IHsgbm9kZTogSnNvblNjaGVtYTsgcGF0aDogc3RyaW5nOyBub3JtYWxpemFibGU6IGJvb2xlYW4gfSxcbiAgcmVmZXJlbmNlczogQXJyYXk8eyB2YWx1ZTogc3RyaW5nOyBwYXRoOiBzdHJpbmcgfT4sXG4pOiB2b2lkIHtcbiAgaWYgKCFPYmplY3QuaGFzT3duKGN1cnJlbnQubm9kZSwgXCIkcmVmXCIpKSByZXR1cm47XG5cbiAgY29uc3QgcmVmZXJlbmNlID0gY3VycmVudC5ub2RlLiRyZWY7XG4gIGNvbnN0IHJlZmVyZW5jZVRleHQgPSB6LnN0cmluZygpLnNhZmVQYXJzZShyZWZlcmVuY2UpO1xuXG4gIGlmICghcmVmZXJlbmNlVGV4dC5zdWNjZXNzKSB7XG4gICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXCIkcmVmIG11c3QgYmUgYSBzdHJpbmdcIiwgYCR7Y3VycmVudC5wYXRofS4kcmVmYCk7XG4gIH1cblxuICBpZiAoIWN1cnJlbnQubm9ybWFsaXphYmxlKSB7XG4gICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXG4gICAgICBcInNjaGVtYSByZWZlcmVuY2VzIGFyZSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgc2NoZW1hIHBvc2l0aW9uXCIsXG4gICAgICBjdXJyZW50LnBhdGgsXG4gICAgKTtcbiAgfVxuXG4gIHJlZmVyZW5jZXMucHVzaCh7IHZhbHVlOiByZWZlcmVuY2VUZXh0LmRhdGEsIHBhdGg6IGAke2N1cnJlbnQucGF0aH0uJHJlZmAgfSk7XG59XG5cbmZ1bmN0aW9uIGFzc2VydFJlZmVyZW5jZVRhcmdldHMoXG4gIHJvb3Q6IEpzb25TY2hlbWEsXG4gIHJlZmVyZW5jZXM6IEFycmF5PHsgdmFsdWU6IHN0cmluZzsgcGF0aDogc3RyaW5nIH0+LFxuKTogdm9pZCB7XG4gIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHJlZmVyZW5jZXMpIHtcbiAgICBjb25zdCB0b2tlbnMgPSBwYXJzZUxvY2FsSnNvblBvaW50ZXIocmVmZXJlbmNlLnZhbHVlLCByZWZlcmVuY2UucGF0aCk7XG5cbiAgICBpZiAoIWlzRGVmaW5pdGlvblJvb3RQb2ludGVyKHRva2VucykpIHtcbiAgICAgIHRocm93IG5ldyBTdHJpY3RpZmllckVycm9yKFxuICAgICAgICBcIiRyZWYgdGFyZ2V0IG11c3QgYmUgdGhlIGRvY3VtZW50IHJvb3Qgb3IgYSBkZWZpbml0aW9uIHJvb3RcIixcbiAgICAgICAgcmVmZXJlbmNlLnBhdGgsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJlc29sdmVEZWZpbml0aW9uUm9vdChyb290LCB0b2tlbnMsIHJlZmVyZW5jZS5wYXRoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0RlZmluaXRpb25Sb290UG9pbnRlcih0b2tlbnM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIGlmICh0b2tlbnMubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcblxuICBpZiAodG9rZW5zLmxlbmd0aCAlIDIgIT09IDApIHJldHVybiBmYWxzZTtcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdG9rZW5zLmxlbmd0aDsgaW5kZXggKz0gMikge1xuICAgIGlmICh0b2tlbnNbaW5kZXhdICE9PSBcIiRkZWZzXCIgJiYgdG9rZW5zW2luZGV4XSAhPT0gXCJkZWZpbml0aW9uc1wiKSByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcGFyc2VMb2NhbEpzb25Qb2ludGVyKHJlZmVyZW5jZTogc3RyaW5nLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGlmIChyZWZlcmVuY2UgPT09IFwiI1wiKSByZXR1cm4gW107XG5cbiAgaWYgKCFyZWZlcmVuY2Uuc3RhcnRzV2l0aChcIiMvXCIpKSB7XG4gICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXG4gICAgICBcIm9ubHkgbG9jYWwgcm9vdC1yZWxhdGl2ZSBKU09OIFBvaW50ZXIgJHJlZiB2YWx1ZXMgYXJlIHN1cHBvcnRlZFwiLFxuICAgICAgcGF0aCxcbiAgICApO1xuICB9XG5cbiAgbGV0IGZyYWdtZW50OiBzdHJpbmc7XG5cbiAgdHJ5IHtcbiAgICBmcmFnbWVudCA9IGRlY29kZVVSSUNvbXBvbmVudChyZWZlcmVuY2Uuc2xpY2UoMSkpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgU3RyaWN0aWZpZXJFcnJvcihcIiRyZWYgY29udGFpbnMgaW52YWxpZCBwZXJjZW50IGVuY29kaW5nXCIsIHBhdGgpO1xuICB9XG5cbiAgaWYgKCFmcmFnbWVudC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgIHRocm93IG5ldyBTdHJpY3RpZmllckVycm9yKFxuICAgICAgXCJvbmx5IGxvY2FsIHJvb3QtcmVsYXRpdmUgSlNPTiBQb2ludGVyICRyZWYgdmFsdWVzIGFyZSBzdXBwb3J0ZWRcIixcbiAgICAgIHBhdGgsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBmcmFnbWVudFxuICAgIC5zbGljZSgxKVxuICAgIC5zcGxpdChcIi9cIilcbiAgICAubWFwKCh0b2tlbikgPT4gZGVjb2RlSnNvblBvaW50ZXJUb2tlbih0b2tlbiwgcGF0aCkpO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRGVmaW5pdGlvblJvb3Qocm9vdDogSnNvblNjaGVtYSwgdG9rZW5zOiBzdHJpbmdbXSwgcGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGxldCBjdXJyZW50ID0gcm9vdDtcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdG9rZW5zLmxlbmd0aDsgaW5kZXggKz0gMikge1xuICAgIGNvbnN0IGtleXdvcmQgPSB0b2tlbnNbaW5kZXhdITtcbiAgICBjb25zdCBuYW1lID0gdG9rZW5zW2luZGV4ICsgMV0hO1xuICAgIGNvbnN0IGRlZmluaXRpb25zID0gb3duVmFsdWUoY3VycmVudCwga2V5d29yZCk7XG5cbiAgICBpZiAoIWlzU2NoZW1hT2JqZWN0KGRlZmluaXRpb25zKSB8fCAhT2JqZWN0Lmhhc093bihkZWZpbml0aW9ucywgbmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBTdHJpY3RpZmllckVycm9yKFwiJHJlZiBkb2VzIG5vdCByZXNvbHZlIGluc2lkZSB0aGUgY2FsbGVyIHNjaGVtYVwiLCBwYXRoKTtcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXQgPSBkZWZpbml0aW9uc1tuYW1lXTtcblxuICAgIGlmICghaXNTY2hlbWFPYmplY3QodGFyZ2V0KSkge1xuICAgICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXCIkcmVmIHRhcmdldCBtdXN0IGJlIGFuIG9iamVjdCBzY2hlbWFcIiwgcGF0aCk7XG4gICAgfVxuXG4gICAgY3VycmVudCA9IHRhcmdldDtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWNvZGVKc29uUG9pbnRlclRva2VuKHJhd1Rva2VuOiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCB0b2tlbiA9IFwiXCI7XG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHJhd1Rva2VuLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIGNvbnN0IGNoYXJhY3RlciA9IHJhd1Rva2VuW2luZGV4XSE7XG5cbiAgICBpZiAoY2hhcmFjdGVyICE9PSBcIn5cIikge1xuICAgICAgdG9rZW4gKz0gY2hhcmFjdGVyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgZXNjYXBlZCA9IHJhd1Rva2VuW2luZGV4ICsgMV07XG5cbiAgICBpZiAoZXNjYXBlZCA9PT0gXCIwXCIpIHtcbiAgICAgIHRva2VuICs9IFwiflwiO1xuICAgIH0gZWxzZSBpZiAoZXNjYXBlZCA9PT0gXCIxXCIpIHtcbiAgICAgIHRva2VuICs9IFwiL1wiO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgU3RyaWN0aWZpZXJFcnJvcihcIiRyZWYgY29udGFpbnMgYW4gaW52YWxpZCBKU09OIFBvaW50ZXIgZXNjYXBlXCIsIHBhdGgpO1xuICAgIH1cblxuICAgIGluZGV4ICs9IDE7XG4gIH1cblxuICByZXR1cm4gdG9rZW47XG59XG5cbmZ1bmN0aW9uIHN0cmljdGlmeU5vZGUobm9kZTogSnNvblNjaGVtYSwgcGF0aDogc3RyaW5nLCBwcm92aWRlcj86IHN0cmluZyk6IEpzb25TY2hlbWEge1xuICBjb25zdCBkaWFsZWN0TmV1dHJhbE5vZGUgPSBwcm92aWRlciA9PT0gXCJvcGVuYWlcIiA/IG9taXRLZXlzKG5vZGUsIFtcIiRzY2hlbWFcIl0pIDogbm9kZTtcbiAgbGV0IHJlc3VsdCA9IHN0cmljdGlmeVNjaGVtYU1hcHMoZGlhbGVjdE5ldXRyYWxOb2RlLCBwYXRoLCBwcm92aWRlcik7XG4gIGNvbnN0IHR5cGUgPSBvd25WYWx1ZShyZXN1bHQsIFwidHlwZVwiKTtcblxuICBpZiAodHlwZSA9PT0gXCJvYmplY3RcIiB8fCBPYmplY3QuaGFzT3duKHJlc3VsdCwgXCJwcm9wZXJ0aWVzXCIpKSB7XG4gICAgcmVzdWx0ID0gc3RyaWN0aWZ5T2JqZWN0KHJlc3VsdCwgcGF0aCwgcHJvdmlkZXIpO1xuICB9XG5cbiAgaWYgKHR5cGUgPT09IFwiYXJyYXlcIiB8fCBPYmplY3QuaGFzT3duKHJlc3VsdCwgXCJpdGVtc1wiKSB8fCBPYmplY3QuaGFzT3duKHJlc3VsdCwgXCJwcmVmaXhJdGVtc1wiKSkge1xuICAgIHJlc3VsdCA9IHN0cmljdGlmeUFycmF5KHJlc3VsdCwgcGF0aCwgcHJvdmlkZXIpO1xuICB9XG5cbiAgcmV0dXJuIHN0cmljdGlmeVNjaGVtYUFycmF5cyhyZXN1bHQsIHBhdGgsIHByb3ZpZGVyKTtcbn1cblxuLyoqIEJvb2xlYW4gYW5kIG90aGVyIG5vbi1vYmplY3Qgc3Vic2NoZW1hcyBwYXNzIHRocm91Z2ggdW5jaGFuZ2VkLiAqL1xuZnVuY3Rpb24gc3RyaWN0aWZ5U3Vic2NoZW1hKHNjaGVtYTogSnNvblZhbHVlLCBwYXRoOiBzdHJpbmcsIHByb3ZpZGVyPzogc3RyaW5nKTogSnNvblZhbHVlIHtcbiAgcmV0dXJuIGlzU2NoZW1hT2JqZWN0KHNjaGVtYSkgPyBzdHJpY3RpZnlOb2RlKHNjaGVtYSwgcGF0aCwgcHJvdmlkZXIpIDogc2NoZW1hO1xufVxuXG4vLyDsnqzsnpHshLEg7Yyo7Iqk64qUIOygleydmCDrp7Xrp4wg7J6s6reA7ZWc64ukLiBwcm9wZXJ0aWVzIOuKlCBzdHJpY3RpZnlPYmplY3Qg6rCAIOuzhOuPhOuhnCDsspjrpqztlZjrr4DroZxcbi8vIOqzteycoCDsnITsuZgg66qp66GdKFNDSEVNQV9NQVBfS0VZV09SRFMp6rO8IOydmOuPhOyggeycvOuhnCDrspTsnITqsIAg64uk66W064ukLlxuY29uc3QgREVGSU5JVElPTl9NQVBfS0VZV09SRFMgPSBbXCIkZGVmc1wiLCBcImRlZmluaXRpb25zXCJdIGFzIGNvbnN0O1xuXG5mdW5jdGlvbiBzdHJpY3RpZnlTY2hlbWFNYXBzKG5vZGU6IEpzb25TY2hlbWEsIHBhdGg6IHN0cmluZywgcHJvdmlkZXI/OiBzdHJpbmcpOiBKc29uU2NoZW1hIHtcbiAgY29uc3QgcmVzdWx0ID0geyAuLi5ub2RlIH07XG5cbiAgZm9yIChjb25zdCBrZXl3b3JkIG9mIERFRklOSVRJT05fTUFQX0tFWVdPUkRTKSB7XG4gICAgY29uc3Qgc2NoZW1hcyA9IG93blZhbHVlKG5vZGUsIGtleXdvcmQpO1xuXG4gICAgaWYgKCFpc1NjaGVtYU9iamVjdChzY2hlbWFzKSkgY29udGludWU7XG5cbiAgICByZXN1bHRba2V5d29yZF0gPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhzY2hlbWFzKS5tYXAoKFtuYW1lLCBzY2hlbWFdKSA9PiBbXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHNjaGVtYSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBzY2hlbWFcbiAgICAgICAgICA6IHN0cmljdGlmeVN1YnNjaGVtYShzY2hlbWEsIGAke3BhdGh9LiR7a2V5d29yZH0uJHtuYW1lfWAsIHByb3ZpZGVyKSxcbiAgICAgIF0pLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vLyBwcmVmaXhJdGVtcyDripQgc3RyaWN0aWZ5QXJyYXkg7J2YIHR1cGxlIOqyveuhnOqwgCDri6Tro6jrr4DroZwg7Jes6riw7ISc64qUIOyhsO2VqSBrZXl3b3JkIOunjCDsnqzqt4DtlZzri6QuXG5jb25zdCBDT01CSU5BVE9SX0tFWVdPUkRTID0gW1wiYW55T2ZcIiwgXCJvbmVPZlwiLCBcImFsbE9mXCJdIGFzIGNvbnN0O1xuXG5mdW5jdGlvbiBzdHJpY3RpZnlTY2hlbWFBcnJheXMobm9kZTogSnNvblNjaGVtYSwgcGF0aDogc3RyaW5nLCBwcm92aWRlcj86IHN0cmluZyk6IEpzb25TY2hlbWEge1xuICBjb25zdCByZXN1bHQgPSB7IC4uLm5vZGUgfTtcblxuICBmb3IgKGNvbnN0IGtleXdvcmQgb2YgQ09NQklOQVRPUl9LRVlXT1JEUykge1xuICAgIGNvbnN0IHNjaGVtYXMgPSBvd25WYWx1ZShub2RlLCBrZXl3b3JkKTtcblxuICAgIGlmICghc2NoZW1hcykgY29udGludWU7XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2NoZW1hcykpIHtcbiAgICAgIHRocm93IG5ldyBTdHJpY3RpZmllckVycm9yKGAke2tleXdvcmR9IG11c3QgYmUgYW4gYXJyYXkgb2Ygc2NoZW1hc2AsIGAke3BhdGh9LiR7a2V5d29yZH1gKTtcbiAgICB9XG5cbiAgICByZXN1bHRba2V5d29yZF0gPSBzY2hlbWFzLm1hcCgoc2NoZW1hLCBpbmRleCkgPT5cbiAgICAgIHN0cmljdGlmeVN1YnNjaGVtYShzY2hlbWEsIGAke3BhdGh9LiR7a2V5d29yZH1bJHtpbmRleH1dYCwgcHJvdmlkZXIpLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBzdHJpY3RpZnlPYmplY3Qobm9kZTogSnNvblNjaGVtYSwgcGF0aDogc3RyaW5nLCBwcm92aWRlcj86IHN0cmluZyk6IEpzb25TY2hlbWEge1xuICBjb25zdCBwcm9wZXJ0aWVzID0gb3duVmFsdWUobm9kZSwgXCJwcm9wZXJ0aWVzXCIpO1xuXG4gIGlmICghcHJvcGVydGllcykge1xuICAgIHJldHVybiB7IC4uLm5vZGUsIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZSB9O1xuICB9XG5cbiAgaWYgKCFpc1NjaGVtYU9iamVjdChwcm9wZXJ0aWVzKSkge1xuICAgIHRocm93IG5ldyBTdHJpY3RpZmllckVycm9yKFwicHJvcGVydGllcyBtdXN0IGJlIGFuIG9iamVjdFwiLCBgJHtwYXRofS5wcm9wZXJ0aWVzYCk7XG4gIH1cblxuICBjb25zdCByZXF1aXJlZCA9IG93blZhbHVlKG5vZGUsIFwicmVxdWlyZWRcIik7XG5cbiAgY29uc3QgZXhpc3RpbmdSZXF1aXJlZCA9IG5ldyBTZXQoXG4gICAgQXJyYXkuaXNBcnJheShyZXF1aXJlZCkgPyByZXF1aXJlZC5mbGF0TWFwKChrZXkpID0+IHouc3RyaW5nKCkuc2FmZVBhcnNlKGtleSkuZGF0YSA/PyBbXSkgOiBbXSxcbiAgKTtcblxuICBjb25zdCBhbGxLZXlzID0gT2JqZWN0LmtleXMocHJvcGVydGllcyk7XG5cbiAgLy8gT2JqZWN0LmZyb21FbnRyaWVzIGRlZmluZXMgb3duIGRhdGEgcHJvcGVydGllcywgc28gbmFtZXMgc3VjaCBhcyBcIl9fcHJvdG9fX1wiIHN0YXkgb3JkaW5hcnkga2V5cy5cbiAgY29uc3Qgc3RyaWN0UHJvcHMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgYWxsS2V5cy5mbGF0TWFwKChrZXkpID0+IHtcbiAgICAgIGNvbnN0IHByb3AgPSBwcm9wZXJ0aWVzW2tleV07XG5cbiAgICAgIGlmIChwcm9wID09PSB1bmRlZmluZWQpIHJldHVybiBbXTtcbiAgICAgIGNvbnN0IHN0cmljdFByb3AgPSBzdHJpY3RpZnlTdWJzY2hlbWEocHJvcCwgYCR7cGF0aH0uJHtrZXl9YCwgcHJvdmlkZXIpO1xuXG4gICAgICByZXR1cm4gW1trZXksIGV4aXN0aW5nUmVxdWlyZWQuaGFzKGtleSkgPyBzdHJpY3RQcm9wIDogbWFrZU51bGxhYmxlKHN0cmljdFByb3ApXV07XG4gICAgfSksXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5ub2RlLFxuICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgcHJvcGVydGllczogc3RyaWN0UHJvcHMsXG4gICAgcmVxdWlyZWQ6IGFsbEtleXMsXG4gICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICB9O1xufVxuXG5mdW5jdGlvbiB1bnJlYWNoYWJsZVR1cGxlVGFpbFNjaGVtYSgpOiBKc29uU2NoZW1hIHtcbiAgcmV0dXJuIHsgdHlwZTogXCJzdHJpbmdcIiB9O1xufVxuXG5mdW5jdGlvbiBzdHJpY3RpZnlBcnJheShub2RlOiBKc29uU2NoZW1hLCBwYXRoOiBzdHJpbmcsIHByb3ZpZGVyPzogc3RyaW5nKTogSnNvblNjaGVtYSB7XG4gIGlmIChcbiAgICAocHJvdmlkZXIgPT09IFwib3BlbmFpXCIgfHwgcHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCIpICYmXG4gICAgKEFycmF5LmlzQXJyYXkob3duVmFsdWUobm9kZSwgXCJpdGVtc1wiKSkgfHwgQXJyYXkuaXNBcnJheShvd25WYWx1ZShub2RlLCBcInByZWZpeEl0ZW1zXCIpKSlcbiAgKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVR1cGxlKG5vZGUsIHBhdGgsIHByb3ZpZGVyKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IHsgLi4ubm9kZSB9O1xuICBjb25zdCBpdGVtcyA9IG93blZhbHVlKG5vZGUsIFwiaXRlbXNcIik7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbXMpKSB7XG4gICAgcmVzdWx0Lml0ZW1zID0gaXRlbXMubWFwKChzY2hlbWEsIGluZGV4KSA9PlxuICAgICAgc3RyaWN0aWZ5U3Vic2NoZW1hKHNjaGVtYSwgYCR7cGF0aH0uaXRlbXNbJHtpbmRleH1dYCwgcHJvdmlkZXIpLFxuICAgICk7XG4gIH0gZWxzZSBpZiAoaXRlbXMgIT09IHVuZGVmaW5lZCkge1xuICAgIHJlc3VsdC5pdGVtcyA9IHN0cmljdGlmeVN1YnNjaGVtYShpdGVtcywgYCR7cGF0aH0uaXRlbXNgLCBwcm92aWRlcik7XG4gIH1cblxuICBjb25zdCBwcmVmaXhJdGVtcyA9IG93blZhbHVlKG5vZGUsIFwicHJlZml4SXRlbXNcIik7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkocHJlZml4SXRlbXMpKSB7XG4gICAgcmVzdWx0LnByZWZpeEl0ZW1zID0gcHJlZml4SXRlbXMubWFwKChzY2hlbWEsIGluZGV4KSA9PlxuICAgICAgc3RyaWN0aWZ5U3Vic2NoZW1hKHNjaGVtYSwgYCR7cGF0aH0ucHJlZml4SXRlbXNbJHtpbmRleH1dYCwgcHJvdmlkZXIpLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVUdXBsZShcbiAgbm9kZTogSnNvblNjaGVtYSxcbiAgcGF0aDogc3RyaW5nLFxuICBwcm92aWRlcjogXCJvcGVuYWlcIiB8IFwiYW50aHJvcGljXCIsXG4pOiBKc29uU2NoZW1hIHtcbiAgY29uc3QgaXRlbXMgPSBvd25WYWx1ZShub2RlLCBcIml0ZW1zXCIpO1xuICBjb25zdCBwcmVmaXhJdGVtcyA9IG93blZhbHVlKG5vZGUsIFwicHJlZml4SXRlbXNcIik7XG4gIGNvbnN0IGxlZ2FjeVR1cGxlID0gQXJyYXkuaXNBcnJheShpdGVtcyk7XG4gIGNvbnN0IHByZWZpeFR1cGxlID0gQXJyYXkuaXNBcnJheShwcmVmaXhJdGVtcyk7XG5cbiAgaWYgKGxlZ2FjeVR1cGxlICYmIHByZWZpeFR1cGxlKSB7XG4gICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXCJpdGVtcyBhbmQgcHJlZml4SXRlbXMgdHVwbGUgZm9ybXMgY2Fubm90IGJlIGNvbWJpbmVkXCIsIHBhdGgpO1xuICB9XG5cbiAgaWYgKHByZWZpeFR1cGxlICYmIE9iamVjdC5oYXNPd24obm9kZSwgXCJhZGRpdGlvbmFsSXRlbXNcIikpIHtcbiAgICB0aHJvdyBuZXcgU3RyaWN0aWZpZXJFcnJvcihcImFkZGl0aW9uYWxJdGVtcyBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCBwcmVmaXhJdGVtc1wiLCBwYXRoKTtcbiAgfVxuXG4gIGNvbnN0IHJhd1R1cGxlID0gbGVnYWN5VHVwbGUgPyBpdGVtcyA6IHByZWZpeFR1cGxlID8gcHJlZml4SXRlbXMgOiBbXTtcbiAgY29uc3QgdHVwbGVQYXRoID0gbGVnYWN5VHVwbGUgPyBgJHtwYXRofS5pdGVtc2AgOiBgJHtwYXRofS5wcmVmaXhJdGVtc2A7XG5cbiAgY29uc3QgdHVwbGUgPSByYXdUdXBsZS5tYXAoKHNjaGVtYSwgaW5kZXgpID0+IHtcbiAgICBpZiAoIWlzU2NoZW1hT2JqZWN0KHNjaGVtYSkpIHtcbiAgICAgIHRocm93IG5ldyBTdHJpY3RpZmllckVycm9yKFxuICAgICAgICBcImJvb2xlYW4gYW5kIG5vbi1vYmplY3QgdHVwbGUgbWVtYmVyIHNjaGVtYXMgYXJlIG5vdCBzdXBwb3J0ZWRcIixcbiAgICAgICAgYCR7dHVwbGVQYXRofVske2luZGV4fV1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBtZW1iZXJQYXRoID0gYCR7dHVwbGVQYXRofVske2luZGV4fV1gO1xuICAgIGNvbnN0IG1lbWJlciA9IHN0cmljdGlmeU5vZGUoc2NoZW1hLCBtZW1iZXJQYXRoLCBwcm92aWRlcik7XG5cbiAgICBpZiAoIWhhc1Byb3ZpZGVyU2NoZW1hRW50cnlQb2ludChtZW1iZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgU3RyaWN0aWZpZXJFcnJvcihcbiAgICAgICAgXCJ0dXBsZSBtZW1iZXIgbXVzdCBkZWZpbmUgYSBwcm92aWRlci1yZXByZXNlbnRhYmxlIHNjaGVtYVwiLFxuICAgICAgICBtZW1iZXJQYXRoLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWVtYmVyO1xuICB9KTtcblxuICBjb25zdCByYXdUYWlsID0gbGVnYWN5VHVwbGUgPyBvd25WYWx1ZShub2RlLCBcImFkZGl0aW9uYWxJdGVtc1wiKSA6IGl0ZW1zO1xuXG4gIGlmIChyYXdUYWlsID09PSB0cnVlKSB7XG4gICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXCJhbiB1bnJlc3RyaWN0ZWQgdHVwbGUgcmVzdCBpcyBub3Qgc3VwcG9ydGVkXCIsIHBhdGgpO1xuICB9XG5cbiAgaWYgKHJhd1RhaWwgIT09IHVuZGVmaW5lZCAmJiByYXdUYWlsICE9PSBmYWxzZSAmJiAhaXNTY2hlbWFPYmplY3QocmF3VGFpbCkpIHtcbiAgICB0aHJvdyBuZXcgU3RyaWN0aWZpZXJFcnJvcihcInR1cGxlIHJlc3QgbXVzdCBiZSBhbiBvYmplY3Qgc2NoZW1hIG9yIGZhbHNlXCIsIHBhdGgpO1xuICB9XG5cbiAgY29uc3QgdGFpbCA9IGlzU2NoZW1hT2JqZWN0KHJhd1RhaWwpXG4gICAgPyBzdHJpY3RpZnlOb2RlKHJhd1RhaWwsIGxlZ2FjeVR1cGxlID8gYCR7cGF0aH0uYWRkaXRpb25hbEl0ZW1zYCA6IGAke3BhdGh9Lml0ZW1zYCwgcHJvdmlkZXIpXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgaWYgKHRhaWwgIT09IHVuZGVmaW5lZCAmJiAhaGFzUHJvdmlkZXJTY2hlbWFFbnRyeVBvaW50KHRhaWwpKSB7XG4gICAgdGhyb3cgbmV3IFN0cmljdGlmaWVyRXJyb3IoXCJhbiB1bnJlc3RyaWN0ZWQgdHVwbGUgcmVzdCBpcyBub3Qgc3VwcG9ydGVkXCIsIHBhdGgpO1xuICB9XG5cbiAgY29uc3QgdGFpbE1vZGUgPSB0YWlsICE9PSB1bmRlZmluZWQgPyBcInR5cGVkXCIgOiByYXdUYWlsID09PSBmYWxzZSA/IFwiY2xvc2VkXCIgOiBcImltcGxpY2l0XCI7XG4gIGNvbnN0IGJvdW5kcyA9IG5vcm1hbGl6ZVR1cGxlQm91bmRzKG5vZGUsIHR1cGxlLmxlbmd0aCwgdGFpbE1vZGUsIHBhdGgpO1xuXG4gIGNvbnN0IHJlc3VsdCA9IG9taXRLZXlzKG5vZGUsIFtcbiAgICBcIml0ZW1zXCIsXG4gICAgXCJwcmVmaXhJdGVtc1wiLFxuICAgIFwiYWRkaXRpb25hbEl0ZW1zXCIsXG4gICAgXCJtaW5JdGVtc1wiLFxuICAgIFwibWF4SXRlbXNcIixcbiAgXSk7XG5cbiAgLy8gQW50aHJvcGljIOydgCBhc3NlcnROb3JtYWxpemF0aW9uQ29tcGF0aWJpbGl0eSDqsIAg67mE7Ja0IOyeiOyngCDslYrsnYAgdHVwbGUg7J2EIOydtOuvuCDqsbDrtoDtlojsnLzrr4DroZxcbiAgLy8g7Jes6riwIOuPhOuLrO2VmOuKlCB0dXBsZSDsnYAg67mIIHR1cGxlIOu/kOydtOqzoCwg6re4IOqyveyasCBwcmVmaXhJdGVtcyDripQg7IOd656165Cc64ukIOKAlFxuICAvLyBwcm92aWRlciDrtoTquLAg7JeG7J20IO2VnCDtmJXtg5zroZwg65GQIHByb3ZpZGVyIOuqqOuRkOulvCDtkZztmITtlZzri6QuXG4gIGlmICh0dXBsZS5sZW5ndGggPiAwKSByZXN1bHQucHJlZml4SXRlbXMgPSB0dXBsZTtcbiAgcmVzdWx0Lml0ZW1zID0gdGFpbCA/PyB1bnJlYWNoYWJsZVR1cGxlVGFpbFNjaGVtYSgpO1xuICByZXN1bHQubWluSXRlbXMgPSBib3VuZHMubWluSXRlbXM7XG5cbiAgaWYgKGJvdW5kcy5tYXhJdGVtcyAhPT0gdW5kZWZpbmVkKSByZXN1bHQubWF4SXRlbXMgPSBib3VuZHMubWF4SXRlbXM7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuaW50ZXJmYWNlIFR1cGxlQm91bmRzIHtcbiAgbWluSXRlbXM6IG51bWJlcjtcbiAgbWF4SXRlbXM/OiBudW1iZXI7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVR1cGxlQm91bmRzKFxuICBub2RlOiBKc29uU2NoZW1hLFxuICB0dXBsZUxlbmd0aDogbnVtYmVyLFxuICB0YWlsTW9kZTogXCJ0eXBlZFwiIHwgXCJjbG9zZWRcIiB8IFwiaW1wbGljaXRcIixcbiAgcGF0aDogc3RyaW5nLFxuKTogVHVwbGVCb3VuZHMge1xuICBjb25zdCBjYWxsZXJNaW5JdGVtcyA9IGludGVnZXJCb3VuZChvd25WYWx1ZShub2RlLCBcIm1pbkl0ZW1zXCIpLCBcIm1pbkl0ZW1zXCIsIHBhdGgpO1xuICBjb25zdCBjYWxsZXJNYXhJdGVtcyA9IGludGVnZXJCb3VuZChvd25WYWx1ZShub2RlLCBcIm1heEl0ZW1zXCIpLCBcIm1heEl0ZW1zXCIsIHBhdGgpO1xuXG4gIGlmICh0YWlsTW9kZSA9PT0gXCJpbXBsaWNpdFwiICYmIGNhbGxlck1heEl0ZW1zICE9PSB1bmRlZmluZWQgJiYgY2FsbGVyTWF4SXRlbXMgPiB0dXBsZUxlbmd0aCkge1xuICAgIHRocm93IG5ldyBTdHJpY3RpZmllckVycm9yKFxuICAgICAgXCJpbXBsaWNpdCB0dXBsZSByZXN0IGNhbm5vdCBiZSByZXByZXNlbnRlZCB3aGVuIG1heEl0ZW1zIGV4Y2VlZHMgdGhlIHR1cGxlIGxlbmd0aFwiLFxuICAgICAgcGF0aCxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgbWluSXRlbXMgPSBjYWxsZXJNaW5JdGVtcyA/PyAoY2FsbGVyTWF4SXRlbXMgPT09IHVuZGVmaW5lZCA/IHR1cGxlTGVuZ3RoIDogMCk7XG5cbiAgY29uc3QgbWF4SXRlbXMgPVxuICAgIHRhaWxNb2RlID09PSBcInR5cGVkXCIgPyBjYWxsZXJNYXhJdGVtcyA6IE1hdGgubWluKGNhbGxlck1heEl0ZW1zID8/IHR1cGxlTGVuZ3RoLCB0dXBsZUxlbmd0aCk7XG5cbiAgaWYgKG1heEl0ZW1zICE9PSB1bmRlZmluZWQgJiYgbWluSXRlbXMgPiBtYXhJdGVtcykge1xuICAgIHRocm93IG5ldyBTdHJpY3RpZmllckVycm9yKFwidHVwbGUgbWluSXRlbXMgY2Fubm90IGV4Y2VlZCBtYXhJdGVtc1wiLCBwYXRoKTtcbiAgfVxuXG4gIGNvbnN0IGJvdW5kczogVHVwbGVCb3VuZHMgPSB7IG1pbkl0ZW1zIH07XG5cbiAgaWYgKG1heEl0ZW1zICE9PSB1bmRlZmluZWQpIGJvdW5kcy5tYXhJdGVtcyA9IG1heEl0ZW1zO1xuXG4gIHJldHVybiBib3VuZHM7XG59XG5cbmNvbnN0IG5vbk5lZ2F0aXZlU2FmZUludGVnZXIgPSB6XG4gIC5udW1iZXIoKVxuICAucmVmaW5lKCh2YWx1ZSkgPT4gTnVtYmVyLmlzU2FmZUludGVnZXIodmFsdWUpICYmIHZhbHVlID49IDApO1xuXG5mdW5jdGlvbiBpbnRlZ2VyQm91bmQoXG4gIHZhbHVlOiBKc29uVmFsdWUgfCB1bmRlZmluZWQsXG4gIGtleXdvcmQ6IHN0cmluZyxcbiAgcGF0aDogc3RyaW5nLFxuKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGJvdW5kID0gbm9uTmVnYXRpdmVTYWZlSW50ZWdlci5zYWZlUGFyc2UodmFsdWUpO1xuXG4gIGlmICghYm91bmQuc3VjY2Vzcykge1xuICAgIHRocm93IG5ldyBTdHJpY3RpZmllckVycm9yKGAke2tleXdvcmR9IG11c3QgYmUgYSBub24tbmVnYXRpdmUgc2FmZSBpbnRlZ2VyYCwgcGF0aCk7XG4gIH1cblxuICByZXR1cm4gYm91bmQuZGF0YTtcbn1cblxuZnVuY3Rpb24gaXNTY2hlbWFPYmplY3QodmFsdWU6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCk6IHZhbHVlIGlzIEpzb25TY2hlbWEge1xuICByZXR1cm4gaXNKc29uT2JqZWN0KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gb3duVmFsdWUoc2NoZW1hOiBKc29uU2NoZW1hLCBrZXl3b3JkOiBzdHJpbmcpOiBKc29uVmFsdWUgfCB1bmRlZmluZWQge1xuICByZXR1cm4gT2JqZWN0Lmhhc093bihzY2hlbWEsIGtleXdvcmQpID8gc2NoZW1hW2tleXdvcmRdIDogdW5kZWZpbmVkO1xufVxuXG5jb25zdCBQUk9WSURFUl9TQ0hFTUFfRU5UUllfUE9JTlRfS0VZV09SRFMgPSBuZXcgU2V0KFtcbiAgXCJ0eXBlXCIsXG4gIFwiJHJlZlwiLFxuICBcInByb3BlcnRpZXNcIixcbiAgXCJhbnlPZlwiLFxuICBcIm9uZU9mXCIsXG4gIFwiYWxsT2ZcIixcbl0pO1xuXG5mdW5jdGlvbiBoYXNQcm92aWRlclNjaGVtYUVudHJ5UG9pbnQoc2NoZW1hOiBKc29uU2NoZW1hKTogYm9vbGVhbiB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhzY2hlbWEpLnNvbWUoKGtleSkgPT4gUFJPVklERVJfU0NIRU1BX0VOVFJZX1BPSU5UX0tFWVdPUkRTLmhhcyhrZXkpKTtcbn1cblxuZnVuY3Rpb24gb21pdEtleXMobm9kZTogSnNvblNjaGVtYSwga2V5czogcmVhZG9ubHkgc3RyaW5nW10pOiBKc29uU2NoZW1hIHtcbiAgY29uc3Qgb21pdHRlZCA9IG5ldyBTZXQoa2V5cyk7XG5cbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhub2RlKS5maWx0ZXIoKFtrZXldKSA9PiAhb21pdHRlZC5oYXMoa2V5KSkpO1xufVxuXG5mdW5jdGlvbiBoYXNOdWxsVmFyaWFudCh2YXJpYW50czogSnNvblZhbHVlW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIHZhcmlhbnRzLnNvbWUoXG4gICAgKHZhcmlhbnQpID0+IGlzU2NoZW1hT2JqZWN0KHZhcmlhbnQpICYmIG93blZhbHVlKHZhcmlhbnQsIFwidHlwZVwiKSA9PT0gXCJudWxsXCIsXG4gICk7XG59XG5cbmZ1bmN0aW9uIG1ha2VOdWxsYWJsZShzY2hlbWE6IEpzb25WYWx1ZSk6IEpzb25WYWx1ZSB7XG4gIGNvbnN0IG51bGxTY2hlbWE6IEpzb25TY2hlbWEgPSB7IHR5cGU6IFwibnVsbFwiIH07XG5cbiAgaWYgKCFpc1NjaGVtYU9iamVjdChzY2hlbWEpKSByZXR1cm4geyBhbnlPZjogW3NjaGVtYSwgbnVsbFNjaGVtYV0gfTtcblxuICBpZiAob3duVmFsdWUoc2NoZW1hLCBcInR5cGVcIikgPT09IFwibnVsbFwiKSByZXR1cm4gc2NoZW1hO1xuXG4gIGNvbnN0IGFueU9mID0gb3duVmFsdWUoc2NoZW1hLCBcImFueU9mXCIpO1xuXG4gIGlmIChhbnlPZikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShhbnlPZikpIHRocm93IG5ldyBTdHJpY3RpZmllckVycm9yKFwiYW55T2YgbXVzdCBiZSBhbiBhcnJheSBvZiBzY2hlbWFzXCIsIFwiJFwiKTtcblxuICAgIHJldHVybiBoYXNOdWxsVmFyaWFudChhbnlPZikgPyBzY2hlbWEgOiB7IGFueU9mOiBbLi4uYW55T2YsIG51bGxTY2hlbWFdIH07XG4gIH1cblxuICBjb25zdCBvbmVPZiA9IG93blZhbHVlKHNjaGVtYSwgXCJvbmVPZlwiKTtcblxuICBpZiAob25lT2YpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkob25lT2YpKSB0aHJvdyBuZXcgU3RyaWN0aWZpZXJFcnJvcihcIm9uZU9mIG11c3QgYmUgYW4gYXJyYXkgb2Ygc2NoZW1hc1wiLCBcIiRcIik7XG5cbiAgICByZXR1cm4gaGFzTnVsbFZhcmlhbnQob25lT2YpID8gc2NoZW1hIDogeyBvbmVPZjogWy4uLm9uZU9mLCBudWxsU2NoZW1hXSB9O1xuICB9XG5cbiAgcmV0dXJuIHsgYW55T2Y6IFtzY2hlbWEsIG51bGxTY2hlbWFdIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFnQ0EsSUFBYSxtQkFBYixjQUFzQyxNQUFNO0NBR2pDO0NBRlQsWUFDRSxTQUNBLE1BQ0E7RUFDQSxNQUFNLGdCQUFnQixRQUFRLE9BQU8sS0FBSyxFQUFFO0VBRnJDLEtBQUEsT0FBQTtFQUdQLEtBQUssT0FBTztDQUNkO0FBQ0Y7QUFFQSxTQUFnQixVQUFVLE9BQTJCLFVBQThCLENBQUMsR0FBZTtDQUdqRyxNQUFNLGFBQXdCLEtBQUssTUFBTSxLQUFLLFVBQVUsS0FBSyxDQUFDO0NBRTlELElBQUksQ0FBQyxlQUFlLFVBQVUsR0FBRyxNQUFNLElBQUksaUJBQWlCLDRCQUE0QixHQUFHO0NBQzNGLE1BQU0sU0FBUztDQUVmLElBQUksUUFBUSxhQUFhLFlBQVksUUFBUSxhQUFhLGFBQ3hELGlDQUFpQyxRQUFRLFFBQVEsUUFBUTtDQUczRCxNQUFNLFNBQVMsY0FBYyxRQUFRLEtBQUssUUFBUSxRQUFRO0NBRTFELElBQUksUUFBUSxhQUFhLFlBQVksUUFBUSxhQUFhLGFBQ3hELGlDQUFpQyxRQUFRLFFBQVEsUUFBUTtDQUczRCxPQUFPO0FBQ1Q7Ozs7Ozs7O0FBU0EsTUFBTSw2Q0FBNkIsSUFBSSxJQUFZO0NBQ2pEO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtBQUNGLENBQUM7QUFFRCxTQUFTLGdCQUFnQixVQUF3RTtDQUMvRixPQUFPLFNBQVMsS0FBSyxZQUFZLENBQUMsU0FBUyxDQUFDLDJCQUEyQixJQUFJLE9BQU8sQ0FBQyxDQUFVO0FBQy9GO0FBRUEsTUFBTSwyQkFBMkIsZ0JBQWdCLG1CQUFtQjtBQUNwRSxNQUFNLDZCQUE2QixnQkFBZ0IscUJBQXFCO0FBR3hFLE1BQU0sOEJBQThCLGdCQUNsQyx1QkFBdUIsUUFBUSxZQUFZLFlBQVksV0FBVyxZQUFZLGlCQUFpQixD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
@@ -1,12 +1,13 @@
1
+ import { SD } from "../../../i18n/sd.generated.js";
1
2
  import { BadRequestException } from "sonamu";
2
3
  //#region src/utils/providers/common/thinking.ts
3
4
  var ThinkingValidationError = class extends BadRequestException {
4
5
  constructor(message) {
5
- super(message);
6
+ super(SD("error.detail")(message));
6
7
  this.name = "ThinkingValidationError";
7
8
  }
8
9
  };
9
10
  //#endregion
10
11
  export { ThinkingValidationError };
11
12
 
12
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhpbmtpbmcuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vdGhpbmtpbmcudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFkUmVxdWVzdEV4Y2VwdGlvbiB9IGZyb20gXCJzb25hbXVcIjtcblxuaW1wb3J0IHsgdHlwZSBMb2NhbGl6ZWRTdHJpbmcgfSBmcm9tIFwiLi4vLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcblxuZXhwb3J0IGNsYXNzIFRoaW5raW5nVmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgQmFkUmVxdWVzdEV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UgYXMgTG9jYWxpemVkU3RyaW5nKTtcbiAgICB0aGlzLm5hbWUgPSBcIlRoaW5raW5nVmFsaWRhdGlvbkVycm9yXCI7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7QUFJQSxJQUFhLDBCQUFiLGNBQTZDLG9CQUFvQjtDQUMvRCxZQUFZLFNBQWlCO0VBQzNCLE1BQU0sT0FBMEI7RUFDaEMsS0FBSyxPQUFPO0NBQ2Q7QUFDRiJ9
13
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhpbmtpbmcuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vdGhpbmtpbmcudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFkUmVxdWVzdEV4Y2VwdGlvbiB9IGZyb20gXCJzb25hbXVcIjtcblxuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi4vLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcblxuZXhwb3J0IGNsYXNzIFRoaW5raW5nVmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgQmFkUmVxdWVzdEV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKFNEKFwiZXJyb3IuZGV0YWlsXCIpKG1lc3NhZ2UpKTtcbiAgICB0aGlzLm5hbWUgPSBcIlRoaW5raW5nVmFsaWRhdGlvbkVycm9yXCI7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7O0FBSUEsSUFBYSwwQkFBYixjQUE2QyxvQkFBb0I7Q0FDL0QsWUFBWSxTQUFpQjtFQUMzQixNQUFNLEdBQUcsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDO0VBQ2pDLEtBQUssT0FBTztDQUNkO0FBQ0YifQ==
@@ -21,4 +21,4 @@ function createTtftTracker(now = Date.now) {
21
21
  //#endregion
22
22
  export { createTtftTracker };
23
23
 
24
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHRmdC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi90dGZ0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUdGZ0VHJhY2tlcihub3c6ICgpID0+IG51bWJlciA9IERhdGUubm93KToge1xuICBtYXJrU3RhcnQ6ICgpID0+IHZvaWQ7XG4gIHJlY29yZEZpcnN0RGVsdGE6ICgpID0+IHZvaWQ7XG4gIHZhbHVlOiAoKSA9PiBudW1iZXIgfCBudWxsO1xuICB3cmFwRGVsdGE6IChvbkRlbHRhOiAodGV4dDogc3RyaW5nKSA9PiB2b2lkKSA9PiAodGV4dDogc3RyaW5nKSA9PiB2b2lkO1xufSB7XG4gIGxldCBzdGFydGVkQXQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBsZXQgdHRmdE1zOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBjb25zdCByZWNvcmRGaXJzdERlbHRhID0gKCkgPT4ge1xuICAgIGlmIChzdGFydGVkQXQgPT09IG51bGwgfHwgdHRmdE1zICE9PSBudWxsKSByZXR1cm47XG4gICAgdHRmdE1zID0gTWF0aC5tYXgoMCwgbm93KCkgLSBzdGFydGVkQXQpO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgbWFya1N0YXJ0OiAoKSA9PiB7XG4gICAgICBzdGFydGVkQXQgPSBub3coKTtcbiAgICB9LFxuICAgIHJlY29yZEZpcnN0RGVsdGEsXG4gICAgdmFsdWU6ICgpID0+IHR0ZnRNcyxcbiAgICB3cmFwRGVsdGE6IChvbkRlbHRhKSA9PiAodGV4dCkgPT4ge1xuICAgICAgcmVjb3JkRmlyc3REZWx0YSgpO1xuICAgICAgb25EZWx0YSh0ZXh0KTtcbiAgICB9LFxuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUEsU0FBZ0Isa0JBQWtCLE1BQW9CLEtBQUssS0FLekQ7Q0FDQSxJQUFJLFlBQTJCO0NBQy9CLElBQUksU0FBd0I7Q0FFNUIsTUFBTSx5QkFBeUI7RUFDN0IsSUFBSSxjQUFjLFFBQVEsV0FBVyxNQUFNO0VBQzNDLFNBQVMsS0FBSyxJQUFJLEdBQUcsSUFBSSxJQUFJLFNBQVM7Q0FDeEM7Q0FFQSxPQUFPO0VBQ0wsaUJBQWlCO0dBQ2YsWUFBWSxJQUFJO0VBQ2xCO0VBQ0E7RUFDQSxhQUFhO0VBQ2IsWUFBWSxhQUFhLFNBQVM7R0FDaEMsaUJBQWlCO0dBQ2pCLFFBQVEsSUFBSTtFQUNkO0NBQ0Y7QUFDRiJ9
24
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHRmdC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi90dGZ0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgVHRmdFRyYWNrZXIge1xuICBtYXJrU3RhcnQ6ICgpID0+IHZvaWQ7XG4gIHJlY29yZEZpcnN0RGVsdGE6ICgpID0+IHZvaWQ7XG4gIHZhbHVlOiAoKSA9PiBudW1iZXIgfCBudWxsO1xuICB3cmFwRGVsdGE6IChvbkRlbHRhOiAodGV4dDogc3RyaW5nKSA9PiB2b2lkKSA9PiAodGV4dDogc3RyaW5nKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVHRmdFRyYWNrZXIobm93OiAoKSA9PiBudW1iZXIgPSBEYXRlLm5vdyk6IFR0ZnRUcmFja2VyIHtcbiAgbGV0IHN0YXJ0ZWRBdDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIGxldCB0dGZ0TXM6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0IHJlY29yZEZpcnN0RGVsdGEgPSAoKSA9PiB7XG4gICAgaWYgKHN0YXJ0ZWRBdCA9PT0gbnVsbCB8fCB0dGZ0TXMgIT09IG51bGwpIHJldHVybjtcbiAgICB0dGZ0TXMgPSBNYXRoLm1heCgwLCBub3coKSAtIHN0YXJ0ZWRBdCk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBtYXJrU3RhcnQ6ICgpID0+IHtcbiAgICAgIHN0YXJ0ZWRBdCA9IG5vdygpO1xuICAgIH0sXG4gICAgcmVjb3JkRmlyc3REZWx0YSxcbiAgICB2YWx1ZTogKCkgPT4gdHRmdE1zLFxuICAgIHdyYXBEZWx0YTogKG9uRGVsdGEpID0+ICh0ZXh0KSA9PiB7XG4gICAgICByZWNvcmRGaXJzdERlbHRhKCk7XG4gICAgICBvbkRlbHRhKHRleHQpO1xuICAgIH0sXG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7QUFPQSxTQUFnQixrQkFBa0IsTUFBb0IsS0FBSyxLQUFrQjtDQUMzRSxJQUFJLFlBQTJCO0NBQy9CLElBQUksU0FBd0I7Q0FFNUIsTUFBTSx5QkFBeUI7RUFDN0IsSUFBSSxjQUFjLFFBQVEsV0FBVyxNQUFNO0VBQzNDLFNBQVMsS0FBSyxJQUFJLEdBQUcsSUFBSSxJQUFJLFNBQVM7Q0FDeEM7Q0FFQSxPQUFPO0VBQ0wsaUJBQWlCO0dBQ2YsWUFBWSxJQUFJO0VBQ2xCO0VBQ0E7RUFDQSxhQUFhO0VBQ2IsWUFBWSxhQUFhLFNBQVM7R0FDaEMsaUJBQWlCO0dBQ2pCLFFBQVEsSUFBSTtFQUNkO0NBQ0Y7QUFDRiJ9