@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,561 +0,0 @@
1
- import { createDOMElementFilter, format as format$1, plugins } from "../../../../../@vitest_pretty-format@4.1.10/node_modules/@vitest/pretty-format/dist/index.js";
2
- //#region ../../node_modules/.pnpm/@vitest+utils@4.1.10/node_modules/@vitest/utils/dist/display.js
3
- const ansiColors = {
4
- bold: ["1", "22"],
5
- dim: ["2", "22"],
6
- italic: ["3", "23"],
7
- underline: ["4", "24"],
8
- inverse: ["7", "27"],
9
- hidden: ["8", "28"],
10
- strike: ["9", "29"],
11
- black: ["30", "39"],
12
- red: ["31", "39"],
13
- green: ["32", "39"],
14
- yellow: ["33", "39"],
15
- blue: ["34", "39"],
16
- magenta: ["35", "39"],
17
- cyan: ["36", "39"],
18
- white: ["37", "39"],
19
- brightblack: ["30;1", "39"],
20
- brightred: ["31;1", "39"],
21
- brightgreen: ["32;1", "39"],
22
- brightyellow: ["33;1", "39"],
23
- brightblue: ["34;1", "39"],
24
- brightmagenta: ["35;1", "39"],
25
- brightcyan: ["36;1", "39"],
26
- brightwhite: ["37;1", "39"],
27
- grey: ["90", "39"]
28
- };
29
- const styles = {
30
- special: "cyan",
31
- number: "yellow",
32
- bigint: "yellow",
33
- boolean: "yellow",
34
- undefined: "grey",
35
- null: "bold",
36
- string: "green",
37
- symbol: "green",
38
- date: "magenta",
39
- regexp: "red"
40
- };
41
- const truncator = "…";
42
- function colorise(value, styleType) {
43
- const color = ansiColors[styles[styleType]] || ansiColors[styleType] || "";
44
- if (!color) return String(value);
45
- return `\u001b[${color[0]}m${String(value)}\u001b[${color[1]}m`;
46
- }
47
- function normaliseOptions({ showHidden = false, depth = 2, colors = false, customInspect = true, showProxy = false, maxArrayLength = Infinity, breakLength = Infinity, seen = [], truncate = Infinity, stylize = String } = {}, inspect) {
48
- const options = {
49
- showHidden: Boolean(showHidden),
50
- depth: Number(depth),
51
- colors: Boolean(colors),
52
- customInspect: Boolean(customInspect),
53
- showProxy: Boolean(showProxy),
54
- maxArrayLength: Number(maxArrayLength),
55
- breakLength: Number(breakLength),
56
- truncate: Number(truncate),
57
- seen,
58
- inspect,
59
- stylize
60
- };
61
- if (options.colors) options.stylize = colorise;
62
- return options;
63
- }
64
- function isHighSurrogate(char) {
65
- return char >= "\ud800" && char <= "\udbff";
66
- }
67
- function truncate(string, length, tail = truncator) {
68
- string = String(string);
69
- const tailLength = tail.length;
70
- const stringLength = string.length;
71
- if (tailLength > length && stringLength > tailLength) return tail;
72
- if (stringLength > length && stringLength > tailLength) {
73
- let end = length - tailLength;
74
- if (end > 0 && isHighSurrogate(string[end - 1])) end = end - 1;
75
- return `${string.slice(0, end)}${tail}`;
76
- }
77
- return string;
78
- }
79
- function inspectList(list, options, inspectItem, separator = ", ") {
80
- inspectItem = inspectItem || options.inspect;
81
- const size = list.length;
82
- if (size === 0) return "";
83
- const originalLength = options.truncate;
84
- let output = "";
85
- let peek = "";
86
- let truncated = "";
87
- for (let i = 0; i < size; i += 1) {
88
- const last = i + 1 === list.length;
89
- const secondToLast = i + 2 === list.length;
90
- truncated = `${truncator}(${list.length - i})`;
91
- const value = list[i];
92
- options.truncate = originalLength - output.length - (last ? 0 : separator.length);
93
- const string = peek || inspectItem(value, options) + (last ? "" : separator);
94
- const nextLength = output.length + string.length;
95
- const truncatedLength = nextLength + truncated.length;
96
- if (last && nextLength > originalLength && output.length + truncated.length <= originalLength) break;
97
- if (!last && !secondToLast && truncatedLength > originalLength) break;
98
- peek = last ? "" : inspectItem(list[i + 1], options) + (secondToLast ? "" : separator);
99
- if (!last && secondToLast && truncatedLength > originalLength && nextLength + peek.length > originalLength) break;
100
- output += string;
101
- if (!last && !secondToLast && nextLength + peek.length >= originalLength) {
102
- truncated = `${truncator}(${list.length - i - 1})`;
103
- break;
104
- }
105
- truncated = "";
106
- }
107
- return `${output}${truncated}`;
108
- }
109
- function quoteComplexKey(key) {
110
- if (key.match(/^[a-zA-Z_][a-zA-Z_0-9]*$/)) return key;
111
- return JSON.stringify(key).replace(/'/g, "\\'").replace(/\\"/g, "\"").replace(/(^"|"$)/g, "'");
112
- }
113
- function inspectProperty([key, value], options) {
114
- options.truncate -= 2;
115
- if (typeof key === "string") key = quoteComplexKey(key);
116
- else if (typeof key !== "number") key = `[${options.inspect(key, options)}]`;
117
- options.truncate -= key.length;
118
- value = options.inspect(value, options);
119
- return `${key}: ${value}`;
120
- }
121
- function inspectArray(array, options) {
122
- const nonIndexProperties = Object.keys(array).slice(array.length);
123
- if (!array.length && !nonIndexProperties.length) return "[]";
124
- options.truncate -= 4;
125
- const listContents = inspectList(array, options);
126
- options.truncate -= listContents.length;
127
- let propertyContents = "";
128
- if (nonIndexProperties.length) propertyContents = inspectList(nonIndexProperties.map((key) => [key, array[key]]), options, inspectProperty);
129
- return `[ ${listContents}${propertyContents ? `, ${propertyContents}` : ""} ]`;
130
- }
131
- const getArrayName = (array) => {
132
- if (typeof Buffer === "function" && array instanceof Buffer) return "Buffer";
133
- if (array[Symbol.toStringTag]) return array[Symbol.toStringTag];
134
- return array.constructor.name;
135
- };
136
- function inspectTypedArray(array, options) {
137
- const name = getArrayName(array);
138
- options.truncate -= name.length + 4;
139
- const nonIndexProperties = Object.keys(array).slice(array.length);
140
- if (!array.length && !nonIndexProperties.length) return `${name}[]`;
141
- let output = "";
142
- for (let i = 0; i < array.length; i++) {
143
- const string = `${options.stylize(truncate(array[i], options.truncate), "number")}${i === array.length - 1 ? "" : ", "}`;
144
- options.truncate -= string.length;
145
- if (array[i] !== array.length && options.truncate <= 3) {
146
- output += `${truncator}(${array.length - array[i] + 1})`;
147
- break;
148
- }
149
- output += string;
150
- }
151
- let propertyContents = "";
152
- if (nonIndexProperties.length) propertyContents = inspectList(nonIndexProperties.map((key) => [key, array[key]]), options, inspectProperty);
153
- return `${name}[ ${output}${propertyContents ? `, ${propertyContents}` : ""} ]`;
154
- }
155
- function inspectDate(dateObject, options) {
156
- const stringRepresentation = dateObject.toJSON();
157
- if (stringRepresentation === null) return "Invalid Date";
158
- const split = stringRepresentation.split("T");
159
- const date = split[0];
160
- return options.stylize(`${date}T${truncate(split[1], options.truncate - date.length - 1)}`, "date");
161
- }
162
- function inspectFunction(func, options) {
163
- const functionType = func[Symbol.toStringTag] || "Function";
164
- const name = func.name;
165
- if (!name) return options.stylize(`[${functionType}]`, "special");
166
- return options.stylize(`[${functionType} ${truncate(name, options.truncate - 11)}]`, "special");
167
- }
168
- function inspectMapEntry([key, value], options) {
169
- options.truncate -= 4;
170
- key = options.inspect(key, options);
171
- options.truncate -= key.length;
172
- value = options.inspect(value, options);
173
- return `${key} => ${value}`;
174
- }
175
- function mapToEntries(map) {
176
- const entries = [];
177
- map.forEach((value, key) => {
178
- entries.push([key, value]);
179
- });
180
- return entries;
181
- }
182
- function inspectMap(map, options) {
183
- if (map.size === 0) return "Map{}";
184
- options.truncate -= 7;
185
- return `Map{ ${inspectList(mapToEntries(map), options, inspectMapEntry)} }`;
186
- }
187
- const isNaN = Number.isNaN || ((i) => i !== i);
188
- function inspectNumber(number, options) {
189
- if (isNaN(number)) return options.stylize("NaN", "number");
190
- if (number === Infinity) return options.stylize("Infinity", "number");
191
- if (number === -Infinity) return options.stylize("-Infinity", "number");
192
- if (number === 0) return options.stylize(1 / number === Infinity ? "+0" : "-0", "number");
193
- return options.stylize(truncate(String(number), options.truncate), "number");
194
- }
195
- function inspectBigInt(number, options) {
196
- let nums = truncate(number.toString(), options.truncate - 1);
197
- if (nums !== truncator) nums += "n";
198
- return options.stylize(nums, "bigint");
199
- }
200
- function inspectRegExp(value, options) {
201
- const flags = value.toString().split("/")[2];
202
- const sourceLength = options.truncate - (2 + flags.length);
203
- const source = value.source;
204
- return options.stylize(`/${truncate(source, sourceLength)}/${flags}`, "regexp");
205
- }
206
- function arrayFromSet(set) {
207
- const values = [];
208
- set.forEach((value) => {
209
- values.push(value);
210
- });
211
- return values;
212
- }
213
- function inspectSet(set, options) {
214
- if (set.size === 0) return "Set{}";
215
- options.truncate -= 7;
216
- return `Set{ ${inspectList(arrayFromSet(set), options)} }`;
217
- }
218
- const stringEscapeChars = /* @__PURE__ */ new RegExp("['\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]", "g");
219
- const escapeCharacters = {
220
- "\b": "\\b",
221
- " ": "\\t",
222
- "\n": "\\n",
223
- "\f": "\\f",
224
- "\r": "\\r",
225
- "'": "\\'",
226
- "\\": "\\\\"
227
- };
228
- const hex = 16;
229
- function escape(char) {
230
- return escapeCharacters[char] || `\\u${`0000${char.charCodeAt(0).toString(hex)}`.slice(-4)}`;
231
- }
232
- function inspectString(string, options) {
233
- if (stringEscapeChars.test(string)) string = string.replace(stringEscapeChars, escape);
234
- return options.stylize(`'${truncate(string, options.truncate - 2)}'`, "string");
235
- }
236
- function inspectSymbol(value) {
237
- if ("description" in Symbol.prototype) return value.description ? `Symbol(${value.description})` : "Symbol()";
238
- return value.toString();
239
- }
240
- const getPromiseValue = () => "Promise{…}";
241
- function inspectObject$1(object, options) {
242
- const properties = Object.getOwnPropertyNames(object);
243
- const symbols = Object.getOwnPropertySymbols ? Object.getOwnPropertySymbols(object) : [];
244
- if (properties.length === 0 && symbols.length === 0) return "{}";
245
- options.truncate -= 4;
246
- options.seen = options.seen || [];
247
- if (options.seen.includes(object)) return "[Circular]";
248
- options.seen.push(object);
249
- const propertyContents = inspectList(properties.map((key) => [key, object[key]]), options, inspectProperty);
250
- const symbolContents = inspectList(symbols.map((key) => [key, object[key]]), options, inspectProperty);
251
- options.seen.pop();
252
- let sep = "";
253
- if (propertyContents && symbolContents) sep = ", ";
254
- return `{ ${propertyContents}${sep}${symbolContents} }`;
255
- }
256
- const toStringTag = typeof Symbol !== "undefined" && Symbol.toStringTag ? Symbol.toStringTag : false;
257
- function inspectClass(value, options) {
258
- let name = "";
259
- if (toStringTag && toStringTag in value) name = value[toStringTag];
260
- name = name || value.constructor.name;
261
- if (!name || name === "_class") name = "<Anonymous Class>";
262
- options.truncate -= name.length;
263
- return `${name}${inspectObject$1(value, options)}`;
264
- }
265
- function inspectArguments(args, options) {
266
- if (args.length === 0) return "Arguments[]";
267
- options.truncate -= 13;
268
- return `Arguments[ ${inspectList(args, options)} ]`;
269
- }
270
- const errorKeys = [
271
- "stack",
272
- "line",
273
- "column",
274
- "name",
275
- "message",
276
- "fileName",
277
- "lineNumber",
278
- "columnNumber",
279
- "number",
280
- "description",
281
- "cause"
282
- ];
283
- function inspectObject(error, options) {
284
- const properties = Object.getOwnPropertyNames(error).filter((key) => errorKeys.indexOf(key) === -1);
285
- const name = error.name;
286
- options.truncate -= name.length;
287
- let message = "";
288
- if (typeof error.message === "string") message = truncate(error.message, options.truncate);
289
- else properties.unshift("message");
290
- message = message ? `: ${message}` : "";
291
- options.truncate -= message.length + 5;
292
- options.seen = options.seen || [];
293
- if (options.seen.includes(error)) return "[Circular]";
294
- options.seen.push(error);
295
- const propertyContents = inspectList(properties.map((key) => [key, error[key]]), options, inspectProperty);
296
- return `${name}${message}${propertyContents ? ` { ${propertyContents} }` : ""}`;
297
- }
298
- function inspectAttribute([key, value], options) {
299
- options.truncate -= 3;
300
- if (!value) return `${options.stylize(String(key), "yellow")}`;
301
- return `${options.stylize(String(key), "yellow")}=${options.stylize(`"${value}"`, "string")}`;
302
- }
303
- function inspectNodeCollection(collection, options) {
304
- return inspectList(collection, options, inspectNode, "\n");
305
- }
306
- function inspectNode(node, options) {
307
- switch (node.nodeType) {
308
- case 1: return inspectHTML(node, options);
309
- case 3: return options.inspect(node.data, options);
310
- default: return options.inspect(node, options);
311
- }
312
- }
313
- function inspectHTML(element, options) {
314
- const properties = element.getAttributeNames();
315
- const name = element.tagName.toLowerCase();
316
- const head = options.stylize(`<${name}`, "special");
317
- const headClose = options.stylize(`>`, "special");
318
- const tail = options.stylize(`</${name}>`, "special");
319
- options.truncate -= name.length * 2 + 5;
320
- let propertyContents = "";
321
- if (properties.length > 0) {
322
- propertyContents += " ";
323
- propertyContents += inspectList(properties.map((key) => [key, element.getAttribute(key)]), options, inspectAttribute, " ");
324
- }
325
- options.truncate -= propertyContents.length;
326
- const truncate = options.truncate;
327
- let children = inspectNodeCollection(element.children, options);
328
- if (children && children.length > truncate) children = `${truncator}(${element.children.length})`;
329
- return `${head}${propertyContents}${headClose}${children}${tail}`;
330
- }
331
- const chaiInspect = typeof Symbol === "function" && typeof Symbol.for === "function" ? Symbol.for("chai/inspect") : "@@chai/inspect";
332
- const nodeInspect = Symbol.for("nodejs.util.inspect.custom");
333
- const constructorMap = /* @__PURE__ */ new WeakMap();
334
- const stringTagMap = {};
335
- const baseTypesMap = {
336
- undefined: (value, options) => options.stylize("undefined", "undefined"),
337
- null: (value, options) => options.stylize("null", "null"),
338
- boolean: (value, options) => options.stylize(String(value), "boolean"),
339
- Boolean: (value, options) => options.stylize(String(value), "boolean"),
340
- number: inspectNumber,
341
- Number: inspectNumber,
342
- bigint: inspectBigInt,
343
- BigInt: inspectBigInt,
344
- string: inspectString,
345
- String: inspectString,
346
- function: inspectFunction,
347
- Function: inspectFunction,
348
- symbol: inspectSymbol,
349
- Symbol: inspectSymbol,
350
- Array: inspectArray,
351
- Date: inspectDate,
352
- Map: inspectMap,
353
- Set: inspectSet,
354
- RegExp: inspectRegExp,
355
- Promise: getPromiseValue,
356
- WeakSet: (value, options) => options.stylize("WeakSet{…}", "special"),
357
- WeakMap: (value, options) => options.stylize("WeakMap{…}", "special"),
358
- Arguments: inspectArguments,
359
- Int8Array: inspectTypedArray,
360
- Uint8Array: inspectTypedArray,
361
- Uint8ClampedArray: inspectTypedArray,
362
- Int16Array: inspectTypedArray,
363
- Uint16Array: inspectTypedArray,
364
- Int32Array: inspectTypedArray,
365
- Uint32Array: inspectTypedArray,
366
- Float32Array: inspectTypedArray,
367
- Float64Array: inspectTypedArray,
368
- Generator: () => "",
369
- DataView: () => "",
370
- ArrayBuffer: () => "",
371
- Error: inspectObject,
372
- HTMLCollection: inspectNodeCollection,
373
- NodeList: inspectNodeCollection
374
- };
375
- const inspectCustom = (value, options, type, inspectFn) => {
376
- if (chaiInspect in value && typeof value[chaiInspect] === "function") return value[chaiInspect](options);
377
- if (nodeInspect in value && typeof value[nodeInspect] === "function") return value[nodeInspect](options.depth, options, inspectFn);
378
- if ("inspect" in value && typeof value.inspect === "function") return value.inspect(options.depth, options);
379
- if ("constructor" in value && constructorMap.has(value.constructor)) return constructorMap.get(value.constructor)(value, options);
380
- if (stringTagMap[type]) return stringTagMap[type](value, options);
381
- return "";
382
- };
383
- const toString = Object.prototype.toString;
384
- function inspect$1(value, opts = {}) {
385
- const options = normaliseOptions(opts, inspect$1);
386
- const { customInspect } = options;
387
- let type = value === null ? "null" : typeof value;
388
- if (type === "object") type = toString.call(value).slice(8, -1);
389
- if (type in baseTypesMap) return baseTypesMap[type](value, options);
390
- if (customInspect && value) {
391
- const output = inspectCustom(value, options, type, inspect$1);
392
- if (output) {
393
- if (typeof output === "string") return output;
394
- return inspect$1(output, options);
395
- }
396
- }
397
- const proto = value ? Object.getPrototypeOf(value) : false;
398
- if (proto === Object.prototype || proto === null) return inspectObject$1(value, options);
399
- if (value && typeof HTMLElement === "function" && value instanceof HTMLElement) return inspectHTML(value, options);
400
- if ("constructor" in value) {
401
- if (value.constructor !== Object) return inspectClass(value, options);
402
- return inspectObject$1(value, options);
403
- }
404
- if (value === Object(value)) return inspectObject$1(value, options);
405
- return options.stylize(String(value), type);
406
- }
407
- const { AsymmetricMatcher, DOMCollection, DOMElement, Immutable, ReactElement, ReactTestComponent } = plugins;
408
- const PLUGINS = [
409
- ReactTestComponent,
410
- ReactElement,
411
- DOMElement,
412
- DOMCollection,
413
- Immutable,
414
- AsymmetricMatcher
415
- ];
416
- function stringify(object, maxDepth = 10, { maxLength, filterNode, ...options } = {}) {
417
- const MAX_LENGTH = maxLength ?? 1e4;
418
- let result;
419
- const filterFn = typeof filterNode === "string" ? createNodeFilterFromSelector(filterNode) : filterNode;
420
- const plugins = filterFn ? [
421
- ReactTestComponent,
422
- ReactElement,
423
- createDOMElementFilter(filterFn),
424
- DOMCollection,
425
- Immutable,
426
- AsymmetricMatcher
427
- ] : PLUGINS;
428
- try {
429
- result = format$1(object, {
430
- maxDepth,
431
- escapeString: false,
432
- plugins,
433
- ...options
434
- });
435
- } catch {
436
- result = format$1(object, {
437
- callToJSON: false,
438
- maxDepth,
439
- escapeString: false,
440
- plugins,
441
- ...options
442
- });
443
- }
444
- return result.length >= MAX_LENGTH && maxDepth > 1 ? stringify(object, Math.floor(Math.min(maxDepth, Number.MAX_SAFE_INTEGER) / 2), {
445
- maxLength,
446
- filterNode,
447
- ...options
448
- }) : result;
449
- }
450
- function createNodeFilterFromSelector(selector) {
451
- const ELEMENT_NODE = 1;
452
- const COMMENT_NODE = 8;
453
- return (node) => {
454
- if (node.nodeType === COMMENT_NODE) return false;
455
- if (node.nodeType === ELEMENT_NODE && node.matches) try {
456
- return !node.matches(selector);
457
- } catch {
458
- return true;
459
- }
460
- return true;
461
- };
462
- }
463
- const formatRegExp = /%[sdjifoOc%]/g;
464
- function baseFormat(args, options = {}) {
465
- const formatArg = (item, inspecOptions) => {
466
- if (options.prettifyObject) return stringify(item, void 0, {
467
- printBasicPrototype: false,
468
- escapeString: false
469
- });
470
- return inspect(item, inspecOptions);
471
- };
472
- if (typeof args[0] !== "string") {
473
- const objects = [];
474
- for (let i = 0; i < args.length; i++) objects.push(formatArg(args[i], {
475
- depth: 0,
476
- colors: false
477
- }));
478
- return objects.join(" ");
479
- }
480
- const len = args.length;
481
- let i = 1;
482
- const template = args[0];
483
- let str = String(template).replace(formatRegExp, (x) => {
484
- if (x === "%%") return "%";
485
- if (i >= len) return x;
486
- switch (x) {
487
- case "%s": {
488
- const value = args[i++];
489
- if (typeof value === "bigint") return `${value.toString()}n`;
490
- if (typeof value === "number" && value === 0 && 1 / value < 0) return "-0";
491
- if (typeof value === "object" && value !== null) {
492
- if (typeof value.toString === "function" && value.toString !== Object.prototype.toString) return value.toString();
493
- return formatArg(value, {
494
- depth: 0,
495
- colors: false
496
- });
497
- }
498
- return String(value);
499
- }
500
- case "%d": {
501
- const value = args[i++];
502
- if (typeof value === "bigint") return `${value.toString()}n`;
503
- if (typeof value === "symbol") return "NaN";
504
- return Number(value).toString();
505
- }
506
- case "%i": {
507
- const value = args[i++];
508
- if (typeof value === "bigint") return `${value.toString()}n`;
509
- return Number.parseInt(String(value)).toString();
510
- }
511
- case "%f": return Number.parseFloat(String(args[i++])).toString();
512
- case "%o": return formatArg(args[i++], {
513
- showHidden: true,
514
- showProxy: true
515
- });
516
- case "%O": return formatArg(args[i++]);
517
- case "%c":
518
- i++;
519
- return "";
520
- case "%j": try {
521
- return JSON.stringify(args[i++]);
522
- } catch (err) {
523
- const m = err.message;
524
- if (m.includes("circular structure") || m.includes("cyclic structures") || m.includes("cyclic object")) return "[Circular]";
525
- throw err;
526
- }
527
- default: return x;
528
- }
529
- });
530
- for (let x = args[i]; i < len; x = args[++i]) if (x === null || typeof x !== "object") str += ` ${typeof x === "symbol" ? x.toString() : x}`;
531
- else str += ` ${formatArg(x)}`;
532
- return str;
533
- }
534
- function format(...args) {
535
- return baseFormat(args);
536
- }
537
- function browserFormat(...args) {
538
- return baseFormat(args, { prettifyObject: true });
539
- }
540
- function inspect(obj, options = {}) {
541
- if (options.truncate === 0) options.truncate = Number.POSITIVE_INFINITY;
542
- return inspect$1(obj, options);
543
- }
544
- function objDisplay(obj, options = {}) {
545
- if (typeof options.truncate === "undefined") options.truncate = 40;
546
- const str = inspect(obj, options);
547
- const type = Object.prototype.toString.call(obj);
548
- if (options.truncate && str.length >= options.truncate) if (type === "[object Function]") {
549
- const fn = obj;
550
- return !fn.name ? "[Function]" : `[Function: ${fn.name}]`;
551
- } else if (type === "[object Array]") return `[ Array(${obj.length}) ]`;
552
- else if (type === "[object Object]") {
553
- const keys = Object.keys(obj);
554
- return `{ Object (${keys.length > 2 ? `${keys.splice(0, 2).join(", ")}, ...` : keys.join(", ")}) }`;
555
- } else return str;
556
- return str;
557
- }
558
- //#endregion
559
- export { browserFormat, format, formatRegExp, inspect, objDisplay, stringify };
560
-
561
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcGxheS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHZpdGVzdCt1dGlsc0A0LjEuMTAvbm9kZV9tb2R1bGVzL0B2aXRlc3QvdXRpbHMvZGlzdC9kaXNwbGF5LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHBsdWdpbnMsIGNyZWF0ZURPTUVsZW1lbnRGaWx0ZXIsIGZvcm1hdCBhcyBmb3JtYXQkMSB9IGZyb20gJ0B2aXRlc3QvcHJldHR5LWZvcm1hdCc7XG5cbmNvbnN0IGFuc2lDb2xvcnMgPSB7XG4gICAgYm9sZDogWycxJywgJzIyJ10sXG4gICAgZGltOiBbJzInLCAnMjInXSxcbiAgICBpdGFsaWM6IFsnMycsICcyMyddLFxuICAgIHVuZGVybGluZTogWyc0JywgJzI0J10sXG4gICAgLy8gNSAmIDYgYXJlIGJsaW5raW5nXG4gICAgaW52ZXJzZTogWyc3JywgJzI3J10sXG4gICAgaGlkZGVuOiBbJzgnLCAnMjgnXSxcbiAgICBzdHJpa2U6IFsnOScsICcyOSddLFxuICAgIC8vIDEwLTIwIGFyZSBmb250c1xuICAgIC8vIDIxLTI5IGFyZSByZXNldHMgZm9yIDEtOVxuICAgIGJsYWNrOiBbJzMwJywgJzM5J10sXG4gICAgcmVkOiBbJzMxJywgJzM5J10sXG4gICAgZ3JlZW46IFsnMzInLCAnMzknXSxcbiAgICB5ZWxsb3c6IFsnMzMnLCAnMzknXSxcbiAgICBibHVlOiBbJzM0JywgJzM5J10sXG4gICAgbWFnZW50YTogWyczNScsICczOSddLFxuICAgIGN5YW46IFsnMzYnLCAnMzknXSxcbiAgICB3aGl0ZTogWyczNycsICczOSddLFxuICAgIGJyaWdodGJsYWNrOiBbJzMwOzEnLCAnMzknXSxcbiAgICBicmlnaHRyZWQ6IFsnMzE7MScsICczOSddLFxuICAgIGJyaWdodGdyZWVuOiBbJzMyOzEnLCAnMzknXSxcbiAgICBicmlnaHR5ZWxsb3c6IFsnMzM7MScsICczOSddLFxuICAgIGJyaWdodGJsdWU6IFsnMzQ7MScsICczOSddLFxuICAgIGJyaWdodG1hZ2VudGE6IFsnMzU7MScsICczOSddLFxuICAgIGJyaWdodGN5YW46IFsnMzY7MScsICczOSddLFxuICAgIGJyaWdodHdoaXRlOiBbJzM3OzEnLCAnMzknXSxcbiAgICBncmV5OiBbJzkwJywgJzM5J10sXG59O1xuY29uc3Qgc3R5bGVzID0ge1xuICAgIHNwZWNpYWw6ICdjeWFuJyxcbiAgICBudW1iZXI6ICd5ZWxsb3cnLFxuICAgIGJpZ2ludDogJ3llbGxvdycsXG4gICAgYm9vbGVhbjogJ3llbGxvdycsXG4gICAgdW5kZWZpbmVkOiAnZ3JleScsXG4gICAgbnVsbDogJ2JvbGQnLFxuICAgIHN0cmluZzogJ2dyZWVuJyxcbiAgICBzeW1ib2w6ICdncmVlbicsXG4gICAgZGF0ZTogJ21hZ2VudGEnLFxuICAgIHJlZ2V4cDogJ3JlZCcsXG59O1xuY29uc3QgdHJ1bmNhdG9yID0gJ+KApic7XG5mdW5jdGlvbiBjb2xvcmlzZSh2YWx1ZSwgc3R5bGVUeXBlKSB7XG4gICAgY29uc3QgY29sb3IgPSBhbnNpQ29sb3JzW3N0eWxlc1tzdHlsZVR5cGVdXSB8fCBhbnNpQ29sb3JzW3N0eWxlVHlwZV0gfHwgJyc7XG4gICAgaWYgKCFjb2xvcikge1xuICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGBcXHUwMDFiWyR7Y29sb3JbMF19bSR7U3RyaW5nKHZhbHVlKX1cXHUwMDFiWyR7Y29sb3JbMV19bWA7XG59XG5mdW5jdGlvbiBub3JtYWxpc2VPcHRpb25zKHsgc2hvd0hpZGRlbiA9IGZhbHNlLCBkZXB0aCA9IDIsIGNvbG9ycyA9IGZhbHNlLCBjdXN0b21JbnNwZWN0ID0gdHJ1ZSwgc2hvd1Byb3h5ID0gZmFsc2UsIG1heEFycmF5TGVuZ3RoID0gSW5maW5pdHksIGJyZWFrTGVuZ3RoID0gSW5maW5pdHksIHNlZW4gPSBbXSwgXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG50cnVuY2F0ZSA9IEluZmluaXR5LCBzdHlsaXplID0gU3RyaW5nLCB9ID0ge30sIGluc3BlY3QpIHtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBzaG93SGlkZGVuOiBCb29sZWFuKHNob3dIaWRkZW4pLFxuICAgICAgICBkZXB0aDogTnVtYmVyKGRlcHRoKSxcbiAgICAgICAgY29sb3JzOiBCb29sZWFuKGNvbG9ycyksXG4gICAgICAgIGN1c3RvbUluc3BlY3Q6IEJvb2xlYW4oY3VzdG9tSW5zcGVjdCksXG4gICAgICAgIHNob3dQcm94eTogQm9vbGVhbihzaG93UHJveHkpLFxuICAgICAgICBtYXhBcnJheUxlbmd0aDogTnVtYmVyKG1heEFycmF5TGVuZ3RoKSxcbiAgICAgICAgYnJlYWtMZW5ndGg6IE51bWJlcihicmVha0xlbmd0aCksXG4gICAgICAgIHRydW5jYXRlOiBOdW1iZXIodHJ1bmNhdGUpLFxuICAgICAgICBzZWVuLFxuICAgICAgICBpbnNwZWN0LFxuICAgICAgICBzdHlsaXplLFxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMuY29sb3JzKSB7XG4gICAgICAgIG9wdGlvbnMuc3R5bGl6ZSA9IGNvbG9yaXNlO1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9ucztcbn1cbmZ1bmN0aW9uIGlzSGlnaFN1cnJvZ2F0ZShjaGFyKSB7XG4gICAgcmV0dXJuIGNoYXIgPj0gJ1xcdWQ4MDAnICYmIGNoYXIgPD0gJ1xcdWRiZmYnO1xufVxuZnVuY3Rpb24gdHJ1bmNhdGUoc3RyaW5nLCBsZW5ndGgsIHRhaWwgPSB0cnVuY2F0b3IpIHtcbiAgICBzdHJpbmcgPSBTdHJpbmcoc3RyaW5nKTtcbiAgICBjb25zdCB0YWlsTGVuZ3RoID0gdGFpbC5sZW5ndGg7XG4gICAgY29uc3Qgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcbiAgICBpZiAodGFpbExlbmd0aCA+IGxlbmd0aCAmJiBzdHJpbmdMZW5ndGggPiB0YWlsTGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0YWlsO1xuICAgIH1cbiAgICBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoICYmIHN0cmluZ0xlbmd0aCA+IHRhaWxMZW5ndGgpIHtcbiAgICAgICAgbGV0IGVuZCA9IGxlbmd0aCAtIHRhaWxMZW5ndGg7XG4gICAgICAgIGlmIChlbmQgPiAwICYmIGlzSGlnaFN1cnJvZ2F0ZShzdHJpbmdbZW5kIC0gMV0pKSB7XG4gICAgICAgICAgICBlbmQgPSBlbmQgLSAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtzdHJpbmcuc2xpY2UoMCwgZW5kKX0ke3RhaWx9YDtcbiAgICB9XG4gICAgcmV0dXJuIHN0cmluZztcbn1cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5mdW5jdGlvbiBpbnNwZWN0TGlzdChsaXN0LCBvcHRpb25zLCBpbnNwZWN0SXRlbSwgc2VwYXJhdG9yID0gJywgJykge1xuICAgIGluc3BlY3RJdGVtID0gaW5zcGVjdEl0ZW0gfHwgb3B0aW9ucy5pbnNwZWN0O1xuICAgIGNvbnN0IHNpemUgPSBsaXN0Lmxlbmd0aDtcbiAgICBpZiAoc2l6ZSA9PT0gMClcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIGNvbnN0IG9yaWdpbmFsTGVuZ3RoID0gb3B0aW9ucy50cnVuY2F0ZTtcbiAgICBsZXQgb3V0cHV0ID0gJyc7XG4gICAgbGV0IHBlZWsgPSAnJztcbiAgICBsZXQgdHJ1bmNhdGVkID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpICs9IDEpIHtcbiAgICAgICAgY29uc3QgbGFzdCA9IGkgKyAxID09PSBsaXN0Lmxlbmd0aDtcbiAgICAgICAgY29uc3Qgc2Vjb25kVG9MYXN0ID0gaSArIDIgPT09IGxpc3QubGVuZ3RoO1xuICAgICAgICB0cnVuY2F0ZWQgPSBgJHt0cnVuY2F0b3J9KCR7bGlzdC5sZW5ndGggLSBpfSlgO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGxpc3RbaV07XG4gICAgICAgIC8vIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcmVtYWluaW5nIHdlIG5lZWQgdG8gYWNjb3VudCBmb3IgYSBzZXBhcmF0b3Igb2YgYCwgYFxuICAgICAgICBvcHRpb25zLnRydW5jYXRlID0gb3JpZ2luYWxMZW5ndGggLSBvdXRwdXQubGVuZ3RoIC0gKGxhc3QgPyAwIDogc2VwYXJhdG9yLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHN0cmluZyA9IHBlZWsgfHwgaW5zcGVjdEl0ZW0odmFsdWUsIG9wdGlvbnMpICsgKGxhc3QgPyAnJyA6IHNlcGFyYXRvcik7XG4gICAgICAgIGNvbnN0IG5leHRMZW5ndGggPSBvdXRwdXQubGVuZ3RoICsgc3RyaW5nLmxlbmd0aDtcbiAgICAgICAgY29uc3QgdHJ1bmNhdGVkTGVuZ3RoID0gbmV4dExlbmd0aCArIHRydW5jYXRlZC5sZW5ndGg7XG4gICAgICAgIC8vIElmIHRoaXMgaXMgdGhlIGxhc3QgZWxlbWVudCwgYW5kIGFkZGluZyBpdCB3b3VsZFxuICAgICAgICAvLyB0YWtlIHVzIG92ZXIgbGVuZ3RoLCBidXQgYWRkaW5nIHRoZSB0cnVuY2F0b3Igd291bGRuJ3QgLSB0aGVuIGJyZWFrIG5vd1xuICAgICAgICBpZiAobGFzdCAmJiBuZXh0TGVuZ3RoID4gb3JpZ2luYWxMZW5ndGggJiYgb3V0cHV0Lmxlbmd0aCArIHRydW5jYXRlZC5sZW5ndGggPD0gb3JpZ2luYWxMZW5ndGgpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHRoaXMgaXNuJ3QgdGhlIGxhc3Qgb3Igc2Vjb25kIHRvIGxhc3QgZWxlbWVudCB0byBzY2FuLFxuICAgICAgICAvLyBidXQgdGhlIHN0cmluZyBpcyBhbHJlYWR5IG92ZXIgbGVuZ3RoIHRoZW4gYnJlYWsgaGVyZVxuICAgICAgICBpZiAoIWxhc3QgJiYgIXNlY29uZFRvTGFzdCAmJiB0cnVuY2F0ZWRMZW5ndGggPiBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUGVlayBhdCB0aGUgbmV4dCBzdHJpbmcgdG8gZGV0ZXJtaW5lIGlmIHdlIHNob3VsZFxuICAgICAgICAvLyBicmVhayBlYXJseSBiZWZvcmUgYWRkaW5nIHRoaXMgaXRlbSB0byB0aGUgb3V0cHV0XG4gICAgICAgIHBlZWsgPSBsYXN0ID8gJycgOiBpbnNwZWN0SXRlbShsaXN0W2kgKyAxXSwgb3B0aW9ucykgKyAoc2Vjb25kVG9MYXN0ID8gJycgOiBzZXBhcmF0b3IpO1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIG9uZSBlbGVtZW50IGxlZnQsIGJ1dCB0aGlzIGVsZW1lbnQgYW5kXG4gICAgICAgIC8vIHRoZSBuZXh0IHRha2VzIG92ZXIgbGVuZ3RoLCB0aGUgYnJlYWsgZWFybHlcbiAgICAgICAgaWYgKCFsYXN0ICYmIHNlY29uZFRvTGFzdCAmJiB0cnVuY2F0ZWRMZW5ndGggPiBvcmlnaW5hbExlbmd0aCAmJiBuZXh0TGVuZ3RoICsgcGVlay5sZW5ndGggPiBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgb3V0cHV0ICs9IHN0cmluZztcbiAgICAgICAgLy8gSWYgdGhlIG5leHQgZWxlbWVudCB0YWtlcyB1cyB0byBsZW5ndGggLVxuICAgICAgICAvLyBidXQgdGhlcmUgYXJlIG1vcmUgYWZ0ZXIgdGhhdCwgdGhlbiB3ZSBzaG91bGQgdHJ1bmNhdGUgbm93XG4gICAgICAgIGlmICghbGFzdCAmJiAhc2Vjb25kVG9MYXN0ICYmIG5leHRMZW5ndGggKyBwZWVrLmxlbmd0aCA+PSBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgICAgICAgdHJ1bmNhdGVkID0gYCR7dHJ1bmNhdG9yfSgke2xpc3QubGVuZ3RoIC0gaSAtIDF9KWA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0cnVuY2F0ZWQgPSAnJztcbiAgICB9XG4gICAgcmV0dXJuIGAke291dHB1dH0ke3RydW5jYXRlZH1gO1xufVxuZnVuY3Rpb24gcXVvdGVDb21wbGV4S2V5KGtleSkge1xuICAgIGlmIChrZXkubWF0Y2goL15bYS16QS1aX11bYS16QS1aXzAtOV0qJC8pKSB7XG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShrZXkpXG4gICAgICAgIC5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKVxuICAgICAgICAucmVwbGFjZSgvKF5cInxcIiQpL2csIFwiJ1wiKTtcbn1cbmZ1bmN0aW9uIGluc3BlY3RQcm9wZXJ0eShba2V5LCB2YWx1ZV0sIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zLnRydW5jYXRlIC09IDI7XG4gICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGtleSA9IHF1b3RlQ29tcGxleEtleShrZXkpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2Yga2V5ICE9PSAnbnVtYmVyJykge1xuICAgICAgICBrZXkgPSBgWyR7b3B0aW9ucy5pbnNwZWN0KGtleSwgb3B0aW9ucyl9XWA7XG4gICAgfVxuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0ga2V5Lmxlbmd0aDtcbiAgICB2YWx1ZSA9IG9wdGlvbnMuaW5zcGVjdCh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIGAke2tleX06ICR7dmFsdWV9YDtcbn1cblxuZnVuY3Rpb24gaW5zcGVjdEFycmF5KGFycmF5LCBvcHRpb25zKSB7XG4gICAgLy8gT2JqZWN0LmtleXMgd2lsbCBhbHdheXMgb3V0cHV0IHRoZSBBcnJheSBpbmRpY2VzIGZpcnN0LCBzbyB3ZSBjYW4gc2xpY2UgYnlcbiAgICAvLyBgYXJyYXkubGVuZ3RoYCB0byBnZXQgbm9uLWluZGV4IHByb3BlcnRpZXNcbiAgICBjb25zdCBub25JbmRleFByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhhcnJheSkuc2xpY2UoYXJyYXkubGVuZ3RoKTtcbiAgICBpZiAoIWFycmF5Lmxlbmd0aCAmJiAhbm9uSW5kZXhQcm9wZXJ0aWVzLmxlbmd0aClcbiAgICAgICAgcmV0dXJuICdbXSc7XG4gICAgb3B0aW9ucy50cnVuY2F0ZSAtPSA0O1xuICAgIGNvbnN0IGxpc3RDb250ZW50cyA9IGluc3BlY3RMaXN0KGFycmF5LCBvcHRpb25zKTtcbiAgICBvcHRpb25zLnRydW5jYXRlIC09IGxpc3RDb250ZW50cy5sZW5ndGg7XG4gICAgbGV0IHByb3BlcnR5Q29udGVudHMgPSAnJztcbiAgICBpZiAobm9uSW5kZXhQcm9wZXJ0aWVzLmxlbmd0aCkge1xuICAgICAgICBwcm9wZXJ0eUNvbnRlbnRzID0gaW5zcGVjdExpc3Qobm9uSW5kZXhQcm9wZXJ0aWVzLm1hcChrZXkgPT4gW2tleSwgYXJyYXlba2V5XV0pLCBvcHRpb25zLCBpbnNwZWN0UHJvcGVydHkpO1xuICAgIH1cbiAgICByZXR1cm4gYFsgJHtsaXN0Q29udGVudHN9JHtwcm9wZXJ0eUNvbnRlbnRzID8gYCwgJHtwcm9wZXJ0eUNvbnRlbnRzfWAgOiAnJ30gXWA7XG59XG5cbmNvbnN0IGdldEFycmF5TmFtZSA9IChhcnJheSkgPT4ge1xuICAgIC8vIFdlIG5lZWQgdG8gc3BlY2lhbCBjYXNlIE5vZGUuanMnIEJ1ZmZlcnMsIHdoaWNoIHJlcG9ydCB0byBiZSBVaW50OEFycmF5XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmICh0eXBlb2YgQnVmZmVyID09PSAnZnVuY3Rpb24nICYmIGFycmF5IGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgICAgIHJldHVybiAnQnVmZmVyJztcbiAgICB9XG4gICAgaWYgKGFycmF5W1N5bWJvbC50b1N0cmluZ1RhZ10pIHtcbiAgICAgICAgcmV0dXJuIGFycmF5W1N5bWJvbC50b1N0cmluZ1RhZ107XG4gICAgfVxuICAgIHJldHVybiBhcnJheS5jb25zdHJ1Y3Rvci5uYW1lO1xufTtcbmZ1bmN0aW9uIGluc3BlY3RUeXBlZEFycmF5KGFycmF5LCBvcHRpb25zKSB7XG4gICAgY29uc3QgbmFtZSA9IGdldEFycmF5TmFtZShhcnJheSk7XG4gICAgb3B0aW9ucy50cnVuY2F0ZSAtPSBuYW1lLmxlbmd0aCArIDQ7XG4gICAgLy8gT2JqZWN0LmtleXMgd2lsbCBhbHdheXMgb3V0cHV0IHRoZSBBcnJheSBpbmRpY2VzIGZpcnN0LCBzbyB3ZSBjYW4gc2xpY2UgYnlcbiAgICAvLyBgYXJyYXkubGVuZ3RoYCB0byBnZXQgbm9uLWluZGV4IHByb3BlcnRpZXNcbiAgICBjb25zdCBub25JbmRleFByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhhcnJheSkuc2xpY2UoYXJyYXkubGVuZ3RoKTtcbiAgICBpZiAoIWFycmF5Lmxlbmd0aCAmJiAhbm9uSW5kZXhQcm9wZXJ0aWVzLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIGAke25hbWV9W11gO1xuICAgIC8vIEFzIHdlIGtub3cgVHlwZWRBcnJheXMgb25seSBjb250YWluIFVuc2lnbmVkIEludGVnZXJzLCB3ZSBjYW4gc2tpcCBpbnNwZWN0aW5nIGVhY2ggb25lIGFuZCBzaW1wbHlcbiAgICAvLyBzdHlsaXNlIHRoZSB0b1N0cmluZygpIHZhbHVlIG9mIHRoZW1cbiAgICBsZXQgb3V0cHV0ID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBzdHJpbmcgPSBgJHtvcHRpb25zLnN0eWxpemUodHJ1bmNhdGUoYXJyYXlbaV0sIG9wdGlvbnMudHJ1bmNhdGUpLCAnbnVtYmVyJyl9JHtpID09PSBhcnJheS5sZW5ndGggLSAxID8gJycgOiAnLCAnfWA7XG4gICAgICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gc3RyaW5nLmxlbmd0aDtcbiAgICAgICAgaWYgKGFycmF5W2ldICE9PSBhcnJheS5sZW5ndGggJiYgb3B0aW9ucy50cnVuY2F0ZSA8PSAzKSB7XG4gICAgICAgICAgICBvdXRwdXQgKz0gYCR7dHJ1bmNhdG9yfSgke2FycmF5Lmxlbmd0aCAtIGFycmF5W2ldICsgMX0pYDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG91dHB1dCArPSBzdHJpbmc7XG4gICAgfVxuICAgIGxldCBwcm9wZXJ0eUNvbnRlbnRzID0gJyc7XG4gICAgaWYgKG5vbkluZGV4UHJvcGVydGllcy5sZW5ndGgpIHtcbiAgICAgICAgcHJvcGVydHlDb250ZW50cyA9IGluc3BlY3RMaXN0KG5vbkluZGV4UHJvcGVydGllcy5tYXAoa2V5ID0+IFtrZXksIGFycmF5W2tleV1dKSwgb3B0aW9ucywgaW5zcGVjdFByb3BlcnR5KTtcbiAgICB9XG4gICAgcmV0dXJuIGAke25hbWV9WyAke291dHB1dH0ke3Byb3BlcnR5Q29udGVudHMgPyBgLCAke3Byb3BlcnR5Q29udGVudHN9YCA6ICcnfSBdYDtcbn1cblxuZnVuY3Rpb24gaW5zcGVjdERhdGUoZGF0ZU9iamVjdCwgb3B0aW9ucykge1xuICAgIGNvbnN0IHN0cmluZ1JlcHJlc2VudGF0aW9uID0gZGF0ZU9iamVjdC50b0pTT04oKTtcbiAgICBpZiAoc3RyaW5nUmVwcmVzZW50YXRpb24gPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICdJbnZhbGlkIERhdGUnO1xuICAgIH1cbiAgICBjb25zdCBzcGxpdCA9IHN0cmluZ1JlcHJlc2VudGF0aW9uLnNwbGl0KCdUJyk7XG4gICAgY29uc3QgZGF0ZSA9IHNwbGl0WzBdO1xuICAgIC8vIElmIHdlIG5lZWQgdG8gLSB0cnVuY2F0ZSB0aGUgdGltZSBwb3J0aW9uLCBidXQgbmV2ZXIgdGhlIGRhdGVcbiAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKGAke2RhdGV9VCR7dHJ1bmNhdGUoc3BsaXRbMV0sIG9wdGlvbnMudHJ1bmNhdGUgLSBkYXRlLmxlbmd0aCAtIDEpfWAsICdkYXRlJyk7XG59XG5cbmZ1bmN0aW9uIGluc3BlY3RGdW5jdGlvbihmdW5jLCBvcHRpb25zKSB7XG4gICAgY29uc3QgZnVuY3Rpb25UeXBlID0gZnVuY1tTeW1ib2wudG9TdHJpbmdUYWddIHx8ICdGdW5jdGlvbic7XG4gICAgY29uc3QgbmFtZSA9IGZ1bmMubmFtZTtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuc3R5bGl6ZShgWyR7ZnVuY3Rpb25UeXBlfV1gLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKGBbJHtmdW5jdGlvblR5cGV9ICR7dHJ1bmNhdGUobmFtZSwgb3B0aW9ucy50cnVuY2F0ZSAtIDExKX1dYCwgJ3NwZWNpYWwnKTtcbn1cblxuZnVuY3Rpb24gaW5zcGVjdE1hcEVudHJ5KFtrZXksIHZhbHVlXSwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gNDtcbiAgICBrZXkgPSBvcHRpb25zLmluc3BlY3Qoa2V5LCBvcHRpb25zKTtcbiAgICBvcHRpb25zLnRydW5jYXRlIC09IGtleS5sZW5ndGg7XG4gICAgdmFsdWUgPSBvcHRpb25zLmluc3BlY3QodmFsdWUsIG9wdGlvbnMpO1xuICAgIHJldHVybiBgJHtrZXl9ID0+ICR7dmFsdWV9YDtcbn1cbi8vIElFMTEgZG9lc24ndCBzdXBwb3J0IGBtYXAuZW50cmllcygpYFxuZnVuY3Rpb24gbWFwVG9FbnRyaWVzKG1hcCkge1xuICAgIGNvbnN0IGVudHJpZXMgPSBbXTtcbiAgICBtYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICBlbnRyaWVzLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZW50cmllcztcbn1cbmZ1bmN0aW9uIGluc3BlY3RNYXAobWFwLCBvcHRpb25zKSB7XG4gICAgaWYgKG1hcC5zaXplID09PSAwKVxuICAgICAgICByZXR1cm4gJ01hcHt9JztcbiAgICBvcHRpb25zLnRydW5jYXRlIC09IDc7XG4gICAgcmV0dXJuIGBNYXB7ICR7aW5zcGVjdExpc3QobWFwVG9FbnRyaWVzKG1hcCksIG9wdGlvbnMsIGluc3BlY3RNYXBFbnRyeSl9IH1gO1xufVxuXG5jb25zdCBpc05hTiA9IE51bWJlci5pc05hTiB8fCAoaSA9PiBpICE9PSBpKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbmZ1bmN0aW9uIGluc3BlY3ROdW1iZXIobnVtYmVyLCBvcHRpb25zKSB7XG4gICAgaWYgKGlzTmFOKG51bWJlcikpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuc3R5bGl6ZSgnTmFOJywgJ251bWJlcicpO1xuICAgIH1cbiAgICBpZiAobnVtYmVyID09PSBJbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKCdJbmZpbml0eScsICdudW1iZXInKTtcbiAgICB9XG4gICAgaWYgKG51bWJlciA9PT0gLUluZmluaXR5KSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnN0eWxpemUoJy1JbmZpbml0eScsICdudW1iZXInKTtcbiAgICB9XG4gICAgaWYgKG51bWJlciA9PT0gMCkge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKDEgLyBudW1iZXIgPT09IEluZmluaXR5ID8gJyswJyA6ICctMCcsICdudW1iZXInKTtcbiAgICB9XG4gICAgcmV0dXJuIG9wdGlvbnMuc3R5bGl6ZSh0cnVuY2F0ZShTdHJpbmcobnVtYmVyKSwgb3B0aW9ucy50cnVuY2F0ZSksICdudW1iZXInKTtcbn1cblxuZnVuY3Rpb24gaW5zcGVjdEJpZ0ludChudW1iZXIsIG9wdGlvbnMpIHtcbiAgICBsZXQgbnVtcyA9IHRydW5jYXRlKG51bWJlci50b1N0cmluZygpLCBvcHRpb25zLnRydW5jYXRlIC0gMSk7XG4gICAgaWYgKG51bXMgIT09IHRydW5jYXRvcilcbiAgICAgICAgbnVtcyArPSAnbic7XG4gICAgcmV0dXJuIG9wdGlvbnMuc3R5bGl6ZShudW1zLCAnYmlnaW50Jyk7XG59XG5cbmZ1bmN0aW9uIGluc3BlY3RSZWdFeHAodmFsdWUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBmbGFncyA9IHZhbHVlLnRvU3RyaW5nKCkuc3BsaXQoJy8nKVsyXTtcbiAgICBjb25zdCBzb3VyY2VMZW5ndGggPSBvcHRpb25zLnRydW5jYXRlIC0gKDIgKyBmbGFncy5sZW5ndGgpO1xuICAgIGNvbnN0IHNvdXJjZSA9IHZhbHVlLnNvdXJjZTtcbiAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKGAvJHt0cnVuY2F0ZShzb3VyY2UsIHNvdXJjZUxlbmd0aCl9LyR7ZmxhZ3N9YCwgJ3JlZ2V4cCcpO1xufVxuXG4vLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBgQXJyYXkuZnJvbShzZXQpYFxuZnVuY3Rpb24gYXJyYXlGcm9tU2V0KHNldCkge1xuICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xuICAgIHNldC5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZXM7XG59XG5mdW5jdGlvbiBpbnNwZWN0U2V0KHNldCwgb3B0aW9ucykge1xuICAgIGlmIChzZXQuc2l6ZSA9PT0gMClcbiAgICAgICAgcmV0dXJuICdTZXR7fSc7XG4gICAgb3B0aW9ucy50cnVuY2F0ZSAtPSA3O1xuICAgIHJldHVybiBgU2V0eyAke2luc3BlY3RMaXN0KGFycmF5RnJvbVNldChzZXQpLCBvcHRpb25zKX0gfWA7XG59XG5cbmNvbnN0IHN0cmluZ0VzY2FwZUNoYXJzID0gbmV3IFJlZ0V4cChcIlsnXFxcXHUwMDAwLVxcXFx1MDAxZlxcXFx1MDA3Zi1cXFxcdTAwOWZcXFxcdTAwYWRcXFxcdTA2MDAtXFxcXHUwNjA0XFxcXHUwNzBmXFxcXHUxN2I0XFxcXHUxN2I1XCIgK1xuICAgICdcXFxcdTIwMGMtXFxcXHUyMDBmXFxcXHUyMDI4LVxcXFx1MjAyZlxcXFx1MjA2MC1cXFxcdTIwNmZcXFxcdWZlZmZcXFxcdWZmZjAtXFxcXHVmZmZmXScsICdnJyk7XG5jb25zdCBlc2NhcGVDaGFyYWN0ZXJzID0ge1xuICAgICdcXGInOiAnXFxcXGInLFxuICAgICdcXHQnOiAnXFxcXHQnLFxuICAgICdcXG4nOiAnXFxcXG4nLFxuICAgICdcXGYnOiAnXFxcXGYnLFxuICAgICdcXHInOiAnXFxcXHInLFxuICAgIFwiJ1wiOiBcIlxcXFwnXCIsXG4gICAgJ1xcXFwnOiAnXFxcXFxcXFwnLFxufTtcbmNvbnN0IGhleCA9IDE2O1xuZnVuY3Rpb24gZXNjYXBlKGNoYXIpIHtcbiAgICByZXR1cm4gKGVzY2FwZUNoYXJhY3RlcnNbY2hhcl0gfHxcbiAgICAgICAgYFxcXFx1JHtgMDAwMCR7Y2hhci5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKGhleCl9YC5zbGljZSgtNCl9YCk7XG59XG5mdW5jdGlvbiBpbnNwZWN0U3RyaW5nKHN0cmluZywgb3B0aW9ucykge1xuICAgIGlmIChzdHJpbmdFc2NhcGVDaGFycy50ZXN0KHN0cmluZykpIHtcbiAgICAgICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2Uoc3RyaW5nRXNjYXBlQ2hhcnMsIGVzY2FwZSk7XG4gICAgfVxuICAgIHJldHVybiBvcHRpb25zLnN0eWxpemUoYCcke3RydW5jYXRlKHN0cmluZywgb3B0aW9ucy50cnVuY2F0ZSAtIDIpfSdgLCAnc3RyaW5nJyk7XG59XG5cbmZ1bmN0aW9uIGluc3BlY3RTeW1ib2wodmFsdWUpIHtcbiAgICBpZiAoJ2Rlc2NyaXB0aW9uJyBpbiBTeW1ib2wucHJvdG90eXBlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5kZXNjcmlwdGlvbiA/IGBTeW1ib2woJHt2YWx1ZS5kZXNjcmlwdGlvbn0pYCA6ICdTeW1ib2woKSc7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpO1xufVxuXG5jb25zdCBnZXRQcm9taXNlVmFsdWUgPSAoKSA9PiAnUHJvbWlzZXvigKZ9JztcblxuZnVuY3Rpb24gaW5zcGVjdE9iamVjdCQxKG9iamVjdCwgb3B0aW9ucykge1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmplY3QpO1xuICAgIGNvbnN0IHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID8gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpIDogW107XG4gICAgaWYgKHByb3BlcnRpZXMubGVuZ3RoID09PSAwICYmIHN5bWJvbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiAne30nO1xuICAgIH1cbiAgICBvcHRpb25zLnRydW5jYXRlIC09IDQ7XG4gICAgb3B0aW9ucy5zZWVuID0gb3B0aW9ucy5zZWVuIHx8IFtdO1xuICAgIGlmIChvcHRpb25zLnNlZW4uaW5jbHVkZXMob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gJ1tDaXJjdWxhcl0nO1xuICAgIH1cbiAgICBvcHRpb25zLnNlZW4ucHVzaChvYmplY3QpO1xuICAgIGNvbnN0IHByb3BlcnR5Q29udGVudHMgPSBpbnNwZWN0TGlzdChwcm9wZXJ0aWVzLm1hcChrZXkgPT4gW2tleSwgb2JqZWN0W2tleV1dKSwgb3B0aW9ucywgaW5zcGVjdFByb3BlcnR5KTtcbiAgICBjb25zdCBzeW1ib2xDb250ZW50cyA9IGluc3BlY3RMaXN0KHN5bWJvbHMubWFwKGtleSA9PiBba2V5LCBvYmplY3Rba2V5XV0pLCBvcHRpb25zLCBpbnNwZWN0UHJvcGVydHkpO1xuICAgIG9wdGlvbnMuc2Vlbi5wb3AoKTtcbiAgICBsZXQgc2VwID0gJyc7XG4gICAgaWYgKHByb3BlcnR5Q29udGVudHMgJiYgc3ltYm9sQ29udGVudHMpIHtcbiAgICAgICAgc2VwID0gJywgJztcbiAgICB9XG4gICAgcmV0dXJuIGB7ICR7cHJvcGVydHlDb250ZW50c30ke3NlcH0ke3N5bWJvbENvbnRlbnRzfSB9YDtcbn1cblxuY29uc3QgdG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiBmYWxzZTtcbmZ1bmN0aW9uIGluc3BlY3RDbGFzcyh2YWx1ZSwgb3B0aW9ucykge1xuICAgIGxldCBuYW1lID0gJyc7XG4gICAgaWYgKHRvU3RyaW5nVGFnICYmIHRvU3RyaW5nVGFnIGluIHZhbHVlKSB7XG4gICAgICAgIG5hbWUgPSB2YWx1ZVt0b1N0cmluZ1RhZ107XG4gICAgfVxuICAgIG5hbWUgPSBuYW1lIHx8IHZhbHVlLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgLy8gQmFiZWwgdHJhbnNmb3JtcyBhbm9ueW1vdXMgY2xhc3NlcyB0byB0aGUgbmFtZSBgX2NsYXNzYFxuICAgIGlmICghbmFtZSB8fCBuYW1lID09PSAnX2NsYXNzJykge1xuICAgICAgICBuYW1lID0gJzxBbm9ueW1vdXMgQ2xhc3M+JztcbiAgICB9XG4gICAgb3B0aW9ucy50cnVuY2F0ZSAtPSBuYW1lLmxlbmd0aDtcbiAgICByZXR1cm4gYCR7bmFtZX0ke2luc3BlY3RPYmplY3QkMSh2YWx1ZSwgb3B0aW9ucyl9YDtcbn1cblxuZnVuY3Rpb24gaW5zcGVjdEFyZ3VtZW50cyhhcmdzLCBvcHRpb25zKSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKVxuICAgICAgICByZXR1cm4gJ0FyZ3VtZW50c1tdJztcbiAgICBvcHRpb25zLnRydW5jYXRlIC09IDEzO1xuICAgIHJldHVybiBgQXJndW1lbnRzWyAke2luc3BlY3RMaXN0KGFyZ3MsIG9wdGlvbnMpfSBdYDtcbn1cblxuY29uc3QgZXJyb3JLZXlzID0gW1xuICAgICdzdGFjaycsXG4gICAgJ2xpbmUnLFxuICAgICdjb2x1bW4nLFxuICAgICduYW1lJyxcbiAgICAnbWVzc2FnZScsXG4gICAgJ2ZpbGVOYW1lJyxcbiAgICAnbGluZU51bWJlcicsXG4gICAgJ2NvbHVtbk51bWJlcicsXG4gICAgJ251bWJlcicsXG4gICAgJ2Rlc2NyaXB0aW9uJyxcbiAgICAnY2F1c2UnLFxuXTtcbmZ1bmN0aW9uIGluc3BlY3RPYmplY3QoZXJyb3IsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZXJyb3IpLmZpbHRlcihrZXkgPT4gZXJyb3JLZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpO1xuICAgIGNvbnN0IG5hbWUgPSBlcnJvci5uYW1lO1xuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gbmFtZS5sZW5ndGg7XG4gICAgbGV0IG1lc3NhZ2UgPSAnJztcbiAgICBpZiAodHlwZW9mIGVycm9yLm1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG1lc3NhZ2UgPSB0cnVuY2F0ZShlcnJvci5tZXNzYWdlLCBvcHRpb25zLnRydW5jYXRlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHByb3BlcnRpZXMudW5zaGlmdCgnbWVzc2FnZScpO1xuICAgIH1cbiAgICBtZXNzYWdlID0gbWVzc2FnZSA/IGA6ICR7bWVzc2FnZX1gIDogJyc7XG4gICAgb3B0aW9ucy50cnVuY2F0ZSAtPSBtZXNzYWdlLmxlbmd0aCArIDU7XG4gICAgb3B0aW9ucy5zZWVuID0gb3B0aW9ucy5zZWVuIHx8IFtdO1xuICAgIGlmIChvcHRpb25zLnNlZW4uaW5jbHVkZXMoZXJyb3IpKSB7XG4gICAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgfVxuICAgIG9wdGlvbnMuc2Vlbi5wdXNoKGVycm9yKTtcbiAgICBjb25zdCBwcm9wZXJ0eUNvbnRlbnRzID0gaW5zcGVjdExpc3QocHJvcGVydGllcy5tYXAoa2V5ID0+IFtrZXksIGVycm9yW2tleV1dKSwgb3B0aW9ucywgaW5zcGVjdFByb3BlcnR5KTtcbiAgICByZXR1cm4gYCR7bmFtZX0ke21lc3NhZ2V9JHtwcm9wZXJ0eUNvbnRlbnRzID8gYCB7ICR7cHJvcGVydHlDb250ZW50c30gfWAgOiAnJ31gO1xufVxuXG5mdW5jdGlvbiBpbnNwZWN0QXR0cmlidXRlKFtrZXksIHZhbHVlXSwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gMztcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybiBgJHtvcHRpb25zLnN0eWxpemUoU3RyaW5nKGtleSksICd5ZWxsb3cnKX1gO1xuICAgIH1cbiAgICByZXR1cm4gYCR7b3B0aW9ucy5zdHlsaXplKFN0cmluZyhrZXkpLCAneWVsbG93Jyl9PSR7b3B0aW9ucy5zdHlsaXplKGBcIiR7dmFsdWV9XCJgLCAnc3RyaW5nJyl9YDtcbn1cbmZ1bmN0aW9uIGluc3BlY3ROb2RlQ29sbGVjdGlvbihjb2xsZWN0aW9uLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGluc3BlY3RMaXN0KGNvbGxlY3Rpb24sIG9wdGlvbnMsIGluc3BlY3ROb2RlLCAnXFxuJyk7XG59XG5mdW5jdGlvbiBpbnNwZWN0Tm9kZShub2RlLCBvcHRpb25zKSB7XG4gICAgc3dpdGNoIChub2RlLm5vZGVUeXBlKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIHJldHVybiBpbnNwZWN0SFRNTChub2RlLCBvcHRpb25zKTtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW5zcGVjdChub2RlLmRhdGEsIG9wdGlvbnMpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW5zcGVjdChub2RlLCBvcHRpb25zKTtcbiAgICB9XG59XG4vLyBAdHMtaWdub3JlIChEZW5vIGRvZXNuJ3QgaGF2ZSBFbGVtZW50KVxuZnVuY3Rpb24gaW5zcGVjdEhUTUwoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5hbWVzKCk7XG4gICAgY29uc3QgbmFtZSA9IGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGhlYWQgPSBvcHRpb25zLnN0eWxpemUoYDwke25hbWV9YCwgJ3NwZWNpYWwnKTtcbiAgICBjb25zdCBoZWFkQ2xvc2UgPSBvcHRpb25zLnN0eWxpemUoYD5gLCAnc3BlY2lhbCcpO1xuICAgIGNvbnN0IHRhaWwgPSBvcHRpb25zLnN0eWxpemUoYDwvJHtuYW1lfT5gLCAnc3BlY2lhbCcpO1xuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gbmFtZS5sZW5ndGggKiAyICsgNTtcbiAgICBsZXQgcHJvcGVydHlDb250ZW50cyA9ICcnO1xuICAgIGlmIChwcm9wZXJ0aWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcHJvcGVydHlDb250ZW50cyArPSAnICc7XG4gICAgICAgIHByb3BlcnR5Q29udGVudHMgKz0gaW5zcGVjdExpc3QocHJvcGVydGllcy5tYXAoKGtleSkgPT4gW2tleSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoa2V5KV0pLCBvcHRpb25zLCBpbnNwZWN0QXR0cmlidXRlLCAnICcpO1xuICAgIH1cbiAgICBvcHRpb25zLnRydW5jYXRlIC09IHByb3BlcnR5Q29udGVudHMubGVuZ3RoO1xuICAgIGNvbnN0IHRydW5jYXRlID0gb3B0aW9ucy50cnVuY2F0ZTtcbiAgICBsZXQgY2hpbGRyZW4gPSBpbnNwZWN0Tm9kZUNvbGxlY3Rpb24oZWxlbWVudC5jaGlsZHJlbiwgb3B0aW9ucyk7XG4gICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCA+IHRydW5jYXRlKSB7XG4gICAgICAgIGNoaWxkcmVuID0gYCR7dHJ1bmNhdG9yfSgke2VsZW1lbnQuY2hpbGRyZW4ubGVuZ3RofSlgO1xuICAgIH1cbiAgICByZXR1cm4gYCR7aGVhZH0ke3Byb3BlcnR5Q29udGVudHN9JHtoZWFkQ2xvc2V9JHtjaGlsZHJlbn0ke3RhaWx9YDtcbn1cblxuLyogIVxuICogbG91cGVcbiAqIENvcHlyaWdodChjKSAyMDEzIEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cbmNvbnN0IHN5bWJvbHNTdXBwb3J0ZWQgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wuZm9yID09PSAnZnVuY3Rpb24nO1xuY29uc3QgY2hhaUluc3BlY3QgPSBzeW1ib2xzU3VwcG9ydGVkID8gU3ltYm9sLmZvcignY2hhaS9pbnNwZWN0JykgOiAnQEBjaGFpL2luc3BlY3QnO1xuY29uc3Qgbm9kZUluc3BlY3QgPSBTeW1ib2wuZm9yKCdub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbScpO1xuY29uc3QgY29uc3RydWN0b3JNYXAgPSBuZXcgV2Vha01hcCgpO1xuY29uc3Qgc3RyaW5nVGFnTWFwID0ge307XG5jb25zdCBiYXNlVHlwZXNNYXAgPSB7XG4gICAgdW5kZWZpbmVkOiAodmFsdWUsIG9wdGlvbnMpID0+IG9wdGlvbnMuc3R5bGl6ZSgndW5kZWZpbmVkJywgJ3VuZGVmaW5lZCcpLFxuICAgIG51bGw6ICh2YWx1ZSwgb3B0aW9ucykgPT4gb3B0aW9ucy5zdHlsaXplKCdudWxsJywgJ251bGwnKSxcbiAgICBib29sZWFuOiAodmFsdWUsIG9wdGlvbnMpID0+IG9wdGlvbnMuc3R5bGl6ZShTdHJpbmcodmFsdWUpLCAnYm9vbGVhbicpLFxuICAgIEJvb2xlYW46ICh2YWx1ZSwgb3B0aW9ucykgPT4gb3B0aW9ucy5zdHlsaXplKFN0cmluZyh2YWx1ZSksICdib29sZWFuJyksXG4gICAgbnVtYmVyOiBpbnNwZWN0TnVtYmVyLFxuICAgIE51bWJlcjogaW5zcGVjdE51bWJlcixcbiAgICBiaWdpbnQ6IGluc3BlY3RCaWdJbnQsXG4gICAgQmlnSW50OiBpbnNwZWN0QmlnSW50LFxuICAgIHN0cmluZzogaW5zcGVjdFN0cmluZyxcbiAgICBTdHJpbmc6IGluc3BlY3RTdHJpbmcsXG4gICAgZnVuY3Rpb246IGluc3BlY3RGdW5jdGlvbixcbiAgICBGdW5jdGlvbjogaW5zcGVjdEZ1bmN0aW9uLFxuICAgIHN5bWJvbDogaW5zcGVjdFN5bWJvbCxcbiAgICAvLyBBIFN5bWJvbCBwb2x5ZmlsbCB3aWxsIHJldHVybiBgU3ltYm9sYCBub3QgYHN5bWJvbGAgZnJvbSB0eXBlZGV0ZWN0XG4gICAgU3ltYm9sOiBpbnNwZWN0U3ltYm9sLFxuICAgIEFycmF5OiBpbnNwZWN0QXJyYXksXG4gICAgRGF0ZTogaW5zcGVjdERhdGUsXG4gICAgTWFwOiBpbnNwZWN0TWFwLFxuICAgIFNldDogaW5zcGVjdFNldCxcbiAgICBSZWdFeHA6IGluc3BlY3RSZWdFeHAsXG4gICAgUHJvbWlzZTogZ2V0UHJvbWlzZVZhbHVlLFxuICAgIC8vIFdlYWtTZXQsIFdlYWtNYXAgYXJlIHRvdGFsbHkgb3BhcXVlIHRvIHVzXG4gICAgV2Vha1NldDogKHZhbHVlLCBvcHRpb25zKSA9PiBvcHRpb25zLnN0eWxpemUoJ1dlYWtTZXR74oCmfScsICdzcGVjaWFsJyksXG4gICAgV2Vha01hcDogKHZhbHVlLCBvcHRpb25zKSA9PiBvcHRpb25zLnN0eWxpemUoJ1dlYWtNYXB74oCmfScsICdzcGVjaWFsJyksXG4gICAgQXJndW1lbnRzOiBpbnNwZWN0QXJndW1lbnRzLFxuICAgIEludDhBcnJheTogaW5zcGVjdFR5cGVkQXJyYXksXG4gICAgVWludDhBcnJheTogaW5zcGVjdFR5cGVkQXJyYXksXG4gICAgVWludDhDbGFtcGVkQXJyYXk6IGluc3BlY3RUeXBlZEFycmF5LFxuICAgIEludDE2QXJyYXk6IGluc3BlY3RUeXBlZEFycmF5LFxuICAgIFVpbnQxNkFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgICBJbnQzMkFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgICBVaW50MzJBcnJheTogaW5zcGVjdFR5cGVkQXJyYXksXG4gICAgRmxvYXQzMkFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgICBGbG9hdDY0QXJyYXk6IGluc3BlY3RUeXBlZEFycmF5LFxuICAgIEdlbmVyYXRvcjogKCkgPT4gJycsXG4gICAgRGF0YVZpZXc6ICgpID0+ICcnLFxuICAgIEFycmF5QnVmZmVyOiAoKSA9PiAnJyxcbiAgICBFcnJvcjogaW5zcGVjdE9iamVjdCxcbiAgICBIVE1MQ29sbGVjdGlvbjogaW5zcGVjdE5vZGVDb2xsZWN0aW9uLFxuICAgIE5vZGVMaXN0OiBpbnNwZWN0Tm9kZUNvbGxlY3Rpb24sXG59O1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmNvbnN0IGluc3BlY3RDdXN0b20gPSAodmFsdWUsIG9wdGlvbnMsIHR5cGUsIGluc3BlY3RGbikgPT4ge1xuICAgIGlmIChjaGFpSW5zcGVjdCBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWVbY2hhaUluc3BlY3RdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZVtjaGFpSW5zcGVjdF0ob3B0aW9ucyk7XG4gICAgfVxuICAgIGlmIChub2RlSW5zcGVjdCBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWVbbm9kZUluc3BlY3RdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZVtub2RlSW5zcGVjdF0ob3B0aW9ucy5kZXB0aCwgb3B0aW9ucywgaW5zcGVjdEZuKTtcbiAgICB9XG4gICAgaWYgKCdpbnNwZWN0JyBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUuaW5zcGVjdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdmFsdWUuaW5zcGVjdChvcHRpb25zLmRlcHRoLCBvcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKCdjb25zdHJ1Y3RvcicgaW4gdmFsdWUgJiYgY29uc3RydWN0b3JNYXAuaGFzKHZhbHVlLmNvbnN0cnVjdG9yKSkge1xuICAgICAgICByZXR1cm4gY29uc3RydWN0b3JNYXAuZ2V0KHZhbHVlLmNvbnN0cnVjdG9yKSh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGlmIChzdHJpbmdUYWdNYXBbdHlwZV0pIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZ1RhZ01hcFt0eXBlXSh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiAnJztcbn07XG5jb25zdCB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuZnVuY3Rpb24gaW5zcGVjdCQxKHZhbHVlLCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBvcHRpb25zID0gbm9ybWFsaXNlT3B0aW9ucyhvcHRzLCBpbnNwZWN0JDEpO1xuICAgIGNvbnN0IHsgY3VzdG9tSW5zcGVjdCB9ID0gb3B0aW9ucztcbiAgICBsZXQgdHlwZSA9IHZhbHVlID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIHZhbHVlO1xuICAgIGlmICh0eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICB0eXBlID0gdG9TdHJpbmcuY2FsbCh2YWx1ZSkuc2xpY2UoOCwgLTEpO1xuICAgIH1cbiAgICAvLyBJZiBpdCBpcyBhIGJhc2UgdmFsdWUgdGhhdCB3ZSBhbHJlYWR5IHN1cHBvcnQsIHRoZW4gdXNlIExvdXBlJ3MgaW5zcGVjdG9yXG4gICAgaWYgKHR5cGUgaW4gYmFzZVR5cGVzTWFwKSB7XG4gICAgICAgIHJldHVybiBiYXNlVHlwZXNNYXBbdHlwZV0odmFsdWUsIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvLyBJZiBgb3B0aW9ucy5jdXN0b21JbnNwZWN0YCBpcyBzZXQgdG8gdHJ1ZSB0aGVuIHRyeSB0byB1c2UgdGhlIGN1c3RvbSBpbnNwZWN0b3JcbiAgICBpZiAoY3VzdG9tSW5zcGVjdCAmJiB2YWx1ZSkge1xuICAgICAgICBjb25zdCBvdXRwdXQgPSBpbnNwZWN0Q3VzdG9tKHZhbHVlLCBvcHRpb25zLCB0eXBlLCBpbnNwZWN0JDEpO1xuICAgICAgICBpZiAob3V0cHV0KSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG91dHB1dCA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgICAgICAgIHJldHVybiBpbnNwZWN0JDEob3V0cHV0LCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwcm90byA9IHZhbHVlID8gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSA6IGZhbHNlO1xuICAgIC8vIElmIGl0J3MgYSBwbGFpbiBPYmplY3QgdGhlbiB1c2UgTG91cGUncyBpbnNwZWN0b3JcbiAgICBpZiAocHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG8gPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGluc3BlY3RPYmplY3QkMSh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8vIFNwZWNpZmljYWxseSBhY2NvdW50IGZvciBIVE1MRWxlbWVudHNcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiBIVE1MRWxlbWVudCA9PT0gJ2Z1bmN0aW9uJyAmJiB2YWx1ZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBpbnNwZWN0SFRNTCh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGlmICgnY29uc3RydWN0b3InIGluIHZhbHVlKSB7XG4gICAgICAgIC8vIElmIGl0IGlzIGEgY2xhc3MsIGluc3BlY3QgaXQgbGlrZSBhbiBvYmplY3QgYnV0IGFkZCB0aGUgY29uc3RydWN0b3IgbmFtZVxuICAgICAgICBpZiAodmFsdWUuY29uc3RydWN0b3IgIT09IE9iamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIGluc3BlY3RDbGFzcyh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgaXQgaXMgYW4gb2JqZWN0IHdpdGggYW4gYW5vbnltb3VzIHByb3RvdHlwZSwgZGlzcGxheSBpdCBhcyBhbiBvYmplY3QuXG4gICAgICAgIHJldHVybiBpbnNwZWN0T2JqZWN0JDEodmFsdWUsIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvLyBsYXN0IGNoYW5jZSB0byBjaGVjayBpZiBpdCdzIGFuIG9iamVjdFxuICAgIGlmICh2YWx1ZSA9PT0gT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gaW5zcGVjdE9iamVjdCQxKHZhbHVlLCBvcHRpb25zKTtcbiAgICB9XG4gICAgLy8gV2UgaGF2ZSBydW4gb3V0IG9mIG9wdGlvbnMhIEp1c3Qgc3RyaW5naWZ5IHRoZSB2YWx1ZVxuICAgIHJldHVybiBvcHRpb25zLnN0eWxpemUoU3RyaW5nKHZhbHVlKSwgdHlwZSk7XG59XG5cbmNvbnN0IHsgQXN5bW1ldHJpY01hdGNoZXIsIERPTUNvbGxlY3Rpb24sIERPTUVsZW1lbnQsIEltbXV0YWJsZSwgUmVhY3RFbGVtZW50LCBSZWFjdFRlc3RDb21wb25lbnQgfSA9IHBsdWdpbnM7XG5jb25zdCBQTFVHSU5TID0gW1xuXHRSZWFjdFRlc3RDb21wb25lbnQsXG5cdFJlYWN0RWxlbWVudCxcblx0RE9NRWxlbWVudCxcblx0RE9NQ29sbGVjdGlvbixcblx0SW1tdXRhYmxlLFxuXHRBc3ltbWV0cmljTWF0Y2hlclxuXTtcbmZ1bmN0aW9uIHN0cmluZ2lmeShvYmplY3QsIG1heERlcHRoID0gMTAsIHsgbWF4TGVuZ3RoLCBmaWx0ZXJOb2RlLCAuLi5vcHRpb25zIH0gPSB7fSkge1xuXHRjb25zdCBNQVhfTEVOR1RIID0gbWF4TGVuZ3RoID8/IDFlNDtcblx0bGV0IHJlc3VsdDtcblx0Ly8gQ29udmVydCBzdHJpbmcgc2VsZWN0b3IgdG8gZmlsdGVyIGZ1bmN0aW9uXG5cdGNvbnN0IGZpbHRlckZuID0gdHlwZW9mIGZpbHRlck5vZGUgPT09IFwic3RyaW5nXCIgPyBjcmVhdGVOb2RlRmlsdGVyRnJvbVNlbGVjdG9yKGZpbHRlck5vZGUpIDogZmlsdGVyTm9kZTtcblx0Y29uc3QgcGx1Z2lucyA9IGZpbHRlckZuID8gW1xuXHRcdFJlYWN0VGVzdENvbXBvbmVudCxcblx0XHRSZWFjdEVsZW1lbnQsXG5cdFx0Y3JlYXRlRE9NRWxlbWVudEZpbHRlcihmaWx0ZXJGbiksXG5cdFx0RE9NQ29sbGVjdGlvbixcblx0XHRJbW11dGFibGUsXG5cdFx0QXN5bW1ldHJpY01hdGNoZXJcblx0XSA6IFBMVUdJTlM7XG5cdHRyeSB7XG5cdFx0cmVzdWx0ID0gZm9ybWF0JDEob2JqZWN0LCB7XG5cdFx0XHRtYXhEZXB0aCxcblx0XHRcdGVzY2FwZVN0cmluZzogZmFsc2UsXG5cdFx0XHRwbHVnaW5zLFxuXHRcdFx0Li4ub3B0aW9uc1xuXHRcdH0pO1xuXHR9IGNhdGNoIHtcblx0XHRyZXN1bHQgPSBmb3JtYXQkMShvYmplY3QsIHtcblx0XHRcdGNhbGxUb0pTT046IGZhbHNlLFxuXHRcdFx0bWF4RGVwdGgsXG5cdFx0XHRlc2NhcGVTdHJpbmc6IGZhbHNlLFxuXHRcdFx0cGx1Z2lucyxcblx0XHRcdC4uLm9wdGlvbnNcblx0XHR9KTtcblx0fVxuXHQvLyBQcmV2ZW50cyBpbmZpbml0ZSBsb29wIGh0dHBzOi8vZ2l0aHViLmNvbS92aXRlc3QtZGV2L3ZpdGVzdC9pc3N1ZXMvNzI0OVxuXHRyZXR1cm4gcmVzdWx0Lmxlbmd0aCA+PSBNQVhfTEVOR1RIICYmIG1heERlcHRoID4gMSA/IHN0cmluZ2lmeShvYmplY3QsIE1hdGguZmxvb3IoTWF0aC5taW4obWF4RGVwdGgsIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSAvIDIpLCB7XG5cdFx0bWF4TGVuZ3RoLFxuXHRcdGZpbHRlck5vZGUsXG5cdFx0Li4ub3B0aW9uc1xuXHR9KSA6IHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZU5vZGVGaWx0ZXJGcm9tU2VsZWN0b3Ioc2VsZWN0b3IpIHtcblx0Y29uc3QgRUxFTUVOVF9OT0RFID0gMTtcblx0Y29uc3QgQ09NTUVOVF9OT0RFID0gODtcblx0cmV0dXJuIChub2RlKSA9PiB7XG5cdFx0Ly8gRmlsdGVyIG91dCBjb21tZW50c1xuXHRcdGlmIChub2RlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0Ly8gRmlsdGVyIG91dCBlbGVtZW50cyBtYXRjaGluZyB0aGUgc2VsZWN0b3Jcblx0XHRpZiAobm9kZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFICYmIG5vZGUubWF0Y2hlcykge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0cmV0dXJuICFub2RlLm1hdGNoZXMoc2VsZWN0b3IpO1xuXHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fTtcbn1cbmNvbnN0IGZvcm1hdFJlZ0V4cCA9IC8lW3Nkamlmb09jJV0vZztcbmZ1bmN0aW9uIGJhc2VGb3JtYXQoYXJncywgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IGZvcm1hdEFyZyA9IChpdGVtLCBpbnNwZWNPcHRpb25zKSA9PiB7XG5cdFx0aWYgKG9wdGlvbnMucHJldHRpZnlPYmplY3QpIHtcblx0XHRcdHJldHVybiBzdHJpbmdpZnkoaXRlbSwgdW5kZWZpbmVkLCB7XG5cdFx0XHRcdHByaW50QmFzaWNQcm90b3R5cGU6IGZhbHNlLFxuXHRcdFx0XHRlc2NhcGVTdHJpbmc6IGZhbHNlXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIGluc3BlY3QoaXRlbSwgaW5zcGVjT3B0aW9ucyk7XG5cdH07XG5cdGlmICh0eXBlb2YgYXJnc1swXSAhPT0gXCJzdHJpbmdcIikge1xuXHRcdGNvbnN0IG9iamVjdHMgPSBbXTtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcblx0XHRcdG9iamVjdHMucHVzaChmb3JtYXRBcmcoYXJnc1tpXSwge1xuXHRcdFx0XHRkZXB0aDogMCxcblx0XHRcdFx0Y29sb3JzOiBmYWxzZVxuXHRcdFx0fSkpO1xuXHRcdH1cblx0XHRyZXR1cm4gb2JqZWN0cy5qb2luKFwiIFwiKTtcblx0fVxuXHRjb25zdCBsZW4gPSBhcmdzLmxlbmd0aDtcblx0bGV0IGkgPSAxO1xuXHRjb25zdCB0ZW1wbGF0ZSA9IGFyZ3NbMF07XG5cdGxldCBzdHIgPSBTdHJpbmcodGVtcGxhdGUpLnJlcGxhY2UoZm9ybWF0UmVnRXhwLCAoeCkgPT4ge1xuXHRcdGlmICh4ID09PSBcIiUlXCIpIHtcblx0XHRcdHJldHVybiBcIiVcIjtcblx0XHR9XG5cdFx0aWYgKGkgPj0gbGVuKSB7XG5cdFx0XHRyZXR1cm4geDtcblx0XHR9XG5cdFx0c3dpdGNoICh4KSB7XG5cdFx0XHRjYXNlIFwiJXNcIjoge1xuXHRcdFx0XHRjb25zdCB2YWx1ZSA9IGFyZ3NbaSsrXTtcblx0XHRcdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJiaWdpbnRcIikge1xuXHRcdFx0XHRcdHJldHVybiBgJHt2YWx1ZS50b1N0cmluZygpfW5gO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgJiYgdmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkge1xuXHRcdFx0XHRcdHJldHVybiBcIi0wXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdGlmICh0eXBlb2YgdmFsdWUudG9TdHJpbmcgPT09IFwiZnVuY3Rpb25cIiAmJiB2YWx1ZS50b1N0cmluZyAhPT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZykge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBmb3JtYXRBcmcodmFsdWUsIHtcblx0XHRcdFx0XHRcdGRlcHRoOiAwLFxuXHRcdFx0XHRcdFx0Y29sb3JzOiBmYWxzZVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBTdHJpbmcodmFsdWUpO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSBcIiVkXCI6IHtcblx0XHRcdFx0Y29uc3QgdmFsdWUgPSBhcmdzW2krK107XG5cdFx0XHRcdGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYmlnaW50XCIpIHtcblx0XHRcdFx0XHRyZXR1cm4gYCR7dmFsdWUudG9TdHJpbmcoKX1uYDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodHlwZW9mIHZhbHVlID09PSBcInN5bWJvbFwiKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFwiTmFOXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIE51bWJlcih2YWx1ZSkudG9TdHJpbmcoKTtcblx0XHRcdH1cblx0XHRcdGNhc2UgXCIlaVwiOiB7XG5cdFx0XHRcdGNvbnN0IHZhbHVlID0gYXJnc1tpKytdO1xuXHRcdFx0XHRpZiAodHlwZW9mIHZhbHVlID09PSBcImJpZ2ludFwiKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGAke3ZhbHVlLnRvU3RyaW5nKCl9bmA7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIE51bWJlci5wYXJzZUludChTdHJpbmcodmFsdWUpKS50b1N0cmluZygpO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSBcIiVmXCI6IHJldHVybiBOdW1iZXIucGFyc2VGbG9hdChTdHJpbmcoYXJnc1tpKytdKSkudG9TdHJpbmcoKTtcblx0XHRcdGNhc2UgXCIlb1wiOiByZXR1cm4gZm9ybWF0QXJnKGFyZ3NbaSsrXSwge1xuXHRcdFx0XHRzaG93SGlkZGVuOiB0cnVlLFxuXHRcdFx0XHRzaG93UHJveHk6IHRydWVcblx0XHRcdH0pO1xuXHRcdFx0Y2FzZSBcIiVPXCI6IHJldHVybiBmb3JtYXRBcmcoYXJnc1tpKytdKTtcblx0XHRcdGNhc2UgXCIlY1wiOiB7XG5cdFx0XHRcdGkrKztcblx0XHRcdFx0cmV0dXJuIFwiXCI7XG5cdFx0XHR9XG5cdFx0XHRjYXNlIFwiJWpcIjogdHJ5IHtcblx0XHRcdFx0cmV0dXJuIEpTT04uc3RyaW5naWZ5KGFyZ3NbaSsrXSk7XG5cdFx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdFx0Y29uc3QgbSA9IGVyci5tZXNzYWdlO1xuXHRcdFx0XHRpZiAobS5pbmNsdWRlcyhcImNpcmN1bGFyIHN0cnVjdHVyZVwiKSB8fCBtLmluY2x1ZGVzKFwiY3ljbGljIHN0cnVjdHVyZXNcIikgfHwgbS5pbmNsdWRlcyhcImN5Y2xpYyBvYmplY3RcIikpIHtcblx0XHRcdFx0XHRyZXR1cm4gXCJbQ2lyY3VsYXJdXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhyb3cgZXJyO1xuXHRcdFx0fVxuXHRcdFx0ZGVmYXVsdDogcmV0dXJuIHg7XG5cdFx0fVxuXHR9KTtcblx0Zm9yIChsZXQgeCA9IGFyZ3NbaV07IGkgPCBsZW47IHggPSBhcmdzWysraV0pIHtcblx0XHRpZiAoeCA9PT0gbnVsbCB8fCB0eXBlb2YgeCAhPT0gXCJvYmplY3RcIikge1xuXHRcdFx0c3RyICs9IGAgJHt0eXBlb2YgeCA9PT0gXCJzeW1ib2xcIiA/IHgudG9TdHJpbmcoKSA6IHh9YDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c3RyICs9IGAgJHtmb3JtYXRBcmcoeCl9YDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHN0cjtcbn1cbmZ1bmN0aW9uIGZvcm1hdCguLi5hcmdzKSB7XG5cdHJldHVybiBiYXNlRm9ybWF0KGFyZ3MpO1xufVxuZnVuY3Rpb24gYnJvd3NlckZvcm1hdCguLi5hcmdzKSB7XG5cdHJldHVybiBiYXNlRm9ybWF0KGFyZ3MsIHsgcHJldHRpZnlPYmplY3Q6IHRydWUgfSk7XG59XG5mdW5jdGlvbiBpbnNwZWN0KG9iaiwgb3B0aW9ucyA9IHt9KSB7XG5cdGlmIChvcHRpb25zLnRydW5jYXRlID09PSAwKSB7XG5cdFx0b3B0aW9ucy50cnVuY2F0ZSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcblx0fVxuXHRyZXR1cm4gaW5zcGVjdCQxKG9iaiwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiBvYmpEaXNwbGF5KG9iaiwgb3B0aW9ucyA9IHt9KSB7XG5cdGlmICh0eXBlb2Ygb3B0aW9ucy50cnVuY2F0ZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdG9wdGlvbnMudHJ1bmNhdGUgPSA0MDtcblx0fVxuXHRjb25zdCBzdHIgPSBpbnNwZWN0KG9iaiwgb3B0aW9ucyk7XG5cdGNvbnN0IHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKTtcblx0aWYgKG9wdGlvbnMudHJ1bmNhdGUgJiYgc3RyLmxlbmd0aCA+PSBvcHRpb25zLnRydW5jYXRlKSB7XG5cdFx0aWYgKHR5cGUgPT09IFwiW29iamVjdCBGdW5jdGlvbl1cIikge1xuXHRcdFx0Y29uc3QgZm4gPSBvYmo7XG5cdFx0XHRyZXR1cm4gIWZuLm5hbWUgPyBcIltGdW5jdGlvbl1cIiA6IGBbRnVuY3Rpb246ICR7Zm4ubmFtZX1dYDtcblx0XHR9IGVsc2UgaWYgKHR5cGUgPT09IFwiW29iamVjdCBBcnJheV1cIikge1xuXHRcdFx0cmV0dXJuIGBbIEFycmF5KCR7b2JqLmxlbmd0aH0pIF1gO1xuXHRcdH0gZWxzZSBpZiAodHlwZSA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIikge1xuXHRcdFx0Y29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG5cdFx0XHRjb25zdCBrc3RyID0ga2V5cy5sZW5ndGggPiAyID8gYCR7a2V5cy5zcGxpY2UoMCwgMikuam9pbihcIiwgXCIpfSwgLi4uYCA6IGtleXMuam9pbihcIiwgXCIpO1xuXHRcdFx0cmV0dXJuIGB7IE9iamVjdCAoJHtrc3RyfSkgfWA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBzdHI7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBzdHI7XG59XG5cbmV4cG9ydCB7IGJyb3dzZXJGb3JtYXQsIGZvcm1hdCwgZm9ybWF0UmVnRXhwLCBpbnNwZWN0LCBvYmpEaXNwbGF5LCBzdHJpbmdpZnkgfTtcbiJdLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMF0sIm1hcHBpbmdzIjoiOztBQUVBLE1BQU0sYUFBYTtDQUNmLE1BQU0sQ0FBQyxLQUFLLElBQUk7Q0FDaEIsS0FBSyxDQUFDLEtBQUssSUFBSTtDQUNmLFFBQVEsQ0FBQyxLQUFLLElBQUk7Q0FDbEIsV0FBVyxDQUFDLEtBQUssSUFBSTtDQUVyQixTQUFTLENBQUMsS0FBSyxJQUFJO0NBQ25CLFFBQVEsQ0FBQyxLQUFLLElBQUk7Q0FDbEIsUUFBUSxDQUFDLEtBQUssSUFBSTtDQUdsQixPQUFPLENBQUMsTUFBTSxJQUFJO0NBQ2xCLEtBQUssQ0FBQyxNQUFNLElBQUk7Q0FDaEIsT0FBTyxDQUFDLE1BQU0sSUFBSTtDQUNsQixRQUFRLENBQUMsTUFBTSxJQUFJO0NBQ25CLE1BQU0sQ0FBQyxNQUFNLElBQUk7Q0FDakIsU0FBUyxDQUFDLE1BQU0sSUFBSTtDQUNwQixNQUFNLENBQUMsTUFBTSxJQUFJO0NBQ2pCLE9BQU8sQ0FBQyxNQUFNLElBQUk7Q0FDbEIsYUFBYSxDQUFDLFFBQVEsSUFBSTtDQUMxQixXQUFXLENBQUMsUUFBUSxJQUFJO0NBQ3hCLGFBQWEsQ0FBQyxRQUFRLElBQUk7Q0FDMUIsY0FBYyxD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