@cartanova/qgrid-cli 2.10.9 → 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.
- package/bundle/dist/_virtual/_rolldown/runtime.js +1 -10
- package/bundle/dist/application/monit/log-buffer.js +12 -6
- package/bundle/dist/application/monit/monit.frame.js +11 -3
- package/bundle/dist/application/monit/monit.types.js +1 -1
- package/bundle/dist/application/qgrid/conv-routing.js +9 -6
- package/bundle/dist/application/qgrid/expired-token-reminder.js +2 -2
- package/bundle/dist/application/qgrid/oauth.js +31 -4
- package/bundle/dist/application/qgrid/qgrid-image-generation.js +1 -1
- package/bundle/dist/application/qgrid/qgrid-response-format.js +22 -20
- package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +43 -34
- package/bundle/dist/application/qgrid/qgrid.dispatcher.js +128 -93
- package/bundle/dist/application/qgrid/qgrid.frame.js +930 -49
- package/bundle/dist/application/qgrid/qgrid.types.js +212 -5
- package/bundle/dist/application/qgrid/schema-prompt.js +75 -48
- package/bundle/dist/application/qgrid/slack-user-map.js +1 -1
- package/bundle/dist/application/qgrid/token-death.js +1 -1
- package/bundle/dist/application/qgrid/token-subscriber.js +83 -30
- package/bundle/dist/application/qgrid/token-trigger-setup.js +1 -1
- package/bundle/dist/application/qgrid/token-window-keepalive.js +8 -6
- package/bundle/dist/application/qgrid/tool-emulation-schema.js +13 -13
- package/bundle/dist/application/qgrid/tool-emulation.js +19 -15
- package/bundle/dist/application/request-log/json-schema-type-text.js +29 -12
- package/bundle/dist/application/request-log/request-log.model.js +83 -69
- package/bundle/dist/application/request-log/request-log.types.js +8 -2
- package/bundle/dist/application/request-log/zod-code-format.js +1 -1
- package/bundle/dist/application/request-log-step/request-log-step.model.js +1 -1
- package/bundle/dist/application/request-log-step/request-log-step.types.js +1 -1
- package/bundle/dist/application/setting/setting.constant.js +1 -1
- package/bundle/dist/application/setting/setting.model.js +2 -2
- package/bundle/dist/application/setting/setting.store.js +2 -2
- package/bundle/dist/application/setting/setting.types.js +1 -1
- package/bundle/dist/application/sonamu.generated.js +40 -16
- package/bundle/dist/application/sonamu.generated.sso.js +2 -1
- package/bundle/dist/application/token/token.model.js +26 -9
- package/bundle/dist/application/token/token.types.js +20 -3
- package/bundle/dist/i18n/en.js +15 -1
- package/bundle/dist/i18n/ko.js +15 -1
- package/bundle/dist/i18n/sd.generated.js +2 -1
- package/bundle/dist/migrations/20260807133553_manual__backfill_request_log_cost.js +8 -6
- package/bundle/dist/migrations/20261018215031_alter_request_logs_add1_alter1.js +15 -0
- package/bundle/dist/server-bootstrap.js +4 -2
- package/bundle/dist/server-error-handler.js +1 -1
- package/bundle/dist/sonamu.config.js +37 -8
- package/bundle/dist/startup-migrations.js +17 -7
- package/bundle/dist/testing/global.js +1 -1
- package/bundle/dist/testing/schema-bench.js +0 -0
- package/bundle/dist/testing/test-database-name.js +1 -1
- package/bundle/dist/utils/providers/anthropic/anthropic-constants.js +1 -1
- package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +11 -5
- package/bundle/dist/utils/providers/anthropic/anthropic-quota.js +4 -4
- package/bundle/dist/utils/providers/anthropic/anthropic-thinking.js +1 -1
- package/bundle/dist/utils/providers/anthropic/claude-session.js +20 -19
- package/bundle/dist/utils/providers/anthropic/fence-strip.js +1 -1
- package/bundle/dist/utils/providers/anthropic/stream-json-adapter.js +49 -23
- package/bundle/dist/utils/providers/common/credentials.js +5 -1
- package/bundle/dist/utils/providers/common/effort.js +3 -3
- package/bundle/dist/utils/providers/common/model-cost.js +69 -14
- package/bundle/dist/utils/providers/common/provider-types.js +29 -1
- package/bundle/dist/utils/providers/common/schema-validation.js +78 -40
- package/bundle/dist/utils/providers/common/smooth-weighted-round-robin.js +1 -1
- package/bundle/dist/utils/providers/common/strictifier.js +62 -43
- package/bundle/dist/utils/providers/common/thinking.js +3 -2
- package/bundle/dist/utils/providers/common/ttft.js +1 -1
- package/bundle/dist/utils/providers/grok/grok-backend-protocol.js +427 -0
- package/bundle/dist/utils/providers/grok/grok-constants.js +55 -0
- package/bundle/dist/utils/providers/grok/grok-direct-client.js +196 -0
- package/bundle/dist/utils/providers/grok/grok-dispatcher.js +1313 -0
- package/bundle/dist/utils/providers/grok/grok-headers.js +118 -0
- package/bundle/dist/utils/providers/grok/grok-media-client.js +420 -0
- package/bundle/dist/utils/providers/grok/grok-models.js +114 -0
- package/bundle/dist/utils/providers/grok/grok-oauth.js +455 -0
- package/bundle/dist/utils/providers/grok/grok-quota.js +119 -0
- package/bundle/dist/utils/providers/grok/grok-refresh.js +192 -0
- package/bundle/dist/utils/providers/grok/grok-types.js +186 -0
- package/bundle/dist/utils/providers/grok/grok-voice-client.js +199 -0
- package/bundle/dist/utils/providers/grok/index.js +11 -0
- package/bundle/dist/utils/providers/openai/openai-backend-protocol.js +111 -83
- package/bundle/dist/utils/providers/openai/openai-callback-relay.js +3 -2
- package/bundle/dist/utils/providers/openai/openai-constants.js +1 -1
- package/bundle/dist/utils/providers/openai/openai-direct-client.js +23 -7
- package/bundle/dist/utils/providers/openai/openai-dispatcher.js +143 -106
- package/bundle/dist/utils/providers/openai/openai-image-generation.js +48 -33
- package/bundle/dist/utils/providers/openai/openai-oauth.js +28 -13
- package/bundle/dist/utils/providers/openai/openai-quota.js +38 -27
- package/bundle/dist/utils/providers/openai/openai-refresh.js +17 -9
- package/bundle/dist/utils/providers/openai/openai-sse.js +1 -1
- package/bundle/dist/utils/providers/openai/openai-transport-config.js +1 -1
- package/bundle/dist/utils/quiet-hours.js +1 -1
- package/bundle/dist/utils/slack-notify.js +14 -8
- package/bundle/dist/utils/subset-loaders.js +4 -5
- package/bundle/src/application/monit/log-buffer.ts +23 -9
- package/bundle/src/application/monit/monit.frame.ts +22 -5
- package/bundle/src/application/monit/monit.types.ts +6 -0
- package/bundle/src/application/qgrid/conv-routing.test.ts +76 -4
- package/bundle/src/application/qgrid/conv-routing.ts +35 -9
- package/bundle/src/application/qgrid/expired-token-reminder.ts +9 -1
- package/bundle/src/application/qgrid/oauth.ts +51 -15
- package/bundle/src/application/qgrid/qgrid-image-generation.ts +9 -0
- package/bundle/src/application/qgrid/qgrid-response-format.ts +50 -25
- package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +33 -0
- package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +87 -40
- package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +97 -0
- package/bundle/src/application/qgrid/qgrid.dispatcher.ts +274 -126
- package/bundle/src/application/qgrid/qgrid.frame.test.ts +1013 -3
- package/bundle/src/application/qgrid/qgrid.frame.ts +1415 -60
- package/bundle/src/application/qgrid/qgrid.types.ts +335 -0
- package/bundle/src/application/qgrid/schema-prompt.ts +105 -41
- package/bundle/src/application/qgrid/slack-user-map.ts +5 -0
- package/bundle/src/application/qgrid/token-death.ts +4 -0
- package/bundle/src/application/qgrid/token-subscriber.test.ts +21 -19
- package/bundle/src/application/qgrid/token-subscriber.ts +186 -53
- package/bundle/src/application/qgrid/token-trigger-setup.ts +2 -0
- package/bundle/src/application/qgrid/token-window-keepalive.ts +49 -6
- package/bundle/src/application/qgrid/tool-emulation-schema.ts +33 -29
- package/bundle/src/application/qgrid/tool-emulation.ts +52 -27
- package/bundle/src/application/request-log/json-schema-type-text.test.ts +5 -5
- package/bundle/src/application/request-log/json-schema-type-text.ts +81 -26
- package/bundle/src/application/request-log/request-log.entity.json +8 -0
- package/bundle/src/application/request-log/request-log.model.test.ts +111 -4
- package/bundle/src/application/request-log/request-log.model.ts +279 -145
- package/bundle/src/application/request-log/request-log.types.ts +17 -0
- package/bundle/src/application/request-log/zod-code-format.ts +11 -0
- package/bundle/src/application/request-log-step/request-log-step.model.ts +1 -0
- package/bundle/src/application/request-log-step/request-log-step.types.ts +2 -0
- package/bundle/src/application/setting/setting.constant.ts +9 -0
- package/bundle/src/application/setting/setting.model.ts +12 -2
- package/bundle/src/application/setting/setting.store.ts +5 -1
- package/bundle/src/application/setting/setting.types.ts +8 -0
- package/bundle/src/application/sonamu.generated.http +135 -0
- package/bundle/src/application/sonamu.generated.sso.ts +3 -0
- package/bundle/src/application/sonamu.generated.ts +29 -0
- package/bundle/src/application/token/token.identity.test.ts +20 -0
- package/bundle/src/application/token/token.model.ts +66 -7
- package/bundle/src/application/token/token.types.ts +24 -1
- package/bundle/src/i18n/en.ts +19 -0
- package/bundle/src/i18n/ko.ts +21 -0
- package/bundle/src/i18n/sd.generated.ts +24 -2
- package/bundle/src/migrations/20260807133553_manual__backfill_request_log_cost.ts +16 -8
- package/bundle/src/migrations/20261018215031_alter_request_logs_add1_alter1.ts +15 -0
- package/bundle/src/server-bootstrap.ts +4 -2
- package/bundle/src/server-error-handler.ts +1 -0
- package/bundle/src/sonamu.config.ts +69 -7
- package/bundle/src/startup-migrations.ts +27 -9
- package/bundle/src/testing/global.ts +20 -0
- package/bundle/src/testing/schema-bench.ts +105 -30
- package/bundle/src/testing/test-database-name.ts +2 -0
- package/bundle/src/utils/providers/anthropic/anthropic-constants.ts +8 -0
- package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +41 -6
- package/bundle/src/utils/providers/anthropic/anthropic-quota.ts +7 -3
- package/bundle/src/utils/providers/anthropic/anthropic-thinking.ts +6 -0
- package/bundle/src/utils/providers/anthropic/claude-session.ts +58 -24
- package/bundle/src/utils/providers/anthropic/fence-strip.ts +11 -0
- package/bundle/src/utils/providers/anthropic/stream-json-adapter.ts +110 -45
- package/bundle/src/utils/providers/common/credentials.ts +8 -0
- package/bundle/src/utils/providers/common/effort.ts +9 -2
- package/bundle/src/utils/providers/common/model-cost.test.ts +48 -1
- package/bundle/src/utils/providers/common/model-cost.ts +259 -158
- package/bundle/src/utils/providers/common/provider-dispatcher.ts +98 -2
- package/bundle/src/utils/providers/common/provider-types.ts +46 -3
- package/bundle/src/utils/providers/common/schema-validation.test.ts +5 -1
- package/bundle/src/utils/providers/common/schema-validation.ts +124 -56
- package/bundle/src/utils/providers/common/smooth-weighted-round-robin.ts +4 -0
- package/bundle/src/utils/providers/common/strictifier.ts +185 -59
- package/bundle/src/utils/providers/common/thinking.ts +2 -2
- package/bundle/src/utils/providers/common/ttft.ts +4 -2
- package/bundle/src/utils/providers/grok/__fixtures__/golden-responses-1.0.60.json +164 -0
- package/bundle/src/utils/providers/grok/grok-backend-protocol.test.ts +325 -0
- package/bundle/src/utils/providers/grok/grok-backend-protocol.ts +721 -0
- package/bundle/src/utils/providers/grok/grok-constants.ts +105 -0
- package/bundle/src/utils/providers/grok/grok-direct-client.test.ts +179 -0
- package/bundle/src/utils/providers/grok/grok-direct-client.ts +313 -0
- package/bundle/src/utils/providers/grok/grok-dispatcher.test.ts +1395 -0
- package/bundle/src/utils/providers/grok/grok-dispatcher.ts +2105 -0
- package/bundle/src/utils/providers/grok/grok-headers.test.ts +149 -0
- package/bundle/src/utils/providers/grok/grok-headers.ts +199 -0
- package/bundle/src/utils/providers/grok/grok-media-client.test.ts +446 -0
- package/bundle/src/utils/providers/grok/grok-media-client.ts +703 -0
- package/bundle/src/utils/providers/grok/grok-models.test.ts +96 -0
- package/bundle/src/utils/providers/grok/grok-models.ts +161 -0
- package/bundle/src/utils/providers/grok/grok-oauth.test.ts +406 -0
- package/bundle/src/utils/providers/grok/grok-oauth.ts +771 -0
- package/bundle/src/utils/providers/grok/grok-quota.test.ts +142 -0
- package/bundle/src/utils/providers/grok/grok-quota.ts +198 -0
- package/bundle/src/utils/providers/grok/grok-refresh.test.ts +239 -0
- package/bundle/src/utils/providers/grok/grok-refresh.ts +325 -0
- package/bundle/src/utils/providers/grok/grok-types.test.ts +252 -0
- package/bundle/src/utils/providers/grok/grok-types.ts +374 -0
- package/bundle/src/utils/providers/grok/grok-voice-client.test.ts +321 -0
- package/bundle/src/utils/providers/grok/grok-voice-client.ts +284 -0
- package/bundle/src/utils/providers/grok/index.ts +20 -0
- package/bundle/src/utils/providers/openai/openai-backend-protocol.ts +221 -137
- package/bundle/src/utils/providers/openai/openai-callback-relay.ts +12 -1
- package/bundle/src/utils/providers/openai/openai-constants.ts +2 -0
- package/bundle/src/utils/providers/openai/openai-direct-client.ts +111 -21
- package/bundle/src/utils/providers/openai/openai-dispatcher.ts +322 -169
- package/bundle/src/utils/providers/openai/openai-image-generation.ts +116 -36
- package/bundle/src/utils/providers/openai/openai-oauth.ts +48 -20
- package/bundle/src/utils/providers/openai/openai-quota.ts +77 -46
- package/bundle/src/utils/providers/openai/openai-refresh.ts +42 -18
- package/bundle/src/utils/providers/openai/openai-sse.ts +27 -3
- package/bundle/src/utils/providers/openai/openai-transport-config.ts +2 -0
- package/bundle/src/utils/quiet-hours.ts +12 -1
- package/bundle/src/utils/slack-notify.ts +44 -13
- package/bundle/src/utils/subset-loaders.ts +7 -7
- package/bundle/web-dist/client/assets/clsx-5XM_pHvN.js +1 -0
- package/bundle/web-dist/client/assets/index-BA7uQ-6c.js +31 -0
- package/bundle/web-dist/client/assets/index-Be2qCZmI.css +1 -0
- package/bundle/web-dist/client/assets/logs-C47OJGEI.js +1 -0
- package/bundle/web-dist/client/assets/monit-BS9no0dU.js +4 -0
- package/bundle/web-dist/client/assets/plus-sdACTfH0.js +1 -0
- package/bundle/web-dist/client/assets/refresh-cw-CY8o_1cT.js +1 -0
- package/bundle/web-dist/client/assets/request-model-BRtFuZvj.js +1 -0
- package/bundle/web-dist/client/assets/routes-kqgkUxE8.js +5 -0
- package/bundle/web-dist/client/assets/{services.generated-BsieU37H.js → services.generated-CefiDXEv.js} +5 -5
- package/bundle/web-dist/client/assets/settings-DNDvFGSw.js +1 -0
- package/bundle/web-dist/client/assets/show-u8Np69q3.js +2 -0
- package/bundle/web-dist/client/assets/tokens-QvP410NW.js +1 -0
- package/bundle/web-dist/client/assets/total-cost-MnfKU8IN.js +1 -0
- package/bundle/web-dist/client/assets/use-oauth-login-flow-Bzdh28Ws.js +1 -0
- package/bundle/web-dist/client/assets/use-update-token-mutation-CfJKaxmR.js +1 -0
- package/bundle/web-dist/client/assets/vendor-react-CUFFrVN9.js +244 -0
- package/bundle/web-dist/client/assets/vendor-tanstack-Bf_jag9G.js +1 -0
- package/bundle/web-dist/client/index.html +6 -6
- package/bundle/web-dist/server/assets/clsx-D_N5PN_2.js +16 -0
- package/bundle/web-dist/server/assets/{lazyRouteComponent-Dtd0NR4r.js → lazyRouteComponent-D8iTIHyn.js} +129 -2
- package/bundle/web-dist/server/assets/logs-B3OTd9hy.js +825 -0
- package/bundle/web-dist/server/assets/{monit-DvzribSE.js → monit-B2hqorPe.js} +385 -126
- package/bundle/web-dist/server/assets/plus-DwG7h9kq.js +28 -0
- package/bundle/web-dist/server/assets/{react-dom-B4a6-uuR.js → react-dom-BIYQzBqG.js} +2 -129
- package/bundle/web-dist/server/assets/refresh-cw-mMBkwOq0.js +44 -0
- package/bundle/web-dist/server/assets/{request-model-CbqfnQOJ.js → request-model-I6OdODSH.js} +15 -6
- package/bundle/web-dist/server/assets/{routes-BAPWTizT.js → routes-B95YlUv2.js} +760 -213
- package/bundle/web-dist/server/assets/{services.generated-CEbGjsI0.js → services.generated-DQATJ6qf.js} +12821 -12194
- package/bundle/web-dist/server/assets/settings-C3gbGk0m.js +830 -0
- package/bundle/web-dist/server/assets/{show-CxVZTAdv.js → show-Bxaj3rhH.js} +1355 -419
- package/bundle/web-dist/server/assets/tokens-CZjH3cB7.js +1038 -0
- package/bundle/web-dist/server/assets/total-cost-fTE9Xy82.js +18 -0
- package/bundle/web-dist/server/assets/use-oauth-login-flow-CKDHgc3U.js +2379 -0
- package/bundle/web-dist/server/assets/{use-update-token-mutation-CfYmk_4_.js → use-update-token-mutation-BEbgOzaa.js} +1 -1
- package/bundle/web-dist/server/entry-server.generated.js +4303 -22810
- package/dist/cli.js +9 -9
- package/package.json +4 -11
- package/postinstall.mjs +12 -0
- package/skills/qgrid/SKILL.md +1 -0
- package/skills/qgrid/references/cli-env-and-server-boot.md +4 -1
- package/skills/qgrid/references/decision-rationale.md +24 -1
- package/skills/qgrid/references/grok-runtime.md +89 -0
- package/skills/qgrid/references/provider-runtime-differences.md +30 -29
- package/skills/qgrid/references/repo-map.md +10 -0
- package/skills/qgrid/references/request-log-run-lifecycle.md +1 -1
- package/skills/qgrid/references/sonamu-api-web-flow.md +1 -1
- package/skills/qgrid/references/token-auth-quota-lifecycle.md +56 -3
- package/bundle/dist/node_modules/.pnpm/@jridgewell_sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.js +0 -406
- package/bundle/dist/node_modules/.pnpm/@vitest_expect@4.1.10/node_modules/@vitest/expect/dist/index.js +0 -1507
- package/bundle/dist/node_modules/.pnpm/@vitest_pretty-format@4.1.10/node_modules/@vitest/pretty-format/dist/index.js +0 -887
- package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/chunk-artifact.js +0 -2756
- package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/index.js +0 -8
- package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/utils.js +0 -8
- package/bundle/dist/node_modules/.pnpm/@vitest_snapshot@4.1.10/node_modules/@vitest/snapshot/dist/index.js +0 -922
- package/bundle/dist/node_modules/.pnpm/@vitest_spy@4.1.10/node_modules/@vitest/spy/dist/index.js +0 -386
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.js +0 -121
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/constants.js +0 -51
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/diff.js +0 -1317
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/display.js +0 -561
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/error.js +0 -40
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/helpers.js +0 -272
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/offset.js +0 -27
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/serialize.js +0 -77
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/source-map.js +0 -381
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/timers.js +0 -51
- package/bundle/dist/node_modules/.pnpm/chai@6.2.2/node_modules/chai/index.js +0 -2986
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.js +0 -10
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.js +0 -109
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.js +0 -10
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.js +0 -10
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.js +0 -10
- package/bundle/dist/node_modules/.pnpm/magic-string@0.30.21/node_modules/magic-string/dist/magic-string.es.js +0 -1126
- package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/index.js +0 -21
- package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.js +0 -432
- package/bundle/dist/node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.js +0 -517
- package/bundle/dist/node_modules/.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.js +0 -101
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/bundle/dist/testing/setup-mocks.js +0 -16
- package/bundle/src/testing/setup-mocks.ts +0 -44
- package/bundle/web-dist/client/assets/index-Bw2s88Ot.css +0 -1
- package/bundle/web-dist/client/assets/index-CrXKu_J8.js +0 -106
- package/bundle/web-dist/client/assets/logs-B2SmWJXA.js +0 -1
- package/bundle/web-dist/client/assets/monit-D-JwXXoA.js +0 -1
- package/bundle/web-dist/client/assets/plus-B62CuqT8.js +0 -1
- package/bundle/web-dist/client/assets/refresh-cw-NNcU0Cmq.js +0 -1
- package/bundle/web-dist/client/assets/request-model-CojtinqK.js +0 -1
- package/bundle/web-dist/client/assets/routes-C5r4gTvY.js +0 -5
- package/bundle/web-dist/client/assets/settings-D3tDSAck.js +0 -1
- package/bundle/web-dist/client/assets/show-Cah_kUKC.js +0 -2
- package/bundle/web-dist/client/assets/tokens-DU2Iyxxd.js +0 -1
- package/bundle/web-dist/client/assets/use-oauth-login-flow-D0UaR9_e.js +0 -1
- package/bundle/web-dist/client/assets/use-update-token-mutation-DAq0F8p-.js +0 -1
- package/bundle/web-dist/client/assets/vendor-react-DH4kUfK2.js +0 -9
- package/bundle/web-dist/client/assets/vendor-tanstack-DJRQAbrY.js +0 -1
- package/bundle/web-dist/server/assets/logs-l91avYif.js +0 -509
- package/bundle/web-dist/server/assets/plus-KZrECewT.js +0 -19
- package/bundle/web-dist/server/assets/refresh-cw-BND93JrF.js +0 -23
- package/bundle/web-dist/server/assets/settings-BZR5HSAL.js +0 -461
- package/bundle/web-dist/server/assets/tokens-D1hb4eKk.js +0 -448
- package/bundle/web-dist/server/assets/use-oauth-login-flow-Cvdy0zF8.js +0 -178
- package/dist/cli.d.ts +0 -10
- /package/bundle/web-dist/client/assets/{cost-DH2jZbrw.js → cost-DB3HbU7T.js} +0 -0
- /package/bundle/web-dist/client/assets/{preload-helper-ca-nBW7U.js → preload-helper-DWTEM3RW.js} +0 -0
- /package/bundle/web-dist/server/assets/{cost-eEHeTRT5.js → cost-BC9yzyA9.js} +0 -0
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import { composeSystemWithSchemaContract } from "./schema-prompt.js";
|
|
1
2
|
import { RequestLogModel } from "../request-log/request-log.model.js";
|
|
2
3
|
import { estimateImageGenerationCostMicroUsd, imageGenerationCostMethod } from "./qgrid-image-generation.js";
|
|
3
|
-
import { buildImageGenerationToolSteps, formatResponseForLog, getImageParts } from "./qgrid-response-format.js";
|
|
4
|
+
import { buildImageGenerationToolSteps, extractInputImagesForToolArgs, formatResponseForLog, getImageParts } from "./qgrid-response-format.js";
|
|
5
|
+
import { z } from "zod";
|
|
4
6
|
import { getLogger } from "@logtape/logtape";
|
|
5
7
|
//#region src/application/qgrid/qgrid-run-lifecycle.ts
|
|
6
8
|
const logger = getLogger(["qgrid", "run-lifecycle"]);
|
|
@@ -18,13 +20,16 @@ function withProviderPrefix(routeModel, model) {
|
|
|
18
20
|
/**
|
|
19
21
|
* history는 원본 그대로 저장하기보다는, run 분석에 필요한 user/assistant 정보만 필터링해서 저장
|
|
20
22
|
*/
|
|
23
|
+
const StoredHistoryMessage = z.looseObject({
|
|
24
|
+
type: z.literal("message"),
|
|
25
|
+
role: z.enum(["user", "assistant"])
|
|
26
|
+
});
|
|
21
27
|
function filterHistoryForStorage(rawHistory) {
|
|
22
28
|
if (!rawHistory) return void 0;
|
|
23
29
|
try {
|
|
24
|
-
const filtered = JSON.parse(rawHistory).
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
return record.type === "message" && (record.role === "user" || record.role === "assistant");
|
|
30
|
+
const filtered = z.array(z.unknown()).parse(JSON.parse(rawHistory)).flatMap((item) => {
|
|
31
|
+
const message = StoredHistoryMessage.safeParse(item);
|
|
32
|
+
return message.success ? [message.data] : [];
|
|
28
33
|
});
|
|
29
34
|
return filtered.length > 0 ? filtered : void 0;
|
|
30
35
|
} catch {
|
|
@@ -54,14 +59,16 @@ async function beforeQuery(args) {
|
|
|
54
59
|
await cleanupStaleRuns();
|
|
55
60
|
} else {
|
|
56
61
|
await cleanupStaleRuns();
|
|
62
|
+
const inputImages = extractInputImagesForToolArgs(args);
|
|
57
63
|
requestLogId = await RequestLogModel.createRun({
|
|
58
64
|
user_prompt: args.prompt,
|
|
59
|
-
system_prompt: args.system,
|
|
65
|
+
system_prompt: args.model?.startsWith("anthropic/") ? composeSystemWithSchemaContract(args.system, args) : args.system,
|
|
60
66
|
requested_model_name: args.model,
|
|
61
67
|
effort: args.thinking === false ? void 0 : args.effort,
|
|
62
68
|
service_tier: args.model?.startsWith("openai/") ? args.serviceTier : void 0,
|
|
63
69
|
project_name: args.projectName,
|
|
64
70
|
history: filterHistoryForStorage(args.history),
|
|
71
|
+
input_images: inputImages.length > 0 ? inputImages : void 0,
|
|
65
72
|
tools: args.tools?.length ? args.tools : void 0,
|
|
66
73
|
is_image_generation: args.imageGeneration === "auto" ? false : args.imageGeneration,
|
|
67
74
|
json_schema: args.jsonSchema ?? null
|
|
@@ -121,7 +128,7 @@ async function afterQuery(requestLogId, stepIndex, args, result) {
|
|
|
121
128
|
}
|
|
122
129
|
const agg = await RequestLogModel.aggregateStepUsage(requestLogId);
|
|
123
130
|
const responseText = formatResponseForLog(result);
|
|
124
|
-
|
|
131
|
+
const finishParams = {
|
|
125
132
|
status: "succeeded",
|
|
126
133
|
response: responseText,
|
|
127
134
|
response_json_ok: args.jsonSchema ? isParseableJson(responseText) : null,
|
|
@@ -140,10 +147,11 @@ async function afterQuery(requestLogId, stepIndex, args, result) {
|
|
|
140
147
|
cost_usd: agg.cost_usd,
|
|
141
148
|
cost_source: agg.cost_source,
|
|
142
149
|
image_cost_usd: imageCostMicroUsd,
|
|
143
|
-
...imageParts.length > 0 ? { is_image_generation: true } : {},
|
|
144
150
|
image_cost_method: imageCostMicroUsd !== null ? imageGenerationCostMethod(args.imageGenerationOptions, result) : null,
|
|
145
151
|
history: filterHistoryForStorage(args.history)
|
|
146
|
-
}
|
|
152
|
+
};
|
|
153
|
+
if (imageParts.length > 0) finishParams.is_image_generation = true;
|
|
154
|
+
await RequestLogModel.finishRun(requestLogId, finishParams);
|
|
147
155
|
return {};
|
|
148
156
|
}
|
|
149
157
|
async function finishRunWithError(requestLogId, errorMessage, args, completedStep) {
|
|
@@ -157,38 +165,39 @@ async function finishTerminalRun(requestLogId, status, errorMessage, args, compl
|
|
|
157
165
|
if (completedStep && args) try {
|
|
158
166
|
await appendGenerateStep(requestLogId, completedStep.stepIndex, args, completedStep.result);
|
|
159
167
|
} catch (e) {
|
|
160
|
-
logger.error(`appendGenerateStep failed while finishing ${status}: ${e.message}`);
|
|
168
|
+
logger.error(`appendGenerateStep failed while finishing ${status}: ${e instanceof Error ? e.message : String(e)}`);
|
|
161
169
|
}
|
|
162
170
|
let aggregate;
|
|
163
171
|
try {
|
|
164
172
|
aggregate = await RequestLogModel.aggregateStepUsage(requestLogId);
|
|
165
173
|
} catch (e) {
|
|
166
|
-
logger.error(`aggregateStepUsage failed while finishing ${status}: ${e.message}`);
|
|
174
|
+
logger.error(`aggregateStepUsage failed while finishing ${status}: ${e instanceof Error ? e.message : String(e)}`);
|
|
167
175
|
}
|
|
168
|
-
|
|
176
|
+
const finishParams = {
|
|
169
177
|
status,
|
|
170
178
|
error_message: errorMessage,
|
|
171
|
-
history: args ? filterHistoryForStorage(args.history) : void 0
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
}
|
|
179
|
+
history: args ? filterHistoryForStorage(args.history) : void 0
|
|
180
|
+
};
|
|
181
|
+
if (completedStep) {
|
|
182
|
+
finishParams.token_name = completedStep.result.tokenName;
|
|
183
|
+
finishParams.requested_model_name = withProviderPrefix(args?.model, args?.model ?? completedStep.result.requestedModel ?? completedStep.result.model);
|
|
184
|
+
finishParams.model_name = withProviderPrefix(args?.model, completedStep.result.model);
|
|
185
|
+
}
|
|
186
|
+
if (aggregate) {
|
|
187
|
+
finishParams.input_tokens = aggregate.input_tokens;
|
|
188
|
+
finishParams.output_tokens = aggregate.output_tokens;
|
|
189
|
+
finishParams.cache_read_tokens = aggregate.cache_read_tokens;
|
|
190
|
+
finishParams.cache_creation_tokens = aggregate.cache_creation_tokens;
|
|
191
|
+
finishParams.cache_creation_5m_tokens = aggregate.cache_creation_5m_tokens;
|
|
192
|
+
finishParams.cache_creation_1h_tokens = aggregate.cache_creation_1h_tokens;
|
|
193
|
+
finishParams.duration_ms = aggregate.duration_ms;
|
|
194
|
+
finishParams.fallback_count = aggregate.fallback_count;
|
|
195
|
+
finishParams.cost_usd = aggregate.cost_usd;
|
|
196
|
+
finishParams.cost_source = aggregate.cost_source;
|
|
197
|
+
}
|
|
198
|
+
await RequestLogModel.finishRun(requestLogId, finishParams);
|
|
190
199
|
} catch (e) {
|
|
191
|
-
logger.error(`finishTerminalRun(${status}) failed: ${e.message}`);
|
|
200
|
+
logger.error(`finishTerminalRun(${status}) failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
192
201
|
}
|
|
193
202
|
}
|
|
194
203
|
async function cleanupStaleRuns() {
|
|
@@ -212,10 +221,10 @@ async function performStaleRunCleanup() {
|
|
|
212
221
|
const cleanedCount = (await RequestLogModel.expireStaleToolWaitingRuns(STALE_RUN_THRESHOLD_MS, "tool-call run: no follow-up within 30 minutes")).length;
|
|
213
222
|
if (cleanedCount > 0) logger.info(`cleaned up ${cleanedCount} stale running request logs`);
|
|
214
223
|
} catch (e) {
|
|
215
|
-
logger.error(`stale cleanup failed: ${e.message}`);
|
|
224
|
+
logger.error(`stale cleanup failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
216
225
|
}
|
|
217
226
|
}
|
|
218
227
|
//#endregion
|
|
219
228
|
export { afterQuery, beforeQuery, finishRunAborted, finishRunWithError };
|
|
220
229
|
|
|
221
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQtcnVuLWxpZmVjeWNsZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQtcnVuLWxpZmVjeWNsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuXG5pbXBvcnQgeyBSZXF1ZXN0TG9nTW9kZWwgfSBmcm9tIFwiLi4vcmVxdWVzdC1sb2cvcmVxdWVzdC1sb2cubW9kZWxcIjtcbmltcG9ydCB7XG4gIGVzdGltYXRlSW1hZ2VHZW5lcmF0aW9uQ29zdE1pY3JvVXNkLFxuICBpbWFnZUdlbmVyYXRpb25Db3N0TWV0aG9kLFxufSBmcm9tIFwiLi9xZ3JpZC1pbWFnZS1nZW5lcmF0aW9uXCI7XG5pbXBvcnQge1xuICBidWlsZEltYWdlR2VuZXJhdGlvblRvb2xTdGVwcyxcbiAgZm9ybWF0UmVzcG9uc2VGb3JMb2csXG4gIGdldEltYWdlUGFydHMsXG59IGZyb20gXCIuL3FncmlkLXJlc3BvbnNlLWZvcm1hdFwiO1xuaW1wb3J0IHsgdHlwZSBRZ3JpZFJ1bkNvbnRleHQsIHR5cGUgUXVlcnlJbnB1dCwgdHlwZSBRdWVyeU91dHB1dCB9IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcInJ1bi1saWZlY3ljbGVcIl0pO1xuY29uc3QgU1RBTEVfUlVOX1RIUkVTSE9MRF9NUyA9IDMwICogNjAgKiAxMDAwO1xuY29uc3QgU1RBTEVfQ0xFQU5VUF9JTlRFUlZBTF9NUyA9IDYwICogMTAwMDtcbmxldCBzdGFsZUNsZWFudXBJbkZsaWdodDogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcbmxldCBsYXN0U3RhbGVDbGVhbnVwU3RhcnRlZEF0ID0gMDtcbmZ1bmN0aW9uIHdpdGhQcm92aWRlclByZWZpeChcbiAgcm91dGVNb2RlbDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBtb2RlbDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFtb2RlbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKG1vZGVsLmluY2x1ZGVzKFwiL1wiKSkgcmV0dXJuIG1vZGVsO1xuICBjb25zdCBzbGFzaCA9IHJvdXRlTW9kZWw/LmluZGV4T2YoXCIvXCIpID8/IC0xO1xuICBjb25zdCBwcm92aWRlciA9IHNsYXNoID4gMCA/IHJvdXRlTW9kZWw/LnNsaWNlKDAsIHNsYXNoKSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHByb3ZpZGVyID8gYCR7cHJvdmlkZXJ9LyR7bW9kZWx9YCA6IG1vZGVsO1xufVxuXG4vKipcbiAqIGhpc3RvcnnripQg7JuQ67O4IOq3uOuMgOuhnCDsoIDsnqXtlZjquLDrs7Tri6TripQsIHJ1biDrtoTshJ3sl5Ag7ZWE7JqU7ZWcIHVzZXIvYXNzaXN0YW50IOygleuztOunjCDtlYTthLDrp4HtlbTshJwg7KCA7J6lXG4gKi9cbmZ1bmN0aW9uIGZpbHRlckhpc3RvcnlGb3JTdG9yYWdlKHJhd0hpc3Rvcnk6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHVua25vd24ge1xuICBpZiAoIXJhd0hpc3RvcnkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgaXRlbXMgPSBKU09OLnBhcnNlKHJhd0hpc3RvcnkpIGFzIHVua25vd25bXTtcbiAgICBjb25zdCBmaWx0ZXJlZCA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgaWYgKCFpdGVtIHx8IHR5cGVvZiBpdGVtICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCByZWNvcmQgPSBpdGVtIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgcmV0dXJuIHJlY29yZC50eXBlID09PSBcIm1lc3NhZ2VcIiAmJiAocmVjb3JkLnJvbGUgPT09IFwidXNlclwiIHx8IHJlY29yZC5yb2xlID09PSBcImFzc2lzdGFudFwiKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZmlsdGVyZWQubGVuZ3RoID4gMCA/IGZpbHRlcmVkIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzUGFyc2VhYmxlSnNvbih0ZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBKU09OLnBhcnNlKHRleHQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgUnVuTGlmZWN5Y2xlUmVzdWx0ID0ge1xuICBydW5Db250ZXh0PzogUWdyaWRSdW5Db250ZXh0O1xufTtcblxuLyoqXG4gKiBsb2dnZXItZW5hYmxlZCBxdWVyeS9zdHJlYW0g7J2R64u1IOyghO2bhOyXkCDtmLjstpwuXG4gKlxuICogMSkgYmVmb3JlUXVlcnk6IHJ1biDsg53shLEv6rOE7IaNICsgdG9vbCByZXN1bHQg7JmE66OMICsgc3RhbGUgdG9vbC13YWl0IGNsZWFudXBcbiAqIDIpIGFmdGVyUXVlcnk6IGdlbmVyYXRlIHN0ZXAgKyB0b29sLWNhbGwgc3RlcCArIGZpbmlzaC9rZWVwLW9wZW5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJlZm9yZVF1ZXJ5KGFyZ3M6IFF1ZXJ5SW5wdXQpOiBQcm9taXNlPHtcbiAgcmVxdWVzdExvZ0lkOiBudW1iZXI7XG4gIHN0ZXBJbmRleDogbnVtYmVyO1xufT4ge1xuICBsZXQgcmVxdWVzdExvZ0lkOiBudW1iZXI7XG4gIGxldCBzdGVwSW5kZXggPSAwO1xuXG4gIC8vIHJlcXVlc3RMb2dJZCDqsIAg7J6I7J2EIOuVjOunjCDquLDsobQgcnVuIOyXsOyepS4gdGhyZWFkQ29vcmQg66eMIOyeiOuKlCBjb252IOuKlCDsg4ggcnVuIOycvOuhnCDsi5zsnpEuXG4gIC8vIGNvbnRpbnVhdGlvbiDsnYAgY3JlYXRlUnVuIOydhCDqsbTrhIjrm7Drr4DroZwgcnVuIOydmCB0b29scyDripQg7LKrIOyKpO2FnSDsnqXssKnrtoTsnLzroZwg6rOg7KCV65Cc64ukIOKAlFxuICAvLyBBSSBTREsgcHJlcGFyZVN0ZXAvYWN0aXZlVG9vbHMg66GcIOyKpO2FneuniOuLpCDtiLTshYvsnbQg67CU64CM7Ja064+EIOuhnOq3uOyXkOuKlCDrsJjsmIHrkJjsp4Ag7JWK64qU64ukLlxuICBpZiAoYXJncy5ydW5Db250ZXh0Py5yZXF1ZXN0TG9nSWQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJlcXVlc3RMb2dJZCA9IGFyZ3MucnVuQ29udGV4dC5yZXF1ZXN0TG9nSWQ7XG4gICAgLy8gY2xlYW51cOqzvCDqsJnsnYAgREIgYWR2aXNvcnkgbG9ja+ydhCDsnqHqs6AgdG9vbCDqsrDqs7wg67CY7JiBICsg64uk7J2MIHN0ZXAg7JiI7JW97J2EIO2VnFxuICAgIC8vIHRyYW5zYWN0aW9u7JeQ7IScIOyymOumrO2VnOuLpC4g7Jes65+sIHFncmlkIO2UhOuhnOyEuOyKpCDsgqzsnbTsl5DshJzrj4Qgc3RhbGUgZXhwaXJ56rCAXG4gICAgLy8g64+E7LCpIOykkeyduCBmb2xsb3ctdXDsnYQgZXJyb3LroZwg642u7Ja07JOw7KeAIOuqu+2VnOuLpC5cbiAgICBzdGVwSW5kZXggPSBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuY29udGludWVUb29sUnVuKHJlcXVlc3RMb2dJZCwgYXJncy50b29sUmVzdWx0cyA/PyBbXSk7XG4gICAgYXdhaXQgY2xlYW51cFN0YWxlUnVucygpO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IGNsZWFudXBTdGFsZVJ1bnMoKTtcbiAgICByZXF1ZXN0TG9nSWQgPSBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuY3JlYXRlUnVuKHtcbiAgICAgIHVzZXJfcHJvbXB0OiBhcmdzLnByb21wdCxcbiAgICAgIHN5c3RlbV9wcm9tcHQ6IGFyZ3Muc3lzdGVtLFxuICAgICAgcmVxdWVzdGVkX21vZGVsX25hbWU6IGFyZ3MubW9kZWwsXG4gICAgICBlZmZvcnQ6IGFyZ3MudGhpbmtpbmcgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogYXJncy5lZmZvcnQsXG4gICAgICBzZXJ2aWNlX3RpZXI6IGFyZ3MubW9kZWw/LnN0YXJ0c1dpdGgoXCJvcGVuYWkvXCIpID8gYXJncy5zZXJ2aWNlVGllciA6IHVuZGVmaW5lZCxcbiAgICAgIHByb2plY3RfbmFtZTogYXJncy5wcm9qZWN0TmFtZSxcbiAgICAgIGhpc3Rvcnk6IGZpbHRlckhpc3RvcnlGb3JTdG9yYWdlKGFyZ3MuaGlzdG9yeSksXG4gICAgICB0b29sczogYXJncy50b29scz8ubGVuZ3RoID8gYXJncy50b29scyA6IHVuZGVmaW5lZCxcbiAgICAgIGlzX2ltYWdlX2dlbmVyYXRpb246IGFyZ3MuaW1hZ2VHZW5lcmF0aW9uID09PSBcImF1dG9cIiA/IGZhbHNlIDogYXJncy5pbWFnZUdlbmVyYXRpb24sXG4gICAgICBqc29uX3NjaGVtYTogYXJncy5qc29uU2NoZW1hID8/IG51bGwsXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4geyByZXF1ZXN0TG9nSWQsIHN0ZXBJbmRleCB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBhcHBlbmRHZW5lcmF0ZVN0ZXAoXG4gIHJlcXVlc3RMb2dJZDogbnVtYmVyLFxuICBzdGVwSW5kZXg6IG51bWJlcixcbiAgYXJnczogUXVlcnlJbnB1dCxcbiAgcmVzdWx0OiBRdWVyeU91dHB1dCxcbikge1xuICAvLyBwcm92aWRlcuqwgCBjYW5vbmljYWwgbW9kZWzsnYQg64+M66Ck7KSY64+EIOyalOyyrSByb3V0ZSDsnpDssrQoWzFtXSDrk7Ep64qUIOuztOyhtO2VnOuLpC5cbiAgY29uc3QgcmVxdWVzdGVkTW9kZWxOYW1lID0gd2l0aFByb3ZpZGVyUHJlZml4KFxuICAgIGFyZ3MubW9kZWwsXG4gICAgYXJncy5tb2RlbCA/PyByZXN1bHQucmVxdWVzdGVkTW9kZWwgPz8gcmVzdWx0Lm1vZGVsLFxuICApO1xuICBjb25zdCBzZXJ2ZWRNb2RlbE5hbWUgPSB3aXRoUHJvdmlkZXJQcmVmaXgoYXJncy5tb2RlbCwgcmVzdWx0Lm1vZGVsKTtcblxuICAvLyBnZW5lcmF0ZSBzdGVwIOq4sOuhnVxuICBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuYXBwZW5kU3RlcChyZXF1ZXN0TG9nSWQsIHtcbiAgICBzdGVwX2luZGV4OiBzdGVwSW5kZXgsXG4gICAgdHlwZTogXCJnZW5lcmF0ZVwiLFxuICAgIG1vZGVsX25hbWU6IHNlcnZlZE1vZGVsTmFtZSxcbiAgICByZXF1ZXN0ZWRfbW9kZWxfbmFtZTogcmVxdWVzdGVkTW9kZWxOYW1lLFxuICAgIGZhbGxiYWNrX2NvdW50OiByZXN1bHQubW9kZWxGYWxsYmFja3M/Lmxlbmd0aCA/PyAwLFxuICAgIGlucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmlucHV0X3Rva2VucyxcbiAgICBvdXRwdXRfdG9rZW5zOiByZXN1bHQudXNhZ2Uub3V0cHV0X3Rva2VucyxcbiAgICBjYWNoZV9yZWFkX3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zLFxuICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2VucyxcbiAgICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZV9jcmVhdGlvbl81bV9pbnB1dF90b2tlbnMsXG4gICAgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVfY3JlYXRpb25fMWhfaW5wdXRfdG9rZW5zLFxuICAgIGNvc3RfdXNkOiBNYXRoLnJvdW5kKHJlc3VsdC5jb3N0VXNkICogMV8wMDBfMDAwKSxcbiAgICBjb3N0X3NvdXJjZTogcmVzdWx0LmNvc3RTb3VyY2UsXG4gICAgZHVyYXRpb25fbXM6IHJlc3VsdC5kdXJhdGlvbk1zLFxuICAgIHR0ZnRfbXM6IHJlc3VsdC50dGZ0TXMsXG4gICAgZmluaXNoX3JlYXNvbjogcmVzdWx0LmZpbmlzaFJlYXNvbixcbiAgfSk7XG4gIHJldHVybiB7IHJlcXVlc3RlZE1vZGVsTmFtZSwgc2VydmVkTW9kZWxOYW1lIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZnRlclF1ZXJ5KFxuICByZXF1ZXN0TG9nSWQ6IG51bWJlcixcbiAgc3RlcEluZGV4OiBudW1iZXIsXG4gIGFyZ3M6IFF1ZXJ5SW5wdXQsXG4gIHJlc3VsdDogUXVlcnlPdXRwdXQsXG4pOiBQcm9taXNlPFJ1bkxpZmVjeWNsZVJlc3VsdD4ge1xuICBjb25zdCB7IHJlcXVlc3RlZE1vZGVsTmFtZSwgc2VydmVkTW9kZWxOYW1lIH0gPSBhd2FpdCBhcHBlbmRHZW5lcmF0ZVN0ZXAoXG4gICAgcmVxdWVzdExvZ0lkLFxuICAgIHN0ZXBJbmRleCxcbiAgICBhcmdzLFxuICAgIHJlc3VsdCxcbiAgKTtcblxuICBjb25zdCBpbWFnZVBhcnRzID0gZ2V0SW1hZ2VQYXJ0cyhyZXN1bHQpO1xuICBjb25zdCBpbWFnZUNvc3RNaWNyb1VzZCA9IGVzdGltYXRlSW1hZ2VHZW5lcmF0aW9uQ29zdE1pY3JvVXNkKFxuICAgIHJlc3VsdCxcbiAgICBhcmdzLmltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gICk7XG4gIGZvciAoY29uc3Qgc3RlcCBvZiBidWlsZEltYWdlR2VuZXJhdGlvblRvb2xTdGVwcyhhcmdzLCBpbWFnZVBhcnRzLCBzdGVwSW5kZXgpKSB7XG4gICAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmFwcGVuZFN0ZXAocmVxdWVzdExvZ0lkLCBzdGVwKTtcbiAgfVxuXG4gIGlmIChyZXN1bHQuZmluaXNoUmVhc29uID09PSBcInRvb2wtY2FsbHNcIikge1xuICAgIC8vIHRvb2wtY2FsbCBzdGVw7J2EIOymieyLnCDquLDroZ3tlZjqs6AsIOuLpOydjCBmb2xsb3ctdXDsnbQg6rCZ7J2AIHJvd+yXkCDqsrDqs7zrpbwg7LGE7Jq064ukLlxuICAgIGNvbnN0IHRvb2xDYWxscyA9IHJlc3VsdC5jb250ZW50LmZpbHRlcigoYykgPT4gYy50eXBlID09PSBcInRvb2wtY2FsbFwiKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvb2xDYWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdGMgPSB0b29sQ2FsbHNbaV0hO1xuICAgICAgaWYgKHRjLnR5cGUgIT09IFwidG9vbC1jYWxsXCIpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmFwcGVuZFN0ZXAocmVxdWVzdExvZ0lkLCB7XG4gICAgICAgIHN0ZXBfaW5kZXg6IHN0ZXBJbmRleCxcbiAgICAgICAgdHlwZTogXCJ0b29sX2NhbGxcIixcbiAgICAgICAgdG9vbF9jYWxsX2luZGV4OiBpbWFnZVBhcnRzLmxlbmd0aCArIGksXG4gICAgICAgIHRvb2xfY2FsbF9pZDogdGMudG9vbENhbGxJZCxcbiAgICAgICAgdG9vbF9uYW1lOiB0Yy50b29sTmFtZSxcbiAgICAgICAgdG9vbF9hcmdzOiB0Yy5pbnB1dCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7IHJ1bkNvbnRleHQ6IHsgcmVxdWVzdExvZ0lkIH0gfTtcbiAgfVxuXG4gIC8vIGZpbmlzaFJlYXNvbiA9PT0gXCJzdG9wXCIg4oaSIHJ1biDsooXro4wgKOyghOyytCBzdGVwIHVzYWdlIO2VqeyCsClcbiAgY29uc3QgYWdnID0gYXdhaXQgUmVxdWVzdExvZ01vZGVsLmFnZ3JlZ2F0ZVN0ZXBVc2FnZShyZXF1ZXN0TG9nSWQpO1xuICBjb25zdCByZXNwb25zZVRleHQgPSBmb3JtYXRSZXNwb25zZUZvckxvZyhyZXN1bHQpO1xuICBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuZmluaXNoUnVuKHJlcXVlc3RMb2dJZCwge1xuICAgIHN0YXR1czogXCJzdWNjZWVkZWRcIixcbiAgICByZXNwb25zZTogcmVzcG9uc2VUZXh0LFxuICAgIC8vIHN0cnVjdHVyZWQg7JqU7LKt66eMIO2MkOygle2VnOuLpC4gZGV0aSDrsLDsuZjsnZggYnJva2VuIEpTT04g66WY66W8IOuqqeuhneyXkOyEnCDrsJTroZxcbiAgICAvLyDqtazrs4TtlZjquLAg7JyE7ZWcIOq4sOuhneydtOupsCwg67mEc3RydWN0dXJlZCDsmpTssq3snYAgbnVsbCDroZwg64Ko64qU64ukLlxuICAgIHJlc3BvbnNlX2pzb25fb2s6IGFyZ3MuanNvblNjaGVtYSA/IGlzUGFyc2VhYmxlSnNvbihyZXNwb25zZVRleHQpIDogbnVsbCxcbiAgICB0b2tlbl9uYW1lOiByZXN1bHQudG9rZW5OYW1lLFxuICAgIGlucHV0X3Rva2VuczogYWdnLmlucHV0X3Rva2VucyxcbiAgICBvdXRwdXRfdG9rZW5zOiBhZ2cub3V0cHV0X3Rva2VucyxcbiAgICBjYWNoZV9yZWFkX3Rva2VuczogYWdnLmNhY2hlX3JlYWRfdG9rZW5zLFxuICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogYWdnLmNhY2hlX2NyZWF0aW9uX3Rva2VucyxcbiAgICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM6IGFnZy5jYWNoZV9jcmVhdGlvbl81bV90b2tlbnMsXG4gICAgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zOiBhZ2cuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zLFxuICAgIGR1cmF0aW9uX21zOiBhZ2cuZHVyYXRpb25fbXMsXG4gICAgLy8gbXVsdGktc3RlcCBydW4g67aA66qo7J2YIOuqqOuNuOydgCDstZzsooUgdHVybuydhCDshJzruZntlZwg66qo64247J2064ukLlxuICAgIHJlcXVlc3RlZF9tb2RlbF9uYW1lOiByZXF1ZXN0ZWRNb2RlbE5hbWUsXG4gICAgbW9kZWxfbmFtZTogc2VydmVkTW9kZWxOYW1lLFxuICAgIGZhbGxiYWNrX2NvdW50OiBhZ2cuZmFsbGJhY2tfY291bnQsXG4gICAgc2VydmljZV90aWVyOiBhcmdzLm1vZGVsPy5zdGFydHNXaXRoKFwib3BlbmFpL1wiKSA/IChhcmdzLnNlcnZpY2VUaWVyID8/IG51bGwpIDogbnVsbCxcbiAgICBjb3N0X3VzZDogYWdnLmNvc3RfdXNkLFxuICAgIGNvc3Rfc291cmNlOiBhZ2cuY29zdF9zb3VyY2UsXG4gICAgaW1hZ2VfY29zdF91c2Q6IGltYWdlQ29zdE1pY3JvVXNkLFxuICAgIC4uLihpbWFnZVBhcnRzLmxlbmd0aCA+IDAgPyB7IGlzX2ltYWdlX2dlbmVyYXRpb246IHRydWUgfSA6IHt9KSxcbiAgICBpbWFnZV9jb3N0X21ldGhvZDpcbiAgICAgIGltYWdlQ29zdE1pY3JvVXNkICE9PSBudWxsXG4gICAgICAgID8gaW1hZ2VHZW5lcmF0aW9uQ29zdE1ldGhvZChhcmdzLmltYWdlR2VuZXJhdGlvbk9wdGlvbnMsIHJlc3VsdClcbiAgICAgICAgOiBudWxsLFxuICAgIGhpc3Rvcnk6IGZpbHRlckhpc3RvcnlGb3JTdG9yYWdlKGFyZ3MuaGlzdG9yeSksXG4gIH0pO1xuXG4gIHJldHVybiB7fTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmlzaFJ1bldpdGhFcnJvcihcbiAgcmVxdWVzdExvZ0lkOiBudW1iZXIsXG4gIGVycm9yTWVzc2FnZTogc3RyaW5nLFxuICBhcmdzPzogUXVlcnlJbnB1dCxcbiAgY29tcGxldGVkU3RlcD86IHsgc3RlcEluZGV4OiBudW1iZXI7IHJlc3VsdDogUXVlcnlPdXRwdXQgfSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBmaW5pc2hUZXJtaW5hbFJ1bihyZXF1ZXN0TG9nSWQsIFwiZXJyb3JcIiwgZXJyb3JNZXNzYWdlLCBhcmdzLCBjb21wbGV0ZWRTdGVwKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmlzaFJ1bkFib3J0ZWQoXG4gIHJlcXVlc3RMb2dJZDogbnVtYmVyLFxuICBhcmdzPzogUXVlcnlJbnB1dCxcbiAgY29tcGxldGVkU3RlcD86IHsgc3RlcEluZGV4OiBudW1iZXI7IHJlc3VsdDogUXVlcnlPdXRwdXQgfSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBmaW5pc2hUZXJtaW5hbFJ1bihyZXF1ZXN0TG9nSWQsIFwiYWJvcnRlZFwiLCBcImNsaWVudCBkaXNjb25uZWN0ZWRcIiwgYXJncywgY29tcGxldGVkU3RlcCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmlzaFRlcm1pbmFsUnVuKFxuICByZXF1ZXN0TG9nSWQ6IG51bWJlcixcbiAgc3RhdHVzOiBcImVycm9yXCIgfCBcImFib3J0ZWRcIixcbiAgZXJyb3JNZXNzYWdlOiBzdHJpbmcsXG4gIGFyZ3M/OiBRdWVyeUlucHV0LFxuICBjb21wbGV0ZWRTdGVwPzogeyBzdGVwSW5kZXg6IG51bWJlcjsgcmVzdWx0OiBRdWVyeU91dHB1dCB9LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgaWYgKGNvbXBsZXRlZFN0ZXAgJiYgYXJncykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgYXBwZW5kR2VuZXJhdGVTdGVwKHJlcXVlc3RMb2dJZCwgY29tcGxldGVkU3RlcC5zdGVwSW5kZXgsIGFyZ3MsIGNvbXBsZXRlZFN0ZXAucmVzdWx0KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBhcHBlbmRHZW5lcmF0ZVN0ZXAgZmFpbGVkIHdoaWxlIGZpbmlzaGluZyAke3N0YXR1c306ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IGFnZ3JlZ2F0ZTogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBSZXF1ZXN0TG9nTW9kZWwuYWdncmVnYXRlU3RlcFVzYWdlPj4gfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGFnZ3JlZ2F0ZSA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5hZ2dyZWdhdGVTdGVwVXNhZ2UocmVxdWVzdExvZ0lkKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYGFnZ3JlZ2F0ZVN0ZXBVc2FnZSBmYWlsZWQgd2hpbGUgZmluaXNoaW5nICR7c3RhdHVzfTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICB9XG5cbiAgICBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuZmluaXNoUnVuKHJlcXVlc3RMb2dJZCwge1xuICAgICAgc3RhdHVzLFxuICAgICAgZXJyb3JfbWVzc2FnZTogZXJyb3JNZXNzYWdlLFxuICAgICAgaGlzdG9yeTogYXJncyA/IGZpbHRlckhpc3RvcnlGb3JTdG9yYWdlKGFyZ3MuaGlzdG9yeSkgOiB1bmRlZmluZWQsXG4gICAgICAuLi4oY29tcGxldGVkU3RlcFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHRva2VuX25hbWU6IGNvbXBsZXRlZFN0ZXAucmVzdWx0LnRva2VuTmFtZSxcbiAgICAgICAgICAgIHJlcXVlc3RlZF9tb2RlbF9uYW1lOiB3aXRoUHJvdmlkZXJQcmVmaXgoXG4gICAgICAgICAgICAgIGFyZ3M/Lm1vZGVsLFxuICAgICAgICAgICAgICBhcmdzPy5tb2RlbCA/PyBjb21wbGV0ZWRTdGVwLnJlc3VsdC5yZXF1ZXN0ZWRNb2RlbCA/PyBjb21wbGV0ZWRTdGVwLnJlc3VsdC5tb2RlbCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBtb2RlbF9uYW1lOiB3aXRoUHJvdmlkZXJQcmVmaXgoYXJncz8ubW9kZWwsIGNvbXBsZXRlZFN0ZXAucmVzdWx0Lm1vZGVsKSxcbiAgICAgICAgICB9XG4gICAgICAgIDoge30pLFxuICAgICAgLi4uKGFnZ3JlZ2F0ZVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIGlucHV0X3Rva2VuczogYWdncmVnYXRlLmlucHV0X3Rva2VucyxcbiAgICAgICAgICAgIG91dHB1dF90b2tlbnM6IGFnZ3JlZ2F0ZS5vdXRwdXRfdG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IGFnZ3JlZ2F0ZS5jYWNoZV9yZWFkX3Rva2VucyxcbiAgICAgICAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogYWdncmVnYXRlLmNhY2hlX2NyZWF0aW9uX3Rva2VucyxcbiAgICAgICAgICAgIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2VuczogYWdncmVnYXRlLmNhY2hlX2NyZWF0aW9uXzVtX3Rva2VucyxcbiAgICAgICAgICAgIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2VuczogYWdncmVnYXRlLmNhY2hlX2NyZWF0aW9uXzFoX3Rva2VucyxcbiAgICAgICAgICAgIGR1cmF0aW9uX21zOiBhZ2dyZWdhdGUuZHVyYXRpb25fbXMsXG4gICAgICAgICAgICBmYWxsYmFja19jb3VudDogYWdncmVnYXRlLmZhbGxiYWNrX2NvdW50LFxuICAgICAgICAgICAgY29zdF91c2Q6IGFnZ3JlZ2F0ZS5jb3N0X3VzZCxcbiAgICAgICAgICAgIGNvc3Rfc291cmNlOiBhZ2dyZWdhdGUuY29zdF9zb3VyY2UsXG4gICAgICAgICAgfVxuICAgICAgICA6IHt9KSxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZ2dlci5lcnJvcihgZmluaXNoVGVybWluYWxSdW4oJHtzdGF0dXN9KSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xlYW51cFN0YWxlUnVucygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHN0YWxlQ2xlYW51cEluRmxpZ2h0KSB7XG4gICAgYXdhaXQgc3RhbGVDbGVhbnVwSW5GbGlnaHQ7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgaWYgKG5vdyAtIGxhc3RTdGFsZUNsZWFudXBTdGFydGVkQXQgPCBTVEFMRV9DTEVBTlVQX0lOVEVSVkFMX01TKSByZXR1cm47XG4gIGxhc3RTdGFsZUNsZWFudXBTdGFydGVkQXQgPSBub3c7XG5cbiAgY29uc3QgY2xlYW51cCA9IHBlcmZvcm1TdGFsZVJ1bkNsZWFudXAoKTtcbiAgc3RhbGVDbGVhbnVwSW5GbGlnaHQgPSBjbGVhbnVwO1xuICB0cnkge1xuICAgIGF3YWl0IGNsZWFudXA7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKHN0YWxlQ2xlYW51cEluRmxpZ2h0ID09PSBjbGVhbnVwKSBzdGFsZUNsZWFudXBJbkZsaWdodCA9IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBwZXJmb3JtU3RhbGVSdW5DbGVhbnVwKCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IFwidG9vbC1jYWxsIHJ1bjogbm8gZm9sbG93LXVwIHdpdGhpbiAzMCBtaW51dGVzXCI7XG4gICAgY29uc3Qgc3RhbGVJZHMgPSBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuZXhwaXJlU3RhbGVUb29sV2FpdGluZ1J1bnMoXG4gICAgICBTVEFMRV9SVU5fVEhSRVNIT0xEX01TLFxuICAgICAgZXJyb3JNZXNzYWdlLFxuICAgICk7XG4gICAgY29uc3QgY2xlYW5lZENvdW50ID0gc3RhbGVJZHMubGVuZ3RoO1xuICAgIGlmIChjbGVhbmVkQ291bnQgPiAwKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgY2xlYW5lZCB1cCAke2NsZWFuZWRDb3VudH0gc3RhbGUgcnVubmluZyByZXF1ZXN0IGxvZ3NgKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dnZXIuZXJyb3IoYHN0YWxlIGNsZWFudXAgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBY0EsTUFBTSxTQUFTLFVBQVUsQ0FBQyxTQUFTLGVBQWUsQ0FBQztBQUNuRCxNQUFNLHlCQUF5QixPQUFVO0FBQ3pDLE1BQU0sNEJBQTRCLEtBQUs7QUFDdkMsSUFBSTtBQUNKLElBQUksNEJBQTRCO0FBQ2hDLFNBQVMsbUJBQ1AsWUFDQSxPQUNvQjtDQUNwQixJQUFJLENBQUMsT0FBTyxPQUFPO0NBQ25CLElBQUksTUFBTSxTQUFTLEdBQUcsR0FBRyxPQUFPO0NBQ2hDLE1BQU0sUUFBUSxZQUFZLFFBQVEsR0FBRyxLQUFLO0NBQzFDLE1BQU0sV0FBVyxRQUFRLElBQUksWUFBWSxNQUFNLEdBQUcsS0FBSyxJQUFJO0NBQzNELE9BQU8sV0FBVyxHQUFHLFNBQVMsR0FBRyxVQUFVO0FBQzdDOzs7O0FBS0EsU0FBUyx3QkFBd0IsWUFBeUM7Q0FDeEUsSUFBSSxDQUFDLFlBQVksT0FBTztDQUN4QixJQUFJO0VBRUYsTUFBTSxX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
|
|
230
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQtcnVuLWxpZmVjeWNsZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQtcnVuLWxpZmVjeWNsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgUmVxdWVzdExvZ01vZGVsIH0gZnJvbSBcIi4uL3JlcXVlc3QtbG9nL3JlcXVlc3QtbG9nLm1vZGVsXCI7XG5pbXBvcnQge1xuICBlc3RpbWF0ZUltYWdlR2VuZXJhdGlvbkNvc3RNaWNyb1VzZCxcbiAgaW1hZ2VHZW5lcmF0aW9uQ29zdE1ldGhvZCxcbn0gZnJvbSBcIi4vcWdyaWQtaW1hZ2UtZ2VuZXJhdGlvblwiO1xuaW1wb3J0IHtcbiAgYnVpbGRJbWFnZUdlbmVyYXRpb25Ub29sU3RlcHMsXG4gIGV4dHJhY3RJbnB1dEltYWdlc0ZvclRvb2xBcmdzLFxuICBmb3JtYXRSZXNwb25zZUZvckxvZyxcbiAgZ2V0SW1hZ2VQYXJ0cyxcbn0gZnJvbSBcIi4vcWdyaWQtcmVzcG9uc2UtZm9ybWF0XCI7XG5pbXBvcnQgeyB0eXBlIFFncmlkUnVuQ29udGV4dCwgdHlwZSBRdWVyeUlucHV0LCB0eXBlIFF1ZXJ5T3V0cHV0IH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IGNvbXBvc2VTeXN0ZW1XaXRoU2NoZW1hQ29udHJhY3QgfSBmcm9tIFwiLi9zY2hlbWEtcHJvbXB0XCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcInJ1bi1saWZlY3ljbGVcIl0pO1xuY29uc3QgU1RBTEVfUlVOX1RIUkVTSE9MRF9NUyA9IDMwICogNjAgKiAxMDAwO1xuY29uc3QgU1RBTEVfQ0xFQU5VUF9JTlRFUlZBTF9NUyA9IDYwICogMTAwMDtcbmxldCBzdGFsZUNsZWFudXBJbkZsaWdodDogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcbmxldCBsYXN0U3RhbGVDbGVhbnVwU3RhcnRlZEF0ID0gMDtcblxuZnVuY3Rpb24gd2l0aFByb3ZpZGVyUHJlZml4KFxuICByb3V0ZU1vZGVsOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIG1vZGVsOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIW1vZGVsKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGlmIChtb2RlbC5pbmNsdWRlcyhcIi9cIikpIHJldHVybiBtb2RlbDtcbiAgY29uc3Qgc2xhc2ggPSByb3V0ZU1vZGVsPy5pbmRleE9mKFwiL1wiKSA/PyAtMTtcbiAgY29uc3QgcHJvdmlkZXIgPSBzbGFzaCA+IDAgPyByb3V0ZU1vZGVsPy5zbGljZSgwLCBzbGFzaCkgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHByb3ZpZGVyID8gYCR7cHJvdmlkZXJ9LyR7bW9kZWx9YCA6IG1vZGVsO1xufVxuXG4vKipcbiAqIGhpc3RvcnnripQg7JuQ67O4IOq3uOuMgOuhnCDsoIDsnqXtlZjquLDrs7Tri6TripQsIHJ1biDrtoTshJ3sl5Ag7ZWE7JqU7ZWcIHVzZXIvYXNzaXN0YW50IOygleuztOunjCDtlYTthLDrp4HtlbTshJwg7KCA7J6lXG4gKi9cbi8vIEtlcHQgaXRlbXMgYXJlIHN0b3JlZCBhcyBzZW50OyBvbmx5IHRoZSB0eXBlL3JvbGUgdGhhdCBzZWxlY3QgdGhlbSBhcmUgZGVjb2RlZC5cbmNvbnN0IFN0b3JlZEhpc3RvcnlNZXNzYWdlID0gei5sb29zZU9iamVjdCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcIm1lc3NhZ2VcIiksXG4gIHJvbGU6IHouZW51bShbXCJ1c2VyXCIsIFwiYXNzaXN0YW50XCJdKSxcbn0pO1xuXG50eXBlIFN0b3JlZEhpc3RvcnlNZXNzYWdlID0gei5pbmZlcjx0eXBlb2YgU3RvcmVkSGlzdG9yeU1lc3NhZ2U+O1xuXG5mdW5jdGlvbiBmaWx0ZXJIaXN0b3J5Rm9yU3RvcmFnZShcbiAgcmF3SGlzdG9yeTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogU3RvcmVkSGlzdG9yeU1lc3NhZ2VbXSB8IHVuZGVmaW5lZCB7XG4gIGlmICghcmF3SGlzdG9yeSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIGNvbnN0IGl0ZW1zID0gei5hcnJheSh6LnVua25vd24oKSkucGFyc2UoSlNPTi5wYXJzZShyYXdIaXN0b3J5KSk7XG5cbiAgICBjb25zdCBmaWx0ZXJlZCA9IGl0ZW1zLmZsYXRNYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBTdG9yZWRIaXN0b3J5TWVzc2FnZS5zYWZlUGFyc2UoaXRlbSk7XG5cbiAgICAgIHJldHVybiBtZXNzYWdlLnN1Y2Nlc3MgPyBbbWVzc2FnZS5kYXRhXSA6IFtdO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZpbHRlcmVkLmxlbmd0aCA+IDAgPyBmaWx0ZXJlZCA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1BhcnNlYWJsZUpzb24odGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgSlNPTi5wYXJzZSh0ZXh0KTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgUnVuTGlmZWN5Y2xlUmVzdWx0ID0ge1xuICBydW5Db250ZXh0PzogUWdyaWRSdW5Db250ZXh0O1xufTtcblxuLyoqXG4gKiBsb2dnZXItZW5hYmxlZCBxdWVyeS9zdHJlYW0g7J2R64u1IOyghO2bhOyXkCDtmLjstpwuXG4gKlxuICogMSkgYmVmb3JlUXVlcnk6IHJ1biDsg53shLEv6rOE7IaNICsgdG9vbCByZXN1bHQg7JmE66OMICsgc3RhbGUgdG9vbC13YWl0IGNsZWFudXBcbiAqIDIpIGFmdGVyUXVlcnk6IGdlbmVyYXRlIHN0ZXAgKyB0b29sLWNhbGwgc3RlcCArIGZpbmlzaC9rZWVwLW9wZW5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJlZm9yZVF1ZXJ5KGFyZ3M6IFF1ZXJ5SW5wdXQpOiBQcm9taXNlPHtcbiAgcmVxdWVzdExvZ0lkOiBudW1iZXI7XG4gIHN0ZXBJbmRleDogbnVtYmVyO1xufT4ge1xuICBsZXQgcmVxdWVzdExvZ0lkOiBudW1iZXI7XG4gIGxldCBzdGVwSW5kZXggPSAwO1xuXG4gIC8vIHJlcXVlc3RMb2dJZCDqsIAg7J6I7J2EIOuVjOunjCDquLDsobQgcnVuIOyXsOyepS4gdGhyZWFkQ29vcmQg66eMIOyeiOuKlCBjb252IOuKlCDsg4ggcnVuIOycvOuhnCDsi5zsnpEuXG4gIC8vIGNvbnRpbnVhdGlvbiDsnYAgY3JlYXRlUnVuIOydhCDqsbTrhIjrm7Drr4DroZwgcnVuIOydmCB0b29scyDripQg7LKrIOyKpO2FnSDsnqXssKnrtoTsnLzroZwg6rOg7KCV65Cc64ukIOKAlFxuICAvLyBBSSBTREsgcHJlcGFyZVN0ZXAvYWN0aXZlVG9vbHMg66GcIOyKpO2FneuniOuLpCDtiLTshYvsnbQg67CU64CM7Ja064+EIOuhnOq3uOyXkOuKlCDrsJjsmIHrkJjsp4Ag7JWK64qU64ukLlxuICBpZiAoYXJncy5ydW5Db250ZXh0Py5yZXF1ZXN0TG9nSWQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJlcXVlc3RMb2dJZCA9IGFyZ3MucnVuQ29udGV4dC5yZXF1ZXN0TG9nSWQ7XG4gICAgLy8gY2xlYW51cOqzvCDqsJnsnYAgREIgYWR2aXNvcnkgbG9ja+ydhCDsnqHqs6AgdG9vbCDqsrDqs7wg67CY7JiBICsg64uk7J2MIHN0ZXAg7JiI7JW97J2EIO2VnFxuICAgIC8vIHRyYW5zYWN0aW9u7JeQ7IScIOyymOumrO2VnOuLpC4g7Jes65+sIHFncmlkIO2UhOuhnOyEuOyKpCDsgqzsnbTsl5DshJzrj4Qgc3RhbGUgZXhwaXJ56rCAXG4gICAgLy8g64+E7LCpIOykkeyduCBmb2xsb3ctdXDsnYQgZXJyb3LroZwg642u7Ja07JOw7KeAIOuqu+2VnOuLpC5cbiAgICBzdGVwSW5kZXggPSBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuY29udGludWVUb29sUnVuKHJlcXVlc3RMb2dJZCwgYXJncy50b29sUmVzdWx0cyA/PyBbXSk7XG4gICAgYXdhaXQgY2xlYW51cFN0YWxlUnVucygpO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IGNsZWFudXBTdGFsZVJ1bnMoKTtcbiAgICBjb25zdCBpbnB1dEltYWdlcyA9IGV4dHJhY3RJbnB1dEltYWdlc0ZvclRvb2xBcmdzKGFyZ3MpO1xuICAgIHJlcXVlc3RMb2dJZCA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5jcmVhdGVSdW4oe1xuICAgICAgdXNlcl9wcm9tcHQ6IGFyZ3MucHJvbXB0LFxuICAgICAgc3lzdGVtX3Byb21wdDogYXJncy5tb2RlbD8uc3RhcnRzV2l0aChcImFudGhyb3BpYy9cIilcbiAgICAgICAgPyBjb21wb3NlU3lzdGVtV2l0aFNjaGVtYUNvbnRyYWN0KGFyZ3Muc3lzdGVtLCBhcmdzKVxuICAgICAgICA6IGFyZ3Muc3lzdGVtLFxuICAgICAgcmVxdWVzdGVkX21vZGVsX25hbWU6IGFyZ3MubW9kZWwsXG4gICAgICBlZmZvcnQ6IGFyZ3MudGhpbmtpbmcgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogYXJncy5lZmZvcnQsXG4gICAgICBzZXJ2aWNlX3RpZXI6IGFyZ3MubW9kZWw/LnN0YXJ0c1dpdGgoXCJvcGVuYWkvXCIpID8gYXJncy5zZXJ2aWNlVGllciA6IHVuZGVmaW5lZCxcbiAgICAgIHByb2plY3RfbmFtZTogYXJncy5wcm9qZWN0TmFtZSxcbiAgICAgIGhpc3Rvcnk6IGZpbHRlckhpc3RvcnlGb3JTdG9yYWdlKGFyZ3MuaGlzdG9yeSksXG4gICAgICBpbnB1dF9pbWFnZXM6IGlucHV0SW1hZ2VzLmxlbmd0aCA+IDAgPyBpbnB1dEltYWdlcyA6IHVuZGVmaW5lZCxcbiAgICAgIHRvb2xzOiBhcmdzLnRvb2xzPy5sZW5ndGggPyBhcmdzLnRvb2xzIDogdW5kZWZpbmVkLFxuICAgICAgaXNfaW1hZ2VfZ2VuZXJhdGlvbjogYXJncy5pbWFnZUdlbmVyYXRpb24gPT09IFwiYXV0b1wiID8gZmFsc2UgOiBhcmdzLmltYWdlR2VuZXJhdGlvbixcbiAgICAgIGpzb25fc2NoZW1hOiBhcmdzLmpzb25TY2hlbWEgPz8gbnVsbCxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB7IHJlcXVlc3RMb2dJZCwgc3RlcEluZGV4IH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFwcGVuZEdlbmVyYXRlU3RlcChcbiAgcmVxdWVzdExvZ0lkOiBudW1iZXIsXG4gIHN0ZXBJbmRleDogbnVtYmVyLFxuICBhcmdzOiBRdWVyeUlucHV0LFxuICByZXN1bHQ6IFF1ZXJ5T3V0cHV0LFxuKSB7XG4gIC8vIHByb3ZpZGVy6rCAIGNhbm9uaWNhbCBtb2RlbOydhCDrj4zroKTspJjrj4Qg7JqU7LKtIHJvdXRlIOyekOyytChbMW1dIOuTsSnripQg67O07KG07ZWc64ukLlxuICBjb25zdCByZXF1ZXN0ZWRNb2RlbE5hbWUgPSB3aXRoUHJvdmlkZXJQcmVmaXgoXG4gICAgYXJncy5tb2RlbCxcbiAgICBhcmdzLm1vZGVsID8/IHJlc3VsdC5yZXF1ZXN0ZWRNb2RlbCA/PyByZXN1bHQubW9kZWwsXG4gICk7XG5cbiAgY29uc3Qgc2VydmVkTW9kZWxOYW1lID0gd2l0aFByb3ZpZGVyUHJlZml4KGFyZ3MubW9kZWwsIHJlc3VsdC5tb2RlbCk7XG5cbiAgLy8gZ2VuZXJhdGUgc3RlcCDquLDroZ1cbiAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmFwcGVuZFN0ZXAocmVxdWVzdExvZ0lkLCB7XG4gICAgc3RlcF9pbmRleDogc3RlcEluZGV4LFxuICAgIHR5cGU6IFwiZ2VuZXJhdGVcIixcbiAgICBtb2RlbF9uYW1lOiBzZXJ2ZWRNb2RlbE5hbWUsXG4gICAgcmVxdWVzdGVkX21vZGVsX25hbWU6IHJlcXVlc3RlZE1vZGVsTmFtZSxcbiAgICBmYWxsYmFja19jb3VudDogcmVzdWx0Lm1vZGVsRmFsbGJhY2tzPy5sZW5ndGggPz8gMCxcbiAgICBpbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5pbnB1dF90b2tlbnMsXG4gICAgb3V0cHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLm91dHB1dF90b2tlbnMsXG4gICAgY2FjaGVfcmVhZF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZV9yZWFkX2lucHV0X3Rva2VucyxcbiAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZV9jcmVhdGlvbl9pbnB1dF90b2tlbnMsXG4gICAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVfY3JlYXRpb25fNW1faW5wdXRfdG9rZW5zLFxuICAgIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlX2NyZWF0aW9uXzFoX2lucHV0X3Rva2VucyxcbiAgICBjb3N0X3VzZDogTWF0aC5yb3VuZChyZXN1bHQuY29zdFVzZCAqIDFfMDAwXzAwMCksXG4gICAgY29zdF9zb3VyY2U6IHJlc3VsdC5jb3N0U291cmNlLFxuICAgIGR1cmF0aW9uX21zOiByZXN1bHQuZHVyYXRpb25NcyxcbiAgICB0dGZ0X21zOiByZXN1bHQudHRmdE1zLFxuICAgIGZpbmlzaF9yZWFzb246IHJlc3VsdC5maW5pc2hSZWFzb24sXG4gIH0pO1xuXG4gIHJldHVybiB7IHJlcXVlc3RlZE1vZGVsTmFtZSwgc2VydmVkTW9kZWxOYW1lIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZnRlclF1ZXJ5KFxuICByZXF1ZXN0TG9nSWQ6IG51bWJlcixcbiAgc3RlcEluZGV4OiBudW1iZXIsXG4gIGFyZ3M6IFF1ZXJ5SW5wdXQsXG4gIHJlc3VsdDogUXVlcnlPdXRwdXQsXG4pOiBQcm9taXNlPFJ1bkxpZmVjeWNsZVJlc3VsdD4ge1xuICBjb25zdCB7IHJlcXVlc3RlZE1vZGVsTmFtZSwgc2VydmVkTW9kZWxOYW1lIH0gPSBhd2FpdCBhcHBlbmRHZW5lcmF0ZVN0ZXAoXG4gICAgcmVxdWVzdExvZ0lkLFxuICAgIHN0ZXBJbmRleCxcbiAgICBhcmdzLFxuICAgIHJlc3VsdCxcbiAgKTtcblxuICBjb25zdCBpbWFnZVBhcnRzID0gZ2V0SW1hZ2VQYXJ0cyhyZXN1bHQpO1xuXG4gIGNvbnN0IGltYWdlQ29zdE1pY3JvVXNkID0gZXN0aW1hdGVJbWFnZUdlbmVyYXRpb25Db3N0TWljcm9Vc2QoXG4gICAgcmVzdWx0LFxuICAgIGFyZ3MuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyxcbiAgKTtcblxuICBmb3IgKGNvbnN0IHN0ZXAgb2YgYnVpbGRJbWFnZUdlbmVyYXRpb25Ub29sU3RlcHMoYXJncywgaW1hZ2VQYXJ0cywgc3RlcEluZGV4KSkge1xuICAgIGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5hcHBlbmRTdGVwKHJlcXVlc3RMb2dJZCwgc3RlcCk7XG4gIH1cblxuICBpZiAocmVzdWx0LmZpbmlzaFJlYXNvbiA9PT0gXCJ0b29sLWNhbGxzXCIpIHtcbiAgICAvLyB0b29sLWNhbGwgc3RlcOydhCDsponsi5wg6riw66Gd7ZWY6rOgLCDri6TsnYwgZm9sbG93LXVw7J20IOqwmeydgCByb3fsl5Ag6rKw6rO866W8IOyxhOyatOuLpC5cbiAgICBjb25zdCB0b29sQ2FsbHMgPSByZXN1bHQuY29udGVudC5maWx0ZXIoKGMpID0+IGMudHlwZSA9PT0gXCJ0b29sLWNhbGxcIik7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvb2xDYWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdGMgPSB0b29sQ2FsbHNbaV0hO1xuXG4gICAgICBpZiAodGMudHlwZSAhPT0gXCJ0b29sLWNhbGxcIikgY29udGludWU7XG4gICAgICBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuYXBwZW5kU3RlcChyZXF1ZXN0TG9nSWQsIHtcbiAgICAgICAgc3RlcF9pbmRleDogc3RlcEluZGV4LFxuICAgICAgICB0eXBlOiBcInRvb2xfY2FsbFwiLFxuICAgICAgICB0b29sX2NhbGxfaW5kZXg6IGltYWdlUGFydHMubGVuZ3RoICsgaSxcbiAgICAgICAgdG9vbF9jYWxsX2lkOiB0Yy50b29sQ2FsbElkLFxuICAgICAgICB0b29sX25hbWU6IHRjLnRvb2xOYW1lLFxuICAgICAgICB0b29sX2FyZ3M6IHRjLmlucHV0LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgcnVuQ29udGV4dDogeyByZXF1ZXN0TG9nSWQgfSB9O1xuICB9XG5cbiAgLy8gZmluaXNoUmVhc29uID09PSBcInN0b3BcIiDihpIgcnVuIOyiheujjCAo7KCE7LK0IHN0ZXAgdXNhZ2Ug7ZWp7IKwKVxuICBjb25zdCBhZ2cgPSBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuYWdncmVnYXRlU3RlcFVzYWdlKHJlcXVlc3RMb2dJZCk7XG4gIGNvbnN0IHJlc3BvbnNlVGV4dCA9IGZvcm1hdFJlc3BvbnNlRm9yTG9nKHJlc3VsdCk7XG5cbiAgY29uc3QgZmluaXNoUGFyYW1zOiBQYXJhbWV0ZXJzPHR5cGVvZiBSZXF1ZXN0TG9nTW9kZWwuZmluaXNoUnVuPlsxXSA9IHtcbiAgICBzdGF0dXM6IFwic3VjY2VlZGVkXCIsXG4gICAgcmVzcG9uc2U6IHJlc3BvbnNlVGV4dCxcbiAgICAvLyBzdHJ1Y3R1cmVkIOyalOyyreunjCDtjJDsoJXtlZzri6QuIGRldGkg67Cw7LmY7J2YIGJyb2tlbiBKU09OIOulmOulvCDrqqnroZ3sl5DshJwg67CU66GcXG4gICAgLy8g6rWs67OE7ZWY6riwIOychO2VnCDquLDroZ3snbTrqbAsIOu5hHN0cnVjdHVyZWQg7JqU7LKt7J2AIG51bGwg66GcIOuCqOuKlOuLpC5cbiAgICByZXNwb25zZV9qc29uX29rOiBhcmdzLmpzb25TY2hlbWEgPyBpc1BhcnNlYWJsZUpzb24ocmVzcG9uc2VUZXh0KSA6IG51bGwsXG4gICAgdG9rZW5fbmFtZTogcmVzdWx0LnRva2VuTmFtZSxcbiAgICBpbnB1dF90b2tlbnM6IGFnZy5pbnB1dF90b2tlbnMsXG4gICAgb3V0cHV0X3Rva2VuczogYWdnLm91dHB1dF90b2tlbnMsXG4gICAgY2FjaGVfcmVhZF90b2tlbnM6IGFnZy5jYWNoZV9yZWFkX3Rva2VucyxcbiAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IGFnZy5jYWNoZV9jcmVhdGlvbl90b2tlbnMsXG4gICAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiBhZ2cuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zLFxuICAgIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2VuczogYWdnLmNhY2hlX2NyZWF0aW9uXzFoX3Rva2VucyxcbiAgICBkdXJhdGlvbl9tczogYWdnLmR1cmF0aW9uX21zLFxuICAgIC8vIG11bHRpLXN0ZXAgcnVuIOu2gOuqqOydmCDrqqjrjbjsnYAg7LWc7KKFIHR1cm7snYQg7ISc67mZ7ZWcIOuqqOuNuOydtOuLpC5cbiAgICByZXF1ZXN0ZWRfbW9kZWxfbmFtZTogcmVxdWVzdGVkTW9kZWxOYW1lLFxuICAgIG1vZGVsX25hbWU6IHNlcnZlZE1vZGVsTmFtZSxcbiAgICBmYWxsYmFja19jb3VudDogYWdnLmZhbGxiYWNrX2NvdW50LFxuICAgIHNlcnZpY2VfdGllcjogYXJncy5tb2RlbD8uc3RhcnRzV2l0aChcIm9wZW5haS9cIikgPyAoYXJncy5zZXJ2aWNlVGllciA/PyBudWxsKSA6IG51bGwsXG4gICAgY29zdF91c2Q6IGFnZy5jb3N0X3VzZCxcbiAgICBjb3N0X3NvdXJjZTogYWdnLmNvc3Rfc291cmNlLFxuICAgIGltYWdlX2Nvc3RfdXNkOiBpbWFnZUNvc3RNaWNyb1VzZCxcbiAgICBpbWFnZV9jb3N0X21ldGhvZDpcbiAgICAgIGltYWdlQ29zdE1pY3JvVXNkICE9PSBudWxsXG4gICAgICAgID8gaW1hZ2VHZW5lcmF0aW9uQ29zdE1ldGhvZChhcmdzLmltYWdlR2VuZXJhdGlvbk9wdGlvbnMsIHJlc3VsdClcbiAgICAgICAgOiBudWxsLFxuICAgIGhpc3Rvcnk6IGZpbHRlckhpc3RvcnlGb3JTdG9yYWdlKGFyZ3MuaGlzdG9yeSksXG4gIH07XG5cbiAgaWYgKGltYWdlUGFydHMubGVuZ3RoID4gMCkgZmluaXNoUGFyYW1zLmlzX2ltYWdlX2dlbmVyYXRpb24gPSB0cnVlO1xuICBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuZmluaXNoUnVuKHJlcXVlc3RMb2dJZCwgZmluaXNoUGFyYW1zKTtcblxuICByZXR1cm4ge307XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5pc2hSdW5XaXRoRXJyb3IoXG4gIHJlcXVlc3RMb2dJZDogbnVtYmVyLFxuICBlcnJvck1lc3NhZ2U6IHN0cmluZyxcbiAgYXJncz86IFF1ZXJ5SW5wdXQsXG4gIGNvbXBsZXRlZFN0ZXA/OiB7IHN0ZXBJbmRleDogbnVtYmVyOyByZXN1bHQ6IFF1ZXJ5T3V0cHV0IH0sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZmluaXNoVGVybWluYWxSdW4ocmVxdWVzdExvZ0lkLCBcImVycm9yXCIsIGVycm9yTWVzc2FnZSwgYXJncywgY29tcGxldGVkU3RlcCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5pc2hSdW5BYm9ydGVkKFxuICByZXF1ZXN0TG9nSWQ6IG51bWJlcixcbiAgYXJncz86IFF1ZXJ5SW5wdXQsXG4gIGNvbXBsZXRlZFN0ZXA/OiB7IHN0ZXBJbmRleDogbnVtYmVyOyByZXN1bHQ6IFF1ZXJ5T3V0cHV0IH0sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZmluaXNoVGVybWluYWxSdW4ocmVxdWVzdExvZ0lkLCBcImFib3J0ZWRcIiwgXCJjbGllbnQgZGlzY29ubmVjdGVkXCIsIGFyZ3MsIGNvbXBsZXRlZFN0ZXApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5pc2hUZXJtaW5hbFJ1bihcbiAgcmVxdWVzdExvZ0lkOiBudW1iZXIsXG4gIHN0YXR1czogXCJlcnJvclwiIHwgXCJhYm9ydGVkXCIsXG4gIGVycm9yTWVzc2FnZTogc3RyaW5nLFxuICBhcmdzPzogUXVlcnlJbnB1dCxcbiAgY29tcGxldGVkU3RlcD86IHsgc3RlcEluZGV4OiBudW1iZXI7IHJlc3VsdDogUXVlcnlPdXRwdXQgfSxcbik6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGlmIChjb21wbGV0ZWRTdGVwICYmIGFyZ3MpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGFwcGVuZEdlbmVyYXRlU3RlcChyZXF1ZXN0TG9nSWQsIGNvbXBsZXRlZFN0ZXAuc3RlcEluZGV4LCBhcmdzLCBjb21wbGV0ZWRTdGVwLnJlc3VsdCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICBgYXBwZW5kR2VuZXJhdGVTdGVwIGZhaWxlZCB3aGlsZSBmaW5pc2hpbmcgJHtzdGF0dXN9OiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBhZ2dyZWdhdGU6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgUmVxdWVzdExvZ01vZGVsLmFnZ3JlZ2F0ZVN0ZXBVc2FnZT4+IHwgdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGFnZ3JlZ2F0ZSA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5hZ2dyZWdhdGVTdGVwVXNhZ2UocmVxdWVzdExvZ0lkKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgIGBhZ2dyZWdhdGVTdGVwVXNhZ2UgZmFpbGVkIHdoaWxlIGZpbmlzaGluZyAke3N0YXR1c306ICR7ZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbmlzaFBhcmFtczogUGFyYW1ldGVyczx0eXBlb2YgUmVxdWVzdExvZ01vZGVsLmZpbmlzaFJ1bj5bMV0gPSB7XG4gICAgICBzdGF0dXMsXG4gICAgICBlcnJvcl9tZXNzYWdlOiBlcnJvck1lc3NhZ2UsXG4gICAgICBoaXN0b3J5OiBhcmdzID8gZmlsdGVySGlzdG9yeUZvclN0b3JhZ2UoYXJncy5oaXN0b3J5KSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuXG4gICAgaWYgKGNvbXBsZXRlZFN0ZXApIHtcbiAgICAgIGZpbmlzaFBhcmFtcy50b2tlbl9uYW1lID0gY29tcGxldGVkU3RlcC5yZXN1bHQudG9rZW5OYW1lO1xuXG4gICAgICBmaW5pc2hQYXJhbXMucmVxdWVzdGVkX21vZGVsX25hbWUgPSB3aXRoUHJvdmlkZXJQcmVmaXgoXG4gICAgICAgIGFyZ3M/Lm1vZGVsLFxuICAgICAgICBhcmdzPy5tb2RlbCA/PyBjb21wbGV0ZWRTdGVwLnJlc3VsdC5yZXF1ZXN0ZWRNb2RlbCA/PyBjb21wbGV0ZWRTdGVwLnJlc3VsdC5tb2RlbCxcbiAgICAgICk7XG5cbiAgICAgIGZpbmlzaFBhcmFtcy5tb2RlbF9uYW1lID0gd2l0aFByb3ZpZGVyUHJlZml4KGFyZ3M/Lm1vZGVsLCBjb21wbGV0ZWRTdGVwLnJlc3VsdC5tb2RlbCk7XG4gICAgfVxuXG4gICAgaWYgKGFnZ3JlZ2F0ZSkge1xuICAgICAgZmluaXNoUGFyYW1zLmlucHV0X3Rva2VucyA9IGFnZ3JlZ2F0ZS5pbnB1dF90b2tlbnM7XG4gICAgICBmaW5pc2hQYXJhbXMub3V0cHV0X3Rva2VucyA9IGFnZ3JlZ2F0ZS5vdXRwdXRfdG9rZW5zO1xuICAgICAgZmluaXNoUGFyYW1zLmNhY2hlX3JlYWRfdG9rZW5zID0gYWdncmVnYXRlLmNhY2hlX3JlYWRfdG9rZW5zO1xuICAgICAgZmluaXNoUGFyYW1zLmNhY2hlX2NyZWF0aW9uX3Rva2VucyA9IGFnZ3JlZ2F0ZS5jYWNoZV9jcmVhdGlvbl90b2tlbnM7XG4gICAgICBmaW5pc2hQYXJhbXMuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zID0gYWdncmVnYXRlLmNhY2hlX2NyZWF0aW9uXzVtX3Rva2VucztcbiAgICAgIGZpbmlzaFBhcmFtcy5jYWNoZV9jcmVhdGlvbl8xaF90b2tlbnMgPSBhZ2dyZWdhdGUuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zO1xuICAgICAgZmluaXNoUGFyYW1zLmR1cmF0aW9uX21zID0gYWdncmVnYXRlLmR1cmF0aW9uX21zO1xuICAgICAgZmluaXNoUGFyYW1zLmZhbGxiYWNrX2NvdW50ID0gYWdncmVnYXRlLmZhbGxiYWNrX2NvdW50O1xuICAgICAgZmluaXNoUGFyYW1zLmNvc3RfdXNkID0gYWdncmVnYXRlLmNvc3RfdXNkO1xuICAgICAgZmluaXNoUGFyYW1zLmNvc3Rfc291cmNlID0gYWdncmVnYXRlLmNvc3Rfc291cmNlO1xuICAgIH1cblxuICAgIGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5maW5pc2hSdW4ocmVxdWVzdExvZ0lkLCBmaW5pc2hQYXJhbXMpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nZ2VyLmVycm9yKFxuICAgICAgYGZpbmlzaFRlcm1pbmFsUnVuKCR7c3RhdHVzfSkgZmFpbGVkOiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKX1gLFxuICAgICk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xlYW51cFN0YWxlUnVucygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHN0YWxlQ2xlYW51cEluRmxpZ2h0KSB7XG4gICAgYXdhaXQgc3RhbGVDbGVhbnVwSW5GbGlnaHQ7XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXG4gIGlmIChub3cgLSBsYXN0U3RhbGVDbGVhbnVwU3RhcnRlZEF0IDwgU1RBTEVfQ0xFQU5VUF9JTlRFUlZBTF9NUykgcmV0dXJuO1xuICBsYXN0U3RhbGVDbGVhbnVwU3RhcnRlZEF0ID0gbm93O1xuXG4gIGNvbnN0IGNsZWFudXAgPSBwZXJmb3JtU3RhbGVSdW5DbGVhbnVwKCk7XG4gIHN0YWxlQ2xlYW51cEluRmxpZ2h0ID0gY2xlYW51cDtcblxuICB0cnkge1xuICAgIGF3YWl0IGNsZWFudXA7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKHN0YWxlQ2xlYW51cEluRmxpZ2h0ID09PSBjbGVhbnVwKSBzdGFsZUNsZWFudXBJbkZsaWdodCA9IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBwZXJmb3JtU3RhbGVSdW5DbGVhbnVwKCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IFwidG9vbC1jYWxsIHJ1bjogbm8gZm9sbG93LXVwIHdpdGhpbiAzMCBtaW51dGVzXCI7XG5cbiAgICBjb25zdCBzdGFsZUlkcyA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5leHBpcmVTdGFsZVRvb2xXYWl0aW5nUnVucyhcbiAgICAgIFNUQUxFX1JVTl9USFJFU0hPTERfTVMsXG4gICAgICBlcnJvck1lc3NhZ2UsXG4gICAgKTtcblxuICAgIGNvbnN0IGNsZWFuZWRDb3VudCA9IHN0YWxlSWRzLmxlbmd0aDtcblxuICAgIGlmIChjbGVhbmVkQ291bnQgPiAwKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgY2xlYW5lZCB1cCAke2NsZWFuZWRDb3VudH0gc3RhbGUgcnVubmluZyByZXF1ZXN0IGxvZ3NgKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dnZXIuZXJyb3IoYHN0YWxlIGNsZWFudXAgZmFpbGVkOiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKX1gKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBaUJBLE1BQU0sU0FBUyxVQUFVLENBQUMsU0FBUyxlQUFlLENBQUM7QUFDbkQsTUFBTSx5QkFBeUIsT0FBVTtBQUN6QyxNQUFNLDRCQUE0QixLQUFLO0FBQ3ZDLElBQUk7QUFDSixJQUFJLDRCQUE0QjtBQUVoQyxTQUFTLG1CQUNQLFlBQ0EsT0FDb0I7Q0FDcEIsSUFBSSxDQUFDLE9BQU8sT0FBTztDQUVuQixJQUFJLE1BQU0sU0FBUyxHQUFHLEdBQUcsT0FBTztDQUNoQyxNQUFNLFFBQVEsWUFBWSxRQUFRLEdBQUcsS0FBSztDQUMxQyxNQUFNLFdBQVcsUUFBUSxJQUFJLFlBQVksTUFBTSxHQUFHLEtBQUssSUFBSTtDQUUzRCxPQUFPLFdBQVcsR0FBRyxTQUFTLEdBQUcsVUFBVTtB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
|