From df5e3d693c4c71ebaddb1d0e829bbee4bbd77d65 Mon Sep 17 00:00:00 2001 From: steven_li Date: Mon, 16 Mar 2026 11:07:08 +0800 Subject: [PATCH] =?UTF-8?q?feat(runtime-control):=20=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E6=94=B9=E4=B8=BA=E9=80=9A=E8=BF=87AuthZ?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 注册现在通过AuthZ进行处理,而登录/运行时查找仍然使用deploy-control。 更新了API调用逻辑,将注册请求从直接调用deploy-control和instance-api 改为统一调用AuthZ服务。 - 修改了注册API路由(/api/runtime/register)以使用callAuthzService - 更新README.md文档说明新的架构流程 - 添加AUTHZ_API_BASE_URL环境变量配置 - 更新注册页面描述信息 - 移除了不再使用的callDeployControl和callInstanceApi相关代码 --- auth-portal/src/.gitignore | 4 + auth-portal/src/README.md | 3 +- .../src/app/api/runtime/register/route.ts | 16 +- auth-portal/src/app/register/page.tsx | 2 +- auth-portal/src/env_template | 1 + auth-portal/src/lib/runtime-control.ts | 8 + auth-portal/src/tsconfig.tsbuildinfo | 2 +- authz-service/README.md | 2 + authz-service/env_template | 2 + authz-service/src/.gitignore | 3 + authz-service/src/README.md | 8 + authz-service/src/app/main.py | 154 ++++++++++++++++++ authz-service/src/app/models.py | 14 ++ authz-service/src/pyproject.toml | 1 + authz-service/src/uv.lock | 39 +++++ authz-service/start-authz.sh | 4 + 16 files changed, 247 insertions(+), 16 deletions(-) create mode 100644 auth-portal/src/.gitignore create mode 100644 authz-service/src/.gitignore diff --git a/auth-portal/src/.gitignore b/auth-portal/src/.gitignore new file mode 100644 index 0000000..38988bd --- /dev/null +++ b/auth-portal/src/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +.next/ +*.tsbuildinfo +npm-debug.log* diff --git a/auth-portal/src/README.md b/auth-portal/src/README.md index 777a715..ca52b74 100644 --- a/auth-portal/src/README.md +++ b/auth-portal/src/README.md @@ -8,9 +8,10 @@ Dedicated login/register frontend for nanobot containers. ## Env -The portal now talks to the deployment control API on the server side: +Registration now goes through AuthZ, while login/runtime lookup still uses deploy-control: ```bash +AUTHZ_API_BASE_URL=http://127.0.0.1:19090 DEPLOY_API_BASE_URL=http://127.0.0.1:8090 DEPLOY_API_TOKEN=change-me ``` diff --git a/auth-portal/src/app/api/runtime/register/route.ts b/auth-portal/src/app/api/runtime/register/route.ts index 9feac3e..124ca32 100644 --- a/auth-portal/src/app/api/runtime/register/route.ts +++ b/auth-portal/src/app/api/runtime/register/route.ts @@ -1,7 +1,7 @@ import { NextRequest, NextResponse } from 'next/server'; import type { TokenResponse } from '@/types/auth'; -import { HttpError, callDeployControl, callInstanceApi, normalizeTokenResponse } from '@/lib/runtime-control'; +import { HttpError, callAuthzService } from '@/lib/runtime-control'; function errorStatus(error: unknown): number { if (error instanceof HttpError) { @@ -32,23 +32,13 @@ export async function POST(request: NextRequest) { return NextResponse.json({ detail: 'username and password are required' }, { status: 400 }); } - const routing = await callDeployControl<{ - api_base_url?: string; - frontend_base_url?: string; - public_url?: string; - }>('/api/instances/register', { + const response = await callAuthzService('/portal/register', { username, email, password, }); - const response = await callInstanceApi(routing.api_base_url || '', '/api/auth/register', { - username, - email, - password, - }); - - return NextResponse.json(normalizeTokenResponse(response, routing)); + return NextResponse.json(response); } catch (error) { return NextResponse.json({ detail: errorDetail(error) }, { status: errorStatus(error) }); } diff --git a/auth-portal/src/app/register/page.tsx b/auth-portal/src/app/register/page.tsx index 72c47fa..19981fb 100644 --- a/auth-portal/src/app/register/page.tsx +++ b/auth-portal/src/app/register/page.tsx @@ -47,7 +47,7 @@ export default function RegisterPage() {
注册结果 - deploy-control 会创建实例,AuthZ 再补齐 backend 身份,auth portal 最后把你转交到该实例前端。 + AuthZ 会编排 deploy-control 创建实例,并完成 backend 身份初始化,auth portal 最后把你转交到该实例前端。
目标页面 diff --git a/auth-portal/src/env_template b/auth-portal/src/env_template index 4af3936..bd13d3f 100644 --- a/auth-portal/src/env_template +++ b/auth-portal/src/env_template @@ -1,2 +1,3 @@ +AUTHZ_API_BASE_URL=http://127.0.0.1:19090 DEPLOY_API_BASE_URL=http://127.0.0.1:8090 DEPLOY_API_TOKEN=change-me diff --git a/auth-portal/src/lib/runtime-control.ts b/auth-portal/src/lib/runtime-control.ts index 833f355..fca36d4 100644 --- a/auth-portal/src/lib/runtime-control.ts +++ b/auth-portal/src/lib/runtime-control.ts @@ -1,5 +1,6 @@ import type { TokenResponse } from '@/types/auth'; +const AUTHZ_API_BASE_URL = (process.env.AUTHZ_API_BASE_URL || 'http://127.0.0.1:19090').trim().replace(/\/+$/, ''); const DEPLOY_API_BASE_URL = (process.env.DEPLOY_API_BASE_URL || 'http://127.0.0.1:8090').trim().replace(/\/+$/, ''); const DEPLOY_API_TOKEN = (process.env.DEPLOY_API_TOKEN || '').trim(); const REQUEST_TIMEOUT_MS = 15000; @@ -79,6 +80,13 @@ export async function callDeployControl(path: string, payload: JsonObject): P }); } +export async function callAuthzService(path: string, payload: JsonObject): Promise { + return fetchJson(`${AUTHZ_API_BASE_URL}${path}`, { + method: 'POST', + body: JSON.stringify(payload), + }); +} + export async function callInstanceApi(apiBaseUrl: string, path: string, payload: JsonObject): Promise { const baseUrl = apiBaseUrl.trim().replace(/\/+$/, ''); if (!baseUrl) { diff --git a/auth-portal/src/tsconfig.tsbuildinfo b/auth-portal/src/tsconfig.tsbuildinfo index 7438eac..71aa115 100644 --- a/auth-portal/src/tsconfig.tsbuildinfo +++ b/auth-portal/src/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"program":{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.es2023.d.ts","./node_modules/typescript/lib/lib.esnext.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/typescript/lib/lib.es2023.collection.d.ts","./node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.esnext.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/next/dist/styled-jsx/types/css.d.ts","./node_modules/@types/react/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/prop-types/index.d.ts","./node_modules/@types/react/index.d.ts","./node_modules/next/dist/styled-jsx/types/index.d.ts","./node_modules/next/dist/styled-jsx/types/macro.d.ts","./node_modules/next/dist/styled-jsx/types/style.d.ts","./node_modules/next/dist/styled-jsx/types/global.d.ts","./node_modules/next/dist/shared/lib/amp.d.ts","./node_modules/next/amp.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/dom-events.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/globals.global.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/next/dist/server/get-page-files.d.ts","./node_modules/@types/react/canary.d.ts","./node_modules/@types/react/experimental.d.ts","./node_modules/@types/react-dom/index.d.ts","./node_modules/@types/react-dom/canary.d.ts","./node_modules/@types/react-dom/experimental.d.ts","./node_modules/next/dist/compiled/webpack/webpack.d.ts","./node_modules/next/dist/server/config.d.ts","./node_modules/next/dist/lib/load-custom-routes.d.ts","./node_modules/next/dist/shared/lib/image-config.d.ts","./node_modules/next/dist/build/webpack/plugins/subresource-integrity-plugin.d.ts","./node_modules/next/dist/server/body-streams.d.ts","./node_modules/next/dist/server/future/route-kind.d.ts","./node_modules/next/dist/server/future/route-definitions/route-definition.d.ts","./node_modules/next/dist/server/future/route-matches/route-match.d.ts","./node_modules/next/dist/client/components/app-router-headers.d.ts","./node_modules/next/dist/server/request-meta.d.ts","./node_modules/next/dist/server/config-shared.d.ts","./node_modules/next/dist/server/base-http/index.d.ts","./node_modules/next/dist/server/api-utils/index.d.ts","./node_modules/next/dist/server/node-environment.d.ts","./node_modules/next/dist/server/require-hook.d.ts","./node_modules/next/dist/server/node-polyfill-fetch.d.ts","./node_modules/next/dist/server/node-polyfill-form.d.ts","./node_modules/next/dist/server/node-polyfill-web-streams.d.ts","./node_modules/next/dist/server/node-polyfill-crypto.d.ts","./node_modules/next/dist/build/analysis/get-page-static-info.d.ts","./node_modules/next/dist/build/webpack/loaders/get-module-build-info.d.ts","./node_modules/next/dist/build/webpack/plugins/middleware-plugin.d.ts","./node_modules/next/dist/lib/setup-exception-listeners.d.ts","./node_modules/next/dist/build/index.d.ts","./node_modules/next/dist/server/response-cache/types.d.ts","./node_modules/next/dist/server/response-cache/index.d.ts","./node_modules/next/dist/server/lib/incremental-cache/index.d.ts","./node_modules/next/dist/client/components/hooks-server-context.d.ts","./node_modules/next/dist/client/components/static-generation-async-storage.external.d.ts","./node_modules/next/dist/server/pipe-readable.d.ts","./node_modules/next/dist/server/render-result.d.ts","./node_modules/next/dist/server/future/helpers/i18n-provider.d.ts","./node_modules/next/dist/server/web/next-url.d.ts","./node_modules/next/dist/compiled/@edge-runtime/cookies/index.d.ts","./node_modules/next/dist/server/web/spec-extension/cookies.d.ts","./node_modules/next/dist/server/web/spec-extension/request.d.ts","./node_modules/next/dist/server/web/spec-extension/fetch-event.d.ts","./node_modules/next/dist/server/web/spec-extension/response.d.ts","./node_modules/next/dist/server/web/types.d.ts","./node_modules/next/dist/build/webpack/plugins/pages-manifest-plugin.d.ts","./node_modules/next/dist/server/send-payload/revalidate-headers.d.ts","./node_modules/next/dist/server/send-payload/index.d.ts","./node_modules/next/dist/shared/lib/router/utils/route-regex.d.ts","./node_modules/next/dist/shared/lib/router/utils/route-matcher.d.ts","./node_modules/next/dist/server/base-http/node.d.ts","./node_modules/next/dist/shared/lib/router/utils/parse-url.d.ts","./node_modules/next/dist/server/font-utils.d.ts","./node_modules/next/dist/build/webpack/plugins/flight-manifest-plugin.d.ts","./node_modules/next/dist/server/future/route-modules/route-module.d.ts","./node_modules/next/dist/server/load-components.d.ts","./node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.d.ts","./node_modules/next/dist/build/webpack/plugins/next-font-manifest-plugin.d.ts","./node_modules/next/dist/server/render.d.ts","./node_modules/next/dist/server/future/route-definitions/locale-route-definition.d.ts","./node_modules/next/dist/server/future/route-definitions/pages-api-route-definition.d.ts","./node_modules/next/dist/server/future/route-matches/pages-api-route-match.d.ts","./node_modules/next/dist/server/future/route-matchers/route-matcher.d.ts","./node_modules/next/dist/server/future/route-matcher-providers/route-matcher-provider.d.ts","./node_modules/next/dist/server/future/route-matcher-managers/route-matcher-manager.d.ts","./node_modules/next/dist/server/future/normalizers/normalizer.d.ts","./node_modules/next/dist/server/future/normalizers/locale-route-normalizer.d.ts","./node_modules/next/dist/server/base-server.d.ts","./node_modules/next/dist/server/lib/router-utils/types.d.ts","./node_modules/next/dist/server/lib/render-server.d.ts","./node_modules/next/dist/server/image-optimizer.d.ts","./node_modules/next/dist/server/next-server.d.ts","./node_modules/next/dist/server/dev/static-paths-worker.d.ts","./node_modules/next/dist/server/dev/next-dev-server.d.ts","./node_modules/next/dist/server/next.d.ts","./node_modules/next/dist/lib/metadata/types/alternative-urls-types.d.ts","./node_modules/next/dist/lib/metadata/types/extra-types.d.ts","./node_modules/next/dist/lib/metadata/types/metadata-types.d.ts","./node_modules/next/dist/lib/metadata/types/manifest-types.d.ts","./node_modules/next/dist/lib/metadata/types/opengraph-types.d.ts","./node_modules/next/dist/lib/metadata/types/twitter-types.d.ts","./node_modules/next/dist/lib/metadata/types/metadata-interface.d.ts","./node_modules/next/types/index.d.ts","./node_modules/next/dist/shared/lib/html-context.shared-runtime.d.ts","./node_modules/@next/env/dist/index.d.ts","./node_modules/next/dist/shared/lib/mitt.d.ts","./node_modules/next/dist/client/with-router.d.ts","./node_modules/next/dist/client/router.d.ts","./node_modules/next/dist/client/route-loader.d.ts","./node_modules/next/dist/client/page-loader.d.ts","./node_modules/next/dist/shared/lib/bloom-filter.d.ts","./node_modules/next/dist/shared/lib/router/router.d.ts","./node_modules/next/dist/shared/lib/modern-browserslist-target.d.ts","./node_modules/next/dist/shared/lib/constants.d.ts","./node_modules/next/dist/shared/lib/utils.d.ts","./node_modules/next/dist/pages/_app.d.ts","./node_modules/next/app.d.ts","./node_modules/next/dist/server/web/spec-extension/unstable-cache.d.ts","./node_modules/next/dist/server/web/spec-extension/revalidate-path.d.ts","./node_modules/next/dist/server/web/spec-extension/revalidate-tag.d.ts","./node_modules/next/cache.d.ts","./node_modules/next/dist/shared/lib/runtime-config.external.d.ts","./node_modules/next/config.d.ts","./node_modules/next/dist/pages/_document.d.ts","./node_modules/next/document.d.ts","./node_modules/next/dist/shared/lib/dynamic.d.ts","./node_modules/next/dynamic.d.ts","./node_modules/next/dist/pages/_error.d.ts","./node_modules/next/error.d.ts","./node_modules/next/dist/shared/lib/head.d.ts","./node_modules/next/head.d.ts","./node_modules/next/dist/shared/lib/get-img-props.d.ts","./node_modules/next/dist/client/image-component.d.ts","./node_modules/next/dist/shared/lib/image-external.d.ts","./node_modules/next/image.d.ts","./node_modules/next/dist/client/link.d.ts","./node_modules/next/link.d.ts","./node_modules/next/router.d.ts","./node_modules/next/dist/client/script.d.ts","./node_modules/next/script.d.ts","./node_modules/next/dist/server/web/spec-extension/user-agent.d.ts","./node_modules/next/dist/compiled/@edge-runtime/primitives/url.d.ts","./node_modules/next/dist/compiled/@vercel/og/satori/index.d.ts","./node_modules/next/dist/compiled/@vercel/og/emoji/index.d.ts","./node_modules/next/dist/compiled/@vercel/og/types.d.ts","./node_modules/next/dist/compiled/@vercel/og/index.node.d.ts","./node_modules/next/dist/server/web/spec-extension/image-response.d.ts","./node_modules/next/server.d.ts","./node_modules/next/types/global.d.ts","./node_modules/next/index.d.ts","./node_modules/next/image-types/global.d.ts","./next-env.d.ts","./types/auth.ts","./lib/runtime-control.ts","./app/api/runtime/login/route.ts","./app/api/runtime/register/route.ts","./lib/auth-client.ts","./app/layout.tsx","./node_modules/next/dist/shared/lib/server-inserted-html.shared-runtime.d.ts","./node_modules/next/dist/client/components/redirect.d.ts","./node_modules/next/dist/client/components/not-found.d.ts","./node_modules/zod/lib/helpers/typeAliases.d.ts","./node_modules/zod/lib/helpers/util.d.ts","./node_modules/zod/lib/ZodError.d.ts","./node_modules/zod/lib/locales/en.d.ts","./node_modules/zod/lib/errors.d.ts","./node_modules/zod/lib/helpers/parseUtil.d.ts","./node_modules/zod/lib/helpers/enumUtil.d.ts","./node_modules/zod/lib/helpers/errorUtil.d.ts","./node_modules/zod/lib/helpers/partialUtil.d.ts","./node_modules/zod/lib/types.d.ts","./node_modules/zod/lib/external.d.ts","./node_modules/zod/lib/index.d.ts","./node_modules/zod/index.d.ts","./node_modules/next/dist/server/app-render/types.d.ts","./node_modules/next/dist/client/components/router-reducer/fetch-server-response.d.ts","./node_modules/next/dist/client/components/router-reducer/router-reducer-types.d.ts","./node_modules/next/dist/shared/lib/app-router-context.shared-runtime.d.ts","./node_modules/next/dist/client/components/navigation.d.ts","./node_modules/next/navigation.d.ts","./app/page.tsx","./app/login/page.tsx","./app/register/page.tsx","./node_modules/@types/scheduler/index.d.ts"],"fileInfos":[{"version":"2ac9cdcfb8f8875c18d14ec5796a8b029c426f73ad6dc3ffb580c228b58d1c44","affectsGlobalScope":true},"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","dc48272d7c333ccf58034c0026162576b7d50ea0e69c3b9292f803fc20720fd5","9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","5514e54f17d6d74ecefedc73c504eadffdeda79c7ea205cf9febead32d45c4bc","1c0cdb8dc619bc549c3e5020643e7cf7ae7940058e8c7e5aefa5871b6d86f44b","bed7b7ba0eb5a160b69af72814b4dde371968e40b6c5e73d3a9f7bee407d158c",{"version":"0075fa5ceda385bcdf3488e37786b5a33be730e8bc4aa3cf1e78c63891752ce8","affectsGlobalScope":true},{"version":"35299ae4a62086698444a5aaee27fc7aa377c68cbb90b441c9ace246ffd05c97","affectsGlobalScope":true},{"version":"f296963760430fb65b4e5d91f0ed770a91c6e77455bacf8fa23a1501654ede0e","affectsGlobalScope":true},{"version":"09226e53d1cfda217317074a97724da3e71e2c545e18774484b61562afc53cd2","affectsGlobalScope":true},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true},{"version":"8b41361862022eb72fcc8a7f34680ac842aca802cf4bc1f915e8c620c9ce4331","affectsGlobalScope":true},{"version":"f7bd636ae3a4623c503359ada74510c4005df5b36de7f23e1db8a5c543fd176b","affectsGlobalScope":true},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true},{"version":"0c20f4d2358eb679e4ae8a4432bdd96c857a2960fd6800b21ec4008ec59d60ea","affectsGlobalScope":true},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true},{"version":"82d0d8e269b9eeac02c3bd1c9e884e85d483fcb2cd168bccd6bc54df663da031","affectsGlobalScope":true},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true},{"version":"b8deab98702588840be73d67f02412a2d45a417a3c097b2e96f7f3a42ac483d1","affectsGlobalScope":true},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true},{"version":"376d554d042fb409cb55b5cbaf0b2b4b7e669619493c5d18d5fa8bd67273f82a","affectsGlobalScope":true},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true},{"version":"c4138a3dd7cd6cf1f363ca0f905554e8d81b45844feea17786cdf1626cb8ea06","affectsGlobalScope":true},{"version":"6ff3e2452b055d8f0ec026511c6582b55d935675af67cdb67dd1dc671e8065df","affectsGlobalScope":true},{"version":"03de17b810f426a2f47396b0b99b53a82c1b60e9cba7a7edda47f9bb077882f4","affectsGlobalScope":true},{"version":"8184c6ddf48f0c98429326b428478ecc6143c27f79b79e85740f17e6feb090f1","affectsGlobalScope":true},{"version":"261c4d2cf86ac5a89ad3fb3fafed74cbb6f2f7c1d139b0540933df567d64a6ca","affectsGlobalScope":true},{"version":"6af1425e9973f4924fca986636ac19a0cf9909a7e0d9d3009c349e6244e957b6","affectsGlobalScope":true},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true},{"version":"15a630d6817718a2ddd7088c4f83e4673fde19fa992d2eae2cf51132a302a5d3","affectsGlobalScope":true},{"version":"b7e9f95a7387e3f66be0ed6db43600c49cec33a3900437ce2fd350d9b7cb16f2","affectsGlobalScope":true},{"version":"01e0ee7e1f661acedb08b51f8a9b7d7f959e9cdb6441360f06522cc3aea1bf2e","affectsGlobalScope":true},{"version":"ac17a97f816d53d9dd79b0d235e1c0ed54a8cc6a0677e9a3d61efb480b2a3e4e","affectsGlobalScope":true},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true},{"version":"ec0104fee478075cb5171e5f4e3f23add8e02d845ae0165bfa3f1099241fa2aa","affectsGlobalScope":true},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true},{"version":"9cc66b0513ad41cb5f5372cca86ef83a0d37d1c1017580b7dace3ea5661836df","affectsGlobalScope":true},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true},{"version":"709efdae0cb5df5f49376cde61daacc95cdd44ae4671da13a540da5088bf3f30","affectsGlobalScope":true},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true},{"version":"bc496ef4377553e461efcf7cc5a5a57cf59f9962aea06b5e722d54a36bf66ea1","affectsGlobalScope":true},{"version":"038a2f66a34ee7a9c2fbc3584c8ab43dff2995f8c68e3f566f4c300d2175e31e","affectsGlobalScope":true},{"version":"4fa6ed14e98aa80b91f61b9805c653ee82af3502dc21c9da5268d3857772ca05","affectsGlobalScope":true},{"version":"f5c92f2c27b06c1a41b88f6db8299205aee52c2a2943f7ed29bd585977f254e8","affectsGlobalScope":true},{"version":"930b0e15811f84e203d3c23508674d5ded88266df4b10abee7b31b2ac77632d2","affectsGlobalScope":true},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true},{"version":"b9ea5778ff8b50d7c04c9890170db34c26a5358cccba36844fe319f50a43a61a","affectsGlobalScope":true},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true},{"version":"50d53ccd31f6667aff66e3d62adf948879a3a16f05d89882d1188084ee415bbc","affectsGlobalScope":true},{"version":"65be38e881453e16f128a12a8d36f8b012aa279381bf3d4dc4332a4905ceec83","affectsGlobalScope":true},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true},{"version":"307c8b7ebbd7f23a92b73a4c6c0a697beca05b06b036c23a34553e5fe65e4fdc","affectsGlobalScope":true},{"version":"e1913f656c156a9e4245aa111fbb436d357d9e1fe0379b9a802da7fe3f03d736","affectsGlobalScope":true},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true},{"version":"f35a831e4f0fe3b3697f4a0fe0e3caa7624c92b78afbecaf142c0f93abfaf379","affectsGlobalScope":true},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true},"0990a7576222f248f0a3b888adcb7389f957928ce2afb1cd5128169086ff4d29",{"version":"549df62b64a71004aee17685b445a8289013daf96246ce4d9b087d13d7a27a61","affectsGlobalScope":true},"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","87d9d29dbc745f182683f63187bf3d53fd8673e5fca38ad5eaab69798ed29fbc",{"version":"a6e6089d668ad148f1dc5435a06e6a4c0b06b0796eabad6e3a07328f57a94955","affectsGlobalScope":true},"cc69795d9954ee4ad57545b10c7bf1a7260d990231b1685c147ea71a6faa265c","8bc6c94ff4f2af1f4023b7bb2379b08d3d7dd80c698c9f0b07431ea16101f05f","1b61d259de5350f8b1e5db06290d31eaebebc6baafd5f79d314b5af9256d7153","57194e1f007f3f2cbef26fa299d4c6b21f4623a2eddc63dfeef79e38e187a36e","0f6666b58e9276ac3a38fdc80993d19208442d6027ab885580d93aec76b4ef00","05fd364b8ef02fb1e174fbac8b825bdb1e5a36a016997c8e421f5fab0a6da0a0","8820d4b6f3277e897854b14519e56fea0877b0c22d33815081d0ac42c758b75c","a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a",{"version":"d32f90e6cf32e99c86009b5f79fa50bc750fe54e17137d9bb029c377a2822ee2","affectsGlobalScope":true},"71b4526fb5932511db801d844180291cbe1d74985ef0994b6e2347b7a9b39e10",{"version":"625b214f6ef885f37e5e38180897227075f4df11e7ac8f89d8c5f12457a791b2","affectsGlobalScope":true},"5d43adfdfaeebcf67b08e28eec221b0898ca55fe3cfdcbce2b571d6bdb0fa6f4","8fe65c60df7504b1bcbaec2a088a2bff5d7b368dc0a7966d0dbe8f1c8939c146",{"version":"49479e21a040c0177d1b1bc05a124c0383df7a08a0726ad4d9457619642e875a","affectsGlobalScope":true},"9e390110944981c9428647e2aa14fcffafe99cfe87b15f5e805203f0a4ab0153","e2d8f78894fd5164be13866c76774c43c90ca09d139062665d9be8676989ea5e","76f3fbf450d6a290f6dfc4b255d845e3d3983ebe97d355b1549d3ef324389d4b","5c8bd6a332f932c7f7374b95d3cb4f37b3851c0a9ab58a9133944588b14d2675","0434286811d0ec5b4d828aff611fdf86e33d46dd6419f3df9ed92c644d92a14d","9113b9f010e6bf1ff940e1742fd733d66a3d4b020f14800b8d632a9f61a0dc01","2c5517a55ec36c37320f3202e87905bded4d9625b8e30b779c9ba635df599430",{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true},{"version":"32a7b6e7275912b8fbb8c143ff4eeb92b72f83155b48988c30761d69ffeb60f7","affectsGlobalScope":true},"2fb37a76de96cabd401e61bbdd4016799fc24585f96f494bfccb63825ed3fea6","c9cf880485dd30cda73200d52fe126accab426bbb21dc6d3fcdf8541265675c1","cb0cda9e99405f1b8118d46f9535e8f9681bb47c9f83bb3ceb80e99af4d93fee","1bedee1d03d259bf856a1c8cd7c183f1eea9a905f5b02978ecfa47161e597602","5262206d8fe3089bbd1a076cea3da9c9ef6a340e5fa4059c392d400c1964b679","47a0fda775c89671a3705ce925a837cf12b5268bf4ee46a129e12344791c17b6",{"version":"d0a454adb7d0ce354a8c145ef6245d81e2b717fe6908142522eafc2661229e75","affectsGlobalScope":true},"6467de6d1b3c0f03867347567d2d4c33fbea7a572082203149b2c2a591fea13f","4de63c30726b2c653278d8432f5b28cd8ac2afd112dd2f9b025b9bec70d53655","9aff938f442b8e8d5fc5e78c79fed33db2149a3428518519a5fc4d1b7d269d62",{"version":"e626f299569eefa361164975aae1df5e43d2f1b4fde2dc73f882920c6c8db51c","affectsGlobalScope":true},{"version":"087686bf5f9ed81b703f92a2e0544ed494dac0da42aba0ec517f8ffd8352da8b","affectsGlobalScope":true},"bfe95d6a23ba0bc20a0cde03b53d4530ba2bc7f98a92da6ef36bb3ed8ee1a8ab","61e02d13e598146b83a754e285b186da796ff1372893fa64ee1f939284958a07","9b974e1a1d5df0df99045d82407704e5e9ff0e66f497ae4fed5a3a091d46fbea","0db6e6dc5e6caad7389b6287f74e62c0e7fe3dd5b6cd39de0c62907fffbd0576","4e1e712f478183a6a3ff8937a22557d6327e403d7467bfb6b3372c11d82cb76f","24f824ad358f6799e6a2409e248ede18652cae6ce124e9fd41faf13d7a0a1324","f59166827125fba0699710f461c206a25889636c23e2c1383b3053010717ca24","e94f2232bbd613dfaa65c586fe6911734cabc679670e5915b374bec69a716c36","4b73a5ad969173b5ab7047023e477eed5faee5aabb768439b75cee6e9d0b03a2","6d581bc758d3f4c35052d87f6f40c9a4c87f1906ce80de842ce1ef4df17f5b97",{"version":"a54ee34c2cc03ec4bbf0c9b10a08b9f909a21b3314f90a743de7b12b85867cef","affectsGlobalScope":true},{"version":"da89bfd4e3191339bb141434d8e714039617939fa7fc92b3924c288d053ec804","affectsGlobalScope":true},"b860ef7c7864bc87e8e0ebbf1cc6e51a6733926c017f8282e595490495a3f0eb","d3295359ae7abb41a1781105fefb501065ae81d4957ce539b8e513d0ac720c1d","b8e1cba3aedc0673796772a9c30b1343a0f188454b48ddf507b56e0fccbcb7a8","18af2140d025adf83a9a2933c245b4c95f822020e7fedb02c92592e72dfae12a",{"version":"66d3421e032f6fb8474f31e7ff0d54994dea1ff736d4303d24ea67240116f806","affectsGlobalScope":true},{"version":"803daee46683593a3cfd2949bed70bb21b4e36adcaa3d3b43ffd036ed361f832","affectsGlobalScope":true},"b76a0cbccf8d46bfbdf34f20af3de072b613813327e7eea74a5f9bdd55bb683a","6d4161785afef5bbfa5ffb4e607fcb2594b6e8dcbc40557f01ae22b3f67a4b72","30a211c426e095de60924262e4e43455ee7c88975aba4136eced97ee0de9b22d",{"version":"31a3c2c16b0d7e45f15c13648e22635bc873068a1cc1c36a2b4894711587202a","affectsGlobalScope":true},"9a6a91f0cd6a2bd8635bb68c4ae38e3602d4064c9fb74617e7094ae3bf5fe7c2",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"13e851ee5f3dad116583e14e9d3f4aaf231194bbb6f4b969dc7446ae98a3fa73","8caa5c86be1b793cd5f599e27ecb34252c41e011980f7d61ae4989a149ff6ccc","72b9a5e3faa0569def625ec0e50cf91fe1aa8e527af85bbc7181113821684016","fd2355eaf50b2c1b9cd00eeacef19d8f098199d1b4facdc065e162780e4651f8","a95b76aef31395752eb5cb7b386be2e287fdc32dfdf7bdbbb666e333133b1ef7","bd2c377599828b9f08f7de649d3453545f0b4a9c09de7074e9208b60eba73314","cdc2a15950c3f418c9fe84cf7f556bc3edef28dd2989d3a706b5197e5b4d09f2","db6d2d9daad8a6d83f281af12ce4355a20b9a3e71b82b9f57cddcca0a8964a96","eb4b9a746cc7326485e091731e98708acf669c314348c72a88f8ed7a684c719e","cbea99888785d49bb630dcbb1613c73727f2b5a2cf02e1abcaab7bcf8d6bf3c5","a3f1220f5331589384d77ed650001719baac21fcbed91e36b9abc5485b06335a","a86f82d646a739041d6702101afa82dcb935c416dd93cbca7fd754fd0282ce1f","6ceac05c32f579adbed2f1a9c98cd297de3c00a3caaffc423385d00e82bce4ce","fa5bbc7ab4130dd8cdc55ea294ec39f76f2bc507a0f75f4f873e38631a836ca7","abb8aec2e3346d3ad3ad7d050306e86b09e6baeff73e420058ac9f72b9a6f9a1","cf86de1054b843e484a3c9300d62fbc8c97e77f168bbffb131d560ca0474d4a8","37f7b8e560025858aae5195ca74a3e95ecd55591e2babc0acd57bc1dab4ea8ea","24687523374b3ee67cd2499475dde9f08dd9a254a020dd06b4251761ab30834c","11a87146cd98ffa649cc26865b8690a9420258b4d7526e23b2d9275bb360fd1d","653060b69b4c62825fca79d91259a5f42736f56dba428322b36cfae593ee8359","b7b3258e8d47333721f9d4c287361d773f8fa88e52d1148812485d9fc06d2577","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","49e567e0aa388ab416eeb7a7de9bce5045a7b628bad18d1f6fa9d3eacee7bc3f","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","8a8bf772f83e9546b61720cf3b9add9aa4c2058479ad0d8db0d7c9fd948c4eaf","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","eed041005bb5e595e276684cb5ed194ab19205504f4cd0e41de754a622f22964","aeb888c84e570f3aea036de32da9b6f2c0ab204af27cb550753e897598ac63e0","4c91cc1ab59b55d880877ccf1999ded0bb2ebc8e3a597c622962d65bf0e76be8","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e1c9c204454567f39c3fdcb102871ccb750f44899dfbe29df3404f4da94d647f","2d0fe1768fcbed8a61709d1deebcd1bd21b1b4fc42cd233e1c335e1432d58aa9","3cd0346fc79e262233785d9fe2cbad08fc3fe6339af3419791687152ddfe5596","ccc2b7e6bc181b89049fd416f286d09545c685a817e2230ca938fcec023f8c4f","d23518a5f155f1a3e07214baf0295687507122ae2e6e9bd5e772551ebd4b3157","b17d9f0b2bad7fed990e5d96adecd847302de584f3083fe5d1a727c020eedc23","7766763be661053bee846b36fd78f4c99f7a3633d25fc301ac0f70aa95d56d08","55f080a632a591ccb5d7c1b5d37fd617d8b9014434adf077b2da3ac3177928cc","e8da637cbd6ed1cf6c36e9424f6bcee4515ca2c677534d4006cbd9a05f930f0c","ca1b882a105a1972f82cc58e3be491e7d750a1eb074ffd13b198269f57ed9e1b","9214131d35f51d70cb3bddc3fd4f7c172d9dc4f7b7d512a1d371ed72e120a3c4","3867ca0e9757cc41e04248574f4f07b8f9e3c0c2a796a5eb091c65bfd2fc8bdb","6c66f6f7d9ff019a644ff50dd013e6bf59be4bf389092948437efa6b77dc8f9a","58902668adae2e5eb67efbccb4048afa02308fa684f1a4e4c7d47668ecf58c1b","ef2d1bd01d144d426b72db3744e7a6b6bb518a639d5c9c8d86438fb75a3b1934","b50e6d569520af07eb7c9d95ce1325d10c19b9ea6d97f8edb0f0ef102a5fa900","476c48dfa7aef1b279542a1d90018f67912b3c970e147b77c2d8063c40c06b24","17937316a2f7f362dd6375251a9ce9e4960cfdc0aa7ba6cbd00656f7ab92334b","be2d91ce0cef98ac6a467d0b48813d78ae0a54d5f1a994afb16018a6b45f711d","973b59a17aaa817eb205baf6c132b83475a5c0a44e8294a472af7793b1817e89","ada39cbb2748ab2873b7835c90c8d4620723aedf323550e8489f08220e477c7f","a7a92f071d6891b2fa6542e343bdebc819492e6e14db37563bb71b8bd7e9b83f","6e5f5cee603d67ee1ba6120815497909b73399842254fc1e77a0d5cdc51d8c9c","99ace27cc2c78ef0fe3f92f11164eca7494b9f98a49ee0a19ede0a4c82a6a800","c89845d0f0fe40e7f8c423645f1577b91b6d67790eb6f394eb66779035f3a52e","ef61792acbfa8c27c9bd113f02731e66229f7d3a169e3c1993b508134f1a58e0","609e9dc4bb74cdfd2b9c89ade164e2c4032d92e903f2cbf2ca96dd3b76158b6e","f6404e7837b96da3ea4d38c4f1a3812c96c9dcdf264e93d5bdb199f983a3ef4b","c5426dbfc1cf90532f66965a7aa8c1136a78d4d0f96d8180ecbfc11d7722f1a5","84ddb2dd959dfcfb7e05783d94b6fa372ee5b0137152ab7de918740a83e12d0e","c1ac179620434b59c1569f2964a5c7354037ac91a212a1fb281673589965c893","9f891dc96f3e9343c4e823ba28195fd77e59c84199696a8bdfe7b67925732409","bae6dd176832f6423966647382c0d7ba9e63f8c167522f09a982f086cd4e8b23","1364f64d2fb03bbb514edc42224abd576c064f89be6a990136774ecdd881a1da","741c438ec079a077b08d37d9c0466924b68e98ed47224e83fcb125c5863eb355","fa34a00e044e9a3a6044abdb52d38bc7877ff1d6348aa79be99774e413c2568a","e927c2c13c4eaf0a7f17e6022eee8519eb29ef42c4c13a31e81a611ab8c95577","1822b69406252b606dc1aec3231a7104ac1d456cfa2c0a9041e61061895ae348","b4733aeb29c348d5dbc4eb3df22a8c00f311372504571ca1747c4cc318e515e0","f416c9c3eee9d47ff49132c34f96b9180e50485d435d5748f0e8b72521d28d2e","006da9ad49d319f6a47444c8ad2afb5ee2135f50990ae336d614c1e66e2bee9d","2a36120d258dfa9e6f4a7ba709984b767741025502fb75960226675bf9968ae3","1bbbfdb608c03f858adda0f378477daf74d4519e74c414e68096d465a75a9d75","0ca7b4d6520e97f9394853874bc4a1574b88f815747a0f5956005ddf9742e38d","dacc544b815d4e54ae4e039de4ce03c0a3bcbfbcaa01cd6512c4eb6aa22a0c1d","78aede3751e6d5755ea9bbb6850a4dda573e41a4ca2c367e9bdf133ecb68dc54","a1c8542ed1189091dd39e732e4390882a9bcd15c0ca093f6e9483eba4e37573f","a805c88b28da817123a9e4c45ceb642ef0154c8ea41ea3dde0e64a70dde7ac5f","3a17f09634c50cce884721f54fd9e7b98e03ac505889c560876291fcf8a09e90","32531dfbb0cdc4525296648f53b2b5c39b64282791e2a8c765712e49e6461046","0ce1b2237c1c3df49748d61568160d780d7b26693bd9feb3acb0744a152cd86d","e489985388e2c71d3542612685b4a7db326922b57ac880f299da7026a4e8a117","ce6530262460220d8f2ac48df1e2e605dad9303af59e2a9ba5c43f4f5c0adc7f",{"version":"6d3ee1bc1bc2fc2f4d448f2ffd1ec5c8cdd6690591d9c6a3bd71178c5e98f03c","affectsGlobalScope":true},"fd1b9d883b9446f1e1da1e1033a6a98995c25fbf3c10818a78960e2f2917d10c","19252079538942a69be1645e153f7dbbc1ef56b4f983c633bf31fe26aeac32cd","de9d2df7663e64e3a91bf495f315a7577e23ba088f2949d5ce9ec96f44fba37d","c7af78a2ea7cb1cd009cfb5bdb48cd0b03dad3b54f6da7aab615c2e9e9d570c5","1dc574e42493e8bf9bb37be44d9e38c5bd7bbc04f884e5e58b4d69636cb192b3",{"version":"f14c2bb33b3272bbdfeb0371eb1e337c9677cb726274cf3c4c6ea19b9447a666","affectsGlobalScope":true},{"version":"db01d18853469bcb5601b9fc9826931cc84cc1a1944b33cad76fd6f1e3d8c544","affectsGlobalScope":true},"6b8e8c0331a0c2e9fb53b8b0d346e44a8db8c788dae727a2c52f4cf3bd857f0d",{"version":"0aa0f0184c0f9635dd1b95c178223aa262bb01ec8ac7b39c911ef2bd32b8f65b","affectsGlobalScope":true},"ec29be0737d39268696edcec4f5e97ce26f449fa9b7afc2f0f99a86def34a418","3bfd9f50a763cd7f22edc2c0ce8d2f4b7bf703003ceae3f63ac86ac939af2522","f0489f34d2dee69b61e21b82edefe0c21272fc353f0149e7d8d3e5690a46df19","edaa27d57d30467edc63e9da7e7196acd315b02071f2c7ecd8475085a5cab9a2","65c24a8baa2cca1de069a0ba9fba82a173690f52d7e2d0f1f7542d59d5eb4db0","ec9fd890d681789cb0aa9efbc50b1e0afe76fbf3c49c3ac50ff80e90e29c6bcb","5fbd292aa08208ae99bf06d5da63321fdc768ee43a7a104980963100a3841752","9eac5a6beea91cfb119688bf44a5688b129b804ede186e5e2413572a534c21bb","6c292de17d4e8763406421cb91f545d1634c81486d8e14fceae65955c119584e","b7fff2d004c5879cae335db8f954eb1d61242d9f2d28515e67902032723caeab","5f3dc10ae646f375776b4e028d2bed039a93eebbba105694d8b910feebbe8b9c","145d0d6d3e07786d18ac835cc2129c073b2a8737d05a57a7287b0de64ab08ca2","4545c1a1ceca170d5d83452dd7c4994644c35cf676a671412601689d9a62da35","15959543f93f27e8e2b1a012fe28e14b682034757e2d7a6c1f02f87107fc731e","a2d648d333cf67b9aeac5d81a1a379d563a8ffa91ddd61c6179f68de724260ff","4e828bf688597c32905215785730cbdb603b54e284d472a23fc0195c6d4aeee8","a3f41ed1b4f2fc3049394b945a68ae4fdefd49fa1739c32f149d32c0545d67f5","4da80db9ed5a1a20fd5bfce863dd178b8928bcaf4a3d75e8657bcae32e572ede","47699512e6d8bebf7be488182427189f999affe3addc1c87c882d36b7f2d0b0e","7c8ee03d9ac384b0669c5438e5f3bf6216e8f71afe9a78a5ed4639a62961cb62","898b714aad9cfd0e546d1ad2c031571de7622bd0f9606a499bee193cf5e7cf0c","09cb73020ab795df196977eee9f4531614109f07c943bdbe55a9cf858c83dc34","fedebeae32c5cdd1a85b4e0504a01996e4a8adf3dfa72876920d3dd6e42978e7","004e2ddb267cf59659a8a7f5422dbc1af78a3ce711d6fab490a857ce34730575","cdf21eee8007e339b1b9945abf4a7b44930b1d695cc528459e68a3adc39a622e","1d079c37fa53e3c21ed3fa214a27507bda9991f2a41458705b19ed8c2b61173d","922bea60daff1f927afcf650f440bc1939f87f8f6710627d3143a0f721479f12","5835a6e0d7cd2738e56b671af0e561e7c1b4fb77751383672f4b009f4e161d70","c0eeaaa67c85c3bb6c52b629ebbfd3b2292dc67e8c0ffda2fc6cd2f78dc471e6","4b7f74b772140395e7af67c4841be1ab867c11b3b82a51b1aeb692822b76c872","2470a2412a59c6177cd4408dd7edb099ca7ace68c0187f54187dfee56dc9c5aa","c2008605e78208cfa9cd70bd29856b72dda7ad89df5dc895920f8e10bcb9cd0a","ec61ebac4d71c4698318673efbb5c481a6c4d374da8d285f6557541a5bd318d0","10ec84e648ffc7654868ca02c21a851bc211c8e4d50fd68131c1afa9afd96a33","40d8b22be2580a18ad37c175080af0724ecbdf364e4cb433d7110f5b71d5f771",{"version":"16fd66ae997b2f01c972531239da90fbf8ab4022bb145b9587ef746f6cecde5a","affectsGlobalScope":true},{"version":"fc8fbee8f73bf5ffd6ba08ba1c554d6f714c49cae5b5e984afd545ab1b7abe06","affectsGlobalScope":true},"6d7a1155bc29ed4f608bad12f17d1eadccfc4a5ca55f0c483255089ab5c30855","b789bf89eb19c777ed1e956dbad0925ca795701552d22e68fd130a032008b9f9","9269d492817e359123ac64c8205e5d05dab63d71a3a7a229e68b5d9a0e8150bf","054d06aef846438f6c9ca7226ba67590219424e704966ca85d0c7a1feaf11306","86df0a2dc330ec445c79486e2d58beafd37660d748485a25f29b52a1201a0bf4","4e70de4d69753b3b9bde6439ea2e9b1fd8db6b70ffdcebd474fc414a64c3435b","4d65df986ba416796d39afb59ce11dad590b66881bdd0c5f6321cb192929bf2f","8c860b8429cc29396f3408b93e981b425705fc3674f4dba2af90364d38d48826","0e9873398bb59ed70d77ff1ffc903b972f6962c7839947cb33e0ee05ae435290","2e4f37ffe8862b14d8e24ae8763daaa8340c0df0b859d9a9733def0eee7562d9","e0aa1079d58134e55ad2f73508ad1be565a975f2247245d76c64c1ca9e5e5b26","cd0c5af42811a4a56a0f77856cfa6c170278e9522888db715b11f176df3ff1f2","5487b97cfa28b26b4a9ef0770f872bdbebd4c46124858de00f242c3eed7519f4","7a01f546ace66019156e4232a1bee2fabc2f8eabeb052473d926ee1693956265","fb53b1c6a6c799b7e3cc2de3fb5c9a1c04a1c60d4380a37792d84c5f8b33933b","8485b6da53ec35637d072e516631d25dae53984500de70a6989058f24354666f","ebe80346928736532e4a822154eb77f57ef3389dbe2b3ba4e571366a15448ef2","c2cb3c8ff388781258ea9ddbcd8a947f751bddd6886e1d3b3ea09ddaa895df80","f672c876c1a04a223cf2023b3d91e8a52bb1544c576b81bf64a8fec82be9969c","98a9cc18f661d28e6bd31c436e1984f3980f35e0f0aa9cf795c54f8ccb667ffe","c76b0c5727302341d0bdfa2cc2cee4b19ff185b554edb6e8543f0661d8487116","19903057d0249e45c579bef2b771c37609e4853a8b88adbb0b6b63f9e1d1f372","f5ef066942e4f0bd98200aa6a6694b831e73200c9b3ade77ad0aa2409e8fe1b1","b9e99cd94f4166a245f5158f7286c05406e2a4c694619bceb7a4f3519d1d768e","5568d7c32e5cf5f35e092649f4e5e168c3114c800b1d7545b7ae5e0415704802","7a3f77aba5b4a39186f82e6bb561effebc2c6f201831c4859a9887c29b7bed3d","094220a45928be7bbb5f749fbc5fc9f8183bbd25d0c529dbd09300179d6a39f6","515d001d3eceb7ee53775f2064248c6804c6d8679ee080e99f7ddc71ef4f0d4d","8a7f51fb6782c87de17f065e9030d861fbd46cb6a435b8b75b1fe570cf7fdb96","68f81dad9e8d7b7aa15f35607a70c8b68798cf579ac44bd85325b8e2f1fb3600","1de80059b8078ea5749941c9f863aa970b4735bdbb003be4925c853a8b6b4450","2d120f0e676c65bc65a3ed528ec63bddd61943f6ab61747db5219644989ff641","2d84ab31aecbd695cc97062c8db8e52fc0200e5ca7c2ce1dc8a983b052885a77","012f4f719049bc5cbcb9b25b0429a46c8b10917f46818c86c548d37db5066083","4ef960df4f672e93b479f88211ed8b5cfa8a598b97aafa3396cacdc3341e3504"],"root":[[263,269],[292,294]],"options":{"esModuleInterop":true,"jsx":1,"module":99,"skipLibCheck":true,"strict":true,"target":1},"fileIdsList":[[123,259,264,265],[123,261],[70,123,248,268,291],[123,291],[123,264],[123,261,262],[123],[77,123],[80,123],[81,86,114,123],[82,93,94,101,111,122,123],[82,83,93,101,123],[84,123],[85,86,94,102,123],[86,111,119,123],[87,89,93,101,123],[88,123],[89,90,123],[93,123],[91,93,123],[93,94,95,111,122,123],[93,94,95,108,111,114,123],[123,127],[89,93,96,101,111,122,123],[93,94,96,97,101,111,119,122,123],[96,98,111,119,122,123],[77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129],[93,99,123],[100,122,123,127],[89,93,101,111,123],[102,123],[103,123],[80,104,123],[105,121,123,127],[106,123],[107,123],[93,108,109,123],[108,110,123,125],[81,93,111,112,113,114,123],[81,111,113,123],[111,112,123],[114,123],[115,123],[80,111,123],[93,117,118,123],[117,118,123],[86,101,111,119,123],[120,123],[101,121,123],[81,96,107,122,123],[86,123],[111,123,124],[100,123,125],[123,126],[81,86,93,95,104,111,122,123,125,127],[111,123,128],[70,123,134,135,136],[70,123,134,135],[70,123],[70,74,123,133,214,256],[70,74,123,132,214,256],[67,68,69,123],[75,123],[123,227],[123,229,230,231],[123,233],[123,139,148,158,214],[123,139,146,150],[123,137,157],[123,137],[123,137,157,158],[123,270,271,272,289],[123,172],[123,286,288],[123,286,287,289],[80,123,130,164,165],[70,123,140,243],[70,122,123,130],[70,123,157,220],[70,123,157],[123,218,223],[70,123,219,226],[70,111,123,130,256],[70,74,96,123,130,132,133,214,254,255],[123,138],[123,207,208,209,210,211,212],[123,209],[70,123,215,226],[70,123,226],[96,123,130,149,226],[70,123,148,164,185,187,189,214,285],[96,123,130,148,150],[96,111,123,130,147,149,150,214],[96,107,122,123,130,138,140,147,148,149,150,157,161,163,164,168,169,177,179,181,184,185,187,188,189,190,193,196,198,214],[96,111,123,130],[123,137,139,140,141,147,214,226],[123,148],[107,122,123,130,145,147,149,164,176,177,181,182,183,187,196,199,203,204],[123,148,152,164],[123,147,148],[123,169,197],[123,143,144],[123,143,191],[123,143],[123,145,169,195],[123,194],[123,144,145],[123,145,192],[123,144],[96,122,123,130,140,147,148,163],[123,161,163,226],[96,123,130,200,206],[123,131,185,186,214,226],[96,107,122,123,130,145,147,149,152,159,161,163,164,168,176,177,179,181,182,183,184,187,190,193,199,201,202,226],[96,123,130,147,148,152,203,205],[123,166,167],[70,96,107,123,130,138,140,147,150,168,184,185,187,189,214,226],[96,107,122,123,130,142,145,146,149],[123,162],[96,123,130,168],[96,123,130,168,178],[96,123,130,149,179],[96,123,130,148,169],[123,171],[123,173],[123,257],[123,148,170,172,176],[123,148,170,172],[96,123,130,142,148,173,174,175],[70,123,286,287,288],[123,224],[70,123,140],[70,123,131,184,189,214,226],[123,140,243,244],[70,107,122,123,130,138,217,219,221,222,226],[123,149,157,181],[107,123,130],[123,180],[70,96,107,123,130,138,214,215,216,223,225],[66,70,71,72,73,123,132,133,214,256],[123,235],[123,237],[123,239],[123,241],[123,245],[74,76,123,214,228,232,234,236,238,240,242,246,248,249,251,259,260],[123,247],[123,290],[123,219],[123,250],[80,123,173,174,175,176,252,253,256,258],[123,130],[70,74,96,98,107,123,130,132,133,134,136,138,150,206,213,226,256],[123,284],[123,273,274,284],[123,275,276],[123,273,274,275,277,278,282],[123,274,275],[123,283],[123,275],[123,273,274,275,278,279,280,281]],"referencedMap":[[266,1],[267,1],[269,2],[293,3],[292,4],[294,3],[268,5],[265,5],[263,6],[216,7],[77,8],[78,8],[80,9],[81,10],[82,11],[83,12],[84,13],[85,14],[86,15],[87,16],[88,17],[89,18],[90,18],[92,19],[91,20],[93,19],[94,21],[95,22],[79,23],[129,7],[96,24],[97,25],[98,26],[130,27],[99,28],[100,29],[101,30],[102,31],[103,32],[104,33],[105,34],[106,35],[107,36],[108,37],[109,37],[110,38],[111,39],[113,40],[112,41],[114,42],[115,43],[116,44],[117,45],[118,46],[119,47],[120,48],[121,49],[122,50],[123,51],[124,52],[125,53],[126,54],[127,55],[128,56],[69,7],[135,57],[136,58],[134,59],[132,60],[133,61],[67,7],[70,62],[295,7],[68,7],[76,63],[228,64],[232,65],[234,66],[157,67],[161,68],[158,69],[185,70],[159,71],[189,70],[177,70],[141,70],[146,7],[165,7],[290,72],[272,7],[271,73],[287,74],[288,75],[166,76],[244,77],[247,78],[221,79],[220,80],[219,81],[250,59],[218,82],[171,7],[253,7],[255,7],[257,83],[254,59],[256,84],[137,7],[139,85],[207,7],[208,7],[210,7],[213,86],[209,7],[211,87],[212,87],[160,7],[227,82],[235,88],[239,89],[150,90],[286,91],[149,92],[182,93],[199,94],[142,95],[148,96],[138,97],[205,98],[204,99],[184,7],[169,100],[198,101],[197,7],[191,102],[192,103],[144,104],[143,7],[196,105],[195,106],[194,107],[193,108],[145,109],[186,109],[131,7],[202,110],[164,111],[201,112],[200,7],[187,113],[203,114],[206,115],[151,7],[156,7],[153,7],[154,7],[155,7],[167,7],[168,116],[190,117],[147,118],[152,7],[163,119],[162,120],[179,121],[178,122],[170,123],[172,124],[174,125],[258,126],[173,127],[175,128],[230,7],[231,7],[229,7],[252,7],[176,129],[75,7],[289,130],[222,7],[225,131],[237,59],[243,132],[241,59],[215,133],[140,7],[245,134],[217,7],[224,7],[223,135],[188,136],[183,137],[181,138],[180,7],[233,7],[270,59],[226,139],[66,7],[74,140],[71,59],[72,7],[73,7],[236,141],[238,142],[240,143],[242,144],[262,145],[246,145],[261,146],[248,147],[291,148],[249,149],[251,150],[259,151],[260,152],[214,153],[64,7],[65,7],[12,7],[13,7],[15,7],[14,7],[2,7],[16,7],[17,7],[18,7],[19,7],[20,7],[21,7],[22,7],[23,7],[3,7],[4,7],[24,7],[28,7],[25,7],[26,7],[27,7],[29,7],[30,7],[31,7],[5,7],[32,7],[33,7],[34,7],[35,7],[6,7],[39,7],[36,7],[37,7],[38,7],[40,7],[7,7],[41,7],[46,7],[47,7],[42,7],[43,7],[44,7],[45,7],[8,7],[51,7],[48,7],[49,7],[50,7],[52,7],[9,7],[53,7],[54,7],[55,7],[58,7],[56,7],[57,7],[59,7],[60,7],[10,7],[1,7],[11,7],[63,7],[62,7],[61,7],[285,154],[275,155],[277,156],[283,157],[279,7],[280,7],[278,158],[281,154],[273,7],[274,7],[284,159],[276,160],[282,161],[264,7]],"exportedModulesMap":[[266,1],[267,1],[269,2],[293,3],[292,4],[294,3],[268,5],[265,5],[263,6],[216,7],[77,8],[78,8],[80,9],[81,10],[82,11],[83,12],[84,13],[85,14],[86,15],[87,16],[88,17],[89,18],[90,18],[92,19],[91,20],[93,19],[94,21],[95,22],[79,23],[129,7],[96,24],[97,25],[98,26],[130,27],[99,28],[100,29],[101,30],[102,31],[103,32],[104,33],[105,34],[106,35],[107,36],[108,37],[109,37],[110,38],[111,39],[113,40],[112,41],[114,42],[115,43],[116,44],[117,45],[118,46],[119,47],[120,48],[121,49],[122,50],[123,51],[124,52],[125,53],[126,54],[127,55],[128,56],[69,7],[135,57],[136,58],[134,59],[132,60],[133,61],[67,7],[70,62],[295,7],[68,7],[76,63],[228,64],[232,65],[234,66],[157,67],[161,68],[158,69],[185,70],[159,71],[189,70],[177,70],[141,70],[146,7],[165,7],[290,72],[272,7],[271,73],[287,74],[288,75],[166,76],[244,77],[247,78],[221,79],[220,80],[219,81],[250,59],[218,82],[171,7],[253,7],[255,7],[257,83],[254,59],[256,84],[137,7],[139,85],[207,7],[208,7],[210,7],[213,86],[209,7],[211,87],[212,87],[160,7],[227,82],[235,88],[239,89],[150,90],[286,91],[149,92],[182,93],[199,94],[142,95],[148,96],[138,97],[205,98],[204,99],[184,7],[169,100],[198,101],[197,7],[191,102],[192,103],[144,104],[143,7],[196,105],[195,106],[194,107],[193,108],[145,109],[186,109],[131,7],[202,110],[164,111],[201,112],[200,7],[187,113],[203,114],[206,115],[151,7],[156,7],[153,7],[154,7],[155,7],[167,7],[168,116],[190,117],[147,118],[152,7],[163,119],[162,120],[179,121],[178,122],[170,123],[172,124],[174,125],[258,126],[173,127],[175,128],[230,7],[231,7],[229,7],[252,7],[176,129],[75,7],[289,130],[222,7],[225,131],[237,59],[243,132],[241,59],[215,133],[140,7],[245,134],[217,7],[224,7],[223,135],[188,136],[183,137],[181,138],[180,7],[233,7],[270,59],[226,139],[66,7],[74,140],[71,59],[72,7],[73,7],[236,141],[238,142],[240,143],[242,144],[262,145],[246,145],[261,146],[248,147],[291,148],[249,149],[251,150],[259,151],[260,152],[214,153],[64,7],[65,7],[12,7],[13,7],[15,7],[14,7],[2,7],[16,7],[17,7],[18,7],[19,7],[20,7],[21,7],[22,7],[23,7],[3,7],[4,7],[24,7],[28,7],[25,7],[26,7],[27,7],[29,7],[30,7],[31,7],[5,7],[32,7],[33,7],[34,7],[35,7],[6,7],[39,7],[36,7],[37,7],[38,7],[40,7],[7,7],[41,7],[46,7],[47,7],[42,7],[43,7],[44,7],[45,7],[8,7],[51,7],[48,7],[49,7],[50,7],[52,7],[9,7],[53,7],[54,7],[55,7],[58,7],[56,7],[57,7],[59,7],[60,7],[10,7],[1,7],[11,7],[63,7],[62,7],[61,7],[285,154],[275,155],[277,156],[283,157],[279,7],[280,7],[278,158],[281,154],[273,7],[274,7],[284,159],[276,160],[282,161],[264,7]],"semanticDiagnosticsPerFile":[266,267,269,293,292,294,268,265,263,216,77,78,80,81,82,83,84,85,86,87,88,89,90,92,91,93,94,95,79,129,96,97,98,130,99,100,101,102,103,104,105,106,107,108,109,110,111,113,112,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,69,135,136,134,132,133,67,70,295,68,76,228,232,234,157,161,158,185,159,189,177,141,146,165,290,272,271,287,288,166,244,247,221,220,219,250,218,171,253,255,257,254,256,137,139,207,208,210,213,209,211,212,160,227,235,239,150,286,149,182,199,142,148,138,205,204,184,169,198,197,191,192,144,143,196,195,194,193,145,186,131,202,164,201,200,187,203,206,151,156,153,154,155,167,168,190,147,152,163,162,179,178,170,172,174,258,173,175,230,231,229,252,176,75,289,222,225,237,243,241,215,140,245,217,224,223,188,183,181,180,233,270,226,66,74,71,72,73,236,238,240,242,262,246,261,248,291,249,251,259,260,214,64,65,12,13,15,14,2,16,17,18,19,20,21,22,23,3,4,24,28,25,26,27,29,30,31,5,32,33,34,35,6,39,36,37,38,40,7,41,46,47,42,43,44,45,8,51,48,49,50,52,9,53,54,55,58,56,57,59,60,10,1,11,63,62,61,285,275,277,283,279,280,278,281,273,274,284,276,282,264],"affectedFilesPendingEmit":[266,267,269,293,292,294,268,265,264]},"version":"5.2.2"} \ No newline at end of file +{"program":{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.es2023.d.ts","./node_modules/typescript/lib/lib.esnext.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/typescript/lib/lib.es2023.collection.d.ts","./node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.esnext.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/next/dist/styled-jsx/types/css.d.ts","./node_modules/@types/react/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/prop-types/index.d.ts","./node_modules/@types/react/index.d.ts","./node_modules/next/dist/styled-jsx/types/index.d.ts","./node_modules/next/dist/styled-jsx/types/macro.d.ts","./node_modules/next/dist/styled-jsx/types/style.d.ts","./node_modules/next/dist/styled-jsx/types/global.d.ts","./node_modules/next/dist/shared/lib/amp.d.ts","./node_modules/next/amp.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/dom-events.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/globals.global.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/next/dist/server/get-page-files.d.ts","./node_modules/@types/react/canary.d.ts","./node_modules/@types/react/experimental.d.ts","./node_modules/@types/react-dom/index.d.ts","./node_modules/@types/react-dom/canary.d.ts","./node_modules/@types/react-dom/experimental.d.ts","./node_modules/next/dist/compiled/webpack/webpack.d.ts","./node_modules/next/dist/server/config.d.ts","./node_modules/next/dist/lib/load-custom-routes.d.ts","./node_modules/next/dist/shared/lib/image-config.d.ts","./node_modules/next/dist/build/webpack/plugins/subresource-integrity-plugin.d.ts","./node_modules/next/dist/server/body-streams.d.ts","./node_modules/next/dist/server/future/route-kind.d.ts","./node_modules/next/dist/server/future/route-definitions/route-definition.d.ts","./node_modules/next/dist/server/future/route-matches/route-match.d.ts","./node_modules/next/dist/client/components/app-router-headers.d.ts","./node_modules/next/dist/server/request-meta.d.ts","./node_modules/next/dist/server/config-shared.d.ts","./node_modules/next/dist/server/base-http/index.d.ts","./node_modules/next/dist/server/api-utils/index.d.ts","./node_modules/next/dist/server/node-environment.d.ts","./node_modules/next/dist/server/require-hook.d.ts","./node_modules/next/dist/server/node-polyfill-fetch.d.ts","./node_modules/next/dist/server/node-polyfill-form.d.ts","./node_modules/next/dist/server/node-polyfill-web-streams.d.ts","./node_modules/next/dist/server/node-polyfill-crypto.d.ts","./node_modules/next/dist/build/analysis/get-page-static-info.d.ts","./node_modules/next/dist/build/webpack/loaders/get-module-build-info.d.ts","./node_modules/next/dist/build/webpack/plugins/middleware-plugin.d.ts","./node_modules/next/dist/lib/setup-exception-listeners.d.ts","./node_modules/next/dist/build/index.d.ts","./node_modules/next/dist/server/response-cache/types.d.ts","./node_modules/next/dist/server/response-cache/index.d.ts","./node_modules/next/dist/server/lib/incremental-cache/index.d.ts","./node_modules/next/dist/client/components/hooks-server-context.d.ts","./node_modules/next/dist/client/components/static-generation-async-storage.external.d.ts","./node_modules/next/dist/server/pipe-readable.d.ts","./node_modules/next/dist/server/render-result.d.ts","./node_modules/next/dist/server/future/helpers/i18n-provider.d.ts","./node_modules/next/dist/server/web/next-url.d.ts","./node_modules/next/dist/compiled/@edge-runtime/cookies/index.d.ts","./node_modules/next/dist/server/web/spec-extension/cookies.d.ts","./node_modules/next/dist/server/web/spec-extension/request.d.ts","./node_modules/next/dist/server/web/spec-extension/fetch-event.d.ts","./node_modules/next/dist/server/web/spec-extension/response.d.ts","./node_modules/next/dist/server/web/types.d.ts","./node_modules/next/dist/build/webpack/plugins/pages-manifest-plugin.d.ts","./node_modules/next/dist/server/send-payload/revalidate-headers.d.ts","./node_modules/next/dist/server/send-payload/index.d.ts","./node_modules/next/dist/shared/lib/router/utils/route-regex.d.ts","./node_modules/next/dist/shared/lib/router/utils/route-matcher.d.ts","./node_modules/next/dist/server/base-http/node.d.ts","./node_modules/next/dist/shared/lib/router/utils/parse-url.d.ts","./node_modules/next/dist/server/font-utils.d.ts","./node_modules/next/dist/build/webpack/plugins/flight-manifest-plugin.d.ts","./node_modules/next/dist/server/future/route-modules/route-module.d.ts","./node_modules/next/dist/server/load-components.d.ts","./node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.d.ts","./node_modules/next/dist/build/webpack/plugins/next-font-manifest-plugin.d.ts","./node_modules/next/dist/server/render.d.ts","./node_modules/next/dist/server/future/route-definitions/locale-route-definition.d.ts","./node_modules/next/dist/server/future/route-definitions/pages-api-route-definition.d.ts","./node_modules/next/dist/server/future/route-matches/pages-api-route-match.d.ts","./node_modules/next/dist/server/future/route-matchers/route-matcher.d.ts","./node_modules/next/dist/server/future/route-matcher-providers/route-matcher-provider.d.ts","./node_modules/next/dist/server/future/route-matcher-managers/route-matcher-manager.d.ts","./node_modules/next/dist/server/future/normalizers/normalizer.d.ts","./node_modules/next/dist/server/future/normalizers/locale-route-normalizer.d.ts","./node_modules/next/dist/server/base-server.d.ts","./node_modules/next/dist/server/lib/router-utils/types.d.ts","./node_modules/next/dist/server/lib/render-server.d.ts","./node_modules/next/dist/server/image-optimizer.d.ts","./node_modules/next/dist/server/next-server.d.ts","./node_modules/next/dist/server/dev/static-paths-worker.d.ts","./node_modules/next/dist/server/dev/next-dev-server.d.ts","./node_modules/next/dist/server/next.d.ts","./node_modules/next/dist/lib/metadata/types/alternative-urls-types.d.ts","./node_modules/next/dist/lib/metadata/types/extra-types.d.ts","./node_modules/next/dist/lib/metadata/types/metadata-types.d.ts","./node_modules/next/dist/lib/metadata/types/manifest-types.d.ts","./node_modules/next/dist/lib/metadata/types/opengraph-types.d.ts","./node_modules/next/dist/lib/metadata/types/twitter-types.d.ts","./node_modules/next/dist/lib/metadata/types/metadata-interface.d.ts","./node_modules/next/types/index.d.ts","./node_modules/next/dist/shared/lib/html-context.shared-runtime.d.ts","./node_modules/@next/env/dist/index.d.ts","./node_modules/next/dist/shared/lib/mitt.d.ts","./node_modules/next/dist/client/with-router.d.ts","./node_modules/next/dist/client/router.d.ts","./node_modules/next/dist/client/route-loader.d.ts","./node_modules/next/dist/client/page-loader.d.ts","./node_modules/next/dist/shared/lib/bloom-filter.d.ts","./node_modules/next/dist/shared/lib/router/router.d.ts","./node_modules/next/dist/shared/lib/modern-browserslist-target.d.ts","./node_modules/next/dist/shared/lib/constants.d.ts","./node_modules/next/dist/shared/lib/utils.d.ts","./node_modules/next/dist/pages/_app.d.ts","./node_modules/next/app.d.ts","./node_modules/next/dist/server/web/spec-extension/unstable-cache.d.ts","./node_modules/next/dist/server/web/spec-extension/revalidate-path.d.ts","./node_modules/next/dist/server/web/spec-extension/revalidate-tag.d.ts","./node_modules/next/cache.d.ts","./node_modules/next/dist/shared/lib/runtime-config.external.d.ts","./node_modules/next/config.d.ts","./node_modules/next/dist/pages/_document.d.ts","./node_modules/next/document.d.ts","./node_modules/next/dist/shared/lib/dynamic.d.ts","./node_modules/next/dynamic.d.ts","./node_modules/next/dist/pages/_error.d.ts","./node_modules/next/error.d.ts","./node_modules/next/dist/shared/lib/head.d.ts","./node_modules/next/head.d.ts","./node_modules/next/dist/shared/lib/get-img-props.d.ts","./node_modules/next/dist/client/image-component.d.ts","./node_modules/next/dist/shared/lib/image-external.d.ts","./node_modules/next/image.d.ts","./node_modules/next/dist/client/link.d.ts","./node_modules/next/link.d.ts","./node_modules/next/router.d.ts","./node_modules/next/dist/client/script.d.ts","./node_modules/next/script.d.ts","./node_modules/next/dist/server/web/spec-extension/user-agent.d.ts","./node_modules/next/dist/compiled/@edge-runtime/primitives/url.d.ts","./node_modules/next/dist/compiled/@vercel/og/satori/index.d.ts","./node_modules/next/dist/compiled/@vercel/og/emoji/index.d.ts","./node_modules/next/dist/compiled/@vercel/og/types.d.ts","./node_modules/next/dist/compiled/@vercel/og/index.node.d.ts","./node_modules/next/dist/server/web/spec-extension/image-response.d.ts","./node_modules/next/server.d.ts","./node_modules/next/types/global.d.ts","./node_modules/next/index.d.ts","./node_modules/next/image-types/global.d.ts","./next-env.d.ts","./types/auth.ts","./lib/runtime-control.ts","./app/api/runtime/login/route.ts","./app/api/runtime/register/route.ts","./lib/auth-client.ts","./app/layout.tsx","./node_modules/next/dist/shared/lib/server-inserted-html.shared-runtime.d.ts","./node_modules/next/dist/client/components/redirect.d.ts","./node_modules/next/dist/client/components/not-found.d.ts","./node_modules/zod/lib/helpers/typeAliases.d.ts","./node_modules/zod/lib/helpers/util.d.ts","./node_modules/zod/lib/ZodError.d.ts","./node_modules/zod/lib/locales/en.d.ts","./node_modules/zod/lib/errors.d.ts","./node_modules/zod/lib/helpers/parseUtil.d.ts","./node_modules/zod/lib/helpers/enumUtil.d.ts","./node_modules/zod/lib/helpers/errorUtil.d.ts","./node_modules/zod/lib/helpers/partialUtil.d.ts","./node_modules/zod/lib/types.d.ts","./node_modules/zod/lib/external.d.ts","./node_modules/zod/lib/index.d.ts","./node_modules/zod/index.d.ts","./node_modules/next/dist/server/app-render/types.d.ts","./node_modules/next/dist/client/components/router-reducer/fetch-server-response.d.ts","./node_modules/next/dist/client/components/router-reducer/router-reducer-types.d.ts","./node_modules/next/dist/shared/lib/app-router-context.shared-runtime.d.ts","./node_modules/next/dist/client/components/navigation.d.ts","./node_modules/next/navigation.d.ts","./app/page.tsx","./app/login/page.tsx","./app/register/page.tsx","./node_modules/@types/scheduler/index.d.ts"],"fileInfos":[{"version":"2ac9cdcfb8f8875c18d14ec5796a8b029c426f73ad6dc3ffb580c228b58d1c44","affectsGlobalScope":true},"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","dc48272d7c333ccf58034c0026162576b7d50ea0e69c3b9292f803fc20720fd5","9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","5514e54f17d6d74ecefedc73c504eadffdeda79c7ea205cf9febead32d45c4bc","1c0cdb8dc619bc549c3e5020643e7cf7ae7940058e8c7e5aefa5871b6d86f44b","bed7b7ba0eb5a160b69af72814b4dde371968e40b6c5e73d3a9f7bee407d158c",{"version":"0075fa5ceda385bcdf3488e37786b5a33be730e8bc4aa3cf1e78c63891752ce8","affectsGlobalScope":true},{"version":"35299ae4a62086698444a5aaee27fc7aa377c68cbb90b441c9ace246ffd05c97","affectsGlobalScope":true},{"version":"f296963760430fb65b4e5d91f0ed770a91c6e77455bacf8fa23a1501654ede0e","affectsGlobalScope":true},{"version":"09226e53d1cfda217317074a97724da3e71e2c545e18774484b61562afc53cd2","affectsGlobalScope":true},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true},{"version":"8b41361862022eb72fcc8a7f34680ac842aca802cf4bc1f915e8c620c9ce4331","affectsGlobalScope":true},{"version":"f7bd636ae3a4623c503359ada74510c4005df5b36de7f23e1db8a5c543fd176b","affectsGlobalScope":true},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true},{"version":"0c20f4d2358eb679e4ae8a4432bdd96c857a2960fd6800b21ec4008ec59d60ea","affectsGlobalScope":true},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true},{"version":"82d0d8e269b9eeac02c3bd1c9e884e85d483fcb2cd168bccd6bc54df663da031","affectsGlobalScope":true},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true},{"version":"b8deab98702588840be73d67f02412a2d45a417a3c097b2e96f7f3a42ac483d1","affectsGlobalScope":true},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true},{"version":"376d554d042fb409cb55b5cbaf0b2b4b7e669619493c5d18d5fa8bd67273f82a","affectsGlobalScope":true},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true},{"version":"c4138a3dd7cd6cf1f363ca0f905554e8d81b45844feea17786cdf1626cb8ea06","affectsGlobalScope":true},{"version":"6ff3e2452b055d8f0ec026511c6582b55d935675af67cdb67dd1dc671e8065df","affectsGlobalScope":true},{"version":"03de17b810f426a2f47396b0b99b53a82c1b60e9cba7a7edda47f9bb077882f4","affectsGlobalScope":true},{"version":"8184c6ddf48f0c98429326b428478ecc6143c27f79b79e85740f17e6feb090f1","affectsGlobalScope":true},{"version":"261c4d2cf86ac5a89ad3fb3fafed74cbb6f2f7c1d139b0540933df567d64a6ca","affectsGlobalScope":true},{"version":"6af1425e9973f4924fca986636ac19a0cf9909a7e0d9d3009c349e6244e957b6","affectsGlobalScope":true},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true},{"version":"15a630d6817718a2ddd7088c4f83e4673fde19fa992d2eae2cf51132a302a5d3","affectsGlobalScope":true},{"version":"b7e9f95a7387e3f66be0ed6db43600c49cec33a3900437ce2fd350d9b7cb16f2","affectsGlobalScope":true},{"version":"01e0ee7e1f661acedb08b51f8a9b7d7f959e9cdb6441360f06522cc3aea1bf2e","affectsGlobalScope":true},{"version":"ac17a97f816d53d9dd79b0d235e1c0ed54a8cc6a0677e9a3d61efb480b2a3e4e","affectsGlobalScope":true},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true},{"version":"ec0104fee478075cb5171e5f4e3f23add8e02d845ae0165bfa3f1099241fa2aa","affectsGlobalScope":true},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true},{"version":"9cc66b0513ad41cb5f5372cca86ef83a0d37d1c1017580b7dace3ea5661836df","affectsGlobalScope":true},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true},{"version":"709efdae0cb5df5f49376cde61daacc95cdd44ae4671da13a540da5088bf3f30","affectsGlobalScope":true},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true},{"version":"bc496ef4377553e461efcf7cc5a5a57cf59f9962aea06b5e722d54a36bf66ea1","affectsGlobalScope":true},{"version":"038a2f66a34ee7a9c2fbc3584c8ab43dff2995f8c68e3f566f4c300d2175e31e","affectsGlobalScope":true},{"version":"4fa6ed14e98aa80b91f61b9805c653ee82af3502dc21c9da5268d3857772ca05","affectsGlobalScope":true},{"version":"f5c92f2c27b06c1a41b88f6db8299205aee52c2a2943f7ed29bd585977f254e8","affectsGlobalScope":true},{"version":"930b0e15811f84e203d3c23508674d5ded88266df4b10abee7b31b2ac77632d2","affectsGlobalScope":true},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true},{"version":"b9ea5778ff8b50d7c04c9890170db34c26a5358cccba36844fe319f50a43a61a","affectsGlobalScope":true},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true},{"version":"50d53ccd31f6667aff66e3d62adf948879a3a16f05d89882d1188084ee415bbc","affectsGlobalScope":true},{"version":"65be38e881453e16f128a12a8d36f8b012aa279381bf3d4dc4332a4905ceec83","affectsGlobalScope":true},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true},{"version":"307c8b7ebbd7f23a92b73a4c6c0a697beca05b06b036c23a34553e5fe65e4fdc","affectsGlobalScope":true},{"version":"e1913f656c156a9e4245aa111fbb436d357d9e1fe0379b9a802da7fe3f03d736","affectsGlobalScope":true},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true},{"version":"f35a831e4f0fe3b3697f4a0fe0e3caa7624c92b78afbecaf142c0f93abfaf379","affectsGlobalScope":true},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true},"0990a7576222f248f0a3b888adcb7389f957928ce2afb1cd5128169086ff4d29",{"version":"549df62b64a71004aee17685b445a8289013daf96246ce4d9b087d13d7a27a61","affectsGlobalScope":true},"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","87d9d29dbc745f182683f63187bf3d53fd8673e5fca38ad5eaab69798ed29fbc",{"version":"a6e6089d668ad148f1dc5435a06e6a4c0b06b0796eabad6e3a07328f57a94955","affectsGlobalScope":true},"cc69795d9954ee4ad57545b10c7bf1a7260d990231b1685c147ea71a6faa265c","8bc6c94ff4f2af1f4023b7bb2379b08d3d7dd80c698c9f0b07431ea16101f05f","1b61d259de5350f8b1e5db06290d31eaebebc6baafd5f79d314b5af9256d7153","57194e1f007f3f2cbef26fa299d4c6b21f4623a2eddc63dfeef79e38e187a36e","0f6666b58e9276ac3a38fdc80993d19208442d6027ab885580d93aec76b4ef00","05fd364b8ef02fb1e174fbac8b825bdb1e5a36a016997c8e421f5fab0a6da0a0","8820d4b6f3277e897854b14519e56fea0877b0c22d33815081d0ac42c758b75c","a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a",{"version":"d32f90e6cf32e99c86009b5f79fa50bc750fe54e17137d9bb029c377a2822ee2","affectsGlobalScope":true},"71b4526fb5932511db801d844180291cbe1d74985ef0994b6e2347b7a9b39e10",{"version":"625b214f6ef885f37e5e38180897227075f4df11e7ac8f89d8c5f12457a791b2","affectsGlobalScope":true},"5d43adfdfaeebcf67b08e28eec221b0898ca55fe3cfdcbce2b571d6bdb0fa6f4","8fe65c60df7504b1bcbaec2a088a2bff5d7b368dc0a7966d0dbe8f1c8939c146",{"version":"49479e21a040c0177d1b1bc05a124c0383df7a08a0726ad4d9457619642e875a","affectsGlobalScope":true},"9e390110944981c9428647e2aa14fcffafe99cfe87b15f5e805203f0a4ab0153","e2d8f78894fd5164be13866c76774c43c90ca09d139062665d9be8676989ea5e","76f3fbf450d6a290f6dfc4b255d845e3d3983ebe97d355b1549d3ef324389d4b","5c8bd6a332f932c7f7374b95d3cb4f37b3851c0a9ab58a9133944588b14d2675","0434286811d0ec5b4d828aff611fdf86e33d46dd6419f3df9ed92c644d92a14d","9113b9f010e6bf1ff940e1742fd733d66a3d4b020f14800b8d632a9f61a0dc01","2c5517a55ec36c37320f3202e87905bded4d9625b8e30b779c9ba635df599430",{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true},{"version":"32a7b6e7275912b8fbb8c143ff4eeb92b72f83155b48988c30761d69ffeb60f7","affectsGlobalScope":true},"2fb37a76de96cabd401e61bbdd4016799fc24585f96f494bfccb63825ed3fea6","c9cf880485dd30cda73200d52fe126accab426bbb21dc6d3fcdf8541265675c1","cb0cda9e99405f1b8118d46f9535e8f9681bb47c9f83bb3ceb80e99af4d93fee","1bedee1d03d259bf856a1c8cd7c183f1eea9a905f5b02978ecfa47161e597602","5262206d8fe3089bbd1a076cea3da9c9ef6a340e5fa4059c392d400c1964b679","47a0fda775c89671a3705ce925a837cf12b5268bf4ee46a129e12344791c17b6",{"version":"d0a454adb7d0ce354a8c145ef6245d81e2b717fe6908142522eafc2661229e75","affectsGlobalScope":true},"6467de6d1b3c0f03867347567d2d4c33fbea7a572082203149b2c2a591fea13f","4de63c30726b2c653278d8432f5b28cd8ac2afd112dd2f9b025b9bec70d53655","9aff938f442b8e8d5fc5e78c79fed33db2149a3428518519a5fc4d1b7d269d62",{"version":"e626f299569eefa361164975aae1df5e43d2f1b4fde2dc73f882920c6c8db51c","affectsGlobalScope":true},{"version":"087686bf5f9ed81b703f92a2e0544ed494dac0da42aba0ec517f8ffd8352da8b","affectsGlobalScope":true},"bfe95d6a23ba0bc20a0cde03b53d4530ba2bc7f98a92da6ef36bb3ed8ee1a8ab","61e02d13e598146b83a754e285b186da796ff1372893fa64ee1f939284958a07","9b974e1a1d5df0df99045d82407704e5e9ff0e66f497ae4fed5a3a091d46fbea","0db6e6dc5e6caad7389b6287f74e62c0e7fe3dd5b6cd39de0c62907fffbd0576","4e1e712f478183a6a3ff8937a22557d6327e403d7467bfb6b3372c11d82cb76f","24f824ad358f6799e6a2409e248ede18652cae6ce124e9fd41faf13d7a0a1324","f59166827125fba0699710f461c206a25889636c23e2c1383b3053010717ca24","e94f2232bbd613dfaa65c586fe6911734cabc679670e5915b374bec69a716c36","4b73a5ad969173b5ab7047023e477eed5faee5aabb768439b75cee6e9d0b03a2","6d581bc758d3f4c35052d87f6f40c9a4c87f1906ce80de842ce1ef4df17f5b97",{"version":"a54ee34c2cc03ec4bbf0c9b10a08b9f909a21b3314f90a743de7b12b85867cef","affectsGlobalScope":true},{"version":"da89bfd4e3191339bb141434d8e714039617939fa7fc92b3924c288d053ec804","affectsGlobalScope":true},"b860ef7c7864bc87e8e0ebbf1cc6e51a6733926c017f8282e595490495a3f0eb","d3295359ae7abb41a1781105fefb501065ae81d4957ce539b8e513d0ac720c1d","b8e1cba3aedc0673796772a9c30b1343a0f188454b48ddf507b56e0fccbcb7a8","18af2140d025adf83a9a2933c245b4c95f822020e7fedb02c92592e72dfae12a",{"version":"66d3421e032f6fb8474f31e7ff0d54994dea1ff736d4303d24ea67240116f806","affectsGlobalScope":true},{"version":"803daee46683593a3cfd2949bed70bb21b4e36adcaa3d3b43ffd036ed361f832","affectsGlobalScope":true},"b76a0cbccf8d46bfbdf34f20af3de072b613813327e7eea74a5f9bdd55bb683a","6d4161785afef5bbfa5ffb4e607fcb2594b6e8dcbc40557f01ae22b3f67a4b72","30a211c426e095de60924262e4e43455ee7c88975aba4136eced97ee0de9b22d",{"version":"31a3c2c16b0d7e45f15c13648e22635bc873068a1cc1c36a2b4894711587202a","affectsGlobalScope":true},"9a6a91f0cd6a2bd8635bb68c4ae38e3602d4064c9fb74617e7094ae3bf5fe7c2",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"13e851ee5f3dad116583e14e9d3f4aaf231194bbb6f4b969dc7446ae98a3fa73","8caa5c86be1b793cd5f599e27ecb34252c41e011980f7d61ae4989a149ff6ccc","72b9a5e3faa0569def625ec0e50cf91fe1aa8e527af85bbc7181113821684016","fd2355eaf50b2c1b9cd00eeacef19d8f098199d1b4facdc065e162780e4651f8","a95b76aef31395752eb5cb7b386be2e287fdc32dfdf7bdbbb666e333133b1ef7","bd2c377599828b9f08f7de649d3453545f0b4a9c09de7074e9208b60eba73314","cdc2a15950c3f418c9fe84cf7f556bc3edef28dd2989d3a706b5197e5b4d09f2","db6d2d9daad8a6d83f281af12ce4355a20b9a3e71b82b9f57cddcca0a8964a96","eb4b9a746cc7326485e091731e98708acf669c314348c72a88f8ed7a684c719e","cbea99888785d49bb630dcbb1613c73727f2b5a2cf02e1abcaab7bcf8d6bf3c5","a3f1220f5331589384d77ed650001719baac21fcbed91e36b9abc5485b06335a","a86f82d646a739041d6702101afa82dcb935c416dd93cbca7fd754fd0282ce1f","6ceac05c32f579adbed2f1a9c98cd297de3c00a3caaffc423385d00e82bce4ce","fa5bbc7ab4130dd8cdc55ea294ec39f76f2bc507a0f75f4f873e38631a836ca7","abb8aec2e3346d3ad3ad7d050306e86b09e6baeff73e420058ac9f72b9a6f9a1","cf86de1054b843e484a3c9300d62fbc8c97e77f168bbffb131d560ca0474d4a8","37f7b8e560025858aae5195ca74a3e95ecd55591e2babc0acd57bc1dab4ea8ea","24687523374b3ee67cd2499475dde9f08dd9a254a020dd06b4251761ab30834c","11a87146cd98ffa649cc26865b8690a9420258b4d7526e23b2d9275bb360fd1d","653060b69b4c62825fca79d91259a5f42736f56dba428322b36cfae593ee8359","b7b3258e8d47333721f9d4c287361d773f8fa88e52d1148812485d9fc06d2577","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","49e567e0aa388ab416eeb7a7de9bce5045a7b628bad18d1f6fa9d3eacee7bc3f","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","8a8bf772f83e9546b61720cf3b9add9aa4c2058479ad0d8db0d7c9fd948c4eaf","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","eed041005bb5e595e276684cb5ed194ab19205504f4cd0e41de754a622f22964","aeb888c84e570f3aea036de32da9b6f2c0ab204af27cb550753e897598ac63e0","4c91cc1ab59b55d880877ccf1999ded0bb2ebc8e3a597c622962d65bf0e76be8","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e1c9c204454567f39c3fdcb102871ccb750f44899dfbe29df3404f4da94d647f","2d0fe1768fcbed8a61709d1deebcd1bd21b1b4fc42cd233e1c335e1432d58aa9","3cd0346fc79e262233785d9fe2cbad08fc3fe6339af3419791687152ddfe5596","ccc2b7e6bc181b89049fd416f286d09545c685a817e2230ca938fcec023f8c4f","d23518a5f155f1a3e07214baf0295687507122ae2e6e9bd5e772551ebd4b3157","b17d9f0b2bad7fed990e5d96adecd847302de584f3083fe5d1a727c020eedc23","7766763be661053bee846b36fd78f4c99f7a3633d25fc301ac0f70aa95d56d08","55f080a632a591ccb5d7c1b5d37fd617d8b9014434adf077b2da3ac3177928cc","e8da637cbd6ed1cf6c36e9424f6bcee4515ca2c677534d4006cbd9a05f930f0c","ca1b882a105a1972f82cc58e3be491e7d750a1eb074ffd13b198269f57ed9e1b","9214131d35f51d70cb3bddc3fd4f7c172d9dc4f7b7d512a1d371ed72e120a3c4","3867ca0e9757cc41e04248574f4f07b8f9e3c0c2a796a5eb091c65bfd2fc8bdb","6c66f6f7d9ff019a644ff50dd013e6bf59be4bf389092948437efa6b77dc8f9a","58902668adae2e5eb67efbccb4048afa02308fa684f1a4e4c7d47668ecf58c1b","ef2d1bd01d144d426b72db3744e7a6b6bb518a639d5c9c8d86438fb75a3b1934","b50e6d569520af07eb7c9d95ce1325d10c19b9ea6d97f8edb0f0ef102a5fa900","476c48dfa7aef1b279542a1d90018f67912b3c970e147b77c2d8063c40c06b24","17937316a2f7f362dd6375251a9ce9e4960cfdc0aa7ba6cbd00656f7ab92334b","be2d91ce0cef98ac6a467d0b48813d78ae0a54d5f1a994afb16018a6b45f711d","973b59a17aaa817eb205baf6c132b83475a5c0a44e8294a472af7793b1817e89","ada39cbb2748ab2873b7835c90c8d4620723aedf323550e8489f08220e477c7f","a7a92f071d6891b2fa6542e343bdebc819492e6e14db37563bb71b8bd7e9b83f","6e5f5cee603d67ee1ba6120815497909b73399842254fc1e77a0d5cdc51d8c9c","99ace27cc2c78ef0fe3f92f11164eca7494b9f98a49ee0a19ede0a4c82a6a800","c89845d0f0fe40e7f8c423645f1577b91b6d67790eb6f394eb66779035f3a52e","ef61792acbfa8c27c9bd113f02731e66229f7d3a169e3c1993b508134f1a58e0","609e9dc4bb74cdfd2b9c89ade164e2c4032d92e903f2cbf2ca96dd3b76158b6e","f6404e7837b96da3ea4d38c4f1a3812c96c9dcdf264e93d5bdb199f983a3ef4b","c5426dbfc1cf90532f66965a7aa8c1136a78d4d0f96d8180ecbfc11d7722f1a5","84ddb2dd959dfcfb7e05783d94b6fa372ee5b0137152ab7de918740a83e12d0e","c1ac179620434b59c1569f2964a5c7354037ac91a212a1fb281673589965c893","9f891dc96f3e9343c4e823ba28195fd77e59c84199696a8bdfe7b67925732409","bae6dd176832f6423966647382c0d7ba9e63f8c167522f09a982f086cd4e8b23","1364f64d2fb03bbb514edc42224abd576c064f89be6a990136774ecdd881a1da","741c438ec079a077b08d37d9c0466924b68e98ed47224e83fcb125c5863eb355","fa34a00e044e9a3a6044abdb52d38bc7877ff1d6348aa79be99774e413c2568a","e927c2c13c4eaf0a7f17e6022eee8519eb29ef42c4c13a31e81a611ab8c95577","1822b69406252b606dc1aec3231a7104ac1d456cfa2c0a9041e61061895ae348","b4733aeb29c348d5dbc4eb3df22a8c00f311372504571ca1747c4cc318e515e0","f416c9c3eee9d47ff49132c34f96b9180e50485d435d5748f0e8b72521d28d2e","006da9ad49d319f6a47444c8ad2afb5ee2135f50990ae336d614c1e66e2bee9d","2a36120d258dfa9e6f4a7ba709984b767741025502fb75960226675bf9968ae3","1bbbfdb608c03f858adda0f378477daf74d4519e74c414e68096d465a75a9d75","0ca7b4d6520e97f9394853874bc4a1574b88f815747a0f5956005ddf9742e38d","dacc544b815d4e54ae4e039de4ce03c0a3bcbfbcaa01cd6512c4eb6aa22a0c1d","78aede3751e6d5755ea9bbb6850a4dda573e41a4ca2c367e9bdf133ecb68dc54","a1c8542ed1189091dd39e732e4390882a9bcd15c0ca093f6e9483eba4e37573f","a805c88b28da817123a9e4c45ceb642ef0154c8ea41ea3dde0e64a70dde7ac5f","3a17f09634c50cce884721f54fd9e7b98e03ac505889c560876291fcf8a09e90","32531dfbb0cdc4525296648f53b2b5c39b64282791e2a8c765712e49e6461046","0ce1b2237c1c3df49748d61568160d780d7b26693bd9feb3acb0744a152cd86d","e489985388e2c71d3542612685b4a7db326922b57ac880f299da7026a4e8a117","ce6530262460220d8f2ac48df1e2e605dad9303af59e2a9ba5c43f4f5c0adc7f",{"version":"6d3ee1bc1bc2fc2f4d448f2ffd1ec5c8cdd6690591d9c6a3bd71178c5e98f03c","affectsGlobalScope":true},"fd1b9d883b9446f1e1da1e1033a6a98995c25fbf3c10818a78960e2f2917d10c","19252079538942a69be1645e153f7dbbc1ef56b4f983c633bf31fe26aeac32cd","de9d2df7663e64e3a91bf495f315a7577e23ba088f2949d5ce9ec96f44fba37d","c7af78a2ea7cb1cd009cfb5bdb48cd0b03dad3b54f6da7aab615c2e9e9d570c5","1dc574e42493e8bf9bb37be44d9e38c5bd7bbc04f884e5e58b4d69636cb192b3",{"version":"f14c2bb33b3272bbdfeb0371eb1e337c9677cb726274cf3c4c6ea19b9447a666","affectsGlobalScope":true},{"version":"db01d18853469bcb5601b9fc9826931cc84cc1a1944b33cad76fd6f1e3d8c544","affectsGlobalScope":true},"6b8e8c0331a0c2e9fb53b8b0d346e44a8db8c788dae727a2c52f4cf3bd857f0d",{"version":"0aa0f0184c0f9635dd1b95c178223aa262bb01ec8ac7b39c911ef2bd32b8f65b","affectsGlobalScope":true},"ec29be0737d39268696edcec4f5e97ce26f449fa9b7afc2f0f99a86def34a418","3bfd9f50a763cd7f22edc2c0ce8d2f4b7bf703003ceae3f63ac86ac939af2522","f0489f34d2dee69b61e21b82edefe0c21272fc353f0149e7d8d3e5690a46df19","edaa27d57d30467edc63e9da7e7196acd315b02071f2c7ecd8475085a5cab9a2","65c24a8baa2cca1de069a0ba9fba82a173690f52d7e2d0f1f7542d59d5eb4db0","ec9fd890d681789cb0aa9efbc50b1e0afe76fbf3c49c3ac50ff80e90e29c6bcb","5fbd292aa08208ae99bf06d5da63321fdc768ee43a7a104980963100a3841752","9eac5a6beea91cfb119688bf44a5688b129b804ede186e5e2413572a534c21bb","6c292de17d4e8763406421cb91f545d1634c81486d8e14fceae65955c119584e","b7fff2d004c5879cae335db8f954eb1d61242d9f2d28515e67902032723caeab","5f3dc10ae646f375776b4e028d2bed039a93eebbba105694d8b910feebbe8b9c","145d0d6d3e07786d18ac835cc2129c073b2a8737d05a57a7287b0de64ab08ca2","4545c1a1ceca170d5d83452dd7c4994644c35cf676a671412601689d9a62da35","15959543f93f27e8e2b1a012fe28e14b682034757e2d7a6c1f02f87107fc731e","a2d648d333cf67b9aeac5d81a1a379d563a8ffa91ddd61c6179f68de724260ff","4e828bf688597c32905215785730cbdb603b54e284d472a23fc0195c6d4aeee8","a3f41ed1b4f2fc3049394b945a68ae4fdefd49fa1739c32f149d32c0545d67f5","4da80db9ed5a1a20fd5bfce863dd178b8928bcaf4a3d75e8657bcae32e572ede","47699512e6d8bebf7be488182427189f999affe3addc1c87c882d36b7f2d0b0e","7c8ee03d9ac384b0669c5438e5f3bf6216e8f71afe9a78a5ed4639a62961cb62","898b714aad9cfd0e546d1ad2c031571de7622bd0f9606a499bee193cf5e7cf0c","09cb73020ab795df196977eee9f4531614109f07c943bdbe55a9cf858c83dc34","fedebeae32c5cdd1a85b4e0504a01996e4a8adf3dfa72876920d3dd6e42978e7","004e2ddb267cf59659a8a7f5422dbc1af78a3ce711d6fab490a857ce34730575","cdf21eee8007e339b1b9945abf4a7b44930b1d695cc528459e68a3adc39a622e","1d079c37fa53e3c21ed3fa214a27507bda9991f2a41458705b19ed8c2b61173d","922bea60daff1f927afcf650f440bc1939f87f8f6710627d3143a0f721479f12","5835a6e0d7cd2738e56b671af0e561e7c1b4fb77751383672f4b009f4e161d70","c0eeaaa67c85c3bb6c52b629ebbfd3b2292dc67e8c0ffda2fc6cd2f78dc471e6","4b7f74b772140395e7af67c4841be1ab867c11b3b82a51b1aeb692822b76c872","2470a2412a59c6177cd4408dd7edb099ca7ace68c0187f54187dfee56dc9c5aa","c2008605e78208cfa9cd70bd29856b72dda7ad89df5dc895920f8e10bcb9cd0a","ec61ebac4d71c4698318673efbb5c481a6c4d374da8d285f6557541a5bd318d0","10ec84e648ffc7654868ca02c21a851bc211c8e4d50fd68131c1afa9afd96a33","40d8b22be2580a18ad37c175080af0724ecbdf364e4cb433d7110f5b71d5f771",{"version":"16fd66ae997b2f01c972531239da90fbf8ab4022bb145b9587ef746f6cecde5a","affectsGlobalScope":true},{"version":"fc8fbee8f73bf5ffd6ba08ba1c554d6f714c49cae5b5e984afd545ab1b7abe06","affectsGlobalScope":true},"6d7a1155bc29ed4f608bad12f17d1eadccfc4a5ca55f0c483255089ab5c30855","b789bf89eb19c777ed1e956dbad0925ca795701552d22e68fd130a032008b9f9","9269d492817e359123ac64c8205e5d05dab63d71a3a7a229e68b5d9a0e8150bf","054d06aef846438f6c9ca7226ba67590219424e704966ca85d0c7a1feaf11306",{"version":"1d3ea618b4556b97799789f05880c645c5d6fc66b3fdbf1220bdb867f53df6d1","signature":"9f4275e8d926848896bd3abfeb015922012a1f61df849f5539e37faace62460d"},"4e70de4d69753b3b9bde6439ea2e9b1fd8db6b70ffdcebd474fc414a64c3435b",{"version":"ce70040dded5531afc30ff30ea687cd8cc9b152045ef298b70acbe6be035d273","signature":"288f890862f8cbdf5d78a34b11ca294759d9540bd8385087020c0b3127fb6143"},"8c860b8429cc29396f3408b93e981b425705fc3674f4dba2af90364d38d48826","0e9873398bb59ed70d77ff1ffc903b972f6962c7839947cb33e0ee05ae435290","2e4f37ffe8862b14d8e24ae8763daaa8340c0df0b859d9a9733def0eee7562d9","e0aa1079d58134e55ad2f73508ad1be565a975f2247245d76c64c1ca9e5e5b26","cd0c5af42811a4a56a0f77856cfa6c170278e9522888db715b11f176df3ff1f2","5487b97cfa28b26b4a9ef0770f872bdbebd4c46124858de00f242c3eed7519f4","7a01f546ace66019156e4232a1bee2fabc2f8eabeb052473d926ee1693956265","fb53b1c6a6c799b7e3cc2de3fb5c9a1c04a1c60d4380a37792d84c5f8b33933b","8485b6da53ec35637d072e516631d25dae53984500de70a6989058f24354666f","ebe80346928736532e4a822154eb77f57ef3389dbe2b3ba4e571366a15448ef2","c2cb3c8ff388781258ea9ddbcd8a947f751bddd6886e1d3b3ea09ddaa895df80","f672c876c1a04a223cf2023b3d91e8a52bb1544c576b81bf64a8fec82be9969c","98a9cc18f661d28e6bd31c436e1984f3980f35e0f0aa9cf795c54f8ccb667ffe","c76b0c5727302341d0bdfa2cc2cee4b19ff185b554edb6e8543f0661d8487116","19903057d0249e45c579bef2b771c37609e4853a8b88adbb0b6b63f9e1d1f372","f5ef066942e4f0bd98200aa6a6694b831e73200c9b3ade77ad0aa2409e8fe1b1","b9e99cd94f4166a245f5158f7286c05406e2a4c694619bceb7a4f3519d1d768e","5568d7c32e5cf5f35e092649f4e5e168c3114c800b1d7545b7ae5e0415704802","7a3f77aba5b4a39186f82e6bb561effebc2c6f201831c4859a9887c29b7bed3d","094220a45928be7bbb5f749fbc5fc9f8183bbd25d0c529dbd09300179d6a39f6","515d001d3eceb7ee53775f2064248c6804c6d8679ee080e99f7ddc71ef4f0d4d","8a7f51fb6782c87de17f065e9030d861fbd46cb6a435b8b75b1fe570cf7fdb96","68f81dad9e8d7b7aa15f35607a70c8b68798cf579ac44bd85325b8e2f1fb3600","1de80059b8078ea5749941c9f863aa970b4735bdbb003be4925c853a8b6b4450","2d120f0e676c65bc65a3ed528ec63bddd61943f6ab61747db5219644989ff641","2d84ab31aecbd695cc97062c8db8e52fc0200e5ca7c2ce1dc8a983b052885a77",{"version":"758fd9d0557314263ffd685b7021fa080c297e4507d965c32bec57c5d6dd94e9","signature":"77f2f42def814f0ebc921b221f14cb7b16f84883303a59f670e48bde72217e64"},"4ef960df4f672e93b479f88211ed8b5cfa8a598b97aafa3396cacdc3341e3504"],"root":[[263,269],[292,294]],"options":{"esModuleInterop":true,"jsx":1,"module":99,"skipLibCheck":true,"strict":true,"target":1},"fileIdsList":[[123,259,264,265],[123,261],[70,123,248,268,291],[123,291],[123,264],[123,261,262],[123],[77,123],[80,123],[81,86,114,123],[82,93,94,101,111,122,123],[82,83,93,101,123],[84,123],[85,86,94,102,123],[86,111,119,123],[87,89,93,101,123],[88,123],[89,90,123],[93,123],[91,93,123],[93,94,95,111,122,123],[93,94,95,108,111,114,123],[123,127],[89,93,96,101,111,122,123],[93,94,96,97,101,111,119,122,123],[96,98,111,119,122,123],[77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129],[93,99,123],[100,122,123,127],[89,93,101,111,123],[102,123],[103,123],[80,104,123],[105,121,123,127],[106,123],[107,123],[93,108,109,123],[108,110,123,125],[81,93,111,112,113,114,123],[81,111,113,123],[111,112,123],[114,123],[115,123],[80,111,123],[93,117,118,123],[117,118,123],[86,101,111,119,123],[120,123],[101,121,123],[81,96,107,122,123],[86,123],[111,123,124],[100,123,125],[123,126],[81,86,93,95,104,111,122,123,125,127],[111,123,128],[70,123,134,135,136],[70,123,134,135],[70,123],[70,74,123,133,214,256],[70,74,123,132,214,256],[67,68,69,123],[75,123],[123,227],[123,229,230,231],[123,233],[123,139,148,158,214],[123,139,146,150],[123,137,157],[123,137],[123,137,157,158],[123,270,271,272,289],[123,172],[123,286,288],[123,286,287,289],[80,123,130,164,165],[70,123,140,243],[70,122,123,130],[70,123,157,220],[70,123,157],[123,218,223],[70,123,219,226],[70,111,123,130,256],[70,74,96,123,130,132,133,214,254,255],[123,138],[123,207,208,209,210,211,212],[123,209],[70,123,215,226],[70,123,226],[96,123,130,149,226],[70,123,148,164,185,187,189,214,285],[96,123,130,148,150],[96,111,123,130,147,149,150,214],[96,107,122,123,130,138,140,147,148,149,150,157,161,163,164,168,169,177,179,181,184,185,187,188,189,190,193,196,198,214],[96,111,123,130],[123,137,139,140,141,147,214,226],[123,148],[107,122,123,130,145,147,149,164,176,177,181,182,183,187,196,199,203,204],[123,148,152,164],[123,147,148],[123,169,197],[123,143,144],[123,143,191],[123,143],[123,145,169,195],[123,194],[123,144,145],[123,145,192],[123,144],[96,122,123,130,140,147,148,163],[123,161,163,226],[96,123,130,200,206],[123,131,185,186,214,226],[96,107,122,123,130,145,147,149,152,159,161,163,164,168,176,177,179,181,182,183,184,187,190,193,199,201,202,226],[96,123,130,147,148,152,203,205],[123,166,167],[70,96,107,123,130,138,140,147,150,168,184,185,187,189,214,226],[96,107,122,123,130,142,145,146,149],[123,162],[96,123,130,168],[96,123,130,168,178],[96,123,130,149,179],[96,123,130,148,169],[123,171],[123,173],[123,257],[123,148,170,172,176],[123,148,170,172],[96,123,130,142,148,173,174,175],[70,123,286,287,288],[123,224],[70,123,140],[70,123,131,184,189,214,226],[123,140,243,244],[70,107,122,123,130,138,217,219,221,222,226],[123,149,157,181],[107,123,130],[123,180],[70,96,107,123,130,138,214,215,216,223,225],[66,70,71,72,73,123,132,133,214,256],[123,235],[123,237],[123,239],[123,241],[123,245],[74,76,123,214,228,232,234,236,238,240,242,246,248,249,251,259,260],[123,247],[123,290],[123,219],[123,250],[80,123,173,174,175,176,252,253,256,258],[123,130],[70,74,96,98,107,123,130,132,133,134,136,138,150,206,213,226,256],[123,284],[123,273,274,284],[123,275,276],[123,273,274,275,277,278,282],[123,274,275],[123,283],[123,275],[123,273,274,275,278,279,280,281],[259,264],[70],[264]],"referencedMap":[[266,1],[267,1],[269,2],[293,3],[292,4],[294,3],[268,5],[265,5],[263,6],[216,7],[77,8],[78,8],[80,9],[81,10],[82,11],[83,12],[84,13],[85,14],[86,15],[87,16],[88,17],[89,18],[90,18],[92,19],[91,20],[93,19],[94,21],[95,22],[79,23],[129,7],[96,24],[97,25],[98,26],[130,27],[99,28],[100,29],[101,30],[102,31],[103,32],[104,33],[105,34],[106,35],[107,36],[108,37],[109,37],[110,38],[111,39],[113,40],[112,41],[114,42],[115,43],[116,44],[117,45],[118,46],[119,47],[120,48],[121,49],[122,50],[123,51],[124,52],[125,53],[126,54],[127,55],[128,56],[69,7],[135,57],[136,58],[134,59],[132,60],[133,61],[67,7],[70,62],[295,7],[68,7],[76,63],[228,64],[232,65],[234,66],[157,67],[161,68],[158,69],[185,70],[159,71],[189,70],[177,70],[141,70],[146,7],[165,7],[290,72],[272,7],[271,73],[287,74],[288,75],[166,76],[244,77],[247,78],[221,79],[220,80],[219,81],[250,59],[218,82],[171,7],[253,7],[255,7],[257,83],[254,59],[256,84],[137,7],[139,85],[207,7],[208,7],[210,7],[213,86],[209,7],[211,87],[212,87],[160,7],[227,82],[235,88],[239,89],[150,90],[286,91],[149,92],[182,93],[199,94],[142,95],[148,96],[138,97],[205,98],[204,99],[184,7],[169,100],[198,101],[197,7],[191,102],[192,103],[144,104],[143,7],[196,105],[195,106],[194,107],[193,108],[145,109],[186,109],[131,7],[202,110],[164,111],[201,112],[200,7],[187,113],[203,114],[206,115],[151,7],[156,7],[153,7],[154,7],[155,7],[167,7],[168,116],[190,117],[147,118],[152,7],[163,119],[162,120],[179,121],[178,122],[170,123],[172,124],[174,125],[258,126],[173,127],[175,128],[230,7],[231,7],[229,7],[252,7],[176,129],[75,7],[289,130],[222,7],[225,131],[237,59],[243,132],[241,59],[215,133],[140,7],[245,134],[217,7],[224,7],[223,135],[188,136],[183,137],[181,138],[180,7],[233,7],[270,59],[226,139],[66,7],[74,140],[71,59],[72,7],[73,7],[236,141],[238,142],[240,143],[242,144],[262,145],[246,145],[261,146],[248,147],[291,148],[249,149],[251,150],[259,151],[260,152],[214,153],[64,7],[65,7],[12,7],[13,7],[15,7],[14,7],[2,7],[16,7],[17,7],[18,7],[19,7],[20,7],[21,7],[22,7],[23,7],[3,7],[4,7],[24,7],[28,7],[25,7],[26,7],[27,7],[29,7],[30,7],[31,7],[5,7],[32,7],[33,7],[34,7],[35,7],[6,7],[39,7],[36,7],[37,7],[38,7],[40,7],[7,7],[41,7],[46,7],[47,7],[42,7],[43,7],[44,7],[45,7],[8,7],[51,7],[48,7],[49,7],[50,7],[52,7],[9,7],[53,7],[54,7],[55,7],[58,7],[56,7],[57,7],[59,7],[60,7],[10,7],[1,7],[11,7],[63,7],[62,7],[61,7],[285,154],[275,155],[277,156],[283,157],[279,7],[280,7],[278,158],[281,154],[273,7],[274,7],[284,159],[276,160],[282,161],[264,7]],"exportedModulesMap":[[266,1],[267,162],[269,2],[293,3],[292,4],[294,163],[268,5],[265,164],[263,6],[216,7],[77,8],[78,8],[80,9],[81,10],[82,11],[83,12],[84,13],[85,14],[86,15],[87,16],[88,17],[89,18],[90,18],[92,19],[91,20],[93,19],[94,21],[95,22],[79,23],[129,7],[96,24],[97,25],[98,26],[130,27],[99,28],[100,29],[101,30],[102,31],[103,32],[104,33],[105,34],[106,35],[107,36],[108,37],[109,37],[110,38],[111,39],[113,40],[112,41],[114,42],[115,43],[116,44],[117,45],[118,46],[119,47],[120,48],[121,49],[122,50],[123,51],[124,52],[125,53],[126,54],[127,55],[128,56],[69,7],[135,57],[136,58],[134,59],[132,60],[133,61],[67,7],[70,62],[295,7],[68,7],[76,63],[228,64],[232,65],[234,66],[157,67],[161,68],[158,69],[185,70],[159,71],[189,70],[177,70],[141,70],[146,7],[165,7],[290,72],[272,7],[271,73],[287,74],[288,75],[166,76],[244,77],[247,78],[221,79],[220,80],[219,81],[250,59],[218,82],[171,7],[253,7],[255,7],[257,83],[254,59],[256,84],[137,7],[139,85],[207,7],[208,7],[210,7],[213,86],[209,7],[211,87],[212,87],[160,7],[227,82],[235,88],[239,89],[150,90],[286,91],[149,92],[182,93],[199,94],[142,95],[148,96],[138,97],[205,98],[204,99],[184,7],[169,100],[198,101],[197,7],[191,102],[192,103],[144,104],[143,7],[196,105],[195,106],[194,107],[193,108],[145,109],[186,109],[131,7],[202,110],[164,111],[201,112],[200,7],[187,113],[203,114],[206,115],[151,7],[156,7],[153,7],[154,7],[155,7],[167,7],[168,116],[190,117],[147,118],[152,7],[163,119],[162,120],[179,121],[178,122],[170,123],[172,124],[174,125],[258,126],[173,127],[175,128],[230,7],[231,7],[229,7],[252,7],[176,129],[75,7],[289,130],[222,7],[225,131],[237,59],[243,132],[241,59],[215,133],[140,7],[245,134],[217,7],[224,7],[223,135],[188,136],[183,137],[181,138],[180,7],[233,7],[270,59],[226,139],[66,7],[74,140],[71,59],[72,7],[73,7],[236,141],[238,142],[240,143],[242,144],[262,145],[246,145],[261,146],[248,147],[291,148],[249,149],[251,150],[259,151],[260,152],[214,153],[64,7],[65,7],[12,7],[13,7],[15,7],[14,7],[2,7],[16,7],[17,7],[18,7],[19,7],[20,7],[21,7],[22,7],[23,7],[3,7],[4,7],[24,7],[28,7],[25,7],[26,7],[27,7],[29,7],[30,7],[31,7],[5,7],[32,7],[33,7],[34,7],[35,7],[6,7],[39,7],[36,7],[37,7],[38,7],[40,7],[7,7],[41,7],[46,7],[47,7],[42,7],[43,7],[44,7],[45,7],[8,7],[51,7],[48,7],[49,7],[50,7],[52,7],[9,7],[53,7],[54,7],[55,7],[58,7],[56,7],[57,7],[59,7],[60,7],[10,7],[1,7],[11,7],[63,7],[62,7],[61,7],[285,154],[275,155],[277,156],[283,157],[279,7],[280,7],[278,158],[281,154],[273,7],[274,7],[284,159],[276,160],[282,161],[264,7]],"semanticDiagnosticsPerFile":[266,267,269,293,292,294,268,265,263,216,77,78,80,81,82,83,84,85,86,87,88,89,90,92,91,93,94,95,79,129,96,97,98,130,99,100,101,102,103,104,105,106,107,108,109,110,111,113,112,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,69,135,136,134,132,133,67,70,295,68,76,228,232,234,157,161,158,185,159,189,177,141,146,165,290,272,271,287,288,166,244,247,221,220,219,250,218,171,253,255,257,254,256,137,139,207,208,210,213,209,211,212,160,227,235,239,150,286,149,182,199,142,148,138,205,204,184,169,198,197,191,192,144,143,196,195,194,193,145,186,131,202,164,201,200,187,203,206,151,156,153,154,155,167,168,190,147,152,163,162,179,178,170,172,174,258,173,175,230,231,229,252,176,75,289,222,225,237,243,241,215,140,245,217,224,223,188,183,181,180,233,270,226,66,74,71,72,73,236,238,240,242,262,246,261,248,291,249,251,259,260,214,64,65,12,13,15,14,2,16,17,18,19,20,21,22,23,3,4,24,28,25,26,27,29,30,31,5,32,33,34,35,6,39,36,37,38,40,7,41,46,47,42,43,44,45,8,51,48,49,50,52,9,53,54,55,58,56,57,59,60,10,1,11,63,62,61,285,275,277,283,279,280,278,281,273,274,284,276,282,264],"affectedFilesPendingEmit":[266,267,269,293,292,294,268,265,264]},"version":"5.2.2"} \ No newline at end of file diff --git a/authz-service/README.md b/authz-service/README.md index f1f93f7..09391d9 100644 --- a/authz-service/README.md +++ b/authz-service/README.md @@ -45,6 +45,8 @@ curl http://127.0.0.1:19090/.well-known/jwks.json - 显式设置 `AUTHZ_INTERNAL_TOKEN` - 显式设置外部可访问的 `AUTHZ_ISSUER` - 例如 `https://authz.example.com` +- 如果要让 AuthZ 负责编排实例注册,还要设置 `DEPLOY_API_BASE_URL` +- 如果 deploy-control 开了鉴权,还要设置 `DEPLOY_API_TOKEN` - 不要把 `src/data/` 里的本地示例或真实数据直接拿去打镜像 ## API 说明 diff --git a/authz-service/env_template b/authz-service/env_template index 054c002..1ad3688 100644 --- a/authz-service/env_template +++ b/authz-service/env_template @@ -1,3 +1,5 @@ AUTHZ_ISSUER=http://127.0.0.1:19090 AUTHZ_INTERNAL_TOKEN=change-me AUTHZ_ACCESS_TOKEN_TTL_SECONDS=3600 +DEPLOY_API_BASE_URL=http://127.0.0.1:8090 +DEPLOY_API_TOKEN=change-me diff --git a/authz-service/src/.gitignore b/authz-service/src/.gitignore new file mode 100644 index 0000000..77ac754 --- /dev/null +++ b/authz-service/src/.gitignore @@ -0,0 +1,3 @@ +.venv/ +__pycache__/ +*.pyc diff --git a/authz-service/src/README.md b/authz-service/src/README.md index 7d61b2a..48dac25 100644 --- a/authz-service/src/README.md +++ b/authz-service/src/README.md @@ -80,6 +80,14 @@ Authorization: Bearer 3. 配置 `POST /backends/{backend_id}/permissions` 4. 用 `POST /oauth/token` 获取 token +### 流程 C:由 Auth Portal 发起的一站式注册 + +1. Auth Portal 调用 `POST /portal/register` +2. AuthZ 先调用 deploy-control 创建或解析实例 +3. AuthZ 再调用实例自己的 `POST /api/auth/register` +4. 实例在注册过程中回调 AuthZ 的 `/oauth/register` / `/backends/register` +5. AuthZ 将最终 token 和 backend 连接信息回传给 Auth Portal + ## 注册时需要提供什么信息 ### 用户注册接口:`POST /oauth/register` diff --git a/authz-service/src/app/main.py b/authz-service/src/app/main.py index c1db7d6..a75f156 100644 --- a/authz-service/src/app/main.py +++ b/authz-service/src/app/main.py @@ -5,6 +5,7 @@ import re from pathlib import Path from typing import Any +import httpx from fastapi import Depends, FastAPI, Header, HTTPException, Request from fastapi.responses import JSONResponse @@ -18,6 +19,7 @@ from app.models import ( OAuthTokenRequest, OAuthTokenResponse, OutlookSettings, + PortalRegisterRequest, RegisterBackendRequest, RegisterBackendResponse, RegisterUserRequest, @@ -35,6 +37,9 @@ ISSUER = os.getenv("AUTHZ_ISSUER", "http://127.0.0.1:19090").rstrip("/") INTERNAL_TOKEN = os.getenv("AUTHZ_INTERNAL_TOKEN", "dev-internal-token") ACCESS_TOKEN_TTL_SECONDS = int(os.getenv("AUTHZ_ACCESS_TOKEN_TTL_SECONDS", "3600")) PRIVATE_KEY_PATH = Path(os.getenv("AUTHZ_PRIVATE_KEY_PATH", DATA_DIR / "signing_key.pem")) +DEPLOY_API_BASE_URL = os.getenv("DEPLOY_API_BASE_URL", "http://127.0.0.1:8090").rstrip("/") +DEPLOY_API_TOKEN = os.getenv("DEPLOY_API_TOKEN", "").strip() +UPSTREAM_TIMEOUT_SECONDS = float(os.getenv("AUTHZ_UPSTREAM_TIMEOUT_SECONDS", "15")) store = JsonStore(DATA_DIR) signer = JwtSigner(PRIVATE_KEY_PATH, ISSUER, ACCESS_TOKEN_TTL_SECONDS) @@ -69,6 +74,106 @@ def _clean_optional(value: str | None) -> str | None: return cleaned or None +def _as_object(value: Any) -> dict[str, Any]: + return value if isinstance(value, dict) else {} + + +def _as_string(value: Any) -> str: + return value.strip() if isinstance(value, str) else "" + + +def _http_error_detail(response: httpx.Response) -> str: + try: + payload = response.json() + except ValueError: + payload = {} + detail = _as_string(_as_object(payload).get("detail")) + return detail or response.text.strip() or f"upstream request failed with status {response.status_code}" + + +async def _request_json( + method: str, + url: str, + *, + json_body: dict[str, Any] | None = None, + headers: dict[str, str] | None = None, +) -> dict[str, Any]: + try: + async with httpx.AsyncClient( + timeout=UPSTREAM_TIMEOUT_SECONDS, + follow_redirects=True, + trust_env=False, + ) as client: + response = await client.request( + method, + url, + json=json_body, + headers=headers, + ) + except httpx.TimeoutException as exc: + raise HTTPException(status_code=504, detail="upstream request timed out") from exc + except httpx.HTTPError as exc: + raise HTTPException(status_code=502, detail=str(exc)) from exc + + if response.is_error: + raise HTTPException(status_code=response.status_code, detail=_http_error_detail(response)) + + if not response.content: + return {} + try: + payload = response.json() + except ValueError as exc: + raise HTTPException(status_code=502, detail="upstream response was not valid JSON") from exc + if not isinstance(payload, dict): + raise HTTPException(status_code=502, detail="upstream response must be a JSON object") + return payload + + +async def _call_deploy_control(path: str, payload: dict[str, Any]) -> dict[str, Any]: + headers: dict[str, str] = {} + if DEPLOY_API_TOKEN: + headers["Authorization"] = f"Bearer {DEPLOY_API_TOKEN}" + return await _request_json( + "POST", + f"{DEPLOY_API_BASE_URL}{path}", + json_body=payload, + headers=headers, + ) + + +async def _call_instance_api(base_url: str, path: str, payload: dict[str, Any]) -> dict[str, Any]: + normalized_base_url = base_url.rstrip("/") + if not normalized_base_url: + raise HTTPException(status_code=502, detail="instance api base url is missing") + return await _request_json( + "POST", + f"{normalized_base_url}{path}", + json_body=payload, + ) + + +def _normalize_portal_token_response( + response: dict[str, Any], + routing: dict[str, Any], +) -> dict[str, Any]: + frontend_base_url = _as_string(routing.get("frontend_base_url")) + api_base_url = _as_string(routing.get("api_base_url")) or _as_string(routing.get("public_url")) + public_url = _as_string(routing.get("public_url")) or api_base_url + backend_connection = _as_object(response.get("backend_connection")) + + merged_backend_connection = { + **backend_connection, + "frontend_base_url": _as_string(backend_connection.get("frontend_base_url")) or frontend_base_url or public_url or None, + "api_base_url": _as_string(backend_connection.get("api_base_url")) or api_base_url or public_url or None, + "public_base_url": _as_string(backend_connection.get("public_base_url")) or public_url or api_base_url or None, + } + + return { + **response, + "backend_connection": merged_backend_connection, + } + + def _require_internal(authorization: str | None = Header(default=None)) -> None: token = "" if authorization and authorization.lower().startswith("bearer "): @@ -282,6 +387,55 @@ async def jwks() -> dict[str, Any]: return signer.build_jwks() +@app.post("/portal/register") +async def portal_register(req: PortalRegisterRequest) -> dict[str, Any]: + username = req.username.strip() + if not username: + raise HTTPException(status_code=400, detail="username is required") + if not req.password: + raise HTTPException(status_code=400, detail="password is required") + + deploy_payload: dict[str, Any] = { + "username": username, + "password": req.password, + "authz_base_url": ISSUER, + } + email = _clean_optional(req.email) + if email is not None: + deploy_payload["email"] = email + + optional_fields = { + "instance_id": _clean_optional(req.instance_id), + "backend_name": _clean_optional(req.backend_name), + "provider": _clean_optional(req.provider), + "model": _clean_optional(req.model), + "api_key": _clean_optional(req.api_key), + "api_base": _clean_optional(req.api_base), + "image_name": _clean_optional(req.image_name), + } + for key, value in optional_fields.items(): + if value is not None: + deploy_payload[key] = value + if req.replace: + deploy_payload["replace"] = True + + routing = await _call_deploy_control("/api/instances/register", deploy_payload) + api_base_url = _as_string(routing.get("api_base_url")) or _as_string(routing.get("public_url")) + instance_payload: dict[str, Any] = { + "username": username, + "password": req.password, + "authz_base_url": ISSUER, + } + if email is not None: + instance_payload["email"] = email + backend_name = _clean_optional(req.backend_name) + if backend_name is not None: + instance_payload["backend_name"] = backend_name + + response = await _call_instance_api(api_base_url, "/api/auth/register", instance_payload) + return _normalize_portal_token_response(response, routing) + + @app.post("/backends/register", response_model=RegisterBackendResponse) async def register_backend(req: RegisterBackendRequest) -> RegisterBackendResponse: backend_name, backend_id, base_url, frontend_base_url = _resolve_register_backend_payload(req) diff --git a/authz-service/src/app/models.py b/authz-service/src/app/models.py index 8211430..ff62163 100644 --- a/authz-service/src/app/models.py +++ b/authz-service/src/app/models.py @@ -134,6 +134,20 @@ class RegisterUserResponse(BaseModel): backend: RegisterUserBackendResult +class PortalRegisterRequest(BaseModel): + username: str + password: str + email: str | None = None + instance_id: str | None = None + backend_name: str | None = None + provider: str | None = None + model: str | None = None + api_key: str | None = None + api_base: str | None = None + image_name: str | None = None + replace: bool = False + + class RotateSecretResponse(BaseModel): backend_id: str client_id: str diff --git a/authz-service/src/pyproject.toml b/authz-service/src/pyproject.toml index 9879053..0906871 100644 --- a/authz-service/src/pyproject.toml +++ b/authz-service/src/pyproject.toml @@ -6,6 +6,7 @@ requires-python = ">=3.10" dependencies = [ "fastapi>=0.115.0,<1.0.0", "uvicorn[standard]>=0.34.0,<1.0.0", + "httpx>=0.28.0,<1.0.0", "pydantic>=2.12.0,<3.0.0", "cryptography>=45.0.0,<46.0.0", "PyJWT>=2.10.0,<3.0.0", diff --git a/authz-service/src/uv.lock b/authz-service/src/uv.lock index 5f3ad0d..3c80b48 100644 --- a/authz-service/src/uv.lock +++ b/authz-service/src/uv.lock @@ -41,6 +41,7 @@ source = { editable = "." } dependencies = [ { name = "cryptography" }, { name = "fastapi" }, + { name = "httpx" }, { name = "pydantic" }, { name = "pyjwt" }, { name = "python-multipart" }, @@ -56,6 +57,7 @@ dev = [ requires-dist = [ { name = "cryptography", specifier = ">=45.0.0,<46.0.0" }, { name = "fastapi", specifier = ">=0.115.0,<1.0.0" }, + { name = "httpx", specifier = ">=0.28.0,<1.0.0" }, { name = "pydantic", specifier = ">=2.12.0,<3.0.0" }, { name = "pyjwt", specifier = ">=2.10.0,<3.0.0" }, { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.3.0,<9.0.0" }, @@ -64,6 +66,15 @@ requires-dist = [ ] provides-extras = ["dev"] +[[package]] +name = "certifi" +version = "2026.2.25" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/af/2d/7bf41579a8986e348fa033a31cdd0e4121114f6bce2457e8876010b092dd/certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7", size = 155029, upload-time = "2026-02-25T02:54:17.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa", size = 153684, upload-time = "2026-02-25T02:54:15.766Z" }, +] + [[package]] name = "cffi" version = "2.0.0" @@ -251,6 +262,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, ] +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + [[package]] name = "httptools" version = "0.7.1" @@ -294,6 +318,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/53/cf/878f3b91e4e6e011eff6d1fa9ca39f7eb17d19c9d7971b04873734112f30/httptools-0.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:cfabda2a5bb85aa2a904ce06d974a3f30fb36cc63d7feaddec05d2050acede96", size = 88205, upload-time = "2025-10-10T03:55:00.389Z" }, ] +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + [[package]] name = "idna" version = "3.11" diff --git a/authz-service/start-authz.sh b/authz-service/start-authz.sh index b9f00f3..f7d5170 100755 --- a/authz-service/start-authz.sh +++ b/authz-service/start-authz.sh @@ -11,6 +11,8 @@ HOST_BIND_IP="${HOST_BIND_IP:-0.0.0.0}" AUTHZ_ISSUER="${AUTHZ_ISSUER:-http://127.0.0.1:${HOST_PORT}}" AUTHZ_INTERNAL_TOKEN="${AUTHZ_INTERNAL_TOKEN:-dev-internal-token}" AUTHZ_ACCESS_TOKEN_TTL_SECONDS="${AUTHZ_ACCESS_TOKEN_TTL_SECONDS:-3600}" +DEPLOY_API_BASE_URL="${DEPLOY_API_BASE_URL:-http://127.0.0.1:8090}" +DEPLOY_API_TOKEN="${DEPLOY_API_TOKEN:-}" FORCE_BUILD=0 REPLACE=0 @@ -65,6 +67,8 @@ docker run -d \ -e "AUTHZ_ISSUER=${AUTHZ_ISSUER}" \ -e "AUTHZ_INTERNAL_TOKEN=${AUTHZ_INTERNAL_TOKEN}" \ -e "AUTHZ_ACCESS_TOKEN_TTL_SECONDS=${AUTHZ_ACCESS_TOKEN_TTL_SECONDS}" \ + -e "DEPLOY_API_BASE_URL=${DEPLOY_API_BASE_URL}" \ + -e "DEPLOY_API_TOKEN=${DEPLOY_API_TOKEN}" \ "${IMAGE_NAME}" >/dev/null printf 'container_name=%s\n' "${CONTAINER_NAME}"