{"version":3,"file":"session.cjs","names":["PgBasePreparedQuery","entityKind","NoopCache","hasTelemetry","DrizzleQueryError","tracer","PgSession","PgAsyncDatabase","TransactionRollbackError","sql"],"sources":["../../../src/pg-core/async/session.ts"],"sourcesContent":["import { type Cache, NoopCache, strategyFor } from '~/cache/core/cache.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind } from '~/entity.ts';\nimport { is } from '~/entity.ts';\nimport { TransactionRollbackError } from '~/errors.ts';\nimport { DrizzleQueryError } from '~/errors.ts';\nimport type { Logger } from '~/logger.ts';\nimport type { MigrationConfig, MigrationMeta, MigratorInitFailResponse } from '~/migrator.ts';\nimport { getMigrationsToRun } from '~/migrator.utils.ts';\nimport type { AnyRelations, EmptyRelations } from '~/relations.ts';\nimport { fillPlaceholders, type Query, type SQL, sql } from '~/sql/sql.ts';\nimport { hasTelemetry, tracer } from '~/tracing.ts';\nimport { upgradeIfNeeded } from '~/up-migrations/pg.ts';\nimport { assertUnreachable } from '~/utils.ts';\nimport type { PgDialect } from '../dialect.ts';\nimport type { PgQueryResultHKT, PgTransactionConfig, PreparedQueryConfig } from '../session.ts';\nimport { PgBasePreparedQuery, PgSession } from '../session.ts';\nimport { PgAsyncDatabase } from './db.ts';\n\nexport class PgAsyncPreparedQuery<T extends PreparedQueryConfig> extends PgBasePreparedQuery {\n\tstatic override readonly [entityKind]: string = 'PgAsyncPreparedQuery';\n\n\t/** @internal */\n\treadonly mapper: {\n\t\t(rows: any[]): any;\n\t\tbody?: string;\n\t} | undefined;\n\n\tprivate fastPath: boolean;\n\n\tconstructor(\n\t\tprotected executor: (params?: unknown[]) => Promise<any>,\n\t\tquery: Query,\n\t\tmapper: ((rows: any[]) => any) | undefined,\n\t\treadonly mode: 'arrays' | 'objects' | 'raw',\n\t\tprotected logger: Logger,\n\t\t// cache instance\n\t\tprotected cache: Cache | undefined,\n\t\t// per query related metadata\n\t\tprotected queryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\t// config that was passed through $withCache\n\t\tprotected cacheConfig: WithCacheConfig | undefined,\n\t) {\n\t\tsuper(query);\n\t\tthis.mapper = mapper;\n\t\tif (cache && cache.strategy() === 'all' && cacheConfig === undefined) {\n\t\t\tthis.cacheConfig = { enabled: true, autoInvalidate: true };\n\t\t}\n\t\tif (!this.cacheConfig?.enabled) {\n\t\t\tthis.cacheConfig = undefined;\n\t\t}\n\n\t\tthis.fastPath = cacheConfig === undefined\n\t\t\t&& (cache === undefined || is(cache, NoopCache))\n\t\t\t&& !hasTelemetry;\n\t}\n\n\toverride async execute(placeholderValues: Record<string, unknown> = {}): Promise<T['execute']> {\n\t\tconst { query, logger, executor, mapper, fastPath } = this;\n\n\t\tif (fastPath) {\n\t\t\tconst sql = query._sql ? query._sql.join(' ') : query.sql;\n\t\t\tconst params = query.params.length === 0\n\t\t\t\t? query.params\n\t\t\t\t: fillPlaceholders(query.params, placeholderValues);\n\t\t\tlogger.logQuery(sql, params);\n\t\t\tconst res = executor(params).catch((e) => {\n\t\t\t\tthrow new DrizzleQueryError(sql, params, e as Error);\n\t\t\t});\n\t\t\tif (!mapper) return res;\n\n\t\t\treturn res.then((rows) => mapper(rows));\n\t\t}\n\n\t\treturn tracer.startActiveSpan('drizzle.execute', async (span) => {\n\t\t\tconst params = fillPlaceholders(this.query.params, placeholderValues);\n\t\t\tconst sql = this.query._sql ? this.query._sql.join(' ') : this.query.sql;\n\t\t\tconst { mapper } = this;\n\n\t\t\tspan?.setAttributes({\n\t\t\t\t'drizzle.query.text': sql,\n\t\t\t\t'drizzle.query.params': JSON.stringify(params),\n\t\t\t});\n\n\t\t\tthis.logger.logQuery(sql, params);\n\n\t\t\tconst query = tracer.startActiveSpan('drizzle.driver.execute', async (span) => {\n\t\t\t\tspan?.setAttributes({\n\t\t\t\t\t'drizzle.query.text': sql,\n\t\t\t\t\t'drizzle.query.params': JSON.stringify(params),\n\t\t\t\t});\n\n\t\t\t\t// return await so tracer captures time accurately\n\t\t\t\treturn await this.queryWithCache(sql, params, () => this.executor(params));\n\t\t\t});\n\n\t\t\tif (!mapper) return query;\n\n\t\t\treturn query.then((rows) => tracer.startActiveSpan('drizzle.mapResponse', () => mapper(rows as unknown[])));\n\t\t});\n\t}\n\n\t/** @internal */\n\tprotected async queryWithCache<T>(\n\t\tqueryString: string,\n\t\tparams: any[],\n\t\tquery: () => Promise<T>,\n\t): Promise<T> {\n\t\tconst cacheStrat = this.cache !== undefined && !is(this.cache, NoopCache)\n\t\t\t? await strategyFor(queryString, params, this.queryMetadata, this.cacheConfig)\n\t\t\t: { type: 'skip' as const };\n\n\t\tif (cacheStrat.type === 'skip') {\n\t\t\treturn query().catch((e) => {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t});\n\t\t}\n\n\t\tconst cache = this.cache!;\n\n\t\t// For mutate queries, we should query the database, wait for a response, and then perform invalidation\n\t\tif (cacheStrat.type === 'invalidate') {\n\t\t\treturn Promise.all([\n\t\t\t\tquery(),\n\t\t\t\tcache.onMutate({ tables: cacheStrat.tables }),\n\t\t\t]).then((res) => res[0]).catch((e) => {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t});\n\t\t}\n\n\t\tif (cacheStrat.type === 'try') {\n\t\t\tconst { tables, key, isTag, autoInvalidate, config } = cacheStrat;\n\t\t\tconst fromCache = await cache.get(\n\t\t\t\tkey,\n\t\t\t\ttables,\n\t\t\t\tisTag,\n\t\t\t\tautoInvalidate,\n\t\t\t);\n\n\t\t\tif (fromCache === undefined) {\n\t\t\t\tconst result = await query().catch((e) => {\n\t\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t\t});\n\t\t\t\t// put actual key\n\t\t\t\tawait cache.put(\n\t\t\t\t\tkey,\n\t\t\t\t\tresult,\n\t\t\t\t\t// make sure we send tables that were used in a query only if user wants to invalidate it on each write\n\t\t\t\t\tautoInvalidate ? tables : [],\n\t\t\t\t\tisTag,\n\t\t\t\t\tconfig,\n\t\t\t\t);\n\t\t\t\t// put flag if we should invalidate or not\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\treturn fromCache as unknown as T;\n\t\t}\n\n\t\tassertUnreachable(cacheStrat);\n\t}\n}\n\nexport abstract class PgAsyncSession<\n\tTQueryResult extends PgQueryResultHKT = PgQueryResultHKT,\n\tTRelations extends AnyRelations = EmptyRelations,\n> extends PgSession {\n\tstatic override readonly [entityKind]: string = 'PgAsyncSession';\n\n\tabstract override prepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tmode: 'arrays' | 'objects' | 'raw',\n\t\tname: string | boolean,\n\t\tmapper?: (rows: any[]) => any,\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t\tdriverShape?: unknown,\n\t): PgAsyncPreparedQuery<T>;\n\n\toverride execute<T>(query: SQL): Promise<T[]> {\n\t\treturn tracer.startActiveSpan('drizzle.operation', () => {\n\t\t\tconst prepared = tracer.startActiveSpan('drizzle.prepareQuery', () => {\n\t\t\t\treturn this.prepareQuery<PreparedQueryConfig & { execute: T[] }>(\n\t\t\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\t\t\t'raw',\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn prepared.execute();\n\t\t});\n\t}\n\n\toverride arrays<T>(query: SQL): Promise<T[]> {\n\t\treturn tracer.startActiveSpan('drizzle.operation', () => {\n\t\t\tconst prepared = tracer.startActiveSpan('drizzle.prepareQuery', () => {\n\t\t\t\treturn this.prepareQuery<PreparedQueryConfig & { execute: T[] }>(\n\t\t\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\t\t\t'arrays',\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn prepared.execute();\n\t\t});\n\t}\n\n\toverride objects<T>(query: SQL): Promise<T[]> {\n\t\treturn tracer.startActiveSpan('drizzle.operation', () => {\n\t\t\tconst prepared = tracer.startActiveSpan('drizzle.prepareQuery', () => {\n\t\t\t\treturn this.prepareQuery<PreparedQueryConfig & { execute: T[] }>(\n\t\t\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\t\t\t'objects',\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn prepared.execute();\n\t\t});\n\t}\n\n\tabstract transaction<T>(\n\t\ttransaction: (tx: PgAsyncTransaction<TQueryResult, TRelations>) => Promise<T>,\n\t\tconfig?: PgTransactionConfig,\n\t): Promise<T>;\n}\n\nexport abstract class PgAsyncTransaction<\n\tTQueryResult extends PgQueryResultHKT,\n\tTRelations extends AnyRelations = EmptyRelations,\n> extends PgAsyncDatabase<TQueryResult, TRelations> {\n\tstatic override readonly [entityKind]: string = 'PgAsyncTransaction';\n\n\tconstructor(\n\t\tdialect: PgDialect,\n\t\tsession: PgAsyncSession<any, any>,\n\t\trelations: TRelations,\n\t\tprotected readonly nestedIndex = 0,\n\t\tparseRqbJson: boolean | undefined,\n\t) {\n\t\tsuper(dialect, session, relations, parseRqbJson);\n\t}\n\n\trollback(): never {\n\t\tthrow new TransactionRollbackError();\n\t}\n\n\t/** @internal */\n\tgetTransactionConfigChunks(config: PgTransactionConfig): string[] {\n\t\tconst chunks: string[] = [];\n\t\tif (config.isolationLevel) {\n\t\t\tchunks.push(`isolation level ${config.isolationLevel}`);\n\t\t}\n\t\tif (config.accessMode) {\n\t\t\tchunks.push(config.accessMode);\n\t\t}\n\t\tif (typeof config.deferrable === 'boolean') {\n\t\t\tchunks.push(config.deferrable ? 'deferrable' : 'not deferrable');\n\t\t}\n\t\treturn chunks;\n\t}\n\n\t/** @internal */\n\tgetTransactionConfigSQL(config: PgTransactionConfig): SQL {\n\t\treturn sql.raw(this.getTransactionConfigChunks(config).join(' '));\n\t}\n\n\t/** @internal */\n\tsetTransactionSnapshotSQL(snapshot: string): SQL {\n\t\treturn sql`set transaction snapshot ${snapshot}`.inlineParams();\n\t}\n\n\tasync setTransaction(config: PgTransactionConfig): Promise<unknown> {\n\t\tconst chunks = this.getTransactionConfigChunks(config);\n\t\tif (chunks.length) {\n\t\t\tawait this.session.execute<void>(sql.raw(`set transaction ${chunks.join(' ')}`));\n\t\t}\n\t\tif (typeof config.snapshot === 'string') {\n\t\t\treturn this.session.execute(this.setTransactionSnapshotSQL(config.snapshot));\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tabstract override transaction<T>(\n\t\ttransaction: (tx: PgAsyncTransaction<TQueryResult, TRelations>) => Promise<T>,\n\t): Promise<T>;\n}\n\nexport async function migrate(\n\tmigrations: MigrationMeta[],\n\tdb: PgAsyncDatabase<PgQueryResultHKT, any>,\n\tconfig: string | MigrationConfig,\n): Promise<void | MigratorInitFailResponse> {\n\tconst migrationsTable = typeof config === 'string'\n\t\t? '__drizzle_migrations'\n\t\t: config.migrationsTable ?? '__drizzle_migrations';\n\tconst migrationsSchema = typeof config === 'string' ? 'drizzle' : config.migrationsSchema ?? 'drizzle';\n\n\tawait db.execute(sql`CREATE SCHEMA IF NOT EXISTS ${sql.identifier(migrationsSchema)}`);\n\n\t// Detect DB version and upgrade table schema if needed\n\tconst { newDb } = await upgradeIfNeeded(migrationsSchema, migrationsTable, db, migrations);\n\n\t// Create table with latest schema (version 1) if this is a new database\n\tif (newDb) {\n\t\tconst migrationTableCreate = sql`\n\t\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsSchema)}.${sql.identifier(migrationsTable)} (\n\t\t\t\tid SERIAL PRIMARY KEY,\n\t\t\t\thash text NOT NULL,\n\t\t\t\tcreated_at bigint,\n\t\t\t\tname text,\n\t\t\t\tapplied_at timestamp with time zone DEFAULT now()\n\t\t\t)\n\t\t`;\n\t\tawait db.execute(migrationTableCreate);\n\t}\n\n\tconst dbMigrations = await db.session.objects<{ id: number; hash: string; created_at: string; name: string }>(\n\t\tsql`select id, hash, created_at, name from ${sql.identifier(migrationsSchema)}.${sql.identifier(migrationsTable)}`,\n\t);\n\n\tif (typeof config === 'object' && config.init) {\n\t\tif (dbMigrations.length) {\n\t\t\treturn { exitCode: 'databaseMigrations' as const };\n\t\t}\n\n\t\tif (migrations.length > 1) {\n\t\t\treturn { exitCode: 'localMigrations' as const };\n\t\t}\n\n\t\tconst [migration] = migrations;\n\n\t\tif (!migration) return;\n\n\t\tawait db.execute(\n\t\t\tsql`insert into ${sql.identifier(migrationsSchema)}.${\n\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t} (\"hash\", \"created_at\", \"name\") values(${migration.hash}, ${migration.folderMillis}, ${migration.name ?? null})`,\n\t\t);\n\n\t\treturn;\n\t}\n\n\tconst migrationsToRun = getMigrationsToRun({ localMigrations: migrations, dbMigrations });\n\tawait db.transaction(async (tx) => {\n\t\tfor (const migration of migrationsToRun) {\n\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\tawait tx.execute(sql.raw(stmt));\n\t\t\t}\n\t\t\tawait tx.execute(\n\t\t\t\tsql`insert into ${sql.identifier(migrationsSchema)}.${\n\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t} (\"hash\", \"created_at\", \"name\") values(${migration.hash}, ${migration.folderMillis}, ${\n\t\t\t\t\tmigration.name ?? null\n\t\t\t\t})`,\n\t\t\t);\n\t\t}\n\t});\n}\n"],"mappings":";;;;;;;;;;;;;;AAmBA,IAAa,uBAAb,cAAyEA,4CAAoB;CAC5F,QAA0BC,0BAAsB;;CAGhD,AAAS;CAKT,AAAQ;CAER,YACC,AAAU,UACV,OACA,QACA,AAAS,MACT,AAAU,QAEV,AAAU,OAEV,AAAU,eAKV,AAAU,aACT;AACD,QAAM,MAAM;EAfF;EAGD;EACC;EAEA;EAEA;EAKA;AAGV,OAAK,SAAS;AACd,MAAI,SAAS,MAAM,UAAU,KAAK,SAAS,gBAAgB,OAC1D,MAAK,cAAc;GAAE,SAAS;GAAM,gBAAgB;GAAM;AAE3D,MAAI,CAAC,KAAK,aAAa,QACtB,MAAK,cAAc;AAGpB,OAAK,WAAW,gBAAgB,WAC3B,UAAU,8BAAgB,OAAOC,gCAAU,KAC5C,CAACC;;CAGN,MAAe,QAAQ,oBAA6C,EAAE,EAAyB;EAC9F,MAAM,EAAE,OAAO,QAAQ,UAAU,QAAQ,aAAa;AAEtD,MAAI,UAAU;GACb,MAAM,MAAM,MAAM,OAAO,MAAM,KAAK,KAAK,IAAI,GAAG,MAAM;GACtD,MAAM,SAAS,MAAM,OAAO,WAAW,IACpC,MAAM,4CACW,MAAM,QAAQ,kBAAkB;AACpD,UAAO,SAAS,KAAK,OAAO;GAC5B,MAAM,MAAM,SAAS,OAAO,CAAC,OAAO,MAAM;AACzC,UAAM,IAAIC,8BAAkB,KAAK,QAAQ,EAAW;KACnD;AACF,OAAI,CAAC,OAAQ,QAAO;AAEpB,UAAO,IAAI,MAAM,SAAS,OAAO,KAAK,CAAC;;AAGxC,SAAOC,oBAAO,gBAAgB,mBAAmB,OAAO,SAAS;GAChE,MAAM,4CAA0B,KAAK,MAAM,QAAQ,kBAAkB;GACrE,MAAM,MAAM,KAAK,MAAM,OAAO,KAAK,MAAM,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM;GACrE,MAAM,EAAE,WAAW;AAEnB,SAAM,cAAc;IACnB,sBAAsB;IACtB,wBAAwB,KAAK,UAAU,OAAO;IAC9C,CAAC;AAEF,QAAK,OAAO,SAAS,KAAK,OAAO;GAEjC,MAAM,QAAQA,oBAAO,gBAAgB,0BAA0B,OAAO,SAAS;AAC9E,UAAM,cAAc;KACnB,sBAAsB;KACtB,wBAAwB,KAAK,UAAU,OAAO;KAC9C,CAAC;AAGF,WAAO,MAAM,KAAK,eAAe,KAAK,cAAc,KAAK,SAAS,OAAO,CAAC;KACzE;AAEF,OAAI,CAAC,OAAQ,QAAO;AAEpB,UAAO,MAAM,MAAM,SAASA,oBAAO,gBAAgB,6BAA6B,OAAO,KAAkB,CAAC,CAAC;IAC1G;;;CAIH,MAAgB,eACf,aACA,QACA,OACa;EACb,MAAM,aAAa,KAAK,UAAU,UAAa,qBAAI,KAAK,OAAOH,gCAAU,GACtE,6CAAkB,aAAa,QAAQ,KAAK,eAAe,KAAK,YAAY,GAC5E,EAAE,MAAM,QAAiB;AAE5B,MAAI,WAAW,SAAS,OACvB,QAAO,OAAO,CAAC,OAAO,MAAM;AAC3B,SAAM,IAAIE,8BAAkB,aAAa,QAAQ,EAAW;IAC3D;EAGH,MAAM,QAAQ,KAAK;AAGnB,MAAI,WAAW,SAAS,aACvB,QAAO,QAAQ,IAAI,CAClB,OAAO,EACP,MAAM,SAAS,EAAE,QAAQ,WAAW,QAAQ,CAAC,CAC7C,CAAC,CAAC,MAAM,QAAQ,IAAI,GAAG,CAAC,OAAO,MAAM;AACrC,SAAM,IAAIA,8BAAkB,aAAa,QAAQ,EAAW;IAC3D;AAGH,MAAI,WAAW,SAAS,OAAO;GAC9B,MAAM,EAAE,QAAQ,KAAK,OAAO,gBAAgB,WAAW;GACvD,MAAM,YAAY,MAAM,MAAM,IAC7B,KACA,QACA,OACA,eACA;AAED,OAAI,cAAc,QAAW;IAC5B,MAAM,SAAS,MAAM,OAAO,CAAC,OAAO,MAAM;AACzC,WAAM,IAAIA,8BAAkB,aAAa,QAAQ,EAAW;MAC3D;AAEF,UAAM,MAAM,IACX,KACA,QAEA,iBAAiB,SAAS,EAAE,EAC5B,OACA,OACA;AAED,WAAO;;AAGR,UAAO;;AAGR,oCAAkB,WAAW;;;AAI/B,IAAsB,iBAAtB,cAGUE,kCAAU;CACnB,QAA0BL,0BAAsB;CAehD,AAAS,QAAW,OAA0B;AAC7C,SAAOI,oBAAO,gBAAgB,2BAA2B;AASxD,UARiBA,oBAAO,gBAAgB,8BAA8B;AACrE,WAAO,KAAK,aACX,KAAK,QAAQ,WAAW,MAAM,EAC9B,OACA,MACA;KACA,CAEc,SAAS;IACxB;;CAGH,AAAS,OAAU,OAA0B;AAC5C,SAAOA,oBAAO,gBAAgB,2BAA2B;AASxD,UARiBA,oBAAO,gBAAgB,8BAA8B;AACrE,WAAO,KAAK,aACX,KAAK,QAAQ,WAAW,MAAM,EAC9B,UACA,MACA;KACA,CAEc,SAAS;IACxB;;CAGH,AAAS,QAAW,OAA0B;AAC7C,SAAOA,oBAAO,gBAAgB,2BAA2B;AASxD,UARiBA,oBAAO,gBAAgB,8BAA8B;AACrE,WAAO,KAAK,aACX,KAAK,QAAQ,WAAW,MAAM,EAC9B,WACA,MACA;KACA,CAEc,SAAS;IACxB;;;AASJ,IAAsB,qBAAtB,cAGUE,yCAA0C;CACnD,QAA0BN,0BAAsB;CAEhD,YACC,SACA,SACA,WACA,AAAmB,cAAc,GACjC,cACC;AACD,QAAM,SAAS,SAAS,WAAW,aAAa;EAH7B;;CAMpB,WAAkB;AACjB,QAAM,IAAIO,sCAA0B;;;CAIrC,2BAA2B,QAAuC;EACjE,MAAM,SAAmB,EAAE;AAC3B,MAAI,OAAO,eACV,QAAO,KAAK,mBAAmB,OAAO,iBAAiB;AAExD,MAAI,OAAO,WACV,QAAO,KAAK,OAAO,WAAW;AAE/B,MAAI,OAAO,OAAO,eAAe,UAChC,QAAO,KAAK,OAAO,aAAa,eAAe,iBAAiB;AAEjE,SAAO;;;CAIR,wBAAwB,QAAkC;AACzD,SAAOC,iBAAI,IAAI,KAAK,2BAA2B,OAAO,CAAC,KAAK,IAAI,CAAC;;;CAIlE,0BAA0B,UAAuB;AAChD,SAAO,gBAAG,4BAA4B,WAAW,cAAc;;CAGhE,MAAM,eAAe,QAA+C;EACnE,MAAM,SAAS,KAAK,2BAA2B,OAAO;AACtD,MAAI,OAAO,OACV,OAAM,KAAK,QAAQ,QAAcA,iBAAI,IAAI,mBAAmB,OAAO,KAAK,IAAI,GAAG,CAAC;AAEjF,MAAI,OAAO,OAAO,aAAa,SAC9B,QAAO,KAAK,QAAQ,QAAQ,KAAK,0BAA0B,OAAO,SAAS,CAAC;;;AAU/E,eAAsB,QACrB,YACA,IACA,QAC2C;CAC3C,MAAM,kBAAkB,OAAO,WAAW,WACvC,yBACA,OAAO,mBAAmB;CAC7B,MAAM,mBAAmB,OAAO,WAAW,WAAW,YAAY,OAAO,oBAAoB;AAE7F,OAAM,GAAG,QAAQ,gBAAG,+BAA+BA,iBAAI,WAAW,iBAAiB,GAAG;CAGtF,MAAM,EAAE,UAAU,iDAAsB,kBAAkB,iBAAiB,IAAI,WAAW;AAG1F,KAAI,OAAO;EACV,MAAM,uBAAuB,gBAAG;gCACFA,iBAAI,WAAW,iBAAiB,CAAC,GAAGA,iBAAI,WAAW,gBAAgB,CAAC;;;;;;;;AAQlG,QAAM,GAAG,QAAQ,qBAAqB;;CAGvC,MAAM,eAAe,MAAM,GAAG,QAAQ,QACrC,gBAAG,0CAA0CA,iBAAI,WAAW,iBAAiB,CAAC,GAAGA,iBAAI,WAAW,gBAAgB,GAChH;AAED,KAAI,OAAO,WAAW,YAAY,OAAO,MAAM;AAC9C,MAAI,aAAa,OAChB,QAAO,EAAE,UAAU,sBAA+B;AAGnD,MAAI,WAAW,SAAS,EACvB,QAAO,EAAE,UAAU,mBAA4B;EAGhD,MAAM,CAAC,aAAa;AAEpB,MAAI,CAAC,UAAW;AAEhB,QAAM,GAAG,QACR,gBAAG,eAAeA,iBAAI,WAAW,iBAAiB,CAAC,GAClDA,iBAAI,WAAW,gBAAgB,CAC/B,yCAAyC,UAAU,KAAK,IAAI,UAAU,aAAa,IAAI,UAAU,QAAQ,KAAK,GAC/G;AAED;;CAGD,MAAM,8DAAqC;EAAE,iBAAiB;EAAY;EAAc,CAAC;AACzF,OAAM,GAAG,YAAY,OAAO,OAAO;AAClC,OAAK,MAAM,aAAa,iBAAiB;AACxC,QAAK,MAAM,QAAQ,UAAU,IAC5B,OAAM,GAAG,QAAQA,iBAAI,IAAI,KAAK,CAAC;AAEhC,SAAM,GAAG,QACR,gBAAG,eAAeA,iBAAI,WAAW,iBAAiB,CAAC,GAClDA,iBAAI,WAAW,gBAAgB,CAC/B,yCAAyC,UAAU,KAAK,IAAI,UAAU,aAAa,IACnF,UAAU,QAAQ,KAClB,GACD;;GAED"}