{"version":3,"sources":["../../src/drizzle/index.ts","../../src/drizzle/driver.ts","../../src/drizzle/session.ts","../../src/drizzle/migrator.ts","../../src/drizzle/drizzle-migrator.ts","../../src/drizzle/migration-bridge.ts","../../src/drizzle/auto-drizzle-migrator.ts","../../src/drizzle/schema-generator.ts","../../src/drizzle/schema-diff.ts"],"sourcesContent":["/**\n * Drizzle ORM adapter for postgres.do\n *\n * This module provides first-class Drizzle ORM integration with postgres.do,\n * enabling type-safe database queries in Cloudflare Workers and other\n * serverless environments.\n *\n * @example Basic usage\n * ```typescript\n * import { drizzle } from 'postgres.do/drizzle'\n * import postgres from 'postgres.do'\n * import { users } from './schema'\n *\n * const sql = postgres('postgres://db.postgres.do/mydb')\n * const db = drizzle(sql)\n *\n * // Type-safe queries\n * const allUsers = await db.select().from(users)\n * ```\n *\n * @example With schema and relations\n * ```typescript\n * import { drizzle } from 'postgres.do/drizzle'\n * import postgres from 'postgres.do'\n * import * as schema from './schema'\n *\n * const sql = postgres('postgres://db.postgres.do/mydb')\n * const db = drizzle(sql, { schema })\n *\n * // Query with relations\n * const usersWithPosts = await db.query.users.findMany({\n *   with: { posts: true }\n * })\n * ```\n *\n * @example In a Durable Object\n * ```typescript\n * import { drizzle } from 'postgres.do/drizzle'\n * import { PostgresDO } from 'postgres.do'\n * import * as schema from './schema'\n *\n * export class MyDatabase extends PostgresDO {\n *   db = drizzle(this.sql, { schema })\n *\n *   async getActiveUsers() {\n *     return this.db\n *       .select()\n *       .from(schema.users)\n *       .where(eq(schema.users.active, true))\n *   }\n * }\n * ```\n *\n * @packageDocumentation\n */\n\n// Main exports\nexport { drizzle, PostgresDoDatabase, type PostgresDoDriverOptions } from './driver.js'\n\n// Session exports\nexport {\n  PostgresDoSession,\n  PostgresDoPreparedQuery,\n  PostgresDoTransaction,\n  type PostgresDoClient,\n  type PostgresDoSessionOptions,\n  type PostgresDoQueryResultHKT,\n} from './session.js'\n\n// Migrator export (re-exported for convenience, also available at postgres.do/drizzle/migrator)\nexport { migrate } from './migrator.js'\n\n// ============================================================================\n// Drizzle Migrations Integration\n// ============================================================================\n\n// Drizzle migrator for postgres.do\nexport {\n  DrizzleMigrator,\n  createDrizzleMigrator,\n  parseDrizzleJournal,\n  bundleDrizzleMigrations,\n  type DrizzleJournal,\n  type DrizzleJournalEntry,\n  type BundledDrizzleMigrations,\n  type DrizzleMigrationRecord,\n  type DrizzleMigrationResult,\n  type DrizzleMigrationProgressEvent,\n  type DrizzleMigratorConfig,\n  type DrizzleMigratorState,\n} from './drizzle-migrator.js'\n\n// Migration bridge between Drizzle and postgres.do\nexport {\n  MigrationBridge,\n  createMigrationBridge,\n  convertDrizzleToPostgresDo,\n  runCombinedMigrations,\n  type PostgresDoMigration,\n  type MigrationBridgeConfig,\n  type CombinedMigratorConfig,\n} from './migration-bridge.js'\n\n// Auto Drizzle Migrator - unified migration runner for DO init\nexport {\n  AutoDrizzleMigrator,\n  createAutoDrizzleMigrator,\n  type AutoDrizzleMigratorConfig,\n  type AutoDrizzleMigrationResult,\n  type AutoDrizzleMigratorState,\n} from './auto-drizzle-migrator.js'\n\n// Schema generator exports\nexport {\n  // High-level API\n  generateSchemaFromTypeScript,\n  generateSchemaFromDatabase,\n  generateSchemaWithTypes,\n  // Low-level API\n  introspectDatabase,\n  parseTypeScriptInterfaces,\n  convertInterfacesToTables,\n  generateDrizzleSchema,\n  // Types\n  type SchemaColumnDefinition,\n  type SchemaTableDefinition,\n  type SchemaIndexDefinition,\n  type SchemaEnumDefinition,\n  type DatabaseSchemaDefinition,\n  type SchemaGeneratorOptions,\n  type TypeScriptInterface,\n  type TypeScriptProperty,\n  type DrizzleColumnType,\n} from './schema-generator.js'\n\n// ============================================================================\n// Schema Diff and Sync\n// ============================================================================\n\n// Schema diff and migration generation\nexport {\n  // High-level API\n  compareSchemas,\n  compareDatabaseToSchema,\n  diffSchemas,\n  generateMigrationSQL,\n  generateDrizzleMigration,\n  // Formatting\n  formatSchemaDiff,\n  formatSchemaDiffJSON,\n  // Types\n  type SchemaDiff,\n  type SchemaDiffOptions,\n  type MigrationSQLOptions,\n  type GeneratedMigration,\n  type TableChange,\n  type ColumnChange,\n  type IndexChange,\n  type EnumChange,\n  type ColumnAttributeChange,\n  type ChangeType,\n} from './schema-diff.js'\n","/**\n * Drizzle ORM Driver for postgres.do\n *\n * This module provides the main entry point for using Drizzle ORM\n * with postgres.do. It creates a Drizzle database instance that\n * uses the postgres.do client for query execution.\n *\n * @example\n * ```typescript\n * import { drizzle } from 'postgres.do/drizzle'\n * import postgres from 'postgres.do'\n * import * as schema from './schema'\n *\n * const sql = postgres('postgres://db.postgres.do/mydb')\n * const db = drizzle(sql, { schema })\n *\n * // Full type safety!\n * const users = await db.select().from(schema.users)\n * ```\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { entityKind } from 'drizzle-orm/entity'\nimport { DefaultLogger, type Logger } from 'drizzle-orm/logger'\nimport { PgDatabase } from 'drizzle-orm/pg-core/db'\nimport { PgDialect } from 'drizzle-orm/pg-core/dialect'\nimport {\n  createTableRelationsHelpers,\n  extractTablesRelationalConfig,\n  type RelationalSchemaConfig,\n  type TablesRelationalConfig,\n} from 'drizzle-orm/relations'\nimport type { DrizzleConfig } from 'drizzle-orm/utils'\n\nimport type { Sql } from '../types.js'\nimport { PostgresDoSession, type PostgresDoClient, type PostgresDoQueryResultHKT } from './session.js'\n\n/**\n * Driver options for postgres.do\n */\nexport interface PostgresDoDriverOptions {\n  logger?: Logger\n}\n\n/**\n * Drizzle Database class for postgres.do\n *\n * This class extends PgDatabase with postgres.do-specific functionality.\n */\nexport class PostgresDoDatabase<\n  TSchema extends Record<string, unknown> = Record<string, never>\n> extends PgDatabase<PostgresDoQueryResultHKT, TSchema> {\n  static override readonly [entityKind]: string = 'PostgresDoDatabase'\n}\n\n/**\n * Construct a Drizzle database instance from a postgres.do client\n */\nfunction construct<TSchema extends Record<string, unknown> = Record<string, never>>(\n  client: PostgresDoClient,\n  config: DrizzleConfig<TSchema> = {}\n): PostgresDoDatabase<TSchema> & { $client: PostgresDoClient } {\n  // Configure transparent parsers for date/time types\n  // This ensures Drizzle handles the type conversions\n  const transparentParser = (val: unknown) => val\n  if (client.options) {\n    const parsers = client.options.parsers ?? {}\n    const serializers = client.options.serializers ?? {}\n\n    // Date/time types that should be passed through\n    const passThroughTypes = [\n      '1184', // timestamptz\n      '1082', // date\n      '1083', // time\n      '1114', // timestamp\n      '1182', // date[]\n      '1185', // timestamptz[]\n      '1115', // timestamp[]\n      '1231', // numeric[]\n    ]\n\n    for (const type of passThroughTypes) {\n      parsers[Number(type)] = transparentParser as (value: string) => unknown\n      serializers[Number(type)] = transparentParser as (value: unknown) => string\n    }\n\n    // JSON types\n    serializers[114] = transparentParser as (value: unknown) => string // json\n    serializers[3802] = transparentParser as (value: unknown) => string // jsonb\n\n    client.options.parsers = parsers\n    client.options.serializers = serializers\n  }\n\n  // Create dialect without casing config (drizzle-orm 0.30+ doesn't take constructor args)\n  const dialect = new PgDialect()\n\n  let logger: Logger | undefined\n  if (config.logger === true) {\n    logger = new DefaultLogger()\n  } else if (config.logger !== false && config.logger !== undefined) {\n    logger = config.logger\n  }\n\n  let schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined\n  if (config.schema) {\n    const tablesConfig = extractTablesRelationalConfig(\n      config.schema,\n      createTableRelationsHelpers\n    )\n    schema = {\n      fullSchema: config.schema,\n      schema: tablesConfig.tables,\n      tableNamesMap: tablesConfig.tableNamesMap,\n    }\n  }\n\n  // Build session options carefully to avoid undefined values\n  const sessionOptions = logger !== undefined ? { logger } : {}\n  const session = new PostgresDoSession(client, dialect, schema, sessionOptions)\n  const db = new PostgresDoDatabase(dialect, session, schema as any) as unknown as PostgresDoDatabase<TSchema> & { $client: PostgresDoClient }\n\n  // Attach the client for direct access\n  db.$client = client\n\n  return db\n}\n\n/**\n * Create a Drizzle ORM instance for postgres.do\n *\n * This function creates a Drizzle database instance that uses the\n * postgres.do client for query execution. It supports all Drizzle\n * features including schemas, relations, and type-safe queries.\n *\n * @param client - The postgres.do SQL client\n * @param config - Optional Drizzle configuration\n * @returns A Drizzle database instance\n *\n * @example Basic usage\n * ```typescript\n * import { drizzle } from 'postgres.do/drizzle'\n * import postgres from 'postgres.do'\n *\n * const sql = postgres('postgres://db.postgres.do/mydb')\n * const db = drizzle(sql)\n *\n * const users = await db.select().from(users)\n * ```\n *\n * @example With schema for type safety\n * ```typescript\n * import { drizzle } from 'postgres.do/drizzle'\n * import postgres from 'postgres.do'\n * import * as schema from './schema'\n *\n * const sql = postgres('postgres://db.postgres.do/mydb')\n * const db = drizzle(sql, { schema })\n *\n * // Full type inference\n * const result = await db.query.users.findMany({\n *   with: { posts: true }\n * })\n * ```\n *\n * @example With logging\n * ```typescript\n * import { drizzle } from 'postgres.do/drizzle'\n * import postgres from 'postgres.do'\n *\n * const sql = postgres('postgres://db.postgres.do/mydb')\n * const db = drizzle(sql, { logger: true })\n * ```\n */\nexport function drizzle<\n  TSchema extends Record<string, unknown> = Record<string, never>,\n  TClient extends Sql = Sql\n>(\n  client: TClient,\n  config?: DrizzleConfig<TSchema>\n): PostgresDoDatabase<TSchema> & { $client: TClient }\n\nexport function drizzle<\n  TSchema extends Record<string, unknown> = Record<string, never>,\n  TClient extends Sql = Sql\n>(\n  config: DrizzleConfig<TSchema> & { client: TClient }\n): PostgresDoDatabase<TSchema> & { $client: TClient }\n\nexport function drizzle<\n  TSchema extends Record<string, unknown> = Record<string, never>,\n  TClient extends Sql = Sql\n>(\n  clientOrConfig: TClient | (DrizzleConfig<TSchema> & { client: TClient }),\n  maybeConfig?: DrizzleConfig<TSchema>\n): PostgresDoDatabase<TSchema> & { $client: TClient } {\n  // Handle single config object with client\n  if (typeof clientOrConfig === 'object' && clientOrConfig !== null && 'client' in clientOrConfig) {\n    const { client, ...drizzleConfig } = clientOrConfig\n    return construct(client as PostgresDoClient, drizzleConfig) as unknown as PostgresDoDatabase<TSchema> & { $client: TClient }\n  }\n\n  // Handle client with optional config\n  return construct(clientOrConfig as unknown as PostgresDoClient, maybeConfig) as unknown as PostgresDoDatabase<TSchema> & { $client: TClient }\n}\n\n// Add mock function for testing\ndrizzle.mock = function mock<TSchema extends Record<string, unknown> = Record<string, never>>(\n  config?: DrizzleConfig<TSchema>\n): PostgresDoDatabase<TSchema> & { $client: '$client is not available on drizzle.mock()' } {\n  return construct(\n    {\n      unsafe: async () => [],\n      options: {\n        parsers: {},\n        serializers: {},\n      },\n    },\n    config\n  ) as unknown as PostgresDoDatabase<TSchema> & { $client: '$client is not available on drizzle.mock()' }\n}\n","/**\n * Drizzle ORM Session for postgres.do\n *\n * This module provides the session layer that connects Drizzle ORM\n * to the postgres.do client. It implements the PgSession interface\n * required by Drizzle's PostgreSQL dialect.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { entityKind } from 'drizzle-orm/entity'\nimport { NoopLogger, type Logger } from 'drizzle-orm/logger'\nimport type { PgDialect } from 'drizzle-orm/pg-core/dialect'\nimport { PgTransaction } from 'drizzle-orm/pg-core'\nimport type { SelectedFieldsOrdered } from 'drizzle-orm/pg-core/query-builders/select.types'\nimport type { PgTransactionConfig, PreparedQueryConfig, PgQueryResultHKT } from 'drizzle-orm/pg-core/session'\nimport { PgPreparedQuery, PgSession } from 'drizzle-orm/pg-core/session'\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from 'drizzle-orm/relations'\nimport type { Query } from 'drizzle-orm/sql/sql'\nimport { fillPlaceholders, sql } from 'drizzle-orm/sql/sql'\nimport type { Assume } from 'drizzle-orm/utils'\n\nimport type { Sql, TransactionSql, Row } from '../types.js'\n\n// Access to dialect through base class - abstract transaction method is implemented in PostgresDoTransaction\ndeclare abstract class PgTransactionWithDialect<\n  TQueryResult extends PgQueryResultHKT,\n  TFullSchema extends Record<string, unknown>,\n  TSchema extends TablesRelationalConfig\n> extends PgTransaction<TQueryResult, TFullSchema, TSchema> {\n  readonly dialect: PgDialect\n}\n\n/**\n * PostgresDO-compatible client interface\n *\n * This interface represents the client that Drizzle will use to execute queries.\n * It's compatible with both the main Sql client and transaction clients.\n */\nexport interface PostgresDoClient {\n  /**\n   * Execute raw SQL query with parameters\n   */\n  unsafe<T extends Row = Row>(query: string, params?: unknown[]): Promise<T[]>\n\n  /**\n   * Begin a transaction (only on main client)\n   */\n  begin?<T>(\n    fn: (sql: TransactionSql) => Promise<T>,\n    options?: { isolationLevel?: string; readOnly?: boolean; deferrable?: boolean }\n  ): Promise<T>\n\n  /**\n   * Create a savepoint within a transaction (only on transaction client)\n   */\n  savepoint?<T>(fn: (sql: TransactionSql) => Promise<T>): Promise<T>\n\n  /**\n   * Client options (for type parser configuration)\n   */\n  options?: {\n    parsers?: Record<number, (value: string) => unknown>\n    serializers?: Record<number, (value: unknown) => string>\n  }\n}\n\n/**\n * Prepared query implementation for postgres.do\n *\n * This class handles the execution of prepared queries through\n * the postgres.do client's unsafe() method.\n */\nexport class PostgresDoPreparedQuery<T extends PreparedQueryConfig> extends PgPreparedQuery<T> {\n  static override readonly [entityKind]: string = 'PostgresDoPreparedQuery'\n\n  constructor(\n    private client: PostgresDoClient,\n    private queryString: string,\n    private params: unknown[],\n    private logger: Logger,\n    private fields: SelectedFieldsOrdered | undefined,\n    private _isResponseInArrayMode: boolean,\n    private customResultMapper?: (rows: unknown[][]) => T['execute']\n  ) {\n    super({ sql: queryString, params })\n  }\n\n  /**\n   * Execute the prepared query with placeholder values\n   */\n  override async execute(placeholderValues: Record<string, unknown> = {}): Promise<T['execute']> {\n    const params = fillPlaceholders(this.params, placeholderValues)\n    this.logger.logQuery(this.queryString, params)\n\n    const { fields, queryString, client, customResultMapper } = this\n\n    if (!fields && !customResultMapper) {\n      // Return raw results for non-select queries\n      return client.unsafe(queryString, params)\n    }\n\n    // For select queries, we need array mode results for mapping\n    // The postgres.do client returns objects, so we convert them to arrays\n    const rows = await client.unsafe(queryString, params)\n\n    if (customResultMapper) {\n      // If we have field definitions, convert object rows to array rows\n      if (fields) {\n        const arrayRows = rows.map((row) => {\n          return fields.map((field) => {\n            const fieldWithPath = field as { path?: string[]; name?: string }\n            const key = fieldWithPath.path?.join('.') ?? fieldWithPath.name ?? ''\n            return (row as Record<string, unknown>)[key]\n          })\n        })\n        return customResultMapper(arrayRows as unknown[][])\n      }\n      return customResultMapper(rows as unknown as unknown[][])\n    }\n\n    // Return object rows directly - Drizzle will handle result mapping via the customResultMapper\n    return rows\n  }\n\n  /**\n   * Get all rows as objects\n   */\n  async all(placeholderValues: Record<string, unknown> = {}): Promise<T['all']> {\n    const params = fillPlaceholders(this.params, placeholderValues)\n    this.logger.logQuery(this.queryString, params)\n    return this.client.unsafe(this.queryString, params)\n  }\n\n  /** @internal */\n  isResponseInArrayMode(): boolean {\n    return this._isResponseInArrayMode\n  }\n}\n\n/**\n * Session options for postgres.do\n */\nexport interface PostgresDoSessionOptions {\n  logger?: Logger\n}\n\n/**\n * Drizzle ORM Session for postgres.do\n *\n * This class implements the PgSession interface and provides\n * the bridge between Drizzle's query builders and the postgres.do client.\n */\nexport class PostgresDoSession<\n  TFullSchema extends Record<string, unknown>,\n  TSchema extends TablesRelationalConfig\n> extends PgSession<PostgresDoQueryResultHKT, TFullSchema, TSchema> {\n  static override readonly [entityKind]: string = 'PostgresDoSession'\n\n  logger: Logger\n  declare client: PostgresDoClient\n\n  constructor(\n    client: PostgresDoClient,\n    dialect: PgDialect,\n    private schema: RelationalSchemaConfig<TSchema> | undefined,\n    public options: PostgresDoSessionOptions = {}\n  ) {\n    super(dialect)\n    this.client = client\n    this.logger = options.logger ?? new NoopLogger()\n  }\n\n  /**\n   * Prepare a query for execution\n   */\n  override prepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n    query: Query,\n    fields: SelectedFieldsOrdered | undefined,\n    _name: string | undefined,\n    isResponseInArrayMode: boolean,\n    customResultMapper?: (rows: unknown[][]) => T['execute']\n  ): PgPreparedQuery<T> {\n    return new PostgresDoPreparedQuery(\n      this.client,\n      query.sql,\n      query.params,\n      this.logger,\n      fields,\n      isResponseInArrayMode,\n      customResultMapper\n    )\n  }\n\n  /**\n   * Execute a raw query and return values\n   */\n  query(query: string, params: unknown[]): Promise<unknown[][]> {\n    this.logger.logQuery(query, params)\n    // Convert object rows to array rows for Drizzle's internal use\n    return this.client.unsafe(query, params).then((rows) =>\n      rows.map((row) => Object.values(row as Record<string, unknown>))\n    )\n  }\n\n  /**\n   * Execute a raw query and return objects\n   */\n  queryObjects<T extends Row>(query: string, params: unknown[]): Promise<T[]> {\n    this.logger.logQuery(query, params)\n    return this.client.unsafe<T>(query, params)\n  }\n\n  /**\n   * Execute a transaction\n   */\n  override async transaction<T>(\n    transaction: (tx: PostgresDoTransaction<TFullSchema, TSchema>) => Promise<T>,\n    config?: PgTransactionConfig\n  ): Promise<T> {\n    const client = this.client as Sql\n\n    if (!client.begin) {\n      throw new Error('Transaction not supported: client does not have begin method')\n    }\n\n    return client.begin(\n      async (txClient) => {\n        const session = new PostgresDoSession<TFullSchema, TSchema>(\n          txClient as unknown as PostgresDoClient,\n          this.dialect,\n          this.schema,\n          this.options\n        )\n        const tx = new PostgresDoTransaction<TFullSchema, TSchema>(this.dialect, session, this.schema)\n\n        if (config) {\n          await tx.setTransaction(config)\n        }\n\n        return transaction(tx)\n      },\n      {\n        ...(config?.isolationLevel !== undefined ? { isolationLevel: config.isolationLevel } : {}),\n        readOnly: config?.accessMode === 'read only',\n        ...(config?.deferrable !== undefined ? { deferrable: config.deferrable } : {}),\n      }\n    )\n  }\n}\n\n/**\n * Transaction implementation for postgres.do\n *\n * This class provides nested transaction support through savepoints.\n */\nexport class PostgresDoTransaction<\n  TFullSchema extends Record<string, unknown>,\n  TSchema extends TablesRelationalConfig\n> extends PgTransaction<PostgresDoQueryResultHKT, TFullSchema, TSchema> {\n  static override readonly [entityKind]: string = 'PostgresDoTransaction'\n\n  constructor(\n    dialect: PgDialect,\n    /** @internal */\n    readonly session: PostgresDoSession<TFullSchema, TSchema>,\n    schema: RelationalSchemaConfig<TSchema> | undefined,\n    nestedIndex = 0\n  ) {\n    super(dialect, session, schema, nestedIndex)\n  }\n\n  /**\n   * Create a nested transaction using savepoints\n   */\n  async transaction<T>(\n    transaction: (tx: PostgresDoTransaction<TFullSchema, TSchema>) => Promise<T>\n  ): Promise<T> {\n    const savepointName = `sp${this.nestedIndex + 1}`\n    // Access dialect from base class through type assertion\n    const baseDialect = (this as unknown as PgTransactionWithDialect<PostgresDoQueryResultHKT, TFullSchema, TSchema>).dialect\n    const tx = new PostgresDoTransaction<TFullSchema, TSchema>(\n      baseDialect,\n      this.session,\n      this.schema,\n      this.nestedIndex + 1\n    )\n\n    await tx.execute(sql.raw(`SAVEPOINT ${savepointName}`))\n\n    try {\n      const result = await transaction(tx)\n      await tx.execute(sql.raw(`RELEASE SAVEPOINT ${savepointName}`))\n      return result\n    } catch (err) {\n      await tx.execute(sql.raw(`ROLLBACK TO SAVEPOINT ${savepointName}`))\n      throw err\n    }\n  }\n}\n\n/**\n * Query result HKT for postgres.do\n *\n * This type defines the shape of query results returned by the adapter.\n */\nexport interface PostgresDoQueryResultHKT extends PgQueryResultHKT {\n  readonly $brand: 'PgQueryResultHKT'\n  readonly row: unknown\n  type: Assume<this['row'], Row>[]\n}\n","/**\n * Drizzle ORM Migrator for postgres.do\n *\n * This module provides migration support for Drizzle ORM with postgres.do.\n * It uses Drizzle's built-in migration system to apply schema changes.\n *\n * @example\n * ```typescript\n * import { drizzle } from 'postgres.do/drizzle'\n * import { migrate } from 'postgres.do/drizzle/migrator'\n * import postgres from 'postgres.do'\n *\n * const sql = postgres('postgres://db.postgres.do/mydb')\n * const db = drizzle(sql)\n *\n * // Run migrations\n * await migrate(db, { migrationsFolder: './drizzle' })\n * ```\n */\n\nimport { readMigrationFiles, type MigrationConfig } from 'drizzle-orm/migrator'\nimport type { PostgresDoDatabase } from './driver.js'\n\n/**\n * Run database migrations\n *\n * This function applies all pending migrations to the database.\n * It reads migration files from the specified folder and executes\n * them in order.\n *\n * @param db - The Drizzle database instance\n * @param config - Migration configuration\n *\n * @example\n * ```typescript\n * import { migrate } from 'postgres.do/drizzle/migrator'\n *\n * await migrate(db, {\n *   migrationsFolder: './drizzle',\n *   migrationsTable: '__drizzle_migrations', // optional\n * })\n * ```\n */\nexport async function migrate<TSchema extends Record<string, unknown>>(\n  db: PostgresDoDatabase<TSchema>,\n  config: MigrationConfig\n): Promise<void> {\n  const migrations = readMigrationFiles(config)\n  // @ts-expect-error - accessing internal dialect and session\n  await db.dialect.migrate(migrations, db._.session, config)\n}\n","/**\n * Drizzle Migrations Integration for postgres.do\n *\n * This module provides seamless integration between Drizzle Kit's migration\n * system and postgres.do's multi-database Durable Object model.\n *\n * Key Features:\n * - Convert Drizzle migrations to postgres.do format\n * - Auto-run migrations on DO initialization\n * - Support drizzle-kit generate workflow\n * - Sync Drizzle journal with DO version tracking\n *\n * @example\n * ```typescript\n * import { createDrizzleMigrator } from 'postgres.do/drizzle'\n * import bundledMigrations from './drizzle-bundle'\n *\n * const migrator = createDrizzleMigrator({\n *   migrations: bundledMigrations,\n *   autoRun: true,\n * })\n *\n * // In your DO\n * class PostgresDO {\n *   async fetch(request: Request) {\n *     await migrator.ensureMigrated(this.pglite)\n *     // Handle request...\n *   }\n * }\n * ```\n */\n\nimport type { MigrationConfig as _MigrationConfig } from 'drizzle-orm/migrator'\n\n/**\n * Drizzle journal entry format\n */\nexport interface DrizzleJournalEntry {\n  idx: number\n  version: string\n  when: number\n  tag: string\n  breakpoints?: boolean\n}\n\n/**\n * Drizzle migrations journal format\n */\nexport interface DrizzleJournal {\n  version: string\n  dialect: 'postgresql' | 'mysql' | 'sqlite'\n  entries: DrizzleJournalEntry[]\n}\n\n/**\n * Migration record for tracking applied migrations\n */\nexport interface DrizzleMigrationRecord {\n  /** Migration hash/ID */\n  hash: string\n  /** Timestamp when applied */\n  created_at: number\n}\n\n/**\n * Bundled Drizzle migrations format for Cloudflare Workers\n *\n * Since file system access is not available in Workers, migrations\n * need to be bundled at build time.\n */\nexport interface BundledDrizzleMigrations {\n  /** The migrations journal */\n  journal: DrizzleJournal\n  /** SQL content keyed by folder name (e.g., '0000_init') */\n  migrations: Record<string, string>\n}\n\n/**\n * Migration result\n */\nexport interface DrizzleMigrationResult {\n  /** Whether all migrations succeeded */\n  success: boolean\n  /** Number of migrations applied */\n  appliedCount: number\n  /** Number of migrations skipped (already applied) */\n  skippedCount: number\n  /** Total duration in milliseconds */\n  durationMs: number\n  /** Applied migration hashes */\n  applied: string[]\n  /** Error if failed */\n  error?: string\n}\n\n/**\n * Progress event for migrations\n */\nexport interface DrizzleMigrationProgressEvent {\n  /** Current migration being processed */\n  migration: {\n    hash: string\n    tag: string\n    sql: string\n  }\n  /** Index of current migration */\n  index: number\n  /** Total migrations to process */\n  total: number\n  /** Phase of migration */\n  phase: 'starting' | 'executing' | 'completed' | 'failed' | 'skipped'\n  /** Duration in ms (on completion) */\n  durationMs?: number\n  /** Error message if failed */\n  error?: string\n}\n\n/**\n * Configuration for Drizzle migrator\n */\nexport interface DrizzleMigratorConfig {\n  /**\n   * Bundled migrations from drizzle-kit generate\n   */\n  migrations: BundledDrizzleMigrations\n\n  /**\n   * Name of the migrations tracking table\n   * Default: '__drizzle_migrations'\n   */\n  tableName?: string\n\n  /**\n   * Whether to run migrations automatically on ensureMigrated()\n   * Default: true\n   */\n  autoRun?: boolean\n\n  /**\n   * Validate migration checksums\n   * Default: true\n   */\n  checksumValidation?: boolean\n\n  /**\n   * Callback for migration progress\n   */\n  onProgress?: (event: DrizzleMigrationProgressEvent) => void\n\n  /**\n   * Callback when all migrations complete\n   */\n  onComplete?: (result: DrizzleMigrationResult) => void\n\n  /**\n   * Callback on migration error\n   */\n  onError?: (error: Error) => void\n\n  /**\n   * Enable debug logging\n   * Default: false\n   */\n  debug?: boolean\n}\n\n/**\n * Query executor interface matching postgres.do and PGLite\n */\ninterface QueryExecutor {\n  query<T = unknown>(\n    sql: string,\n    params?: unknown[]\n  ): Promise<{\n    rows: T[]\n  }>\n}\n\n/**\n * Migrator state\n */\nexport type DrizzleMigratorState = 'idle' | 'running' | 'completed' | 'failed'\n\n/**\n * Generate a migration hash from SQL content\n */\nfunction generateMigrationHash(sql: string): string {\n  // Simple hash function for migration content\n  let hash = 0\n  for (let i = 0; i < sql.length; i++) {\n    const char = sql.charCodeAt(i)\n    hash = ((hash << 5) - hash) + char\n    hash = hash & hash // Convert to 32-bit integer\n  }\n  return Math.abs(hash).toString(16).padStart(8, '0')\n}\n\n/**\n * Create the migrations tracking table SQL\n */\nfunction getCreateTableSQL(tableName: string): string {\n  return `\n    CREATE TABLE IF NOT EXISTS \"${tableName}\" (\n      id SERIAL PRIMARY KEY,\n      hash TEXT NOT NULL UNIQUE,\n      created_at BIGINT NOT NULL DEFAULT (EXTRACT(EPOCH FROM NOW()) * 1000)::BIGINT\n    );\n  `\n}\n\n/**\n * Drizzle Migrator for postgres.do\n *\n * Provides automatic migration management for Drizzle ORM schemas\n * in postgres.do's Durable Object environment.\n */\nexport class DrizzleMigrator {\n  private config: Required<Omit<DrizzleMigratorConfig, 'migrations' | 'onProgress' | 'onComplete' | 'onError'>>\n  private migrations: BundledDrizzleMigrations\n  private onProgress?: ((event: DrizzleMigrationProgressEvent) => void) | undefined\n  private onComplete?: ((result: DrizzleMigrationResult) => void) | undefined\n  private onError?: ((error: Error) => void) | undefined\n\n  private state: DrizzleMigratorState = 'idle'\n  private migrationPromise: Promise<DrizzleMigrationResult> | null = null\n  private lastResult: DrizzleMigrationResult | null = null\n  private lastError: Error | null = null\n\n  constructor(config: DrizzleMigratorConfig) {\n    this.migrations = config.migrations\n    this.config = {\n      tableName: config.tableName ?? '__drizzle_migrations',\n      autoRun: config.autoRun ?? true,\n      checksumValidation: config.checksumValidation ?? true,\n      debug: config.debug ?? false,\n    }\n    this.onProgress = config.onProgress\n    this.onComplete = config.onComplete\n    this.onError = config.onError\n  }\n\n  /**\n   * Log debug message\n   */\n  private log(message: string, ...args: unknown[]): void {\n    if (this.config.debug) {\n      console.log(`[DrizzleMigrator] ${message}`, ...args)\n    }\n  }\n\n  /**\n   * Get current state\n   */\n  getState(): DrizzleMigratorState {\n    return this.state\n  }\n\n  /**\n   * Get last migration result\n   */\n  getLastResult(): DrizzleMigrationResult | null {\n    return this.lastResult\n  }\n\n  /**\n   * Get last error\n   */\n  getLastError(): Error | null {\n    return this.lastError\n  }\n\n  /**\n   * Get the ordered list of migrations to apply\n   */\n  getMigrations(): Array<{ hash: string; tag: string; sql: string; idx: number }> {\n    const { journal, migrations } = this.migrations\n\n    return journal.entries\n      .sort((a, b) => a.idx - b.idx)\n      .map((entry) => {\n        const folderName = `${entry.idx.toString().padStart(4, '0')}_${entry.tag}`\n        const sql = migrations[folderName] || migrations[entry.tag]\n\n        if (!sql) {\n          throw new Error(`Missing migration SQL for: ${folderName}`)\n        }\n\n        // Generate hash from folder name + SQL for uniqueness\n        const hash = generateMigrationHash(`${folderName}:${sql}`)\n\n        return {\n          hash,\n          tag: entry.tag,\n          sql,\n          idx: entry.idx,\n        }\n      })\n  }\n\n  /**\n   * Initialize the migrations table\n   */\n  private async initializeTable(executor: QueryExecutor): Promise<void> {\n    this.log('Initializing migrations table')\n    await executor.query(getCreateTableSQL(this.config.tableName))\n  }\n\n  /**\n   * Get list of already applied migrations\n   */\n  private async getAppliedMigrations(executor: QueryExecutor): Promise<Set<string>> {\n    const result = await executor.query<DrizzleMigrationRecord>(\n      `SELECT hash FROM \"${this.config.tableName}\" ORDER BY created_at ASC`\n    )\n    return new Set(result.rows.map((r) => r.hash))\n  }\n\n  /**\n   * Record a migration as applied\n   */\n  private async recordMigration(executor: QueryExecutor, hash: string): Promise<void> {\n    await executor.query(\n      `INSERT INTO \"${this.config.tableName}\" (hash) VALUES ($1) ON CONFLICT (hash) DO NOTHING`,\n      [hash]\n    )\n  }\n\n  /**\n   * Ensure migrations are applied\n   *\n   * Safe to call multiple times - will only run pending migrations.\n   */\n  async ensureMigrated(executor: QueryExecutor): Promise<DrizzleMigrationResult> {\n    // If already running, wait for completion\n    if (this.migrationPromise) {\n      return this.migrationPromise\n    }\n\n    // If already completed, return cached result\n    if (this.state === 'completed' && this.lastResult) {\n      return this.lastResult\n    }\n\n    // If failed, throw the last error\n    if (this.state === 'failed' && this.lastError) {\n      throw this.lastError\n    }\n\n    // If autoRun is disabled, return empty result\n    if (!this.config.autoRun) {\n      return {\n        success: true,\n        appliedCount: 0,\n        skippedCount: 0,\n        durationMs: 0,\n        applied: [],\n      }\n    }\n\n    // Start migration\n    this.migrationPromise = this.runMigrations(executor)\n\n    try {\n      const result = await this.migrationPromise\n      return result\n    } finally {\n      this.migrationPromise = null\n    }\n  }\n\n  /**\n   * Run all pending migrations\n   */\n  private async runMigrations(executor: QueryExecutor): Promise<DrizzleMigrationResult> {\n    this.state = 'running'\n    this.log('Starting Drizzle migrations')\n\n    const startTime = performance.now()\n    const applied: string[] = []\n    let skippedCount = 0\n\n    try {\n      // Initialize migrations table\n      await this.initializeTable(executor)\n\n      // Get already applied migrations\n      const appliedHashes = await this.getAppliedMigrations(executor)\n\n      // Get all migrations to process\n      const migrations = this.getMigrations()\n      this.log(`Found ${migrations.length} migrations, ${appliedHashes.size} already applied`)\n\n      for (let i = 0; i < migrations.length; i++) {\n        const migration = migrations[i]!\n\n        // Check if already applied\n        if (appliedHashes.has(migration.hash)) {\n          this.log(`Skipping already applied: ${migration.tag}`)\n          skippedCount++\n\n          this.onProgress?.({\n            migration,\n            index: i,\n            total: migrations.length,\n            phase: 'skipped',\n          })\n\n          continue\n        }\n\n        // Report starting\n        this.onProgress?.({\n          migration,\n          index: i,\n          total: migrations.length,\n          phase: 'starting',\n        })\n\n        const migrationStart = performance.now()\n\n        try {\n          // Execute migration SQL\n          this.onProgress?.({\n            migration,\n            index: i,\n            total: migrations.length,\n            phase: 'executing',\n          })\n\n          // Clean up Drizzle breakpoint comments and execute\n          const cleanSql = migration.sql.replace(/-->\\s*statement-breakpoint\\s*/g, '\\n').trim()\n\n          // Execute each statement separately for better error handling\n          const statements = cleanSql\n            .split(/;\\s*(?=(?:[^']*'[^']*')*[^']*$)/) // Split on ; not in quotes\n            .map((s) => s.trim())\n            .filter((s) => s.length > 0)\n\n          for (const statement of statements) {\n            await executor.query(statement + ';')\n          }\n\n          // Record migration as applied\n          await this.recordMigration(executor, migration.hash)\n\n          const durationMs = Math.round(performance.now() - migrationStart)\n          applied.push(migration.hash)\n\n          this.log(`Applied ${migration.tag} in ${durationMs}ms`)\n\n          this.onProgress?.({\n            migration,\n            index: i,\n            total: migrations.length,\n            phase: 'completed',\n            durationMs,\n          })\n        } catch (error) {\n          const errorMessage = error instanceof Error ? error.message : String(error)\n          const durationMs = Math.round(performance.now() - migrationStart)\n\n          this.log(`Failed ${migration.tag}: ${errorMessage}`)\n\n          this.onProgress?.({\n            migration,\n            index: i,\n            total: migrations.length,\n            phase: 'failed',\n            durationMs,\n            error: errorMessage,\n          })\n\n          // Stop on first error\n          throw error\n        }\n      }\n\n      const totalDuration = Math.round(performance.now() - startTime)\n\n      const result: DrizzleMigrationResult = {\n        success: true,\n        appliedCount: applied.length,\n        skippedCount,\n        durationMs: totalDuration,\n        applied,\n      }\n\n      this.state = 'completed'\n      this.lastResult = result\n\n      this.log(`Migration complete: ${applied.length} applied, ${skippedCount} skipped in ${totalDuration}ms`)\n      this.onComplete?.(result)\n\n      return result\n    } catch (error) {\n      const totalDuration = Math.round(performance.now() - startTime)\n      const errorMessage = error instanceof Error ? error.message : String(error)\n\n      const result: DrizzleMigrationResult = {\n        success: false,\n        appliedCount: applied.length,\n        skippedCount,\n        durationMs: totalDuration,\n        applied,\n        error: errorMessage,\n      }\n\n      this.state = 'failed'\n      this.lastResult = result\n      this.lastError = error instanceof Error ? error : new Error(errorMessage)\n\n      this.onError?.(this.lastError)\n\n      return result\n    }\n  }\n\n  /**\n   * Force re-run of migrations\n   *\n   * Resets state and runs ensureMigrated again.\n   * Already applied migrations will be skipped.\n   */\n  async forceMigrate(executor: QueryExecutor): Promise<DrizzleMigrationResult> {\n    this.state = 'idle'\n    this.migrationPromise = null\n    this.lastResult = null\n    this.lastError = null\n\n    return this.ensureMigrated(executor)\n  }\n\n  /**\n   * Get the current migration status\n   */\n  async getStatus(executor: QueryExecutor): Promise<{\n    initialized: boolean\n    appliedCount: number\n    pendingCount: number\n    appliedMigrations: string[]\n    pendingMigrations: string[]\n  }> {\n    try {\n      // Try to get applied migrations\n      const appliedHashes = await this.getAppliedMigrations(executor)\n      const allMigrations = this.getMigrations()\n\n      const appliedMigrations = allMigrations\n        .filter((m) => appliedHashes.has(m.hash))\n        .map((m) => m.tag)\n\n      const pendingMigrations = allMigrations\n        .filter((m) => !appliedHashes.has(m.hash))\n        .map((m) => m.tag)\n\n      return {\n        initialized: true,\n        appliedCount: appliedMigrations.length,\n        pendingCount: pendingMigrations.length,\n        appliedMigrations,\n        pendingMigrations,\n      }\n    } catch {\n      // Table doesn't exist yet\n      const allMigrations = this.getMigrations()\n\n      return {\n        initialized: false,\n        appliedCount: 0,\n        pendingCount: allMigrations.length,\n        appliedMigrations: [],\n        pendingMigrations: allMigrations.map((m) => m.tag),\n      }\n    }\n  }\n\n  /**\n   * Check if there are pending migrations\n   */\n  async needsMigration(executor: QueryExecutor): Promise<boolean> {\n    const status = await this.getStatus(executor)\n    return status.pendingCount > 0\n  }\n}\n\n/**\n * Create a Drizzle migrator instance\n *\n * @example\n * ```typescript\n * import { createDrizzleMigrator } from 'postgres.do/drizzle'\n * import bundledMigrations from './drizzle-bundle'\n *\n * const migrator = createDrizzleMigrator({\n *   migrations: bundledMigrations,\n *   autoRun: true,\n *   onProgress: (event) => console.log(`${event.phase}: ${event.migration.tag}`),\n * })\n * ```\n */\nexport function createDrizzleMigrator(config: DrizzleMigratorConfig): DrizzleMigrator {\n  return new DrizzleMigrator(config)\n}\n\n/**\n * Parse a Drizzle migrations journal file\n */\nexport function parseDrizzleJournal(content: string): DrizzleJournal {\n  try {\n    return JSON.parse(content) as DrizzleJournal\n  } catch (error) {\n    throw new Error(`Failed to parse Drizzle journal: ${error}`)\n  }\n}\n\n/**\n * Convert Drizzle migrations to bundled format\n *\n * This is useful for build-time bundling in a Node.js environment.\n *\n * @example\n * ```typescript\n * // In your build script\n * import { bundleDrizzleMigrations } from 'postgres.do/drizzle'\n * import fs from 'fs'\n * import path from 'path'\n *\n * const migrationsDir = './drizzle'\n * const bundled = bundleDrizzleMigrations(migrationsDir)\n *\n * fs.writeFileSync(\n *   './src/drizzle-bundle.json',\n *   JSON.stringify(bundled, null, 2)\n * )\n * ```\n */\nexport function bundleDrizzleMigrations(\n  journal: DrizzleJournal,\n  sqlFiles: Record<string, string>\n): BundledDrizzleMigrations {\n  // Validate all migrations exist\n  for (const entry of journal.entries) {\n    const folderName = `${entry.idx.toString().padStart(4, '0')}_${entry.tag}`\n    if (!sqlFiles[folderName] && !sqlFiles[entry.tag]) {\n      throw new Error(`Missing SQL file for migration: ${folderName}`)\n    }\n  }\n\n  return {\n    journal,\n    migrations: sqlFiles,\n  }\n}\n","/**\n * Migration Bridge between Drizzle and postgres.do\n *\n * This module provides integration between Drizzle Kit's migration system\n * and postgres.do's migration infrastructure. It enables:\n *\n * 1. Converting Drizzle migrations to postgres.do format\n * 2. Syncing Drizzle journal with DO version tracking\n * 3. Supporting both migration systems simultaneously\n *\n * @example\n * ```typescript\n * import { createMigrationBridge } from 'postgres.do/drizzle'\n * import bundledMigrations from './drizzle-bundle'\n *\n * // Create a bridge that converts Drizzle migrations to postgres.do format\n * const bridge = createMigrationBridge(bundledMigrations)\n *\n * // Get migrations in postgres.do format\n * const migrations = bridge.getMigrations()\n *\n * // Or use with AutoMigrator\n * const migrator = createAutoMigrator({\n *   migrations: bridge.getMigrations(),\n * })\n * ```\n */\n\nimport type {\n  DrizzleJournal,\n  DrizzleJournalEntry,\n  BundledDrizzleMigrations,\n} from './drizzle-migrator.js'\n\n/**\n * postgres.do migration format\n */\nexport interface PostgresDoMigration {\n  /** Unique migration identifier */\n  id: string\n  /** Human-readable name */\n  name: string\n  /** Version number for ordering */\n  version: number\n  /** Forward migration SQL */\n  up: string\n  /** Rollback SQL (optional) */\n  down?: string\n  /** Whether this migration is reversible */\n  isReversible?: boolean\n  /** Tags for categorization */\n  tags?: string[]\n  /** Whether to run in a transaction */\n  transactional?: boolean\n  /** Original Drizzle metadata */\n  drizzle?: {\n    idx: number\n    hash: string\n    tag: string\n    when: number\n  }\n}\n\n/**\n * Migration bridge configuration\n */\nexport interface MigrationBridgeConfig {\n  /**\n   * Bundled Drizzle migrations\n   */\n  migrations: BundledDrizzleMigrations\n\n  /**\n   * Optional down migrations keyed by migration tag\n   * Drizzle doesn't generate down migrations by default,\n   * but you can provide them manually.\n   */\n  downMigrations?: Record<string, string> | undefined\n\n  /**\n   * Prefix for migration IDs\n   * Default: empty (uses Drizzle's NNNN_tag format)\n   */\n  idPrefix?: string | undefined\n\n  /**\n   * Version offset for postgres.do versioning\n   * Default: 0\n   */\n  versionOffset?: number | undefined\n}\n\n/**\n * Generate migration hash from content\n */\nfunction generateHash(content: string): string {\n  let hash = 0\n  for (let i = 0; i < content.length; i++) {\n    const char = content.charCodeAt(i)\n    hash = ((hash << 5) - hash) + char\n    hash = hash & hash\n  }\n  return Math.abs(hash).toString(16).padStart(8, '0')\n}\n\n/**\n * Clean Drizzle SQL by removing breakpoint comments\n */\nfunction cleanDrizzleSql(sql: string): string {\n  return sql\n    .replace(/-->\\s*statement-breakpoint\\s*/g, '\\n')\n    .trim()\n}\n\n/**\n * Convert tag to human-readable name\n */\nfunction tagToName(tag: string): string {\n  return tag\n    .replace(/_/g, ' ')\n    .replace(/(^|\\s)\\w/g, (c) => c.toUpperCase())\n}\n\n/**\n * Migration Bridge\n *\n * Converts Drizzle migrations to postgres.do format, enabling\n * interoperability between both migration systems.\n */\nexport class MigrationBridge {\n  private config: Required<Omit<MigrationBridgeConfig, 'migrations' | 'downMigrations'>>\n  private migrations: BundledDrizzleMigrations\n  private downMigrations: Record<string, string>\n  private cachedMigrations: PostgresDoMigration[] | null = null\n\n  constructor(config: MigrationBridgeConfig) {\n    this.migrations = config.migrations\n    this.downMigrations = config.downMigrations ?? {}\n    this.config = {\n      idPrefix: config.idPrefix ?? '',\n      versionOffset: config.versionOffset ?? 0,\n    }\n  }\n\n  /**\n   * Get all migrations in postgres.do format\n   */\n  getMigrations(): PostgresDoMigration[] {\n    if (this.cachedMigrations) {\n      return this.cachedMigrations\n    }\n\n    const { journal, migrations } = this.migrations\n    const { idPrefix, versionOffset = 0 } = this.config\n\n    this.cachedMigrations = journal.entries\n      .sort((a, b) => a.idx - b.idx)\n      .map((entry) => {\n        const folderName = `${entry.idx.toString().padStart(4, '0')}_${entry.tag}`\n        const sql = migrations[folderName] || migrations[entry.tag]\n\n        if (!sql) {\n          throw new Error(`Missing migration SQL for: ${folderName}`)\n        }\n\n        const cleanSql = cleanDrizzleSql(sql)\n        const hash = generateHash(`${folderName}:${sql}`)\n        const down = this.downMigrations[entry.tag] || this.downMigrations[folderName]\n        const idPrefixStr = idPrefix ?? ''\n\n        const migration: PostgresDoMigration = {\n          id: `${idPrefixStr}${folderName}`,\n          name: tagToName(entry.tag),\n          version: entry.idx + 1 + versionOffset, // 1-indexed\n          up: cleanSql,\n          tags: ['drizzle'],\n          transactional: entry.breakpoints !== false,\n          drizzle: {\n            idx: entry.idx,\n            hash,\n            tag: entry.tag,\n            when: entry.when,\n          },\n        }\n\n        if (down) {\n          migration.down = cleanDrizzleSql(down)\n          migration.isReversible = true\n        } else {\n          migration.isReversible = false\n        }\n\n        return migration\n      })\n\n    return this.cachedMigrations\n  }\n\n  /**\n   * Get a specific migration by ID\n   */\n  getMigration(id: string): PostgresDoMigration | undefined {\n    return this.getMigrations().find((m) => m.id === id)\n  }\n\n  /**\n   * Get a migration by Drizzle tag\n   */\n  getMigrationByTag(tag: string): PostgresDoMigration | undefined {\n    return this.getMigrations().find((m) => m.drizzle?.tag === tag)\n  }\n\n  /**\n   * Get a migration by version\n   */\n  getMigrationByVersion(version: number): PostgresDoMigration | undefined {\n    return this.getMigrations().find((m) => m.version === version)\n  }\n\n  /**\n   * Get the latest version number\n   */\n  getLatestVersion(): number {\n    const migrations = this.getMigrations()\n    if (migrations.length === 0) return 0\n    return Math.max(...migrations.map((m) => m.version))\n  }\n\n  /**\n   * Get migrations after a specific version\n   */\n  getMigrationsAfter(version: number): PostgresDoMigration[] {\n    return this.getMigrations().filter((m) => m.version > version)\n  }\n\n  /**\n   * Get the Drizzle journal\n   */\n  getJournal(): DrizzleJournal {\n    return this.migrations.journal\n  }\n\n  /**\n   * Export back to Drizzle journal format\n   *\n   * Useful for keeping Drizzle's journal in sync after manual changes.\n   */\n  exportToJournal(): DrizzleJournal {\n    const migrations = this.getMigrations()\n\n    const versionOffset = this.config.versionOffset ?? 0\n    const entries: DrizzleJournalEntry[] = migrations.map((m) => ({\n      idx: m.drizzle?.idx ?? (m.version - 1 - versionOffset),\n      version: m.drizzle?.when?.toString() ?? new Date().toISOString().replace(/[-:T.Z]/g, '').substring(0, 14),\n      when: m.drizzle?.when ?? Date.now(),\n      tag: m.drizzle?.tag ?? m.id.replace(/^\\d+_/, ''),\n      breakpoints: m.transactional !== false,\n    }))\n\n    return {\n      version: this.migrations.journal.version || '7',\n      dialect: this.migrations.journal.dialect || 'postgresql',\n      entries,\n    }\n  }\n\n  /**\n   * Validate that all migrations have SQL files\n   */\n  validate(): { valid: boolean; errors: string[] } {\n    const errors: string[] = []\n\n    for (const entry of this.migrations.journal.entries) {\n      const folderName = `${entry.idx.toString().padStart(4, '0')}_${entry.tag}`\n      const sql = this.migrations.migrations[folderName] || this.migrations.migrations[entry.tag]\n\n      if (!sql) {\n        errors.push(`Missing SQL file for migration: ${folderName}`)\n      }\n    }\n\n    return {\n      valid: errors.length === 0,\n      errors,\n    }\n  }\n\n  /**\n   * Add down migrations\n   */\n  addDownMigration(tagOrId: string, downSql: string): void {\n    this.downMigrations[tagOrId] = downSql\n    // Invalidate cache\n    this.cachedMigrations = null\n  }\n\n  /**\n   * Generate migration SQL statistics\n   */\n  getStats(): {\n    totalMigrations: number\n    reversibleCount: number\n    nonReversibleCount: number\n    totalSqlStatements: number\n  } {\n    const migrations = this.getMigrations()\n\n    let totalSqlStatements = 0\n    for (const m of migrations) {\n      // Count statements by splitting on semicolons\n      const statements = m.up\n        .split(/;\\s*(?=(?:[^']*'[^']*')*[^']*$)/)\n        .filter((s) => s.trim().length > 0)\n      totalSqlStatements += statements.length\n    }\n\n    return {\n      totalMigrations: migrations.length,\n      reversibleCount: migrations.filter((m) => m.isReversible).length,\n      nonReversibleCount: migrations.filter((m) => !m.isReversible).length,\n      totalSqlStatements,\n    }\n  }\n}\n\n/**\n * Create a migration bridge instance\n *\n * @example\n * ```typescript\n * import { createMigrationBridge } from 'postgres.do/drizzle'\n *\n * const bridge = createMigrationBridge({\n *   migrations: bundledMigrations,\n *   downMigrations: {\n *     'create_users': 'DROP TABLE users;',\n *     'add_posts': 'DROP TABLE posts;',\n *   },\n * })\n *\n * const postgresDoMigrations = bridge.getMigrations()\n * ```\n */\nexport function createMigrationBridge(config: MigrationBridgeConfig): MigrationBridge {\n  return new MigrationBridge(config)\n}\n\n/**\n * Quick conversion from Drizzle migrations to postgres.do format\n */\nexport function convertDrizzleToPostgresDo(\n  bundled: BundledDrizzleMigrations,\n  downMigrations?: Record<string, string>\n): PostgresDoMigration[] {\n  const bridge = createMigrationBridge({\n    migrations: bundled,\n    downMigrations,\n  })\n  return bridge.getMigrations()\n}\n\n/**\n * Create a combined migrator that uses both Drizzle and postgres.do tracking\n *\n * This is useful when you want to leverage Drizzle's migration generation\n * while using postgres.do's multi-database version tracking.\n *\n * @example\n * ```typescript\n * import { createCombinedMigrator } from 'postgres.do/drizzle'\n * import bundledMigrations from './drizzle-bundle'\n *\n * const migrator = createCombinedMigrator({\n *   drizzle: bundledMigrations,\n *   tableName: '_combined_migrations',\n * })\n *\n * // In your DO\n * await migrator.ensureMigrated(pglite)\n * ```\n */\nexport interface CombinedMigratorConfig {\n  /**\n   * Bundled Drizzle migrations\n   */\n  drizzle: BundledDrizzleMigrations\n\n  /**\n   * Optional down migrations\n   */\n  downMigrations?: Record<string, string>\n\n  /**\n   * Table name for version tracking\n   * Default: '_migrations'\n   */\n  tableName?: string\n\n  /**\n   * Enable debug logging\n   */\n  debug?: boolean\n\n  /**\n   * Callback on progress\n   */\n  onProgress?: (event: {\n    migration: PostgresDoMigration\n    index: number\n    total: number\n    phase: string\n    durationMs?: number\n    error?: string\n  }) => void\n}\n\n/**\n * Query executor interface\n */\ninterface QueryExecutor {\n  query<T = unknown>(sql: string, params?: unknown[]): Promise<{ rows: T[] }>\n}\n\n/**\n * Combined migrator that merges Drizzle and postgres.do tracking\n */\nexport async function runCombinedMigrations(\n  executor: QueryExecutor,\n  config: CombinedMigratorConfig\n): Promise<{\n  success: boolean\n  appliedCount: number\n  skippedCount: number\n  durationMs: number\n  error?: string\n}> {\n  const bridge = createMigrationBridge({\n    migrations: config.drizzle,\n    downMigrations: config.downMigrations,\n  })\n\n  const migrations = bridge.getMigrations()\n  const tableName = config.tableName || '_migrations'\n  const startTime = performance.now()\n  let appliedCount = 0\n  let skippedCount = 0\n\n  try {\n    // Create tracking table (execute separately for PGLite compatibility)\n    await executor.query(`\n      CREATE TABLE IF NOT EXISTS \"${tableName}\" (\n        id TEXT PRIMARY KEY,\n        name TEXT NOT NULL,\n        version INTEGER NOT NULL UNIQUE,\n        checksum TEXT NOT NULL,\n        applied_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,\n        execution_time_ms INTEGER NOT NULL DEFAULT 0,\n        status TEXT NOT NULL DEFAULT 'applied',\n        drizzle_hash TEXT,\n        drizzle_tag TEXT\n      )\n    `)\n    await executor.query(\n      `CREATE INDEX IF NOT EXISTS idx_${tableName.replace(/\"/g, '')}_version ON \"${tableName}\" (version)`\n    )\n\n    // Get applied versions\n    const applied = await executor.query<{ version: number }>(\n      `SELECT version FROM \"${tableName}\" WHERE status = 'applied'`\n    )\n    const appliedVersions = new Set(applied.rows.map((r) => r.version))\n\n    // Apply pending migrations\n    for (let i = 0; i < migrations.length; i++) {\n      const migration = migrations[i]!\n\n      if (appliedVersions.has(migration.version)) {\n        skippedCount++\n        config.onProgress?.({\n          migration,\n          index: i,\n          total: migrations.length,\n          phase: 'skipped',\n        })\n        continue\n      }\n\n      config.onProgress?.({\n        migration,\n        index: i,\n        total: migrations.length,\n        phase: 'starting',\n      })\n\n      const migrationStart = performance.now()\n\n      try {\n        // Execute migration\n        const statements = migration.up\n          .split(/;\\s*(?=(?:[^']*'[^']*')*[^']*$)/)\n          .map((s) => s.trim())\n          .filter((s) => s.length > 0)\n\n        for (const stmt of statements) {\n          await executor.query(stmt + ';')\n        }\n\n        // Record migration\n        const execTime = Math.round(performance.now() - migrationStart)\n        const checksum = generateHash(migration.up)\n\n        await executor.query(\n          `INSERT INTO \"${tableName}\" (id, name, version, checksum, execution_time_ms, drizzle_hash, drizzle_tag)\n           VALUES ($1, $2, $3, $4, $5, $6, $7)`,\n          [\n            migration.id,\n            migration.name,\n            migration.version,\n            checksum,\n            execTime,\n            migration.drizzle?.hash ?? null,\n            migration.drizzle?.tag ?? null,\n          ]\n        )\n\n        appliedCount++\n\n        config.onProgress?.({\n          migration,\n          index: i,\n          total: migrations.length,\n          phase: 'completed',\n          durationMs: execTime,\n        })\n\n        if (config.debug) {\n          console.log(`[CombinedMigrator] Applied ${migration.id} in ${execTime}ms`)\n        }\n      } catch (error) {\n        const execTime = Math.round(performance.now() - migrationStart)\n        const errorMsg = error instanceof Error ? error.message : String(error)\n\n        config.onProgress?.({\n          migration,\n          index: i,\n          total: migrations.length,\n          phase: 'failed',\n          durationMs: execTime,\n          error: errorMsg,\n        })\n\n        throw error\n      }\n    }\n\n    const totalTime = Math.round(performance.now() - startTime)\n\n    return {\n      success: true,\n      appliedCount,\n      skippedCount,\n      durationMs: totalTime,\n    }\n  } catch (error) {\n    const totalTime = Math.round(performance.now() - startTime)\n    const errorMsg = error instanceof Error ? error.message : String(error)\n\n    return {\n      success: false,\n      appliedCount,\n      skippedCount,\n      durationMs: totalTime,\n      error: errorMsg,\n    }\n  }\n}\n","/**\n * Auto Drizzle Migrator\n *\n * Seamlessly integrates Drizzle Kit migrations with postgres.do's AutoMigrator.\n * This provides automatic migration execution on DO initialization while\n * maintaining compatibility with both Drizzle's journal and postgres.do's\n * version tracking.\n *\n * @example\n * ```typescript\n * import { createAutoDrizzleMigrator } from 'postgres.do/drizzle'\n * import bundledMigrations from './drizzle-bundle'\n *\n * const migrator = createAutoDrizzleMigrator({\n *   drizzle: bundledMigrations,\n *   autoRun: true,\n *   journalTable: '__drizzle_migrations',\n *   checksumValidation: true,\n * })\n *\n * // In your DO\n * class PostgresDO {\n *   async fetch(request: Request) {\n *     await migrator.ensureMigrated(this.pglite)\n *     // Handle request...\n *   }\n * }\n * ```\n */\n\nimport type {\n  BundledDrizzleMigrations,\n  DrizzleJournal,\n  DrizzleJournalEntry as _DrizzleJournalEntry,\n  DrizzleMigrationProgressEvent,\n  DrizzleMigrationResult,\n} from './drizzle-migrator.js'\nimport type { PostgresDoMigration } from './migration-bridge.js'\n\n/**\n * Query executor interface matching postgres.do and PGLite\n */\ninterface QueryExecutor {\n  query<T = unknown>(\n    sql: string,\n    params?: unknown[]\n  ): Promise<{\n    rows: T[]\n  }>\n}\n\n/**\n * Configuration for Auto Drizzle Migrator\n *\n * This matches the proposed drizzle.config.ts format from the issue\n */\nexport interface AutoDrizzleMigratorConfig {\n  /**\n   * Bundled Drizzle migrations from drizzle-kit generate\n   */\n  drizzle: BundledDrizzleMigrations\n\n  /**\n   * Optional down migrations keyed by migration tag\n   * Drizzle doesn't generate down migrations by default,\n   * but you can provide them manually for rollback support.\n   */\n  downMigrations?: Record<string, string>\n\n  /**\n   * Run migrations automatically on first connection\n   * Default: true\n   */\n  autoRun?: boolean\n\n  /**\n   * Name of the Drizzle migrations tracking table\n   * Default: '__drizzle_migrations'\n   */\n  journalTable?: string\n\n  /**\n   * Name of the postgres.do migrations tracking table\n   * Default: '_migrations'\n   */\n  postgresDoTable?: string\n\n  /**\n   * Validate migration checksums to detect modifications\n   * Default: true\n   */\n  checksumValidation?: boolean\n\n  /**\n   * Sync Drizzle journal with postgres.do version tracking\n   * Default: true\n   */\n  syncJournals?: boolean\n\n  /**\n   * Progress callback for migration events\n   */\n  onProgress?: (event: DrizzleMigrationProgressEvent) => void\n\n  /**\n   * Callback when all migrations complete\n   */\n  onComplete?: (result: AutoDrizzleMigrationResult) => void\n\n  /**\n   * Callback on migration error\n   */\n  onError?: (error: Error) => void\n\n  /**\n   * Enable debug logging\n   * Default: false\n   */\n  debug?: boolean\n}\n\n/**\n * Result of auto Drizzle migration\n */\nexport interface AutoDrizzleMigrationResult extends DrizzleMigrationResult {\n  /** postgres.do migrations result */\n  postgresDoResult?: {\n    fromVersion: number\n    toVersion: number\n    migrationsRun: number\n    migrationsSkipped: number\n  }\n  /** Whether journals were synced */\n  journalsSynced: boolean\n}\n\n/**\n * Migration status record\n */\ninterface MigrationStatusRecord {\n  id: string\n  version: number\n  hash?: string\n  drizzle_hash?: string\n  drizzle_tag?: string\n  status: string\n  applied_at: string\n}\n\n/**\n * Migrator state\n */\nexport type AutoDrizzleMigratorState = 'idle' | 'running' | 'completed' | 'failed'\n\n/**\n * Generate hash from content\n */\nfunction generateHash(content: string): string {\n  let hash = 0\n  for (let i = 0; i < content.length; i++) {\n    const char = content.charCodeAt(i)\n    hash = ((hash << 5) - hash) + char\n    hash = hash & hash\n  }\n  return Math.abs(hash).toString(16).padStart(8, '0')\n}\n\n/**\n * Clean Drizzle SQL\n */\nfunction cleanDrizzleSql(sql: string): string {\n  return sql\n    .replace(/-->\\s*statement-breakpoint\\s*/g, '\\n')\n    .trim()\n}\n\n/**\n * Convert tag to human-readable name\n */\nfunction tagToName(tag: string): string {\n  return tag\n    .replace(/_/g, ' ')\n    .replace(/(^|\\s)\\w/g, (c) => c.toUpperCase())\n}\n\n/**\n * SQL statements for creating the unified migrations table\n */\nfunction getCreateUnifiedTableStatements(tableName: string): string[] {\n  const cleanName = tableName.replace(/\"/g, '')\n  return [\n    `CREATE TABLE IF NOT EXISTS \"${tableName}\" (\n      id TEXT PRIMARY KEY,\n      name TEXT NOT NULL,\n      version INTEGER NOT NULL UNIQUE,\n      checksum TEXT NOT NULL,\n      applied_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,\n      execution_time_ms INTEGER NOT NULL DEFAULT 0,\n      status TEXT NOT NULL DEFAULT 'applied' CHECK (status IN ('pending', 'applied', 'failed', 'rolled_back')),\n      drizzle_hash TEXT,\n      drizzle_tag TEXT,\n      drizzle_idx INTEGER\n    )`,\n    `CREATE INDEX IF NOT EXISTS idx_${cleanName}_version ON \"${tableName}\" (version)`,\n    `CREATE INDEX IF NOT EXISTS idx_${cleanName}_drizzle_hash ON \"${tableName}\" (drizzle_hash)`,\n    `CREATE INDEX IF NOT EXISTS idx_${cleanName}_status ON \"${tableName}\" (status)`,\n  ]\n}\n\n/**\n * SQL statement for creating the Drizzle-compatible migrations table\n */\nfunction getCreateDrizzleTableSQL(tableName: string): string {\n  return `\n    CREATE TABLE IF NOT EXISTS \"${tableName}\" (\n      id SERIAL PRIMARY KEY,\n      hash TEXT NOT NULL UNIQUE,\n      created_at BIGINT NOT NULL DEFAULT (EXTRACT(EPOCH FROM NOW()) * 1000)::BIGINT\n    )\n  `\n}\n\n/**\n * Auto Drizzle Migrator\n *\n * Combines Drizzle Kit migrations with postgres.do's AutoMigrator\n * for seamless schema management in Durable Objects.\n */\nexport class AutoDrizzleMigrator {\n  private config: Required<Omit<AutoDrizzleMigratorConfig, 'drizzle' | 'downMigrations' | 'onProgress' | 'onComplete' | 'onError'>>\n  private drizzle: BundledDrizzleMigrations\n  private downMigrations: Record<string, string>\n  private onProgress?: ((event: DrizzleMigrationProgressEvent) => void) | undefined\n  private onComplete?: ((result: AutoDrizzleMigrationResult) => void) | undefined\n  private onError?: ((error: Error) => void) | undefined\n\n  private state: AutoDrizzleMigratorState = 'idle'\n  private migrationPromise: Promise<AutoDrizzleMigrationResult> | null = null\n  private lastResult: AutoDrizzleMigrationResult | null = null\n  private lastError: Error | null = null\n  private cachedMigrations: PostgresDoMigration[] | null = null\n\n  constructor(config: AutoDrizzleMigratorConfig) {\n    this.drizzle = config.drizzle\n    this.downMigrations = config.downMigrations ?? {}\n    this.config = {\n      autoRun: config.autoRun ?? true,\n      journalTable: config.journalTable ?? '__drizzle_migrations',\n      postgresDoTable: config.postgresDoTable ?? '_migrations',\n      checksumValidation: config.checksumValidation ?? true,\n      syncJournals: config.syncJournals ?? true,\n      debug: config.debug ?? false,\n    }\n    this.onProgress = config.onProgress\n    this.onComplete = config.onComplete\n    this.onError = config.onError\n  }\n\n  /**\n   * Log debug message\n   */\n  private log(message: string, ...args: unknown[]): void {\n    if (this.config.debug) {\n      console.log(`[AutoDrizzleMigrator] ${message}`, ...args)\n    }\n  }\n\n  /**\n   * Get current state\n   */\n  getState(): AutoDrizzleMigratorState {\n    return this.state\n  }\n\n  /**\n   * Get last result\n   */\n  getLastResult(): AutoDrizzleMigrationResult | null {\n    return this.lastResult\n  }\n\n  /**\n   * Get last error\n   */\n  getLastError(): Error | null {\n    return this.lastError\n  }\n\n  /**\n   * Get migrations in postgres.do format\n   */\n  getMigrations(): PostgresDoMigration[] {\n    if (this.cachedMigrations) {\n      return this.cachedMigrations\n    }\n\n    const { journal, migrations } = this.drizzle\n\n    this.cachedMigrations = journal.entries\n      .sort((a, b) => a.idx - b.idx)\n      .map((entry) => {\n        const folderName = `${entry.idx.toString().padStart(4, '0')}_${entry.tag}`\n        const sql = migrations[folderName] || migrations[entry.tag]\n\n        if (!sql) {\n          throw new Error(`Missing migration SQL for: ${folderName}`)\n        }\n\n        const cleanSql = cleanDrizzleSql(sql)\n        const hash = generateHash(`${folderName}:${sql}`)\n        const down = this.downMigrations[entry.tag] || this.downMigrations[folderName]\n\n        const migration: PostgresDoMigration = {\n          id: folderName,\n          name: tagToName(entry.tag),\n          version: entry.idx + 1,\n          up: cleanSql,\n          tags: ['drizzle'],\n          transactional: entry.breakpoints !== false,\n          drizzle: {\n            idx: entry.idx,\n            hash,\n            tag: entry.tag,\n            when: entry.when,\n          },\n        }\n\n        if (down) {\n          migration.down = cleanDrizzleSql(down)\n          migration.isReversible = true\n        } else {\n          migration.isReversible = false\n        }\n\n        return migration\n      })\n\n    return this.cachedMigrations\n  }\n\n  /**\n   * Get the Drizzle journal\n   */\n  getJournal(): DrizzleJournal {\n    return this.drizzle.journal\n  }\n\n  /**\n   * Get latest version\n   */\n  getLatestVersion(): number {\n    const migrations = this.getMigrations()\n    return migrations.length > 0 ? Math.max(...migrations.map((m) => m.version)) : 0\n  }\n\n  /**\n   * Initialize tables\n   */\n  private async initializeTables(executor: QueryExecutor): Promise<void> {\n    this.log('Initializing migration tables')\n\n    // Create postgres.do unified table (execute each statement separately for PGLite compatibility)\n    const statements = getCreateUnifiedTableStatements(this.config.postgresDoTable)\n    for (const statement of statements) {\n      await executor.query(statement)\n    }\n\n    // Create Drizzle-compatible table for drizzle-kit compatibility\n    await executor.query(getCreateDrizzleTableSQL(this.config.journalTable))\n  }\n\n  /**\n   * Get applied migrations from both systems\n   */\n  private async getAppliedMigrations(executor: QueryExecutor): Promise<{\n    postgresDoVersions: Map<number, MigrationStatusRecord>\n    drizzleHashes: Set<string>\n  }> {\n    // Get postgres.do applied versions\n    const pdoResult = await executor.query<MigrationStatusRecord>(\n      `SELECT id, version, checksum as hash, drizzle_hash, drizzle_tag, status, applied_at::text\n       FROM \"${this.config.postgresDoTable}\"\n       WHERE status = 'applied'\n       ORDER BY version`\n    )\n    const postgresDoVersions = new Map<number, MigrationStatusRecord>()\n    for (const row of pdoResult.rows) {\n      postgresDoVersions.set(row.version, row)\n    }\n\n    // Get Drizzle applied hashes\n    const drizzleResult = await executor.query<{ hash: string }>(\n      `SELECT hash FROM \"${this.config.journalTable}\"`\n    )\n    const drizzleHashes = new Set(drizzleResult.rows.map((r) => r.hash))\n\n    return { postgresDoVersions, drizzleHashes }\n  }\n\n  /**\n   * Ensure migrations are applied\n   */\n  async ensureMigrated(executor: QueryExecutor): Promise<AutoDrizzleMigrationResult> {\n    // If already running, wait for completion\n    if (this.migrationPromise) {\n      return this.migrationPromise\n    }\n\n    // If already completed, return cached result\n    if (this.state === 'completed' && this.lastResult) {\n      return this.lastResult\n    }\n\n    // If failed, throw the last error\n    if (this.state === 'failed' && this.lastError) {\n      throw this.lastError\n    }\n\n    // If autoRun is disabled, return empty result\n    if (!this.config.autoRun) {\n      return {\n        success: true,\n        appliedCount: 0,\n        skippedCount: 0,\n        durationMs: 0,\n        applied: [],\n        journalsSynced: false,\n      }\n    }\n\n    // Start migration\n    this.migrationPromise = this.runMigrations(executor)\n\n    try {\n      const result = await this.migrationPromise\n      return result\n    } finally {\n      this.migrationPromise = null\n    }\n  }\n\n  /**\n   * Run all pending migrations\n   */\n  private async runMigrations(executor: QueryExecutor): Promise<AutoDrizzleMigrationResult> {\n    this.state = 'running'\n    this.log('Starting Drizzle migrations')\n\n    const startTime = performance.now()\n    const applied: string[] = []\n    let skippedCount = 0\n    let journalsSynced = false\n\n    try {\n      // Initialize tables\n      await this.initializeTables(executor)\n\n      // Get applied migrations\n      const { postgresDoVersions, drizzleHashes } = await this.getAppliedMigrations(executor)\n\n      // Get all migrations\n      const migrations = this.getMigrations()\n      this.log(`Found ${migrations.length} migrations, ${postgresDoVersions.size} in postgres.do, ${drizzleHashes.size} in Drizzle journal`)\n\n      const startVersion = postgresDoVersions.size > 0\n        ? Math.max(...Array.from(postgresDoVersions.keys()))\n        : 0\n\n      for (let i = 0; i < migrations.length; i++) {\n        const migration = migrations[i]!\n        const drizzleHash = migration.drizzle?.hash ?? generateHash(migration.id + migration.up)\n\n        // Check if already applied in either system\n        const appliedInPostgresDo = postgresDoVersions.has(migration.version)\n        const appliedInDrizzle = drizzleHashes.has(drizzleHash)\n\n        if (appliedInPostgresDo && appliedInDrizzle) {\n          this.log(`Skipping already applied: ${migration.id}`)\n          skippedCount++\n\n          this.onProgress?.({\n            migration: {\n              hash: drizzleHash,\n              tag: migration.drizzle?.tag ?? migration.id,\n              sql: migration.up,\n            },\n            index: i,\n            total: migrations.length,\n            phase: 'skipped',\n          })\n\n          continue\n        }\n\n        // Checksum validation\n        if (this.config.checksumValidation && appliedInPostgresDo) {\n          const existingRecord = postgresDoVersions.get(migration.version)\n          if (existingRecord && existingRecord.hash !== generateHash(migration.up)) {\n            throw new Error(\n              `Migration checksum mismatch for ${migration.id}. ` +\n              `The migration content has changed since it was applied.`\n            )\n          }\n        }\n\n        // Report starting\n        this.onProgress?.({\n          migration: {\n            hash: drizzleHash,\n            tag: migration.drizzle?.tag ?? migration.id,\n            sql: migration.up,\n          },\n          index: i,\n          total: migrations.length,\n          phase: 'starting',\n        })\n\n        const migrationStart = performance.now()\n\n        try {\n          this.onProgress?.({\n            migration: {\n              hash: drizzleHash,\n              tag: migration.drizzle?.tag ?? migration.id,\n              sql: migration.up,\n            },\n            index: i,\n            total: migrations.length,\n            phase: 'executing',\n          })\n\n          // Execute migration SQL\n          const statements = migration.up\n            .split(/;\\s*(?=(?:[^']*'[^']*')*[^']*$)/)\n            .map((s) => s.trim())\n            .filter((s) => s.length > 0)\n\n          for (const statement of statements) {\n            await executor.query(statement + ';')\n          }\n\n          const execTime = Math.round(performance.now() - migrationStart)\n          const checksum = generateHash(migration.up)\n\n          // Record in postgres.do table\n          await executor.query(\n            `INSERT INTO \"${this.config.postgresDoTable}\"\n             (id, name, version, checksum, execution_time_ms, status, drizzle_hash, drizzle_tag, drizzle_idx)\n             VALUES ($1, $2, $3, $4, $5, 'applied', $6, $7, $8)\n             ON CONFLICT (id) DO UPDATE SET\n               status = 'applied',\n               execution_time_ms = $5,\n               applied_at = CURRENT_TIMESTAMP`,\n            [\n              migration.id,\n              migration.name,\n              migration.version,\n              checksum,\n              execTime,\n              drizzleHash,\n              migration.drizzle?.tag ?? null,\n              migration.drizzle?.idx ?? null,\n            ]\n          )\n\n          // Record in Drizzle table for compatibility\n          await executor.query(\n            `INSERT INTO \"${this.config.journalTable}\" (hash) VALUES ($1) ON CONFLICT (hash) DO NOTHING`,\n            [drizzleHash]\n          )\n\n          applied.push(migration.id)\n\n          this.log(`Applied ${migration.id} in ${execTime}ms`)\n\n          this.onProgress?.({\n            migration: {\n              hash: drizzleHash,\n              tag: migration.drizzle?.tag ?? migration.id,\n              sql: migration.up,\n            },\n            index: i,\n            total: migrations.length,\n            phase: 'completed',\n            durationMs: execTime,\n          })\n        } catch (error) {\n          const errorMessage = error instanceof Error ? error.message : String(error)\n          const durationMs = Math.round(performance.now() - migrationStart)\n\n          this.log(`Failed ${migration.id}: ${errorMessage}`)\n\n          this.onProgress?.({\n            migration: {\n              hash: drizzleHash,\n              tag: migration.drizzle?.tag ?? migration.id,\n              sql: migration.up,\n            },\n            index: i,\n            total: migrations.length,\n            phase: 'failed',\n            durationMs,\n            error: errorMessage,\n          })\n\n          throw error\n        }\n      }\n\n      // Sync journals if configured\n      if (this.config.syncJournals) {\n        journalsSynced = await this.syncJournals(executor)\n      }\n\n      const totalDuration = Math.round(performance.now() - startTime)\n      const endVersion = this.getLatestVersion()\n\n      const result: AutoDrizzleMigrationResult = {\n        success: true,\n        appliedCount: applied.length,\n        skippedCount,\n        durationMs: totalDuration,\n        applied,\n        journalsSynced,\n        postgresDoResult: {\n          fromVersion: startVersion,\n          toVersion: endVersion,\n          migrationsRun: applied.length,\n          migrationsSkipped: skippedCount,\n        },\n      }\n\n      this.state = 'completed'\n      this.lastResult = result\n\n      this.log(`Migration complete: ${applied.length} applied, ${skippedCount} skipped in ${totalDuration}ms`)\n      this.onComplete?.(result)\n\n      return result\n    } catch (error) {\n      const totalDuration = Math.round(performance.now() - startTime)\n      const errorMessage = error instanceof Error ? error.message : String(error)\n\n      const result: AutoDrizzleMigrationResult = {\n        success: false,\n        appliedCount: applied.length,\n        skippedCount,\n        durationMs: totalDuration,\n        applied,\n        error: errorMessage,\n        journalsSynced: false,\n      }\n\n      this.state = 'failed'\n      this.lastResult = result\n      this.lastError = error instanceof Error ? error : new Error(errorMessage)\n\n      this.onError?.(this.lastError)\n\n      return result\n    }\n  }\n\n  /**\n   * Sync Drizzle journal with postgres.do tracking\n   *\n   * Ensures both tracking systems have consistent records\n   */\n  private async syncJournals(executor: QueryExecutor): Promise<boolean> {\n    try {\n      this.log('Syncing journals')\n\n      // Get all records from postgres.do table\n      const pdoResult = await executor.query<MigrationStatusRecord>(\n        `SELECT drizzle_hash FROM \"${this.config.postgresDoTable}\" WHERE drizzle_hash IS NOT NULL AND status = 'applied'`\n      )\n\n      // Get all records from Drizzle table\n      const drizzleResult = await executor.query<{ hash: string }>(\n        `SELECT hash FROM \"${this.config.journalTable}\"`\n      )\n\n      const drizzleHashes = new Set(drizzleResult.rows.map((r) => r.hash))\n\n      // Add any missing hashes to Drizzle table\n      let synced = 0\n      for (const row of pdoResult.rows) {\n        if (row.drizzle_hash && !drizzleHashes.has(row.drizzle_hash)) {\n          await executor.query(\n            `INSERT INTO \"${this.config.journalTable}\" (hash) VALUES ($1) ON CONFLICT (hash) DO NOTHING`,\n            [row.drizzle_hash]\n          )\n          synced++\n        }\n      }\n\n      this.log(`Synced ${synced} migration records`)\n      return true\n    } catch (error) {\n      this.log('Journal sync failed:', error)\n      return false\n    }\n  }\n\n  /**\n   * Force re-run migrations\n   */\n  async forceMigrate(executor: QueryExecutor): Promise<AutoDrizzleMigrationResult> {\n    this.state = 'idle'\n    this.migrationPromise = null\n    this.lastResult = null\n    this.lastError = null\n\n    return this.ensureMigrated(executor)\n  }\n\n  /**\n   * Get migration status\n   */\n  async getStatus(executor: QueryExecutor): Promise<{\n    initialized: boolean\n    appliedCount: number\n    pendingCount: number\n    appliedMigrations: Array<{ id: string; version: number; tag?: string | undefined }>\n    pendingMigrations: Array<{ id: string; version: number; tag?: string | undefined }>\n    journalsSynced: boolean\n  }> {\n    try {\n      await this.initializeTables(executor)\n\n      const { postgresDoVersions, drizzleHashes } = await this.getAppliedMigrations(executor)\n      const allMigrations = this.getMigrations()\n\n      const appliedMigrations = allMigrations\n        .filter((m) => postgresDoVersions.has(m.version))\n        .map((m) => ({ id: m.id, version: m.version, tag: m.drizzle?.tag }))\n\n      const pendingMigrations = allMigrations\n        .filter((m) => !postgresDoVersions.has(m.version))\n        .map((m) => ({ id: m.id, version: m.version, tag: m.drizzle?.tag }))\n\n      // Check if journals are in sync\n      const allDrizzleHashesInSync = allMigrations\n        .filter((m) => postgresDoVersions.has(m.version))\n        .every((m) => m.drizzle?.hash && drizzleHashes.has(m.drizzle.hash))\n\n      return {\n        initialized: true,\n        appliedCount: appliedMigrations.length,\n        pendingCount: pendingMigrations.length,\n        appliedMigrations,\n        pendingMigrations,\n        journalsSynced: allDrizzleHashesInSync,\n      }\n    } catch {\n      const allMigrations = this.getMigrations()\n\n      return {\n        initialized: false,\n        appliedCount: 0,\n        pendingCount: allMigrations.length,\n        appliedMigrations: [],\n        pendingMigrations: allMigrations.map((m) => ({ id: m.id, version: m.version, tag: m.drizzle?.tag })),\n        journalsSynced: false,\n      }\n    }\n  }\n\n  /**\n   * Check if there are pending migrations\n   */\n  async needsMigration(executor: QueryExecutor): Promise<boolean> {\n    const status = await this.getStatus(executor)\n    return status.pendingCount > 0\n  }\n\n  /**\n   * Rollback the last migration\n   */\n  async rollbackLast(executor: QueryExecutor): Promise<{\n    success: boolean\n    migration?: PostgresDoMigration\n    error?: string\n  }> {\n    const migrations = this.getMigrations()\n\n    // Get current status\n    const status = await this.getStatus(executor)\n\n    if (status.appliedMigrations.length === 0) {\n      return { success: false, error: 'No migrations to rollback' }\n    }\n\n    // Find the last applied migration\n    const lastApplied = status.appliedMigrations[status.appliedMigrations.length - 1]\n    const migration = migrations.find((m) => m.id === lastApplied?.id)\n\n    if (!migration) {\n      return { success: false, error: `Migration ${lastApplied?.id} not found in registry` }\n    }\n\n    if (!migration.down) {\n      return { success: false, error: `Migration ${migration.id} has no down SQL - cannot rollback` }\n    }\n\n    try {\n      this.log(`Rolling back migration ${migration.id}`)\n\n      // Execute down SQL\n      const statements = migration.down\n        .split(/;\\s*(?=(?:[^']*'[^']*')*[^']*$)/)\n        .map((s) => s.trim())\n        .filter((s) => s.length > 0)\n\n      for (const statement of statements) {\n        await executor.query(statement + ';')\n      }\n\n      // Update status in postgres.do table\n      await executor.query(\n        `UPDATE \"${this.config.postgresDoTable}\"\n         SET status = 'rolled_back', applied_at = CURRENT_TIMESTAMP\n         WHERE id = $1`,\n        [migration.id]\n      )\n\n      // Remove from Drizzle table\n      if (migration.drizzle?.hash) {\n        await executor.query(\n          `DELETE FROM \"${this.config.journalTable}\" WHERE hash = $1`,\n          [migration.drizzle.hash]\n        )\n      }\n\n      this.log(`Rolled back ${migration.id}`)\n\n      return { success: true, migration }\n    } catch (error) {\n      const errorMessage = error instanceof Error ? error.message : String(error)\n      return { success: false, migration, error: errorMessage }\n    }\n  }\n\n  /**\n   * Rollback to a specific version\n   */\n  async rollbackToVersion(executor: QueryExecutor, targetVersion: number): Promise<{\n    success: boolean\n    rolledBack: string[]\n    error?: string | undefined\n  }> {\n    const rolledBack: string[] = []\n    const status = await this.getStatus(executor)\n\n    // Get migrations to rollback (in reverse order)\n    const toRollback = status.appliedMigrations\n      .filter((m) => m.version > targetVersion)\n      .sort((a, b) => b.version - a.version)\n\n    for (const migration of toRollback) {\n      const result = await this.rollbackLast(executor)\n\n      if (!result.success) {\n        return {\n          success: false,\n          rolledBack,\n          error: result.error,\n        }\n      }\n\n      rolledBack.push(migration.id)\n    }\n\n    return { success: true, rolledBack }\n  }\n}\n\n/**\n * Create an auto Drizzle migrator instance\n *\n * @example\n * ```typescript\n * import { createAutoDrizzleMigrator } from 'postgres.do/drizzle'\n * import bundledMigrations from './drizzle-bundle'\n *\n * const migrator = createAutoDrizzleMigrator({\n *   drizzle: bundledMigrations,\n *   autoRun: true,\n *   onProgress: (event) => console.log(`${event.phase}: ${event.migration.tag}`),\n * })\n *\n * // In your DO\n * await migrator.ensureMigrated(pglite)\n * ```\n */\nexport function createAutoDrizzleMigrator(config: AutoDrizzleMigratorConfig): AutoDrizzleMigrator {\n  return new AutoDrizzleMigrator(config)\n}\n","/**\n * Drizzle Schema Generator\n *\n * Generate Drizzle ORM schema definitions from:\n * 1. TypeScript interfaces/types\n * 2. Database introspection\n *\n * This module creates idiomatic Drizzle schemas that can be used\n * for type-safe database queries.\n *\n * @module drizzle/schema-generator\n */\n\nimport type { Sql } from '../types.js'\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\n/**\n * Supported PostgreSQL column types with Drizzle equivalents\n */\nexport interface DrizzleColumnType {\n  /** Drizzle function name (e.g., 'text', 'integer', 'timestamp') */\n  drizzleType: string\n  /** Whether it needs import from pg-core */\n  import: string\n  /** Additional type parameters (e.g., precision for numeric) */\n  params?: string\n  /** TypeScript type for the column */\n  tsType: string\n}\n\n/**\n * Column definition for schema generation\n */\nexport interface SchemaColumnDefinition {\n  /** Column name in the database */\n  name: string\n  /** PostgreSQL data type */\n  pgType: string\n  /** Whether the column allows null */\n  nullable: boolean\n  /** Whether the column has a default value */\n  hasDefault: boolean\n  /** Default value expression */\n  defaultValue?: string | undefined\n  /** Whether this is a primary key */\n  isPrimaryKey: boolean\n  /** Whether this column is unique */\n  isUnique: boolean\n  /** Maximum length for string types */\n  maxLength?: number | undefined\n  /** Foreign key reference */\n  references?: {\n    table: string\n    column: string\n    onDelete?: string | undefined\n    onUpdate?: string | undefined\n  } | undefined\n  /** Array type flag */\n  isArray: boolean\n}\n\n/**\n * Index definition for schema generation\n */\nexport interface SchemaIndexDefinition {\n  /** Index name */\n  name: string\n  /** Columns in the index */\n  columns: string[]\n  /** Whether the index is unique */\n  isUnique: boolean\n  /** Index type (btree, hash, gin, gist, etc.) */\n  type?: string | undefined\n  /** WHERE clause for partial indexes */\n  where?: string | undefined\n}\n\n/**\n * Table definition for schema generation\n */\nexport interface SchemaTableDefinition {\n  /** Table name */\n  name: string\n  /** Schema name (default: public) */\n  schema: string\n  /** Column definitions */\n  columns: SchemaColumnDefinition[]\n  /** Primary key columns (for composite keys) */\n  primaryKey?: string[] | undefined\n  /** Index definitions */\n  indexes: SchemaIndexDefinition[]\n  /** Check constraints */\n  checkConstraints?: Array<{\n    name: string\n    expression: string\n  }> | undefined\n}\n\n/**\n * Enum definition for schema generation\n */\nexport interface SchemaEnumDefinition {\n  /** Enum name */\n  name: string\n  /** Enum values */\n  values: string[]\n}\n\n/**\n * Complete database schema for generation\n */\nexport interface DatabaseSchemaDefinition {\n  /** Tables in the schema */\n  tables: SchemaTableDefinition[]\n  /** Enum types */\n  enums: SchemaEnumDefinition[]\n  /** Schema name */\n  schemaName: string\n}\n\n/**\n * Options for schema generation\n */\nexport interface SchemaGeneratorOptions {\n  /** Database schema to introspect (default: 'public') */\n  schema?: string\n  /** Whether to include relations */\n  includeRelations?: boolean\n  /** Whether to include indexes */\n  includeIndexes?: boolean\n  /** Tables to include (if specified, only these tables are generated) */\n  includeTables?: string[]\n  /** Tables to exclude */\n  excludeTables?: string[]\n  /** Whether to generate types as well */\n  generateTypes?: boolean\n  /** Naming convention for table names */\n  tableNaming?: 'camelCase' | 'PascalCase' | 'snake_case'\n  /** Naming convention for column names */\n  columnNaming?: 'camelCase' | 'snake_case'\n  /** Whether to use singular table names */\n  singularTableNames?: boolean\n}\n\n/**\n * TypeScript property definition for type-to-schema conversion\n */\nexport interface TypeScriptProperty {\n  /** Property name */\n  name: string\n  /** TypeScript type string */\n  type: string\n  /** Whether the property is optional */\n  optional: boolean\n  /** JSDoc comment if any */\n  comment?: string | undefined\n}\n\n/**\n * TypeScript interface definition for schema conversion\n */\nexport interface TypeScriptInterface {\n  /** Interface name */\n  name: string\n  /** Properties */\n  properties: TypeScriptProperty[]\n  /** Extends clause */\n  extends?: string[] | undefined\n  /** JSDoc comment */\n  comment?: string | undefined\n}\n\n// ============================================================================\n// PostgreSQL to Drizzle Type Mapping\n// ============================================================================\n\n/**\n * Map PostgreSQL types to Drizzle column types\n */\nconst PG_TO_DRIZZLE_MAP: Record<string, DrizzleColumnType> = {\n  // Integer types\n  smallint: { drizzleType: 'smallint', import: 'smallint', tsType: 'number' },\n  integer: { drizzleType: 'integer', import: 'integer', tsType: 'number' },\n  int: { drizzleType: 'integer', import: 'integer', tsType: 'number' },\n  int4: { drizzleType: 'integer', import: 'integer', tsType: 'number' },\n  bigint: { drizzleType: 'bigint', import: 'bigint', tsType: 'bigint' },\n  int8: { drizzleType: 'bigint', import: 'bigint', tsType: 'bigint' },\n  serial: { drizzleType: 'serial', import: 'serial', tsType: 'number' },\n  smallserial: { drizzleType: 'smallserial', import: 'smallserial', tsType: 'number' },\n  bigserial: { drizzleType: 'bigserial', import: 'bigserial', tsType: 'bigint' },\n\n  // Floating-point types\n  real: { drizzleType: 'real', import: 'real', tsType: 'number' },\n  float4: { drizzleType: 'real', import: 'real', tsType: 'number' },\n  'double precision': { drizzleType: 'doublePrecision', import: 'doublePrecision', tsType: 'number' },\n  float8: { drizzleType: 'doublePrecision', import: 'doublePrecision', tsType: 'number' },\n\n  // Arbitrary precision\n  numeric: { drizzleType: 'numeric', import: 'numeric', tsType: 'string' },\n  decimal: { drizzleType: 'numeric', import: 'numeric', tsType: 'string' },\n\n  // Character types\n  'character varying': { drizzleType: 'varchar', import: 'varchar', tsType: 'string' },\n  varchar: { drizzleType: 'varchar', import: 'varchar', tsType: 'string' },\n  character: { drizzleType: 'char', import: 'char', tsType: 'string' },\n  char: { drizzleType: 'char', import: 'char', tsType: 'string' },\n  text: { drizzleType: 'text', import: 'text', tsType: 'string' },\n\n  // Binary\n  bytea: { drizzleType: 'bytea', import: 'bytea', tsType: 'Buffer' },\n\n  // Boolean\n  boolean: { drizzleType: 'boolean', import: 'boolean', tsType: 'boolean' },\n  bool: { drizzleType: 'boolean', import: 'boolean', tsType: 'boolean' },\n\n  // Date/time types\n  date: { drizzleType: 'date', import: 'date', tsType: 'string' },\n  time: { drizzleType: 'time', import: 'time', tsType: 'string' },\n  'time with time zone': { drizzleType: 'time', import: 'time', tsType: 'string' },\n  'time without time zone': { drizzleType: 'time', import: 'time', tsType: 'string' },\n  timestamp: { drizzleType: 'timestamp', import: 'timestamp', tsType: 'Date' },\n  'timestamp with time zone': { drizzleType: 'timestamp', import: 'timestamp', tsType: 'Date' },\n  'timestamp without time zone': { drizzleType: 'timestamp', import: 'timestamp', tsType: 'Date' },\n  timestamptz: { drizzleType: 'timestamp', import: 'timestamp', tsType: 'Date' },\n  interval: { drizzleType: 'interval', import: 'interval', tsType: 'string' },\n\n  // UUID\n  uuid: { drizzleType: 'uuid', import: 'uuid', tsType: 'string' },\n\n  // JSON types\n  json: { drizzleType: 'json', import: 'json', tsType: 'unknown' },\n  jsonb: { drizzleType: 'jsonb', import: 'jsonb', tsType: 'unknown' },\n\n  // Network types\n  inet: { drizzleType: 'inet', import: 'inet', tsType: 'string' },\n  cidr: { drizzleType: 'cidr', import: 'cidr', tsType: 'string' },\n  macaddr: { drizzleType: 'macaddr', import: 'macaddr', tsType: 'string' },\n  macaddr8: { drizzleType: 'macaddr8', import: 'macaddr8', tsType: 'string' },\n\n  // Geometric types\n  point: { drizzleType: 'point', import: 'point', tsType: '{ x: number; y: number }' },\n  line: { drizzleType: 'line', import: 'line', tsType: 'string' },\n  lseg: { drizzleType: 'line', import: 'line', tsType: 'string' },\n  box: { drizzleType: 'customType', import: 'customType', tsType: 'string' },\n  path: { drizzleType: 'customType', import: 'customType', tsType: 'string' },\n  polygon: { drizzleType: 'customType', import: 'customType', tsType: 'string' },\n  circle: { drizzleType: 'customType', import: 'customType', tsType: 'string' },\n}\n\n/**\n * Map TypeScript types to Drizzle column types\n */\nconst TS_TO_DRIZZLE_MAP: Record<string, DrizzleColumnType> = {\n  string: { drizzleType: 'text', import: 'text', tsType: 'string' },\n  number: { drizzleType: 'integer', import: 'integer', tsType: 'number' },\n  bigint: { drizzleType: 'bigint', import: 'bigint', tsType: 'bigint' },\n  boolean: { drizzleType: 'boolean', import: 'boolean', tsType: 'boolean' },\n  Date: { drizzleType: 'timestamp', import: 'timestamp', tsType: 'Date' },\n  object: { drizzleType: 'jsonb', import: 'jsonb', tsType: 'unknown' },\n  'Record<string, unknown>': { drizzleType: 'jsonb', import: 'jsonb', tsType: 'unknown' },\n  'Record<string, any>': { drizzleType: 'jsonb', import: 'jsonb', tsType: 'unknown' },\n  unknown: { drizzleType: 'jsonb', import: 'jsonb', tsType: 'unknown' },\n  any: { drizzleType: 'jsonb', import: 'jsonb', tsType: 'unknown' },\n  Buffer: { drizzleType: 'bytea', import: 'bytea', tsType: 'Buffer' },\n  Uint8Array: { drizzleType: 'bytea', import: 'bytea', tsType: 'Buffer' },\n}\n\n// ============================================================================\n// Database Introspection\n// ============================================================================\n\n/**\n * Introspect a PostgreSQL database and return schema definitions\n *\n * @example\n * ```typescript\n * const schema = await introspectDatabase(sql, { schema: 'public' })\n * const drizzleCode = generateDrizzleSchema(schema)\n * ```\n */\nexport async function introspectDatabase(\n  client: Sql,\n  options: SchemaGeneratorOptions = {}\n): Promise<DatabaseSchemaDefinition> {\n  const schema = options.schema ?? 'public'\n\n  // Get tables\n  const tables = await introspectTables(client, schema, options)\n\n  // Get enums\n  const enums = await introspectEnums(client, schema)\n\n  return {\n    tables,\n    enums,\n    schemaName: schema,\n  }\n}\n\n/**\n * Introspect all tables in a schema\n */\nasync function introspectTables(\n  client: Sql,\n  schema: string,\n  options: SchemaGeneratorOptions\n): Promise<SchemaTableDefinition[]> {\n  const tablesQuery = `\n    SELECT table_name\n    FROM information_schema.tables\n    WHERE table_schema = $1\n      AND table_type = 'BASE TABLE'\n    ORDER BY table_name\n  `\n  const tablesResult = await client.unsafe<{ table_name: string }>(tablesQuery, [schema])\n\n  const tables: SchemaTableDefinition[] = []\n\n  for (const { table_name } of tablesResult) {\n    // Check include/exclude lists\n    if (options.includeTables && !options.includeTables.includes(table_name)) {\n      continue\n    }\n    if (options.excludeTables && options.excludeTables.includes(table_name)) {\n      continue\n    }\n    // Skip internal tables\n    if (table_name.startsWith('_')) {\n      continue\n    }\n\n    const table = await introspectTable(client, schema, table_name, options)\n    tables.push(table)\n  }\n\n  return tables\n}\n\n/**\n * Introspect a single table\n */\nasync function introspectTable(\n  client: Sql,\n  schema: string,\n  tableName: string,\n  options: SchemaGeneratorOptions\n): Promise<SchemaTableDefinition> {\n  // Get columns\n  const columnsQuery = `\n    SELECT\n      c.column_name,\n      c.data_type,\n      c.udt_name,\n      c.is_nullable,\n      c.column_default,\n      c.character_maximum_length,\n      c.numeric_precision,\n      c.numeric_scale\n    FROM information_schema.columns c\n    WHERE c.table_schema = $1 AND c.table_name = $2\n    ORDER BY c.ordinal_position\n  `\n  const columnsResult = await client.unsafe<{\n    column_name: string\n    data_type: string\n    udt_name: string\n    is_nullable: string\n    column_default: string | null\n    character_maximum_length: number | null\n    numeric_precision: number | null\n    numeric_scale: number | null\n  }>(columnsQuery, [schema, tableName])\n\n  // Get primary key columns\n  const pkQuery = `\n    SELECT a.attname as column_name\n    FROM pg_index i\n    JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey)\n    WHERE i.indrelid = $1::regclass\n      AND i.indisprimary\n  `\n  const pkResult = await client.unsafe<{ column_name: string }>(pkQuery, [\n    `${schema}.${tableName}`,\n  ])\n  const primaryKeyColumns = new Set(pkResult.map((r) => r.column_name))\n\n  // Get unique constraints\n  const uniqueQuery = `\n    SELECT a.attname as column_name\n    FROM pg_index i\n    JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey)\n    WHERE i.indrelid = $1::regclass\n      AND i.indisunique\n      AND NOT i.indisprimary\n  `\n  const uniqueResult = await client.unsafe<{ column_name: string }>(uniqueQuery, [\n    `${schema}.${tableName}`,\n  ])\n  const uniqueColumns = new Set(uniqueResult.map((r) => r.column_name))\n\n  // Get foreign keys\n  const fkQuery = `\n    SELECT\n      kcu.column_name,\n      ccu.table_name AS foreign_table_name,\n      ccu.column_name AS foreign_column_name,\n      rc.delete_rule,\n      rc.update_rule\n    FROM information_schema.key_column_usage kcu\n    JOIN information_schema.referential_constraints rc\n      ON kcu.constraint_name = rc.constraint_name\n      AND kcu.constraint_schema = rc.constraint_schema\n    JOIN information_schema.constraint_column_usage ccu\n      ON rc.unique_constraint_name = ccu.constraint_name\n      AND rc.unique_constraint_schema = ccu.constraint_schema\n    WHERE kcu.table_schema = $1 AND kcu.table_name = $2\n  `\n  const fkResult = await client.unsafe<{\n    column_name: string\n    foreign_table_name: string\n    foreign_column_name: string\n    delete_rule: string\n    update_rule: string\n  }>(fkQuery, [schema, tableName])\n  const foreignKeys = new Map(fkResult.map((fk) => [fk.column_name, fk]))\n\n  // Build column definitions\n  const columns: SchemaColumnDefinition[] = columnsResult.map((col) => {\n    const fk = foreignKeys.get(col.column_name)\n    const isArray = col.data_type === 'ARRAY'\n    const pgType = isArray ? col.udt_name.replace(/^_/, '') : col.data_type\n\n    return {\n      name: col.column_name,\n      pgType: pgType.toLowerCase(),\n      nullable: col.is_nullable === 'YES',\n      hasDefault: col.column_default !== null,\n      defaultValue: col.column_default ?? undefined,\n      isPrimaryKey: primaryKeyColumns.has(col.column_name),\n      isUnique: uniqueColumns.has(col.column_name),\n      maxLength: col.character_maximum_length ?? undefined,\n      references: fk\n        ? {\n            table: fk.foreign_table_name,\n            column: fk.foreign_column_name,\n            onDelete: fk.delete_rule,\n            onUpdate: fk.update_rule,\n          }\n        : undefined,\n      isArray,\n    }\n  })\n\n  // Get indexes if requested\n  const indexes: SchemaIndexDefinition[] = []\n  if (options.includeIndexes) {\n    const indexQuery = `\n      SELECT\n        i.relname AS index_name,\n        array_agg(a.attname ORDER BY array_position(ix.indkey, a.attnum)) AS columns,\n        ix.indisunique AS is_unique,\n        am.amname AS index_type,\n        pg_get_expr(ix.indpred, ix.indrelid) AS where_clause\n      FROM pg_index ix\n      JOIN pg_class i ON i.oid = ix.indexrelid\n      JOIN pg_class t ON t.oid = ix.indrelid\n      JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(ix.indkey)\n      JOIN pg_am am ON am.oid = i.relam\n      JOIN pg_namespace n ON n.oid = t.relnamespace\n      WHERE n.nspname = $1\n        AND t.relname = $2\n        AND NOT ix.indisprimary\n      GROUP BY i.relname, ix.indisunique, am.amname, ix.indpred, ix.indrelid\n    `\n    const indexResult = await client.unsafe<{\n      index_name: string\n      columns: string[]\n      is_unique: boolean\n      index_type: string\n      where_clause: string | null\n    }>(indexQuery, [schema, tableName])\n\n    for (const idx of indexResult) {\n      indexes.push({\n        name: idx.index_name,\n        columns: idx.columns,\n        isUnique: idx.is_unique,\n        type: idx.index_type,\n        where: idx.where_clause ?? undefined,\n      })\n    }\n  }\n\n  return {\n    name: tableName,\n    schema,\n    columns,\n    primaryKey: primaryKeyColumns.size > 1 ? Array.from(primaryKeyColumns) : undefined,\n    indexes,\n  }\n}\n\n/**\n * Introspect enum types in a schema\n */\nasync function introspectEnums(client: Sql, schema: string): Promise<SchemaEnumDefinition[]> {\n  const enumQuery = `\n    SELECT\n      t.typname AS enum_name,\n      array_agg(e.enumlabel ORDER BY e.enumsortorder) AS enum_values\n    FROM pg_type t\n    JOIN pg_enum e ON t.oid = e.enumtypid\n    JOIN pg_namespace n ON n.oid = t.typnamespace\n    WHERE n.nspname = $1\n    GROUP BY t.typname\n  `\n  const enumResult = await client.unsafe<{\n    enum_name: string\n    enum_values: string[]\n  }>(enumQuery, [schema])\n\n  return enumResult.map((e) => ({\n    name: e.enum_name,\n    values: e.enum_values,\n  }))\n}\n\n// ============================================================================\n// TypeScript Interface Parsing\n// ============================================================================\n\n/**\n * Parse TypeScript interface from source code string\n *\n * @example\n * ```typescript\n * const interfaces = parseTypeScriptInterfaces(`\n *   interface User {\n *     id: string;\n *     email: string;\n *     createdAt: Date;\n *   }\n * `)\n * ```\n */\nexport function parseTypeScriptInterfaces(source: string): TypeScriptInterface[] {\n  const interfaces: TypeScriptInterface[] = []\n\n  // Match interface declarations\n  const interfaceRegex = /(?:\\/\\*\\*[\\s\\S]*?\\*\\/\\s*)?export\\s+(?:interface|type)\\s+(\\w+)(?:\\s+extends\\s+([\\w,\\s]+))?\\s*(?:=\\s*)?\\{([^}]*)\\}/g\n\n  let match\n  while ((match = interfaceRegex.exec(source)) !== null) {\n    const name = match[1]\n    if (!name) continue\n\n    const extendsClause = match[2]?.split(',').map((s) => s.trim()).filter(Boolean)\n    const body = match[3] ?? ''\n\n    // Parse properties\n    const properties = parseInterfaceProperties(body)\n\n    // Extract JSDoc comment\n    const commentMatch = source.slice(0, match.index).match(/\\/\\*\\*[\\s\\S]*?\\*\\/\\s*$/)\n\n    interfaces.push({\n      name,\n      properties,\n      extends: extendsClause,\n      comment: commentMatch?.[0],\n    })\n  }\n\n  return interfaces\n}\n\n/**\n * Parse properties from interface body\n */\nfunction parseInterfaceProperties(body: string): TypeScriptProperty[] {\n  const properties: TypeScriptProperty[] = []\n\n  // Match property declarations\n  const propRegex = /(?:\\/\\*\\*[\\s\\S]*?\\*\\/\\s*)?(?:readonly\\s+)?(\\w+)(\\?)?:\\s*([^;]+);/g\n\n  let match\n  while ((match = propRegex.exec(body)) !== null) {\n    const name = match[1]\n    const optional = !!match[2]\n    const type = match[3]?.trim() ?? 'unknown'\n\n    if (!name) continue\n\n    // Extract JSDoc comment\n    const commentMatch = body.slice(0, match.index).match(/\\/\\*\\*[\\s\\S]*?\\*\\/\\s*$/)\n\n    properties.push({\n      name,\n      type,\n      optional,\n      comment: commentMatch?.[0],\n    })\n  }\n\n  return properties\n}\n\n/**\n * Convert TypeScript interfaces to table definitions\n *\n * @example\n * ```typescript\n * const tables = convertInterfacesToTables(interfaces, {\n *   singularTableNames: false,\n * })\n * ```\n */\nexport function convertInterfacesToTables(\n  interfaces: TypeScriptInterface[],\n  options: SchemaGeneratorOptions = {}\n): SchemaTableDefinition[] {\n  return interfaces.map((iface) => convertInterfaceToTable(iface, options))\n}\n\n/**\n * Convert a single TypeScript interface to a table definition\n */\nfunction convertInterfaceToTable(\n  iface: TypeScriptInterface,\n  options: SchemaGeneratorOptions\n): SchemaTableDefinition {\n  const tableName = convertTableName(iface.name, options)\n\n  const columns: SchemaColumnDefinition[] = iface.properties.map((prop) => {\n    const columnName = convertColumnName(prop.name, options)\n    const columnType = inferColumnType(prop)\n\n    return {\n      name: columnName,\n      pgType: columnType.pgType,\n      nullable: prop.optional || prop.type.includes('null'),\n      hasDefault: isAutoGeneratedColumn(prop.name, prop.type),\n      defaultValue: getDefaultValue(prop.name, prop.type),\n      isPrimaryKey: isIdColumn(prop.name),\n      isUnique: false,\n      isArray: prop.type.endsWith('[]'),\n    }\n  })\n\n  // Auto-detect primary key\n  const idColumn = columns.find((c) => isIdColumn(c.name))\n  if (idColumn) {\n    idColumn.isPrimaryKey = true\n  }\n\n  return {\n    name: tableName,\n    schema: options.schema ?? 'public',\n    columns,\n    indexes: [],\n  }\n}\n\n/**\n * Infer PostgreSQL column type from TypeScript property\n */\nfunction inferColumnType(prop: TypeScriptProperty): { pgType: string; drizzleType: string } {\n  const type = prop.type.replace(/\\s*\\|\\s*null\\s*/g, '').replace(/\\s*\\|\\s*undefined\\s*/g, '')\n\n  // Handle array types\n  if (type.endsWith('[]')) {\n    const baseType = type.slice(0, -2)\n    const baseMapping = TS_TO_DRIZZLE_MAP[baseType]\n    if (baseMapping) {\n      return { pgType: `${baseMapping.drizzleType}[]`, drizzleType: baseMapping.drizzleType }\n    }\n    return { pgType: 'jsonb', drizzleType: 'jsonb' }\n  }\n\n  // Check for special patterns\n  const lowerName = prop.name.toLowerCase()\n\n  // UUID patterns\n  if (lowerName === 'id' || lowerName.endsWith('id') || lowerName.endsWith('_id')) {\n    if (type === 'string') {\n      return { pgType: 'uuid', drizzleType: 'uuid' }\n    }\n  }\n\n  // Timestamp patterns\n  if (\n    lowerName.includes('created') ||\n    lowerName.includes('updated') ||\n    lowerName.includes('deleted') ||\n    lowerName.endsWith('_at') ||\n    lowerName.endsWith('at')\n  ) {\n    if (type === 'Date' || type === 'string') {\n      return { pgType: 'timestamp', drizzleType: 'timestamp' }\n    }\n  }\n\n  // Email pattern\n  if (lowerName === 'email' || lowerName.includes('email')) {\n    return { pgType: 'text', drizzleType: 'text' }\n  }\n\n  // Check direct mapping\n  const mapping = TS_TO_DRIZZLE_MAP[type]\n  if (mapping) {\n    return { pgType: mapping.drizzleType, drizzleType: mapping.drizzleType }\n  }\n\n  // Default to jsonb for complex types\n  return { pgType: 'jsonb', drizzleType: 'jsonb' }\n}\n\n// ============================================================================\n// Schema Code Generation\n// ============================================================================\n\n/**\n * Generate Drizzle schema code from database schema definition\n *\n * @example\n * ```typescript\n * const schema = await introspectDatabase(sql)\n * const code = generateDrizzleSchema(schema)\n * console.log(code)\n * ```\n */\nexport function generateDrizzleSchema(\n  schema: DatabaseSchemaDefinition,\n  options: SchemaGeneratorOptions = {}\n): string {\n  const lines: string[] = []\n  const imports = new Set<string>()\n\n  // Always need pgTable\n  imports.add('pgTable')\n\n  // Collect all needed imports\n  for (const table of schema.tables) {\n    for (const col of table.columns) {\n      const drizzleType = getDrizzleType(col)\n      imports.add(drizzleType.import)\n    }\n  }\n\n  // Add pgEnum if we have enums\n  if (schema.enums.length > 0) {\n    imports.add('pgEnum')\n  }\n\n  // Generate header\n  lines.push('/**')\n  lines.push(' * Auto-generated Drizzle schema')\n  lines.push(` * Generated at: ${new Date().toISOString()}`)\n  lines.push(' *')\n  lines.push(' * @module schema')\n  lines.push(' */')\n  lines.push('')\n\n  // Generate imports\n  lines.push(`import { ${Array.from(imports).sort().join(', ')} } from 'drizzle-orm/pg-core'`)\n\n  if (options.includeRelations) {\n    lines.push(`import { relations } from 'drizzle-orm'`)\n  }\n\n  lines.push('')\n\n  // Generate enums\n  for (const enumDef of schema.enums) {\n    lines.push(generateEnumCode(enumDef))\n    lines.push('')\n  }\n\n  // Generate tables\n  for (const table of schema.tables) {\n    lines.push(generateTableCode(table, schema, options))\n    lines.push('')\n  }\n\n  // Generate relations if requested\n  if (options.includeRelations) {\n    const relationCode = generateRelationsCode(schema.tables)\n    if (relationCode) {\n      lines.push(relationCode)\n    }\n  }\n\n  return lines.join('\\n')\n}\n\n/**\n * Generate Drizzle enum code\n */\nfunction generateEnumCode(enumDef: SchemaEnumDefinition): string {\n  const varName = toCamelCase(enumDef.name)\n  const values = enumDef.values.map((v) => `'${v}'`).join(', ')\n  return `export const ${varName}Enum = pgEnum('${enumDef.name}', [${values}])`\n}\n\n/**\n * Generate Drizzle table code\n */\nfunction generateTableCode(\n  table: SchemaTableDefinition,\n  schema: DatabaseSchemaDefinition,\n  options: SchemaGeneratorOptions\n): string {\n  const lines: string[] = []\n  const varName = toCamelCase(table.name)\n\n  lines.push(`export const ${varName} = pgTable('${table.name}', {`)\n\n  for (let i = 0; i < table.columns.length; i++) {\n    const col = table.columns[i]\n    if (!col) continue\n\n    const isLast = i === table.columns.length - 1\n    const colCode = generateColumnCode(col, schema.enums)\n    lines.push(`  ${colCode}${isLast ? '' : ','}`)\n  }\n\n  // Add composite primary key if needed\n  if (table.primaryKey && table.primaryKey.length > 1) {\n    lines.push('}, (table) => ({')\n    lines.push(`  pk: primaryKey({ columns: [${table.primaryKey.map((c) => `table.${toCamelCase(c)}`).join(', ')}] }),`)\n    lines.push('})')\n  } else if (options.includeIndexes && table.indexes.length > 0) {\n    lines.push('}, (table) => ({')\n    for (const idx of table.indexes) {\n      const idxName = toCamelCase(idx.name.replace(new RegExp(`^${table.name}_`), ''))\n      const columns = idx.columns.map((c) => `table.${toCamelCase(c)}`).join(', ')\n      if (idx.isUnique) {\n        lines.push(`  ${idxName}: uniqueIndex('${idx.name}').on(${columns}),`)\n      } else {\n        lines.push(`  ${idxName}: index('${idx.name}').on(${columns}),`)\n      }\n    }\n    lines.push('})')\n  } else {\n    lines.push('})')\n  }\n\n  return lines.join('\\n')\n}\n\n/**\n * Generate Drizzle column code\n */\nfunction generateColumnCode(col: SchemaColumnDefinition, enums: SchemaEnumDefinition[]): string {\n  const colName = toCamelCase(col.name)\n  const drizzleType = getDrizzleType(col)\n\n  // Check if this is an enum type\n  const enumDef = enums.find((e) => e.name === col.pgType)\n\n  let code: string\n\n  if (enumDef) {\n    // Enum column\n    const enumVarName = toCamelCase(enumDef.name)\n    code = `${colName}: ${enumVarName}Enum('${col.name}')`\n  } else if (col.maxLength && (drizzleType.drizzleType === 'varchar' || drizzleType.drizzleType === 'char')) {\n    // String with length\n    code = `${colName}: ${drizzleType.drizzleType}('${col.name}', { length: ${col.maxLength} })`\n  } else if (drizzleType.drizzleType === 'timestamp') {\n    // Timestamp with mode\n    code = `${colName}: ${drizzleType.drizzleType}('${col.name}', { mode: 'date' })`\n  } else if (col.isArray) {\n    // Array type\n    code = `${colName}: ${drizzleType.drizzleType}('${col.name}').array()`\n  } else {\n    // Standard column\n    code = `${colName}: ${drizzleType.drizzleType}('${col.name}')`\n  }\n\n  // Add modifiers\n  if (col.isPrimaryKey) {\n    code += '.primaryKey()'\n  }\n  if (!col.nullable && !col.isPrimaryKey) {\n    code += '.notNull()'\n  }\n  if (col.isUnique) {\n    code += '.unique()'\n  }\n  if (col.hasDefault && col.defaultValue) {\n    code += generateDefaultCode(col)\n  }\n  if (col.references) {\n    const refTable = toCamelCase(col.references.table)\n    const refCol = toCamelCase(col.references.column)\n    code += `.references(() => ${refTable}.${refCol}`\n    if (col.references.onDelete && col.references.onDelete !== 'NO ACTION') {\n      code += `, { onDelete: '${col.references.onDelete.toLowerCase()}' }`\n    }\n    code += ')'\n  }\n\n  return code\n}\n\n/**\n * Generate default value code\n */\nfunction generateDefaultCode(col: SchemaColumnDefinition): string {\n  if (!col.defaultValue) return ''\n\n  const def = col.defaultValue.toLowerCase()\n\n  // Handle common defaults\n  if (def === 'now()' || def === 'current_timestamp') {\n    return '.defaultNow()'\n  }\n  if (def === 'gen_random_uuid()' || def === 'uuid_generate_v4()') {\n    return '.$defaultFn(() => crypto.randomUUID())'\n  }\n  if (def === 'true' || def === 'false') {\n    return `.default(${def})`\n  }\n  if (/^-?\\d+$/.test(def)) {\n    return `.default(${def})`\n  }\n  if (/^'.*'::/.test(col.defaultValue)) {\n    const value = col.defaultValue.match(/^'([^']*)'/)\n    if (value) {\n      return `.default('${value[1]}')`\n    }\n  }\n\n  // Skip complex defaults\n  return ''\n}\n\n/**\n * Generate relations code\n */\nfunction generateRelationsCode(tables: SchemaTableDefinition[]): string {\n  const lines: string[] = []\n\n  // Build a map of foreign key relationships\n  const relationships: Map<string, Array<{ from: string; to: string; column: string; refColumn: string }>> = new Map()\n\n  for (const table of tables) {\n    for (const col of table.columns) {\n      if (col.references) {\n        const key = table.name\n        if (!relationships.has(key)) {\n          relationships.set(key, [])\n        }\n        relationships.get(key)!.push({\n          from: table.name,\n          to: col.references.table,\n          column: col.name,\n          refColumn: col.references.column,\n        })\n      }\n    }\n  }\n\n  // Generate relations for tables with foreign keys\n  for (const [tableName, rels] of relationships) {\n    const varName = toCamelCase(tableName)\n    lines.push(`export const ${varName}Relations = relations(${varName}, ({ one, many }) => ({`)\n\n    for (const rel of rels) {\n      const relVarName = toCamelCase(rel.to)\n      const fieldName = rel.column.replace(/_id$/, '').replace(/Id$/, '')\n      lines.push(`  ${toCamelCase(fieldName)}: one(${relVarName}, {`)\n      lines.push(`    fields: [${varName}.${toCamelCase(rel.column)}],`)\n      lines.push(`    references: [${relVarName}.${toCamelCase(rel.refColumn)}],`)\n      lines.push('  }),')\n    }\n\n    lines.push('}))')\n    lines.push('')\n  }\n\n  // Generate reverse relations\n  for (const table of tables) {\n    const incomingRels = Array.from(relationships.values())\n      .flat()\n      .filter((r) => r.to === table.name)\n\n    if (incomingRels.length > 0) {\n      const varName = toCamelCase(table.name)\n      const existingRelation = relationships.has(table.name)\n\n      if (!existingRelation) {\n        lines.push(`export const ${varName}Relations = relations(${varName}, ({ many }) => ({`)\n        for (const rel of incomingRels) {\n          const relVarName = toCamelCase(rel.from)\n          const pluralName = pluralize(rel.from)\n          lines.push(`  ${toCamelCase(pluralName)}: many(${relVarName}),`)\n        }\n        lines.push('}))')\n        lines.push('')\n      }\n    }\n  }\n\n  return lines.join('\\n')\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Get Drizzle type from column definition\n */\nfunction getDrizzleType(col: SchemaColumnDefinition): DrizzleColumnType {\n  const pgType = col.pgType.toLowerCase()\n\n  // Direct mapping\n  const mapping = PG_TO_DRIZZLE_MAP[pgType]\n  if (mapping) {\n    return mapping\n  }\n\n  // Handle varchar with length\n  if (pgType.startsWith('character varying') || pgType.startsWith('varchar')) {\n    return PG_TO_DRIZZLE_MAP['varchar']!\n  }\n\n  // Handle numeric with precision\n  if (pgType.startsWith('numeric') || pgType.startsWith('decimal')) {\n    return PG_TO_DRIZZLE_MAP['numeric']!\n  }\n\n  // Default to text\n  return { drizzleType: 'text', import: 'text', tsType: 'string' }\n}\n\n/**\n * Convert string to camelCase\n */\nfunction toCamelCase(str: string): string {\n  return str\n    .replace(/^([A-Z])/, (m) => m.toLowerCase())\n    .replace(/[-_]([a-z])/g, (_, c) => c.toUpperCase())\n}\n\n/**\n * Convert table name based on options\n */\nfunction convertTableName(name: string, options: SchemaGeneratorOptions): string {\n  let result = name\n\n  // Convert to snake_case for database\n  result = result\n    .replace(/([a-z])([A-Z])/g, '$1_$2')\n    .toLowerCase()\n\n  // Pluralize if not using singular names\n  if (!options.singularTableNames) {\n    result = pluralize(result)\n  }\n\n  return result\n}\n\n/**\n * Convert column name based on options\n */\nfunction convertColumnName(name: string, options: SchemaGeneratorOptions): string {\n  if (options.columnNaming === 'snake_case') {\n    return name\n      .replace(/([a-z])([A-Z])/g, '$1_$2')\n      .toLowerCase()\n  }\n  return name\n}\n\n/**\n * Check if a column is an ID column\n */\nfunction isIdColumn(name: string): boolean {\n  const lower = name.toLowerCase()\n  return lower === 'id' || lower === '_id'\n}\n\n/**\n * Check if a column should have an auto-generated value\n */\nfunction isAutoGeneratedColumn(name: string, type: string): boolean {\n  const lower = name.toLowerCase()\n\n  // ID columns\n  if (isIdColumn(name) && type === 'string') {\n    return true\n  }\n\n  // Timestamp columns\n  if (\n    (lower.includes('created') || lower === 'created_at' || lower === 'createdat') &&\n    (type === 'Date' || type === 'string')\n  ) {\n    return true\n  }\n\n  return false\n}\n\n/**\n * Get default value for auto-generated columns\n */\nfunction getDefaultValue(name: string, type: string): string | undefined {\n  const lower = name.toLowerCase()\n\n  if (isIdColumn(name) && type === 'string') {\n    return 'gen_random_uuid()'\n  }\n\n  if (\n    (lower.includes('created') || lower === 'created_at' || lower === 'createdat') &&\n    (type === 'Date' || type === 'string')\n  ) {\n    return 'now()'\n  }\n\n  return undefined\n}\n\n/**\n * Simple pluralization\n */\nfunction pluralize(word: string): string {\n  if (word.endsWith('y') && !['ay', 'ey', 'iy', 'oy', 'uy'].some((s) => word.endsWith(s))) {\n    return word.slice(0, -1) + 'ies'\n  }\n  if (word.endsWith('s') || word.endsWith('x') || word.endsWith('ch') || word.endsWith('sh')) {\n    return word + 'es'\n  }\n  return word + 's'\n}\n\n// ============================================================================\n// High-Level API Functions\n// ============================================================================\n\n/**\n * Generate Drizzle schema from TypeScript source code\n *\n * @example\n * ```typescript\n * const source = `\n *   interface User {\n *     id: string;\n *     email: string;\n *     createdAt: Date;\n *     metadata: Record<string, unknown>;\n *   }\n * `\n * const schema = generateSchemaFromTypeScript(source)\n * console.log(schema)\n * ```\n */\nexport function generateSchemaFromTypeScript(\n  source: string,\n  options: SchemaGeneratorOptions = {}\n): string {\n  const interfaces = parseTypeScriptInterfaces(source)\n  const tables = convertInterfacesToTables(interfaces, options)\n\n  return generateDrizzleSchema(\n    {\n      tables,\n      enums: [],\n      schemaName: options.schema ?? 'public',\n    },\n    options\n  )\n}\n\n/**\n * Generate Drizzle schema from database introspection\n *\n * @example\n * ```typescript\n * import postgres from 'postgres.do'\n * import { generateSchemaFromDatabase } from 'postgres.do/drizzle'\n *\n * const sql = postgres('postgres://...')\n * const schema = await generateSchemaFromDatabase(sql)\n * console.log(schema)\n * ```\n */\nexport async function generateSchemaFromDatabase(\n  client: Sql,\n  options: SchemaGeneratorOptions = {}\n): Promise<string> {\n  const schema = await introspectDatabase(client, options)\n  return generateDrizzleSchema(schema, options)\n}\n\n/**\n * Generate TypeScript types alongside Drizzle schema\n *\n * @example\n * ```typescript\n * const { schema, types } = await generateSchemaWithTypes(sql)\n * ```\n */\nexport async function generateSchemaWithTypes(\n  client: Sql,\n  options: SchemaGeneratorOptions = {}\n): Promise<{ schema: string; types: string }> {\n  const dbSchema = await introspectDatabase(client, options)\n  const schemaCode = generateDrizzleSchema(dbSchema, options)\n  const typesCode = generateTypeScriptTypes(dbSchema)\n\n  return { schema: schemaCode, types: typesCode }\n}\n\n/**\n * Generate TypeScript types from database schema\n */\nfunction generateTypeScriptTypes(schema: DatabaseSchemaDefinition): string {\n  const lines: string[] = []\n\n  lines.push('/**')\n  lines.push(' * Auto-generated TypeScript types')\n  lines.push(` * Generated at: ${new Date().toISOString()}`)\n  lines.push(' */')\n  lines.push('')\n\n  // Generate enum types\n  for (const enumDef of schema.enums) {\n    const typeName = toPascalCase(enumDef.name)\n    const values = enumDef.values.map((v) => `'${v}'`).join(' | ')\n    lines.push(`export type ${typeName} = ${values}`)\n    lines.push('')\n  }\n\n  // Generate table types\n  for (const table of schema.tables) {\n    const typeName = toPascalCase(table.name)\n    lines.push(`export interface ${typeName} {`)\n\n    for (const col of table.columns) {\n      const propName = toCamelCase(col.name)\n      const drizzleType = getDrizzleType(col)\n      const nullable = col.nullable ? ' | null' : ''\n      lines.push(`  ${propName}: ${drizzleType.tsType}${nullable}`)\n    }\n\n    lines.push('}')\n    lines.push('')\n\n    // Generate insert type\n    lines.push(`export interface ${typeName}Insert {`)\n\n    for (const col of table.columns) {\n      const propName = toCamelCase(col.name)\n      const drizzleType = getDrizzleType(col)\n      const optional = col.hasDefault || col.nullable ? '?' : ''\n      const nullable = col.nullable ? ' | null' : ''\n      lines.push(`  ${propName}${optional}: ${drizzleType.tsType}${nullable}`)\n    }\n\n    lines.push('}')\n    lines.push('')\n  }\n\n  return lines.join('\\n')\n}\n\n/**\n * Convert string to PascalCase\n */\nfunction toPascalCase(str: string): string {\n  return str\n    .replace(/[-_]([a-z])/g, (_, c) => c.toUpperCase())\n    .replace(/^([a-z])/, (m) => m.toUpperCase())\n}\n","/**\n * Schema Diff and Sync Tools\n *\n * Compare database schemas and generate migration SQL from differences.\n * Supports comparing:\n * - Two live databases\n * - Database vs Drizzle schema definition\n * - Two schema definitions\n *\n * @example Compare two databases\n * ```typescript\n * import { compareSchemas, generateMigrationSQL } from 'postgres.do/drizzle'\n *\n * const diff = await compareSchemas(sourceClient, targetClient)\n * const sql = generateMigrationSQL(diff)\n * ```\n *\n * @example Diff local vs production\n * ```typescript\n * const localSchema = await introspectDatabase(localClient)\n * const prodSchema = await introspectDatabase(prodClient)\n * const diff = diffSchemas(localSchema, prodSchema)\n * console.log(formatSchemaDiff(diff))\n * ```\n *\n * @module drizzle/schema-diff\n */\n\nimport type { Sql } from '../types.js'\nimport {\n  introspectDatabase,\n  type DatabaseSchemaDefinition,\n  type SchemaTableDefinition,\n  type SchemaColumnDefinition,\n  type SchemaIndexDefinition,\n  type SchemaEnumDefinition,\n  type SchemaGeneratorOptions,\n} from './schema-generator.js'\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\n/**\n * Types of changes that can occur in a schema diff\n */\nexport type ChangeType = 'added' | 'removed' | 'modified'\n\n/**\n * A single column change\n */\nexport interface ColumnChange {\n  /** Type of change */\n  changeType: ChangeType\n  /** Column name */\n  columnName: string\n  /** Column in source schema (undefined if added) */\n  source?: SchemaColumnDefinition\n  /** Column in target schema (undefined if removed) */\n  target?: SchemaColumnDefinition\n  /** Specific attribute changes (for modified columns) */\n  attributeChanges?: ColumnAttributeChange[]\n}\n\n/**\n * Specific attribute change within a column\n */\nexport interface ColumnAttributeChange {\n  /** Attribute name */\n  attribute: 'type' | 'nullable' | 'default' | 'primaryKey' | 'unique' | 'references' | 'maxLength'\n  /** Value in source schema */\n  sourceValue: unknown\n  /** Value in target schema */\n  targetValue: unknown\n}\n\n/**\n * A single index change\n */\nexport interface IndexChange {\n  /** Type of change */\n  changeType: ChangeType\n  /** Index name */\n  indexName: string\n  /** Index in source schema (undefined if added) */\n  source?: SchemaIndexDefinition\n  /** Index in target schema (undefined if removed) */\n  target?: SchemaIndexDefinition\n}\n\n/**\n * A single table change\n */\nexport interface TableChange {\n  /** Type of change */\n  changeType: ChangeType\n  /** Table name */\n  tableName: string\n  /** Table in source schema (undefined if added) */\n  source?: SchemaTableDefinition\n  /** Table in target schema (undefined if removed) */\n  target?: SchemaTableDefinition\n  /** Column changes (for modified tables) */\n  columnChanges?: ColumnChange[]\n  /** Index changes (for modified tables) */\n  indexChanges?: IndexChange[]\n  /** Primary key changes */\n  primaryKeyChange?: {\n    source?: string[]\n    target?: string[]\n  }\n}\n\n/**\n * A single enum change\n */\nexport interface EnumChange {\n  /** Type of change */\n  changeType: ChangeType\n  /** Enum name */\n  enumName: string\n  /** Enum in source schema (undefined if added) */\n  source?: SchemaEnumDefinition\n  /** Enum in target schema (undefined if removed) */\n  target?: SchemaEnumDefinition\n  /** Values added */\n  addedValues?: string[]\n  /** Values removed */\n  removedValues?: string[]\n}\n\n/**\n * Complete schema diff result\n */\nexport interface SchemaDiff {\n  /** Source schema name */\n  sourceSchema: string\n  /** Target schema name */\n  targetSchema: string\n  /** Table changes */\n  tableChanges: TableChange[]\n  /** Enum changes */\n  enumChanges: EnumChange[]\n  /** Whether schemas are identical */\n  isIdentical: boolean\n  /** Summary statistics */\n  summary: {\n    tablesAdded: number\n    tablesRemoved: number\n    tablesModified: number\n    columnsAdded: number\n    columnsRemoved: number\n    columnsModified: number\n    indexesAdded: number\n    indexesRemoved: number\n    enumsAdded: number\n    enumsRemoved: number\n    enumsModified: number\n  }\n}\n\n/**\n * Options for schema diff\n */\nexport interface SchemaDiffOptions {\n  /** Ignore case differences in names */\n  ignoreCase?: boolean\n  /** Ignore whitespace in default values */\n  ignoreDefaultWhitespace?: boolean\n  /** Tables to include (if specified, only these tables are compared) */\n  includeTables?: string[]\n  /** Tables to exclude from comparison */\n  excludeTables?: string[]\n  /** Whether to compare indexes */\n  compareIndexes?: boolean\n  /** Whether to detect column renames (vs add/remove) */\n  detectRenames?: boolean\n}\n\n/**\n * Options for migration SQL generation\n */\nexport interface MigrationSQLOptions {\n  /** Whether to include comments in generated SQL */\n  includeComments?: boolean\n  /** Whether to wrap in transaction */\n  wrapInTransaction?: boolean\n  /** Target database type (for syntax variations) */\n  dialect?: 'postgresql' | 'postgres'\n  /** Schema name to use */\n  schema?: string\n  /** Generate IF EXISTS/IF NOT EXISTS clauses */\n  safeMode?: boolean\n}\n\n/**\n * Generated migration result\n */\nexport interface GeneratedMigration {\n  /** The SQL statements for forward migration */\n  up: string[]\n  /** The SQL statements for rollback (if possible) */\n  down: string[]\n  /** Complete up migration as single string */\n  upSQL: string\n  /** Complete down migration as single string */\n  downSQL: string\n  /** Whether the migration is fully reversible */\n  isReversible: boolean\n  /** Warnings about potentially destructive changes */\n  warnings: string[]\n  /** Description of the migration */\n  description: string\n}\n\n// ============================================================================\n// Schema Comparison\n// ============================================================================\n\n/**\n * Compare two database schemas by connecting to both databases\n *\n * @example\n * ```typescript\n * const diff = await compareSchemas(localClient, prodClient, {\n *   compareIndexes: true,\n *   excludeTables: ['_migrations']\n * })\n * ```\n */\nexport async function compareSchemas(\n  sourceClient: Sql,\n  targetClient: Sql,\n  options: SchemaDiffOptions & SchemaGeneratorOptions = {}\n): Promise<SchemaDiff> {\n  const sourceSchema = await introspectDatabase(sourceClient, options)\n  const targetSchema = await introspectDatabase(targetClient, options)\n  return diffSchemas(sourceSchema, targetSchema, options)\n}\n\n/**\n * Compare a database against a schema definition\n *\n * @example\n * ```typescript\n * const currentSchema = await introspectDatabase(client)\n * const diff = await compareDatabaseToSchema(client, desiredSchema)\n * ```\n */\nexport async function compareDatabaseToSchema(\n  client: Sql,\n  targetSchema: DatabaseSchemaDefinition,\n  options: SchemaDiffOptions & SchemaGeneratorOptions = {}\n): Promise<SchemaDiff> {\n  const sourceSchema = await introspectDatabase(client, options)\n  return diffSchemas(sourceSchema, targetSchema, options)\n}\n\n/**\n * Compare two schema definitions\n *\n * @example\n * ```typescript\n * const diff = diffSchemas(localSchema, prodSchema)\n * console.log(diff.summary)\n * ```\n */\nexport function diffSchemas(\n  source: DatabaseSchemaDefinition,\n  target: DatabaseSchemaDefinition,\n  options: SchemaDiffOptions = {}\n): SchemaDiff {\n  const tableChanges: TableChange[] = []\n  const enumChanges: EnumChange[] = []\n\n  // Create maps for easier lookup\n  const sourceTables = new Map(\n    source.tables\n      .filter(t => filterTable(t.name, options))\n      .map(t => [normalizeIdentifier(t.name, options), t])\n  )\n  const targetTables = new Map(\n    target.tables\n      .filter(t => filterTable(t.name, options))\n      .map(t => [normalizeIdentifier(t.name, options), t])\n  )\n\n  const sourceEnums = new Map(source.enums.map(e => [normalizeIdentifier(e.name, options), e]))\n  const targetEnums = new Map(target.enums.map(e => [normalizeIdentifier(e.name, options), e]))\n\n  // Find added, removed, and modified tables\n  for (const [name, sourceTable] of sourceTables) {\n    const targetTable = targetTables.get(name)\n    if (!targetTable) {\n      // Table removed in target (exists in source, not in target)\n      tableChanges.push({\n        changeType: 'removed',\n        tableName: sourceTable.name,\n        source: sourceTable,\n      })\n    } else {\n      // Compare tables\n      const diff = diffTables(sourceTable, targetTable, options)\n      if (diff) {\n        tableChanges.push(diff)\n      }\n    }\n  }\n\n  for (const [name, targetTable] of targetTables) {\n    if (!sourceTables.has(name)) {\n      // Table added in target (exists in target, not in source)\n      tableChanges.push({\n        changeType: 'added',\n        tableName: targetTable.name,\n        target: targetTable,\n      })\n    }\n  }\n\n  // Find added, removed, and modified enums\n  for (const [name, sourceEnum] of sourceEnums) {\n    const targetEnum = targetEnums.get(name)\n    if (!targetEnum) {\n      enumChanges.push({\n        changeType: 'removed',\n        enumName: sourceEnum.name,\n        source: sourceEnum,\n      })\n    } else {\n      const diff = diffEnums(sourceEnum, targetEnum)\n      if (diff) {\n        enumChanges.push(diff)\n      }\n    }\n  }\n\n  for (const [name, targetEnum] of targetEnums) {\n    if (!sourceEnums.has(name)) {\n      enumChanges.push({\n        changeType: 'added',\n        enumName: targetEnum.name,\n        target: targetEnum,\n      })\n    }\n  }\n\n  // Calculate summary\n  const summary = {\n    tablesAdded: tableChanges.filter(t => t.changeType === 'added').length,\n    tablesRemoved: tableChanges.filter(t => t.changeType === 'removed').length,\n    tablesModified: tableChanges.filter(t => t.changeType === 'modified').length,\n    columnsAdded: tableChanges.reduce((acc, t) =>\n      acc + (t.columnChanges?.filter(c => c.changeType === 'added').length ?? 0), 0),\n    columnsRemoved: tableChanges.reduce((acc, t) =>\n      acc + (t.columnChanges?.filter(c => c.changeType === 'removed').length ?? 0), 0),\n    columnsModified: tableChanges.reduce((acc, t) =>\n      acc + (t.columnChanges?.filter(c => c.changeType === 'modified').length ?? 0), 0),\n    indexesAdded: tableChanges.reduce((acc, t) =>\n      acc + (t.indexChanges?.filter(i => i.changeType === 'added').length ?? 0), 0),\n    indexesRemoved: tableChanges.reduce((acc, t) =>\n      acc + (t.indexChanges?.filter(i => i.changeType === 'removed').length ?? 0), 0),\n    enumsAdded: enumChanges.filter(e => e.changeType === 'added').length,\n    enumsRemoved: enumChanges.filter(e => e.changeType === 'removed').length,\n    enumsModified: enumChanges.filter(e => e.changeType === 'modified').length,\n  }\n\n  const isIdentical = tableChanges.length === 0 && enumChanges.length === 0\n\n  return {\n    sourceSchema: source.schemaName,\n    targetSchema: target.schemaName,\n    tableChanges,\n    enumChanges,\n    isIdentical,\n    summary,\n  }\n}\n\n/**\n * Compare two tables and return differences\n */\nfunction diffTables(\n  source: SchemaTableDefinition,\n  target: SchemaTableDefinition,\n  options: SchemaDiffOptions\n): TableChange | null {\n  const columnChanges: ColumnChange[] = []\n  const indexChanges: IndexChange[] = []\n\n  // Create maps for columns\n  const sourceColumns = new Map(\n    source.columns.map(c => [normalizeIdentifier(c.name, options), c])\n  )\n  const targetColumns = new Map(\n    target.columns.map(c => [normalizeIdentifier(c.name, options), c])\n  )\n\n  // Compare columns\n  for (const [name, sourceCol] of sourceColumns) {\n    const targetCol = targetColumns.get(name)\n    if (!targetCol) {\n      columnChanges.push({\n        changeType: 'removed',\n        columnName: sourceCol.name,\n        source: sourceCol,\n      })\n    } else {\n      const colDiff = diffColumns(sourceCol, targetCol, options)\n      if (colDiff) {\n        columnChanges.push(colDiff)\n      }\n    }\n  }\n\n  for (const [name, targetCol] of targetColumns) {\n    if (!sourceColumns.has(name)) {\n      columnChanges.push({\n        changeType: 'added',\n        columnName: targetCol.name,\n        target: targetCol,\n      })\n    }\n  }\n\n  // Compare indexes if requested\n  if (options.compareIndexes !== false) {\n    const sourceIndexes = new Map(\n      source.indexes.map(i => [normalizeIdentifier(i.name, options), i])\n    )\n    const targetIndexes = new Map(\n      target.indexes.map(i => [normalizeIdentifier(i.name, options), i])\n    )\n\n    for (const [name, sourceIdx] of sourceIndexes) {\n      const targetIdx = targetIndexes.get(name)\n      if (!targetIdx) {\n        indexChanges.push({\n          changeType: 'removed',\n          indexName: sourceIdx.name,\n          source: sourceIdx,\n        })\n      } else if (!indexesEqual(sourceIdx, targetIdx)) {\n        indexChanges.push({\n          changeType: 'modified',\n          indexName: sourceIdx.name,\n          source: sourceIdx,\n          target: targetIdx,\n        })\n      }\n    }\n\n    for (const [name, targetIdx] of targetIndexes) {\n      if (!sourceIndexes.has(name)) {\n        indexChanges.push({\n          changeType: 'added',\n          indexName: targetIdx.name,\n          target: targetIdx,\n        })\n      }\n    }\n  }\n\n  // Compare primary keys\n  let primaryKeyChange: TableChange['primaryKeyChange'] | undefined\n  const sourcePK = source.primaryKey ?? source.columns.filter(c => c.isPrimaryKey).map(c => c.name)\n  const targetPK = target.primaryKey ?? target.columns.filter(c => c.isPrimaryKey).map(c => c.name)\n\n  if (!arraysEqual(sourcePK, targetPK)) {\n    primaryKeyChange = { source: sourcePK, target: targetPK }\n  }\n\n  // Return null if no changes\n  if (columnChanges.length === 0 && indexChanges.length === 0 && !primaryKeyChange) {\n    return null\n  }\n\n  const result: TableChange = {\n    changeType: 'modified',\n    tableName: source.name,\n    source,\n    target,\n    columnChanges,\n    indexChanges,\n  }\n  if (primaryKeyChange) {\n    result.primaryKeyChange = primaryKeyChange\n  }\n  return result\n}\n\n/**\n * Compare two columns and return differences\n */\nfunction diffColumns(\n  source: SchemaColumnDefinition,\n  target: SchemaColumnDefinition,\n  options: SchemaDiffOptions\n): ColumnChange | null {\n  const attributeChanges: ColumnAttributeChange[] = []\n\n  // Compare type\n  if (normalizeType(source.pgType) !== normalizeType(target.pgType)) {\n    attributeChanges.push({\n      attribute: 'type',\n      sourceValue: source.pgType,\n      targetValue: target.pgType,\n    })\n  }\n\n  // Compare nullable\n  if (source.nullable !== target.nullable) {\n    attributeChanges.push({\n      attribute: 'nullable',\n      sourceValue: source.nullable,\n      targetValue: target.nullable,\n    })\n  }\n\n  // Compare default (with optional whitespace normalization)\n  const sourceDefault = normalizeDefault(source.defaultValue, options)\n  const targetDefault = normalizeDefault(target.defaultValue, options)\n  if (sourceDefault !== targetDefault) {\n    attributeChanges.push({\n      attribute: 'default',\n      sourceValue: source.defaultValue,\n      targetValue: target.defaultValue,\n    })\n  }\n\n  // Compare max length\n  if (source.maxLength !== target.maxLength) {\n    attributeChanges.push({\n      attribute: 'maxLength',\n      sourceValue: source.maxLength,\n      targetValue: target.maxLength,\n    })\n  }\n\n  // Compare unique constraint\n  if (source.isUnique !== target.isUnique) {\n    attributeChanges.push({\n      attribute: 'unique',\n      sourceValue: source.isUnique,\n      targetValue: target.isUnique,\n    })\n  }\n\n  // Compare foreign key references\n  if (!referencesEqual(source.references, target.references)) {\n    attributeChanges.push({\n      attribute: 'references',\n      sourceValue: source.references,\n      targetValue: target.references,\n    })\n  }\n\n  if (attributeChanges.length === 0) {\n    return null\n  }\n\n  return {\n    changeType: 'modified',\n    columnName: source.name,\n    source,\n    target,\n    attributeChanges,\n  }\n}\n\n/**\n * Compare two enums and return differences\n */\nfunction diffEnums(source: SchemaEnumDefinition, target: SchemaEnumDefinition): EnumChange | null {\n  const sourceValues = new Set(source.values)\n  const targetValues = new Set(target.values)\n\n  const addedValues = target.values.filter(v => !sourceValues.has(v))\n  const removedValues = source.values.filter(v => !targetValues.has(v))\n\n  if (addedValues.length === 0 && removedValues.length === 0) {\n    return null\n  }\n\n  return {\n    changeType: 'modified',\n    enumName: source.name,\n    source,\n    target,\n    addedValues,\n    removedValues,\n  }\n}\n\n// ============================================================================\n// Migration SQL Generation\n// ============================================================================\n\n/**\n * Generate migration SQL from a schema diff\n *\n * @example\n * ```typescript\n * const diff = diffSchemas(localSchema, prodSchema)\n * const migration = generateMigrationSQL(diff, {\n *   includeComments: true,\n *   safeMode: true\n * })\n * console.log(migration.upSQL)\n * ```\n */\nexport function generateMigrationSQL(\n  diff: SchemaDiff,\n  options: MigrationSQLOptions = {}\n): GeneratedMigration {\n  const up: string[] = []\n  const down: string[] = []\n  const warnings: string[] = []\n  let isReversible = true\n\n  const schema = options.schema ?? diff.targetSchema\n  const schemaPrefix = schema && schema !== 'public' ? `\"${schema}\".` : ''\n  const ifExists = options.safeMode ? 'IF EXISTS ' : ''\n\n  // Process enum changes first (types must exist before tables use them)\n  for (const enumChange of diff.enumChanges) {\n    if (enumChange.changeType === 'added' && enumChange.target) {\n      const values = enumChange.target.values.map(v => `'${v}'`).join(', ')\n      up.push(`CREATE TYPE ${schemaPrefix}\"${enumChange.enumName}\" AS ENUM (${values});`)\n      down.push(`DROP TYPE ${ifExists}${schemaPrefix}\"${enumChange.enumName}\";`)\n    } else if (enumChange.changeType === 'removed' && enumChange.source) {\n      up.push(`DROP TYPE ${ifExists}${schemaPrefix}\"${enumChange.enumName}\";`)\n      const values = enumChange.source.values.map(v => `'${v}'`).join(', ')\n      down.push(`CREATE TYPE ${schemaPrefix}\"${enumChange.enumName}\" AS ENUM (${values});`)\n    } else if (enumChange.changeType === 'modified') {\n      // PostgreSQL can only add values to enums, not remove\n      if (enumChange.addedValues && enumChange.addedValues.length > 0) {\n        for (const value of enumChange.addedValues) {\n          up.push(`ALTER TYPE ${schemaPrefix}\"${enumChange.enumName}\" ADD VALUE '${value}';`)\n        }\n      }\n      if (enumChange.removedValues && enumChange.removedValues.length > 0) {\n        warnings.push(`Cannot remove values from enum \"${enumChange.enumName}\": ${enumChange.removedValues.join(', ')}. This requires recreating the type.`)\n        isReversible = false\n      }\n    }\n  }\n\n  // Process table changes\n  for (const tableChange of diff.tableChanges) {\n    if (tableChange.changeType === 'added' && tableChange.target) {\n      const createSQL = generateCreateTableSQL(tableChange.target, schemaPrefix, options)\n      up.push(createSQL)\n      down.push(`DROP TABLE ${ifExists}${schemaPrefix}\"${tableChange.tableName}\";`)\n    } else if (tableChange.changeType === 'removed' && tableChange.source) {\n      up.push(`DROP TABLE ${ifExists}${schemaPrefix}\"${tableChange.tableName}\";`)\n      warnings.push(`Dropping table \"${tableChange.tableName}\" will lose all data.`)\n      const createSQL = generateCreateTableSQL(tableChange.source, schemaPrefix, options)\n      down.push(createSQL)\n    } else if (tableChange.changeType === 'modified') {\n      const tableName = `${schemaPrefix}\"${tableChange.tableName}\"`\n\n      // Process column changes\n      if (tableChange.columnChanges) {\n        for (const colChange of tableChange.columnChanges) {\n          if (colChange.changeType === 'added' && colChange.target) {\n            const colDef = generateColumnDefinition(colChange.target)\n            up.push(`ALTER TABLE ${tableName} ADD COLUMN ${colDef};`)\n            down.push(`ALTER TABLE ${tableName} DROP COLUMN ${ifExists}\"${colChange.columnName}\";`)\n          } else if (colChange.changeType === 'removed' && colChange.source) {\n            up.push(`ALTER TABLE ${tableName} DROP COLUMN ${ifExists}\"${colChange.columnName}\";`)\n            warnings.push(`Dropping column \"${tableChange.tableName}.${colChange.columnName}\" will lose data.`)\n            const colDef = generateColumnDefinition(colChange.source)\n            down.push(`ALTER TABLE ${tableName} ADD COLUMN ${colDef};`)\n          } else if (colChange.changeType === 'modified' && colChange.attributeChanges) {\n            const alterStatements = generateColumnAlterStatements(\n              tableName,\n              colChange.columnName,\n              colChange.attributeChanges,\n              colChange.source!,\n              colChange.target!,\n              warnings\n            )\n            up.push(...alterStatements.up)\n            down.push(...alterStatements.down)\n          }\n        }\n      }\n\n      // Process index changes\n      if (tableChange.indexChanges) {\n        for (const idxChange of tableChange.indexChanges) {\n          if (idxChange.changeType === 'added' && idxChange.target) {\n            up.push(generateCreateIndexSQL(idxChange.target, tableChange.tableName, schemaPrefix))\n            down.push(`DROP INDEX ${ifExists}${schemaPrefix}\"${idxChange.indexName}\";`)\n          } else if (idxChange.changeType === 'removed' && idxChange.source) {\n            up.push(`DROP INDEX ${ifExists}${schemaPrefix}\"${idxChange.indexName}\";`)\n            down.push(generateCreateIndexSQL(idxChange.source, tableChange.tableName, schemaPrefix))\n          } else if (idxChange.changeType === 'modified' && idxChange.source && idxChange.target) {\n            // Drop and recreate\n            up.push(`DROP INDEX ${ifExists}${schemaPrefix}\"${idxChange.indexName}\";`)\n            up.push(generateCreateIndexSQL(idxChange.target, tableChange.tableName, schemaPrefix))\n            down.push(`DROP INDEX ${ifExists}${schemaPrefix}\"${idxChange.indexName}\";`)\n            down.push(generateCreateIndexSQL(idxChange.source, tableChange.tableName, schemaPrefix))\n          }\n        }\n      }\n    }\n  }\n\n  // Build complete SQL strings\n  const upSQL = buildMigrationSQL(up, 'up', options)\n  const downSQL = buildMigrationSQL(down.reverse(), 'down', options)\n\n  // Generate description\n  const description = generateMigrationDescription(diff)\n\n  return {\n    up,\n    down: down.reverse(),\n    upSQL,\n    downSQL,\n    isReversible,\n    warnings,\n    description,\n  }\n}\n\n/**\n * Generate CREATE TABLE SQL\n */\nfunction generateCreateTableSQL(\n  table: SchemaTableDefinition,\n  schemaPrefix: string,\n  _options: MigrationSQLOptions\n): string {\n  const lines: string[] = []\n  const tableName = `${schemaPrefix}\"${table.name}\"`\n\n  lines.push(`CREATE TABLE ${tableName} (`)\n\n  const columnDefs = table.columns.map(col => `  ${generateColumnDefinition(col)}`)\n\n  // Add primary key constraint if composite\n  if (table.primaryKey && table.primaryKey.length > 1) {\n    columnDefs.push(`  PRIMARY KEY (${table.primaryKey.map(c => `\"${c}\"`).join(', ')})`)\n  }\n\n  lines.push(columnDefs.join(',\\n'))\n  lines.push(');')\n\n  return lines.join('\\n')\n}\n\n/**\n * Generate column definition for CREATE TABLE or ADD COLUMN\n */\nfunction generateColumnDefinition(col: SchemaColumnDefinition): string {\n  let def = `\"${col.name}\" ${col.pgType}`\n\n  if (col.maxLength) {\n    def = `\"${col.name}\" ${col.pgType}(${col.maxLength})`\n  }\n\n  if (col.isArray) {\n    def += '[]'\n  }\n\n  if (col.isPrimaryKey && !col.references) {\n    def += ' PRIMARY KEY'\n  }\n\n  if (!col.nullable && !col.isPrimaryKey) {\n    def += ' NOT NULL'\n  }\n\n  if (col.isUnique && !col.isPrimaryKey) {\n    def += ' UNIQUE'\n  }\n\n  if (col.hasDefault && col.defaultValue) {\n    def += ` DEFAULT ${col.defaultValue}`\n  }\n\n  if (col.references) {\n    def += ` REFERENCES \"${col.references.table}\"(\"${col.references.column}\")`\n    if (col.references.onDelete && col.references.onDelete !== 'NO ACTION') {\n      def += ` ON DELETE ${col.references.onDelete}`\n    }\n    if (col.references.onUpdate && col.references.onUpdate !== 'NO ACTION') {\n      def += ` ON UPDATE ${col.references.onUpdate}`\n    }\n  }\n\n  return def\n}\n\n/**\n * Generate ALTER statements for column modifications\n */\nfunction generateColumnAlterStatements(\n  tableName: string,\n  columnName: string,\n  changes: ColumnAttributeChange[],\n  source: SchemaColumnDefinition,\n  target: SchemaColumnDefinition,\n  warnings: string[]\n): { up: string[]; down: string[] } {\n  const up: string[] = []\n  const down: string[] = []\n  const colRef = `\"${columnName}\"`\n\n  for (const change of changes) {\n    switch (change.attribute) {\n      case 'type':\n        up.push(`ALTER TABLE ${tableName} ALTER COLUMN ${colRef} TYPE ${target.pgType} USING ${colRef}::${target.pgType};`)\n        down.push(`ALTER TABLE ${tableName} ALTER COLUMN ${colRef} TYPE ${source.pgType} USING ${colRef}::${source.pgType};`)\n        warnings.push(`Type change on \"${columnName}\" from ${source.pgType} to ${target.pgType} may cause data loss.`)\n        break\n\n      case 'nullable':\n        if (target.nullable) {\n          up.push(`ALTER TABLE ${tableName} ALTER COLUMN ${colRef} DROP NOT NULL;`)\n          down.push(`ALTER TABLE ${tableName} ALTER COLUMN ${colRef} SET NOT NULL;`)\n        } else {\n          up.push(`ALTER TABLE ${tableName} ALTER COLUMN ${colRef} SET NOT NULL;`)\n          down.push(`ALTER TABLE ${tableName} ALTER COLUMN ${colRef} DROP NOT NULL;`)\n          warnings.push(`Setting NOT NULL on \"${columnName}\" may fail if column contains NULL values.`)\n        }\n        break\n\n      case 'default':\n        if (target.defaultValue) {\n          up.push(`ALTER TABLE ${tableName} ALTER COLUMN ${colRef} SET DEFAULT ${target.defaultValue};`)\n        } else {\n          up.push(`ALTER TABLE ${tableName} ALTER COLUMN ${colRef} DROP DEFAULT;`)\n        }\n        if (source.defaultValue) {\n          down.push(`ALTER TABLE ${tableName} ALTER COLUMN ${colRef} SET DEFAULT ${source.defaultValue};`)\n        } else {\n          down.push(`ALTER TABLE ${tableName} ALTER COLUMN ${colRef} DROP DEFAULT;`)\n        }\n        break\n\n      case 'maxLength':\n        up.push(`ALTER TABLE ${tableName} ALTER COLUMN ${colRef} TYPE ${target.pgType}(${target.maxLength});`)\n        down.push(`ALTER TABLE ${tableName} ALTER COLUMN ${colRef} TYPE ${source.pgType}${source.maxLength ? `(${source.maxLength})` : ''};`)\n        if (target.maxLength && source.maxLength && target.maxLength < source.maxLength) {\n          warnings.push(`Reducing max length on \"${columnName}\" may truncate data.`)\n        }\n        break\n\n      case 'unique':\n        if (target.isUnique) {\n          up.push(`ALTER TABLE ${tableName} ADD CONSTRAINT \"${tableName.replace(/\"/g, '')}_${columnName}_unique\" UNIQUE (${colRef});`)\n          down.push(`ALTER TABLE ${tableName} DROP CONSTRAINT IF EXISTS \"${tableName.replace(/\"/g, '')}_${columnName}_unique\";`)\n        } else {\n          up.push(`ALTER TABLE ${tableName} DROP CONSTRAINT IF EXISTS \"${tableName.replace(/\"/g, '')}_${columnName}_unique\";`)\n          down.push(`ALTER TABLE ${tableName} ADD CONSTRAINT \"${tableName.replace(/\"/g, '')}_${columnName}_unique\" UNIQUE (${colRef});`)\n        }\n        break\n    }\n  }\n\n  return { up, down }\n}\n\n/**\n * Generate CREATE INDEX SQL\n */\nfunction generateCreateIndexSQL(\n  index: SchemaIndexDefinition,\n  tableName: string,\n  schemaPrefix: string\n): string {\n  const unique = index.isUnique ? 'UNIQUE ' : ''\n  const using = index.type && index.type !== 'btree' ? `USING ${index.type} ` : ''\n  const columns = index.columns.map(c => `\"${c}\"`).join(', ')\n  const where = index.where ? ` WHERE ${index.where}` : ''\n\n  return `CREATE ${unique}INDEX \"${index.name}\" ON ${schemaPrefix}\"${tableName}\" ${using}(${columns})${where};`\n}\n\n/**\n * Build complete migration SQL with optional comments and transaction\n */\nfunction buildMigrationSQL(\n  statements: string[],\n  direction: 'up' | 'down',\n  options: MigrationSQLOptions\n): string {\n  const lines: string[] = []\n\n  if (options.includeComments) {\n    lines.push(`-- Migration ${direction}`)\n    lines.push(`-- Generated at ${new Date().toISOString()}`)\n    lines.push('')\n  }\n\n  if (options.wrapInTransaction) {\n    lines.push('BEGIN;')\n    lines.push('')\n  }\n\n  lines.push(...statements.map(s => s + (s.endsWith(';') ? '' : ';')))\n\n  if (options.wrapInTransaction) {\n    lines.push('')\n    lines.push('COMMIT;')\n  }\n\n  return lines.join('\\n')\n}\n\n/**\n * Generate a human-readable migration description\n */\nfunction generateMigrationDescription(diff: SchemaDiff): string {\n  const parts: string[] = []\n\n  if (diff.summary.tablesAdded > 0) {\n    const tables = diff.tableChanges\n      .filter(t => t.changeType === 'added')\n      .map(t => t.tableName)\n    parts.push(`Add table${tables.length > 1 ? 's' : ''}: ${tables.join(', ')}`)\n  }\n\n  if (diff.summary.tablesRemoved > 0) {\n    const tables = diff.tableChanges\n      .filter(t => t.changeType === 'removed')\n      .map(t => t.tableName)\n    parts.push(`Remove table${tables.length > 1 ? 's' : ''}: ${tables.join(', ')}`)\n  }\n\n  if (diff.summary.columnsAdded > 0) {\n    parts.push(`Add ${diff.summary.columnsAdded} column${diff.summary.columnsAdded > 1 ? 's' : ''}`)\n  }\n\n  if (diff.summary.columnsRemoved > 0) {\n    parts.push(`Remove ${diff.summary.columnsRemoved} column${diff.summary.columnsRemoved > 1 ? 's' : ''}`)\n  }\n\n  if (diff.summary.columnsModified > 0) {\n    parts.push(`Modify ${diff.summary.columnsModified} column${diff.summary.columnsModified > 1 ? 's' : ''}`)\n  }\n\n  if (diff.summary.indexesAdded > 0) {\n    parts.push(`Add ${diff.summary.indexesAdded} index${diff.summary.indexesAdded > 1 ? 'es' : ''}`)\n  }\n\n  if (diff.summary.indexesRemoved > 0) {\n    parts.push(`Remove ${diff.summary.indexesRemoved} index${diff.summary.indexesRemoved > 1 ? 'es' : ''}`)\n  }\n\n  if (parts.length === 0) {\n    return 'No changes'\n  }\n\n  return parts.join('; ')\n}\n\n// ============================================================================\n// Formatting and Display\n// ============================================================================\n\n/**\n * Format schema diff for CLI display\n *\n * @example\n * ```typescript\n * const diff = diffSchemas(localSchema, prodSchema)\n * console.log(formatSchemaDiff(diff))\n * // Output:\n * // + Table: audit_logs (not in target)\n * // ~ Table: users\n * //   + Column: last_login_at\n * //   ~ Column: email: varchar(100) -> varchar(255)\n * // - Table: temp_data (not in source)\n * ```\n */\nexport function formatSchemaDiff(diff: SchemaDiff, options: { color?: boolean } = {}): string {\n  const lines: string[] = []\n  const { color = true } = options\n\n  const green = color ? '\\x1b[32m' : ''\n  const red = color ? '\\x1b[31m' : ''\n  const yellow = color ? '\\x1b[33m' : ''\n  const reset = color ? '\\x1b[0m' : ''\n\n  if (diff.isIdentical) {\n    return `${green}Schemas are identical${reset}`\n  }\n\n  // Header\n  lines.push(`Schema diff: ${diff.sourceSchema} -> ${diff.targetSchema}`)\n  lines.push('')\n\n  // Enum changes\n  for (const enumChange of diff.enumChanges) {\n    if (enumChange.changeType === 'added') {\n      lines.push(`${green}+ Enum: ${enumChange.enumName}${reset}`)\n    } else if (enumChange.changeType === 'removed') {\n      lines.push(`${red}- Enum: ${enumChange.enumName}${reset}`)\n    } else if (enumChange.changeType === 'modified') {\n      lines.push(`${yellow}~ Enum: ${enumChange.enumName}${reset}`)\n      if (enumChange.addedValues?.length) {\n        lines.push(`    ${green}+ Values: ${enumChange.addedValues.join(', ')}${reset}`)\n      }\n      if (enumChange.removedValues?.length) {\n        lines.push(`    ${red}- Values: ${enumChange.removedValues.join(', ')}${reset}`)\n      }\n    }\n  }\n\n  // Table changes\n  for (const tableChange of diff.tableChanges) {\n    if (tableChange.changeType === 'added') {\n      lines.push(`${green}+ Table: ${tableChange.tableName}${reset}`)\n      if (tableChange.target) {\n        for (const col of tableChange.target.columns) {\n          lines.push(`    ${green}+ ${col.name}: ${col.pgType}${col.nullable ? '' : ' NOT NULL'}${reset}`)\n        }\n      }\n    } else if (tableChange.changeType === 'removed') {\n      lines.push(`${red}- Table: ${tableChange.tableName}${reset}`)\n    } else if (tableChange.changeType === 'modified') {\n      lines.push(`${yellow}~ Table: ${tableChange.tableName}${reset}`)\n\n      // Column changes\n      if (tableChange.columnChanges) {\n        for (const colChange of tableChange.columnChanges) {\n          if (colChange.changeType === 'added') {\n            const col = colChange.target!\n            lines.push(`    ${green}+ Column: ${col.name}: ${col.pgType}${col.nullable ? '' : ' NOT NULL'}${reset}`)\n          } else if (colChange.changeType === 'removed') {\n            lines.push(`    ${red}- Column: ${colChange.columnName}${reset}`)\n          } else if (colChange.changeType === 'modified' && colChange.attributeChanges) {\n            for (const attr of colChange.attributeChanges) {\n              lines.push(`    ${yellow}~ Column: ${colChange.columnName}.${attr.attribute}: ${formatValue(attr.sourceValue)} -> ${formatValue(attr.targetValue)}${reset}`)\n            }\n          }\n        }\n      }\n\n      // Index changes\n      if (tableChange.indexChanges) {\n        for (const idxChange of tableChange.indexChanges) {\n          if (idxChange.changeType === 'added') {\n            lines.push(`    ${green}+ Index: ${idxChange.indexName}${reset}`)\n          } else if (idxChange.changeType === 'removed') {\n            lines.push(`    ${red}- Index: ${idxChange.indexName}${reset}`)\n          } else if (idxChange.changeType === 'modified') {\n            lines.push(`    ${yellow}~ Index: ${idxChange.indexName}${reset}`)\n          }\n        }\n      }\n    }\n  }\n\n  // Summary\n  lines.push('')\n  lines.push('Summary:')\n  lines.push(`  Tables:  ${green}+${diff.summary.tablesAdded}${reset} ${red}-${diff.summary.tablesRemoved}${reset} ${yellow}~${diff.summary.tablesModified}${reset}`)\n  lines.push(`  Columns: ${green}+${diff.summary.columnsAdded}${reset} ${red}-${diff.summary.columnsRemoved}${reset} ${yellow}~${diff.summary.columnsModified}${reset}`)\n  lines.push(`  Indexes: ${green}+${diff.summary.indexesAdded}${reset} ${red}-${diff.summary.indexesRemoved}${reset}`)\n  if (diff.enumChanges.length > 0) {\n    lines.push(`  Enums:   ${green}+${diff.summary.enumsAdded}${reset} ${red}-${diff.summary.enumsRemoved}${reset} ${yellow}~${diff.summary.enumsModified}${reset}`)\n  }\n\n  return lines.join('\\n')\n}\n\n/**\n * Format schema diff as JSON\n */\nexport function formatSchemaDiffJSON(diff: SchemaDiff): string {\n  return JSON.stringify(diff, null, 2)\n}\n\n// ============================================================================\n// Drizzle Schema Support\n// ============================================================================\n\n/**\n * Generate Drizzle schema migration file from diff\n *\n * @example\n * ```typescript\n * const diff = diffSchemas(localSchema, prodSchema)\n * const drizzleMigration = generateDrizzleMigration(diff, 'sync_to_production')\n * fs.writeFileSync('./migrations/0001_sync_to_production.ts', drizzleMigration)\n * ```\n */\nexport function generateDrizzleMigration(\n  diff: SchemaDiff,\n  name: string,\n  options: MigrationSQLOptions = {}\n): string {\n  const migration = generateMigrationSQL(diff, { ...options, includeComments: true })\n\n  const lines: string[] = []\n\n  lines.push(`/**`)\n  lines.push(` * Migration: ${name}`)\n  lines.push(` * ${migration.description}`)\n  lines.push(` * Generated at: ${new Date().toISOString()}`)\n  if (migration.warnings.length > 0) {\n    lines.push(` *`)\n    lines.push(` * Warnings:`)\n    for (const warning of migration.warnings) {\n      lines.push(` * - ${warning}`)\n    }\n  }\n  lines.push(` */`)\n  lines.push(``)\n  lines.push(`import { sql } from 'drizzle-orm'`)\n  lines.push(`import type { PostgresJsDatabase } from 'drizzle-orm/postgres-js'`)\n  lines.push(``)\n  lines.push(`export async function up(db: PostgresJsDatabase) {`)\n  for (const stmt of migration.up) {\n    lines.push(`  await db.execute(sql\\`${escapeTemplateString(stmt)}\\`)`)\n  }\n  lines.push(`}`)\n  lines.push(``)\n  lines.push(`export async function down(db: PostgresJsDatabase) {`)\n  for (const stmt of migration.down) {\n    lines.push(`  await db.execute(sql\\`${escapeTemplateString(stmt)}\\`)`)\n  }\n  lines.push(`}`)\n  lines.push(``)\n\n  return lines.join('\\n')\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Filter table by include/exclude options\n */\nfunction filterTable(name: string, options: SchemaDiffOptions): boolean {\n  if (options.includeTables && options.includeTables.length > 0) {\n    return options.includeTables.includes(name)\n  }\n  if (options.excludeTables && options.excludeTables.includes(name)) {\n    return false\n  }\n  return true\n}\n\n/**\n * Normalize identifier for comparison\n */\nfunction normalizeIdentifier(name: string, options: SchemaDiffOptions): string {\n  return options.ignoreCase ? name.toLowerCase() : name\n}\n\n/**\n * Normalize PostgreSQL type for comparison\n */\nfunction normalizeType(type: string): string {\n  // Handle common type aliases\n  const normalized = type.toLowerCase()\n    .replace(/^int$/, 'integer')\n    .replace(/^int4$/, 'integer')\n    .replace(/^int8$/, 'bigint')\n    .replace(/^float4$/, 'real')\n    .replace(/^float8$/, 'double precision')\n    .replace(/^bool$/, 'boolean')\n    .replace(/^timestamptz$/, 'timestamp with time zone')\n    .replace(/^timetz$/, 'time with time zone')\n\n  return normalized\n}\n\n/**\n * Normalize default value for comparison\n */\nfunction normalizeDefault(value: string | undefined, options: SchemaDiffOptions): string | undefined {\n  if (!value) return undefined\n  if (options.ignoreDefaultWhitespace) {\n    return value.replace(/\\s+/g, ' ').trim()\n  }\n  return value\n}\n\n/**\n * Check if two indexes are equal\n */\nfunction indexesEqual(a: SchemaIndexDefinition, b: SchemaIndexDefinition): boolean {\n  return (\n    a.isUnique === b.isUnique &&\n    a.type === b.type &&\n    arraysEqual(a.columns, b.columns) &&\n    a.where === b.where\n  )\n}\n\n/**\n * Check if two foreign key references are equal\n */\nfunction referencesEqual(\n  a: SchemaColumnDefinition['references'],\n  b: SchemaColumnDefinition['references']\n): boolean {\n  if (!a && !b) return true\n  if (!a || !b) return false\n  return (\n    a.table === b.table &&\n    a.column === b.column &&\n    (a.onDelete ?? 'NO ACTION') === (b.onDelete ?? 'NO ACTION') &&\n    (a.onUpdate ?? 'NO ACTION') === (b.onUpdate ?? 'NO ACTION')\n  )\n}\n\n/**\n * Check if two arrays are equal\n */\nfunction arraysEqual<T>(a: T[], b: T[]): boolean {\n  if (a.length !== b.length) return false\n  return a.every((v, i) => v === b[i])\n}\n\n/**\n * Format a value for display\n */\nfunction formatValue(value: unknown): string {\n  if (value === undefined) return 'undefined'\n  if (value === null) return 'null'\n  if (typeof value === 'object') return JSON.stringify(value)\n  return String(value)\n}\n\n/**\n * Escape backticks in SQL for template strings\n */\nfunction escapeTemplateString(sql: string): string {\n  return sql.replace(/`/g, '\\\\`').replace(/\\$/g, '\\\\$')\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACuBA,IAAAA,iBAA2B;AAC3B,IAAAC,iBAA2C;AAC3C,gBAA2B;AAC3B,qBAA0B;AAC1B,uBAKO;;;ACtBP,oBAA2B;AAC3B,oBAAwC;AAExC,qBAA8B;AAG9B,qBAA2C;AAG3C,iBAAsC;AAsD/B,IAAM,0BAAN,cAAqE,+BAAmB;AAAA,EAG7F,YACU,QACA,aACA,QACA,QACA,QACA,wBACA,oBACR;AACA,UAAM,EAAE,KAAK,aAAa,OAAO,CAAC;AAR1B;AACA;AACA;AACA;AACA;AACA;AACA;AAAA,EAGV;AAAA,EAZA,QAA0B,wBAAU,IAAY;AAAA;AAAA;AAAA;AAAA,EAiBhD,MAAe,QAAQ,oBAA6C,CAAC,GAA0B;AAC7F,UAAM,aAAS,6BAAiB,KAAK,QAAQ,iBAAiB;AAC9D,SAAK,OAAO,SAAS,KAAK,aAAa,MAAM;AAE7C,UAAM,EAAE,QAAQ,aAAa,QAAQ,mBAAmB,IAAI;AAE5D,QAAI,CAAC,UAAU,CAAC,oBAAoB;AAElC,aAAO,OAAO,OAAO,aAAa,MAAM;AAAA,IAC1C;AAIA,UAAM,OAAO,MAAM,OAAO,OAAO,aAAa,MAAM;AAEpD,QAAI,oBAAoB;AAEtB,UAAI,QAAQ;AACV,cAAM,YAAY,KAAK,IAAI,CAAC,QAAQ;AAClC,iBAAO,OAAO,IAAI,CAAC,UAAU;AAC3B,kBAAM,gBAAgB;AACtB,kBAAM,MAAM,cAAc,MAAM,KAAK,GAAG,KAAK,cAAc,QAAQ;AACnE,mBAAQ,IAAgC,GAAG;AAAA,UAC7C,CAAC;AAAA,QACH,CAAC;AACD,eAAO,mBAAmB,SAAwB;AAAA,MACpD;AACA,aAAO,mBAAmB,IAA8B;AAAA,IAC1D;AAGA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAI,oBAA6C,CAAC,GAAsB;AAC5E,UAAM,aAAS,6BAAiB,KAAK,QAAQ,iBAAiB;AAC9D,SAAK,OAAO,SAAS,KAAK,aAAa,MAAM;AAC7C,WAAO,KAAK,OAAO,OAAO,KAAK,aAAa,MAAM;AAAA,EACpD;AAAA;AAAA,EAGA,wBAAiC;AAC/B,WAAO,KAAK;AAAA,EACd;AACF;AAeO,IAAM,oBAAN,MAAM,2BAGH,yBAA0D;AAAA,EAMlE,YACE,QACA,SACQ,QACD,UAAoC,CAAC,GAC5C;AACA,UAAM,OAAO;AAHL;AACD;AAGP,SAAK,SAAS;AACd,SAAK,SAAS,QAAQ,UAAU,IAAI,yBAAW;AAAA,EACjD;AAAA,EAdA,QAA0B,wBAAU,IAAY;AAAA,EAEhD;AAAA;AAAA;AAAA;AAAA,EAiBS,aACP,OACA,QACA,OACA,uBACA,oBACoB;AACpB,WAAO,IAAI;AAAA,MACT,KAAK;AAAA,MACL,MAAM;AAAA,MACN,MAAM;AAAA,MACN,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAe,QAAyC;AAC5D,SAAK,OAAO,SAAS,OAAO,MAAM;AAElC,WAAO,KAAK,OAAO,OAAO,OAAO,MAAM,EAAE;AAAA,MAAK,CAAC,SAC7C,KAAK,IAAI,CAAC,QAAQ,OAAO,OAAO,GAA8B,CAAC;AAAA,IACjE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAA4B,OAAe,QAAiC;AAC1E,SAAK,OAAO,SAAS,OAAO,MAAM;AAClC,WAAO,KAAK,OAAO,OAAU,OAAO,MAAM;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAe,YACb,aACA,QACY;AACZ,UAAM,SAAS,KAAK;AAEpB,QAAI,CAAC,OAAO,OAAO;AACjB,YAAM,IAAI,MAAM,8DAA8D;AAAA,IAChF;AAEA,WAAO,OAAO;AAAA,MACZ,OAAO,aAAa;AAClB,cAAM,UAAU,IAAI;AAAA,UAClB;AAAA,UACA,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,QACP;AACA,cAAM,KAAK,IAAI,sBAA4C,KAAK,SAAS,SAAS,KAAK,MAAM;AAE7F,YAAI,QAAQ;AACV,gBAAM,GAAG,eAAe,MAAM;AAAA,QAChC;AAEA,eAAO,YAAY,EAAE;AAAA,MACvB;AAAA,MACA;AAAA,QACE,GAAI,QAAQ,mBAAmB,SAAY,EAAE,gBAAgB,OAAO,eAAe,IAAI,CAAC;AAAA,QACxF,UAAU,QAAQ,eAAe;AAAA,QACjC,GAAI,QAAQ,eAAe,SAAY,EAAE,YAAY,OAAO,WAAW,IAAI,CAAC;AAAA,MAC9E;AAAA,IACF;AAAA,EACF;AACF;AAOO,IAAM,wBAAN,MAAM,+BAGH,6BAA8D;AAAA,EAGtE,YACE,SAES,SACT,QACA,cAAc,GACd;AACA,UAAM,SAAS,SAAS,QAAQ,WAAW;AAJlC;AAAA,EAKX;AAAA,EAVA,QAA0B,wBAAU,IAAY;AAAA;AAAA;AAAA;AAAA,EAehD,MAAM,YACJ,aACY;AACZ,UAAM,gBAAgB,KAAK,KAAK,cAAc,CAAC;AAE/C,UAAM,cAAe,KAA6F;AAClH,UAAM,KAAK,IAAI;AAAA,MACb;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,cAAc;AAAA,IACrB;AAEA,UAAM,GAAG,QAAQ,eAAI,IAAI,aAAa,aAAa,EAAE,CAAC;AAEtD,QAAI;AACF,YAAM,SAAS,MAAM,YAAY,EAAE;AACnC,YAAM,GAAG,QAAQ,eAAI,IAAI,qBAAqB,aAAa,EAAE,CAAC;AAC9D,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,YAAM,GAAG,QAAQ,eAAI,IAAI,yBAAyB,aAAa,EAAE,CAAC;AAClE,YAAM;AAAA,IACR;AAAA,EACF;AACF;;;ADzPO,IAAM,qBAAN,cAEG,qBAA8C;AAAA,EACtD,QAA0B,yBAAU,IAAY;AAClD;AAKA,SAAS,UACP,QACA,SAAiC,CAAC,GAC2B;AAG7D,QAAM,oBAAoB,CAAC,QAAiB;AAC5C,MAAI,OAAO,SAAS;AAClB,UAAM,UAAU,OAAO,QAAQ,WAAW,CAAC;AAC3C,UAAM,cAAc,OAAO,QAAQ,eAAe,CAAC;AAGnD,UAAM,mBAAmB;AAAA,MACvB;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,IACF;AAEA,eAAW,QAAQ,kBAAkB;AACnC,cAAQ,OAAO,IAAI,CAAC,IAAI;AACxB,kBAAY,OAAO,IAAI,CAAC,IAAI;AAAA,IAC9B;AAGA,gBAAY,GAAG,IAAI;AACnB,gBAAY,IAAI,IAAI;AAEpB,WAAO,QAAQ,UAAU;AACzB,WAAO,QAAQ,cAAc;AAAA,EAC/B;AAGA,QAAM,UAAU,IAAI,yBAAU;AAE9B,MAAI;AACJ,MAAI,OAAO,WAAW,MAAM;AAC1B,aAAS,IAAI,6BAAc;AAAA,EAC7B,WAAW,OAAO,WAAW,SAAS,OAAO,WAAW,QAAW;AACjE,aAAS,OAAO;AAAA,EAClB;AAEA,MAAI;AACJ,MAAI,OAAO,QAAQ;AACjB,UAAM,mBAAe;AAAA,MACnB,OAAO;AAAA,MACP;AAAA,IACF;AACA,aAAS;AAAA,MACP,YAAY,OAAO;AAAA,MACnB,QAAQ,aAAa;AAAA,MACrB,eAAe,aAAa;AAAA,IAC9B;AAAA,EACF;AAGA,QAAM,iBAAiB,WAAW,SAAY,EAAE,OAAO,IAAI,CAAC;AAC5D,QAAM,UAAU,IAAI,kBAAkB,QAAQ,SAAS,QAAQ,cAAc;AAC7E,QAAM,KAAK,IAAI,mBAAmB,SAAS,SAAS,MAAa;AAGjE,KAAG,UAAU;AAEb,SAAO;AACT;AA+DO,SAAS,QAId,gBACA,aACoD;AAEpD,MAAI,OAAO,mBAAmB,YAAY,mBAAmB,QAAQ,YAAY,gBAAgB;AAC/F,UAAM,EAAE,QAAQ,GAAG,cAAc,IAAI;AACrC,WAAO,UAAU,QAA4B,aAAa;AAAA,EAC5D;AAGA,SAAO,UAAU,gBAA+C,WAAW;AAC7E;AAGA,QAAQ,OAAO,SAAS,KACtB,QACyF;AACzF,SAAO;AAAA,IACL;AAAA,MACE,QAAQ,YAAY,CAAC;AAAA,MACrB,SAAS;AAAA,QACP,SAAS,CAAC;AAAA,QACV,aAAa,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACF;;;AEzMA,sBAAyD;AAuBzD,eAAsB,QACpB,IACA,QACe;AACf,QAAM,iBAAa,oCAAmB,MAAM;AAE5C,QAAM,GAAG,QAAQ,QAAQ,YAAY,GAAG,EAAE,SAAS,MAAM;AAC3D;;;ACwIA,SAAS,sBAAsBC,MAAqB;AAElD,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAIA,KAAI,QAAQ,KAAK;AACnC,UAAM,OAAOA,KAAI,WAAW,CAAC;AAC7B,YAAS,QAAQ,KAAK,OAAQ;AAC9B,WAAO,OAAO;AAAA,EAChB;AACA,SAAO,KAAK,IAAI,IAAI,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AACpD;AAKA,SAAS,kBAAkB,WAA2B;AACpD,SAAO;AAAA,kCACyB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAM3C;AAQO,IAAM,kBAAN,MAAsB;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,QAA8B;AAAA,EAC9B,mBAA2D;AAAA,EAC3D,aAA4C;AAAA,EAC5C,YAA0B;AAAA,EAElC,YAAY,QAA+B;AACzC,SAAK,aAAa,OAAO;AACzB,SAAK,SAAS;AAAA,MACZ,WAAW,OAAO,aAAa;AAAA,MAC/B,SAAS,OAAO,WAAW;AAAA,MAC3B,oBAAoB,OAAO,sBAAsB;AAAA,MACjD,OAAO,OAAO,SAAS;AAAA,IACzB;AACA,SAAK,aAAa,OAAO;AACzB,SAAK,aAAa,OAAO;AACzB,SAAK,UAAU,OAAO;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKQ,IAAI,YAAoB,MAAuB;AACrD,QAAI,KAAK,OAAO,OAAO;AACrB,cAAQ,IAAI,qBAAqB,OAAO,IAAI,GAAG,IAAI;AAAA,IACrD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAiC;AAC/B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,gBAA+C;AAC7C,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,eAA6B;AAC3B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgF;AAC9E,UAAM,EAAE,SAAS,WAAW,IAAI,KAAK;AAErC,WAAO,QAAQ,QACZ,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,EAC5B,IAAI,CAAC,UAAU;AACd,YAAM,aAAa,GAAG,MAAM,IAAI,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,MAAM,GAAG;AACxE,YAAMA,OAAM,WAAW,UAAU,KAAK,WAAW,MAAM,GAAG;AAE1D,UAAI,CAACA,MAAK;AACR,cAAM,IAAI,MAAM,8BAA8B,UAAU,EAAE;AAAA,MAC5D;AAGA,YAAM,OAAO,sBAAsB,GAAG,UAAU,IAAIA,IAAG,EAAE;AAEzD,aAAO;AAAA,QACL;AAAA,QACA,KAAK,MAAM;AAAA,QACX,KAAAA;AAAA,QACA,KAAK,MAAM;AAAA,MACb;AAAA,IACF,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAAgB,UAAwC;AACpE,SAAK,IAAI,+BAA+B;AACxC,UAAM,SAAS,MAAM,kBAAkB,KAAK,OAAO,SAAS,CAAC;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,qBAAqB,UAA+C;AAChF,UAAM,SAAS,MAAM,SAAS;AAAA,MAC5B,qBAAqB,KAAK,OAAO,SAAS;AAAA,IAC5C;AACA,WAAO,IAAI,IAAI,OAAO,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAAgB,UAAyB,MAA6B;AAClF,UAAM,SAAS;AAAA,MACb,gBAAgB,KAAK,OAAO,SAAS;AAAA,MACrC,CAAC,IAAI;AAAA,IACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,eAAe,UAA0D;AAE7E,QAAI,KAAK,kBAAkB;AACzB,aAAO,KAAK;AAAA,IACd;AAGA,QAAI,KAAK,UAAU,eAAe,KAAK,YAAY;AACjD,aAAO,KAAK;AAAA,IACd;AAGA,QAAI,KAAK,UAAU,YAAY,KAAK,WAAW;AAC7C,YAAM,KAAK;AAAA,IACb;AAGA,QAAI,CAAC,KAAK,OAAO,SAAS;AACxB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,cAAc;AAAA,QACd,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,SAAS,CAAC;AAAA,MACZ;AAAA,IACF;AAGA,SAAK,mBAAmB,KAAK,cAAc,QAAQ;AAEnD,QAAI;AACF,YAAM,SAAS,MAAM,KAAK;AAC1B,aAAO;AAAA,IACT,UAAE;AACA,WAAK,mBAAmB;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cAAc,UAA0D;AACpF,SAAK,QAAQ;AACb,SAAK,IAAI,6BAA6B;AAEtC,UAAM,YAAY,YAAY,IAAI;AAClC,UAAM,UAAoB,CAAC;AAC3B,QAAI,eAAe;AAEnB,QAAI;AAEF,YAAM,KAAK,gBAAgB,QAAQ;AAGnC,YAAM,gBAAgB,MAAM,KAAK,qBAAqB,QAAQ;AAG9D,YAAM,aAAa,KAAK,cAAc;AACtC,WAAK,IAAI,SAAS,WAAW,MAAM,gBAAgB,cAAc,IAAI,kBAAkB;AAEvF,eAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,cAAM,YAAY,WAAW,CAAC;AAG9B,YAAI,cAAc,IAAI,UAAU,IAAI,GAAG;AACrC,eAAK,IAAI,6BAA6B,UAAU,GAAG,EAAE;AACrD;AAEA,eAAK,aAAa;AAAA,YAChB;AAAA,YACA,OAAO;AAAA,YACP,OAAO,WAAW;AAAA,YAClB,OAAO;AAAA,UACT,CAAC;AAED;AAAA,QACF;AAGA,aAAK,aAAa;AAAA,UAChB;AAAA,UACA,OAAO;AAAA,UACP,OAAO,WAAW;AAAA,UAClB,OAAO;AAAA,QACT,CAAC;AAED,cAAM,iBAAiB,YAAY,IAAI;AAEvC,YAAI;AAEF,eAAK,aAAa;AAAA,YAChB;AAAA,YACA,OAAO;AAAA,YACP,OAAO,WAAW;AAAA,YAClB,OAAO;AAAA,UACT,CAAC;AAGD,gBAAM,WAAW,UAAU,IAAI,QAAQ,kCAAkC,IAAI,EAAE,KAAK;AAGpF,gBAAM,aAAa,SAChB,MAAM,iCAAiC,EACvC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAE7B,qBAAW,aAAa,YAAY;AAClC,kBAAM,SAAS,MAAM,YAAY,GAAG;AAAA,UACtC;AAGA,gBAAM,KAAK,gBAAgB,UAAU,UAAU,IAAI;AAEnD,gBAAM,aAAa,KAAK,MAAM,YAAY,IAAI,IAAI,cAAc;AAChE,kBAAQ,KAAK,UAAU,IAAI;AAE3B,eAAK,IAAI,WAAW,UAAU,GAAG,OAAO,UAAU,IAAI;AAEtD,eAAK,aAAa;AAAA,YAChB;AAAA,YACA,OAAO;AAAA,YACP,OAAO,WAAW;AAAA,YAClB,OAAO;AAAA,YACP;AAAA,UACF,CAAC;AAAA,QACH,SAAS,OAAO;AACd,gBAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC1E,gBAAM,aAAa,KAAK,MAAM,YAAY,IAAI,IAAI,cAAc;AAEhE,eAAK,IAAI,UAAU,UAAU,GAAG,KAAK,YAAY,EAAE;AAEnD,eAAK,aAAa;AAAA,YAChB;AAAA,YACA,OAAO;AAAA,YACP,OAAO,WAAW;AAAA,YAClB,OAAO;AAAA,YACP;AAAA,YACA,OAAO;AAAA,UACT,CAAC;AAGD,gBAAM;AAAA,QACR;AAAA,MACF;AAEA,YAAM,gBAAgB,KAAK,MAAM,YAAY,IAAI,IAAI,SAAS;AAE9D,YAAM,SAAiC;AAAA,QACrC,SAAS;AAAA,QACT,cAAc,QAAQ;AAAA,QACtB;AAAA,QACA,YAAY;AAAA,QACZ;AAAA,MACF;AAEA,WAAK,QAAQ;AACb,WAAK,aAAa;AAElB,WAAK,IAAI,uBAAuB,QAAQ,MAAM,aAAa,YAAY,eAAe,aAAa,IAAI;AACvG,WAAK,aAAa,MAAM;AAExB,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,gBAAgB,KAAK,MAAM,YAAY,IAAI,IAAI,SAAS;AAC9D,YAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAE1E,YAAM,SAAiC;AAAA,QACrC,SAAS;AAAA,QACT,cAAc,QAAQ;AAAA,QACtB;AAAA,QACA,YAAY;AAAA,QACZ;AAAA,QACA,OAAO;AAAA,MACT;AAEA,WAAK,QAAQ;AACb,WAAK,aAAa;AAClB,WAAK,YAAY,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,YAAY;AAExE,WAAK,UAAU,KAAK,SAAS;AAE7B,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,aAAa,UAA0D;AAC3E,SAAK,QAAQ;AACb,SAAK,mBAAmB;AACxB,SAAK,aAAa;AAClB,SAAK,YAAY;AAEjB,WAAO,KAAK,eAAe,QAAQ;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,UAMb;AACD,QAAI;AAEF,YAAM,gBAAgB,MAAM,KAAK,qBAAqB,QAAQ;AAC9D,YAAM,gBAAgB,KAAK,cAAc;AAEzC,YAAM,oBAAoB,cACvB,OAAO,CAAC,MAAM,cAAc,IAAI,EAAE,IAAI,CAAC,EACvC,IAAI,CAAC,MAAM,EAAE,GAAG;AAEnB,YAAM,oBAAoB,cACvB,OAAO,CAAC,MAAM,CAAC,cAAc,IAAI,EAAE,IAAI,CAAC,EACxC,IAAI,CAAC,MAAM,EAAE,GAAG;AAEnB,aAAO;AAAA,QACL,aAAa;AAAA,QACb,cAAc,kBAAkB;AAAA,QAChC,cAAc,kBAAkB;AAAA,QAChC;AAAA,QACA;AAAA,MACF;AAAA,IACF,QAAQ;AAEN,YAAM,gBAAgB,KAAK,cAAc;AAEzC,aAAO;AAAA,QACL,aAAa;AAAA,QACb,cAAc;AAAA,QACd,cAAc,cAAc;AAAA,QAC5B,mBAAmB,CAAC;AAAA,QACpB,mBAAmB,cAAc,IAAI,CAAC,MAAM,EAAE,GAAG;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,UAA2C;AAC9D,UAAM,SAAS,MAAM,KAAK,UAAU,QAAQ;AAC5C,WAAO,OAAO,eAAe;AAAA,EAC/B;AACF;AAiBO,SAAS,sBAAsB,QAAgD;AACpF,SAAO,IAAI,gBAAgB,MAAM;AACnC;AAKO,SAAS,oBAAoB,SAAiC;AACnE,MAAI;AACF,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,oCAAoC,KAAK,EAAE;AAAA,EAC7D;AACF;AAuBO,SAAS,wBACd,SACA,UAC0B;AAE1B,aAAW,SAAS,QAAQ,SAAS;AACnC,UAAM,aAAa,GAAG,MAAM,IAAI,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,MAAM,GAAG;AACxE,QAAI,CAAC,SAAS,UAAU,KAAK,CAAC,SAAS,MAAM,GAAG,GAAG;AACjD,YAAM,IAAI,MAAM,mCAAmC,UAAU,EAAE;AAAA,IACjE;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,YAAY;AAAA,EACd;AACF;;;AC7iBA,SAAS,aAAa,SAAyB;AAC7C,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAM,OAAO,QAAQ,WAAW,CAAC;AACjC,YAAS,QAAQ,KAAK,OAAQ;AAC9B,WAAO,OAAO;AAAA,EAChB;AACA,SAAO,KAAK,IAAI,IAAI,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AACpD;AAKA,SAAS,gBAAgBC,MAAqB;AAC5C,SAAOA,KACJ,QAAQ,kCAAkC,IAAI,EAC9C,KAAK;AACV;AAKA,SAAS,UAAU,KAAqB;AACtC,SAAO,IACJ,QAAQ,MAAM,GAAG,EACjB,QAAQ,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC;AAChD;AAQO,IAAM,kBAAN,MAAsB;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA,mBAAiD;AAAA,EAEzD,YAAY,QAA+B;AACzC,SAAK,aAAa,OAAO;AACzB,SAAK,iBAAiB,OAAO,kBAAkB,CAAC;AAChD,SAAK,SAAS;AAAA,MACZ,UAAU,OAAO,YAAY;AAAA,MAC7B,eAAe,OAAO,iBAAiB;AAAA,IACzC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAuC;AACrC,QAAI,KAAK,kBAAkB;AACzB,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,EAAE,SAAS,WAAW,IAAI,KAAK;AACrC,UAAM,EAAE,UAAU,gBAAgB,EAAE,IAAI,KAAK;AAE7C,SAAK,mBAAmB,QAAQ,QAC7B,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,EAC5B,IAAI,CAAC,UAAU;AACd,YAAM,aAAa,GAAG,MAAM,IAAI,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,MAAM,GAAG;AACxE,YAAMA,OAAM,WAAW,UAAU,KAAK,WAAW,MAAM,GAAG;AAE1D,UAAI,CAACA,MAAK;AACR,cAAM,IAAI,MAAM,8BAA8B,UAAU,EAAE;AAAA,MAC5D;AAEA,YAAM,WAAW,gBAAgBA,IAAG;AACpC,YAAM,OAAO,aAAa,GAAG,UAAU,IAAIA,IAAG,EAAE;AAChD,YAAM,OAAO,KAAK,eAAe,MAAM,GAAG,KAAK,KAAK,eAAe,UAAU;AAC7E,YAAM,cAAc,YAAY;AAEhC,YAAM,YAAiC;AAAA,QACrC,IAAI,GAAG,WAAW,GAAG,UAAU;AAAA,QAC/B,MAAM,UAAU,MAAM,GAAG;AAAA,QACzB,SAAS,MAAM,MAAM,IAAI;AAAA;AAAA,QACzB,IAAI;AAAA,QACJ,MAAM,CAAC,SAAS;AAAA,QAChB,eAAe,MAAM,gBAAgB;AAAA,QACrC,SAAS;AAAA,UACP,KAAK,MAAM;AAAA,UACX;AAAA,UACA,KAAK,MAAM;AAAA,UACX,MAAM,MAAM;AAAA,QACd;AAAA,MACF;AAEA,UAAI,MAAM;AACR,kBAAU,OAAO,gBAAgB,IAAI;AACrC,kBAAU,eAAe;AAAA,MAC3B,OAAO;AACL,kBAAU,eAAe;AAAA,MAC3B;AAEA,aAAO;AAAA,IACT,CAAC;AAEH,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,IAA6C;AACxD,WAAO,KAAK,cAAc,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,KAA8C;AAC9D,WAAO,KAAK,cAAc,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ,GAAG;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAsB,SAAkD;AACtE,WAAO,KAAK,cAAc,EAAE,KAAK,CAAC,MAAM,EAAE,YAAY,OAAO;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,mBAA2B;AACzB,UAAM,aAAa,KAAK,cAAc;AACtC,QAAI,WAAW,WAAW,EAAG,QAAO;AACpC,WAAO,KAAK,IAAI,GAAG,WAAW,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,SAAwC;AACzD,WAAO,KAAK,cAAc,EAAE,OAAO,CAAC,MAAM,EAAE,UAAU,OAAO;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,aAA6B;AAC3B,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAkC;AAChC,UAAM,aAAa,KAAK,cAAc;AAEtC,UAAM,gBAAgB,KAAK,OAAO,iBAAiB;AACnD,UAAM,UAAiC,WAAW,IAAI,CAAC,OAAO;AAAA,MAC5D,KAAK,EAAE,SAAS,OAAQ,EAAE,UAAU,IAAI;AAAA,MACxC,SAAS,EAAE,SAAS,MAAM,SAAS,MAAK,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,YAAY,EAAE,EAAE,UAAU,GAAG,EAAE;AAAA,MACxG,MAAM,EAAE,SAAS,QAAQ,KAAK,IAAI;AAAA,MAClC,KAAK,EAAE,SAAS,OAAO,EAAE,GAAG,QAAQ,SAAS,EAAE;AAAA,MAC/C,aAAa,EAAE,kBAAkB;AAAA,IACnC,EAAE;AAEF,WAAO;AAAA,MACL,SAAS,KAAK,WAAW,QAAQ,WAAW;AAAA,MAC5C,SAAS,KAAK,WAAW,QAAQ,WAAW;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAiD;AAC/C,UAAM,SAAmB,CAAC;AAE1B,eAAW,SAAS,KAAK,WAAW,QAAQ,SAAS;AACnD,YAAM,aAAa,GAAG,MAAM,IAAI,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,MAAM,GAAG;AACxE,YAAMA,OAAM,KAAK,WAAW,WAAW,UAAU,KAAK,KAAK,WAAW,WAAW,MAAM,GAAG;AAE1F,UAAI,CAACA,MAAK;AACR,eAAO,KAAK,mCAAmC,UAAU,EAAE;AAAA,MAC7D;AAAA,IACF;AAEA,WAAO;AAAA,MACL,OAAO,OAAO,WAAW;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,SAAiB,SAAuB;AACvD,SAAK,eAAe,OAAO,IAAI;AAE/B,SAAK,mBAAmB;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,WAKE;AACA,UAAM,aAAa,KAAK,cAAc;AAEtC,QAAI,qBAAqB;AACzB,eAAW,KAAK,YAAY;AAE1B,YAAM,aAAa,EAAE,GAClB,MAAM,iCAAiC,EACvC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC;AACpC,4BAAsB,WAAW;AAAA,IACnC;AAEA,WAAO;AAAA,MACL,iBAAiB,WAAW;AAAA,MAC5B,iBAAiB,WAAW,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE;AAAA,MAC1D,oBAAoB,WAAW,OAAO,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AACF;AAoBO,SAAS,sBAAsB,QAAgD;AACpF,SAAO,IAAI,gBAAgB,MAAM;AACnC;AAKO,SAAS,2BACd,SACA,gBACuB;AACvB,QAAM,SAAS,sBAAsB;AAAA,IACnC,YAAY;AAAA,IACZ;AAAA,EACF,CAAC;AACD,SAAO,OAAO,cAAc;AAC9B;AAmEA,eAAsB,sBACpB,UACA,QAOC;AACD,QAAM,SAAS,sBAAsB;AAAA,IACnC,YAAY,OAAO;AAAA,IACnB,gBAAgB,OAAO;AAAA,EACzB,CAAC;AAED,QAAM,aAAa,OAAO,cAAc;AACxC,QAAM,YAAY,OAAO,aAAa;AACtC,QAAM,YAAY,YAAY,IAAI;AAClC,MAAI,eAAe;AACnB,MAAI,eAAe;AAEnB,MAAI;AAEF,UAAM,SAAS,MAAM;AAAA,oCACW,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAWxC;AACD,UAAM,SAAS;AAAA,MACb,kCAAkC,UAAU,QAAQ,MAAM,EAAE,CAAC,gBAAgB,SAAS;AAAA,IACxF;AAGA,UAAM,UAAU,MAAM,SAAS;AAAA,MAC7B,wBAAwB,SAAS;AAAA,IACnC;AACA,UAAM,kBAAkB,IAAI,IAAI,QAAQ,KAAK,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;AAGlE,aAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,YAAM,YAAY,WAAW,CAAC;AAE9B,UAAI,gBAAgB,IAAI,UAAU,OAAO,GAAG;AAC1C;AACA,eAAO,aAAa;AAAA,UAClB;AAAA,UACA,OAAO;AAAA,UACP,OAAO,WAAW;AAAA,UAClB,OAAO;AAAA,QACT,CAAC;AACD;AAAA,MACF;AAEA,aAAO,aAAa;AAAA,QAClB;AAAA,QACA,OAAO;AAAA,QACP,OAAO,WAAW;AAAA,QAClB,OAAO;AAAA,MACT,CAAC;AAED,YAAM,iBAAiB,YAAY,IAAI;AAEvC,UAAI;AAEF,cAAM,aAAa,UAAU,GAC1B,MAAM,iCAAiC,EACvC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAE7B,mBAAW,QAAQ,YAAY;AAC7B,gBAAM,SAAS,MAAM,OAAO,GAAG;AAAA,QACjC;AAGA,cAAM,WAAW,KAAK,MAAM,YAAY,IAAI,IAAI,cAAc;AAC9D,cAAM,WAAW,aAAa,UAAU,EAAE;AAE1C,cAAM,SAAS;AAAA,UACb,gBAAgB,SAAS;AAAA;AAAA,UAEzB;AAAA,YACE,UAAU;AAAA,YACV,UAAU;AAAA,YACV,UAAU;AAAA,YACV;AAAA,YACA;AAAA,YACA,UAAU,SAAS,QAAQ;AAAA,YAC3B,UAAU,SAAS,OAAO;AAAA,UAC5B;AAAA,QACF;AAEA;AAEA,eAAO,aAAa;AAAA,UAClB;AAAA,UACA,OAAO;AAAA,UACP,OAAO,WAAW;AAAA,UAClB,OAAO;AAAA,UACP,YAAY;AAAA,QACd,CAAC;AAED,YAAI,OAAO,OAAO;AAChB,kBAAQ,IAAI,8BAA8B,UAAU,EAAE,OAAO,QAAQ,IAAI;AAAA,QAC3E;AAAA,MACF,SAAS,OAAO;AACd,cAAM,WAAW,KAAK,MAAM,YAAY,IAAI,IAAI,cAAc;AAC9D,cAAM,WAAW,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAEtE,eAAO,aAAa;AAAA,UAClB;AAAA,UACA,OAAO;AAAA,UACP,OAAO,WAAW;AAAA,UAClB,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,OAAO;AAAA,QACT,CAAC;AAED,cAAM;AAAA,MACR;AAAA,IACF;AAEA,UAAM,YAAY,KAAK,MAAM,YAAY,IAAI,IAAI,SAAS;AAE1D,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA,YAAY;AAAA,IACd;AAAA,EACF,SAAS,OAAO;AACd,UAAM,YAAY,KAAK,MAAM,YAAY,IAAI,IAAI,SAAS;AAC1D,UAAM,WAAW,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAEtE,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ,OAAO;AAAA,IACT;AAAA,EACF;AACF;;;AClaA,SAASC,cAAa,SAAyB;AAC7C,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAM,OAAO,QAAQ,WAAW,CAAC;AACjC,YAAS,QAAQ,KAAK,OAAQ;AAC9B,WAAO,OAAO;AAAA,EAChB;AACA,SAAO,KAAK,IAAI,IAAI,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AACpD;AAKA,SAASC,iBAAgBC,MAAqB;AAC5C,SAAOA,KACJ,QAAQ,kCAAkC,IAAI,EAC9C,KAAK;AACV;AAKA,SAASC,WAAU,KAAqB;AACtC,SAAO,IACJ,QAAQ,MAAM,GAAG,EACjB,QAAQ,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC;AAChD;AAKA,SAAS,gCAAgC,WAA6B;AACpE,QAAM,YAAY,UAAU,QAAQ,MAAM,EAAE;AAC5C,SAAO;AAAA,IACL,+BAA+B,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAYxC,kCAAkC,SAAS,gBAAgB,SAAS;AAAA,IACpE,kCAAkC,SAAS,qBAAqB,SAAS;AAAA,IACzE,kCAAkC,SAAS,eAAe,SAAS;AAAA,EACrE;AACF;AAKA,SAAS,yBAAyB,WAA2B;AAC3D,SAAO;AAAA,kCACyB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAM3C;AAQO,IAAM,sBAAN,MAA0B;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,QAAkC;AAAA,EAClC,mBAA+D;AAAA,EAC/D,aAAgD;AAAA,EAChD,YAA0B;AAAA,EAC1B,mBAAiD;AAAA,EAEzD,YAAY,QAAmC;AAC7C,SAAK,UAAU,OAAO;AACtB,SAAK,iBAAiB,OAAO,kBAAkB,CAAC;AAChD,SAAK,SAAS;AAAA,MACZ,SAAS,OAAO,WAAW;AAAA,MAC3B,cAAc,OAAO,gBAAgB;AAAA,MACrC,iBAAiB,OAAO,mBAAmB;AAAA,MAC3C,oBAAoB,OAAO,sBAAsB;AAAA,MACjD,cAAc,OAAO,gBAAgB;AAAA,MACrC,OAAO,OAAO,SAAS;AAAA,IACzB;AACA,SAAK,aAAa,OAAO;AACzB,SAAK,aAAa,OAAO;AACzB,SAAK,UAAU,OAAO;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKQ,IAAI,YAAoB,MAAuB;AACrD,QAAI,KAAK,OAAO,OAAO;AACrB,cAAQ,IAAI,yBAAyB,OAAO,IAAI,GAAG,IAAI;AAAA,IACzD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAqC;AACnC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAmD;AACjD,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,eAA6B;AAC3B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAuC;AACrC,QAAI,KAAK,kBAAkB;AACzB,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,EAAE,SAAS,WAAW,IAAI,KAAK;AAErC,SAAK,mBAAmB,QAAQ,QAC7B,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,EAC5B,IAAI,CAAC,UAAU;AACd,YAAM,aAAa,GAAG,MAAM,IAAI,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,MAAM,GAAG;AACxE,YAAMD,OAAM,WAAW,UAAU,KAAK,WAAW,MAAM,GAAG;AAE1D,UAAI,CAACA,MAAK;AACR,cAAM,IAAI,MAAM,8BAA8B,UAAU,EAAE;AAAA,MAC5D;AAEA,YAAM,WAAWD,iBAAgBC,IAAG;AACpC,YAAM,OAAOF,cAAa,GAAG,UAAU,IAAIE,IAAG,EAAE;AAChD,YAAM,OAAO,KAAK,eAAe,MAAM,GAAG,KAAK,KAAK,eAAe,UAAU;AAE7E,YAAM,YAAiC;AAAA,QACrC,IAAI;AAAA,QACJ,MAAMC,WAAU,MAAM,GAAG;AAAA,QACzB,SAAS,MAAM,MAAM;AAAA,QACrB,IAAI;AAAA,QACJ,MAAM,CAAC,SAAS;AAAA,QAChB,eAAe,MAAM,gBAAgB;AAAA,QACrC,SAAS;AAAA,UACP,KAAK,MAAM;AAAA,UACX;AAAA,UACA,KAAK,MAAM;AAAA,UACX,MAAM,MAAM;AAAA,QACd;AAAA,MACF;AAEA,UAAI,MAAM;AACR,kBAAU,OAAOF,iBAAgB,IAAI;AACrC,kBAAU,eAAe;AAAA,MAC3B,OAAO;AACL,kBAAU,eAAe;AAAA,MAC3B;AAEA,aAAO;AAAA,IACT,CAAC;AAEH,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,aAA6B;AAC3B,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,mBAA2B;AACzB,UAAM,aAAa,KAAK,cAAc;AACtC,WAAO,WAAW,SAAS,IAAI,KAAK,IAAI,GAAG,WAAW,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBAAiB,UAAwC;AACrE,SAAK,IAAI,+BAA+B;AAGxC,UAAM,aAAa,gCAAgC,KAAK,OAAO,eAAe;AAC9E,eAAW,aAAa,YAAY;AAClC,YAAM,SAAS,MAAM,SAAS;AAAA,IAChC;AAGA,UAAM,SAAS,MAAM,yBAAyB,KAAK,OAAO,YAAY,CAAC;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,qBAAqB,UAGhC;AAED,UAAM,YAAY,MAAM,SAAS;AAAA,MAC/B;AAAA,eACS,KAAK,OAAO,eAAe;AAAA;AAAA;AAAA,IAGtC;AACA,UAAM,qBAAqB,oBAAI,IAAmC;AAClE,eAAW,OAAO,UAAU,MAAM;AAChC,yBAAmB,IAAI,IAAI,SAAS,GAAG;AAAA,IACzC;AAGA,UAAM,gBAAgB,MAAM,SAAS;AAAA,MACnC,qBAAqB,KAAK,OAAO,YAAY;AAAA,IAC/C;AACA,UAAM,gBAAgB,IAAI,IAAI,cAAc,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAEnE,WAAO,EAAE,oBAAoB,cAAc;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,UAA8D;AAEjF,QAAI,KAAK,kBAAkB;AACzB,aAAO,KAAK;AAAA,IACd;AAGA,QAAI,KAAK,UAAU,eAAe,KAAK,YAAY;AACjD,aAAO,KAAK;AAAA,IACd;AAGA,QAAI,KAAK,UAAU,YAAY,KAAK,WAAW;AAC7C,YAAM,KAAK;AAAA,IACb;AAGA,QAAI,CAAC,KAAK,OAAO,SAAS;AACxB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,cAAc;AAAA,QACd,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,SAAS,CAAC;AAAA,QACV,gBAAgB;AAAA,MAClB;AAAA,IACF;AAGA,SAAK,mBAAmB,KAAK,cAAc,QAAQ;AAEnD,QAAI;AACF,YAAM,SAAS,MAAM,KAAK;AAC1B,aAAO;AAAA,IACT,UAAE;AACA,WAAK,mBAAmB;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cAAc,UAA8D;AACxF,SAAK,QAAQ;AACb,SAAK,IAAI,6BAA6B;AAEtC,UAAM,YAAY,YAAY,IAAI;AAClC,UAAM,UAAoB,CAAC;AAC3B,QAAI,eAAe;AACnB,QAAI,iBAAiB;AAErB,QAAI;AAEF,YAAM,KAAK,iBAAiB,QAAQ;AAGpC,YAAM,EAAE,oBAAoB,cAAc,IAAI,MAAM,KAAK,qBAAqB,QAAQ;AAGtF,YAAM,aAAa,KAAK,cAAc;AACtC,WAAK,IAAI,SAAS,WAAW,MAAM,gBAAgB,mBAAmB,IAAI,oBAAoB,cAAc,IAAI,qBAAqB;AAErI,YAAM,eAAe,mBAAmB,OAAO,IAC3C,KAAK,IAAI,GAAG,MAAM,KAAK,mBAAmB,KAAK,CAAC,CAAC,IACjD;AAEJ,eAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,cAAM,YAAY,WAAW,CAAC;AAC9B,cAAM,cAAc,UAAU,SAAS,QAAQD,cAAa,UAAU,KAAK,UAAU,EAAE;AAGvF,cAAM,sBAAsB,mBAAmB,IAAI,UAAU,OAAO;AACpE,cAAM,mBAAmB,cAAc,IAAI,WAAW;AAEtD,YAAI,uBAAuB,kBAAkB;AAC3C,eAAK,IAAI,6BAA6B,UAAU,EAAE,EAAE;AACpD;AAEA,eAAK,aAAa;AAAA,YAChB,WAAW;AAAA,cACT,MAAM;AAAA,cACN,KAAK,UAAU,SAAS,OAAO,UAAU;AAAA,cACzC,KAAK,UAAU;AAAA,YACjB;AAAA,YACA,OAAO;AAAA,YACP,OAAO,WAAW;AAAA,YAClB,OAAO;AAAA,UACT,CAAC;AAED;AAAA,QACF;AAGA,YAAI,KAAK,OAAO,sBAAsB,qBAAqB;AACzD,gBAAM,iBAAiB,mBAAmB,IAAI,UAAU,OAAO;AAC/D,cAAI,kBAAkB,eAAe,SAASA,cAAa,UAAU,EAAE,GAAG;AACxE,kBAAM,IAAI;AAAA,cACR,mCAAmC,UAAU,EAAE;AAAA,YAEjD;AAAA,UACF;AAAA,QACF;AAGA,aAAK,aAAa;AAAA,UAChB,WAAW;AAAA,YACT,MAAM;AAAA,YACN,KAAK,UAAU,SAAS,OAAO,UAAU;AAAA,YACzC,KAAK,UAAU;AAAA,UACjB;AAAA,UACA,OAAO;AAAA,UACP,OAAO,WAAW;AAAA,UAClB,OAAO;AAAA,QACT,CAAC;AAED,cAAM,iBAAiB,YAAY,IAAI;AAEvC,YAAI;AACF,eAAK,aAAa;AAAA,YAChB,WAAW;AAAA,cACT,MAAM;AAAA,cACN,KAAK,UAAU,SAAS,OAAO,UAAU;AAAA,cACzC,KAAK,UAAU;AAAA,YACjB;AAAA,YACA,OAAO;AAAA,YACP,OAAO,WAAW;AAAA,YAClB,OAAO;AAAA,UACT,CAAC;AAGD,gBAAM,aAAa,UAAU,GAC1B,MAAM,iCAAiC,EACvC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAE7B,qBAAW,aAAa,YAAY;AAClC,kBAAM,SAAS,MAAM,YAAY,GAAG;AAAA,UACtC;AAEA,gBAAM,WAAW,KAAK,MAAM,YAAY,IAAI,IAAI,cAAc;AAC9D,gBAAM,WAAWA,cAAa,UAAU,EAAE;AAG1C,gBAAM,SAAS;AAAA,YACb,gBAAgB,KAAK,OAAO,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAO3C;AAAA,cACE,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV;AAAA,cACA;AAAA,cACA;AAAA,cACA,UAAU,SAAS,OAAO;AAAA,cAC1B,UAAU,SAAS,OAAO;AAAA,YAC5B;AAAA,UACF;AAGA,gBAAM,SAAS;AAAA,YACb,gBAAgB,KAAK,OAAO,YAAY;AAAA,YACxC,CAAC,WAAW;AAAA,UACd;AAEA,kBAAQ,KAAK,UAAU,EAAE;AAEzB,eAAK,IAAI,WAAW,UAAU,EAAE,OAAO,QAAQ,IAAI;AAEnD,eAAK,aAAa;AAAA,YAChB,WAAW;AAAA,cACT,MAAM;AAAA,cACN,KAAK,UAAU,SAAS,OAAO,UAAU;AAAA,cACzC,KAAK,UAAU;AAAA,YACjB;AAAA,YACA,OAAO;AAAA,YACP,OAAO,WAAW;AAAA,YAClB,OAAO;AAAA,YACP,YAAY;AAAA,UACd,CAAC;AAAA,QACH,SAAS,OAAO;AACd,gBAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC1E,gBAAM,aAAa,KAAK,MAAM,YAAY,IAAI,IAAI,cAAc;AAEhE,eAAK,IAAI,UAAU,UAAU,EAAE,KAAK,YAAY,EAAE;AAElD,eAAK,aAAa;AAAA,YAChB,WAAW;AAAA,cACT,MAAM;AAAA,cACN,KAAK,UAAU,SAAS,OAAO,UAAU;AAAA,cACzC,KAAK,UAAU;AAAA,YACjB;AAAA,YACA,OAAO;AAAA,YACP,OAAO,WAAW;AAAA,YAClB,OAAO;AAAA,YACP;AAAA,YACA,OAAO;AAAA,UACT,CAAC;AAED,gBAAM;AAAA,QACR;AAAA,MACF;AAGA,UAAI,KAAK,OAAO,cAAc;AAC5B,yBAAiB,MAAM,KAAK,aAAa,QAAQ;AAAA,MACnD;AAEA,YAAM,gBAAgB,KAAK,MAAM,YAAY,IAAI,IAAI,SAAS;AAC9D,YAAM,aAAa,KAAK,iBAAiB;AAEzC,YAAM,SAAqC;AAAA,QACzC,SAAS;AAAA,QACT,cAAc,QAAQ;AAAA,QACtB;AAAA,QACA,YAAY;AAAA,QACZ;AAAA,QACA;AAAA,QACA,kBAAkB;AAAA,UAChB,aAAa;AAAA,UACb,WAAW;AAAA,UACX,eAAe,QAAQ;AAAA,UACvB,mBAAmB;AAAA,QACrB;AAAA,MACF;AAEA,WAAK,QAAQ;AACb,WAAK,aAAa;AAElB,WAAK,IAAI,uBAAuB,QAAQ,MAAM,aAAa,YAAY,eAAe,aAAa,IAAI;AACvG,WAAK,aAAa,MAAM;AAExB,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,gBAAgB,KAAK,MAAM,YAAY,IAAI,IAAI,SAAS;AAC9D,YAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAE1E,YAAM,SAAqC;AAAA,QACzC,SAAS;AAAA,QACT,cAAc,QAAQ;AAAA,QACtB;AAAA,QACA,YAAY;AAAA,QACZ;AAAA,QACA,OAAO;AAAA,QACP,gBAAgB;AAAA,MAClB;AAEA,WAAK,QAAQ;AACb,WAAK,aAAa;AAClB,WAAK,YAAY,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,YAAY;AAExE,WAAK,UAAU,KAAK,SAAS;AAE7B,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,aAAa,UAA2C;AACpE,QAAI;AACF,WAAK,IAAI,kBAAkB;AAG3B,YAAM,YAAY,MAAM,SAAS;AAAA,QAC/B,6BAA6B,KAAK,OAAO,eAAe;AAAA,MAC1D;AAGA,YAAM,gBAAgB,MAAM,SAAS;AAAA,QACnC,qBAAqB,KAAK,OAAO,YAAY;AAAA,MAC/C;AAEA,YAAM,gBAAgB,IAAI,IAAI,cAAc,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAGnE,UAAI,SAAS;AACb,iBAAW,OAAO,UAAU,MAAM;AAChC,YAAI,IAAI,gBAAgB,CAAC,cAAc,IAAI,IAAI,YAAY,GAAG;AAC5D,gBAAM,SAAS;AAAA,YACb,gBAAgB,KAAK,OAAO,YAAY;AAAA,YACxC,CAAC,IAAI,YAAY;AAAA,UACnB;AACA;AAAA,QACF;AAAA,MACF;AAEA,WAAK,IAAI,UAAU,MAAM,oBAAoB;AAC7C,aAAO;AAAA,IACT,SAAS,OAAO;AACd,WAAK,IAAI,wBAAwB,KAAK;AACtC,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,UAA8D;AAC/E,SAAK,QAAQ;AACb,SAAK,mBAAmB;AACxB,SAAK,aAAa;AAClB,SAAK,YAAY;AAEjB,WAAO,KAAK,eAAe,QAAQ;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,UAOb;AACD,QAAI;AACF,YAAM,KAAK,iBAAiB,QAAQ;AAEpC,YAAM,EAAE,oBAAoB,cAAc,IAAI,MAAM,KAAK,qBAAqB,QAAQ;AACtF,YAAM,gBAAgB,KAAK,cAAc;AAEzC,YAAM,oBAAoB,cACvB,OAAO,CAAC,MAAM,mBAAmB,IAAI,EAAE,OAAO,CAAC,EAC/C,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,SAAS,EAAE,SAAS,KAAK,EAAE,SAAS,IAAI,EAAE;AAErE,YAAM,oBAAoB,cACvB,OAAO,CAAC,MAAM,CAAC,mBAAmB,IAAI,EAAE,OAAO,CAAC,EAChD,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,SAAS,EAAE,SAAS,KAAK,EAAE,SAAS,IAAI,EAAE;AAGrE,YAAM,yBAAyB,cAC5B,OAAO,CAAC,MAAM,mBAAmB,IAAI,EAAE,OAAO,CAAC,EAC/C,MAAM,CAAC,MAAM,EAAE,SAAS,QAAQ,cAAc,IAAI,EAAE,QAAQ,IAAI,CAAC;AAEpE,aAAO;AAAA,QACL,aAAa;AAAA,QACb,cAAc,kBAAkB;AAAA,QAChC,cAAc,kBAAkB;AAAA,QAChC;AAAA,QACA;AAAA,QACA,gBAAgB;AAAA,MAClB;AAAA,IACF,QAAQ;AACN,YAAM,gBAAgB,KAAK,cAAc;AAEzC,aAAO;AAAA,QACL,aAAa;AAAA,QACb,cAAc;AAAA,QACd,cAAc,cAAc;AAAA,QAC5B,mBAAmB,CAAC;AAAA,QACpB,mBAAmB,cAAc,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,SAAS,EAAE,SAAS,KAAK,EAAE,SAAS,IAAI,EAAE;AAAA,QACnG,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,UAA2C;AAC9D,UAAM,SAAS,MAAM,KAAK,UAAU,QAAQ;AAC5C,WAAO,OAAO,eAAe;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,UAIhB;AACD,UAAM,aAAa,KAAK,cAAc;AAGtC,UAAM,SAAS,MAAM,KAAK,UAAU,QAAQ;AAE5C,QAAI,OAAO,kBAAkB,WAAW,GAAG;AACzC,aAAO,EAAE,SAAS,OAAO,OAAO,4BAA4B;AAAA,IAC9D;AAGA,UAAM,cAAc,OAAO,kBAAkB,OAAO,kBAAkB,SAAS,CAAC;AAChF,UAAM,YAAY,WAAW,KAAK,CAAC,MAAM,EAAE,OAAO,aAAa,EAAE;AAEjE,QAAI,CAAC,WAAW;AACd,aAAO,EAAE,SAAS,OAAO,OAAO,aAAa,aAAa,EAAE,yBAAyB;AAAA,IACvF;AAEA,QAAI,CAAC,UAAU,MAAM;AACnB,aAAO,EAAE,SAAS,OAAO,OAAO,aAAa,UAAU,EAAE,qCAAqC;AAAA,IAChG;AAEA,QAAI;AACF,WAAK,IAAI,0BAA0B,UAAU,EAAE,EAAE;AAGjD,YAAM,aAAa,UAAU,KAC1B,MAAM,iCAAiC,EACvC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAE7B,iBAAW,aAAa,YAAY;AAClC,cAAM,SAAS,MAAM,YAAY,GAAG;AAAA,MACtC;AAGA,YAAM,SAAS;AAAA,QACb,WAAW,KAAK,OAAO,eAAe;AAAA;AAAA;AAAA,QAGtC,CAAC,UAAU,EAAE;AAAA,MACf;AAGA,UAAI,UAAU,SAAS,MAAM;AAC3B,cAAM,SAAS;AAAA,UACb,gBAAgB,KAAK,OAAO,YAAY;AAAA,UACxC,CAAC,UAAU,QAAQ,IAAI;AAAA,QACzB;AAAA,MACF;AAEA,WAAK,IAAI,eAAe,UAAU,EAAE,EAAE;AAEtC,aAAO,EAAE,SAAS,MAAM,UAAU;AAAA,IACpC,SAAS,OAAO;AACd,YAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC1E,aAAO,EAAE,SAAS,OAAO,WAAW,OAAO,aAAa;AAAA,IAC1D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,UAAyB,eAI9C;AACD,UAAM,aAAuB,CAAC;AAC9B,UAAM,SAAS,MAAM,KAAK,UAAU,QAAQ;AAG5C,UAAM,aAAa,OAAO,kBACvB,OAAO,CAAC,MAAM,EAAE,UAAU,aAAa,EACvC,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,OAAO;AAEvC,eAAW,aAAa,YAAY;AAClC,YAAM,SAAS,MAAM,KAAK,aAAa,QAAQ;AAE/C,UAAI,CAAC,OAAO,SAAS;AACnB,eAAO;AAAA,UACL,SAAS;AAAA,UACT;AAAA,UACA,OAAO,OAAO;AAAA,QAChB;AAAA,MACF;AAEA,iBAAW,KAAK,UAAU,EAAE;AAAA,IAC9B;AAEA,WAAO,EAAE,SAAS,MAAM,WAAW;AAAA,EACrC;AACF;AAoBO,SAAS,0BAA0B,QAAwD;AAChG,SAAO,IAAI,oBAAoB,MAAM;AACvC;;;AC3sBA,IAAM,oBAAuD;AAAA;AAAA,EAE3D,UAAU,EAAE,aAAa,YAAY,QAAQ,YAAY,QAAQ,SAAS;AAAA,EAC1E,SAAS,EAAE,aAAa,WAAW,QAAQ,WAAW,QAAQ,SAAS;AAAA,EACvE,KAAK,EAAE,aAAa,WAAW,QAAQ,WAAW,QAAQ,SAAS;AAAA,EACnE,MAAM,EAAE,aAAa,WAAW,QAAQ,WAAW,QAAQ,SAAS;AAAA,EACpE,QAAQ,EAAE,aAAa,UAAU,QAAQ,UAAU,QAAQ,SAAS;AAAA,EACpE,MAAM,EAAE,aAAa,UAAU,QAAQ,UAAU,QAAQ,SAAS;AAAA,EAClE,QAAQ,EAAE,aAAa,UAAU,QAAQ,UAAU,QAAQ,SAAS;AAAA,EACpE,aAAa,EAAE,aAAa,eAAe,QAAQ,eAAe,QAAQ,SAAS;AAAA,EACnF,WAAW,EAAE,aAAa,aAAa,QAAQ,aAAa,QAAQ,SAAS;AAAA;AAAA,EAG7E,MAAM,EAAE,aAAa,QAAQ,QAAQ,QAAQ,QAAQ,SAAS;AAAA,EAC9D,QAAQ,EAAE,aAAa,QAAQ,QAAQ,QAAQ,QAAQ,SAAS;AAAA,EAChE,oBAAoB,EAAE,aAAa,mBAAmB,QAAQ,mBAAmB,QAAQ,SAAS;AAAA,EAClG,QAAQ,EAAE,aAAa,mBAAmB,QAAQ,mBAAmB,QAAQ,SAAS;AAAA;AAAA,EAGtF,SAAS,EAAE,aAAa,WAAW,QAAQ,WAAW,QAAQ,SAAS;AAAA,EACvE,SAAS,EAAE,aAAa,WAAW,QAAQ,WAAW,QAAQ,SAAS;AAAA;AAAA,EAGvE,qBAAqB,EAAE,aAAa,WAAW,QAAQ,WAAW,QAAQ,SAAS;AAAA,EACnF,SAAS,EAAE,aAAa,WAAW,QAAQ,WAAW,QAAQ,SAAS;AAAA,EACvE,WAAW,EAAE,aAAa,QAAQ,QAAQ,QAAQ,QAAQ,SAAS;AAAA,EACnE,MAAM,EAAE,aAAa,QAAQ,QAAQ,QAAQ,QAAQ,SAAS;AAAA,EAC9D,MAAM,EAAE,aAAa,QAAQ,QAAQ,QAAQ,QAAQ,SAAS;AAAA;AAAA,EAG9D,OAAO,EAAE,aAAa,SAAS,QAAQ,SAAS,QAAQ,SAAS;AAAA;AAAA,EAGjE,SAAS,EAAE,aAAa,WAAW,QAAQ,WAAW,QAAQ,UAAU;AAAA,EACxE,MAAM,EAAE,aAAa,WAAW,QAAQ,WAAW,QAAQ,UAAU;AAAA;AAAA,EAGrE,MAAM,EAAE,aAAa,QAAQ,QAAQ,QAAQ,QAAQ,SAAS;AAAA,EAC9D,MAAM,EAAE,aAAa,QAAQ,QAAQ,QAAQ,QAAQ,SAAS;AAAA,EAC9D,uBAAuB,EAAE,aAAa,QAAQ,QAAQ,QAAQ,QAAQ,SAAS;AAAA,EAC/E,0BAA0B,EAAE,aAAa,QAAQ,QAAQ,QAAQ,QAAQ,SAAS;AAAA,EAClF,WAAW,EAAE,aAAa,aAAa,QAAQ,aAAa,QAAQ,OAAO;AAAA,EAC3E,4BAA4B,EAAE,aAAa,aAAa,QAAQ,aAAa,QAAQ,OAAO;AAAA,EAC5F,+BAA+B,EAAE,aAAa,aAAa,QAAQ,aAAa,QAAQ,OAAO;AAAA,EAC/F,aAAa,EAAE,aAAa,aAAa,QAAQ,aAAa,QAAQ,OAAO;AAAA,EAC7E,UAAU,EAAE,aAAa,YAAY,QAAQ,YAAY,QAAQ,SAAS;AAAA;AAAA,EAG1E,MAAM,EAAE,aAAa,QAAQ,QAAQ,QAAQ,QAAQ,SAAS;AAAA;AAAA,EAG9D,MAAM,EAAE,aAAa,QAAQ,QAAQ,QAAQ,QAAQ,UAAU;AAAA,EAC/D,OAAO,EAAE,aAAa,SAAS,QAAQ,SAAS,QAAQ,UAAU;AAAA;AAAA,EAGlE,MAAM,EAAE,aAAa,QAAQ,QAAQ,QAAQ,QAAQ,SAAS;AAAA,EAC9D,MAAM,EAAE,aAAa,QAAQ,QAAQ,QAAQ,QAAQ,SAAS;AAAA,EAC9D,SAAS,EAAE,aAAa,WAAW,QAAQ,WAAW,QAAQ,SAAS;AAAA,EACvE,UAAU,EAAE,aAAa,YAAY,QAAQ,YAAY,QAAQ,SAAS;AAAA;AAAA,EAG1E,OAAO,EAAE,aAAa,SAAS,QAAQ,SAAS,QAAQ,2BAA2B;AAAA,EACnF,MAAM,EAAE,aAAa,QAAQ,QAAQ,QAAQ,QAAQ,SAAS;AAAA,EAC9D,MAAM,EAAE,aAAa,QAAQ,QAAQ,QAAQ,QAAQ,SAAS;AAAA,EAC9D,KAAK,EAAE,aAAa,cAAc,QAAQ,cAAc,QAAQ,SAAS;AAAA,EACzE,MAAM,EAAE,aAAa,cAAc,QAAQ,cAAc,QAAQ,SAAS;AAAA,EAC1E,SAAS,EAAE,aAAa,cAAc,QAAQ,cAAc,QAAQ,SAAS;AAAA,EAC7E,QAAQ,EAAE,aAAa,cAAc,QAAQ,cAAc,QAAQ,SAAS;AAC9E;AAKA,IAAM,oBAAuD;AAAA,EAC3D,QAAQ,EAAE,aAAa,QAAQ,QAAQ,QAAQ,QAAQ,SAAS;AAAA,EAChE,QAAQ,EAAE,aAAa,WAAW,QAAQ,WAAW,QAAQ,SAAS;AAAA,EACtE,QAAQ,EAAE,aAAa,UAAU,QAAQ,UAAU,QAAQ,SAAS;AAAA,EACpE,SAAS,EAAE,aAAa,WAAW,QAAQ,WAAW,QAAQ,UAAU;AAAA,EACxE,MAAM,EAAE,aAAa,aAAa,QAAQ,aAAa,QAAQ,OAAO;AAAA,EACtE,QAAQ,EAAE,aAAa,SAAS,QAAQ,SAAS,QAAQ,UAAU;AAAA,EACnE,2BAA2B,EAAE,aAAa,SAAS,QAAQ,SAAS,QAAQ,UAAU;AAAA,EACtF,uBAAuB,EAAE,aAAa,SAAS,QAAQ,SAAS,QAAQ,UAAU;AAAA,EAClF,SAAS,EAAE,aAAa,SAAS,QAAQ,SAAS,QAAQ,UAAU;AAAA,EACpE,KAAK,EAAE,aAAa,SAAS,QAAQ,SAAS,QAAQ,UAAU;AAAA,EAChE,QAAQ,EAAE,aAAa,SAAS,QAAQ,SAAS,QAAQ,SAAS;AAAA,EAClE,YAAY,EAAE,aAAa,SAAS,QAAQ,SAAS,QAAQ,SAAS;AACxE;AAeA,eAAsB,mBACpB,QACA,UAAkC,CAAC,GACA;AACnC,QAAM,SAAS,QAAQ,UAAU;AAGjC,QAAM,SAAS,MAAM,iBAAiB,QAAQ,QAAQ,OAAO;AAG7D,QAAM,QAAQ,MAAM,gBAAgB,QAAQ,MAAM;AAElD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,YAAY;AAAA,EACd;AACF;AAKA,eAAe,iBACb,QACA,QACA,SACkC;AAClC,QAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOpB,QAAM,eAAe,MAAM,OAAO,OAA+B,aAAa,CAAC,MAAM,CAAC;AAEtF,QAAM,SAAkC,CAAC;AAEzC,aAAW,EAAE,WAAW,KAAK,cAAc;AAEzC,QAAI,QAAQ,iBAAiB,CAAC,QAAQ,cAAc,SAAS,UAAU,GAAG;AACxE;AAAA,IACF;AACA,QAAI,QAAQ,iBAAiB,QAAQ,cAAc,SAAS,UAAU,GAAG;AACvE;AAAA,IACF;AAEA,QAAI,WAAW,WAAW,GAAG,GAAG;AAC9B;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM,gBAAgB,QAAQ,QAAQ,YAAY,OAAO;AACvE,WAAO,KAAK,KAAK;AAAA,EACnB;AAEA,SAAO;AACT;AAKA,eAAe,gBACb,QACA,QACA,WACA,SACgC;AAEhC,QAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAcrB,QAAM,gBAAgB,MAAM,OAAO,OAShC,cAAc,CAAC,QAAQ,SAAS,CAAC;AAGpC,QAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOhB,QAAM,WAAW,MAAM,OAAO,OAAgC,SAAS;AAAA,IACrE,GAAG,MAAM,IAAI,SAAS;AAAA,EACxB,CAAC;AACD,QAAM,oBAAoB,IAAI,IAAI,SAAS,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC;AAGpE,QAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQpB,QAAM,eAAe,MAAM,OAAO,OAAgC,aAAa;AAAA,IAC7E,GAAG,MAAM,IAAI,SAAS;AAAA,EACxB,CAAC;AACD,QAAM,gBAAgB,IAAI,IAAI,aAAa,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC;AAGpE,QAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBhB,QAAM,WAAW,MAAM,OAAO,OAM3B,SAAS,CAAC,QAAQ,SAAS,CAAC;AAC/B,QAAM,cAAc,IAAI,IAAI,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,aAAa,EAAE,CAAC,CAAC;AAGtE,QAAM,UAAoC,cAAc,IAAI,CAAC,QAAQ;AACnE,UAAM,KAAK,YAAY,IAAI,IAAI,WAAW;AAC1C,UAAM,UAAU,IAAI,cAAc;AAClC,UAAM,SAAS,UAAU,IAAI,SAAS,QAAQ,MAAM,EAAE,IAAI,IAAI;AAE9D,WAAO;AAAA,MACL,MAAM,IAAI;AAAA,MACV,QAAQ,OAAO,YAAY;AAAA,MAC3B,UAAU,IAAI,gBAAgB;AAAA,MAC9B,YAAY,IAAI,mBAAmB;AAAA,MACnC,cAAc,IAAI,kBAAkB;AAAA,MACpC,cAAc,kBAAkB,IAAI,IAAI,WAAW;AAAA,MACnD,UAAU,cAAc,IAAI,IAAI,WAAW;AAAA,MAC3C,WAAW,IAAI,4BAA4B;AAAA,MAC3C,YAAY,KACR;AAAA,QACE,OAAO,GAAG;AAAA,QACV,QAAQ,GAAG;AAAA,QACX,UAAU,GAAG;AAAA,QACb,UAAU,GAAG;AAAA,MACf,IACA;AAAA,MACJ;AAAA,IACF;AAAA,EACF,CAAC;AAGD,QAAM,UAAmC,CAAC;AAC1C,MAAI,QAAQ,gBAAgB;AAC1B,UAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBnB,UAAM,cAAc,MAAM,OAAO,OAM9B,YAAY,CAAC,QAAQ,SAAS,CAAC;AAElC,eAAW,OAAO,aAAa;AAC7B,cAAQ,KAAK;AAAA,QACX,MAAM,IAAI;AAAA,QACV,SAAS,IAAI;AAAA,QACb,UAAU,IAAI;AAAA,QACd,MAAM,IAAI;AAAA,QACV,OAAO,IAAI,gBAAgB;AAAA,MAC7B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,YAAY,kBAAkB,OAAO,IAAI,MAAM,KAAK,iBAAiB,IAAI;AAAA,IACzE;AAAA,EACF;AACF;AAKA,eAAe,gBAAgB,QAAa,QAAiD;AAC3F,QAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUlB,QAAM,aAAa,MAAM,OAAO,OAG7B,WAAW,CAAC,MAAM,CAAC;AAEtB,SAAO,WAAW,IAAI,CAAC,OAAO;AAAA,IAC5B,MAAM,EAAE;AAAA,IACR,QAAQ,EAAE;AAAA,EACZ,EAAE;AACJ;AAoBO,SAAS,0BAA0B,QAAuC;AAC/E,QAAM,aAAoC,CAAC;AAG3C,QAAM,iBAAiB;AAEvB,MAAI;AACJ,UAAQ,QAAQ,eAAe,KAAK,MAAM,OAAO,MAAM;AACrD,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,CAAC,KAAM;AAEX,UAAM,gBAAgB,MAAM,CAAC,GAAG,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAC9E,UAAM,OAAO,MAAM,CAAC,KAAK;AAGzB,UAAM,aAAa,yBAAyB,IAAI;AAGhD,UAAM,eAAe,OAAO,MAAM,GAAG,MAAM,KAAK,EAAE,MAAM,wBAAwB;AAEhF,eAAW,KAAK;AAAA,MACd;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT,SAAS,eAAe,CAAC;AAAA,IAC3B,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAKA,SAAS,yBAAyB,MAAoC;AACpE,QAAM,aAAmC,CAAC;AAG1C,QAAM,YAAY;AAElB,MAAI;AACJ,UAAQ,QAAQ,UAAU,KAAK,IAAI,OAAO,MAAM;AAC9C,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,WAAW,CAAC,CAAC,MAAM,CAAC;AAC1B,UAAM,OAAO,MAAM,CAAC,GAAG,KAAK,KAAK;AAEjC,QAAI,CAAC,KAAM;AAGX,UAAM,eAAe,KAAK,MAAM,GAAG,MAAM,KAAK,EAAE,MAAM,wBAAwB;AAE9E,eAAW,KAAK;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,eAAe,CAAC;AAAA,IAC3B,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAYO,SAAS,0BACd,YACA,UAAkC,CAAC,GACV;AACzB,SAAO,WAAW,IAAI,CAAC,UAAU,wBAAwB,OAAO,OAAO,CAAC;AAC1E;AAKA,SAAS,wBACP,OACA,SACuB;AACvB,QAAM,YAAY,iBAAiB,MAAM,MAAM,OAAO;AAEtD,QAAM,UAAoC,MAAM,WAAW,IAAI,CAAC,SAAS;AACvE,UAAM,aAAa,kBAAkB,KAAK,MAAM,OAAO;AACvD,UAAM,aAAa,gBAAgB,IAAI;AAEvC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ,WAAW;AAAA,MACnB,UAAU,KAAK,YAAY,KAAK,KAAK,SAAS,MAAM;AAAA,MACpD,YAAY,sBAAsB,KAAK,MAAM,KAAK,IAAI;AAAA,MACtD,cAAc,gBAAgB,KAAK,MAAM,KAAK,IAAI;AAAA,MAClD,cAAc,WAAW,KAAK,IAAI;AAAA,MAClC,UAAU;AAAA,MACV,SAAS,KAAK,KAAK,SAAS,IAAI;AAAA,IAClC;AAAA,EACF,CAAC;AAGD,QAAM,WAAW,QAAQ,KAAK,CAAC,MAAM,WAAW,EAAE,IAAI,CAAC;AACvD,MAAI,UAAU;AACZ,aAAS,eAAe;AAAA,EAC1B;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,QAAQ,UAAU;AAAA,IAC1B;AAAA,IACA,SAAS,CAAC;AAAA,EACZ;AACF;AAKA,SAAS,gBAAgB,MAAmE;AAC1F,QAAM,OAAO,KAAK,KAAK,QAAQ,oBAAoB,EAAE,EAAE,QAAQ,yBAAyB,EAAE;AAG1F,MAAI,KAAK,SAAS,IAAI,GAAG;AACvB,UAAM,WAAW,KAAK,MAAM,GAAG,EAAE;AACjC,UAAM,cAAc,kBAAkB,QAAQ;AAC9C,QAAI,aAAa;AACf,aAAO,EAAE,QAAQ,GAAG,YAAY,WAAW,MAAM,aAAa,YAAY,YAAY;AAAA,IACxF;AACA,WAAO,EAAE,QAAQ,SAAS,aAAa,QAAQ;AAAA,EACjD;AAGA,QAAM,YAAY,KAAK,KAAK,YAAY;AAGxC,MAAI,cAAc,QAAQ,UAAU,SAAS,IAAI,KAAK,UAAU,SAAS,KAAK,GAAG;AAC/E,QAAI,SAAS,UAAU;AACrB,aAAO,EAAE,QAAQ,QAAQ,aAAa,OAAO;AAAA,IAC/C;AAAA,EACF;AAGA,MACE,UAAU,SAAS,SAAS,KAC5B,UAAU,SAAS,SAAS,KAC5B,UAAU,SAAS,SAAS,KAC5B,UAAU,SAAS,KAAK,KACxB,UAAU,SAAS,IAAI,GACvB;AACA,QAAI,SAAS,UAAU,SAAS,UAAU;AACxC,aAAO,EAAE,QAAQ,aAAa,aAAa,YAAY;AAAA,IACzD;AAAA,EACF;AAGA,MAAI,cAAc,WAAW,UAAU,SAAS,OAAO,GAAG;AACxD,WAAO,EAAE,QAAQ,QAAQ,aAAa,OAAO;AAAA,EAC/C;AAGA,QAAM,UAAU,kBAAkB,IAAI;AACtC,MAAI,SAAS;AACX,WAAO,EAAE,QAAQ,QAAQ,aAAa,aAAa,QAAQ,YAAY;AAAA,EACzE;AAGA,SAAO,EAAE,QAAQ,SAAS,aAAa,QAAQ;AACjD;AAgBO,SAAS,sBACd,QACA,UAAkC,CAAC,GAC3B;AACR,QAAM,QAAkB,CAAC;AACzB,QAAM,UAAU,oBAAI,IAAY;AAGhC,UAAQ,IAAI,SAAS;AAGrB,aAAW,SAAS,OAAO,QAAQ;AACjC,eAAW,OAAO,MAAM,SAAS;AAC/B,YAAM,cAAc,eAAe,GAAG;AACtC,cAAQ,IAAI,YAAY,MAAM;AAAA,IAChC;AAAA,EACF;AAGA,MAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,YAAQ,IAAI,QAAQ;AAAA,EACtB;AAGA,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,kCAAkC;AAC7C,QAAM,KAAK,qBAAoB,oBAAI,KAAK,GAAE,YAAY,CAAC,EAAE;AACzD,QAAM,KAAK,IAAI;AACf,QAAM,KAAK,mBAAmB;AAC9B,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,EAAE;AAGb,QAAM,KAAK,YAAY,MAAM,KAAK,OAAO,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC,+BAA+B;AAE3F,MAAI,QAAQ,kBAAkB;AAC5B,UAAM,KAAK,yCAAyC;AAAA,EACtD;AAEA,QAAM,KAAK,EAAE;AAGb,aAAW,WAAW,OAAO,OAAO;AAClC,UAAM,KAAK,iBAAiB,OAAO,CAAC;AACpC,UAAM,KAAK,EAAE;AAAA,EACf;AAGA,aAAW,SAAS,OAAO,QAAQ;AACjC,UAAM,KAAK,kBAAkB,OAAO,QAAQ,OAAO,CAAC;AACpD,UAAM,KAAK,EAAE;AAAA,EACf;AAGA,MAAI,QAAQ,kBAAkB;AAC5B,UAAM,eAAe,sBAAsB,OAAO,MAAM;AACxD,QAAI,cAAc;AAChB,YAAM,KAAK,YAAY;AAAA,IACzB;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAKA,SAAS,iBAAiB,SAAuC;AAC/D,QAAM,UAAU,YAAY,QAAQ,IAAI;AACxC,QAAM,SAAS,QAAQ,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI;AAC5D,SAAO,gBAAgB,OAAO,kBAAkB,QAAQ,IAAI,OAAO,MAAM;AAC3E;AAKA,SAAS,kBACP,OACA,QACA,SACQ;AACR,QAAM,QAAkB,CAAC;AACzB,QAAM,UAAU,YAAY,MAAM,IAAI;AAEtC,QAAM,KAAK,gBAAgB,OAAO,eAAe,MAAM,IAAI,MAAM;AAEjE,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,QAAQ,KAAK;AAC7C,UAAM,MAAM,MAAM,QAAQ,CAAC;AAC3B,QAAI,CAAC,IAAK;AAEV,UAAM,SAAS,MAAM,MAAM,QAAQ,SAAS;AAC5C,UAAM,UAAU,mBAAmB,KAAK,OAAO,KAAK;AACpD,UAAM,KAAK,KAAK,OAAO,GAAG,SAAS,KAAK,GAAG,EAAE;AAAA,EAC/C;AAGA,MAAI,MAAM,cAAc,MAAM,WAAW,SAAS,GAAG;AACnD,UAAM,KAAK,kBAAkB;AAC7B,UAAM,KAAK,gCAAgC,MAAM,WAAW,IAAI,CAAC,MAAM,SAAS,YAAY,CAAC,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,OAAO;AACnH,UAAM,KAAK,IAAI;AAAA,EACjB,WAAW,QAAQ,kBAAkB,MAAM,QAAQ,SAAS,GAAG;AAC7D,UAAM,KAAK,kBAAkB;AAC7B,eAAW,OAAO,MAAM,SAAS;AAC/B,YAAM,UAAU,YAAY,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC;AAC/E,YAAM,UAAU,IAAI,QAAQ,IAAI,CAAC,MAAM,SAAS,YAAY,CAAC,CAAC,EAAE,EAAE,KAAK,IAAI;AAC3E,UAAI,IAAI,UAAU;AAChB,cAAM,KAAK,KAAK,OAAO,kBAAkB,IAAI,IAAI,SAAS,OAAO,IAAI;AAAA,MACvE,OAAO;AACL,cAAM,KAAK,KAAK,OAAO,YAAY,IAAI,IAAI,SAAS,OAAO,IAAI;AAAA,MACjE;AAAA,IACF;AACA,UAAM,KAAK,IAAI;AAAA,EACjB,OAAO;AACL,UAAM,KAAK,IAAI;AAAA,EACjB;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAKA,SAAS,mBAAmB,KAA6B,OAAuC;AAC9F,QAAM,UAAU,YAAY,IAAI,IAAI;AACpC,QAAM,cAAc,eAAe,GAAG;AAGtC,QAAM,UAAU,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI,MAAM;AAEvD,MAAI;AAEJ,MAAI,SAAS;AAEX,UAAM,cAAc,YAAY,QAAQ,IAAI;AAC5C,WAAO,GAAG,OAAO,KAAK,WAAW,SAAS,IAAI,IAAI;AAAA,EACpD,WAAW,IAAI,cAAc,YAAY,gBAAgB,aAAa,YAAY,gBAAgB,SAAS;AAEzG,WAAO,GAAG,OAAO,KAAK,YAAY,WAAW,KAAK,IAAI,IAAI,gBAAgB,IAAI,SAAS;AAAA,EACzF,WAAW,YAAY,gBAAgB,aAAa;AAElD,WAAO,GAAG,OAAO,KAAK,YAAY,WAAW,KAAK,IAAI,IAAI;AAAA,EAC5D,WAAW,IAAI,SAAS;AAEtB,WAAO,GAAG,OAAO,KAAK,YAAY,WAAW,KAAK,IAAI,IAAI;AAAA,EAC5D,OAAO;AAEL,WAAO,GAAG,OAAO,KAAK,YAAY,WAAW,KAAK,IAAI,IAAI;AAAA,EAC5D;AAGA,MAAI,IAAI,cAAc;AACpB,YAAQ;AAAA,EACV;AACA,MAAI,CAAC,IAAI,YAAY,CAAC,IAAI,cAAc;AACtC,YAAQ;AAAA,EACV;AACA,MAAI,IAAI,UAAU;AAChB,YAAQ;AAAA,EACV;AACA,MAAI,IAAI,cAAc,IAAI,cAAc;AACtC,YAAQ,oBAAoB,GAAG;AAAA,EACjC;AACA,MAAI,IAAI,YAAY;AAClB,UAAM,WAAW,YAAY,IAAI,WAAW,KAAK;AACjD,UAAM,SAAS,YAAY,IAAI,WAAW,MAAM;AAChD,YAAQ,qBAAqB,QAAQ,IAAI,MAAM;AAC/C,QAAI,IAAI,WAAW,YAAY,IAAI,WAAW,aAAa,aAAa;AACtE,cAAQ,kBAAkB,IAAI,WAAW,SAAS,YAAY,CAAC;AAAA,IACjE;AACA,YAAQ;AAAA,EACV;AAEA,SAAO;AACT;AAKA,SAAS,oBAAoB,KAAqC;AAChE,MAAI,CAAC,IAAI,aAAc,QAAO;AAE9B,QAAM,MAAM,IAAI,aAAa,YAAY;AAGzC,MAAI,QAAQ,WAAW,QAAQ,qBAAqB;AAClD,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,uBAAuB,QAAQ,sBAAsB;AAC/D,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,UAAU,QAAQ,SAAS;AACrC,WAAO,YAAY,GAAG;AAAA,EACxB;AACA,MAAI,UAAU,KAAK,GAAG,GAAG;AACvB,WAAO,YAAY,GAAG;AAAA,EACxB;AACA,MAAI,UAAU,KAAK,IAAI,YAAY,GAAG;AACpC,UAAM,QAAQ,IAAI,aAAa,MAAM,YAAY;AACjD,QAAI,OAAO;AACT,aAAO,aAAa,MAAM,CAAC,CAAC;AAAA,IAC9B;AAAA,EACF;AAGA,SAAO;AACT;AAKA,SAAS,sBAAsB,QAAyC;AACtE,QAAM,QAAkB,CAAC;AAGzB,QAAM,gBAAqG,oBAAI,IAAI;AAEnH,aAAW,SAAS,QAAQ;AAC1B,eAAW,OAAO,MAAM,SAAS;AAC/B,UAAI,IAAI,YAAY;AAClB,cAAM,MAAM,MAAM;AAClB,YAAI,CAAC,cAAc,IAAI,GAAG,GAAG;AAC3B,wBAAc,IAAI,KAAK,CAAC,CAAC;AAAA,QAC3B;AACA,sBAAc,IAAI,GAAG,EAAG,KAAK;AAAA,UAC3B,MAAM,MAAM;AAAA,UACZ,IAAI,IAAI,WAAW;AAAA,UACnB,QAAQ,IAAI;AAAA,UACZ,WAAW,IAAI,WAAW;AAAA,QAC5B,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,aAAW,CAAC,WAAW,IAAI,KAAK,eAAe;AAC7C,UAAM,UAAU,YAAY,SAAS;AACrC,UAAM,KAAK,gBAAgB,OAAO,yBAAyB,OAAO,yBAAyB;AAE3F,eAAW,OAAO,MAAM;AACtB,YAAM,aAAa,YAAY,IAAI,EAAE;AACrC,YAAM,YAAY,IAAI,OAAO,QAAQ,QAAQ,EAAE,EAAE,QAAQ,OAAO,EAAE;AAClE,YAAM,KAAK,KAAK,YAAY,SAAS,CAAC,SAAS,UAAU,KAAK;AAC9D,YAAM,KAAK,gBAAgB,OAAO,IAAI,YAAY,IAAI,MAAM,CAAC,IAAI;AACjE,YAAM,KAAK,oBAAoB,UAAU,IAAI,YAAY,IAAI,SAAS,CAAC,IAAI;AAC3E,YAAM,KAAK,OAAO;AAAA,IACpB;AAEA,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,EAAE;AAAA,EACf;AAGA,aAAW,SAAS,QAAQ;AAC1B,UAAM,eAAe,MAAM,KAAK,cAAc,OAAO,CAAC,EACnD,KAAK,EACL,OAAO,CAAC,MAAM,EAAE,OAAO,MAAM,IAAI;AAEpC,QAAI,aAAa,SAAS,GAAG;AAC3B,YAAM,UAAU,YAAY,MAAM,IAAI;AACtC,YAAM,mBAAmB,cAAc,IAAI,MAAM,IAAI;AAErD,UAAI,CAAC,kBAAkB;AACrB,cAAM,KAAK,gBAAgB,OAAO,yBAAyB,OAAO,oBAAoB;AACtF,mBAAW,OAAO,cAAc;AAC9B,gBAAM,aAAa,YAAY,IAAI,IAAI;AACvC,gBAAM,aAAa,UAAU,IAAI,IAAI;AACrC,gBAAM,KAAK,KAAK,YAAY,UAAU,CAAC,UAAU,UAAU,IAAI;AAAA,QACjE;AACA,cAAM,KAAK,KAAK;AAChB,cAAM,KAAK,EAAE;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AASA,SAAS,eAAe,KAAgD;AACtE,QAAM,SAAS,IAAI,OAAO,YAAY;AAGtC,QAAM,UAAU,kBAAkB,MAAM;AACxC,MAAI,SAAS;AACX,WAAO;AAAA,EACT;AAGA,MAAI,OAAO,WAAW,mBAAmB,KAAK,OAAO,WAAW,SAAS,GAAG;AAC1E,WAAO,kBAAkB,SAAS;AAAA,EACpC;AAGA,MAAI,OAAO,WAAW,SAAS,KAAK,OAAO,WAAW,SAAS,GAAG;AAChE,WAAO,kBAAkB,SAAS;AAAA,EACpC;AAGA,SAAO,EAAE,aAAa,QAAQ,QAAQ,QAAQ,QAAQ,SAAS;AACjE;AAKA,SAAS,YAAY,KAAqB;AACxC,SAAO,IACJ,QAAQ,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,EAC1C,QAAQ,gBAAgB,CAAC,GAAG,MAAM,EAAE,YAAY,CAAC;AACtD;AAKA,SAAS,iBAAiB,MAAc,SAAyC;AAC/E,MAAI,SAAS;AAGb,WAAS,OACN,QAAQ,mBAAmB,OAAO,EAClC,YAAY;AAGf,MAAI,CAAC,QAAQ,oBAAoB;AAC/B,aAAS,UAAU,MAAM;AAAA,EAC3B;AAEA,SAAO;AACT;AAKA,SAAS,kBAAkB,MAAc,SAAyC;AAChF,MAAI,QAAQ,iBAAiB,cAAc;AACzC,WAAO,KACJ,QAAQ,mBAAmB,OAAO,EAClC,YAAY;AAAA,EACjB;AACA,SAAO;AACT;AAKA,SAAS,WAAW,MAAuB;AACzC,QAAM,QAAQ,KAAK,YAAY;AAC/B,SAAO,UAAU,QAAQ,UAAU;AACrC;AAKA,SAAS,sBAAsB,MAAc,MAAuB;AAClE,QAAM,QAAQ,KAAK,YAAY;AAG/B,MAAI,WAAW,IAAI,KAAK,SAAS,UAAU;AACzC,WAAO;AAAA,EACT;AAGA,OACG,MAAM,SAAS,SAAS,KAAK,UAAU,gBAAgB,UAAU,iBACjE,SAAS,UAAU,SAAS,WAC7B;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAKA,SAAS,gBAAgB,MAAc,MAAkC;AACvE,QAAM,QAAQ,KAAK,YAAY;AAE/B,MAAI,WAAW,IAAI,KAAK,SAAS,UAAU;AACzC,WAAO;AAAA,EACT;AAEA,OACG,MAAM,SAAS,SAAS,KAAK,UAAU,gBAAgB,UAAU,iBACjE,SAAS,UAAU,SAAS,WAC7B;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAKA,SAAS,UAAU,MAAsB;AACvC,MAAI,KAAK,SAAS,GAAG,KAAK,CAAC,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI,EAAE,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,GAAG;AACvF,WAAO,KAAK,MAAM,GAAG,EAAE,IAAI;AAAA,EAC7B;AACA,MAAI,KAAK,SAAS,GAAG,KAAK,KAAK,SAAS,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,IAAI,GAAG;AAC1F,WAAO,OAAO;AAAA,EAChB;AACA,SAAO,OAAO;AAChB;AAuBO,SAAS,6BACd,QACA,UAAkC,CAAC,GAC3B;AACR,QAAM,aAAa,0BAA0B,MAAM;AACnD,QAAM,SAAS,0BAA0B,YAAY,OAAO;AAE5D,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA,OAAO,CAAC;AAAA,MACR,YAAY,QAAQ,UAAU;AAAA,IAChC;AAAA,IACA;AAAA,EACF;AACF;AAeA,eAAsB,2BACpB,QACA,UAAkC,CAAC,GAClB;AACjB,QAAM,SAAS,MAAM,mBAAmB,QAAQ,OAAO;AACvD,SAAO,sBAAsB,QAAQ,OAAO;AAC9C;AAUA,eAAsB,wBACpB,QACA,UAAkC,CAAC,GACS;AAC5C,QAAM,WAAW,MAAM,mBAAmB,QAAQ,OAAO;AACzD,QAAM,aAAa,sBAAsB,UAAU,OAAO;AAC1D,QAAM,YAAY,wBAAwB,QAAQ;AAElD,SAAO,EAAE,QAAQ,YAAY,OAAO,UAAU;AAChD;AAKA,SAAS,wBAAwB,QAA0C;AACzE,QAAM,QAAkB,CAAC;AAEzB,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,oCAAoC;AAC/C,QAAM,KAAK,qBAAoB,oBAAI,KAAK,GAAE,YAAY,CAAC,EAAE;AACzD,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,EAAE;AAGb,aAAW,WAAW,OAAO,OAAO;AAClC,UAAM,WAAW,aAAa,QAAQ,IAAI;AAC1C,UAAM,SAAS,QAAQ,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,KAAK;AAC7D,UAAM,KAAK,eAAe,QAAQ,MAAM,MAAM,EAAE;AAChD,UAAM,KAAK,EAAE;AAAA,EACf;AAGA,aAAW,SAAS,OAAO,QAAQ;AACjC,UAAM,WAAW,aAAa,MAAM,IAAI;AACxC,UAAM,KAAK,oBAAoB,QAAQ,IAAI;AAE3C,eAAW,OAAO,MAAM,SAAS;AAC/B,YAAM,WAAW,YAAY,IAAI,IAAI;AACrC,YAAM,cAAc,eAAe,GAAG;AACtC,YAAM,WAAW,IAAI,WAAW,YAAY;AAC5C,YAAM,KAAK,KAAK,QAAQ,KAAK,YAAY,MAAM,GAAG,QAAQ,EAAE;AAAA,IAC9D;AAEA,UAAM,KAAK,GAAG;AACd,UAAM,KAAK,EAAE;AAGb,UAAM,KAAK,oBAAoB,QAAQ,UAAU;AAEjD,eAAW,OAAO,MAAM,SAAS;AAC/B,YAAM,WAAW,YAAY,IAAI,IAAI;AACrC,YAAM,cAAc,eAAe,GAAG;AACtC,YAAM,WAAW,IAAI,cAAc,IAAI,WAAW,MAAM;AACxD,YAAM,WAAW,IAAI,WAAW,YAAY;AAC5C,YAAM,KAAK,KAAK,QAAQ,GAAG,QAAQ,KAAK,YAAY,MAAM,GAAG,QAAQ,EAAE;AAAA,IACzE;AAEA,UAAM,KAAK,GAAG;AACd,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAKA,SAAS,aAAa,KAAqB;AACzC,SAAO,IACJ,QAAQ,gBAAgB,CAAC,GAAG,MAAM,EAAE,YAAY,CAAC,EACjD,QAAQ,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC;AAC/C;;;AC5hCA,eAAsB,eACpB,cACA,cACA,UAAsD,CAAC,GAClC;AACrB,QAAM,eAAe,MAAM,mBAAmB,cAAc,OAAO;AACnE,QAAM,eAAe,MAAM,mBAAmB,cAAc,OAAO;AACnE,SAAO,YAAY,cAAc,cAAc,OAAO;AACxD;AAWA,eAAsB,wBACpB,QACA,cACA,UAAsD,CAAC,GAClC;AACrB,QAAM,eAAe,MAAM,mBAAmB,QAAQ,OAAO;AAC7D,SAAO,YAAY,cAAc,cAAc,OAAO;AACxD;AAWO,SAAS,YACd,QACA,QACA,UAA6B,CAAC,GAClB;AACZ,QAAM,eAA8B,CAAC;AACrC,QAAM,cAA4B,CAAC;AAGnC,QAAM,eAAe,IAAI;AAAA,IACvB,OAAO,OACJ,OAAO,OAAK,YAAY,EAAE,MAAM,OAAO,CAAC,EACxC,IAAI,OAAK,CAAC,oBAAoB,EAAE,MAAM,OAAO,GAAG,CAAC,CAAC;AAAA,EACvD;AACA,QAAM,eAAe,IAAI;AAAA,IACvB,OAAO,OACJ,OAAO,OAAK,YAAY,EAAE,MAAM,OAAO,CAAC,EACxC,IAAI,OAAK,CAAC,oBAAoB,EAAE,MAAM,OAAO,GAAG,CAAC,CAAC;AAAA,EACvD;AAEA,QAAM,cAAc,IAAI,IAAI,OAAO,MAAM,IAAI,OAAK,CAAC,oBAAoB,EAAE,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC;AAC5F,QAAM,cAAc,IAAI,IAAI,OAAO,MAAM,IAAI,OAAK,CAAC,oBAAoB,EAAE,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC;AAG5F,aAAW,CAAC,MAAM,WAAW,KAAK,cAAc;AAC9C,UAAM,cAAc,aAAa,IAAI,IAAI;AACzC,QAAI,CAAC,aAAa;AAEhB,mBAAa,KAAK;AAAA,QAChB,YAAY;AAAA,QACZ,WAAW,YAAY;AAAA,QACvB,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,OAAO;AAEL,YAAM,OAAO,WAAW,aAAa,aAAa,OAAO;AACzD,UAAI,MAAM;AACR,qBAAa,KAAK,IAAI;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,aAAW,CAAC,MAAM,WAAW,KAAK,cAAc;AAC9C,QAAI,CAAC,aAAa,IAAI,IAAI,GAAG;AAE3B,mBAAa,KAAK;AAAA,QAChB,YAAY;AAAA,QACZ,WAAW,YAAY;AAAA,QACvB,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AAGA,aAAW,CAAC,MAAM,UAAU,KAAK,aAAa;AAC5C,UAAM,aAAa,YAAY,IAAI,IAAI;AACvC,QAAI,CAAC,YAAY;AACf,kBAAY,KAAK;AAAA,QACf,YAAY;AAAA,QACZ,UAAU,WAAW;AAAA,QACrB,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,OAAO;AACL,YAAM,OAAO,UAAU,YAAY,UAAU;AAC7C,UAAI,MAAM;AACR,oBAAY,KAAK,IAAI;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAEA,aAAW,CAAC,MAAM,UAAU,KAAK,aAAa;AAC5C,QAAI,CAAC,YAAY,IAAI,IAAI,GAAG;AAC1B,kBAAY,KAAK;AAAA,QACf,YAAY;AAAA,QACZ,UAAU,WAAW;AAAA,QACrB,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,UAAU;AAAA,IACd,aAAa,aAAa,OAAO,OAAK,EAAE,eAAe,OAAO,EAAE;AAAA,IAChE,eAAe,aAAa,OAAO,OAAK,EAAE,eAAe,SAAS,EAAE;AAAA,IACpE,gBAAgB,aAAa,OAAO,OAAK,EAAE,eAAe,UAAU,EAAE;AAAA,IACtE,cAAc,aAAa,OAAO,CAAC,KAAK,MACtC,OAAO,EAAE,eAAe,OAAO,OAAK,EAAE,eAAe,OAAO,EAAE,UAAU,IAAI,CAAC;AAAA,IAC/E,gBAAgB,aAAa,OAAO,CAAC,KAAK,MACxC,OAAO,EAAE,eAAe,OAAO,OAAK,EAAE,eAAe,SAAS,EAAE,UAAU,IAAI,CAAC;AAAA,IACjF,iBAAiB,aAAa,OAAO,CAAC,KAAK,MACzC,OAAO,EAAE,eAAe,OAAO,OAAK,EAAE,eAAe,UAAU,EAAE,UAAU,IAAI,CAAC;AAAA,IAClF,cAAc,aAAa,OAAO,CAAC,KAAK,MACtC,OAAO,EAAE,cAAc,OAAO,OAAK,EAAE,eAAe,OAAO,EAAE,UAAU,IAAI,CAAC;AAAA,IAC9E,gBAAgB,aAAa,OAAO,CAAC,KAAK,MACxC,OAAO,EAAE,cAAc,OAAO,OAAK,EAAE,eAAe,SAAS,EAAE,UAAU,IAAI,CAAC;AAAA,IAChF,YAAY,YAAY,OAAO,OAAK,EAAE,eAAe,OAAO,EAAE;AAAA,IAC9D,cAAc,YAAY,OAAO,OAAK,EAAE,eAAe,SAAS,EAAE;AAAA,IAClE,eAAe,YAAY,OAAO,OAAK,EAAE,eAAe,UAAU,EAAE;AAAA,EACtE;AAEA,QAAM,cAAc,aAAa,WAAW,KAAK,YAAY,WAAW;AAExE,SAAO;AAAA,IACL,cAAc,OAAO;AAAA,IACrB,cAAc,OAAO;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAKA,SAAS,WACP,QACA,QACA,SACoB;AACpB,QAAM,gBAAgC,CAAC;AACvC,QAAM,eAA8B,CAAC;AAGrC,QAAM,gBAAgB,IAAI;AAAA,IACxB,OAAO,QAAQ,IAAI,OAAK,CAAC,oBAAoB,EAAE,MAAM,OAAO,GAAG,CAAC,CAAC;AAAA,EACnE;AACA,QAAM,gBAAgB,IAAI;AAAA,IACxB,OAAO,QAAQ,IAAI,OAAK,CAAC,oBAAoB,EAAE,MAAM,OAAO,GAAG,CAAC,CAAC;AAAA,EACnE;AAGA,aAAW,CAAC,MAAM,SAAS,KAAK,eAAe;AAC7C,UAAM,YAAY,cAAc,IAAI,IAAI;AACxC,QAAI,CAAC,WAAW;AACd,oBAAc,KAAK;AAAA,QACjB,YAAY;AAAA,QACZ,YAAY,UAAU;AAAA,QACtB,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,OAAO;AACL,YAAM,UAAU,YAAY,WAAW,WAAW,OAAO;AACzD,UAAI,SAAS;AACX,sBAAc,KAAK,OAAO;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAEA,aAAW,CAAC,MAAM,SAAS,KAAK,eAAe;AAC7C,QAAI,CAAC,cAAc,IAAI,IAAI,GAAG;AAC5B,oBAAc,KAAK;AAAA,QACjB,YAAY;AAAA,QACZ,YAAY,UAAU;AAAA,QACtB,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AAGA,MAAI,QAAQ,mBAAmB,OAAO;AACpC,UAAM,gBAAgB,IAAI;AAAA,MACxB,OAAO,QAAQ,IAAI,OAAK,CAAC,oBAAoB,EAAE,MAAM,OAAO,GAAG,CAAC,CAAC;AAAA,IACnE;AACA,UAAM,gBAAgB,IAAI;AAAA,MACxB,OAAO,QAAQ,IAAI,OAAK,CAAC,oBAAoB,EAAE,MAAM,OAAO,GAAG,CAAC,CAAC;AAAA,IACnE;AAEA,eAAW,CAAC,MAAM,SAAS,KAAK,eAAe;AAC7C,YAAM,YAAY,cAAc,IAAI,IAAI;AACxC,UAAI,CAAC,WAAW;AACd,qBAAa,KAAK;AAAA,UAChB,YAAY;AAAA,UACZ,WAAW,UAAU;AAAA,UACrB,QAAQ;AAAA,QACV,CAAC;AAAA,MACH,WAAW,CAAC,aAAa,WAAW,SAAS,GAAG;AAC9C,qBAAa,KAAK;AAAA,UAChB,YAAY;AAAA,UACZ,WAAW,UAAU;AAAA,UACrB,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AAEA,eAAW,CAAC,MAAM,SAAS,KAAK,eAAe;AAC7C,UAAI,CAAC,cAAc,IAAI,IAAI,GAAG;AAC5B,qBAAa,KAAK;AAAA,UAChB,YAAY;AAAA,UACZ,WAAW,UAAU;AAAA,UACrB,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,MAAI;AACJ,QAAM,WAAW,OAAO,cAAc,OAAO,QAAQ,OAAO,OAAK,EAAE,YAAY,EAAE,IAAI,OAAK,EAAE,IAAI;AAChG,QAAM,WAAW,OAAO,cAAc,OAAO,QAAQ,OAAO,OAAK,EAAE,YAAY,EAAE,IAAI,OAAK,EAAE,IAAI;AAEhG,MAAI,CAAC,YAAY,UAAU,QAAQ,GAAG;AACpC,uBAAmB,EAAE,QAAQ,UAAU,QAAQ,SAAS;AAAA,EAC1D;AAGA,MAAI,cAAc,WAAW,KAAK,aAAa,WAAW,KAAK,CAAC,kBAAkB;AAChF,WAAO;AAAA,EACT;AAEA,QAAM,SAAsB;AAAA,IAC1B,YAAY;AAAA,IACZ,WAAW,OAAO;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,kBAAkB;AACpB,WAAO,mBAAmB;AAAA,EAC5B;AACA,SAAO;AACT;AAKA,SAAS,YACP,QACA,QACA,SACqB;AACrB,QAAM,mBAA4C,CAAC;AAGnD,MAAI,cAAc,OAAO,MAAM,MAAM,cAAc,OAAO,MAAM,GAAG;AACjE,qBAAiB,KAAK;AAAA,MACpB,WAAW;AAAA,MACX,aAAa,OAAO;AAAA,MACpB,aAAa,OAAO;AAAA,IACtB,CAAC;AAAA,EACH;AAGA,MAAI,OAAO,aAAa,OAAO,UAAU;AACvC,qBAAiB,KAAK;AAAA,MACpB,WAAW;AAAA,MACX,aAAa,OAAO;AAAA,MACpB,aAAa,OAAO;AAAA,IACtB,CAAC;AAAA,EACH;AAGA,QAAM,gBAAgB,iBAAiB,OAAO,cAAc,OAAO;AACnE,QAAM,gBAAgB,iBAAiB,OAAO,cAAc,OAAO;AACnE,MAAI,kBAAkB,eAAe;AACnC,qBAAiB,KAAK;AAAA,MACpB,WAAW;AAAA,MACX,aAAa,OAAO;AAAA,MACpB,aAAa,OAAO;AAAA,IACtB,CAAC;AAAA,EACH;AAGA,MAAI,OAAO,cAAc,OAAO,WAAW;AACzC,qBAAiB,KAAK;AAAA,MACpB,WAAW;AAAA,MACX,aAAa,OAAO;AAAA,MACpB,aAAa,OAAO;AAAA,IACtB,CAAC;AAAA,EACH;AAGA,MAAI,OAAO,aAAa,OAAO,UAAU;AACvC,qBAAiB,KAAK;AAAA,MACpB,WAAW;AAAA,MACX,aAAa,OAAO;AAAA,MACpB,aAAa,OAAO;AAAA,IACtB,CAAC;AAAA,EACH;AAGA,MAAI,CAAC,gBAAgB,OAAO,YAAY,OAAO,UAAU,GAAG;AAC1D,qBAAiB,KAAK;AAAA,MACpB,WAAW;AAAA,MACX,aAAa,OAAO;AAAA,MACpB,aAAa,OAAO;AAAA,IACtB,CAAC;AAAA,EACH;AAEA,MAAI,iBAAiB,WAAW,GAAG;AACjC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,YAAY,OAAO;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAKA,SAAS,UAAU,QAA8B,QAAiD;AAChG,QAAM,eAAe,IAAI,IAAI,OAAO,MAAM;AAC1C,QAAM,eAAe,IAAI,IAAI,OAAO,MAAM;AAE1C,QAAM,cAAc,OAAO,OAAO,OAAO,OAAK,CAAC,aAAa,IAAI,CAAC,CAAC;AAClE,QAAM,gBAAgB,OAAO,OAAO,OAAO,OAAK,CAAC,aAAa,IAAI,CAAC,CAAC;AAEpE,MAAI,YAAY,WAAW,KAAK,cAAc,WAAW,GAAG;AAC1D,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,UAAU,OAAO;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAmBO,SAAS,qBACd,MACA,UAA+B,CAAC,GACZ;AACpB,QAAM,KAAe,CAAC;AACtB,QAAM,OAAiB,CAAC;AACxB,QAAM,WAAqB,CAAC;AAC5B,MAAI,eAAe;AAEnB,QAAM,SAAS,QAAQ,UAAU,KAAK;AACtC,QAAM,eAAe,UAAU,WAAW,WAAW,IAAI,MAAM,OAAO;AACtE,QAAM,WAAW,QAAQ,WAAW,eAAe;AAGnD,aAAW,cAAc,KAAK,aAAa;AACzC,QAAI,WAAW,eAAe,WAAW,WAAW,QAAQ;AAC1D,YAAM,SAAS,WAAW,OAAO,OAAO,IAAI,OAAK,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI;AACpE,SAAG,KAAK,eAAe,YAAY,IAAI,WAAW,QAAQ,cAAc,MAAM,IAAI;AAClF,WAAK,KAAK,aAAa,QAAQ,GAAG,YAAY,IAAI,WAAW,QAAQ,IAAI;AAAA,IAC3E,WAAW,WAAW,eAAe,aAAa,WAAW,QAAQ;AACnE,SAAG,KAAK,aAAa,QAAQ,GAAG,YAAY,IAAI,WAAW,QAAQ,IAAI;AACvE,YAAM,SAAS,WAAW,OAAO,OAAO,IAAI,OAAK,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI;AACpE,WAAK,KAAK,eAAe,YAAY,IAAI,WAAW,QAAQ,cAAc,MAAM,IAAI;AAAA,IACtF,WAAW,WAAW,eAAe,YAAY;AAE/C,UAAI,WAAW,eAAe,WAAW,YAAY,SAAS,GAAG;AAC/D,mBAAW,SAAS,WAAW,aAAa;AAC1C,aAAG,KAAK,cAAc,YAAY,IAAI,WAAW,QAAQ,gBAAgB,KAAK,IAAI;AAAA,QACpF;AAAA,MACF;AACA,UAAI,WAAW,iBAAiB,WAAW,cAAc,SAAS,GAAG;AACnE,iBAAS,KAAK,mCAAmC,WAAW,QAAQ,MAAM,WAAW,cAAc,KAAK,IAAI,CAAC,sCAAsC;AACnJ,uBAAe;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAGA,aAAW,eAAe,KAAK,cAAc;AAC3C,QAAI,YAAY,eAAe,WAAW,YAAY,QAAQ;AAC5D,YAAM,YAAY,uBAAuB,YAAY,QAAQ,cAAc,OAAO;AAClF,SAAG,KAAK,SAAS;AACjB,WAAK,KAAK,cAAc,QAAQ,GAAG,YAAY,IAAI,YAAY,SAAS,IAAI;AAAA,IAC9E,WAAW,YAAY,eAAe,aAAa,YAAY,QAAQ;AACrE,SAAG,KAAK,cAAc,QAAQ,GAAG,YAAY,IAAI,YAAY,SAAS,IAAI;AAC1E,eAAS,KAAK,mBAAmB,YAAY,SAAS,uBAAuB;AAC7E,YAAM,YAAY,uBAAuB,YAAY,QAAQ,cAAc,OAAO;AAClF,WAAK,KAAK,SAAS;AAAA,IACrB,WAAW,YAAY,eAAe,YAAY;AAChD,YAAM,YAAY,GAAG,YAAY,IAAI,YAAY,SAAS;AAG1D,UAAI,YAAY,eAAe;AAC7B,mBAAW,aAAa,YAAY,eAAe;AACjD,cAAI,UAAU,eAAe,WAAW,UAAU,QAAQ;AACxD,kBAAM,SAAS,yBAAyB,UAAU,MAAM;AACxD,eAAG,KAAK,eAAe,SAAS,eAAe,MAAM,GAAG;AACxD,iBAAK,KAAK,eAAe,SAAS,gBAAgB,QAAQ,IAAI,UAAU,UAAU,IAAI;AAAA,UACxF,WAAW,UAAU,eAAe,aAAa,UAAU,QAAQ;AACjE,eAAG,KAAK,eAAe,SAAS,gBAAgB,QAAQ,IAAI,UAAU,UAAU,IAAI;AACpF,qBAAS,KAAK,oBAAoB,YAAY,SAAS,IAAI,UAAU,UAAU,mBAAmB;AAClG,kBAAM,SAAS,yBAAyB,UAAU,MAAM;AACxD,iBAAK,KAAK,eAAe,SAAS,eAAe,MAAM,GAAG;AAAA,UAC5D,WAAW,UAAU,eAAe,cAAc,UAAU,kBAAkB;AAC5E,kBAAM,kBAAkB;AAAA,cACtB;AAAA,cACA,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV;AAAA,YACF;AACA,eAAG,KAAK,GAAG,gBAAgB,EAAE;AAC7B,iBAAK,KAAK,GAAG,gBAAgB,IAAI;AAAA,UACnC;AAAA,QACF;AAAA,MACF;AAGA,UAAI,YAAY,cAAc;AAC5B,mBAAW,aAAa,YAAY,cAAc;AAChD,cAAI,UAAU,eAAe,WAAW,UAAU,QAAQ;AACxD,eAAG,KAAK,uBAAuB,UAAU,QAAQ,YAAY,WAAW,YAAY,CAAC;AACrF,iBAAK,KAAK,cAAc,QAAQ,GAAG,YAAY,IAAI,UAAU,SAAS,IAAI;AAAA,UAC5E,WAAW,UAAU,eAAe,aAAa,UAAU,QAAQ;AACjE,eAAG,KAAK,cAAc,QAAQ,GAAG,YAAY,IAAI,UAAU,SAAS,IAAI;AACxE,iBAAK,KAAK,uBAAuB,UAAU,QAAQ,YAAY,WAAW,YAAY,CAAC;AAAA,UACzF,WAAW,UAAU,eAAe,cAAc,UAAU,UAAU,UAAU,QAAQ;AAEtF,eAAG,KAAK,cAAc,QAAQ,GAAG,YAAY,IAAI,UAAU,SAAS,IAAI;AACxE,eAAG,KAAK,uBAAuB,UAAU,QAAQ,YAAY,WAAW,YAAY,CAAC;AACrF,iBAAK,KAAK,cAAc,QAAQ,GAAG,YAAY,IAAI,UAAU,SAAS,IAAI;AAC1E,iBAAK,KAAK,uBAAuB,UAAU,QAAQ,YAAY,WAAW,YAAY,CAAC;AAAA,UACzF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,QAAQ,kBAAkB,IAAI,MAAM,OAAO;AACjD,QAAM,UAAU,kBAAkB,KAAK,QAAQ,GAAG,QAAQ,OAAO;AAGjE,QAAM,cAAc,6BAA6B,IAAI;AAErD,SAAO;AAAA,IACL;AAAA,IACA,MAAM,KAAK,QAAQ;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAKA,SAAS,uBACP,OACA,cACA,UACQ;AACR,QAAM,QAAkB,CAAC;AACzB,QAAM,YAAY,GAAG,YAAY,IAAI,MAAM,IAAI;AAE/C,QAAM,KAAK,gBAAgB,SAAS,IAAI;AAExC,QAAM,aAAa,MAAM,QAAQ,IAAI,SAAO,KAAK,yBAAyB,GAAG,CAAC,EAAE;AAGhF,MAAI,MAAM,cAAc,MAAM,WAAW,SAAS,GAAG;AACnD,eAAW,KAAK,kBAAkB,MAAM,WAAW,IAAI,OAAK,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,GAAG;AAAA,EACrF;AAEA,QAAM,KAAK,WAAW,KAAK,KAAK,CAAC;AACjC,QAAM,KAAK,IAAI;AAEf,SAAO,MAAM,KAAK,IAAI;AACxB;AAKA,SAAS,yBAAyB,KAAqC;AACrE,MAAI,MAAM,IAAI,IAAI,IAAI,KAAK,IAAI,MAAM;AAErC,MAAI,IAAI,WAAW;AACjB,UAAM,IAAI,IAAI,IAAI,KAAK,IAAI,MAAM,IAAI,IAAI,SAAS;AAAA,EACpD;AAEA,MAAI,IAAI,SAAS;AACf,WAAO;AAAA,EACT;AAEA,MAAI,IAAI,gBAAgB,CAAC,IAAI,YAAY;AACvC,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,IAAI,YAAY,CAAC,IAAI,cAAc;AACtC,WAAO;AAAA,EACT;AAEA,MAAI,IAAI,YAAY,CAAC,IAAI,cAAc;AACrC,WAAO;AAAA,EACT;AAEA,MAAI,IAAI,cAAc,IAAI,cAAc;AACtC,WAAO,YAAY,IAAI,YAAY;AAAA,EACrC;AAEA,MAAI,IAAI,YAAY;AAClB,WAAO,gBAAgB,IAAI,WAAW,KAAK,MAAM,IAAI,WAAW,MAAM;AACtE,QAAI,IAAI,WAAW,YAAY,IAAI,WAAW,aAAa,aAAa;AACtE,aAAO,cAAc,IAAI,WAAW,QAAQ;AAAA,IAC9C;AACA,QAAI,IAAI,WAAW,YAAY,IAAI,WAAW,aAAa,aAAa;AACtE,aAAO,cAAc,IAAI,WAAW,QAAQ;AAAA,IAC9C;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,8BACP,WACA,YACA,SACA,QACA,QACA,UACkC;AAClC,QAAM,KAAe,CAAC;AACtB,QAAM,OAAiB,CAAC;AACxB,QAAM,SAAS,IAAI,UAAU;AAE7B,aAAW,UAAU,SAAS;AAC5B,YAAQ,OAAO,WAAW;AAAA,MACxB,KAAK;AACH,WAAG,KAAK,eAAe,SAAS,iBAAiB,MAAM,SAAS,OAAO,MAAM,UAAU,MAAM,KAAK,OAAO,MAAM,GAAG;AAClH,aAAK,KAAK,eAAe,SAAS,iBAAiB,MAAM,SAAS,OAAO,MAAM,UAAU,MAAM,KAAK,OAAO,MAAM,GAAG;AACpH,iBAAS,KAAK,mBAAmB,UAAU,UAAU,OAAO,MAAM,OAAO,OAAO,MAAM,uBAAuB;AAC7G;AAAA,MAEF,KAAK;AACH,YAAI,OAAO,UAAU;AACnB,aAAG,KAAK,eAAe,SAAS,iBAAiB,MAAM,iBAAiB;AACxE,eAAK,KAAK,eAAe,SAAS,iBAAiB,MAAM,gBAAgB;AAAA,QAC3E,OAAO;AACL,aAAG,KAAK,eAAe,SAAS,iBAAiB,MAAM,gBAAgB;AACvE,eAAK,KAAK,eAAe,SAAS,iBAAiB,MAAM,iBAAiB;AAC1E,mBAAS,KAAK,wBAAwB,UAAU,4CAA4C;AAAA,QAC9F;AACA;AAAA,MAEF,KAAK;AACH,YAAI,OAAO,cAAc;AACvB,aAAG,KAAK,eAAe,SAAS,iBAAiB,MAAM,gBAAgB,OAAO,YAAY,GAAG;AAAA,QAC/F,OAAO;AACL,aAAG,KAAK,eAAe,SAAS,iBAAiB,MAAM,gBAAgB;AAAA,QACzE;AACA,YAAI,OAAO,cAAc;AACvB,eAAK,KAAK,eAAe,SAAS,iBAAiB,MAAM,gBAAgB,OAAO,YAAY,GAAG;AAAA,QACjG,OAAO;AACL,eAAK,KAAK,eAAe,SAAS,iBAAiB,MAAM,gBAAgB;AAAA,QAC3E;AACA;AAAA,MAEF,KAAK;AACH,WAAG,KAAK,eAAe,SAAS,iBAAiB,MAAM,SAAS,OAAO,MAAM,IAAI,OAAO,SAAS,IAAI;AACrG,aAAK,KAAK,eAAe,SAAS,iBAAiB,MAAM,SAAS,OAAO,MAAM,GAAG,OAAO,YAAY,IAAI,OAAO,SAAS,MAAM,EAAE,GAAG;AACpI,YAAI,OAAO,aAAa,OAAO,aAAa,OAAO,YAAY,OAAO,WAAW;AAC/E,mBAAS,KAAK,2BAA2B,UAAU,sBAAsB;AAAA,QAC3E;AACA;AAAA,MAEF,KAAK;AACH,YAAI,OAAO,UAAU;AACnB,aAAG,KAAK,eAAe,SAAS,oBAAoB,UAAU,QAAQ,MAAM,EAAE,CAAC,IAAI,UAAU,oBAAoB,MAAM,IAAI;AAC3H,eAAK,KAAK,eAAe,SAAS,+BAA+B,UAAU,QAAQ,MAAM,EAAE,CAAC,IAAI,UAAU,WAAW;AAAA,QACvH,OAAO;AACL,aAAG,KAAK,eAAe,SAAS,+BAA+B,UAAU,QAAQ,MAAM,EAAE,CAAC,IAAI,UAAU,WAAW;AACnH,eAAK,KAAK,eAAe,SAAS,oBAAoB,UAAU,QAAQ,MAAM,EAAE,CAAC,IAAI,UAAU,oBAAoB,MAAM,IAAI;AAAA,QAC/H;AACA;AAAA,IACJ;AAAA,EACF;AAEA,SAAO,EAAE,IAAI,KAAK;AACpB;AAKA,SAAS,uBACP,OACA,WACA,cACQ;AACR,QAAM,SAAS,MAAM,WAAW,YAAY;AAC5C,QAAM,QAAQ,MAAM,QAAQ,MAAM,SAAS,UAAU,SAAS,MAAM,IAAI,MAAM;AAC9E,QAAM,UAAU,MAAM,QAAQ,IAAI,OAAK,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI;AAC1D,QAAM,QAAQ,MAAM,QAAQ,UAAU,MAAM,KAAK,KAAK;AAEtD,SAAO,UAAU,MAAM,UAAU,MAAM,IAAI,QAAQ,YAAY,IAAI,SAAS,KAAK,KAAK,IAAI,OAAO,IAAI,KAAK;AAC5G;AAKA,SAAS,kBACP,YACA,WACA,SACQ;AACR,QAAM,QAAkB,CAAC;AAEzB,MAAI,QAAQ,iBAAiB;AAC3B,UAAM,KAAK,gBAAgB,SAAS,EAAE;AACtC,UAAM,KAAK,oBAAmB,oBAAI,KAAK,GAAE,YAAY,CAAC,EAAE;AACxD,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,MAAI,QAAQ,mBAAmB;AAC7B,UAAM,KAAK,QAAQ;AACnB,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,QAAM,KAAK,GAAG,WAAW,IAAI,OAAK,KAAK,EAAE,SAAS,GAAG,IAAI,KAAK,IAAI,CAAC;AAEnE,MAAI,QAAQ,mBAAmB;AAC7B,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,SAAS;AAAA,EACtB;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAKA,SAAS,6BAA6B,MAA0B;AAC9D,QAAM,QAAkB,CAAC;AAEzB,MAAI,KAAK,QAAQ,cAAc,GAAG;AAChC,UAAM,SAAS,KAAK,aACjB,OAAO,OAAK,EAAE,eAAe,OAAO,EACpC,IAAI,OAAK,EAAE,SAAS;AACvB,UAAM,KAAK,YAAY,OAAO,SAAS,IAAI,MAAM,EAAE,KAAK,OAAO,KAAK,IAAI,CAAC,EAAE;AAAA,EAC7E;AAEA,MAAI,KAAK,QAAQ,gBAAgB,GAAG;AAClC,UAAM,SAAS,KAAK,aACjB,OAAO,OAAK,EAAE,eAAe,SAAS,EACtC,IAAI,OAAK,EAAE,SAAS;AACvB,UAAM,KAAK,eAAe,OAAO,SAAS,IAAI,MAAM,EAAE,KAAK,OAAO,KAAK,IAAI,CAAC,EAAE;AAAA,EAChF;AAEA,MAAI,KAAK,QAAQ,eAAe,GAAG;AACjC,UAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,UAAU,KAAK,QAAQ,eAAe,IAAI,MAAM,EAAE,EAAE;AAAA,EACjG;AAEA,MAAI,KAAK,QAAQ,iBAAiB,GAAG;AACnC,UAAM,KAAK,UAAU,KAAK,QAAQ,cAAc,UAAU,KAAK,QAAQ,iBAAiB,IAAI,MAAM,EAAE,EAAE;AAAA,EACxG;AAEA,MAAI,KAAK,QAAQ,kBAAkB,GAAG;AACpC,UAAM,KAAK,UAAU,KAAK,QAAQ,eAAe,UAAU,KAAK,QAAQ,kBAAkB,IAAI,MAAM,EAAE,EAAE;AAAA,EAC1G;AAEA,MAAI,KAAK,QAAQ,eAAe,GAAG;AACjC,UAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,SAAS,KAAK,QAAQ,eAAe,IAAI,OAAO,EAAE,EAAE;AAAA,EACjG;AAEA,MAAI,KAAK,QAAQ,iBAAiB,GAAG;AACnC,UAAM,KAAK,UAAU,KAAK,QAAQ,cAAc,SAAS,KAAK,QAAQ,iBAAiB,IAAI,OAAO,EAAE,EAAE;AAAA,EACxG;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAqBO,SAAS,iBAAiB,MAAkB,UAA+B,CAAC,GAAW;AAC5F,QAAM,QAAkB,CAAC;AACzB,QAAM,EAAE,QAAQ,KAAK,IAAI;AAEzB,QAAM,QAAQ,QAAQ,aAAa;AACnC,QAAM,MAAM,QAAQ,aAAa;AACjC,QAAM,SAAS,QAAQ,aAAa;AACpC,QAAM,QAAQ,QAAQ,YAAY;AAElC,MAAI,KAAK,aAAa;AACpB,WAAO,GAAG,KAAK,wBAAwB,KAAK;AAAA,EAC9C;AAGA,QAAM,KAAK,gBAAgB,KAAK,YAAY,OAAO,KAAK,YAAY,EAAE;AACtE,QAAM,KAAK,EAAE;AAGb,aAAW,cAAc,KAAK,aAAa;AACzC,QAAI,WAAW,eAAe,SAAS;AACrC,YAAM,KAAK,GAAG,KAAK,WAAW,WAAW,QAAQ,GAAG,KAAK,EAAE;AAAA,IAC7D,WAAW,WAAW,eAAe,WAAW;AAC9C,YAAM,KAAK,GAAG,GAAG,WAAW,WAAW,QAAQ,GAAG,KAAK,EAAE;AAAA,IAC3D,WAAW,WAAW,eAAe,YAAY;AAC/C,YAAM,KAAK,GAAG,MAAM,WAAW,WAAW,QAAQ,GAAG,KAAK,EAAE;AAC5D,UAAI,WAAW,aAAa,QAAQ;AAClC,cAAM,KAAK,OAAO,KAAK,aAAa,WAAW,YAAY,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE;AAAA,MACjF;AACA,UAAI,WAAW,eAAe,QAAQ;AACpC,cAAM,KAAK,OAAO,GAAG,aAAa,WAAW,cAAc,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE;AAAA,MACjF;AAAA,IACF;AAAA,EACF;AAGA,aAAW,eAAe,KAAK,cAAc;AAC3C,QAAI,YAAY,eAAe,SAAS;AACtC,YAAM,KAAK,GAAG,KAAK,YAAY,YAAY,SAAS,GAAG,KAAK,EAAE;AAC9D,UAAI,YAAY,QAAQ;AACtB,mBAAW,OAAO,YAAY,OAAO,SAAS;AAC5C,gBAAM,KAAK,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,IAAI,MAAM,GAAG,IAAI,WAAW,KAAK,WAAW,GAAG,KAAK,EAAE;AAAA,QACjG;AAAA,MACF;AAAA,IACF,WAAW,YAAY,eAAe,WAAW;AAC/C,YAAM,KAAK,GAAG,GAAG,YAAY,YAAY,SAAS,GAAG,KAAK,EAAE;AAAA,IAC9D,WAAW,YAAY,eAAe,YAAY;AAChD,YAAM,KAAK,GAAG,MAAM,YAAY,YAAY,SAAS,GAAG,KAAK,EAAE;AAG/D,UAAI,YAAY,eAAe;AAC7B,mBAAW,aAAa,YAAY,eAAe;AACjD,cAAI,UAAU,eAAe,SAAS;AACpC,kBAAM,MAAM,UAAU;AACtB,kBAAM,KAAK,OAAO,KAAK,aAAa,IAAI,IAAI,KAAK,IAAI,MAAM,GAAG,IAAI,WAAW,KAAK,WAAW,GAAG,KAAK,EAAE;AAAA,UACzG,WAAW,UAAU,eAAe,WAAW;AAC7C,kBAAM,KAAK,OAAO,GAAG,aAAa,UAAU,UAAU,GAAG,KAAK,EAAE;AAAA,UAClE,WAAW,UAAU,eAAe,cAAc,UAAU,kBAAkB;AAC5E,uBAAW,QAAQ,UAAU,kBAAkB;AAC7C,oBAAM,KAAK,OAAO,MAAM,aAAa,UAAU,UAAU,IAAI,KAAK,SAAS,KAAK,YAAY,KAAK,WAAW,CAAC,OAAO,YAAY,KAAK,WAAW,CAAC,GAAG,KAAK,EAAE;AAAA,YAC7J;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAGA,UAAI,YAAY,cAAc;AAC5B,mBAAW,aAAa,YAAY,cAAc;AAChD,cAAI,UAAU,eAAe,SAAS;AACpC,kBAAM,KAAK,OAAO,KAAK,YAAY,UAAU,SAAS,GAAG,KAAK,EAAE;AAAA,UAClE,WAAW,UAAU,eAAe,WAAW;AAC7C,kBAAM,KAAK,OAAO,GAAG,YAAY,UAAU,SAAS,GAAG,KAAK,EAAE;AAAA,UAChE,WAAW,UAAU,eAAe,YAAY;AAC9C,kBAAM,KAAK,OAAO,MAAM,YAAY,UAAU,SAAS,GAAG,KAAK,EAAE;AAAA,UACnE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,UAAU;AACrB,QAAM,KAAK,cAAc,KAAK,IAAI,KAAK,QAAQ,WAAW,GAAG,KAAK,IAAI,GAAG,IAAI,KAAK,QAAQ,aAAa,GAAG,KAAK,IAAI,MAAM,IAAI,KAAK,QAAQ,cAAc,GAAG,KAAK,EAAE;AAClK,QAAM,KAAK,cAAc,KAAK,IAAI,KAAK,QAAQ,YAAY,GAAG,KAAK,IAAI,GAAG,IAAI,KAAK,QAAQ,cAAc,GAAG,KAAK,IAAI,MAAM,IAAI,KAAK,QAAQ,eAAe,GAAG,KAAK,EAAE;AACrK,QAAM,KAAK,cAAc,KAAK,IAAI,KAAK,QAAQ,YAAY,GAAG,KAAK,IAAI,GAAG,IAAI,KAAK,QAAQ,cAAc,GAAG,KAAK,EAAE;AACnH,MAAI,KAAK,YAAY,SAAS,GAAG;AAC/B,UAAM,KAAK,cAAc,KAAK,IAAI,KAAK,QAAQ,UAAU,GAAG,KAAK,IAAI,GAAG,IAAI,KAAK,QAAQ,YAAY,GAAG,KAAK,IAAI,MAAM,IAAI,KAAK,QAAQ,aAAa,GAAG,KAAK,EAAE;AAAA,EACjK;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAKO,SAAS,qBAAqB,MAA0B;AAC7D,SAAO,KAAK,UAAU,MAAM,MAAM,CAAC;AACrC;AAgBO,SAAS,yBACd,MACA,MACA,UAA+B,CAAC,GACxB;AACR,QAAM,YAAY,qBAAqB,MAAM,EAAE,GAAG,SAAS,iBAAiB,KAAK,CAAC;AAElF,QAAM,QAAkB,CAAC;AAEzB,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,iBAAiB,IAAI,EAAE;AAClC,QAAM,KAAK,MAAM,UAAU,WAAW,EAAE;AACxC,QAAM,KAAK,qBAAoB,oBAAI,KAAK,GAAE,YAAY,CAAC,EAAE;AACzD,MAAI,UAAU,SAAS,SAAS,GAAG;AACjC,UAAM,KAAK,IAAI;AACf,UAAM,KAAK,cAAc;AACzB,eAAW,WAAW,UAAU,UAAU;AACxC,YAAM,KAAK,QAAQ,OAAO,EAAE;AAAA,IAC9B;AAAA,EACF;AACA,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,mCAAmC;AAC9C,QAAM,KAAK,mEAAmE;AAC9E,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,oDAAoD;AAC/D,aAAW,QAAQ,UAAU,IAAI;AAC/B,UAAM,KAAK,2BAA2B,qBAAqB,IAAI,CAAC,KAAK;AAAA,EACvE;AACA,QAAM,KAAK,GAAG;AACd,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,sDAAsD;AACjE,aAAW,QAAQ,UAAU,MAAM;AACjC,UAAM,KAAK,2BAA2B,qBAAqB,IAAI,CAAC,KAAK;AAAA,EACvE;AACA,QAAM,KAAK,GAAG;AACd,QAAM,KAAK,EAAE;AAEb,SAAO,MAAM,KAAK,IAAI;AACxB;AASA,SAAS,YAAY,MAAc,SAAqC;AACtE,MAAI,QAAQ,iBAAiB,QAAQ,cAAc,SAAS,GAAG;AAC7D,WAAO,QAAQ,cAAc,SAAS,IAAI;AAAA,EAC5C;AACA,MAAI,QAAQ,iBAAiB,QAAQ,cAAc,SAAS,IAAI,GAAG;AACjE,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAKA,SAAS,oBAAoB,MAAc,SAAoC;AAC7E,SAAO,QAAQ,aAAa,KAAK,YAAY,IAAI;AACnD;AAKA,SAAS,cAAc,MAAsB;AAE3C,QAAM,aAAa,KAAK,YAAY,EACjC,QAAQ,SAAS,SAAS,EAC1B,QAAQ,UAAU,SAAS,EAC3B,QAAQ,UAAU,QAAQ,EAC1B,QAAQ,YAAY,MAAM,EAC1B,QAAQ,YAAY,kBAAkB,EACtC,QAAQ,UAAU,SAAS,EAC3B,QAAQ,iBAAiB,0BAA0B,EACnD,QAAQ,YAAY,qBAAqB;AAE5C,SAAO;AACT;AAKA,SAAS,iBAAiB,OAA2B,SAAgD;AACnG,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,QAAQ,yBAAyB;AACnC,WAAO,MAAM,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAAA,EACzC;AACA,SAAO;AACT;AAKA,SAAS,aAAa,GAA0B,GAAmC;AACjF,SACE,EAAE,aAAa,EAAE,YACjB,EAAE,SAAS,EAAE,QACb,YAAY,EAAE,SAAS,EAAE,OAAO,KAChC,EAAE,UAAU,EAAE;AAElB;AAKA,SAAS,gBACP,GACA,GACS;AACT,MAAI,CAAC,KAAK,CAAC,EAAG,QAAO;AACrB,MAAI,CAAC,KAAK,CAAC,EAAG,QAAO;AACrB,SACE,EAAE,UAAU,EAAE,SACd,EAAE,WAAW,EAAE,WACd,EAAE,YAAY,kBAAkB,EAAE,YAAY,iBAC9C,EAAE,YAAY,kBAAkB,EAAE,YAAY;AAEnD;AAKA,SAAS,YAAe,GAAQ,GAAiB;AAC/C,MAAI,EAAE,WAAW,EAAE,OAAQ,QAAO;AAClC,SAAO,EAAE,MAAM,CAAC,GAAG,MAAM,MAAM,EAAE,CAAC,CAAC;AACrC;AAKA,SAAS,YAAY,OAAwB;AAC3C,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,OAAO,UAAU,SAAU,QAAO,KAAK,UAAU,KAAK;AAC1D,SAAO,OAAO,KAAK;AACrB;AAKA,SAAS,qBAAqBI,MAAqB;AACjD,SAAOA,KAAI,QAAQ,MAAM,KAAK,EAAE,QAAQ,OAAO,KAAK;AACtD;","names":["import_entity","import_logger","sql","sql","generateHash","cleanDrizzleSql","sql","tagToName","sql"]}