@niledatabase/server 5.0.0-alpha.3 → 5.0.0-alpha.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +289 -227
- package/dist/index.d.ts +289 -227
- package/dist/index.js +573 -225
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +570 -226
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -13
- package/dist/express.d.mts +0 -32
- package/dist/express.d.ts +0 -32
- package/dist/express.js +0 -1433
- package/dist/express.js.map +0 -1
- package/dist/express.mjs +0 -1429
- package/dist/express.mjs.map +0 -1
- package/dist/nitro.d.mts +0 -7
- package/dist/nitro.d.ts +0 -7
- package/dist/nitro.js +0 -36
- package/dist/nitro.js.map +0 -1
- package/dist/nitro.mjs +0 -34
- package/dist/nitro.mjs.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/users/types.ts","../src/api/utils/routes/index.ts","../src/utils/Logger.ts","../src/utils/constants.ts","../src/api/utils/request.ts","../src/api/utils/auth.ts","../src/api/routes/me/index.ts","../src/utils/fetch.ts","../src/api/routes/users/POST.ts","../src/api/routes/users/GET.ts","../src/api/routes/users/%5BuserId%5D/PUT.ts","../src/api/routes/users/index.ts","../src/api/routes/tenants/%5BtenantId%5D/users/GET.ts","../src/api/routes/tenants/%5BtenantId%5D/users/POST.ts","../src/api/routes/tenants/%5BtenantId%5D/users/index.ts","../src/api/routes/tenants/GET.ts","../src/api/routes/tenants/%5BtenantId%5D/GET.ts","../src/api/routes/tenants/%5BtenantId%5D/DELETE.ts","../src/api/routes/tenants/%5BtenantId%5D/PUT.ts","../src/api/routes/tenants/POST.ts","../src/api/routes/tenants/index.ts","../src/api/routes/auth/signin.ts","../src/api/routes/auth/session.ts","../src/api/routes/auth/providers.ts","../src/api/routes/auth/csrf.ts","../src/api/routes/auth/callback.ts","../src/api/routes/auth/signout.ts","../src/api/routes/auth/error.ts","../src/api/routes/auth/verify-request.ts","../src/api/routes/auth/password-reset.ts","../src/api/routes/auth/verify-email.ts","../src/api/handlers/GET.ts","../src/api/routes/signup/POST.ts","../src/api/routes/signup/index.tsx","../src/api/handlers/POST.ts","../src/api/routes/tenants/%5BtenantId%5D/users/%5BuserId%5D/DELETE.ts","../src/api/routes/tenants/%5BtenantId%5D/users/%5BuserId%5D/PUT.ts","../src/api/routes/tenants/%5BtenantId%5D/users/%5BuserId%5D/index.ts","../src/api/handlers/DELETE.ts","../src/api/handlers/PUT.ts","../src/api/handlers/index.ts","../src/utils/Config/envVars.ts","../src/utils/Config/index.ts","../src/utils/Event/index.ts","../src/db/PoolProxy.ts","../src/db/NileInstance.ts","../src/db/DBManager.ts","../src/auth/index.ts","../src/auth/getCsrf.ts","../src/users/index.ts","../src/tenants/index.ts","../src/api/handlers/withContext/index.ts","../src/Server.ts"],"names":["route","request","GET","PUT","key","matches","POST","DELETE","pg","afterCreate","body","csrfToken"],"mappings":"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","file":"index.js","sourcesContent":["import { PoolClient, PoolConfig } from 'pg';\n\nimport { Routes } from './api/types';\n\nexport type Opts = {\n basePath?: string;\n fetch?: typeof fetch;\n};\n\nexport type NilePoolConfig = PoolConfig & { afterCreate?: AfterCreate };\nexport type LoggerType = {\n info?: (args: unknown | unknown[]) => void;\n warn?: (args: unknown | unknown[]) => void;\n error?: (args: unknown | unknown[]) => void;\n debug?: (args: unknown | unknown[]) => void;\n};\nexport type NileConfig = {\n /**\n * The specific database id. Either passed in or figured out by NILEDB_API_URL\n * process.env.NILEDB_ID\n */\n databaseId?: string;\n\n /**\n * The user UUID to the database\n * process.env.NILEDB_USER\n */\n user?: string;\n\n /**\n * The password UUID to the database\n * process.env.NILEDB_PASSWORD\n */\n password?: string;\n\n /**\n * The name of the database. Automatically obtained from NILEDB_POSTGRES_URL\n * process.env.NILEDB_NAME\n */\n databaseName?: string;\n\n /**\n * A tenant id. Scopes requests to a specific tenant, both API and DB\n * process.env.NILEDB_TENANT\n */\n tenantId?: string | null | undefined;\n\n /**\n * A user id. Possibly not the logged in user, used for setting database context (nile.user_id)\n * Generally speaking, this wouldn't be used for authentication, and in some cases simply won't do anything on some endpoints\n */\n userId?: string | null | undefined;\n /**\n * Shows a bunch of logging on the server side to see what's being done between the sdk and nile-auth\n */\n debug?: boolean;\n\n /**\n * DB configuration overrides. Environment variables are the way to go, but maybe you need something more\n */\n db?: NilePoolConfig;\n\n /**\n * Some kind of logger if you want to send to an external service\n */\n logger?: LoggerType;\n\n /**\n * The configuration value that maps to `NILEDB_API_URL` - its going to be nile-auth (or similar service)\n */\n apiUrl?: string | undefined;\n\n /**\n * Ignore client callbackUrls by setting this.\n * You can force the callback URL server side to be sure nile-auth redirects to whatever location.\n */\n callbackUrl?: string | undefined;\n\n /**\n * Need to override some routes? Change it here\n */\n routes?: Partial<Routes>;\n\n /**\n * don't like the default `/api`? change it here\n */\n routePrefix?: string | undefined;\n\n /**\n * In some cases, you may want to force secure cookies.\n * The SDK handles this for you, but might be necessary in some firewall / internal cases\n * Defaults to true if you're in production\n */\n secureCookies?: boolean;\n\n /**\n * The origin for the requests.\n * Allows the setting of the callback origin to a random FE\n * eg FE localhost:3001 -> BE: localhost:5432 would set to localhost:3001 to be sure nile-auth uses that.\n * In full stack cases, will just be the `host` header of the incoming request, which is used by default\n * It is also important to set this when dealing with secure cookies. Calling via server side needs to know if TLS is being used so that nile-auth knows which cookies to be sent.\n */\n origin?: null | undefined | string;\n\n /**\n * Set the headers to use in API requests.\n * The `cookie` would be expected if you are setting this, else most calls will be unauthorized\n */\n headers?: null | Headers | Record<string, string>;\n};\n\nexport type NileDb = NilePoolConfig & { tenantId?: string };\n\nexport type AfterCreate = (\n conn: PoolClient,\n done: (err: null | Error, conn: PoolClient) => void\n) => void;\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n// taken from ts lib dom\ninterface NileBody<R, B> {\n readonly body: ReadableStream<Uint8Array> | null | B;\n readonly bodyUsed: boolean;\n arrayBuffer(): Promise<ArrayBuffer>;\n blob(): Promise<Blob>;\n formData(): Promise<FormData>;\n json(): Promise<R>;\n text(): Promise<string>;\n}\n\ninterface NResponse<T> extends NileBody<T, any> {\n readonly headers: Headers;\n readonly ok: boolean;\n readonly redirected: boolean;\n readonly status: number;\n readonly statusText: string;\n readonly type: ResponseType;\n readonly url: string;\n clone(): Response;\n}\n\ninterface NRequest<T> extends NileBody<any, T> {\n /** Returns the cache mode associated with request, which is a string indicating how the request will interact with the browser's cache when fetching. */\n readonly cache: RequestCache;\n /** Returns the credentials mode associated with request, which is a string indicating whether credentials will be sent with the request always, never, or only when sent to a same-origin URL. */\n readonly credentials: RequestCredentials;\n /** Returns the kind of resource requested by request, e.g., \"document\" or \"script\". */\n readonly destination: RequestDestination;\n /** Returns a Headers object consisting of the headers associated with request. Note that headers added in the network layer by the user agent will not be accounted for in this object, e.g., the \"Host\" header. */\n readonly headers: Headers;\n /** Returns request's subresource integrity metadata, which is a cryptographic hash of the resource being fetched. Its value consists of multiple hashes separated by whitespace. [SRI] */\n readonly integrity: string;\n /** Returns a boolean indicating whether or not request can outlive the global in which it was created. */\n readonly keepalive: boolean;\n /** Returns request's HTTP method, which is \"GET\" by default. */\n readonly method: string;\n /** Returns the mode associated with request, which is a string indicating whether the request will use CORS, or will be restricted to same-origin URLs. */\n readonly mode: RequestMode;\n /** Returns the redirect mode associated with request, which is a string indicating how redirects for the request will be handled during fetching. A request will follow redirects by default. */\n readonly redirect: RequestRedirect;\n /** Returns the referrer of request. Its value can be a same-origin URL if explicitly set in init, the empty string to indicate no referrer, and \"about:client\" when defaulting to the global's default. This is used during fetching to determine the value of the `Referer` header of the request being made. */\n readonly referrer: string;\n /** Returns the referrer policy associated with request. This is used during fetching to compute the value of the request's referrer. */\n readonly referrerPolicy: ReferrerPolicy;\n /** Returns the signal associated with request, which is an AbortSignal object indicating whether or not request has been aborted, and its abort event handler. */\n readonly signal: AbortSignal;\n /** Returns the URL of request as a string. */\n readonly url: string;\n clone(): Request;\n}\n\nexport type NileRequest<T> = NRequest<T> | T;\n\nexport const APIErrorErrorCodeEnum = {\n InternalError: 'internal_error',\n BadRequest: 'bad_request',\n EntityNotFound: 'entity_not_found',\n DuplicateEntity: 'duplicate_entity',\n InvalidCredentials: 'invalid_credentials',\n UnknownOidcProvider: 'unknown_oidc_provider',\n ProviderAlreadyExists: 'provider_already_exists',\n ProviderConfigError: 'provider_config_error',\n ProviderMismatch: 'provider_mismatch',\n ProviderUpdateError: 'provider_update_error',\n SessionStateMissing: 'session_state_missing',\n SessionStateMismatch: 'session_state_mismatch',\n OidcCodeMissing: 'oidc_code_missing',\n} as const;\nexport type APIErrorErrorCodeEnum =\n (typeof APIErrorErrorCodeEnum)[keyof typeof APIErrorErrorCodeEnum];\n\nexport interface APIError {\n [key: string]: any | any;\n /**\n *\n * @type {string}\n * @memberof APIError\n */\n errorCode: APIErrorErrorCodeEnum;\n /**\n *\n * @type {string}\n * @memberof APIError\n */\n message: string;\n /**\n *\n * @type {number}\n * @memberof APIError\n */\n statusCode: number;\n}\n\nexport type NileResponse<T> = Promise<T | NResponse<T & APIError>>;\n","export interface CreateBasicUserRequest {\n email: string;\n password: string;\n name?: string;\n familyName?: string;\n givenName?: string;\n picture?: string;\n // create a tenant for the new user to an existing tenant\n newTenantName?: string;\n // add the new user to an existing tenant\n tenantId?: string;\n}\nexport interface CreateTenantUserRequest {\n email: string;\n password: string;\n name?: string;\n familyName?: string;\n givenName?: string;\n picture?: string;\n}\nexport const LoginUserResponseTokenTypeEnum = {\n AccessToken: 'ACCESS_TOKEN',\n RefreshToken: 'REFRESH_TOKEN',\n IdToken: 'ID_TOKEN',\n} as const;\nexport type LoginUserResponseTokenTypeEnum =\n (typeof LoginUserResponseTokenTypeEnum)[keyof typeof LoginUserResponseTokenTypeEnum];\n\nexport interface LoginUserResponseToken {\n jwt: string;\n maxAge: number;\n type: LoginUserResponseTokenTypeEnum;\n}\nexport interface LoginUserResponse {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n id: string;\n token: LoginUserResponseToken;\n}\nexport interface User {\n id: string;\n email: string;\n name?: string | null;\n familyName?: string | null;\n givenName?: string | null;\n picture?: string | null;\n created: string;\n updated?: string;\n emailVerified?: string | null;\n tenants: string[];\n}\n","import { Routes } from '../../types';\nimport { Config } from '../../../utils/Config';\n\nconst NILEDB_API_URL = process.env.NILEDB_API_URL;\nexport const DEFAULT_PREFIX = '/api';\n\nexport enum DefaultNileAuthRoutes {\n SIGNUP = '/signup',\n TENANTS = '/tenants',\n TENANT = '/tenants/{tenantId}',\n USER_TENANTS = '/users/{userId}/tenants',\n TENANT_USER = '/tenants/{tenantId}/users/{userId}',\n TENANT_USERS = '/tenants/{tenantId}/users',\n USER = '/users/{userId}',\n USERS = '/users',\n ME = '/me',\n}\n\nexport enum NileAuthRoutes {\n CSRF = '/auth/csrf',\n PROVIDERS = '/auth/providers',\n SESSION = '/auth/session',\n SIGNIN = '/auth/signin',\n CALLBACK = '/auth/callback',\n SIGNOUT = '/auth/signout',\n PASSWORD_RESET = '/auth/reset-password',\n VERIFY_EMAIL = '/auth/verify-email',\n}\n\n// these map to the developer app\nexport const appRoutes = (prefix = DEFAULT_PREFIX): Routes => ({\n SIGNIN: `${prefix}${NileAuthRoutes.SIGNIN}`,\n PROVIDERS: `${prefix}${NileAuthRoutes.PROVIDERS}`,\n SESSION: `${prefix}${NileAuthRoutes.SESSION}`,\n CSRF: `${prefix}${NileAuthRoutes.CSRF}`,\n CALLBACK: `${prefix}${NileAuthRoutes.CALLBACK}`,\n SIGNOUT: `${prefix}${NileAuthRoutes.SIGNOUT}`,\n ERROR: `${prefix}/auth/error`,\n VERIFY_REQUEST: `${prefix}/auth/verify-request`,\n VERIFY_EMAIL: `${prefix}${NileAuthRoutes.VERIFY_EMAIL}`,\n PASSWORD_RESET: `${prefix}${NileAuthRoutes.PASSWORD_RESET}`,\n ME: `${prefix}${DefaultNileAuthRoutes.ME}`,\n USERS: `${prefix}${DefaultNileAuthRoutes.USERS}`,\n USER_TENANTS: `${prefix}${DefaultNileAuthRoutes.USER_TENANTS}`,\n TENANTS: `${prefix}${DefaultNileAuthRoutes.TENANTS}`,\n TENANT: `${prefix}${DefaultNileAuthRoutes.TENANT}`,\n TENANT_USER: `${prefix}${DefaultNileAuthRoutes.TENANT_USER}`,\n TENANT_USERS: `${prefix}${DefaultNileAuthRoutes.TENANT_USERS}`,\n SIGNUP: `${prefix}${DefaultNileAuthRoutes.SIGNUP}`,\n LOG: `${prefix}/_log`,\n});\n\n// these map to nile-auth\nexport const apiRoutes = (config: Config) => ({\n ME: makeRestUrl(config, '/me'),\n USERS: (qp: { tenantId?: null | string; newTenantName?: null | string }) =>\n makeRestUrl(config, '/users', qp),\n USER: (userId: string) => makeRestUrl(config, `/users/${userId}`),\n TENANTS: makeRestUrl(config, '/tenants'),\n TENANT: (tenantId: string) => makeRestUrl(config, `/tenants/${tenantId}`),\n SIGNUP: makeRestUrl(config, '/signup'),\n TENANT_USERS: (tenantId: string) =>\n makeRestUrl(config, `/tenants/${tenantId}/users`),\n TENANT_USER: makeRestUrl(\n config,\n `/tenants/${config.tenantId}/users/${config.userId}`\n ),\n USER_TENANTS: (userId: string) =>\n makeRestUrl(config, `/users/${userId}/tenants`),\n});\ntype ApiRouteKeys = keyof typeof apiRoutes;\nexport type ApiRoutePaths = (typeof apiRoutes)[ApiRouteKeys];\n\n// these map to nile-auth\nexport const proxyRoutes = (config: Config) => ({\n SIGNIN: makeRestUrl(config, NileAuthRoutes.SIGNIN),\n PROVIDERS: makeRestUrl(config, NileAuthRoutes.PROVIDERS),\n SESSION: makeRestUrl(config, NileAuthRoutes.SESSION),\n CSRF: makeRestUrl(config, NileAuthRoutes.CSRF),\n CALLBACK: makeRestUrl(config, NileAuthRoutes.CALLBACK),\n SIGNOUT: makeRestUrl(config, NileAuthRoutes.SIGNOUT),\n ERROR: makeRestUrl(config, '/auth/error'),\n VERIFY_REQUEST: makeRestUrl(config, '/auth/verify-request'),\n PASSWORD_RESET: makeRestUrl(config, NileAuthRoutes.PASSWORD_RESET),\n VERIFY_EMAIL: makeRestUrl(config, NileAuthRoutes.VERIFY_EMAIL),\n});\ntype ProxyKeys = keyof typeof proxyRoutes;\nexport type ProxyPaths = (typeof proxyRoutes)[ProxyKeys];\n\nfunction filterNullUndefined(\n obj?: Record<string, string | null>\n): { [k: string]: string | null } | undefined {\n if (!obj) {\n return undefined;\n }\n return Object.fromEntries(\n Object.entries(obj).filter(\n ([, value]) => value !== null && value !== undefined\n )\n );\n}\n\nexport function makeRestUrl(\n config: Config,\n path: string,\n qp?: Record<string, string | null>\n) {\n const url = config.apiUrl || NILEDB_API_URL;\n if (!url) {\n throw new Error(\n 'An API url is required. Set it via NILEDB_API_URL. Was auto configuration run?'\n );\n }\n const params = new URLSearchParams(\n filterNullUndefined(qp) as Record<string, string>\n );\n const strParams = params.toString();\n return `${[url, path.substring(1, path.length)].join('/')}${\n strParams ? `?${strParams}` : ''\n }`;\n}\n\nexport function urlMatches(requestUrl: string, route: string) {\n const url = new URL(requestUrl);\n return url.pathname.startsWith(route);\n}\nexport function prefixAppRoute(config: Config) {\n return `${config.serverOrigin}${config.routePrefix}`;\n}\n\nexport function isUUID(value: string | null | undefined) {\n if (!value) {\n return false;\n }\n // is any UUID\n const regex =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5|7][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;\n\n return regex.test(value);\n}\n","/* eslint-disable no-console */\nimport { Routes } from '../api/types';\nimport { urlMatches } from '../api/utils/routes';\nimport { NileConfig } from '../types';\n\nimport { Config } from './Config';\n\nconst red = '\\x1b[31m';\nconst yellow = '\\x1b[38;2;255;255;0m';\nconst purple = '\\x1b[38;2;200;160;255m';\nconst orange = '\\x1b[38;2;255;165;0m';\nconst reset = '\\x1b[0m';\n\nconst baseLogger = (config: void | NileConfig, ...params: unknown[]) => ({\n info(message: string | unknown, meta?: Record<string, unknown>) {\n if (config?.debug) {\n console.info(\n `${orange}[niledb]${reset}${purple}[DEBUG]${reset}${params.join(\n ''\n )}${reset} ${message}`,\n meta ? `${JSON.stringify(meta)}` : ''\n );\n }\n },\n debug(message: string | unknown, meta?: Record<string, unknown>) {\n if (config?.debug) {\n console.debug(\n `${orange}[niledb]${reset}${purple}[DEBUG]${reset}${params.join(\n ''\n )}${reset} ${message}`,\n meta ? `${JSON.stringify(meta)}` : ''\n );\n }\n },\n warn(message: string | unknown, meta?: Record<string, unknown>) {\n if (config?.debug) {\n console.warn(\n `${orange}[niledb]${reset}${yellow}[WARN]${reset}${params.join(\n ''\n )}${reset} ${message}`,\n meta ? JSON.stringify(meta) : ''\n );\n }\n },\n error(message: string | unknown, meta?: Record<string, unknown>) {\n console.error(\n `${orange}[niledb]${reset}${red}[ERROR]${reset}${params.join(\n ''\n )}${red} ${message}`,\n meta ? meta : '',\n `${reset}`\n );\n },\n});\n\nexport type LogReturn = {\n info(message: string | unknown, meta?: Record<string, unknown>): void;\n debug(message: string | unknown, meta?: Record<string, unknown>): void;\n warn(message: string | unknown, meta?: Record<string, unknown>): void;\n error(message: string | unknown, meta?: Record<string, unknown>): void;\n};\nexport default function Logger(\n config?: Config | NileConfig,\n ...params: unknown[]\n): LogReturn {\n const base = baseLogger(config, params);\n const info = config?.logger?.info ?? base.info;\n const debug = config?.logger?.debug ?? base.debug;\n const warn = config?.logger?.warn ?? base.warn;\n const error = config?.logger?.error ?? base.error;\n return { info, warn, error, debug };\n}\n\nexport function matchesLog(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.LOG);\n}\n","// these two are a pass though\nexport const X_NILE_TENANT = 'nile-tenant-id';\nexport const X_NILE_USER_ID = 'nile-user-id';\nexport const X_NILE_ORIGIN = 'nile-origin';\n// this one is not\nexport const X_NILE_SECURECOOKIES = 'nile-secure-cookies';\n","import {\n X_NILE_ORIGIN,\n X_NILE_SECURECOOKIES,\n X_NILE_TENANT,\n} from '../../utils/constants';\nimport { Config } from '../../utils/Config';\nimport Logger from '../../utils/Logger';\n\nimport { DEFAULT_PREFIX } from './routes';\n\nexport default async function request(\n url: string,\n _init: RequestInit & { request: Request },\n config: Config\n) {\n const { debug, info, error } = Logger(config, '[REQUEST]');\n const { request, ...init } = _init;\n const requestUrl = new URL(request.url);\n const updatedHeaders = new Headers({});\n if (request.headers.get('cookie')) {\n updatedHeaders.set('cookie', String(request.headers.get('cookie')));\n }\n if (request.headers.get(X_NILE_TENANT)) {\n updatedHeaders.set(\n X_NILE_TENANT,\n String(request.headers.get(X_NILE_TENANT))\n );\n }\n // sets secure cookies for production\n if (config.secureCookies != null) {\n updatedHeaders.set(X_NILE_SECURECOOKIES, String(config.secureCookies));\n } else {\n updatedHeaders.set(\n X_NILE_SECURECOOKIES,\n process.env.NODE_ENV === 'production' ? 'true' : 'false'\n );\n }\n\n updatedHeaders.set('host', requestUrl.host);\n if (config.callbackUrl) {\n const cbUrl = new URL(config.callbackUrl);\n debug(`Obtained origin from config.callbackUrl ${config.callbackUrl}`);\n updatedHeaders.set(X_NILE_ORIGIN, cbUrl.origin);\n // this origin may be overridden, but when SDK requests are made, we want to ignore it\n } else if (config.origin) {\n debug(`Obtained origin from config.origin ${config.origin}`);\n updatedHeaders.set(X_NILE_ORIGIN, config.origin);\n } else {\n const passedOrigin = request.headers.get(X_NILE_ORIGIN);\n if (passedOrigin) {\n updatedHeaders.set(X_NILE_ORIGIN, passedOrigin);\n } else {\n const reqOrigin =\n config.routePrefix !== DEFAULT_PREFIX\n ? `${requestUrl.origin}${config.routePrefix}`\n : requestUrl.origin;\n\n updatedHeaders.set(X_NILE_ORIGIN, reqOrigin);\n debug(`Obtained origin from request ${reqOrigin}`);\n }\n }\n const params = { ...init };\n if (\n params.method?.toLowerCase() === 'post' ||\n params.method?.toLowerCase() === 'put'\n ) {\n try {\n updatedHeaders.set('content-type', 'application/json');\n const initBody = await new Response(_init.request.clone().body).json();\n const requestBody = await new Response(request.clone().body).json();\n params.body = JSON.stringify(initBody ?? requestBody);\n } catch (e) {\n updatedHeaders.set('content-type', 'application/x-www-form-urlencoded');\n const initBody = await new Response(_init.request.clone().body).text();\n const requestBody = await new Response(request.clone().body).text();\n params.body = initBody ?? requestBody;\n }\n }\n\n params.headers = updatedHeaders;\n\n const fullUrl = `${url}${requestUrl.search}`;\n\n if (config.debug) {\n // something going on with `fetch` in nextjs, possibly other places\n // hot-reloading does not always give back `set-cookie` from fetchCSRF\n // cURL seems to always do it (and in a real app, you don't have hot reloading),\n // so add a cache bypass to stop the annoying failure reloads that actually work\n params.headers.set('request-id', crypto.randomUUID());\n params.cache = 'no-store';\n }\n try {\n const res: Response | void = await fetch(fullUrl, {\n ...params,\n }).catch((e) => {\n error('An error has occurred in the fetch', {\n message: e.message,\n stack: e.stack,\n });\n return new Response(\n 'An unexpected (most likely configuration) problem has occurred',\n { status: 500 }\n );\n });\n const loggingRes = typeof res?.clone === 'function' ? res?.clone() : null;\n info(`[${params.method ?? 'GET'}] ${fullUrl}`, {\n status: res?.status,\n statusText: res?.statusText,\n text: await loggingRes?.text(),\n });\n return res;\n } catch (e) {\n if (e instanceof Error) {\n error('An error has occurred in the fetch', {\n message: e.message,\n stack: e.stack,\n });\n }\n return new Response(\n 'An unexpected (most likely configuration) problem has occurred',\n { status: 500 }\n );\n }\n}\n","import { Config } from '../../utils/Config';\nimport Logger from '../../utils/Logger';\n\nimport request from './request';\n\nexport type ProviderName =\n | 'discord'\n | 'github'\n | 'google'\n | 'hubspot'\n | 'linkedin'\n | 'slack'\n | 'twitter'\n | 'email' // magic link\n | 'credentials' // email + password\n | 'azure';\n\nexport type Providers = {\n [providerName in ProviderName]: Provider;\n};\nexport type Provider = {\n id: string;\n name: string;\n type: string;\n signinUrl: string;\n callbackUrl: string;\n};\n\nexport type JWT = {\n email: string;\n sub: string;\n id: string;\n iat: number;\n exp: number;\n jti: string;\n};\n\nexport type ActiveSession = {\n id: string;\n email: string;\n expires: string;\n user?: {\n id: string;\n name: string;\n image: string;\n email: string;\n emailVerified: void | Date;\n };\n};\nexport default async function auth(\n req: Request,\n config: Config\n): Promise<null | undefined | ActiveSession> {\n const { info, error } = Logger(config, '[nileauth]');\n info('checking auth');\n\n const sessionUrl = `${config.apiUrl}/auth/session`;\n info(`using session ${sessionUrl}`);\n // handle the pass through with posts\n req.headers.delete('content-length');\n\n const res = await request(sessionUrl, { request: req }, config);\n if (!res) {\n info('no session found');\n return undefined;\n }\n info('session active');\n try {\n const session = await new Response(res.body).json();\n if (Object.keys(session).length === 0) {\n return undefined;\n }\n return session;\n } catch (e) {\n error(e);\n return undefined;\n }\n}\n","import { Routes } from '../../types';\nimport { Config } from '../../../utils/Config';\nimport request from '../../utils/request';\nimport {\n urlMatches,\n apiRoutes,\n DefaultNileAuthRoutes,\n} from '../../utils/routes';\nimport auth from '../../utils/auth';\n\nconst key = 'ME';\n\nexport default async function route(request: Request, config: Config) {\n const url = apiRoutes(config)[key];\n\n if (request.method === 'GET') {\n return await GET(url, { request }, config);\n }\n if (request.method === 'PUT') {\n return await PUT(url, { request }, config);\n }\n if (request.method === 'DELETE') {\n const session = await auth(request, config);\n if (!session) {\n return new Response(null, { status: 401 });\n }\n return await DELETE(url, { request }, config);\n }\n return new Response('method not allowed', { status: 405 });\n}\n\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n\nexport async function fetchMe(\n config: Config,\n method?: 'DELETE' | 'PUT',\n body?: string\n): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${DefaultNileAuthRoutes.ME}`;\n const init: RequestInit = {\n headers: config.headers,\n method: method ?? 'GET',\n };\n if (method === 'PUT') {\n init.body = body;\n }\n\n const req = new Request(clientUrl, init);\n if (method === 'DELETE') {\n return (await config.handlers.DELETE(req)) as Response;\n }\n if (method === 'PUT') {\n return (await config.handlers.PUT(req)) as Response;\n }\n return (await config.handlers.GET(req)) as Response;\n}\n\n/**\n * @swagger\n * /api/me:\n * delete:\n * tags:\n * - users\n * summary: soft deletes a user\n * description: marks the current user for deletion. Can only be done by the current user for the current user\n * operationId: removeSelf\n * parameters:\n * - name: userid\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"200\":\n * description: success if the user was deleted\n * content: {}\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nexport async function DELETE(\n url: string,\n init: RequestInit & { request: Request },\n config: Config\n) {\n init.method = 'DELETE';\n\n return await request(url, init, config);\n}\n/**\n * @swagger\n * /api/me:\n * put:\n * tags:\n * - users\n * summary: updates the current user\n * description: changes the data for the current user\n * operationId: updateSelf\n * responses:\n * \"200\":\n * description: success if the user was deleted\n * content: {}\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nexport async function PUT(\n url: string,\n init: RequestInit & { request: Request },\n config: Config\n) {\n init.method = 'PUT';\n\n return await request(url, init, config);\n}\n\n/**\n * @swagger\n * /api/me:\n * get:\n * tags:\n * - users\n * summary: Identify the principal\n * description: Returns information about the principal associated with the session\n * provided\n * operationId: getSelf\n * responses:\n * \"200\":\n * description: Identified user\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/User'\n * \"400\":\n * description: API/Database failures\n * content:\n * text/plain:\n * schema:\n * type: string\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nasync function GET(\n url: string,\n init: RequestInit & { request: Request },\n config: Config\n) {\n const res = await request(url, init, config);\n return res;\n}\n","import { Config } from './Config';\nimport { X_NILE_TENANT, X_NILE_USER_ID } from './constants';\n\nfunction getTokenFromCookie(headers: Headers, cookieKey: void | string) {\n const cookie = headers.get('cookie')?.split('; ');\n const _cookies: Record<string, string> = {};\n if (cookie) {\n for (const parts of cookie) {\n const cookieParts = parts.split('=');\n const _cookie = cookieParts.slice(1).join('=');\n const name = cookieParts[0];\n _cookies[name] = _cookie;\n }\n }\n\n if (cookie) {\n for (const parts of cookie) {\n const cookieParts = parts.split('=');\n const _cookie = cookieParts.slice(1).join('=');\n const name = cookieParts[0];\n _cookies[name] = _cookie;\n }\n }\n if (cookieKey) {\n return _cookies[cookieKey];\n }\n return null;\n}\nexport function getTenantFromHttp(headers: Headers, config?: Config) {\n const cookieTenant = getTokenFromCookie(headers, X_NILE_TENANT);\n return cookieTenant ?? headers?.get(X_NILE_TENANT) ?? config?.tenantId;\n}\n\n// do we do this any more?\nexport function getUserFromHttp(headers: Headers, config: Config) {\n return headers?.get(X_NILE_USER_ID) ?? config.userId;\n}\n","import { getTenantFromHttp } from '../../../utils/fetch';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes';\nimport { Config } from '../../../utils/Config';\n/**\n * @swagger\n * /api/users:\n * post:\n * tags:\n * - users\n * summary: Creates a user\n * description: Creates a user in the database\n * operationId: createUser\n * parameters:\n * - name: tenantId\n * description: A tenant id to add the user to when they are created\n * in: query\n * schema:\n * type: string\n * - name: newTenantName\n * description: A tenant name to create, then the user to when they are created\n * in: query\n * schema:\n * type: string\n * requestBody:\n * description: |-\n * The email and password combination the user will use to authenticate.\n * The `name` is optional; if provided it will be recorded in the `users` table.\n * The `newTenant` is optional; if provided, it is used as the name of a new tenant record associated with the newly created user.\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/CreateBasicUserRequest'\n * examples:\n * Create User Request:\n * summary: Creates a user with basic credentials\n * description: Create User Request\n * value:\n * email: a.user@somedomain.com\n * password: somepassword\n * name: A. User\n * Create User Request with Tenant:\n * summary: Creates a user and a new tenant for that user\n * description: Create User Request with Tenant\n * value:\n * email: a.user@somedomain.com\n * password: somepassword\n * name: A. User\n * newTenant: My Sandbox\n * responses:\n * \"201\":\n * description: User created\n * content:\n * application/json:\n * schema:\n * $ref: \"#/components/schemas/User\"\n * \"400\":\n * description: API/Database failures\n * content:\n * text/plain:\n * schema:\n * type: string\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nexport async function POST(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n init.body = init.request.body;\n init.method = 'POST';\n const yurl = new URL(init.request.url);\n const tenantId = yurl.searchParams.get('tenantId');\n const newTenantName = yurl.searchParams.get('newTenantName');\n const tenant = tenantId ?? getTenantFromHttp(init.request.headers);\n\n const url = apiRoutes(config).USERS({ tenantId: tenant, newTenantName });\n\n return await request(url, init, config);\n}\n","import { getTenantFromHttp } from '../../../utils/fetch';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes';\nimport { Config } from '../../../utils/Config';\n\n/**\n * @swagger\n * /api/users:\n * get:\n * tags:\n * - users\n * summary: lists users in the tenant\n * description: Returns information about the users within the tenant\n * provided. You can also pass the a `nile.tenant_id` in the header or in a cookie.\n * operationId: listUsers\n * parameters:\n * - name: tenantId\n * in: query\n * schema:\n * type: string\n * responses:\n * \"200\":\n * description: A list of users\n * content:\n * application/json:\n * schema:\n * type: array\n * items:\n * $ref: '#/components/schemas/TenantUser'\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\nexport async function GET(\n config: Config,\n init: RequestInit & { request: Request },\n log: (message: string | unknown, meta?: Record<string, unknown>) => void\n) {\n const yurl = new URL(init.request.url);\n const tenantId = yurl.searchParams.get('tenantId');\n const tenant = tenantId ?? getTenantFromHttp(init.request.headers);\n\n if (!tenant) {\n log('[GET] No tenant id provided.');\n return new Response(null, { status: 404 });\n }\n const url = apiRoutes(config).TENANT_USERS(tenant);\n init.method = 'GET';\n return await request(url, init, config);\n}\n","import { apiRoutes } from '../../../utils/routes';\nimport fetch from '../../../utils/request';\nimport { ActiveSession } from '../../../utils/auth';\nimport { Config } from '../../../../utils/Config';\n\n/**\n * @swagger\n * /api/users/{userid}:\n * put:\n * tags:\n * - users\n * summary: update a user\n * description: updates a user within the tenant\n * operationId: updateUser\n * parameters:\n * - name: userid\n * in: path\n * required: true\n * schema:\n * type: string\n * requestBody:\n * description: |-\n * Update a user\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/UpdateUserRequest'\n * responses:\n * \"200\":\n * description: An updated user\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/User'\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nexport async function PUT(\n config: Config,\n session: null | undefined | ActiveSession,\n init: RequestInit & { request: Request }\n) {\n if (!session) {\n return new Response(null, { status: 401 });\n }\n init.body = init.request.body;\n init.method = 'PUT';\n\n // update the user\n\n const [userId] = new URL(init.request.url).pathname.split('/').reverse();\n\n const url = apiRoutes(config).USER(userId);\n\n return await fetch(url, init, config);\n}\n","import { Routes } from '../../types';\nimport {\n DefaultNileAuthRoutes,\n isUUID,\n prefixAppRoute,\n urlMatches,\n} from '../../utils/routes';\nimport auth from '../../utils/auth';\nimport { Config } from '../../../utils/Config';\nimport Logger from '../../../utils/Logger';\n\nimport { POST } from './POST';\nimport { GET } from './GET';\nimport { PUT } from './[userId]/PUT';\n\nconst key = 'USERS';\n\nexport default async function route(request: Request, config: Config) {\n const { info } = Logger(\n { ...config, debug: config.debug } as Config,\n `[ROUTES][${key}]`\n );\n const session = await auth(request, config);\n\n switch (request.method) {\n case 'GET':\n return await GET(config, { request }, info);\n case 'POST':\n return await POST(config, { request });\n case 'PUT':\n return await PUT(config, session, { request });\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n\nexport async function fetchUser(config: Config, method: 'PUT') {\n let clientUrl = `${prefixAppRoute(config)}${DefaultNileAuthRoutes.USERS}`;\n\n if (method === 'PUT')\n if (!config.userId) {\n throw new Error(\n 'Unable to update user, the userId context is missing. Call nile.setContext({ userId }), set nile.userId = \"userId\", or add it to the function call'\n );\n } else {\n clientUrl = `${prefixAppRoute(\n config\n )}${DefaultNileAuthRoutes.USER.replace('{userId}', config.userId)}`;\n }\n if (!isUUID(config.userId) && config.logger?.warn) {\n config.logger?.warn(\n 'nile.userId is not a valid UUID. This may lead to unexpected behavior in your application.'\n );\n }\n\n const init: RequestInit = {\n method,\n headers: config.headers,\n };\n const req = new Request(clientUrl, init);\n\n return (await config.handlers[method](req)) as Response;\n}\n","import { apiRoutes } from '../../../../utils/routes';\nimport { Config } from '../../../../../utils/Config';\nimport request from '../../../../utils/request';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}/users:\n * get:\n * tags:\n * - users\n * summary: List tenant users\n * description: Lists users that are associated with the specified tenant.\n * operationId: listTenantUsers\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"200\":\n * description: Users found\n * content:\n * application/json:\n * schema:\n * type: array\n * items:\n * $ref: '#/components/schemas/User'\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function GET(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n const [, tenantId] = yurl.pathname.split('/').reverse();\n\n const url = `${apiRoutes(config).TENANT_USERS(tenantId)}`;\n return await request(url, init, config);\n}\n","import { ActiveSession } from '../../../../utils/auth';\nimport fetch from '../../../../utils/request';\nimport { apiRoutes } from '../../../../utils/routes';\nimport { Config } from '../../../../../utils/Config';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}/users:\n * post:\n * tags:\n * - users\n * summary: Create a user in a tenant\n * description: Creates a new user and associates that user with the specified\n * tenant.\n * operationId: createTenantUser\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * requestBody:\n * description: |\n * The email and password combination the user will use to authenticate.\n * The `name` is optional; if provided it will be recorded in the `users` table.\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/CreateBasicUserRequest'\n * examples:\n * Create User Request:\n * summary: Creates a user with basic credentials\n * description: Create User Request\n * value:\n * email: a.user@somedomain.com\n * password: somepassword\n * name: A. User\n * responses:\n * \"201\":\n * description: User created\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/User'\n */\nexport async function POST(\n config: Config,\n session: ActiveSession,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n const [, tenantId] = yurl.pathname.split('/').reverse();\n init.body = JSON.stringify({ email: session.email });\n init.method = 'POST';\n const url = apiRoutes(config).TENANT_USERS(tenantId);\n\n return await fetch(url, init, config);\n}\n","import { Config } from '../../../../../utils/Config';\nimport {\n DefaultNileAuthRoutes,\n isUUID,\n urlMatches,\n} from '../../../../utils/routes';\nimport { Routes } from '../../../../types';\nimport auth from '../../../../utils/auth';\nimport Logger from '../../../../../utils/Logger';\n\nimport { GET } from './GET';\nimport { POST } from './POST';\n\nconst key = 'TENANT_USERS';\n\nexport default async function route(request: Request, config: Config) {\n const { info } = Logger(\n { ...config, debug: config.debug } as Config,\n `[ROUTES][${key}]`\n );\n const session = await auth(request, config);\n\n if (!session) {\n info('401');\n return new Response(null, { status: 401 });\n }\n const yurl = new URL(request.url);\n const [, tenantId] = yurl.pathname.split('/').reverse();\n\n if (!tenantId) {\n info('No tenant id found in path');\n return new Response(null, { status: 404 });\n }\n\n switch (request.method) {\n case 'GET':\n return await GET(config, { request });\n case 'POST':\n return await POST(config, session, { request });\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\n\nexport function matches(configRoutes: Routes, request: Request): boolean {\n const url = new URL(request.url);\n const [userId, possibleTenantId, tenantId] = url.pathname\n .split('/')\n .reverse();\n let route = configRoutes[key]\n .replace('{tenantId}', tenantId)\n .replace('{userId}', userId);\n if (userId === 'users') {\n route = configRoutes[key].replace('{tenantId}', possibleTenantId);\n }\n return urlMatches(request.url, route);\n}\n\nexport async function fetchTenantUsers(\n config: Config,\n method: 'GET' | 'POST',\n payload?: {\n body?: string;\n params?: { newTenantName?: string; tenantId?: string };\n }\n) {\n const { body, params } = payload ?? {};\n if (!config.tenantId) {\n throw new Error(\n 'Unable to fetch tenant, the tenantId context is missing. Call nile.setContext({ tenantId }), set nile.tenantId = \"tenantId\", or add it to the function call'\n );\n }\n if (!isUUID(config.tenantId) && config.logger?.warn) {\n config.logger?.warn(\n 'nile.tenantId is not a valid UUID. This may lead to unexpected behavior in your application.'\n );\n }\n const q = new URLSearchParams();\n if (params?.newTenantName) {\n q.set('newTenantName', params.newTenantName);\n }\n if (params?.tenantId) {\n q.set('tenantId', params.tenantId);\n }\n const clientUrl = `${config.serverOrigin}${\n config.routePrefix\n }${DefaultNileAuthRoutes.TENANT_USERS.replace(\n '{tenantId}',\n config.tenantId\n )}`;\n const m = method ?? 'GET';\n const init: RequestInit = {\n method: m,\n headers: config.headers,\n };\n // I don't think post works\n if (method === 'POST') {\n init.body = body;\n }\n const req = new Request(clientUrl, init);\n\n return (await config.handlers[m](req)) as Response;\n}\n","import { Config } from '../../../utils/Config';\nimport { ActiveSession } from '../../utils/auth';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes';\n\n/**\n * @swagger\n * /api/tenants:\n * get:\n * tags:\n * - tenants\n * summary: list tenants by user\n * description: Creates a user in the database\n * operationId: listTenants\n * responses:\n * \"200\":\n * description: a list of tenants\n * content:\n * application/json:\n * schema:\n * type: array\n * items:\n * $ref: \"#/components/schemas/Tenant\"\n * \"400\":\n * description: API/Database failures\n * content:\n * text/plain:\n * schema:\n * type: string\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\nexport async function GET(\n config: Config,\n session: ActiveSession,\n init: RequestInit & { request: Request }\n) {\n let url = `${apiRoutes(config).USER_TENANTS(session.id)}`;\n if (typeof session === 'object' && 'user' in session && session.user) {\n url = `${apiRoutes(config).USER_TENANTS(session.user.id)}`;\n }\n\n const res = await request(url, init, config);\n return res;\n}\n","import { apiRoutes } from '../../../utils/routes';\nimport { Config } from '../../../../utils/Config';\nimport request from '../../../utils/request';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}:\n * get:\n * tags:\n * - tenants\n * summary: Obtains a specific tenant.\n * operationId: getTenant\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"200\":\n * description: the desired tenant\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/Tenant'\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n * \"404\":\n * description: Tenant not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function GET(\n config: Config,\n init: RequestInit & { request: Request },\n log: (message: string | unknown, meta?: Record<string, unknown>) => void\n) {\n const yurl = new URL(init.request.url);\n const [tenantId] = yurl.pathname.split('/').reverse();\n if (!tenantId) {\n log('[GET] No tenant id provided.');\n return new Response(null, { status: 404 });\n }\n\n init.method = 'GET';\n const url = `${apiRoutes(config).TENANT(tenantId)}`;\n\n return await request(url, init, config);\n}\n","import { apiRoutes } from '../../../utils/routes';\nimport { Config } from '../../../../utils/Config';\nimport fetch from '../../../utils/request';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}:\n * delete:\n * tags:\n * - tenants\n * summary: Deletes a tenant.\n * operationId: deleteTenant\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"204\":\n * description: Tenant deleted\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n * \"404\":\n * description: Tenant not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function DELETE(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n const [tenantId] = yurl.pathname.split('/').reverse();\n if (!tenantId) {\n return new Response(null, { status: 404 });\n }\n\n init.method = 'DELETE';\n const url = `${apiRoutes(config).TENANT(tenantId)}`;\n\n return await fetch(url, init, config);\n}\n","import { apiRoutes } from '../../../utils/routes';\nimport { Config } from '../../../../utils/Config';\nimport fetch from '../../../utils/request';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}:\n * put:\n * tags:\n * - tenants\n * summary: Obtains a specific tenant.\n * operationId: updateTenant\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"201\":\n * description: update an existing tenant\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/Tenant'\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n * \"404\":\n * description: Tenant not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function PUT(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n const [tenantId] = yurl.pathname.split('/').reverse();\n if (!tenantId) {\n return new Response(null, { status: 404 });\n }\n init.body = init.request.body;\n init.method = 'PUT';\n const url = `${apiRoutes(config).TENANT(tenantId)}`;\n\n return await fetch(url, init, config);\n}\n","import { Config } from '../../../utils/Config';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes';\n\n/**\n * @swagger\n * /api/tenants:\n * post:\n * tags:\n * - tenants\n * summary: Create a tenant\n * description: Creates a new tenant in a database.\n * operationId: createTenant\n * requestBody:\n * description: A wrapper for the tenant name.\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/CreateTenantRequest'\n * examples:\n * Create Tenant Request:\n * summary: Creates a named tenant\n * description: Create Tenant Request\n * value:\n * name: My Sandbox\n * responses:\n * \"201\":\n * description: Tenant created\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/Tenant'\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n * \"404\":\n * description: Database not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function POST(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n init.body = init.request.body;\n init.method = 'POST';\n const url = `${apiRoutes(config).TENANTS}`;\n\n return await request(url, init, config);\n}\n","import { Config } from '../../../utils/Config';\nimport { Routes } from '../../types';\nimport auth from '../../utils/auth';\nimport Logger from '../../../utils/Logger';\nimport { urlMatches, DefaultNileAuthRoutes, isUUID } from '../../utils/routes';\n\nimport { GET } from './GET';\nimport { GET as TENANT_GET } from './[tenantId]/GET';\nimport { DELETE } from './[tenantId]/DELETE';\nimport { PUT } from './[tenantId]/PUT';\nimport { POST } from './POST';\n\nconst key = 'TENANTS';\n\nexport default async function route(request: Request, config: Config) {\n const { info } = Logger(\n { ...config, debug: config.debug } as Config,\n `[ROUTES][${key}]`\n );\n const session = await auth(request, config);\n\n if (!session) {\n info('401');\n return new Response(null, { status: 401 });\n }\n const [possibleTenantId] = request.url.split('/').reverse();\n\n switch (request.method) {\n case 'GET':\n if (isUUID(possibleTenantId)) {\n return await TENANT_GET(config, { request }, info);\n }\n return await GET(config, session, { request });\n case 'POST':\n return await POST(config, { request });\n case 'DELETE':\n return await DELETE(config, { request });\n case 'PUT':\n return await PUT(config, { request });\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\n\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n\nexport async function fetchTenants(\n config: Config,\n method: 'POST' | 'GET',\n body?: string\n): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${DefaultNileAuthRoutes.TENANTS}`;\n\n const init: RequestInit = {\n method,\n headers: config.headers,\n };\n if (method === 'POST') {\n init.body = body;\n }\n const req = new Request(clientUrl, init);\n\n return (await config.handlers.POST(req)) as Response;\n}\n\nexport async function fetchTenant(\n config: Config,\n method: 'GET' | 'DELETE' | 'PUT',\n body?: string\n) {\n if (!config.tenantId) {\n throw new Error(\n 'Unable to fetch tenant, the tenantId context is missing. Call nile.setContext({ tenantId }), set nile.tenantId = \"tenantId\", or add it to the function call'\n );\n }\n if (!isUUID(config.tenantId) && config.logger?.warn) {\n config.logger?.warn(\n 'nile.tenantId is not a valid UUID. This may lead to unexpected behavior in your application.'\n );\n }\n const clientUrl = `${config.serverOrigin}${\n config.routePrefix\n }${DefaultNileAuthRoutes.TENANT.replace('{tenantId}', config.tenantId)}`;\n const m = method ?? 'GET';\n const init: RequestInit = {\n method: m,\n headers: config.headers,\n };\n if (m === 'PUT') {\n init.body = body;\n }\n const req = new Request(clientUrl, init);\n\n return (await config.handlers[m](req)) as Response;\n}\n\nexport async function fetchTenantsByUser(config: Config) {\n if (config.logger?.warn) {\n if (!config.userId) {\n config.logger?.warn(\n 'nile.userId is not set. The call will still work for the API, but the database context is not set properly and may lead to unexpected behavior in your application.'\n );\n } else if (!isUUID(config.userId)) {\n config.logger?.warn(\n 'nile.userId is not a valid UUID. This may lead to unexpected behavior in your application.'\n );\n }\n }\n const clientUrl = `${config.serverOrigin}${\n config.routePrefix\n }${DefaultNileAuthRoutes.USER_TENANTS.replace(\n '{userId}',\n config.userId ?? 'WARN_NOT_SET'\n )}`;\n const req = new Request(clientUrl, { headers: config.headers });\n\n return (await config.handlers.GET(req)) as Response;\n}\n","/**\n * @swagger\n * /api/auth/signin:\n * get:\n * tags:\n * - authentication\n * summary: lists users in the tenant\n * description: Returns information about the users within the tenant\n * provided\n * operationId: signin\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"200\":\n * description: A list of users\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/User'\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nimport { Routes } from '../../types';\nimport { Config } from '../../../utils/Config';\nimport { NileAuthRoutes, proxyRoutes, urlMatches } from '../../utils/routes';\nimport request from '../../utils/request';\n\nconst key = 'SIGNIN';\n\nexport default async function route(req: Request, config: Config) {\n let url = proxyRoutes(config)[key];\n\n const init: RequestInit = {\n method: req.method,\n headers: req.headers,\n };\n if (req.method === 'POST') {\n const [provider] = new URL(req.url).pathname.split('/').reverse();\n\n url = `${proxyRoutes(config)[key]}/${provider}`;\n }\n\n const passThroughUrl = new URL(req.url);\n const params = new URLSearchParams(passThroughUrl.search);\n\n url = `${url}${params.toString() !== '' ? `?${params.toString()}` : ''}`;\n const res = await request(url, { ...init, request: req }, config);\n\n return res;\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n\n// this is not for the the credential provider STILL NEED TO FIGURE THIS OUT I THINK? or remove.\nexport async function fetchSignIn(\n config: Config,\n provider: string,\n body: URLSearchParams\n): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${NileAuthRoutes.SIGNIN}/${provider}`;\n const req = new Request(clientUrl, {\n method: 'POST',\n headers: config.headers,\n body,\n });\n\n return (await config.handlers.POST(req)) as Response;\n}\n","import { Routes } from '../../types';\nimport { NileAuthRoutes, proxyRoutes, urlMatches } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Config } from '../../../utils/Config';\n\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config).SESSION,\n {\n method: req.method,\n request: req,\n },\n config\n );\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.SESSION);\n}\n\nexport async function fetchSession(config: Config): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${NileAuthRoutes.SESSION}`;\n const req = new Request(clientUrl, {\n method: 'GET',\n headers: config.headers,\n });\n\n return (await config.handlers.GET(req)) as Response;\n}\n","import { Routes } from '../../types';\nimport { NileAuthRoutes, proxyRoutes, urlMatches } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Config } from '../../../utils/Config';\n\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config).PROVIDERS,\n {\n method: req.method,\n request: req,\n },\n config\n );\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.PROVIDERS);\n}\n\nexport async function fetchProviders(config: Config): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${NileAuthRoutes.PROVIDERS}`;\n const req = new Request(clientUrl, {\n method: 'GET',\n headers: config.headers,\n });\n\n return (await config.handlers.GET(req)) as Response;\n}\n","import { Routes } from '../../types';\nimport { NileAuthRoutes, proxyRoutes, urlMatches } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Config } from '../../../utils/Config';\n\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config).CSRF,\n {\n method: req.method,\n request: req,\n },\n config\n );\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.CSRF);\n}\n\nexport async function fetchCsrf(config: Config): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${NileAuthRoutes.CSRF}`;\n const req = new Request(clientUrl, {\n method: 'GET',\n headers: config.headers,\n });\n\n return (await config.handlers.GET(req)) as Response;\n}\n","import { NileAuthRoutes, proxyRoutes, urlMatches } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Routes } from '../../types';\nimport { Config } from '../../../utils/Config';\nimport Logger from '../../../utils/Logger';\nimport { ProviderName } from '../../utils/auth';\n\nconst key = 'CALLBACK';\n\nexport default async function route(req: Request, config: Config) {\n const { error } = Logger(\n { ...config, debug: config.debug } as Config,\n `[ROUTES][${key}]`\n );\n const [provider] = new URL(req.url).pathname.split('/').reverse();\n try {\n const passThroughUrl = new URL(req.url);\n const params = new URLSearchParams(passThroughUrl.search);\n const url = `${proxyRoutes(config)[key]}/${provider}${\n params.toString() !== '' ? `?${params.toString()}` : ''\n }`;\n\n const res = await request(\n url,\n {\n request: req,\n method: req.method,\n },\n config\n ).catch((e) => {\n error('an error as occurred', e);\n });\n\n const location = res?.headers.get('location');\n if (location) {\n return new Response(res?.body, {\n status: 302,\n headers: res?.headers,\n });\n }\n return new Response(res?.body, {\n status: res?.status,\n headers: res?.headers,\n });\n } catch (e) {\n error(e);\n }\n return new Response('An unexpected error has occurred.', { status: 400 });\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.CALLBACK);\n}\n\n// this is for the the credential provider, among other things\nexport async function fetchCallback(\n config: Config,\n provider: ProviderName,\n body?: string,\n request?: Request,\n method: 'POST' | 'GET' = 'POST'\n): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${\n NileAuthRoutes.CALLBACK\n }/${provider}${request ? `?${new URL(request.url).searchParams}` : ''}`;\n const req = new Request(clientUrl, {\n method,\n headers: config.headers,\n body,\n });\n\n return (await config.handlers.POST(req)) as Response;\n}\n","import { Routes } from '../../types';\nimport { NileAuthRoutes, proxyRoutes, urlMatches } from '../../utils/routes';\nimport fetch from '../../utils/request';\nimport { Config } from '../../../utils/Config';\n\nconst key = 'SIGNOUT';\nexport default async function route(request: Request, config: Config) {\n let url = proxyRoutes(config)[key];\n\n const init: RequestInit = {\n method: request.method,\n };\n if (request.method === 'POST') {\n init.body = request.body;\n const [provider] = new URL(request.url).pathname.split('/').reverse();\n url = `${proxyRoutes(config)[key]}${\n provider !== 'signout' ? `/${provider}` : ''\n }`;\n }\n\n const res = await fetch(url, { ...init, request }, config);\n return res;\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n\nexport async function fetchSignOut(\n config: Config,\n body: string\n): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${NileAuthRoutes.SIGNOUT}`;\n const req = new Request(clientUrl, {\n method: 'POST',\n body,\n headers: config.headers,\n });\n\n return (await config.handlers.POST(req)) as Response;\n}\n","import { Routes } from '../../types';\nimport { urlMatches, proxyRoutes } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Config } from '../../../utils/Config';\n\nconst key = 'ERROR';\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config)[key],\n {\n method: req.method,\n request: req,\n },\n config\n );\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n","import { urlMatches, proxyRoutes } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Routes } from '../../types';\nimport { Config } from '../../../utils/Config';\n\nconst key = 'VERIFY_REQUEST';\n\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config)[key],\n {\n method: req.method,\n request: req,\n },\n config\n );\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n","import { Routes } from '../../types';\nimport { urlMatches, proxyRoutes, NileAuthRoutes } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Config } from '../../../utils/Config';\n\nconst key = 'PASSWORD_RESET';\nexport default async function route(req: Request, config: Config) {\n const url = proxyRoutes(config)[key];\n\n const res = await request(\n url,\n {\n method: req.method,\n request: req,\n },\n config\n );\n\n const location = res?.headers.get('location');\n if (location) {\n return new Response(res?.body, {\n status: 302,\n headers: res?.headers,\n });\n }\n return new Response(res?.body, {\n status: res?.status,\n headers: res?.headers,\n });\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.PASSWORD_RESET);\n}\n\nexport async function fetchResetPassword(\n config: Config,\n method: 'POST' | 'GET' | 'PUT',\n body: null | string,\n params?: URLSearchParams,\n useJson = true\n) {\n const authParams = new URLSearchParams(params ?? {});\n if (useJson) {\n authParams?.set('json', 'true');\n }\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${\n NileAuthRoutes.PASSWORD_RESET\n }?${authParams?.toString()}`;\n const init: RequestInit = {\n method,\n headers: config.headers,\n };\n if (body && method !== 'GET') {\n init.body = body;\n }\n const req = new Request(clientUrl, init);\n return (await config.handlers[method](req)) as Response;\n}\n","import { Routes } from '../../types';\nimport { urlMatches, proxyRoutes, NileAuthRoutes } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Config } from '../../../utils/Config';\n\nconst key = 'VERIFY_EMAIL';\nexport default async function route(req: Request, config: Config) {\n const url = proxyRoutes(config)[key];\n\n const res = await request(\n url,\n {\n method: req.method,\n request: req,\n },\n config\n );\n\n const location = res?.headers.get('location');\n if (location) {\n return new Response(res?.body, {\n status: 302,\n headers: res?.headers,\n });\n }\n return new Response(res?.body, {\n status: res?.status,\n headers: res?.headers,\n });\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n\nexport async function fetchVerifyEmail(\n config: Config,\n method: 'POST' | 'GET',\n body?: string\n): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${NileAuthRoutes.VERIFY_EMAIL}`;\n const init: RequestInit = {\n method,\n headers: config.headers,\n };\n if (body) {\n init.body = body;\n }\n const req = new Request(clientUrl, init);\n\n return (await config.handlers[method](req)) as Response;\n}\n","import Logger from '../../utils/Logger';\nimport me, { matches as matchesMe } from '../routes/me';\nimport users, { matches as matchesUsers } from '../routes/users';\nimport tenantUsers, {\n matches as matchesTenantUsers,\n} from '../routes/tenants/[tenantId]/users';\nimport tenants, { matches as matchesTenants } from '../routes/tenants';\nimport { Routes } from '../types';\nimport * as authRoutes from '../routes/auth';\nimport { Config } from '../../utils/Config';\n\nexport default function GETTER(configRoutes: Routes, config: Config) {\n const { info, warn } = Logger(config, '[GET MATCHER]');\n return async function GET(req: Request) {\n if (matchesMe(configRoutes, req)) {\n info('matches me');\n return me(req, config);\n }\n if (matchesTenantUsers(configRoutes, req)) {\n info('matches tenant users');\n return tenantUsers(req, config);\n }\n if (matchesUsers(configRoutes, req)) {\n info('matches users');\n return users(req, config);\n }\n\n if (matchesTenants(configRoutes, req)) {\n info('matches tenants');\n return tenants(req, config);\n }\n\n if (authRoutes.matchSession(configRoutes, req)) {\n info('matches session');\n return authRoutes.handleSession(req, config);\n }\n\n if (authRoutes.matchSignIn(configRoutes, req)) {\n info('matches signin');\n return authRoutes.handleSignIn(req, config);\n }\n\n if (authRoutes.matchProviders(configRoutes, req)) {\n info('matches providers');\n return authRoutes.handleProviders(req, config);\n }\n\n if (authRoutes.matchCsrf(configRoutes, req)) {\n info('matches csrf');\n return authRoutes.handleCsrf(req, config);\n }\n\n if (authRoutes.matchesPasswordReset(configRoutes, req)) {\n info('matches password reset');\n return authRoutes.handlePasswordReset(req, config);\n }\n\n if (authRoutes.matchCallback(configRoutes, req)) {\n info('matches callback');\n return authRoutes.handleCallback(req, config);\n }\n\n if (authRoutes.matchSignOut(configRoutes, req)) {\n info('matches signout');\n return authRoutes.handleSignOut(req, config);\n }\n\n if (authRoutes.matchesVerifyRequest(configRoutes, req)) {\n info('matches verify-request');\n return authRoutes.handleVerifyRequest(req, config);\n }\n\n if (authRoutes.matchesVerifyEmail(configRoutes, req)) {\n info('matches verify-email');\n return authRoutes.handleVerifyEmail(req, config);\n }\n\n if (authRoutes.matchError(configRoutes, req)) {\n info('matches error');\n return authRoutes.handleError(req, config);\n }\n warn(`No GET routes matched ${req.url}`);\n return new Response(null, { status: 404 });\n };\n}\n","import { Config } from '../../../utils/Config';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes';\n\n/**\n * @swagger\n * /api/signup:\n * post:\n * tags:\n * - users\n * summary: signs a user up\n * description: signs a user up and logs them in. Expects a email and password combo\n * operationId: signUp\n * parameters:\n * - name: tenantId\n * description: A tenant id to add the user to when they are created\n * in: query\n * schema:\n * type: string\n * - name: newTenantName\n * description: A tenant name to create, then the user to when they are created\n * in: query\n * schema:\n * type: string\n * requestBody:\n * description: |-\n * The email and password combination the user will use to authenticate.\n * The `name` is optional; if provided it will be recorded in the `users` table.\n * The `newTenant` is optional; if provided, it is used as the name of a new tenant record associated with the newly created user.\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/CreateBasicUserRequest'\n * examples:\n * Create User Request:\n * summary: Creates a user with basic credentials\n * description: Create User Request\n * value:\n * email: a.user@somedomain.com\n * password: somepassword\n * name: A. User\n * Create User Request with Tenant:\n * summary: Creates a user and a new tenant for that user\n * description: Create User Request with Tenant\n * value:\n * email: a.user@somedomain.com\n * password: somepassword\n * name: A. User\n * newTenant: My Sandbox\n * responses:\n * \"201\":\n * description: User and session created\n * content:\n * application/json:\n * schema:\n * $ref: \"#/components/schemas/User\"\n * \"400\":\n * description: API/Database failures\n * content:\n * text/plain:\n * schema:\n * type: string\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\nexport async function POST(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n init.body = init.request.body;\n init.method = 'POST';\n const url = `${apiRoutes(config).SIGNUP}`;\n\n return await request(url, init, config);\n}\n","import { Config } from '../../../utils/Config';\nimport { Routes } from '../../types';\nimport { urlMatches, DefaultNileAuthRoutes } from '../../utils/routes';\n\nimport { POST } from './POST';\n\nconst key = 'SIGNUP';\n\nexport default async function route(request: Request, config: Config) {\n switch (request.method) {\n case 'POST':\n return await POST(config, { request });\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\n\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n\nexport async function fetchSignUp(\n config: Config,\n payload: {\n body?: string;\n params?: { newTenantName?: string; tenantId?: string };\n }\n): Promise<Response> {\n const { body, params } = payload ?? {};\n const q = new URLSearchParams();\n if (params?.newTenantName) {\n q.set('newTenantName', params.newTenantName);\n }\n if (params?.tenantId) {\n q.set('tenantId', params.tenantId);\n }\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${\n DefaultNileAuthRoutes.SIGNUP\n }${q.size > 0 ? `?${q}` : ''}`;\n const req = new Request(clientUrl, {\n method: 'POST',\n headers: config.headers,\n body,\n });\n\n return (await config.handlers.POST(req)) as Response;\n}\n","import Logger, { matchesLog } from '../../utils/Logger';\nimport users, { matches as matchesUsers } from '../routes/users';\nimport tenants, { matches as matchesTenants } from '../routes/tenants';\nimport signup, { matches as matchesSignup } from '../routes/signup';\nimport tenantUsers, {\n matches as matchesTenantUsers,\n} from '../routes/tenants/[tenantId]/users';\nimport { Routes } from '../types';\nimport { Config } from '../../utils/Config';\nimport * as authRoutes from '../routes/auth';\n\nexport default function POSTER(configRoutes: Routes, config: Config) {\n const { info, warn, error } = Logger(config, '[POST MATCHER]');\n return async function POST(req: Request) {\n // special case for logging client errors\n if (matchesLog(configRoutes, req)) {\n try {\n const json = await req.clone().json();\n error(req.body && json);\n } catch {\n error(await req.text());\n }\n return new Response(null, { status: 200 });\n }\n // order matters for tenantUsers\n if (matchesTenantUsers(configRoutes, req)) {\n info('matches tenant users');\n return tenantUsers(req, config);\n }\n\n if (matchesSignup(configRoutes, req)) {\n info('matches signup');\n return signup(req, config);\n }\n\n if (matchesUsers(configRoutes, req)) {\n info('matches users');\n return users(req, config);\n }\n if (matchesTenants(configRoutes, req)) {\n info('matches tenants');\n return tenants(req, config);\n }\n\n if (authRoutes.matchSession(configRoutes, req)) {\n info('matches session');\n return authRoutes.handleSession(req, config);\n }\n\n if (authRoutes.matchSignIn(configRoutes, req)) {\n info('matches signin');\n return authRoutes.handleSignIn(req, config);\n }\n if (authRoutes.matchesPasswordReset(configRoutes, req)) {\n info('matches password reset');\n return authRoutes.handlePasswordReset(req, config);\n }\n\n if (authRoutes.matchProviders(configRoutes, req)) {\n info('matches providers');\n return authRoutes.handleProviders(req, config);\n }\n\n if (authRoutes.matchCsrf(configRoutes, req)) {\n info('matches csrf');\n return authRoutes.handleCsrf(req, config);\n }\n\n if (authRoutes.matchCallback(configRoutes, req)) {\n info('matches callback');\n return authRoutes.handleCallback(req, config);\n }\n if (authRoutes.matchSignOut(configRoutes, req)) {\n info('matches signout');\n return authRoutes.handleSignOut(req, config);\n }\n if (authRoutes.matchesVerifyEmail(configRoutes, req)) {\n info('matches verify-email');\n return authRoutes.handleVerifyEmail(req, config);\n }\n\n warn(`No POST routes matched ${req.url}`);\n return new Response(null, { status: 404 });\n };\n}\n","import { apiRoutes } from '../../../../../utils/routes';\nimport fetch from '../../../../../utils/request';\nimport { Config } from '../../../../../../utils/Config';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}/users/{userId}/link:\n * delete:\n * tags:\n * - tenants\n * summary: removes a user from a tenant\n * description: removes an associated user from a specified\n * tenant.\n * operationId: leaveTenant \n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * - name: userId \n * in: path\n * required: true\n * schema:\n * type: string\n * - name: email \n * in: path\n * required: true\n * schema:\n * type: string\n \n * responses:\n * \"204\":\n * description: User removed\n */\n\nexport async function DELETE(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n\n const [, userId, , tenantId] = yurl.pathname.split('/').reverse();\n config.tenantId = tenantId;\n config.userId = userId;\n\n init.method = 'DELETE';\n const url = `${apiRoutes(config).TENANT_USER}/link`;\n\n return await fetch(url, init, config);\n}\n","import { apiRoutes } from '../../../../../utils/routes';\nimport fetch from '../../../../../utils/request';\nimport { Config } from '../../../../../../utils/Config';\n/**\n * @swagger\n * /api/tenants/{tenantId}/users/{userId}/link:\n * put:\n * tags:\n * - tenants\n * summary: associates an existing user with the tenant\n * operationId: linkUser\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * - name: userId \n * in: path\n * required: true\n * schema:\n * type: string\n \n * requestBody:\n * description: |\n * The email of the user you want to add to a tenant.\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/AssociateUserRequest'\n * responses:\n * \"201\":\n * description: add user to tenant\n */\n\nexport async function PUT(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n\n const [, userId, , tenantId] = yurl.pathname.split('/').reverse();\n config.tenantId = tenantId;\n config.userId = userId;\n\n init.method = 'PUT';\n const url = `${apiRoutes(config).TENANT_USER}/link`;\n\n return await fetch(url, init, config);\n}\n","import { Config } from '../../../../../../utils/Config';\nimport { DefaultNileAuthRoutes, urlMatches } from '../../../../../utils/routes';\nimport { Routes } from '../../../../../types';\nimport auth from '../../../../../utils/auth';\nimport Logger from '../../../../../../utils/Logger';\n\nimport { DELETE } from './DELETE';\nimport { PUT } from './PUT';\n\nconst key = 'TENANT_USER';\n\nexport default async function route(request: Request, config: Config) {\n const { info } = Logger(\n { ...config, debug: config.debug } as Config,\n `[ROUTES][${key}]`\n );\n const session = await auth(request, config);\n\n if (!session) {\n info('401');\n return new Response(null, { status: 401 });\n }\n const yurl = new URL(request.url);\n const [, userId] = yurl.pathname.split('/').reverse();\n\n if (!userId) {\n info('No tenant id found in path');\n return new Response(null, { status: 404 });\n }\n\n switch (request.method) {\n case 'PUT':\n return await PUT(config, { request });\n case 'DELETE':\n return await DELETE(config, { request });\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\n\nexport function matches(configRoutes: Routes, request: Request): boolean {\n const url = new URL(request.url);\n const [, userId, possibleTenantId, tenantId] = url.pathname\n .split('/')\n .reverse();\n let route = configRoutes[key]\n .replace('{tenantId}', tenantId)\n .replace('{userId}', userId);\n if (userId === 'users') {\n route = configRoutes[key].replace('{tenantId}', possibleTenantId);\n }\n return urlMatches(request.url, route);\n}\n\nexport async function fetchTenantUser(\n config: Config,\n method: 'DELETE' | 'PUT'\n) {\n if (!config.tenantId) {\n throw new Error(\n 'The tenantId context is missing. Call nile.setContext({ tenantId })'\n );\n }\n\n if (!config.userId) {\n throw new Error(\n 'the userId context is missing. Call nile.setContext({ userId })'\n );\n }\n\n const clientUrl = `${config.serverOrigin}${\n config.routePrefix\n }${DefaultNileAuthRoutes.TENANT_USER.replace(\n '{tenantId}',\n config.tenantId\n ).replace('{userId}', config.userId)}/link`;\n const req = new Request(clientUrl, {\n headers: config.headers,\n method,\n });\n\n return (await config.handlers[method](req)) as Response;\n}\n","import Logger from '../../utils/Logger';\nimport tenants, { matches as matchesTenants } from '../routes/tenants';\nimport tenantUsers, {\n matches as matchesTenantsUsers,\n} from '../routes/tenants/[tenantId]/users';\nimport me, { matches as matchesMe } from '../routes/me';\nimport tenantUser, {\n matches as matchesTenantUser,\n} from '../routes/tenants/[tenantId]/users/[userId]';\nimport { Routes } from '../types';\nimport { Config } from '../../utils/Config';\n\nexport default function DELETER(configRoutes: Routes, config: Config) {\n const { info, warn } = Logger(config, '[DELETE MATCHER]');\n return async function DELETE(req: Request) {\n if (matchesTenantUser(configRoutes, req)) {\n info('matches tenant user');\n return tenantUser(req, config);\n }\n if (matchesTenantsUsers(configRoutes, req)) {\n info('matches tenant users');\n return tenantUsers(req, config);\n }\n\n if (matchesTenants(configRoutes, req)) {\n info('matches tenants');\n return tenants(req, config);\n }\n if (matchesMe(configRoutes, req)) {\n info('matches me');\n return me(req, config);\n }\n\n warn('No DELETE routes matched');\n return new Response(null, { status: 404 });\n };\n}\n","import Logger from '../../utils/Logger';\nimport users, { matches as matchesUsers } from '../routes/users';\nimport tenants, { matches as matchesTenants } from '../routes/tenants';\nimport me, { matches as matchesMe } from '../routes/me';\nimport tenantUsers, {\n matches as matchesTenantUsers,\n} from '../routes/tenants/[tenantId]/users';\nimport tenantUser, {\n matches as matchesTenantUser,\n} from '../routes/tenants/[tenantId]/users/[userId]';\nimport { handlePasswordReset, matchesPasswordReset } from '../routes/auth';\nimport { Routes } from '../types';\nimport { Config } from '../../utils/Config';\n\nexport default function PUTER(configRoutes: Routes, config: Config) {\n const { info, warn } = Logger(config, '[PUT MATCHER]');\n return async function PUT(req: Request) {\n if (matchesTenantUser(configRoutes, req)) {\n info('matches tenant user');\n return tenantUser(req, config);\n }\n if (matchesTenantUsers(configRoutes, req)) {\n info('matches tenant users');\n return tenantUsers(req, config);\n }\n if (matchesUsers(configRoutes, req)) {\n info('matches users');\n return users(req, config);\n }\n if (matchesMe(configRoutes, req)) {\n info('matches me');\n return me(req, config);\n }\n if (matchesTenants(configRoutes, req)) {\n info('matches tenants');\n return tenants(req, config);\n }\n if (matchesPasswordReset(configRoutes, req)) {\n info('matches reset password');\n return handlePasswordReset(req, config);\n }\n warn('No PUT routes matched');\n return new Response(null, { status: 404 });\n };\n}\n","import { Config } from '../../utils/Config';\nimport { Routes } from '../types';\n\nimport getter from './GET';\nimport poster from './POST';\nimport deleter from './DELETE';\nimport puter from './PUT';\n\nexport default function Handlers(configRoutes: Routes, config: Config) {\n const GET = getter(configRoutes, config);\n const POST = poster(configRoutes, config);\n const DELETE = deleter(configRoutes, config);\n const PUT = puter(configRoutes, config);\n return {\n GET,\n POST,\n DELETE,\n PUT,\n };\n}\n","import 'dotenv/config';\nimport { NileConfig } from '../../types';\nimport Logger from '../Logger';\n\nexport type EnvConfig = {\n logger?: string;\n config?: NileConfig;\n};\n\nexport const getApiUrl = (cfg: EnvConfig) => {\n const { config } = cfg;\n if (config?.apiUrl != null) {\n return config?.apiUrl;\n }\n if (stringCheck(process.env.NILEDB_API_URL)) {\n return process.env.NILEDB_API_URL;\n }\n\n throw new Error(\n 'A connection to nile-auth is required. Set NILEDB_API_URL as an environment variable.'\n );\n};\n\nexport const getCallbackUrl = (cfg: EnvConfig) => {\n const { config } = cfg;\n if (stringCheck(config?.callbackUrl)) {\n return config?.callbackUrl;\n }\n return process.env.NILEDB_CALLBACK_URL;\n};\n\nexport const getSecureCookies = (cfg: EnvConfig) => {\n const { config } = cfg;\n if (config?.secureCookies != null) {\n return config?.secureCookies;\n }\n if (stringCheck(process.env.NILEDB_SECURECOOKIES)) {\n return Boolean(process.env.NILEDB_SECURECOOKIES);\n }\n return undefined;\n};\n\nexport const getUsername = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n\n const { info } = Logger(config, '[username]');\n if (config?.user) {\n logger && info(`${logger}[config] ${config.user}`);\n return String(config?.user);\n }\n const user = stringCheck(process.env.NILEDB_USER);\n if (user) {\n logger && info(`${logger}[NILEDB_USER] ${user}`);\n return user;\n }\n\n const pg = stringCheck(process.env.NILEDB_POSTGRES_URL);\n if (pg) {\n try {\n const url = new URL(pg);\n if (url.username) {\n return url.username;\n }\n } catch (e) {\n //ok to fail\n }\n }\n throw new Error(\n 'A database user is required. Set NILEDB_USER as an environment variable.'\n );\n};\n\nexport const getPassword = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n const log = logProtector(logger);\n const { info } = Logger(config, '[password]');\n if (stringCheck(config?.password)) {\n log && info(`${logger}[config] ***`);\n return String(config?.password);\n }\n\n const pass = stringCheck(process.env.NILEDB_PASSWORD);\n if (pass) {\n logger && info(`${logger}[NILEDB_PASSWORD] ***`);\n\n return pass;\n }\n const pg = stringCheck(process.env.NILEDB_POSTGRES_URL);\n if (pg) {\n try {\n const url = new URL(pg);\n if (url.password) {\n return url.password;\n }\n } catch (e) {\n // ok to fail\n }\n }\n throw new Error(\n 'A database password is required. Set NILEDB_PASSWORD as an environment variable.'\n );\n};\n\nexport const getDatabaseName = (cfg: EnvConfig) => {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[databaseName]');\n if (stringCheck(config?.databaseName)) {\n logger && info(`${logger}[config] ${config?.databaseName}`);\n return String(config?.databaseName);\n }\n const name = stringCheck(process.env.NILEDB_NAME);\n if (name) {\n logger && info(`${logger}[NILEDB_NAME] ${name}`);\n return name;\n }\n\n if (process.env.NILEDB_POSTGRES_URL) {\n try {\n const pgUrl = new URL(process.env.NILEDB_POSTGRES_URL);\n return pgUrl.pathname.substring(1);\n } catch (e) {\n // ok to fail\n }\n }\n throw new Error(\n 'A database name is required. Set NILEDB_PASSWORD as an environment variable.'\n );\n};\n\nexport const getTenantId = (cfg: EnvConfig): string | null => {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[tenantId]');\n if (stringCheck(config?.tenantId)) {\n logger && info(`${logger}[config] ${config?.tenantId}`);\n return String(config?.tenantId);\n }\n\n if (stringCheck(process.env.NILEDB_TENANT)) {\n logger && info(`${logger}[NILEDB_TENANT] ${process.env.NILEDB_TENANT}`);\n return String(process.env.NILEDB_TENANT);\n }\n\n return null;\n};\n\nexport function getDbHost(cfg: EnvConfig) {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[db.host]');\n\n if (stringCheck(config?.db && config.db.host)) {\n logger && info(`${logger}[config] ${config?.db?.host}`);\n return String(config?.db?.host);\n }\n\n if (stringCheck(process.env.NILEDB_HOST)) {\n logger && info(`${logger}[NILEDB_HOST] ${process.env.NILEDB_HOST}`);\n return process.env.NILEDB_HOST;\n }\n\n const pg = stringCheck(process.env.NILEDB_POSTGRES_URL);\n if (pg) {\n try {\n const pgUrl = new URL(pg);\n logger && info(`${logger}[NILEDB_POSTGRES_URL] ${pgUrl.hostname}`);\n return pgUrl.hostname;\n } catch (e) {\n // ok to fail\n }\n }\n\n logger && info(`${logger}[default] db.thenile.dev`);\n return 'db.thenile.dev';\n}\n\nexport function getDbPort(cfg: EnvConfig): number {\n const { config, logger } = cfg;\n const { info } = Logger(config, '[db.port]');\n if (config?.db?.port && config.db.port != null) {\n logger && info(`${logger}[config] ${config?.db.port}`);\n return Number(config.db?.port);\n }\n\n if (stringCheck(process.env.NILEDB_PORT)) {\n logger && info(`${logger}[NILEDB_PORT] ${process.env.NILEDB_PORT}`);\n return Number(process.env.NILEDB_PORT);\n }\n\n const pg = stringCheck(process.env.NILEDB_POSTGRES_URL);\n if (pg) {\n try {\n const pgUrl = new URL(pg);\n if (pgUrl.port) {\n return Number(pgUrl.port);\n }\n } catch (e) {\n // ok to fail\n }\n }\n logger && info(`${logger}[default] 5432`);\n return 5432;\n}\n\n// don't let people accidentally log secrets to production\nconst logProtector = (logger?: string) => {\n return process.env.NODE_ENV === 'development' ||\n process.env.NODE_ENV === 'test'\n ? logger\n : null;\n};\n\nconst stringCheck = (str: string | null | undefined) => {\n if (str && str !== '') {\n return str;\n }\n return;\n};\n","import Handlers from '../../api/handlers';\nimport { appRoutes } from '../../api/utils/routes';\nimport { Routes } from '../../api/types';\nimport { LoggerType, NilePoolConfig, NileConfig } from '../../types';\n\nimport {\n EnvConfig,\n getDatabaseName,\n getDbHost,\n getDbPort,\n getPassword,\n getUsername,\n getSecureCookies,\n getCallbackUrl,\n getApiUrl,\n} from './envVars';\n\nexport class Config {\n routes: Routes;\n handlers: {\n GET: (req: Request) => Promise<void | Response>;\n POST: (req: Request) => Promise<void | Response>;\n DELETE: (req: Request) => Promise<void | Response>;\n PUT: (req: Request) => Promise<void | Response>;\n };\n paths: {\n get: string[];\n post: string[];\n delete: string[];\n put: string[];\n };\n logger?: LoggerType;\n /**\n * Stores the set tenant id from Server for use in sub classes\n */\n tenantId: string | null | undefined;\n /**\n * Stores the set user id from Server for use in sub classes\n */\n userId: string | null | undefined;\n\n /**\n * Stores the headers to be used in `fetch` calls\n */\n headers: Headers;\n\n /**\n * The nile-auth url\n */\n apiUrl: string;\n\n origin?: string | undefined | null;\n\n /**\n * important for separating the `origin` config value from a default in order to make requests\n */\n serverOrigin: string;\n\n debug?: boolean;\n /**\n * To use secure cookies or not in the fetch\n */\n secureCookies?: boolean;\n\n callbackUrl?: string;\n /**\n * change the starting route\n */\n routePrefix: string;\n\n db: NilePoolConfig;\n\n // api: ApiConfig;\n\n constructor(config?: NileConfig, logger?: string) {\n const envVarConfig: EnvConfig = { config, logger };\n this.routePrefix = config?.routePrefix ?? '/api';\n this.secureCookies = getSecureCookies(envVarConfig);\n this.callbackUrl = getCallbackUrl(envVarConfig);\n this.debug = config?.debug;\n this.origin = config?.origin;\n\n this.serverOrigin = config?.origin ?? 'http://localhost:3000';\n\n // this four throw because its the only way to get it\n this.apiUrl = getApiUrl(envVarConfig) as string;\n const user = getUsername(envVarConfig) as string;\n const password = getPassword(envVarConfig) as string;\n const databaseName = getDatabaseName(envVarConfig) as string;\n\n const { host, port, ...dbConfig } = config?.db ?? {};\n const configuredHost = host ?? getDbHost(envVarConfig);\n const configuredPort = port ?? getDbPort(envVarConfig);\n\n this.db = {\n user,\n password,\n host: configuredHost,\n port: configuredPort,\n ...dbConfig,\n };\n if (databaseName) {\n this.db.database = databaseName;\n }\n\n // we need these values no matter what, so break if they are missing\n\n if (config?.headers) {\n this.headers = config?.headers as Headers;\n } else {\n this.headers = new Headers();\n }\n\n this.routes = {\n ...appRoutes(config?.routePrefix),\n ...config?.routes,\n };\n\n this.handlers = Handlers(this.routes as Routes, this);\n // this.handlersWithContext = handlersWithContext(this.routes, this);\n\n this.paths = {\n get: [\n this.routes.ME,\n this.routes.TENANT_USERS,\n this.routes.TENANTS,\n this.routes.TENANT,\n this.routes.SESSION,\n this.routes.SIGNIN,\n this.routes.PROVIDERS,\n this.routes.CSRF,\n this.routes.PASSWORD_RESET,\n this.routes.CALLBACK,\n this.routes.SIGNOUT,\n this.routes.VERIFY_REQUEST,\n this.routes.ERROR,\n ],\n post: [\n this.routes.TENANT_USERS,\n this.routes.SIGNUP,\n this.routes.USERS,\n this.routes.TENANTS,\n this.routes.SESSION,\n `${this.routes.SIGNIN}/{provider}`,\n this.routes.PASSWORD_RESET,\n this.routes.PROVIDERS,\n this.routes.CSRF,\n `${this.routes.CALLBACK}/{provider}`,\n this.routes.SIGNOUT,\n ],\n put: [\n this.routes.TENANT_USERS,\n this.routes.USERS,\n this.routes.TENANT,\n this.routes.PASSWORD_RESET,\n ],\n delete: [this.routes.TENANT_USER, this.routes.TENANT],\n };\n this.tenantId = config?.tenantId;\n this.userId = config?.userId;\n this.logger = config?.logger;\n }\n}\n","// Define a map of event names to value types\ntype EventMap = {\n [Events.User]: string | null | undefined;\n [Events.Tenant]: string | null | undefined;\n [Events.Token]: string | null | undefined;\n [Events.EvictPool]: string | null | undefined;\n [Events.Headers]: Headers | null | undefined;\n};\n\n// Generic EventFn now uses the EventMap\ntype EventFn<K extends keyof EventMap = keyof EventMap> = (\n params: EventMap[K]\n) => void;\n\nenum Events {\n User = 'userId',\n Tenant = 'tenantId',\n Token = 'token',\n EvictPool = 'EvictPool',\n Headers = 'headers',\n}\n\nclass Eventer<E extends Record<string, unknown>> {\n private events: { [K in keyof E]?: Array<(value: E[K]) => void> } = {};\n\n publish<K extends keyof E>(eventName: K, value: E[K]) {\n const callbacks = this.events[eventName];\n if (callbacks) {\n for (const callback of callbacks) {\n callback(value);\n }\n }\n }\n\n subscribe<K extends keyof E>(eventName: K, callback: (value: E[K]) => void) {\n if (!this.events[eventName]) {\n this.events[eventName] = [];\n }\n this.events[eventName].push(callback);\n }\n\n unsubscribe<K extends keyof E>(\n eventName: K,\n callback: (value: E[K]) => void\n ) {\n const callbacks = this.events[eventName];\n if (!callbacks) return;\n\n const index = callbacks.indexOf(callback);\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n\n if (callbacks.length === 0) {\n delete this.events[eventName];\n }\n }\n}\n\nconst eventer = new Eventer<EventMap>();\n\nexport const updateTenantId = (tenantId: EventMap[Events.Tenant]) => {\n eventer.publish(Events.Tenant, tenantId);\n};\nexport const watchTenantId = (cb: EventFn<Events.Tenant>) =>\n eventer.subscribe(Events.Tenant, cb);\n\nexport const updateUserId = (userId: EventMap[Events.User]) => {\n eventer.publish(Events.User, userId);\n};\nexport const watchUserId = (cb: EventFn<Events.User>) =>\n eventer.subscribe(Events.User, cb);\n\nexport const updateToken = (token: EventMap[Events.Token]) => {\n eventer.publish(Events.Token, token);\n};\n\nexport const evictPool = (val: EventMap[Events.EvictPool]) => {\n eventer.publish(Events.EvictPool, val);\n};\nexport const watchEvictPool = (cb: EventFn<Events.EvictPool>) =>\n eventer.subscribe(Events.EvictPool, cb);\n\nexport const updateHeaders = (val: EventMap[Events.Headers]) => {\n eventer.publish(Events.Headers, val);\n};\nexport const watchHeaders = (cb: EventFn<Events.Headers>) =>\n eventer.subscribe(Events.Headers, cb);\n","import pg from 'pg';\n\nimport { Config } from '../utils/Config';\nimport Logger from '../utils/Logger';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AllowAny = any;\n\nexport function createProxyForPool(pool: pg.Pool, config: Config): pg.Pool {\n const { info, error } = Logger(config, '[pool]');\n return new Proxy<pg.Pool>(pool, {\n get(target: AllowAny, property) {\n if (property === 'query') {\n // give connection string a pass for these problems\n if (!config.db.connectionString) {\n if (!config.db.user || !config.db.password) {\n error(\n 'Cannot connect to the database. User and/or password are missing. Generate them at https://console.thenile.dev'\n );\n } else if (!config.db.database) {\n error(\n 'Unable to obtain database name. Is process.env.NILEDB_POSTGRES_URL set?'\n );\n }\n }\n const caller = target[property];\n return function query(...args: AllowAny) {\n info('query', ...args);\n // @ts-expect-error - not mine\n const called = caller.apply(this, args);\n return called;\n };\n }\n return target[property];\n },\n }) as pg.Pool;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport pg from 'pg';\n\nimport { Config } from '../utils/Config';\nimport { evictPool } from '../utils/Event';\nimport { AfterCreate } from '../types';\nimport Logger from '../utils/Logger';\n\nimport { createProxyForPool } from './PoolProxy';\n\nclass NileDatabase {\n pool: pg.Pool;\n tenantId?: undefined | null | string;\n userId?: undefined | null | string;\n id: string;\n config: Config;\n timer: NodeJS.Timeout | undefined;\n\n constructor(config: Config, id: string) {\n const { warn, info, debug } = Logger(config, '[NileInstance]');\n this.id = id;\n const poolConfig = {\n min: 0,\n max: 10,\n idleTimeoutMillis: 30000,\n ...config.db,\n };\n const { afterCreate, ...remaining } = poolConfig;\n\n config.db = poolConfig;\n this.config = config;\n const cloned = { ...this.config.db };\n cloned.password = '***';\n debug(`Connection pool config ${JSON.stringify(cloned)}`);\n\n this.pool = createProxyForPool(new pg.Pool(remaining), this.config);\n\n if (typeof afterCreate === 'function') {\n warn(\n 'Providing an pool configuration will stop automatic tenant context setting.'\n );\n }\n\n // start the timer for cleanup\n this.startTimeout();\n this.pool.on('connect', async (client) => {\n debug(`pool connected ${this.id}`);\n this.startTimeout();\n const afterCreate: AfterCreate = makeAfterCreate(\n config,\n `${this.id}-${this.timer}`\n );\n afterCreate(client, (err) => {\n const { error } = Logger(config, '[after create callback]');\n if (err) {\n clearTimeout(this.timer);\n error('after create failed', {\n message: err.message,\n stack: err.stack,\n });\n evictPool(this.id);\n }\n });\n });\n this.pool.on('error', (err) => {\n clearTimeout(this.timer);\n info(`pool ${this.id} failed`, {\n message: err.message,\n stack: err.stack,\n });\n evictPool(this.id);\n });\n this.pool.on('release', (destroy) => {\n if (destroy) {\n clearTimeout(this.timer);\n evictPool(this.id);\n debug(`destroying pool ${this.id}`);\n }\n });\n }\n\n startTimeout() {\n const { debug } = Logger(this.config, '[NileInstance]');\n if (this.timer) {\n clearTimeout(this.timer);\n }\n this.timer = setTimeout(() => {\n debug(\n `Pool reached idleTimeoutMillis. ${this.id} evicted after ${\n Number(this.config.db.idleTimeoutMillis) ?? 30000\n }ms`\n );\n this.pool.end(() => {\n clearTimeout(this.timer);\n evictPool(this.id);\n });\n }, Number(this.config.db.idleTimeoutMillis) ?? 30000);\n }\n shutdown() {\n const { debug } = Logger(this.config, '[NileInstance]');\n debug(`attempting to shut down ${this.id}`);\n clearTimeout(this.timer);\n this.pool.end(() => {\n debug(`${this.id} has been shut down`);\n });\n }\n}\n\nexport default NileDatabase;\n\nfunction makeAfterCreate(config: Config, id: string): AfterCreate {\n const { error, warn, debug } = Logger(config, '[afterCreate]');\n return (conn, done) => {\n conn.on('error', function errorHandler(e: Error) {\n error(`Connection ${id} was terminated by server`, {\n message: e.message,\n stack: e.stack,\n });\n done(e, conn);\n });\n\n if (config.tenantId) {\n const query = [`SET nile.tenant_id = '${config.tenantId}'`];\n if (config.userId) {\n if (!config.tenantId) {\n warn('A user id cannot be set in context without a tenant id');\n }\n query.push(`SET nile.user_id = '${config.userId}'`);\n }\n\n // in this example we use pg driver's connection API\n conn.query(query.join(';'), function (err: Error) {\n if (err) {\n error('query connection failed', {\n cause: err.cause,\n stack: err.stack,\n message: err.message,\n name: err.name,\n id,\n });\n } else {\n if (query.length === 1) {\n debug(`connection context set: tenantId=${config.tenantId}`);\n }\n if (query.length === 2) {\n debug(\n `connection context set: tenantId=${config.tenantId} userId=${config.userId}`\n );\n }\n }\n\n done(err, conn);\n });\n }\n done(null, conn);\n };\n}\n","import pg from 'pg';\n\nimport { Config } from '../utils/Config';\nimport { watchEvictPool } from '../utils/Event';\nimport Logger from '../utils/Logger';\nimport { NileConfig } from '../types';\n\nimport NileDatabase from './NileInstance';\n\nexport default class DBManager {\n connections: Map<string, NileDatabase>;\n cleared: boolean;\n private poolWatcherFn: (id: undefined | null | string) => void;\n\n private makeId(\n tenantId?: string | undefined | null,\n userId?: string | undefined | null\n ) {\n if (tenantId && userId) {\n return `${tenantId}:${userId}`;\n }\n if (tenantId) {\n return `${tenantId}`;\n }\n return 'base';\n }\n constructor(config: NileConfig) {\n this.cleared = false;\n this.connections = new Map();\n this.poolWatcherFn = this.poolWatcher(config);\n watchEvictPool(this.poolWatcherFn);\n }\n poolWatcher = (config: NileConfig) => (id: undefined | null | string) => {\n const { info, warn } = Logger(config, '[DBManager]');\n if (id && this.connections.has(id)) {\n info(`Removing ${id} from db connection pool.`);\n const connection = this.connections.get(id);\n connection?.shutdown();\n this.connections.delete(id);\n } else {\n warn(`missed eviction of ${id}`);\n }\n };\n\n getConnection = (config: NileConfig): pg.Pool => {\n const { info } = Logger(config, '[DBManager]');\n const id = this.makeId(config.tenantId, config.userId);\n\n const existing = this.connections.get(id);\n info(`# of instances: ${this.connections.size}`);\n if (existing) {\n info(`returning existing ${id}`);\n existing.startTimeout();\n return existing.pool;\n }\n const newOne = new NileDatabase(new Config(config), id);\n this.connections.set(id, newOne);\n info(`created new ${id}`);\n info(`# of instances: ${this.connections.size}`);\n if (this.cleared) {\n this.cleared = false;\n }\n return newOne.pool;\n };\n\n clear = (config: NileConfig) => {\n const { info } = Logger(config, '[DBManager]');\n info(`Clearing all connections ${this.connections.size}`);\n this.cleared = true;\n this.connections.forEach((connection) => {\n connection.shutdown();\n });\n this.connections.clear();\n };\n}\n","import { fetchCallback } from '../api/routes/auth/callback';\nimport { fetchResetPassword } from '../api/routes/auth/password-reset';\nimport { fetchProviders } from '../api/routes/auth/providers';\nimport { fetchSession } from '../api/routes/auth/session';\nimport { fetchSignIn } from '../api/routes/auth/signin';\nimport { fetchSignOut } from '../api/routes/auth/signout';\nimport { fetchSignUp } from '../api/routes/signup';\nimport { ActiveSession, JWT, Provider, ProviderName } from '../api/utils/auth';\nimport { NileAuthRoutes } from '../api/utils/routes';\nimport { User } from '../users/types';\nimport { Config } from '../utils/Config';\nimport { updateHeaders } from '../utils/Event';\nimport Logger, { LogReturn } from '../utils/Logger';\n\nimport getCsrf from './getCsrf';\n\ntype SignUpPayload = {\n email: string;\n password: string;\n tenantId?: string;\n newTenantName?: string;\n};\nexport default class Auth {\n #logger: LogReturn;\n #config: Config;\n constructor(config: Config) {\n this.#config = config;\n this.#logger = Logger(config, '[auth]');\n }\n\n getSession<T = JWT | ActiveSession | undefined>(\n rawResponse?: false\n ): Promise<T>;\n getSession(rawResponse: true): Promise<Response>;\n async getSession<T = JWT | ActiveSession | Response | undefined>(\n rawResponse = false\n ): Promise<T | Response> {\n const res = await fetchSession(this.#config);\n if (rawResponse) {\n return res;\n }\n try {\n const session = await res.clone().json();\n if (Object.keys(session).length === 0) {\n return undefined as T;\n }\n return session as T;\n } catch {\n return res;\n }\n }\n\n async getCsrf<T = Response | JSON>(rawResponse?: false): Promise<T>;\n async getCsrf(rawResponse: true): Promise<Response>;\n async getCsrf<T = Response | JSON>(rawResponse = false) {\n return await getCsrf<T>(this.#config, rawResponse);\n }\n\n async listProviders(rawResponse: true): Promise<Response>;\n async listProviders<T = { [key: string]: Provider }>(\n rawResponse?: false\n ): Promise<T>;\n async listProviders<T = { [key: string]: Provider }>(\n rawResponse = false\n ): Promise<T | Response> {\n const res = await fetchProviders(this.#config);\n if (rawResponse) {\n return res;\n }\n try {\n return (await res.clone().json()) as T;\n } catch {\n return res;\n }\n }\n\n async signOut(): Promise<Response> {\n // check for csrf header, maybe its already there?\n const csrfRes = await this.getCsrf();\n if (!('csrfToken' in csrfRes)) {\n throw new Error('Unable to obtain CSRF token. Sign out failed.');\n }\n\n const body = JSON.stringify({\n csrfToken: csrfRes.csrfToken,\n json: true,\n });\n const res = await fetchSignOut(this.#config, body);\n\n updateHeaders(new Headers({}));\n this.#config.headers = new Headers();\n\n return res;\n }\n\n /**\n * signUp only works with email + password\n * @param payload\n * @param rawResponse\n */\n async signUp(payload: SignUpPayload, rawResponse: true): Promise<Response>;\n async signUp<T = User | Response>(payload: SignUpPayload): Promise<T>;\n async signUp<T = User | Response | undefined>(\n payload: SignUpPayload,\n rawResponse?: boolean\n ): Promise<T> {\n // be sure its fresh\n this.#config.headers = new Headers();\n const { email, password, ...params } = payload;\n if (!email || !password) {\n throw new Error(\n 'Server side sign up requires a user email and password.'\n );\n }\n\n const providers = await this.listProviders();\n const { credentials } = providers ?? {};\n if (!credentials) {\n throw new Error(\n 'Unable to obtain credential provider. Aborting server side sign up.'\n );\n }\n\n const csrf = await this.getCsrf();\n\n let csrfToken;\n if ('csrfToken' in csrf) {\n csrfToken = csrf.csrfToken;\n } else {\n throw new Error('Unable to obtain parse CSRF. Request blocked.');\n }\n\n const body = JSON.stringify({\n email,\n password,\n csrfToken,\n callbackUrl: credentials.callbackUrl,\n });\n\n const res = await fetchSignUp(this.#config, { body, params });\n if (res.status > 299) {\n this.#logger.error(await res.clone().text());\n return undefined as T;\n }\n const token = parseToken(res.headers);\n if (!token) {\n throw new Error('Server side sign up failed. Session token not found');\n }\n this.#config.headers?.append('cookie', token);\n updateHeaders(this.#config.headers);\n if (rawResponse) {\n return res as T;\n }\n try {\n return (await res.clone().json()) as T;\n } catch {\n return res as T;\n }\n }\n\n async forgotPassword(req: {\n email: string;\n callbackUrl?: string;\n redirectUrl?: string;\n }): Promise<Response> {\n let email = '';\n const defaults = defaultCallbackUrl({\n config: this.#config,\n });\n let callbackUrl = defaults.callbackUrl;\n let redirectUrl = defaults.redirectUrl;\n\n if ('email' in req) {\n email = req.email;\n }\n\n if ('callbackUrl' in req) {\n callbackUrl = req.callbackUrl ? req.callbackUrl : null;\n }\n if ('redirectUrl' in req) {\n redirectUrl = req.redirectUrl ? req.redirectUrl : null;\n }\n const body = JSON.stringify({\n email,\n redirectUrl,\n callbackUrl,\n });\n\n // we need a default\n const data = await fetchResetPassword(\n this.#config,\n 'POST',\n body,\n new URLSearchParams(),\n false\n );\n return data;\n }\n\n async resetPassword(\n req:\n | Request\n | {\n email: string;\n password: string;\n callbackUrl?: string;\n redirectUrl?: string;\n }\n ): Promise<Response> {\n let email = '';\n let password = '';\n const defaults = defaultCallbackUrl({ config: this.#config });\n let callbackUrl = defaults.callbackUrl;\n let redirectUrl = defaults.redirectUrl;\n if (req instanceof Request) {\n const body = await req.json();\n email = body.email;\n password = body.password;\n const cbFromHeaders = parseCallback(req.headers);\n if (cbFromHeaders) {\n callbackUrl = cbFromHeaders;\n }\n if (body.callbackUrl) {\n callbackUrl = body.callbackUrl;\n }\n if (body.redirectUrl) {\n redirectUrl = body.redirectUrl;\n }\n } else {\n if ('email' in req) {\n email = req.email;\n }\n if ('password' in req) {\n password = req.password;\n }\n if ('callbackUrl' in req) {\n callbackUrl = req.callbackUrl ? req.callbackUrl : null;\n }\n if ('redirectUrl' in req) {\n redirectUrl = req.redirectUrl ? req.redirectUrl : null;\n }\n }\n // we need a default\n await this.getCsrf();\n const body = JSON.stringify({\n email,\n password,\n redirectUrl,\n callbackUrl,\n });\n let urlWithParams;\n try {\n const data = await fetchResetPassword(this.#config, 'POST', body);\n const cloned = data.clone();\n if (data.status === 400) {\n const text = await cloned.text();\n this.#logger.error(text);\n return data;\n }\n\n const { url } = await data.json();\n urlWithParams = url;\n } catch {\n // failed\n }\n let token;\n try {\n const worthyParams = new URL(urlWithParams).searchParams;\n const answer = await fetchResetPassword(\n this.#config,\n 'GET',\n null,\n worthyParams\n );\n token = parseResetToken(answer.headers);\n } catch {\n this.#logger.warn(\n 'Unable to parse reset password url. Password not reset.'\n );\n }\n\n // this only needs to happen on the local config\n const cookie = this.#config.headers.get('cookie')?.split('; ');\n if (token) {\n cookie?.push(token);\n } else {\n throw new Error(\n 'Unable to reset password, reset token is missing from response'\n );\n }\n this.#config.headers = new Headers({\n ...this.#config.headers,\n cookie: cookie?.join('; '),\n });\n const res = await fetchResetPassword(this.#config, 'PUT', body);\n // remove the token\n cookie?.pop();\n const cleaned: string[] =\n cookie?.filter((c) => !c.includes('nile.session')) ?? [];\n cleaned.push(String(parseToken(res.headers)));\n const updatedHeaders = new Headers({ cookie: cleaned.join('; ') });\n updateHeaders(updatedHeaders);\n\n return res;\n }\n async callback(provider: ProviderName, body?: string | Request) {\n if (body instanceof Request) {\n this.#config.headers = body.headers;\n return await fetchCallback(\n this.#config,\n provider,\n undefined,\n body,\n 'GET'\n );\n }\n return await fetchCallback(this.#config, provider, body);\n }\n /**\n * The return value from this will be a redirect for the client\n * In most cases, you should forward the response directly to the client\n * @param payload\n * @param rawResponse\n */\n async signIn<T = Response>(\n provider: ProviderName,\n payload?: Request | { email: string; password: string },\n rawResponse?: true\n ): Promise<T>;\n async signIn<T = Response | undefined>(\n provider: ProviderName,\n payload?: Request | { email: string; password: string },\n rawResponse?: boolean\n ): Promise<T> {\n if (payload instanceof Request) {\n const body = new URLSearchParams(await payload.text());\n const origin = new URL(payload.url).origin;\n\n const payloadUrl = body?.get('callbackUrl');\n const csrfToken = body?.get('csrfToken');\n\n const callbackUrl = `${\n !payloadUrl?.startsWith('http') ? origin : ''\n }${payloadUrl}`;\n if (!csrfToken) {\n throw new Error(\n 'CSRF token in missing from request. Request it by the client before calling sign in'\n );\n }\n this.#config.headers = new Headers(payload.headers);\n\n this.#config.headers.set(\n 'Content-Type',\n 'application/x-www-form-urlencoded'\n );\n const params = new URLSearchParams({\n csrfToken,\n json: String(true),\n });\n if (payloadUrl) {\n params.set('callbackUrl', callbackUrl);\n }\n return (await fetchSignIn(this.#config, provider, params)) as T;\n }\n\n this.#config.headers = new Headers();\n const { info, error } = this.#logger;\n\n const providers = await this.listProviders();\n info('Obtaining csrf');\n const csrf = await this.getCsrf();\n\n let csrfToken;\n if ('csrfToken' in csrf) {\n csrfToken = csrf.csrfToken;\n } else {\n throw new Error('Unable to obtain parse CSRF. Request blocked.');\n }\n\n const { credentials } = providers ?? {};\n\n if (!credentials) {\n throw new Error(\n 'Unable to obtain credential provider. Aborting server side sign in.'\n );\n }\n\n const { email, password } = payload ?? {};\n if (provider === 'email' && (!email || !password)) {\n throw new Error(\n 'Server side sign in requires a user email and password.'\n );\n }\n\n info(`Obtaining providers for ${email}`);\n info(`Attempting sign in with email ${email}`);\n const body = JSON.stringify({\n email,\n password,\n csrfToken,\n callbackUrl: credentials.callbackUrl,\n });\n\n const signInRes = await this.callback(provider, body);\n\n const authCookie = signInRes?.headers.get('set-cookie');\n if (!authCookie) {\n throw new Error('authentication failed');\n }\n\n const token = parseToken(signInRes?.headers);\n const possibleError = signInRes?.headers.get('location');\n if (possibleError) {\n let urlError;\n try {\n urlError = new URL(possibleError).searchParams.get('error');\n } catch {\n //noop\n }\n if (urlError) {\n error('Unable to log user in', { error: urlError });\n return undefined as T;\n }\n }\n if (!token) {\n error('Unable to obtain auth token', {\n authCookie,\n signInRes,\n });\n throw new Error('Server login failed');\n }\n info('Server sign in successful', { authCookie });\n\n // last thing to do is be sure the next call is up to date with good headers\n const setCookie = signInRes.headers.get('set-cookie');\n if (setCookie) {\n const cookie = [\n parseCSRF(this.#config.headers),\n parseCallback(signInRes.headers),\n parseToken(signInRes.headers),\n ]\n .filter(Boolean)\n .join('; ');\n updateHeaders(new Headers({ cookie }));\n } else {\n error('Unable to set context after sign in', {\n headers: signInRes.headers,\n });\n }\n\n if (rawResponse) {\n return signInRes as T;\n }\n try {\n return (await signInRes.clone().json()) as T;\n } catch {\n return signInRes as T;\n }\n }\n}\n\nexport function parseCSRF(headers?: Headers) {\n let cookie = headers?.get('set-cookie');\n if (!cookie) {\n cookie = headers?.get('cookie');\n }\n if (!cookie) {\n return undefined;\n }\n const [, token] = /((__Secure-)?nile\\.csrf-token=[^;]+)/.exec(cookie) ?? [];\n return token;\n}\n\nexport function parseCallback(headers?: Headers) {\n let cookie = headers?.get('set-cookie');\n if (!cookie) {\n cookie = headers?.get('cookie');\n }\n if (!cookie) {\n return undefined;\n }\n const [, token] = /((__Secure-)?nile\\.callback-url=[^;]+)/.exec(cookie) ?? [];\n return token;\n}\n\nexport function parseToken(headers?: Headers) {\n let authCookie = headers?.get('set-cookie');\n if (!authCookie) {\n authCookie = headers?.get('cookie');\n }\n if (!authCookie) {\n return undefined;\n }\n const [, token] =\n /((__Secure-)?nile\\.session-token=[^;]+)/.exec(authCookie) ?? [];\n return token;\n}\nfunction parseResetToken(headers: Headers | void): string | void {\n let authCookie = headers?.get('set-cookie');\n if (!authCookie) {\n authCookie = headers?.get('cookie');\n }\n if (!authCookie) {\n return undefined;\n }\n const [, token] = /((__Secure-)?nile\\.reset=[^;]+)/.exec(authCookie) ?? [];\n return token;\n}\n\nfunction defaultCallbackUrl({ config }: { config: Config }) {\n let cb = null;\n let redirect = null;\n const fallbackCb = parseCallback(config.headers);\n if (fallbackCb) {\n const [, value] = fallbackCb.split('=');\n cb = decodeURIComponent(value);\n if (value) {\n redirect = `${new URL(cb).origin}${NileAuthRoutes.PASSWORD_RESET}`;\n }\n }\n return { callbackUrl: cb, redirectUrl: redirect };\n}\n","import { fetchCsrf } from '../api/routes/auth/csrf';\nimport { updateHeaders } from '../utils/Event';\nimport { Config } from '../utils/Config';\n\nimport { parseCallback, parseCSRF, parseToken } from '.';\n\nexport default async function getCsrf<T = Response | { csrfToken: string }>(\n config: Config,\n rawResponse = false\n) {\n const res = await fetchCsrf(config);\n // we're gonna use it, so set the headers now.\n const csrfCook = parseCSRF(res.headers);\n\n // prefer the csrf from the headers over the saved one\n if (csrfCook) {\n const [, value] = csrfCook.split('=');\n const [token] = decodeURIComponent(value).split('|');\n\n const setCookie = res.headers.get('set-cookie');\n if (setCookie) {\n const cookie = [\n csrfCook,\n parseCallback(res.headers),\n parseToken(res.headers),\n ]\n .filter(Boolean)\n .join('; ');\n config.headers.set('cookie', cookie);\n updateHeaders(new Headers({ cookie }));\n }\n if (!rawResponse) {\n return { csrfToken: token };\n }\n } else {\n // for csrf, preserve the existing cookies\n const existingCookie = config.headers.get('cookie');\n const cookieParts = [];\n if (existingCookie) {\n cookieParts.push(\n parseToken(config.headers),\n parseCallback(config.headers)\n );\n }\n if (csrfCook) {\n cookieParts.push(csrfCook);\n } else {\n // use the one tha tis already there\n cookieParts.push(parseCSRF(config.headers));\n }\n const cookie = cookieParts.filter(Boolean).join('; ');\n\n // we need to do it in both places in case its the very first time\n config.headers.set('cookie', cookie);\n updateHeaders(new Headers({ cookie }));\n }\n\n if (rawResponse) {\n return res as T;\n }\n\n try {\n return (await res.clone().json()) as T;\n } catch {\n return res as T;\n }\n}\n","import { fetchMe } from '../api/routes/me';\nimport { Config } from '../utils/Config';\nimport { updateHeaders } from '../utils/Event';\nimport { fetchVerifyEmail } from '../api/routes/auth/verify-email';\nimport getCsrf from '../auth/getCsrf';\nimport Logger, { LogReturn } from '../utils/Logger';\n\nimport { User } from './types';\n\nexport default class Users {\n #config: Config;\n #logger: LogReturn;\n constructor(config: Config) {\n this.#config = config;\n this.#logger = Logger(config, '[me]');\n }\n\n async updateSelf<T = User[] | Response>(\n req: Partial<\n Omit<\n User,\n 'email' | 'tenants' | 'created' | 'updated' | 'emailVerified'\n > & { emailVerified: boolean }\n >,\n rawResponse?: boolean\n ): Promise<T> {\n const res = await fetchMe(this.#config, 'PUT', JSON.stringify(req));\n if (rawResponse) {\n return res as T;\n }\n try {\n return await res?.clone().json();\n } catch {\n return res as T;\n }\n }\n\n async removeSelf(): Promise<Response> {\n const me = await this.getSelf();\n if ('id' in me) {\n this.#config.userId = (me as unknown as User).id;\n }\n const res = await fetchMe(this.#config, 'DELETE');\n updateHeaders(new Headers());\n return res;\n }\n\n async getSelf<T = User | Response>(): Promise<T>;\n async getSelf(rawResponse?: true): Promise<Response>;\n async getSelf<T = User | Response>(rawResponse?: boolean): Promise<T> {\n const res = await fetchMe(this.#config);\n\n if (rawResponse) {\n return res as T;\n }\n try {\n return await res?.clone().json();\n } catch {\n return res as T;\n }\n }\n\n async verifySelf<T = Response | void>(): Promise<T>;\n async verifySelf(rawResponse?: true): Promise<Response>;\n async verifySelf<T = Response | void>(\n bypassEmail = process.env.NODE_ENV !== 'production',\n rawResponse = false\n ): Promise<T> {\n try {\n const me = await this.getSelf();\n if (me instanceof Response) {\n return me as T;\n }\n const res = await verifyEmailAddress(this.#config, me);\n return res as T;\n } catch {\n this.#logger?.warn(\n \"Unable to verify email. The current user's email will be set to verified any way. Be sure to configure emails for production.\"\n );\n }\n if (bypassEmail) {\n return await this.updateSelf({ emailVerified: true }, rawResponse);\n }\n this.#logger.error(\n 'Unable to verify email address. Configure your SMTP server in the console.'\n );\n return undefined as T;\n }\n}\n\nasync function verifyEmailAddress(config: Config, user: User) {\n config.headers.set('content-type', 'application/x-www-form-urlencoded');\n const { csrfToken } = await getCsrf<{ csrfToken: string }>(config);\n const res = await fetchVerifyEmail(\n config,\n 'POST',\n new URLSearchParams({ csrfToken, email: user.email }).toString()\n );\n if (res.status > 299) {\n throw new Error(await res.text());\n }\n return res;\n // return await fetchVerifyEmail(config, 'GET');\n}\n","import { fetchMe } from '../api/routes/me';\nimport {\n fetchTenant,\n fetchTenants,\n fetchTenantsByUser,\n} from '../api/routes/tenants';\nimport { fetchTenantUsers } from '../api/routes/tenants/[tenantId]/users';\nimport { fetchTenantUser } from '../api/routes/tenants/[tenantId]/users/[userId]';\nimport { NileRequest } from '../types';\nimport { User } from '../users/types';\nimport { Config } from '../utils/Config';\nimport Logger, { LogReturn } from '../utils/Logger';\n\nimport { Tenant } from './types';\n\ntype ReqContext = { userId?: string; tenantId?: string };\ntype JoinTenantRequest = string | ReqContext | { id: string };\n\nexport default class Tenants {\n #logger: LogReturn;\n #config: Config;\n constructor(config: Config) {\n this.#logger = Logger(config, '[tenants]');\n this.#config = config;\n }\n\n create<T = Tenant | Response>(\n name: string,\n rawResponse?: boolean\n ): Promise<T>;\n create<T = Tenant | Response>(\n payload: {\n name: string;\n id?: string;\n },\n rawResponse?: boolean\n ): Promise<T>;\n async create<T = Tenant | Response | undefined>(\n req: { name: string; id?: string } | string,\n rawResponse?: boolean\n ): Promise<T | Response | undefined> {\n let res;\n if (typeof req === 'string') {\n res = await fetchTenants(\n this.#config,\n 'POST',\n JSON.stringify({ name: req })\n );\n } else if (typeof req === 'object' && ('name' in req || 'id' in req)) {\n res = await fetchTenants(this.#config, 'POST', JSON.stringify(req));\n }\n if (rawResponse) {\n return res as T;\n }\n try {\n return await res?.clone().json();\n } catch {\n return res;\n }\n }\n\n delete<T = Response>(id?: string): Promise<T>;\n delete<T = Response>(payload: { id: string }): Promise<T>;\n async delete<T = Response>(\n req: NileRequest<void> | { id?: string } | string | Tenant\n ): Promise<T | Response> {\n if (typeof req === 'string') {\n this.#config.tenantId = req;\n }\n if (typeof req === 'object' && 'id' in req) {\n this.#config.tenantId = req.id;\n }\n const res = await fetchTenant(this.#config, 'DELETE');\n return res;\n }\n\n get<T = Tenant | Response>(id: string, rawResponse?: boolean): Promise<T>;\n get(rawResponse: true): Promise<Response>;\n get<T = Tenant | Response>(\n payload: { id: string },\n rawResponse?: boolean\n ): Promise<T>;\n async get<T = Tenant | Response>(\n req: boolean | { id: string } | string | void,\n rawResponse?: boolean\n ): Promise<T> {\n if (typeof req === 'string') {\n this.#config.tenantId = req;\n } else if (typeof req === 'object' && 'id' in req) {\n this.#config.tenantId = req.id;\n }\n const res = await fetchTenant(this.#config, 'GET');\n if (rawResponse === true || req === true) {\n return res as T;\n }\n\n try {\n return await res?.clone().json();\n } catch {\n return res as T;\n }\n }\n\n async update(req: Partial<Tenant>, rawResponse: true): Promise<Response>;\n update<T = Tenant | Response | undefined>(\n req: Partial<Tenant>,\n rawResponse?: boolean\n ): Promise<T>;\n async update<T = Tenant | Response | undefined>(\n req: Partial<Tenant>,\n rawResponse?: boolean\n ): Promise<T> {\n let res;\n if (typeof req === 'object' && ('name' in req || 'id' in req)) {\n const { id, ...remaining } = req;\n if (id) {\n this.#config.tenantId = id;\n }\n res = await fetchTenant(this.#config, 'PUT', JSON.stringify(remaining));\n }\n if (rawResponse) {\n return res as T;\n }\n try {\n return await res?.clone().json();\n } catch {\n return res as T;\n }\n }\n\n list<T = Tenant[] | Response>(): Promise<T>;\n list(rawResponse: true): Promise<Response>;\n async list<T = Tenant[] | Response>(\n req: boolean | NileRequest<void> | Headers\n ): Promise<T | Response | undefined> {\n const res = await fetchTenantsByUser(this.#config);\n if (req === true) {\n return res;\n }\n\n try {\n return await res?.clone().json();\n } catch {\n return res;\n }\n }\n async leaveTenant<T = Response>(\n req?: string | { tenantId: string }\n ): Promise<T> {\n const me = await fetchMe(this.#config);\n try {\n const json = await me.json();\n if ('id' in json) {\n this.#config.userId = json.id;\n }\n } catch {\n // maybe there's already a context, let `fetchTenantUser` deal with it\n }\n if (typeof req === 'string') {\n this.#config.tenantId = req;\n } else {\n this.#handleContext(req);\n }\n return (await fetchTenantUser(this.#config, 'DELETE')) as T;\n }\n\n addMember(req: JoinTenantRequest, rawResponse: true): Promise<Response>;\n addMember<T = User | Response>(\n req: JoinTenantRequest,\n rawResponse?: boolean\n ): Promise<T>;\n async addMember<T = User | Response>(\n req: JoinTenantRequest,\n rawResponse?: boolean\n ): Promise<T> {\n if (typeof req === 'string') {\n this.#config.userId = req;\n } else {\n this.#handleContext(req);\n }\n\n const res = await fetchTenantUser(this.#config, 'PUT');\n return responseHandler(res, rawResponse);\n }\n\n async removeMember(\n req: JoinTenantRequest,\n rawResponse?: boolean\n ): Promise<Response> {\n this.#handleContext(req);\n const res = await fetchTenantUser(this.#config, 'DELETE');\n return responseHandler(res, rawResponse);\n }\n users<T = User[] | Response>(\n req?: boolean | { tenantId?: string },\n rawResponse?: boolean\n ): Promise<T>;\n users(req: true): Promise<Response>;\n async users<T>(\n req?: boolean | { tenantId?: string },\n rawResponse?: boolean\n ): Promise<T> {\n this.#handleContext(req);\n const res = await fetchTenantUsers(this.#config, 'GET');\n\n return responseHandler(\n res,\n rawResponse || (typeof req === 'boolean' && req)\n ) as T;\n }\n\n #handleContext(req: JoinTenantRequest | boolean | undefined) {\n if (typeof req === 'object') {\n if ('tenantId' in req) {\n this.#config.tenantId = req.tenantId;\n }\n if ('userId' in req) {\n this.#config.tenantId = req.tenantId;\n }\n }\n }\n}\n\nasync function responseHandler(res: Response, rawResponse?: boolean) {\n if (rawResponse) {\n return res;\n }\n try {\n return await res?.clone().json();\n } catch {\n return res;\n }\n}\n","import { Server } from '../../../Server';\nimport { NileConfig } from '../../../types';\nimport { Config } from '../../../utils/Config';\nimport getter from '../GET';\nimport poster from '../POST';\nimport deleter from '../DELETE';\nimport puter from '../PUT';\n\nexport type CTXHandlerType = {\n GET: (req: Request) => Promise<{ response: void | Response; nile: Server }>;\n POST: (req: Request) => Promise<{ response: void | Response; nile: Server }>;\n DELETE: (\n req: Request\n ) => Promise<{ response: void | Response; nile: Server }>;\n PUT: (req: Request) => Promise<{ response: void | Response; nile: Server }>;\n};\nexport function handlersWithContext(config: Config): CTXHandlerType {\n const GET = getter(config.routes, config);\n const POST = poster(config.routes, config);\n const DELETE = deleter(config.routes, config);\n const PUT = puter(config.routes, config);\n return {\n GET: async (req) => {\n const response = await GET(req);\n const updatedConfig = updateConfig(response, config);\n return { response, nile: new Server(updatedConfig) };\n },\n POST: async (req) => {\n const response = await POST(req);\n const updatedConfig = updateConfig(response, config);\n return { response, nile: new Server(updatedConfig) };\n },\n DELETE: async (req) => {\n const response = await DELETE(req);\n const updatedConfig = updateConfig(response, config);\n return { response, nile: new Server(updatedConfig) };\n },\n PUT: async (req) => {\n const response = await PUT(req);\n const updatedConfig = updateConfig(response, config);\n return { response, nile: new Server(updatedConfig) };\n },\n };\n}\n\nexport function updateConfig(\n response: Response | void,\n config: Config\n): NileConfig {\n let origin = 'http://localhost:3000';\n let headers: Headers | null = null;\n\n if (response?.status === 302) {\n const location = response.headers.get('location');\n if (location) {\n const urlLocation = new URL(location);\n origin = urlLocation.origin;\n }\n }\n\n const setCookies: string[] = [];\n\n // Headers are iterable\n if (response?.headers) {\n for (const [key, value] of response.headers) {\n if (key.toLowerCase() === 'set-cookie') {\n setCookies.push(value);\n }\n }\n }\n if (setCookies.length > 0) {\n const cookieHeader = setCookies\n .map((cookieStr) => cookieStr.split(';')[0])\n .join('; ');\n\n headers = new Headers({ cookie: cookieHeader });\n }\n\n return {\n ...config,\n origin,\n headers: headers ?? undefined,\n };\n}\n","import pg from 'pg';\n\nimport { NileConfig } from './types';\nimport { Config } from './utils/Config';\nimport { watchHeaders, watchTenantId, watchUserId } from './utils/Event';\nimport DbManager from './db';\nimport Users from './users';\nimport Tenants from './tenants';\nimport Auth from './auth';\nimport { getTenantId } from './utils/Config/envVars';\nimport Logger from './utils/Logger';\nimport { X_NILE_ORIGIN, X_NILE_SECURECOOKIES } from './utils/constants';\nimport {\n CTXHandlerType,\n handlersWithContext,\n} from './api/handlers/withContext';\n\nexport class Server {\n users: Users;\n tenants: Tenants;\n auth: Auth;\n\n #config: Config;\n #handlers: {\n GET: (req: Request) => Promise<void | Response>;\n POST: (req: Request) => Promise<void | Response>;\n DELETE: (req: Request) => Promise<void | Response>;\n PUT: (req: Request) => Promise<void | Response>;\n withContext: CTXHandlerType;\n };\n #paths: {\n get: string[];\n post: string[];\n delete: string[];\n put: string[];\n };\n #manager: DbManager;\n #headers: undefined | Headers;\n\n constructor(config?: NileConfig) {\n this.#config = new Config(config, '[initial config]');\n // watch first, they may mutate first\n watchTenantId((tenantId) => {\n if (tenantId !== this.#config.tenantId) {\n this.#config.tenantId = tenantId;\n this.#reset();\n }\n });\n\n watchUserId((userId) => {\n if (userId !== this.#config.userId) {\n this.#config.userId = userId;\n this.#reset();\n }\n });\n\n watchHeaders((headers) => {\n this.setContext(headers);\n this.#reset();\n });\n\n this.#handlers = {\n ...this.#config.handlers,\n withContext: handlersWithContext(this.#config),\n };\n\n this.#paths = this.#config.paths;\n\n this.#config.tenantId = getTenantId({ config: this.#config });\n this.#manager = new DbManager(this.#config);\n\n // headers first, so instantiation is right the first time\n this.#handleHeaders(config);\n\n this.users = new Users(this.#config);\n this.tenants = new Tenants(this.#config);\n this.auth = new Auth(this.#config);\n }\n\n get db(): pg.Pool & { clearConnections: () => void } {\n const pool = this.#manager.getConnection(this.#config);\n\n return Object.assign(pool, {\n clearConnections: () => {\n this.#manager.clear(this.#config);\n },\n });\n }\n\n /**\n * A convenience function that applies a config and ensures whatever was passed is set properly\n */\n\n getInstance<T = Request | Headers | Record<string, string>>(\n config: NileConfig,\n req?: T\n ): Server {\n const _config = { ...this.#config, ...config };\n\n // be sure the config is up to date\n const updatedConfig = new Config(_config);\n this.#config = new Config(updatedConfig);\n // propagate special config items\n this.#config.tenantId = config.tenantId;\n this.#config.userId = config.userId;\n\n if (req) {\n this.setContext(req);\n }\n\n this.#reset();\n\n return this;\n }\n getPaths() {\n return this.#paths;\n }\n\n get handlers() {\n return this.#handlers;\n }\n /**\n * Allow the setting of headers from a req or header object.\n * Makes it possible to handle REST requests easily\n * Also makes it easy to set user + tenant in some way\n * @param req\n * @returns undefined\n */\n setContext(\n req:\n | Request\n | Headers\n | Record<string, string>\n | unknown\n | { tenantId?: string; userId?: string }\n ) {\n try {\n if (req instanceof Headers) {\n this.#handleHeaders(req);\n this.#reset();\n return;\n } else if (req instanceof Request) {\n this.#handleHeaders(new Headers(req.headers));\n this.#reset();\n\n return;\n }\n } catch {\n //noop\n }\n // we also support setting context in 1 go via tenantId and userId\n // this is a little less good because auth is going to mess with this\n // logically, not technically.\n let ok = false;\n if (req && typeof req === 'object' && 'tenantId' in req) {\n ok = true;\n this.#config.tenantId = req.tenantId as string | undefined;\n }\n if (req && typeof req === 'object' && 'userId' in req) {\n ok = true;\n this.#config.userId = req.userId as string | undefined;\n }\n\n if (ok) {\n return;\n }\n /**\n * in some cases (like express) an object is sent\n * tenantId and userId is also an object, so do that one first\n * We bail out of this execution if that is set, since you can't really do both\n */\n\n if (typeof req === 'object') {\n const headers = new Headers(req as Record<string, string>);\n if (headers) {\n this.#handleHeaders(headers);\n this.#reset();\n\n return;\n }\n }\n const { warn } = Logger(this.#config, '[API]');\n\n if (warn) {\n warn(\n 'Set context expects a Request, Header instance or an object of Record<string, string>'\n );\n }\n }\n\n getContext() {\n return {\n headers: this.#headers,\n userId: this.#config.userId,\n tenantId: this.#config.tenantId,\n };\n }\n\n /**\n * Merge headers together\n * Internally, passed a NileConfig, externally, should be using Headers\n */\n #handleHeaders(\n config?: NileConfig | void | Headers | Record<string, string> | null\n ) {\n const updates: [string, string][] = [];\n let headers;\n this.#headers = new Headers();\n\n if (config instanceof Headers) {\n headers = config;\n } else if (config?.headers) {\n // handle a config object internally,\n headers = config?.headers;\n if (config && config.origin) {\n // DO SOMETHING TO SURFACE A WARNING?\n this.#headers.set(X_NILE_ORIGIN, config.origin);\n }\n if (config && config.secureCookies != null) {\n this.#headers.set(X_NILE_SECURECOOKIES, String(config.secureCookies));\n }\n }\n\n if (headers instanceof Headers) {\n headers.forEach((value, key) => {\n updates.push([key.toLowerCase(), value]);\n });\n } else {\n for (const [key, value] of Object.entries(headers ?? {})) {\n updates.push([key.toLowerCase(), value]);\n }\n }\n\n const merged: Record<string, string> = {};\n this.#headers?.forEach((value, key) => {\n // It is expected that if the 'cookie' is missing when you set headers, it should be removed.\n if (key.toLowerCase() !== 'cookie') {\n merged[key.toLowerCase()] = value;\n }\n });\n\n for (const [key, value] of updates) {\n merged[key] = value;\n }\n\n for (const [key, value] of Object.entries(merged)) {\n this.#headers.set(key, value);\n }\n\n this.#config.headers = this.#headers;\n }\n\n /**\n * Allow some internal mutations to reset our config + headers\n */\n #reset = () => {\n this.#config.headers = this.#headers ?? new Headers();\n this.users = new Users(this.#config);\n this.tenants = new Tenants(this.#config);\n this.auth = new Auth(this.#config);\n };\n}\n\nlet server: Server;\nexport function create(config?: NileConfig): Server {\n if (!server) {\n server = new Server(config);\n }\n\n return server;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/users/types.ts","../src/api/utils/routes/index.ts","../src/utils/Logger.ts","../src/utils/constants.ts","../src/api/utils/request.ts","../src/api/utils/auth.ts","../src/api/routes/me/index.ts","../src/utils/fetch.ts","../src/api/routes/users/POST.ts","../src/api/routes/users/GET.ts","../src/api/routes/users/%5BuserId%5D/PUT.ts","../src/api/routes/users/index.ts","../src/api/routes/tenants/%5BtenantId%5D/users/GET.ts","../src/api/routes/tenants/%5BtenantId%5D/users/POST.ts","../src/api/routes/tenants/%5BtenantId%5D/users/index.ts","../src/api/routes/tenants/%5BtenantId%5D/invite/PUT.ts","../src/api/routes/tenants/%5BtenantId%5D/invite/POST.ts","../src/api/routes/tenants/%5BtenantId%5D/invite/index.ts","../src/api/routes/tenants/%5BtenantId%5D/invites/GET.ts","../src/api/routes/tenants/%5BtenantId%5D/invites/index.ts","../src/api/routes/tenants/GET.ts","../src/api/routes/tenants/%5BtenantId%5D/GET.ts","../src/api/routes/tenants/%5BtenantId%5D/DELETE.ts","../src/api/routes/tenants/%5BtenantId%5D/PUT.ts","../src/api/routes/tenants/POST.ts","../src/api/routes/tenants/index.ts","../src/api/routes/auth/signin.ts","../src/api/routes/auth/session.ts","../src/api/routes/auth/providers.ts","../src/api/routes/auth/csrf.ts","../src/api/routes/auth/callback.ts","../src/api/routes/auth/signout.ts","../src/api/routes/auth/error.ts","../src/api/routes/auth/verify-request.ts","../src/api/routes/auth/password-reset.ts","../src/api/routes/auth/verify-email.ts","../src/api/handlers/GET.ts","../src/api/routes/signup/POST.ts","../src/api/routes/signup/index.tsx","../src/api/handlers/POST.ts","../src/api/routes/tenants/%5BtenantId%5D/users/%5BuserId%5D/DELETE.ts","../src/api/routes/tenants/%5BtenantId%5D/users/%5BuserId%5D/PUT.ts","../src/api/routes/tenants/%5BtenantId%5D/users/%5BuserId%5D/index.ts","../src/api/routes/tenants/%5BtenantId%5D/invite/%5BinviteId%5D/DELETE.ts","../src/api/routes/tenants/%5BtenantId%5D/invite/%5BinviteId%5D/index.ts","../src/api/handlers/DELETE.ts","../src/api/handlers/PUT.ts","../src/api/handlers/index.ts","../src/utils/Config/envVars.ts","../src/utils/Config/index.ts","../src/utils/Event/index.ts","../src/db/PoolProxy.ts","../src/db/NileInstance.ts","../src/db/DBManager.ts","../src/auth/index.ts","../src/auth/obtainCsrf.ts","../src/users/index.ts","../src/tenants/index.ts","../src/api/handlers/withContext/index.ts","../src/api/utils/extensions.ts","../src/Server.ts"],"names":["route","request","GET","PUT","key","matches","POST","DELETE","pg","afterCreate","body","csrfToken","defaultCallbackUrl","create"],"mappings":";;;;;;;;;;AAgMO,IAAM,qBAAwB,GAAA;AAAA,EACnC,aAAe,EAAA,gBAAA;AAAA,EACf,UAAY,EAAA,aAAA;AAAA,EACZ,cAAgB,EAAA,kBAAA;AAAA,EAChB,eAAiB,EAAA,kBAAA;AAAA,EACjB,kBAAoB,EAAA,qBAAA;AAAA,EACpB,mBAAqB,EAAA,uBAAA;AAAA,EACrB,qBAAuB,EAAA,yBAAA;AAAA,EACvB,mBAAqB,EAAA,uBAAA;AAAA,EACrB,gBAAkB,EAAA,mBAAA;AAAA,EAClB,mBAAqB,EAAA,uBAAA;AAAA,EACrB,mBAAqB,EAAA,uBAAA;AAAA,EACrB,oBAAsB,EAAA,wBAAA;AAAA,EACtB,eAAiB,EAAA;AACnB;;;AC1LO,IAAM,8BAAiC,GAAA;AAAA,EAC5C,WAAa,EAAA,cAAA;AAAA,EACb,YAAc,EAAA,eAAA;AAAA,EACd,OAAS,EAAA;AACX;;;ACrBA,IAAM,cAAA,GAAiB,QAAQ,GAAI,CAAA,cAAA;AAC5B,IAAM,cAAiB,GAAA,MAAA;AA4BvB,IAAM,SAAA,GAAY,CAAC,MAAA,GAAS,cAA4B,MAAA;AAAA,EAC7D,MAAQ,EAAA,CAAA,EAAG,MAAM,CAAA,EAAG,cAAqB,cAAA,CAAA;AAAA,EACzC,SAAW,EAAA,CAAA,EAAG,MAAM,CAAA,EAAG,iBAAwB,iBAAA,CAAA;AAAA,EAC/C,OAAS,EAAA,CAAA,EAAG,MAAM,CAAA,EAAG,eAAsB,eAAA,CAAA;AAAA,EAC3C,IAAM,EAAA,CAAA,EAAG,MAAM,CAAA,EAAG,YAAmB,YAAA,CAAA;AAAA,EACrC,QAAU,EAAA,CAAA,EAAG,MAAM,CAAA,EAAG,gBAAuB,gBAAA,CAAA;AAAA,EAC7C,OAAS,EAAA,CAAA,EAAG,MAAM,CAAA,EAAG,eAAsB,eAAA,CAAA;AAAA,EAC3C,KAAA,EAAO,GAAG,MAAM,CAAA,WAAA,CAAA;AAAA,EAChB,cAAA,EAAgB,GAAG,MAAM,CAAA,oBAAA,CAAA;AAAA,EACzB,YAAc,EAAA,CAAA,EAAG,MAAM,CAAA,EAAG,oBAA2B,oBAAA,CAAA;AAAA,EACrD,cAAgB,EAAA,CAAA,EAAG,MAAM,CAAA,EAAG,sBAA6B,sBAAA,CAAA;AAAA,EACzD,EAAI,EAAA,CAAA,EAAG,MAAM,CAAA,EAAG,KAAwB,UAAA,CAAA;AAAA,EACxC,KAAO,EAAA,CAAA,EAAG,MAAM,CAAA,EAAG,QAA2B,aAAA,CAAA;AAAA,EAC9C,YAAc,EAAA,CAAA,EAAG,MAAM,CAAA,EAAG,yBAAkC,oBAAA,CAAA;AAAA,EAC5D,OAAS,EAAA,CAAA,EAAG,MAAM,CAAA,EAAG,UAA6B,eAAA,CAAA;AAAA,EAClD,MAAQ,EAAA,CAAA,EAAG,MAAM,CAAA,EAAG,qBAA4B,cAAA,CAAA;AAAA,EAChD,WAAa,EAAA,CAAA,EAAG,MAAM,CAAA,EAAG,oCAAiC,mBAAA,CAAA;AAAA,EAC1D,YAAc,EAAA,CAAA,EAAG,MAAM,CAAA,EAAG,2BAAkC,oBAAA,CAAA;AAAA,EAC5D,MAAQ,EAAA,CAAA,EAAG,MAAM,CAAA,EAAG,SAA4B,cAAA,CAAA;AAAA,EAChD,OAAS,EAAA,CAAA,EAAG,MAAM,CAAA,EAAG,6BAA6B,eAAA,CAAA;AAAA,EAClD,MAAQ,EAAA,CAAA,EAAG,MAAM,CAAA,EAAG,4BAA4B,cAAA,CAAA;AAAA,EAChD,GAAA,EAAK,GAAG,MAAM,CAAA,KAAA;AAChB,CAAA,CAAA;AAGO,IAAM,SAAA,GAAY,CAAC,MAAoB,MAAA;AAAA,EAC5C,EAAA,EAAI,WAAY,CAAA,MAAA,EAAQ,KAAK,CAAA;AAAA,EAC7B,OAAO,CAAC,EAAA,KACN,WAAY,CAAA,MAAA,EAAQ,UAAU,EAAE,CAAA;AAAA,EAClC,MAAM,CAAC,MAAA,KAAmB,YAAY,MAAQ,EAAA,CAAA,OAAA,EAAU,MAAM,CAAE,CAAA,CAAA;AAAA,EAChE,OAAA,EAAS,WAAY,CAAA,MAAA,EAAQ,UAAU,CAAA;AAAA,EACvC,QAAQ,CAAC,QAAA,KAAqB,YAAY,MAAQ,EAAA,CAAA,SAAA,EAAY,QAAQ,CAAE,CAAA,CAAA;AAAA,EACxE,MAAA,EAAQ,WAAY,CAAA,MAAA,EAAQ,SAAS,CAAA;AAAA,EACrC,cAAc,CAAC,QAAA,KACb,YAAY,MAAQ,EAAA,CAAA,SAAA,EAAY,QAAQ,CAAQ,MAAA,CAAA,CAAA;AAAA,EAClD,SAAS,CAAC,QAAA,KACR,YAAY,MAAQ,EAAA,CAAA,SAAA,EAAY,QAAQ,CAAU,QAAA,CAAA,CAAA;AAAA,EACpD,QAAQ,CAAC,QAAA,KACP,YAAY,MAAQ,EAAA,CAAA,SAAA,EAAY,QAAQ,CAAS,OAAA,CAAA,CAAA;AAAA,EACnD,WAAa,EAAA,WAAA;AAAA,IACX,MAAA;AAAA,IACA,CAAY,SAAA,EAAA,MAAA,CAAO,QAAQ,CAAA,OAAA,EAAU,OAAO,MAAM,CAAA;AAAA,GACpD;AAAA,EACA,cAAc,CAAC,MAAA,KACb,YAAY,MAAQ,EAAA,CAAA,OAAA,EAAU,MAAM,CAAU,QAAA,CAAA;AAClD,CAAA,CAAA;AAKO,IAAM,WAAA,GAAc,CAAC,MAAoB,MAAA;AAAA,EAC9C,MAAA,EAAQ,WAAY,CAAA,MAAA,EAAQ,cAAqB,cAAA;AAAA,EACjD,SAAA,EAAW,WAAY,CAAA,MAAA,EAAQ,iBAAwB,iBAAA;AAAA,EACvD,OAAA,EAAS,WAAY,CAAA,MAAA,EAAQ,eAAsB,eAAA;AAAA,EACnD,IAAA,EAAM,WAAY,CAAA,MAAA,EAAQ,YAAmB,YAAA;AAAA,EAC7C,QAAA,EAAU,WAAY,CAAA,MAAA,EAAQ,gBAAuB,gBAAA;AAAA,EACrD,OAAA,EAAS,WAAY,CAAA,MAAA,EAAQ,eAAsB,eAAA;AAAA,EACnD,KAAA,EAAO,WAAY,CAAA,MAAA,EAAQ,aAAa,CAAA;AAAA,EACxC,cAAA,EAAgB,WAAY,CAAA,MAAA,EAAQ,sBAAsB,CAAA;AAAA,EAC1D,cAAA,EAAgB,WAAY,CAAA,MAAA,EAAQ,sBAA6B,sBAAA;AAAA,EACjE,YAAA,EAAc,WAAY,CAAA,MAAA,EAAQ,oBAA2B;AAC/D,CAAA,CAAA;AAIA,SAAS,oBACP,GAC4C,EAAA;AAC5C,EAAA,IAAI,CAAC,GAAK,EAAA;AACR,IAAO,OAAA,MAAA;AAAA;AAET,EAAA,OAAO,MAAO,CAAA,WAAA;AAAA,IACZ,MAAA,CAAO,OAAQ,CAAA,GAAG,CAAE,CAAA,MAAA;AAAA,MAClB,CAAC,GAAG,KAAK,CAAM,KAAA,KAAA,KAAU,QAAQ,KAAU,KAAA;AAAA;AAC7C,GACF;AACF;AAEO,SAAS,WAAA,CACd,MACA,EAAA,IAAA,EACA,EACA,EAAA;AACA,EAAM,MAAA,GAAA,GAAM,OAAO,MAAU,IAAA,cAAA;AAC7B,EAAA,IAAI,CAAC,GAAK,EAAA;AACR,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA;AAEF,EAAA,MAAM,SAAS,IAAI,eAAA;AAAA,IACjB,oBAAoB,EAAE;AAAA,GACxB;AACA,EAAM,MAAA,SAAA,GAAY,OAAO,QAAS,EAAA;AAClC,EAAA,OAAO,GAAG,CAAC,GAAA,EAAK,KAAK,SAAU,CAAA,CAAA,EAAG,KAAK,MAAM,CAAC,CAAE,CAAA,IAAA,CAAK,GAAG,CAAC,CAAA,EACvD,YAAY,CAAI,CAAA,EAAA,SAAS,KAAK,EAChC,CAAA,CAAA;AACF;AAEO,SAAS,UAAA,CAAW,YAAoBA,OAAe,EAAA;AAC5D,EAAM,MAAA,GAAA,GAAM,IAAI,GAAA,CAAI,UAAU,CAAA;AAC9B,EAAO,OAAA,GAAA,CAAI,QAAS,CAAA,UAAA,CAAWA,OAAK,CAAA;AACtC;AAKO,SAAS,OAAO,KAAkC,EAAA;AACvD,EAAA,IAAI,CAAC,KAAO,EAAA;AACV,IAAO,OAAA,KAAA;AAAA;AAGT,EAAA,MAAM,KACJ,GAAA,6EAAA;AAEF,EAAO,OAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AACzB;;;AC5IA,IAAM,GAAM,GAAA,UAAA;AACZ,IAAM,MAAS,GAAA,sBAAA;AACf,IAAM,MAAS,GAAA,wBAAA;AACf,IAAM,MAAS,GAAA,sBAAA;AACf,IAAM,KAAQ,GAAA,SAAA;AAEd,IAAM,UAAA,GAAa,CAAC,MAAA,EAAA,GAA8B,MAAuB,MAAA;AAAA,EACvE,IAAA,CAAK,SAA2B,IAAgC,EAAA;AAC9D,IAAA,IAAI,QAAQ,KAAO,EAAA;AACjB,MAAQ,OAAA,CAAA,IAAA;AAAA,QACN,CAAA,EAAG,MAAM,CAAW,QAAA,EAAA,KAAK,GAAG,MAAM,CAAA,OAAA,EAAU,KAAK,CAAA,EAAG,MAAO,CAAA,IAAA;AAAA,UACzD;AAAA,SACD,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AAAA,QACpB,OAAO,CAAG,EAAA,IAAA,CAAK,SAAU,CAAA,IAAI,CAAC,CAAK,CAAA,GAAA;AAAA,OACrC;AAAA;AACF,GACF;AAAA,EACA,KAAA,CAAM,SAA2B,IAAgC,EAAA;AAC/D,IAAA,IAAI,QAAQ,KAAO,EAAA;AACjB,MAAQ,OAAA,CAAA,KAAA;AAAA,QACN,CAAA,EAAG,MAAM,CAAW,QAAA,EAAA,KAAK,GAAG,MAAM,CAAA,OAAA,EAAU,KAAK,CAAA,EAAG,MAAO,CAAA,IAAA;AAAA,UACzD;AAAA,SACD,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AAAA,QACpB,OAAO,CAAG,EAAA,IAAA,CAAK,SAAU,CAAA,IAAI,CAAC,CAAK,CAAA,GAAA;AAAA,OACrC;AAAA;AACF,GACF;AAAA,EACA,IAAA,CAAK,SAA2B,IAAgC,EAAA;AAC9D,IAAA,IAAI,QAAQ,KAAO,EAAA;AACjB,MAAQ,OAAA,CAAA,IAAA;AAAA,QACN,CAAA,EAAG,MAAM,CAAW,QAAA,EAAA,KAAK,GAAG,MAAM,CAAA,MAAA,EAAS,KAAK,CAAA,EAAG,MAAO,CAAA,IAAA;AAAA,UACxD;AAAA,SACD,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AAAA,QACpB,IAAO,GAAA,IAAA,CAAK,SAAU,CAAA,IAAI,CAAI,GAAA;AAAA,OAChC;AAAA;AACF,GACF;AAAA,EACA,KAAA,CAAM,SAA2B,IAAgC,EAAA;AAC/D,IAAQ,OAAA,CAAA,KAAA;AAAA,MACN,CAAA,EAAG,MAAM,CAAW,QAAA,EAAA,KAAK,GAAG,GAAG,CAAA,OAAA,EAAU,KAAK,CAAA,EAAG,MAAO,CAAA,IAAA;AAAA,QACtD;AAAA,OACD,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AAAA,MAClB,OAAO,IAAO,GAAA,EAAA;AAAA,MACd,GAAG,KAAK,CAAA;AAAA,KACV;AAAA;AAEJ,CAAA,CAAA;AAQe,SAAR,MAAA,CACL,WACG,MACQ,EAAA;AACX,EAAM,MAAA,IAAA,GAAO,UAAW,CAAA,MAAA,EAAQ,MAAM,CAAA;AACtC,EAAA,MAAM,IAAO,GAAA,MAAA,EAAQ,MAAQ,EAAA,IAAA,IAAQ,IAAK,CAAA,IAAA;AAC1C,EAAA,MAAM,KAAQ,GAAA,MAAA,EAAQ,MAAQ,EAAA,KAAA,IAAS,IAAK,CAAA,KAAA;AAC5C,EAAA,MAAM,IAAO,GAAA,MAAA,EAAQ,MAAQ,EAAA,IAAA,IAAQ,IAAK,CAAA,IAAA;AAC1C,EAAA,MAAM,KAAQ,GAAA,MAAA,EAAQ,MAAQ,EAAA,KAAA,IAAS,IAAK,CAAA,KAAA;AAC5C,EAAA,OAAO,EAAE,IAAA,EAAM,IAAM,EAAA,KAAA,EAAO,KAAM,EAAA;AACpC;AAEO,SAAS,UAAA,CAAW,cAAsBC,QAA2B,EAAA;AAC1E,EAAA,OAAO,UAAWA,CAAAA,QAAAA,CAAQ,GAAK,EAAA,YAAA,CAAa,GAAG,CAAA;AACjD;;;AC1EO,IAAM,aAAgB,GAAA;AACtB,IAAM,WAAc,GAAA;AACpB,IAAM,aAAgB,GAAA;AAEtB,IAAM,qBAAwB,GAAA;;;ACKrC,eAAO,OAAA,CACL,GACA,EAAA,KAAA,EACA,MACA,EAAA;AACA,EAAA,MAAM,EAAE,KAAO,EAAA,IAAA,EAAM,OAAU,GAAA,MAAA,CAAO,QAAQ,WAAW,CAAA;AACzD,EAAA,MAAM,EAAE,OAAA,EAAAA,QAAS,EAAA,GAAG,MAAS,GAAA,KAAA;AAC7B,EAAA,MAAM,UAAa,GAAA,IAAI,GAAIA,CAAAA,QAAAA,CAAQ,GAAG,CAAA;AACtC,EAAA,MAAM,cAAiB,GAAA,IAAI,OAAQ,CAAA,EAAE,CAAA;AACrC,EAAA,IAAIA,QAAQ,CAAA,OAAA,CAAQ,GAAI,CAAA,QAAQ,CAAG,EAAA;AACjC,IAAe,cAAA,CAAA,GAAA,CAAI,UAAU,MAAOA,CAAAA,QAAAA,CAAQ,QAAQ,GAAI,CAAA,QAAQ,CAAC,CAAC,CAAA;AAAA;AAEpE,EAAA,IAAIA,QAAQ,CAAA,OAAA,CAAQ,GAAI,CAAA,aAAa,CAAG,EAAA;AACtC,IAAe,cAAA,CAAA,GAAA;AAAA,MACb,aAAA;AAAA,MACA,MAAOA,CAAAA,QAAAA,CAAQ,OAAQ,CAAA,GAAA,CAAI,aAAa,CAAC;AAAA,KAC3C;AAAA;AAGF,EAAI,IAAA,MAAA,CAAO,iBAAiB,IAAM,EAAA;AAChC,IAAA,cAAA,CAAe,GAAI,CAAA,qBAAA,EAAuB,MAAO,CAAA,MAAA,CAAO,aAAa,CAAC,CAAA;AAAA,GACjE,MAAA;AACL,IAAe,cAAA,CAAA,GAAA;AAAA,MACb,qBAAA;AAAA,MACA,OAAQ,CAAA,GAAA,CAAI,QAAa,KAAA,YAAA,GAAe,MAAS,GAAA;AAAA,KACnD;AAAA;AAGF,EAAe,cAAA,CAAA,GAAA,CAAI,MAAQ,EAAA,UAAA,CAAW,IAAI,CAAA;AAC1C,EAAA,IAAI,OAAO,WAAa,EAAA;AACtB,IAAA,MAAM,KAAQ,GAAA,IAAI,GAAI,CAAA,MAAA,CAAO,WAAW,CAAA;AACxC,IAAM,KAAA,CAAA,CAAA,wCAAA,EAA2C,MAAO,CAAA,WAAW,CAAE,CAAA,CAAA;AACrE,IAAe,cAAA,CAAA,GAAA,CAAI,aAAe,EAAA,KAAA,CAAM,MAAM,CAAA;AAAA,GAEhD,MAAA,IAAW,OAAO,MAAQ,EAAA;AACxB,IAAM,KAAA,CAAA,CAAA,mCAAA,EAAsC,MAAO,CAAA,MAAM,CAAE,CAAA,CAAA;AAC3D,IAAe,cAAA,CAAA,GAAA,CAAI,aAAe,EAAA,MAAA,CAAO,MAAM,CAAA;AAAA,GAC1C,MAAA;AACL,IAAA,MAAM,YAAeA,GAAAA,QAAAA,CAAQ,OAAQ,CAAA,GAAA,CAAI,aAAa,CAAA;AACtD,IAAA,IAAI,YAAc,EAAA;AAChB,MAAe,cAAA,CAAA,GAAA,CAAI,eAAe,YAAY,CAAA;AAAA,KACzC,MAAA;AACL,MAAM,MAAA,SAAA,GACJ,MAAO,CAAA,WAAA,KAAgB,cACnB,GAAA,CAAA,EAAG,UAAW,CAAA,MAAM,CAAG,EAAA,MAAA,CAAO,WAAW,CAAA,CAAA,GACzC,UAAW,CAAA,MAAA;AAEjB,MAAe,cAAA,CAAA,GAAA,CAAI,eAAe,SAAS,CAAA;AAC3C,MAAM,KAAA,CAAA,CAAA,6BAAA,EAAgC,SAAS,CAAE,CAAA,CAAA;AAAA;AACnD;AAEF,EAAM,MAAA,MAAA,GAAS,EAAE,GAAG,IAAK,EAAA;AAEzB,EACE,IAAA,MAAA,CAAO,QAAQ,WAAY,EAAA,KAAM,UACjC,MAAO,CAAA,MAAA,EAAQ,WAAY,EAAA,KAAM,KACjC,EAAA;AACA,IAAI,IAAA;AACF,MAAe,cAAA,CAAA,GAAA,CAAI,gBAAgB,kBAAkB,CAAA;AAErD,MAAA,MAAM,aAAa,KAAM,CAAA,IAAA,IAAQ,KAAM,CAAA,OAAA,EAAS,QAAQA,QAAQ,CAAA,IAAA;AAEhE,MAAA,MAAM,WAAW,MAAM,IAAI,QAAS,CAAA,UAAU,EAAE,IAAK,EAAA;AAGrD,MAAI,IAAA;AACF,QAAA,MAAA,CAAO,OAAO,IAAK,CAAA,SAAA,CAAU,IAAK,CAAA,KAAA,CAAM,QAAQ,CAAC,CAAA;AAAA,OAC3C,CAAA,MAAA;AACN,QAAe,cAAA,CAAA,GAAA,CAAI,gBAAgB,mCAAmC,CAAA;AACtE,QAAA,MAAA,CAAO,IAAO,GAAA,QAAA;AAAA;AAChB,aACO,CAAG,EAAA;AACV,MAAA,KAAA,CAAM,8BAA8B,CAAA;AAAA;AACtC;AAEF,EAAA,MAAA,CAAO,OAAU,GAAA,cAAA;AACjB,EAAA,MAAM,OAAU,GAAA,CAAA,EAAG,GAAG,CAAA,EAAG,WAAW,MAAM,CAAA,CAAA;AAE1C,EAAA,IAAI,OAAO,KAAO,EAAA;AAKhB,IAAA,MAAA,CAAO,OAAQ,CAAA,GAAA,CAAI,YAAc,EAAA,MAAA,CAAO,YAAY,CAAA;AACpD,IAAA,MAAA,CAAO,KAAQ,GAAA,UAAA;AAAA;AAGjB,EAAA,MAAM,MAAO,CAAA,YAAA,EAAc,eAAgB,CAAA,MAAA,EAAQ,OAAO,MAAM,CAAA;AAEhE,EAAI,IAAA;AACF,IAAM,MAAA,GAAA,GAAuB,MAAM,KAAA,CAAM,OAAS,EAAA;AAAA,MAChD,GAAG;AAAA,KACJ,CAAA,CAAE,KAAM,CAAA,CAAC,CAAM,KAAA;AACd,MAAA,KAAA,CAAM,oCAAsC,EAAA;AAAA,QAC1C,SAAS,CAAE,CAAA,OAAA;AAAA,QACX,OAAO,CAAE,CAAA;AAAA,OACV,CAAA;AACD,MAAA,OAAO,IAAI,QAAA;AAAA,QACT,gEAAA;AAAA,QACA,EAAE,QAAQ,GAAI;AAAA,OAChB;AAAA,KACD,CAAA;AACD,IAAA,MAAM,aAAa,OAAO,GAAA,EAAK,UAAU,UAAa,GAAA,GAAA,EAAK,OAAU,GAAA,IAAA;AACrE,IAAA,IAAA,CAAK,IAAI,MAAO,CAAA,MAAA,IAAU,KAAK,CAAA,EAAA,EAAK,OAAO,CAAI,CAAA,EAAA;AAAA,MAC7C,QAAQ,GAAK,EAAA,MAAA;AAAA,MACb,YAAY,GAAK,EAAA,UAAA;AAAA,MACjB,IAAA,EAAM,MAAM,UAAA,EAAY,IAAK;AAAA,KAC9B,CAAA;AACD,IAAO,OAAA,GAAA;AAAA,WACA,CAAG,EAAA;AACV,IAAA,IAAI,aAAa,KAAO,EAAA;AACtB,MAAA,KAAA,CAAM,oCAAsC,EAAA;AAAA,QAC1C,SAAS,CAAE,CAAA,OAAA;AAAA,QACX,OAAO,CAAE,CAAA;AAAA,OACV,CAAA;AAAA;AAEH,IAAA,OAAO,IAAI,QAAA;AAAA,MACT,gEAAA;AAAA,MACA,EAAE,QAAQ,GAAI;AAAA,KAChB;AAAA;AAEJ;;;AClFA,eAAO,IAAA,CACL,KACA,MAC2C,EAAA;AAC3C,EAAA,MAAM,EAAE,IAAM,EAAA,KAAA,EAAU,GAAA,MAAA,CAAO,QAAQ,YAAY,CAAA;AACnD,EAAA,IAAA,CAAK,eAAe,CAAA;AAEpB,EAAM,MAAA,UAAA,GAAa,CAAG,EAAA,MAAA,CAAO,MAAM,CAAA,aAAA,CAAA;AACnC,EAAK,IAAA,CAAA,CAAA,cAAA,EAAiB,UAAU,CAAE,CAAA,CAAA;AAElC,EAAI,GAAA,CAAA,OAAA,CAAQ,OAAO,gBAAgB,CAAA;AAEnC,EAAM,MAAA,GAAA,GAAM,MAAM,OAAQ,CAAA,UAAA,EAAY,EAAE,OAAS,EAAA,GAAA,IAAO,MAAM,CAAA;AAC9D,EAAA,IAAI,CAAC,GAAK,EAAA;AACR,IAAA,IAAA,CAAK,kBAAkB,CAAA;AACvB,IAAO,OAAA,MAAA;AAAA;AAET,EAAA,IAAA,CAAK,gBAAgB,CAAA;AACrB,EAAI,IAAA;AACF,IAAA,MAAM,UAAU,MAAM,IAAI,SAAS,GAAI,CAAA,IAAI,EAAE,IAAK,EAAA;AAClD,IAAA,IAAI,MAAO,CAAA,IAAA,CAAK,OAAO,CAAA,CAAE,WAAW,CAAG,EAAA;AACrC,MAAO,OAAA,KAAA,CAAA;AAAA;AAET,IAAO,OAAA,OAAA;AAAA,WACA,CAAG,EAAA;AACV,IAAA,KAAA,CAAM,CAAC,CAAA;AACP,IAAO,OAAA,MAAA;AAAA;AAEX;;;ACnEA,IAAM,GAAM,GAAA,IAAA;AAEZ,eAAO,KAAA,CAA6BA,UAAkB,MAAgB,EAAA;AACpE,EAAA,MAAM,GAAM,GAAA,SAAA,CAAU,MAAM,CAAA,CAAE,GAAG,CAAA;AAEjC,EAAIA,IAAAA,QAAAA,CAAQ,WAAW,KAAO,EAAA;AAC5B,IAAA,OAAO,MAAM,GAAI,CAAA,GAAA,EAAK,EAAE,OAAAA,EAAAA,QAAAA,IAAW,MAAM,CAAA;AAAA;AAE3C,EAAIA,IAAAA,QAAAA,CAAQ,WAAW,KAAO,EAAA;AAC5B,IAAA,OAAO,MAAM,GAAI,CAAA,GAAA,EAAK,EAAE,OAAAA,EAAAA,QAAAA,IAAW,MAAM,CAAA;AAAA;AAE3C,EAAIA,IAAAA,QAAAA,CAAQ,WAAW,QAAU,EAAA;AAC/B,IAAA,MAAM,OAAU,GAAA,MAAM,IAAKA,CAAAA,QAAAA,EAAS,MAAM,CAAA;AAC1C,IAAA,IAAI,CAAC,OAAS,EAAA;AACZ,MAAA,OAAO,IAAI,QAAS,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAE3C,IAAA,OAAO,MAAM,MAAO,CAAA,GAAA,EAAK,EAAE,OAAAA,EAAAA,QAAAA,IAAW,MAAM,CAAA;AAAA;AAE9C,EAAA,OAAO,IAAI,QAAS,CAAA,oBAAA,EAAsB,EAAE,MAAA,EAAQ,KAAK,CAAA;AAC3D;AAEO,SAAS,OAAA,CAAQ,cAAsBA,QAA2B,EAAA;AACvE,EAAA,OAAO,UAAWA,CAAAA,QAAAA,CAAQ,GAAK,EAAA,YAAA,CAAa,GAAG,CAAC,CAAA;AAClD;AAEA,eAAsB,OAAA,CACpB,MACA,EAAA,MAAA,EACA,IACmB,EAAA;AACnB,EAAA,MAAM,YAAY,CAAG,EAAA,MAAA,CAAO,YAAY,CAAG,EAAA,MAAA,CAAO,WAAW,CAA2B,EAAA,KAAA,UAAA,CAAA;AACxF,EAAA,MAAM,IAAoB,GAAA;AAAA,IACxB,SAAS,MAAO,CAAA,OAAA;AAAA,IAChB,QAAQ,MAAU,IAAA;AAAA,GACpB;AACA,EAAA,IAAI,WAAW,KAAO,EAAA;AACpB,IAAA,IAAA,CAAK,IAAO,GAAA,IAAA;AAAA;AAGd,EAAA,MAAM,GAAM,GAAA,IAAI,OAAQ,CAAA,SAAA,EAAW,IAAI,CAAA;AACvC,EAAA,IAAI,WAAW,QAAU,EAAA;AACvB,IAAA,OAAQ,MAAM,MAAA,CAAO,QAAS,CAAA,MAAA,CAAO,GAAG,CAAA;AAAA;AAE1C,EAAA,IAAI,WAAW,KAAO,EAAA;AACpB,IAAA,OAAQ,MAAM,MAAA,CAAO,QAAS,CAAA,GAAA,CAAI,GAAG,CAAA;AAAA;AAEvC,EAAA,OAAQ,MAAM,MAAA,CAAO,QAAS,CAAA,GAAA,CAAI,GAAG,CAAA;AACvC;AA6BA,eAAsB,MAAA,CACpB,GACA,EAAA,IAAA,EACA,MACA,EAAA;AACA,EAAA,IAAA,CAAK,MAAS,GAAA,QAAA;AAEd,EAAA,OAAO,MAAM,OAAA,CAAQ,GAAK,EAAA,IAAA,EAAM,MAAM,CAAA;AACxC;AAsBA,eAAsB,GAAA,CACpB,GACA,EAAA,IAAA,EACA,MACA,EAAA;AACA,EAAA,IAAA,CAAK,MAAS,GAAA,KAAA;AAEd,EAAA,OAAO,MAAM,OAAA,CAAQ,GAAK,EAAA,IAAA,EAAM,MAAM,CAAA;AACxC;AAiCA,eAAe,GAAA,CACb,GACA,EAAA,IAAA,EACA,MACA,EAAA;AACA,EAAA,MAAM,GAAM,GAAA,MAAM,OAAQ,CAAA,GAAA,EAAK,MAAM,MAAM,CAAA;AAC3C,EAAO,OAAA,GAAA;AACT;;;ACjKA,SAAS,kBAAA,CAAmB,SAAkB,SAA0B,EAAA;AACtE,EAAA,MAAM,SAAS,OAAQ,CAAA,GAAA,CAAI,QAAQ,CAAA,EAAG,MAAM,IAAI,CAAA;AAChD,EAAA,MAAM,WAAmC,EAAC;AAC1C,EAAA,IAAI,MAAQ,EAAA;AACV,IAAA,KAAA,MAAW,SAAS,MAAQ,EAAA;AAC1B,MAAM,MAAA,WAAA,GAAc,KAAM,CAAA,KAAA,CAAM,GAAG,CAAA;AACnC,MAAA,MAAM,UAAU,WAAY,CAAA,KAAA,CAAM,CAAC,CAAA,CAAE,KAAK,GAAG,CAAA;AAC7C,MAAM,MAAA,IAAA,GAAO,YAAY,CAAC,CAAA;AAC1B,MAAA,QAAA,CAAS,IAAI,CAAI,GAAA,OAAA;AAAA;AACnB;AAGF,EAAA,IAAI,MAAQ,EAAA;AACV,IAAA,KAAA,MAAW,SAAS,MAAQ,EAAA;AAC1B,MAAM,MAAA,WAAA,GAAc,KAAM,CAAA,KAAA,CAAM,GAAG,CAAA;AACnC,MAAA,MAAM,UAAU,WAAY,CAAA,KAAA,CAAM,CAAC,CAAA,CAAE,KAAK,GAAG,CAAA;AAC7C,MAAM,MAAA,IAAA,GAAO,YAAY,CAAC,CAAA;AAC1B,MAAA,QAAA,CAAS,IAAI,CAAI,GAAA,OAAA;AAAA;AACnB;AAEF,EAAe;AACb,IAAA,OAAO,SAAS,SAAS,CAAA;AAAA;AAG7B;AACO,SAAS,iBAAA,CAAkB,SAAkB,MAAgB,EAAA;AAClE,EAAM,MAAA,YAAA,GAAe,kBAAmB,CAAA,OAAA,EAAS,aAAa,CAAA;AAE9D,EAAO,OAAA,YAAA,GAAe,eAAe,MAAQ,EAAA,QAAA;AAC/C;;;ACmCA,eAAsB,IAAA,CACpB,QACA,IACA,EAAA;AACA,EAAK,IAAA,CAAA,IAAA,GAAO,KAAK,OAAQ,CAAA,IAAA;AACzB,EAAA,IAAA,CAAK,MAAS,GAAA,MAAA;AACd,EAAA,MAAM,IAAO,GAAA,IAAI,GAAI,CAAA,IAAA,CAAK,QAAQ,GAAG,CAAA;AACrC,EAAA,MAAM,QAAW,GAAA,IAAA,CAAK,YAAa,CAAA,GAAA,CAAI,UAAU,CAAA;AACjD,EAAA,MAAM,aAAgB,GAAA,IAAA,CAAK,YAAa,CAAA,GAAA,CAAI,eAAe,CAAA;AAC3D,EAAA,MAAM,SAAS,QAAY,IAAA,iBAAA,CAAkB,IAAK,CAAA,OAAA,CAAQ,SAAS,MAAM,CAAA;AAEzE,EAAM,MAAA,GAAA,GAAM,UAAU,MAAM,CAAA,CAAE,MAAM,EAAE,QAAA,EAAU,MAAQ,EAAA,aAAA,EAAe,CAAA;AAEvE,EAAA,OAAO,MAAM,OAAA,CAAQ,GAAK,EAAA,IAAA,EAAM,MAAM,CAAA;AACxC;;;AC7CA,eAAsBC,IAAAA,CACpB,MACA,EAAA,IAAA,EACA,GACA,EAAA;AACA,EAAA,MAAM,IAAO,GAAA,IAAI,GAAI,CAAA,IAAA,CAAK,QAAQ,GAAG,CAAA;AACrC,EAAA,MAAM,QAAW,GAAA,IAAA,CAAK,YAAa,CAAA,GAAA,CAAI,UAAU,CAAA;AACjD,EAAA,MAAM,SAAS,QAAY,IAAA,iBAAA,CAAkB,IAAK,CAAA,OAAA,CAAQ,SAAS,MAAM,CAAA;AAEzE,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAA,GAAA,CAAI,8BAA8B,CAAA;AAClC,IAAA,OAAO,IAAI,QAAS,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAE3C,EAAA,IAAA,CAAK,MAAS,GAAA,KAAA;AACd,EAAA,MAAM,GAAM,GAAA,SAAA,CAAU,MAAM,CAAA,CAAE,aAAa,MAAM,CAAA;AACjD,EAAA,OAAO,MAAM,OAAA,CAAQ,GAAK,EAAA,IAAA,EAAM,MAAM,CAAA;AACxC;;;ACXA,eAAsBC,IAAAA,CACpB,QACA,IACA,EAAA;AACA,EAAK,IAAA,CAAA,IAAA,GAAO,KAAK,OAAQ,CAAA,IAAA;AACzB,EAAA,IAAA,CAAK,MAAS,GAAA,KAAA;AAId,EAAA,MAAM,CAAC,MAAM,CAAI,GAAA,IAAI,GAAI,CAAA,IAAA,CAAK,OAAQ,CAAA,GAAG,CAAE,CAAA,QAAA,CAAS,KAAM,CAAA,GAAG,EAAE,OAAQ,EAAA;AAEvE,EAAA,MAAM,GAAM,GAAA,SAAA,CAAU,MAAM,CAAA,CAAE,KAAK,MAAM,CAAA;AAEzC,EAAA,OAAO,MAAM,OAAA,CAAM,GAAK,EAAA,IAAA,EAAM,MAAM,CAAA;AACtC;;;ACzCA,IAAMC,IAAM,GAAA,OAAA;AAEZ,eAAOJ,MAAAA,CAA6BC,UAAkB,MAAgB,EAAA;AACpE,EAAM,MAAA,EAAE,MAAS,GAAA,MAAA;AAAA,IACf,EAAE,GAAG,MAAQ,EAAA,KAAA,EAAO,OAAO,KAAM,EAAA;AAAA,IACjC,YAAYG,IAAG,CAAA,CAAA;AAAA,GACjB;AAEA,EAAA,QAAQH,SAAQ,MAAQ;AAAA,IACtB,KAAK,KAAA;AACH,MAAA,OAAO,MAAMC,IAAI,CAAA,MAAA,EAAQ,EAAE,OAAAD,EAAAA,QAAAA,IAAW,IAAI,CAAA;AAAA,IAC5C,KAAK,MAAA;AACH,MAAA,OAAO,MAAM,IAAK,CAAA,MAAA,EAAQ,EAAE,OAAA,EAAAA,UAAS,CAAA;AAAA,IACvC,KAAK,KAAA;AACH,MAAA,OAAO,MAAME,IAAI,CAAA,MAAA,EAAQ,EAAE,OAAA,EAAAF,UAAS,CAAA;AAAA,IAEtC;AACE,MAAA,OAAO,IAAI,QAAS,CAAA,oBAAA,EAAsB,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAE/D;AACO,SAASI,QAAAA,CAAQ,cAAsBJ,QAA2B,EAAA;AACvE,EAAA,OAAO,UAAWA,CAAAA,QAAAA,CAAQ,GAAK,EAAA,YAAA,CAAaG,IAAG,CAAC,CAAA;AAClD;;;ACDA,eAAsBF,IAAAA,CACpB,QACA,IACA,EAAA;AACA,EAAA,MAAM,IAAO,GAAA,IAAI,GAAI,CAAA,IAAA,CAAK,QAAQ,GAAG,CAAA;AACrC,EAAM,MAAA,GAAG,QAAQ,CAAA,GAAI,KAAK,QAAS,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,OAAQ,EAAA;AAEtD,EAAA,MAAM,MAAM,CAAG,EAAA,SAAA,CAAU,MAAM,CAAE,CAAA,YAAA,CAAa,QAAQ,CAAC,CAAA,CAAA;AACvD,EAAA,OAAO,MAAM,OAAA,CAAQ,GAAK,EAAA,IAAA,EAAM,MAAM,CAAA;AACxC;;;ACCA,eAAsBI,KAAAA,CACpB,QACA,IACA,EAAA;AACA,EAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,IAAA,CAAK,SAAS,MAAM,CAAA;AAE/C,EAAA,IAAI,CAAC,OAAS,EAAA;AACZ,IAAA,OAAO,IAAI,QAAS,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAE3C,EAAA,MAAM,IAAO,GAAA,IAAI,GAAI,CAAA,IAAA,CAAK,QAAQ,GAAG,CAAA;AACrC,EAAM,MAAA,GAAG,QAAQ,CAAA,GAAI,KAAK,QAAS,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,OAAQ,EAAA;AACtD,EAAA,IAAA,CAAK,OAAO,IAAK,CAAA,SAAA,CAAU,EAAE,KAAO,EAAA,OAAA,CAAQ,OAAO,CAAA;AACnD,EAAA,IAAA,CAAK,MAAS,GAAA,MAAA;AACd,EAAA,MAAM,GAAM,GAAA,SAAA,CAAU,MAAM,CAAA,CAAE,aAAa,QAAQ,CAAA;AAEnD,EAAA,OAAO,MAAM,OAAA,CAAM,GAAK,EAAA,IAAA,EAAM,MAAM,CAAA;AACtC;;;ACjDA,IAAMF,IAAM,GAAA,cAAA;AAEZ,eAAOJ,MAAAA,CAA6BC,UAAkB,MAAgB,EAAA;AACpE,EAAM,MAAA,EAAE,MAAS,GAAA,MAAA;AAAA,IACf,EAAE,GAAG,MAAQ,EAAA,KAAA,EAAO,OAAO,KAAM,EAAA;AAAA,IACjC,YAAYG,IAAG,CAAA,CAAA;AAAA,GACjB;AAEA,EAAA,MAAM,IAAO,GAAA,IAAI,GAAIH,CAAAA,QAAAA,CAAQ,GAAG,CAAA;AAChC,EAAM,MAAA,GAAG,QAAQ,CAAA,GAAI,KAAK,QAAS,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,OAAQ,EAAA;AAEtD,EAAA,IAAI,CAAC,QAAU,EAAA;AACb,IAAA,IAAA,CAAK,4BAA4B,CAAA;AACjC,IAAA,OAAO,IAAI,QAAS,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAG3C,EAAA,QAAQA,SAAQ,MAAQ;AAAA,IACtB,KAAK,KAAA;AACH,MAAA,OAAO,MAAMC,IAAI,CAAA,MAAA,EAAQ,EAAE,OAAA,EAAAD,UAAS,CAAA;AAAA,IACtC,KAAK,MAAA;AACH,MAAA,OAAO,MAAMK,KAAK,CAAA,MAAA,EAAQ,EAAE,OAAA,EAAAL,UAAS,CAAA;AAAA,IAEvC;AACE,MAAA,OAAO,IAAI,QAAS,CAAA,oBAAA,EAAsB,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAE/D;AAEO,SAASI,QAAAA,CAAQ,cAAsBJ,QAA2B,EAAA;AACvE,EAAA,MAAM,GAAM,GAAA,IAAI,GAAIA,CAAAA,QAAAA,CAAQ,GAAG,CAAA;AAC/B,EAAM,MAAA,CAAC,MAAQ,EAAA,gBAAA,EAAkB,QAAQ,CAAA,GAAI,IAAI,QAC9C,CAAA,KAAA,CAAM,GAAG,CAAA,CACT,OAAQ,EAAA;AACX,EAAID,IAAAA,OAAAA,GAAQ,YAAaI,CAAAA,IAAG,CACzB,CAAA,OAAA,CAAQ,cAAc,QAAQ,CAAA,CAC9B,OAAQ,CAAA,UAAA,EAAY,MAAM,CAAA;AAC7B,EAAA,IAAI,WAAW,OAAS,EAAA;AACtB,IAAAJ,UAAQ,YAAaI,CAAAA,IAAG,CAAE,CAAA,OAAA,CAAQ,cAAc,gBAAgB,CAAA;AAAA;AAElE,EAAO,OAAA,UAAA,CAAWH,QAAQ,CAAA,GAAA,EAAKD,OAAK,CAAA;AACtC;AAEA,eAAsB,gBAAA,CACpB,MACA,EAAA,MAAA,EACA,OAIA,EAAA;AACA,EAAA,MAAM,EAAE,IAAA,EAAM,MAAO,EAAA,GAAe,EAAC;AACrC,EAAI,IAAA,CAAC,OAAO,QAAU,EAAA;AACpB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA;AAEF,EAAA,IAAI,CAAC,MAAO,CAAA,MAAA,CAAO,QAAQ,CAAK,IAAA,MAAA,CAAO,QAAQ,IAAM,EAAA;AACnD,IAAA,MAAA,CAAO,MAAQ,EAAA,IAAA;AAAA,MACb;AAAA,KACF;AAAA;AAEF,EAAM,MAAA,CAAA,GAAI,IAAI,eAAgB,EAAA;AAC9B,EAAA,IAAI,QAAQ,aAAe,EAAA;AACzB,IAAE,CAAA,CAAA,GAAA,CAAI,eAAiB,EAAA,MAAA,CAAO,aAAa,CAAA;AAAA;AAE7C,EAAA,IAAI,QAAQ,QAAU,EAAA;AACpB,IAAE,CAAA,CAAA,GAAA,CAAI,UAAY,EAAA,MAAA,CAAO,QAAQ,CAAA;AAAA;AAEnC,EAAA,MAAM,YAAY,CAAG,EAAA,MAAA,CAAO,YAAY,CACtC,EAAA,MAAA,CAAO,WACT,CAAsC,EAAA,2BAAA,oBAAA,OAAA;AAAA,IACpC,YAAA;AAAA,IACA,MAAO,CAAA;AAAA,GACR,CAAA,CAAA;AACD,EAAA,MAAM,IAAI,MAAU;AACpB,EAAA,MAAM,IAAoB,GAAA;AAAA,IACxB,MAAQ,EAAA,CAAA;AAAA,IACR,SAAS,MAAO,CAAA;AAAA,GAClB;AAKA,EAAA,MAAM,GAAM,GAAA,IAAI,OAAQ,CAAA,SAAA,EAAW,IAAI,CAAA;AAEvC,EAAA,OAAQ,MAAM,MAAA,CAAO,QAAS,CAAA,CAAC,EAAE,GAAG,CAAA;AACtC;;;AC3DA,eAAsBG,IAAAA,CACpB,QACA,IACA,EAAA;AACA,EAAA,MAAM,IAAO,GAAA,IAAI,GAAI,CAAA,IAAA,CAAK,QAAQ,GAAG,CAAA;AACrC,EAAM,MAAA,GAAG,QAAQ,CAAA,GAAI,KAAK,QAAS,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,OAAQ,EAAA;AACtD,EAAA,IAAI,CAAC,QAAU,EAAA;AACb,IAAA,OAAO,IAAI,QAAS,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAG3C,EAAI,IAAA,IAAA,CAAK,YAAa,CAAA,IAAA,GAAO,CAAG,EAAA;AAC9B,IAAA,IAAA,CAAK,OAAO,IAAI,eAAA,CAAgB,IAAK,CAAA,YAAY,EAAE,QAAS,EAAA;AAAA;AAE9D,EAAA,IAAA,CAAK,MAAS,GAAA,KAAA;AACd,EAAA,MAAM,MAAM,CAAG,EAAA,SAAA,CAAU,MAAM,CAAE,CAAA,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAA;AAEjD,EAAA,MAAM,GAAM,GAAA,MAAM,OAAQ,CAAA,GAAA,EAAK,MAAM,MAAM,CAAA;AAC3C,EAAA,MAAM,QAAW,GAAA,GAAA,EAAK,OAAQ,CAAA,GAAA,CAAI,UAAU,CAAA;AAC5C,EAAA,IAAI,QAAU,EAAA;AACZ,IAAO,OAAA,IAAI,QAAS,CAAA,GAAA,EAAK,IAAM,EAAA;AAAA,MAC7B,MAAQ,EAAA,GAAA;AAAA,MACR,SAAS,GAAK,EAAA;AAAA,KACf,CAAA;AAAA;AAEH,EAAO,OAAA,IAAI,QAAS,CAAA,GAAA,EAAK,IAAM,EAAA;AAAA,IAC7B,QAAQ,GAAK,EAAA,MAAA;AAAA,IACb,SAAS,GAAK,EAAA;AAAA,GACf,CAAA;AACH;;;AChCA,eAAsBG,KAAAA,CACpB,QACA,IACA,EAAA;AACA,EAAA,MAAM,IAAO,GAAA,IAAI,GAAI,CAAA,IAAA,CAAK,QAAQ,GAAG,CAAA;AACrC,EAAM,MAAA,GAAG,QAAQ,CAAA,GAAI,KAAK,QAAS,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,OAAQ,EAAA;AACtD,EAAA,IAAI,CAAC,QAAU,EAAA;AACb,IAAA,OAAO,IAAI,QAAS,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAG3C,EAAA,IAAA,CAAK,MAAS,GAAA,MAAA;AACd,EAAK,IAAA,CAAA,IAAA,GAAO,KAAK,OAAQ,CAAA,IAAA;AACzB,EAAA,MAAM,MAAM,CAAG,EAAA,SAAA,CAAU,MAAM,CAAE,CAAA,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAA;AAEjD,EAAA,OAAO,MAAM,OAAA,CAAM,GAAK,EAAA,IAAA,EAAM,MAAM,CAAA;AACtC;;;ACtCA,IAAMF,IAAM,GAAA,QAAA;AAEZ,eAAOJ,MAAAA,CAA6BC,UAAkB,MAAgB,EAAA;AACpE,EAAA,QAAQA,SAAQ,MAAQ;AAAA;AAAA;AAAA,IAGtB,KAAK,KAAA;AAAA,IACL,KAAK,KAAA;AACH,MAAA,OAAO,MAAME,IAAI,CAAA,MAAA,EAAQ,EAAE,OAAA,EAAAF,UAAS,CAAA;AAAA,IACtC,KAAK,MAAA;AACH,MAAA,OAAO,MAAMK,KAAK,CAAA,MAAA,EAAQ,EAAE,OAAA,EAAAL,UAAS,CAAA;AAAA,IAEvC;AACE,MAAA,OAAO,IAAI,QAAS,CAAA,oBAAA,EAAsB,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAE/D;AAEO,SAASI,QAAAA,CAAQ,cAAsBJ,QAA2B,EAAA;AACvE,EAAA,MAAM,GAAM,GAAA,IAAI,GAAIA,CAAAA,QAAAA,CAAQ,GAAG,CAAA;AAC/B,EAAM,MAAA,GAAG,QAAQ,CAAA,GAAI,IAAI,QAAS,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,OAAQ,EAAA;AACrD,EAAA,MAAMD,UAAQ,YAAaI,CAAAA,IAAG,CAAE,CAAA,OAAA,CAAQ,cAAc,QAAQ,CAAA;AAC9D,EAAO,OAAA,UAAA,CAAWH,QAAQ,CAAA,GAAA,EAAKD,OAAK,CAAA;AACtC;AAEA,eAAsB,WAAA,CACpB,MACA,EAAA,MAAA,EACA,IACA,EAAA;AACA,EAAI,IAAA,CAAC,OAAO,QAAU,EAAA;AACpB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA;AAEF,EAAA,IAAI,CAAC,MAAO,CAAA,MAAA,CAAO,QAAQ,CAAK,IAAA,MAAA,CAAO,QAAQ,IAAM,EAAA;AACnD,IAAA,MAAA,CAAO,MAAQ,EAAA,IAAA;AAAA,MACb;AAAA,KACF;AAAA;AAEF,EAAA,IAAI,SAAY,GAAA,CAAA,EAAG,MAAO,CAAA,YAAY,CACpC,EAAA,MAAA,CAAO,WACT,CAAA,EAAA,4BAAA,cAAgC,OAAQ,CAAA,YAAA,EAAc,MAAO,CAAA,QAAQ,CAAC,CAAA,CAAA;AACtE,EAAA,MAAM,IAAI,MAAU,IAAA,KAAA;AACpB,EAAA,MAAM,IAAoB,GAAA;AAAA,IACxB,MAAQ,EAAA,CAAA;AAAA,IACR,SAAS,MAAO,CAAA;AAAA,GAClB;AACA,EAAI,IAAA,MAAA,KAAW,MAAU,IAAA,MAAA,KAAW,KAAO,EAAA;AACzC,IAAA,IAAA,CAAK,IAAO,GAAA,IAAA;AAAA;AAEd,EAAA,IAAI,WAAW,QAAU,EAAA;AACvB,IAAY,SAAA,GAAA,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA;AAElC,EAAA,MAAM,GAAM,GAAA,IAAI,OAAQ,CAAA,SAAA,EAAW,IAAI,CAAA;AAEvC,EAAA,OAAQ,MAAM,MAAA,CAAO,QAAS,CAAA,CAAC,EAAE,GAAG,CAAA;AACtC;;;AClCA,eAAsBE,IAAAA,CACpB,QACA,IACA,EAAA;AACA,EAAA,MAAM,IAAO,GAAA,IAAI,GAAI,CAAA,IAAA,CAAK,QAAQ,GAAG,CAAA;AACrC,EAAM,MAAA,GAAG,QAAQ,CAAA,GAAI,KAAK,QAAS,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,OAAQ,EAAA;AACtD,EAAA,IAAI,CAAC,QAAU,EAAA;AACb,IAAA,OAAO,IAAI,QAAS,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAG3C,EAAA,IAAA,CAAK,MAAS,GAAA,KAAA;AACd,EAAA,MAAM,MAAM,CAAG,EAAA,SAAA,CAAU,MAAM,CAAE,CAAA,OAAA,CAAQ,QAAQ,CAAC,CAAA,CAAA;AAElD,EAAA,OAAO,MAAM,OAAA,CAAQ,GAAK,EAAA,IAAA,EAAM,MAAM,CAAA;AACxC;;;ACzCA,IAAME,IAAM,GAAA,SAAA;AAEZ,eAAOJ,MAAAA,CAA6BC,UAAkB,MAAgB,EAAA;AACpE,EAAA,QAAQA,SAAQ,MAAQ;AAAA,IACtB,KAAK,KAAA;AACH,MAAA,OAAO,MAAMC,IAAI,CAAA,MAAA,EAAQ,EAAE,OAAA,EAAAD,UAAS,CAAA;AAAA,IACtC;AACE,MAAA,OAAO,IAAI,QAAS,CAAA,oBAAA,EAAsB,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAE/D;AAEO,SAASI,QAAAA,CAAQ,cAAsBJ,QAA2B,EAAA;AACvE,EAAA,MAAM,GAAM,GAAA,IAAI,GAAIA,CAAAA,QAAAA,CAAQ,GAAG,CAAA;AAC/B,EAAM,MAAA,GAAG,QAAQ,CAAA,GAAI,IAAI,QAAS,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,OAAQ,EAAA;AACrD,EAAA,MAAMD,UAAQ,YAAaI,CAAAA,IAAG,CAAE,CAAA,OAAA,CAAQ,cAAc,QAAQ,CAAA;AAC9D,EAAO,OAAA,GAAA,CAAI,QAAS,CAAA,QAAA,CAASJ,OAAK,CAAA;AACpC;AAEA,eAAsB,aAAa,MAAgB,EAAA;AACjD,EAAI,IAAA,CAAC,OAAO,QAAU,EAAA;AACpB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA;AAEF,EAAA,IAAI,CAAC,MAAO,CAAA,MAAA,CAAO,QAAQ,CAAK,IAAA,MAAA,CAAO,QAAQ,IAAM,EAAA;AACnD,IAAA,MAAA,CAAO,MAAQ,EAAA,IAAA;AAAA,MACb;AAAA,KACF;AAAA;AAEF,EAAA,MAAM,SAAY,GAAA,CAAA,EAAG,MAAO,CAAA,YAAY,CACtC,EAAA,MAAA,CAAO,WACT,CAAA,EAAA,6BAAA,eAAiC,OAAQ,CAAA,YAAA,EAAc,MAAO,CAAA,QAAQ,CAAC,CAAA,CAAA;AAEvE,EAAM,MAAA,GAAA,GAAM,IAAI,OAAQ,CAAA,SAAA,EAAW,EAAE,OAAS,EAAA,MAAA,CAAO,SAAS,CAAA;AAE9D,EAAA,OAAQ,MAAM,MAAA,CAAO,QAAS,CAAA,GAAA,CAAI,GAAG,CAAA;AACvC;;;ACTA,eAAsBE,IAAAA,CACpB,MACA,EAAA,OAAA,EACA,IACA,EAAA;AACA,EAAI,IAAA,GAAA,GAAM,GAAG,SAAU,CAAA,MAAM,EAAE,YAAa,CAAA,OAAA,CAAQ,EAAE,CAAC,CAAA,CAAA;AACvD,EAAA,IAAI,OAAO,OAAY,KAAA,QAAA,IAAY,MAAU,IAAA,OAAA,IAAW,QAAQ,IAAM,EAAA;AACpE,IAAM,GAAA,GAAA,CAAA,EAAG,UAAU,MAAM,CAAA,CAAE,aAAa,OAAQ,CAAA,IAAA,CAAK,EAAE,CAAC,CAAA,CAAA;AAAA;AAG1D,EAAA,MAAM,GAAM,GAAA,MAAM,OAAQ,CAAA,GAAA,EAAK,MAAM,MAAM,CAAA;AAC3C,EAAO,OAAA,GAAA;AACT;;;ACPA,eAAsBA,IAAAA,CACpB,MACA,EAAA,IAAA,EACA,GACA,EAAA;AACA,EAAA,MAAM,IAAO,GAAA,IAAI,GAAI,CAAA,IAAA,CAAK,QAAQ,GAAG,CAAA;AACrC,EAAM,MAAA,CAAC,QAAQ,CAAI,GAAA,IAAA,CAAK,SAAS,KAAM,CAAA,GAAG,EAAE,OAAQ,EAAA;AACpD,EAAA,IAAI,CAAC,QAAU,EAAA;AACb,IAAA,GAAA,CAAI,8BAA8B,CAAA;AAClC,IAAA,OAAO,IAAI,QAAS,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAG3C,EAAA,IAAA,CAAK,MAAS,GAAA,KAAA;AACd,EAAA,MAAM,MAAM,CAAG,EAAA,SAAA,CAAU,MAAM,CAAE,CAAA,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAA;AAEjD,EAAA,OAAO,MAAM,OAAA,CAAQ,GAAK,EAAA,IAAA,EAAM,MAAM,CAAA;AACxC;;;ACpBA,eAAsBK,OAAAA,CACpB,QACA,IACA,EAAA;AACA,EAAA,MAAM,IAAO,GAAA,IAAI,GAAI,CAAA,IAAA,CAAK,QAAQ,GAAG,CAAA;AACrC,EAAM,MAAA,CAAC,QAAQ,CAAI,GAAA,IAAA,CAAK,SAAS,KAAM,CAAA,GAAG,EAAE,OAAQ,EAAA;AACpD,EAAA,IAAI,CAAC,QAAU,EAAA;AACb,IAAA,OAAO,IAAI,QAAS,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAG3C,EAAA,IAAA,CAAK,MAAS,GAAA,QAAA;AACd,EAAA,MAAM,MAAM,CAAG,EAAA,SAAA,CAAU,MAAM,CAAE,CAAA,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAA;AAEjD,EAAA,OAAO,MAAM,OAAA,CAAM,GAAK,EAAA,IAAA,EAAM,MAAM,CAAA;AACtC;;;ACVA,eAAsBJ,IAAAA,CACpB,QACA,IACA,EAAA;AACA,EAAA,MAAM,IAAO,GAAA,IAAI,GAAI,CAAA,IAAA,CAAK,QAAQ,GAAG,CAAA;AACrC,EAAM,MAAA,CAAC,QAAQ,CAAI,GAAA,IAAA,CAAK,SAAS,KAAM,CAAA,GAAG,EAAE,OAAQ,EAAA;AACpD,EAAA,IAAI,CAAC,QAAU,EAAA;AACb,IAAA,OAAO,IAAI,QAAS,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAE3C,EAAK,IAAA,CAAA,IAAA,GAAO,KAAK,OAAQ,CAAA,IAAA;AACzB,EAAA,IAAA,CAAK,MAAS,GAAA,KAAA;AACd,EAAA,MAAM,MAAM,CAAG,EAAA,SAAA,CAAU,MAAM,CAAE,CAAA,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAA;AAEjD,EAAA,OAAO,MAAM,OAAA,CAAM,GAAK,EAAA,IAAA,EAAM,MAAM,CAAA;AACtC;;;ACPA,eAAsBG,KAAAA,CACpB,QACA,IACA,EAAA;AACA,EAAK,IAAA,CAAA,IAAA,GAAO,KAAK,OAAQ,CAAA,IAAA;AACzB,EAAA,IAAA,CAAK,MAAS,GAAA,MAAA;AACd,EAAA,MAAM,GAAM,GAAA,CAAA,EAAG,SAAU,CAAA,MAAM,EAAE,OAAO,CAAA,CAAA;AAExC,EAAA,OAAO,MAAM,OAAA,CAAQ,GAAK,EAAA,IAAA,EAAM,MAAM,CAAA;AACxC;;;AC1CA,IAAMF,IAAM,GAAA,SAAA;AAEZ,eAAOJ,MAAAA,CAA6BC,UAAkB,MAAgB,EAAA;AACpE,EAAM,MAAA,EAAE,MAAS,GAAA,MAAA;AAAA,IACf,EAAE,GAAG,MAAQ,EAAA,KAAA,EAAO,OAAO,KAAM,EAAA;AAAA,IACjC,YAAYG,IAAG,CAAA,CAAA;AAAA,GACjB;AACA,EAAA,MAAM,OAAU,GAAA,MAAM,IAAKH,CAAAA,QAAAA,EAAS,MAAM,CAAA;AAE1C,EAAA,IAAI,CAAC,OAAS,EAAA;AACZ,IAAA,IAAA,CAAK,KAAK,CAAA;AACV,IAAA,OAAO,IAAI,QAAS,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAE3C,EAAM,MAAA,CAAC,gBAAgB,CAAIA,GAAAA,QAAAA,CAAQ,IAAI,KAAM,CAAA,GAAG,EAAE,OAAQ,EAAA;AAE1D,EAAA,QAAQA,SAAQ,MAAQ;AAAA,IACtB,KAAK,KAAA;AACH,MAAI,IAAA,MAAA,CAAO,gBAAgB,CAAG,EAAA;AAC5B,QAAA,OAAO,MAAMC,IAAW,CAAA,MAAA,EAAQ,EAAE,OAAAD,EAAAA,QAAAA,IAAW,IAAI,CAAA;AAAA;AAEnD,MAAA,OAAO,MAAMC,IAAI,CAAA,MAAA,EAAQ,SAAS,EAAE,OAAA,EAAAD,UAAS,CAAA;AAAA,IAC/C,KAAK,MAAA;AACH,MAAA,OAAO,MAAMK,KAAK,CAAA,MAAA,EAAQ,EAAE,OAAA,EAAAL,UAAS,CAAA;AAAA,IACvC,KAAK,QAAA;AACH,MAAA,OAAO,MAAMM,OAAO,CAAA,MAAA,EAAQ,EAAE,OAAA,EAAAN,UAAS,CAAA;AAAA,IACzC,KAAK,KAAA;AACH,MAAA,OAAO,MAAME,IAAI,CAAA,MAAA,EAAQ,EAAE,OAAA,EAAAF,UAAS,CAAA;AAAA,IAEtC;AACE,MAAA,OAAO,IAAI,QAAS,CAAA,oBAAA,EAAsB,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAE/D;AAEO,SAASI,QAAAA,CAAQ,cAAsBJ,QAA2B,EAAA;AACvE,EAAA,OAAO,UAAWA,CAAAA,QAAAA,CAAQ,GAAK,EAAA,YAAA,CAAaG,IAAG,CAAC,CAAA;AAClD;AAEA,eAAsB,YAAA,CACpB,MACA,EAAA,MAAA,EACA,IACmB,EAAA;AACnB,EAAA,MAAM,YAAY,CAAG,EAAA,MAAA,CAAO,YAAY,CAAG,EAAA,MAAA,CAAO,WAAW,CAAgC,EAAA,UAAA,eAAA,CAAA;AAE7F,EAAA,MAAM,IAAoB,GAAA;AAAA,IACxB,MAAA;AAAA,IACA,SAAS,MAAO,CAAA;AAAA,GAClB;AACA,EAAuB;AACrB,IAAA,IAAA,CAAK,IAAO,GAAA,IAAA;AAAA;AAEd,EAAA,MAAM,GAAM,GAAA,IAAI,OAAQ,CAAA,SAAA,EAAW,IAAI,CAAA;AAEvC,EAAA,OAAQ,MAAM,MAAA,CAAO,QAAS,CAAA,IAAA,CAAK,GAAG,CAAA;AACxC;AAEA,eAAsB,WAAA,CACpB,MACA,EAAA,MAAA,EACA,IACA,EAAA;AACA,EAAI,IAAA,CAAC,OAAO,QAAU,EAAA;AACpB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA;AAEF,EAAA,IAAI,CAAC,MAAO,CAAA,MAAA,CAAO,QAAQ,CAAK,IAAA,MAAA,CAAO,QAAQ,IAAM,EAAA;AACnD,IAAA,MAAA,CAAO,MAAQ,EAAA,IAAA;AAAA,MACb;AAAA,KACF;AAAA;AAEF,EAAA,MAAM,SAAY,GAAA,CAAA,EAAG,MAAO,CAAA,YAAY,CACtC,EAAA,MAAA,CAAO,WACT,CAAA,EAAA,qBAAA,cAAgC,OAAQ,CAAA,YAAA,EAAc,MAAO,CAAA,QAAQ,CAAC,CAAA,CAAA;AACtE,EAAA,MAAM,IAAI,MAAU,IAAA,KAAA;AACpB,EAAA,MAAM,IAAoB,GAAA;AAAA,IACxB,MAAQ,EAAA,CAAA;AAAA,IACR,SAAS,MAAO,CAAA;AAAA,GAClB;AACA,EAAA,IAAI,MAAM,KAAO,EAAA;AACf,IAAA,IAAA,CAAK,IAAO,GAAA,IAAA;AAAA;AAEd,EAAA,MAAM,GAAM,GAAA,IAAI,OAAQ,CAAA,SAAA,EAAW,IAAI,CAAA;AAEvC,EAAA,OAAQ,MAAM,MAAA,CAAO,QAAS,CAAA,CAAC,EAAE,GAAG,CAAA;AACtC;AAEA,eAAsB,mBAAmB,MAAgB,EAAA;AACvD,EAAI,IAAA,MAAA,CAAO,QAAQ,IAAM,EAAA;AACvB,IAAI,IAAA,CAAC,OAAO,MAAQ,EAAA;AAClB,MAAA,MAAA,CAAO,MAAQ,EAAA,IAAA;AAAA,QACb;AAAA,OACF;AAAA,KACS,MAAA,IAAA,CAAC,MAAO,CAAA,MAAA,CAAO,MAAM,CAAG,EAAA;AACjC,MAAA,MAAA,CAAO,MAAQ,EAAA,IAAA;AAAA,QACb;AAAA,OACF;AAAA;AACF;AAEF,EAAA,MAAM,YAAY,CAAG,EAAA,MAAA,CAAO,YAAY,CACtC,EAAA,MAAA,CAAO,WACT,CAAsC,EAAA,yBAAA,oBAAA,OAAA;AAAA,IACpC,UAAA;AAAA,IACA,OAAO,MAAU,IAAA;AAAA,GAClB,CAAA,CAAA;AACD,EAAM,MAAA,GAAA,GAAM,IAAI,OAAQ,CAAA,SAAA,EAAW,EAAE,OAAS,EAAA,MAAA,CAAO,SAAS,CAAA;AAE9D,EAAA,OAAQ,MAAM,MAAA,CAAO,QAAS,CAAA,GAAA,CAAI,GAAG,CAAA;AACvC;;;ACpFA,IAAMA,IAAM,GAAA,QAAA;AAEZ,eAAOJ,MAAAA,CAA6B,KAAc,MAAgB,EAAA;AAChE,EAAA,IAAI,GAAM,GAAA,WAAA,CAAY,MAAM,CAAA,CAAEI,IAAG,CAAA;AAEjC,EAAA,MAAM,IAAoB,GAAA;AAAA,IACxB,QAAQ,GAAI,CAAA,MAAA;AAAA,IACZ,SAAS,GAAI,CAAA;AAAA,GACf;AACA,EAAI,IAAA,GAAA,CAAI,WAAW,MAAQ,EAAA;AACzB,IAAA,MAAM,CAAC,QAAQ,CAAI,GAAA,IAAI,GAAI,CAAA,GAAA,CAAI,GAAG,CAAA,CAAE,QAAS,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,OAAQ,EAAA;AAEhE,IAAA,GAAA,GAAM,GAAG,WAAY,CAAA,MAAM,EAAEA,IAAG,CAAC,IAAI,QAAQ,CAAA,CAAA;AAAA;AAG/C,EAAA,MAAM,cAAiB,GAAA,IAAI,GAAI,CAAA,GAAA,CAAI,GAAG,CAAA;AACtC,EAAA,MAAM,MAAS,GAAA,IAAI,eAAgB,CAAA,cAAA,CAAe,MAAM,CAAA;AAExD,EAAA,GAAA,GAAM,CAAG,EAAA,GAAG,CAAG,EAAA,MAAA,CAAO,QAAS,EAAA,KAAM,EAAK,GAAA,CAAA,CAAA,EAAI,MAAO,CAAA,QAAA,EAAU,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AACtE,EAAM,MAAA,GAAA,GAAM,MAAM,OAAA,CAAQ,GAAK,EAAA,EAAE,GAAG,IAAM,EAAA,OAAA,EAAS,GAAI,EAAA,EAAG,MAAM,CAAA;AAEhE,EAAO,OAAA,GAAA;AACT;AACO,SAASC,QAAAA,CAAQ,cAAsBJ,QAA2B,EAAA;AACvE,EAAA,OAAO,UAAWA,CAAAA,QAAAA,CAAQ,GAAK,EAAA,YAAA,CAAaG,IAAG,CAAC,CAAA;AAClD;AAGA,eAAsB,WAAA,CACpB,MACA,EAAA,QAAA,EACA,IACmB,EAAA;AACnB,EAAM,MAAA,SAAA,GAAY,GAAG,MAAO,CAAA,YAAY,GAAG,MAAO,CAAA,WAAW,CAAwB,EAAA,cAAA,cAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AACjG,EAAM,MAAA,GAAA,GAAM,IAAI,OAAA,CAAQ,SAAW,EAAA;AAAA,IACjC,MAAQ,EAAA,MAAA;AAAA,IACR,SAAS,MAAO,CAAA,OAAA;AAAA,IAChB;AAAA,GACD,CAAA;AAED,EAAA,OAAQ,MAAM,MAAA,CAAO,QAAS,CAAA,IAAA,CAAK,GAAG,CAAA;AACxC;;;ACxEA,eAAOJ,MAAAA,CAA6B,KAAc,MAAgB,EAAA;AAChE,EAAO,OAAA,OAAA;AAAA,IACL,WAAA,CAAY,MAAM,CAAE,CAAA,OAAA;AAAA,IACpB;AAAA,MACE,QAAQ,GAAI,CAAA,MAAA;AAAA,MACZ,OAAS,EAAA;AAAA,KACX;AAAA,IACA;AAAA,GACF;AACF;AACO,SAASK,QAAAA,CAAQ,cAAsBJ,QAA2B,EAAA;AACvE,EAAA,OAAO,UAAWA,CAAAA,QAAAA,CAAQ,GAAK,EAAA,YAAA,CAAa,OAAO,CAAA;AACrD;AAEA,eAAsB,aAAa,MAAmC,EAAA;AACpE,EAAA,MAAM,YAAY,CAAG,EAAA,MAAA,CAAO,YAAY,CAAG,EAAA,MAAA,CAAO,WAAW,CAAyB,EAAA,eAAA,eAAA,CAAA;AACtF,EAAM,MAAA,GAAA,GAAM,IAAI,OAAA,CAAQ,SAAW,EAAA;AAAA,IACjC,MAAQ,EAAA,KAAA;AAAA,IACR,SAAS,MAAO,CAAA;AAAA,GACjB,CAAA;AAED,EAAA,OAAQ,MAAM,MAAA,CAAO,QAAS,CAAA,GAAA,CAAI,GAAG,CAAA;AACvC;;;ACtBA,eAAOD,MAAAA,CAA6B,KAAc,MAAgB,EAAA;AAChE,EAAO,OAAA,OAAA;AAAA,IACL,WAAA,CAAY,MAAM,CAAE,CAAA,SAAA;AAAA,IACpB;AAAA,MACE,QAAQ,GAAI,CAAA,MAAA;AAAA,MACZ,OAAS,EAAA;AAAA,KACX;AAAA,IACA;AAAA,GACF;AACF;AACO,SAASK,QAAAA,CAAQ,cAAsBJ,QAA2B,EAAA;AACvE,EAAA,OAAO,UAAWA,CAAAA,QAAAA,CAAQ,GAAK,EAAA,YAAA,CAAa,SAAS,CAAA;AACvD;AAEA,eAAsB,eAAe,MAAmC,EAAA;AACtE,EAAA,MAAM,YAAY,CAAG,EAAA,MAAA,CAAO,YAAY,CAAG,EAAA,MAAA,CAAO,WAAW,CAA2B,EAAA,iBAAA,iBAAA,CAAA;AACxF,EAAM,MAAA,GAAA,GAAM,IAAI,OAAA,CAAQ,SAAW,EAAA;AAAA,IACjC,MAAQ,EAAA,KAAA;AAAA,IACR,SAAS,MAAO,CAAA;AAAA,GACjB,CAAA;AAED,EAAA,OAAQ,MAAM,MAAA,CAAO,QAAS,CAAA,GAAA,CAAI,GAAG,CAAA;AACvC;;;ACtBA,eAAOD,OAAAA,CAA6B,KAAc,MAAgB,EAAA;AAChE,EAAO,OAAA,OAAA;AAAA,IACL,WAAA,CAAY,MAAM,CAAE,CAAA,IAAA;AAAA,IACpB;AAAA,MACE,QAAQ,GAAI,CAAA,MAAA;AAAA,MACZ,OAAS,EAAA;AAAA,KACX;AAAA,IACA;AAAA,GACF;AACF;AACO,SAASK,SAAAA,CAAQ,cAAsBJ,QAA2B,EAAA;AACvE,EAAA,OAAO,UAAWA,CAAAA,QAAAA,CAAQ,GAAK,EAAA,YAAA,CAAa,IAAI,CAAA;AAClD;AAEA,eAAsB,UAAU,MAAmC,EAAA;AACjE,EAAA,MAAM,YAAY,CAAG,EAAA,MAAA,CAAO,YAAY,CAAG,EAAA,MAAA,CAAO,WAAW,CAAsB,EAAA,YAAA,YAAA,CAAA;AACnF,EAAM,MAAA,GAAA,GAAM,IAAI,OAAA,CAAQ,SAAW,EAAA;AAAA,IACjC,MAAQ,EAAA,KAAA;AAAA,IACR,SAAS,MAAO,CAAA;AAAA,GACjB,CAAA;AAED,EAAA,OAAQ,MAAM,MAAA,CAAO,QAAS,CAAA,GAAA,CAAI,GAAG,CAAA;AACvC;;;ACpBA,IAAMG,IAAM,GAAA,UAAA;AAEZ,eAAOJ,OAAAA,CAA6B,KAAc,MAAgB,EAAA;AAChE,EAAM,MAAA,EAAE,OAAU,GAAA,MAAA;AAAA,IAChB,EAAE,GAAG,MAAQ,EAAA,KAAA,EAAO,OAAO,KAAM,EAAA;AAAA,IACjC,YAAYI,IAAG,CAAA,CAAA;AAAA,GACjB;AACA,EAAA,MAAM,CAAC,QAAQ,CAAI,GAAA,IAAI,GAAI,CAAA,GAAA,CAAI,GAAG,CAAA,CAAE,QAAS,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,OAAQ,EAAA;AAChE,EAAI,IAAA;AACF,IAAA,MAAM,cAAiB,GAAA,IAAI,GAAI,CAAA,GAAA,CAAI,GAAG,CAAA;AACtC,IAAA,MAAM,MAAS,GAAA,IAAI,eAAgB,CAAA,cAAA,CAAe,MAAM,CAAA;AACxD,IAAA,MAAM,MAAM,CAAG,EAAA,WAAA,CAAY,MAAM,CAAEA,CAAAA,IAAG,CAAC,CAAI,CAAA,EAAA,QAAQ,GACjD,MAAO,CAAA,QAAA,OAAe,EAAK,GAAA,CAAA,CAAA,EAAI,OAAO,QAAS,EAAC,KAAK,EACvD,CAAA,CAAA;AAEA,IAAA,MAAM,MAAM,MAAM,OAAA;AAAA,MAChB,GAAA;AAAA,MACA;AAAA,QACE,OAAS,EAAA,GAAA;AAAA,QACT,QAAQ,GAAI,CAAA;AAAA,OACd;AAAA,MACA;AAAA,KACF,CAAE,KAAM,CAAA,CAAC,CAAM,KAAA;AACb,MAAA,KAAA,CAAM,wBAAwB,CAAC,CAAA;AAAA,KAChC,CAAA;AAED,IAAA,MAAM,QAAW,GAAA,GAAA,EAAK,OAAQ,CAAA,GAAA,CAAI,UAAU,CAAA;AAC5C,IAAA,IAAI,QAAU,EAAA;AACZ,MAAO,OAAA,IAAI,QAAS,CAAA,GAAA,EAAK,IAAM,EAAA;AAAA,QAC7B,MAAQ,EAAA,GAAA;AAAA,QACR,SAAS,GAAK,EAAA;AAAA,OACf,CAAA;AAAA;AAEH,IAAO,OAAA,IAAI,QAAS,CAAA,GAAA,EAAK,IAAM,EAAA;AAAA,MAC7B,QAAQ,GAAK,EAAA,MAAA;AAAA,MACb,SAAS,GAAK,EAAA;AAAA,KACf,CAAA;AAAA,WACM,CAAG,EAAA;AACV,IAAA,KAAA,CAAM,CAAC,CAAA;AAAA;AAET,EAAA,OAAO,IAAI,QAAS,CAAA,mCAAA,EAAqC,EAAE,MAAA,EAAQ,KAAK,CAAA;AAC1E;AACO,SAASC,SAAAA,CAAQ,cAAsBJ,QAA2B,EAAA;AACvE,EAAA,OAAO,UAAWA,CAAAA,QAAAA,CAAQ,GAAK,EAAA,YAAA,CAAa,QAAQ,CAAA;AACtD;AAGA,eAAsB,cACpB,MACA,EAAA,QAAA,EACA,IACAA,EAAAA,QAAAA,EACA,SAAyB,MACN,EAAA;AACnB,EAAM,MAAA,SAAA,GAAY,GAAG,MAAO,CAAA,YAAY,GAAG,MAAO,CAAA,WAAW,mCAEzD,CAAA,EAAA,QAAQ,GAAGA,QAAU,GAAA,CAAA,CAAA,EAAI,IAAI,GAAIA,CAAAA,QAAAA,CAAQ,GAAG,CAAE,CAAA,YAAY,KAAK,EAAE,CAAA,CAAA;AACrE,EAAM,MAAA,GAAA,GAAM,IAAI,OAAA,CAAQ,SAAW,EAAA;AAAA,IACjC,MAAA;AAAA,IACA,SAAS,MAAO,CAAA,OAAA;AAAA,IAChB;AAAA,GACD,CAAA;AAED,EAAA,OAAQ,MAAM,MAAA,CAAO,QAAS,CAAA,IAAA,CAAK,GAAG,CAAA;AACxC;;;AClEA,IAAMG,IAAM,GAAA,SAAA;AACZ,eAAOJ,OAAAA,CAA6BC,UAAkB,MAAgB,EAAA;AACpE,EAAA,IAAI,GAAM,GAAA,WAAA,CAAY,MAAM,CAAA,CAAEG,IAAG,CAAA;AAEjC,EAAA,MAAM,IAAoB,GAAA;AAAA,IACxB,QAAQH,QAAQ,CAAA;AAAA,GAClB;AACA,EAAIA,IAAAA,QAAAA,CAAQ,WAAW,MAAQ,EAAA;AAC7B,IAAA,IAAA,CAAK,OAAOA,QAAQ,CAAA,IAAA;AACpB,IAAA,MAAM,CAAC,QAAQ,CAAI,GAAA,IAAI,GAAIA,CAAAA,QAAAA,CAAQ,GAAG,CAAA,CAAE,QAAS,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,OAAQ,EAAA;AACpE,IAAA,GAAA,GAAM,CAAG,EAAA,WAAA,CAAY,MAAM,CAAA,CAAEG,IAAG,CAAC,CAC/B,EAAA,QAAA,KAAa,SAAY,GAAA,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,GAAK,EAC5C,CAAA,CAAA;AAAA;AAGF,EAAM,MAAA,GAAA,GAAM,MAAM,OAAA,CAAM,GAAK,EAAA,EAAE,GAAG,IAAM,EAAA,OAAA,EAAAH,QAAQ,EAAA,EAAG,MAAM,CAAA;AACzD,EAAO,OAAA,GAAA;AACT;AACO,SAASI,SAAAA,CAAQ,cAAsBJ,QAA2B,EAAA;AACvE,EAAA,OAAO,UAAWA,CAAAA,QAAAA,CAAQ,GAAK,EAAA,YAAA,CAAaG,IAAG,CAAC,CAAA;AAClD;AAEA,eAAsB,YAAA,CACpB,QACA,IACmB,EAAA;AACnB,EAAA,MAAM,YAAY,CAAG,EAAA,MAAA,CAAO,YAAY,CAAG,EAAA,MAAA,CAAO,WAAW,CAAyB,EAAA,eAAA,eAAA,CAAA;AACtF,EAAM,MAAA,GAAA,GAAM,IAAI,OAAA,CAAQ,SAAW,EAAA;AAAA,IACjC,MAAQ,EAAA,MAAA;AAAA,IACR,IAAA;AAAA,IACA,SAAS,MAAO,CAAA;AAAA,GACjB,CAAA;AAED,EAAA,OAAQ,MAAM,MAAA,CAAO,QAAS,CAAA,IAAA,CAAK,GAAG,CAAA;AACxC;;;AClCA,IAAMA,KAAM,GAAA,OAAA;AACZ,eAAOJ,OAAAA,CAA6B,KAAc,MAAgB,EAAA;AAChE,EAAO,OAAA,OAAA;AAAA,IACL,WAAA,CAAY,MAAM,CAAA,CAAEI,KAAG,CAAA;AAAA,IACvB;AAAA,MACE,QAAQ,GAAI,CAAA,MAAA;AAAA,MACZ,OAAS,EAAA;AAAA,KACX;AAAA,IACA;AAAA,GACF;AACF;AACO,SAASC,SAAAA,CAAQ,cAAsBJ,QAA2B,EAAA;AACvE,EAAA,OAAO,UAAWA,CAAAA,QAAAA,CAAQ,GAAK,EAAA,YAAA,CAAaG,KAAG,CAAC,CAAA;AAClD;;;ACbA,IAAMA,KAAM,GAAA,gBAAA;AAEZ,eAAOJ,OAAAA,CAA6B,KAAc,MAAgB,EAAA;AAChE,EAAO,OAAA,OAAA;AAAA,IACL,WAAA,CAAY,MAAM,CAAA,CAAEI,KAAG,CAAA;AAAA,IACvB;AAAA,MACE,QAAQ,GAAI,CAAA,MAAA;AAAA,MACZ,OAAS,EAAA;AAAA,KACX;AAAA,IACA;AAAA,GACF;AACF;AACO,SAASC,SAAAA,CAAQ,cAAsBJ,QAA2B,EAAA;AACvE,EAAA,OAAO,UAAWA,CAAAA,QAAAA,CAAQ,GAAK,EAAA,YAAA,CAAaG,KAAG,CAAC,CAAA;AAClD;;;ACdA,IAAMA,KAAM,GAAA,gBAAA;AACZ,eAAOJ,OAAAA,CAA6B,KAAc,MAAgB,EAAA;AAChE,EAAA,MAAM,GAAM,GAAA,WAAA,CAAY,MAAM,CAAA,CAAEI,KAAG,CAAA;AAEnC,EAAA,MAAM,MAAM,MAAM,OAAA;AAAA,IAChB,GAAA;AAAA,IACA;AAAA,MACE,QAAQ,GAAI,CAAA,MAAA;AAAA,MACZ,OAAS,EAAA;AAAA,KACX;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,QAAW,GAAA,GAAA,EAAK,OAAQ,CAAA,GAAA,CAAI,UAAU,CAAA;AAC5C,EAAA,IAAI,QAAU,EAAA;AACZ,IAAO,OAAA,IAAI,QAAS,CAAA,GAAA,EAAK,IAAM,EAAA;AAAA,MAC7B,MAAQ,EAAA,GAAA;AAAA,MACR,SAAS,GAAK,EAAA;AAAA,KACf,CAAA;AAAA;AAEH,EAAO,OAAA,IAAI,QAAS,CAAA,GAAA,EAAK,IAAM,EAAA;AAAA,IAC7B,QAAQ,GAAK,EAAA,MAAA;AAAA,IACb,SAAS,GAAK,EAAA;AAAA,GACf,CAAA;AACH;AACO,SAASC,SAAAA,CAAQ,cAAsBJ,QAA2B,EAAA;AACvE,EAAA,OAAO,UAAWA,CAAAA,QAAAA,CAAQ,GAAK,EAAA,YAAA,CAAa,cAAc,CAAA;AAC5D;AAEA,eAAsB,mBACpB,MACA,EAAA,MAAA,EACA,IACA,EAAA,MAAA,EACA,UAAU,IACV,EAAA;AACA,EAAA,MAAM,UAAa,GAAA,IAAI,eAAgB,CAAA,MAAA,IAAU,EAAE,CAAA;AACnD,EAAA,IAAI,OAAS,EAAA;AACX,IAAY,UAAA,EAAA,GAAA,CAAI,QAAQ,MAAM,CAAA;AAAA;AAEhC,EAAM,MAAA,SAAA,GAAY,CAAG,EAAA,MAAA,CAAO,YAAY,CAAA,EAAG,MAAO,CAAA,WAAW,CAE7D,EAAA,sBAAA,sBAAA,CAAA,EAAI,UAAY,EAAA,QAAA,EAAU,CAAA,CAAA;AAC1B,EAAA,MAAM,IAAoB,GAAA;AAAA,IACxB,MAAA;AAAA,IACA,SAAS,MAAO,CAAA;AAAA,GAClB;AACA,EAAI,IAAA,IAAA,IAAQ,WAAW,KAAO,EAAA;AAC5B,IAAA,IAAA,CAAK,IAAO,GAAA,IAAA;AAAA;AAEd,EAAA,MAAM,GAAM,GAAA,IAAI,OAAQ,CAAA,SAAA,EAAW,IAAI,CAAA;AACvC,EAAA,OAAQ,MAAM,MAAA,CAAO,QAAS,CAAA,MAAM,EAAE,GAAG,CAAA;AAC3C;;;ACpDA,IAAMG,KAAM,GAAA,cAAA;AACZ,eAAOJ,OAAAA,CAA6B,KAAc,MAAgB,EAAA;AAChE,EAAA,MAAM,GAAM,GAAA,WAAA,CAAY,MAAM,CAAA,CAAEI,KAAG,CAAA;AAEnC,EAAA,MAAM,MAAM,MAAM,OAAA;AAAA,IAChB,GAAA;AAAA,IACA;AAAA,MACE,QAAQ,GAAI,CAAA,MAAA;AAAA,MACZ,OAAS,EAAA;AAAA,KACX;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,QAAW,GAAA,GAAA,EAAK,OAAQ,CAAA,GAAA,CAAI,UAAU,CAAA;AAC5C,EAAA,IAAI,QAAU,EAAA;AACZ,IAAO,OAAA,IAAI,QAAS,CAAA,GAAA,EAAK,IAAM,EAAA;AAAA,MAC7B,MAAQ,EAAA,GAAA;AAAA,MACR,SAAS,GAAK,EAAA;AAAA,KACf,CAAA;AAAA;AAEH,EAAO,OAAA,IAAI,QAAS,CAAA,GAAA,EAAK,IAAM,EAAA;AAAA,IAC7B,QAAQ,GAAK,EAAA,MAAA;AAAA,IACb,SAAS,GAAK,EAAA;AAAA,GACf,CAAA;AACH;AACO,SAASC,SAAAA,CAAQ,cAAsBJ,QAA2B,EAAA;AACvE,EAAA,OAAO,UAAWA,CAAAA,QAAAA,CAAQ,GAAK,EAAA,YAAA,CAAaG,KAAG,CAAC,CAAA;AAClD;AAEA,eAAsB,gBAAA,CACpB,MACA,EAAA,MAAA,EACA,IACmB,EAAA;AACnB,EAAA,MAAM,YAAY,CAAG,EAAA,MAAA,CAAO,YAAY,CAAG,EAAA,MAAA,CAAO,WAAW,CAA8B,EAAA,oBAAA,oBAAA,CAAA;AAC3F,EAAA,MAAM,IAAoB,GAAA;AAAA,IACxB,MAAA;AAAA,IACA,SAAS,MAAO,CAAA;AAAA,GAClB;AACA,EAAA,IAAI,IAAM,EAAA;AACR,IAAA,IAAA,CAAK,IAAO,GAAA,IAAA;AAAA;AAEd,EAAA,MAAM,GAAM,GAAA,IAAI,OAAQ,CAAA,SAAA,EAAW,IAAI,CAAA;AAEvC,EAAA,OAAQ,MAAM,MAAA,CAAO,QAAS,CAAA,MAAM,EAAE,GAAG,CAAA;AAC3C;;;ACjCe,SAAR,MAAA,CAAwB,cAAsB,MAAgB,EAAA;AACnE,EAAA,MAAM,EAAE,IAAM,EAAA,IAAA,EAAS,GAAA,MAAA,CAAO,QAAQ,eAAe,CAAA;AACrD,EAAO,OAAA,eAAeF,KAAI,GAAc,EAAA;AACtC,IAAI,IAAA,OAAA,CAAU,YAAc,EAAA,GAAG,CAAG,EAAA;AAChC,MAAA,IAAA,CAAK,YAAY,CAAA;AACjB,MAAO,OAAA,KAAA,CAAG,KAAK,MAAM,CAAA;AAAA;AAGvB,IAAIG,IAAAA,QAAAA,CAAe,YAAc,EAAA,GAAG,CAAG,EAAA;AACrC,MAAA,IAAA,CAAK,wBAAwB,CAAA;AAC7B,MAAOL,OAAAA,MAAAA,CAAQ,KAAK,MAAM,CAAA;AAAA;AAG5B,IAAIK,IAAAA,QAAAA,CAAc,YAAc,EAAA,GAAG,CAAG,EAAA;AACpC,MAAA,IAAA,CAAK,gBAAgB,CAAA;AACrB,MAAOL,OAAAA,MAAAA,CAAO,KAAK,MAAM,CAAA;AAAA;AAG3B,IAAIK,IAAAA,QAAAA,CAAmB,YAAc,EAAA,GAAG,CAAG,EAAA;AACzC,MAAA,IAAA,CAAK,sBAAsB,CAAA;AAC3B,MAAOL,OAAAA,MAAAA,CAAY,KAAK,MAAM,CAAA;AAAA;AAEhC,IAAIK,IAAAA,QAAAA,CAAe,YAAc,EAAA,GAAG,CAAG,EAAA;AACrC,MAAA,IAAA,CAAK,iBAAiB,CAAA;AACtB,MAAOL,OAAAA,MAAAA,CAAQ,KAAK,MAAM,CAAA;AAAA;AAG5B,IAAIK,IAAAA,QAAAA,CAAa,YAAc,EAAA,GAAG,CAAG,EAAA;AACnC,MAAA,IAAA,CAAK,eAAe,CAAA;AACpB,MAAOL,OAAAA,MAAAA,CAAM,KAAK,MAAM,CAAA;AAAA;AAG1B,IAAeK,IAAAA,QAAAA,CAAa,YAAc,EAAA,GAAG,CAAG,EAAA;AAC9C,MAAA,IAAA,CAAK,iBAAiB,CAAA;AACtB,MAAkBL,OAAAA,MAAAA,CAAc,KAAK,MAAM,CAAA;AAAA;AAG7C,IAAeK,IAAAA,QAAAA,CAAY,YAAc,EAAA,GAAG,CAAG,EAAA;AAC7C,MAAA,IAAA,CAAK,gBAAgB,CAAA;AACrB,MAAkBL,OAAAA,MAAAA,CAAa,KAAK,MAAM,CAAA;AAAA;AAG5C,IAAeK,IAAAA,QAAAA,CAAe,YAAc,EAAA,GAAG,CAAG,EAAA;AAChD,MAAA,IAAA,CAAK,mBAAmB,CAAA;AACxB,MAAkBL,OAAAA,MAAAA,CAAgB,KAAK,MAAM,CAAA;AAAA;AAG/C,IAAeK,IAAAA,SAAAA,CAAU,YAAc,EAAA,GAAG,CAAG,EAAA;AAC3C,MAAA,IAAA,CAAK,cAAc,CAAA;AACnB,MAAkBL,OAAAA,OAAAA,CAAW,KAAK,MAAM,CAAA;AAAA;AAG1C,IAAeK,IAAAA,SAAAA,CAAqB,YAAc,EAAA,GAAG,CAAG,EAAA;AACtD,MAAA,IAAA,CAAK,wBAAwB,CAAA;AAC7B,MAAkBL,OAAAA,OAAAA,CAAoB,KAAK,MAAM,CAAA;AAAA;AAGnD,IAAeK,IAAAA,SAAAA,CAAc,YAAc,EAAA,GAAG,CAAG,EAAA;AAC/C,MAAA,IAAA,CAAK,kBAAkB,CAAA;AACvB,MAAkBL,OAAAA,OAAAA,CAAe,KAAK,MAAM,CAAA;AAAA;AAG9C,IAAeK,IAAAA,SAAAA,CAAa,YAAc,EAAA,GAAG,CAAG,EAAA;AAC9C,MAAA,IAAA,CAAK,iBAAiB,CAAA;AACtB,MAAkBL,OAAAA,OAAAA,CAAc,KAAK,MAAM,CAAA;AAAA;AAG7C,IAAeK,IAAAA,SAAAA,CAAqB,YAAc,EAAA,GAAG,CAAG,EAAA;AACtD,MAAA,IAAA,CAAK,wBAAwB,CAAA;AAC7B,MAAkBL,OAAAA,OAAAA,CAAoB,KAAK,MAAM,CAAA;AAAA;AAGnD,IAAeK,IAAAA,SAAAA,CAAmB,YAAc,EAAA,GAAG,CAAG,EAAA;AACpD,MAAA,IAAA,CAAK,sBAAsB,CAAA;AAC3B,MAAkBL,OAAAA,OAAAA,CAAkB,KAAK,MAAM,CAAA;AAAA;AAGjD,IAAeK,IAAAA,SAAAA,CAAW,YAAc,EAAA,GAAG,CAAG,EAAA;AAC5C,MAAA,IAAA,CAAK,eAAe,CAAA;AACpB,MAAkBL,OAAAA,OAAAA,CAAY,KAAK,MAAM,CAAA;AAAA;AAE3C,IAAK,IAAA,CAAA,CAAA,sBAAA,EAAyB,GAAI,CAAA,GAAG,CAAE,CAAA,CAAA;AACvC,IAAA,OAAO,IAAI,QAAS,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,GAC3C;AACF;;;ACnCA,eAAsBM,KAAAA,CACpB,QACA,IACA,EAAA;AACA,EAAK,IAAA,CAAA,IAAA,GAAO,KAAK,OAAQ,CAAA,IAAA;AACzB,EAAA,IAAA,CAAK,MAAS,GAAA,MAAA;AACd,EAAA,MAAM,GAAM,GAAA,CAAA,EAAG,SAAU,CAAA,MAAM,EAAE,MAAM,CAAA,CAAA;AAEvC,EAAA,OAAO,MAAM,OAAA,CAAQ,GAAK,EAAA,IAAA,EAAM,MAAM,CAAA;AACxC;;;ACrEA,IAAMF,KAAM,GAAA,QAAA;AAEZ,eAAOJ,OAAAA,CAA6BC,UAAkB,MAAgB,EAAA;AACpE,EAAA,QAAQA,SAAQ,MAAQ;AAAA,IACtB,KAAK,MAAA;AACH,MAAA,OAAO,MAAMK,KAAK,CAAA,MAAA,EAAQ,EAAE,OAAA,EAAAL,UAAS,CAAA;AAAA,IAEvC;AACE,MAAA,OAAO,IAAI,QAAS,CAAA,oBAAA,EAAsB,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAE/D;AAEO,SAASI,SAAAA,CAAQ,cAAsBJ,QAA2B,EAAA;AACvE,EAAA,OAAO,UAAWA,CAAAA,QAAAA,CAAQ,GAAK,EAAA,YAAA,CAAaG,KAAG,CAAC,CAAA;AAClD;AAEA,eAAsB,WAAA,CACpB,QACA,OAImB,EAAA;AACnB,EAAA,MAAM,EAAE,IAAA,EAAM,MAAO,EAAA,GAAI,WAAW,EAAC;AACrC,EAAM,MAAA,CAAA,GAAI,IAAI,eAAgB,EAAA;AAC9B,EAAA,IAAI,QAAQ,aAAe,EAAA;AACzB,IAAE,CAAA,CAAA,GAAA,CAAI,eAAiB,EAAA,MAAA,CAAO,aAAa,CAAA;AAAA;AAE7C,EAAA,IAAI,QAAQ,QAAU,EAAA;AACpB,IAAE,CAAA,CAAA,GAAA,CAAI,UAAY,EAAA,MAAA,CAAO,QAAQ,CAAA;AAAA;AAEnC,EAAA,MAAM,SAAY,GAAA,CAAA,EAAG,MAAO,CAAA,YAAY,GAAG,MAAO,CAAA,WAAW,CAE7D,EAAA,SAAA,cAAA,EAAG,EAAE,IAAO,GAAA,CAAA,GAAI,CAAI,CAAA,EAAA,CAAC,KAAK,EAAE,CAAA,CAAA;AAC5B,EAAM,MAAA,GAAA,GAAM,IAAI,OAAA,CAAQ,SAAW,EAAA;AAAA,IACjC,MAAQ,EAAA,MAAA;AAAA,IACR,SAAS,MAAO,CAAA,OAAA;AAAA,IAChB;AAAA,GACD,CAAA;AAED,EAAA,OAAQ,MAAM,MAAA,CAAO,QAAS,CAAA,IAAA,CAAK,GAAG,CAAA;AACxC;;;ACjCe,SAAR,MAAA,CAAwB,cAAsB,MAAgB,EAAA;AACnE,EAAA,MAAM,EAAE,IAAM,EAAA,IAAA,EAAM,OAAU,GAAA,MAAA,CAAO,QAAQ,gBAAgB,CAAA;AAC7D,EAAO,OAAA,eAAeE,MAAK,GAAc,EAAA;AAEvC,IAAI,IAAA,UAAA,CAAW,YAAc,EAAA,GAAG,CAAG,EAAA;AACjC,MAAI,IAAA;AACF,QAAA,MAAM,IAAO,GAAA,MAAM,GAAI,CAAA,KAAA,GAAQ,IAAK,EAAA;AACpC,QAAM,KAAA,CAAA,GAAA,CAAI,QAAQ,IAAI,CAAA;AAAA,OAChB,CAAA,MAAA;AACN,QAAM,KAAA,CAAA,MAAM,GAAI,CAAA,IAAA,EAAM,CAAA;AAAA;AAExB,MAAA,OAAO,IAAI,QAAS,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAG3C,IAAID,IAAAA,QAAAA,CAAmB,YAAc,EAAA,GAAG,CAAG,EAAA;AACzC,MAAA,IAAA,CAAK,sBAAsB,CAAA;AAC3B,MAAOL,OAAAA,MAAAA,CAAY,KAAK,MAAM,CAAA;AAAA;AAGhC,IAAIK,IAAAA,QAAAA,CAAmB,YAAc,EAAA,GAAG,CAAG,EAAA;AACzC,MAAA,IAAA,CAAK,uBAAuB,CAAA;AAC5B,MAAOL,OAAAA,MAAAA,CAAY,KAAK,MAAM,CAAA;AAAA;AAGhC,IAAIK,IAAAA,SAAAA,CAAc,YAAc,EAAA,GAAG,CAAG,EAAA;AACpC,MAAA,IAAA,CAAK,gBAAgB,CAAA;AACrB,MAAOL,OAAAA,OAAAA,CAAO,KAAK,MAAM,CAAA;AAAA;AAG3B,IAAIK,IAAAA,QAAAA,CAAa,YAAc,EAAA,GAAG,CAAG,EAAA;AACnC,MAAA,IAAA,CAAK,eAAe,CAAA;AACpB,MAAOL,OAAAA,MAAAA,CAAM,KAAK,MAAM,CAAA;AAAA;AAE1B,IAAIK,IAAAA,QAAAA,CAAe,YAAc,EAAA,GAAG,CAAG,EAAA;AACrC,MAAA,IAAA,CAAK,iBAAiB,CAAA;AACtB,MAAOL,OAAAA,MAAAA,CAAQ,KAAK,MAAM,CAAA;AAAA;AAG5B,IAAeK,IAAAA,QAAAA,CAAa,YAAc,EAAA,GAAG,CAAG,EAAA;AAC9C,MAAA,IAAA,CAAK,iBAAiB,CAAA;AACtB,MAAkBL,OAAAA,MAAAA,CAAc,KAAK,MAAM,CAAA;AAAA;AAG7C,IAAeK,IAAAA,QAAAA,CAAY,YAAc,EAAA,GAAG,CAAG,EAAA;AAC7C,MAAA,IAAA,CAAK,gBAAgB,CAAA;AACrB,MAAkBL,OAAAA,MAAAA,CAAa,KAAK,MAAM,CAAA;AAAA;AAE5C,IAAeK,IAAAA,SAAAA,CAAqB,YAAc,EAAA,GAAG,CAAG,EAAA;AACtD,MAAA,IAAA,CAAK,wBAAwB,CAAA;AAC7B,MAAkBL,OAAAA,OAAAA,CAAoB,KAAK,MAAM,CAAA;AAAA;AAGnD,IAAeK,IAAAA,QAAAA,CAAe,YAAc,EAAA,GAAG,CAAG,EAAA;AAChD,MAAA,IAAA,CAAK,mBAAmB,CAAA;AACxB,MAAkBL,OAAAA,MAAAA,CAAgB,KAAK,MAAM,CAAA;AAAA;AAG/C,IAAeK,IAAAA,SAAAA,CAAU,YAAc,EAAA,GAAG,CAAG,EAAA;AAC3C,MAAA,IAAA,CAAK,cAAc,CAAA;AACnB,MAAkBL,OAAAA,OAAAA,CAAW,KAAK,MAAM,CAAA;AAAA;AAG1C,IAAeK,IAAAA,SAAAA,CAAc,YAAc,EAAA,GAAG,CAAG,EAAA;AAC/C,MAAA,IAAA,CAAK,kBAAkB,CAAA;AACvB,MAAkBL,OAAAA,OAAAA,CAAe,KAAK,MAAM,CAAA;AAAA;AAE9C,IAAeK,IAAAA,SAAAA,CAAa,YAAc,EAAA,GAAG,CAAG,EAAA;AAC9C,MAAA,IAAA,CAAK,iBAAiB,CAAA;AACtB,MAAkBL,OAAAA,OAAAA,CAAc,KAAK,MAAM,CAAA;AAAA;AAE7C,IAAeK,IAAAA,SAAAA,CAAmB,YAAc,EAAA,GAAG,CAAG,EAAA;AACpD,MAAA,IAAA,CAAK,sBAAsB,CAAA;AAC3B,MAAkBL,OAAAA,OAAAA,CAAkB,KAAK,MAAM,CAAA;AAAA;AAGjD,IAAK,IAAA,CAAA,CAAA,uBAAA,EAA0B,GAAI,CAAA,GAAG,CAAE,CAAA,CAAA;AACxC,IAAA,OAAO,IAAI,QAAS,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,GAC3C;AACF;;;ACxDA,eAAsBO,OAAAA,CACpB,QACA,IACA,EAAA;AACA,EAAA,MAAM,IAAO,GAAA,IAAI,GAAI,CAAA,IAAA,CAAK,QAAQ,GAAG,CAAA;AAErC,EAAM,MAAA,GAAG,MAAA,IAAU,QAAQ,CAAI,GAAA,IAAA,CAAK,QAAS,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,OAAQ,EAAA;AAChE,EAAA,MAAA,CAAO,QAAW,GAAA,QAAA;AAClB,EAAA,MAAA,CAAO,MAAS,GAAA,MAAA;AAEhB,EAAA,IAAA,CAAK,MAAS,GAAA,QAAA;AACd,EAAA,MAAM,GAAM,GAAA,CAAA,EAAG,SAAU,CAAA,MAAM,EAAE,WAAW,CAAA,KAAA,CAAA;AAE5C,EAAA,OAAO,MAAM,OAAA,CAAM,GAAK,EAAA,IAAA,EAAM,MAAM,CAAA;AACtC;;;ACfA,eAAsBJ,IAAAA,CACpB,QACA,IACA,EAAA;AACA,EAAA,MAAM,IAAO,GAAA,IAAI,GAAI,CAAA,IAAA,CAAK,QAAQ,GAAG,CAAA;AAErC,EAAM,MAAA,GAAG,MAAA,IAAU,QAAQ,CAAI,GAAA,IAAA,CAAK,QAAS,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,OAAQ,EAAA;AAChE,EAAA,MAAA,CAAO,QAAW,GAAA,QAAA;AAClB,EAAA,MAAA,CAAO,MAAS,GAAA,MAAA;AAEhB,EAAA,IAAA,CAAK,MAAS,GAAA,KAAA;AACd,EAAA,MAAM,GAAM,GAAA,CAAA,EAAG,SAAU,CAAA,MAAM,EAAE,WAAW,CAAA,KAAA,CAAA;AAE5C,EAAA,OAAO,MAAM,OAAA,CAAM,GAAK,EAAA,IAAA,EAAM,MAAM,CAAA;AACtC;;;ACxCA,IAAMC,KAAM,GAAA,aAAA;AAEZ,eAAOJ,OAAAA,CAA6BC,UAAkB,MAAgB,EAAA;AACpE,EAAM,MAAA,EAAE,MAAS,GAAA,MAAA;AAAA,IACf,EAAE,GAAG,MAAQ,EAAA,KAAA,EAAO,OAAO,KAAM,EAAA;AAAA,IACjC,YAAYG,KAAG,CAAA,CAAA;AAAA,GACjB;AACA,EAAA,MAAM,OAAU,GAAA,MAAM,IAAKH,CAAAA,QAAAA,EAAS,MAAM,CAAA;AAE1C,EAAA,IAAI,CAAC,OAAS,EAAA;AACZ,IAAA,IAAA,CAAK,KAAK,CAAA;AACV,IAAA,OAAO,IAAI,QAAS,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAE3C,EAAA,MAAM,IAAO,GAAA,IAAI,GAAIA,CAAAA,QAAAA,CAAQ,GAAG,CAAA;AAChC,EAAM,MAAA,GAAG,MAAM,CAAA,GAAI,KAAK,QAAS,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,OAAQ,EAAA;AAEpD,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAA,IAAA,CAAK,4BAA4B,CAAA;AACjC,IAAA,OAAO,IAAI,QAAS,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAG3C,EAAA,QAAQA,SAAQ,MAAQ;AAAA,IACtB,KAAK,KAAA;AACH,MAAA,OAAO,MAAME,IAAI,CAAA,MAAA,EAAQ,EAAE,OAAA,EAAAF,UAAS,CAAA;AAAA,IACtC,KAAK,QAAA;AACH,MAAA,OAAO,MAAMM,OAAO,CAAA,MAAA,EAAQ,EAAE,OAAA,EAAAN,UAAS,CAAA;AAAA,IAEzC;AACE,MAAA,OAAO,IAAI,QAAS,CAAA,oBAAA,EAAsB,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAE/D;AAEO,SAASI,SAAAA,CAAQ,cAAsBJ,QAA2B,EAAA;AACvE,EAAA,MAAM,GAAM,GAAA,IAAI,GAAIA,CAAAA,QAAAA,CAAQ,GAAG,CAAA;AAC/B,EAAM,MAAA,GAAG,MAAA,EAAQ,gBAAkB,EAAA,QAAQ,CAAI,GAAA,GAAA,CAAI,QAChD,CAAA,KAAA,CAAM,GAAG,CAAA,CACT,OAAQ,EAAA;AACX,EAAID,IAAAA,OAAAA,GAAQ,YAAaI,CAAAA,KAAG,CACzB,CAAA,OAAA,CAAQ,cAAc,QAAQ,CAAA,CAC9B,OAAQ,CAAA,UAAA,EAAY,MAAM,CAAA;AAC7B,EAAA,IAAI,WAAW,OAAS,EAAA;AACtB,IAAAJ,UAAQ,YAAaI,CAAAA,KAAG,CAAE,CAAA,OAAA,CAAQ,cAAc,gBAAgB,CAAA;AAAA;AAElE,EAAO,OAAA,UAAA,CAAWH,QAAQ,CAAA,GAAA,EAAKD,OAAK,CAAA;AACtC;AAEA,eAAsB,eAAA,CACpB,QACA,MACA,EAAA;AACA,EAAI,IAAA,CAAC,OAAO,QAAU,EAAA;AACpB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA;AAGF,EAAI,IAAA,CAAC,OAAO,MAAQ,EAAA;AAClB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA;AAGF,EAAA,MAAM,YAAY,CAAG,EAAA,MAAA,CAAO,YAAY,CACtC,EAAA,MAAA,CAAO,WACT,CAAqC,EAAA,oCAAA,mBAAA,OAAA;AAAA,IACnC,YAAA;AAAA,IACA,MAAO,CAAA;AAAA,GACP,CAAA,OAAA,CAAQ,UAAY,EAAA,MAAA,CAAO,MAAM,CAAC,CAAA,KAAA,CAAA;AACpC,EAAM,MAAA,GAAA,GAAM,IAAI,OAAA,CAAQ,SAAW,EAAA;AAAA,IACjC,SAAS,MAAO,CAAA,OAAA;AAAA,IAChB;AAAA,GACD,CAAA;AAED,EAAA,OAAQ,MAAM,MAAA,CAAO,QAAS,CAAA,MAAM,EAAE,GAAG,CAAA;AAC3C;;;ACjDA,eAAsBO,OAAAA,CACpB,QACA,IACA,EAAA;AACA,EAAA,MAAM,IAAO,GAAA,IAAI,GAAI,CAAA,IAAA,CAAK,QAAQ,GAAG,CAAA;AACrC,EAAM,MAAA,CAAC,QAAU,IAAE,QAAQ,CAAA,GAAI,KAAK,QAAS,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,OAAQ,EAAA;AAChE,EAAA,IAAI,CAAC,QAAU,EAAA;AACb,IAAA,OAAO,IAAI,QAAS,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAG3C,EAAA,IAAA,CAAK,MAAS,GAAA,QAAA;AACd,EAAM,MAAA,GAAA,GAAM,GAAG,SAAU,CAAA,MAAM,EAAE,MAAO,CAAA,QAAQ,CAAC,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAE7D,EAAA,OAAO,MAAM,OAAA,CAAM,GAAK,EAAA,IAAA,EAAM,MAAM,CAAA;AACtC;;;AC1CA,IAAMH,KAAM,GAAA,QAAA;AACZ,eAAOJ,OAAAA,CAA6BC,UAAkB,MAAgB,EAAA;AACpE,EAAA,QAAQA,SAAQ,MAAQ;AAAA,IACtB,KAAK,QAAA;AACH,MAAA,OAAO,MAAMM,OAAO,CAAA,MAAA,EAAQ,EAAE,OAAA,EAAAN,UAAS,CAAA;AAAA,IACzC;AACE,MAAA,OAAO,IAAI,QAAS,CAAA,oBAAA,EAAsB,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AAE/D;AACO,SAASI,SAAAA,CAAQ,cAAsBJ,QAA2B,EAAA;AACvE,EAAA,MAAM,GAAM,GAAA,IAAI,GAAIA,CAAAA,QAAAA,CAAQ,GAAG,CAAA;AAC/B,EAAM,MAAA,CAAC,QAAU,IAAE,QAAQ,CAAA,GAAI,IAAI,QAAS,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,OAAQ,EAAA;AAC/D,EAAMD,MAAAA,OAAAA,GAAQ,YAAaI,CAAAA,KAAG,CAC3B,CAAA,OAAA,CAAQ,cAAc,QAAQ,CAAA,CAC9B,OAAQ,CAAA,YAAA,EAAc,QAAQ,CAAA;AACjC,EAAO,OAAA,UAAA,CAAWH,QAAQ,CAAA,GAAA,EAAKD,OAAK,CAAA;AACtC;;;ACPe,SAAR,OAAA,CAAyB,cAAsB,MAAgB,EAAA;AACpE,EAAA,MAAM,EAAE,IAAM,EAAA,IAAA,EAAS,GAAA,MAAA,CAAO,QAAQ,kBAAkB,CAAA;AACxD,EAAO,OAAA,eAAeO,QAAO,GAAc,EAAA;AAEzC,IAAIF,IAAAA,SAAAA,CAAc,YAAc,EAAA,GAAG,CAAG,EAAA;AACpC,MAAA,IAAA,CAAK,0BAA0B,CAAA;AAC/B,MAAOL,OAAAA,OAAAA,CAAO,KAAK,MAAM,CAAA;AAAA;AAG3B,IAAIK,IAAAA,SAAAA,CAAkB,YAAc,EAAA,GAAG,CAAG,EAAA;AACxC,MAAA,IAAA,CAAK,qBAAqB,CAAA;AAC1B,MAAOL,OAAAA,OAAAA,CAAW,KAAK,MAAM,CAAA;AAAA;AAE/B,IAAIK,IAAAA,QAAAA,CAAoB,YAAc,EAAA,GAAG,CAAG,EAAA;AAC1C,MAAA,IAAA,CAAK,sBAAsB,CAAA;AAC3B,MAAOL,OAAAA,MAAAA,CAAY,KAAK,MAAM,CAAA;AAAA;AAGhC,IAAIK,IAAAA,QAAAA,CAAe,YAAc,EAAA,GAAG,CAAG,EAAA;AACrC,MAAA,IAAA,CAAK,iBAAiB,CAAA;AACtB,MAAOL,OAAAA,MAAAA,CAAQ,KAAK,MAAM,CAAA;AAAA;AAE5B,IAAI,IAAA,OAAA,CAAU,YAAc,EAAA,GAAG,CAAG,EAAA;AAChC,MAAA,IAAA,CAAK,YAAY,CAAA;AACjB,MAAO,OAAA,KAAA,CAAG,KAAK,MAAM,CAAA;AAAA;AAGvB,IAAA,IAAA,CAAK,0BAA0B,CAAA;AAC/B,IAAA,OAAO,IAAI,QAAS,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,GAC3C;AACF;;;AC5Be,SAAR,KAAA,CAAuB,cAAsB,MAAgB,EAAA;AAClE,EAAA,MAAM,EAAE,IAAM,EAAA,IAAA,EAAS,GAAA,MAAA,CAAO,QAAQ,eAAe,CAAA;AACrD,EAAO,OAAA,eAAeG,KAAI,GAAc,EAAA;AAEtC,IAAIE,IAAAA,QAAAA,CAAc,YAAc,EAAA,GAAG,CAAG,EAAA;AACpC,MAAA,IAAA,CAAK,uBAAuB,CAAA;AAC5B,MAAOL,OAAAA,MAAAA,CAAO,KAAK,MAAM,CAAA;AAAA;AAG3B,IAAIK,IAAAA,SAAAA,CAAkB,YAAc,EAAA,GAAG,CAAG,EAAA;AACxC,MAAA,IAAA,CAAK,qBAAqB,CAAA;AAC1B,MAAOL,OAAAA,OAAAA,CAAW,KAAK,MAAM,CAAA;AAAA;AAE/B,IAAIK,IAAAA,QAAAA,CAAmB,YAAc,EAAA,GAAG,CAAG,EAAA;AACzC,MAAA,IAAA,CAAK,sBAAsB,CAAA;AAC3B,MAAOL,OAAAA,MAAAA,CAAY,KAAK,MAAM,CAAA;AAAA;AAEhC,IAAIK,IAAAA,QAAAA,CAAa,YAAc,EAAA,GAAG,CAAG,EAAA;AACnC,MAAA,IAAA,CAAK,eAAe,CAAA;AACpB,MAAOL,OAAAA,MAAAA,CAAM,KAAK,MAAM,CAAA;AAAA;AAE1B,IAAI,IAAA,OAAA,CAAU,YAAc,EAAA,GAAG,CAAG,EAAA;AAChC,MAAA,IAAA,CAAK,YAAY,CAAA;AACjB,MAAO,OAAA,KAAA,CAAG,KAAK,MAAM,CAAA;AAAA;AAEvB,IAAIK,IAAAA,QAAAA,CAAe,YAAc,EAAA,GAAG,CAAG,EAAA;AACrC,MAAA,IAAA,CAAK,iBAAiB,CAAA;AACtB,MAAOL,OAAAA,MAAAA,CAAQ,KAAK,MAAM,CAAA;AAAA;AAE5B,IAAIK,IAAAA,SAAAA,CAAqB,YAAc,EAAA,GAAG,CAAG,EAAA;AAC3C,MAAA,IAAA,CAAK,wBAAwB,CAAA;AAC7B,MAAOL,OAAAA,OAAAA,CAAoB,KAAK,MAAM,CAAA;AAAA;AAExC,IAAA,IAAA,CAAK,uBAAuB,CAAA;AAC5B,IAAA,OAAO,IAAI,QAAS,CAAA,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,GAC3C;AACF;;;AC7Ce,SAAR,QAAA,CAA0B,cAAsB,MAAgB,EAAA;AACrE,EAAME,MAAAA,IAAAA,GAAM,MAAO,CAAA,YAAA,EAAc,MAAM,CAAA;AACvC,EAAMI,MAAAA,KAAAA,GAAO,MAAO,CAAA,YAAA,EAAc,MAAM,CAAA;AACxC,EAAMC,MAAAA,OAAAA,GAAS,OAAQ,CAAA,YAAA,EAAc,MAAM,CAAA;AAC3C,EAAMJ,MAAAA,IAAAA,GAAM,KAAM,CAAA,YAAA,EAAc,MAAM,CAAA;AACtC,EAAO,OAAA;AAAA,IACL,GAAAD,EAAAA,IAAAA;AAAA,IACA,IAAAI,EAAAA,KAAAA;AAAA,IACA,MAAAC,EAAAA,OAAAA;AAAA,IACA,GAAAJ,EAAAA;AAAA,GACF;AACF;ACXO,IAAM,SAAA,GAAY,CAAC,GAAmB,KAAA;AAC3C,EAAM,MAAA,EAAE,QAAW,GAAA,GAAA;AACnB,EAAI,IAAA,MAAA,EAAQ,UAAU,IAAM,EAAA;AAC1B,IAAA,OAAO,MAAQ,EAAA,MAAA;AAAA;AAEjB,EAAA,IAAI,WAAY,CAAA,OAAA,CAAQ,GAAI,CAAA,cAAc,CAAG,EAAA;AAC3C,IAAA,OAAO,QAAQ,GAAI,CAAA,cAAA;AAAA;AAGrB,EAAA,MAAM,IAAI,KAAA;AAAA,IACR;AAAA,GACF;AACF,CAAA;AAEO,IAAM,cAAA,GAAiB,CAAC,GAAmB,KAAA;AAChD,EAAM,MAAA,EAAE,QAAW,GAAA,GAAA;AACnB,EAAI,IAAA,WAAA,CAAY,MAAQ,EAAA,WAAW,CAAG,EAAA;AACpC,IAAA,OAAO,MAAQ,EAAA,WAAA;AAAA;AAEjB,EAAA,OAAO,QAAQ,GAAI,CAAA,mBAAA;AACrB,CAAA;AAEO,IAAM,gBAAA,GAAmB,CAAC,GAAmB,KAAA;AAClD,EAAM,MAAA,EAAE,QAAW,GAAA,GAAA;AACnB,EAAI,IAAA,MAAA,EAAQ,iBAAiB,IAAM,EAAA;AACjC,IAAA,OAAO,MAAQ,EAAA,aAAA;AAAA;AAEjB,EAAA,IAAI,WAAY,CAAA,OAAA,CAAQ,GAAI,CAAA,oBAAoB,CAAG,EAAA;AACjD,IAAO,OAAA,OAAA,CAAQ,OAAQ,CAAA,GAAA,CAAI,oBAAoB,CAAA;AAAA;AAEjD,EAAO,OAAA,MAAA;AACT,CAAA;AAEO,IAAM,WAAA,GAAc,CAAC,GAAmB,KAAA;AAC7C,EAAM,MAAA,EAAE,QAAW,GAAA,GAAA;AACnB,EAAA,MAAM,SAAS,MAAO,CAAA,MAAA;AAEtB,EAAA,MAAM,EAAE,IAAA,EAAS,GAAA,MAAA,CAAO,QAAQ,YAAY,CAAA;AAC5C,EAAA,IAAI,QAAQ,IAAM,EAAA;AAChB,IAAA,MAAA,IAAU,KAAK,CAAG,EAAA,MAAM,CAAY,SAAA,EAAA,MAAA,CAAO,IAAI,CAAE,CAAA,CAAA;AACjD,IAAO,OAAA,MAAA,CAAO,QAAQ,IAAI,CAAA;AAAA;AAE5B,EAAA,MAAM,IAAO,GAAA,WAAA,CAAY,OAAQ,CAAA,GAAA,CAAI,WAAW,CAAA;AAChD,EAAA,IAAI,IAAM,EAAA;AACR,IAAA,MAAA,IAAU,IAAK,CAAA,CAAA,EAAG,MAAM,CAAA,cAAA,EAAiB,IAAI,CAAE,CAAA,CAAA;AAC/C,IAAO,OAAA,IAAA;AAAA;AAGT,EAAA,MAAMK,GAAK,GAAA,WAAA,CAAY,OAAQ,CAAA,GAAA,CAAI,mBAAmB,CAAA;AACtD,EAAA,IAAIA,GAAI,EAAA;AACN,IAAI,IAAA;AACF,MAAM,MAAA,GAAA,GAAM,IAAI,GAAA,CAAIA,GAAE,CAAA;AACtB,MAAA,IAAI,IAAI,QAAU,EAAA;AAChB,QAAA,OAAO,GAAI,CAAA,QAAA;AAAA;AACb,aACO,CAAG,EAAA;AAAA;AAEZ;AAEF,EAAA,MAAM,IAAI,KAAA;AAAA,IACR;AAAA,GACF;AACF,CAAA;AAEO,IAAM,WAAA,GAAc,CAAC,GAAmB,KAAA;AAC7C,EAAM,MAAA,EAAE,QAAW,GAAA,GAAA;AACnB,EAAA,MAAM,SAAS,MAAO,CAAA,MAAA;AACtB,EAAM,MAAA,GAAA,GAAM,aAAa,MAAM,CAAA;AAC/B,EAAA,MAAM,EAAE,IAAA,EAAS,GAAA,MAAA,CAAO,QAAQ,YAAY,CAAA;AAC5C,EAAI,IAAA,WAAA,CAAY,MAAQ,EAAA,QAAQ,CAAG,EAAA;AACjC,IAAO,GAAA,IAAA,IAAA,CAAK,CAAG,EAAA,MAAM,CAAc,YAAA,CAAA,CAAA;AACnC,IAAO,OAAA,MAAA,CAAO,QAAQ,QAAQ,CAAA;AAAA;AAGhC,EAAA,MAAM,IAAO,GAAA,WAAA,CAAY,OAAQ,CAAA,GAAA,CAAI,eAAe,CAAA;AACpD,EAAA,IAAI,IAAM,EAAA;AACR,IAAU,MAAA,IAAA,IAAA,CAAK,CAAG,EAAA,MAAM,CAAuB,qBAAA,CAAA,CAAA;AAE/C,IAAO,OAAA,IAAA;AAAA;AAET,EAAA,MAAMA,GAAK,GAAA,WAAA,CAAY,OAAQ,CAAA,GAAA,CAAI,mBAAmB,CAAA;AACtD,EAAA,IAAIA,GAAI,EAAA;AACN,IAAI,IAAA;AACF,MAAM,MAAA,GAAA,GAAM,IAAI,GAAA,CAAIA,GAAE,CAAA;AACtB,MAAA,IAAI,IAAI,QAAU,EAAA;AAChB,QAAA,OAAO,GAAI,CAAA,QAAA;AAAA;AACb,aACO,CAAG,EAAA;AAAA;AAEZ;AAEF,EAAA,MAAM,IAAI,KAAA;AAAA,IACR;AAAA,GACF;AACF,CAAA;AAEO,IAAM,eAAA,GAAkB,CAAC,GAAmB,KAAA;AACjD,EAAM,MAAA,EAAE,QAAW,GAAA,GAAA;AACnB,EAAA,MAAM,SAAS,MAAO,CAAA,MAAA;AACtB,EAAA,MAAM,EAAE,IAAA,EAAS,GAAA,MAAA,CAAO,QAAQ,gBAAgB,CAAA;AAChD,EAAI,IAAA,WAAA,CAAY,MAAQ,EAAA,YAAY,CAAG,EAAA;AACrC,IAAA,MAAA,IAAU,KAAK,CAAG,EAAA,MAAM,CAAY,SAAA,EAAA,MAAA,EAAQ,YAAY,CAAE,CAAA,CAAA;AAC1D,IAAO,OAAA,MAAA,CAAO,QAAQ,YAAY,CAAA;AAAA;AAEpC,EAAA,MAAM,IAAO,GAAA,WAAA,CAAY,OAAQ,CAAA,GAAA,CAAI,WAAW,CAAA;AAChD,EAAA,IAAI,IAAM,EAAA;AACR,IAAA,MAAA,IAAU,IAAK,CAAA,CAAA,EAAG,MAAM,CAAA,cAAA,EAAiB,IAAI,CAAE,CAAA,CAAA;AAC/C,IAAO,OAAA,IAAA;AAAA;AAGT,EAAI,IAAA,OAAA,CAAQ,IAAI,mBAAqB,EAAA;AACnC,IAAI,IAAA;AACF,MAAA,MAAM,KAAQ,GAAA,IAAI,GAAI,CAAA,OAAA,CAAQ,IAAI,mBAAmB,CAAA;AACrD,MAAO,OAAA,KAAA,CAAM,QAAS,CAAA,SAAA,CAAU,CAAC,CAAA;AAAA,aAC1B,CAAG,EAAA;AAAA;AAEZ;AAEF,EAAA,MAAM,IAAI,KAAA;AAAA,IACR;AAAA,GACF;AACF,CAAA;AAEO,IAAM,WAAA,GAAc,CAAC,GAAkC,KAAA;AAC5D,EAAM,MAAA,EAAE,QAAW,GAAA,GAAA;AACnB,EAAA,MAAM,SAAS,MAAO,CAAA,MAAA;AACtB,EAAA,MAAM,EAAE,IAAA,EAAS,GAAA,MAAA,CAAO,QAAQ,YAAY,CAAA;AAC5C,EAAI,IAAA,WAAA,CAAY,MAAQ,EAAA,QAAQ,CAAG,EAAA;AACjC,IAAA,MAAA,IAAU,KAAK,CAAG,EAAA,MAAM,CAAY,SAAA,EAAA,MAAA,EAAQ,QAAQ,CAAE,CAAA,CAAA;AACtD,IAAO,OAAA,MAAA,CAAO,QAAQ,QAAQ,CAAA;AAAA;AAGhC,EAAA,IAAI,WAAY,CAAA,OAAA,CAAQ,GAAI,CAAA,aAAa,CAAG,EAAA;AAC1C,IAAA,MAAA,IAAU,KAAK,CAAG,EAAA,MAAM,mBAAmB,OAAQ,CAAA,GAAA,CAAI,aAAa,CAAE,CAAA,CAAA;AACtE,IAAO,OAAA,MAAA,CAAO,OAAQ,CAAA,GAAA,CAAI,aAAa,CAAA;AAAA;AAGzC,EAAO,OAAA,IAAA;AACT,CAAA;AAEO,SAAS,UAAU,GAAgB,EAAA;AACxC,EAAM,MAAA,EAAE,QAAW,GAAA,GAAA;AACnB,EAAA,MAAM,SAAS,MAAO,CAAA,MAAA;AACtB,EAAA,MAAM,EAAE,IAAA,EAAS,GAAA,MAAA,CAAO,QAAQ,WAAW,CAAA;AAE3C,EAAA,IAAI,YAAY,MAAQ,EAAA,EAAA,IAAM,MAAO,CAAA,EAAA,CAAG,IAAI,CAAG,EAAA;AAC7C,IAAA,MAAA,IAAU,KAAK,CAAG,EAAA,MAAM,YAAY,MAAQ,EAAA,EAAA,EAAI,IAAI,CAAE,CAAA,CAAA;AACtD,IAAO,OAAA,MAAA,CAAO,MAAQ,EAAA,EAAA,EAAI,IAAI,CAAA;AAAA;AAGhC,EAAA,IAAI,WAAY,CAAA,OAAA,CAAQ,GAAI,CAAA,WAAW,CAAG,EAAA;AACxC,IAAA,MAAA,IAAU,KAAK,CAAG,EAAA,MAAM,iBAAiB,OAAQ,CAAA,GAAA,CAAI,WAAW,CAAE,CAAA,CAAA;AAClE,IAAA,OAAO,QAAQ,GAAI,CAAA,WAAA;AAAA;AAGrB,EAAA,MAAMA,GAAK,GAAA,WAAA,CAAY,OAAQ,CAAA,GAAA,CAAI,mBAAmB,CAAA;AACtD,EAAA,IAAIA,GAAI,EAAA;AACN,IAAI,IAAA;AACF,MAAM,MAAA,KAAA,GAAQ,IAAI,GAAA,CAAIA,GAAE,CAAA;AACxB,MAAA,MAAA,IAAU,KAAK,CAAG,EAAA,MAAM,CAAyB,sBAAA,EAAA,KAAA,CAAM,QAAQ,CAAE,CAAA,CAAA;AACjE,MAAA,OAAO,KAAM,CAAA,QAAA;AAAA,aACN,CAAG,EAAA;AAAA;AAEZ;AAGF,EAAU,MAAA,IAAA,IAAA,CAAK,CAAG,EAAA,MAAM,CAA0B,wBAAA,CAAA,CAAA;AAClD,EAAO,OAAA,gBAAA;AACT;AAEO,SAAS,UAAU,GAAwB,EAAA;AAChD,EAAM,MAAA,EAAE,QAAW,GAAA,GAAA;AACnB,EAAA,MAAM,SAAS,MAAO,CAAA,MAAA;AACtB,EAAA,MAAM,EAAE,IAAA,EAAS,GAAA,MAAA,CAAO,QAAQ,WAAW,CAAA;AAC3C,EAAA,IAAI,QAAQ,EAAI,EAAA,IAAA,IAAQ,MAAO,CAAA,EAAA,CAAG,QAAQ,IAAM,EAAA;AAC9C,IAAA,MAAA,IAAU,KAAK,CAAG,EAAA,MAAM,YAAY,MAAQ,EAAA,EAAA,CAAG,IAAI,CAAE,CAAA,CAAA;AACrD,IAAO,OAAA,MAAA,CAAO,MAAO,CAAA,EAAA,EAAI,IAAI,CAAA;AAAA;AAG/B,EAAA,IAAI,WAAY,CAAA,OAAA,CAAQ,GAAI,CAAA,WAAW,CAAG,EAAA;AACxC,IAAA,MAAA,IAAU,KAAK,CAAG,EAAA,MAAM,iBAAiB,OAAQ,CAAA,GAAA,CAAI,WAAW,CAAE,CAAA,CAAA;AAClE,IAAO,OAAA,MAAA,CAAO,OAAQ,CAAA,GAAA,CAAI,WAAW,CAAA;AAAA;AAGvC,EAAA,MAAMA,GAAK,GAAA,WAAA,CAAY,OAAQ,CAAA,GAAA,CAAI,mBAAmB,CAAA;AACtD,EAAA,IAAIA,GAAI,EAAA;AACN,IAAI,IAAA;AACF,MAAM,MAAA,KAAA,GAAQ,IAAI,GAAA,CAAIA,GAAE,CAAA;AACxB,MAAA,IAAI,MAAM,IAAM,EAAA;AACd,QAAO,OAAA,MAAA,CAAO,MAAM,IAAI,CAAA;AAAA;AAC1B,aACO,CAAG,EAAA;AAAA;AAEZ;AAEF,EAAU,MAAA,IAAA,IAAA,CAAK,CAAG,EAAA,MAAM,CAAgB,cAAA,CAAA,CAAA;AACxC,EAAO,OAAA,IAAA;AACT;AAGA,IAAM,YAAA,GAAe,CAAC,MAAuB,KAAA;AAC3C,EAAO,OAAA,OAAA,CAAQ,IAAI,QAAa,KAAA,aAAA,IAC9B,QAAQ,GAAI,CAAA,QAAA,KAAa,SACvB,MACA,GAAA,IAAA;AACN,CAAA;AAEA,IAAM,WAAA,GAAc,CAAC,GAAmC,KAAA;AACtD,EAAI,IAAA,GAAA,IAAO,QAAQ,EAAI,EAAA;AACrB,IAAO,OAAA,GAAA;AAAA;AAET,EAAA;AACF,CAAA;;;AClMO,IAAM,SAAN,MAAa;AAAA,EAClB,MAAA;AAAA,EACA,QAAA;AAAA,EAMA,KAAA;AAAA,EAMA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA;AAAA;AAAA;AAAA,EAIA,QAAA;AAAA;AAAA;AAAA;AAAA,EAIA,MAAA;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA;AAAA,EAEA,MAAA;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA;AAAA,EAEA,KAAA;AAAA;AAAA;AAAA;AAAA,EAIA,aAAA;AAAA,EAEA,WAAA;AAAA;AAAA;AAAA;AAAA,EAIA,WAAA;AAAA,EAEA,EAAA;AAAA;AAAA,EAIA,YAAY,MAA4B,EAAA;AACtC,IAAK,IAAA,CAAA,WAAA,GAAc,QAAQ,WAAe,IAAA,MAAA;AAC1C,IAAA,IAAA,CAAK,QAAQ,MAAQ,EAAA,KAAA;AACrB,IAAA,IAAA,CAAK,SAAS,MAAQ,EAAA,MAAA;AACtB,IAAA,IAAA,CAAK,aAAa,MAAQ,EAAA,UAAA;AAC1B,IAAA,IAAA,CAAK,eAAe,MAAQ,EAAA,YAAA;AAC5B,IAAK,IAAA,CAAA,YAAA,GAAe,QAAQ,MAAU,IAAA,uBAAA;AAEtC,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA,EAAQ,MAAU,IAAA,MAAA,CAAO,IAAI,CAAA;AAC3C,IAAA,MAAM,YAA0B,GAAA;AAAA,MAC9B,QAAQ,EAAE,GAAG,MAAQ,EAAA,MAAA,EAAQ,KAAK,MAAO;AAAA,KAC3C;AACA,IAAK,IAAA,CAAA,aAAA,GAAgB,iBAAiB,YAAY,CAAA;AAClD,IAAK,IAAA,CAAA,WAAA,GAAc,eAAe,YAAY,CAAA;AAG9C,IAAK,IAAA,CAAA,MAAA,GAAS,UAAU,YAAY,CAAA;AACpC,IAAM,MAAA,IAAA,GAAO,YAAY,YAAY,CAAA;AACrC,IAAM,MAAA,QAAA,GAAW,YAAY,YAAY,CAAA;AACzC,IAAM,MAAA,YAAA,GAAe,gBAAgB,YAAY,CAAA;AAEjD,IAAM,MAAA,EAAE,MAAM,IAAM,EAAA,GAAG,UAAa,GAAA,MAAA,EAAQ,MAAM,EAAC;AACnD,IAAM,MAAA,cAAA,GAAiB,IAAQ,IAAA,SAAA,CAAU,YAAY,CAAA;AACrD,IAAM,MAAA,cAAA,GAAiB,IAAQ,IAAA,SAAA,CAAU,YAAY,CAAA;AAErD,IAAA,IAAA,CAAK,EAAK,GAAA;AAAA,MACR,IAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAM,EAAA,cAAA;AAAA,MACN,IAAM,EAAA,cAAA;AAAA,MACN,GAAG;AAAA,KACL;AACA,IAAA,IAAI,YAAc,EAAA;AAChB,MAAA,IAAA,CAAK,GAAG,QAAW,GAAA,YAAA;AAAA;AAKrB,IAAA,IAAI,QAAQ,OAAS,EAAA;AACnB,MAAA,IAAA,CAAK,UAAU,MAAQ,EAAA,OAAA;AAAA,KAClB,MAAA;AACL,MAAK,IAAA,CAAA,OAAA,GAAU,IAAI,OAAQ,EAAA;AAAA;AAG7B,IAAA,IAAA,CAAK,MAAS,GAAA;AAAA,MACZ,GAAG,SAAU,CAAA,MAAA,EAAQ,WAAW,CAAA;AAAA,MAChC,GAAG,MAAQ,EAAA;AAAA,KACb;AAEA,IAAA,IAAA,CAAK,QAAW,GAAA,QAAA,CAAS,IAAK,CAAA,MAAA,EAAkB,IAAI,CAAA;AAGpD,IAAA,IAAA,CAAK,KAAQ,GAAA;AAAA,MACX,GAAK,EAAA;AAAA,QACH,KAAK,MAAO,CAAA,EAAA;AAAA,QACZ,KAAK,MAAO,CAAA,YAAA;AAAA,QACZ,KAAK,MAAO,CAAA,OAAA;AAAA,QACZ,KAAK,MAAO,CAAA,MAAA;AAAA,QACZ,KAAK,MAAO,CAAA,OAAA;AAAA,QACZ,KAAK,MAAO,CAAA,MAAA;AAAA,QACZ,KAAK,MAAO,CAAA,SAAA;AAAA,QACZ,KAAK,MAAO,CAAA,IAAA;AAAA,QACZ,KAAK,MAAO,CAAA,cAAA;AAAA,QACZ,KAAK,MAAO,CAAA,QAAA;AAAA,QACZ,KAAK,MAAO,CAAA,OAAA;AAAA,QACZ,KAAK,MAAO,CAAA,cAAA;AAAA,QACZ,KAAK,MAAO,CAAA;AAAA,OACd;AAAA,MACA,IAAM,EAAA;AAAA,QACJ,KAAK,MAAO,CAAA,YAAA;AAAA,QACZ,KAAK,MAAO,CAAA,MAAA;AAAA,QACZ,KAAK,MAAO,CAAA,KAAA;AAAA,QACZ,KAAK,MAAO,CAAA,OAAA;AAAA,QACZ,KAAK,MAAO,CAAA,OAAA;AAAA,QACZ,CAAA,EAAG,IAAK,CAAA,MAAA,CAAO,MAAM,CAAA,WAAA,CAAA;AAAA,QACrB,KAAK,MAAO,CAAA,cAAA;AAAA,QACZ,KAAK,MAAO,CAAA,SAAA;AAAA,QACZ,KAAK,MAAO,CAAA,IAAA;AAAA,QACZ,CAAA,EAAG,IAAK,CAAA,MAAA,CAAO,QAAQ,CAAA,WAAA,CAAA;AAAA,QACvB,KAAK,MAAO,CAAA;AAAA,OACd;AAAA,MACA,GAAK,EAAA;AAAA,QACH,KAAK,MAAO,CAAA,YAAA;AAAA,QACZ,KAAK,MAAO,CAAA,KAAA;AAAA,QACZ,KAAK,MAAO,CAAA,MAAA;AAAA,QACZ,KAAK,MAAO,CAAA;AAAA,OACd;AAAA,MACA,QAAQ,CAAC,IAAA,CAAK,OAAO,WAAa,EAAA,IAAA,CAAK,OAAO,MAAM;AAAA,KACtD;AACA,IAAA,IAAA,CAAK,WAAW,MAAQ,EAAA,QAAA;AACxB,IAAA,IAAA,CAAK,SAAS,MAAQ,EAAA,MAAA;AAAA;AAE1B,CAAA;;;AC3JA,IAAM,UAAN,MAAiD;AAAA,EACvC,SAA4D,EAAC;AAAA,EAErE,OAAA,CAA2B,WAAc,KAAa,EAAA;AACpD,IAAM,MAAA,SAAA,GAAY,IAAK,CAAA,MAAA,CAAO,SAAS,CAAA;AACvC,IAAA,IAAI,SAAW,EAAA;AACb,MAAA,KAAA,MAAW,YAAY,SAAW,EAAA;AAChC,QAAA,QAAA,CAAS,KAAK,CAAA;AAAA;AAChB;AACF;AACF,EAEA,SAAA,CAA6B,WAAc,QAAiC,EAAA;AAC1E,IAAA,IAAI,CAAC,IAAA,CAAK,MAAO,CAAA,SAAS,CAAG,EAAA;AAC3B,MAAK,IAAA,CAAA,MAAA,CAAO,SAAS,CAAA,GAAI,EAAC;AAAA;AAE5B,IAAA,IAAA,CAAK,MAAO,CAAA,SAAS,CAAE,CAAA,IAAA,CAAK,QAAQ,CAAA;AAAA;AACtC,EAEA,WAAA,CACE,WACA,QACA,EAAA;AACA,IAAM,MAAA,SAAA,GAAY,IAAK,CAAA,MAAA,CAAO,SAAS,CAAA;AACvC,IAAA,IAAI,CAAC,SAAW,EAAA;AAEhB,IAAM,MAAA,KAAA,GAAQ,SAAU,CAAA,OAAA,CAAQ,QAAQ,CAAA;AACxC,IAAA,IAAI,UAAU,EAAI,EAAA;AAChB,MAAU,SAAA,CAAA,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA;AAG3B,IAAI,IAAA,SAAA,CAAU,WAAW,CAAG,EAAA;AAC1B,MAAO,OAAA,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA;AAC9B;AAEJ,CAAA;AAEA,IAAM,OAAA,GAAU,IAAI,OAAkB,EAAA;AAE/B,IAAM,cAAA,GAAiB,CAAC,QAAsC,KAAA;AACnE,EAAQ,OAAA,CAAA,OAAA,CAAQ,yBAAe,QAAQ,CAAA;AACzC,CAAA;AACO,IAAM,gBAAgB,CAAC,EAAA,KAC5B,OAAQ,CAAA,SAAA,CAAU,yBAAe,EAAE,CAAA;AAK9B,IAAM,cAAc,CAAC,EAAA,KAC1B,OAAQ,CAAA,SAAA,CAAU,qBAAa,EAAE,CAAA;AAM5B,IAAM,SAAA,GAAY,CAAC,GAAoC,KAAA;AAC5D,EAAQ,OAAA,CAAA,OAAA,CAAQ,6BAAkB,GAAG,CAAA;AACvC,CAAA;AACO,IAAM,iBAAiB,CAAC,EAAA,KAC7B,OAAQ,CAAA,SAAA,CAAU,6BAAkB,EAAE,CAAA;AAEjC,IAAM,aAAA,GAAgB,CAAC,GAAkC,KAAA;AAC9D,EAAQ,OAAA,CAAA,OAAA,CAAQ,yBAAgB,GAAG,CAAA;AACrC,CAAA;AACO,IAAM,eAAe,CAAC,EAAA,KAC3B,OAAQ,CAAA,SAAA,CAAU,yBAAgB,EAAE,CAAA;;;AC/E/B,SAAS,kBAAA,CAAmB,MAAe,MAAyB,EAAA;AACzE,EAAA,MAAM,EAAE,IAAM,EAAA,KAAA,EAAU,GAAA,MAAA,CAAO,QAAQ,QAAQ,CAAA;AAC/C,EAAO,OAAA,IAAI,MAAe,IAAM,EAAA;AAAA,IAC9B,GAAA,CAAI,QAAkB,QAAU,EAAA;AAC9B,MAAA,IAAI,aAAa,OAAS,EAAA;AAExB,QAAI,IAAA,CAAC,MAAO,CAAA,EAAA,CAAG,gBAAkB,EAAA;AAC/B,UAAA,IAAI,CAAC,MAAO,CAAA,EAAA,CAAG,QAAQ,CAAC,MAAA,CAAO,GAAG,QAAU,EAAA;AAC1C,YAAA,KAAA;AAAA,cACE;AAAA,aACF;AAAA,WACS,MAAA,IAAA,CAAC,MAAO,CAAA,EAAA,CAAG,QAAU,EAAA;AAC9B,YAAA,KAAA;AAAA,cACE;AAAA,aACF;AAAA;AACF;AAEF,QAAM,MAAA,MAAA,GAAS,OAAO,QAAQ,CAAA;AAC9B,QAAO,OAAA,SAAS,SAAS,IAAgB,EAAA;AACvC,UAAK,IAAA,CAAA,OAAA,EAAS,GAAG,IAAI,CAAA;AAErB,UAAA,MAAM,MAAS,GAAA,MAAA,CAAO,KAAM,CAAA,IAAA,EAAM,IAAI,CAAA;AACtC,UAAO,OAAA,MAAA;AAAA,SACT;AAAA;AAEF,MAAA,OAAO,OAAO,QAAQ,CAAA;AAAA;AACxB,GACD,CAAA;AACH;;;AC1BA,IAAM,eAAN,MAAmB;AAAA,EACjB,IAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,EAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EAEA,WAAA,CAAY,QAAgB,EAAY,EAAA;AACtC,IAAA,MAAM,EAAE,IAAM,EAAA,IAAA,EAAM,OAAU,GAAA,MAAA,CAAO,QAAQ,gBAAgB,CAAA;AAC7D,IAAA,IAAA,CAAK,EAAK,GAAA,EAAA;AACV,IAAA,MAAM,UAAa,GAAA;AAAA,MACjB,GAAK,EAAA,CAAA;AAAA,MACL,GAAK,EAAA,EAAA;AAAA,MACL,iBAAmB,EAAA,GAAA;AAAA,MACnB,GAAG,MAAO,CAAA;AAAA,KACZ;AACA,IAAA,MAAM,EAAE,WAAA,EAAa,GAAG,SAAA,EAAc,GAAA,UAAA;AAEtC,IAAA,MAAA,CAAO,EAAK,GAAA,UAAA;AACZ,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA;AACd,IAAA,MAAM,MAAS,GAAA,EAAE,GAAG,IAAA,CAAK,OAAO,EAAG,EAAA;AACnC,IAAA,MAAA,CAAO,QAAW,GAAA,KAAA;AAClB,IAAA,KAAA,CAAM,CAA0B,uBAAA,EAAA,IAAA,CAAK,SAAU,CAAA,MAAM,CAAC,CAAE,CAAA,CAAA;AAExD,IAAK,IAAA,CAAA,IAAA,GAAO,mBAAmB,IAAIA,mBAAA,CAAG,KAAK,SAAS,CAAA,EAAG,KAAK,MAAM,CAAA;AAElE,IAAI,IAAA,OAAO,gBAAgB,UAAY,EAAA;AACrC,MAAA,IAAA;AAAA,QACE;AAAA,OACF;AAAA;AAIF,IAAA,IAAA,CAAK,YAAa,EAAA;AAClB,IAAA,IAAA,CAAK,IAAK,CAAA,EAAA,CAAG,SAAW,EAAA,OAAO,MAAW,KAAA;AACxC,MAAM,KAAA,CAAA,CAAA,eAAA,EAAkB,IAAK,CAAA,EAAE,CAAE,CAAA,CAAA;AACjC,MAAA,IAAA,CAAK,YAAa,EAAA;AAClB,MAAA,MAAMC,YAA2B,GAAA,eAAA;AAAA,QAC/B,MAAA;AAAA,QACA,CAAG,EAAA,IAAA,CAAK,EAAE,CAAA,CAAA,EAAI,KAAK,KAAK,CAAA;AAAA,OAC1B;AACA,MAAAA,YAAAA,CAAY,MAAQ,EAAA,CAAC,GAAQ,KAAA;AAC3B,QAAA,MAAM,EAAE,KAAA,EAAU,GAAA,MAAA,CAAO,QAAQ,yBAAyB,CAAA;AAC1D,QAAA,IAAI,GAAK,EAAA;AACP,UAAA,YAAA,CAAa,KAAK,KAAK,CAAA;AACvB,UAAA,KAAA,CAAM,qBAAuB,EAAA;AAAA,YAC3B,SAAS,GAAI,CAAA,OAAA;AAAA,YACb,OAAO,GAAI,CAAA;AAAA,WACZ,CAAA;AACD,UAAA,SAAA,CAAU,KAAK,EAAE,CAAA;AAAA;AACnB,OACD,CAAA;AAAA,KACF,CAAA;AACD,IAAA,IAAA,CAAK,IAAK,CAAA,EAAA,CAAG,OAAS,EAAA,CAAC,GAAQ,KAAA;AAC7B,MAAA,YAAA,CAAa,KAAK,KAAK,CAAA;AACvB,MAAK,IAAA,CAAA,CAAA,KAAA,EAAQ,IAAK,CAAA,EAAE,CAAW,OAAA,CAAA,EAAA;AAAA,QAC7B,SAAS,GAAI,CAAA,OAAA;AAAA,QACb,OAAO,GAAI,CAAA;AAAA,OACZ,CAAA;AACD,MAAA,SAAA,CAAU,KAAK,EAAE,CAAA;AAAA,KAClB,CAAA;AACD,IAAA,IAAA,CAAK,IAAK,CAAA,EAAA,CAAG,SAAW,EAAA,CAAC,OAAY,KAAA;AACnC,MAAA,IAAI,OAAS,EAAA;AACX,QAAA,YAAA,CAAa,KAAK,KAAK,CAAA;AACvB,QAAA,SAAA,CAAU,KAAK,EAAE,CAAA;AACjB,QAAM,KAAA,CAAA,CAAA,gBAAA,EAAmB,IAAK,CAAA,EAAE,CAAE,CAAA,CAAA;AAAA;AACpC,KACD,CAAA;AAAA;AACH,EAEA,YAAe,GAAA;AACb,IAAA,MAAM,EAAE,KAAM,EAAA,GAAI,MAAO,CAAA,IAAA,CAAK,QAAQ,gBAAgB,CAAA;AACtD,IAAA,IAAI,KAAK,KAAO,EAAA;AACd,MAAA,YAAA,CAAa,KAAK,KAAK,CAAA;AAAA;AAEzB,IAAK,IAAA,CAAA,KAAA,GAAQ,WAAW,MAAM;AAC5B,MAAA,KAAA;AAAA,QACE,CAAA,gCAAA,EAAmC,IAAK,CAAA,EAAE,CACxC,eAAA,EAAA,MAAA,CAAO,KAAK,MAAO,CAAA,EAAA,CAAG,iBAAiB,CAAA,IAAK,GAC9C,CAAA,EAAA;AAAA,OACF;AACA,MAAK,IAAA,CAAA,IAAA,CAAK,IAAI,MAAM;AAClB,QAAA,YAAA,CAAa,KAAK,KAAK,CAAA;AACvB,QAAA,SAAA,CAAU,KAAK,EAAE,CAAA;AAAA,OAClB,CAAA;AAAA,OACA,MAAO,CAAA,IAAA,CAAK,OAAO,EAAG,CAAA,iBAAiB,KAAK,GAAK,CAAA;AAAA;AACtD,EACA,QAAW,GAAA;AACT,IAAA,MAAM,EAAE,KAAM,EAAA,GAAI,MAAO,CAAA,IAAA,CAAK,QAAQ,gBAAgB,CAAA;AACtD,IAAM,KAAA,CAAA,CAAA,wBAAA,EAA2B,IAAK,CAAA,EAAE,CAAE,CAAA,CAAA;AAC1C,IAAA,YAAA,CAAa,KAAK,KAAK,CAAA;AACvB,IAAK,IAAA,CAAA,IAAA,CAAK,IAAI,MAAM;AAClB,MAAM,KAAA,CAAA,CAAA,EAAG,IAAK,CAAA,EAAE,CAAqB,mBAAA,CAAA,CAAA;AAAA,KACtC,CAAA;AAAA;AAEL,CAAA;AAEA,IAAO,oBAAQ,GAAA,YAAA;AAEf,SAAS,eAAA,CAAgB,QAAgB,EAAyB,EAAA;AAChE,EAAA,MAAM,EAAE,KAAO,EAAA,IAAA,EAAM,OAAU,GAAA,MAAA,CAAO,QAAQ,eAAe,CAAA;AAC7D,EAAO,OAAA,CAAC,MAAM,IAAS,KAAA;AACrB,IAAA,IAAA,CAAK,EAAG,CAAA,OAAA,EAAS,SAAS,YAAA,CAAa,CAAU,EAAA;AAC/C,MAAM,KAAA,CAAA,CAAA,WAAA,EAAc,EAAE,CAA6B,yBAAA,CAAA,EAAA;AAAA,QACjD,SAAS,CAAE,CAAA,OAAA;AAAA,QACX,OAAO,CAAE,CAAA;AAAA,OACV,CAAA;AACD,MAAA,IAAA,CAAK,GAAG,IAAI,CAAA;AAAA,KACb,CAAA;AAED,IAAA,IAAI,OAAO,QAAU,EAAA;AACnB,MAAA,MAAM,KAAQ,GAAA,CAAC,CAAyB,sBAAA,EAAA,MAAA,CAAO,QAAQ,CAAG,CAAA,CAAA,CAAA;AAC1D,MAAA,IAAI,OAAO,MAAQ,EAAA;AACjB,QAAI,IAAA,CAAC,OAAO,QAAU,EAAA;AACpB,UAAA,IAAA,CAAK,wDAAwD,CAAA;AAAA;AAE/D,QAAA,KAAA,CAAM,IAAK,CAAA,CAAA,oBAAA,EAAuB,MAAO,CAAA,MAAM,CAAG,CAAA,CAAA,CAAA;AAAA;AAIpD,MAAA,IAAA,CAAK,MAAM,KAAM,CAAA,IAAA,CAAK,GAAG,CAAA,EAAG,SAAU,GAAY,EAAA;AAChD,QAAA,IAAI,GAAK,EAAA;AACP,UAAA,KAAA,CAAM,yBAA2B,EAAA;AAAA,YAC/B,OAAO,GAAI,CAAA,KAAA;AAAA,YACX,OAAO,GAAI,CAAA,KAAA;AAAA,YACX,SAAS,GAAI,CAAA,OAAA;AAAA,YACb,MAAM,GAAI,CAAA,IAAA;AAAA,YACV;AAAA,WACD,CAAA;AAAA,SACI,MAAA;AACL,UAAI,IAAA,KAAA,CAAM,WAAW,CAAG,EAAA;AACtB,YAAM,KAAA,CAAA,CAAA,iCAAA,EAAoC,MAAO,CAAA,QAAQ,CAAE,CAAA,CAAA;AAAA;AAE7D,UAAI,IAAA,KAAA,CAAM,WAAW,CAAG,EAAA;AACtB,YAAA,KAAA;AAAA,cACE,CAAoC,iCAAA,EAAA,MAAA,CAAO,QAAQ,CAAA,QAAA,EAAW,OAAO,MAAM,CAAA;AAAA,aAC7E;AAAA;AACF;AAGF,QAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,OACf,CAAA;AAAA;AAEH,IAAA,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,GACjB;AACF;;;ACnJA,IAAqB,YAArB,MAA+B;AAAA,EAC7B,WAAA;AAAA,EACA,OAAA;AAAA,EACQ,aAAA;AAAA,EAEA,MAAA,CACN,UACA,MACA,EAAA;AACA,IAAA,IAAI,YAAY,MAAQ,EAAA;AACtB,MAAO,OAAA,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAAA;AAE9B,IAAA,IAAI,QAAU,EAAA;AACZ,MAAA,OAAO,GAAG,QAAQ,CAAA,CAAA;AAAA;AAEpB,IAAO,OAAA,MAAA;AAAA;AACT,EACA,YAAY,MAAoB,EAAA;AAC9B,IAAA,IAAA,CAAK,OAAU,GAAA,KAAA;AACf,IAAK,IAAA,CAAA,WAAA,uBAAkB,GAAI,EAAA;AAC3B,IAAK,IAAA,CAAA,aAAA,GAAgB,IAAK,CAAA,WAAA,CAAY,MAAM,CAAA;AAC5C,IAAA,cAAA,CAAe,KAAK,aAAa,CAAA;AAAA;AACnC,EACA,WAAc,GAAA,CAAC,MAAuB,KAAA,CAAC,EAAkC,KAAA;AACvE,IAAA,MAAM,EAAE,IAAM,EAAA,IAAA,EAAS,GAAA,MAAA,CAAO,QAAQ,aAAa,CAAA;AACnD,IAAA,IAAI,EAAM,IAAA,IAAA,CAAK,WAAY,CAAA,GAAA,CAAI,EAAE,CAAG,EAAA;AAClC,MAAK,IAAA,CAAA,CAAA,SAAA,EAAY,EAAE,CAA2B,yBAAA,CAAA,CAAA;AAC9C,MAAA,MAAM,UAAa,GAAA,IAAA,CAAK,WAAY,CAAA,GAAA,CAAI,EAAE,CAAA;AAC1C,MAAA,UAAA,EAAY,QAAS,EAAA;AACrB,MAAK,IAAA,CAAA,WAAA,CAAY,OAAO,EAAE,CAAA;AAAA,KACrB,MAAA;AACL,MAAK,IAAA,CAAA,CAAA,mBAAA,EAAsB,EAAE,CAAE,CAAA,CAAA;AAAA;AACjC,GACF;AAAA,EAEA,aAAA,GAAgB,CAAC,MAAgC,KAAA;AAC/C,IAAA,MAAM,EAAE,IAAA,EAAS,GAAA,MAAA,CAAO,QAAQ,aAAa,CAAA;AAC7C,IAAA,MAAM,KAAK,IAAK,CAAA,MAAA,CAAO,MAAO,CAAA,QAAA,EAAU,OAAO,MAAM,CAAA;AAErD,IAAA,MAAM,QAAW,GAAA,IAAA,CAAK,WAAY,CAAA,GAAA,CAAI,EAAE,CAAA;AACxC,IAAA,IAAA,CAAK,CAAmB,gBAAA,EAAA,IAAA,CAAK,WAAY,CAAA,IAAI,CAAE,CAAA,CAAA;AAC/C,IAAA,IAAI,QAAU,EAAA;AACZ,MAAK,IAAA,CAAA,CAAA,mBAAA,EAAsB,EAAE,CAAE,CAAA,CAAA;AAC/B,MAAA,QAAA,CAAS,YAAa,EAAA;AACtB,MAAA,OAAO,QAAS,CAAA,IAAA;AAAA;AAElB,IAAA,MAAM,SAAS,IAAI,oBAAA,CAAa,IAAI,MAAO,CAAA,MAAM,GAAG,EAAE,CAAA;AACtD,IAAK,IAAA,CAAA,WAAA,CAAY,GAAI,CAAA,EAAA,EAAI,MAAM,CAAA;AAC/B,IAAK,IAAA,CAAA,CAAA,YAAA,EAAe,EAAE,CAAE,CAAA,CAAA;AACxB,IAAA,IAAA,CAAK,CAAmB,gBAAA,EAAA,IAAA,CAAK,WAAY,CAAA,IAAI,CAAE,CAAA,CAAA;AAC/C,IAAA,IAAI,KAAK,OAAS,EAAA;AAChB,MAAA,IAAA,CAAK,OAAU,GAAA,KAAA;AAAA;AAEjB,IAAA,OAAO,MAAO,CAAA,IAAA;AAAA,GAChB;AAAA,EAEA,KAAA,GAAQ,CAAC,MAAuB,KAAA;AAC9B,IAAA,MAAM,EAAE,IAAA,EAAS,GAAA,MAAA,CAAO,QAAQ,aAAa,CAAA;AAC7C,IAAA,IAAA,CAAK,CAA4B,yBAAA,EAAA,IAAA,CAAK,WAAY,CAAA,IAAI,CAAE,CAAA,CAAA;AACxD,IAAA,IAAA,CAAK,OAAU,GAAA,IAAA;AACf,IAAK,IAAA,CAAA,WAAA,CAAY,OAAQ,CAAA,CAAC,UAAe,KAAA;AACvC,MAAA,UAAA,CAAW,QAAS,EAAA;AAAA,KACrB,CAAA;AACD,IAAA,IAAA,CAAK,YAAY,KAAM,EAAA;AAAA,GACzB;AACF,CAAA;;;ACpDA,IAAqB,OAArB,MAA0B;AAAA,EACxB,OAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAY,MAAgB,EAAA;AAC1B,IAAA,IAAA,CAAK,OAAU,GAAA,MAAA;AACf,IAAK,IAAA,CAAA,OAAA,GAAU,MAAO,CAAA,MAAA,EAAQ,QAAQ,CAAA;AAAA;AACxC,EAMA,MAAM,UACJ,CAAA,WAAA,GAAc,KACS,EAAA;AACvB,IAAA,MAAM,GAAM,GAAA,MAAM,YAAa,CAAA,IAAA,CAAK,OAAO,CAAA;AAC3C,IAAA,IAAI,WAAa,EAAA;AACf,MAAO,OAAA,GAAA;AAAA;AAET,IAAI,IAAA;AACF,MAAA,MAAM,OAAU,GAAA,MAAM,GAAI,CAAA,KAAA,GAAQ,IAAK,EAAA;AACvC,MAAA,IAAI,MAAO,CAAA,IAAA,CAAK,OAAO,CAAA,CAAE,WAAW,CAAG,EAAA;AACrC,QAAO,OAAA,KAAA,CAAA;AAAA;AAET,MAAO,OAAA,OAAA;AAAA,KACD,CAAA,MAAA;AACN,MAAO,OAAA,GAAA;AAAA;AACT;AACF,EAIA,MAAM,OAA6B,CAAA,WAAA,GAAc,KAAO,EAAA;AACtD,IAAA,OAAO,MAAM,UAAA,CAAc,IAAK,CAAA,OAAA,EAAS,WAAW,CAAA;AAAA;AACtD,EAMA,MAAM,aACJ,CAAA,WAAA,GAAc,KACS,EAAA;AACvB,IAAA,MAAM,GAAM,GAAA,MAAM,cAAe,CAAA,IAAA,CAAK,OAAO,CAAA;AAC7C,IAAA,IAAI,WAAa,EAAA;AACf,MAAO,OAAA,GAAA;AAAA;AAET,IAAI,IAAA;AACF,MAAA,OAAQ,MAAM,GAAA,CAAI,KAAM,EAAA,CAAE,IAAK,EAAA;AAAA,KACzB,CAAA,MAAA;AACN,MAAO,OAAA,GAAA;AAAA;AACT;AACF,EAEA,MAAM,OAA6B,GAAA;AAEjC,IAAM,MAAA,OAAA,GAAU,MAAM,IAAA,CAAK,OAAQ,EAAA;AACnC,IAAI,IAAA,EAAE,eAAe,OAAU,CAAA,EAAA;AAC7B,MAAM,MAAA,IAAI,MAAM,+CAA+C,CAAA;AAAA;AAGjE,IAAM,MAAA,IAAA,GAAO,KAAK,SAAU,CAAA;AAAA,MAC1B,WAAW,OAAQ,CAAA,SAAA;AAAA,MACnB,IAAM,EAAA;AAAA,KACP,CAAA;AACD,IAAA,MAAM,GAAM,GAAA,MAAM,YAAa,CAAA,IAAA,CAAK,SAAS,IAAI,CAAA;AAEjD,IAAA,aAAA,CAAc,IAAI,OAAA,CAAQ,EAAE,CAAC,CAAA;AAC7B,IAAK,IAAA,CAAA,OAAA,CAAQ,OAAU,GAAA,IAAI,OAAQ,EAAA;AAEnC,IAAO,OAAA,GAAA;AAAA;AACT,EASA,MAAM,MACJ,CAAA,OAAA,EACA,WACY,EAAA;AAEZ,IAAK,IAAA,CAAA,OAAA,CAAQ,OAAU,GAAA,IAAI,OAAQ,EAAA;AACnC,IAAA,MAAM,EAAE,KAAA,EAAO,QAAU,EAAA,GAAG,QAAW,GAAA,OAAA;AACvC,IAAI,IAAA,CAAC,KAAS,IAAA,CAAC,QAAU,EAAA;AACvB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA;AAGF,IAAM,MAAA,SAAA,GAAY,MAAM,IAAA,CAAK,aAAc,EAAA;AAC3C,IAAA,MAAM,EAAE,WAAA,EAAgB,GAAA,SAAA,IAAa,EAAC;AACtC,IAAA,IAAI,CAAC,WAAa,EAAA;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA;AAGF,IAAM,MAAA,IAAA,GAAO,MAAM,IAAA,CAAK,OAAQ,EAAA;AAEhC,IAAI,IAAA,SAAA;AACJ,IAAA,IAAI,eAAe,IAAM,EAAA;AACvB,MAAA,SAAA,GAAY,IAAK,CAAA,SAAA;AAAA,KACZ,MAAA;AACL,MAAM,MAAA,IAAI,MAAM,+CAA+C,CAAA;AAAA;AAGjE,IAAM,MAAA,IAAA,GAAO,KAAK,SAAU,CAAA;AAAA,MAC1B,KAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,aAAa,WAAY,CAAA;AAAA,KAC1B,CAAA;AAED,IAAM,MAAA,GAAA,GAAM,MAAM,WAAY,CAAA,IAAA,CAAK,SAAS,EAAE,IAAA,EAAM,QAAQ,CAAA;AAC5D,IAAI,IAAA,GAAA,CAAI,SAAS,GAAK,EAAA;AACpB,MAAA,IAAA,CAAK,QAAQ,KAAM,CAAA,MAAM,IAAI,KAAM,EAAA,CAAE,MAAM,CAAA;AAC3C,MAAO,OAAA,MAAA;AAAA;AAET,IAAM,MAAA,KAAA,GAAQ,UAAW,CAAA,GAAA,CAAI,OAAO,CAAA;AACpC,IAAA,IAAI,CAAC,KAAO,EAAA;AACV,MAAM,MAAA,IAAI,MAAM,qDAAqD,CAAA;AAAA;AAEvE,IAAA,IAAA,CAAK,OAAQ,CAAA,OAAA,EAAS,MAAO,CAAA,QAAA,EAAU,KAAK,CAAA;AAC5C,IAAc,aAAA,CAAA,IAAA,CAAK,QAAQ,OAAO,CAAA;AAClC,IAAA,IAAI,WAAa,EAAA;AACf,MAAO,OAAA,GAAA;AAAA;AAET,IAAI,IAAA;AACF,MAAA,MAAM,IAAQ,GAAA,MAAM,GAAI,CAAA,KAAA,GAAQ,IAAK,EAAA;AACrC,MAAA,IAAI,IAAQ,IAAA,OAAO,IAAS,KAAA,QAAA,IAAY,aAAa,IAAM,EAAA;AACzD,QAAM,MAAA,QAAA,GAAY,IAAyB,CAAA,OAAA,CAAQ,CAAC,CAAA;AACpD,QAAA,IAAI,QAAU,EAAA;AACZ,UAAA,cAAA,CAAe,QAAQ,CAAA;AAAA;AACzB;AAEF,MAAO,OAAA,IAAA;AAAA,KACD,CAAA,MAAA;AACN,MAAO,OAAA,GAAA;AAAA;AACT;AACF,EAEA,MAAM,eAAe,GAIC,EAAA;AACpB,IAAA,IAAI,KAAQ,GAAA,EAAA;AACZ,IAAA,MAAM,WAAW,kBAAmB,CAAA;AAAA,MAClC,QAAQ,IAAK,CAAA;AAAA,KACd,CAAA;AACD,IAAA,IAAI,cAAc,QAAS,CAAA,WAAA;AAC3B,IAAA,IAAI,cAAc,QAAS,CAAA,WAAA;AAE3B,IAAA,IAAI,WAAW,GAAK,EAAA;AAClB,MAAA,KAAA,GAAQ,GAAI,CAAA,KAAA;AAAA;AAGd,IAAA,IAAI,iBAAiB,GAAK,EAAA;AACxB,MAAc,WAAA,GAAA,GAAA,CAAI,WAAc,GAAA,GAAA,CAAI,WAAc,GAAA,IAAA;AAAA;AAEpD,IAAA,IAAI,iBAAiB,GAAK,EAAA;AACxB,MAAc,WAAA,GAAA,GAAA,CAAI,WAAc,GAAA,GAAA,CAAI,WAAc,GAAA,IAAA;AAAA;AAEpD,IAAM,MAAA,IAAA,GAAO,KAAK,SAAU,CAAA;AAAA,MAC1B,KAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACD,CAAA;AAGD,IAAA,MAAM,OAAO,MAAM,kBAAA;AAAA,MACjB,IAAK,CAAA,OAAA;AAAA,MACL,MAAA;AAAA,MACA,IAAA;AAAA,MACA,IAAI,eAAgB,EAAA;AAAA,MACpB;AAAA,KACF;AACA,IAAO,OAAA,IAAA;AAAA;AACT,EAEA,MAAM,cACJ,GAQmB,EAAA;AACnB,IAAA,IAAI,KAAQ,GAAA,EAAA;AACZ,IAAA,IAAI,QAAW,GAAA,EAAA;AACf,IAAA,MAAM,WAAW,kBAAmB,CAAA,EAAE,MAAQ,EAAA,IAAA,CAAK,SAAS,CAAA;AAC5D,IAAA,IAAI,cAAc,QAAS,CAAA,WAAA;AAC3B,IAAA,IAAI,cAAc,QAAS,CAAA,WAAA;AAC3B,IAAA,IAAI,eAAe,OAAS,EAAA;AAC1B,MAAMC,MAAAA,KAAAA,GAAO,MAAM,GAAA,CAAI,IAAK,EAAA;AAC5B,MAAA,KAAA,GAAQA,KAAK,CAAA,KAAA;AACb,MAAA,QAAA,GAAWA,KAAK,CAAA,QAAA;AAChB,MAAM,MAAA,aAAA,GAAgB,aAAc,CAAA,GAAA,CAAI,OAAO,CAAA;AAC/C,MAAA,IAAI,aAAe,EAAA;AACjB,QAAc,WAAA,GAAA,aAAA;AAAA;AAEhB,MAAA,IAAIA,MAAK,WAAa,EAAA;AACpB,QAAA,WAAA,GAAcA,KAAK,CAAA,WAAA;AAAA;AAErB,MAAA,IAAIA,MAAK,WAAa,EAAA;AACpB,QAAA,WAAA,GAAcA,KAAK,CAAA,WAAA;AAAA;AACrB,KACK,MAAA;AACL,MAAA,IAAI,WAAW,GAAK,EAAA;AAClB,QAAA,KAAA,GAAQ,GAAI,CAAA,KAAA;AAAA;AAEd,MAAA,IAAI,cAAc,GAAK,EAAA;AACrB,QAAA,QAAA,GAAW,GAAI,CAAA,QAAA;AAAA;AAEjB,MAAA,IAAI,iBAAiB,GAAK,EAAA;AACxB,QAAc,WAAA,GAAA,GAAA,CAAI,WAAc,GAAA,GAAA,CAAI,WAAc,GAAA,IAAA;AAAA;AAEpD,MAAA,IAAI,iBAAiB,GAAK,EAAA;AACxB,QAAc,WAAA,GAAA,GAAA,CAAI,WAAc,GAAA,GAAA,CAAI,WAAc,GAAA,IAAA;AAAA;AACpD;AAGF,IAAA,MAAM,KAAK,OAAQ,EAAA;AACnB,IAAM,MAAA,IAAA,GAAO,KAAK,SAAU,CAAA;AAAA,MAC1B,KAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAI,IAAA,aAAA;AACJ,IAAI,IAAA;AACF,MAAA,MAAM,OAAO,MAAM,kBAAA,CAAmB,IAAK,CAAA,OAAA,EAAS,QAAQ,IAAI,CAAA;AAChE,MAAM,MAAA,MAAA,GAAS,KAAK,KAAM,EAAA;AAC1B,MAAI,IAAA,IAAA,CAAK,WAAW,GAAK,EAAA;AACvB,QAAM,MAAA,IAAA,GAAO,MAAM,MAAA,CAAO,IAAK,EAAA;AAC/B,QAAK,IAAA,CAAA,OAAA,CAAQ,MAAM,IAAI,CAAA;AACvB,QAAO,OAAA,IAAA;AAAA;AAGT,MAAA,MAAM,EAAE,GAAA,EAAQ,GAAA,MAAM,KAAK,IAAK,EAAA;AAChC,MAAgB,aAAA,GAAA,GAAA;AAAA,KACV,CAAA,MAAA;AAAA;AAGR,IAAI,IAAA,KAAA;AACJ,IAAI,IAAA;AACF,MAAA,MAAM,YAAe,GAAA,IAAI,GAAI,CAAA,aAAa,CAAE,CAAA,YAAA;AAC5C,MAAA,MAAM,SAAS,MAAM,kBAAA;AAAA,QACnB,IAAK,CAAA,OAAA;AAAA,QACL,KAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAA,OACF;AACA,MAAQ,KAAA,GAAA,eAAA,CAAgB,OAAO,OAAO,CAAA;AAAA,KAChC,CAAA,MAAA;AACN,MAAA,IAAA,CAAK,OAAQ,CAAA,IAAA;AAAA,QACX;AAAA,OACF;AAAA;AAIF,IAAM,MAAA,MAAA,GAAS,KAAK,OAAQ,CAAA,OAAA,CAAQ,IAAI,QAAQ,CAAA,EAAG,MAAM,IAAI,CAAA;AAC7D,IAAA,IAAI,KAAO,EAAA;AACT,MAAA,MAAA,EAAQ,KAAK,KAAK,CAAA;AAAA,KACb,MAAA;AACL,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA;AAEF,IAAK,IAAA,CAAA,OAAA,CAAQ,OAAU,GAAA,IAAI,OAAQ,CAAA;AAAA,MACjC,GAAG,KAAK,OAAQ,CAAA,OAAA;AAAA,MAChB,MAAA,EAAQ,MAAQ,EAAA,IAAA,CAAK,IAAI;AAAA,KAC1B,CAAA;AACD,IAAA,MAAM,MAAM,MAAM,kBAAA,CAAmB,IAAK,CAAA,OAAA,EAAS,OAAO,IAAI,CAAA;AAE9D,IAAA,MAAA,EAAQ,GAAI,EAAA;AACZ,IAAM,MAAA,OAAA,GACJ,MAAQ,EAAA,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,QAAS,CAAA,cAAc,CAAC,CAAA,IAAK,EAAC;AACzD,IAAA,OAAA,CAAQ,KAAK,MAAO,CAAA,UAAA,CAAW,GAAI,CAAA,OAAO,CAAC,CAAC,CAAA;AAC5C,IAAM,MAAA,cAAA,GAAiB,IAAI,OAAQ,CAAA,EAAE,QAAQ,OAAQ,CAAA,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA;AACjE,IAAA,aAAA,CAAc,cAAc,CAAA;AAE5B,IAAO,OAAA,GAAA;AAAA;AACT,EACA,MAAM,QAAS,CAAA,QAAA,EAAwB,IAAyB,EAAA;AAC9D,IAAA,IAAI,gBAAgB,OAAS,EAAA;AAC3B,MAAK,IAAA,CAAA,OAAA,CAAQ,UAAU,IAAK,CAAA,OAAA;AAC5B,MAAA,OAAO,MAAM,aAAA;AAAA,QACX,IAAK,CAAA,OAAA;AAAA,QACL,QAAA;AAAA,QACA,MAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAA,OACF;AAAA;AAEF,IAAA,OAAO,MAAM,aAAA,CAAc,IAAK,CAAA,OAAA,EAAS,UAAU,IAAI,CAAA;AAAA;AACzD,EAYA,MAAM,MAAA,CACJ,QACA,EAAA,OAAA,EACA,WACY,EAAA;AACZ,IAAA,IAAI,mBAAmB,OAAS,EAAA;AAC9B,MAAA,MAAMA,QAAO,IAAI,eAAA,CAAgB,MAAM,OAAA,CAAQ,MAAM,CAAA;AACrD,MAAA,MAAM,MAAS,GAAA,IAAI,GAAI,CAAA,OAAA,CAAQ,GAAG,CAAE,CAAA,MAAA;AAEpC,MAAM,MAAA,UAAA,GAAaA,KAAM,EAAA,GAAA,CAAI,aAAa,CAAA;AAC1C,MAAMC,MAAAA,UAAAA,GAAYD,KAAM,EAAA,GAAA,CAAI,WAAW,CAAA;AAEvC,MAAM,MAAA,WAAA,GAAc,CAClB,EAAA,CAAC,UAAY,EAAA,UAAA,CAAW,MAAM,CAAI,GAAA,MAAA,GAAS,EAC7C,CAAA,EAAG,UAAU,CAAA,CAAA;AACb,MAAA,IAAI,CAACC,UAAW,EAAA;AACd,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA;AAEF,MAAA,IAAA,CAAK,OAAQ,CAAA,OAAA,GAAU,IAAI,OAAA,CAAQ,QAAQ,OAAO,CAAA;AAElD,MAAA,IAAA,CAAK,QAAQ,OAAQ,CAAA,GAAA;AAAA,QACnB,cAAA;AAAA,QACA;AAAA,OACF;AACA,MAAM,MAAA,MAAA,GAAS,IAAI,eAAgB,CAAA;AAAA,QACjC,SAAAA,EAAAA,UAAAA;AAAA,QACA,IAAA,EAAM,OAAO,IAAI;AAAA,OAClB,CAAA;AACD,MAAA,IAAI,UAAY,EAAA;AACd,QAAO,MAAA,CAAA,GAAA,CAAI,eAAe,WAAW,CAAA;AAAA;AAEvC,MAAA,OAAQ,MAAM,WAAA,CAAY,IAAK,CAAA,OAAA,EAAS,UAAU,MAAM,CAAA;AAAA;AAG1D,IAAK,IAAA,CAAA,OAAA,CAAQ,OAAU,GAAA,IAAI,OAAQ,EAAA;AACnC,IAAA,MAAM,EAAE,IAAA,EAAM,KAAM,EAAA,GAAI,IAAK,CAAA,OAAA;AAE7B,IAAM,MAAA,SAAA,GAAY,MAAM,IAAA,CAAK,aAAc,EAAA;AAC3C,IAAA,IAAA,CAAK,gBAAgB,CAAA;AACrB,IAAM,MAAA,IAAA,GAAO,MAAM,IAAA,CAAK,OAAQ,EAAA;AAEhC,IAAI,IAAA,SAAA;AACJ,IAAA,IAAI,eAAe,IAAM,EAAA;AACvB,MAAA,SAAA,GAAY,IAAK,CAAA,SAAA;AAAA,KACZ,MAAA;AACL,MAAM,MAAA,IAAI,MAAM,+CAA+C,CAAA;AAAA;AAGjE,IAAA,MAAM,EAAE,WAAA,EAAgB,GAAA,SAAA,IAAa,EAAC;AAEtC,IAAA,IAAI,CAAC,WAAa,EAAA;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA;AAGF,IAAA,MAAM,EAAE,KAAA,EAAO,QAAS,EAAA,GAAI,WAAW,EAAC;AACxC,IAAA,IAAI,QAAa,KAAA,OAAA,KAAY,CAAC,KAAA,IAAS,CAAC,QAAW,CAAA,EAAA;AACjD,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA;AAGF,IAAK,IAAA,CAAA,CAAA,wBAAA,EAA2B,KAAK,CAAE,CAAA,CAAA;AACvC,IAAK,IAAA,CAAA,CAAA,8BAAA,EAAiC,KAAK,CAAE,CAAA,CAAA;AAC7C,IAAM,MAAA,IAAA,GAAO,KAAK,SAAU,CAAA;AAAA,MAC1B,KAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,aAAa,WAAY,CAAA;AAAA,KAC1B,CAAA;AAED,IAAA,MAAM,SAAY,GAAA,MAAM,IAAK,CAAA,QAAA,CAAS,UAAU,IAAI,CAAA;AAEpD,IAAA,MAAM,UAAa,GAAA,SAAA,EAAW,OAAQ,CAAA,GAAA,CAAI,YAAY,CAAA;AACtD,IAAA,IAAI,CAAC,UAAY,EAAA;AACf,MAAM,MAAA,IAAI,MAAM,uBAAuB,CAAA;AAAA;AAGzC,IAAM,MAAA,KAAA,GAAQ,UAAW,CAAA,SAAA,EAAW,OAAO,CAAA;AAC3C,IAAA,MAAM,aAAgB,GAAA,SAAA,EAAW,OAAQ,CAAA,GAAA,CAAI,UAAU,CAAA;AACvD,IAAA,IAAI,aAAe,EAAA;AACjB,MAAI,IAAA,QAAA;AACJ,MAAI,IAAA;AACF,QAAA,QAAA,GAAW,IAAI,GAAI,CAAA,aAAa,CAAE,CAAA,YAAA,CAAa,IAAI,OAAO,CAAA;AAAA,OACpD,CAAA,MAAA;AAAA;AAGR,MAAA,IAAI,QAAU,EAAA;AACZ,QAAA,KAAA,CAAM,uBAAyB,EAAA,EAAE,KAAO,EAAA,QAAA,EAAU,CAAA;AAClD,QAAO,OAAA,MAAA;AAAA;AACT;AAEF,IAAA,IAAI,CAAC,KAAO,EAAA;AACV,MAAA,KAAA,CAAM,6BAA+B,EAAA;AAAA,QACnC,UAAA;AAAA,QACA;AAAA,OACD,CAAA;AACD,MAAM,MAAA,IAAI,MAAM,qBAAqB,CAAA;AAAA;AAEvC,IAAK,IAAA,CAAA,2BAAA,EAA6B,EAAE,UAAA,EAAY,CAAA;AAGhD,IAAA,MAAM,SAAY,GAAA,SAAA,CAAU,OAAQ,CAAA,GAAA,CAAI,YAAY,CAAA;AACpD,IAAA,IAAI,SAAW,EAAA;AACb,MAAA,MAAM,MAAS,GAAA;AAAA,QACb,SAAA,CAAU,IAAK,CAAA,OAAA,CAAQ,OAAO,CAAA;AAAA,QAC9B,aAAA,CAAc,UAAU,OAAO,CAAA;AAAA,QAC/B,UAAA,CAAW,UAAU,OAAO;AAAA,OAE3B,CAAA,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,IAAI,CAAA;AACZ,MAAA,aAAA,CAAc,IAAI,OAAA,CAAQ,EAAE,MAAA,EAAQ,CAAC,CAAA;AAAA,KAChC,MAAA;AACL,MAAA,KAAA,CAAM,qCAAuC,EAAA;AAAA,QAC3C,SAAS,SAAU,CAAA;AAAA,OACpB,CAAA;AAAA;AAGH,IAAA,IAAI,WAAa,EAAA;AACf,MAAO,OAAA,SAAA;AAAA;AAET,IAAI,IAAA;AACF,MAAA,OAAQ,MAAM,SAAA,CAAU,KAAM,EAAA,CAAE,IAAK,EAAA;AAAA,KAC/B,CAAA,MAAA;AACN,MAAO,OAAA,SAAA;AAAA;AACT;AAEJ,CAAA;AAEO,SAAS,UAAU,OAAmB,EAAA;AAC3C,EAAI,IAAA,MAAA,GAAS,OAAS,EAAA,GAAA,CAAI,YAAY,CAAA;AACtC,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAS,MAAA,GAAA,OAAA,EAAS,IAAI,QAAQ,CAAA;AAAA;AAEhC,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAO,OAAA,MAAA;AAAA;AAET,EAAM,MAAA,GAAG,KAAK,CAAA,GAAI,uCAAuC,IAAK,CAAA,MAAM,KAAK,EAAC;AAC1E,EAAO,OAAA,KAAA;AACT;AAEO,SAAS,cAAc,OAAmB,EAAA;AAC/C,EAAI,IAAA,MAAA,GAAS,OAAS,EAAA,GAAA,CAAI,YAAY,CAAA;AACtC,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAS,MAAA,GAAA,OAAA,EAAS,IAAI,QAAQ,CAAA;AAAA;AAEhC,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAO,OAAA,MAAA;AAAA;AAET,EAAM,MAAA,GAAG,KAAK,CAAA,GAAI,yCAAyC,IAAK,CAAA,MAAM,KAAK,EAAC;AAC5E,EAAO,OAAA,KAAA;AACT;AAEO,SAAS,WAAW,OAAmB,EAAA;AAC5C,EAAI,IAAA,UAAA,GAAa,OAAS,EAAA,GAAA,CAAI,YAAY,CAAA;AAC1C,EAAA,IAAI,CAAC,UAAY,EAAA;AACf,IAAa,UAAA,GAAA,OAAA,EAAS,IAAI,QAAQ,CAAA;AAAA;AAEpC,EAAA,IAAI,CAAC,UAAY,EAAA;AACf,IAAO,OAAA,MAAA;AAAA;AAET,EAAM,MAAA,GAAG,KAAK,CAAA,GACZ,0CAA0C,IAAK,CAAA,UAAU,KAAK,EAAC;AACjE,EAAO,OAAA,KAAA;AACT;AACA,SAAS,gBAAgB,OAAwC,EAAA;AAC/D,EAAI,IAAA,UAAA,GAAa,OAAS,EAAA,GAAA,CAAI,YAAY,CAAA;AAC1C,EAAA,IAAI,CAAC,UAAY,EAAA;AACf,IAAa,UAAA,GAAA,OAAA,EAAS,IAAI,QAAQ,CAAA;AAAA;AAEpC,EAAA,IAAI,CAAC,UAAY,EAAA;AACf,IAAO,OAAA,MAAA;AAAA;AAET,EAAM,MAAA,GAAG,KAAK,CAAA,GAAI,kCAAkC,IAAK,CAAA,UAAU,KAAK,EAAC;AACzE,EAAO,OAAA,KAAA;AACT;AAEO,SAAS,kBAAA,CAAmB,EAAE,MAAA,EAA8B,EAAA;AACjE,EAAA,IAAI,EAAK,GAAA,IAAA;AACT,EAAA,IAAI,QAAW,GAAA,IAAA;AACf,EAAM,MAAA,UAAA,GAAa,aAAc,CAAA,MAAA,CAAO,OAAO,CAAA;AAC/C,EAAA,IAAI,UAAY,EAAA;AACd,IAAA,MAAM,GAAG,KAAK,CAAI,GAAA,UAAA,CAAW,MAAM,GAAG,CAAA;AACtC,IAAA,EAAA,GAAK,mBAAmB,KAAK,CAAA;AAC7B,IAAA,IAAI,KAAO,EAAA;AACT,MAAA,QAAA,GAAW,GAAG,IAAI,GAAA,CAAI,EAAE,CAAA,CAAE,MAAM,CAAgC,EAAA,sBAAA,sBAAA,CAAA;AAAA;AAClE;AAEF,EAAA,OAAO,EAAE,WAAA,EAAa,EAAI,EAAA,WAAA,EAAa,QAAS,EAAA;AAClD;;;AC1gBA,eAAO,UAAA,CACL,MACA,EAAA,WAAA,GAAc,KACd,EAAA;AACA,EAAM,MAAA,GAAA,GAAM,MAAM,SAAA,CAAU,MAAM,CAAA;AAElC,EAAM,MAAA,QAAA,GAAW,SAAU,CAAA,GAAA,CAAI,OAAO,CAAA;AAGtC,EAAA,IAAI,QAAU,EAAA;AACZ,IAAA,MAAM,GAAG,KAAK,CAAI,GAAA,QAAA,CAAS,MAAM,GAAG,CAAA;AACpC,IAAA,MAAM,CAAC,KAAK,CAAA,GAAI,mBAAmB,KAAK,CAAA,CAAE,MAAM,GAAG,CAAA;AAEnD,IAAA,MAAM,SAAY,GAAA,GAAA,CAAI,OAAQ,CAAA,GAAA,CAAI,YAAY,CAAA;AAC9C,IAAA,IAAI,SAAW,EAAA;AACb,MAAA,MAAM,MAAS,GAAA;AAAA,QACb,QAAA;AAAA,QACA,aAAA,CAAc,IAAI,OAAO,CAAA;AAAA,QACzB,UAAA,CAAW,IAAI,OAAO;AAAA,OAErB,CAAA,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,IAAI,CAAA;AACZ,MAAO,MAAA,CAAA,OAAA,CAAQ,GAAI,CAAA,QAAA,EAAU,MAAM,CAAA;AACnC,MAAA,aAAA,CAAc,IAAI,OAAA,CAAQ,EAAE,MAAA,EAAQ,CAAC,CAAA;AAAA;AAEvC,IAAA,IAAI,CAAC,WAAa,EAAA;AAChB,MAAO,OAAA,EAAE,WAAW,KAAM,EAAA;AAAA;AAC5B,GACK,MAAA;AAEL,IAAA,MAAM,cAAiB,GAAA,MAAA,CAAO,OAAQ,CAAA,GAAA,CAAI,QAAQ,CAAA;AAClD,IAAA,MAAM,cAAc,EAAC;AACrB,IAAA,IAAI,cAAgB,EAAA;AAClB,MAAY,WAAA,CAAA,IAAA;AAAA,QACV,UAAA,CAAW,OAAO,OAAO,CAAA;AAAA,QACzB,aAAA,CAAc,OAAO,OAAO;AAAA,OAC9B;AAAA;AAEF,IAAA,IAAI,QAAU,EAAA;AACZ,MAAA,WAAA,CAAY,KAAK,QAAQ,CAAA;AAAA,KACpB,MAAA;AAEL,MAAA,WAAA,CAAY,IAAK,CAAA,SAAA,CAAU,MAAO,CAAA,OAAO,CAAC,CAAA;AAAA;AAE5C,IAAA,MAAM,SAAS,WAAY,CAAA,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA;AAGpD,IAAO,MAAA,CAAA,OAAA,CAAQ,GAAI,CAAA,QAAA,EAAU,MAAM,CAAA;AACnC,IAAA,aAAA,CAAc,IAAI,OAAA,CAAQ,EAAE,MAAA,EAAQ,CAAC,CAAA;AAAA;AAGvC,EAAA,IAAI,WAAa,EAAA;AACf,IAAO,OAAA,GAAA;AAAA;AAGT,EAAI,IAAA;AACF,IAAA,OAAQ,MAAM,GAAA,CAAI,KAAM,EAAA,CAAE,IAAK,EAAA;AAAA,GACzB,CAAA,MAAA;AACN,IAAO,OAAA,GAAA;AAAA;AAEX;;;ACxDA,IAAqB,QAArB,MAA2B;AAAA,EACzB,OAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAY,MAAgB,EAAA;AAC1B,IAAA,IAAA,CAAK,OAAU,GAAA,MAAA;AACf,IAAK,IAAA,CAAA,OAAA,GAAU,MAAO,CAAA,MAAA,EAAQ,MAAM,CAAA;AAAA;AACtC,EAEA,MAAM,UACJ,CAAA,GAAA,EAMA,WACY,EAAA;AACZ,IAAM,MAAA,GAAA,GAAM,MAAM,OAAQ,CAAA,IAAA,CAAK,SAAS,KAAO,EAAA,IAAA,CAAK,SAAU,CAAA,GAAG,CAAC,CAAA;AAClE,IAAA,IAAI,WAAa,EAAA;AACf,MAAO,OAAA,GAAA;AAAA;AAET,IAAI,IAAA;AACF,MAAA,OAAO,MAAM,GAAA,EAAK,KAAM,EAAA,CAAE,IAAK,EAAA;AAAA,KACzB,CAAA,MAAA;AACN,MAAO,OAAA,GAAA;AAAA;AACT;AACF,EAEA,MAAM,UAAgC,GAAA;AACpC,IAAM,MAAA,EAAA,GAAK,MAAM,IAAA,CAAK,OAAQ,EAAA;AAC9B,IAAA,IAAI,QAAQ,EAAI,EAAA;AACd,MAAK,IAAA,CAAA,OAAA,CAAQ,SAAU,EAAuB,CAAA,EAAA;AAAA;AAEhD,IAAA,MAAM,GAAM,GAAA,MAAM,OAAQ,CAAA,IAAA,CAAK,SAAS,QAAQ,CAAA;AAChD,IAAc,aAAA,CAAA,IAAI,SAAS,CAAA;AAC3B,IAAO,OAAA,GAAA;AAAA;AACT,EAIA,MAAM,QAA6B,WAAmC,EAAA;AACpE,IAAA,MAAM,GAAM,GAAA,MAAM,OAAQ,CAAA,IAAA,CAAK,OAAO,CAAA;AAEtC,IAAA,IAAI,WAAa,EAAA;AACf,MAAO,OAAA,GAAA;AAAA;AAET,IAAI,IAAA;AACF,MAAA,OAAO,MAAM,GAAA,EAAK,KAAM,EAAA,CAAE,IAAK,EAAA;AAAA,KACzB,CAAA,MAAA;AACN,MAAO,OAAA,GAAA;AAAA;AACT;AACF,EAWA,MAAM,UAAA,CACJ,OACA,EAAA,WAAA,GAAc,KACF,EAAA;AACZ,IAAA,MAAM,WACJ,GAAA,OAAO,OAAY,KAAA,QAAA,GACf,OAAQ,CAAA,WAAA,IAAe,OAAQ,CAAA,GAAA,CAAI,QAAa,KAAA,YAAA,GAChD,OAAQ,CAAA,GAAA,CAAI,QAAa,KAAA,YAAA;AAE/B,IAAM,MAAA,WAAA,GACJ,OAAO,OAAY,KAAA,QAAA,GACf,QAAQ,WACRC,GAAAA,mBAAAA,CAAmB,IAAK,CAAA,OAAO,CAAE,CAAA,WAAA;AAEvC,IAAI,IAAA;AACF,MAAM,MAAA,EAAA,GAAK,MAAM,IAAA,CAAK,OAAQ,EAAA;AAC9B,MAAA,IAAI,cAAc,QAAU,EAAA;AAC1B,QAAO,OAAA,EAAA;AAAA;AAET,MAAA,MAAM,MAAM,MAAM,kBAAA;AAAA,QAChB,IAAK,CAAA,OAAA;AAAA,QACL,EAAA;AAAA,QACA,OAAO,WAAW;AAAA,OACpB;AACA,MAAO,OAAA,GAAA;AAAA,KACD,CAAA,MAAA;AACN,MAAA,IAAA,CAAK,OAAS,EAAA,IAAA;AAAA,QACZ;AAAA,OACF;AAAA;AAGF,IAAA,IAAI,WAAa,EAAA;AACf,MAAA,OAAO,KAAK,UAAW,CAAA,EAAE,aAAe,EAAA,IAAA,IAAQ,WAAW,CAAA;AAAA;AAG7D,IAAA,IAAA,CAAK,OAAQ,CAAA,KAAA;AAAA,MACX;AAAA,KACF;AACA,IAAO,OAAA,MAAA;AAAA;AAEX,CAAA;AAEA,eAAe,kBAAA,CACb,MACA,EAAA,IAAA,EACA,QACA,EAAA;AACA,EAAO,MAAA,CAAA,OAAA,CAAQ,GAAI,CAAA,cAAA,EAAgB,mCAAmC,CAAA;AACtE,EAAA,MAAM,EAAE,SAAA,EAAc,GAAA,MAAM,WAA+B,MAAM,CAAA;AACjE,EAAM,MAAA,QAAA,GAAWA,oBAAmB,MAAM,CAAA;AAC1C,EAAA,MAAM,WAAc,GAAA,QAAA,IAAY,MAAO,CAAA,QAAA,CAAS,WAAW,CAAA;AAC3D,EAAA,MAAM,MAAM,MAAM,gBAAA;AAAA,IAChB,MAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAI,eAAgB,CAAA;AAAA,MAClB,SAAA;AAAA,MACA,OAAO,IAAK,CAAA,KAAA;AAAA,MACZ;AAAA,KACD,EAAE,QAAS;AAAA,GACd;AACA,EAAI,IAAA,GAAA,CAAI,SAAS,GAAK,EAAA;AACpB,IAAA,MAAM,IAAI,KAAA,CAAM,MAAM,GAAA,CAAI,MAAM,CAAA;AAAA;AAElC,EAAO,OAAA,GAAA;AACT;AAEO,SAASA,oBAAmB,MAAgB,EAAA;AACjD,EAAA,IAAI,EAAK,GAAA,IAAA;AACT,EAAM,MAAA,UAAA,GAAa,aAAc,CAAA,MAAA,CAAO,OAAO,CAAA;AAC/C,EAAA,IAAI,UAAY,EAAA;AACd,IAAA,MAAM,GAAG,KAAK,CAAI,GAAA,UAAA,CAAW,MAAM,GAAG,CAAA;AACtC,IAAA,EAAA,GAAK,mBAAmB,KAAK,CAAA;AAAA;AAE/B,EAAO,OAAA,EAAE,aAAa,EAAG,EAAA;AAC3B;;;AC3HA,IAAqB,UAArB,MAA6B;AAAA,EAC3B,OAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAY,MAAgB,EAAA;AAC1B,IAAK,IAAA,CAAA,OAAA,GAAU,MAAO,CAAA,MAAA,EAAQ,WAAW,CAAA;AACzC,IAAA,IAAA,CAAK,OAAU,GAAA,MAAA;AAAA;AACjB,EAcA,MAAM,MACJ,CAAA,GAAA,EACA,WACmC,EAAA;AACnC,IAAI,IAAA,GAAA;AACJ,IAAI,IAAA,OAAO,QAAQ,QAAU,EAAA;AAC3B,MAAA,GAAA,GAAM,MAAM,YAAA;AAAA,QACV,IAAK,CAAA,OAAA;AAAA,QACL,MAAA;AAAA,QACA,IAAK,CAAA,SAAA,CAAU,EAAE,IAAA,EAAM,KAAK;AAAA,OAC9B;AAAA,eACS,OAAO,GAAA,KAAQ,aAAa,MAAU,IAAA,GAAA,IAAO,QAAQ,GAAM,CAAA,EAAA;AACpE,MAAM,GAAA,GAAA,MAAM,aAAa,IAAK,CAAA,OAAA,EAAS,QAAQ,IAAK,CAAA,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA;AAEpE,IAAA,IAAI,WAAa,EAAA;AACf,MAAO,OAAA,GAAA;AAAA;AAET,IAAI,IAAA;AACF,MAAA,OAAO,MAAM,GAAA,EAAK,KAAM,EAAA,CAAE,IAAK,EAAA;AAAA,KACzB,CAAA,MAAA;AACN,MAAO,OAAA,GAAA;AAAA;AACT;AACF,EAIA,MAAM,OACJ,GACuB,EAAA;AACvB,IAAI,IAAA,OAAO,QAAQ,QAAU,EAAA;AAC3B,MAAA,IAAA,CAAK,QAAQ,QAAW,GAAA,GAAA;AAAA;AAE1B,IAAA,IAAI,OAAO,GAAA,KAAQ,QAAY,IAAA,IAAA,IAAQ,GAAK,EAAA;AAC1C,MAAK,IAAA,CAAA,OAAA,CAAQ,WAAW,GAAI,CAAA,EAAA;AAAA;AAE9B,IAAA,MAAM,GAAM,GAAA,MAAM,WAAY,CAAA,IAAA,CAAK,SAAS,QAAQ,CAAA;AACpD,IAAO,OAAA,GAAA;AAAA;AACT,EASA,MAAM,GACJ,CAAA,GAAA,EACA,WACY,EAAA;AACZ,IAAI,IAAA,OAAO,QAAQ,QAAU,EAAA;AAC3B,MAAA,IAAA,CAAK,QAAQ,QAAW,GAAA,GAAA;AAAA,KACf,MAAA,IAAA,OAAO,GAAQ,KAAA,QAAA,IAAY,QAAQ,GAAK,EAAA;AACjD,MAAK,IAAA,CAAA,OAAA,CAAQ,WAAW,GAAI,CAAA,EAAA;AAAA;AAE9B,IAAA,MAAM,GAAM,GAAA,MAAM,WAAY,CAAA,IAAA,CAAK,SAAS,KAAK,CAAA;AACjD,IAAI,IAAA,WAAA,KAAgB,IAAQ,IAAA,GAAA,KAAQ,IAAM,EAAA;AACxC,MAAO,OAAA,GAAA;AAAA;AAGT,IAAI,IAAA;AACF,MAAA,OAAO,MAAM,GAAA,EAAK,KAAM,EAAA,CAAE,IAAK,EAAA;AAAA,KACzB,CAAA,MAAA;AACN,MAAO,OAAA,GAAA;AAAA;AACT;AACF,EAOA,MAAM,MACJ,CAAA,GAAA,EACA,WACY,EAAA;AACZ,IAAI,IAAA,GAAA;AACJ,IAAA,IAAI,OAAO,GAAQ,KAAA,QAAA,KAAa,MAAU,IAAA,GAAA,IAAO,QAAQ,GAAM,CAAA,EAAA;AAC7D,MAAA,MAAM,EAAE,EAAA,EAAI,GAAG,SAAA,EAAc,GAAA,GAAA;AAC7B,MAAA,IAAI,EAAI,EAAA;AACN,QAAA,IAAA,CAAK,QAAQ,QAAW,GAAA,EAAA;AAAA;AAE1B,MAAM,GAAA,GAAA,MAAM,YAAY,IAAK,CAAA,OAAA,EAAS,OAAO,IAAK,CAAA,SAAA,CAAU,SAAS,CAAC,CAAA;AAAA;AAExE,IAAA,IAAI,WAAa,EAAA;AACf,MAAO,OAAA,GAAA;AAAA;AAET,IAAI,IAAA;AACF,MAAA,OAAO,MAAM,GAAA,EAAK,KAAM,EAAA,CAAE,IAAK,EAAA;AAAA,KACzB,CAAA,MAAA;AACN,MAAO,OAAA,GAAA;AAAA;AACT;AACF,EAIA,MAAM,KACJ,GACmC,EAAA;AACnC,IAAA,MAAM,GAAM,GAAA,MAAM,kBAAmB,CAAA,IAAA,CAAK,OAAO,CAAA;AACjD,IAAA,IAAI,QAAQ,IAAM,EAAA;AAChB,MAAO,OAAA,GAAA;AAAA;AAGT,IAAI,IAAA;AACF,MAAA,OAAO,MAAM,GAAA,EAAK,KAAM,EAAA,CAAE,IAAK,EAAA;AAAA,KACzB,CAAA,MAAA;AACN,MAAO,OAAA,GAAA;AAAA;AACT;AACF,EACA,MAAM,YACJ,GACY,EAAA;AACZ,IAAA,MAAM,EAAK,GAAA,MAAM,OAAQ,CAAA,IAAA,CAAK,OAAO,CAAA;AACrC,IAAI,IAAA;AACF,MAAM,MAAA,IAAA,GAAO,MAAM,EAAA,CAAG,IAAK,EAAA;AAC3B,MAAA,IAAI,QAAQ,IAAM,EAAA;AAChB,QAAK,IAAA,CAAA,OAAA,CAAQ,SAAS,IAAK,CAAA,EAAA;AAAA;AAC7B,KACM,CAAA,MAAA;AAAA;AAGR,IAAI,IAAA,OAAO,QAAQ,QAAU,EAAA;AAC3B,MAAA,IAAA,CAAK,QAAQ,QAAW,GAAA,GAAA;AAAA,KACnB,MAAA;AACL,MAAA,IAAA,CAAK,eAAe,GAAG,CAAA;AAAA;AAEzB,IAAA,OAAQ,MAAM,eAAA,CAAgB,IAAK,CAAA,OAAA,EAAS,QAAQ,CAAA;AAAA;AACtD,EAOA,MAAM,SACJ,CAAA,GAAA,EACA,WACY,EAAA;AACZ,IAAI,IAAA,OAAO,QAAQ,QAAU,EAAA;AAC3B,MAAA,IAAA,CAAK,QAAQ,MAAS,GAAA,GAAA;AAAA,KACjB,MAAA;AACL,MAAA,IAAA,CAAK,eAAe,GAAG,CAAA;AAAA;AAGzB,IAAA,MAAM,GAAM,GAAA,MAAM,eAAgB,CAAA,IAAA,CAAK,SAAS,KAAK,CAAA;AACrD,IAAO,OAAA,eAAA,CAAgB,KAAK,WAAW,CAAA;AAAA;AACzC,EAEA,MAAM,YACJ,CAAA,GAAA,EACA,WACmB,EAAA;AACnB,IAAA,IAAA,CAAK,eAAe,GAAG,CAAA;AACvB,IAAA,MAAM,GAAM,GAAA,MAAM,eAAgB,CAAA,IAAA,CAAK,SAAS,QAAQ,CAAA;AACxD,IAAO,OAAA,eAAA,CAAgB,KAAK,WAAW,CAAA;AAAA;AACzC,EAMA,MAAM,KACJ,CAAA,GAAA,EACA,WACY,EAAA;AACZ,IAAA,IAAA,CAAK,eAAe,GAAG,CAAA;AACvB,IAAA,MAAM,GAAM,GAAA,MAAM,gBAAiB,CAAA,IAAA,CAAK,SAAS,KAAK,CAAA;AAEtD,IAAO,OAAA,eAAA;AAAA,MACL,GAAA;AAAA,MACA,WAAA,IAAgB,OAAO,GAAA,KAAQ,SAAa,IAAA;AAAA,KAC9C;AAAA;AACF,EAEA,MAAM,OAA+C,GAAA;AACnD,IAAA,MAAM,GAAM,GAAA,MAAM,YAAa,CAAA,IAAA,CAAK,OAAO,CAAA;AAE3C,IAAA,OAAO,gBAAgB,GAAG,CAAA;AAAA;AAC5B,EAUA,MAAM,MACJ,CAAA,GAAA,EACA,WACY,EAAA;AACZ,IAAA,MAAM,EAAE,SAAU,EAAA,GAAI,MAAM,UAAA,CAAkC,KAAK,OAAO,CAAA;AAE1E,IAAM,MAAA,QAAA,GAAWA,mBAAmB,CAAA,IAAA,CAAK,OAAO,CAAA;AAChD,IAAA,IAAI,UAAqB,GAAA,GAAA;AACzB,IAAA,IAAI,cAAsB,QAAS,CAAA,WAAA;AACnC,IAAA,IAAI,cAAsB,QAAS,CAAA,WAAA;AAEnC,IAAI,IAAA,OAAO,QAAQ,QAAU,EAAA;AAC3B,MAAA,IAAI,WAAW,GAAK,EAAA;AAClB,QAAA,UAAA,GAAa,GAAI,CAAA,KAAA;AAAA;AAGnB,MAAA,IAAI,iBAAiB,GAAK,EAAA;AACxB,QAAc,WAAA,GAAA,GAAA,CAAI,WAAc,GAAA,GAAA,CAAI,WAAc,GAAA,EAAA;AAAA;AAEpD,MAAA,IAAI,iBAAiB,GAAK,EAAA;AACxB,QAAc,WAAA,GAAA,GAAA,CAAI,WAAc,GAAA,GAAA,CAAI,WAAc,GAAA,EAAA;AAAA;AACpD;AAGF,IAAA,IAAA,CAAK,QAAQ,OAAQ,CAAA,GAAA;AAAA,MACnB,cAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,MAAM,MAAM,WAAA;AAAA,MAChB,IAAK,CAAA,OAAA;AAAA,MACL,MAAA;AAAA,MACA,IAAI,eAAgB,CAAA;AAAA,QAClB,UAAA;AAAA,QACA,SAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA,OACD,EAAE,QAAS;AAAA,KACd;AACA,IAAO,OAAA,eAAA,CAAgB,KAAK,WAAW,CAAA;AAAA;AACzC,EAEA,MAAM,YACJ,CAAA,GAAA,EACA,WACY,EAAA;AACZ,IAAA,IAAI,CAAC,GAAK,EAAA;AACR,MAAM,MAAA,IAAI,MAAM,wCAAwC,CAAA;AAAA;AAE1D,IAAM,MAAA,EAAE,UAAY,EAAA,KAAA,EAAU,GAAA,GAAA;AAC9B,IAAM,MAAA,QAAA,GAAWA,mBAAmB,CAAA,IAAA,CAAK,OAAO,CAAA;AAChD,IAAM,MAAA,WAAA,GAAc,MAAO,CAAA,QAAA,CAAS,WAAW,CAAA;AAE/C,IAAA,MAAM,MAAM,MAAM,WAAA;AAAA,MAChB,IAAK,CAAA,OAAA;AAAA,MACL,KAAA;AAAA,MACA,IAAI,eAAgB,CAAA;AAAA,QAClB,UAAA;AAAA,QACA,KAAA;AAAA,QACA;AAAA,OACD,EAAE,QAAS;AAAA,KACd;AACA,IAAO,OAAA,eAAA,CAAgB,KAAK,WAAW,CAAA;AAAA;AACzC,EAEA,MAAM,aAA2B,GAA0C,EAAA;AACzE,IAAA,IAAI,EAAK,GAAA,EAAA;AACT,IAAI,IAAA,OAAO,QAAQ,QAAU,EAAA;AAC3B,MAAA,EAAA,GAAK,GAAI,CAAA,EAAA;AAAA,KACJ,MAAA;AACL,MAAK,EAAA,GAAA,GAAA;AAAA;AAGP,IAAA,IAAI,CAAC,EAAI,EAAA;AACP,MAAM,MAAA,IAAI,MAAM,2BAA2B,CAAA;AAAA;AAG7C,IAAA,MAAM,MAAM,MAAM,WAAA,CAAY,IAAK,CAAA,OAAA,EAAS,UAAU,EAAE,CAAA;AACxD,IAAO,OAAA,eAAA,CAAgB,KAAK,IAAI,CAAA;AAAA;AAClC,EAEA,eAAe,GAA8C,EAAA;AAC3D,IAAI,IAAA,OAAO,QAAQ,QAAU,EAAA;AAC3B,MAAA,IAAI,cAAc,GAAK,EAAA;AACrB,QAAK,IAAA,CAAA,OAAA,CAAQ,WAAW,GAAI,CAAA,QAAA;AAAA;AAE9B,MAAA,IAAI,YAAY,GAAK,EAAA;AACnB,QAAK,IAAA,CAAA,OAAA,CAAQ,WAAW,GAAI,CAAA,QAAA;AAAA;AAC9B;AACF;AAEJ,CAAA;AAEA,eAAe,eAAA,CAAgB,KAAe,WAAuB,EAAA;AACnE,EAAA,IAAI,WAAa,EAAA;AACf,IAAO,OAAA,GAAA;AAAA;AAET,EAAI,IAAA;AACF,IAAA,OAAO,MAAM,GAAA,EAAK,KAAM,EAAA,CAAE,IAAK,EAAA;AAAA,GACzB,CAAA,MAAA;AACN,IAAO,OAAA,GAAA;AAAA;AAEX;AAEO,SAASA,oBAAmB,MAAgB,EAAA;AACjD,EAAA,IAAI,EAAK,GAAA,IAAA;AACT,EAAA,IAAI,QAAW,GAAA,IAAA;AACf,EAAM,MAAA,UAAA,GAAa,aAAc,CAAA,MAAA,CAAO,OAAO,CAAA;AAC/C,EAAA,IAAI,UAAY,EAAA;AACd,IAAA,MAAM,GAAG,KAAK,CAAI,GAAA,UAAA,CAAW,MAAM,GAAG,CAAA;AACtC,IAAA,EAAA,GAAK,mBAAmB,KAAK,CAAA;AAC7B,IAAA,IAAI,KAAO,EAAA;AACT,MAAW,QAAA,GAAA,CAAA,EAAG,IAAI,GAAI,CAAA,EAAE,EAAE,MAAM,CAAA,EAC9B,MAAO,CAAA,WACT,CAAgC,EAAA,4BAAA,cAAA,OAAA;AAAA,QAC9B,YAAA;AAAA,QACA,MAAA,CAAO,OAAO,QAAQ;AAAA,OACvB,CAAA,CAAA;AAAA;AACH;AAEF,EAAA,OAAO,EAAE,WAAA,EAAa,EAAI,EAAA,WAAA,EAAa,QAAS,EAAA;AAClD;;;AChVO,SAAS,oBAAoB,MAAgC,EAAA;AAClE,EAAA,MAAMV,IAAM,GAAA,MAAA,CAAO,MAAO,CAAA,MAAA,EAAQ,MAAM,CAAA;AACxC,EAAA,MAAMI,KAAO,GAAA,MAAA,CAAO,MAAO,CAAA,MAAA,EAAQ,MAAM,CAAA;AACzC,EAAA,MAAMC,OAAS,GAAA,OAAA,CAAQ,MAAO,CAAA,MAAA,EAAQ,MAAM,CAAA;AAC5C,EAAA,MAAMJ,IAAM,GAAA,KAAA,CAAM,MAAO,CAAA,MAAA,EAAQ,MAAM,CAAA;AACvC,EAAO,OAAA;AAAA,IACL,GAAA,EAAK,OAAO,GAAQ,KAAA;AAClB,MAAM,MAAA,QAAA,GAAW,MAAMD,IAAAA,CAAI,GAAG,CAAA;AAC9B,MAAM,MAAA,aAAA,GAAgB,YAAa,CAAA,QAAA,EAAU,MAAM,CAAA;AACnD,MAAA,OAAO,EAAE,QAAU,EAAA,IAAA,EAAM,IAAI,MAAA,CAAO,aAAa,CAAE,EAAA;AAAA,KACrD;AAAA,IACA,IAAA,EAAM,OAAO,GAAQ,KAAA;AACnB,MAAM,MAAA,QAAA,GAAW,MAAMI,KAAAA,CAAK,GAAG,CAAA;AAC/B,MAAM,MAAA,aAAA,GAAgB,YAAa,CAAA,QAAA,EAAU,MAAM,CAAA;AACnD,MAAA,OAAO,EAAE,QAAU,EAAA,IAAA,EAAM,IAAI,MAAA,CAAO,aAAa,CAAE,EAAA;AAAA,KACrD;AAAA,IACA,MAAA,EAAQ,OAAO,GAAQ,KAAA;AACrB,MAAM,MAAA,QAAA,GAAW,MAAMC,OAAAA,CAAO,GAAG,CAAA;AACjC,MAAM,MAAA,aAAA,GAAgB,YAAa,CAAA,QAAA,EAAU,MAAM,CAAA;AACnD,MAAA,OAAO,EAAE,QAAU,EAAA,IAAA,EAAM,IAAI,MAAA,CAAO,aAAa,CAAE,EAAA;AAAA,KACrD;AAAA,IACA,GAAA,EAAK,OAAO,GAAQ,KAAA;AAClB,MAAM,MAAA,QAAA,GAAW,MAAMJ,IAAAA,CAAI,GAAG,CAAA;AAC9B,MAAM,MAAA,aAAA,GAAgB,YAAa,CAAA,QAAA,EAAU,MAAM,CAAA;AACnD,MAAA,OAAO,EAAE,QAAU,EAAA,IAAA,EAAM,IAAI,MAAA,CAAO,aAAa,CAAE,EAAA;AAAA;AACrD,GACF;AACF;AAEO,SAAS,YAAA,CACd,UACA,MACY,EAAA;AACZ,EAAA,IAAI,MAAS,GAAA,uBAAA;AACb,EAAA,IAAI,OAA0B,GAAA,IAAA;AAE9B,EAAI,IAAA,QAAA,EAAU,WAAW,GAAK,EAAA;AAC5B,IAAA,MAAM,QAAW,GAAA,QAAA,CAAS,OAAQ,CAAA,GAAA,CAAI,UAAU,CAAA;AAChD,IAAA,IAAI,QAAU,EAAA;AACZ,MAAM,MAAA,WAAA,GAAc,IAAI,GAAA,CAAI,QAAQ,CAAA;AACpC,MAAA,MAAA,GAAS,WAAY,CAAA,MAAA;AAAA;AACvB;AAGF,EAAA,MAAM,aAAuB,EAAC;AAG9B,EAAA,IAAI,UAAU,OAAS,EAAA;AACrB,IAAA,KAAA,MAAW,CAACC,KAAAA,EAAK,KAAK,CAAA,IAAK,SAAS,OAAS,EAAA;AAC3C,MAAIA,IAAAA,KAAAA,CAAI,WAAY,EAAA,KAAM,YAAc,EAAA;AACtC,QAAA,UAAA,CAAW,KAAK,KAAK,CAAA;AAAA;AACvB;AACF;AAEF,EAAI,IAAA,UAAA,CAAW,SAAS,CAAG,EAAA;AACzB,IAAA,MAAM,YAAe,GAAA,UAAA,CAClB,GAAI,CAAA,CAAC,SAAc,KAAA,SAAA,CAAU,KAAM,CAAA,GAAG,CAAE,CAAA,CAAC,CAAC,CAAA,CAC1C,KAAK,IAAI,CAAA;AAEZ,IAAA,OAAA,GAAU,IAAI,OAAA,CAAQ,EAAE,MAAA,EAAQ,cAAc,CAAA;AAAA;AAGhD,EAAO,OAAA;AAAA,IACL,GAAG,MAAA;AAAA,IACH,MAAA;AAAA,IACA,SAAS,OAAW,IAAA;AAAA,GACtB;AACF;;;AC/EO,SAAS,oBAAoB,QAAkB,EAAA;AACpD,EAAA,OAAO,eAAe,eAAA,CACpB,MACA,EAAA,KAAA,EACA,MACA,EAAA;AACA,IAAA,IAAI,OAAO,UAAY,EAAA;AACrB,MAAWS,KAAAA,MAAAA,OAAAA,IAAU,OAAO,UAAY,EAAA;AACtC,QAAM,MAAA,GAAA,GAAM,MAAMA,OAAAA,CAAO,QAAQ,CAAA;AACjC,QAAA,IAAI,IAAI,SAAW,EAAA;AACjB,UAAA,MAAM,QAAW,GAAA,MAAM,GAAI,CAAA,SAAA,CAAU,MAAM,OAAO,CAAA;AAClD,UAAA,IAAI,UAAU,OAAS,EAAA;AACrB,YAAA,MAAM,UAAa,GAAA,IAAI,OAAQ,CAAA,QAAA,CAAS,OAAO,CAAA;AAC/C,YAAM,MAAA,MAAA,GAAS,UAAW,CAAA,GAAA,CAAI,QAAQ,CAAA;AACtC,YAAA,IAAI,MAAQ,EAAA;AACV,cAAC,MAAO,CAAA,OAAA,CAAoB,GAAI,CAAA,QAAA,EAAU,MAAM,CAAA;AAChD,cAAA,MAAA,CAAO,MAAO,CAAA,KAAA;AAAA,gBACZ,CAAa,UAAA,EAAA,GAAA,CAAI,EAAMA,IAAAA,OAAAA,CAAO,IAAI,CAAA,gBAAA;AAAA,eACpC;AAAA;AACF;AACF;AAEF,QAAA,MAAA,CAAO,OAAO,KAAM,CAAA,CAAA,UAAA,EAAa,IAAI,EAAMA,IAAAA,OAAAA,CAAO,IAAI,CAAgB,cAAA,CAAA,CAAA;AAAA;AACxE;AACF,GACF;AACF;AAEO,SAAS,qBAAqB,QAAkB,EAAA;AACrD,EAAO,OAAA;AAAA,IACL,eAAA,EAAiB,oBAAoB,QAAQ;AAAA,GAC/C;AACF;;;ACjBO,IAAM,SAAN,MAAa;AAAA,EAClB,KAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EAOA,MAAA;AAAA,EAMA,QAAA;AAAA,EACA,QAAA;AAAA,EAEA,YAAY,MAAqB,EAAA;AAC/B,IAAK,IAAA,CAAA,OAAA,GAAU,IAAI,MAAO,CAAA;AAAA,MACxB,GAAG,MAAA;AAAA,MACH,YAAA,EAAc,qBAAqB,IAAI;AAAA,KACxC,CAAA;AAED,IAAA,aAAA,CAAc,CAAC,QAAa,KAAA;AAC1B,MAAI,IAAA,QAAA,KAAa,IAAK,CAAA,OAAA,CAAQ,QAAU,EAAA;AACtC,QAAA,IAAA,CAAK,QAAQ,QAAW,GAAA,QAAA;AACxB,QAAA,IAAA,CAAK,MAAO,EAAA;AAAA;AACd,KACD,CAAA;AAED,IAAA,WAAA,CAAY,CAAC,MAAW,KAAA;AACtB,MAAI,IAAA,MAAA,KAAW,IAAK,CAAA,OAAA,CAAQ,MAAQ,EAAA;AAClC,QAAA,IAAA,CAAK,QAAQ,MAAS,GAAA,MAAA;AACtB,QAAA,IAAA,CAAK,MAAO,EAAA;AAAA;AACd,KACD,CAAA;AAED,IAAA,YAAA,CAAa,CAAC,OAAY,KAAA;AACxB,MAAA,IAAA,CAAK,WAAW,OAAO,CAAA;AACvB,MAAA,IAAA,CAAK,MAAO,EAAA;AAAA,KACb,CAAA;AAED,IAAA,IAAA,CAAK,SAAY,GAAA;AAAA,MACf,GAAG,KAAK,OAAQ,CAAA,QAAA;AAAA,MAChB,WAAA,EAAa,mBAAoB,CAAA,IAAA,CAAK,OAAO;AAAA,KAC/C;AAEA,IAAK,IAAA,CAAA,MAAA,GAAS,KAAK,OAAQ,CAAA,KAAA;AAE3B,IAAA,IAAA,CAAK,QAAQ,QAAW,GAAA,WAAA,CAAY,EAAE,MAAQ,EAAA,IAAA,CAAK,SAAS,CAAA;AAC5D,IAAA,IAAA,CAAK,QAAW,GAAA,IAAI,SAAU,CAAA,IAAA,CAAK,OAAO,CAAA;AAG1C,IAAA,IAAA,CAAK,eAAe,MAAM,CAAA;AAE1B,IAAA,IAAA,CAAK,KAAQ,GAAA,IAAI,KAAM,CAAA,IAAA,CAAK,OAAO,CAAA;AACnC,IAAA,IAAA,CAAK,OAAU,GAAA,IAAI,OAAQ,CAAA,IAAA,CAAK,OAAO,CAAA;AACvC,IAAA,IAAA,CAAK,IAAO,GAAA,IAAI,IAAK,CAAA,IAAA,CAAK,OAAO,CAAA;AAAA;AACnC,EAEA,IAAI,EAAiD,GAAA;AACnD,IAAA,MAAM,IAAO,GAAA,IAAA,CAAK,QAAS,CAAA,aAAA,CAAc,KAAK,OAAO,CAAA;AAErD,IAAO,OAAA,MAAA,CAAO,OAAO,IAAM,EAAA;AAAA,MACzB,kBAAkB,MAAM;AACtB,QAAK,IAAA,CAAA,QAAA,CAAS,KAAM,CAAA,IAAA,CAAK,OAAO,CAAA;AAAA;AAClC,KACD,CAAA;AAAA;AACH;AAAA;AAAA;AAAA,EAMA,WAAA,CACE,QACA,GACQ,EAAA;AACR,IAAA,MAAM,UAAU,EAAE,GAAG,IAAK,CAAA,OAAA,EAAS,GAAG,MAAO,EAAA;AAG7C,IAAM,MAAA,aAAA,GAAgB,IAAI,MAAA,CAAO,OAAO,CAAA;AACxC,IAAK,IAAA,CAAA,OAAA,GAAU,IAAI,MAAA,CAAO,aAAa,CAAA;AAEvC,IAAK,IAAA,CAAA,OAAA,CAAQ,WAAW,MAAO,CAAA,QAAA;AAC/B,IAAK,IAAA,CAAA,OAAA,CAAQ,SAAS,MAAO,CAAA,MAAA;AAE7B,IAAA,IAAI,GAAK,EAAA;AACP,MAAA,IAAA,CAAK,WAAW,GAAG,CAAA;AAAA;AAGrB,IAAA,IAAA,CAAK,MAAO,EAAA;AAEZ,IAAO,OAAA,IAAA;AAAA;AACT,EACA,QAAW,GAAA;AACT,IAAA,OAAO,IAAK,CAAA,MAAA;AAAA;AACd,EAEA,IAAI,QAAW,GAAA;AACb,IAAA,OAAO,IAAK,CAAA,SAAA;AAAA;AACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WACE,GAMA,EAAA;AACA,IAAI,IAAA;AACF,MAAA,IAAI,eAAe,OAAS,EAAA;AAC1B,QAAA,IAAA,CAAK,eAAe,GAAG,CAAA;AACvB,QAAA,IAAA,CAAK,MAAO,EAAA;AACZ,QAAA;AAAA,OACF,MAAA,IAAW,eAAe,OAAS,EAAA;AACjC,QAAA,IAAA,CAAK,cAAe,CAAA,IAAI,OAAQ,CAAA,GAAA,CAAI,OAAO,CAAC,CAAA;AAC5C,QAAA,IAAA,CAAK,MAAO,EAAA;AAEZ,QAAA;AAAA;AACF,KACM,CAAA,MAAA;AAAA;AAMR,IAAA,IAAI,EAAK,GAAA,KAAA;AACT,IAAA,IAAI,GAAO,IAAA,OAAO,GAAQ,KAAA,QAAA,IAAY,cAAc,GAAK,EAAA;AACvD,MAAK,EAAA,GAAA,IAAA;AACL,MAAK,IAAA,CAAA,OAAA,CAAQ,WAAW,GAAI,CAAA,QAAA;AAAA;AAE9B,IAAA,IAAI,GAAO,IAAA,OAAO,GAAQ,KAAA,QAAA,IAAY,YAAY,GAAK,EAAA;AACrD,MAAK,EAAA,GAAA,IAAA;AACL,MAAK,IAAA,CAAA,OAAA,CAAQ,SAAS,GAAI,CAAA,MAAA;AAAA;AAG5B,IAAA,IAAI,EAAI,EAAA;AACN,MAAA;AAAA;AAQF,IAAI,IAAA,OAAO,QAAQ,QAAU,EAAA;AAC3B,MAAM,MAAA,OAAA,GAAU,IAAI,OAAA,CAAQ,GAA6B,CAAA;AACzD,MAAA,IAAI,OAAS,EAAA;AACX,QAAA,IAAA,CAAK,eAAe,OAAO,CAAA;AAC3B,QAAA,IAAA,CAAK,MAAO,EAAA;AAEZ,QAAA;AAAA;AACF;AAEF,IAAA,MAAM,EAAE,IAAK,EAAA,GAAI,MAAO,CAAA,IAAA,CAAK,SAAS,OAAO,CAAA;AAE7C,IAAA,IAAI,IAAM,EAAA;AACR,MAAA,IAAA;AAAA,QACE;AAAA,OACF;AAAA;AACF;AACF,EAEA,UAAa,GAAA;AACX,IAAO,OAAA;AAAA,MACL,SAAS,IAAK,CAAA,QAAA;AAAA,MACd,MAAA,EAAQ,KAAK,OAAQ,CAAA,MAAA;AAAA,MACrB,QAAA,EAAU,KAAK,OAAQ,CAAA;AAAA,KACzB;AAAA;AACF;AAAA;AAAA;AAAA;AAAA,EAMA,eACE,MACA,EAAA;AACA,IAAA,MAAM,UAA8B,EAAC;AACrC,IAAI,IAAA,OAAA;AACJ,IAAK,IAAA,CAAA,QAAA,GAAW,IAAI,OAAQ,EAAA;AAE5B,IAAA,IAAI,kBAAkB,OAAS,EAAA;AAC7B,MAAU,OAAA,GAAA,MAAA;AAAA,KACZ,MAAA,IAAW,QAAQ,OAAS,EAAA;AAE1B,MAAA,OAAA,GAAU,MAAQ,EAAA,OAAA;AAClB,MAAI,IAAA,MAAA,IAAU,OAAO,MAAQ,EAAA;AAE3B,QAAA,IAAA,CAAK,QAAS,CAAA,GAAA,CAAI,aAAe,EAAA,MAAA,CAAO,MAAM,CAAA;AAAA;AAEhD,MAAI,IAAA,MAAA,IAAU,MAAO,CAAA,aAAA,IAAiB,IAAM,EAAA;AAC1C,QAAA,IAAA,CAAK,SAAS,GAAI,CAAA,qBAAA,EAAuB,MAAO,CAAA,MAAA,CAAO,aAAa,CAAC,CAAA;AAAA;AACvE;AAGF,IAAA,IAAI,mBAAmB,OAAS,EAAA;AAC9B,MAAQ,OAAA,CAAA,OAAA,CAAQ,CAAC,KAAA,EAAOT,KAAQ,KAAA;AAC9B,QAAA,OAAA,CAAQ,KAAK,CAACA,KAAAA,CAAI,WAAY,EAAA,EAAG,KAAK,CAAC,CAAA;AAAA,OACxC,CAAA;AAAA,KACI,MAAA;AACL,MAAW,KAAA,MAAA,CAACA,OAAK,KAAK,CAAA,IAAK,OAAO,OAAQ,CAAA,OAAA,IAAW,EAAE,CAAG,EAAA;AACxD,QAAA,OAAA,CAAQ,KAAK,CAACA,KAAAA,CAAI,WAAY,EAAA,EAAG,KAAK,CAAC,CAAA;AAAA;AACzC;AAGF,IAAA,MAAM,SAAiC,EAAC;AAGxC,IAAA,IAAA,CAAK,QAAQ,QAAW,GAAA,iBAAA,CAAkB,IAAK,CAAA,QAAA,EAAU,KAAK,OAAO,CAAA;AAErE,IAAA,IAAA,CAAK,QAAU,EAAA,OAAA,CAAQ,CAAC,KAAA,EAAOA,KAAQ,KAAA;AAErC,MAAIA,IAAAA,KAAAA,CAAI,WAAY,EAAA,KAAM,QAAU,EAAA;AAClC,QAAOA,MAAAA,CAAAA,KAAAA,CAAI,WAAY,EAAC,CAAI,GAAA,KAAA;AAAA;AAC9B,KACD,CAAA;AAED,IAAA,KAAA,MAAW,CAACA,KAAAA,EAAK,KAAK,CAAA,IAAK,OAAS,EAAA;AAClC,MAAA,MAAA,CAAOA,KAAG,CAAI,GAAA,KAAA;AAAA;AAGhB,IAAA,KAAA,MAAW,CAACA,KAAK,EAAA,KAAK,KAAK,MAAO,CAAA,OAAA,CAAQ,MAAM,CAAG,EAAA;AACjD,MAAK,IAAA,CAAA,QAAA,CAAS,GAAIA,CAAAA,KAAAA,EAAK,KAAK,CAAA;AAAA;AAG9B,IAAK,IAAA,CAAA,OAAA,CAAQ,UAAU,IAAK,CAAA,QAAA;AAAA;AAC9B;AAAA;AAAA;AAAA,EAKA,SAAS,MAAM;AACb,IAAA,IAAA,CAAK,OAAQ,CAAA,OAAA,GAAU,IAAK,CAAA,QAAA,IAAY,IAAI,OAAQ,EAAA;AACpD,IAAA,IAAA,CAAK,KAAQ,GAAA,IAAI,KAAM,CAAA,IAAA,CAAK,OAAO,CAAA;AACnC,IAAA,IAAA,CAAK,OAAU,GAAA,IAAI,OAAQ,CAAA,IAAA,CAAK,OAAO,CAAA;AACvC,IAAA,IAAA,CAAK,IAAO,GAAA,IAAI,IAAK,CAAA,IAAA,CAAK,OAAO,CAAA;AAAA,GACnC;AACF;AAEA,IAAI,MAAA;AACG,SAAS,OAAO,MAA6B,EAAA;AAClD,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAS,MAAA,GAAA,IAAI,OAAO,MAAM,CAAA;AAAA;AAG5B,EAAO,OAAA,MAAA;AACT","file":"index.js","sourcesContent":["import { PoolClient, PoolConfig } from 'pg';\n\nimport { Routes } from './api/types';\nimport { Server } from './Server';\n\nexport type Opts = {\n basePath?: string;\n fetch?: typeof fetch;\n};\nexport interface ExtensionResult {\n id?: string;\n [key: string]: unknown;\n // Called before request is handled\n onRequest?: (req: Request) => void | Promise<void | RequestInit>;\n\n // Called after response is generated\n onResponse?: (res: Response) => void | Promise<void>;\n}\n\nexport type Extension = (\n instance: Server\n) => ExtensionResult | Promise<ExtensionResult>;\n\nexport type NilePoolConfig = PoolConfig & { afterCreate?: AfterCreate };\nexport type LoggerType = {\n info: (args: unknown | unknown[]) => void;\n warn: (args: unknown | unknown[]) => void;\n error: (args: unknown | unknown[]) => void;\n debug: (args: unknown | unknown[]) => void;\n};\nexport type NileConfig = {\n /**\n * The specific database id. Either passed in or figured out by NILEDB_API_URL\n * process.env.NILEDB_ID\n */\n databaseId?: string;\n\n /**\n * The user UUID to the database\n * process.env.NILEDB_USER\n */\n user?: string;\n\n /**\n * The password UUID to the database\n * process.env.NILEDB_PASSWORD\n */\n password?: string;\n\n /**\n * The name of the database. Automatically obtained from NILEDB_POSTGRES_URL\n * process.env.NILEDB_NAME\n */\n databaseName?: string;\n\n /**\n * A tenant id. Scopes requests to a specific tenant, both API and DB\n * process.env.NILEDB_TENANT\n */\n tenantId?: string | null | undefined;\n\n /**\n * A user id. Possibly not the logged in user, used for setting database context (nile.user_id)\n * Generally speaking, this wouldn't be used for authentication, and in some cases simply won't do anything on some endpoints\n */\n userId?: string | null | undefined;\n /**\n * Shows a bunch of logging on the server side to see what's being done between the sdk and nile-auth\n */\n debug?: boolean;\n\n /**\n * DB configuration overrides. Environment variables are the way to go, but maybe you need something more\n */\n db?: NilePoolConfig;\n\n /**\n * Some kind of logger if you want to send to an external service\n */\n logger?: LoggerType;\n\n /**\n * The configuration value that maps to `NILEDB_API_URL` - its going to be nile-auth (or similar service)\n */\n apiUrl?: string | undefined;\n\n /**\n * Ignore client callbackUrls by setting this.\n * You can force the callback URL server side to be sure nile-auth redirects to whatever location.\n */\n callbackUrl?: string | undefined;\n\n /**\n * Need to override some routes? Change it here\n */\n routes?: Partial<Routes>;\n\n /**\n * don't like the default `/api`? change it here\n */\n routePrefix?: string | undefined;\n\n /**\n * In some cases, you may want to force secure cookies.\n * The SDK handles this for you, but might be necessary in some firewall / internal cases\n * Defaults to true if you're in production\n */\n secureCookies?: boolean;\n\n /**\n * The origin for the requests.\n * Allows the setting of the callback origin to a random FE\n * eg FE localhost:3001 -> BE: localhost:5432 would set to localhost:3001 to be sure nile-auth uses that.\n * In full stack cases, will just be the `host` header of the incoming request, which is used by default\n * It is also important to set this when dealing with secure cookies. Calling via server side needs to know if TLS is being used so that nile-auth knows which cookies to be sent.\n */\n origin?: null | undefined | string;\n\n /**\n * Set the headers to use in API requests.\n * The `cookie` would be expected if you are setting this, else most calls will be unauthorized\n */\n headers?: null | Headers | Record<string, string>;\n /**\n * Functions to run at various points to make life easier\n */\n extensions?: Extension[];\n};\n\nexport type NileDb = NilePoolConfig & { tenantId?: string };\n\nexport type AfterCreate = (\n conn: PoolClient,\n done: (err: null | Error, conn: PoolClient) => void\n) => void;\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n// taken from ts lib dom\ninterface NileBody<R, B> {\n readonly body: ReadableStream<Uint8Array> | null | B;\n readonly bodyUsed: boolean;\n arrayBuffer(): Promise<ArrayBuffer>;\n blob(): Promise<Blob>;\n formData(): Promise<FormData>;\n json(): Promise<R>;\n text(): Promise<string>;\n}\n\ninterface NResponse<T> extends NileBody<T, any> {\n readonly headers: Headers;\n readonly ok: boolean;\n readonly redirected: boolean;\n readonly status: number;\n readonly statusText: string;\n readonly type: ResponseType;\n readonly url: string;\n clone(): Response;\n}\n\ninterface NRequest<T> extends NileBody<any, T> {\n /** Returns the cache mode associated with request, which is a string indicating how the request will interact with the browser's cache when fetching. */\n readonly cache: RequestCache;\n /** Returns the credentials mode associated with request, which is a string indicating whether credentials will be sent with the request always, never, or only when sent to a same-origin URL. */\n readonly credentials: RequestCredentials;\n /** Returns the kind of resource requested by request, e.g., \"document\" or \"script\". */\n readonly destination: RequestDestination;\n /** Returns a Headers object consisting of the headers associated with request. Note that headers added in the network layer by the user agent will not be accounted for in this object, e.g., the \"Host\" header. */\n readonly headers: Headers;\n /** Returns request's subresource integrity metadata, which is a cryptographic hash of the resource being fetched. Its value consists of multiple hashes separated by whitespace. [SRI] */\n readonly integrity: string;\n /** Returns a boolean indicating whether or not request can outlive the global in which it was created. */\n readonly keepalive: boolean;\n /** Returns request's HTTP method, which is \"GET\" by default. */\n readonly method: string;\n /** Returns the mode associated with request, which is a string indicating whether the request will use CORS, or will be restricted to same-origin URLs. */\n readonly mode: RequestMode;\n /** Returns the redirect mode associated with request, which is a string indicating how redirects for the request will be handled during fetching. A request will follow redirects by default. */\n readonly redirect: RequestRedirect;\n /** Returns the referrer of request. Its value can be a same-origin URL if explicitly set in init, the empty string to indicate no referrer, and \"about:client\" when defaulting to the global's default. This is used during fetching to determine the value of the `Referer` header of the request being made. */\n readonly referrer: string;\n /** Returns the referrer policy associated with request. This is used during fetching to compute the value of the request's referrer. */\n readonly referrerPolicy: ReferrerPolicy;\n /** Returns the signal associated with request, which is an AbortSignal object indicating whether or not request has been aborted, and its abort event handler. */\n readonly signal: AbortSignal;\n /** Returns the URL of request as a string. */\n readonly url: string;\n clone(): Request;\n}\n\nexport type NileRequest<T> = NRequest<T> | T;\n\nexport const APIErrorErrorCodeEnum = {\n InternalError: 'internal_error',\n BadRequest: 'bad_request',\n EntityNotFound: 'entity_not_found',\n DuplicateEntity: 'duplicate_entity',\n InvalidCredentials: 'invalid_credentials',\n UnknownOidcProvider: 'unknown_oidc_provider',\n ProviderAlreadyExists: 'provider_already_exists',\n ProviderConfigError: 'provider_config_error',\n ProviderMismatch: 'provider_mismatch',\n ProviderUpdateError: 'provider_update_error',\n SessionStateMissing: 'session_state_missing',\n SessionStateMismatch: 'session_state_mismatch',\n OidcCodeMissing: 'oidc_code_missing',\n} as const;\nexport type APIErrorErrorCodeEnum =\n (typeof APIErrorErrorCodeEnum)[keyof typeof APIErrorErrorCodeEnum];\n\nexport interface APIError {\n [key: string]: any | any;\n /**\n *\n * @type {string}\n * @memberof APIError\n */\n errorCode: APIErrorErrorCodeEnum;\n /**\n *\n * @type {string}\n * @memberof APIError\n */\n message: string;\n /**\n *\n * @type {number}\n * @memberof APIError\n */\n statusCode: number;\n}\n\nexport type NileResponse<T> = Promise<T | NResponse<T & APIError>>;\n","export interface CreateBasicUserRequest {\n email: string;\n password: string;\n name?: string;\n familyName?: string;\n givenName?: string;\n picture?: string;\n // create a tenant for the new user to an existing tenant\n newTenantName?: string;\n // add the new user to an existing tenant\n tenantId?: string;\n}\nexport interface CreateTenantUserRequest {\n email: string;\n password: string;\n name?: string;\n familyName?: string;\n givenName?: string;\n picture?: string;\n}\nexport const LoginUserResponseTokenTypeEnum = {\n AccessToken: 'ACCESS_TOKEN',\n RefreshToken: 'REFRESH_TOKEN',\n IdToken: 'ID_TOKEN',\n} as const;\nexport type LoginUserResponseTokenTypeEnum =\n (typeof LoginUserResponseTokenTypeEnum)[keyof typeof LoginUserResponseTokenTypeEnum];\n\nexport interface LoginUserResponseToken {\n jwt: string;\n maxAge: number;\n type: LoginUserResponseTokenTypeEnum;\n}\nexport interface LoginUserResponse {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n id: string;\n token: LoginUserResponseToken;\n}\nexport interface User {\n id: string;\n email: string;\n name?: string | null;\n familyName?: string | null;\n givenName?: string | null;\n picture?: string | null;\n created: string;\n updated?: string;\n emailVerified?: string | null;\n tenants: string[];\n}\n","import { Routes } from '../../types';\nimport { Config } from '../../../utils/Config';\n\nconst NILEDB_API_URL = process.env.NILEDB_API_URL;\nexport const DEFAULT_PREFIX = '/api';\n\nexport enum DefaultNileAuthRoutes {\n SIGNUP = '/signup',\n TENANTS = '/tenants',\n TENANT = '/tenants/{tenantId}',\n USER_TENANTS = '/users/{userId}/tenants',\n TENANT_USER = '/tenants/{tenantId}/users/{userId}',\n TENANT_USERS = '/tenants/{tenantId}/users',\n USER = '/users/{userId}',\n USERS = '/users',\n ME = '/me',\n INVITES = '/tenants/{tenantId}/invites',\n INVITE = '/tenants/{tenantId}/invite',\n}\n\nexport enum NileAuthRoutes {\n CSRF = '/auth/csrf',\n PROVIDERS = '/auth/providers',\n SESSION = '/auth/session',\n SIGNIN = '/auth/signin',\n CALLBACK = '/auth/callback',\n SIGNOUT = '/auth/signout',\n PASSWORD_RESET = '/auth/reset-password',\n VERIFY_EMAIL = '/auth/verify-email',\n}\n\n// these map to the developer app\nexport const appRoutes = (prefix = DEFAULT_PREFIX): Routes => ({\n SIGNIN: `${prefix}${NileAuthRoutes.SIGNIN}`,\n PROVIDERS: `${prefix}${NileAuthRoutes.PROVIDERS}`,\n SESSION: `${prefix}${NileAuthRoutes.SESSION}`,\n CSRF: `${prefix}${NileAuthRoutes.CSRF}`,\n CALLBACK: `${prefix}${NileAuthRoutes.CALLBACK}`,\n SIGNOUT: `${prefix}${NileAuthRoutes.SIGNOUT}`,\n ERROR: `${prefix}/auth/error`,\n VERIFY_REQUEST: `${prefix}/auth/verify-request`,\n VERIFY_EMAIL: `${prefix}${NileAuthRoutes.VERIFY_EMAIL}`,\n PASSWORD_RESET: `${prefix}${NileAuthRoutes.PASSWORD_RESET}`,\n ME: `${prefix}${DefaultNileAuthRoutes.ME}`,\n USERS: `${prefix}${DefaultNileAuthRoutes.USERS}`,\n USER_TENANTS: `${prefix}${DefaultNileAuthRoutes.USER_TENANTS}`,\n TENANTS: `${prefix}${DefaultNileAuthRoutes.TENANTS}`,\n TENANT: `${prefix}${DefaultNileAuthRoutes.TENANT}`,\n TENANT_USER: `${prefix}${DefaultNileAuthRoutes.TENANT_USER}`,\n TENANT_USERS: `${prefix}${DefaultNileAuthRoutes.TENANT_USERS}`,\n SIGNUP: `${prefix}${DefaultNileAuthRoutes.SIGNUP}`,\n INVITES: `${prefix}${DefaultNileAuthRoutes.INVITES}`,\n INVITE: `${prefix}${DefaultNileAuthRoutes.INVITE}`,\n LOG: `${prefix}/_log`,\n});\n\n// these map to nile-auth\nexport const apiRoutes = (config: Config) => ({\n ME: makeRestUrl(config, '/me'),\n USERS: (qp: { tenantId?: null | string; newTenantName?: null | string }) =>\n makeRestUrl(config, '/users', qp),\n USER: (userId: string) => makeRestUrl(config, `/users/${userId}`),\n TENANTS: makeRestUrl(config, '/tenants'),\n TENANT: (tenantId: string) => makeRestUrl(config, `/tenants/${tenantId}`),\n SIGNUP: makeRestUrl(config, '/signup'),\n TENANT_USERS: (tenantId: string) =>\n makeRestUrl(config, `/tenants/${tenantId}/users`),\n INVITES: (tenantId: string) =>\n makeRestUrl(config, `/tenants/${tenantId}/invites`),\n INVITE: (tenantId: string) =>\n makeRestUrl(config, `/tenants/${tenantId}/invite`),\n TENANT_USER: makeRestUrl(\n config,\n `/tenants/${config.tenantId}/users/${config.userId}`\n ),\n USER_TENANTS: (userId: string) =>\n makeRestUrl(config, `/users/${userId}/tenants`),\n});\ntype ApiRouteKeys = keyof typeof apiRoutes;\nexport type ApiRoutePaths = (typeof apiRoutes)[ApiRouteKeys];\n\n// these map to nile-auth\nexport const proxyRoutes = (config: Config) => ({\n SIGNIN: makeRestUrl(config, NileAuthRoutes.SIGNIN),\n PROVIDERS: makeRestUrl(config, NileAuthRoutes.PROVIDERS),\n SESSION: makeRestUrl(config, NileAuthRoutes.SESSION),\n CSRF: makeRestUrl(config, NileAuthRoutes.CSRF),\n CALLBACK: makeRestUrl(config, NileAuthRoutes.CALLBACK),\n SIGNOUT: makeRestUrl(config, NileAuthRoutes.SIGNOUT),\n ERROR: makeRestUrl(config, '/auth/error'),\n VERIFY_REQUEST: makeRestUrl(config, '/auth/verify-request'),\n PASSWORD_RESET: makeRestUrl(config, NileAuthRoutes.PASSWORD_RESET),\n VERIFY_EMAIL: makeRestUrl(config, NileAuthRoutes.VERIFY_EMAIL),\n});\ntype ProxyKeys = keyof typeof proxyRoutes;\nexport type ProxyPaths = (typeof proxyRoutes)[ProxyKeys];\n\nfunction filterNullUndefined(\n obj?: Record<string, string | null>\n): { [k: string]: string | null } | undefined {\n if (!obj) {\n return undefined;\n }\n return Object.fromEntries(\n Object.entries(obj).filter(\n ([, value]) => value !== null && value !== undefined\n )\n );\n}\n\nexport function makeRestUrl(\n config: Config,\n path: string,\n qp?: Record<string, string | null>\n) {\n const url = config.apiUrl || NILEDB_API_URL;\n if (!url) {\n throw new Error(\n 'An API url is required. Set it via NILEDB_API_URL. Was auto configuration run?'\n );\n }\n const params = new URLSearchParams(\n filterNullUndefined(qp) as Record<string, string>\n );\n const strParams = params.toString();\n return `${[url, path.substring(1, path.length)].join('/')}${\n strParams ? `?${strParams}` : ''\n }`;\n}\n\nexport function urlMatches(requestUrl: string, route: string) {\n const url = new URL(requestUrl);\n return url.pathname.startsWith(route);\n}\nexport function prefixAppRoute(config: Config) {\n return `${config.serverOrigin}${config.routePrefix}`;\n}\n\nexport function isUUID(value: string | null | undefined) {\n if (!value) {\n return false;\n }\n // is any UUID\n const regex =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5|7][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;\n\n return regex.test(value);\n}\n","/* eslint-disable no-console */\nimport { Routes } from '../api/types';\nimport { urlMatches } from '../api/utils/routes';\nimport { NileConfig } from '../types';\n\nimport { Config } from './Config';\n\nconst red = '\\x1b[31m';\nconst yellow = '\\x1b[38;2;255;255;0m';\nconst purple = '\\x1b[38;2;200;160;255m';\nconst orange = '\\x1b[38;2;255;165;0m';\nconst reset = '\\x1b[0m';\n\nconst baseLogger = (config: void | NileConfig, ...params: unknown[]) => ({\n info(message: string | unknown, meta?: Record<string, unknown>) {\n if (config?.debug) {\n console.info(\n `${orange}[niledb]${reset}${purple}[DEBUG]${reset}${params.join(\n ''\n )}${reset} ${message}`,\n meta ? `${JSON.stringify(meta)}` : ''\n );\n }\n },\n debug(message: string | unknown, meta?: Record<string, unknown>) {\n if (config?.debug) {\n console.debug(\n `${orange}[niledb]${reset}${purple}[DEBUG]${reset}${params.join(\n ''\n )}${reset} ${message}`,\n meta ? `${JSON.stringify(meta)}` : ''\n );\n }\n },\n warn(message: string | unknown, meta?: Record<string, unknown>) {\n if (config?.debug) {\n console.warn(\n `${orange}[niledb]${reset}${yellow}[WARN]${reset}${params.join(\n ''\n )}${reset} ${message}`,\n meta ? JSON.stringify(meta) : ''\n );\n }\n },\n error(message: string | unknown, meta?: Record<string, unknown>) {\n console.error(\n `${orange}[niledb]${reset}${red}[ERROR]${reset}${params.join(\n ''\n )}${red} ${message}`,\n meta ? meta : '',\n `${reset}`\n );\n },\n});\n\nexport type LogReturn = {\n info(message: string | unknown, meta?: Record<string, unknown>): void;\n debug(message: string | unknown, meta?: Record<string, unknown>): void;\n warn(message: string | unknown, meta?: Record<string, unknown>): void;\n error(message: string | unknown, meta?: Record<string, unknown>): void;\n};\nexport default function Logger(\n config: Config | NileConfig,\n ...params: unknown[]\n): LogReturn {\n const base = baseLogger(config, params);\n const info = config?.logger?.info ?? base.info;\n const debug = config?.logger?.debug ?? base.debug;\n const warn = config?.logger?.warn ?? base.warn;\n const error = config?.logger?.error ?? base.error;\n return { info, warn, error, debug };\n}\n\nexport function matchesLog(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.LOG);\n}\n","// these two are a pass though\nexport const TENANT_COOKIE = 'nile.tenant-id';\nexport const USER_COOKIE = 'nile.user-id';\nexport const HEADER_ORIGIN = 'nile-origin';\n// this one is not\nexport const HEADER_SECURE_COOKIES = 'nile-secure-cookies';\n","import {\n HEADER_ORIGIN,\n HEADER_SECURE_COOKIES,\n TENANT_COOKIE,\n} from '../../utils/constants';\nimport { Config } from '../../utils/Config';\nimport Logger from '../../utils/Logger';\n\nimport { DEFAULT_PREFIX } from './routes';\n\nexport default async function request(\n url: string,\n _init: RequestInit & { request: Request },\n config: Config\n) {\n const { debug, info, error } = Logger(config, '[REQUEST]');\n const { request, ...init } = _init;\n const requestUrl = new URL(request.url);\n const updatedHeaders = new Headers({});\n if (request.headers.get('cookie')) {\n updatedHeaders.set('cookie', String(request.headers.get('cookie')));\n }\n if (request.headers.get(TENANT_COOKIE)) {\n updatedHeaders.set(\n TENANT_COOKIE,\n String(request.headers.get(TENANT_COOKIE))\n );\n }\n // sets secure cookies for production\n if (config.secureCookies != null) {\n updatedHeaders.set(HEADER_SECURE_COOKIES, String(config.secureCookies));\n } else {\n updatedHeaders.set(\n HEADER_SECURE_COOKIES,\n process.env.NODE_ENV === 'production' ? 'true' : 'false'\n );\n }\n\n updatedHeaders.set('host', requestUrl.host);\n if (config.callbackUrl) {\n const cbUrl = new URL(config.callbackUrl);\n debug(`Obtained origin from config.callbackUrl ${config.callbackUrl}`);\n updatedHeaders.set(HEADER_ORIGIN, cbUrl.origin);\n // this origin may be overridden, but when SDK requests are made, we want to ignore it\n } else if (config.origin) {\n debug(`Obtained origin from config.origin ${config.origin}`);\n updatedHeaders.set(HEADER_ORIGIN, config.origin);\n } else {\n const passedOrigin = request.headers.get(HEADER_ORIGIN);\n if (passedOrigin) {\n updatedHeaders.set(HEADER_ORIGIN, passedOrigin);\n } else {\n const reqOrigin =\n config.routePrefix !== DEFAULT_PREFIX\n ? `${requestUrl.origin}${config.routePrefix}`\n : requestUrl.origin;\n\n updatedHeaders.set(HEADER_ORIGIN, reqOrigin);\n debug(`Obtained origin from request ${reqOrigin}`);\n }\n }\n const params = { ...init };\n\n if (\n params.method?.toLowerCase() === 'post' ||\n params.method?.toLowerCase() === 'put'\n ) {\n try {\n updatedHeaders.set('content-type', 'application/json');\n\n const bodyStream = _init.body ?? _init.request?.body ?? request.body;\n\n const bodyText = await new Response(bodyStream).text();\n\n // try to parse JSON, fallback to text if not\n try {\n params.body = JSON.stringify(JSON.parse(bodyText));\n } catch {\n updatedHeaders.set('content-type', 'application/x-www-form-urlencoded');\n params.body = bodyText;\n }\n } catch (e) {\n error('Failed to parse request body');\n }\n }\n params.headers = updatedHeaders;\n const fullUrl = `${url}${requestUrl.search}`;\n\n if (config.debug) {\n // something going on with `fetch` in nextjs, possibly other places\n // hot-reloading does not always give back `set-cookie` from fetchCSRF\n // cURL seems to always do it (and in a real app, you don't have hot reloading),\n // so add a cache bypass to stop the annoying failure reloads that actually work\n params.headers.set('request-id', crypto.randomUUID());\n params.cache = 'no-store';\n }\n\n await config.extensionCtx?.handleOnRequest(config, _init, params);\n\n try {\n const res: Response | void = await fetch(fullUrl, {\n ...params,\n }).catch((e) => {\n error('An error has occurred in the fetch', {\n message: e.message,\n stack: e.stack,\n });\n return new Response(\n 'An unexpected (most likely configuration) problem has occurred',\n { status: 500 }\n );\n });\n const loggingRes = typeof res?.clone === 'function' ? res?.clone() : null;\n info(`[${params.method ?? 'GET'}] ${fullUrl}`, {\n status: res?.status,\n statusText: res?.statusText,\n text: await loggingRes?.text(),\n });\n return res;\n } catch (e) {\n if (e instanceof Error) {\n error('An error has occurred in the fetch', {\n message: e.message,\n stack: e.stack,\n });\n }\n return new Response(\n 'An unexpected (most likely configuration) problem has occurred',\n { status: 500 }\n );\n }\n}\n","import { Config } from '../../utils/Config';\nimport Logger from '../../utils/Logger';\n\nimport request from './request';\n\nexport type ProviderName =\n | 'discord'\n | 'github'\n | 'google'\n | 'hubspot'\n | 'linkedin'\n | 'slack'\n | 'twitter'\n | 'email' // magic link\n | 'credentials' // email + password\n | 'azure';\n\nexport type Providers = {\n [providerName in ProviderName]: Provider;\n};\nexport type Provider = {\n id: string;\n name: string;\n type: string;\n signinUrl: string;\n callbackUrl: string;\n};\n\nexport type JWT = {\n email: string;\n sub: string;\n id: string;\n iat: number;\n exp: number;\n jti: string;\n};\n\nexport type ActiveSession = {\n id: string;\n email: string;\n expires: string;\n user?: {\n id: string;\n name: string;\n image: string;\n email: string;\n emailVerified: void | Date;\n };\n};\nexport default async function auth(\n req: Request,\n config: Config\n): Promise<null | undefined | ActiveSession> {\n const { info, error } = Logger(config, '[nileauth]');\n info('checking auth');\n\n const sessionUrl = `${config.apiUrl}/auth/session`;\n info(`using session ${sessionUrl}`);\n // handle the pass through with posts\n req.headers.delete('content-length');\n\n const res = await request(sessionUrl, { request: req }, config);\n if (!res) {\n info('no session found');\n return undefined;\n }\n info('session active');\n try {\n const session = await new Response(res.body).json();\n if (Object.keys(session).length === 0) {\n return undefined;\n }\n return session;\n } catch (e) {\n error(e);\n return undefined;\n }\n}\n","import { Routes } from '../../types';\nimport { Config } from '../../../utils/Config';\nimport request from '../../utils/request';\nimport {\n urlMatches,\n apiRoutes,\n DefaultNileAuthRoutes,\n} from '../../utils/routes';\nimport auth from '../../utils/auth';\n\nconst key = 'ME';\n\nexport default async function route(request: Request, config: Config) {\n const url = apiRoutes(config)[key];\n\n if (request.method === 'GET') {\n return await GET(url, { request }, config);\n }\n if (request.method === 'PUT') {\n return await PUT(url, { request }, config);\n }\n if (request.method === 'DELETE') {\n const session = await auth(request, config);\n if (!session) {\n return new Response(null, { status: 401 });\n }\n return await DELETE(url, { request }, config);\n }\n return new Response('method not allowed', { status: 405 });\n}\n\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n\nexport async function fetchMe(\n config: Config,\n method?: 'DELETE' | 'PUT',\n body?: string\n): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${DefaultNileAuthRoutes.ME}`;\n const init: RequestInit = {\n headers: config.headers,\n method: method ?? 'GET',\n };\n if (method === 'PUT') {\n init.body = body;\n }\n\n const req = new Request(clientUrl, init);\n if (method === 'DELETE') {\n return (await config.handlers.DELETE(req)) as Response;\n }\n if (method === 'PUT') {\n return (await config.handlers.PUT(req)) as Response;\n }\n return (await config.handlers.GET(req)) as Response;\n}\n\n/**\n * @swagger\n * /api/me:\n * delete:\n * tags:\n * - users\n * summary: soft deletes a user\n * description: marks the current user for deletion. Can only be done by the current user for the current user\n * operationId: removeSelf\n * parameters:\n * - name: userid\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"200\":\n * description: success if the user was deleted\n * content: {}\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nexport async function DELETE(\n url: string,\n init: RequestInit & { request: Request },\n config: Config\n) {\n init.method = 'DELETE';\n\n return await request(url, init, config);\n}\n/**\n * @swagger\n * /api/me:\n * put:\n * tags:\n * - users\n * summary: updates the current user\n * description: changes the data for the current user\n * operationId: updateSelf\n * responses:\n * \"200\":\n * description: success if the user was deleted\n * content: {}\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nexport async function PUT(\n url: string,\n init: RequestInit & { request: Request },\n config: Config\n) {\n init.method = 'PUT';\n\n return await request(url, init, config);\n}\n\n/**\n * @swagger\n * /api/me:\n * get:\n * tags:\n * - users\n * summary: Identify the principal\n * description: Returns information about the principal associated with the session\n * provided\n * operationId: getSelf\n * responses:\n * \"200\":\n * description: Identified user\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/User'\n * \"400\":\n * description: API/Database failures\n * content:\n * text/plain:\n * schema:\n * type: string\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nasync function GET(\n url: string,\n init: RequestInit & { request: Request },\n config: Config\n) {\n const res = await request(url, init, config);\n return res;\n}\n","import { Config } from './Config';\nimport { TENANT_COOKIE, USER_COOKIE } from './constants';\n\nfunction getTokenFromCookie(headers: Headers, cookieKey: void | string) {\n const cookie = headers.get('cookie')?.split('; ');\n const _cookies: Record<string, string> = {};\n if (cookie) {\n for (const parts of cookie) {\n const cookieParts = parts.split('=');\n const _cookie = cookieParts.slice(1).join('=');\n const name = cookieParts[0];\n _cookies[name] = _cookie;\n }\n }\n\n if (cookie) {\n for (const parts of cookie) {\n const cookieParts = parts.split('=');\n const _cookie = cookieParts.slice(1).join('=');\n const name = cookieParts[0];\n _cookies[name] = _cookie;\n }\n }\n if (cookieKey) {\n return _cookies[cookieKey];\n }\n return null;\n}\nexport function getTenantFromHttp(headers: Headers, config: Config) {\n const cookieTenant = getTokenFromCookie(headers, TENANT_COOKIE);\n\n return cookieTenant ? cookieTenant : config?.tenantId;\n}\n\n// do we do this any more?\nexport function getUserFromHttp(headers: Headers, config: Config) {\n const userHeader = headers?.get(USER_COOKIE);\n return userHeader ? userHeader : config.userId;\n}\n","import { getTenantFromHttp } from '../../../utils/fetch';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes';\nimport { Config } from '../../../utils/Config';\n/**\n * @swagger\n * /api/users:\n * post:\n * tags:\n * - users\n * summary: Creates a user\n * description: Creates a user in the database\n * operationId: createUser\n * parameters:\n * - name: tenantId\n * description: A tenant id to add the user to when they are created\n * in: query\n * schema:\n * type: string\n * - name: newTenantName\n * description: A tenant name to create, then the user to when they are created\n * in: query\n * schema:\n * type: string\n * requestBody:\n * description: |-\n * The email and password combination the user will use to authenticate.\n * The `name` is optional; if provided it will be recorded in the `users` table.\n * The `newTenant` is optional; if provided, it is used as the name of a new tenant record associated with the newly created user.\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/CreateBasicUserRequest'\n * examples:\n * Create User Request:\n * summary: Creates a user with basic credentials\n * description: Create User Request\n * value:\n * email: a.user@somedomain.com\n * password: somepassword\n * name: A. User\n * Create User Request with Tenant:\n * summary: Creates a user and a new tenant for that user\n * description: Create User Request with Tenant\n * value:\n * email: a.user@somedomain.com\n * password: somepassword\n * name: A. User\n * newTenant: My Sandbox\n * responses:\n * \"201\":\n * description: User created\n * content:\n * application/json:\n * schema:\n * $ref: \"#/components/schemas/User\"\n * \"400\":\n * description: API/Database failures\n * content:\n * text/plain:\n * schema:\n * type: string\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nexport async function POST(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n init.body = init.request.body;\n init.method = 'POST';\n const yurl = new URL(init.request.url);\n const tenantId = yurl.searchParams.get('tenantId');\n const newTenantName = yurl.searchParams.get('newTenantName');\n const tenant = tenantId ?? getTenantFromHttp(init.request.headers, config);\n\n const url = apiRoutes(config).USERS({ tenantId: tenant, newTenantName });\n\n return await request(url, init, config);\n}\n","import { getTenantFromHttp } from '../../../utils/fetch';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes';\nimport { Config } from '../../../utils/Config';\n\n/**\n * @swagger\n * /api/users:\n * get:\n * tags:\n * - users\n * summary: lists users in the tenant\n * description: Returns information about the users within the tenant\n * provided. You can also pass the a `nile.tenant_id` in the header or in a cookie.\n * operationId: listUsers\n * parameters:\n * - name: tenantId\n * in: query\n * schema:\n * type: string\n * responses:\n * \"200\":\n * description: A list of users\n * content:\n * application/json:\n * schema:\n * type: array\n * items:\n * $ref: '#/components/schemas/TenantUser'\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\nexport async function GET(\n config: Config,\n init: RequestInit & { request: Request },\n log: (message: string | unknown, meta?: Record<string, unknown>) => void\n) {\n const yurl = new URL(init.request.url);\n const tenantId = yurl.searchParams.get('tenantId');\n const tenant = tenantId ?? getTenantFromHttp(init.request.headers, config);\n\n if (!tenant) {\n log('[GET] No tenant id provided.');\n return new Response(null, { status: 404 });\n }\n init.method = 'GET'; // for testing\n const url = apiRoutes(config).TENANT_USERS(tenant);\n return await request(url, init, config);\n}\n","import { apiRoutes } from '../../../utils/routes';\nimport fetch from '../../../utils/request';\nimport { Config } from '../../../../utils/Config';\n\n/**\n * @swagger\n * /api/users/{userid}:\n * put:\n * tags:\n * - users\n * summary: update a user\n * description: updates a user within the tenant\n * operationId: updateUser\n * parameters:\n * - name: userid\n * in: path\n * required: true\n * schema:\n * type: string\n * requestBody:\n * description: |-\n * Update a user\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/UpdateUserRequest'\n * responses:\n * \"200\":\n * description: An updated user\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/User'\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nexport async function PUT(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n init.body = init.request.body;\n init.method = 'PUT';\n\n // update the user\n\n const [userId] = new URL(init.request.url).pathname.split('/').reverse();\n\n const url = apiRoutes(config).USER(userId);\n\n return await fetch(url, init, config);\n}\n","import { Routes } from '../../types';\nimport {\n DefaultNileAuthRoutes,\n isUUID,\n prefixAppRoute,\n urlMatches,\n} from '../../utils/routes';\nimport { Config } from '../../../utils/Config';\nimport Logger from '../../../utils/Logger';\n\nimport { POST } from './POST';\nimport { GET } from './GET';\nimport { PUT } from './[userId]/PUT';\n\nconst key = 'USERS';\n\nexport default async function route(request: Request, config: Config) {\n const { info } = Logger(\n { ...config, debug: config.debug } as Config,\n `[ROUTES][${key}]`\n );\n\n switch (request.method) {\n case 'GET':\n return await GET(config, { request }, info);\n case 'POST':\n return await POST(config, { request });\n case 'PUT':\n return await PUT(config, { request });\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n\nexport async function fetchUser(config: Config, method: 'PUT') {\n let clientUrl = `${prefixAppRoute(config)}${DefaultNileAuthRoutes.USERS}`;\n\n if (method === 'PUT')\n if (!config.userId) {\n throw new Error(\n 'Unable to update user, the userId context is missing. Call nile.setContext({ userId }), set nile.userId = \"userId\", or add it to the function call'\n );\n } else {\n clientUrl = `${prefixAppRoute(\n config\n )}${DefaultNileAuthRoutes.USER.replace('{userId}', config.userId)}`;\n }\n if (!isUUID(config.userId) && config.logger?.warn) {\n config.logger?.warn(\n 'nile.userId is not a valid UUID. This may lead to unexpected behavior in your application.'\n );\n }\n\n const init: RequestInit = {\n method,\n headers: config.headers,\n };\n const req = new Request(clientUrl, init);\n\n return (await config.handlers[method](req)) as Response;\n}\n","import { apiRoutes } from '../../../../utils/routes';\nimport { Config } from '../../../../../utils/Config';\nimport request from '../../../../utils/request';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}/users:\n * get:\n * tags:\n * - users\n * summary: List tenant users\n * description: Lists users that are associated with the specified tenant.\n * operationId: listTenantUsers\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"200\":\n * description: Users found\n * content:\n * application/json:\n * schema:\n * type: array\n * items:\n * $ref: '#/components/schemas/User'\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function GET(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n const [, tenantId] = yurl.pathname.split('/').reverse();\n\n const url = `${apiRoutes(config).TENANT_USERS(tenantId)}`;\n return await request(url, init, config);\n}\n","import auth from '../../../../utils/auth';\nimport fetch from '../../../../utils/request';\nimport { apiRoutes } from '../../../../utils/routes';\nimport { Config } from '../../../../../utils/Config';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}/users:\n * post:\n * tags:\n * - users\n * summary: Create a user in a tenant\n * description: Creates a new user and associates that user with the specified\n * tenant.\n * operationId: createTenantUser\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * requestBody:\n * description: |\n * The email and password combination the user will use to authenticate.\n * The `name` is optional; if provided it will be recorded in the `users` table.\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/CreateBasicUserRequest'\n * examples:\n * Create User Request:\n * summary: Creates a user with basic credentials\n * description: Create User Request\n * value:\n * email: a.user@somedomain.com\n * password: somepassword\n * name: A. User\n * responses:\n * \"201\":\n * description: User created\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/User'\n */\nexport async function POST(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const session = await auth(init.request, config);\n\n if (!session) {\n return new Response(null, { status: 401 });\n }\n const yurl = new URL(init.request.url);\n const [, tenantId] = yurl.pathname.split('/').reverse();\n init.body = JSON.stringify({ email: session.email });\n init.method = 'POST';\n const url = apiRoutes(config).TENANT_USERS(tenantId);\n\n return await fetch(url, init, config);\n}\n","import { Config } from '../../../../../utils/Config';\nimport {\n DefaultNileAuthRoutes,\n isUUID,\n urlMatches,\n} from '../../../../utils/routes';\nimport { Routes } from '../../../../types';\nimport Logger from '../../../../../utils/Logger';\n\nimport { GET } from './GET';\nimport { POST } from './POST';\n\nconst key = 'TENANT_USERS';\n\nexport default async function route(request: Request, config: Config) {\n const { info } = Logger(\n { ...config, debug: config.debug } as Config,\n `[ROUTES][${key}]`\n );\n\n const yurl = new URL(request.url);\n const [, tenantId] = yurl.pathname.split('/').reverse();\n\n if (!tenantId) {\n info('No tenant id found in path');\n return new Response(null, { status: 404 });\n }\n\n switch (request.method) {\n case 'GET':\n return await GET(config, { request });\n case 'POST':\n return await POST(config, { request });\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\n\nexport function matches(configRoutes: Routes, request: Request): boolean {\n const url = new URL(request.url);\n const [userId, possibleTenantId, tenantId] = url.pathname\n .split('/')\n .reverse();\n let route = configRoutes[key]\n .replace('{tenantId}', tenantId)\n .replace('{userId}', userId);\n if (userId === 'users') {\n route = configRoutes[key].replace('{tenantId}', possibleTenantId);\n }\n return urlMatches(request.url, route);\n}\n\nexport async function fetchTenantUsers(\n config: Config,\n method: 'GET' | 'POST',\n payload?: {\n body?: string;\n params?: { newTenantName?: string; tenantId?: string };\n }\n) {\n const { body, params } = payload ?? {};\n if (!config.tenantId) {\n throw new Error(\n 'Unable to fetch tenant, the tenantId context is missing. Call nile.setContext({ tenantId }), set nile.tenantId = \"tenantId\", or add it to the function call'\n );\n }\n if (!isUUID(config.tenantId) && config.logger?.warn) {\n config.logger?.warn(\n 'nile.tenantId is not a valid UUID. This may lead to unexpected behavior in your application.'\n );\n }\n const q = new URLSearchParams();\n if (params?.newTenantName) {\n q.set('newTenantName', params.newTenantName);\n }\n if (params?.tenantId) {\n q.set('tenantId', params.tenantId);\n }\n const clientUrl = `${config.serverOrigin}${\n config.routePrefix\n }${DefaultNileAuthRoutes.TENANT_USERS.replace(\n '{tenantId}',\n config.tenantId\n )}`;\n const m = method ?? 'GET';\n const init: RequestInit = {\n method: m,\n headers: config.headers,\n };\n // I don't think post works\n if (method === 'POST') {\n init.body = body;\n }\n const req = new Request(clientUrl, init);\n\n return (await config.handlers[m](req)) as Response;\n}\n","import { apiRoutes } from '../../../../utils/routes';\nimport { Config } from '../../../../../utils/Config';\nimport request from '../../../../utils/request';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}/invite:\n * put:\n * tags:\n * - tenants\n * summary: Obtains a specific tenant.\n * operationId: updateTenant\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"201\":\n * description: update an existing tenant\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/Tenant'\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n * \"404\":\n * description: Tenant not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function PUT(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n const [, tenantId] = yurl.pathname.split('/').reverse();\n if (!tenantId) {\n return new Response(null, { status: 404 });\n }\n // this came as a get request, convert it to a put\n if (yurl.searchParams.size > 0) {\n init.body = new URLSearchParams(yurl.searchParams).toString();\n }\n init.method = 'PUT';\n const url = `${apiRoutes(config).INVITE(tenantId)}`;\n\n const res = await request(url, init, config);\n const location = res?.headers.get('location');\n if (location) {\n return new Response(res?.body, {\n status: 302,\n headers: res?.headers,\n });\n }\n return new Response(res?.body, {\n status: res?.status,\n headers: res?.headers,\n });\n}\n","import { apiRoutes } from '../../../../utils/routes';\nimport { Config } from '../../../../../utils/Config';\nimport fetch from '../../../../utils/request';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}/invite:\n * post:\n * tags:\n * - tenants\n * summary: Create an invite for a user in a tenant.\n * operationId: invite\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"201\":\n * description: An email was sent to the user, inviting them to join the tenant\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n * \"404\":\n * description: Tenant not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function POST(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n const [, tenantId] = yurl.pathname.split('/').reverse();\n if (!tenantId) {\n return new Response(null, { status: 404 });\n }\n\n init.method = 'POST';\n init.body = init.request.body;\n const url = `${apiRoutes(config).INVITE(tenantId)}`;\n\n return await fetch(url, init, config);\n}\n","import { Config } from '../../../../../utils/Config';\nimport {\n DefaultNileAuthRoutes,\n isUUID,\n urlMatches,\n} from '../../../../utils/routes';\nimport { Routes } from '../../../../types';\n\nimport { PUT } from './PUT';\nimport { POST } from './POST';\n\nconst key = 'INVITE';\n\nexport default async function route(request: Request, config: Config) {\n switch (request.method) {\n // the browser is a GET, but we need to PUT it into nile-auth\n // server side, this is a put\n case 'GET':\n case 'PUT':\n return await PUT(config, { request });\n case 'POST':\n return await POST(config, { request });\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\n\nexport function matches(configRoutes: Routes, request: Request): boolean {\n const url = new URL(request.url);\n const [, tenantId] = url.pathname.split('/').reverse();\n const route = configRoutes[key].replace('{tenantId}', tenantId);\n return urlMatches(request.url, route);\n}\n\nexport async function fetchInvite(\n config: Config,\n method?: 'POST' | 'PUT' | 'DELETE',\n body?: string\n) {\n if (!config.tenantId) {\n throw new Error(\n 'Unable to fetch tenant, the tenantId context is missing. Call nile.setContext({ tenantId }), set nile.tenantId = \"tenantId\", or add it to the function call'\n );\n }\n if (!isUUID(config.tenantId) && config.logger?.warn) {\n config.logger?.warn(\n 'nile.tenantId is not a valid UUID. This may lead to unexpected behavior in your application.'\n );\n }\n let clientUrl = `${config.serverOrigin}${\n config.routePrefix\n }${DefaultNileAuthRoutes.INVITE.replace('{tenantId}', config.tenantId)}`;\n const m = method ?? 'GET';\n const init: RequestInit = {\n method: m,\n headers: config.headers,\n };\n if (method === 'POST' || method === 'PUT') {\n init.body = body;\n }\n if (method === 'DELETE') {\n clientUrl = `${clientUrl}/${body}`;\n }\n const req = new Request(clientUrl, init);\n\n return (await config.handlers[m](req)) as Response;\n}\n","import request from '../../../../utils/request';\nimport { apiRoutes } from '../../../../utils/routes';\nimport { Config } from '../../../../../utils/Config';\n/**\n * @swagger\n * /api/tenants/{tenantId}/invites:\n * get:\n * tags:\n * - tenants\n * summary: Lists invites for a tenant.\n * operationId: listInvites\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"200\":\n * description: A list of tenant invites\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n * \"404\":\n * description: Tenant not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function GET(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n const [, tenantId] = yurl.pathname.split('/').reverse();\n if (!tenantId) {\n return new Response(null, { status: 404 });\n }\n\n init.method = 'GET';\n const url = `${apiRoutes(config).INVITES(tenantId)}`;\n\n return await request(url, init, config);\n}\n","import { Config } from '../../../../../utils/Config';\nimport { DefaultNileAuthRoutes, isUUID } from '../../../../utils/routes';\nimport { Routes } from '../../../../types';\n\nimport { GET } from './GET';\n\nconst key = 'INVITES';\n\nexport default async function route(request: Request, config: Config) {\n switch (request.method) {\n case 'GET':\n return await GET(config, { request });\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\n\nexport function matches(configRoutes: Routes, request: Request): boolean {\n const url = new URL(request.url);\n const [, tenantId] = url.pathname.split('/').reverse();\n const route = configRoutes[key].replace('{tenantId}', tenantId);\n return url.pathname.endsWith(route);\n}\n\nexport async function fetchInvites(config: Config) {\n if (!config.tenantId) {\n throw new Error(\n 'Unable to fetch tenant, the tenantId context is missing. Call nile.setContext({ tenantId }), set nile.tenantId = \"tenantId\", or add it to the function call'\n );\n }\n if (!isUUID(config.tenantId) && config.logger?.warn) {\n config.logger?.warn(\n 'nile.tenantId is not a valid UUID. This may lead to unexpected behavior in your application.'\n );\n }\n const clientUrl = `${config.serverOrigin}${\n config.routePrefix\n }${DefaultNileAuthRoutes.INVITES.replace('{tenantId}', config.tenantId)}`;\n\n const req = new Request(clientUrl, { headers: config.headers });\n\n return (await config.handlers.GET(req)) as Response;\n}\n","import { Config } from '../../../utils/Config';\nimport { ActiveSession } from '../../utils/auth';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes';\n\n/**\n * @swagger\n * /api/tenants:\n * get:\n * tags:\n * - tenants\n * summary: list tenants by user\n * description: Creates a user in the database\n * operationId: listTenants\n * responses:\n * \"200\":\n * description: a list of tenants\n * content:\n * application/json:\n * schema:\n * type: array\n * items:\n * $ref: \"#/components/schemas/Tenant\"\n * \"400\":\n * description: API/Database failures\n * content:\n * text/plain:\n * schema:\n * type: string\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\nexport async function GET(\n config: Config,\n session: ActiveSession,\n init: RequestInit & { request: Request }\n) {\n let url = `${apiRoutes(config).USER_TENANTS(session.id)}`;\n if (typeof session === 'object' && 'user' in session && session.user) {\n url = `${apiRoutes(config).USER_TENANTS(session.user.id)}`;\n }\n\n const res = await request(url, init, config);\n return res;\n}\n","import { apiRoutes } from '../../../utils/routes';\nimport { Config } from '../../../../utils/Config';\nimport request from '../../../utils/request';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}:\n * get:\n * tags:\n * - tenants\n * summary: Obtains a specific tenant.\n * operationId: getTenant\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"200\":\n * description: the desired tenant\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/Tenant'\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n * \"404\":\n * description: Tenant not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function GET(\n config: Config,\n init: RequestInit & { request: Request },\n log: (message: string | unknown, meta?: Record<string, unknown>) => void\n) {\n const yurl = new URL(init.request.url);\n const [tenantId] = yurl.pathname.split('/').reverse();\n if (!tenantId) {\n log('[GET] No tenant id provided.');\n return new Response(null, { status: 404 });\n }\n\n init.method = 'GET';\n const url = `${apiRoutes(config).TENANT(tenantId)}`;\n\n return await request(url, init, config);\n}\n","import { apiRoutes } from '../../../utils/routes';\nimport { Config } from '../../../../utils/Config';\nimport fetch from '../../../utils/request';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}:\n * delete:\n * tags:\n * - tenants\n * summary: Deletes a tenant.\n * operationId: deleteTenant\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"204\":\n * description: Tenant deleted\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n * \"404\":\n * description: Tenant not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function DELETE(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n const [tenantId] = yurl.pathname.split('/').reverse();\n if (!tenantId) {\n return new Response(null, { status: 404 });\n }\n\n init.method = 'DELETE';\n const url = `${apiRoutes(config).TENANT(tenantId)}`;\n\n return await fetch(url, init, config);\n}\n","import { apiRoutes } from '../../../utils/routes';\nimport { Config } from '../../../../utils/Config';\nimport fetch from '../../../utils/request';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}:\n * put:\n * tags:\n * - tenants\n * summary: Obtains a specific tenant.\n * operationId: updateTenant\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"201\":\n * description: update an existing tenant\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/Tenant'\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n * \"404\":\n * description: Tenant not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function PUT(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n const [tenantId] = yurl.pathname.split('/').reverse();\n if (!tenantId) {\n return new Response(null, { status: 404 });\n }\n init.body = init.request.body;\n init.method = 'PUT';\n const url = `${apiRoutes(config).TENANT(tenantId)}`;\n\n return await fetch(url, init, config);\n}\n","import { Config } from '../../../utils/Config';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes';\n\n/**\n * @swagger\n * /api/tenants:\n * post:\n * tags:\n * - tenants\n * summary: Create a tenant\n * description: Creates a new tenant in a database.\n * operationId: createTenant\n * requestBody:\n * description: A wrapper for the tenant name.\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/CreateTenantRequest'\n * examples:\n * Create Tenant Request:\n * summary: Creates a named tenant\n * description: Create Tenant Request\n * value:\n * name: My Sandbox\n * responses:\n * \"201\":\n * description: Tenant created\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/Tenant'\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n * \"404\":\n * description: Database not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function POST(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n init.body = init.request.body;\n init.method = 'POST';\n const url = `${apiRoutes(config).TENANTS}`;\n\n return await request(url, init, config);\n}\n","import { Config } from '../../../utils/Config';\nimport { Routes } from '../../types';\nimport auth from '../../utils/auth';\nimport Logger from '../../../utils/Logger';\nimport { urlMatches, DefaultNileAuthRoutes, isUUID } from '../../utils/routes';\n\nimport { GET } from './GET';\nimport { GET as TENANT_GET } from './[tenantId]/GET';\nimport { DELETE } from './[tenantId]/DELETE';\nimport { PUT } from './[tenantId]/PUT';\nimport { POST } from './POST';\n\nconst key = 'TENANTS';\n\nexport default async function route(request: Request, config: Config) {\n const { info } = Logger(\n { ...config, debug: config.debug } as Config,\n `[ROUTES][${key}]`\n );\n const session = await auth(request, config);\n\n if (!session) {\n info('401');\n return new Response(null, { status: 401 });\n }\n const [possibleTenantId] = request.url.split('/').reverse();\n\n switch (request.method) {\n case 'GET':\n if (isUUID(possibleTenantId)) {\n return await TENANT_GET(config, { request }, info);\n }\n return await GET(config, session, { request });\n case 'POST':\n return await POST(config, { request });\n case 'DELETE':\n return await DELETE(config, { request });\n case 'PUT':\n return await PUT(config, { request });\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\n\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n\nexport async function fetchTenants(\n config: Config,\n method: 'POST' | 'GET',\n body?: string\n): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${DefaultNileAuthRoutes.TENANTS}`;\n\n const init: RequestInit = {\n method,\n headers: config.headers,\n };\n if (method === 'POST') {\n init.body = body;\n }\n const req = new Request(clientUrl, init);\n\n return (await config.handlers.POST(req)) as Response;\n}\n\nexport async function fetchTenant(\n config: Config,\n method: 'GET' | 'DELETE' | 'PUT',\n body?: string\n) {\n if (!config.tenantId) {\n throw new Error(\n 'Unable to fetch tenant, the tenantId context is missing. Call nile.setContext({ tenantId }), set nile.tenantId = \"tenantId\", or add it to the function call'\n );\n }\n if (!isUUID(config.tenantId) && config.logger?.warn) {\n config.logger?.warn(\n 'nile.tenantId is not a valid UUID. This may lead to unexpected behavior in your application.'\n );\n }\n const clientUrl = `${config.serverOrigin}${\n config.routePrefix\n }${DefaultNileAuthRoutes.TENANT.replace('{tenantId}', config.tenantId)}`;\n const m = method ?? 'GET';\n const init: RequestInit = {\n method: m,\n headers: config.headers,\n };\n if (m === 'PUT') {\n init.body = body;\n }\n const req = new Request(clientUrl, init);\n\n return (await config.handlers[m](req)) as Response;\n}\n\nexport async function fetchTenantsByUser(config: Config) {\n if (config.logger?.warn) {\n if (!config.userId) {\n config.logger?.warn(\n 'nile.userId is not set. The call will still work for the API, but the database context is not set properly and may lead to unexpected behavior in your application.'\n );\n } else if (!isUUID(config.userId)) {\n config.logger?.warn(\n 'nile.userId is not a valid UUID. This may lead to unexpected behavior in your application.'\n );\n }\n }\n const clientUrl = `${config.serverOrigin}${\n config.routePrefix\n }${DefaultNileAuthRoutes.USER_TENANTS.replace(\n '{userId}',\n config.userId ?? 'WARN_NOT_SET'\n )}`;\n const req = new Request(clientUrl, { headers: config.headers });\n\n return (await config.handlers.GET(req)) as Response;\n}\n","/**\n * @swagger\n * /api/auth/signin:\n * get:\n * tags:\n * - authentication\n * summary: lists users in the tenant\n * description: Returns information about the users within the tenant\n * provided\n * operationId: signin\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"200\":\n * description: A list of users\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/User'\n * \"404\":\n * description: Not found\n * content: {}\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\n\nimport { Routes } from '../../types';\nimport { Config } from '../../../utils/Config';\nimport { NileAuthRoutes, proxyRoutes, urlMatches } from '../../utils/routes';\nimport request from '../../utils/request';\n\nconst key = 'SIGNIN';\n\nexport default async function route(req: Request, config: Config) {\n let url = proxyRoutes(config)[key];\n\n const init: RequestInit = {\n method: req.method,\n headers: req.headers,\n };\n if (req.method === 'POST') {\n const [provider] = new URL(req.url).pathname.split('/').reverse();\n\n url = `${proxyRoutes(config)[key]}/${provider}`;\n }\n\n const passThroughUrl = new URL(req.url);\n const params = new URLSearchParams(passThroughUrl.search);\n\n url = `${url}${params.toString() !== '' ? `?${params.toString()}` : ''}`;\n const res = await request(url, { ...init, request: req }, config);\n\n return res;\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n\n// this is not for the the credential provider STILL NEED TO FIGURE THIS OUT I THINK? or remove.\nexport async function fetchSignIn(\n config: Config,\n provider: string,\n body: URLSearchParams\n): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${NileAuthRoutes.SIGNIN}/${provider}`;\n const req = new Request(clientUrl, {\n method: 'POST',\n headers: config.headers,\n body,\n });\n\n return (await config.handlers.POST(req)) as Response;\n}\n","import { Routes } from '../../types';\nimport { NileAuthRoutes, proxyRoutes, urlMatches } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Config } from '../../../utils/Config';\n\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config).SESSION,\n {\n method: req.method,\n request: req,\n },\n config\n );\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.SESSION);\n}\n\nexport async function fetchSession(config: Config): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${NileAuthRoutes.SESSION}`;\n const req = new Request(clientUrl, {\n method: 'GET',\n headers: config.headers,\n });\n\n return (await config.handlers.GET(req)) as Response;\n}\n","import { Routes } from '../../types';\nimport { NileAuthRoutes, proxyRoutes, urlMatches } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Config } from '../../../utils/Config';\n\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config).PROVIDERS,\n {\n method: req.method,\n request: req,\n },\n config\n );\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.PROVIDERS);\n}\n\nexport async function fetchProviders(config: Config): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${NileAuthRoutes.PROVIDERS}`;\n const req = new Request(clientUrl, {\n method: 'GET',\n headers: config.headers,\n });\n\n return (await config.handlers.GET(req)) as Response;\n}\n","import { Routes } from '../../types';\nimport { NileAuthRoutes, proxyRoutes, urlMatches } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Config } from '../../../utils/Config';\n\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config).CSRF,\n {\n method: req.method,\n request: req,\n },\n config\n );\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.CSRF);\n}\n\nexport async function fetchCsrf(config: Config): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${NileAuthRoutes.CSRF}`;\n const req = new Request(clientUrl, {\n method: 'GET',\n headers: config.headers,\n });\n\n return (await config.handlers.GET(req)) as Response;\n}\n","import { NileAuthRoutes, proxyRoutes, urlMatches } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Routes } from '../../types';\nimport { Config } from '../../../utils/Config';\nimport Logger from '../../../utils/Logger';\nimport { ProviderName } from '../../utils/auth';\n\nconst key = 'CALLBACK';\n\nexport default async function route(req: Request, config: Config) {\n const { error } = Logger(\n { ...config, debug: config.debug } as Config,\n `[ROUTES][${key}]`\n );\n const [provider] = new URL(req.url).pathname.split('/').reverse();\n try {\n const passThroughUrl = new URL(req.url);\n const params = new URLSearchParams(passThroughUrl.search);\n const url = `${proxyRoutes(config)[key]}/${provider}${\n params.toString() !== '' ? `?${params.toString()}` : ''\n }`;\n\n const res = await request(\n url,\n {\n request: req,\n method: req.method,\n },\n config\n ).catch((e) => {\n error('an error as occurred', e);\n });\n\n const location = res?.headers.get('location');\n if (location) {\n return new Response(res?.body, {\n status: 302,\n headers: res?.headers,\n });\n }\n return new Response(res?.body, {\n status: res?.status,\n headers: res?.headers,\n });\n } catch (e) {\n error(e);\n }\n return new Response('An unexpected error has occurred.', { status: 400 });\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.CALLBACK);\n}\n\n// this is for the the credential provider, among other things\nexport async function fetchCallback(\n config: Config,\n provider: ProviderName,\n body?: string,\n request?: Request,\n method: 'POST' | 'GET' = 'POST'\n): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${\n NileAuthRoutes.CALLBACK\n }/${provider}${request ? `?${new URL(request.url).searchParams}` : ''}`;\n const req = new Request(clientUrl, {\n method,\n headers: config.headers,\n body,\n });\n\n return (await config.handlers.POST(req)) as Response;\n}\n","import { Routes } from '../../types';\nimport { NileAuthRoutes, proxyRoutes, urlMatches } from '../../utils/routes';\nimport fetch from '../../utils/request';\nimport { Config } from '../../../utils/Config';\n\nconst key = 'SIGNOUT';\nexport default async function route(request: Request, config: Config) {\n let url = proxyRoutes(config)[key];\n\n const init: RequestInit = {\n method: request.method,\n };\n if (request.method === 'POST') {\n init.body = request.body;\n const [provider] = new URL(request.url).pathname.split('/').reverse();\n url = `${proxyRoutes(config)[key]}${\n provider !== 'signout' ? `/${provider}` : ''\n }`;\n }\n\n const res = await fetch(url, { ...init, request }, config);\n return res;\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n\nexport async function fetchSignOut(\n config: Config,\n body: string\n): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${NileAuthRoutes.SIGNOUT}`;\n const req = new Request(clientUrl, {\n method: 'POST',\n body,\n headers: config.headers,\n });\n\n return (await config.handlers.POST(req)) as Response;\n}\n","import { Routes } from '../../types';\nimport { urlMatches, proxyRoutes } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Config } from '../../../utils/Config';\n\nconst key = 'ERROR';\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config)[key],\n {\n method: req.method,\n request: req,\n },\n config\n );\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n","import { urlMatches, proxyRoutes } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Routes } from '../../types';\nimport { Config } from '../../../utils/Config';\n\nconst key = 'VERIFY_REQUEST';\n\nexport default async function route(req: Request, config: Config) {\n return request(\n proxyRoutes(config)[key],\n {\n method: req.method,\n request: req,\n },\n config\n );\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n","import { Routes } from '../../types';\nimport { urlMatches, proxyRoutes, NileAuthRoutes } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Config } from '../../../utils/Config';\n\nconst key = 'PASSWORD_RESET';\nexport default async function route(req: Request, config: Config) {\n const url = proxyRoutes(config)[key];\n\n const res = await request(\n url,\n {\n method: req.method,\n request: req,\n },\n config\n );\n\n const location = res?.headers.get('location');\n if (location) {\n return new Response(res?.body, {\n status: 302,\n headers: res?.headers,\n });\n }\n return new Response(res?.body, {\n status: res?.status,\n headers: res?.headers,\n });\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes.PASSWORD_RESET);\n}\n\nexport async function fetchResetPassword(\n config: Config,\n method: 'POST' | 'GET' | 'PUT',\n body: null | string,\n params?: URLSearchParams,\n useJson = true\n) {\n const authParams = new URLSearchParams(params ?? {});\n if (useJson) {\n authParams?.set('json', 'true');\n }\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${\n NileAuthRoutes.PASSWORD_RESET\n }?${authParams?.toString()}`;\n const init: RequestInit = {\n method,\n headers: config.headers,\n };\n if (body && method !== 'GET') {\n init.body = body;\n }\n const req = new Request(clientUrl, init);\n return (await config.handlers[method](req)) as Response;\n}\n","import { Routes } from '../../types';\nimport { urlMatches, proxyRoutes, NileAuthRoutes } from '../../utils/routes';\nimport request from '../../utils/request';\nimport { Config } from '../../../utils/Config';\n\nconst key = 'VERIFY_EMAIL';\nexport default async function route(req: Request, config: Config) {\n const url = proxyRoutes(config)[key];\n\n const res = await request(\n url,\n {\n method: req.method,\n request: req,\n },\n config\n );\n\n const location = res?.headers.get('location');\n if (location) {\n return new Response(res?.body, {\n status: 302,\n headers: res?.headers,\n });\n }\n return new Response(res?.body, {\n status: res?.status,\n headers: res?.headers,\n });\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n\nexport async function fetchVerifyEmail(\n config: Config,\n method: 'POST' | 'GET',\n body?: string\n): Promise<Response> {\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${NileAuthRoutes.VERIFY_EMAIL}`;\n const init: RequestInit = {\n method,\n headers: config.headers,\n };\n if (body) {\n init.body = body;\n }\n const req = new Request(clientUrl, init);\n\n return (await config.handlers[method](req)) as Response;\n}\n","import Logger from '../../utils/Logger';\nimport me, { matches as matchesMe } from '../routes/me';\nimport users, { matches as matchesUsers } from '../routes/users';\nimport tenantUsers, {\n matches as matchesTenantUsers,\n} from '../routes/tenants/[tenantId]/users';\nimport invite, {\n matches as matchesInvite,\n} from '../routes/tenants/[tenantId]/invite';\nimport invites, {\n matches as matchesInvites,\n} from '../routes/tenants/[tenantId]/invites';\nimport tenants, { matches as matchesTenants } from '../routes/tenants';\nimport { Routes } from '../types';\nimport * as authRoutes from '../routes/auth';\nimport { Config } from '../../utils/Config';\n\nexport default function GETTER(configRoutes: Routes, config: Config) {\n const { info, warn } = Logger(config, '[GET MATCHER]');\n return async function GET(req: Request) {\n if (matchesMe(configRoutes, req)) {\n info('matches me');\n return me(req, config);\n }\n // order matters for invites (matches against tenants and invite)\n if (matchesInvites(configRoutes, req)) {\n info('matches tenant invites');\n return invites(req, config);\n }\n\n if (matchesInvite(configRoutes, req)) {\n info('matches invite');\n return invite(req, config);\n }\n\n if (matchesTenantUsers(configRoutes, req)) {\n info('matches tenant users');\n return tenantUsers(req, config);\n }\n if (matchesTenants(configRoutes, req)) {\n info('matches tenants');\n return tenants(req, config);\n }\n\n if (matchesUsers(configRoutes, req)) {\n info('matches users');\n return users(req, config);\n }\n\n if (authRoutes.matchSession(configRoutes, req)) {\n info('matches session');\n return authRoutes.handleSession(req, config);\n }\n\n if (authRoutes.matchSignIn(configRoutes, req)) {\n info('matches signin');\n return authRoutes.handleSignIn(req, config);\n }\n\n if (authRoutes.matchProviders(configRoutes, req)) {\n info('matches providers');\n return authRoutes.handleProviders(req, config);\n }\n\n if (authRoutes.matchCsrf(configRoutes, req)) {\n info('matches csrf');\n return authRoutes.handleCsrf(req, config);\n }\n\n if (authRoutes.matchesPasswordReset(configRoutes, req)) {\n info('matches password reset');\n return authRoutes.handlePasswordReset(req, config);\n }\n\n if (authRoutes.matchCallback(configRoutes, req)) {\n info('matches callback');\n return authRoutes.handleCallback(req, config);\n }\n\n if (authRoutes.matchSignOut(configRoutes, req)) {\n info('matches signout');\n return authRoutes.handleSignOut(req, config);\n }\n\n if (authRoutes.matchesVerifyRequest(configRoutes, req)) {\n info('matches verify-request');\n return authRoutes.handleVerifyRequest(req, config);\n }\n\n if (authRoutes.matchesVerifyEmail(configRoutes, req)) {\n info('matches verify-email');\n return authRoutes.handleVerifyEmail(req, config);\n }\n\n if (authRoutes.matchError(configRoutes, req)) {\n info('matches error');\n return authRoutes.handleError(req, config);\n }\n warn(`No GET routes matched ${req.url}`);\n return new Response(null, { status: 404 });\n };\n}\n","import { Config } from '../../../utils/Config';\nimport request from '../../utils/request';\nimport { apiRoutes } from '../../utils/routes';\n\n/**\n * @swagger\n * /api/signup:\n * post:\n * tags:\n * - users\n * summary: signs a user up\n * description: signs a user up and logs them in. Expects a email and password combo\n * operationId: signUp\n * parameters:\n * - name: tenantId\n * description: A tenant id to add the user to when they are created\n * in: query\n * schema:\n * type: string\n * - name: newTenantName\n * description: A tenant name to create, then the user to when they are created\n * in: query\n * schema:\n * type: string\n * requestBody:\n * description: |-\n * The email and password combination the user will use to authenticate.\n * The `name` is optional; if provided it will be recorded in the `users` table.\n * The `newTenant` is optional; if provided, it is used as the name of a new tenant record associated with the newly created user.\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/CreateBasicUserRequest'\n * examples:\n * Create User Request:\n * summary: Creates a user with basic credentials\n * description: Create User Request\n * value:\n * email: a.user@somedomain.com\n * password: somepassword\n * name: A. User\n * Create User Request with Tenant:\n * summary: Creates a user and a new tenant for that user\n * description: Create User Request with Tenant\n * value:\n * email: a.user@somedomain.com\n * password: somepassword\n * name: A. User\n * newTenant: My Sandbox\n * responses:\n * \"201\":\n * description: User and session created\n * content:\n * application/json:\n * schema:\n * $ref: \"#/components/schemas/User\"\n * \"400\":\n * description: API/Database failures\n * content:\n * text/plain:\n * schema:\n * type: string\n * \"401\":\n * description: Unauthorized\n * content: {}\n */\nexport async function POST(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n init.body = init.request.body;\n init.method = 'POST';\n const url = `${apiRoutes(config).SIGNUP}`;\n\n return await request(url, init, config);\n}\n","import { Config } from '../../../utils/Config';\nimport { Routes } from '../../types';\nimport { urlMatches, DefaultNileAuthRoutes } from '../../utils/routes';\n\nimport { POST } from './POST';\n\nconst key = 'SIGNUP';\n\nexport default async function route(request: Request, config: Config) {\n switch (request.method) {\n case 'POST':\n return await POST(config, { request });\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\n\nexport function matches(configRoutes: Routes, request: Request): boolean {\n return urlMatches(request.url, configRoutes[key]);\n}\n\nexport async function fetchSignUp(\n config: Config,\n payload: {\n body?: string;\n params?: { newTenantName?: string; tenantId?: string };\n }\n): Promise<Response> {\n const { body, params } = payload ?? {};\n const q = new URLSearchParams();\n if (params?.newTenantName) {\n q.set('newTenantName', params.newTenantName);\n }\n if (params?.tenantId) {\n q.set('tenantId', params.tenantId);\n }\n const clientUrl = `${config.serverOrigin}${config.routePrefix}${\n DefaultNileAuthRoutes.SIGNUP\n }${q.size > 0 ? `?${q}` : ''}`;\n const req = new Request(clientUrl, {\n method: 'POST',\n headers: config.headers,\n body,\n });\n\n return (await config.handlers.POST(req)) as Response;\n}\n","import Logger, { matchesLog } from '../../utils/Logger';\nimport users, { matches as matchesUsers } from '../routes/users';\nimport tenants, { matches as matchesTenants } from '../routes/tenants';\nimport signup, { matches as matchesSignup } from '../routes/signup';\nimport tenantUsers, {\n matches as matchesTenantUsers,\n} from '../routes/tenants/[tenantId]/users';\nimport inviteUsers, {\n matches as matchesInviteUsers,\n} from '../routes/tenants/[tenantId]/invite';\nimport { Routes } from '../types';\nimport { Config } from '../../utils/Config';\nimport * as authRoutes from '../routes/auth';\n\nexport default function POSTER(configRoutes: Routes, config: Config) {\n const { info, warn, error } = Logger(config, '[POST MATCHER]');\n return async function POST(req: Request) {\n // special case for logging client errors\n if (matchesLog(configRoutes, req)) {\n try {\n const json = await req.clone().json();\n error(req.body && json);\n } catch {\n error(await req.text());\n }\n return new Response(null, { status: 200 });\n }\n // order matters for tenantUsers\n if (matchesTenantUsers(configRoutes, req)) {\n info('matches tenant users');\n return tenantUsers(req, config);\n }\n // order matters for tenantInvites\n if (matchesInviteUsers(configRoutes, req)) {\n info('matches tenant invite');\n return inviteUsers(req, config);\n }\n\n if (matchesSignup(configRoutes, req)) {\n info('matches signup');\n return signup(req, config);\n }\n\n if (matchesUsers(configRoutes, req)) {\n info('matches users');\n return users(req, config);\n }\n if (matchesTenants(configRoutes, req)) {\n info('matches tenants');\n return tenants(req, config);\n }\n\n if (authRoutes.matchSession(configRoutes, req)) {\n info('matches session');\n return authRoutes.handleSession(req, config);\n }\n\n if (authRoutes.matchSignIn(configRoutes, req)) {\n info('matches signin');\n return authRoutes.handleSignIn(req, config);\n }\n if (authRoutes.matchesPasswordReset(configRoutes, req)) {\n info('matches password reset');\n return authRoutes.handlePasswordReset(req, config);\n }\n\n if (authRoutes.matchProviders(configRoutes, req)) {\n info('matches providers');\n return authRoutes.handleProviders(req, config);\n }\n\n if (authRoutes.matchCsrf(configRoutes, req)) {\n info('matches csrf');\n return authRoutes.handleCsrf(req, config);\n }\n\n if (authRoutes.matchCallback(configRoutes, req)) {\n info('matches callback');\n return authRoutes.handleCallback(req, config);\n }\n if (authRoutes.matchSignOut(configRoutes, req)) {\n info('matches signout');\n return authRoutes.handleSignOut(req, config);\n }\n if (authRoutes.matchesVerifyEmail(configRoutes, req)) {\n info('matches verify-email');\n return authRoutes.handleVerifyEmail(req, config);\n }\n\n warn(`No POST routes matched ${req.url}`);\n return new Response(null, { status: 404 });\n };\n}\n","import { apiRoutes } from '../../../../../utils/routes';\nimport fetch from '../../../../../utils/request';\nimport { Config } from '../../../../../../utils/Config';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}/users/{userId}/link:\n * delete:\n * tags:\n * - tenants\n * summary: removes a user from a tenant\n * description: removes an associated user from a specified\n * tenant.\n * operationId: leaveTenant \n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * - name: userId \n * in: path\n * required: true\n * schema:\n * type: string\n * - name: email \n * in: path\n * required: true\n * schema:\n * type: string\n \n * responses:\n * \"204\":\n * description: User removed\n */\n\nexport async function DELETE(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n\n const [, userId, , tenantId] = yurl.pathname.split('/').reverse();\n config.tenantId = tenantId;\n config.userId = userId;\n\n init.method = 'DELETE';\n const url = `${apiRoutes(config).TENANT_USER}/link`;\n\n return await fetch(url, init, config);\n}\n","import { apiRoutes } from '../../../../../utils/routes';\nimport fetch from '../../../../../utils/request';\nimport { Config } from '../../../../../../utils/Config';\n/**\n * @swagger\n * /api/tenants/{tenantId}/users/{userId}/link:\n * put:\n * tags:\n * - tenants\n * summary: associates an existing user with the tenant\n * operationId: linkUser\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * - name: userId \n * in: path\n * required: true\n * schema:\n * type: string\n \n * requestBody:\n * description: |\n * The email of the user you want to add to a tenant.\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/AssociateUserRequest'\n * responses:\n * \"201\":\n * description: add user to tenant\n */\n\nexport async function PUT(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n\n const [, userId, , tenantId] = yurl.pathname.split('/').reverse();\n config.tenantId = tenantId;\n config.userId = userId;\n\n init.method = 'PUT';\n const url = `${apiRoutes(config).TENANT_USER}/link`;\n\n return await fetch(url, init, config);\n}\n","import { Config } from '../../../../../../utils/Config';\nimport { DefaultNileAuthRoutes, urlMatches } from '../../../../../utils/routes';\nimport { Routes } from '../../../../../types';\nimport auth from '../../../../../utils/auth';\nimport Logger from '../../../../../../utils/Logger';\n\nimport { DELETE } from './DELETE';\nimport { PUT } from './PUT';\n\nconst key = 'TENANT_USER';\n\nexport default async function route(request: Request, config: Config) {\n const { info } = Logger(\n { ...config, debug: config.debug } as Config,\n `[ROUTES][${key}]`\n );\n const session = await auth(request, config);\n\n if (!session) {\n info('401');\n return new Response(null, { status: 401 });\n }\n const yurl = new URL(request.url);\n const [, userId] = yurl.pathname.split('/').reverse();\n\n if (!userId) {\n info('No tenant id found in path');\n return new Response(null, { status: 404 });\n }\n\n switch (request.method) {\n case 'PUT':\n return await PUT(config, { request });\n case 'DELETE':\n return await DELETE(config, { request });\n\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\n\nexport function matches(configRoutes: Routes, request: Request): boolean {\n const url = new URL(request.url);\n const [, userId, possibleTenantId, tenantId] = url.pathname\n .split('/')\n .reverse();\n let route = configRoutes[key]\n .replace('{tenantId}', tenantId)\n .replace('{userId}', userId);\n if (userId === 'users') {\n route = configRoutes[key].replace('{tenantId}', possibleTenantId);\n }\n return urlMatches(request.url, route);\n}\n\nexport async function fetchTenantUser(\n config: Config,\n method: 'DELETE' | 'PUT'\n) {\n if (!config.tenantId) {\n throw new Error(\n 'The tenantId context is missing. Call nile.setContext({ tenantId })'\n );\n }\n\n if (!config.userId) {\n throw new Error(\n 'the userId context is missing. Call nile.setContext({ userId })'\n );\n }\n\n const clientUrl = `${config.serverOrigin}${\n config.routePrefix\n }${DefaultNileAuthRoutes.TENANT_USER.replace(\n '{tenantId}',\n config.tenantId\n ).replace('{userId}', config.userId)}/link`;\n const req = new Request(clientUrl, {\n headers: config.headers,\n method,\n });\n\n return (await config.handlers[method](req)) as Response;\n}\n","import { apiRoutes } from '../../../../../utils/routes';\nimport { Config } from '../../../../../../utils/Config';\nimport fetch from '../../../../../utils/request';\n\n/**\n * @swagger\n * /api/tenants/{tenantId}/invite/{inviteId}:\n * delete:\n * tags:\n * - tenants\n * summary: Deletes an invite on a tenant.\n * operationId: deleteInvite\n * parameters:\n * - name: tenantId\n * in: path\n * required: true\n * schema:\n * type: string\n * responses:\n * \"204\":\n * description: Tenant invite deleted\n * \"401\":\n * description: Unauthorized\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n * \"404\":\n * description: Tenant not found\n * content:\n * application/json:\n * schema:\n * $ref: '#/components/schemas/APIError'\n */\nexport async function DELETE(\n config: Config,\n init: RequestInit & { request: Request }\n) {\n const yurl = new URL(init.request.url);\n const [inviteId, , tenantId] = yurl.pathname.split('/').reverse();\n if (!tenantId) {\n return new Response(null, { status: 404 });\n }\n\n init.method = 'DELETE';\n const url = `${apiRoutes(config).INVITE(tenantId)}/${inviteId}`;\n\n return await fetch(url, init, config);\n}\n","import { urlMatches } from '../../../../../utils/routes';\nimport { Routes } from '../../../../../types';\nimport { Config } from '../../../../../../utils/Config';\n\nimport { DELETE } from './DELETE';\n\nconst key = 'INVITE';\nexport default async function route(request: Request, config: Config) {\n switch (request.method) {\n case 'DELETE':\n return await DELETE(config, { request });\n default:\n return new Response('method not allowed', { status: 405 });\n }\n}\nexport function matches(configRoutes: Routes, request: Request): boolean {\n const url = new URL(request.url);\n const [inviteId, , tenantId] = url.pathname.split('/').reverse();\n const route = configRoutes[key]\n .replace('{tenantId}', tenantId)\n .replace('{inviteId}', inviteId);\n return urlMatches(request.url, route);\n}\n","import Logger from '../../utils/Logger';\nimport tenants, { matches as matchesTenants } from '../routes/tenants';\nimport tenantUsers, {\n matches as matchesTenantsUsers,\n} from '../routes/tenants/[tenantId]/users';\nimport me, { matches as matchesMe } from '../routes/me';\nimport tenantUser, {\n matches as matchesTenantUser,\n} from '../routes/tenants/[tenantId]/users/[userId]';\nimport invite, {\n matches as matchesInvite,\n} from '../routes/tenants/[tenantId]/invite/[inviteId]';\nimport { Routes } from '../types';\nimport { Config } from '../../utils/Config';\n\nexport default function DELETER(configRoutes: Routes, config: Config) {\n const { info, warn } = Logger(config, '[DELETE MATCHER]');\n return async function DELETE(req: Request) {\n // order matters for tenantInvites\n if (matchesInvite(configRoutes, req)) {\n info('matches tenant invite id');\n return invite(req, config);\n }\n\n if (matchesTenantUser(configRoutes, req)) {\n info('matches tenant user');\n return tenantUser(req, config);\n }\n if (matchesTenantsUsers(configRoutes, req)) {\n info('matches tenant users');\n return tenantUsers(req, config);\n }\n\n if (matchesTenants(configRoutes, req)) {\n info('matches tenants');\n return tenants(req, config);\n }\n if (matchesMe(configRoutes, req)) {\n info('matches me');\n return me(req, config);\n }\n\n warn('No DELETE routes matched');\n return new Response(null, { status: 404 });\n };\n}\n","import Logger from '../../utils/Logger';\nimport users, { matches as matchesUsers } from '../routes/users';\nimport tenants, { matches as matchesTenants } from '../routes/tenants';\nimport me, { matches as matchesMe } from '../routes/me';\nimport tenantUsers, {\n matches as matchesTenantUsers,\n} from '../routes/tenants/[tenantId]/users';\nimport tenantUser, {\n matches as matchesTenantUser,\n} from '../routes/tenants/[tenantId]/users/[userId]';\nimport invite, {\n matches as matchesInvite,\n} from '../routes/tenants/[tenantId]/invite';\nimport { handlePasswordReset, matchesPasswordReset } from '../routes/auth';\nimport { Routes } from '../types';\nimport { Config } from '../../utils/Config';\n\nexport default function PUTER(configRoutes: Routes, config: Config) {\n const { info, warn } = Logger(config, '[PUT MATCHER]');\n return async function PUT(req: Request) {\n // order matters for tenantInvites\n if (matchesInvite(configRoutes, req)) {\n info('matches tenant invite');\n return invite(req, config);\n }\n\n if (matchesTenantUser(configRoutes, req)) {\n info('matches tenant user');\n return tenantUser(req, config);\n }\n if (matchesTenantUsers(configRoutes, req)) {\n info('matches tenant users');\n return tenantUsers(req, config);\n }\n if (matchesUsers(configRoutes, req)) {\n info('matches users');\n return users(req, config);\n }\n if (matchesMe(configRoutes, req)) {\n info('matches me');\n return me(req, config);\n }\n if (matchesTenants(configRoutes, req)) {\n info('matches tenants');\n return tenants(req, config);\n }\n if (matchesPasswordReset(configRoutes, req)) {\n info('matches reset password');\n return handlePasswordReset(req, config);\n }\n warn('No PUT routes matched');\n return new Response(null, { status: 404 });\n };\n}\n","import { Config } from '../../utils/Config';\nimport { Routes } from '../types';\n\nimport getter from './GET';\nimport poster from './POST';\nimport deleter from './DELETE';\nimport puter from './PUT';\n\nexport default function Handlers(configRoutes: Routes, config: Config) {\n const GET = getter(configRoutes, config);\n const POST = poster(configRoutes, config);\n const DELETE = deleter(configRoutes, config);\n const PUT = puter(configRoutes, config);\n return {\n GET,\n POST,\n DELETE,\n PUT,\n };\n}\n","import 'dotenv/config';\nimport { LoggerType, NileConfig } from '../../types';\nimport Logger from '../Logger';\n\nexport type EnvConfig = {\n config: NileConfig & { logger: LoggerType };\n};\n\nexport const getApiUrl = (cfg: EnvConfig) => {\n const { config } = cfg;\n if (config?.apiUrl != null) {\n return config?.apiUrl;\n }\n if (stringCheck(process.env.NILEDB_API_URL)) {\n return process.env.NILEDB_API_URL;\n }\n\n throw new Error(\n 'A connection to nile-auth is required. Set NILEDB_API_URL as an environment variable.'\n );\n};\n\nexport const getCallbackUrl = (cfg: EnvConfig) => {\n const { config } = cfg;\n if (stringCheck(config?.callbackUrl)) {\n return config?.callbackUrl;\n }\n return process.env.NILEDB_CALLBACK_URL;\n};\n\nexport const getSecureCookies = (cfg: EnvConfig) => {\n const { config } = cfg;\n if (config?.secureCookies != null) {\n return config?.secureCookies;\n }\n if (stringCheck(process.env.NILEDB_SECURECOOKIES)) {\n return Boolean(process.env.NILEDB_SECURECOOKIES);\n }\n return undefined;\n};\n\nexport const getUsername = (cfg: EnvConfig) => {\n const { config } = cfg;\n const logger = config.logger;\n\n const { info } = Logger(config, '[username]');\n if (config?.user) {\n logger && info(`${logger}[config] ${config.user}`);\n return String(config?.user);\n }\n const user = stringCheck(process.env.NILEDB_USER);\n if (user) {\n logger && info(`${logger}[NILEDB_USER] ${user}`);\n return user;\n }\n\n const pg = stringCheck(process.env.NILEDB_POSTGRES_URL);\n if (pg) {\n try {\n const url = new URL(pg);\n if (url.username) {\n return url.username;\n }\n } catch (e) {\n //ok to fail\n }\n }\n throw new Error(\n 'A database user is required. Set NILEDB_USER as an environment variable.'\n );\n};\n\nexport const getPassword = (cfg: EnvConfig) => {\n const { config } = cfg;\n const logger = config.logger;\n const log = logProtector(logger);\n const { info } = Logger(config, '[password]');\n if (stringCheck(config?.password)) {\n log && info(`${logger}[config] ***`);\n return String(config?.password);\n }\n\n const pass = stringCheck(process.env.NILEDB_PASSWORD);\n if (pass) {\n logger && info(`${logger}[NILEDB_PASSWORD] ***`);\n\n return pass;\n }\n const pg = stringCheck(process.env.NILEDB_POSTGRES_URL);\n if (pg) {\n try {\n const url = new URL(pg);\n if (url.password) {\n return url.password;\n }\n } catch (e) {\n // ok to fail\n }\n }\n throw new Error(\n 'A database password is required. Set NILEDB_PASSWORD as an environment variable.'\n );\n};\n\nexport const getDatabaseName = (cfg: EnvConfig) => {\n const { config } = cfg;\n const logger = config.logger;\n const { info } = Logger(config, '[databaseName]');\n if (stringCheck(config?.databaseName)) {\n logger && info(`${logger}[config] ${config?.databaseName}`);\n return String(config?.databaseName);\n }\n const name = stringCheck(process.env.NILEDB_NAME);\n if (name) {\n logger && info(`${logger}[NILEDB_NAME] ${name}`);\n return name;\n }\n\n if (process.env.NILEDB_POSTGRES_URL) {\n try {\n const pgUrl = new URL(process.env.NILEDB_POSTGRES_URL);\n return pgUrl.pathname.substring(1);\n } catch (e) {\n // ok to fail\n }\n }\n throw new Error(\n 'A database name is required. Set NILEDB_PASSWORD as an environment variable.'\n );\n};\n\nexport const getTenantId = (cfg: EnvConfig): string | null => {\n const { config } = cfg;\n const logger = config.logger;\n const { info } = Logger(config, '[tenantId]');\n if (stringCheck(config?.tenantId)) {\n logger && info(`${logger}[config] ${config?.tenantId}`);\n return String(config?.tenantId);\n }\n\n if (stringCheck(process.env.NILEDB_TENANT)) {\n logger && info(`${logger}[NILEDB_TENANT] ${process.env.NILEDB_TENANT}`);\n return String(process.env.NILEDB_TENANT);\n }\n\n return null;\n};\n\nexport function getDbHost(cfg: EnvConfig) {\n const { config } = cfg;\n const logger = config.logger;\n const { info } = Logger(config, '[db.host]');\n\n if (stringCheck(config?.db && config.db.host)) {\n logger && info(`${logger}[config] ${config?.db?.host}`);\n return String(config?.db?.host);\n }\n\n if (stringCheck(process.env.NILEDB_HOST)) {\n logger && info(`${logger}[NILEDB_HOST] ${process.env.NILEDB_HOST}`);\n return process.env.NILEDB_HOST;\n }\n\n const pg = stringCheck(process.env.NILEDB_POSTGRES_URL);\n if (pg) {\n try {\n const pgUrl = new URL(pg);\n logger && info(`${logger}[NILEDB_POSTGRES_URL] ${pgUrl.hostname}`);\n return pgUrl.hostname;\n } catch (e) {\n // ok to fail\n }\n }\n\n logger && info(`${logger}[default] db.thenile.dev`);\n return 'db.thenile.dev';\n}\n\nexport function getDbPort(cfg: EnvConfig): number {\n const { config } = cfg;\n const logger = config.logger;\n const { info } = Logger(config, '[db.port]');\n if (config?.db?.port && config.db.port != null) {\n logger && info(`${logger}[config] ${config?.db.port}`);\n return Number(config.db?.port);\n }\n\n if (stringCheck(process.env.NILEDB_PORT)) {\n logger && info(`${logger}[NILEDB_PORT] ${process.env.NILEDB_PORT}`);\n return Number(process.env.NILEDB_PORT);\n }\n\n const pg = stringCheck(process.env.NILEDB_POSTGRES_URL);\n if (pg) {\n try {\n const pgUrl = new URL(pg);\n if (pgUrl.port) {\n return Number(pgUrl.port);\n }\n } catch (e) {\n // ok to fail\n }\n }\n logger && info(`${logger}[default] 5432`);\n return 5432;\n}\n\n// don't let people accidentally log secrets to production\nconst logProtector = (logger: LoggerType) => {\n return process.env.NODE_ENV === 'development' ||\n process.env.NODE_ENV === 'test'\n ? logger\n : null;\n};\n\nconst stringCheck = (str: string | null | undefined) => {\n if (str && str !== '') {\n return str;\n }\n return;\n};\n","import Handlers from '../../api/handlers';\nimport { appRoutes } from '../../api/utils/routes';\nimport { Routes } from '../../api/types';\nimport { LoggerType, NilePoolConfig, NileConfig, Extension } from '../../types';\nimport Logger from '../Logger';\n\ntype ExtensionCtx = {\n handleOnRequest: (\n config: Config,\n _init: RequestInit & { request: Request },\n params: RequestInit\n ) => Promise<void>;\n};\ntype ConfigConstructor = NileConfig & { extensionCtx?: ExtensionCtx };\nimport {\n EnvConfig,\n getDatabaseName,\n getDbHost,\n getDbPort,\n getPassword,\n getUsername,\n getSecureCookies,\n getCallbackUrl,\n getApiUrl,\n} from './envVars';\n\nexport class Config {\n routes: Routes;\n handlers: {\n GET: (req: Request) => Promise<void | Response>;\n POST: (req: Request) => Promise<void | Response>;\n DELETE: (req: Request) => Promise<void | Response>;\n PUT: (req: Request) => Promise<void | Response>;\n };\n paths: {\n get: string[];\n post: string[];\n delete: string[];\n put: string[];\n };\n extensionCtx: ExtensionCtx;\n extensions?: Extension[];\n logger: LoggerType;\n /**\n * Stores the set tenant id from Server for use in sub classes\n */\n tenantId: string | null | undefined;\n /**\n * Stores the set user id from Server for use in sub classes\n */\n userId: string | null | undefined;\n\n /**\n * Stores the headers to be used in `fetch` calls\n */\n headers: Headers;\n\n /**\n * The nile-auth url\n */\n apiUrl: string;\n\n origin?: string | undefined | null;\n\n /**\n * important for separating the `origin` config value from a default in order to make requests\n */\n serverOrigin: string;\n\n debug?: boolean;\n /**\n * To use secure cookies or not in the fetch\n */\n secureCookies?: boolean;\n\n callbackUrl?: string;\n /**\n * change the starting route\n */\n routePrefix: string;\n\n db: NilePoolConfig;\n\n // api: ApiConfig;\n\n constructor(config?: ConfigConstructor) {\n this.routePrefix = config?.routePrefix ?? '/api';\n this.debug = config?.debug;\n this.origin = config?.origin;\n this.extensions = config?.extensions;\n this.extensionCtx = config?.extensionCtx as ExtensionCtx;\n this.serverOrigin = config?.origin ?? 'http://localhost:3000';\n\n this.logger = config?.logger ?? Logger(this);\n const envVarConfig: EnvConfig = {\n config: { ...config, logger: this.logger },\n };\n this.secureCookies = getSecureCookies(envVarConfig);\n this.callbackUrl = getCallbackUrl(envVarConfig);\n\n // this four throw because its the only way to get it\n this.apiUrl = getApiUrl(envVarConfig) as string;\n const user = getUsername(envVarConfig) as string;\n const password = getPassword(envVarConfig) as string;\n const databaseName = getDatabaseName(envVarConfig) as string;\n\n const { host, port, ...dbConfig } = config?.db ?? {};\n const configuredHost = host ?? getDbHost(envVarConfig);\n const configuredPort = port ?? getDbPort(envVarConfig);\n\n this.db = {\n user,\n password,\n host: configuredHost,\n port: configuredPort,\n ...dbConfig,\n };\n if (databaseName) {\n this.db.database = databaseName;\n }\n\n // we need these values no matter what, so break if they are missing\n\n if (config?.headers) {\n this.headers = config?.headers as Headers;\n } else {\n this.headers = new Headers();\n }\n\n this.routes = {\n ...appRoutes(config?.routePrefix),\n ...config?.routes,\n };\n\n this.handlers = Handlers(this.routes as Routes, this);\n // this.handlersWithContext = handlersWithContext(this.routes, this);\n\n this.paths = {\n get: [\n this.routes.ME,\n this.routes.TENANT_USERS,\n this.routes.TENANTS,\n this.routes.TENANT,\n this.routes.SESSION,\n this.routes.SIGNIN,\n this.routes.PROVIDERS,\n this.routes.CSRF,\n this.routes.PASSWORD_RESET,\n this.routes.CALLBACK,\n this.routes.SIGNOUT,\n this.routes.VERIFY_REQUEST,\n this.routes.ERROR,\n ],\n post: [\n this.routes.TENANT_USERS,\n this.routes.SIGNUP,\n this.routes.USERS,\n this.routes.TENANTS,\n this.routes.SESSION,\n `${this.routes.SIGNIN}/{provider}`,\n this.routes.PASSWORD_RESET,\n this.routes.PROVIDERS,\n this.routes.CSRF,\n `${this.routes.CALLBACK}/{provider}`,\n this.routes.SIGNOUT,\n ],\n put: [\n this.routes.TENANT_USERS,\n this.routes.USERS,\n this.routes.TENANT,\n this.routes.PASSWORD_RESET,\n ],\n delete: [this.routes.TENANT_USER, this.routes.TENANT],\n };\n this.tenantId = config?.tenantId;\n this.userId = config?.userId;\n }\n}\n","// Define a map of event names to value types\ntype EventMap = {\n [Events.User]: string | null | undefined;\n [Events.Tenant]: string | null | undefined;\n [Events.Token]: string | null | undefined;\n [Events.EvictPool]: string | null | undefined;\n [Events.Headers]: Headers | null | undefined;\n};\n\n// Generic EventFn now uses the EventMap\ntype EventFn<K extends keyof EventMap = keyof EventMap> = (\n params: EventMap[K]\n) => void;\n\nenum Events {\n User = 'userId',\n Tenant = 'tenantId',\n Token = 'token',\n EvictPool = 'EvictPool',\n Headers = 'headers',\n}\n\nclass Eventer<E extends Record<string, unknown>> {\n private events: { [K in keyof E]?: Array<(value: E[K]) => void> } = {};\n\n publish<K extends keyof E>(eventName: K, value: E[K]) {\n const callbacks = this.events[eventName];\n if (callbacks) {\n for (const callback of callbacks) {\n callback(value);\n }\n }\n }\n\n subscribe<K extends keyof E>(eventName: K, callback: (value: E[K]) => void) {\n if (!this.events[eventName]) {\n this.events[eventName] = [];\n }\n this.events[eventName].push(callback);\n }\n\n unsubscribe<K extends keyof E>(\n eventName: K,\n callback: (value: E[K]) => void\n ) {\n const callbacks = this.events[eventName];\n if (!callbacks) return;\n\n const index = callbacks.indexOf(callback);\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n\n if (callbacks.length === 0) {\n delete this.events[eventName];\n }\n }\n}\n\nconst eventer = new Eventer<EventMap>();\n\nexport const updateTenantId = (tenantId: EventMap[Events.Tenant]) => {\n eventer.publish(Events.Tenant, tenantId);\n};\nexport const watchTenantId = (cb: EventFn<Events.Tenant>) =>\n eventer.subscribe(Events.Tenant, cb);\n\nexport const updateUserId = (userId: EventMap[Events.User]) => {\n eventer.publish(Events.User, userId);\n};\nexport const watchUserId = (cb: EventFn<Events.User>) =>\n eventer.subscribe(Events.User, cb);\n\nexport const updateToken = (token: EventMap[Events.Token]) => {\n eventer.publish(Events.Token, token);\n};\n\nexport const evictPool = (val: EventMap[Events.EvictPool]) => {\n eventer.publish(Events.EvictPool, val);\n};\nexport const watchEvictPool = (cb: EventFn<Events.EvictPool>) =>\n eventer.subscribe(Events.EvictPool, cb);\n\nexport const updateHeaders = (val: EventMap[Events.Headers]) => {\n eventer.publish(Events.Headers, val);\n};\nexport const watchHeaders = (cb: EventFn<Events.Headers>) =>\n eventer.subscribe(Events.Headers, cb);\n","import pg from 'pg';\n\nimport { Config } from '../utils/Config';\nimport Logger from '../utils/Logger';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AllowAny = any;\n\nexport function createProxyForPool(pool: pg.Pool, config: Config): pg.Pool {\n const { info, error } = Logger(config, '[pool]');\n return new Proxy<pg.Pool>(pool, {\n get(target: AllowAny, property) {\n if (property === 'query') {\n // give connection string a pass for these problems\n if (!config.db.connectionString) {\n if (!config.db.user || !config.db.password) {\n error(\n 'Cannot connect to the database. User and/or password are missing. Generate them at https://console.thenile.dev'\n );\n } else if (!config.db.database) {\n error(\n 'Unable to obtain database name. Is process.env.NILEDB_POSTGRES_URL set?'\n );\n }\n }\n const caller = target[property];\n return function query(...args: AllowAny) {\n info('query', ...args);\n // @ts-expect-error - not mine\n const called = caller.apply(this, args);\n return called;\n };\n }\n return target[property];\n },\n }) as pg.Pool;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport pg from 'pg';\n\nimport { Config } from '../utils/Config';\nimport { evictPool } from '../utils/Event';\nimport { AfterCreate } from '../types';\nimport Logger from '../utils/Logger';\n\nimport { createProxyForPool } from './PoolProxy';\n\nclass NileDatabase {\n pool: pg.Pool;\n tenantId?: undefined | null | string;\n userId?: undefined | null | string;\n id: string;\n config: Config;\n timer: NodeJS.Timeout | undefined;\n\n constructor(config: Config, id: string) {\n const { warn, info, debug } = Logger(config, '[NileInstance]');\n this.id = id;\n const poolConfig = {\n min: 0,\n max: 10,\n idleTimeoutMillis: 30000,\n ...config.db,\n };\n const { afterCreate, ...remaining } = poolConfig;\n\n config.db = poolConfig;\n this.config = config;\n const cloned = { ...this.config.db };\n cloned.password = '***';\n debug(`Connection pool config ${JSON.stringify(cloned)}`);\n\n this.pool = createProxyForPool(new pg.Pool(remaining), this.config);\n\n if (typeof afterCreate === 'function') {\n warn(\n 'Providing an pool configuration will stop automatic tenant context setting.'\n );\n }\n\n // start the timer for cleanup\n this.startTimeout();\n this.pool.on('connect', async (client) => {\n debug(`pool connected ${this.id}`);\n this.startTimeout();\n const afterCreate: AfterCreate = makeAfterCreate(\n config,\n `${this.id}-${this.timer}`\n );\n afterCreate(client, (err) => {\n const { error } = Logger(config, '[after create callback]');\n if (err) {\n clearTimeout(this.timer);\n error('after create failed', {\n message: err.message,\n stack: err.stack,\n });\n evictPool(this.id);\n }\n });\n });\n this.pool.on('error', (err) => {\n clearTimeout(this.timer);\n info(`pool ${this.id} failed`, {\n message: err.message,\n stack: err.stack,\n });\n evictPool(this.id);\n });\n this.pool.on('release', (destroy) => {\n if (destroy) {\n clearTimeout(this.timer);\n evictPool(this.id);\n debug(`destroying pool ${this.id}`);\n }\n });\n }\n\n startTimeout() {\n const { debug } = Logger(this.config, '[NileInstance]');\n if (this.timer) {\n clearTimeout(this.timer);\n }\n this.timer = setTimeout(() => {\n debug(\n `Pool reached idleTimeoutMillis. ${this.id} evicted after ${\n Number(this.config.db.idleTimeoutMillis) ?? 30000\n }ms`\n );\n this.pool.end(() => {\n clearTimeout(this.timer);\n evictPool(this.id);\n });\n }, Number(this.config.db.idleTimeoutMillis) ?? 30000);\n }\n shutdown() {\n const { debug } = Logger(this.config, '[NileInstance]');\n debug(`attempting to shut down ${this.id}`);\n clearTimeout(this.timer);\n this.pool.end(() => {\n debug(`${this.id} has been shut down`);\n });\n }\n}\n\nexport default NileDatabase;\n\nfunction makeAfterCreate(config: Config, id: string): AfterCreate {\n const { error, warn, debug } = Logger(config, '[afterCreate]');\n return (conn, done) => {\n conn.on('error', function errorHandler(e: Error) {\n error(`Connection ${id} was terminated by server`, {\n message: e.message,\n stack: e.stack,\n });\n done(e, conn);\n });\n\n if (config.tenantId) {\n const query = [`SET nile.tenant_id = '${config.tenantId}'`];\n if (config.userId) {\n if (!config.tenantId) {\n warn('A user id cannot be set in context without a tenant id');\n }\n query.push(`SET nile.user_id = '${config.userId}'`);\n }\n\n // in this example we use pg driver's connection API\n conn.query(query.join(';'), function (err: Error) {\n if (err) {\n error('query connection failed', {\n cause: err.cause,\n stack: err.stack,\n message: err.message,\n name: err.name,\n id,\n });\n } else {\n if (query.length === 1) {\n debug(`connection context set: tenantId=${config.tenantId}`);\n }\n if (query.length === 2) {\n debug(\n `connection context set: tenantId=${config.tenantId} userId=${config.userId}`\n );\n }\n }\n\n done(err, conn);\n });\n }\n done(null, conn);\n };\n}\n","import pg from 'pg';\n\nimport { Config } from '../utils/Config';\nimport { watchEvictPool } from '../utils/Event';\nimport Logger from '../utils/Logger';\nimport { NileConfig } from '../types';\n\nimport NileDatabase from './NileInstance';\n\nexport default class DBManager {\n connections: Map<string, NileDatabase>;\n cleared: boolean;\n private poolWatcherFn: (id: undefined | null | string) => void;\n\n private makeId(\n tenantId?: string | undefined | null,\n userId?: string | undefined | null\n ) {\n if (tenantId && userId) {\n return `${tenantId}:${userId}`;\n }\n if (tenantId) {\n return `${tenantId}`;\n }\n return 'base';\n }\n constructor(config: NileConfig) {\n this.cleared = false;\n this.connections = new Map();\n this.poolWatcherFn = this.poolWatcher(config);\n watchEvictPool(this.poolWatcherFn);\n }\n poolWatcher = (config: NileConfig) => (id: undefined | null | string) => {\n const { info, warn } = Logger(config, '[DBManager]');\n if (id && this.connections.has(id)) {\n info(`Removing ${id} from db connection pool.`);\n const connection = this.connections.get(id);\n connection?.shutdown();\n this.connections.delete(id);\n } else {\n warn(`missed eviction of ${id}`);\n }\n };\n\n getConnection = (config: NileConfig): pg.Pool => {\n const { info } = Logger(config, '[DBManager]');\n const id = this.makeId(config.tenantId, config.userId);\n\n const existing = this.connections.get(id);\n info(`# of instances: ${this.connections.size}`);\n if (existing) {\n info(`returning existing ${id}`);\n existing.startTimeout();\n return existing.pool;\n }\n const newOne = new NileDatabase(new Config(config), id);\n this.connections.set(id, newOne);\n info(`created new ${id}`);\n info(`# of instances: ${this.connections.size}`);\n if (this.cleared) {\n this.cleared = false;\n }\n return newOne.pool;\n };\n\n clear = (config: NileConfig) => {\n const { info } = Logger(config, '[DBManager]');\n info(`Clearing all connections ${this.connections.size}`);\n this.cleared = true;\n this.connections.forEach((connection) => {\n connection.shutdown();\n });\n this.connections.clear();\n };\n}\n","import { fetchCallback } from '../api/routes/auth/callback';\nimport { fetchResetPassword } from '../api/routes/auth/password-reset';\nimport { fetchProviders } from '../api/routes/auth/providers';\nimport { fetchSession } from '../api/routes/auth/session';\nimport { fetchSignIn } from '../api/routes/auth/signin';\nimport { fetchSignOut } from '../api/routes/auth/signout';\nimport { fetchSignUp } from '../api/routes/signup';\nimport { ActiveSession, JWT, Provider, ProviderName } from '../api/utils/auth';\nimport { NileAuthRoutes } from '../api/utils/routes';\nimport { User } from '../users/types';\nimport { Config } from '../utils/Config';\nimport { updateHeaders, updateTenantId } from '../utils/Event';\nimport Logger, { LogReturn } from '../utils/Logger';\n\nimport obtainCsrf from './obtainCsrf';\n\ntype SignUpPayload = {\n email: string;\n password: string;\n tenantId?: string;\n newTenantName?: string;\n};\nexport default class Auth {\n #logger: LogReturn;\n #config: Config;\n constructor(config: Config) {\n this.#config = config;\n this.#logger = Logger(config, '[auth]');\n }\n\n getSession<T = JWT | ActiveSession | undefined>(\n rawResponse?: false\n ): Promise<T>;\n getSession(rawResponse: true): Promise<Response>;\n async getSession<T = JWT | ActiveSession | Response | undefined>(\n rawResponse = false\n ): Promise<T | Response> {\n const res = await fetchSession(this.#config);\n if (rawResponse) {\n return res;\n }\n try {\n const session = await res.clone().json();\n if (Object.keys(session).length === 0) {\n return undefined as T;\n }\n return session as T;\n } catch {\n return res;\n }\n }\n\n async getCsrf<T = Response | JSON>(rawResponse?: false): Promise<T>;\n async getCsrf(rawResponse: true): Promise<Response>;\n async getCsrf<T = Response | JSON>(rawResponse = false) {\n return await obtainCsrf<T>(this.#config, rawResponse);\n }\n\n async listProviders(rawResponse: true): Promise<Response>;\n async listProviders<T = { [key: string]: Provider }>(\n rawResponse?: false\n ): Promise<T>;\n async listProviders<T = { [key: string]: Provider }>(\n rawResponse = false\n ): Promise<T | Response> {\n const res = await fetchProviders(this.#config);\n if (rawResponse) {\n return res;\n }\n try {\n return (await res.clone().json()) as T;\n } catch {\n return res;\n }\n }\n\n async signOut(): Promise<Response> {\n // check for csrf header, maybe its already there?\n const csrfRes = await this.getCsrf();\n if (!('csrfToken' in csrfRes)) {\n throw new Error('Unable to obtain CSRF token. Sign out failed.');\n }\n\n const body = JSON.stringify({\n csrfToken: csrfRes.csrfToken,\n json: true,\n });\n const res = await fetchSignOut(this.#config, body);\n\n updateHeaders(new Headers({}));\n this.#config.headers = new Headers();\n\n return res;\n }\n\n /**\n * signUp only works with email + password\n * @param payload\n * @param rawResponse\n */\n async signUp(payload: SignUpPayload, rawResponse: true): Promise<Response>;\n async signUp<T = User | Response>(payload: SignUpPayload): Promise<T>;\n async signUp<T = User | Response | undefined>(\n payload: SignUpPayload,\n rawResponse?: boolean\n ): Promise<T> {\n // be sure its fresh\n this.#config.headers = new Headers();\n const { email, password, ...params } = payload;\n if (!email || !password) {\n throw new Error(\n 'Server side sign up requires a user email and password.'\n );\n }\n\n const providers = await this.listProviders();\n const { credentials } = providers ?? {};\n if (!credentials) {\n throw new Error(\n 'Unable to obtain credential provider. Aborting server side sign up.'\n );\n }\n\n const csrf = await this.getCsrf();\n\n let csrfToken;\n if ('csrfToken' in csrf) {\n csrfToken = csrf.csrfToken;\n } else {\n throw new Error('Unable to obtain parse CSRF. Request blocked.');\n }\n\n const body = JSON.stringify({\n email,\n password,\n csrfToken,\n callbackUrl: credentials.callbackUrl,\n });\n\n const res = await fetchSignUp(this.#config, { body, params });\n if (res.status > 299) {\n this.#logger.error(await res.clone().text());\n return undefined as T;\n }\n const token = parseToken(res.headers);\n if (!token) {\n throw new Error('Server side sign up failed. Session token not found');\n }\n this.#config.headers?.append('cookie', token);\n updateHeaders(this.#config.headers);\n if (rawResponse) {\n return res as T;\n }\n try {\n const json = (await res.clone().json()) as T;\n if (json && typeof json === 'object' && 'tenants' in json) {\n const tenantId = (json as unknown as User).tenants[0];\n if (tenantId) {\n updateTenantId(tenantId);\n }\n }\n return json;\n } catch {\n return res as T;\n }\n }\n\n async forgotPassword(req: {\n email: string;\n callbackUrl?: string;\n redirectUrl?: string;\n }): Promise<Response> {\n let email = '';\n const defaults = defaultCallbackUrl({\n config: this.#config,\n });\n let callbackUrl = defaults.callbackUrl;\n let redirectUrl = defaults.redirectUrl;\n\n if ('email' in req) {\n email = req.email;\n }\n\n if ('callbackUrl' in req) {\n callbackUrl = req.callbackUrl ? req.callbackUrl : null;\n }\n if ('redirectUrl' in req) {\n redirectUrl = req.redirectUrl ? req.redirectUrl : null;\n }\n const body = JSON.stringify({\n email,\n redirectUrl,\n callbackUrl,\n });\n\n // we need a default\n const data = await fetchResetPassword(\n this.#config,\n 'POST',\n body,\n new URLSearchParams(),\n false\n );\n return data;\n }\n\n async resetPassword(\n req:\n | Request\n | {\n email: string;\n password: string;\n callbackUrl?: string;\n redirectUrl?: string;\n }\n ): Promise<Response> {\n let email = '';\n let password = '';\n const defaults = defaultCallbackUrl({ config: this.#config });\n let callbackUrl = defaults.callbackUrl;\n let redirectUrl = defaults.redirectUrl;\n if (req instanceof Request) {\n const body = await req.json();\n email = body.email;\n password = body.password;\n const cbFromHeaders = parseCallback(req.headers);\n if (cbFromHeaders) {\n callbackUrl = cbFromHeaders;\n }\n if (body.callbackUrl) {\n callbackUrl = body.callbackUrl;\n }\n if (body.redirectUrl) {\n redirectUrl = body.redirectUrl;\n }\n } else {\n if ('email' in req) {\n email = req.email;\n }\n if ('password' in req) {\n password = req.password;\n }\n if ('callbackUrl' in req) {\n callbackUrl = req.callbackUrl ? req.callbackUrl : null;\n }\n if ('redirectUrl' in req) {\n redirectUrl = req.redirectUrl ? req.redirectUrl : null;\n }\n }\n // we need a default\n await this.getCsrf();\n const body = JSON.stringify({\n email,\n password,\n redirectUrl,\n callbackUrl,\n });\n let urlWithParams;\n try {\n const data = await fetchResetPassword(this.#config, 'POST', body);\n const cloned = data.clone();\n if (data.status === 400) {\n const text = await cloned.text();\n this.#logger.error(text);\n return data;\n }\n\n const { url } = await data.json();\n urlWithParams = url;\n } catch {\n // failed\n }\n let token;\n try {\n const worthyParams = new URL(urlWithParams).searchParams;\n const answer = await fetchResetPassword(\n this.#config,\n 'GET',\n null,\n worthyParams\n );\n token = parseResetToken(answer.headers);\n } catch {\n this.#logger.warn(\n 'Unable to parse reset password url. Password not reset.'\n );\n }\n\n // this only needs to happen on the local config\n const cookie = this.#config.headers.get('cookie')?.split('; ');\n if (token) {\n cookie?.push(token);\n } else {\n throw new Error(\n 'Unable to reset password, reset token is missing from response'\n );\n }\n this.#config.headers = new Headers({\n ...this.#config.headers,\n cookie: cookie?.join('; '),\n });\n const res = await fetchResetPassword(this.#config, 'PUT', body);\n // remove the token\n cookie?.pop();\n const cleaned: string[] =\n cookie?.filter((c) => !c.includes('nile.session')) ?? [];\n cleaned.push(String(parseToken(res.headers)));\n const updatedHeaders = new Headers({ cookie: cleaned.join('; ') });\n updateHeaders(updatedHeaders);\n\n return res;\n }\n async callback(provider: ProviderName, body?: string | Request) {\n if (body instanceof Request) {\n this.#config.headers = body.headers;\n return await fetchCallback(\n this.#config,\n provider,\n undefined,\n body,\n 'GET'\n );\n }\n return await fetchCallback(this.#config, provider, body);\n }\n /**\n * The return value from this will be a redirect for the client\n * In most cases, you should forward the response directly to the client\n * @param payload\n * @param rawResponse\n */\n async signIn<T = Response>(\n provider: ProviderName,\n payload?: Request | { email: string; password: string },\n rawResponse?: true\n ): Promise<T>;\n async signIn<T = Response | undefined>(\n provider: ProviderName,\n payload?: Request | { email: string; password: string },\n rawResponse?: boolean\n ): Promise<T> {\n if (payload instanceof Request) {\n const body = new URLSearchParams(await payload.text());\n const origin = new URL(payload.url).origin;\n\n const payloadUrl = body?.get('callbackUrl');\n const csrfToken = body?.get('csrfToken');\n\n const callbackUrl = `${\n !payloadUrl?.startsWith('http') ? origin : ''\n }${payloadUrl}`;\n if (!csrfToken) {\n throw new Error(\n 'CSRF token in missing from request. Request it by the client before calling sign in'\n );\n }\n this.#config.headers = new Headers(payload.headers);\n\n this.#config.headers.set(\n 'Content-Type',\n 'application/x-www-form-urlencoded'\n );\n const params = new URLSearchParams({\n csrfToken,\n json: String(true),\n });\n if (payloadUrl) {\n params.set('callbackUrl', callbackUrl);\n }\n return (await fetchSignIn(this.#config, provider, params)) as T;\n }\n\n this.#config.headers = new Headers();\n const { info, error } = this.#logger;\n\n const providers = await this.listProviders();\n info('Obtaining csrf');\n const csrf = await this.getCsrf();\n\n let csrfToken;\n if ('csrfToken' in csrf) {\n csrfToken = csrf.csrfToken;\n } else {\n throw new Error('Unable to obtain parse CSRF. Request blocked.');\n }\n\n const { credentials } = providers ?? {};\n\n if (!credentials) {\n throw new Error(\n 'Unable to obtain credential provider. Aborting server side sign in.'\n );\n }\n\n const { email, password } = payload ?? {};\n if (provider === 'email' && (!email || !password)) {\n throw new Error(\n 'Server side sign in requires a user email and password.'\n );\n }\n\n info(`Obtaining providers for ${email}`);\n info(`Attempting sign in with email ${email}`);\n const body = JSON.stringify({\n email,\n password,\n csrfToken,\n callbackUrl: credentials.callbackUrl,\n });\n\n const signInRes = await this.callback(provider, body);\n\n const authCookie = signInRes?.headers.get('set-cookie');\n if (!authCookie) {\n throw new Error('authentication failed');\n }\n\n const token = parseToken(signInRes?.headers);\n const possibleError = signInRes?.headers.get('location');\n if (possibleError) {\n let urlError;\n try {\n urlError = new URL(possibleError).searchParams.get('error');\n } catch {\n //noop\n }\n if (urlError) {\n error('Unable to log user in', { error: urlError });\n return undefined as T;\n }\n }\n if (!token) {\n error('Unable to obtain auth token', {\n authCookie,\n signInRes,\n });\n throw new Error('Server login failed');\n }\n info('Server sign in successful', { authCookie });\n\n // last thing to do is be sure the next call is up to date with good headers\n const setCookie = signInRes.headers.get('set-cookie');\n if (setCookie) {\n const cookie = [\n parseCSRF(this.#config.headers),\n parseCallback(signInRes.headers),\n parseToken(signInRes.headers),\n ]\n .filter(Boolean)\n .join('; ');\n updateHeaders(new Headers({ cookie }));\n } else {\n error('Unable to set context after sign in', {\n headers: signInRes.headers,\n });\n }\n\n if (rawResponse) {\n return signInRes as T;\n }\n try {\n return (await signInRes.clone().json()) as T;\n } catch {\n return signInRes as T;\n }\n }\n}\n\nexport function parseCSRF(headers?: Headers) {\n let cookie = headers?.get('set-cookie');\n if (!cookie) {\n cookie = headers?.get('cookie');\n }\n if (!cookie) {\n return undefined;\n }\n const [, token] = /((__Secure-)?nile\\.csrf-token=[^;]+)/.exec(cookie) ?? [];\n return token;\n}\n\nexport function parseCallback(headers?: Headers) {\n let cookie = headers?.get('set-cookie');\n if (!cookie) {\n cookie = headers?.get('cookie');\n }\n if (!cookie) {\n return undefined;\n }\n const [, token] = /((__Secure-)?nile\\.callback-url=[^;]+)/.exec(cookie) ?? [];\n return token;\n}\n\nexport function parseToken(headers?: Headers) {\n let authCookie = headers?.get('set-cookie');\n if (!authCookie) {\n authCookie = headers?.get('cookie');\n }\n if (!authCookie) {\n return undefined;\n }\n const [, token] =\n /((__Secure-)?nile\\.session-token=[^;]+)/.exec(authCookie) ?? [];\n return token;\n}\nfunction parseResetToken(headers: Headers | void): string | void {\n let authCookie = headers?.get('set-cookie');\n if (!authCookie) {\n authCookie = headers?.get('cookie');\n }\n if (!authCookie) {\n return undefined;\n }\n const [, token] = /((__Secure-)?nile\\.reset=[^;]+)/.exec(authCookie) ?? [];\n return token;\n}\n\nexport function defaultCallbackUrl({ config }: { config: Config }) {\n let cb = null;\n let redirect = null;\n const fallbackCb = parseCallback(config.headers);\n if (fallbackCb) {\n const [, value] = fallbackCb.split('=');\n cb = decodeURIComponent(value);\n if (value) {\n redirect = `${new URL(cb).origin}${NileAuthRoutes.PASSWORD_RESET}`;\n }\n }\n return { callbackUrl: cb, redirectUrl: redirect };\n}\n","import { fetchCsrf } from '../api/routes/auth/csrf';\nimport { updateHeaders } from '../utils/Event';\nimport { Config } from '../utils/Config';\n\nimport { parseCallback, parseCSRF, parseToken } from '.';\n\nexport default async function obtainCsrf<T = Response | { csrfToken: string }>(\n config: Config,\n rawResponse = false\n) {\n const res = await fetchCsrf(config);\n // we're gonna use it, so set the headers now.\n const csrfCook = parseCSRF(res.headers);\n\n // prefer the csrf from the headers over the saved one\n if (csrfCook) {\n const [, value] = csrfCook.split('=');\n const [token] = decodeURIComponent(value).split('|');\n\n const setCookie = res.headers.get('set-cookie');\n if (setCookie) {\n const cookie = [\n csrfCook,\n parseCallback(res.headers),\n parseToken(res.headers),\n ]\n .filter(Boolean)\n .join('; ');\n config.headers.set('cookie', cookie);\n updateHeaders(new Headers({ cookie }));\n }\n if (!rawResponse) {\n return { csrfToken: token };\n }\n } else {\n // for csrf, preserve the existing cookies\n const existingCookie = config.headers.get('cookie');\n const cookieParts = [];\n if (existingCookie) {\n cookieParts.push(\n parseToken(config.headers),\n parseCallback(config.headers)\n );\n }\n if (csrfCook) {\n cookieParts.push(csrfCook);\n } else {\n // use the one tha tis already there\n cookieParts.push(parseCSRF(config.headers));\n }\n const cookie = cookieParts.filter(Boolean).join('; ');\n\n // we need to do it in both places in case its the very first time\n config.headers.set('cookie', cookie);\n updateHeaders(new Headers({ cookie }));\n }\n\n if (rawResponse) {\n return res as T;\n }\n\n try {\n return (await res.clone().json()) as T;\n } catch {\n return res as T;\n }\n}\n","import { fetchMe } from '../api/routes/me';\nimport { Config } from '../utils/Config';\nimport { updateHeaders } from '../utils/Event';\nimport { fetchVerifyEmail } from '../api/routes/auth/verify-email';\nimport getCsrf from '../auth/obtainCsrf';\nimport Logger, { LogReturn } from '../utils/Logger';\nimport { parseCallback } from '../auth';\n\nimport { User } from './types';\n\nexport default class Users {\n #config: Config;\n #logger: LogReturn;\n constructor(config: Config) {\n this.#config = config;\n this.#logger = Logger(config, '[me]');\n }\n\n async updateSelf<T = User[] | Response>(\n req: Partial<\n Omit<\n User,\n 'email' | 'tenants' | 'created' | 'updated' | 'emailVerified'\n > & { emailVerified: boolean }\n >,\n rawResponse?: boolean\n ): Promise<T> {\n const res = await fetchMe(this.#config, 'PUT', JSON.stringify(req));\n if (rawResponse) {\n return res as T;\n }\n try {\n return await res?.clone().json();\n } catch {\n return res as T;\n }\n }\n\n async removeSelf(): Promise<Response> {\n const me = await this.getSelf();\n if ('id' in me) {\n this.#config.userId = (me as unknown as User).id;\n }\n const res = await fetchMe(this.#config, 'DELETE');\n updateHeaders(new Headers());\n return res;\n }\n\n async getSelf<T = User | Response>(): Promise<T>;\n async getSelf(rawResponse?: true): Promise<Response>;\n async getSelf<T = User | Response>(rawResponse?: boolean): Promise<T> {\n const res = await fetchMe(this.#config);\n\n if (rawResponse) {\n return res as T;\n }\n try {\n return await res?.clone().json();\n } catch {\n return res as T;\n }\n }\n\n async verifySelf<T = void>(): Promise<T>;\n async verifySelf(rawResponse: true): Promise<Response>;\n async verifySelf<T = Response | User>(\n options: {\n bypassEmail?: boolean;\n callbackUrl?: string;\n },\n rawResponse?: true\n ): Promise<T>;\n async verifySelf<T = void | Response>(\n options?: true | { bypassEmail?: boolean; callbackUrl?: string },\n rawResponse = false\n ): Promise<T> {\n const bypassEmail =\n typeof options === 'object'\n ? options.bypassEmail ?? process.env.NODE_ENV !== 'production'\n : process.env.NODE_ENV !== 'production';\n\n const callbackUrl =\n typeof options === 'object'\n ? options.callbackUrl\n : defaultCallbackUrl(this.#config).callbackUrl;\n\n try {\n const me = await this.getSelf();\n if (me instanceof Response) {\n return me as T;\n }\n const res = await verifyEmailAddress(\n this.#config,\n me,\n String(callbackUrl)\n );\n return res as T;\n } catch {\n this.#logger?.warn(\n \"Unable to verify email. The current user's email will be set to verified anyway. Be sure to configure emails for production.\"\n );\n }\n\n if (bypassEmail) {\n return this.updateSelf({ emailVerified: true }, rawResponse);\n }\n\n this.#logger.error(\n 'Unable to verify email address. Configure your SMTP server in the console.'\n );\n return undefined as T;\n }\n}\n\nasync function verifyEmailAddress(\n config: Config,\n user: User,\n callback: string\n) {\n config.headers.set('content-type', 'application/x-www-form-urlencoded');\n const { csrfToken } = await getCsrf<{ csrfToken: string }>(config);\n const defaults = defaultCallbackUrl(config);\n const callbackUrl = callback ?? String(defaults.callbackUrl);\n const res = await fetchVerifyEmail(\n config,\n 'POST',\n new URLSearchParams({\n csrfToken,\n email: user.email,\n callbackUrl,\n }).toString()\n );\n if (res.status > 299) {\n throw new Error(await res.text());\n }\n return res;\n}\n\nexport function defaultCallbackUrl(config: Config) {\n let cb = null;\n const fallbackCb = parseCallback(config.headers);\n if (fallbackCb) {\n const [, value] = fallbackCb.split('=');\n cb = decodeURIComponent(value);\n }\n return { callbackUrl: cb };\n}\n","import { fetchMe } from '../api/routes/me';\nimport {\n fetchTenant,\n fetchTenants,\n fetchTenantsByUser,\n} from '../api/routes/tenants';\nimport { fetchInvite } from '../api/routes/tenants/[tenantId]/invite';\nimport { fetchInvites } from '../api/routes/tenants/[tenantId]/invites';\nimport { fetchTenantUsers } from '../api/routes/tenants/[tenantId]/users';\nimport { fetchTenantUser } from '../api/routes/tenants/[tenantId]/users/[userId]';\nimport { DefaultNileAuthRoutes } from '../api/utils/routes';\nimport { parseCallback } from '../auth';\nimport obtainCsrf from '../auth/obtainCsrf';\nimport { NileRequest } from '../types';\nimport { User } from '../users/types';\nimport { Config } from '../utils/Config';\nimport Logger, { LogReturn } from '../utils/Logger';\n\nimport { Invite, Tenant } from './types';\n\ntype ReqContext = { userId?: string; tenantId?: string };\ntype JoinTenantRequest = string | ReqContext | { id: string };\n\nexport default class Tenants {\n #logger: LogReturn;\n #config: Config;\n constructor(config: Config) {\n this.#logger = Logger(config, '[tenants]');\n this.#config = config;\n }\n\n create(name: string, rawResponse: true): Promise<Response>;\n create<T = Tenant | Response>(\n name: string,\n rawResponse?: boolean\n ): Promise<T>;\n create<T = Tenant | Response>(\n payload: {\n name: string;\n id?: string;\n },\n rawResponse?: boolean\n ): Promise<T>;\n async create<T = Tenant | Response | undefined>(\n req: { name: string; id?: string } | string,\n rawResponse?: boolean\n ): Promise<T | Response | undefined> {\n let res;\n if (typeof req === 'string') {\n res = await fetchTenants(\n this.#config,\n 'POST',\n JSON.stringify({ name: req })\n );\n } else if (typeof req === 'object' && ('name' in req || 'id' in req)) {\n res = await fetchTenants(this.#config, 'POST', JSON.stringify(req));\n }\n if (rawResponse) {\n return res as T;\n }\n try {\n return await res?.clone().json();\n } catch {\n return res;\n }\n }\n\n delete<T = Response>(id?: string): Promise<T>;\n delete<T = Response>(payload: { id: string }): Promise<T>;\n async delete<T = Response>(\n req: NileRequest<void> | { id?: string } | string | Tenant\n ): Promise<T | Response> {\n if (typeof req === 'string') {\n this.#config.tenantId = req;\n }\n if (typeof req === 'object' && 'id' in req) {\n this.#config.tenantId = req.id;\n }\n const res = await fetchTenant(this.#config, 'DELETE');\n return res;\n }\n\n get<T = Tenant | Response>(): Promise<T>;\n get<T = Tenant | Response>(id: string, rawResponse?: boolean): Promise<T>;\n get(rawResponse: true): Promise<Response>;\n get<T = Tenant | Response>(\n payload: { id: string },\n rawResponse?: boolean\n ): Promise<T>;\n async get<T = Tenant | Response>(\n req: boolean | { id: string } | string | void,\n rawResponse?: boolean\n ): Promise<T> {\n if (typeof req === 'string') {\n this.#config.tenantId = req;\n } else if (typeof req === 'object' && 'id' in req) {\n this.#config.tenantId = req.id;\n }\n const res = await fetchTenant(this.#config, 'GET');\n if (rawResponse === true || req === true) {\n return res as T;\n }\n\n try {\n return await res?.clone().json();\n } catch {\n return res as T;\n }\n }\n\n async update(req: Partial<Tenant>, rawResponse: true): Promise<Response>;\n update<T = Tenant | Response | undefined>(\n req: Partial<Tenant>,\n rawResponse?: boolean\n ): Promise<T>;\n async update<T = Tenant | Response | undefined>(\n req: Partial<Tenant>,\n rawResponse?: boolean\n ): Promise<T> {\n let res;\n if (typeof req === 'object' && ('name' in req || 'id' in req)) {\n const { id, ...remaining } = req;\n if (id) {\n this.#config.tenantId = id;\n }\n res = await fetchTenant(this.#config, 'PUT', JSON.stringify(remaining));\n }\n if (rawResponse) {\n return res as T;\n }\n try {\n return await res?.clone().json();\n } catch {\n return res as T;\n }\n }\n\n list<T = Tenant[] | Response>(): Promise<T>;\n list(rawResponse: true): Promise<Response>;\n async list<T = Tenant[] | Response>(\n req: boolean | NileRequest<void> | Headers\n ): Promise<T | Response | undefined> {\n const res = await fetchTenantsByUser(this.#config);\n if (req === true) {\n return res;\n }\n\n try {\n return await res?.clone().json();\n } catch {\n return res;\n }\n }\n async leaveTenant<T = Response>(\n req?: string | { tenantId: string }\n ): Promise<T> {\n const me = await fetchMe(this.#config);\n try {\n const json = await me.json();\n if ('id' in json) {\n this.#config.userId = json.id;\n }\n } catch {\n // maybe there's already a context, let `fetchTenantUser` deal with it\n }\n if (typeof req === 'string') {\n this.#config.tenantId = req;\n } else {\n this.#handleContext(req);\n }\n return (await fetchTenantUser(this.#config, 'DELETE')) as T;\n }\n\n addMember(req: JoinTenantRequest, rawResponse: true): Promise<Response>;\n addMember<T = User | Response>(\n req: JoinTenantRequest,\n rawResponse?: boolean\n ): Promise<T>;\n async addMember<T = User | Response>(\n req: JoinTenantRequest,\n rawResponse?: boolean\n ): Promise<T> {\n if (typeof req === 'string') {\n this.#config.userId = req;\n } else {\n this.#handleContext(req);\n }\n\n const res = await fetchTenantUser(this.#config, 'PUT');\n return responseHandler(res, rawResponse);\n }\n\n async removeMember(\n req: JoinTenantRequest,\n rawResponse?: boolean\n ): Promise<Response> {\n this.#handleContext(req);\n const res = await fetchTenantUser(this.#config, 'DELETE');\n return responseHandler(res, rawResponse);\n }\n users<T = User[] | Response>(\n req?: boolean | { tenantId?: string },\n rawResponse?: boolean\n ): Promise<T>;\n users(req: true): Promise<Response>;\n async users<T>(\n req?: boolean | { tenantId?: string },\n rawResponse?: boolean\n ): Promise<T> {\n this.#handleContext(req);\n const res = await fetchTenantUsers(this.#config, 'GET');\n\n return responseHandler(\n res,\n rawResponse || (typeof req === 'boolean' && req)\n ) as T;\n }\n\n async invites<T = Invite[] | Response>(): Promise<T> {\n const res = await fetchInvites(this.#config);\n\n return responseHandler(res);\n }\n\n async invite<T = Response | Invite>(\n req: string | { email: string; callbackUrl?: string; redirectUrl?: string },\n rawResponse?: boolean\n ): Promise<T>;\n async invite(\n req: string | { email: string; callbackUrl?: string; redirectUrl?: string },\n rawResponse: true\n ): Promise<Response>;\n async invite<T = Response | Invite>(\n req: string | { email: string; callbackUrl?: string; redirectUrl?: string },\n rawResponse?: boolean\n ): Promise<T> {\n const { csrfToken } = await obtainCsrf<{ csrfToken: string }>(this.#config);\n\n const defaults = defaultCallbackUrl(this.#config);\n let identifier: string = req as string;\n let callbackUrl: string = defaults.callbackUrl as string;\n let redirectUrl: string = defaults.redirectUrl as string;\n\n if (typeof req === 'object') {\n if ('email' in req) {\n identifier = req.email;\n }\n\n if ('callbackUrl' in req) {\n callbackUrl = req.callbackUrl ? req.callbackUrl : '';\n }\n if ('redirectUrl' in req) {\n redirectUrl = req.redirectUrl ? req.redirectUrl : '';\n }\n }\n\n this.#config.headers.set(\n 'Content-Type',\n 'application/x-www-form-urlencoded'\n );\n const res = await fetchInvite(\n this.#config,\n 'POST',\n new URLSearchParams({\n identifier,\n csrfToken,\n callbackUrl,\n redirectUrl,\n }).toString()\n );\n return responseHandler(res, rawResponse);\n }\n\n async acceptInvite<T = Response>(\n req?: { identifier: string; token: string; redirectUrl?: string },\n rawResponse?: boolean\n ): Promise<T> {\n if (!req) {\n throw new Error('The identifier and token are required.');\n }\n const { identifier, token } = req;\n const defaults = defaultCallbackUrl(this.#config);\n const callbackUrl = String(defaults.callbackUrl);\n\n const res = await fetchInvite(\n this.#config,\n 'PUT',\n new URLSearchParams({\n identifier,\n token,\n callbackUrl,\n }).toString()\n );\n return responseHandler(res, rawResponse);\n }\n\n async deleteInvite<T = Response>(req: string | { id: string }): Promise<T> {\n let id = '';\n if (typeof req === 'object') {\n id = req.id;\n } else {\n id = req;\n }\n\n if (!id) {\n throw new Error('An invite id is required.');\n }\n\n const res = await fetchInvite(this.#config, 'DELETE', id);\n return responseHandler(res, true);\n }\n\n #handleContext(req: JoinTenantRequest | boolean | undefined) {\n if (typeof req === 'object') {\n if ('tenantId' in req) {\n this.#config.tenantId = req.tenantId;\n }\n if ('userId' in req) {\n this.#config.tenantId = req.tenantId;\n }\n }\n }\n}\n\nasync function responseHandler(res: Response, rawResponse?: boolean) {\n if (rawResponse) {\n return res;\n }\n try {\n return await res?.clone().json();\n } catch {\n return res;\n }\n}\n\nexport function defaultCallbackUrl(config: Config) {\n let cb = null;\n let redirect = null;\n const fallbackCb = parseCallback(config.headers);\n if (fallbackCb) {\n const [, value] = fallbackCb.split('=');\n cb = decodeURIComponent(value);\n if (value) {\n redirect = `${new URL(cb).origin}${\n config.routePrefix\n }${DefaultNileAuthRoutes.INVITE.replace(\n '{tenantId}',\n String(config.tenantId)\n )}`;\n }\n }\n return { callbackUrl: cb, redirectUrl: redirect };\n}\n","import { Server } from '../../../Server';\nimport { NileConfig } from '../../../types';\nimport { Config } from '../../../utils/Config';\nimport getter from '../GET';\nimport poster from '../POST';\nimport deleter from '../DELETE';\nimport puter from '../PUT';\n\nexport type CTXHandlerType = {\n GET: (req: Request) => Promise<{ response: void | Response; nile: Server }>;\n POST: (req: Request) => Promise<{ response: void | Response; nile: Server }>;\n DELETE: (\n req: Request\n ) => Promise<{ response: void | Response; nile: Server }>;\n PUT: (req: Request) => Promise<{ response: void | Response; nile: Server }>;\n};\nexport function handlersWithContext(config: Config): CTXHandlerType {\n const GET = getter(config.routes, config);\n const POST = poster(config.routes, config);\n const DELETE = deleter(config.routes, config);\n const PUT = puter(config.routes, config);\n return {\n GET: async (req) => {\n const response = await GET(req);\n const updatedConfig = updateConfig(response, config);\n return { response, nile: new Server(updatedConfig) };\n },\n POST: async (req) => {\n const response = await POST(req);\n const updatedConfig = updateConfig(response, config);\n return { response, nile: new Server(updatedConfig) };\n },\n DELETE: async (req) => {\n const response = await DELETE(req);\n const updatedConfig = updateConfig(response, config);\n return { response, nile: new Server(updatedConfig) };\n },\n PUT: async (req) => {\n const response = await PUT(req);\n const updatedConfig = updateConfig(response, config);\n return { response, nile: new Server(updatedConfig) };\n },\n };\n}\n\nexport function updateConfig(\n response: Response | void,\n config: Config\n): NileConfig {\n let origin = 'http://localhost:3000';\n let headers: Headers | null = null;\n\n if (response?.status === 302) {\n const location = response.headers.get('location');\n if (location) {\n const urlLocation = new URL(location);\n origin = urlLocation.origin;\n }\n }\n\n const setCookies: string[] = [];\n\n // Headers are iterable\n if (response?.headers) {\n for (const [key, value] of response.headers) {\n if (key.toLowerCase() === 'set-cookie') {\n setCookies.push(value);\n }\n }\n }\n if (setCookies.length > 0) {\n const cookieHeader = setCookies\n .map((cookieStr) => cookieStr.split(';')[0])\n .join('; ');\n\n headers = new Headers({ cookie: cookieHeader });\n }\n\n return {\n ...config,\n origin,\n headers: headers ?? undefined,\n };\n}\n","import { Server } from '@niledatabase/server/Server';\n\nimport { Config } from '../../utils/Config';\n\nexport function bindHandleOnRequest(instance: Server) {\n return async function handleOnRequest(\n config: Config,\n _init: RequestInit & { request: Request },\n params: RequestInit\n ) {\n if (config.extensions) {\n for (const create of config.extensions) {\n const ext = await create(instance);\n if (ext.onRequest) {\n const modified = await ext.onRequest(_init.request);\n if (modified?.headers) {\n const modHeaders = new Headers(modified.headers);\n const cookie = modHeaders.get('cookie');\n if (cookie) {\n (params.headers as Headers).set('cookie', cookie);\n config.logger.debug(\n `extension ${ext.id ?? create.name} modified cookie`\n );\n }\n }\n }\n config.logger.debug(`extension ${ext.id ?? create.name} ran onRequest`);\n }\n }\n };\n}\n\nexport function buildExtensionConfig(instance: Server) {\n return {\n handleOnRequest: bindHandleOnRequest(instance),\n };\n}\n","import pg from 'pg';\n\nimport { NileConfig } from './types';\nimport { Config } from './utils/Config';\nimport { watchHeaders, watchTenantId, watchUserId } from './utils/Event';\nimport DbManager from './db';\nimport Users from './users';\nimport Tenants from './tenants';\nimport Auth from './auth';\nimport { getTenantId } from './utils/Config/envVars';\nimport Logger from './utils/Logger';\nimport { HEADER_ORIGIN, HEADER_SECURE_COOKIES } from './utils/constants';\nimport {\n CTXHandlerType,\n handlersWithContext,\n} from './api/handlers/withContext';\nimport { getTenantFromHttp } from './utils/fetch';\nimport { buildExtensionConfig } from './api/utils/extensions';\n\nexport class Server {\n users: Users;\n tenants: Tenants;\n auth: Auth;\n #config: Config;\n #handlers: {\n GET: (req: Request) => Promise<void | Response>;\n POST: (req: Request) => Promise<void | Response>;\n DELETE: (req: Request) => Promise<void | Response>;\n PUT: (req: Request) => Promise<void | Response>;\n withContext: CTXHandlerType;\n };\n #paths: {\n get: string[];\n post: string[];\n delete: string[];\n put: string[];\n };\n #manager: DbManager;\n #headers: undefined | Headers;\n\n constructor(config?: NileConfig) {\n this.#config = new Config({\n ...config,\n extensionCtx: buildExtensionConfig(this),\n });\n // watch first, they may mutate first\n watchTenantId((tenantId) => {\n if (tenantId !== this.#config.tenantId) {\n this.#config.tenantId = tenantId;\n this.#reset();\n }\n });\n\n watchUserId((userId) => {\n if (userId !== this.#config.userId) {\n this.#config.userId = userId;\n this.#reset();\n }\n });\n\n watchHeaders((headers) => {\n this.setContext(headers);\n this.#reset();\n });\n\n this.#handlers = {\n ...this.#config.handlers,\n withContext: handlersWithContext(this.#config),\n };\n\n this.#paths = this.#config.paths;\n\n this.#config.tenantId = getTenantId({ config: this.#config });\n this.#manager = new DbManager(this.#config);\n\n // headers first, so instantiation is right the first time\n this.#handleHeaders(config);\n\n this.users = new Users(this.#config);\n this.tenants = new Tenants(this.#config);\n this.auth = new Auth(this.#config);\n }\n\n get db(): pg.Pool & { clearConnections: () => void } {\n const pool = this.#manager.getConnection(this.#config);\n\n return Object.assign(pool, {\n clearConnections: () => {\n this.#manager.clear(this.#config);\n },\n });\n }\n\n /**\n * A convenience function that applies a config and ensures whatever was passed is set properly\n */\n\n getInstance<T = Request | Headers | Record<string, string>>(\n config: NileConfig,\n req?: T\n ): Server {\n const _config = { ...this.#config, ...config };\n\n // be sure the config is up to date\n const updatedConfig = new Config(_config);\n this.#config = new Config(updatedConfig);\n // propagate special config items\n this.#config.tenantId = config.tenantId;\n this.#config.userId = config.userId;\n\n if (req) {\n this.setContext(req);\n }\n\n this.#reset();\n\n return this;\n }\n getPaths() {\n return this.#paths;\n }\n\n get handlers() {\n return this.#handlers;\n }\n /**\n * Allow the setting of headers from a req or header object.\n * Makes it possible to handle REST requests easily\n * Also makes it easy to set user + tenant in some way\n * @param req\n * @returns undefined\n */\n setContext(\n req:\n | Request\n | Headers\n | Record<string, string>\n | unknown\n | { tenantId?: string; userId?: string }\n ) {\n try {\n if (req instanceof Headers) {\n this.#handleHeaders(req);\n this.#reset();\n return;\n } else if (req instanceof Request) {\n this.#handleHeaders(new Headers(req.headers));\n this.#reset();\n\n return;\n }\n } catch {\n //noop\n }\n // we also support setting context in 1 go via tenantId and userId\n // this is a little less good because auth is going to mess with this\n // logically, not technically.\n let ok = false;\n if (req && typeof req === 'object' && 'tenantId' in req) {\n ok = true;\n this.#config.tenantId = req.tenantId as string | undefined;\n }\n if (req && typeof req === 'object' && 'userId' in req) {\n ok = true;\n this.#config.userId = req.userId as string | undefined;\n }\n\n if (ok) {\n return;\n }\n /**\n * in some cases (like express) an object is sent\n * tenantId and userId is also an object, so do that one first\n * We bail out of this execution if that is set, since you can't really do both\n */\n\n if (typeof req === 'object') {\n const headers = new Headers(req as Record<string, string>);\n if (headers) {\n this.#handleHeaders(headers);\n this.#reset();\n\n return;\n }\n }\n const { warn } = Logger(this.#config, '[API]');\n\n if (warn) {\n warn(\n 'Set context expects a Request, Header instance or an object of Record<string, string>'\n );\n }\n }\n\n getContext() {\n return {\n headers: this.#headers,\n userId: this.#config.userId,\n tenantId: this.#config.tenantId,\n };\n }\n\n /**\n * Merge headers together\n * Internally, passed a NileConfig, externally, should be using Headers\n */\n #handleHeaders(\n config?: NileConfig | void | Headers | Record<string, string> | null\n ) {\n const updates: [string, string][] = [];\n let headers;\n this.#headers = new Headers();\n\n if (config instanceof Headers) {\n headers = config;\n } else if (config?.headers) {\n // handle a config object internally,\n headers = config?.headers;\n if (config && config.origin) {\n // DO SOMETHING TO SURFACE A WARNING?\n this.#headers.set(HEADER_ORIGIN, config.origin);\n }\n if (config && config.secureCookies != null) {\n this.#headers.set(HEADER_SECURE_COOKIES, String(config.secureCookies));\n }\n }\n\n if (headers instanceof Headers) {\n headers.forEach((value, key) => {\n updates.push([key.toLowerCase(), value]);\n });\n } else {\n for (const [key, value] of Object.entries(headers ?? {})) {\n updates.push([key.toLowerCase(), value]);\n }\n }\n\n const merged: Record<string, string> = {};\n\n // if we do have a cookie, grab anything useful before it is destroyed.\n this.#config.tenantId = getTenantFromHttp(this.#headers, this.#config);\n\n this.#headers?.forEach((value, key) => {\n // It is expected that if the 'cookie' is missing when you set headers, it should be removed.\n if (key.toLowerCase() !== 'cookie') {\n merged[key.toLowerCase()] = value;\n }\n });\n\n for (const [key, value] of updates) {\n merged[key] = value;\n }\n\n for (const [key, value] of Object.entries(merged)) {\n this.#headers.set(key, value);\n }\n\n this.#config.headers = this.#headers;\n }\n\n /**\n * Allow some internal mutations to reset our config + headers\n */\n #reset = () => {\n this.#config.headers = this.#headers ?? new Headers();\n this.users = new Users(this.#config);\n this.tenants = new Tenants(this.#config);\n this.auth = new Auth(this.#config);\n };\n}\n\nlet server: Server;\nexport function create(config?: NileConfig): Server {\n if (!server) {\n server = new Server(config);\n }\n\n return server;\n}\n"]}
|