@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,11 +1,23 @@
|
|
|
1
|
+
import { GROK_USD_PER_TICK } from "../grok/grok-constants.js";
|
|
1
2
|
//#region src/utils/providers/common/model-cost.ts
|
|
3
|
+
/**
|
|
4
|
+
* 모델별 토큰 가격 테이블 + cost 계산.
|
|
5
|
+
*
|
|
6
|
+
* claude code 와 동일 패턴: 클라이언트에서 가격 테이블로 직접 계산.
|
|
7
|
+
* 가격 단위: USD per 1M tokens.
|
|
8
|
+
*
|
|
9
|
+
* OpenAI 모델 목록은 OpenAI 모델 문서와 현재 지원 목록을 기준으로 관리한다.
|
|
10
|
+
*
|
|
11
|
+
* @see https://platform.openai.com/docs/pricing
|
|
12
|
+
* @see https://platform.claude.com/docs/en/about-claude/pricing
|
|
13
|
+
*/
|
|
2
14
|
const LONG_CONTEXT_272K = {
|
|
3
15
|
threshold: 272e3,
|
|
4
16
|
inputMultiplier: 2,
|
|
5
17
|
cachedInputMultiplier: 2,
|
|
6
18
|
outputMultiplier: 1.5
|
|
7
19
|
};
|
|
8
|
-
const OPENAI_COSTS = {
|
|
20
|
+
const OPENAI_COSTS = new Map(Object.entries({
|
|
9
21
|
"gpt-6-astra": {
|
|
10
22
|
maxEffort: "ultra",
|
|
11
23
|
inputTokens: 10,
|
|
@@ -89,19 +101,20 @@ const OPENAI_COSTS = {
|
|
|
89
101
|
outputTokens: 14,
|
|
90
102
|
cachedInputTokens: .175
|
|
91
103
|
}
|
|
92
|
-
};
|
|
104
|
+
}));
|
|
93
105
|
function anthropicCosts(inputTokens, outputTokens, overrides = {}) {
|
|
94
|
-
|
|
106
|
+
const costs = {
|
|
95
107
|
inputTokens,
|
|
96
108
|
outputTokens,
|
|
97
109
|
cachedInputTokens: overrides.cachedInputTokens ?? inputTokens / 10,
|
|
98
110
|
cacheCreationInputTokens: inputTokens * 2,
|
|
99
111
|
cacheCreationInputTokens5m: inputTokens * 1.25,
|
|
100
|
-
cacheCreationInputTokens1h: inputTokens * 2
|
|
101
|
-
...overrides.longContext ? { longContext: overrides.longContext } : {}
|
|
112
|
+
cacheCreationInputTokens1h: inputTokens * 2
|
|
102
113
|
};
|
|
114
|
+
if (overrides.longContext) costs.longContext = overrides.longContext;
|
|
115
|
+
return costs;
|
|
103
116
|
}
|
|
104
|
-
const ANTHROPIC_COSTS = {
|
|
117
|
+
const ANTHROPIC_COSTS = new Map(Object.entries({
|
|
105
118
|
"claude-fable-5-1": anthropicCosts(10, 50, { cachedInputTokens: .25 }),
|
|
106
119
|
"claude-fable-5": anthropicCosts(10, 50),
|
|
107
120
|
sonnet: anthropicCosts(3, 15),
|
|
@@ -129,21 +142,63 @@ const ANTHROPIC_COSTS = {
|
|
|
129
142
|
cachedInputMultiplier: 5,
|
|
130
143
|
outputMultiplier: 5
|
|
131
144
|
} })
|
|
132
|
-
};
|
|
145
|
+
}));
|
|
133
146
|
const DEFAULT_COSTS = {
|
|
134
147
|
inputTokens: 3,
|
|
135
148
|
outputTokens: 15,
|
|
136
149
|
cachedInputTokens: .3
|
|
137
150
|
};
|
|
151
|
+
const GROK_TICKS_PER_USD = Math.round(1 / GROK_USD_PER_TICK);
|
|
152
|
+
/** USD for a provider-reported `cost_in_usd_ticks` amount. */
|
|
153
|
+
function usdFromGrokTicks(ticks) {
|
|
154
|
+
return ticks / GROK_TICKS_PER_USD;
|
|
155
|
+
}
|
|
156
|
+
function grokTokenCosts(input, cached, output) {
|
|
157
|
+
const perMillion = (ticks) => ticks * 1e6 / GROK_TICKS_PER_USD;
|
|
158
|
+
return {
|
|
159
|
+
inputTokens: perMillion(input),
|
|
160
|
+
cachedInputTokens: perMillion(cached),
|
|
161
|
+
outputTokens: perMillion(output)
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
const GROK_COSTS = new Map(Object.entries({
|
|
165
|
+
"grok-4.7": grokTokenCosts(2e4, 5e3, 6e4),
|
|
166
|
+
"grok-4.6": grokTokenCosts(2e4, 5e3, 6e4),
|
|
167
|
+
"grok-4.5": grokTokenCosts(2e4, 5e3, 6e4)
|
|
168
|
+
}));
|
|
169
|
+
const GROK_IMAGE_PRICE_TICKS = new Map(Object.entries({ "grok-imagine-image-quality": 5e8 }));
|
|
170
|
+
/**
|
|
171
|
+
* Image cost: the reported ticks when present, otherwise the per-image catalog price times the
|
|
172
|
+
* image count. Undefined when neither is known, so callers store an unknown cost, not a guess.
|
|
173
|
+
*/
|
|
174
|
+
function grokImageCost(model, imageCount, reportedTicks) {
|
|
175
|
+
if (reportedTicks !== void 0) return grokReportedCost(reportedTicks);
|
|
176
|
+
const perImage = GROK_IMAGE_PRICE_TICKS.get(model.split("/").pop() ?? model);
|
|
177
|
+
if (perImage === void 0) return void 0;
|
|
178
|
+
const ticks = perImage * imageCount;
|
|
179
|
+
return {
|
|
180
|
+
costUsd: usdFromGrokTicks(ticks),
|
|
181
|
+
costSource: "pricing_table",
|
|
182
|
+
ticks
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
/** Video/voice cost: only a provider-reported amount; there is no catalog estimate. */
|
|
186
|
+
function grokReportedCost(reportedTicks) {
|
|
187
|
+
return reportedTicks === void 0 ? void 0 : {
|
|
188
|
+
costUsd: usdFromGrokTicks(reportedTicks),
|
|
189
|
+
costSource: "provider",
|
|
190
|
+
ticks: reportedTicks
|
|
191
|
+
};
|
|
192
|
+
}
|
|
138
193
|
/** Codex 백엔드가 이 모델에 허용하는 최대 effort. 카탈로그에 없는 모델은 xhigh 까지다. */
|
|
139
194
|
function openaiModelMaxEffort(model) {
|
|
140
|
-
return OPENAI_COSTS
|
|
195
|
+
return OPENAI_COSTS.get(model)?.maxEffort ?? "xhigh";
|
|
141
196
|
}
|
|
142
197
|
function getModelCosts(model) {
|
|
143
198
|
const normalizedModel = (model.split("/").pop() ?? model).replace(/\[1m\]$/i, "");
|
|
144
|
-
return OPENAI_COSTS
|
|
199
|
+
return OPENAI_COSTS.get(normalizedModel) ?? ANTHROPIC_COSTS.get(normalizedModel) ?? GROK_COSTS.get(normalizedModel) ?? DEFAULT_COSTS;
|
|
145
200
|
}
|
|
146
|
-
const OPENAI_FAST_MULTIPLIERS = {
|
|
201
|
+
const OPENAI_FAST_MULTIPLIERS = new Map(Object.entries({
|
|
147
202
|
"gpt-6-astra": 2,
|
|
148
203
|
"gpt-6.1-sol": 2,
|
|
149
204
|
"gpt-6-sol": 2,
|
|
@@ -151,7 +206,7 @@ const OPENAI_FAST_MULTIPLIERS = {
|
|
|
151
206
|
"gpt-5.6-sol": 2,
|
|
152
207
|
"gpt-5.6-terra": 2,
|
|
153
208
|
"gpt-5.6-luna": 2
|
|
154
|
-
};
|
|
209
|
+
}));
|
|
155
210
|
function calculateCostUsd(model, usage, serviceTier) {
|
|
156
211
|
const costs = getModelCosts(model);
|
|
157
212
|
const cachedInput = usage.cachedInputTokens ?? 0;
|
|
@@ -172,9 +227,9 @@ function calculateCostUsd(model, usage, serviceTier) {
|
|
|
172
227
|
const outputRate = costs.outputTokens * (isLongContext ? lc.outputMultiplier : 1);
|
|
173
228
|
const standardCost = nonCachedInput / 1e6 * inputRate + usage.outputTokens / 1e6 * outputRate + cachedInput / 1e6 * cachedRate + unclassifiedCacheCreationInput / 1e6 * cacheCreationFallbackRate + classifiedCacheCreationInput5m / 1e6 * cacheCreation5mRate + classifiedCacheCreationInput1h / 1e6 * cacheCreation1hRate;
|
|
174
229
|
const normalizedModel = model.split("/").pop() ?? model;
|
|
175
|
-
return standardCost * (serviceTier === "fast" ? OPENAI_FAST_MULTIPLIERS
|
|
230
|
+
return standardCost * (serviceTier === "fast" ? OPENAI_FAST_MULTIPLIERS.get(normalizedModel) ?? 1 : 1);
|
|
176
231
|
}
|
|
177
232
|
//#endregion
|
|
178
|
-
export { calculateCostUsd, getModelCosts, openaiModelMaxEffort };
|
|
233
|
+
export { calculateCostUsd, getModelCosts, grokImageCost, grokReportedCost, openaiModelMaxEffort, usdFromGrokTicks };
|
|
179
234
|
|
|
180
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtY29zdC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9tb2RlbC1jb3N0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog66qo642467OEIO2GoO2BsCDqsIDqsqkg7YWM7J2067iUICsgY29zdCDqs4TsgrAuXG4gKlxuICogY2xhdWRlIGNvZGUg7JmAIOuPmeydvCDtjKjthLQ6IO2BtOudvOydtOyWuO2KuOyXkOyEnCDqsIDqsqkg7YWM7J2067iU66GcIOyngeygkSDqs4TsgrAuXG4gKiDqsIDqsqkg64uo7JyEOiBVU0QgcGVyIDFNIHRva2Vucy5cbiAqXG4gKiBPcGVuQUkg66qo6424IOuqqeuhneydgCBPcGVuQUkg66qo6424IOusuOyEnOyZgCDtmITsnqwg7KeA7JuQIOuqqeuhneydhCDquLDspIDsnLzroZwg6rSA66as7ZWc64ukLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvcHJpY2luZ1xuICogQHNlZSBodHRwczovL3BsYXRmb3JtLmNsYXVkZS5jb20vZG9jcy9lbi9hYm91dC1jbGF1ZGUvcHJpY2luZ1xuICovXG5cbmltcG9ydCB7IHR5cGUgT3BlbkFJRWZmb3J0IH0gZnJvbSBcIi4vZWZmb3J0XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxDb3N0cyB7XG4gIGlucHV0VG9rZW5zOiBudW1iZXI7XG4gIG91dHB1dFRva2VuczogbnVtYmVyO1xuICBjYWNoZWRJbnB1dFRva2VuczogbnVtYmVyO1xuICAvKiogVFRMIGJyZWFrZG93biDsnbQg7JeG64qUIHVzYWdlIOyXkCDsoIHsmqntlaAgY2FjaGUgd3JpdGUgZmFsbGJhY2sg64uo6rCALiAqL1xuICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM/OiBudW1iZXI7XG4gIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtPzogbnVtYmVyO1xuICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaD86IG51bWJlcjtcbiAgLyoqXG4gICAqIGxvbmctY29udGV4dCDtlaDspp0uIOyghOyytCDsnoXroKUg7Yag7YGwKGlucHV0X3Rva2VucywgY2FjaGVfcmVhZCDtj6ztlagp7J20IHRocmVzaG9sZCDstIjqs7wg7IucXG4gICAqIOy0iOqzvOu2hOunjOydtCDslYTri4jrnbwg7JqU7LKtIOyghOyytChmdWxsIHNlc3Npb24p7JeQIOuwsOycqCDsoIHsmqkuXG4gICAqL1xuICBsb25nQ29udGV4dD86IHtcbiAgICB0aHJlc2hvbGQ6IG51bWJlcjtcbiAgICBpbnB1dE11bHRpcGxpZXI6IG51bWJlcjtcbiAgICBjYWNoZWRJbnB1dE11bHRpcGxpZXI6IG51bWJlcjtcbiAgICBvdXRwdXRNdWx0aXBsaWVyOiBudW1iZXI7XG4gIH07XG59XG5cbi8vIOKUgOKUgCBPcGVuQUkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vL1xuLy8gU3RhbmRhcmQgcHJpY2luZyB2ZXJpZmllZCAyMDI2LTA5LTIzICjquLDsobQg66qo6424IOuLqOqwgCDrs4Drj5kg7JeG7J2MKTogaHR0cHM6Ly9kZXZlbG9wZXJzLm9wZW5haS5jb20vYXBpL2RvY3MvcHJpY2luZ1xuLy8g7Iug66qo6424IOy2nOyLnOuniOuLpCDri6jqsIDqsIAg67CU64CM66+A66GcKDUuMuKGkjUuNOKGkjUuNSkg66qo6424IOy2lOqwgCDsi5wg67CY65Oc7IucIOqzteyLnSDtjpjsnbTsp4Ag7J6s7ZmV7J247ZW07JW87ZWoXG5cbi8vIEdQVC01LjTsl5DshJwg7LKY7J2MIOuPhOyeheuQnCBsb25nLWNvbnRleHQg7ZWg7KadICg1LjIvNS4zLWNvZGV464qUIO2VtOuLuSDsl4bsnYwsIDUuNC1taW5pL25hbm/ripQg6rO17IudIO2RnOyXkOyEnCBsb25nLWNvbnRleHQg64uo6rCAIOyXhuydjClcbi8vIDI3Mksg7LSI6rO8IOyLnCBpbnB1dCAyeCAvIGNhY2hlZCAyeCAvIG91dHB1dCAxLjV4IOKAlCDstIjqs7zrtoTrp4zsnbQg7JWE64uMIOyEuOyFmCDsoITssrTsl5Ag7KCB7Jqp65CoXG4vLyBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5vcGVuYWkuY29tL2FwaS9kb2NzL21vZGVscy9ncHQtNS41IChcInByb21wdHMgd2l0aCA+MjcySyBpbnB1dCB0b2tlbnNcIilcbmNvbnN0IExPTkdfQ09OVEVYVF8yNzJLOiBOb25OdWxsYWJsZTxNb2RlbENvc3RzW1wibG9uZ0NvbnRleHRcIl0+ID0ge1xuICB0aHJlc2hvbGQ6IDI3Ml8wMDAsXG4gIGlucHV0TXVsdGlwbGllcjogMixcbiAgY2FjaGVkSW5wdXRNdWx0aXBsaWVyOiAyLFxuICBvdXRwdXRNdWx0aXBsaWVyOiAxLjUsXG59O1xuXG4vLyBPcGVuQUkg66qo6424IOy5tO2DiOuhnOq3uC4g64uo6rCA7JmAIO2VqOq7mCBDb2RleCDrsLHsl5Trk5zqsIAg66qo642467OE66GcIOuwm+uKlCDstZzrjIAgcmVhc29uaW5nIGVmZm9ydCDrpbwg7ZWcIOqzs+yXkCDrkZTri6QuXG4vLyBtYXhFZmZvcnQg7Lac7LKYOiB+Ly5jb2RleC9tb2RlbHNfY2FjaGUuanNvbiDsnZggc3VwcG9ydGVkX3JlYXNvbmluZ19sZXZlbHMgKDIwMjYtMDktMDcg7ZmV7J24KS5cbi8vIOuvuOq4sOyerCDrqqjrjbjsnYAgeGhpZ2gg6rmM7KeA66eMIOuwm+uKlOuLpC5cbnR5cGUgT3BlbkFJTW9kZWxTcGVjID0gTW9kZWxDb3N0cyAmIHsgbWF4RWZmb3J0PzogT3BlbkFJRWZmb3J0IH07XG5cbmNvbnN0IE9QRU5BSV9DT1NUUzogUmVjb3JkPHN0cmluZywgT3BlbkFJTW9kZWxTcGVjPiA9IHtcbiAgLy8gR1BULTYgQXN0cmE6IFN0YW5kYXJkIEFQSS1lcXVpdmFsZW50IHByaWNpbmcsIHZlcmlmaWVkIDIwMjYtMDktMDcuXG4gIC8vIENvZGV4IHN1YnNjcmlwdGlvbiBjYXRhbG9nIHN1cHBvcnRzIHVsdHJhOyB0aGUgcHVibGljIEFQSSBsaXN0cyBvbmx5IHRocm91Z2ggbWF4LlxuICAvLyBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5vcGVuYWkuY29tL2FwaS9kb2NzL21vZGVscy9ncHQtNi1hc3RyYVxuICAvLyBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5vcGVuYWkuY29tL2FwaS9kb2NzL3ByaWNpbmdcbiAgXCJncHQtNi1hc3RyYVwiOiB7XG4gICAgbWF4RWZmb3J0OiBcInVsdHJhXCIsXG4gICAgaW5wdXRUb2tlbnM6IDEwLFxuICAgIG91dHB1dFRva2VuczogNTAsXG4gICAgY2FjaGVkSW5wdXRUb2tlbnM6IDEsXG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiAxMi41LFxuICAgIGxvbmdDb250ZXh0OiBMT05HX0NPTlRFWFRfMjcySyxcbiAgfSxcbiAgLy8gR1BULTYuMSBTb2wgKDIwMjYtMDktMjkgRGV2RGF5IOy2nOyLnCk6IFN0YW5kYXJkIEFQSSBwcmljaW5nIHZlcmlmaWVkIDIwMjYtMDktMzAuIEdQVC02IFNvbCDqs7wg6rCZ6rOgIGNhY2hlZCBpbnB1dCDrp4wg7KCI67CYLlxuICAvLyBDb2RleCDsubTtg4jroZzqt7goMjAyNi0wOS0zMCnripQgdWx0cmEg6rmM7KeAIO2XiOyaqe2VmOqzoCDquLDrs7ggZWZmb3J0IOuKlCBsb3cg64ukKEdQVC02IFNvbCDsnYAgbWVkaXVtKS5cbiAgLy8gcWdyaWQg7J2YIOyalOyyrSDtmJXtg5wgKyBjb2RleF9jbGlfcnMvMC4xNDcuMCDtl6TrjZTroZwgMjAyNi0wOS0zMCDqtazrj4Ug6rK966GcIOudvOydtOu4jCDsg53shLEg7ISx6rO1LlxuICAvLyBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5vcGVuYWkuY29tL2FwaS9kb2NzL21vZGVscy9ncHQtNi4xLXNvbFxuICBcImdwdC02LjEtc29sXCI6IHtcbiAgICBtYXhFZmZvcnQ6IFwidWx0cmFcIixcbiAgICBpbnB1dFRva2VuczogMixcbiAgICBvdXRwdXRUb2tlbnM6IDEwLFxuICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLjEsXG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiAyLjUsXG4gICAgbG9uZ0NvbnRleHQ6IExPTkdfQ09OVEVYVF8yNzJLLFxuICB9LFxuICAvLyBHUFQtNiBTb2wsIEx1bmEgKDIwMjYtMDktMjIg7Lac7IucKTogU3RhbmRhcmQgQVBJIHByaWNpbmcgdmVyaWZpZWQgMjAyNi0wOS0yMy4gR1BULTUuNiBTb2wvTHVuYSDsnZgg7KCI67CYIOuLqOqwgC5cbiAgLy8gQ29kZXgg7Lm07YOI66Gc6re4KDIwMjYtMDktMjMp64qUIFNvbCDsl5AgdWx0cmEsIEx1bmEg7JeQIG1heCDquYzsp4Ag7ZeI7Jqp7ZWY6rOgIOq4sOuzuCBlZmZvcnQg64qUIOuRmCDri6QgbWVkaXVtIOydtOuLpC5cbiAgLy8gQHNlZSBodHRwczovL2RldmVsb3BlcnMub3BlbmFpLmNvbS9hcGkvZG9jcy9tb2RlbHMvZ3B0LTYtc29sXG4gIC8vIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLm9wZW5haS5jb20vYXBpL2RvY3MvbW9kZWxzL2dwdC02LWx1bmFcbiAgXCJncHQtNi1zb2xcIjoge1xuICAgIG1heEVmZm9ydDogXCJ1bHRyYVwiLFxuICAgIGlucHV0VG9rZW5zOiAyLFxuICAgIG91dHB1dFRva2VuczogMTAsXG4gICAgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMixcbiAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IDIuNSxcbiAgICBsb25nQ29udGV4dDogTE9OR19DT05URVhUXzI3MkssXG4gIH0sXG4gIFwiZ3B0LTYtbHVuYVwiOiB7XG4gICAgbWF4RWZmb3J0OiBcIm1heFwiLFxuICAgIGlucHV0VG9rZW5zOiAwLjEsXG4gICAgb3V0cHV0VG9rZW5zOiAwLjUsXG4gICAgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMDEsXG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiAwLjEyNSxcbiAgICBsb25nQ29udGV4dDogTE9OR19DT05URVhUXzI3MkssXG4gIH0sXG4gIC8vIEdQVC01LjYgU29sLCBUZXJyYSwgTHVuYS4gY2FjaGUgd3JpdGUg64uo6rCA64qUIOyZuOu2gCBsb2dnZXIvbWFudWFsIHVzYWdlIOyeheugpeydhCDsnITtlbRcbiAgLy8g7Jyg7KeA7ZWc64ukLiDtmITsnqwgT3BlbkFJIOydkeuLtSB1c2FnZSDsl5AgY2FjaGUgd3JpdGUg7Yag7YGwIO2VhOuTnOqwgCDsl4bsnLzrqbQg67mE7Jqp7J2AIDDsnLzroZwg6rOE7IKw65Cc64ukLlxuICAvLyBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5vcGVuYWkuY29tL2FwaS9kb2NzL21vZGVscy9ncHQtNS42LXNvbFxuICAvLyBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5vcGVuYWkuY29tL2FwaS9kb2NzL21vZGVscy9ncHQtNS42LXRlcnJhXG4gIC8vIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLm9wZW5haS5jb20vYXBpL2RvY3MvbW9kZWxzL2dwdC01LjYtbHVuYVxuICAvLyBTb2wgcHJvbW90aW9uYWwgcmF0ZXMgYXJlIGF2YWlsYWJsZSBhdCBsZWFzdCB0aHJvdWdoIDIwMjYtMTEtMjEuXG4gIC8vIE5vIGNvbmZpcm1lZCBlbmQgZGF0ZS9yZXBsYWNlbWVudCByYXRlOiByZWNoZWNrIG9mZmljaWFsIHByaWNpbmcgaW5zdGVhZCBvZiBhdXRvLXJldmVydGluZy5cbiAgXCJncHQtNS42LXNvbFwiOiB7XG4gICAgbWF4RWZmb3J0OiBcInVsdHJhXCIsXG4gICAgaW5wdXRUb2tlbnM6IDQsXG4gICAgb3V0cHV0VG9rZW5zOiAyMCxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogMC40LFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogNSxcbiAgICBsb25nQ29udGV4dDogTE9OR19DT05URVhUXzI3MkssXG4gIH0sXG4gIFwiZ3B0LTUuNi10ZXJyYVwiOiB7XG4gICAgbWF4RWZmb3J0OiBcInVsdHJhXCIsXG4gICAgaW5wdXRUb2tlbnM6IDIsXG4gICAgb3V0cHV0VG9rZW5zOiAxMixcbiAgICBjYWNoZWRJbnB1dFRva2VuczogMC4yLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogMi41LFxuICAgIGxvbmdDb250ZXh0OiBMT05HX0NPTlRFWFRfMjcySyxcbiAgfSxcbiAgXCJncHQtNS42LWx1bmFcIjoge1xuICAgIG1heEVmZm9ydDogXCJtYXhcIixcbiAgICBpbnB1dFRva2VuczogMC4yLFxuICAgIG91dHB1dFRva2VuczogMS4yLFxuICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLjAyLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogMC4yNSxcbiAgICBsb25nQ29udGV4dDogTE9OR19DT05URVhUXzI3MkssXG4gIH0sXG4gIC8vIGh0dHBzOi8vb3BlbmFpLmNvbS9pbmRleC9pbnRyb2R1Y2luZy1ncHQtNS01LyAoMjAyNi0wNCDstpzsi5wpXG4gIFwiZ3B0LTUuNVwiOiB7XG4gICAgaW5wdXRUb2tlbnM6IDUsXG4gICAgb3V0cHV0VG9rZW5zOiAzMCxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogMC41LFxuICAgIGxvbmdDb250ZXh0OiBMT05HX0NPTlRFWFRfMjcySyxcbiAgfSxcbiAgLy8g7JWE656YIGdwdC01LjQgLyBncHQtNS40LW1pbmkgLyBncHQtNS4zLWNvZGV4IC8gZ3B0LTUuMiDripQgcWdyaWQg6rCAIOyTsOuKlCBDaGF0R1BUIOq1rOuPhSBDb2RleCDqsr3roZzsl5DshJxcbiAgLy8g642UIOydtOyDgSDsoJzqs7XrkJjsp4Ag7JWK64qU64ukKDUuNCDqs4Tsl7TsnYAgMjAyNi0wOC0zMSByZXRpcmVkLCDrjIDssrQgZ3B0LTUuNi10ZXJyYSAvIGdwdC01LjYtbHVuYSkuXG4gIC8vIOqzvOqxsCByZXF1ZXN0IGxvZyDsnqzsgrDsoJUoY29zdF9zb3VyY2Ug7JeG64qUIGxlZ2FjeSDtlokp7JeQIO2VhOyalO2VmOuvgOuhnCDri6jqsIAg7ZaJ7J2AIOycoOyngO2VnOuLpC5cbiAgLy8gaHR0cHM6Ly9vcGVuYWkuY29tL2luZGV4L2ludHJvZHVjaW5nLWdwdC01LTQvICgyMDI2LTAzIOy2nOyLnClcbiAgXCJncHQtNS40XCI6IHtcbiAgICBpbnB1dFRva2VuczogMi41LFxuICAgIG91dHB1dFRva2VuczogMTUsXG4gICAgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMjUsXG4gICAgbG9uZ0NvbnRleHQ6IExPTkdfQ09OVEVYVF8yNzJLLFxuICB9LFxuICBcImdwdC01LjQtbWluaVwiOiB7IGlucHV0VG9rZW5zOiAwLjc1LCBvdXRwdXRUb2tlbnM6IDQuNSwgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMDc1IH0sXG4gIC8vIGdwdC01LjLsmYAg64+Z7J28IOuLqOqwgCAoY2FjaGVkID0gaW5wdXTsnZggMTAlKVxuICBcImdwdC01LjMtY29kZXhcIjogeyBpbnB1dFRva2VuczogMS43NSwgb3V0cHV0VG9rZW5zOiAxNCwgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMTc1IH0sXG4gIC8vIGh0dHBzOi8vb3BlbmFpLmNvbS9pbmRleC9pbnRyb2R1Y2luZy1ncHQtNS0yLyAoY2FjaGVkIGlucHV0IDkwJSDtlaDsnbgg66qF7IucKVxuICBcImdwdC01LjJcIjogeyBpbnB1dFRva2VuczogMS43NSwgb3V0cHV0VG9rZW5zOiAxNCwgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMTc1IH0sXG59O1xuXG4vLyDilIDilIAgQW50aHJvcGljIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5mdW5jdGlvbiBhbnRocm9waWNDb3N0cyhcbiAgaW5wdXRUb2tlbnM6IG51bWJlcixcbiAgb3V0cHV0VG9rZW5zOiBudW1iZXIsXG4gIG92ZXJyaWRlczogUGljazxQYXJ0aWFsPE1vZGVsQ29zdHM+LCBcImNhY2hlZElucHV0VG9rZW5zXCIgfCBcImxvbmdDb250ZXh0XCI+ID0ge30sXG4pOiBNb2RlbENvc3RzIHtcbiAgcmV0dXJuIHtcbiAgICBpbnB1dFRva2VucyxcbiAgICBvdXRwdXRUb2tlbnMsXG4gICAgLy8g7ZGc7KSAIGNhY2hlIHJlYWQg64qUIGJhc2UgaW5wdXQg7J2YIDAuMXguIEZhYmxlIDUuMSDsspjrn7wg6rO17IudIO2KueuhgCDri6jqsIDqsIAg7J6I7Jy866m0IG92ZXJyaWRlIO2VnOuLpC5cbiAgICBjYWNoZWRJbnB1dFRva2Vuczogb3ZlcnJpZGVzLmNhY2hlZElucHV0VG9rZW5zID8/IGlucHV0VG9rZW5zIC8gMTAsXG4gICAgLy8gQ2xhdWRlIENvZGUgc3Vic2NyaXB0aW9uIE9BdXRoIOuKlCAxaCBUVEwg7J2EIOyekOuPmSDshKDtg53tlZzri6QuIOq1rOuyhOyghOyymOufvCDsnZHri7Xsl5BcbiAgICAvLyBUVEwgYnJlYWtkb3duIOydtCDsl4bsnYQg65WM66eMIOydtCAxaCDri6jqsIDrpbwgZmFsbGJhY2sg7Jy866GcIOyCrOyaqe2VnOuLpC5cbiAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IGlucHV0VG9rZW5zICogMixcbiAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bTogaW5wdXRUb2tlbnMgKiAxLjI1LFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoOiBpbnB1dFRva2VucyAqIDIsXG4gICAgLy8gSGFpa3UgNS41IOyymOufvCDtlITroaztlITtirgg6ri47J20IO2LsOyWtOqwgCDsnojripQg66qo642466eMIGxvbmctY29udGV4dCDrsLDsnKjsnYQg6rCA7KeE64ukLlxuICAgIC4uLihvdmVycmlkZXMubG9uZ0NvbnRleHQgPyB7IGxvbmdDb250ZXh0OiBvdmVycmlkZXMubG9uZ0NvbnRleHQgfSA6IHt9KSxcbiAgfTtcbn1cblxuLy8g6rCA6rKpIOy2nOyymDogaHR0cHM6Ly9wbGF0Zm9ybS5jbGF1ZGUuY29tL2RvY3MvZW4vYWJvdXQtY2xhdWRlL3ByaWNpbmcgKDIwMjYtMTAtMDgg7ZmV7J24LiAyMDI2LTEwLTA3IOyXkCBTb25uZXQgNS41XG4vLyBjYWNoZSByZWFkIOqwgCAkMC4yMOKGkiQwLjEwKDAuMDV4KeycvOuhnCDsnbjtlZjrkJDqs6AsIOq3uCDsmbgg6riw7KG0IOuqqOuNuCDri6jqsIDripQg67OA64+ZIOyXhuydjClcbmNvbnN0IEFOVEhST1BJQ19DT1NUUzogUmVjb3JkPHN0cmluZywgTW9kZWxDb3N0cz4gPSB7XG4gIC8vIEZhYmxlIDUuMSAoMjAyNi0wOS0wMSDstpzsi5wpOiBpbnB1dC9vdXRwdXQg7J2AIEZhYmxlIDUg7JmAIOqwmeqzoCBjYWNoZSByZWFkIOunjCAwLjAyNXgoJDAuMjUpIO2KueuhgC5cbiAgLy8gQHNlZSBodHRwczovL3BsYXRmb3JtLmNsYXVkZS5jb20vZG9jcy9lbi9tb2RlbHMvZmFibGUtNS0xL292ZXJ2aWV3XG4gIFwiY2xhdWRlLWZhYmxlLTUtMVwiOiBhbnRocm9waWNDb3N0cygxMCwgNTAsIHsgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMjUgfSksXG4gIFwiY2xhdWRlLWZhYmxlLTVcIjogYW50aHJvcGljQ29zdHMoMTAsIDUwKSxcbiAgc29ubmV0OiBhbnRocm9waWNDb3N0cygzLCAxNSksXG4gIFwiY2xhdWRlLTMtNS1oYWlrdVwiOiBhbnRocm9waWNDb3N0cygwLjgsIDQpLFxuICBcImNsYXVkZS1oYWlrdS00LTVcIjogYW50aHJvcGljQ29zdHMoMSwgNSksXG4gIFwiY2xhdWRlLTMtNS1zb25uZXRcIjogYW50aHJvcGljQ29zdHMoMywgMTUpLFxuICBcImNsYXVkZS0zLTctc29ubmV0XCI6IGFudGhyb3BpY0Nvc3RzKDMsIDE1KSxcbiAgXCJjbGF1ZGUtc29ubmV0LTRcIjogYW50aHJvcGljQ29zdHMoMywgMTUpLFxuICBcImNsYXVkZS1zb25uZXQtNC01XCI6IGFudGhyb3BpY0Nvc3RzKDMsIDE1KSxcbiAgXCJjbGF1ZGUtc29ubmV0LTQtNlwiOiBhbnRocm9waWNDb3N0cygzLCAxNSksXG4gIFwiY2xhdWRlLXNvbm5ldC00LTdcIjogYW50aHJvcGljQ29zdHMoMywgMTUpLFxuICBcImNsYXVkZS1vcHVzLTRcIjogYW50aHJvcGljQ29zdHMoMTUsIDc1KSxcbiAgXCJjbGF1ZGUtb3B1cy00LTFcIjogYW50aHJvcGljQ29zdHMoMTUsIDc1KSxcbiAgXCJjbGF1ZGUtb3B1cy00LTVcIjogYW50aHJvcGljQ29zdHMoNSwgMjUpLFxuICBcImNsYXVkZS1vcHVzLTQtNlwiOiBhbnRocm9waWNDb3N0cyg1LCAyNSksXG4gIFwiY2xhdWRlLW9wdXMtNC03XCI6IGFudGhyb3BpY0Nvc3RzKDUsIDI1KSxcbiAgXCJjbGF1ZGUtb3B1cy00LThcIjogYW50aHJvcGljQ29zdHMoNSwgMjUpLFxuICBcImNsYXVkZS1vcHVzLTVcIjogYW50aHJvcGljQ29zdHMoNSwgMjUpLFxuICAvLyBPcHVzIDUuNSAoMjAyNi0wOS0yMiDstpzsi5wpOiAkNC8kMjAuIGNhY2hlIHJlYWQg64qUIDAuMDV4KCQwLjIwKSDtirnroYAsIGNhY2hlIHdyaXRlIOuKlCDtkZzspIAg67Cw7JyoKCQ1LyQ4KS5cbiAgLy8gQHNlZSBodHRwczovL3BsYXRmb3JtLmNsYXVkZS5jb20vZG9jcy9lbi9tb2RlbHMvb3B1cy01LTUvb3ZlcnZpZXdcbiAgXCJjbGF1ZGUtb3B1cy01LTVcIjogYW50aHJvcGljQ29zdHMoNCwgMjAsIHsgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMiB9KSxcbiAgLy8gU29ubmV0IDUg7J2YIGludHJvZHVjdG9yeSAkMi8kMTAg7J20IOygleyLnSDri6jqsIDroZwg7ZmV7KCV65CQ64ukLiAyMDI2LTA5LTAxIOyXkCDsmIjsoJXrkJDrjZggJDMvJDE1IOyduOyDgeydgFxuICAvLyDst6jshozrkJDsnLzrr4DroZwg64Kg7KecIOu2hOq4sCDsl4bsnbQg6rOg7KCVIOuLqOqwgOuhnCDqs4TsgrDtlZzri6QuXG4gIFwiY2xhdWRlLXNvbm5ldC01XCI6IGFudGhyb3BpY0Nvc3RzKDIsIDEwKSxcbiAgLy8gU29ubmV0IDUuNSAoMjAyNi0wOS0yOCDstpzsi5wpOiBTb25uZXQgNSDsmYAg6rCZ7J2AICQyLyQxMC4gY2FjaGUgcmVhZCDripQg7Lac7IucIOyLnCDtkZzspIAgMC4xeCgkMC4yMCnsmIDri6TqsIBcbiAgLy8gMjAyNi0xMC0wNyBIYWlrdSA1LjUg7Lac7Iuc7JmAIO2VqOq7mCBPcHVzIDUuNSDsmYAg6rCZ7J2AIDAuMDV4KCQwLjEwKeuhnCDsnbjtlZjrkJDri6QoQVBJIOumtOumrOyKpCDrhbjtirgpLiDruYTsmqnsnYAg7JqU7LKtIOyLnOygkFxuICAvLyDri6jqsIDroZwg6riw66Gd65CY66+A66GcIOuCoOynnCDrtoTquLAg7JeG7J20IO2YhO2WiSDri6jqsIDrp4wg65GU64ukLiBjYWNoZSB3cml0ZSDripQg7ZGc7KSAIOuwsOycqCgkMi41MC8kNCkuXG4gIC8vIEBzZWUgaHR0cHM6Ly9wbGF0Zm9ybS5jbGF1ZGUuY29tL2RvY3MvZW4vcmVsZWFzZS1ub3Rlcy9vdmVydmlldyAoMjAyNi0xMC0wNylcbiAgXCJjbGF1ZGUtc29ubmV0LTUtNVwiOiBhbnRocm9waWNDb3N0cygyLCAxMCwgeyBjYWNoZWRJbnB1dFRva2VuczogMC4xIH0pLFxuICAvLyBIYWlrdSA1LjUgKDIwMjYtMTAtMDcg7Lac7IucKTog7ZSE66Gs7ZSE7Yq4IOq4uOydtCDti7DslrQg64uo6rCALiAxMDBLIOydtO2VmCAkMC4xMC8kMC41MCwgY2FjaGUgcmVhZCAwLjF4KCQwLjAxKSxcbiAgLy8gY2FjaGUgd3JpdGUgNW0gJDAuMTI1IC8gMWggJDAuMjAuIOyeheugpeydtCAxMDBLIOulvCDrhJjsnLzrqbQgaW5wdXQvY2FjaGUgcmVhZC9jYWNoZSB3cml0ZS9vdXRwdXQg66qo65GQIDV4XG4gIC8vICgkMC41MC8kMC4wNS8kMC42MjXCtyQxLyQyLjUwKeqwgCDsmpTssq0g7KCE7LK07JeQIOyggeyaqeuQnOuLpC4gMU0g7Luo7YWN7Iqk7Yq4IOuqqOuNuCDspJEg7Jyg7J287ZWY6rKMIOq4uOydtOuzhCDri6jqsIDrpbwg7JO064ukLlxuICAvLyBAc2VlIGh0dHBzOi8vcGxhdGZvcm0uY2xhdWRlLmNvbS9kb2NzL2VuL21vZGVscy9oYWlrdS01LTUvb3ZlcnZpZXdcbiAgXCJjbGF1ZGUtaGFpa3UtNS01XCI6IGFudGhyb3BpY0Nvc3RzKDAuMSwgMC41LCB7XG4gICAgbG9uZ0NvbnRleHQ6IHtcbiAgICAgIHRocmVzaG9sZDogMTAwXzAwMCxcbiAgICAgIGlucHV0TXVsdGlwbGllcjogNSxcbiAgICAgIGNhY2hlZElucHV0TXVsdGlwbGllcjogNSxcbiAgICAgIG91dHB1dE11bHRpcGxpZXI6IDUsXG4gICAgfSxcbiAgfSksXG59O1xuXG4vLyBncHQtNS4zLWNvZGV4LXNwYXJrIOuKlCByZXNlYXJjaCBwcmV2aWV3IOuhnCDqs7Xsi50gdG9rZW4g64uo6rCA6rCAIOyVhOyngSBmaW5hbCDsnbQg7JWE64uI64ukLlxuLy8g7KeA7JuQIO2DgOyeheydgCDsnKDsp4DtlZjrkJgsIOqzteyLnSDri6jqsIDqsIAg6rO16rCc65CgIOuVjOq5jOyngCDslYTrnpggZ2VuZXJpYyBlc3RpbWF0ZSDroZwg6rOE7IKw7ZWc64ukLlxuLy8gQHNlZSBodHRwczovL2hlbHAub3BlbmFpLmNvbS9lbi9hcnRpY2xlcy8yMDAwMTEwNi1jb2RleC1yYXRlLWNhcmRcbmNvbnN0IERFRkFVTFRfQ09TVFM6IE1vZGVsQ29zdHMgPSB7IGlucHV0VG9rZW5zOiAzLCBvdXRwdXRUb2tlbnM6IDE1LCBjYWNoZWRJbnB1dFRva2VuczogMC4zIH07XG5cbi8qKiBDb2RleCDrsLHsl5Trk5zqsIAg7J20IOuqqOuNuOyXkCDtl4jsmqntlZjripQg7LWc64yAIGVmZm9ydC4g7Lm07YOI66Gc6re47JeQIOyXhuuKlCDrqqjrjbjsnYAgeGhpZ2gg6rmM7KeA64ukLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wZW5haU1vZGVsTWF4RWZmb3J0KG1vZGVsOiBzdHJpbmcpOiBPcGVuQUlFZmZvcnQge1xuICByZXR1cm4gT1BFTkFJX0NPU1RTW21vZGVsXT8ubWF4RWZmb3J0ID8/IFwieGhpZ2hcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZGVsQ29zdHMobW9kZWw6IHN0cmluZyk6IE1vZGVsQ29zdHMge1xuICBjb25zdCBub3JtYWxpemVkTW9kZWwgPSAobW9kZWwuc3BsaXQoXCIvXCIpLnBvcCgpID8/IG1vZGVsKS5yZXBsYWNlKC9cXFsxbVxcXSQvaSwgXCJcIik7XG4gIHJldHVybiBPUEVOQUlfQ09TVFNbbm9ybWFsaXplZE1vZGVsXSA/PyBBTlRIUk9QSUNfQ09TVFNbbm9ybWFsaXplZE1vZGVsXSA/PyBERUZBVUxUX0NPU1RTO1xufVxuXG4vLyBWZXJpZmllZCBGYXN0IEFQSSByYXRlcyBmb3IgdGhlIGN1cnJlbnRseSBzZXJ2ZWQgQ29kZXggbW9kZWxzICgyMDI2LTEwLTE2KS5cbi8vIEFwcGxpZXMgdG8gYWxsIHRva2VuIGNhdGVnb3JpZXMgYW5kIGxvbmcgY29udGV4dDsgbm90IHRoZSAyLjV4IHN1YnNjcmlwdGlvbiBxdW90YSBtdWx0aXBsaWVyLlxuLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLm9wZW5haS5jb20vYXBpL2RvY3MvcHJpY2luZ1xuY29uc3QgT1BFTkFJX0ZBU1RfTVVMVElQTElFUlM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7XG4gIFwiZ3B0LTYtYXN0cmFcIjogMixcbiAgXCJncHQtNi4xLXNvbFwiOiAyLFxuICBcImdwdC02LXNvbFwiOiAyLFxuICBcImdwdC02LWx1bmFcIjogMixcbiAgXCJncHQtNS42LXNvbFwiOiAyLFxuICBcImdwdC01LjYtdGVycmFcIjogMixcbiAgXCJncHQtNS42LWx1bmFcIjogMixcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVDb3N0VXNkKFxuICBtb2RlbDogc3RyaW5nLFxuICB1c2FnZToge1xuICAgIGlucHV0VG9rZW5zOiBudW1iZXI7XG4gICAgb3V0cHV0VG9rZW5zOiBudW1iZXI7XG4gICAgY2FjaGVkSW5wdXRUb2tlbnM/OiBudW1iZXI7XG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zPzogbnVtYmVyO1xuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtPzogbnVtYmVyO1xuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoPzogbnVtYmVyO1xuICB9LFxuICBzZXJ2aWNlVGllcj86IHN0cmluZyxcbik6IG51bWJlciB7XG4gIGNvbnN0IGNvc3RzID0gZ2V0TW9kZWxDb3N0cyhtb2RlbCk7XG4gIGNvbnN0IGNhY2hlZElucHV0ID0gdXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMgPz8gMDtcbiAgY29uc3QgY2FjaGVDcmVhdGlvbklucHV0NW0gPSBNYXRoLm1heCh1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bSA/PyAwLCAwKTtcbiAgY29uc3QgY2FjaGVDcmVhdGlvbklucHV0MWggPSBNYXRoLm1heCh1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaCA/PyAwLCAwKTtcbiAgY29uc3QgY2FjaGVDcmVhdGlvbklucHV0ID0gTWF0aC5tYXgoXG4gICAgdXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zID8/IDAsXG4gICAgY2FjaGVDcmVhdGlvbklucHV0NW0gKyBjYWNoZUNyZWF0aW9uSW5wdXQxaCxcbiAgKTtcbiAgY29uc3QgY2xhc3NpZmllZENhY2hlQ3JlYXRpb25JbnB1dDVtID0gTWF0aC5taW4oY2FjaGVDcmVhdGlvbklucHV0NW0sIGNhY2hlQ3JlYXRpb25JbnB1dCk7XG4gIGNvbnN0IGNsYXNzaWZpZWRDYWNoZUNyZWF0aW9uSW5wdXQxaCA9IE1hdGgubWluKFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dDFoLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dCAtIGNsYXNzaWZpZWRDYWNoZUNyZWF0aW9uSW5wdXQ1bSxcbiAgKTtcbiAgY29uc3QgdW5jbGFzc2lmaWVkQ2FjaGVDcmVhdGlvbklucHV0ID1cbiAgICBjYWNoZUNyZWF0aW9uSW5wdXQgLSBjbGFzc2lmaWVkQ2FjaGVDcmVhdGlvbklucHV0NW0gLSBjbGFzc2lmaWVkQ2FjaGVDcmVhdGlvbklucHV0MWg7XG4gIGNvbnN0IG5vbkNhY2hlZElucHV0ID0gTWF0aC5tYXgodXNhZ2UuaW5wdXRUb2tlbnMgLSBjYWNoZWRJbnB1dCAtIGNhY2hlQ3JlYXRpb25JbnB1dCwgMCk7XG5cbiAgLy8gbG9uZy1jb250ZXh0IO2VoOymnTog7KCE7LK0IOyeheugpShpbnB1dF90b2tlbnMsIGNhY2hlIO2PrO2VqCnsnbQgdGhyZXNob2xkIOy0iOqzvCDsi5wg7JqU7LKtIOyghOyytOyXkCDrsLDsnKgg7KCB7JqpXG4gIGNvbnN0IGxjID0gY29zdHMubG9uZ0NvbnRleHQ7XG4gIGNvbnN0IGlzTG9uZ0NvbnRleHQgPSBsYyAhPT0gdW5kZWZpbmVkICYmIHVzYWdlLmlucHV0VG9rZW5zID4gbGMudGhyZXNob2xkO1xuICBjb25zdCBpbnB1dFJhdGUgPSBjb3N0cy5pbnB1dFRva2VucyAqIChpc0xvbmdDb250ZXh0ID8gbGMuaW5wdXRNdWx0aXBsaWVyIDogMSk7XG4gIGNvbnN0IGNhY2hlZFJhdGUgPSBjb3N0cy5jYWNoZWRJbnB1dFRva2VucyAqIChpc0xvbmdDb250ZXh0ID8gbGMuY2FjaGVkSW5wdXRNdWx0aXBsaWVyIDogMSk7XG4gIGNvbnN0IGNhY2hlQ3JlYXRpb25GYWxsYmFja1JhdGUgPVxuICAgIChjb3N0cy5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMgPz8gY29zdHMuaW5wdXRUb2tlbnMpICpcbiAgICAoaXNMb25nQ29udGV4dCA/IGxjLmlucHV0TXVsdGlwbGllciA6IDEpO1xuICBjb25zdCBjYWNoZUNyZWF0aW9uNW1SYXRlID1cbiAgICAoY29zdHMuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zNW0gPz8gY29zdHMuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zID8/IGNvc3RzLmlucHV0VG9rZW5zKSAqXG4gICAgKGlzTG9uZ0NvbnRleHQgPyBsYy5pbnB1dE11bHRpcGxpZXIgOiAxKTtcbiAgY29uc3QgY2FjaGVDcmVhdGlvbjFoUmF0ZSA9XG4gICAgKGNvc3RzLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoID8/IGNvc3RzLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VucyA/PyBjb3N0cy5pbnB1dFRva2VucykgKlxuICAgIChpc0xvbmdDb250ZXh0ID8gbGMuaW5wdXRNdWx0aXBsaWVyIDogMSk7XG4gIGNvbnN0IG91dHB1dFJhdGUgPSBjb3N0cy5vdXRwdXRUb2tlbnMgKiAoaXNMb25nQ29udGV4dCA/IGxjLm91dHB1dE11bHRpcGxpZXIgOiAxKTtcblxuICBjb25zdCBzdGFuZGFyZENvc3QgPVxuICAgIChub25DYWNoZWRJbnB1dCAvIDFfMDAwXzAwMCkgKiBpbnB1dFJhdGUgK1xuICAgICh1c2FnZS5vdXRwdXRUb2tlbnMgLyAxXzAwMF8wMDApICogb3V0cHV0UmF0ZSArXG4gICAgKGNhY2hlZElucHV0IC8gMV8wMDBfMDAwKSAqIGNhY2hlZFJhdGUgK1xuICAgICh1bmNsYXNzaWZpZWRDYWNoZUNyZWF0aW9uSW5wdXQgLyAxXzAwMF8wMDApICogY2FjaGVDcmVhdGlvbkZhbGxiYWNrUmF0ZSArXG4gICAgKGNsYXNzaWZpZWRDYWNoZUNyZWF0aW9uSW5wdXQ1bSAvIDFfMDAwXzAwMCkgKiBjYWNoZUNyZWF0aW9uNW1SYXRlICtcbiAgICAoY2xhc3NpZmllZENhY2hlQ3JlYXRpb25JbnB1dDFoIC8gMV8wMDBfMDAwKSAqIGNhY2hlQ3JlYXRpb24xaFJhdGU7XG4gIGNvbnN0IG5vcm1hbGl6ZWRNb2RlbCA9IG1vZGVsLnNwbGl0KFwiL1wiKS5wb3AoKSA/PyBtb2RlbDtcbiAgcmV0dXJuIChcbiAgICBzdGFuZGFyZENvc3QgKiAoc2VydmljZVRpZXIgPT09IFwiZmFzdFwiID8gKE9QRU5BSV9GQVNUX01VTFRJUExJRVJTW25vcm1hbGl6ZWRNb2RlbF0gPz8gMSkgOiAxKVxuICApO1xufVxuIl0sIm1hcHBpbmdzIjoiO0FBMENBLE1BQU0sb0JBQTREO0NBQ2hFLFdBQVc7Q0FDWCxpQkFBaUI7Q0FDakIsdUJBQXVCO0NBQ3ZCLGtCQUFrQjtBQUNwQjtBQU9BLE1BQU0sZUFBZ0Q7Q0FLcEQsZUFBZTtFQUNiLFdBQVc7RUFDWCxhQUFhO0VBQ2IsY0FBYztFQUNkLG1CQUFtQjtFQUNuQiwwQkFBMEI7RUFDMUIsYUFBYTtDQUNmO0NBS0EsZUFBZTtFQUNiLFdBQVc7RUFDWCxhQUFhO0VBQ2IsY0FBYztFQUNkLG1CQUFtQjtFQUNuQiwwQkFBMEI7RUFDMUIsYUFBYTtDQUNmO0NBS0EsYUFBYTtFQUNYLFdBQVc7RUFDWCxhQUFhO0VBQ2IsY0FBYztFQUNkLG1CQUFtQjtFQUNuQiwwQkFBMEI7RUFDMUIsYUFBYTtDQUNmO0NBQ0EsY0FBYztFQUNaLFdBQVc7RUFDWCxhQUFhO0VBQ2IsY0FBYztFQUNkLG1CQUFtQjtFQUNuQiwwQkFBMEI7RUFDMUIsYUFBYTtDQUNmO0NBUUEsZUFBZTtFQUNiLFdBQVc7RUFDWCxhQUFhO0VBQ2IsY0FBYztFQUNkLG1CQUFtQjtFQUNuQiwwQkFBMEI7RUFDMUIsYUFBYTtDQUNmO0NBQ0EsaUJBQWlCO0VBQ2YsV0FBVztFQUNYLGFBQWE7RUFDYixjQUFjO0VBQ2QsbUJBQW1CO0VBQ25CLDBCQUEwQjtFQUMxQixhQUFhO0NBQ2Y7Q0FDQSxnQkFBZ0I7RUFDZCxXQUFXO0VBQ1gsYUFBYTtFQUNiLGNBQWM7RUFDZCxtQkFBbUI7RUFDbkIsMEJBQTBCO0VBQzFCLGFBQWE7Q0FDZjtDQUVBLFdBQVc7RUFDVCxhQUFhO0VBQ2IsY0FBYztFQUNkLG1CQUFtQjtFQUNuQixhQUFhO0NBQ2Y7Q0FLQSxXQUFXO0VBQ1QsYUFBYTtFQUNiLGNBQWM7RUFDZCxtQkFBbUI7RUFDbkIsYUFBYTtDQUNmO0NBQ0EsZ0JBQWdCO0VBQUUsYUFBYTtFQUFNLGNBQWM7RUFBSyxtQkFBbUI7Q0FBTTtDQUVqRixpQkFBaUI7RUFBRSxhQUFhO0VBQU0sY0FBYztFQUFJLG1CQUFtQjtDQUFNO0NBRWpGLFdBQVc7RUFBRSxhQUFhO0VBQU0sY0FBYztFQUFJLG1CQUFtQjtDQUFNO0FBQzdFO0FBSUEsU0FBUyxlQUNQLGFBQ0EsY0FDQSxZQUE0RSxDQUFDLEdBQ2pFO0NBQ1osT0FBTztFQUNMO0VBQ0E7RUFFQSxtQkFBbUIsVUFBVSxxQkFBcUIsY0FBYztFQUdoRSwwQkFBMEIsY0FBYztFQUN4Qyw0QkFBNEIsY0FBYztFQUMxQyw0QkFBNEIsY0FBYztFQUUxQyxHQUFJLFVBQVUsY0FBYyxFQUFFLGFBQWEsVUFBVSxZQUFZLElBQUksQ0FBQztDQUN4RTtBQUNGO0FBSUEsTUFBTSxrQkFBOEM7Q0FHbEQsb0JBQW9CLGVBQWUsSUFBSSxJQUFJLEVBQUUsbUJBQW1CLElBQUssQ0FBQztDQUN0RSxrQkFBa0IsZUFBZSxJQUFJLEVBQUU7Q0FDdkMsUUFBUSxlQUFlLEdBQUcsRUFBRTtDQUM1QixvQkFBb0IsZUFBZSxJQUFLLENBQUM7Q0FDekMsb0JBQW9CLGVBQWUsR0FBRyxDQUFDO0NBQ3ZDLHFCQUFxQixlQUFlLEdBQUcsRUFBRTtDQUN6QyxxQkFBcUIsZUFBZSxHQUFHLEVBQUU7Q0FDekMsbUJBQW1CLGVBQWUsR0FBRyxFQUFFO0NBQ3ZDLHFCQUFxQixlQUFlLEdBQUcsRUFBRTtDQUN6QyxxQkFBcUIsZUFBZSxHQUFHLEVBQUU7Q0FDekMscUJBQXFCLGVBQWUsR0FBRyxFQUFFO0NBQ3pDLGlCQUFpQixlQUFlLElBQUksRUFBRTtDQUN0QyxtQkFBbUIsZUFBZSxJQUFJLEVBQUU7Q0FDeEMsbUJBQW1CLGVBQWUsR0FBRyxFQUFFO0NBQ3ZDLG1CQUFtQixlQUFlLEdBQUcsRUFBRTtDQUN2QyxtQkFBbUIsZUFBZSxHQUFHLEVBQUU7Q0FDdkMsbUJBQW1CLGVBQWUsR0FBRyxFQUFFO0NBQ3ZDLGlCQUFpQixlQUFlLEdBQUcsRUFBRTtDQUdyQyxtQkFBbUIsZUFBZSxHQUFHLElBQUksRUFBRSxtQkFBbUIsR0FBSSxDQUFDO0NBR25FLG1CQUFtQixlQUFlLEdBQUcsRUFBRTtDQUt2QyxxQkFBcUIsZUFBZSxHQUFHLElBQUksRUFBRSxtQkFBbUIsR0FBSSxDQUFDO0NBS3JFLG9CQUFvQixlQUFlLElBQUssSUFBSyxFQUMzQyxhQUFhO0VBQ1gsV0FBVztFQUNYLGlCQUFpQjtFQUNqQix1QkFBdUI7RUFDdkIsa0JBQWtCO0NBQ3BCLEVBQ0YsQ0FBQztBQUNIO0FBS0EsTUFBTSxnQkFBNEI7Q0FBRSxhQUFhO0NBQUcsY0FBYztDQUFJLG1CQUFtQjtBQUFJOztBQUc3RixTQUFnQixxQkFBcUIsT0FBNkI7Q0FDaEUsT0FBTyxhQUFhLE1BQU0sRUFBRSxhQUFhO0FBQzNDO0FBRUEsU0FBZ0IsY0FBYyxPQUEyQjtDQUN2RCxNQUFNLG1CQUFtQixNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQUEsQ0FBTyxRQUFRLFlBQVksRUFBRTtDQUNoRixPQUFPLGFBQWEsb0JBQW9CLGdCQUFnQixvQkFBb0I7QUFDOUU7QUFLQSxNQUFNLDBCQUFrRDtDQUN0RCxlQUFlO0NBQ2YsZUFBZTtDQUNmLGFBQWE7Q0FDYixjQUFjO0NBQ2QsZUFBZTtDQUNmLGlCQUFpQjtDQUNqQixnQkFBZ0I7QUFDbEI7QUFFQSxTQUFnQixpQkFDZCxPQUNBLE9BUUEsYUFDUTtDQUNSLE1BQU0sUUFBUSxjQUFjLEtBQUs7Q0FDakMsTUFBTSxjQUFjLE1BQU0scUJBQXFCO0NBQy9DLE1BQU0sdUJBQXVCLEtBQUssSUFBSSxNQUFNLDhCQUE4QixHQUFHLENBQUM7Q0FDOUUsTUFBTSx1QkFBdUIsS0FBSyxJQUFJLE1BQU0sOEJBQThCLEdBQUcsQ0FBQztDQUM5RSxNQUFNLHFCQUFxQixLQUFLLElBQzlCLE1BQU0sNEJBQTRCLEdBQ2xDLHVCQUF1QixvQkFDekI7Q0FDQSxNQUFNLGlDQUFpQyxLQUFLLElBQUksc0JBQXNCLGtCQUFrQjtDQUN4RixNQUFNLGlDQUFpQyxLQUFLLElBQzFDLHNCQUNBLHFCQUFxQiw4QkFDdkI7Q0FDQSxNQUFNLGlDQUNKLHFCQUFxQixpQ0FBaUM7Q0FDeEQsTUFBTSxpQkFBaUIsS0FBSyxJQUFJLE1BQU0sY0FBYyxjQUFjLG9CQUFvQixDQUFDO0NBR3ZGLE1BQU0sS0FBSyxNQUFNO0NBQ2pCLE1BQU0sZ0JBQWdCLE9BQU8sVUFBYSxNQUFNLGNBQWMsR0FBRztDQUNqRSxNQUFNLFlBQVksTUFBTSxlQUFlLGdCQUFnQixHQUFHLGtCQUFrQjtDQUM1RSxNQUFNLGFBQWEsTUFBTSxxQkFBcUIsZ0JBQWdCLEdBQUcsd0JBQXdCO0NBQ3pGLE1BQU0sNkJBQ0gsTUFBTSw0QkFBNEIsTUFBTSxnQkFDeEMsZ0JBQWdCLEdBQUcsa0JBQWtCO0NBQ3hDLE1BQU0sdUJBQ0gsTUFBTSw4QkFBOEIsTUFBTSw0QkFBNEIsTUFBTSxnQkFDNUUsZ0JBQWdCLEdBQUcsa0JBQWtCO0NBQ3hDLE1BQU0sdUJBQ0gsTUFBTSw4QkFBOEIsTUFBTSw0QkFBNEIsTUFBTSxnQkFDNUUsZ0JBQWdCLEdBQUcsa0JBQWtCO0NBQ3hDLE1BQU0sYUFBYSxNQUFNLGdCQUFnQixnQkFBZ0IsR0FBRyxtQkFBbUI7Q0FFL0UsTUFBTSxlQUNILGlCQUFpQixNQUFhLFlBQzlCLE1BQU0sZUFBZSxNQUFhLGFBQ2xDLGNBQWMsTUFBYSxhQUMzQixpQ0FBaUMsTUFBYSw0QkFDOUMsaUNBQWlDLE1BQWEsc0JBQzlDLGlDQUFpQyxNQUFhO0NBQ2pELE1BQU0sa0JBQWtCLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLEtBQUs7Q0FDbEQsT0FDRSxnQkFBZ0IsZ0JBQWdCLFNBQVUsd0JBQXdCLG9CQUFvQixJQUFLO0FBRS9GIn0=
|
|
235
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtY29zdC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9tb2RlbC1jb3N0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog66qo642467OEIO2GoO2BsCDqsIDqsqkg7YWM7J2067iUICsgY29zdCDqs4TsgrAuXG4gKlxuICogY2xhdWRlIGNvZGUg7JmAIOuPmeydvCDtjKjthLQ6IO2BtOudvOydtOyWuO2KuOyXkOyEnCDqsIDqsqkg7YWM7J2067iU66GcIOyngeygkSDqs4TsgrAuXG4gKiDqsIDqsqkg64uo7JyEOiBVU0QgcGVyIDFNIHRva2Vucy5cbiAqXG4gKiBPcGVuQUkg66qo6424IOuqqeuhneydgCBPcGVuQUkg66qo6424IOusuOyEnOyZgCDtmITsnqwg7KeA7JuQIOuqqeuhneydhCDquLDspIDsnLzroZwg6rSA66as7ZWc64ukLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvcHJpY2luZ1xuICogQHNlZSBodHRwczovL3BsYXRmb3JtLmNsYXVkZS5jb20vZG9jcy9lbi9hYm91dC1jbGF1ZGUvcHJpY2luZ1xuICovXG5cbmltcG9ydCB7IEdST0tfVVNEX1BFUl9USUNLIH0gZnJvbSBcIi4uL2dyb2svZ3Jvay1jb25zdGFudHNcIjtcbmltcG9ydCB7IHR5cGUgT3BlbkFJRWZmb3J0IH0gZnJvbSBcIi4vZWZmb3J0XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxDb3N0cyB7XG4gIGlucHV0VG9rZW5zOiBudW1iZXI7XG4gIG91dHB1dFRva2VuczogbnVtYmVyO1xuICBjYWNoZWRJbnB1dFRva2VuczogbnVtYmVyO1xuICAvKiogVFRMIGJyZWFrZG93biDsnbQg7JeG64qUIHVzYWdlIOyXkCDsoIHsmqntlaAgY2FjaGUgd3JpdGUgZmFsbGJhY2sg64uo6rCALiAqL1xuICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM/OiBudW1iZXI7XG4gIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtPzogbnVtYmVyO1xuICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaD86IG51bWJlcjtcbiAgLyoqXG4gICAqIGxvbmctY29udGV4dCDtlaDspp0uIOyghOyytCDsnoXroKUg7Yag7YGwKGlucHV0X3Rva2VucywgY2FjaGVfcmVhZCDtj6ztlagp7J20IHRocmVzaG9sZCDstIjqs7wg7IucXG4gICAqIOy0iOqzvOu2hOunjOydtCDslYTri4jrnbwg7JqU7LKtIOyghOyytChmdWxsIHNlc3Npb24p7JeQIOuwsOycqCDsoIHsmqkuXG4gICAqL1xuICBsb25nQ29udGV4dD86IHtcbiAgICB0aHJlc2hvbGQ6IG51bWJlcjtcbiAgICBpbnB1dE11bHRpcGxpZXI6IG51bWJlcjtcbiAgICBjYWNoZWRJbnB1dE11bHRpcGxpZXI6IG51bWJlcjtcbiAgICBvdXRwdXRNdWx0aXBsaWVyOiBudW1iZXI7XG4gIH07XG59XG5cbi8vIOKUgOKUgCBPcGVuQUkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vL1xuLy8gU3RhbmRhcmQgcHJpY2luZyB2ZXJpZmllZCAyMDI2LTA5LTIzICjquLDsobQg66qo6424IOuLqOqwgCDrs4Drj5kg7JeG7J2MKTogaHR0cHM6Ly9kZXZlbG9wZXJzLm9wZW5haS5jb20vYXBpL2RvY3MvcHJpY2luZ1xuLy8g7Iug66qo6424IOy2nOyLnOuniOuLpCDri6jqsIDqsIAg67CU64CM66+A66GcKDUuMuKGkjUuNOKGkjUuNSkg66qo6424IOy2lOqwgCDsi5wg67CY65Oc7IucIOqzteyLnSDtjpjsnbTsp4Ag7J6s7ZmV7J247ZW07JW87ZWoXG5cbi8vIEdQVC01LjTsl5DshJwg7LKY7J2MIOuPhOyeheuQnCBsb25nLWNvbnRleHQg7ZWg7KadICg1LjIvNS4zLWNvZGV464qUIO2VtOuLuSDsl4bsnYwsIDUuNC1taW5pL25hbm/ripQg6rO17IudIO2RnOyXkOyEnCBsb25nLWNvbnRleHQg64uo6rCAIOyXhuydjClcbi8vIDI3Mksg7LSI6rO8IOyLnCBpbnB1dCAyeCAvIGNhY2hlZCAyeCAvIG91dHB1dCAxLjV4IOKAlCDstIjqs7zrtoTrp4zsnbQg7JWE64uMIOyEuOyFmCDsoITssrTsl5Ag7KCB7Jqp65CoXG4vLyBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5vcGVuYWkuY29tL2FwaS9kb2NzL21vZGVscy9ncHQtNS41IChcInByb21wdHMgd2l0aCA+MjcySyBpbnB1dCB0b2tlbnNcIilcbmNvbnN0IExPTkdfQ09OVEVYVF8yNzJLOiBOb25OdWxsYWJsZTxNb2RlbENvc3RzW1wibG9uZ0NvbnRleHRcIl0+ID0ge1xuICB0aHJlc2hvbGQ6IDI3Ml8wMDAsXG4gIGlucHV0TXVsdGlwbGllcjogMixcbiAgY2FjaGVkSW5wdXRNdWx0aXBsaWVyOiAyLFxuICBvdXRwdXRNdWx0aXBsaWVyOiAxLjUsXG59O1xuXG4vLyBPcGVuQUkg66qo6424IOy5tO2DiOuhnOq3uC4g64uo6rCA7JmAIO2VqOq7mCBDb2RleCDrsLHsl5Trk5zqsIAg66qo642467OE66GcIOuwm+uKlCDstZzrjIAgcmVhc29uaW5nIGVmZm9ydCDrpbwg7ZWcIOqzs+yXkCDrkZTri6QuXG4vLyBtYXhFZmZvcnQg7Lac7LKYOiB+Ly5jb2RleC9tb2RlbHNfY2FjaGUuanNvbiDsnZggc3VwcG9ydGVkX3JlYXNvbmluZ19sZXZlbHMgKDIwMjYtMDktMDcg7ZmV7J24KS5cbi8vIOuvuOq4sOyerCDrqqjrjbjsnYAgeGhpZ2gg6rmM7KeA66eMIOuwm+uKlOuLpC5cbnR5cGUgT3BlbkFJTW9kZWxTcGVjID0gTW9kZWxDb3N0cyAmIHsgbWF4RWZmb3J0PzogT3BlbkFJRWZmb3J0IH07XG5cbmNvbnN0IE9QRU5BSV9DT1NUUyA9IG5ldyBNYXA8c3RyaW5nLCBPcGVuQUlNb2RlbFNwZWM+KFxuICBPYmplY3QuZW50cmllcyh7XG4gICAgLy8gR1BULTYgQXN0cmE6IFN0YW5kYXJkIEFQSS1lcXVpdmFsZW50IHByaWNpbmcsIHZlcmlmaWVkIDIwMjYtMDktMDcuXG4gICAgLy8gQ29kZXggc3Vic2NyaXB0aW9uIGNhdGFsb2cgc3VwcG9ydHMgdWx0cmE7IHRoZSBwdWJsaWMgQVBJIGxpc3RzIG9ubHkgdGhyb3VnaCBtYXguXG4gICAgLy8gQHNlZSBodHRwczovL2RldmVsb3BlcnMub3BlbmFpLmNvbS9hcGkvZG9jcy9tb2RlbHMvZ3B0LTYtYXN0cmFcbiAgICAvLyBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5vcGVuYWkuY29tL2FwaS9kb2NzL3ByaWNpbmdcbiAgICBcImdwdC02LWFzdHJhXCI6IHtcbiAgICAgIG1heEVmZm9ydDogXCJ1bHRyYVwiLFxuICAgICAgaW5wdXRUb2tlbnM6IDEwLFxuICAgICAgb3V0cHV0VG9rZW5zOiA1MCxcbiAgICAgIGNhY2hlZElucHV0VG9rZW5zOiAxLFxuICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiAxMi41LFxuICAgICAgbG9uZ0NvbnRleHQ6IExPTkdfQ09OVEVYVF8yNzJLLFxuICAgIH0sXG4gICAgLy8gR1BULTYuMSBTb2wgKDIwMjYtMDktMjkgRGV2RGF5IOy2nOyLnCk6IFN0YW5kYXJkIEFQSSBwcmljaW5nIHZlcmlmaWVkIDIwMjYtMDktMzAuIEdQVC02IFNvbCDqs7wg6rCZ6rOgIGNhY2hlZCBpbnB1dCDrp4wg7KCI67CYLlxuICAgIC8vIENvZGV4IOy5tO2DiOuhnOq3uCgyMDI2LTA5LTMwKeuKlCB1bHRyYSDquYzsp4Ag7ZeI7Jqp7ZWY6rOgIOq4sOuzuCBlZmZvcnQg64qUIGxvdyDri6QoR1BULTYgU29sIOydgCBtZWRpdW0pLlxuICAgIC8vIHFncmlkIOydmCDsmpTssq0g7ZiV7YOcICsgY29kZXhfY2xpX3JzLzAuMTQ3LjAg7Zek642U66GcIDIwMjYtMDktMzAg6rWs64+FIOqyveuhnCDrnbzsnbTruIwg7IOd7ISxIOyEseqztS5cbiAgICAvLyBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5vcGVuYWkuY29tL2FwaS9kb2NzL21vZGVscy9ncHQtNi4xLXNvbFxuICAgIFwiZ3B0LTYuMS1zb2xcIjoge1xuICAgICAgbWF4RWZmb3J0OiBcInVsdHJhXCIsXG4gICAgICBpbnB1dFRva2VuczogMixcbiAgICAgIG91dHB1dFRva2VuczogMTAsXG4gICAgICBjYWNoZWRJbnB1dFRva2VuczogMC4xLFxuICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiAyLjUsXG4gICAgICBsb25nQ29udGV4dDogTE9OR19DT05URVhUXzI3MkssXG4gICAgfSxcbiAgICAvLyBHUFQtNiBTb2wsIEx1bmEgKDIwMjYtMDktMjIg7Lac7IucKTogU3RhbmRhcmQgQVBJIHByaWNpbmcgdmVyaWZpZWQgMjAyNi0wOS0yMy4gR1BULTUuNiBTb2wvTHVuYSDsnZgg7KCI67CYIOuLqOqwgC5cbiAgICAvLyBDb2RleCDsubTtg4jroZzqt7goMjAyNi0wOS0yMynripQgU29sIOyXkCB1bHRyYSwgTHVuYSDsl5AgbWF4IOq5jOyngCDtl4jsmqntlZjqs6Ag6riw67O4IGVmZm9ydCDripQg65GYIOuLpCBtZWRpdW0g7J2064ukLlxuICAgIC8vIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLm9wZW5haS5jb20vYXBpL2RvY3MvbW9kZWxzL2dwdC02LXNvbFxuICAgIC8vIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLm9wZW5haS5jb20vYXBpL2RvY3MvbW9kZWxzL2dwdC02LWx1bmFcbiAgICBcImdwdC02LXNvbFwiOiB7XG4gICAgICBtYXhFZmZvcnQ6IFwidWx0cmFcIixcbiAgICAgIGlucHV0VG9rZW5zOiAyLFxuICAgICAgb3V0cHV0VG9rZW5zOiAxMCxcbiAgICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLjIsXG4gICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IDIuNSxcbiAgICAgIGxvbmdDb250ZXh0OiBMT05HX0NPTlRFWFRfMjcySyxcbiAgICB9LFxuICAgIFwiZ3B0LTYtbHVuYVwiOiB7XG4gICAgICBtYXhFZmZvcnQ6IFwibWF4XCIsXG4gICAgICBpbnB1dFRva2VuczogMC4xLFxuICAgICAgb3V0cHV0VG9rZW5zOiAwLjUsXG4gICAgICBjYWNoZWRJbnB1dFRva2VuczogMC4wMSxcbiAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogMC4xMjUsXG4gICAgICBsb25nQ29udGV4dDogTE9OR19DT05URVhUXzI3MkssXG4gICAgfSxcbiAgICAvLyBHUFQtNS42IFNvbCwgVGVycmEsIEx1bmEuIGNhY2hlIHdyaXRlIOuLqOqwgOuKlCDsmbjrtoAgbG9nZ2VyL21hbnVhbCB1c2FnZSDsnoXroKXsnYQg7JyE7ZW0XG4gICAgLy8g7Jyg7KeA7ZWc64ukLiDtmITsnqwgT3BlbkFJIOydkeuLtSB1c2FnZSDsl5AgY2FjaGUgd3JpdGUg7Yag7YGwIO2VhOuTnOqwgCDsl4bsnLzrqbQg67mE7Jqp7J2AIDDsnLzroZwg6rOE7IKw65Cc64ukLlxuICAgIC8vIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLm9wZW5haS5jb20vYXBpL2RvY3MvbW9kZWxzL2dwdC01LjYtc29sXG4gICAgLy8gQHNlZSBodHRwczovL2RldmVsb3BlcnMub3BlbmFpLmNvbS9hcGkvZG9jcy9tb2RlbHMvZ3B0LTUuNi10ZXJyYVxuICAgIC8vIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLm9wZW5haS5jb20vYXBpL2RvY3MvbW9kZWxzL2dwdC01LjYtbHVuYVxuICAgIC8vIFNvbCBwcm9tb3Rpb25hbCByYXRlcyBhcmUgYXZhaWxhYmxlIGF0IGxlYXN0IHRocm91Z2ggMjAyNi0xMS0yMS5cbiAgICAvLyBObyBjb25maXJtZWQgZW5kIGRhdGUvcmVwbGFjZW1lbnQgcmF0ZTogcmVjaGVjayBvZmZpY2lhbCBwcmljaW5nIGluc3RlYWQgb2YgYXV0by1yZXZlcnRpbmcuXG4gICAgXCJncHQtNS42LXNvbFwiOiB7XG4gICAgICBtYXhFZmZvcnQ6IFwidWx0cmFcIixcbiAgICAgIGlucHV0VG9rZW5zOiA0LFxuICAgICAgb3V0cHV0VG9rZW5zOiAyMCxcbiAgICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLjQsXG4gICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IDUsXG4gICAgICBsb25nQ29udGV4dDogTE9OR19DT05URVhUXzI3MkssXG4gICAgfSxcbiAgICBcImdwdC01LjYtdGVycmFcIjoge1xuICAgICAgbWF4RWZmb3J0OiBcInVsdHJhXCIsXG4gICAgICBpbnB1dFRva2VuczogMixcbiAgICAgIG91dHB1dFRva2VuczogMTIsXG4gICAgICBjYWNoZWRJbnB1dFRva2VuczogMC4yLFxuICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiAyLjUsXG4gICAgICBsb25nQ29udGV4dDogTE9OR19DT05URVhUXzI3MkssXG4gICAgfSxcbiAgICBcImdwdC01LjYtbHVuYVwiOiB7XG4gICAgICBtYXhFZmZvcnQ6IFwibWF4XCIsXG4gICAgICBpbnB1dFRva2VuczogMC4yLFxuICAgICAgb3V0cHV0VG9rZW5zOiAxLjIsXG4gICAgICBjYWNoZWRJbnB1dFRva2VuczogMC4wMixcbiAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogMC4yNSxcbiAgICAgIGxvbmdDb250ZXh0OiBMT05HX0NPTlRFWFRfMjcySyxcbiAgICB9LFxuICAgIC8vIGh0dHBzOi8vb3BlbmFpLmNvbS9pbmRleC9pbnRyb2R1Y2luZy1ncHQtNS01LyAoMjAyNi0wNCDstpzsi5wpXG4gICAgXCJncHQtNS41XCI6IHtcbiAgICAgIGlucHV0VG9rZW5zOiA1LFxuICAgICAgb3V0cHV0VG9rZW5zOiAzMCxcbiAgICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLjUsXG4gICAgICBsb25nQ29udGV4dDogTE9OR19DT05URVhUXzI3MkssXG4gICAgfSxcbiAgICAvLyDslYTrnpggZ3B0LTUuNCAvIGdwdC01LjQtbWluaSAvIGdwdC01LjMtY29kZXggLyBncHQtNS4yIOuKlCBxZ3JpZCDqsIAg7JOw64qUIENoYXRHUFQg6rWs64+FIENvZGV4IOqyveuhnOyXkOyEnFxuICAgIC8vIOuNlCDsnbTsg4Eg7KCc6rO165CY7KeAIOyViuuKlOuLpCg1LjQg6rOE7Je07J2AIDIwMjYtMDgtMzEgcmV0aXJlZCwg64yA7LK0IGdwdC01LjYtdGVycmEgLyBncHQtNS42LWx1bmEpLlxuICAgIC8vIOqzvOqxsCByZXF1ZXN0IGxvZyDsnqzsgrDsoJUoY29zdF9zb3VyY2Ug7JeG64qUIGxlZ2FjeSDtlokp7JeQIO2VhOyalO2VmOuvgOuhnCDri6jqsIAg7ZaJ7J2AIOycoOyngO2VnOuLpC5cbiAgICAvLyBodHRwczovL29wZW5haS5jb20vaW5kZXgvaW50cm9kdWNpbmctZ3B0LTUtNC8gKDIwMjYtMDMg7Lac7IucKVxuICAgIFwiZ3B0LTUuNFwiOiB7XG4gICAgICBpbnB1dFRva2VuczogMi41LFxuICAgICAgb3V0cHV0VG9rZW5zOiAxNSxcbiAgICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLjI1LFxuICAgICAgbG9uZ0NvbnRleHQ6IExPTkdfQ09OVEVYVF8yNzJLLFxuICAgIH0sXG4gICAgXCJncHQtNS40LW1pbmlcIjogeyBpbnB1dFRva2VuczogMC43NSwgb3V0cHV0VG9rZW5zOiA0LjUsIGNhY2hlZElucHV0VG9rZW5zOiAwLjA3NSB9LFxuICAgIC8vIGdwdC01LjLsmYAg64+Z7J28IOuLqOqwgCAoY2FjaGVkID0gaW5wdXTsnZggMTAlKVxuICAgIFwiZ3B0LTUuMy1jb2RleFwiOiB7IGlucHV0VG9rZW5zOiAxLjc1LCBvdXRwdXRUb2tlbnM6IDE0LCBjYWNoZWRJbnB1dFRva2VuczogMC4xNzUgfSxcbiAgICAvLyBodHRwczovL29wZW5haS5jb20vaW5kZXgvaW50cm9kdWNpbmctZ3B0LTUtMi8gKGNhY2hlZCBpbnB1dCA5MCUg7ZWg7J24IOuqheyLnClcbiAgICBcImdwdC01LjJcIjogeyBpbnB1dFRva2VuczogMS43NSwgb3V0cHV0VG9rZW5zOiAxNCwgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMTc1IH0sXG4gIH0pLFxuKTtcblxuLy8g4pSA4pSAIEFudGhyb3BpYyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZnVuY3Rpb24gYW50aHJvcGljQ29zdHMoXG4gIGlucHV0VG9rZW5zOiBudW1iZXIsXG4gIG91dHB1dFRva2VuczogbnVtYmVyLFxuICBvdmVycmlkZXM6IFBpY2s8UGFydGlhbDxNb2RlbENvc3RzPiwgXCJjYWNoZWRJbnB1dFRva2Vuc1wiIHwgXCJsb25nQ29udGV4dFwiPiA9IHt9LFxuKTogTW9kZWxDb3N0cyB7XG4gIGNvbnN0IGNvc3RzOiBNb2RlbENvc3RzID0ge1xuICAgIGlucHV0VG9rZW5zLFxuICAgIG91dHB1dFRva2VucyxcbiAgICAvLyDtkZzspIAgY2FjaGUgcmVhZCDripQgYmFzZSBpbnB1dCDsnZggMC4xeC4gRmFibGUgNS4xIOyymOufvCDqs7Xsi50g7Yq566GAIOuLqOqwgOqwgCDsnojsnLzrqbQgb3ZlcnJpZGUg7ZWc64ukLlxuICAgIGNhY2hlZElucHV0VG9rZW5zOiBvdmVycmlkZXMuY2FjaGVkSW5wdXRUb2tlbnMgPz8gaW5wdXRUb2tlbnMgLyAxMCxcbiAgICAvLyBDbGF1ZGUgQ29kZSBzdWJzY3JpcHRpb24gT0F1dGgg64qUIDFoIFRUTCDsnYQg7J6Q64+ZIOyEoO2Dne2VnOuLpC4g6rWs67KE7KCE7LKY65+8IOydkeuLteyXkFxuICAgIC8vIFRUTCBicmVha2Rvd24g7J20IOyXhuydhCDrlYzrp4wg7J20IDFoIOuLqOqwgOulvCBmYWxsYmFjayDsnLzroZwg7IKs7Jqp7ZWc64ukLlxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogaW5wdXRUb2tlbnMgKiAyLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtOiBpbnB1dFRva2VucyAqIDEuMjUsXG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWg6IGlucHV0VG9rZW5zICogMixcbiAgfTtcblxuICAvLyBIYWlrdSA1LjUg7LKY65+8IO2UhOuhrO2UhO2KuCDquLjsnbQg7Yuw7Ja06rCAIOyeiOuKlCDrqqjrjbjrp4wgbG9uZy1jb250ZXh0IOuwsOycqOydhCDqsIDsp4Tri6QuXG4gIGlmIChvdmVycmlkZXMubG9uZ0NvbnRleHQpIGNvc3RzLmxvbmdDb250ZXh0ID0gb3ZlcnJpZGVzLmxvbmdDb250ZXh0O1xuXG4gIHJldHVybiBjb3N0cztcbn1cblxuLy8g6rCA6rKpIOy2nOyymDogaHR0cHM6Ly9wbGF0Zm9ybS5jbGF1ZGUuY29tL2RvY3MvZW4vYWJvdXQtY2xhdWRlL3ByaWNpbmcgKDIwMjYtMTAtMDgg7ZmV7J24LiAyMDI2LTEwLTA3IOyXkCBTb25uZXQgNS41XG4vLyBjYWNoZSByZWFkIOqwgCAkMC4yMOKGkiQwLjEwKDAuMDV4KeycvOuhnCDsnbjtlZjrkJDqs6AsIOq3uCDsmbgg6riw7KG0IOuqqOuNuCDri6jqsIDripQg67OA64+ZIOyXhuydjClcbmNvbnN0IEFOVEhST1BJQ19DT1NUUyA9IG5ldyBNYXA8c3RyaW5nLCBNb2RlbENvc3RzPihcbiAgT2JqZWN0LmVudHJpZXMoe1xuICAgIC8vIEZhYmxlIDUuMSAoMjAyNi0wOS0wMSDstpzsi5wpOiBpbnB1dC9vdXRwdXQg7J2AIEZhYmxlIDUg7JmAIOqwmeqzoCBjYWNoZSByZWFkIOunjCAwLjAyNXgoJDAuMjUpIO2KueuhgC5cbiAgICAvLyBAc2VlIGh0dHBzOi8vcGxhdGZvcm0uY2xhdWRlLmNvbS9kb2NzL2VuL21vZGVscy9mYWJsZS01LTEvb3ZlcnZpZXdcbiAgICBcImNsYXVkZS1mYWJsZS01LTFcIjogYW50aHJvcGljQ29zdHMoMTAsIDUwLCB7IGNhY2hlZElucHV0VG9rZW5zOiAwLjI1IH0pLFxuICAgIFwiY2xhdWRlLWZhYmxlLTVcIjogYW50aHJvcGljQ29zdHMoMTAsIDUwKSxcbiAgICBzb25uZXQ6IGFudGhyb3BpY0Nvc3RzKDMsIDE1KSxcbiAgICBcImNsYXVkZS0zLTUtaGFpa3VcIjogYW50aHJvcGljQ29zdHMoMC44LCA0KSxcbiAgICBcImNsYXVkZS1oYWlrdS00LTVcIjogYW50aHJvcGljQ29zdHMoMSwgNSksXG4gICAgXCJjbGF1ZGUtMy01LXNvbm5ldFwiOiBhbnRocm9waWNDb3N0cygzLCAxNSksXG4gICAgXCJjbGF1ZGUtMy03LXNvbm5ldFwiOiBhbnRocm9waWNDb3N0cygzLCAxNSksXG4gICAgXCJjbGF1ZGUtc29ubmV0LTRcIjogYW50aHJvcGljQ29zdHMoMywgMTUpLFxuICAgIFwiY2xhdWRlLXNvbm5ldC00LTVcIjogYW50aHJvcGljQ29zdHMoMywgMTUpLFxuICAgIFwiY2xhdWRlLXNvbm5ldC00LTZcIjogYW50aHJvcGljQ29zdHMoMywgMTUpLFxuICAgIFwiY2xhdWRlLXNvbm5ldC00LTdcIjogYW50aHJvcGljQ29zdHMoMywgMTUpLFxuICAgIFwiY2xhdWRlLW9wdXMtNFwiOiBhbnRocm9waWNDb3N0cygxNSwgNzUpLFxuICAgIFwiY2xhdWRlLW9wdXMtNC0xXCI6IGFudGhyb3BpY0Nvc3RzKDE1LCA3NSksXG4gICAgXCJjbGF1ZGUtb3B1cy00LTVcIjogYW50aHJvcGljQ29zdHMoNSwgMjUpLFxuICAgIFwiY2xhdWRlLW9wdXMtNC02XCI6IGFudGhyb3BpY0Nvc3RzKDUsIDI1KSxcbiAgICBcImNsYXVkZS1vcHVzLTQtN1wiOiBhbnRocm9waWNDb3N0cyg1LCAyNSksXG4gICAgXCJjbGF1ZGUtb3B1cy00LThcIjogYW50aHJvcGljQ29zdHMoNSwgMjUpLFxuICAgIFwiY2xhdWRlLW9wdXMtNVwiOiBhbnRocm9waWNDb3N0cyg1LCAyNSksXG4gICAgLy8gT3B1cyA1LjUgKDIwMjYtMDktMjIg7Lac7IucKTogJDQvJDIwLiBjYWNoZSByZWFkIOuKlCAwLjA1eCgkMC4yMCkg7Yq566GALCBjYWNoZSB3cml0ZSDripQg7ZGc7KSAIOuwsOycqCgkNS8kOCkuXG4gICAgLy8gQHNlZSBodHRwczovL3BsYXRmb3JtLmNsYXVkZS5jb20vZG9jcy9lbi9tb2RlbHMvb3B1cy01LTUvb3ZlcnZpZXdcbiAgICBcImNsYXVkZS1vcHVzLTUtNVwiOiBhbnRocm9waWNDb3N0cyg0LCAyMCwgeyBjYWNoZWRJbnB1dFRva2VuczogMC4yIH0pLFxuICAgIC8vIFNvbm5ldCA1IOydmCBpbnRyb2R1Y3RvcnkgJDIvJDEwIOydtCDsoJXsi50g64uo6rCA66GcIO2ZleygleuQkOuLpC4gMjAyNi0wOS0wMSDsl5Ag7JiI7KCV65CQ642YICQzLyQxNSDsnbjsg4HsnYBcbiAgICAvLyDst6jshozrkJDsnLzrr4DroZwg64Kg7KecIOu2hOq4sCDsl4bsnbQg6rOg7KCVIOuLqOqwgOuhnCDqs4TsgrDtlZzri6QuXG4gICAgXCJjbGF1ZGUtc29ubmV0LTVcIjogYW50aHJvcGljQ29zdHMoMiwgMTApLFxuICAgIC8vIFNvbm5ldCA1LjUgKDIwMjYtMDktMjgg7Lac7IucKTogU29ubmV0IDUg7JmAIOqwmeydgCAkMi8kMTAuIGNhY2hlIHJlYWQg64qUIOy2nOyLnCDsi5wg7ZGc7KSAIDAuMXgoJDAuMjAp7JiA64uk6rCAXG4gICAgLy8gMjAyNi0xMC0wNyBIYWlrdSA1LjUg7Lac7Iuc7JmAIO2VqOq7mCBPcHVzIDUuNSDsmYAg6rCZ7J2AIDAuMDV4KCQwLjEwKeuhnCDsnbjtlZjrkJDri6QoQVBJIOumtOumrOyKpCDrhbjtirgpLiDruYTsmqnsnYAg7JqU7LKtIOyLnOygkFxuICAgIC8vIOuLqOqwgOuhnCDquLDroZ3rkJjrr4DroZwg64Kg7KecIOu2hOq4sCDsl4bsnbQg7ZiE7ZaJIOuLqOqwgOunjCDrkZTri6QuIGNhY2hlIHdyaXRlIOuKlCDtkZzspIAg67Cw7JyoKCQyLjUwLyQ0KS5cbiAgICAvLyBAc2VlIGh0dHBzOi8vcGxhdGZvcm0uY2xhdWRlLmNvbS9kb2NzL2VuL3JlbGVhc2Utbm90ZXMvb3ZlcnZpZXcgKDIwMjYtMTAtMDcpXG4gICAgXCJjbGF1ZGUtc29ubmV0LTUtNVwiOiBhbnRocm9waWNDb3N0cygyLCAxMCwgeyBjYWNoZWRJbnB1dFRva2VuczogMC4xIH0pLFxuICAgIC8vIEhhaWt1IDUuNSAoMjAyNi0xMC0wNyDstpzsi5wpOiDtlITroaztlITtirgg6ri47J20IO2LsOyWtCDri6jqsIAuIDEwMEsg7J207ZWYICQwLjEwLyQwLjUwLCBjYWNoZSByZWFkIDAuMXgoJDAuMDEpLFxuICAgIC8vIGNhY2hlIHdyaXRlIDVtICQwLjEyNSAvIDFoICQwLjIwLiDsnoXroKXsnbQgMTAwSyDrpbwg64SY7Jy866m0IGlucHV0L2NhY2hlIHJlYWQvY2FjaGUgd3JpdGUvb3V0cHV0IOuqqOuRkCA1eFxuICAgIC8vICgkMC41MC8kMC4wNS8kMC42MjXCtyQxLyQyLjUwKeqwgCDsmpTssq0g7KCE7LK07JeQIOyggeyaqeuQnOuLpC4gMU0g7Luo7YWN7Iqk7Yq4IOuqqOuNuCDspJEg7Jyg7J287ZWY6rKMIOq4uOydtOuzhCDri6jqsIDrpbwg7JO064ukLlxuICAgIC8vIEBzZWUgaHR0cHM6Ly9wbGF0Zm9ybS5jbGF1ZGUuY29tL2RvY3MvZW4vbW9kZWxzL2hhaWt1LTUtNS9vdmVydmlld1xuICAgIFwiY2xhdWRlLWhhaWt1LTUtNVwiOiBhbnRocm9waWNDb3N0cygwLjEsIDAuNSwge1xuICAgICAgbG9uZ0NvbnRleHQ6IHtcbiAgICAgICAgdGhyZXNob2xkOiAxMDBfMDAwLFxuICAgICAgICBpbnB1dE11bHRpcGxpZXI6IDUsXG4gICAgICAgIGNhY2hlZElucHV0TXVsdGlwbGllcjogNSxcbiAgICAgICAgb3V0cHV0TXVsdGlwbGllcjogNSxcbiAgICAgIH0sXG4gICAgfSksXG4gIH0pLFxuKTtcblxuLy8gZ3B0LTUuMy1jb2RleC1zcGFyayDripQgcmVzZWFyY2ggcHJldmlldyDroZwg6rO17IudIHRva2VuIOuLqOqwgOqwgCDslYTsp4EgZmluYWwg7J20IOyVhOuLiOuLpC5cbi8vIOyngOybkCDtg4DsnoXsnYAg7Jyg7KeA7ZWY65CYLCDqs7Xsi50g64uo6rCA6rCAIOqzteqwnOuQoCDrlYzquYzsp4Ag7JWE656YIGdlbmVyaWMgZXN0aW1hdGUg66GcIOqzhOyCsO2VnOuLpC5cbi8vIEBzZWUgaHR0cHM6Ly9oZWxwLm9wZW5haS5jb20vZW4vYXJ0aWNsZXMvMjAwMDExMDYtY29kZXgtcmF0ZS1jYXJkXG5jb25zdCBERUZBVUxUX0NPU1RTOiBNb2RlbENvc3RzID0geyBpbnB1dFRva2VuczogMywgb3V0cHV0VG9rZW5zOiAxNSwgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMyB9O1xuXG4vLyAtLSBHcm9rICh4QUkpIC0tXG4vL1xuLy8gRmFsbGJhY2sgb25seS4gR3JvayBjaGF0LCBpbWFnZSBhbmQgdmlkZW8gcmVzcG9uc2VzIHJlcG9ydCBgdXNhZ2UuY29zdF9pbl91c2RfdGlja3NgLCB3aGljaCBpc1xuLy8gYXV0aG9yaXRhdGl2ZSAoY29zdFNvdXJjZSBcInByb3ZpZGVyXCIpOyB0aGVzZSByb3dzIHByaWNlIGEgcmVzcG9uc2UgdGhhdCBvbWl0dGVkIGl0LlxuLy8gU291cmNlOiBhcGkueC5haS92MS9sYW5ndWFnZS1tb2RlbHMgYW5kIC9pbWFnZS1nZW5lcmF0aW9uLW1vZGVscyByZWFkIHdpdGggdGhlIHN1YnNjcmlwdGlvbiBKV1Rcbi8vIGluIHRoZSAyMDI2LTEwLTE2IGxpdmUgcHJvYmUuIE9uZSB0aWNrIGlzIDFlLTEwIFVTRCAoZ3Jvay00LjcgbGlzdHMgMjAwMDAvNTAwMC82MDAwMCB0aWNrcyBwZXJcbi8vIGlucHV0L2NhY2hlZC9vdXRwdXQgdG9rZW4gYWdhaW5zdCB0aGUgcHVibGljICQyLyQwLjUwLyQ2IHBlciBtaWxsaW9uKS5cbmNvbnN0IEdST0tfVElDS1NfUEVSX1VTRCA9IE1hdGgucm91bmQoMSAvIEdST0tfVVNEX1BFUl9USUNLKTtcblxuLyoqIFVTRCBmb3IgYSBwcm92aWRlci1yZXBvcnRlZCBgY29zdF9pbl91c2RfdGlja3NgIGFtb3VudC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2RGcm9tR3Jva1RpY2tzKHRpY2tzOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gdGlja3MgLyBHUk9LX1RJQ0tTX1BFUl9VU0Q7XG59XG5cbmZ1bmN0aW9uIGdyb2tUb2tlbkNvc3RzKGlucHV0OiBudW1iZXIsIGNhY2hlZDogbnVtYmVyLCBvdXRwdXQ6IG51bWJlcik6IE1vZGVsQ29zdHMge1xuICAvLyB0aWNrcyBwZXIgdG9rZW4gLT4gVVNEIHBlciAxTSB0b2tlbnMuXG4gIGNvbnN0IHBlck1pbGxpb24gPSAodGlja3M6IG51bWJlcikgPT4gKHRpY2tzICogMV8wMDBfMDAwKSAvIEdST0tfVElDS1NfUEVSX1VTRDtcblxuICByZXR1cm4ge1xuICAgIGlucHV0VG9rZW5zOiBwZXJNaWxsaW9uKGlucHV0KSxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogcGVyTWlsbGlvbihjYWNoZWQpLFxuICAgIG91dHB1dFRva2VuczogcGVyTWlsbGlvbihvdXRwdXQpLFxuICB9O1xufVxuXG5jb25zdCBHUk9LX0NPU1RTID0gbmV3IE1hcDxzdHJpbmcsIE1vZGVsQ29zdHM+KFxuICBPYmplY3QuZW50cmllcyh7XG4gICAgXCJncm9rLTQuN1wiOiBncm9rVG9rZW5Db3N0cygyMF8wMDAsIDVfMDAwLCA2MF8wMDApLFxuICAgIFwiZ3Jvay00LjZcIjogZ3Jva1Rva2VuQ29zdHMoMjBfMDAwLCA1XzAwMCwgNjBfMDAwKSxcbiAgICBcImdyb2stNC41XCI6IGdyb2tUb2tlbkNvc3RzKDIwXzAwMCwgNV8wMDAsIDYwXzAwMCksXG4gIH0pLFxuKTtcblxuLy8gVGlja3MgcGVyIGdlbmVyYXRlZCBpbWFnZSBhdCB0aGUgZGVmYXVsdCAxayByZXNvbHV0aW9uICh0aGUgcHJvYmUncyBxdWFsaXR5IDFrIGltYWdlIGNvc3QgZXhhY3RseVxuLy8gdGhpcyBhbW91bnQpLiBVbmxpc3RlZCBpbWFnZSBtb2RlbHMgaGF2ZSBubyBlc3RpbWF0ZS5cbmNvbnN0IEdST0tfSU1BR0VfUFJJQ0VfVElDS1MgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPihcbiAgT2JqZWN0LmVudHJpZXMoe1xuICAgIFwiZ3Jvay1pbWFnaW5lLWltYWdlLXF1YWxpdHlcIjogNTAwXzAwMF8wMDAsXG4gIH0pLFxuKTtcblxuZXhwb3J0IGludGVyZmFjZSBHcm9rTWVkaWFDb3N0IHtcbiAgY29zdFVzZDogbnVtYmVyO1xuICBjb3N0U291cmNlOiBcInByb3ZpZGVyXCIgfCBcInByaWNpbmdfdGFibGVcIjtcbiAgLyoqIFRpY2tzIHJlcG9ydGVkIGJ5IHhBSSwgb3IgdGhlIGNhdGFsb2ctcHJpY2UgZXN0aW1hdGUgaW4gdGlja3MuICovXG4gIHRpY2tzOiBudW1iZXI7XG59XG5cbi8qKlxuICogSW1hZ2UgY29zdDogdGhlIHJlcG9ydGVkIHRpY2tzIHdoZW4gcHJlc2VudCwgb3RoZXJ3aXNlIHRoZSBwZXItaW1hZ2UgY2F0YWxvZyBwcmljZSB0aW1lcyB0aGVcbiAqIGltYWdlIGNvdW50LiBVbmRlZmluZWQgd2hlbiBuZWl0aGVyIGlzIGtub3duLCBzbyBjYWxsZXJzIHN0b3JlIGFuIHVua25vd24gY29zdCwgbm90IGEgZ3Vlc3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBncm9rSW1hZ2VDb3N0KFxuICBtb2RlbDogc3RyaW5nLFxuICBpbWFnZUNvdW50OiBudW1iZXIsXG4gIHJlcG9ydGVkVGlja3M/OiBudW1iZXIsXG4pOiBHcm9rTWVkaWFDb3N0IHwgdW5kZWZpbmVkIHtcbiAgaWYgKHJlcG9ydGVkVGlja3MgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGdyb2tSZXBvcnRlZENvc3QocmVwb3J0ZWRUaWNrcyk7XG4gIGNvbnN0IHBlckltYWdlID0gR1JPS19JTUFHRV9QUklDRV9USUNLUy5nZXQobW9kZWwuc3BsaXQoXCIvXCIpLnBvcCgpID8/IG1vZGVsKTtcblxuICBpZiAocGVySW1hZ2UgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgdGlja3MgPSBwZXJJbWFnZSAqIGltYWdlQ291bnQ7XG5cbiAgcmV0dXJuIHsgY29zdFVzZDogdXNkRnJvbUdyb2tUaWNrcyh0aWNrcyksIGNvc3RTb3VyY2U6IFwicHJpY2luZ190YWJsZVwiLCB0aWNrcyB9O1xufVxuXG4vKiogVmlkZW8vdm9pY2UgY29zdDogb25seSBhIHByb3ZpZGVyLXJlcG9ydGVkIGFtb3VudDsgdGhlcmUgaXMgbm8gY2F0YWxvZyBlc3RpbWF0ZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBncm9rUmVwb3J0ZWRDb3N0KHJlcG9ydGVkVGlja3M6IG51bWJlciB8IHVuZGVmaW5lZCk6IEdyb2tNZWRpYUNvc3QgfCB1bmRlZmluZWQge1xuICByZXR1cm4gcmVwb3J0ZWRUaWNrcyA9PT0gdW5kZWZpbmVkXG4gICAgPyB1bmRlZmluZWRcbiAgICA6IHsgY29zdFVzZDogdXNkRnJvbUdyb2tUaWNrcyhyZXBvcnRlZFRpY2tzKSwgY29zdFNvdXJjZTogXCJwcm92aWRlclwiLCB0aWNrczogcmVwb3J0ZWRUaWNrcyB9O1xufVxuXG4vKiogQ29kZXgg67Cx7JeU65Oc6rCAIOydtCDrqqjrjbjsl5Ag7ZeI7Jqp7ZWY64qUIOy1nOuMgCBlZmZvcnQuIOy5tO2DiOuhnOq3uOyXkCDsl4bripQg66qo64247J2AIHhoaWdoIOq5jOyngOuLpC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcGVuYWlNb2RlbE1heEVmZm9ydChtb2RlbDogc3RyaW5nKTogT3BlbkFJRWZmb3J0IHtcbiAgcmV0dXJuIE9QRU5BSV9DT1NUUy5nZXQobW9kZWwpPy5tYXhFZmZvcnQgPz8gXCJ4aGlnaFwiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9kZWxDb3N0cyhtb2RlbDogc3RyaW5nKTogTW9kZWxDb3N0cyB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRNb2RlbCA9IChtb2RlbC5zcGxpdChcIi9cIikucG9wKCkgPz8gbW9kZWwpLnJlcGxhY2UoL1xcWzFtXFxdJC9pLCBcIlwiKTtcblxuICByZXR1cm4gKFxuICAgIE9QRU5BSV9DT1NUUy5nZXQobm9ybWFsaXplZE1vZGVsKSA/P1xuICAgIEFOVEhST1BJQ19DT1NUUy5nZXQobm9ybWFsaXplZE1vZGVsKSA/P1xuICAgIEdST0tfQ09TVFMuZ2V0KG5vcm1hbGl6ZWRNb2RlbCkgPz9cbiAgICBERUZBVUxUX0NPU1RTXG4gICk7XG59XG5cbi8vIFZlcmlmaWVkIEZhc3QgQVBJIHJhdGVzIGZvciB0aGUgY3VycmVudGx5IHNlcnZlZCBDb2RleCBtb2RlbHMgKDIwMjYtMTAtMTYpLlxuLy8gQXBwbGllcyB0byBhbGwgdG9rZW4gY2F0ZWdvcmllcyBhbmQgbG9uZyBjb250ZXh0OyBub3QgdGhlIDIuNXggc3Vic2NyaXB0aW9uIHF1b3RhIG11bHRpcGxpZXIuXG4vLyBodHRwczovL2RldmVsb3BlcnMub3BlbmFpLmNvbS9hcGkvZG9jcy9wcmljaW5nXG5jb25zdCBPUEVOQUlfRkFTVF9NVUxUSVBMSUVSUyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KFxuICBPYmplY3QuZW50cmllcyh7XG4gICAgXCJncHQtNi1hc3RyYVwiOiAyLFxuICAgIFwiZ3B0LTYuMS1zb2xcIjogMixcbiAgICBcImdwdC02LXNvbFwiOiAyLFxuICAgIFwiZ3B0LTYtbHVuYVwiOiAyLFxuICAgIFwiZ3B0LTUuNi1zb2xcIjogMixcbiAgICBcImdwdC01LjYtdGVycmFcIjogMixcbiAgICBcImdwdC01LjYtbHVuYVwiOiAyLFxuICB9KSxcbik7XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVDb3N0VXNkKFxuICBtb2RlbDogc3RyaW5nLFxuICB1c2FnZToge1xuICAgIGlucHV0VG9rZW5zOiBudW1iZXI7XG4gICAgb3V0cHV0VG9rZW5zOiBudW1iZXI7XG4gICAgY2FjaGVkSW5wdXRUb2tlbnM/OiBudW1iZXI7XG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zPzogbnVtYmVyO1xuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtPzogbnVtYmVyO1xuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoPzogbnVtYmVyO1xuICB9LFxuICBzZXJ2aWNlVGllcj86IHN0cmluZyxcbik6IG51bWJlciB7XG4gIGNvbnN0IGNvc3RzID0gZ2V0TW9kZWxDb3N0cyhtb2RlbCk7XG4gIGNvbnN0IGNhY2hlZElucHV0ID0gdXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMgPz8gMDtcbiAgY29uc3QgY2FjaGVDcmVhdGlvbklucHV0NW0gPSBNYXRoLm1heCh1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bSA/PyAwLCAwKTtcbiAgY29uc3QgY2FjaGVDcmVhdGlvbklucHV0MWggPSBNYXRoLm1heCh1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaCA/PyAwLCAwKTtcblxuICBjb25zdCBjYWNoZUNyZWF0aW9uSW5wdXQgPSBNYXRoLm1heChcbiAgICB1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMgPz8gMCxcbiAgICBjYWNoZUNyZWF0aW9uSW5wdXQ1bSArIGNhY2hlQ3JlYXRpb25JbnB1dDFoLFxuICApO1xuXG4gIGNvbnN0IGNsYXNzaWZpZWRDYWNoZUNyZWF0aW9uSW5wdXQ1bSA9IE1hdGgubWluKGNhY2hlQ3JlYXRpb25JbnB1dDVtLCBjYWNoZUNyZWF0aW9uSW5wdXQpO1xuXG4gIGNvbnN0IGNsYXNzaWZpZWRDYWNoZUNyZWF0aW9uSW5wdXQxaCA9IE1hdGgubWluKFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dDFoLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dCAtIGNsYXNzaWZpZWRDYWNoZUNyZWF0aW9uSW5wdXQ1bSxcbiAgKTtcblxuICBjb25zdCB1bmNsYXNzaWZpZWRDYWNoZUNyZWF0aW9uSW5wdXQgPVxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dCAtIGNsYXNzaWZpZWRDYWNoZUNyZWF0aW9uSW5wdXQ1bSAtIGNsYXNzaWZpZWRDYWNoZUNyZWF0aW9uSW5wdXQxaDtcblxuICBjb25zdCBub25DYWNoZWRJbnB1dCA9IE1hdGgubWF4KHVzYWdlLmlucHV0VG9rZW5zIC0gY2FjaGVkSW5wdXQgLSBjYWNoZUNyZWF0aW9uSW5wdXQsIDApO1xuXG4gIC8vIGxvbmctY29udGV4dCDtlaDspp06IOyghOyytCDsnoXroKUoaW5wdXRfdG9rZW5zLCBjYWNoZSDtj6ztlagp7J20IHRocmVzaG9sZCDstIjqs7wg7IucIOyalOyyrSDsoITssrTsl5Ag67Cw7JyoIOyggeyaqVxuICBjb25zdCBsYyA9IGNvc3RzLmxvbmdDb250ZXh0O1xuICBjb25zdCBpc0xvbmdDb250ZXh0ID0gbGMgIT09IHVuZGVmaW5lZCAmJiB1c2FnZS5pbnB1dFRva2VucyA+IGxjLnRocmVzaG9sZDtcbiAgY29uc3QgaW5wdXRSYXRlID0gY29zdHMuaW5wdXRUb2tlbnMgKiAoaXNMb25nQ29udGV4dCA/IGxjLmlucHV0TXVsdGlwbGllciA6IDEpO1xuICBjb25zdCBjYWNoZWRSYXRlID0gY29zdHMuY2FjaGVkSW5wdXRUb2tlbnMgKiAoaXNMb25nQ29udGV4dCA/IGxjLmNhY2hlZElucHV0TXVsdGlwbGllciA6IDEpO1xuXG4gIGNvbnN0IGNhY2hlQ3JlYXRpb25GYWxsYmFja1JhdGUgPVxuICAgIChjb3N0cy5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMgPz8gY29zdHMuaW5wdXRUb2tlbnMpICpcbiAgICAoaXNMb25nQ29udGV4dCA/IGxjLmlucHV0TXVsdGlwbGllciA6IDEpO1xuXG4gIGNvbnN0IGNhY2hlQ3JlYXRpb241bVJhdGUgPVxuICAgIChjb3N0cy5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bSA/PyBjb3N0cy5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMgPz8gY29zdHMuaW5wdXRUb2tlbnMpICpcbiAgICAoaXNMb25nQ29udGV4dCA/IGxjLmlucHV0TXVsdGlwbGllciA6IDEpO1xuXG4gIGNvbnN0IGNhY2hlQ3JlYXRpb24xaFJhdGUgPVxuICAgIChjb3N0cy5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaCA/PyBjb3N0cy5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMgPz8gY29zdHMuaW5wdXRUb2tlbnMpICpcbiAgICAoaXNMb25nQ29udGV4dCA/IGxjLmlucHV0TXVsdGlwbGllciA6IDEpO1xuXG4gIGNvbnN0IG91dHB1dFJhdGUgPSBjb3N0cy5vdXRwdXRUb2tlbnMgKiAoaXNMb25nQ29udGV4dCA/IGxjLm91dHB1dE11bHRpcGxpZXIgOiAxKTtcblxuICBjb25zdCBzdGFuZGFyZENvc3QgPVxuICAgIChub25DYWNoZWRJbnB1dCAvIDFfMDAwXzAwMCkgKiBpbnB1dFJhdGUgK1xuICAgICh1c2FnZS5vdXRwdXRUb2tlbnMgLyAxXzAwMF8wMDApICogb3V0cHV0UmF0ZSArXG4gICAgKGNhY2hlZElucHV0IC8gMV8wMDBfMDAwKSAqIGNhY2hlZFJhdGUgK1xuICAgICh1bmNsYXNzaWZpZWRDYWNoZUNyZWF0aW9uSW5wdXQgLyAxXzAwMF8wMDApICogY2FjaGVDcmVhdGlvbkZhbGxiYWNrUmF0ZSArXG4gICAgKGNsYXNzaWZpZWRDYWNoZUNyZWF0aW9uSW5wdXQ1bSAvIDFfMDAwXzAwMCkgKiBjYWNoZUNyZWF0aW9uNW1SYXRlICtcbiAgICAoY2xhc3NpZmllZENhY2hlQ3JlYXRpb25JbnB1dDFoIC8gMV8wMDBfMDAwKSAqIGNhY2hlQ3JlYXRpb24xaFJhdGU7XG5cbiAgY29uc3Qgbm9ybWFsaXplZE1vZGVsID0gbW9kZWwuc3BsaXQoXCIvXCIpLnBvcCgpID8/IG1vZGVsO1xuXG4gIHJldHVybiAoXG4gICAgc3RhbmRhcmRDb3N0ICpcbiAgICAoc2VydmljZVRpZXIgPT09IFwiZmFzdFwiID8gKE9QRU5BSV9GQVNUX01VTFRJUExJRVJTLmdldChub3JtYWxpemVkTW9kZWwpID8/IDEpIDogMSlcbiAgKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQTJDQSxNQUFNLG9CQUE0RDtDQUNoRSxXQUFXO0NBQ1gsaUJBQWlCO0NBQ2pCLHVCQUF1QjtDQUN2QixrQkFBa0I7QUFDcEI7QUFPQSxNQUFNLGVBQWUsSUFBSSxJQUN2QixPQUFPLFFBQVE7Q0FLYixlQUFlO0VBQ2IsV0FBVztFQUNYLGFBQWE7RUFDYixjQUFjO0VBQ2QsbUJBQW1CO0VBQ25CLDBCQUEwQjtFQUMxQixhQUFhO0NBQ2Y7Q0FLQSxlQUFlO0VBQ2Is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
|
|
@@ -1 +1,29 @@
|
|
|
1
|
-
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
//#region src/utils/providers/common/provider-types.ts
|
|
3
|
+
const PROVIDER_IDS = [
|
|
4
|
+
"openai",
|
|
5
|
+
"anthropic",
|
|
6
|
+
"grok"
|
|
7
|
+
];
|
|
8
|
+
function isProviderId(value) {
|
|
9
|
+
return PROVIDER_IDS.some((id) => id === value);
|
|
10
|
+
}
|
|
11
|
+
/** Decodes parsed JSON text (for example `JSON.parse` output) into `JsonValue`. */
|
|
12
|
+
const jsonValueSchema = z.json();
|
|
13
|
+
const anyJsonObject = z.looseObject({});
|
|
14
|
+
/** Narrows an already-decoded JSON value to its object member. */
|
|
15
|
+
function isJsonObject(value) {
|
|
16
|
+
return anyJsonObject.safeParse(value).success;
|
|
17
|
+
}
|
|
18
|
+
/** The string member of a decoded JSON value, or undefined for any other member. */
|
|
19
|
+
function jsonString(value) {
|
|
20
|
+
return z.string().safeParse(value).data;
|
|
21
|
+
}
|
|
22
|
+
/** The number member of a decoded JSON value, or undefined for any other member. */
|
|
23
|
+
function jsonNumber(value) {
|
|
24
|
+
return z.number().safeParse(value).data;
|
|
25
|
+
}
|
|
26
|
+
//#endregion
|
|
27
|
+
export { PROVIDER_IDS, isJsonObject, isProviderId, jsonNumber, jsonString, jsonValueSchema };
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXItdHlwZXMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vcHJvdmlkZXItdHlwZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuLy8gcWdyaWQgcHJvdmlkZXIgcm91dGUgcHJlZml4IChgPHByb3ZpZGVyPi88bW9kZWw+YCkuIOyDiCBwcm92aWRlciDripQg7Jes6riw7JeQ66eMIOy2lOqwgO2VnOuLpC5cbmV4cG9ydCBjb25zdCBQUk9WSURFUl9JRFMgPSBbXCJvcGVuYWlcIiwgXCJhbnRocm9waWNcIiwgXCJncm9rXCJdIGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBQcm92aWRlcklkID0gKHR5cGVvZiBQUk9WSURFUl9JRFMpW251bWJlcl07XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Byb3ZpZGVySWQodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZhbHVlIGlzIFByb3ZpZGVySWQge1xuICByZXR1cm4gUFJPVklERVJfSURTLnNvbWUoKGlkKSA9PiBpZCA9PT0gdmFsdWUpO1xufVxuXG5leHBvcnQgdHlwZSBKc29uVmFsdWUgPSBudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuIHwgSnNvblZhbHVlW10gfCBKc29uT2JqZWN0IHwgbnVsbDtcblxuZXhwb3J0IGludGVyZmFjZSBKc29uT2JqZWN0IHtcbiAgW2tleTogc3RyaW5nXTogSnNvblZhbHVlIHwgdW5kZWZpbmVkO1xufVxuXG4vKiogSnNvblZhbHVlIGFjY2VwdGVkIHJlYWQtb25seSwgZm9yIGNhbGxlcnMgdGhhdCBwYXNzIGBhcyBjb25zdGAgb3IgZnJvemVuIEpTT04uICovXG5leHBvcnQgdHlwZSBSZWFkb25seUpzb25WYWx1ZSA9XG4gIHwgbnVtYmVyXG4gIHwgc3RyaW5nXG4gIHwgYm9vbGVhblxuICB8IHJlYWRvbmx5IFJlYWRvbmx5SnNvblZhbHVlW11cbiAgfCBSZWFkb25seUpzb25PYmplY3RcbiAgfCBudWxsO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRvbmx5SnNvbk9iamVjdCB7XG4gIHJlYWRvbmx5IFtrZXk6IHN0cmluZ106IFJlYWRvbmx5SnNvblZhbHVlIHwgdW5kZWZpbmVkO1xufVxuXG4vKiogRGVjb2RlcyBwYXJzZWQgSlNPTiB0ZXh0IChmb3IgZXhhbXBsZSBgSlNPTi5wYXJzZWAgb3V0cHV0KSBpbnRvIGBKc29uVmFsdWVgLiAqL1xuZXhwb3J0IGNvbnN0IGpzb25WYWx1ZVNjaGVtYTogei5ab2RUeXBlPEpzb25WYWx1ZT4gPSB6Lmpzb24oKTtcblxuLy8gU2hhbGxvdzogYWNjZXB0cyBhbnkgbm9uLW51bGwsIG5vbi1hcnJheSBvYmplY3QsIGluY2x1ZGluZyBudWxsLXByb3RvdHlwZSBvYmplY3RzLlxuY29uc3QgYW55SnNvbk9iamVjdCA9IHoubG9vc2VPYmplY3Qoe30pO1xuXG4vKiogTmFycm93cyBhbiBhbHJlYWR5LWRlY29kZWQgSlNPTiB2YWx1ZSB0byBpdHMgb2JqZWN0IG1lbWJlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0pzb25PYmplY3QodmFsdWU6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCk6IHZhbHVlIGlzIEpzb25PYmplY3Qge1xuICByZXR1cm4gYW55SnNvbk9iamVjdC5zYWZlUGFyc2UodmFsdWUpLnN1Y2Nlc3M7XG59XG5cbi8qKiBUaGUgc3RyaW5nIG1lbWJlciBvZiBhIGRlY29kZWQgSlNPTiB2YWx1ZSwgb3IgdW5kZWZpbmVkIGZvciBhbnkgb3RoZXIgbWVtYmVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpzb25TdHJpbmcodmFsdWU6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB6LnN0cmluZygpLnNhZmVQYXJzZSh2YWx1ZSkuZGF0YTtcbn1cblxuLyoqIFRoZSBudW1iZXIgbWVtYmVyIG9mIGEgZGVjb2RlZCBKU09OIHZhbHVlLCBvciB1bmRlZmluZWQgZm9yIGFueSBvdGhlciBtZW1iZXIuICovXG5leHBvcnQgZnVuY3Rpb24ganNvbk51bWJlcih2YWx1ZTogSnNvblZhbHVlIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHoubnVtYmVyKCkuc2FmZVBhcnNlKHZhbHVlKS5kYXRhO1xufVxuXG5leHBvcnQgdHlwZSBVc2VySW5wdXQgPVxuICB8IHsgdHlwZTogXCJ0ZXh0XCI7IHRleHQ6IHN0cmluZzsgdGV4dF9lbGVtZW50czogVGV4dEVsZW1lbnRbXSB9XG4gIHwgeyB0eXBlOiBcImltYWdlXCI7IHVybDogc3RyaW5nIH1cbiAgfCB7IHR5cGU6IFwibG9jYWxJbWFnZVwiOyBwYXRoOiBzdHJpbmcgfVxuICB8IHsgdHlwZTogXCJza2lsbFwiOyBuYW1lOiBzdHJpbmc7IHBhdGg6IHN0cmluZyB9XG4gIHwgeyB0eXBlOiBcIm1lbnRpb25cIjsgbmFtZTogc3RyaW5nOyBwYXRoOiBzdHJpbmcgfTtcblxuZXhwb3J0IHR5cGUgVGV4dEVsZW1lbnQgPSB7XG4gIGJ5dGVSYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9O1xuICBwbGFjZWhvbGRlcjogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmV4cG9ydCB0eXBlIFRva2VuVXNhZ2VCcmVha2Rvd24gPSB7XG4gIHRvdGFsVG9rZW5zOiBudW1iZXI7XG4gIGlucHV0VG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlZElucHV0VG9rZW5zOiBudW1iZXI7XG4gIG91dHB1dFRva2VuczogbnVtYmVyO1xuICByZWFzb25pbmdPdXRwdXRUb2tlbnM6IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFF1b3RhUmF0ZUxpbWl0V2luZG93ID0ge1xuICB1c2VkUGVyY2VudDogbnVtYmVyO1xuICB3aW5kb3dEdXJhdGlvbk1pbnM6IG51bWJlciB8IG51bGw7XG4gIHJlc2V0c0F0OiBudW1iZXIgfCBudWxsO1xufTtcblxuZXhwb3J0IHR5cGUgUXVvdGFSYXRlTGltaXRTbmFwc2hvdCA9IHtcbiAgbGltaXRJZDogc3RyaW5nIHwgbnVsbDtcbiAgbGltaXROYW1lOiBzdHJpbmcgfCBudWxsO1xuICBwcmltYXJ5OiBRdW90YVJhdGVMaW1pdFdpbmRvdyB8IG51bGw7XG4gIHNlY29uZGFyeTogUXVvdGFSYXRlTGltaXRXaW5kb3cgfCBudWxsO1xuICBjcmVkaXRzOiBKc29uVmFsdWU7XG4gIHBsYW5UeXBlOiBzdHJpbmcgfCBudWxsO1xuICByYXRlTGltaXRSZWFjaGVkVHlwZTogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmV4cG9ydCB0eXBlIFF1b3RhUmF0ZUxpbWl0cyA9IHtcbiAgcmF0ZUxpbWl0czogUXVvdGFSYXRlTGltaXRTbmFwc2hvdDtcbiAgcmF0ZUxpbWl0c0J5TGltaXRJZDogeyBba2V5OiBzdHJpbmddOiBRdW90YVJhdGVMaW1pdFNuYXBzaG90IHwgdW5kZWZpbmVkIH0gfCBudWxsO1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFHQSxNQUFhLGVBQWU7Q0FBQztDQUFVO0NBQWE7QUFBTTtBQUkxRCxTQUFnQixhQUFhLE9BQWdEO0NBQzNFLE9BQU8sYUFBYSxNQUFNLE9BQU8sT0FBTyxLQUFLO0FBQy9DOztBQXNCQSxNQUFhLGtCQUF3QyxFQUFFLEtBQUs7QUFHNUQsTUFBTSxnQkFBZ0IsRUFBRSxZQUFZLENBQUMsQ0FBQzs7QUFHdEMsU0FBZ0IsYUFBYSxPQUFtRDtDQUM5RSxPQUFPLGNBQWMsVUFBVSxLQUFLLENBQUMsQ0FBQztBQUN4Qzs7QUFHQSxTQUFnQixXQUFXLE9BQWtEO0NBQzNFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxVQUFVLEtBQUssQ0FBQyxDQUFDO0FBQ3JDOztBQUdBLFNBQWdCLFdBQVcsT0FBa0Q7Q0FDM0UsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLFVBQVUsS0FBSyxDQUFDLENBQUM7QUFDckMifQ==
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { isJsonObject } from "./provider-types.js";
|
|
2
|
+
import { z } from "zod";
|
|
1
3
|
import { Buffer } from "node:buffer";
|
|
2
4
|
//#region src/utils/providers/common/schema-validation.ts
|
|
3
5
|
/**
|
|
@@ -33,16 +35,18 @@ function parseAndValidateCallerSchemas(input) {
|
|
|
33
35
|
} catch {
|
|
34
36
|
throw new CallerSchemaValidationError("jsonSchema must contain valid JSON");
|
|
35
37
|
}
|
|
36
|
-
if (!
|
|
37
|
-
|
|
38
|
+
if (!isJsonObject(parsed) || parsed.type !== "object") throw new CallerSchemaValidationError("jsonSchema top-level type must be \"object\"");
|
|
39
|
+
complexityWalk("jsonSchema", state, false).parse(parsed);
|
|
38
40
|
state.schemas += 1;
|
|
39
41
|
outputSchema = parsed;
|
|
40
42
|
}
|
|
41
43
|
for (const [index, tool] of (input.tools ?? []).entries()) {
|
|
42
44
|
addToolMetadataUtf8Bytes(tool, index, state);
|
|
43
45
|
const path = `tools[${index}].inputSchema`;
|
|
44
|
-
|
|
45
|
-
|
|
46
|
+
complexityWalk(path, state, true).parse(tool.inputSchema);
|
|
47
|
+
const serialized = callerJsonText.safeParse(tool.inputSchema);
|
|
48
|
+
if (!serialized.success) throw new CallerSchemaValidationError(`${path} must be JSON-serializable`);
|
|
49
|
+
addUtf8Bytes(jsonStringContentUtf8ByteUpperBound(serialized.data), path, state);
|
|
46
50
|
state.schemas += 1;
|
|
47
51
|
}
|
|
48
52
|
return outputSchema;
|
|
@@ -57,6 +61,26 @@ function serializeAndValidateDispatchSchema(schema, provider) {
|
|
|
57
61
|
function assertAnthropicSchemaArgvSize(jsonSchema) {
|
|
58
62
|
if (Buffer.byteLength(jsonSchema, "utf8") > 65536) throw new CallerSchemaValidationError(`Anthropic dispatch schema exceeds argv UTF-8 byte limit of ${ANTHROPIC_SCHEMA_ARGV_MAX_UTF8_BYTES}`);
|
|
59
63
|
}
|
|
64
|
+
/**
|
|
65
|
+
* Decodes an opaque caller value (QgridTool.inputSchema is z.unknown() at the API boundary) into
|
|
66
|
+
* its JSON text. Cycles, BigInt, and values with no JSON form (bare undefined, functions) fail.
|
|
67
|
+
*/
|
|
68
|
+
const callerJsonText = z.unknown().transform((value, context) => {
|
|
69
|
+
let serialized;
|
|
70
|
+
try {
|
|
71
|
+
serialized = JSON.stringify(value);
|
|
72
|
+
} catch {
|
|
73
|
+
serialized = void 0;
|
|
74
|
+
}
|
|
75
|
+
if (serialized === void 0) {
|
|
76
|
+
context.addIssue({
|
|
77
|
+
code: "custom",
|
|
78
|
+
message: "value is not JSON-serializable"
|
|
79
|
+
});
|
|
80
|
+
return z.NEVER;
|
|
81
|
+
}
|
|
82
|
+
return serialized;
|
|
83
|
+
});
|
|
60
84
|
function stringifyJsonOrThrow(value, subject) {
|
|
61
85
|
let serialized;
|
|
62
86
|
try {
|
|
@@ -115,45 +139,62 @@ function jsonStringContentUtf8ByteUpperBound(value) {
|
|
|
115
139
|
}
|
|
116
140
|
return bytes;
|
|
117
141
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
142
|
+
/**
|
|
143
|
+
* Bounded, iterative walk over a caller schema, run before anything materializes its
|
|
144
|
+
* serialization. Values are read one at a time, in key order, so a limit stops the walk before
|
|
145
|
+
* later values (including getters) are touched. That rules out decoding each value with a schema
|
|
146
|
+
* first; nodes are classified by identity instead: Object(value) === value holds exactly for
|
|
147
|
+
* objects, arrays, and functions.
|
|
148
|
+
*/
|
|
149
|
+
function complexityWalk(path, state, precheckUtf8Bytes) {
|
|
150
|
+
return z.unknown().transform((root) => {
|
|
151
|
+
const rawUtf8Bytes = { value: 0 };
|
|
152
|
+
if (precheckUtf8Bytes && isPrimitiveText(root)) addRawUtf8LowerBound(root, path, state, rawUtf8Bytes);
|
|
153
|
+
addNode(path, state);
|
|
154
|
+
if (root === null || root === void 0 || Object(root) !== root) return;
|
|
155
|
+
const stack = [{
|
|
156
|
+
value: Object(root),
|
|
157
|
+
depth: 0
|
|
158
|
+
}];
|
|
159
|
+
while (stack.length > 0) {
|
|
160
|
+
const current = stack.pop();
|
|
161
|
+
if (Array.isArray(current.value)) {
|
|
162
|
+
for (let index = 0; index < current.value.length; index += 1) {
|
|
163
|
+
const depth = current.depth + 1;
|
|
164
|
+
assertDepthWithinLimit(depth, path);
|
|
165
|
+
addNode(path, state);
|
|
166
|
+
const child = current.value[index];
|
|
167
|
+
if (precheckUtf8Bytes && isPrimitiveText(child)) addRawUtf8LowerBound(child, path, state, rawUtf8Bytes);
|
|
168
|
+
if (child !== null && child !== void 0 && Object(child) === child) stack.push({
|
|
169
|
+
value: Object(child),
|
|
170
|
+
depth
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
for (const key in current.value) {
|
|
176
|
+
if (!Object.hasOwn(current.value, key)) continue;
|
|
177
|
+
if (precheckUtf8Bytes) addRawUtf8LowerBound(key, path, state, rawUtf8Bytes);
|
|
131
178
|
const depth = current.depth + 1;
|
|
132
179
|
assertDepthWithinLimit(depth, path);
|
|
133
180
|
addNode(path, state);
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
if (
|
|
137
|
-
|
|
181
|
+
const descriptor = Object.getOwnPropertyDescriptor(current.value, key);
|
|
182
|
+
const child = descriptor?.get ? descriptor.get.call(current.value) : descriptor?.value;
|
|
183
|
+
if (precheckUtf8Bytes && isPrimitiveText(child)) addRawUtf8LowerBound(child, path, state, rawUtf8Bytes);
|
|
184
|
+
if (child !== null && child !== void 0 && Object(child) === child) stack.push({
|
|
185
|
+
value: Object(child),
|
|
138
186
|
depth
|
|
139
187
|
});
|
|
140
188
|
}
|
|
141
|
-
continue;
|
|
142
189
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
if (child !== null && typeof child === "object") stack.push({
|
|
152
|
-
value: child,
|
|
153
|
-
depth
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
}
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* String test for the bounded walk. A failed zod parse builds a ZodError (which serializes the
|
|
194
|
+
* input), so the walk uses identity: a primitive whose String() form is itself is a string.
|
|
195
|
+
*/
|
|
196
|
+
function isPrimitiveText(value) {
|
|
197
|
+
return Object(value) !== value && String(value) === value;
|
|
157
198
|
}
|
|
158
199
|
function addRawUtf8LowerBound(value, path, state, rawUtf8Bytes) {
|
|
159
200
|
rawUtf8Bytes.value += Buffer.byteLength(value, "utf8");
|
|
@@ -169,10 +210,7 @@ function addNode(path, state) {
|
|
|
169
210
|
function throwLimitError(path, kind, limit, state) {
|
|
170
211
|
throw new CallerSchemaValidationError(state.schemas === 0 ? `${path} exceeds ${kind} limit of ${limit}` : `caller schemas exceed aggregate ${kind} limit of ${limit}`);
|
|
171
212
|
}
|
|
172
|
-
function isRecord(value) {
|
|
173
|
-
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
174
|
-
}
|
|
175
213
|
//#endregion
|
|
176
214
|
export { ANTHROPIC_SCHEMA_ARGV_MAX_UTF8_BYTES, ARGV_SAFE_MAX_UTF8_BYTES, CALLER_SCHEMA_LIMITS, CallerSchemaValidationError, assertAnthropicSchemaArgvSize, parseAndValidateCallerSchemas, serializeAndValidateDispatchSchema };
|
|
177
215
|
|
|
178
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLXZhbGlkYXRpb24uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vc2NoZW1hLXZhbGlkYXRpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSBcIm5vZGU6YnVmZmVyXCI7XG5cbmltcG9ydCB7IHR5cGUgSnNvblZhbHVlIH0gZnJvbSBcIi4vcHJvdmlkZXItdHlwZXNcIjtcblxuLyoqXG4gKiBDYWxsZXItcHJvdmlkZWQgc2NoZW1hcyBhcmUgc2VyaWFsaXplZCwgY29waWVkLCBhbmQgcmVjdXJzaXZlbHkgbm9ybWFsaXplZCBiZWZvcmUgZGlzcGF0Y2guXG4gKiBLZWVwIHRoZXNlIGxpbWl0cyBjb21mb3J0YWJseSBhYm92ZSBub3JtYWwgZ2VuZXJhdGVkIHNjaGVtYXMgd2hpbGUgYm91bmRpbmcgdGhhdCBwcmVwcm9jZXNzaW5nXG4gKiB3ZWxsIGJlbG93IHRoZSBBUEkncyAxMCBNaUIgcmVxdWVzdC1ib2R5IGNlaWxpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBDQUxMRVJfU0NIRU1BX0xJTUlUUyA9IHtcbiAgbWF4VXRmOEJ5dGVzOiA1MTIgKiAxMDI0LFxuICBtYXhOb2RlczogMjBfMDAwLFxuICBtYXhEZXB0aDogMTI4LFxufSBhcyBjb25zdDtcblxuLy8gTGludXggcGVybWl0cyBhdCBtb3N0IDEyOCBLaUIgKE1BWF9BUkdfU1RSTEVOKSBmb3Igb25lIGFyZ3YgdmFsdWUuIHFncmlkIHVzZXMgYSA1MCUgc2FmZXR5XG4vLyBtYXJnaW4gZm9yIGV2ZXJ5IGFyZ3YtZGVsaXZlcmVkIHBheWxvYWQg4oCUIENsYXVkZSBDb2RlIC0tanNvbi1zY2hlbWEgaGVyZSBhbmQgdGhlIHN5c3RlbS1wcm9tcHRcbi8vIHRyYW5zcG9ydCAoY2xhdWRlLXNlc3Npb24pIGJvdGggZGVyaXZlIGZyb20gdGhpcyBzaW5nbGUgY29uc3RhbnQuXG5leHBvcnQgY29uc3QgQVJHVl9TQUZFX01BWF9VVEY4X0JZVEVTID0gNjQgKiAxMDI0O1xuZXhwb3J0IGNvbnN0IEFOVEhST1BJQ19TQ0hFTUFfQVJHVl9NQVhfVVRGOF9CWVRFUyA9IEFSR1ZfU0FGRV9NQVhfVVRGOF9CWVRFUztcblxuZXhwb3J0IGNsYXNzIENhbGxlclNjaGVtYVZhbGlkYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoYHFncmlkOiAke21lc3NhZ2V9YCk7XG4gICAgdGhpcy5uYW1lID0gXCJDYWxsZXJTY2hlbWFWYWxpZGF0aW9uRXJyb3JcIjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhbGxlclNjaGVtYXNJbnB1dCB7XG4gIGpzb25TY2hlbWE/OiBzdHJpbmc7XG4gIHRvb2xzPzogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGRlc2NyaXB0aW9uPzogc3RyaW5nOyBpbnB1dFNjaGVtYTogdW5rbm93biB9Pjtcbn1cblxuaW50ZXJmYWNlIENvbXBsZXhpdHlTdGF0ZSB7XG4gIHV0ZjhCeXRlczogbnVtYmVyO1xuICBub2RlczogbnVtYmVyO1xuICBzY2hlbWFzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUFuZFZhbGlkYXRlQ2FsbGVyU2NoZW1hcyhpbnB1dDogQ2FsbGVyU2NoZW1hc0lucHV0KTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3RhdGU6IENvbXBsZXhpdHlTdGF0ZSA9IHtcbiAgICB1dGY4Qnl0ZXM6IDAsXG4gICAgbm9kZXM6IDAsXG4gICAgc2NoZW1hczogMCxcbiAgfTtcbiAgbGV0IG91dHB1dFNjaGVtYTogSnNvblZhbHVlIHwgdW5kZWZpbmVkO1xuXG4gIGlmIChpbnB1dC5qc29uU2NoZW1hICE9PSB1bmRlZmluZWQpIHtcbiAgICBhZGRVdGY4Qnl0ZXMoQnVmZmVyLmJ5dGVMZW5ndGgoaW5wdXQuanNvblNjaGVtYSwgXCJ1dGY4XCIpLCBcImpzb25TY2hlbWFcIiwgc3RhdGUpO1xuXG4gICAgbGV0IHBhcnNlZDogdW5rbm93bjtcbiAgICB0cnkge1xuICAgICAgcGFyc2VkID0gSlNPTi5wYXJzZShpbnB1dC5qc29uU2NoZW1hKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBDYWxsZXJTY2hlbWFWYWxpZGF0aW9uRXJyb3IoXCJqc29uU2NoZW1hIG11c3QgY29udGFpbiB2YWxpZCBKU09OXCIpO1xuICAgIH1cblxuICAgIGlmICghaXNSZWNvcmQocGFyc2VkKSB8fCBwYXJzZWQudHlwZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IENhbGxlclNjaGVtYVZhbGlkYXRpb25FcnJvcignanNvblNjaGVtYSB0b3AtbGV2ZWwgdHlwZSBtdXN0IGJlIFwib2JqZWN0XCInKTtcbiAgICB9XG5cbiAgICBhZGRDb21wbGV4aXR5KHBhcnNlZCwgXCJqc29uU2NoZW1hXCIsIHN0YXRlKTtcbiAgICBzdGF0ZS5zY2hlbWFzICs9IDE7XG4gICAgb3V0cHV0U2NoZW1hID0gcGFyc2VkIGFzIEpzb25WYWx1ZTtcbiAgfVxuXG4gIGZvciAoY29uc3QgW2luZGV4LCB0b29sXSBvZiAoaW5wdXQudG9vbHMgPz8gW10pLmVudHJpZXMoKSkge1xuICAgIGFkZFRvb2xNZXRhZGF0YVV0ZjhCeXRlcyh0b29sLCBpbmRleCwgc3RhdGUpO1xuXG4gICAgY29uc3QgcGF0aCA9IGB0b29sc1ske2luZGV4fV0uaW5wdXRTY2hlbWFgO1xuICAgIGFkZENvbXBsZXhpdHkodG9vbC5pbnB1dFNjaGVtYSwgcGF0aCwgc3RhdGUsIHRydWUpO1xuXG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IHN0cmluZ2lmeUpzb25PclRocm93KHRvb2wuaW5wdXRTY2hlbWEsIHBhdGgpO1xuXG4gICAgLy8gYnVpbGRUb29sQ2FsbFNjaGVtYSBlbWJlZHMgdGhpcyBzZXJpYWxpemF0aW9uIGluc2lkZSBhbm90aGVyIEpTT04gc3RyaW5nLiBDaGFyZ2UgdGhlXG4gICAgLy8gZXNjYXBlZCBvdXRlci1zdHJpbmcgcmVwcmVzZW50YXRpb24gYmVmb3JlIHRoYXQgY29tcG9zZWQgZGVzY3JpcHRpb24gaXMgbWF0ZXJpYWxpemVkLlxuICAgIGFkZFV0ZjhCeXRlcyhqc29uU3RyaW5nQ29udGVudFV0ZjhCeXRlVXBwZXJCb3VuZChzZXJpYWxpemVkKSwgcGF0aCwgc3RhdGUpO1xuICAgIHN0YXRlLnNjaGVtYXMgKz0gMTtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXRTY2hlbWE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVBbmRWYWxpZGF0ZURpc3BhdGNoU2NoZW1hKFxuICBzY2hlbWE6IHVua25vd24sXG4gIHByb3ZpZGVyPzogc3RyaW5nLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHNjaGVtYSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHNlcmlhbGl6ZWQgPSBzdHJpbmdpZnlKc29uT3JUaHJvdyhzY2hlbWEsIFwiZGlzcGF0Y2ggc2NoZW1hXCIpO1xuXG4gIGNvbnN0IGJ5dGVMZW5ndGggPSBCdWZmZXIuYnl0ZUxlbmd0aChzZXJpYWxpemVkLCBcInV0ZjhcIik7XG4gIGlmIChieXRlTGVuZ3RoID4gQ0FMTEVSX1NDSEVNQV9MSU1JVFMubWF4VXRmOEJ5dGVzKSB7XG4gICAgdGhyb3cgbmV3IENhbGxlclNjaGVtYVZhbGlkYXRpb25FcnJvcihcbiAgICAgIGBkaXNwYXRjaCBzY2hlbWEgZXhjZWVkcyBVVEYtOCBieXRlIGxpbWl0IG9mICR7Q0FMTEVSX1NDSEVNQV9MSU1JVFMubWF4VXRmOEJ5dGVzfWAsXG4gICAgKTtcbiAgfVxuICBpZiAocHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCIpIHtcbiAgICBhc3NlcnRBbnRocm9waWNTY2hlbWFBcmd2U2l6ZShzZXJpYWxpemVkKTtcbiAgfVxuXG4gIHJldHVybiBzZXJpYWxpemVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0QW50aHJvcGljU2NoZW1hQXJndlNpemUoanNvblNjaGVtYTogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChCdWZmZXIuYnl0ZUxlbmd0aChqc29uU2NoZW1hLCBcInV0ZjhcIikgPiBBTlRIUk9QSUNfU0NIRU1BX0FSR1ZfTUFYX1VURjhfQllURVMpIHtcbiAgICB0aHJvdyBuZXcgQ2FsbGVyU2NoZW1hVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYEFudGhyb3BpYyBkaXNwYXRjaCBzY2hlbWEgZXhjZWVkcyBhcmd2IFVURi04IGJ5dGUgbGltaXQgb2YgJHtBTlRIUk9QSUNfU0NIRU1BX0FSR1ZfTUFYX1VURjhfQllURVN9YCxcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeUpzb25PclRocm93KHZhbHVlOiB1bmtub3duLCBzdWJqZWN0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgc2VyaWFsaXplZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIHNlcmlhbGl6ZWQgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBDYWxsZXJTY2hlbWFWYWxpZGF0aW9uRXJyb3IoYCR7c3ViamVjdH0gbXVzdCBiZSBKU09OLXNlcmlhbGl6YWJsZWApO1xuICB9XG4gIGlmIChzZXJpYWxpemVkID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgQ2FsbGVyU2NoZW1hVmFsaWRhdGlvbkVycm9yKGAke3N1YmplY3R9IG11c3QgYmUgSlNPTi1zZXJpYWxpemFibGVgKTtcbiAgfVxuICByZXR1cm4gc2VyaWFsaXplZDtcbn1cblxuZnVuY3Rpb24gYWRkVXRmOEJ5dGVzKGJ5dGVMZW5ndGg6IG51bWJlciwgcGF0aDogc3RyaW5nLCBzdGF0ZTogQ29tcGxleGl0eVN0YXRlKTogdm9pZCB7XG4gIHN0YXRlLnV0ZjhCeXRlcyArPSBieXRlTGVuZ3RoO1xuICBpZiAoc3RhdGUudXRmOEJ5dGVzID4gQ0FMTEVSX1NDSEVNQV9MSU1JVFMubWF4VXRmOEJ5dGVzKSB7XG4gICAgdGhyb3dMaW1pdEVycm9yKHBhdGgsIFwiVVRGLTggYnl0ZVwiLCBDQUxMRVJfU0NIRU1BX0xJTUlUUy5tYXhVdGY4Qnl0ZXMsIHN0YXRlKTtcbiAgfVxufVxuXG5jb25zdCBUT09MX0RFU0NSSVBUSU9OX0VOVFJZX1BSRUZJWCA9IFwiLSBcIjtcbmNvbnN0IFRPT0xfREVTQ1JJUFRJT05fTkFNRV9TRVBBUkFUT1IgPSBcIjogXCI7XG5jb25zdCBUT09MX0RFU0NSSVBUSU9OX0lOUFVUX1NDSEVNQV9QUkVGSVggPSBcIlxcbiAgaW5wdXRTY2hlbWE6IFwiO1xuY29uc3QgVE9PTF9ERVNDUklQVElPTl9FTlRSWV9TRVBBUkFUT1IgPSBcIlxcblwiO1xuXG5mdW5jdGlvbiBhZGRUb29sTWV0YWRhdGFVdGY4Qnl0ZXMoXG4gIHRvb2w6IE5vbk51bGxhYmxlPENhbGxlclNjaGVtYXNJbnB1dFtcInRvb2xzXCJdPltudW1iZXJdLFxuICBpbmRleDogbnVtYmVyLFxuICBzdGF0ZTogQ29tcGxleGl0eVN0YXRlLFxuKTogdm9pZCB7XG4gIGNvbnN0IHRvb2xQYXRoID0gYHRvb2xzWyR7aW5kZXh9XWA7XG5cbiAgLy8gYnVpbGRUb29sQ2FsbFNjaGVtYSBwbGFjZXMgZXZlcnkgdG9vbCBuYW1lIGluIGJvdGggdGhlIGVudW0gYW5kIHRoZSBodW1hbi1yZWFkYWJsZSB0b29sXG4gIC8vIGRlc2NyaXB0aW9uLiBDb3VudCBib3RoIGVzY2FwZWQgb2NjdXJyZW5jZXMsIHBsdXMgdGhlIGVudW0ncyBKU09OIHN0cmluZyBkZWxpbWl0ZXJzLlxuICBjb25zdCBlbmNvZGVkTmFtZUJ5dGVzID0ganNvblN0cmluZ0NvbnRlbnRVdGY4Qnl0ZVVwcGVyQm91bmQodG9vbC5uYW1lKTtcbiAgYWRkVXRmOEJ5dGVzKGVuY29kZWROYW1lQnl0ZXMgKiAyICsgMiwgYCR7dG9vbFBhdGh9Lm5hbWVgLCBzdGF0ZSk7XG5cbiAgaWYgKHRvb2wuZGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGFkZFV0ZjhCeXRlcyhcbiAgICAgIGpzb25TdHJpbmdDb250ZW50VXRmOEJ5dGVVcHBlckJvdW5kKHRvb2wuZGVzY3JpcHRpb24pLFxuICAgICAgYCR7dG9vbFBhdGh9LmRlc2NyaXB0aW9uYCxcbiAgICAgIHN0YXRlLFxuICAgICk7XG4gIH1cblxuICAvLyBQZXItdG9vbCBmcmFtaW5nIGFsc28gZ3Jvd3Mgd2l0aCB0aGUgbnVtYmVyIG9mIHRvb2xzIGV2ZW4gd2hlbiBhbGwgY2FsbGVyIHN0cmluZ3MgYXJlIGVtcHR5LlxuICAvLyBJbmNsdWRlIGJvdGggdGhlIHRvb2xEZXNjcmlwdGlvbnMgam9pbiBzZXBhcmF0b3IgYW5kIHRoZSBlbnVtIGNvbW1hIGFmdGVyIHRoZSBmaXJzdCBlbnRyeS5cbiAgY29uc3QgZnJhbWluZ0J5dGVzID1cbiAgICBqc29uU3RyaW5nQ29udGVudFV0ZjhCeXRlVXBwZXJCb3VuZChUT09MX0RFU0NSSVBUSU9OX0VOVFJZX1BSRUZJWCkgK1xuICAgIGpzb25TdHJpbmdDb250ZW50VXRmOEJ5dGVVcHBlckJvdW5kKFRPT0xfREVTQ1JJUFRJT05fTkFNRV9TRVBBUkFUT1IpICtcbiAgICBqc29uU3RyaW5nQ29udGVudFV0ZjhCeXRlVXBwZXJCb3VuZChUT09MX0RFU0NSSVBUSU9OX0lOUFVUX1NDSEVNQV9QUkVGSVgpICtcbiAgICAoaW5kZXggPT09IDAgPyAwIDoganNvblN0cmluZ0NvbnRlbnRVdGY4Qnl0ZVVwcGVyQm91bmQoVE9PTF9ERVNDUklQVElPTl9FTlRSWV9TRVBBUkFUT1IpICsgMSk7XG4gIGFkZFV0ZjhCeXRlcyhmcmFtaW5nQnl0ZXMsIHRvb2xQYXRoLCBzdGF0ZSk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGNvbnNlcnZhdGl2ZSBVVEYtOCBieXRlIGNvdW50IGZvciBhIHN0cmluZyB3aGVuIGl0IGJlY29tZXMgSlNPTiBzdHJpbmcgY29udGVudCxcbiAqIHdpdGhvdXQgYWxsb2NhdGluZyB0aGUgZXNjYXBlZCByZXByZXNlbnRhdGlvbi4gSlNPTi5zdHJpbmdpZnkgdXNlcyBzaG9ydCB0d28tYnl0ZSBlc2NhcGVzIGZvclxuICogZml2ZSBjb250cm9sIGNoYXJhY3RlcnM7IGNvdW50aW5nIGV2ZXJ5IGNvbnRyb2wgY2hhcmFjdGVyIGFzIGEgc2l4LWJ5dGUgYFxcdTAwWFhgIGVzY2FwZSBrZWVwc1xuICogdGhpcyBhbiB1cHBlciBib3VuZCB3aGlsZSBhdm9pZGluZyBhIHNlY29uZCBsYXJnZSB0ZW1wb3Jhcnkgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBqc29uU3RyaW5nQ29udGVudFV0ZjhCeXRlVXBwZXJCb3VuZCh2YWx1ZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgbGV0IGJ5dGVzID0gMDtcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdmFsdWUubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgY29uc3QgY29kZVVuaXQgPSB2YWx1ZS5jaGFyQ29kZUF0KGluZGV4KTtcblxuICAgIGlmIChjb2RlVW5pdCA9PT0gMHgyMiB8fCBjb2RlVW5pdCA9PT0gMHg1Yykge1xuICAgICAgYnl0ZXMgKz0gMjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY29kZVVuaXQgPD0gMHgxZikge1xuICAgICAgYnl0ZXMgKz0gNjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY29kZVVuaXQgPj0gMHhkODAwICYmIGNvZGVVbml0IDw9IDB4ZGJmZikge1xuICAgICAgY29uc3QgbmV4dENvZGVVbml0ID0gdmFsdWUuY2hhckNvZGVBdChpbmRleCArIDEpO1xuICAgICAgaWYgKG5leHRDb2RlVW5pdCA+PSAweGRjMDAgJiYgbmV4dENvZGVVbml0IDw9IDB4ZGZmZikge1xuICAgICAgICBieXRlcyArPSA0O1xuICAgICAgICBpbmRleCArPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gV2VsbC1mb3JtZWQgSlNPTi5zdHJpbmdpZnkgZXNjYXBlcyBsb25lIHN1cnJvZ2F0ZXMgYXMgYFxcdVhYWFhgLlxuICAgICAgICBieXRlcyArPSA2O1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjb2RlVW5pdCA+PSAweGRjMDAgJiYgY29kZVVuaXQgPD0gMHhkZmZmKSB7XG4gICAgICBieXRlcyArPSA2O1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgYnl0ZXMgKz0gY29kZVVuaXQgPD0gMHg3ZiA/IDEgOiBjb2RlVW5pdCA8PSAweDdmZiA/IDIgOiAzO1xuICB9XG5cbiAgcmV0dXJuIGJ5dGVzO1xufVxuXG5mdW5jdGlvbiBhZGRDb21wbGV4aXR5KFxuICByb290OiB1bmtub3duLFxuICBwYXRoOiBzdHJpbmcsXG4gIHN0YXRlOiBDb21wbGV4aXR5U3RhdGUsXG4gIHByZWNoZWNrVXRmOEJ5dGVzID0gZmFsc2UsXG4pOiB2b2lkIHtcbiAgY29uc3QgcmF3VXRmOEJ5dGVzID0geyB2YWx1ZTogMCB9O1xuICBpZiAocHJlY2hlY2tVdGY4Qnl0ZXMgJiYgdHlwZW9mIHJvb3QgPT09IFwic3RyaW5nXCIpIHtcbiAgICBhZGRSYXdVdGY4TG93ZXJCb3VuZChyb290LCBwYXRoLCBzdGF0ZSwgcmF3VXRmOEJ5dGVzKTtcbiAgfVxuICBhZGROb2RlKHBhdGgsIHN0YXRlKTtcbiAgaWYgKHJvb3QgPT09IG51bGwgfHwgdHlwZW9mIHJvb3QgIT09IFwib2JqZWN0XCIpIHJldHVybjtcblxuICBjb25zdCBzdGFjazogQXJyYXk8eyB2YWx1ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmtub3duW107IGRlcHRoOiBudW1iZXIgfT4gPSBbXG4gICAgeyB2YWx1ZTogcm9vdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVua25vd25bXSwgZGVwdGg6IDAgfSxcbiAgXTtcblxuICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBzdGFjay5wb3AoKSE7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudC52YWx1ZSkpIHtcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjdXJyZW50LnZhbHVlLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICBjb25zdCBkZXB0aCA9IGN1cnJlbnQuZGVwdGggKyAxO1xuICAgICAgICBhc3NlcnREZXB0aFdpdGhpbkxpbWl0KGRlcHRoLCBwYXRoKTtcbiAgICAgICAgYWRkTm9kZShwYXRoLCBzdGF0ZSk7XG5cbiAgICAgICAgY29uc3QgY2hpbGQgPSBjdXJyZW50LnZhbHVlW2luZGV4XTtcbiAgICAgICAgaWYgKHByZWNoZWNrVXRmOEJ5dGVzICYmIHR5cGVvZiBjaGlsZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGFkZFJhd1V0ZjhMb3dlckJvdW5kKGNoaWxkLCBwYXRoLCBzdGF0ZSwgcmF3VXRmOEJ5dGVzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hpbGQgIT09IG51bGwgJiYgdHlwZW9mIGNoaWxkID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgc3RhY2sucHVzaCh7IHZhbHVlOiBjaGlsZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVua25vd25bXSwgZGVwdGggfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IGluIGN1cnJlbnQudmFsdWUpIHtcbiAgICAgIGlmICghT2JqZWN0Lmhhc093bihjdXJyZW50LnZhbHVlLCBrZXkpKSBjb250aW51ZTtcbiAgICAgIGlmIChwcmVjaGVja1V0ZjhCeXRlcykge1xuICAgICAgICBhZGRSYXdVdGY4TG93ZXJCb3VuZChrZXksIHBhdGgsIHN0YXRlLCByYXdVdGY4Qnl0ZXMpO1xuICAgICAgfVxuICAgICAgY29uc3QgZGVwdGggPSBjdXJyZW50LmRlcHRoICsgMTtcbiAgICAgIGFzc2VydERlcHRoV2l0aGluTGltaXQoZGVwdGgsIHBhdGgpO1xuICAgICAgYWRkTm9kZShwYXRoLCBzdGF0ZSk7XG5cbiAgICAgIGNvbnN0IGNoaWxkID0gY3VycmVudC52YWx1ZVtrZXldO1xuICAgICAgaWYgKHByZWNoZWNrVXRmOEJ5dGVzICYmIHR5cGVvZiBjaGlsZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBhZGRSYXdVdGY4TG93ZXJCb3VuZChjaGlsZCwgcGF0aCwgc3RhdGUsIHJhd1V0ZjhCeXRlcyk7XG4gICAgICB9XG4gICAgICBpZiAoY2hpbGQgIT09IG51bGwgJiYgdHlwZW9mIGNoaWxkID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHN0YWNrLnB1c2goeyB2YWx1ZTogY2hpbGQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmtub3duW10sIGRlcHRoIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRSYXdVdGY4TG93ZXJCb3VuZChcbiAgdmFsdWU6IHN0cmluZyxcbiAgcGF0aDogc3RyaW5nLFxuICBzdGF0ZTogQ29tcGxleGl0eVN0YXRlLFxuICByYXdVdGY4Qnl0ZXM6IHsgdmFsdWU6IG51bWJlciB9LFxuKTogdm9pZCB7XG4gIHJhd1V0ZjhCeXRlcy52YWx1ZSArPSBCdWZmZXIuYnl0ZUxlbmd0aCh2YWx1ZSwgXCJ1dGY4XCIpO1xuICBpZiAoc3RhdGUudXRmOEJ5dGVzICsgcmF3VXRmOEJ5dGVzLnZhbHVlID4gQ0FMTEVSX1NDSEVNQV9MSU1JVFMubWF4VXRmOEJ5dGVzKSB7XG4gICAgdGhyb3dMaW1pdEVycm9yKHBhdGgsIFwiVVRGLTggYnl0ZVwiLCBDQUxMRVJfU0NIRU1BX0xJTUlUUy5tYXhVdGY4Qnl0ZXMsIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnREZXB0aFdpdGhpbkxpbWl0KGRlcHRoOiBudW1iZXIsIHBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZGVwdGggPiBDQUxMRVJfU0NIRU1BX0xJTUlUUy5tYXhEZXB0aCkge1xuICAgIHRocm93IG5ldyBDYWxsZXJTY2hlbWFWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBgJHtwYXRofSBleGNlZWRzIGRlcHRoIGxpbWl0IG9mICR7Q0FMTEVSX1NDSEVNQV9MSU1JVFMubWF4RGVwdGh9YCxcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZE5vZGUocGF0aDogc3RyaW5nLCBzdGF0ZTogQ29tcGxleGl0eVN0YXRlKTogdm9pZCB7XG4gIHN0YXRlLm5vZGVzICs9IDE7XG4gIGlmIChzdGF0ZS5ub2RlcyA+IENBTExFUl9TQ0hFTUFfTElNSVRTLm1heE5vZGVzKSB7XG4gICAgdGhyb3dMaW1pdEVycm9yKHBhdGgsIFwibm9kZVwiLCBDQUxMRVJfU0NIRU1BX0xJTUlUUy5tYXhOb2Rlcywgc3RhdGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRocm93TGltaXRFcnJvcihcbiAgcGF0aDogc3RyaW5nLFxuICBraW5kOiBcIlVURi04IGJ5dGVcIiB8IFwibm9kZVwiLFxuICBsaW1pdDogbnVtYmVyLFxuICBzdGF0ZTogQ29tcGxleGl0eVN0YXRlLFxuKTogbmV2ZXIge1xuICB0aHJvdyBuZXcgQ2FsbGVyU2NoZW1hVmFsaWRhdGlvbkVycm9yKFxuICAgIHN0YXRlLnNjaGVtYXMgPT09IDBcbiAgICAgID8gYCR7cGF0aH0gZXhjZWVkcyAke2tpbmR9IGxpbWl0IG9mICR7bGltaXR9YFxuICAgICAgOiBgY2FsbGVyIHNjaGVtYXMgZXhjZWVkIGFnZ3JlZ2F0ZSAke2tpbmR9IGxpbWl0IG9mICR7bGltaXR9YCxcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNSZWNvcmQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBU0EsTUFBYSx1QkFBdUI7Q0FDbEMsY0FBYyxNQUFNO0NBQ3BCLFVBQVU7Q0FDVixVQUFVO0FBQ1o7QUFLQSxNQUFhLDJCQUEyQixLQUFLO0FBQzdDLE1BQWEsdUNBQXVDO0FBRXBELElBQWEsOEJBQWIs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
|
|
216
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLXZhbGlkYXRpb24uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vc2NoZW1hLXZhbGlkYXRpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSBcIm5vZGU6YnVmZmVyXCI7XG5cbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IGlzSnNvbk9iamVjdCwgdHlwZSBKc29uVmFsdWUgfSBmcm9tIFwiLi9wcm92aWRlci10eXBlc1wiO1xuXG4vKipcbiAqIENhbGxlci1wcm92aWRlZCBzY2hlbWFzIGFyZSBzZXJpYWxpemVkLCBjb3BpZWQsIGFuZCByZWN1cnNpdmVseSBub3JtYWxpemVkIGJlZm9yZSBkaXNwYXRjaC5cbiAqIEtlZXAgdGhlc2UgbGltaXRzIGNvbWZvcnRhYmx5IGFib3ZlIG5vcm1hbCBnZW5lcmF0ZWQgc2NoZW1hcyB3aGlsZSBib3VuZGluZyB0aGF0IHByZXByb2Nlc3NpbmdcbiAqIHdlbGwgYmVsb3cgdGhlIEFQSSdzIDEwIE1pQiByZXF1ZXN0LWJvZHkgY2VpbGluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IENBTExFUl9TQ0hFTUFfTElNSVRTID0ge1xuICBtYXhVdGY4Qnl0ZXM6IDUxMiAqIDEwMjQsXG4gIG1heE5vZGVzOiAyMF8wMDAsXG4gIG1heERlcHRoOiAxMjgsXG59IGFzIGNvbnN0O1xuXG4vLyBMaW51eCBwZXJtaXRzIGF0IG1vc3QgMTI4IEtpQiAoTUFYX0FSR19TVFJMRU4pIGZvciBvbmUgYXJndiB2YWx1ZS4gcWdyaWQgdXNlcyBhIDUwJSBzYWZldHlcbi8vIG1hcmdpbiBmb3IgZXZlcnkgYXJndi1kZWxpdmVyZWQgcGF5bG9hZCDigJQgQ2xhdWRlIENvZGUgLS1qc29uLXNjaGVtYSBoZXJlIGFuZCB0aGUgc3lzdGVtLXByb21wdFxuLy8gdHJhbnNwb3J0IChjbGF1ZGUtc2Vzc2lvbikgYm90aCBkZXJpdmUgZnJvbSB0aGlzIHNpbmdsZSBjb25zdGFudC5cbmV4cG9ydCBjb25zdCBBUkdWX1NBRkVfTUFYX1VURjhfQllURVMgPSA2NCAqIDEwMjQ7XG5leHBvcnQgY29uc3QgQU5USFJPUElDX1NDSEVNQV9BUkdWX01BWF9VVEY4X0JZVEVTID0gQVJHVl9TQUZFX01BWF9VVEY4X0JZVEVTO1xuXG5leHBvcnQgY2xhc3MgQ2FsbGVyU2NoZW1hVmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgcWdyaWQ6ICR7bWVzc2FnZX1gKTtcbiAgICB0aGlzLm5hbWUgPSBcIkNhbGxlclNjaGVtYVZhbGlkYXRpb25FcnJvclwiO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsbGVyU2NoZW1hc0lucHV0IHtcbiAganNvblNjaGVtYT86IHN0cmluZztcbiAgdG9vbHM/OiBBcnJheTx7IG5hbWU6IHN0cmluZzsgZGVzY3JpcHRpb24/OiBzdHJpbmc7IGlucHV0U2NoZW1hOiB1bmtub3duIH0+O1xufVxuXG5pbnRlcmZhY2UgQ29tcGxleGl0eVN0YXRlIHtcbiAgdXRmOEJ5dGVzOiBudW1iZXI7XG4gIG5vZGVzOiBudW1iZXI7XG4gIHNjaGVtYXM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQW5kVmFsaWRhdGVDYWxsZXJTY2hlbWFzKGlucHV0OiBDYWxsZXJTY2hlbWFzSW5wdXQpOiBKc29uVmFsdWUgfCB1bmRlZmluZWQge1xuICBjb25zdCBzdGF0ZTogQ29tcGxleGl0eVN0YXRlID0ge1xuICAgIHV0ZjhCeXRlczogMCxcbiAgICBub2RlczogMCxcbiAgICBzY2hlbWFzOiAwLFxuICB9O1xuXG4gIGxldCBvdXRwdXRTY2hlbWE6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZDtcblxuICBpZiAoaW5wdXQuanNvblNjaGVtYSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYWRkVXRmOEJ5dGVzKEJ1ZmZlci5ieXRlTGVuZ3RoKGlucHV0Lmpzb25TY2hlbWEsIFwidXRmOFwiKSwgXCJqc29uU2NoZW1hXCIsIHN0YXRlKTtcblxuICAgIGxldCBwYXJzZWQ6IEpzb25WYWx1ZTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBKU09OLnBhcnNlIHdpdGhvdXQgYSByZXZpdmVyIHlpZWxkcyBvbmx5IEpTT04gdmFsdWVzLlxuICAgICAgcGFyc2VkID0gSlNPTi5wYXJzZShpbnB1dC5qc29uU2NoZW1hKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBDYWxsZXJTY2hlbWFWYWxpZGF0aW9uRXJyb3IoXCJqc29uU2NoZW1hIG11c3QgY29udGFpbiB2YWxpZCBKU09OXCIpO1xuICAgIH1cblxuICAgIGlmICghaXNKc29uT2JqZWN0KHBhcnNlZCkgfHwgcGFyc2VkLnR5cGUgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBDYWxsZXJTY2hlbWFWYWxpZGF0aW9uRXJyb3IoJ2pzb25TY2hlbWEgdG9wLWxldmVsIHR5cGUgbXVzdCBiZSBcIm9iamVjdFwiJyk7XG4gICAgfVxuXG4gICAgY29tcGxleGl0eVdhbGsoXCJqc29uU2NoZW1hXCIsIHN0YXRlLCBmYWxzZSkucGFyc2UocGFyc2VkKTtcbiAgICBzdGF0ZS5zY2hlbWFzICs9IDE7XG4gICAgb3V0cHV0U2NoZW1hID0gcGFyc2VkO1xuICB9XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIHRvb2xdIG9mIChpbnB1dC50b29scyA/PyBbXSkuZW50cmllcygpKSB7XG4gICAgYWRkVG9vbE1ldGFkYXRhVXRmOEJ5dGVzKHRvb2wsIGluZGV4LCBzdGF0ZSk7XG5cbiAgICBjb25zdCBwYXRoID0gYHRvb2xzWyR7aW5kZXh9XS5pbnB1dFNjaGVtYWA7XG4gICAgY29tcGxleGl0eVdhbGsocGF0aCwgc3RhdGUsIHRydWUpLnBhcnNlKHRvb2wuaW5wdXRTY2hlbWEpO1xuXG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IGNhbGxlckpzb25UZXh0LnNhZmVQYXJzZSh0b29sLmlucHV0U2NoZW1hKTtcblxuICAgIGlmICghc2VyaWFsaXplZC5zdWNjZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgQ2FsbGVyU2NoZW1hVmFsaWRhdGlvbkVycm9yKGAke3BhdGh9IG11c3QgYmUgSlNPTi1zZXJpYWxpemFibGVgKTtcbiAgICB9XG5cbiAgICAvLyBidWlsZFRvb2xDYWxsU2NoZW1hIGVtYmVkcyB0aGlzIHNlcmlhbGl6YXRpb24gaW5zaWRlIGFub3RoZXIgSlNPTiBzdHJpbmcuIENoYXJnZSB0aGVcbiAgICAvLyBlc2NhcGVkIG91dGVyLXN0cmluZyByZXByZXNlbnRhdGlvbiBiZWZvcmUgdGhhdCBjb21wb3NlZCBkZXNjcmlwdGlvbiBpcyBtYXRlcmlhbGl6ZWQuXG4gICAgYWRkVXRmOEJ5dGVzKGpzb25TdHJpbmdDb250ZW50VXRmOEJ5dGVVcHBlckJvdW5kKHNlcmlhbGl6ZWQuZGF0YSksIHBhdGgsIHN0YXRlKTtcbiAgICBzdGF0ZS5zY2hlbWFzICs9IDE7XG4gIH1cblxuICByZXR1cm4gb3V0cHV0U2NoZW1hO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplQW5kVmFsaWRhdGVEaXNwYXRjaFNjaGVtYShcbiAgc2NoZW1hOiBKc29uVmFsdWUgfCB1bmRlZmluZWQsXG4gIHByb3ZpZGVyPzogc3RyaW5nLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHNjaGVtYSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHNlcmlhbGl6ZWQgPSBzdHJpbmdpZnlKc29uT3JUaHJvdyhzY2hlbWEsIFwiZGlzcGF0Y2ggc2NoZW1hXCIpO1xuXG4gIGNvbnN0IGJ5dGVMZW5ndGggPSBCdWZmZXIuYnl0ZUxlbmd0aChzZXJpYWxpemVkLCBcInV0ZjhcIik7XG5cbiAgaWYgKGJ5dGVMZW5ndGggPiBDQUxMRVJfU0NIRU1BX0xJTUlUUy5tYXhVdGY4Qnl0ZXMpIHtcbiAgICB0aHJvdyBuZXcgQ2FsbGVyU2NoZW1hVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYGRpc3BhdGNoIHNjaGVtYSBleGNlZWRzIFVURi04IGJ5dGUgbGltaXQgb2YgJHtDQUxMRVJfU0NIRU1BX0xJTUlUUy5tYXhVdGY4Qnl0ZXN9YCxcbiAgICApO1xuICB9XG5cbiAgaWYgKHByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKSB7XG4gICAgYXNzZXJ0QW50aHJvcGljU2NoZW1hQXJndlNpemUoc2VyaWFsaXplZCk7XG4gIH1cblxuICByZXR1cm4gc2VyaWFsaXplZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEFudGhyb3BpY1NjaGVtYUFyZ3ZTaXplKGpzb25TY2hlbWE6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoQnVmZmVyLmJ5dGVMZW5ndGgoanNvblNjaGVtYSwgXCJ1dGY4XCIpID4gQU5USFJPUElDX1NDSEVNQV9BUkdWX01BWF9VVEY4X0JZVEVTKSB7XG4gICAgdGhyb3cgbmV3IENhbGxlclNjaGVtYVZhbGlkYXRpb25FcnJvcihcbiAgICAgIGBBbnRocm9waWMgZGlzcGF0Y2ggc2NoZW1hIGV4Y2VlZHMgYXJndiBVVEYtOCBieXRlIGxpbWl0IG9mICR7QU5USFJPUElDX1NDSEVNQV9BUkdWX01BWF9VVEY4X0JZVEVTfWAsXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIERlY29kZXMgYW4gb3BhcXVlIGNhbGxlciB2YWx1ZSAoUWdyaWRUb29sLmlucHV0U2NoZW1hIGlzIHoudW5rbm93bigpIGF0IHRoZSBBUEkgYm91bmRhcnkpIGludG9cbiAqIGl0cyBKU09OIHRleHQuIEN5Y2xlcywgQmlnSW50LCBhbmQgdmFsdWVzIHdpdGggbm8gSlNPTiBmb3JtIChiYXJlIHVuZGVmaW5lZCwgZnVuY3Rpb25zKSBmYWlsLlxuICovXG5jb25zdCBjYWxsZXJKc29uVGV4dCA9IHoudW5rbm93bigpLnRyYW5zZm9ybSgodmFsdWUsIGNvbnRleHQpOiBzdHJpbmcgPT4ge1xuICBsZXQgc2VyaWFsaXplZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgfSBjYXRjaCB7XG4gICAgc2VyaWFsaXplZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChzZXJpYWxpemVkID09PSB1bmRlZmluZWQpIHtcbiAgICBjb250ZXh0LmFkZElzc3VlKHsgY29kZTogXCJjdXN0b21cIiwgbWVzc2FnZTogXCJ2YWx1ZSBpcyBub3QgSlNPTi1zZXJpYWxpemFibGVcIiB9KTtcblxuICAgIHJldHVybiB6Lk5FVkVSO1xuICB9XG5cbiAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG59KTtcblxuZnVuY3Rpb24gc3RyaW5naWZ5SnNvbk9yVGhyb3codmFsdWU6IEpzb25WYWx1ZSwgc3ViamVjdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IHNlcmlhbGl6ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIHNlcmlhbGl6ZWQgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBDYWxsZXJTY2hlbWFWYWxpZGF0aW9uRXJyb3IoYCR7c3ViamVjdH0gbXVzdCBiZSBKU09OLXNlcmlhbGl6YWJsZWApO1xuICB9XG5cbiAgaWYgKHNlcmlhbGl6ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBDYWxsZXJTY2hlbWFWYWxpZGF0aW9uRXJyb3IoYCR7c3ViamVjdH0gbXVzdCBiZSBKU09OLXNlcmlhbGl6YWJsZWApO1xuICB9XG5cbiAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG59XG5cbmZ1bmN0aW9uIGFkZFV0ZjhCeXRlcyhieXRlTGVuZ3RoOiBudW1iZXIsIHBhdGg6IHN0cmluZywgc3RhdGU6IENvbXBsZXhpdHlTdGF0ZSk6IHZvaWQge1xuICBzdGF0ZS51dGY4Qnl0ZXMgKz0gYnl0ZUxlbmd0aDtcblxuICBpZiAoc3RhdGUudXRmOEJ5dGVzID4gQ0FMTEVSX1NDSEVNQV9MSU1JVFMubWF4VXRmOEJ5dGVzKSB7XG4gICAgdGhyb3dMaW1pdEVycm9yKHBhdGgsIFwiVVRGLTggYnl0ZVwiLCBDQUxMRVJfU0NIRU1BX0xJTUlUUy5tYXhVdGY4Qnl0ZXMsIHN0YXRlKTtcbiAgfVxufVxuXG5jb25zdCBUT09MX0RFU0NSSVBUSU9OX0VOVFJZX1BSRUZJWCA9IFwiLSBcIjtcbmNvbnN0IFRPT0xfREVTQ1JJUFRJT05fTkFNRV9TRVBBUkFUT1IgPSBcIjogXCI7XG5jb25zdCBUT09MX0RFU0NSSVBUSU9OX0lOUFVUX1NDSEVNQV9QUkVGSVggPSBcIlxcbiAgaW5wdXRTY2hlbWE6IFwiO1xuY29uc3QgVE9PTF9ERVNDUklQVElPTl9FTlRSWV9TRVBBUkFUT1IgPSBcIlxcblwiO1xuXG5mdW5jdGlvbiBhZGRUb29sTWV0YWRhdGFVdGY4Qnl0ZXMoXG4gIHRvb2w6IE5vbk51bGxhYmxlPENhbGxlclNjaGVtYXNJbnB1dFtcInRvb2xzXCJdPltudW1iZXJdLFxuICBpbmRleDogbnVtYmVyLFxuICBzdGF0ZTogQ29tcGxleGl0eVN0YXRlLFxuKTogdm9pZCB7XG4gIGNvbnN0IHRvb2xQYXRoID0gYHRvb2xzWyR7aW5kZXh9XWA7XG5cbiAgLy8gYnVpbGRUb29sQ2FsbFNjaGVtYSBwbGFjZXMgZXZlcnkgdG9vbCBuYW1lIGluIGJvdGggdGhlIGVudW0gYW5kIHRoZSBodW1hbi1yZWFkYWJsZSB0b29sXG4gIC8vIGRlc2NyaXB0aW9uLiBDb3VudCBib3RoIGVzY2FwZWQgb2NjdXJyZW5jZXMsIHBsdXMgdGhlIGVudW0ncyBKU09OIHN0cmluZyBkZWxpbWl0ZXJzLlxuICBjb25zdCBlbmNvZGVkTmFtZUJ5dGVzID0ganNvblN0cmluZ0NvbnRlbnRVdGY4Qnl0ZVVwcGVyQm91bmQodG9vbC5uYW1lKTtcbiAgYWRkVXRmOEJ5dGVzKGVuY29kZWROYW1lQnl0ZXMgKiAyICsgMiwgYCR7dG9vbFBhdGh9Lm5hbWVgLCBzdGF0ZSk7XG5cbiAgaWYgKHRvb2wuZGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGFkZFV0ZjhCeXRlcyhcbiAgICAgIGpzb25TdHJpbmdDb250ZW50VXRmOEJ5dGVVcHBlckJvdW5kKHRvb2wuZGVzY3JpcHRpb24pLFxuICAgICAgYCR7dG9vbFBhdGh9LmRlc2NyaXB0aW9uYCxcbiAgICAgIHN0YXRlLFxuICAgICk7XG4gIH1cblxuICAvLyBQZXItdG9vbCBmcmFtaW5nIGFsc28gZ3Jvd3Mgd2l0aCB0aGUgbnVtYmVyIG9mIHRvb2xzIGV2ZW4gd2hlbiBhbGwgY2FsbGVyIHN0cmluZ3MgYXJlIGVtcHR5LlxuICAvLyBJbmNsdWRlIGJvdGggdGhlIHRvb2xEZXNjcmlwdGlvbnMgam9pbiBzZXBhcmF0b3IgYW5kIHRoZSBlbnVtIGNvbW1hIGFmdGVyIHRoZSBmaXJzdCBlbnRyeS5cbiAgY29uc3QgZnJhbWluZ0J5dGVzID1cbiAgICBqc29uU3RyaW5nQ29udGVudFV0ZjhCeXRlVXBwZXJCb3VuZChUT09MX0RFU0NSSVBUSU9OX0VOVFJZX1BSRUZJWCkgK1xuICAgIGpzb25TdHJpbmdDb250ZW50VXRmOEJ5dGVVcHBlckJvdW5kKFRPT0xfREVTQ1JJUFRJT05fTkFNRV9TRVBBUkFUT1IpICtcbiAgICBqc29uU3RyaW5nQ29udGVudFV0ZjhCeXRlVXBwZXJCb3VuZChUT09MX0RFU0NSSVBUSU9OX0lOUFVUX1NDSEVNQV9QUkVGSVgpICtcbiAgICAoaW5kZXggPT09IDAgPyAwIDoganNvblN0cmluZ0NvbnRlbnRVdGY4Qnl0ZVVwcGVyQm91bmQoVE9PTF9ERVNDUklQVElPTl9FTlRSWV9TRVBBUkFUT1IpICsgMSk7XG5cbiAgYWRkVXRmOEJ5dGVzKGZyYW1pbmdCeXRlcywgdG9vbFBhdGgsIHN0YXRlKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY29uc2VydmF0aXZlIFVURi04IGJ5dGUgY291bnQgZm9yIGEgc3RyaW5nIHdoZW4gaXQgYmVjb21lcyBKU09OIHN0cmluZyBjb250ZW50LFxuICogd2l0aG91dCBhbGxvY2F0aW5nIHRoZSBlc2NhcGVkIHJlcHJlc2VudGF0aW9uLiBKU09OLnN0cmluZ2lmeSB1c2VzIHNob3J0IHR3by1ieXRlIGVzY2FwZXMgZm9yXG4gKiBmaXZlIGNvbnRyb2wgY2hhcmFjdGVyczsgY291bnRpbmcgZXZlcnkgY29udHJvbCBjaGFyYWN0ZXIgYXMgYSBzaXgtYnl0ZSBgXFx1MDBYWGAgZXNjYXBlIGtlZXBzXG4gKiB0aGlzIGFuIHVwcGVyIGJvdW5kIHdoaWxlIGF2b2lkaW5nIGEgc2Vjb25kIGxhcmdlIHRlbXBvcmFyeSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGpzb25TdHJpbmdDb250ZW50VXRmOEJ5dGVVcHBlckJvdW5kKHZhbHVlOiBzdHJpbmcpOiBudW1iZXIge1xuICBsZXQgYnl0ZXMgPSAwO1xuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB2YWx1ZS5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBjb25zdCBjb2RlVW5pdCA9IHZhbHVlLmNoYXJDb2RlQXQoaW5kZXgpO1xuXG4gICAgaWYgKGNvZGVVbml0ID09PSAweDIyIHx8IGNvZGVVbml0ID09PSAweDVjKSB7XG4gICAgICBieXRlcyArPSAyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGNvZGVVbml0IDw9IDB4MWYpIHtcbiAgICAgIGJ5dGVzICs9IDY7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY29kZVVuaXQgPj0gMHhkODAwICYmIGNvZGVVbml0IDw9IDB4ZGJmZikge1xuICAgICAgY29uc3QgbmV4dENvZGVVbml0ID0gdmFsdWUuY2hhckNvZGVBdChpbmRleCArIDEpO1xuXG4gICAgICBpZiAobmV4dENvZGVVbml0ID49IDB4ZGMwMCAmJiBuZXh0Q29kZVVuaXQgPD0gMHhkZmZmKSB7XG4gICAgICAgIGJ5dGVzICs9IDQ7XG4gICAgICAgIGluZGV4ICs9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBXZWxsLWZvcm1lZCBKU09OLnN0cmluZ2lmeSBlc2NhcGVzIGxvbmUgc3Vycm9nYXRlcyBhcyBgXFx1WFhYWGAuXG4gICAgICAgIGJ5dGVzICs9IDY7XG4gICAgICB9XG5cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjb2RlVW5pdCA+PSAweGRjMDAgJiYgY29kZVVuaXQgPD0gMHhkZmZmKSB7XG4gICAgICBieXRlcyArPSA2O1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgYnl0ZXMgKz0gY29kZVVuaXQgPD0gMHg3ZiA/IDEgOiBjb2RlVW5pdCA8PSAweDdmZiA/IDIgOiAzO1xuICB9XG5cbiAgcmV0dXJuIGJ5dGVzO1xufVxuXG4vKipcbiAqIEJvdW5kZWQsIGl0ZXJhdGl2ZSB3YWxrIG92ZXIgYSBjYWxsZXIgc2NoZW1hLCBydW4gYmVmb3JlIGFueXRoaW5nIG1hdGVyaWFsaXplcyBpdHNcbiAqIHNlcmlhbGl6YXRpb24uIFZhbHVlcyBhcmUgcmVhZCBvbmUgYXQgYSB0aW1lLCBpbiBrZXkgb3JkZXIsIHNvIGEgbGltaXQgc3RvcHMgdGhlIHdhbGsgYmVmb3JlXG4gKiBsYXRlciB2YWx1ZXMgKGluY2x1ZGluZyBnZXR0ZXJzKSBhcmUgdG91Y2hlZC4gVGhhdCBydWxlcyBvdXQgZGVjb2RpbmcgZWFjaCB2YWx1ZSB3aXRoIGEgc2NoZW1hXG4gKiBmaXJzdDsgbm9kZXMgYXJlIGNsYXNzaWZpZWQgYnkgaWRlbnRpdHkgaW5zdGVhZDogT2JqZWN0KHZhbHVlKSA9PT0gdmFsdWUgaG9sZHMgZXhhY3RseSBmb3JcbiAqIG9iamVjdHMsIGFycmF5cywgYW5kIGZ1bmN0aW9ucy5cbiAqL1xuZnVuY3Rpb24gY29tcGxleGl0eVdhbGsocGF0aDogc3RyaW5nLCBzdGF0ZTogQ29tcGxleGl0eVN0YXRlLCBwcmVjaGVja1V0ZjhCeXRlczogYm9vbGVhbikge1xuICByZXR1cm4gei51bmtub3duKCkudHJhbnNmb3JtKChyb290KTogdm9pZCA9PiB7XG4gICAgY29uc3QgcmF3VXRmOEJ5dGVzID0geyB2YWx1ZTogMCB9O1xuXG4gICAgaWYgKHByZWNoZWNrVXRmOEJ5dGVzICYmIGlzUHJpbWl0aXZlVGV4dChyb290KSkge1xuICAgICAgYWRkUmF3VXRmOExvd2VyQm91bmQocm9vdCwgcGF0aCwgc3RhdGUsIHJhd1V0ZjhCeXRlcyk7XG4gICAgfVxuXG4gICAgYWRkTm9kZShwYXRoLCBzdGF0ZSk7XG5cbiAgICBpZiAocm9vdCA9PT0gbnVsbCB8fCByb290ID09PSB1bmRlZmluZWQgfHwgT2JqZWN0KHJvb3QpICE9PSByb290KSByZXR1cm47XG5cbiAgICBjb25zdCByb290T2JqZWN0OiBvYmplY3QgPSBPYmplY3Qocm9vdCk7XG4gICAgY29uc3Qgc3RhY2s6IEFycmF5PHsgdmFsdWU6IG9iamVjdDsgZGVwdGg6IG51bWJlciB9PiA9IFt7IHZhbHVlOiByb290T2JqZWN0LCBkZXB0aDogMCB9XTtcblxuICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gc3RhY2sucG9wKCkhO1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50LnZhbHVlKSkge1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY3VycmVudC52YWx1ZS5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgICAgICBjb25zdCBkZXB0aCA9IGN1cnJlbnQuZGVwdGggKyAxO1xuICAgICAgICAgIGFzc2VydERlcHRoV2l0aGluTGltaXQoZGVwdGgsIHBhdGgpO1xuICAgICAgICAgIGFkZE5vZGUocGF0aCwgc3RhdGUpO1xuXG4gICAgICAgICAgY29uc3QgY2hpbGQ6IHVua25vd24gPSBjdXJyZW50LnZhbHVlW2luZGV4XTtcblxuICAgICAgICAgIGlmIChwcmVjaGVja1V0ZjhCeXRlcyAmJiBpc1ByaW1pdGl2ZVRleHQoY2hpbGQpKSB7XG4gICAgICAgICAgICBhZGRSYXdVdGY4TG93ZXJCb3VuZChjaGlsZCwgcGF0aCwgc3RhdGUsIHJhd1V0ZjhCeXRlcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGNoaWxkICE9PSBudWxsICYmIGNoaWxkICE9PSB1bmRlZmluZWQgJiYgT2JqZWN0KGNoaWxkKSA9PT0gY2hpbGQpIHtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goeyB2YWx1ZTogT2JqZWN0KGNoaWxkKSwgZGVwdGggfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGN1cnJlbnQudmFsdWUpIHtcbiAgICAgICAgaWYgKCFPYmplY3QuaGFzT3duKGN1cnJlbnQudmFsdWUsIGtleSkpIGNvbnRpbnVlO1xuXG4gICAgICAgIGlmIChwcmVjaGVja1V0ZjhCeXRlcykge1xuICAgICAgICAgIGFkZFJhd1V0ZjhMb3dlckJvdW5kKGtleSwgcGF0aCwgc3RhdGUsIHJhd1V0ZjhCeXRlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZXB0aCA9IGN1cnJlbnQuZGVwdGggKyAxO1xuICAgICAgICBhc3NlcnREZXB0aFdpdGhpbkxpbWl0KGRlcHRoLCBwYXRoKTtcbiAgICAgICAgYWRkTm9kZShwYXRoLCBzdGF0ZSk7XG5cbiAgICAgICAgLy8gU2FtZSByZWFkIGFzIGN1cnJlbnQudmFsdWVba2V5XSBmb3IgYW4gb3duIHByb3BlcnR5OiBkYXRhIHZhbHVlLCBvciB0aGUgZ2V0dGVyJ3MgcmVzdWx0LlxuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjdXJyZW50LnZhbHVlLCBrZXkpO1xuXG4gICAgICAgIGNvbnN0IGNoaWxkOiB1bmtub3duID0gZGVzY3JpcHRvcj8uZ2V0XG4gICAgICAgICAgPyBkZXNjcmlwdG9yLmdldC5jYWxsKGN1cnJlbnQudmFsdWUpXG4gICAgICAgICAgOiBkZXNjcmlwdG9yPy52YWx1ZTtcblxuICAgICAgICBpZiAocHJlY2hlY2tVdGY4Qnl0ZXMgJiYgaXNQcmltaXRpdmVUZXh0KGNoaWxkKSkge1xuICAgICAgICAgIGFkZFJhd1V0ZjhMb3dlckJvdW5kKGNoaWxkLCBwYXRoLCBzdGF0ZSwgcmF3VXRmOEJ5dGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGlsZCAhPT0gbnVsbCAmJiBjaGlsZCAhPT0gdW5kZWZpbmVkICYmIE9iamVjdChjaGlsZCkgPT09IGNoaWxkKSB7XG4gICAgICAgICAgc3RhY2sucHVzaCh7IHZhbHVlOiBPYmplY3QoY2hpbGQpLCBkZXB0aCB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogU3RyaW5nIHRlc3QgZm9yIHRoZSBib3VuZGVkIHdhbGsuIEEgZmFpbGVkIHpvZCBwYXJzZSBidWlsZHMgYSBab2RFcnJvciAod2hpY2ggc2VyaWFsaXplcyB0aGVcbiAqIGlucHV0KSwgc28gdGhlIHdhbGsgdXNlcyBpZGVudGl0eTogYSBwcmltaXRpdmUgd2hvc2UgU3RyaW5nKCkgZm9ybSBpcyBpdHNlbGYgaXMgYSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlVGV4dCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHN0cmluZyB7XG4gIHJldHVybiBPYmplY3QodmFsdWUpICE9PSB2YWx1ZSAmJiBTdHJpbmcodmFsdWUpID09PSB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gYWRkUmF3VXRmOExvd2VyQm91bmQoXG4gIHZhbHVlOiBzdHJpbmcsXG4gIHBhdGg6IHN0cmluZyxcbiAgc3RhdGU6IENvbXBsZXhpdHlTdGF0ZSxcbiAgcmF3VXRmOEJ5dGVzOiB7IHZhbHVlOiBudW1iZXIgfSxcbik6IHZvaWQge1xuICByYXdVdGY4Qnl0ZXMudmFsdWUgKz0gQnVmZmVyLmJ5dGVMZW5ndGgodmFsdWUsIFwidXRmOFwiKTtcblxuICBpZiAoc3RhdGUudXRmOEJ5dGVzICsgcmF3VXRmOEJ5dGVzLnZhbHVlID4gQ0FMTEVSX1NDSEVNQV9MSU1JVFMubWF4VXRmOEJ5dGVzKSB7XG4gICAgdGhyb3dMaW1pdEVycm9yKHBhdGgsIFwiVVRGLTggYnl0ZVwiLCBDQUxMRVJfU0NIRU1BX0xJTUlUUy5tYXhVdGY4Qnl0ZXMsIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnREZXB0aFdpdGhpbkxpbWl0KGRlcHRoOiBudW1iZXIsIHBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZGVwdGggPiBDQUxMRVJfU0NIRU1BX0xJTUlUUy5tYXhEZXB0aCkge1xuICAgIHRocm93IG5ldyBDYWxsZXJTY2hlbWFWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBgJHtwYXRofSBleGNlZWRzIGRlcHRoIGxpbWl0IG9mICR7Q0FMTEVSX1NDSEVNQV9MSU1JVFMubWF4RGVwdGh9YCxcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZE5vZGUocGF0aDogc3RyaW5nLCBzdGF0ZTogQ29tcGxleGl0eVN0YXRlKTogdm9pZCB7XG4gIHN0YXRlLm5vZGVzICs9IDE7XG5cbiAgaWYgKHN0YXRlLm5vZGVzID4gQ0FMTEVSX1NDSEVNQV9MSU1JVFMubWF4Tm9kZXMpIHtcbiAgICB0aHJvd0xpbWl0RXJyb3IocGF0aCwgXCJub2RlXCIsIENBTExFUl9TQ0hFTUFfTElNSVRTLm1heE5vZGVzLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdGhyb3dMaW1pdEVycm9yKFxuICBwYXRoOiBzdHJpbmcsXG4gIGtpbmQ6IFwiVVRGLTggYnl0ZVwiIHwgXCJub2RlXCIsXG4gIGxpbWl0OiBudW1iZXIsXG4gIHN0YXRlOiBDb21wbGV4aXR5U3RhdGUsXG4pOiBuZXZlciB7XG4gIHRocm93IG5ldyBDYWxsZXJTY2hlbWFWYWxpZGF0aW9uRXJyb3IoXG4gICAgc3RhdGUuc2NoZW1hcyA9PT0gMFxuICAgICAgPyBgJHtwYXRofSBleGNlZWRzICR7a2luZH0gbGltaXQgb2YgJHtsaW1pdH1gXG4gICAgICA6IGBjYWxsZXIgc2NoZW1hcyBleGNlZWQgYWdncmVnYXRlICR7a2luZH0gbGltaXQgb2YgJHtsaW1pdH1gLFxuICApO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFXQSxNQUFhLHVCQUF1QjtDQUNsQyxjQUFjLE1BQU07Q0FDcEIsVUFBVTtDQUNWLFVBQVU7QUFDWjtB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
|
|
@@ -39,4 +39,4 @@ var SmoothWeightedRoundRobin = class {
|
|
|
39
39
|
//#endregion
|
|
40
40
|
export { SmoothWeightedRoundRobin };
|
|
41
41
|
|
|
42
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21vb3RoLXdlaWdodGVkLXJvdW5kLXJvYmluLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wcm92aWRlcnMvY29tbW9uL3Ntb290aC13ZWlnaHRlZC1yb3VuZC1yb2Jpbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgU21vb3RoV2VpZ2h0ZWRSb3VuZFJvYmluIHtcbiAgcmVhZG9ubHkgd2VpZ2h0cyA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XG4gIHJlYWRvbmx5IGN1cnJlbnRTY29yZXMgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuXG4gIHNldFRva2VuKHRva2VuSWQ6IG51bWJlciwgd2VpZ2h0OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIod2VpZ2h0KSB8fCB3ZWlnaHQgPCAxIHx8IHdlaWdodCA+
|
|
42
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21vb3RoLXdlaWdodGVkLXJvdW5kLXJvYmluLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wcm92aWRlcnMvY29tbW9uL3Ntb290aC13ZWlnaHRlZC1yb3VuZC1yb2Jpbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgU21vb3RoV2VpZ2h0ZWRSb3VuZFJvYmluIHtcbiAgcmVhZG9ubHkgd2VpZ2h0cyA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XG4gIHJlYWRvbmx5IGN1cnJlbnRTY29yZXMgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuXG4gIHNldFRva2VuKHRva2VuSWQ6IG51bWJlciwgd2VpZ2h0OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIod2VpZ2h0KSB8fCB3ZWlnaHQgPCAxIHx8IHdlaWdodCA+IDEwMCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJ3ZWlnaHQgbXVzdCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMTAwXCIpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLndlaWdodHMuZ2V0KHRva2VuSWQpID09PSB3ZWlnaHQpIHJldHVybjtcbiAgICB0aGlzLndlaWdodHMuc2V0KHRva2VuSWQsIHdlaWdodCk7XG4gICAgdGhpcy5yZXNldFNjb3JlcygpO1xuICB9XG5cbiAgcmVtb3ZlVG9rZW4odG9rZW5JZDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLndlaWdodHMuZGVsZXRlKHRva2VuSWQpKSByZXR1cm47XG4gICAgdGhpcy5jdXJyZW50U2NvcmVzLmRlbGV0ZSh0b2tlbklkKTtcbiAgICB0aGlzLnJlc2V0U2NvcmVzKCk7XG4gIH1cblxuICByZXNldFNjb3JlcygpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRTY29yZXMuY2xlYXIoKTtcbiAgfVxuXG4gIHNlbGVjdChlbGlnaWJsZVRva2VuSWRzOiBSZWFkb25seVNldDxudW1iZXI+KTogbnVtYmVyIHwgbnVsbCB7XG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IFsuLi5lbGlnaWJsZVRva2VuSWRzXVxuICAgICAgLmZpbHRlcigodG9rZW5JZCkgPT4gdGhpcy53ZWlnaHRzLmhhcyh0b2tlbklkKSlcbiAgICAgIC50b1NvcnRlZCgoYSwgYikgPT4gYSAtIGIpO1xuXG4gICAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgIGxldCBzZWxlY3RlZCA9IGNhbmRpZGF0ZXNbMF0hO1xuICAgIGxldCBzZWxlY3RlZFNjb3JlID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuICAgIGxldCB0b3RhbFdlaWdodCA9IDA7XG5cbiAgICBjYW5kaWRhdGVzLmZvckVhY2goKHRva2VuSWQpID0+IHtcbiAgICAgIGNvbnN0IHdlaWdodCA9IHRoaXMud2VpZ2h0cy5nZXQodG9rZW5JZCkhO1xuICAgICAgdG90YWxXZWlnaHQgKz0gd2VpZ2h0O1xuICAgICAgY29uc3Qgc2NvcmUgPSAodGhpcy5jdXJyZW50U2NvcmVzLmdldCh0b2tlbklkKSA/PyAwKSArIHdlaWdodDtcbiAgICAgIHRoaXMuY3VycmVudFNjb3Jlcy5zZXQodG9rZW5JZCwgc2NvcmUpO1xuXG4gICAgICBpZiAoc2NvcmUgPiBzZWxlY3RlZFNjb3JlKSB7XG4gICAgICAgIHNlbGVjdGVkID0gdG9rZW5JZDtcbiAgICAgICAgc2VsZWN0ZWRTY29yZSA9IHNjb3JlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5jdXJyZW50U2NvcmVzLnNldChzZWxlY3RlZCwgc2VsZWN0ZWRTY29yZSAtIHRvdGFsV2VpZ2h0KTtcblxuICAgIHJldHVybiBzZWxlY3RlZDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUEsSUFBYSwyQkFBYixNQUFzQztDQUNwQywwQkFBbUIsSUFBSSxJQUFvQjtDQUMzQyxnQ0FBeUIsSUFBSSxJQUFvQjtDQUVqRCxTQUFTLFNBQWlCLFFBQXNCO0VBQzlDLElBQUksQ0FBQyxPQUFPLFVBQVUsTUFBTSxLQUFLLFNBQVMsS0FBSyxTQUFTLEtBQ3RELE1BQU0sSUFBSSxXQUFXLDZDQUE2QztFQUdwRSxJQUFJLEtBQUssUUFBUSxJQUFJLE9BQU8sTUFBTSxRQUFRO0VBQzFDLEtBQUssUUFBUSxJQUFJLFNBQVMsTUFBTTtFQUNoQyxLQUFLLFlBQVk7Q0FDbkI7Q0FFQSxZQUFZLFNBQXVCO0VBQ2pDLElBQUksQ0FBQyxLQUFLLFFBQVEsT0FBTyxPQUFPLEdBQUc7RUFDbkMsS0FBSyxjQUFjLE9BQU8sT0FBTztFQUNqQyxLQUFLLFlBQVk7Q0FDbkI7Q0FFQSxjQUFvQjtFQUNsQixLQUFLLGNBQWMsTUFBTTtDQUMzQjtDQUVBLE9BQU8sa0JBQXNEO0VBQzNELE1BQU0sYUFBYSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsQ0FDckMsUUFBUSxZQUFZLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQzlDLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQztFQUUzQixJQUFJLFdBQVcsV0FBVyxHQUFHLE9BQU87RUFFcEMsSUFBSSxXQUFXLFdBQVc7RUFDMUIsSUFBSSxnQkFBZ0IsT0FBTztFQUMzQixJQUFJLGNBQWM7RUFFbEIsV0FBVyxTQUFTLFlBQVk7R0FDOUIsTUFBTSxTQUFTLEtBQUssUUFBUSxJQUFJLE9BQU87R0FDdkMsZUFBZTtHQUNmLE1BQU0sU0FBUyxLQUFLLGNBQWMsSUFBSSxPQUFPLEtBQUssS0FBSztHQUN2RCxLQUFLLGNBQWMsSUFBSSxTQUFTLEtBQUs7R0FFckMsSUFBSSxRQUFRLGVBQWU7SUFDekIsV0FBVztJQUNYLGdCQUFnQjtHQUNsQjtFQUNGLENBQUM7RUFFRCxLQUFLLGNBQWMsSUFBSSxVQUFVLGdCQUFnQixXQUFXO0VBRTVELE9BQU87Q0FDVDtBQUNGIn0=
|