@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,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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
|