{"version":3,"sources":["../../src/types.ts","../../src/transport/http.ts","../../src/rpc/rpc-promise.ts","../../src/transport/rpc.ts","../../src/transport/cdc-ws.ts","../../src/transport/cdc-sse.ts","../../src/middleware.ts","../../src/streaming.ts","../../src/subscription.ts","../../src/client.ts","../../src/auth.ts","../../src/connection.ts","../../src/extensions.ts","../../src/pool.ts","../../src/index.ts","../../src/pglite/index.ts","../../src/cli/index.ts","../../src/drizzle/schema-generator.ts","../../src/cli/commands/migrate.ts","../../src/cli/formatting.ts","../../src/cli/utils.ts","../../src/cli/commands/migrate-status.ts","../../src/cli/commands/migrate-rollback.ts","../../src/cli/commands/migrate-create.ts","../../src/cli/commands/migrate-validate.ts","../../src/cli/commands/migrate-dry-run.ts","../../src/cli/commands/migrate-dashboard.ts","../../src/cli/commands/migrate-from-external.ts","../../src/cli/commands/schema-diff.ts","../../src/drizzle/schema-diff.ts","../../src/cli/commands/schema-sync.ts","../../src/cli/commands/dev.ts","../../src/cli/commands/dev-reset.ts","../../src/cli/config.ts","../../src/cli/cli-auth.ts","../../src/cli/output.ts","../../src/cli/commands/create.ts","../../src/cli/commands/backup.ts","../../src/cli/commands/restore.ts","../../src/cli/commands/logs.ts","../../src/cli/commands/shell.ts"],"sourcesContent":["/**\n * PostgreSQL client types for postgres.do\n * Compatible with Drizzle ORM and direct usage\n */\n\nimport {\n  PostgresError as SharedPostgresError,\n  ConnectionError as SharedConnectionError,\n  ConnectionTimeoutError as SharedConnectionTimeoutError,\n  type ErrorContext,\n} from '@dotdo/postgres-shared/errors'\n\n/** A single row returned from a query */\nexport type Row = Record<string, unknown>\n\n/** Result of a query execution */\nexport interface QueryResult<T extends Row = Row> {\n  /** Rows returned by the query */\n  rows: T[]\n  /** Number of rows affected (for INSERT/UPDATE/DELETE) */\n  rowCount: number\n  /** Column metadata */\n  fields: FieldInfo[]\n  /** Command type (SELECT, INSERT, etc.) */\n  command: string\n}\n\n/** Column/field metadata */\nexport interface FieldInfo {\n  /** Column name */\n  name: string\n  /** PostgreSQL OID for the column type */\n  dataTypeID: number\n  /** Table OID (0 if not from a table) */\n  tableID: number\n  /** Column position in table */\n  columnID: number\n  /** Data type size in bytes (-1 for variable) */\n  dataTypeSize: number\n  /** Type modifier */\n  dataTypeModifier: number\n  /** Format code (0 = text, 1 = binary) */\n  format: number\n}\n\n/** Type parser function */\nexport type TypeParser = (value: string) => unknown\n\n/** Configuration options for the postgres client */\nexport interface PostgresConfig {\n  /** Database connection URL (postgres://...) */\n  url?: string\n\n  /** API key for postgres.do authentication */\n  apiKey?: string\n\n  /** Transport type: 'http' (default) or 'ws' */\n  transport?: 'http' | 'ws'\n\n  /** Custom type parsers by OID */\n  parsers?: Record<number, TypeParser>\n\n  /** Connection timeout in milliseconds */\n  connectTimeout?: number\n\n  /** Query timeout in milliseconds */\n  queryTimeout?: number\n\n  /** Maximum number of retry attempts */\n  maxRetries?: number\n\n  /** Whether to use SSL/TLS */\n  ssl?: boolean | 'require' | 'prefer' | 'allow' | 'disable'\n\n  /** Custom fetch implementation (for Cloudflare Workers) */\n  fetch?: typeof fetch\n\n  /** Custom WebSocket implementation */\n  WebSocket?: typeof WebSocket\n\n  /** Enable debug logging */\n  debug?: boolean\n\n  /** Transform column names (e.g., snake_case to camelCase) */\n  transform?: {\n    column?: (name: string) => string\n    value?: (value: unknown, column: string) => unknown\n  }\n\n  /**\n   * Default transaction retry configuration.\n   * These settings are used as defaults for all transactions initiated with begin().\n   * Transaction-level options can override these defaults.\n   */\n  transactionRetry?: {\n    /** Automatically retry on serialization failure (error code 40001) */\n    retryOnSerializationFailure?: boolean\n    /** Automatically retry on deadlock (error code 40P01) */\n    retryOnDeadlock?: boolean\n    /** Maximum retry attempts (default: 3) */\n    maxRetries?: number\n    /** Base delay in milliseconds for exponential backoff (default: 10) */\n    backoffMs?: number\n  }\n}\n\n/** Pending query that can be executed */\nexport interface PendingQuery<T extends Row = Row> extends Promise<T[]> {\n  /** Execute the query and return rows */\n  execute(): Promise<T[]>\n\n  /** Get the parameterized SQL string */\n  toString(): string\n\n  /** Get query values/parameters */\n  values: unknown[]\n\n  /** Get the SQL template string */\n  strings: TemplateStringsArray\n}\n\n/** Transaction isolation levels */\nexport type IsolationLevel =\n  | 'read uncommitted'\n  | 'read committed'\n  | 'repeatable read'\n  | 'serializable'\n\n/** Lock mode types */\nexport type LockMode =\n  | 'access share'\n  | 'row share'\n  | 'row exclusive'\n  | 'share update exclusive'\n  | 'share'\n  | 'share row exclusive'\n  | 'exclusive'\n  | 'access exclusive'\n\n/** Transaction options */\nexport interface TransactionOptions {\n  /** Isolation level */\n  isolationLevel?: IsolationLevel\n  /** Read only transaction */\n  readOnly?: boolean\n  /** Deferrable (only with serializable + read only) */\n  deferrable?: boolean\n  /** Named transaction (for debugging/logging) */\n  name?: string\n  /**\n   * Transaction timeout in milliseconds.\n   * This is the total timeout across all retry attempts.\n   * When retries are enabled, the timeout counts from the start of the first attempt.\n   */\n  timeout?: number\n  /**\n   * Per-retry timeout in milliseconds.\n   * When set, each retry attempt gets a fresh timeout of this duration.\n   * This is useful when you want to allow each attempt to take up to N ms,\n   * but the total time can exceed that due to retries.\n   * If both `timeout` and `perRetryTimeout` are set, `timeout` takes precedence\n   * (the total timeout will be enforced).\n   */\n  perRetryTimeout?: number\n  /** Lock mode for explicit table locking */\n  lockMode?: LockMode\n  /** Automatically retry on serialization failure (error code 40001) */\n  retryOnSerializationFailure?: boolean\n  /** Automatically retry on deadlock (error code 40P01) */\n  retryOnDeadlock?: boolean\n  /** Maximum retry attempts (default: 3) */\n  maxRetries?: number\n  /** Base delay in milliseconds for exponential backoff (default: 10) */\n  backoffMs?: number\n  /** Callback called before each retry attempt */\n  onRetry?: (attempt: number, error: Error) => void | Promise<void>\n}\n\n/**\n * Options for streaming queries\n */\nexport interface StreamOptions {\n  /** Batch size for fetching rows (default: 100) */\n  batchSize?: number\n  /** Custom cursor name (auto-generated if not provided) */\n  cursorName?: string\n  /** Transaction isolation level for the cursor */\n  isolationLevel?: IsolationLevel\n  /** Whether the cursor should be read-only (default: true) */\n  readOnly?: boolean\n}\n\n/**\n * Result of a cursor fetch operation\n */\nexport interface CursorFetchResult<T extends Row = Row> {\n  /** Rows fetched in this batch */\n  rows: T[]\n  /** Whether there are more rows to fetch */\n  hasMore: boolean\n  /** Total number of rows fetched so far */\n  totalFetched: number\n}\n\n/**\n * Cursor interface for manual control over streaming\n */\nexport interface Cursor<T extends Row = Row> extends AsyncIterable<T> {\n  /** Whether the cursor is still open */\n  readonly isOpen: boolean\n  /** Total number of rows fetched so far */\n  readonly totalFetched: number\n  /** Column metadata from the query */\n  readonly fields: FieldInfo[]\n\n  /**\n   * Fetch the next batch of rows\n   * @param count - Number of rows to fetch (default: batch size)\n   * @returns Array of rows (empty array if no more rows)\n   */\n  fetch(count?: number): Promise<T[]>\n\n  /**\n   * Fetch the next batch of rows with additional metadata\n   * @param count - Number of rows to fetch (default: batch size)\n   * @returns Result object with rows, hasMore flag, and total fetched count\n   */\n  fetchWithInfo(count?: number): Promise<CursorFetchResult<T>>\n\n  /**\n   * Close the cursor and release resources\n   * Always call this when done, or use for-await-of which closes automatically\n   */\n  close(): Promise<void>\n}\n\n/**\n * Stream result interface for fluent streaming API\n */\nexport interface StreamResult<T extends Row = Row> extends AsyncIterable<T> {\n  /** The SQL query being streamed */\n  readonly sql: string\n  /** The query parameters */\n  readonly params: unknown[]\n\n  /**\n   * Stream rows in batches\n   * @param size - Number of rows per batch\n   * @returns AsyncIterable of row arrays\n   * @example\n   * for await (const batch of sql.stream`SELECT * FROM users`.batch(1000)) {\n   *   processBatch(batch)\n   * }\n   */\n  batch(size: number): AsyncIterable<T[]>\n\n  /**\n   * Get a cursor for manual control\n   * @returns A cursor that can be used to fetch rows manually\n   * @example\n   * const cursor = await sql.stream`SELECT * FROM users`.cursor()\n   * while (const rows = await cursor.fetch(100)) {\n   *   process(rows)\n   * }\n   * await cursor.close()\n   */\n  cursor(): Promise<Cursor<T>>\n}\n\n/**\n * Query middleware function signature (forward declaration for types)\n * Full implementation is in middleware.ts\n */\nexport type QueryMiddlewareFn<T extends Row = Row> = (\n  request: { sql: string; params: unknown[]; timestamp: number; queryId: string; context?: Record<string, unknown> },\n  next: () => Promise<{ result: QueryResult<T>; durationMs: number; success: boolean; error?: Error; metadata?: Record<string, unknown> }>\n) => Promise<{ result: QueryResult<T>; durationMs: number; success: boolean; error?: Error; metadata?: Record<string, unknown> }>\n\n/**\n * Main SQL client interface\n * Compatible with Drizzle ORM integration\n */\nexport interface Sql {\n  /**\n   * Execute a SQL query using tagged template literal\n   * @example\n   * const users = await sql`SELECT * FROM users WHERE id = ${userId}`\n   */\n  <T extends Row = Row>(\n    strings: TemplateStringsArray,\n    ...values: unknown[]\n  ): PendingQuery<T>\n\n  /**\n   * Execute raw SQL (use with caution - no parameterization)\n   * This is used by Drizzle ORM for generated queries\n   * @param query - Raw SQL query string\n   * @param params - Optional query parameters\n   */\n  unsafe<T extends Row = Row>(\n    query: string,\n    params?: unknown[]\n  ): Promise<T[]>\n\n  /**\n   * Begin a transaction\n   * Compatible with Drizzle ORM transaction interface\n   * @param fn - Transaction callback function\n   * @param options - Transaction options\n   */\n  begin<T>(\n    fn: (sql: TransactionSql) => Promise<T>,\n    options?: TransactionOptions\n  ): Promise<T>\n\n  /**\n   * Create a savepoint within a transaction\n   * For nested transaction support\n   * @param fn - Savepoint callback function\n   */\n  savepoint<T>(\n    fn: (sql: TransactionSql) => Promise<T>\n  ): Promise<T>\n\n  /**\n   * End the connection/session\n   */\n  end(): Promise<void>\n\n  /**\n   * Stream large result sets using PostgreSQL cursors\n   * Keeps memory usage constant regardless of result size\n   * @example\n   * // Stream rows one at a time\n   * for await (const row of sql.stream`SELECT * FROM huge_table`) {\n   *   process(row)\n   * }\n   *\n   * // Stream in batches\n   * for await (const batch of sql.stream`SELECT * FROM huge_table`.batch(1000)) {\n   *   processBatch(batch)\n   * }\n   *\n   * // Manual cursor control\n   * const cursor = await sql.stream`SELECT * FROM huge_table`.cursor()\n   * while (const rows = await cursor.fetch(100)) {\n   *   process(rows)\n   * }\n   * await cursor.close()\n   */\n  stream<T extends Row = Row>(\n    strings: TemplateStringsArray,\n    ...values: unknown[]\n  ): StreamResult<T>\n\n  /**\n   * Add a query middleware to the chain\n   * Middlewares are executed in the order they are added\n   * @param middleware - The middleware function to add\n   * @returns The same Sql instance for chaining\n   * @example\n   * const sql = postgres()\n   *   .use(loggingMiddleware({ level: 'info' }))\n   *   .use(metricsMiddleware({ onMetric: console.log }))\n   */\n  use(middleware: QueryMiddlewareFn): this\n\n  /**\n   * Client configuration options\n   * Includes type parsers and serializers for Drizzle compatibility\n   */\n  options: {\n    parsers: Record<number, TypeParser>\n    serializers: Record<number, (value: unknown) => string>\n    [key: string]: unknown\n  }\n\n  /**\n   * Reserve a connection from the pool\n   * Returns a client with exclusive connection\n   */\n  reserve(): Promise<ReservedSql>\n\n  /**\n   * Commit a prepared transaction (two-phase commit)\n   * @param transactionId - The ID returned from prepare()\n   */\n  commitPrepared(transactionId: string): Promise<void>\n\n  /**\n   * Rollback a prepared transaction (two-phase commit)\n   * @param transactionId - The ID returned from prepare()\n   */\n  rollbackPrepared(transactionId: string): Promise<void>\n\n  /**\n   * Subscribe to changes on a table\n   * @param table - Table name (optionally with schema: \"schema.table\")\n   * @param options - Subscription options\n   * @returns A subscription that can be iterated over or used with callbacks\n   * @example\n   * // Using async iteration\n   * const sub = await sql.subscribe('users')\n   * for await (const event of sub) {\n   *   console.log(event.operation, event.newRow)\n   * }\n   *\n   * // Using callbacks\n   * const sub = await sql.subscribe('users', {\n   *   onInsert: (row) => console.log('New user:', row),\n   *   onUpdate: (newRow, oldRow) => console.log('Updated:', newRow),\n   *   onDelete: (oldRow) => console.log('Deleted:', oldRow)\n   * })\n   */\n  subscribe<T extends Row = Row>(\n    table: string,\n    options?: CDCClientSubscribeOptions<T>\n  ): Promise<CDCClientSubscription<T>>\n\n  /**\n   * Unsubscribe from a subscription by ID\n   * @param subscriptionId - The subscription ID to unsubscribe from\n   */\n  unsubscribe(subscriptionId: string): Promise<void>\n\n  /**\n   * Get all active subscriptions\n   * @returns Array of active subscriptions\n   */\n  subscriptions(): CDCClientSubscriptionInfo[]\n}\n\n/** Transaction-specific SQL interface */\nexport interface TransactionSql extends Omit<Sql, 'begin' | 'end' | 'reserve' | 'commitPrepared' | 'rollbackPrepared'> {\n  /**\n   * Create a savepoint within the transaction\n   */\n  savepoint<T>(\n    fn: (sql: TransactionSql) => Promise<T>\n  ): Promise<T>\n\n  /**\n   * Acquire an exclusive advisory lock that is released when the transaction ends (blocking).\n   * @param lockId - Lock identifier (number or bigint for single-key)\n   * @example await tx.advisoryLock(12345)\n   */\n  advisoryLock(lockId: number | bigint): Promise<void>\n  /**\n   * Acquire an exclusive advisory lock with namespace (blocking).\n   * @param classId - Lock class/namespace identifier (int4)\n   * @param objId - Object identifier within the namespace (int4)\n   * @example await tx.advisoryLock(1, 42) // namespace 1, object 42\n   */\n  advisoryLock(classId: number, objId: number): Promise<void>\n\n  /**\n   * Try to acquire an exclusive advisory lock without blocking.\n   * @param lockId - Lock identifier (number or bigint for single-key)\n   * @returns true if lock was acquired, false otherwise\n   * @example const acquired = await tx.tryAdvisoryLock(12345)\n   */\n  tryAdvisoryLock(lockId: number | bigint): Promise<boolean>\n  /**\n   * Try to acquire an exclusive advisory lock with namespace without blocking.\n   * @param classId - Lock class/namespace identifier (int4)\n   * @param objId - Object identifier within the namespace (int4)\n   * @returns true if lock was acquired, false otherwise\n   * @example const acquired = await tx.tryAdvisoryLock(1, 42)\n   */\n  tryAdvisoryLock(classId: number, objId: number): Promise<boolean>\n\n  /**\n   * Acquire a shared advisory lock that is released when the transaction ends (blocking).\n   * Multiple sessions can hold a shared lock simultaneously; blocks only if exclusive lock is held.\n   * @param lockId - Lock identifier (number or bigint for single-key)\n   * @example await tx.advisoryLockShared(12345)\n   */\n  advisoryLockShared(lockId: number | bigint): Promise<void>\n  /**\n   * Acquire a shared advisory lock with namespace (blocking).\n   * @param classId - Lock class/namespace identifier (int4)\n   * @param objId - Object identifier within the namespace (int4)\n   * @example await tx.advisoryLockShared(1, 42)\n   */\n  advisoryLockShared(classId: number, objId: number): Promise<void>\n\n  /**\n   * Try to acquire a shared advisory lock without blocking.\n   * @param lockId - Lock identifier (number or bigint for single-key)\n   * @returns true if lock was acquired, false if exclusive lock is held\n   * @example const acquired = await tx.tryAdvisoryLockShared(12345)\n   */\n  tryAdvisoryLockShared(lockId: number | bigint): Promise<boolean>\n  /**\n   * Try to acquire a shared advisory lock with namespace without blocking.\n   * @param classId - Lock class/namespace identifier (int4)\n   * @param objId - Object identifier within the namespace (int4)\n   * @returns true if lock was acquired, false if exclusive lock is held\n   * @example const acquired = await tx.tryAdvisoryLockShared(1, 42)\n   */\n  tryAdvisoryLockShared(classId: number, objId: number): Promise<boolean>\n\n  /**\n   * Prepare transaction for two-phase commit\n   * After calling this, the transaction must be committed with commitPrepared()\n   * @param transactionId - Unique identifier for the prepared transaction\n   * @returns The transaction ID\n   */\n  prepare(transactionId: string): Promise<string>\n\n  /**\n   * Register a callback to run after transaction commits\n   * @param fn - Callback function\n   */\n  onCommit(fn: () => void | Promise<void>): void\n\n  /**\n   * Register a callback to run after transaction rolls back\n   * @param fn - Callback function\n   */\n  onRollback(fn: () => void | Promise<void>): void\n\n  /**\n   * Current transaction ID (xid)\n   * Lazily fetched from the database\n   */\n  readonly txid: string | undefined\n\n  /**\n   * Transaction name (if provided in options)\n   */\n  readonly name: string | undefined\n\n  /**\n   * Current retry attempt number (0 for first attempt, 1 for first retry, etc.)\n   * Only set when retryOnSerializationFailure or retryOnDeadlock is enabled.\n   */\n  readonly retryCount: number\n}\n\n/** Reserved connection SQL interface */\nexport interface ReservedSql extends Sql {\n  /**\n   * Release the reserved connection back to the pool\n   */\n  release(): Promise<void>\n}\n\n/** Transport interface for sending queries */\nexport interface Transport {\n  /** Send a query and receive results */\n  query<T extends Row = Row>(\n    sql: string,\n    params?: unknown[]\n  ): Promise<QueryResult<T>>\n\n  /** Execute multiple queries in a transaction */\n  transaction<T>(\n    queries: Array<{ sql: string; params?: unknown[] }>,\n    options?: TransactionOptions\n  ): Promise<T>\n\n  /** Close the transport connection */\n  close(): Promise<void>\n\n  /** Check if transport is connected */\n  isConnected(): boolean\n}\n\n/** HTTP transport configuration */\nexport interface HttpTransportConfig {\n  /** Base URL for the postgres.do API */\n  baseUrl: string\n  /** API key for authentication */\n  apiKey?: string | undefined\n  /** Custom fetch implementation */\n  fetch?: typeof fetch | undefined\n  /** Request timeout in milliseconds */\n  timeout?: number | undefined\n  /** Custom headers */\n  headers?: Record<string, string> | undefined\n}\n\n/** WebSocket transport configuration */\nexport interface WsTransportConfig {\n  /** WebSocket URL for postgres.do */\n  url: string\n  /** API key for authentication */\n  apiKey?: string | undefined\n  /** Custom WebSocket implementation */\n  WebSocket?: typeof WebSocket | undefined\n  /** Connection timeout in milliseconds */\n  connectTimeout?: number | undefined\n  /** Ping interval in milliseconds */\n  pingInterval?: number | undefined\n}\n\n// =============================================================================\n// CDC (Change Data Capture) Types\n// =============================================================================\n\n/**\n * CDC operation types for PostgreSQL change notifications\n */\nexport type CDCOperation = 'INSERT' | 'UPDATE' | 'DELETE' | 'TRUNCATE'\n\n/**\n * CDC change event representing a single database change\n */\nexport interface CDCChangeEvent {\n  /** Unique event ID (typically LSN-based) */\n  id: string\n  /** PostgreSQL Log Sequence Number for this change */\n  lsn: string\n  /** Type of operation that caused this change */\n  operation: CDCOperation\n  /** Table name where the change occurred */\n  table: string\n  /** Schema name */\n  schema: string\n  /** Timestamp when the change occurred */\n  timestamp: Date\n  /** New row data (for INSERT and UPDATE) */\n  newRow?: Row | undefined\n  /** Old row data (for UPDATE and DELETE) */\n  oldRow?: Row | undefined\n  /** Columns that were changed (for UPDATE) */\n  changedColumns?: string[] | undefined\n  /** Transaction ID */\n  xid: number\n  /** Whether this is the last change in the transaction */\n  isLastInTransaction: boolean\n}\n\n/**\n * Options for CDC subscriptions\n */\nexport interface CDCSubscriptionOptions {\n  /** Event types to subscribe to (default: all) */\n  events?: CDCOperation[] | undefined\n  /** SQL filter expression for row-level filtering */\n  filter?: string | undefined\n  /** Resume from this LSN (for exactly-once delivery) */\n  resumeFrom?: string | undefined\n  /** Include old row data for UPDATE/DELETE events */\n  includeOldRow?: boolean | undefined\n  /** Track which columns changed for UPDATE events */\n  trackChangedColumns?: boolean | undefined\n  /** Batch size for event delivery */\n  batchSize?: number | undefined\n  /** Heartbeat interval in milliseconds */\n  heartbeatInterval?: number | undefined\n}\n\n/**\n * CDC Transport interface for streaming database changes\n */\nexport interface CDCTransport {\n  /** Connect to the CDC stream */\n  connect(): Promise<void>\n  /** Disconnect from the CDC stream */\n  disconnect(): Promise<void>\n  /** Check if connected */\n  isConnected(): boolean\n  /** Get the last event ID received */\n  getLastEventId(): string | null\n  /** Subscribe to a table */\n  subscribe(\n    subscriptionId: string,\n    table: string,\n    schema: string,\n    options: CDCSubscriptionOptions\n  ): Promise<void>\n  /** Unsubscribe from a subscription */\n  unsubscribe(subscriptionId: string): Promise<void>\n  /** Set the event handler */\n  onEvent(handler: (subscriptionId: string, event: CDCChangeEvent) => void): void\n  /** Set the error handler */\n  onError(handler: (subscriptionId: string, error: Error) => void): void\n  /** Set the reconnect handler */\n  onReconnect(handler: (attempt: number, lastLsn: string | undefined) => void): void\n  /** Set the close handler */\n  onClose(handler: () => void): void\n}\n\n/**\n * CDC WebSocket transport configuration\n */\nexport interface CDCWsTransportConfig {\n  /** WebSocket URL for the CDC endpoint */\n  url: string\n  /** API key for authentication */\n  apiKey?: string | undefined\n  /** Custom WebSocket implementation */\n  WebSocket?: typeof WebSocket | undefined\n  /** Connection timeout in milliseconds */\n  connectTimeout?: number | undefined\n  /** Ping interval for keepalive in milliseconds */\n  pingInterval?: number | undefined\n}\n\n/**\n * CDC SSE (Server-Sent Events) transport configuration\n */\nexport interface CDCSseTransportConfig {\n  /** URL for the CDC SSE endpoint */\n  url: string\n  /** API key for authentication */\n  apiKey?: string\n  /** Resume from this event ID (Last-Event-ID) */\n  resumeFrom?: string\n  /** Reconnection delay in milliseconds */\n  retryMs?: number\n  /** Custom fetch implementation */\n  fetch?: typeof fetch\n  /** Custom headers */\n  headers?: Record<string, string>\n}\n\n/** PostgreSQL error fields specific to postgres.do */\nexport interface PostgresErrorFields {\n  /** PostgreSQL error code (e.g., '23505' for unique violation) */\n  code?: string | undefined\n  /** Error severity */\n  severity?: string | undefined\n  /** Detailed error message */\n  detail?: string | undefined\n  /** Hint for fixing the error */\n  hint?: string | undefined\n  /** Position in query where error occurred */\n  position?: number | undefined\n  /** Schema name if relevant */\n  schema?: string | undefined\n  /** Table name if relevant */\n  table?: string | undefined\n  /** Column name if relevant */\n  column?: string | undefined\n  /** Constraint name if relevant */\n  constraint?: string | undefined\n}\n\n/**\n * Error thrown by postgres.do client.\n * Extends the shared PostgresError with postgres.do-specific properties.\n */\nexport class PostgresError extends SharedPostgresError {\n  /** Error severity */\n  readonly severity: string\n  /** Detailed error message */\n  readonly detail: string | undefined\n  /** Hint for fixing the error */\n  readonly hint: string | undefined\n  /** Position in query where error occurred */\n  readonly position: number | undefined\n  /** PostgreSQL error code (e.g., '23505' for unique violation) */\n  readonly pgCode: string\n\n  constructor(message: string, fields: PostgresErrorFields = {}) {\n    // Build context object only with defined values to satisfy exactOptionalPropertyTypes\n    const context: ErrorContext = { pgCode: fields.code ?? 'UNKNOWN' }\n    if (fields.schema !== undefined) context.schema = fields.schema\n    if (fields.table !== undefined) context.table = fields.table\n    if (fields.column !== undefined) context.column = fields.column\n    if (fields.constraint !== undefined) context.constraint = fields.constraint\n\n    super(message, {\n      code: 'QUERY_ERROR',\n      context,\n    })\n    // Override name property\n    Object.defineProperty(this, 'name', { value: 'PostgresError', writable: true, configurable: true })\n    // Override code property to return the PostgreSQL error code instead of internal code\n    Object.defineProperty(this, 'code', { value: fields.code ?? 'UNKNOWN', writable: false, configurable: true })\n\n    this.severity = fields.severity ?? 'ERROR'\n    this.detail = fields.detail\n    this.hint = fields.hint\n    this.position = fields.position\n    this.pgCode = fields.code ?? 'UNKNOWN'\n  }\n\n  /** Schema name if relevant */\n  get schema(): string | undefined {\n    return this.context.schema\n  }\n\n  /** Table name if relevant */\n  get table(): string | undefined {\n    return this.context.table\n  }\n\n  /** Column name if relevant */\n  get column(): string | undefined {\n    return this.context.column\n  }\n\n  /** Constraint name if relevant */\n  get constraint(): string | undefined {\n    return this.context.constraint\n  }\n}\n\n/**\n * Connection error.\n * Extends the shared ConnectionError.\n */\nexport class ConnectionError extends SharedConnectionError {\n  constructor(message: string) {\n    super(message)\n    // Override name property\n    Object.defineProperty(this, 'name', { value: 'ConnectionError', writable: true, configurable: true })\n  }\n}\n\n/**\n * Query timeout error.\n * Extends the shared ConnectionTimeoutError.\n */\nexport class TimeoutError extends SharedConnectionTimeoutError {\n  constructor(message: string = 'Query timed out') {\n    // Extract timeout from message if possible, default to 0\n    const timeoutMatch = message.match(/(\\d+)\\s*ms/)\n    const matchedMs = timeoutMatch?.[1]\n    const timeoutMs = matchedMs ? parseInt(matchedMs, 10) : 0\n    super(timeoutMs)\n    // Override name property\n    Object.defineProperty(this, 'name', { value: 'TimeoutError', writable: true, configurable: true })\n    // Override the message if a custom one was provided\n    if (message !== 'Query timed out' && message !== `Connection timed out after ${timeoutMs}ms`) {\n      Object.defineProperty(this, 'message', { value: message, writable: true, configurable: true })\n    }\n  }\n}\n\n// =============================================================================\n// CDC Client Types (High-Level API)\n// =============================================================================\n\n/**\n * Options for CDC client subscription\n */\nexport interface CDCClientSubscribeOptions<T extends Row = Row> extends CDCSubscriptionOptions {\n  /** Called for every change event */\n  onChange?: (event: CDCChangeEvent & { newRow?: T; oldRow?: T }) => void | Promise<void>\n  /** Called for INSERT events */\n  onInsert?: (row: T) => void | Promise<void>\n  /** Called for UPDATE events */\n  onUpdate?: (newRow: T, oldRow?: T) => void | Promise<void>\n  /** Called for DELETE events */\n  onDelete?: (oldRow: T) => void | Promise<void>\n  /** Called when an error occurs */\n  onError?: (error: Error) => void\n}\n\n/**\n * Client subscription interface for CDC streaming\n */\nexport interface CDCClientSubscription<T extends Row = Row> extends AsyncIterable<CDCChangeEvent & { newRow?: T; oldRow?: T }> {\n  /** Unique subscription ID */\n  readonly id: string\n  /** Table name */\n  readonly table: string\n  /** Schema name */\n  readonly schema: string\n  /** Whether the subscription is currently active */\n  readonly isActive: boolean\n  /** Last processed LSN for resumption */\n  readonly lastLsn: string | null\n\n  /** Unsubscribe and stop receiving events */\n  unsubscribe(): Promise<void>\n\n  /** Register a handler for all change events */\n  onChange(handler: (event: CDCChangeEvent & { newRow?: T; oldRow?: T }) => void | Promise<void>): this\n\n  /** Register a handler for INSERT events */\n  onInsert(handler: (row: T) => void | Promise<void>): this\n\n  /** Register a handler for UPDATE events */\n  onUpdate(handler: (newRow: T, oldRow?: T) => void | Promise<void>): this\n\n  /** Register a handler for DELETE events */\n  onDelete(handler: (oldRow: T) => void | Promise<void>): this\n}\n\n/**\n * Information about an active subscription\n */\nexport interface CDCClientSubscriptionInfo {\n  /** Unique subscription ID */\n  id: string\n  /** Table name */\n  table: string\n  /** Schema name */\n  schema: string\n  /** Whether the subscription is currently active */\n  isActive: boolean\n}\n","/**\n * HTTP Transport for postgres.do\n * Sends SQL queries over HTTP to the postgres.do API\n */\n\nimport type {\n  Transport,\n  QueryResult,\n  Row,\n  TransactionOptions,\n  HttpTransportConfig,\n  FieldInfo,\n} from '../types'\nimport { PostgresError, ConnectionError, TimeoutError } from '../types'\n\n/** Default configuration values */\nconst DEFAULTS = {\n  timeout: 30000, // 30 seconds\n  baseUrl: 'https://db.postgres.do',\n}\n\n/**\n * HTTP Transport implementation\n * Stateless transport that sends each query as an HTTP request\n */\nexport class HttpTransport implements Transport {\n  private readonly config: Required<Pick<HttpTransportConfig, 'baseUrl' | 'timeout'>> & HttpTransportConfig\n  private readonly fetchImpl: typeof fetch\n  private connected = false\n\n  constructor(config: HttpTransportConfig) {\n    this.config = {\n      ...DEFAULTS,\n      ...config,\n    }\n    this.fetchImpl = config.fetch || globalThis.fetch\n    this.connected = true\n  }\n\n  /**\n   * Execute a SQL query\n   */\n  async query<T extends Row = Row>(\n    sql: string,\n    params?: unknown[]\n  ): Promise<QueryResult<T>> {\n    const response = await this.request<QueryResponse<T>>('/query', {\n      sql,\n      params: params || [],\n    })\n\n    return this.parseQueryResponse(response)\n  }\n\n  /**\n   * Execute multiple queries in a transaction\n   */\n  async transaction<T>(\n    queries: Array<{ sql: string; params?: unknown[] }>,\n    options?: TransactionOptions\n  ): Promise<T> {\n    const response = await this.request<TransactionResponse>('/transaction', {\n      queries,\n      options: options ? this.serializeTransactionOptions(options) : undefined,\n    })\n\n    // Return the results of all queries\n    return response.results as T\n  }\n\n  /**\n   * Close the transport (no-op for HTTP)\n   */\n  async close(): Promise<void> {\n    this.connected = false\n  }\n\n  /**\n   * Check if transport is connected\n   */\n  isConnected(): boolean {\n    return this.connected\n  }\n\n  /**\n   * Make an HTTP request to the postgres.do API\n   */\n  private async request<T>(\n    path: string,\n    body: unknown\n  ): Promise<T> {\n    const url = `${this.config.baseUrl}${path}`\n    const headers: Record<string, string> = {\n      'Content-Type': 'application/json',\n      ...this.config.headers,\n    }\n\n    if (this.config.apiKey) {\n      headers['Authorization'] = `Bearer ${this.config.apiKey}`\n    }\n\n    const controller = new AbortController()\n    const timeoutId = setTimeout(() => controller.abort(), this.config.timeout)\n\n    try {\n      const response = await this.fetchImpl(url, {\n        method: 'POST',\n        headers,\n        body: JSON.stringify(body),\n        signal: controller.signal,\n      })\n\n      clearTimeout(timeoutId)\n\n      if (!response.ok) {\n        const error = await this.parseErrorResponse(response)\n        throw error\n      }\n\n      return await response.json() as T\n    } catch (error) {\n      clearTimeout(timeoutId)\n\n      if (error instanceof Error) {\n        if (error.name === 'AbortError') {\n          throw new TimeoutError(`Request timed out after ${this.config.timeout}ms`)\n        }\n        if (error instanceof PostgresError || error instanceof ConnectionError) {\n          throw error\n        }\n      }\n\n      throw new ConnectionError(\n        `Failed to connect to postgres.do: ${error instanceof Error ? error.message : String(error)}`\n      )\n    }\n  }\n\n  /**\n   * Parse error response from the API\n   */\n  private async parseErrorResponse(response: Response): Promise<Error> {\n    try {\n      const body = await response.json() as ErrorResponse\n\n      if (body.error?.code) {\n        return new PostgresError(body.error.message || 'Database error', {\n          code: body.error.code,\n          severity: body.error.severity || 'ERROR',\n          detail: body.error.detail,\n          hint: body.error.hint,\n          position: body.error.position,\n          schema: body.error.schema,\n          table: body.error.table,\n          column: body.error.column,\n          constraint: body.error.constraint,\n        })\n      }\n\n      return new ConnectionError(body.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n    } catch {\n      return new ConnectionError(`HTTP ${response.status}: ${response.statusText}`)\n    }\n  }\n\n  /**\n   * Parse query response into QueryResult\n   */\n  private parseQueryResponse<T extends Row>(response: QueryResponse<T>): QueryResult<T> {\n    return {\n      rows: response.rows || [],\n      rowCount: response.rowCount ?? response.rows?.length ?? 0,\n      fields: response.fields || [],\n      command: response.command || 'SELECT',\n    }\n  }\n\n  /**\n   * Serialize transaction options for the API\n   */\n  private serializeTransactionOptions(options: TransactionOptions): Record<string, unknown> {\n    return {\n      isolationLevel: options.isolationLevel,\n      readOnly: options.readOnly,\n      deferrable: options.deferrable,\n    }\n  }\n}\n\n/** API response types */\ninterface QueryResponse<T extends Row = Row> {\n  rows?: T[]\n  rowCount?: number\n  fields?: FieldInfo[]\n  command?: string\n}\n\ninterface TransactionResponse {\n  results: unknown[]\n}\n\ninterface ErrorResponse {\n  error?: {\n    message?: string\n    code?: string\n    severity?: string\n    detail?: string\n    hint?: string\n    position?: number\n    schema?: string\n    table?: string\n    column?: string\n    constraint?: string\n  }\n}\n\n/**\n * Create an HTTP transport instance\n */\nexport function createHttpTransport(config: HttpTransportConfig): HttpTransport {\n  return new HttpTransport(config)\n}\n","/**\n * RpcPromise - A promise wrapper that supports capnweb magic map and pipelining\n *\n * This class enables:\n * - Magic map support for N+1 query elimination\n * - Promise pipelining for batched operations\n * - Lazy execution (queries don't execute until awaited or .map()'d)\n *\n * @example Magic Map\n * ```typescript\n * const usersWithOrders = await db.query('SELECT * FROM users')\n *   .map(users => Promise.all(\n *     users.map(u => db.query('SELECT * FROM orders WHERE user_id = $1', [u.id]))\n *   ))\n * ```\n *\n * @example Promise Pipelining\n * ```typescript\n * const user = db.query('SELECT * FROM users WHERE id = $1', [id])\n * const posts = user.map(u => db.query('SELECT * FROM posts WHERE author = $1', [u.id]))\n * const comments = posts.map(p => db.query('SELECT * FROM comments WHERE post_id = ANY($1)', [p.map(x => x.id)]))\n * const result = await comments // Single round trip!\n * ```\n */\n\nimport type { Row } from '../types'\n\n/**\n * Execution context for RPC pipelining\n * Accumulates queries that can be batched together\n */\nexport interface RpcExecutionContext {\n  /** Add a query to the batch */\n  addQuery(sql: string, params?: unknown[]): number\n  /** Execute all batched queries */\n  executeBatch(): Promise<BatchResult[]>\n  /** Get a pending result by query ID */\n  getResult(queryId: number): Promise<unknown>\n  /** Check if the context is currently collecting queries */\n  isCollecting(): boolean\n  /** Start collecting queries for batching */\n  startCollecting(): void\n  /** Stop collecting and execute batch */\n  stopCollecting(): Promise<void>\n}\n\n/**\n * Result from a batched query\n */\nexport interface BatchResult<T = unknown> {\n  queryId: number\n  rows: T[]\n  fields: Array<{ name: string; dataTypeID: number }>\n  rowCount: number\n  durationMs: number\n}\n\n/**\n * Map function signature for RpcPromise\n */\nexport type MapFn<T, U> = (value: T) => U | Promise<U>\n\n/**\n * RpcPromise implementation\n * Wraps a query operation with magic map and pipelining support\n */\nexport class RpcPromise<T> implements PromiseLike<T> {\n  private executor: () => Promise<T>\n  private cachedResult: T | undefined\n  private executed = false\n  private executing: Promise<T> | null = null\n  private context: RpcExecutionContext | null\n\n  constructor(executor: () => Promise<T>, context?: RpcExecutionContext | null) {\n    this.executor = executor\n    this.context = context ?? null\n  }\n\n  /**\n   * Map over the result with magic map support\n   *\n   * The map function receives the resolved value and can return:\n   * - A plain value\n   * - A Promise\n   * - Another RpcPromise (for pipelining)\n   *\n   * When the callback returns RpcPromises, they are batched together\n   * with the original query for efficient execution.\n   *\n   * @example\n   * ```typescript\n   * const usersWithPosts = db.query('SELECT * FROM users')\n   *   .map(users => Promise.all(\n   *     users.map(u => db.query('SELECT * FROM posts WHERE user_id = $1', [u.id]))\n   *   ))\n   * ```\n   */\n  map<U>(fn: MapFn<T, U>): RpcPromise<U> {\n    return new RpcPromise<U>(async () => {\n      // If we have a context and it's collecting, use batched execution\n      if (this.context?.isCollecting()) {\n        const result = await this.execute()\n        const mapped = fn(result)\n\n        // If the mapped result is also collecting queries, batch them together\n        if (mapped instanceof RpcPromise) {\n          return mapped.execute()\n        }\n\n        return mapped\n      }\n\n      // Standard execution path\n      const result = await this.execute()\n      const mapped = fn(result)\n\n      if (mapped instanceof Promise || mapped instanceof RpcPromise) {\n        return mapped as Promise<U>\n      }\n\n      return mapped\n    }, this.context)\n  }\n\n  /**\n   * FlatMap for when the map function returns an RpcPromise\n   */\n  flatMap<U>(fn: (value: T) => RpcPromise<U>): RpcPromise<U> {\n    return new RpcPromise<U>(async () => {\n      const result = await this.execute()\n      const mapped = fn(result)\n      return mapped.execute()\n    }, this.context)\n  }\n\n  /**\n   * Execute the query and return the result\n   */\n  async execute(): Promise<T> {\n    // Return cached result if already executed\n    if (this.executed && this.cachedResult !== undefined) {\n      return this.cachedResult\n    }\n\n    // If already executing, wait for that execution\n    if (this.executing) {\n      return this.executing\n    }\n\n    // Start execution\n    this.executing = this.executor()\n\n    try {\n      this.cachedResult = await this.executing\n      this.executed = true\n      return this.cachedResult\n    } finally {\n      this.executing = null\n    }\n  }\n\n  /**\n   * Reset the execution state to allow re-execution\n   */\n  reset(): void {\n    this.executed = false\n    this.cachedResult = undefined\n    this.executing = null\n  }\n\n  /**\n   * Check if the promise has been executed\n   */\n  isExecuted(): boolean {\n    return this.executed\n  }\n\n  /**\n   * PromiseLike implementation - makes this thenable\n   */\n  then<TResult1 = T, TResult2 = never>(\n    onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n    onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null\n  ): Promise<TResult1 | TResult2> {\n    return this.execute().then(onfulfilled, onrejected)\n  }\n\n  /**\n   * Catch handler\n   */\n  catch<TResult = never>(\n    onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null\n  ): Promise<T | TResult> {\n    return this.execute().catch(onrejected)\n  }\n\n  /**\n   * Finally handler\n   */\n  finally(onfinally?: (() => void) | null): Promise<T> {\n    return this.execute().finally(onfinally)\n  }\n}\n\n/**\n * Create an RpcPromise from a query function\n */\nexport function createRpcPromise<T>(\n  executor: () => Promise<T>,\n  context?: RpcExecutionContext | null\n): RpcPromise<T> {\n  return new RpcPromise(executor, context)\n}\n\n/**\n * Query result type for typed queries\n */\nexport interface RpcQueryResult<T extends Row = Row> {\n  rows: T[]\n  fields: Array<{ name: string; dataTypeID: number }>\n  rowCount: number\n  durationMs: number\n}\n\n/**\n * Create an RpcPromise that extracts rows from a query result\n */\nexport function createRowsPromise<T extends Row = Row>(\n  executor: () => Promise<RpcQueryResult<T>>,\n  context?: RpcExecutionContext | null\n): RpcPromise<T[]> {\n  return new RpcPromise(async () => {\n    const result = await executor()\n    return result.rows\n  }, context)\n}\n\n/**\n * Batch multiple RpcPromises for efficient execution\n *\n * This collects all queries from the provided promises and executes\n * them in a single batch, then distributes the results.\n *\n * @example\n * ```typescript\n * const [users, orders, products] = await batchExecute([\n *   db.query('SELECT * FROM users'),\n *   db.query('SELECT * FROM orders'),\n *   db.query('SELECT * FROM products'),\n * ])\n * ```\n */\nexport async function batchExecute<T extends readonly RpcPromise<unknown>[]>(\n  promises: T\n): Promise<{ [K in keyof T]: T[K] extends RpcPromise<infer U> ? U : never }> {\n  // Execute all promises in parallel\n  const results = await Promise.all(promises.map(p => p.execute()))\n  return results as { [K in keyof T]: T[K] extends RpcPromise<infer U> ? U : never }\n}\n\n/**\n * Create a magic map wrapper that batches nested queries\n *\n * This enables the N+1 query elimination pattern:\n * ```typescript\n * const usersWithOrders = await magicMap(\n *   db.query('SELECT * FROM users'),\n *   users => users.map(u => db.query('SELECT * FROM orders WHERE user_id = $1', [u.id]))\n * )\n * ```\n */\nexport async function magicMap<T, U>(\n  source: RpcPromise<T[]>,\n  mapFn: (items: T[]) => RpcPromise<U>[]\n): Promise<U[]> {\n  const items = await source.execute()\n  const promises = mapFn(items)\n  return Promise.all(promises.map(p => p.execute()))\n}\n","/**\n * RPC Transport for postgres.do\n *\n * Connects to PostgresDO via capnweb RPC for:\n * - Direct Worker-to-DO communication without HTTP overhead\n * - Promise pipelining for efficient batched operations\n * - Magic map support for N+1 query elimination\n *\n * @see packages/postgres/src/worker/rpc.ts for the server-side RPC API\n * @see packages/postgres/src/worker/proxy.ts for the proxy session pool\n */\n\nimport type {\n  Transport,\n  QueryResult,\n  Row,\n  TransactionOptions,\n  FieldInfo,\n} from '../types'\nimport { PostgresError, ConnectionError, TimeoutError } from '../types'\nimport { RpcPromise, createRpcPromise, type RpcExecutionContext, type BatchResult } from '../rpc/rpc-promise'\n\n/**\n * RPC Transport configuration\n */\nexport interface RpcTransportConfig {\n  /** WebSocket URL for the capnweb RPC endpoint */\n  url: string\n  /** API key for authentication */\n  apiKey?: string | undefined\n  /** Custom WebSocket implementation */\n  WebSocket?: typeof WebSocket | undefined\n  /** Connection timeout in milliseconds */\n  connectTimeout?: number | undefined\n  /** Request timeout in milliseconds */\n  requestTimeout?: number | undefined\n  /** Enable automatic batching */\n  autoBatch?: boolean | undefined\n  /** Batch delay in milliseconds (how long to wait for more queries) */\n  batchDelayMs?: number | undefined\n}\n\n/** Default configuration values */\nconst DEFAULTS = {\n  url: 'wss://db.postgres.do/rpc',\n  connectTimeout: 10000,\n  requestTimeout: 30000,\n  autoBatch: true,\n  batchDelayMs: 0, // No delay by default - use microtask batching\n}\n\n/** RPC message types */\nenum RpcMessageType {\n  // Requests\n  Query = 'query',\n  Batch = 'batch',\n  BatchTransaction = 'batch_tx',\n  Transaction = 'transaction',\n  TransactionQuery = 'tx_query',\n  TransactionCommit = 'tx_commit',\n  TransactionRollback = 'tx_rollback',\n  Ping = 'ping',\n  Auth = 'auth',\n\n  // Responses\n  QueryResult = 'query_result',\n  BatchResult = 'batch_result',\n  TransactionResult = 'tx_result',\n  Error = 'error',\n  Pong = 'pong',\n  AuthResult = 'auth_result',\n}\n\n/** Pending request waiting for a response */\ninterface PendingRequest<T = unknown> {\n  resolve: (value: T) => void\n  reject: (error: Error) => void\n  timeout: ReturnType<typeof setTimeout>\n}\n\n/** Pending batch of queries */\ninterface PendingBatch {\n  queries: Array<{ sql: string; params?: unknown[] }>\n  resolvers: Array<{\n    resolve: (value: BatchResult) => void\n    reject: (error: Error) => void\n  }>\n  timer: ReturnType<typeof setTimeout> | null\n}\n\n/** Resolved config with optional properties handled */\ninterface ResolvedConfig {\n  url: string\n  apiKey: string | undefined\n  WebSocket: typeof WebSocket | undefined\n  connectTimeout: number\n  requestTimeout: number\n  autoBatch: boolean\n  batchDelayMs: number\n}\n\n/**\n * RPC Transport implementation\n *\n * Provides capnweb-style RPC communication with PostgresDO:\n * - Automatic query batching for N+1 elimination\n * - Promise pipelining support\n * - WebSocket-based persistent connection\n */\nexport class RpcTransport implements Transport, RpcExecutionContext {\n  private readonly config: ResolvedConfig\n  private readonly WebSocketImpl: typeof WebSocket\n  private ws: WebSocket | null = null\n  private connected = false\n  private authenticated = false\n  private connecting: Promise<void> | null = null\n  private requestId = 0\n  private pendingRequests = new Map<number, PendingRequest>()\n  private pendingBatch: PendingBatch | null = null\n  private collecting = false\n\n  constructor(config: RpcTransportConfig) {\n    this.config = {\n      url: config.url ?? DEFAULTS.url,\n      apiKey: config.apiKey,\n      WebSocket: config.WebSocket,\n      connectTimeout: config.connectTimeout ?? DEFAULTS.connectTimeout,\n      requestTimeout: config.requestTimeout ?? DEFAULTS.requestTimeout,\n      autoBatch: config.autoBatch ?? DEFAULTS.autoBatch,\n      batchDelayMs: config.batchDelayMs ?? DEFAULTS.batchDelayMs,\n    }\n    this.WebSocketImpl = config.WebSocket || globalThis.WebSocket\n  }\n\n  // ========== RpcExecutionContext implementation ==========\n\n  /**\n   * Add a query to the current batch\n   */\n  addQuery(sql: string, params?: unknown[]): number {\n    if (!this.pendingBatch) {\n      this.pendingBatch = {\n        queries: [],\n        resolvers: [],\n        timer: null,\n      }\n\n      // Schedule batch execution on next microtask\n      if (this.config.batchDelayMs === 0) {\n        queueMicrotask(() => this.flushBatch())\n      } else {\n        this.pendingBatch.timer = setTimeout(\n          () => this.flushBatch(),\n          this.config.batchDelayMs\n        )\n      }\n    }\n\n    const queryId = this.pendingBatch.queries.length\n    this.pendingBatch.queries.push({ sql, params: params ?? [] })\n\n    return queryId\n  }\n\n  /**\n   * Execute all batched queries\n   */\n  async executeBatch(): Promise<BatchResult[]> {\n    if (!this.pendingBatch || this.pendingBatch.queries.length === 0) {\n      return []\n    }\n\n    await this.ensureConnected()\n\n    const batch = this.pendingBatch\n    this.pendingBatch = null\n\n    if (batch.timer) {\n      clearTimeout(batch.timer)\n    }\n\n    const id = this.nextRequestId()\n    const response = await this.sendRequest<RpcBatchResponse>(id, {\n      type: RpcMessageType.Batch,\n      id,\n      queries: batch.queries,\n    })\n\n    return response.results.map((r, i) => ({\n      queryId: i,\n      rows: r.rows,\n      fields: r.fields,\n      rowCount: r.rowCount,\n      durationMs: r.durationMs,\n    }))\n  }\n\n  /**\n   * Get a pending result by query ID\n   */\n  async getResult(_queryId: number): Promise<unknown> {\n    // Results are returned in order from executeBatch\n    // This method is for future optimization where results\n    // can be streamed as they complete\n    throw new Error('getResult is not yet implemented for streaming results')\n  }\n\n  /**\n   * Check if the context is currently collecting queries\n   */\n  isCollecting(): boolean {\n    return this.collecting\n  }\n\n  /**\n   * Start collecting queries for batching\n   */\n  startCollecting(): void {\n    this.collecting = true\n  }\n\n  /**\n   * Stop collecting and execute batch\n   */\n  async stopCollecting(): Promise<void> {\n    this.collecting = false\n    await this.flushBatch()\n  }\n\n  /**\n   * Flush the pending batch immediately\n   */\n  private async flushBatch(): Promise<void> {\n    if (!this.pendingBatch || this.pendingBatch.queries.length === 0) {\n      return\n    }\n\n    const batch = this.pendingBatch\n    this.pendingBatch = null\n\n    if (batch.timer) {\n      clearTimeout(batch.timer)\n    }\n\n    try {\n      await this.ensureConnected()\n\n      const id = this.nextRequestId()\n      const response = await this.sendRequest<RpcBatchResponse>(id, {\n        type: RpcMessageType.Batch,\n        id,\n        queries: batch.queries,\n      })\n\n      // Resolve all pending queries with their results\n      for (let i = 0; i < batch.resolvers.length; i++) {\n        const resolver = batch.resolvers[i]\n        const result = response.results[i]\n        if (resolver && result) {\n          resolver.resolve({\n            queryId: i,\n            rows: result.rows,\n            fields: result.fields,\n            rowCount: result.rowCount,\n            durationMs: result.durationMs,\n          })\n        } else if (resolver) {\n          resolver.reject(new Error(`No result for query ${i}`))\n        }\n      }\n    } catch (error) {\n      // Reject all pending queries with the error\n      for (const resolver of batch.resolvers) {\n        if (resolver) {\n          resolver.reject(error instanceof Error ? error : new Error(String(error)))\n        }\n      }\n    }\n  }\n\n  // ========== Transport interface implementation ==========\n\n  /**\n   * Execute a SQL query with RpcPromise support\n   */\n  queryRpc<T extends Row = Row>(\n    sql: string,\n    params?: unknown[]\n  ): RpcPromise<T[]> {\n    return createRpcPromise(async () => {\n      const result = await this.query<T>(sql, params)\n      return result.rows\n    }, this)\n  }\n\n  /**\n   * Execute a SQL query and return full result\n   */\n  async query<T extends Row = Row>(\n    sql: string,\n    params?: unknown[]\n  ): Promise<QueryResult<T>> {\n    // If autoBatch is enabled and we're in a batching context\n    if (this.config.autoBatch && this.collecting) {\n      return new Promise((resolve, reject) => {\n        const queryId = this.addQuery(sql, params)\n\n        if (!this.pendingBatch) {\n          reject(new Error('Batch was flushed before query could be added'))\n          return\n        }\n\n        this.pendingBatch.resolvers[queryId] = {\n          resolve: (result) => {\n            resolve({\n              rows: result.rows as T[],\n              fields: result.fields as FieldInfo[],\n              rowCount: result.rowCount,\n              command: 'SELECT',\n            })\n          },\n          reject,\n        }\n      })\n    }\n\n    await this.ensureConnected()\n\n    const id = this.nextRequestId()\n    const response = await this.sendRequest<RpcQueryResponse<T>>(id, {\n      type: RpcMessageType.Query,\n      id,\n      sql,\n      params: params || [],\n    })\n\n    return {\n      rows: response.rows || [],\n      fields: (response.fields || []) as FieldInfo[],\n      rowCount: response.rowCount ?? response.rows?.length ?? 0,\n      command: response.command || 'SELECT',\n    }\n  }\n\n  /**\n   * Execute a batch of queries\n   */\n  async batch<T extends Row = Row>(\n    queries: Array<{ sql: string; params?: unknown[] }>\n  ): Promise<Array<QueryResult<T>>> {\n    await this.ensureConnected()\n\n    const id = this.nextRequestId()\n    const response = await this.sendRequest<RpcBatchResponse>(id, {\n      type: RpcMessageType.Batch,\n      id,\n      queries,\n    })\n\n    return response.results.map(r => ({\n      rows: r.rows as T[],\n      fields: r.fields as FieldInfo[],\n      rowCount: r.rowCount,\n      command: 'SELECT',\n    }))\n  }\n\n  /**\n   * Execute a batch of queries within a transaction\n   */\n  async batchTransaction<T extends Row = Row>(\n    queries: Array<{ sql: string; params?: unknown[] }>,\n    options?: TransactionOptions\n  ): Promise<Array<QueryResult<T>>> {\n    await this.ensureConnected()\n\n    const id = this.nextRequestId()\n    const response = await this.sendRequest<RpcBatchResponse>(id, {\n      type: RpcMessageType.BatchTransaction,\n      id,\n      queries,\n      options: options ? this.serializeTransactionOptions(options) : undefined,\n    })\n\n    return response.results.map(r => ({\n      rows: r.rows as T[],\n      fields: r.fields as FieldInfo[],\n      rowCount: r.rowCount,\n      command: 'SELECT',\n    }))\n  }\n\n  /**\n   * Execute multiple queries in a transaction (Transport interface)\n   */\n  async transaction<T>(\n    queries: Array<{ sql: string; params?: unknown[] }>,\n    options?: TransactionOptions\n  ): Promise<T> {\n    const results = await this.batchTransaction(queries, options)\n    return results as T\n  }\n\n  /**\n   * Close the WebSocket connection\n   */\n  async close(): Promise<void> {\n    // Flush any pending batch\n    if (this.pendingBatch) {\n      await this.flushBatch()\n    }\n\n    this.rejectAllPending(new ConnectionError('Connection closed'))\n\n    if (this.ws) {\n      this.ws.close(1000, 'Client closing connection')\n      this.ws = null\n    }\n\n    this.connected = false\n    this.authenticated = false\n    this.connecting = null\n  }\n\n  /**\n   * Check if transport is connected\n   */\n  isConnected(): boolean {\n    return this.connected && this.authenticated\n  }\n\n  // ========== Private methods ==========\n\n  /**\n   * Ensure the WebSocket is connected and authenticated\n   */\n  private async ensureConnected(): Promise<void> {\n    if (this.isConnected()) {\n      return\n    }\n\n    if (this.connecting) {\n      return this.connecting\n    }\n\n    this.connecting = this.connect()\n    try {\n      await this.connecting\n    } finally {\n      this.connecting = null\n    }\n  }\n\n  /**\n   * Establish WebSocket connection\n   */\n  private async connect(): Promise<void> {\n    return new Promise((resolve, reject) => {\n      const timeoutId = setTimeout(() => {\n        reject(new TimeoutError(`WebSocket connection timed out after ${this.config.connectTimeout}ms`))\n        if (this.ws) {\n          this.ws.close()\n          this.ws = null\n        }\n      }, this.config.connectTimeout)\n\n      try {\n        this.ws = new this.WebSocketImpl(this.config.url)\n      } catch (error) {\n        clearTimeout(timeoutId)\n        reject(new ConnectionError(`Failed to create WebSocket: ${error instanceof Error ? error.message : String(error)}`))\n        return\n      }\n\n      this.ws.onopen = async () => {\n        this.connected = true\n\n        // Authenticate if API key is provided\n        if (this.config.apiKey) {\n          try {\n            await this.authenticate()\n            clearTimeout(timeoutId)\n            resolve()\n          } catch (error) {\n            clearTimeout(timeoutId)\n            reject(error)\n          }\n        } else {\n          this.authenticated = true\n          clearTimeout(timeoutId)\n          resolve()\n        }\n      }\n\n      this.ws.onmessage = (event) => {\n        this.handleMessage(event.data)\n      }\n\n      this.ws.onerror = () => {\n        clearTimeout(timeoutId)\n        const error = new ConnectionError('WebSocket error occurred')\n        this.rejectAllPending(error)\n        reject(error)\n      }\n\n      this.ws.onclose = (event) => {\n        clearTimeout(timeoutId)\n        this.connected = false\n        this.authenticated = false\n\n        if (!event.wasClean) {\n          const error = new ConnectionError(`WebSocket closed unexpectedly: ${event.code} ${event.reason}`)\n          this.rejectAllPending(error)\n          reject(error)\n        }\n      }\n    })\n  }\n\n  /**\n   * Authenticate with the API key\n   */\n  private async authenticate(): Promise<void> {\n    const id = this.nextRequestId()\n    const response = await this.sendRequest<RpcAuthResponse>(id, {\n      type: RpcMessageType.Auth,\n      id,\n      apiKey: this.config.apiKey,\n    })\n\n    if (!response.success) {\n      throw new ConnectionError('Authentication failed')\n    }\n\n    this.authenticated = true\n  }\n\n  /**\n   * Send a request and wait for response\n   */\n  private sendRequest<T>(id: number, message: unknown): Promise<T> {\n    return new Promise((resolve, reject) => {\n      const timeout = setTimeout(() => {\n        this.pendingRequests.delete(id)\n        reject(new TimeoutError('Request timed out'))\n      }, this.config.requestTimeout)\n\n      this.pendingRequests.set(id, {\n        resolve: resolve as (value: unknown) => void,\n        reject,\n        timeout,\n      })\n\n      if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n        this.ws.send(JSON.stringify(message))\n      } else {\n        clearTimeout(timeout)\n        this.pendingRequests.delete(id)\n        reject(new ConnectionError('WebSocket is not connected'))\n      }\n    })\n  }\n\n  /**\n   * Handle incoming WebSocket message\n   */\n  private handleMessage(data: string): void {\n    let message: RpcIncomingMessage\n\n    try {\n      message = JSON.parse(data)\n    } catch {\n      console.error('Failed to parse RPC message:', data)\n      return\n    }\n\n    // Handle pong messages\n    if (message.type === RpcMessageType.Pong) {\n      return\n    }\n\n    // Handle responses to pending requests\n    if ('id' in message && typeof message.id === 'number') {\n      const pending = this.pendingRequests.get(message.id)\n      if (pending) {\n        clearTimeout(pending.timeout)\n        this.pendingRequests.delete(message.id)\n\n        if (message.type === RpcMessageType.Error) {\n          const errorMessage = message as RpcErrorMessage\n          pending.reject(new PostgresError(errorMessage.error.message || 'Database error', {\n            code: errorMessage.error.code,\n            severity: errorMessage.error.severity || 'ERROR',\n            detail: errorMessage.error.detail,\n            hint: errorMessage.error.hint,\n            position: errorMessage.error.position,\n            schema: errorMessage.error.schema,\n            table: errorMessage.error.table,\n            column: errorMessage.error.column,\n            constraint: errorMessage.error.constraint,\n          }))\n        } else {\n          pending.resolve(message)\n        }\n      }\n    }\n  }\n\n  /**\n   * Reject all pending requests\n   */\n  private rejectAllPending(error: Error): void {\n    for (const [, pending] of this.pendingRequests) {\n      clearTimeout(pending.timeout)\n      pending.reject(error)\n    }\n    this.pendingRequests.clear()\n\n    // Also reject pending batch\n    if (this.pendingBatch) {\n      for (const resolver of this.pendingBatch.resolvers) {\n        resolver.reject(error)\n      }\n      if (this.pendingBatch.timer) {\n        clearTimeout(this.pendingBatch.timer)\n      }\n      this.pendingBatch = null\n    }\n  }\n\n  /**\n   * Get next request ID\n   */\n  private nextRequestId(): number {\n    return ++this.requestId\n  }\n\n  /**\n   * Serialize transaction options\n   */\n  private serializeTransactionOptions(options: TransactionOptions): Record<string, unknown> {\n    return {\n      isolationLevel: options.isolationLevel,\n      readOnly: options.readOnly,\n      deferrable: options.deferrable,\n    }\n  }\n}\n\n/** RPC message type definitions */\ninterface RpcQueryResponse<T extends Row = Row> {\n  type: RpcMessageType.QueryResult\n  id: number\n  rows?: T[]\n  rowCount?: number\n  fields?: Array<{ name: string; dataTypeID: number }>\n  command?: string\n}\n\ninterface RpcBatchResponse {\n  type: RpcMessageType.BatchResult\n  id: number\n  results: Array<{\n    rows: Row[]\n    fields: Array<{ name: string; dataTypeID: number }>\n    rowCount: number\n    durationMs: number\n  }>\n  durationMs: number\n}\n\ninterface RpcAuthResponse {\n  type: RpcMessageType.AuthResult\n  id: number\n  success: boolean\n}\n\ninterface RpcErrorMessage {\n  type: RpcMessageType.Error\n  id: number\n  error: {\n    message?: string\n    code?: string\n    severity?: string\n    detail?: string\n    hint?: string\n    position?: number\n    schema?: string\n    table?: string\n    column?: string\n    constraint?: string\n  }\n}\n\ntype RpcIncomingMessage =\n  | RpcQueryResponse\n  | RpcBatchResponse\n  | RpcAuthResponse\n  | RpcErrorMessage\n  | { type: RpcMessageType.Pong }\n\n/**\n * Create an RPC transport instance\n */\nexport function createRpcTransport(config: RpcTransportConfig): RpcTransport {\n  return new RpcTransport(config)\n}\n","/**\n * CDC WebSocket Transport for postgres.do\n *\n * Provides real-time change data capture streaming via WebSocket:\n * - Bidirectional communication for subscription management\n * - Automatic reconnection with exponential backoff\n * - LSN-based resumption for reliable delivery\n * - Heartbeat/ping-pong for connection keepalive\n */\n\nimport type {\n  Row,\n  CDCChangeEvent,\n  CDCTransport,\n  CDCSubscriptionOptions,\n  CDCWsTransportConfig,\n  CDCOperation,\n} from '../types'\nimport { ConnectionError, TimeoutError } from '../types'\nimport type { PendingRequest } from './base-transport'\n\n/**\n * CDC WebSocket message types\n */\nenum CDCMessageType {\n  // Client -> Server\n  Subscribe = 'subscribe',\n  Unsubscribe = 'unsubscribe',\n  Ping = 'ping',\n  Auth = 'auth',\n  Ack = 'ack',\n\n  // Server -> Client\n  Event = 'event',\n  Error = 'error',\n  Pong = 'pong',\n  AuthResult = 'auth_result',\n  SubscribeResult = 'subscribe_result',\n  UnsubscribeResult = 'unsubscribe_result',\n}\n\n/**\n * Incoming CDC event message from server\n */\ninterface CDCEventMessage {\n  type: CDCMessageType.Event\n  subscriptionId: string\n  event: {\n    id: string\n    lsn: string\n    operation: CDCOperation\n    table: string\n    schema: string\n    timestamp: string\n    newRow?: Row\n    oldRow?: Row\n    changedColumns?: string[]\n    xid: number\n    isLastInTransaction: boolean\n  }\n}\n\n/**\n * Error message from server\n */\ninterface CDCErrorMessage {\n  type: CDCMessageType.Error\n  subscriptionId?: string\n  error: {\n    message: string\n    code?: string\n  }\n}\n\n/**\n * Subscription result message\n */\ninterface CDCSubscribeResultMessage {\n  type: CDCMessageType.SubscribeResult\n  subscriptionId: string\n  success: boolean\n  error?: string\n}\n\n/**\n * Unsubscribe result message\n */\ninterface CDCUnsubscribeResultMessage {\n  type: CDCMessageType.UnsubscribeResult\n  subscriptionId: string\n  success: boolean\n}\n\n/**\n * Auth result message\n */\ninterface CDCAuthResultMessage {\n  type: CDCMessageType.AuthResult\n  success: boolean\n  error?: string\n}\n\ntype CDCIncomingMessage =\n  | CDCEventMessage\n  | CDCErrorMessage\n  | CDCSubscribeResultMessage\n  | CDCUnsubscribeResultMessage\n  | CDCAuthResultMessage\n  | { type: CDCMessageType.Pong }\n\n/**\n * Default configuration values\n */\nconst DEFAULTS = {\n  connectTimeout: 10000,\n  pingInterval: 0, // Disabled by default for test compatibility; production code should set explicitly\n  reconnectBaseDelay: 1000,\n  maxReconnectDelay: 30000,\n  maxReconnectAttempts: 10,\n} as const\n\n/**\n * CDC WebSocket Transport implementation\n *\n * Extends BaseCDCTransport for common functionality.\n */\nexport class CDCWsTransport implements CDCTransport {\n  private readonly config: {\n    readonly url: string\n    readonly apiKey?: string | undefined\n    readonly WebSocket?: typeof WebSocket | undefined\n    readonly connectTimeout: number\n    readonly pingInterval: number\n  }\n  private readonly WebSocketImpl: typeof WebSocket\n  private ws: WebSocket | null = null\n  private connected = false\n  private authenticated = false\n  private connecting: Promise<void> | null = null\n  private lastEventId: string | null = null\n  private reconnectAttempt = 0\n  private reconnectTimer: ReturnType<typeof setTimeout> | null = null\n  private pingTimer: ReturnType<typeof setInterval> | null = null\n  private shouldReconnect = true\n\n  // Pending requests\n  private pendingSubscriptions = new Map<string, PendingRequest<void>>()\n  private pendingUnsubscriptions = new Map<string, PendingRequest<void>>()\n  private pendingAuth: PendingRequest<void> | null = null\n\n  // Event handlers\n  private eventHandler: ((subscriptionId: string, event: CDCChangeEvent) => void) | null = null\n  private errorHandler: ((subscriptionId: string, error: Error) => void) | null = null\n  private reconnectHandler: ((attempt: number, lastLsn: string | undefined) => void) | null = null\n  private closeHandler: (() => void) | null = null\n\n  // Active subscriptions for reconnection\n  private activeSubscriptions = new Map<\n    string,\n    {\n      table: string\n      schema: string\n      options: CDCSubscriptionOptions\n    }\n  >()\n\n  constructor(config: CDCWsTransportConfig) {\n    this.config = {\n      url: config.url,\n      apiKey: config.apiKey,\n      WebSocket: config.WebSocket,\n      connectTimeout: config.connectTimeout ?? DEFAULTS.connectTimeout,\n      pingInterval: config.pingInterval ?? DEFAULTS.pingInterval,\n    }\n    this.WebSocketImpl = config.WebSocket || globalThis.WebSocket\n  }\n\n  /**\n   * Connect to the CDC stream\n   */\n  async connect(): Promise<void> {\n    if (this.connected && this.authenticated) {\n      return\n    }\n\n    if (this.connecting) {\n      return this.connecting\n    }\n\n    this.shouldReconnect = true\n    this.connecting = this._connect()\n\n    try {\n      await this.connecting\n    } finally {\n      this.connecting = null\n    }\n  }\n\n  /**\n   * Internal connect implementation\n   */\n  private _connect(): Promise<void> {\n    return new Promise((resolve, reject) => {\n      const timeoutId = setTimeout(() => {\n        reject(new TimeoutError(`WebSocket connection timed out after ${this.config.connectTimeout}ms`))\n        if (this.ws) {\n          this.ws.close()\n          this.ws = null\n        }\n      }, this.config.connectTimeout)\n\n      try {\n        this.ws = new this.WebSocketImpl(this.config.url)\n      } catch (error) {\n        clearTimeout(timeoutId)\n        reject(\n          new ConnectionError(\n            `Failed to create WebSocket: ${error instanceof Error ? error.message : String(error)}`\n          )\n        )\n        return\n      }\n\n      this.ws.onopen = () => {\n        this.connected = true\n        this.reconnectAttempt = 0\n\n        // Authenticate if API key is provided\n        if (this.config.apiKey) {\n          this.authenticate()\n            .then(() => {\n              clearTimeout(timeoutId)\n              resolve()\n              // Start ping interval after connect resolves\n              if (this.config.pingInterval > 0) {\n                this.startPingInterval()\n              }\n            })\n            .catch((error) => {\n              clearTimeout(timeoutId)\n              reject(error)\n            })\n        } else {\n          this.authenticated = true\n          clearTimeout(timeoutId)\n          resolve()\n          // Start ping interval after connect resolves\n          if (this.config.pingInterval > 0) {\n            this.startPingInterval()\n          }\n        }\n      }\n\n      this.ws.onmessage = (event) => {\n        this.handleMessage(event.data)\n      }\n\n      this.ws.onerror = () => {\n        clearTimeout(timeoutId)\n        const error = new ConnectionError('WebSocket error occurred')\n        this.rejectAllPending(error)\n        reject(error)\n      }\n\n      this.ws.onclose = (event) => {\n        clearTimeout(timeoutId)\n        this.connected = false\n        this.authenticated = false\n        this.stopPingInterval()\n\n        if (!event.wasClean && this.shouldReconnect) {\n          this.scheduleReconnect()\n        } else if (!this.shouldReconnect) {\n          this.closeHandler?.()\n        } else {\n          const error = new ConnectionError(`WebSocket closed: ${event.code} ${event.reason}`)\n          this.rejectAllPending(error)\n          reject(error)\n        }\n      }\n    })\n  }\n\n  /**\n   * Authenticate with the API key\n   */\n  private authenticate(): Promise<void> {\n    return new Promise((resolve, reject) => {\n      const timeoutId = setTimeout(() => {\n        this.pendingAuth = null\n        reject(new TimeoutError('Authentication timed out'))\n      }, this.config.connectTimeout)\n\n      this.pendingAuth = {\n        resolve: () => {\n          clearTimeout(timeoutId)\n          this.pendingAuth = null\n          this.authenticated = true\n          resolve()\n        },\n        reject: (error: Error) => {\n          clearTimeout(timeoutId)\n          this.pendingAuth = null\n          reject(error)\n        },\n        timeout: timeoutId,\n      }\n\n      this.send({\n        type: CDCMessageType.Auth,\n        apiKey: this.config.apiKey,\n      })\n    })\n  }\n\n  /**\n   * Disconnect from the CDC stream\n   */\n  async disconnect(): Promise<void> {\n    this.shouldReconnect = false\n\n    if (this.reconnectTimer) {\n      clearTimeout(this.reconnectTimer)\n      this.reconnectTimer = null\n    }\n\n    this.stopPingInterval()\n    this.rejectAllPending(new ConnectionError('Connection closed'))\n\n    if (this.ws) {\n      this.ws.close(1000, 'Client closing connection')\n      this.ws = null\n    }\n\n    this.connected = false\n    this.authenticated = false\n    this.activeSubscriptions.clear()\n    this.closeHandler?.()\n  }\n\n  /**\n   * Check if connected\n   */\n  isConnected(): boolean {\n    return this.connected && this.authenticated\n  }\n\n  /**\n   * Get the last event ID received\n   */\n  getLastEventId(): string | null {\n    return this.lastEventId\n  }\n\n  /**\n   * Subscribe to a table\n   */\n  async subscribe(\n    subscriptionId: string,\n    table: string,\n    schema: string,\n    options: CDCSubscriptionOptions\n  ): Promise<void> {\n    return new Promise((resolve, reject) => {\n      const timeoutId = setTimeout(() => {\n        this.pendingSubscriptions.delete(subscriptionId)\n        reject(new TimeoutError('Subscription request timed out'))\n      }, this.config.connectTimeout)\n\n      this.pendingSubscriptions.set(subscriptionId, {\n        resolve: () => {\n          clearTimeout(timeoutId)\n          // Store for reconnection\n          this.activeSubscriptions.set(subscriptionId, { table, schema, options })\n          resolve()\n        },\n        reject: (error) => {\n          clearTimeout(timeoutId)\n          reject(error)\n        },\n        timeout: timeoutId,\n      })\n\n      this.send({\n        type: CDCMessageType.Subscribe,\n        subscriptionId,\n        table,\n        schema,\n        options: {\n          events: options.events,\n          filter: options.filter,\n          resumeFrom: options.resumeFrom,\n          includeOldRow: options.includeOldRow,\n          trackChangedColumns: options.trackChangedColumns,\n          batchSize: options.batchSize,\n          heartbeatInterval: options.heartbeatInterval,\n        },\n      })\n    })\n  }\n\n  /**\n   * Unsubscribe from a subscription\n   */\n  async unsubscribe(subscriptionId: string): Promise<void> {\n    this.activeSubscriptions.delete(subscriptionId)\n\n    return new Promise((resolve) => {\n      const timeoutId = setTimeout(() => {\n        this.pendingUnsubscriptions.delete(subscriptionId)\n        // Resolve anyway on timeout - server may have already processed\n        resolve()\n      }, this.config.connectTimeout)\n\n      this.pendingUnsubscriptions.set(subscriptionId, {\n        resolve: () => {\n          clearTimeout(timeoutId)\n          resolve()\n        },\n        reject: () => {\n          clearTimeout(timeoutId)\n          // Still resolve on reject for unsubscribe\n          resolve()\n        },\n        timeout: timeoutId,\n      })\n\n      this.send({\n        type: CDCMessageType.Unsubscribe,\n        subscriptionId,\n      })\n    })\n  }\n\n  /**\n   * Set the event handler\n   */\n  onEvent(handler: (subscriptionId: string, event: CDCChangeEvent) => void): void {\n    this.eventHandler = handler\n  }\n\n  /**\n   * Set the error handler\n   */\n  onError(handler: (subscriptionId: string, error: Error) => void): void {\n    this.errorHandler = handler\n  }\n\n  /**\n   * Set the reconnect handler\n   */\n  onReconnect(handler: (attempt: number, lastLsn: string | undefined) => void): void {\n    this.reconnectHandler = handler\n  }\n\n  /**\n   * Set the close handler\n   */\n  onClose(handler: () => void): void {\n    this.closeHandler = handler\n  }\n\n  /**\n   * Send a message\n   */\n  private send(message: unknown): void {\n    // Use WebSocketImpl for the OPEN constant to support custom WebSocket implementations in tests\n    if (this.ws && this.ws.readyState === this.WebSocketImpl.OPEN) {\n      this.ws.send(JSON.stringify(message))\n    }\n  }\n\n  /**\n   * Handle incoming message\n   */\n  private handleMessage(data: string): void {\n    let message: CDCIncomingMessage\n\n    try {\n      message = JSON.parse(data)\n    } catch {\n      console.error('Failed to parse CDC message:', data)\n      return\n    }\n\n    switch (message.type) {\n      case CDCMessageType.Event:\n        this.handleEventMessage(message)\n        break\n\n      case CDCMessageType.Error:\n        this.handleErrorMessage(message)\n        break\n\n      case CDCMessageType.SubscribeResult:\n        this.handleSubscribeResult(message)\n        break\n\n      case CDCMessageType.UnsubscribeResult:\n        this.handleUnsubscribeResult(message)\n        break\n\n      case CDCMessageType.AuthResult:\n        this.handleAuthResult(message)\n        break\n\n      case CDCMessageType.Pong:\n        // Heartbeat response - connection is alive\n        break\n\n      default:\n        // Unknown message type - ignore\n        break\n    }\n  }\n\n  /**\n   * Handle CDC event message\n   */\n  private handleEventMessage(message: CDCEventMessage): void {\n    const { subscriptionId, event } = message\n\n    // Update last event ID\n    this.lastEventId = event.lsn\n\n    // Convert to CDCChangeEvent\n    const changeEvent: CDCChangeEvent = {\n      id: event.id,\n      lsn: event.lsn,\n      operation: event.operation,\n      table: event.table,\n      schema: event.schema,\n      timestamp: new Date(event.timestamp),\n      newRow: event.newRow,\n      oldRow: event.oldRow,\n      changedColumns: event.changedColumns,\n      xid: event.xid,\n      isLastInTransaction: event.isLastInTransaction,\n    }\n\n    this.eventHandler?.(subscriptionId, changeEvent)\n\n    // Send ACK\n    this.send({\n      type: CDCMessageType.Ack,\n      subscriptionId,\n      lsn: event.lsn,\n    })\n  }\n\n  /**\n   * Handle error message\n   */\n  private handleErrorMessage(message: CDCErrorMessage): void {\n    const error = new Error(message.error.message)\n\n    if (message.subscriptionId) {\n      this.errorHandler?.(message.subscriptionId, error)\n    } else {\n      // Global error - notify all subscriptions\n      for (const subscriptionId of this.activeSubscriptions.keys()) {\n        this.errorHandler?.(subscriptionId, error)\n      }\n    }\n  }\n\n  /**\n   * Handle subscribe result\n   */\n  private handleSubscribeResult(message: CDCSubscribeResultMessage): void {\n    const pending = this.pendingSubscriptions.get(message.subscriptionId)\n    if (pending) {\n      this.pendingSubscriptions.delete(message.subscriptionId)\n      clearTimeout(pending.timeout)\n\n      if (message.success) {\n        pending.resolve()\n      } else {\n        pending.reject(new Error(message.error || 'Subscription failed'))\n      }\n    }\n  }\n\n  /**\n   * Handle unsubscribe result\n   */\n  private handleUnsubscribeResult(message: CDCUnsubscribeResultMessage): void {\n    const pending = this.pendingUnsubscriptions.get(message.subscriptionId)\n    if (pending) {\n      this.pendingUnsubscriptions.delete(message.subscriptionId)\n      clearTimeout(pending.timeout)\n      pending.resolve()\n    }\n  }\n\n  /**\n   * Handle auth result\n   */\n  private handleAuthResult(message: CDCAuthResultMessage): void {\n    if (this.pendingAuth) {\n      if (message.success) {\n        this.pendingAuth.resolve()\n      } else {\n        this.pendingAuth.reject(new ConnectionError(message.error || 'Authentication failed'))\n      }\n    }\n  }\n\n  /**\n   * Start ping interval for keepalive\n   */\n  private startPingInterval(): void {\n    this.stopPingInterval()\n    if (this.config.pingInterval > 0) {\n      this.pingTimer = setInterval(() => {\n        this.send({ type: CDCMessageType.Ping })\n      }, this.config.pingInterval)\n    }\n  }\n\n  /**\n   * Stop ping interval\n   */\n  private stopPingInterval(): void {\n    if (this.pingTimer) {\n      clearInterval(this.pingTimer)\n      this.pingTimer = null\n    }\n  }\n\n  /**\n   * Schedule reconnection with exponential backoff\n   */\n  private scheduleReconnect(): void {\n    if (!this.shouldReconnect) {\n      return\n    }\n\n    this.reconnectAttempt++\n\n    if (this.reconnectAttempt > DEFAULTS.maxReconnectAttempts) {\n      const error = new ConnectionError('Max reconnection attempts exceeded')\n      for (const subscriptionId of this.activeSubscriptions.keys()) {\n        this.errorHandler?.(subscriptionId, error)\n      }\n      this.closeHandler?.()\n      return\n    }\n\n    // Exponential backoff with jitter\n    const delay = Math.min(\n      DEFAULTS.reconnectBaseDelay * Math.pow(2, this.reconnectAttempt - 1) + Math.random() * 1000,\n      DEFAULTS.maxReconnectDelay\n    )\n\n    this.reconnectTimer = setTimeout(() => {\n      this.reconnectHandler?.(this.reconnectAttempt, this.lastEventId ?? undefined)\n      this.reconnect()\n    }, delay)\n  }\n\n  /**\n   * Reconnect and resubscribe\n   */\n  private async reconnect(): Promise<void> {\n    try {\n      await this._connect()\n\n      // Resubscribe to all active subscriptions\n      for (const [subscriptionId, { table, schema, options }] of this.activeSubscriptions) {\n        // Resume from last known LSN\n        const resumeOptions = {\n          ...options,\n          resumeFrom: this.lastEventId ?? options.resumeFrom,\n        }\n\n        try {\n          await this.subscribe(subscriptionId, table, schema, resumeOptions)\n        } catch (error) {\n          this.errorHandler?.(subscriptionId, error instanceof Error ? error : new Error(String(error)))\n        }\n      }\n    } catch {\n      // Schedule another reconnect\n      if (this.shouldReconnect) {\n        this.scheduleReconnect()\n      }\n    }\n  }\n\n  /**\n   * Reject all pending requests\n   */\n  private rejectAllPending(error: Error): void {\n    for (const pending of this.pendingSubscriptions.values()) {\n      clearTimeout(pending.timeout)\n      pending.reject(error)\n    }\n    this.pendingSubscriptions.clear()\n\n    for (const pending of this.pendingUnsubscriptions.values()) {\n      clearTimeout(pending.timeout)\n      pending.reject(error)\n    }\n    this.pendingUnsubscriptions.clear()\n\n    if (this.pendingAuth) {\n      clearTimeout(this.pendingAuth.timeout)\n      this.pendingAuth.reject(error)\n      this.pendingAuth = null\n    }\n  }\n}\n\n/**\n * Create a CDC WebSocket transport\n */\nexport function createCdcWsTransport(config: CDCWsTransportConfig): CDCWsTransport {\n  return new CDCWsTransport(config)\n}\n","/**\n * CDC SSE (Server-Sent Events) Transport for postgres.do\n *\n * Provides HTTP-based change data capture streaming via SSE:\n * - Works in environments where WebSocket is blocked\n * - Uses standard EventSource/fetch with streaming body\n * - Automatic reconnection with Last-Event-ID header\n * - LSN-based resumption for reliable delivery\n *\n * Performance optimizations:\n * - Event batching for high-throughput scenarios\n * - Adaptive heartbeat intervals based on activity\n * - Reusable TextDecoder for memory efficiency\n * - Exponential backoff with jitter for reconnection\n * - Compression support via Accept-Encoding\n */\n\nimport type {\n  Row,\n  CDCChangeEvent,\n  CDCTransport,\n  CDCSubscriptionOptions,\n  CDCSseTransportConfig,\n  CDCOperation,\n} from '../types'\nimport { ConnectionError } from '../types'\n\n/**\n * SSE event types for CDC\n */\ntype SseEventType = 'insert' | 'update' | 'delete' | 'truncate' | 'begin' | 'commit' | 'keepalive' | 'error' | 'subscribe_result' | 'unsubscribe_result'\n\n/**\n * SSE event data structure\n */\ninterface SseEventData {\n  type: SseEventType\n  subscriptionId?: string\n  table?: string\n  schema?: string\n  data?: Row\n  old?: Row\n  new?: Row\n  changedColumns?: string[]\n  xid?: number\n  isLastInTransaction?: boolean\n  success?: boolean\n  error?: string\n  message?: string\n  code?: string\n}\n\n/**\n * Batched event for high-throughput delivery\n */\ninterface BatchedEvent {\n  subscriptionId: string\n  event: CDCChangeEvent\n  timestamp: number\n}\n\n/**\n * Update event data with old and new row values\n */\ninterface UpdateEventData {\n  old?: Row\n  new?: Row\n}\n\n/**\n * Default configuration values\n */\nconst DEFAULTS = {\n  retryMs: 3000,\n  connectTimeout: 10000,\n  maxReconnectAttempts: 10,\n  // Batching defaults\n  batchSize: 100,\n  batchTimeoutMs: 50,\n  // Adaptive heartbeat defaults\n  minHeartbeatMs: 5000,\n  maxHeartbeatMs: 60000,\n  heartbeatScaleFactor: 1.5,\n  // Memory optimization\n  maxBufferSize: 64 * 1024, // 64KB buffer limit\n}\n\n/**\n * Extended SSE transport configuration with optimization options\n */\nexport interface CDCSseTransportOptimizedConfig extends CDCSseTransportConfig {\n  /** Enable event batching for high-throughput scenarios */\n  enableBatching?: boolean\n  /** Maximum events to batch before flushing */\n  batchSize?: number\n  /** Maximum time to wait before flushing batch (ms) */\n  batchTimeoutMs?: number\n  /** Enable compression (gzip/deflate) if server supports it */\n  enableCompression?: boolean\n  /** Enable adaptive heartbeat intervals */\n  adaptiveHeartbeat?: boolean\n  /** Minimum heartbeat interval (ms) */\n  minHeartbeatMs?: number\n  /** Maximum heartbeat interval (ms) */\n  maxHeartbeatMs?: number\n  /** Maximum buffer size before applying backpressure (bytes) */\n  maxBufferSize?: number\n}\n\n/**\n * CDC SSE Transport implementation with streaming optimizations\n */\nexport class CDCSseTransport implements CDCTransport {\n  private config: {\n    url: string\n    apiKey?: string\n    resumeFrom?: string\n    retryMs: number\n    fetch?: typeof fetch\n    headers?: Record<string, string>\n  }\n  private fetchImpl: typeof fetch\n  private connected = false\n  private lastEventId: string | null = null\n  private shouldReconnect = true\n  private reconnectAttempt = 0\n  private reconnectTimer: ReturnType<typeof setTimeout> | null = null\n  private abortController: AbortController | null = null\n\n  // Event handlers\n  private eventHandler: ((subscriptionId: string, event: CDCChangeEvent) => void) | null = null\n  private errorHandler: ((subscriptionId: string, error: Error) => void) | null = null\n  private reconnectHandler: ((attempt: number, lastLsn: string | undefined) => void) | null = null\n  private closeHandler: (() => void) | null = null\n\n  // Active subscriptions for URL construction\n  private activeSubscriptions = new Map<string, {\n    table: string\n    schema: string\n    options: CDCSubscriptionOptions\n  }>()\n\n  // Pending subscription/unsubscription requests\n  private pendingSubscriptions = new Map<string, {\n    resolve: () => void\n    reject: (error: Error) => void\n  }>()\n  private pendingUnsubscriptions = new Map<string, {\n    resolve: () => void\n    reject: (error: Error) => void\n  }>()\n\n  // ========== Streaming Optimizations ==========\n\n  // Reusable TextDecoder for memory efficiency\n  private readonly decoder = new TextDecoder()\n\n  // Event batching state\n  private enableBatching: boolean\n  private batchSize: number\n  private batchTimeoutMs: number\n  private eventBatch: BatchedEvent[] = []\n  private batchTimer: ReturnType<typeof setTimeout> | null = null\n\n  // Adaptive heartbeat state\n  private adaptiveHeartbeat: boolean\n  private minHeartbeatMs: number\n  private maxHeartbeatMs: number\n  private currentHeartbeatMs: number\n  private lastEventTime = 0\n  private eventRateWindow: number[] = []\n  private heartbeatTimer: ReturnType<typeof setInterval> | null = null\n\n  // Buffer management for backpressure\n  private maxBufferSize: number\n  private currentBufferSize = 0\n\n  // Compression support\n  private enableCompression: boolean\n\n  // Performance metrics\n  private metrics = {\n    eventsReceived: 0,\n    eventsBatched: 0,\n    batchesFlushed: 0,\n    reconnections: 0,\n    bytesReceived: 0,\n  }\n\n  constructor(config: CDCSseTransportConfig | CDCSseTransportOptimizedConfig) {\n    const optimizedConfig = config as CDCSseTransportOptimizedConfig\n    this.config = {\n      url: config.url,\n      retryMs: config.retryMs ?? DEFAULTS.retryMs,\n    }\n    if (config.apiKey !== undefined) {\n      this.config.apiKey = config.apiKey\n    }\n    if (config.resumeFrom !== undefined) {\n      this.config.resumeFrom = config.resumeFrom\n    }\n    if (config.fetch !== undefined) {\n      this.config.fetch = config.fetch\n    }\n    if (config.headers !== undefined) {\n      this.config.headers = config.headers\n    }\n    this.fetchImpl = config.fetch || globalThis.fetch\n    this.lastEventId = config.resumeFrom ?? null\n\n    // Initialize optimization settings\n    this.enableBatching = optimizedConfig.enableBatching ?? false\n    this.batchSize = optimizedConfig.batchSize ?? DEFAULTS.batchSize\n    this.batchTimeoutMs = optimizedConfig.batchTimeoutMs ?? DEFAULTS.batchTimeoutMs\n    this.enableCompression = optimizedConfig.enableCompression ?? true\n    this.adaptiveHeartbeat = optimizedConfig.adaptiveHeartbeat ?? true\n    this.minHeartbeatMs = optimizedConfig.minHeartbeatMs ?? DEFAULTS.minHeartbeatMs\n    this.maxHeartbeatMs = optimizedConfig.maxHeartbeatMs ?? DEFAULTS.maxHeartbeatMs\n    this.currentHeartbeatMs = this.minHeartbeatMs\n    this.maxBufferSize = optimizedConfig.maxBufferSize ?? DEFAULTS.maxBufferSize\n  }\n\n  /**\n   * Connect to the CDC stream\n   */\n  async connect(): Promise<void> {\n    if (this.connected) {\n      return\n    }\n\n    this.shouldReconnect = true\n    this.abortController = new AbortController()\n\n    await this._connect()\n  }\n\n  /**\n   * Internal connect implementation with optimized headers\n   */\n  private async _connect(): Promise<void> {\n    const headers: Record<string, string> = {\n      Accept: 'text/event-stream',\n      'Cache-Control': 'no-cache',\n      // Keep-alive connection for persistent streaming\n      Connection: 'keep-alive',\n      ...this.config.headers,\n    }\n\n    // Request compression if enabled\n    if (this.enableCompression) {\n      headers['Accept-Encoding'] = 'gzip, deflate'\n    }\n\n    if (this.config.apiKey) {\n      headers['Authorization'] = `Bearer ${this.config.apiKey}`\n    }\n\n    if (this.lastEventId) {\n      headers['Last-Event-ID'] = this.lastEventId\n    }\n\n    // Build URL with subscription filters\n    const url = this.buildSubscriptionUrl()\n\n    try {\n      const requestInit: RequestInit = {\n        method: 'GET',\n        headers,\n        keepalive: true,\n      }\n      if (this.abortController?.signal) {\n        requestInit.signal = this.abortController.signal\n      }\n      const response = await this.fetchImpl(url, requestInit)\n\n      if (!response.ok) {\n        const errorBody = await response.text().catch(() => '')\n        throw new ConnectionError(`SSE connection failed: ${response.status} ${response.statusText}${errorBody ? ` - ${errorBody}` : ''}`)\n      }\n\n      const contentType = response.headers.get('Content-Type')\n      if (!contentType || !contentType.includes('text/event-stream')) {\n        throw new ConnectionError(`Invalid Content-Type: expected text/event-stream, got ${contentType}`)\n      }\n\n      this.connected = true\n      this.reconnectAttempt = 0\n\n      // Resolve any pending subscriptions since SSE subscriptions are URL-based\n      for (const [subscriptionId, { resolve }] of this.pendingSubscriptions) {\n        resolve()\n        this.pendingSubscriptions.delete(subscriptionId)\n      }\n\n      // Process the stream\n      await this.processStream(response)\n    } catch (error) {\n      if (error instanceof Error && error.name === 'AbortError') {\n        // Intentional abort - don't reconnect\n        return\n      }\n\n      // Reject pending subscriptions on error\n      for (const [subscriptionId, { reject }] of this.pendingSubscriptions) {\n        reject(error instanceof Error ? error : new Error(String(error)))\n        this.pendingSubscriptions.delete(subscriptionId)\n      }\n\n      throw error\n    }\n  }\n\n  /**\n   * Build URL with subscription parameters\n   */\n  private buildSubscriptionUrl(): string {\n    const url = new URL(this.config.url)\n\n    // Add table filter if there are active subscriptions\n    const tables = Array.from(this.activeSubscriptions.values()).map(s => s.table)\n    if (tables.length > 0) {\n      url.searchParams.set('tables', tables.join(','))\n    }\n\n    // Add schema filter\n    const schemas = new Set(Array.from(this.activeSubscriptions.values()).map(s => s.schema))\n    if (schemas.size > 0) {\n      url.searchParams.set('schemas', Array.from(schemas).join(','))\n    }\n\n    // Add subscription IDs\n    const subscriptionIds = Array.from(this.activeSubscriptions.keys())\n    if (subscriptionIds.length > 0) {\n      url.searchParams.set('subscriptionIds', subscriptionIds.join(','))\n    }\n\n    // Add common options from first subscription\n    const firstSub = Array.from(this.activeSubscriptions.values())[0]\n    if (firstSub) {\n      if (firstSub.options.events) {\n        url.searchParams.set('events', firstSub.options.events.join(','))\n      }\n      if (firstSub.options.filter) {\n        url.searchParams.set('filter', firstSub.options.filter)\n      }\n      if (firstSub.options.includeOldRow) {\n        url.searchParams.set('includeOldRow', 'true')\n      }\n      if (firstSub.options.trackChangedColumns) {\n        url.searchParams.set('trackChangedColumns', 'true')\n      }\n      if (firstSub.options.batchSize) {\n        url.searchParams.set('batchSize', String(firstSub.options.batchSize))\n      }\n    }\n\n    return url.toString()\n  }\n\n  /**\n   * Process the SSE stream with optimized buffering and memory management\n   */\n  private async processStream(response: Response): Promise<void> {\n    if (!response.body) {\n      throw new ConnectionError('Response body is null')\n    }\n\n    const reader = response.body.getReader()\n    let buffer = ''\n\n    // Start adaptive heartbeat monitoring if enabled\n    if (this.adaptiveHeartbeat) {\n      this.startHeartbeatMonitor()\n    }\n\n    try {\n      while (true) {\n        const { done, value } = await reader.read()\n\n        if (done) {\n          // Stream ended - flush any remaining batched events\n          this.flushEventBatch()\n          this.stopHeartbeatMonitor()\n\n          // Stream ended - schedule reconnect\n          this.connected = false\n          if (this.shouldReconnect) {\n            this.scheduleReconnect()\n          }\n          return\n        }\n\n        // Track bytes received for metrics\n        if (value) {\n          this.metrics.bytesReceived += value.length\n          this.currentBufferSize += value.length\n        }\n\n        // Use reusable decoder for memory efficiency\n        buffer += this.decoder.decode(value, { stream: true })\n\n        // Apply backpressure if buffer is too large\n        if (this.currentBufferSize > this.maxBufferSize) {\n          // Process events immediately to reduce memory pressure\n          await this.processBufferWithBackpressure(buffer)\n          buffer = ''\n          this.currentBufferSize = 0\n          continue\n        }\n\n        // Process complete events (separated by double newline)\n        const events = buffer.split('\\n\\n')\n        buffer = events.pop() || '' // Keep incomplete event in buffer\n\n        // Update current buffer size estimate\n        this.currentBufferSize = buffer.length\n\n        for (const eventText of events) {\n          if (eventText.trim()) {\n            this.parseAndHandleEvent(eventText)\n          }\n        }\n      }\n    } catch (error) {\n      this.connected = false\n      this.flushEventBatch()\n      this.stopHeartbeatMonitor()\n\n      if (error instanceof Error && error.name === 'AbortError') {\n        // Intentional abort\n        return\n      }\n\n      // Emit error and schedule reconnect\n      for (const subscriptionId of this.activeSubscriptions.keys()) {\n        this.errorHandler?.(subscriptionId, error instanceof Error ? error : new Error(String(error)))\n      }\n\n      if (this.shouldReconnect) {\n        this.scheduleReconnect()\n      }\n    }\n  }\n\n  /**\n   * Process buffer when under backpressure - yields to event loop\n   */\n  private async processBufferWithBackpressure(buffer: string): Promise<void> {\n    const events = buffer.split('\\n\\n')\n\n    for (let i = 0; i < events.length; i++) {\n      const eventText = events[i]\n      if (eventText && eventText.trim()) {\n        this.parseAndHandleEvent(eventText)\n      }\n\n      // Yield to event loop every 50 events to prevent blocking\n      if (i > 0 && i % 50 === 0) {\n        await new Promise(resolve => setTimeout(resolve, 0))\n      }\n    }\n  }\n\n  /**\n   * Parse and handle an SSE event\n   */\n  private parseAndHandleEvent(eventText: string): void {\n    let id: string | undefined\n    let eventType: string | undefined\n    let data: string | undefined\n\n    const lines = eventText.split('\\n')\n    for (const line of lines) {\n      if (line.startsWith(':')) {\n        // Comment line - ignore\n        continue\n      }\n\n      const colonIndex = line.indexOf(':')\n      if (colonIndex === -1) {\n        continue\n      }\n\n      const field = line.substring(0, colonIndex)\n      // Skip the space after colon if present\n      const value = line.substring(colonIndex + 1).trimStart()\n\n      switch (field) {\n        case 'id':\n          id = value\n          break\n        case 'event':\n          eventType = value\n          break\n        case 'data':\n          data = data ? data + '\\n' + value : value\n          break\n        case 'retry': {\n          const retryMs = parseInt(value, 10)\n          if (!isNaN(retryMs)) {\n            this.config.retryMs = retryMs\n          }\n          break\n        }\n      }\n    }\n\n    // Update last event ID\n    if (id) {\n      this.lastEventId = id\n    }\n\n    if (!data) {\n      return\n    }\n\n    // Parse data JSON\n    let eventData: SseEventData\n    try {\n      eventData = JSON.parse(data)\n    } catch (error) {\n      // Emit parse error\n      for (const subscriptionId of this.activeSubscriptions.keys()) {\n        this.errorHandler?.(subscriptionId, new Error(`Failed to parse SSE event data: ${error instanceof Error ? error.message : String(error)}`))\n      }\n      return\n    }\n\n    // Handle different event types\n    this.handleParsedEvent(id, eventType || eventData.type, eventData)\n  }\n\n  /**\n   * Handle a parsed event with optional batching\n   */\n  private handleParsedEvent(id: string | undefined, eventType: string, eventData: SseEventData): void {\n    const subscriptionId = eventData.subscriptionId || Array.from(this.activeSubscriptions.keys())[0]\n\n    // Update event timing for adaptive heartbeat\n    this.lastEventTime = Date.now()\n    this.metrics.eventsReceived++\n\n    switch (eventType) {\n      case 'insert':\n      case 'update':\n      case 'delete':\n      case 'truncate': {\n        if (!subscriptionId) return\n\n        const changeEvent: CDCChangeEvent = {\n          id: id || `${Date.now()}-${Math.random()}`,\n          lsn: id || '',\n          operation: eventType.toUpperCase() as CDCOperation,\n          table: eventData.table || '',\n          schema: eventData.schema || 'public',\n          timestamp: new Date(),\n          xid: eventData.xid || 0,\n          isLastInTransaction: eventData.isLastInTransaction || false,\n        }\n\n        if (eventType === 'update' && eventData.data) {\n          const updateData = eventData.data as UpdateEventData\n          changeEvent.oldRow = updateData.old ?? eventData.old\n          changeEvent.newRow = updateData.new ?? eventData.new\n        } else if (eventType === 'insert') {\n          changeEvent.newRow = eventData.data\n        } else if (eventType === 'delete') {\n          changeEvent.oldRow = eventData.data\n        }\n\n        if (eventData.changedColumns) {\n          changeEvent.changedColumns = eventData.changedColumns\n        }\n\n        // Use batching if enabled, otherwise emit immediately\n        if (this.enableBatching) {\n          this.addToBatch(subscriptionId, changeEvent)\n        } else {\n          this.eventHandler?.(subscriptionId, changeEvent)\n        }\n        break\n      }\n\n      case 'keepalive':\n        // Update heartbeat timing - used for adaptive intervals\n        this.updateHeartbeatFromServer()\n        break\n\n      case 'begin':\n      case 'commit':\n        // Transaction boundaries - flush batch on commit for consistency\n        if (eventType === 'commit' && this.enableBatching) {\n          this.flushEventBatch()\n        }\n        break\n\n      case 'error':\n        if (subscriptionId) {\n          this.errorHandler?.(subscriptionId, new Error(eventData.message || eventData.error || 'Unknown error'))\n        }\n        break\n\n      case 'subscribe_result':\n        if (eventData.subscriptionId) {\n          const pending = this.pendingSubscriptions.get(eventData.subscriptionId)\n          if (pending) {\n            if (eventData.success) {\n              pending.resolve()\n            } else {\n              pending.reject(new Error(eventData.error || 'Subscription failed'))\n            }\n            this.pendingSubscriptions.delete(eventData.subscriptionId)\n          }\n        }\n        break\n\n      case 'unsubscribe_result':\n        if (eventData.subscriptionId) {\n          const pending = this.pendingUnsubscriptions.get(eventData.subscriptionId)\n          if (pending) {\n            pending.resolve()\n            this.pendingUnsubscriptions.delete(eventData.subscriptionId)\n          }\n        }\n        break\n    }\n  }\n\n  // ========== Event Batching ==========\n\n  /**\n   * Add event to batch for coalesced delivery\n   */\n  private addToBatch(subscriptionId: string, event: CDCChangeEvent): void {\n    this.eventBatch.push({\n      subscriptionId,\n      event,\n      timestamp: Date.now(),\n    })\n    this.metrics.eventsBatched++\n\n    // Flush if batch is full\n    if (this.eventBatch.length >= this.batchSize) {\n      this.flushEventBatch()\n      return\n    }\n\n    // Start batch timer if not already running\n    if (!this.batchTimer) {\n      this.batchTimer = setTimeout(() => {\n        this.flushEventBatch()\n      }, this.batchTimeoutMs)\n    }\n  }\n\n  /**\n   * Flush all batched events to handlers\n   */\n  private flushEventBatch(): void {\n    if (this.batchTimer) {\n      clearTimeout(this.batchTimer)\n      this.batchTimer = null\n    }\n\n    if (this.eventBatch.length === 0) {\n      return\n    }\n\n    // Group events by subscription for efficient delivery\n    const eventsBySubscription = new Map<string, CDCChangeEvent[]>()\n\n    for (const { subscriptionId, event } of this.eventBatch) {\n      const events = eventsBySubscription.get(subscriptionId) || []\n      events.push(event)\n      eventsBySubscription.set(subscriptionId, events)\n    }\n\n    // Emit events grouped by subscription\n    for (const [subscriptionId, events] of eventsBySubscription) {\n      for (const event of events) {\n        this.eventHandler?.(subscriptionId, event)\n      }\n    }\n\n    this.metrics.batchesFlushed++\n    this.eventBatch = []\n  }\n\n  // ========== Adaptive Heartbeat ==========\n\n  /**\n   * Start monitoring connection health with adaptive intervals\n   */\n  private startHeartbeatMonitor(): void {\n    if (!this.adaptiveHeartbeat) return\n\n    this.stopHeartbeatMonitor()\n    this.lastEventTime = Date.now()\n    this.eventRateWindow = []\n\n    this.heartbeatTimer = setInterval(() => {\n      this.checkConnectionHealth()\n    }, this.currentHeartbeatMs)\n  }\n\n  /**\n   * Stop the heartbeat monitor\n   */\n  private stopHeartbeatMonitor(): void {\n    if (this.heartbeatTimer) {\n      clearInterval(this.heartbeatTimer)\n      this.heartbeatTimer = null\n    }\n  }\n\n  /**\n   * Check connection health and adjust heartbeat interval\n   */\n  private checkConnectionHealth(): void {\n    const now = Date.now()\n    const timeSinceLastEvent = now - this.lastEventTime\n\n    // If no events for 3x the current heartbeat interval, connection may be stale\n    if (timeSinceLastEvent > this.currentHeartbeatMs * 3) {\n      // Emit warning - connection might be stale\n      for (const subscriptionId of this.activeSubscriptions.keys()) {\n        this.errorHandler?.(subscriptionId, new Error('Connection appears stale - no events received'))\n      }\n    }\n\n    // Adapt heartbeat interval based on event rate\n    this.adaptHeartbeatInterval()\n  }\n\n  /**\n   * Adapt heartbeat interval based on observed event rate\n   */\n  private adaptHeartbeatInterval(): void {\n    // Track event rate in sliding window (last 10 samples)\n    this.eventRateWindow.push(this.metrics.eventsReceived)\n    if (this.eventRateWindow.length > 10) {\n      this.eventRateWindow.shift()\n    }\n\n    // Calculate events per second\n    const recentEvents = this.eventRateWindow.length > 1\n      ? this.eventRateWindow[this.eventRateWindow.length - 1]! - this.eventRateWindow[0]!\n      : 0\n    const eventsPerSecond = recentEvents / (this.eventRateWindow.length * (this.currentHeartbeatMs / 1000))\n\n    // High event rate = shorter heartbeat (faster detection of issues)\n    // Low event rate = longer heartbeat (reduce overhead)\n    let newInterval: number\n\n    if (eventsPerSecond > 100) {\n      // High throughput - use minimum interval\n      newInterval = this.minHeartbeatMs\n    } else if (eventsPerSecond < 1) {\n      // Low throughput - increase interval\n      newInterval = Math.min(\n        this.currentHeartbeatMs * DEFAULTS.heartbeatScaleFactor,\n        this.maxHeartbeatMs\n      )\n    } else {\n      // Moderate throughput - decrease interval slightly\n      newInterval = Math.max(\n        this.currentHeartbeatMs / DEFAULTS.heartbeatScaleFactor,\n        this.minHeartbeatMs\n      )\n    }\n\n    // Update interval if changed significantly (>10% difference)\n    if (Math.abs(newInterval - this.currentHeartbeatMs) / this.currentHeartbeatMs > 0.1) {\n      this.currentHeartbeatMs = Math.round(newInterval)\n      this.stopHeartbeatMonitor()\n      this.startHeartbeatMonitor()\n    }\n  }\n\n  /**\n   * Update heartbeat timing when server sends keepalive\n   */\n  private updateHeartbeatFromServer(): void {\n    this.lastEventTime = Date.now()\n  }\n\n  /**\n   * Schedule reconnection with exponential backoff and jitter\n   *\n   * Uses a decorrelated jitter algorithm for optimal reconnection behavior:\n   * - Exponential backoff: delay = retryMs * 1.5^attempt\n   * - Jitter: adds random variation to prevent thundering herd\n   * - Capped at maxReconnectDelay to prevent excessive waits\n   */\n  private scheduleReconnect(): void {\n    if (!this.shouldReconnect) {\n      return\n    }\n\n    this.reconnectAttempt++\n    this.metrics.reconnections++\n\n    if (this.reconnectAttempt > DEFAULTS.maxReconnectAttempts) {\n      const error = new ConnectionError('Max reconnection attempts exceeded')\n      for (const subscriptionId of this.activeSubscriptions.keys()) {\n        this.errorHandler?.(subscriptionId, error)\n      }\n      this.closeHandler?.()\n      return\n    }\n\n    // Calculate base delay with exponential backoff\n    const baseDelay = this.config.retryMs * Math.pow(1.5, this.reconnectAttempt - 1)\n\n    // Add jitter: random value between 0 and 50% of base delay\n    // This helps prevent thundering herd when many clients reconnect\n    const jitter = Math.random() * baseDelay * 0.5\n\n    // Final delay with cap at 60 seconds\n    const maxDelay = 60000\n    const delay = Math.min(baseDelay + jitter, maxDelay)\n\n    this.reconnectTimer = setTimeout(async () => {\n      this.reconnectHandler?.(this.reconnectAttempt, this.lastEventId ?? undefined)\n\n      try {\n        this.abortController = new AbortController()\n        await this._connect()\n      } catch (error) {\n        // Will schedule another reconnect\n        if (this.shouldReconnect) {\n          this.scheduleReconnect()\n        }\n      }\n    }, delay)\n  }\n\n  /**\n   * Disconnect from the CDC stream\n   */\n  async disconnect(): Promise<void> {\n    this.shouldReconnect = false\n\n    // Clean up all timers\n    if (this.reconnectTimer) {\n      clearTimeout(this.reconnectTimer)\n      this.reconnectTimer = null\n    }\n\n    if (this.batchTimer) {\n      clearTimeout(this.batchTimer)\n      this.batchTimer = null\n    }\n\n    this.stopHeartbeatMonitor()\n\n    // Flush any remaining batched events before disconnecting\n    this.flushEventBatch()\n\n    if (this.abortController) {\n      this.abortController.abort()\n      this.abortController = null\n    }\n\n    this.connected = false\n    this.activeSubscriptions.clear()\n\n    // Reset buffer state\n    this.currentBufferSize = 0\n\n    // Reject all pending requests\n    for (const [, { reject }] of this.pendingSubscriptions) {\n      reject(new ConnectionError('Connection closed'))\n    }\n    this.pendingSubscriptions.clear()\n\n    for (const [, { resolve }] of this.pendingUnsubscriptions) {\n      resolve() // Unsubscriptions resolve on disconnect\n    }\n    this.pendingUnsubscriptions.clear()\n\n    this.closeHandler?.()\n  }\n\n  /**\n   * Get transport performance metrics\n   */\n  getMetrics(): Readonly<typeof this.metrics> {\n    return { ...this.metrics }\n  }\n\n  /**\n   * Reset performance metrics\n   */\n  resetMetrics(): void {\n    this.metrics = {\n      eventsReceived: 0,\n      eventsBatched: 0,\n      batchesFlushed: 0,\n      reconnections: 0,\n      bytesReceived: 0,\n    }\n  }\n\n  /**\n   * Get current heartbeat interval (useful for monitoring)\n   */\n  getCurrentHeartbeatMs(): number {\n    return this.currentHeartbeatMs\n  }\n\n  /**\n   * Check if connected\n   */\n  isConnected(): boolean {\n    return this.connected\n  }\n\n  /**\n   * Get the last event ID received\n   */\n  getLastEventId(): string | null {\n    return this.lastEventId\n  }\n\n  /**\n   * Subscribe to a table\n   * For SSE, this adds to the subscription set and reconnects\n   */\n  async subscribe(\n    subscriptionId: string,\n    table: string,\n    schema: string,\n    options: CDCSubscriptionOptions\n  ): Promise<void> {\n    // Store the subscription\n    this.activeSubscriptions.set(subscriptionId, { table, schema, options })\n\n    // If already connected, need to reconnect with new subscription\n    if (this.connected) {\n      // Create a pending subscription promise that resolves after reconnect\n      const promise = new Promise<void>((resolve, reject) => {\n        this.pendingSubscriptions.set(subscriptionId, { resolve, reject })\n      })\n\n      // Reconnect with updated subscriptions\n      if (this.abortController) {\n        this.abortController.abort()\n      }\n      this.abortController = new AbortController()\n      this._connect().catch(() => {\n        // Error handled in _connect\n      })\n\n      return promise\n    } else {\n      // Not connected yet - subscription will be included when connecting\n      return new Promise<void>((resolve, reject) => {\n        this.pendingSubscriptions.set(subscriptionId, { resolve, reject })\n        resolve() // Resolve immediately for pre-connect subscriptions\n      })\n    }\n  }\n\n  /**\n   * Unsubscribe from a subscription\n   * For SSE, this removes from the subscription set and reconnects\n   */\n  async unsubscribe(subscriptionId: string): Promise<void> {\n    this.activeSubscriptions.delete(subscriptionId)\n\n    // If no more subscriptions, just disconnect\n    if (this.activeSubscriptions.size === 0) {\n      await this.disconnect()\n      return\n    }\n\n    // Otherwise reconnect with remaining subscriptions\n    if (this.connected) {\n      return new Promise<void>((resolve, reject) => {\n        this.pendingUnsubscriptions.set(subscriptionId, { resolve, reject })\n\n        // Reconnect with updated subscriptions\n        if (this.abortController) {\n          this.abortController.abort()\n        }\n        this.abortController = new AbortController()\n        this._connect().catch(() => {\n          // Error handled in _connect\n        })\n\n        // Resolve immediately for SSE since unsubscription is URL-based\n        setTimeout(() => {\n          const pending = this.pendingUnsubscriptions.get(subscriptionId)\n          if (pending) {\n            pending.resolve()\n            this.pendingUnsubscriptions.delete(subscriptionId)\n          }\n        }, 100)\n      })\n    }\n  }\n\n  /**\n   * Set the event handler\n   */\n  onEvent(handler: (subscriptionId: string, event: CDCChangeEvent) => void): void {\n    this.eventHandler = handler\n  }\n\n  /**\n   * Set the error handler\n   */\n  onError(handler: (subscriptionId: string, error: Error) => void): void {\n    this.errorHandler = handler\n  }\n\n  /**\n   * Set the reconnect handler\n   */\n  onReconnect(handler: (attempt: number, lastLsn: string | undefined) => void): void {\n    this.reconnectHandler = handler\n  }\n\n  /**\n   * Set the close handler\n   */\n  onClose(handler: () => void): void {\n    this.closeHandler = handler\n  }\n}\n\n/**\n * Create a CDC SSE transport\n */\nexport function createCdcSseTransport(config: CDCSseTransportConfig): CDCSseTransport {\n  return new CDCSseTransport(config)\n}\n","/**\n * Query Middleware Layer for postgres.do\n *\n * Provides a middleware chain pattern for intercepting and transforming queries.\n * Enables cross-cutting concerns like logging, metrics, rate limiting, and tracing.\n *\n * ## Architecture\n *\n * Middleware functions follow an \"onion\" pattern where each middleware wraps\n * the next one in the chain. Execution flows inward through all middlewares,\n * reaches the executor, then flows outward back through the middlewares.\n *\n * ```\n * Request → [Middleware A] → [Middleware B] → [Executor]\n * Response ← [Middleware A] ← [Middleware B] ←\n * ```\n *\n * ## Creating Custom Middleware\n *\n * A middleware is an async function that receives a request and a `next` function.\n * Call `next()` to proceed to the next middleware or executor. You can:\n *\n * - Modify the request before calling `next()`\n * - Modify the response after calling `next()`\n * - Short-circuit by returning a response without calling `next()`\n * - Handle errors by wrapping `next()` in try/catch\n *\n * @example Basic usage\n * ```typescript\n * import postgres from 'postgres.do'\n * import { loggingMiddleware, metricsMiddleware } from 'postgres.do/middleware'\n *\n * const sql = postgres('postgres://db.postgres.do/mydb')\n *   .use(loggingMiddleware({ level: 'debug' }))\n *   .use(metricsMiddleware({ onMetric: console.log }))\n *\n * // All queries now flow through the middleware chain\n * const users = await sql`SELECT * FROM users`\n * ```\n *\n * @example Custom middleware\n * ```typescript\n * import type { QueryMiddleware } from 'postgres.do/middleware'\n *\n * const myMiddleware: QueryMiddleware = async (request, next) => {\n *   console.log('Before query:', request.sql)\n *   const response = await next()\n *   console.log('After query:', response.durationMs, 'ms')\n *   return response\n * }\n * ```\n *\n * @module middleware\n */\n\nimport type { QueryResult, Row } from './types'\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Maximum length for query strings in metrics to prevent memory bloat.\n * Queries longer than this will be truncated.\n */\nconst METRICS_QUERY_TRUNCATE_LENGTH = 100\n\n/**\n * Milliseconds per second for rate limit time calculations.\n */\nconst MS_PER_SECOND = 1000\n\n/**\n * Default maximum number of retry attempts for retryMiddleware.\n */\nconst DEFAULT_MAX_RETRIES = 3\n\n/**\n * Default base delay in milliseconds between retry attempts.\n */\nconst DEFAULT_RETRY_BASE_DELAY_MS = 100\n\n/**\n * Default maximum delay in milliseconds between retry attempts.\n * Used as an upper bound when exponential backoff is enabled.\n */\nconst DEFAULT_RETRY_MAX_DELAY_MS = 5000\n\n/**\n * Default histogram bucket boundaries in milliseconds for query duration metrics.\n * Based on typical web application latency percentiles.\n */\nconst DEFAULT_HISTOGRAM_BUCKETS = [1, 5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000]\n\n/**\n * Length of the random suffix in generated query IDs.\n */\nconst QUERY_ID_RANDOM_SUFFIX_LENGTH = 9\n\n/**\n * Start index for slicing the random portion of query IDs.\n */\nconst QUERY_ID_RANDOM_SLICE_START = 2\n\n/**\n * Length of span IDs generated for distributed tracing.\n */\nconst SPAN_ID_LENGTH = 10\n\n// ============================================================================\n// Core Types\n// ============================================================================\n\n/**\n * Query request passed to middleware.\n *\n * Contains all information about a query before execution.\n * Middleware can read and modify this object before passing to `next()`.\n *\n * @example\n * ```typescript\n * const middleware: QueryMiddleware = async (request, next) => {\n *   console.log('Query:', request.sql)\n *   console.log('Params:', request.params)\n *   console.log('Query ID:', request.queryId)\n *   return next()\n * }\n * ```\n */\nexport interface QueryRequest {\n  /** The SQL query string (with parameter placeholders) */\n  sql: string\n  /** Query parameters */\n  params: unknown[]\n  /** Timestamp when the query was initiated */\n  timestamp: number\n  /** Unique ID for this query (useful for tracing) */\n  queryId: string\n  /** Optional context passed through the middleware chain */\n  context?: Record<string, unknown>\n}\n\n/**\n * Query response returned from middleware.\n *\n * Contains the result of query execution along with timing and status information.\n * Middleware can modify this object before returning it to the caller.\n *\n * @example\n * ```typescript\n * const middleware: QueryMiddleware = async (request, next) => {\n *   const response = await next()\n *   if (!response.success) {\n *     console.error('Query failed:', response.error)\n *   }\n *   return response\n * }\n * ```\n */\nexport interface QueryResponse<T extends Row = Row> {\n  /** Query result */\n  result: QueryResult<T>\n  /** Duration in milliseconds */\n  durationMs: number\n  /** Was the query successful */\n  success: boolean\n  /** Error if query failed */\n  error?: Error\n  /** Optional metadata added by middleware */\n  metadata?: Record<string, unknown>\n}\n\n/**\n * Next function to call the next middleware in the chain.\n *\n * Calling `next()` invokes the next middleware in the chain, or the query\n * executor if this is the last middleware. Always returns a Promise that\n * resolves to a QueryResponse.\n *\n * @remarks\n * - You must call `next()` exactly once to continue the chain\n * - Not calling `next()` short-circuits the chain (useful for caching, auth)\n * - Calling `next()` multiple times may cause unexpected behavior\n */\nexport type NextFunction<T extends Row = Row> = () => Promise<QueryResponse<T>>\n\n/**\n * Query middleware function signature.\n *\n * Middleware functions receive a request and a `next` function, and must return\n * a Promise that resolves to a QueryResponse. This is the core type for building\n * custom middleware.\n *\n * @param request - The query request containing SQL, params, and context\n * @param next - Function to call the next middleware or executor\n * @returns The query response (possibly transformed)\n *\n * @example Simple logging middleware\n * ```typescript\n * const loggingMiddleware: QueryMiddleware = async (request, next) => {\n *   console.log('Query:', request.sql)\n *   const response = await next()\n *   console.log('Duration:', response.durationMs, 'ms')\n *   return response\n * }\n * ```\n *\n * @example Error handling middleware\n * ```typescript\n * const errorHandler: QueryMiddleware = async (request, next) => {\n *   try {\n *     return await next()\n *   } catch (error) {\n *     // Handle or transform the error\n *     return {\n *       result: { rows: [], rowCount: 0, fields: [], command: 'ERROR' },\n *       durationMs: 0,\n *       success: false,\n *       error: error instanceof Error ? error : new Error(String(error)),\n *     }\n *   }\n * }\n * ```\n */\nexport type QueryMiddleware<T extends Row = Row> = (\n  request: QueryRequest,\n  next: NextFunction<T>\n) => Promise<QueryResponse<T>>\n\n// ============================================================================\n// Core Functions\n// ============================================================================\n\n/**\n * Generate a unique query ID for tracing and logging.\n *\n * The ID format is `q_<timestamp>_<random>` where:\n * - `q_` is a fixed prefix for easy identification\n * - `<timestamp>` is the current time in base-36 encoding\n * - `<random>` is a random string for uniqueness within the same millisecond\n *\n * @returns A unique query identifier string\n *\n * @example\n * ```typescript\n * const queryId = generateQueryId()\n * // => \"q_lz4k8x_abc123d\"\n * ```\n */\nexport function generateQueryId(): string {\n  const timestamp = Date.now().toString(36)\n  const random = Math.random().toString(36).slice(QUERY_ID_RANDOM_SLICE_START, QUERY_ID_RANDOM_SUFFIX_LENGTH)\n  return `q_${timestamp}_${random}`\n}\n\n/**\n * Execute a query through a middleware chain.\n *\n * This is the core function that orchestrates middleware execution.\n * It builds a chain from the provided middlewares using a right-to-left\n * reduction, where each middleware wraps the next one.\n *\n * @param middlewares - Array of middleware functions to execute in order\n * @param request - The query request containing SQL, params, and context\n * @param executor - The final query executor function that runs the actual query\n * @returns The query response, possibly transformed by middlewares\n *\n * @remarks\n * - Middlewares execute in array order (first middleware runs first)\n * - Errors in the executor are caught and returned as failed responses\n * - Errors thrown by middleware propagate up and must be caught by the caller\n *\n * @example\n * ```typescript\n * const response = await executeWithMiddleware(\n *   [loggingMiddleware(), metricsMiddleware({ onMetric: console.log })],\n *   { sql: 'SELECT 1', params: [], timestamp: Date.now(), queryId: 'q_123' },\n *   async () => ({ rows: [{ id: 1 }], rowCount: 1, fields: [], command: 'SELECT' })\n * )\n * ```\n */\nexport async function executeWithMiddleware<T extends Row = Row>(\n  middlewares: QueryMiddleware<T>[],\n  request: QueryRequest,\n  executor: () => Promise<QueryResult<T>>\n): Promise<QueryResponse<T>> {\n  const startTime = Date.now()\n\n  // Build the middleware chain from right to left\n  // The last middleware calls the executor\n  const chain = middlewares.reduceRight<NextFunction<T>>(\n    (next, middleware) => {\n      return () => middleware(request, next)\n    },\n    // Base executor (innermost function)\n    async (): Promise<QueryResponse<T>> => {\n      try {\n        const result = await executor()\n        return {\n          result,\n          durationMs: Date.now() - startTime,\n          success: true,\n        }\n      } catch (error) {\n        return {\n          result: {\n            rows: [],\n            rowCount: 0,\n            fields: [],\n            command: 'ERROR',\n          },\n          durationMs: Date.now() - startTime,\n          success: false,\n          error: error instanceof Error ? error : new Error(String(error)),\n        }\n      }\n    }\n  )\n\n  // Execute the chain\n  return chain()\n}\n\n// ============================================================================\n// Built-in Middlewares\n// ============================================================================\n\n/**\n * Options for configuring the logging middleware.\n */\nexport interface LoggingMiddlewareOptions {\n  /** Log level: 'debug' | 'info' | 'warn' | 'error'. Defaults to 'info'. */\n  level?: 'debug' | 'info' | 'warn' | 'error'\n  /** Custom logger function. Defaults to console methods. */\n  logger?: (level: string, message: string, data?: Record<string, unknown>) => void\n  /** Whether to log query parameters (default: false for security) */\n  logParams?: boolean\n  /** Only log queries slower than this threshold (ms). Omit to log all queries. */\n  slowQueryThreshold?: number\n  /** Custom prefix for log messages. Defaults to '[postgres.do]'. */\n  prefix?: string\n}\n\n/**\n * Create a logging middleware for query observability.\n *\n * Logs query execution details including SQL, duration, row count, and errors.\n * By default, query parameters are not logged for security reasons.\n *\n * @param options - Configuration options for the logging middleware\n * @returns A middleware function that logs query information\n *\n * @example Basic usage\n * ```typescript\n * const sql = postgres()\n *   .use(loggingMiddleware({ level: 'info', logParams: false }))\n * ```\n *\n * @example Slow query logging\n * ```typescript\n * const sql = postgres()\n *   .use(loggingMiddleware({\n *     slowQueryThreshold: 100, // Only log queries taking > 100ms\n *     level: 'warn'\n *   }))\n * ```\n *\n * @example Custom logger\n * ```typescript\n * const sql = postgres()\n *   .use(loggingMiddleware({\n *     logger: (level, message, data) => {\n *       myLogger[level](message, data)\n *     }\n *   }))\n * ```\n */\nexport function loggingMiddleware(options: LoggingMiddlewareOptions = {}): QueryMiddleware {\n  const {\n    level = 'info',\n    logger = defaultLogger,\n    logParams = false,\n    slowQueryThreshold,\n    prefix = '[postgres.do]',\n  } = options\n\n  return async (request, next) => {\n    const response = await next()\n\n    // Skip logging if below slow query threshold\n    if (slowQueryThreshold !== undefined && response.durationMs < slowQueryThreshold) {\n      return response\n    }\n\n    const logData: Record<string, unknown> = {\n      queryId: request.queryId,\n      sql: request.sql,\n      durationMs: response.durationMs,\n      success: response.success,\n      rowCount: response.result.rowCount,\n    }\n\n    if (logParams) {\n      logData.params = request.params\n    }\n\n    if (!response.success && response.error) {\n      logData.error = response.error.message\n    }\n\n    const message = response.success\n      ? `${prefix} Query completed in ${response.durationMs}ms`\n      : `${prefix} Query failed after ${response.durationMs}ms: ${response.error?.message}`\n\n    logger(response.success ? level : 'error', message, logData)\n\n    return response\n  }\n}\n\n/**\n * Default console logger implementation.\n * Maps log levels to appropriate console methods.\n *\n * @internal\n */\nfunction defaultLogger(level: string, message: string, data?: Record<string, unknown>): void {\n  const logFn =\n    level === 'error'\n      ? console.error\n      : level === 'warn'\n        ? console.warn\n        : level === 'debug'\n          ? console.debug\n          : console.info\n\n  if (data) {\n    logFn(message, data)\n  } else {\n    logFn(message)\n  }\n}\n\n/**\n * Options for configuring the metrics middleware.\n */\nexport interface MetricsMiddlewareOptions {\n  /** Callback invoked for each metric event. Required. */\n  onMetric: (metric: QueryMetric) => void\n  /** Custom tags to add to all metrics. */\n  tags?: Record<string, string>\n  /** Whether to include histogram bucket information. Defaults to false. */\n  histogram?: boolean\n  /** Custom histogram bucket boundaries (ms). Defaults to standard latency percentiles. */\n  buckets?: number[]\n}\n\n/**\n * Query metric data emitted by the metrics middleware.\n *\n * Each query execution emits multiple metrics:\n * - `query_duration`: Time taken to execute the query (ms)\n * - `query_count`: Incremented for each query (value is always 1)\n * - `query_rows`: Number of rows returned\n * - `query_error`: Incremented for failed queries (value is always 1)\n */\nexport interface QueryMetric {\n  /** Metric type */\n  type: 'query_duration' | 'query_count' | 'query_error' | 'query_rows'\n  /** Metric value */\n  value: number\n  /** Query ID for correlation */\n  queryId: string\n  /** SQL query (truncated to prevent memory bloat) */\n  query: string\n  /** Whether the query succeeded */\n  success: boolean\n  /** Command type (SELECT, INSERT, UPDATE, DELETE, etc.) */\n  command: string\n  /** Timestamp when the metric was recorded */\n  timestamp: number\n  /** Custom tags */\n  tags?: Record<string, string>\n  /** Histogram bucket label (if enabled) */\n  bucket?: string\n}\n\n/**\n * Create a metrics middleware for query instrumentation.\n *\n * Emits metrics for query duration, count, row count, and errors.\n * Useful for monitoring, alerting, and performance analysis.\n *\n * @param options - Configuration options for the metrics middleware\n * @returns A middleware function that emits query metrics\n *\n * @example Basic usage\n * ```typescript\n * const metrics: QueryMetric[] = []\n * const sql = postgres()\n *   .use(metricsMiddleware({\n *     onMetric: (m) => metrics.push(m),\n *     tags: { service: 'api', env: 'production' }\n *   }))\n * ```\n *\n * @example With histogram buckets\n * ```typescript\n * const sql = postgres()\n *   .use(metricsMiddleware({\n *     onMetric: (m) => prometheus.observe(m.type, m.value, m.tags),\n *     histogram: true,\n *     buckets: [5, 10, 25, 50, 100, 250, 500, 1000]\n *   }))\n * ```\n */\nexport function metricsMiddleware(options: MetricsMiddlewareOptions): QueryMiddleware {\n  const {\n    onMetric,\n    tags = {},\n    histogram = false,\n    buckets = DEFAULT_HISTOGRAM_BUCKETS,\n  } = options\n\n  return async (request, next) => {\n    const response = await next()\n\n    const baseMetric = {\n      queryId: request.queryId,\n      query: request.sql.slice(0, METRICS_QUERY_TRUNCATE_LENGTH),\n      success: response.success,\n      command: response.result.command,\n      timestamp: Date.now(),\n      tags,\n    }\n\n    // Duration metric\n    const durationMetric: QueryMetric = {\n      ...baseMetric,\n      type: 'query_duration',\n      value: response.durationMs,\n    }\n\n    if (histogram) {\n      durationMetric.bucket = findBucket(response.durationMs, buckets)\n    }\n\n    onMetric(durationMetric)\n\n    // Count metric\n    onMetric({\n      ...baseMetric,\n      type: 'query_count',\n      value: 1,\n    })\n\n    // Row count metric\n    onMetric({\n      ...baseMetric,\n      type: 'query_rows',\n      value: response.result.rowCount,\n    })\n\n    // Error metric (if failed)\n    if (!response.success) {\n      onMetric({\n        ...baseMetric,\n        type: 'query_error',\n        value: 1,\n      })\n    }\n\n    return response\n  }\n}\n\n/**\n * Find the histogram bucket for a duration value.\n *\n * Returns a bucket label in the format `le_<value>` for Prometheus-style\n * histogram metrics. Values exceeding all buckets return `le_inf`.\n *\n * @internal\n */\nfunction findBucket(value: number, buckets: number[]): string {\n  for (const bucket of buckets) {\n    if (value <= bucket) {\n      return `le_${bucket}`\n    }\n  }\n  return 'le_inf'\n}\n\n/**\n * Options for configuring the rate limiting middleware.\n */\nexport interface RateLimitMiddlewareOptions {\n  /** Maximum queries allowed per window. Required. */\n  maxQueries: number\n  /** Window size in milliseconds. Required. */\n  windowMs: number\n  /** Function to determine the rate limit key (e.g., by user). Defaults to 'default'. */\n  keyFn?: (request: QueryRequest) => string\n  /** Callback invoked when rate limit is exceeded. */\n  onRateLimited?: (request: QueryRequest, remainingSeconds: number) => void\n}\n\n/**\n * Create a rate limiting middleware to prevent query abuse.\n *\n * Uses a sliding window algorithm to track query counts per key.\n * When the limit is exceeded, returns an error response with retry information.\n *\n * @param options - Configuration options for the rate limiting middleware\n * @returns A middleware function that enforces rate limits\n *\n * @example Basic usage\n * ```typescript\n * const sql = postgres()\n *   .use(rateLimitMiddleware({\n *     maxQueries: 100,\n *     windowMs: 60000, // 1 minute\n *   }))\n * ```\n *\n * @example Per-user rate limiting\n * ```typescript\n * const sql = postgres()\n *   .use(rateLimitMiddleware({\n *     maxQueries: 100,\n *     windowMs: 60000,\n *     keyFn: (req) => req.context?.userId as string || 'anonymous',\n *     onRateLimited: (req, remaining) => {\n *       console.warn(`Rate limited user ${req.context?.userId}, retry in ${remaining}s`)\n *     }\n *   }))\n * ```\n */\nexport function rateLimitMiddleware(options: RateLimitMiddlewareOptions): QueryMiddleware {\n  const { maxQueries, windowMs, keyFn = () => 'default', onRateLimited } = options\n\n  const windows = new Map<string, { count: number; resetAt: number }>()\n\n  return async (request, next) => {\n    const key = keyFn(request)\n    const now = Date.now()\n\n    let window = windows.get(key)\n    if (!window || now >= window.resetAt) {\n      window = { count: 0, resetAt: now + windowMs }\n      windows.set(key, window)\n    }\n\n    window.count++\n\n    if (window.count > maxQueries) {\n      const remainingSeconds = Math.ceil((window.resetAt - now) / MS_PER_SECOND)\n      onRateLimited?.(request, remainingSeconds)\n\n      return {\n        result: {\n          rows: [],\n          rowCount: 0,\n          fields: [],\n          command: 'ERROR',\n        },\n        durationMs: 0,\n        success: false,\n        error: new Error(`Rate limit exceeded. Try again in ${remainingSeconds} seconds.`),\n        metadata: { rateLimited: true, retryAfter: remainingSeconds },\n      }\n    }\n\n    return next()\n  }\n}\n\n/**\n * Options for configuring the tracing middleware.\n */\nexport interface TracingMiddlewareOptions {\n  /** Trace ID: a static string, generator function, or undefined to use context/auto-generate. */\n  traceId?: string | ((request: QueryRequest) => string)\n  /** Span ID generator function. Defaults to random base-36 string. */\n  spanId?: () => string\n  /** Callback invoked with trace data after each query. */\n  onTrace?: (trace: QueryTrace) => void\n}\n\n/**\n * Query trace data for distributed tracing.\n *\n * Compatible with OpenTelemetry and similar tracing systems.\n */\nexport interface QueryTrace {\n  /** Unique trace identifier (spans same trace across services) */\n  traceId: string\n  /** Unique span identifier for this query */\n  spanId: string\n  /** Parent span ID if this query is part of a larger operation */\n  parentSpanId?: string | undefined\n  /** Query identifier for correlation with other middleware */\n  queryId: string\n  /** SQL query string */\n  sql: string\n  /** Unix timestamp when query started */\n  startTime: number\n  /** Unix timestamp when query completed */\n  endTime: number\n  /** Query duration in milliseconds */\n  durationMs: number\n  /** Whether the query succeeded */\n  success: boolean\n  /** Error message if query failed */\n  error?: string | undefined\n}\n\n/**\n * Create a tracing middleware for distributed tracing.\n *\n * Generates trace and span IDs for each query, enabling correlation\n * across services and query analysis.\n *\n * @param options - Configuration options for the tracing middleware\n * @returns A middleware function that adds trace information\n *\n * @example Basic usage\n * ```typescript\n * const sql = postgres()\n *   .use(tracingMiddleware({\n *     onTrace: (trace) => tracer.export(trace)\n *   }))\n * ```\n *\n * @example With OpenTelemetry\n * ```typescript\n * const sql = postgres()\n *   .use(tracingMiddleware({\n *     traceId: (req) => req.context?.traceId as string,\n *     onTrace: (trace) => {\n *       const span = tracer.startSpan('postgres.query', {\n *         attributes: { 'db.statement': trace.sql }\n *       })\n *       span.end()\n *     }\n *   }))\n * ```\n */\nexport function tracingMiddleware(options: TracingMiddlewareOptions = {}): QueryMiddleware {\n  const {\n    traceId: traceIdOption,\n    spanId = () => Math.random().toString(36).slice(QUERY_ID_RANDOM_SLICE_START, SPAN_ID_LENGTH),\n    onTrace,\n  } = options\n\n  return async (request, next) => {\n    const startTime = Date.now()\n    const currentSpanId = spanId()\n\n    const traceId =\n      typeof traceIdOption === 'function'\n        ? traceIdOption(request)\n        : traceIdOption || (request.context?.traceId as string) || generateQueryId()\n\n    const response = await next()\n\n    const trace: QueryTrace = {\n      traceId,\n      spanId: currentSpanId,\n      parentSpanId: request.context?.spanId as string | undefined,\n      queryId: request.queryId,\n      sql: request.sql,\n      startTime,\n      endTime: Date.now(),\n      durationMs: response.durationMs,\n      success: response.success,\n      error: response.error?.message,\n    }\n\n    onTrace?.(trace)\n\n    // Add trace info to response metadata\n    return {\n      ...response,\n      metadata: {\n        ...response.metadata,\n        traceId,\n        spanId: currentSpanId,\n      },\n    }\n  }\n}\n\n/**\n * Options for configuring the transformation middleware.\n */\nexport interface TransformMiddlewareOptions {\n  /** Transform the SQL query and params before execution. */\n  transformQuery?: (sql: string, params: unknown[]) => { sql: string; params: unknown[] }\n  /** Transform the result after successful execution. */\n  transformResult?: <T extends Row>(result: QueryResult<T>) => QueryResult<T>\n}\n\n/**\n * Create a query transformation middleware.\n *\n * Allows modifying queries before execution and results after execution.\n * Useful for query rewriting, result mapping, and data sanitization.\n *\n * @param options - Configuration options for the transformation middleware\n * @returns A middleware function that transforms queries and/or results\n *\n * @example Query rewriting\n * ```typescript\n * const sql = postgres()\n *   .use(transformMiddleware({\n *     transformQuery: (query, params) => ({\n *       sql: query.replace('SELECT *', 'SELECT id, name, email'),\n *       params\n *     })\n *   }))\n * ```\n *\n * @example Result transformation\n * ```typescript\n * const sql = postgres()\n *   .use(transformMiddleware({\n *     transformResult: (result) => ({\n *       ...result,\n *       rows: result.rows.map(row => ({\n *         ...row,\n *         createdAt: new Date(row.created_at)\n *       }))\n *     })\n *   }))\n * ```\n */\nexport function transformMiddleware(options: TransformMiddlewareOptions): QueryMiddleware {\n  const { transformQuery, transformResult } = options\n\n  return async (request, next) => {\n    // Transform the query if transformer is provided\n    if (transformQuery) {\n      const transformed = transformQuery(request.sql, request.params)\n      request.sql = transformed.sql\n      request.params = transformed.params\n    }\n\n    const response = await next()\n\n    // Transform the result if transformer is provided\n    if (transformResult && response.success) {\n      return {\n        ...response,\n        result: transformResult(response.result),\n      }\n    }\n\n    return response\n  }\n}\n\n/**\n * Options for configuring the retry middleware.\n */\nexport interface RetryMiddlewareOptions {\n  /** Maximum number of retry attempts. Defaults to 3. */\n  maxRetries?: number\n  /** Base delay between retries in milliseconds. Defaults to 100. */\n  baseDelayMs?: number\n  /** Maximum delay between retries in milliseconds. Defaults to 5000. */\n  maxDelayMs?: number\n  /** Whether to use exponential backoff. Defaults to true. */\n  exponentialBackoff?: boolean\n  /** Function to determine if an error is retryable. Defaults to always true. */\n  isRetryable?: (error: Error) => boolean\n  /** Callback invoked before each retry attempt. */\n  onRetry?: (attempt: number, error: Error, request: QueryRequest) => void\n}\n\n/**\n * Create a retry middleware with exponential backoff.\n *\n * Automatically retries failed queries based on configurable rules.\n * Supports exponential backoff to prevent overwhelming the database.\n *\n * @param options - Configuration options for the retry middleware\n * @returns A middleware function that retries failed queries\n *\n * @example Basic usage\n * ```typescript\n * const sql = postgres()\n *   .use(retryMiddleware({\n *     maxRetries: 3,\n *     baseDelayMs: 100,\n *   }))\n * ```\n *\n * @example Selective retry\n * ```typescript\n * const sql = postgres()\n *   .use(retryMiddleware({\n *     maxRetries: 5,\n *     baseDelayMs: 200,\n *     isRetryable: (error) => {\n *       // Only retry connection errors\n *       return error.message.includes('connection') ||\n *              error.message.includes('timeout')\n *     },\n *     onRetry: (attempt, error) => {\n *       console.warn(`Retry attempt ${attempt}: ${error.message}`)\n *     }\n *   }))\n * ```\n */\nexport function retryMiddleware(options: RetryMiddlewareOptions = {}): QueryMiddleware {\n  const {\n    maxRetries = DEFAULT_MAX_RETRIES,\n    baseDelayMs = DEFAULT_RETRY_BASE_DELAY_MS,\n    maxDelayMs = DEFAULT_RETRY_MAX_DELAY_MS,\n    exponentialBackoff = true,\n    isRetryable = () => true,\n    onRetry,\n  } = options\n\n  return async (request, next) => {\n    let lastResponse: QueryResponse\n    let attempt = 0\n\n    while (attempt <= maxRetries) {\n      lastResponse = await next()\n\n      if (lastResponse.success) {\n        return lastResponse\n      }\n\n      if (!lastResponse.error || !isRetryable(lastResponse.error)) {\n        return lastResponse\n      }\n\n      if (attempt < maxRetries) {\n        const delay = exponentialBackoff\n          ? Math.min(baseDelayMs * Math.pow(2, attempt), maxDelayMs)\n          : baseDelayMs\n\n        onRetry?.(attempt + 1, lastResponse.error, request)\n\n        await new Promise((resolve) => setTimeout(resolve, delay))\n      }\n\n      attempt++\n    }\n\n    return lastResponse!\n  }\n}\n\n// ============================================================================\n// Composition Utilities\n// ============================================================================\n\n/**\n * Combine multiple middlewares into a single middleware.\n *\n * Useful for creating reusable middleware bundles or organizing\n * middleware by concern.\n *\n * @param middlewares - Middleware functions to compose\n * @returns A single middleware that executes all provided middlewares in order\n *\n * @example Creating a middleware bundle\n * ```typescript\n * const observabilityMiddleware = composeMiddleware(\n *   loggingMiddleware({ level: 'info' }),\n *   metricsMiddleware({ onMetric: console.log }),\n *   tracingMiddleware({ onTrace: tracer.export })\n * )\n *\n * const sql = postgres().use(observabilityMiddleware)\n * ```\n *\n * @example Conditional composition\n * ```typescript\n * const prodMiddleware = composeMiddleware(\n *   metricsMiddleware({ onMetric: prometheus.record }),\n *   rateLimitMiddleware({ maxQueries: 1000, windowMs: 60000 })\n * )\n *\n * const devMiddleware = composeMiddleware(\n *   loggingMiddleware({ level: 'debug', logParams: true })\n * )\n *\n * const sql = postgres()\n *   .use(process.env.NODE_ENV === 'production' ? prodMiddleware : devMiddleware)\n * ```\n */\nexport function composeMiddleware(...middlewares: QueryMiddleware[]): QueryMiddleware {\n  return async (request, next) => {\n    const chain = middlewares.reduceRight<NextFunction>(\n      (nextFn, middleware) => () => middleware(request, nextFn),\n      next\n    )\n    return chain()\n  }\n}\n","/**\n * Streaming API for postgres.do\n *\n * Provides cursor-based streaming for large datasets to avoid OOM errors\n * in Cloudflare Workers' 128MB memory limit.\n *\n * Uses PostgreSQL cursors under the hood:\n * - DECLARE cursor FOR SELECT ...\n * - FETCH n FROM cursor\n * - CLOSE cursor\n *\n * @example\n * ```typescript\n * // Stream rows one at a time\n * for await (const row of sql.stream`SELECT * FROM huge_table`) {\n *   process(row)\n * }\n *\n * // Stream in batches\n * for await (const batch of sql.stream`SELECT * FROM huge_table`.batch(1000)) {\n *   processBatch(batch)\n * }\n *\n * // Manual cursor control\n * const cursor = sql.cursor`SELECT * FROM huge_table`\n * while (const rows = await cursor.fetch(100)) {\n *   process(rows)\n * }\n * await cursor.close()\n * ```\n *\n * ## Security Considerations\n *\n * ### Cursor Name Injection Prevention\n *\n * Cursor names are used in SQL statements (DECLARE, FETCH, CLOSE) and must be\n * carefully validated to prevent SQL injection attacks. This module implements\n * multiple layers of protection:\n *\n * 1. **PostgreSQL Identifier Validation**: Cursor names must conform to PostgreSQL\n *    identifier rules - start with letter or underscore, contain only alphanumeric\n *    characters and underscores, max 63 characters.\n *\n * 2. **Cryptographic Randomness**: Auto-generated cursor names use crypto.getRandomValues()\n *    to prevent name prediction attacks. The format is:\n *    `pg_cursor_{timestamp}_{counter}_{8-char-hex-random}`\n *\n * 3. **Double-Quote Escaping**: Cursor names are always wrapped in double quotes\n *    in SQL statements, preventing injection through special characters.\n *\n * 4. **No User Input Echoing**: Error messages do not echo potentially malicious\n *    cursor names back to the user, preventing information leakage.\n *\n * ### Isolation Level Validation\n *\n * Transaction isolation levels are validated against a whitelist to prevent\n * SQL injection through the isolationLevel option.\n *\n * ### Defense in Depth\n *\n * Even if validation were bypassed, the cursor name quoting provides additional\n * protection. However, users should never rely solely on quoting - always use\n * validated cursor names or let the system generate them automatically.\n *\n * @see validateCursorName for the validation implementation\n * @see generateCursorName for the secure name generation\n */\n\nimport type { Row, Transport, QueryResult, FieldInfo, TypeParser, StreamOptions, Cursor, CursorFetchResult, StreamResult } from './types'\nimport { isValidIdentifier, MAX_IDENTIFIER_LENGTH } from '@dotdo/postgres-shared/validation'\n\n/**\n * Valid PostgreSQL transaction isolation levels (case-insensitive).\n * Used to validate the isolationLevel option and prevent SQL injection.\n */\nconst VALID_ISOLATION_LEVELS = Object.freeze([\n  'read uncommitted',\n  'read committed',\n  'repeatable read',\n  'serializable',\n] as const)\n\n/**\n * Type for valid isolation levels\n */\ntype IsolationLevel = typeof VALID_ISOLATION_LEVELS[number]\n\n/**\n * Default batch size for streaming operations\n */\nconst DEFAULT_BATCH_SIZE = 100\n\n/**\n * Parse rows using type parsers\n */\nfunction parseRows<T extends Row>(\n  rows: T[],\n  fields: FieldInfo[],\n  parsers: Record<number, TypeParser>\n): T[] {\n  if (!fields || fields.length === 0 || Object.keys(parsers).length === 0) {\n    return rows\n  }\n\n  // Create a map of column name to parser\n  const columnParsers = new Map<string, TypeParser>()\n  for (const field of fields) {\n    const parser = parsers[field.dataTypeID]\n    if (parser) {\n      columnParsers.set(field.name, parser)\n    }\n  }\n\n  // If no parsers apply, return rows as-is\n  if (columnParsers.size === 0) {\n    return rows\n  }\n\n  // Parse each row\n  return rows.map((row) => {\n    const parsed: Record<string, unknown> = {}\n    for (const [key, value] of Object.entries(row)) {\n      const parser = columnParsers.get(key)\n      if (parser && typeof value === 'string') {\n        try {\n          parsed[key] = parser(value)\n        } catch {\n          parsed[key] = value // Keep original if parsing fails\n        }\n      } else {\n        parsed[key] = value\n      }\n    }\n    return parsed as T\n  })\n}\n\n/**\n * Generate a cryptographically random hex string\n */\nfunction randomHex(length: number): string {\n  // Use crypto.getRandomValues for secure randomness\n  // Works in both browser and Node.js environments\n  if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n    const bytes = new Uint8Array(Math.ceil(length / 2))\n    crypto.getRandomValues(bytes)\n    return Array.from(bytes, (b) => b.toString(16).padStart(2, '0'))\n      .join('')\n      .slice(0, length)\n  }\n  // Fallback for environments without crypto (should not happen in Workers)\n  let result = ''\n  const chars = '0123456789abcdef'\n  for (let i = 0; i < length; i++) {\n    result += chars[Math.floor(Math.random() * chars.length)]\n  }\n  return result\n}\n\n/**\n * Counter for generating unique cursor names within a session.\n * Combined with timestamp and cryptographic random bytes for uniqueness.\n *\n * ## Serverless Safety\n *\n * In serverless environments, this counter persists across requests within the\n * same isolate. This is acceptable because:\n *\n * 1. The primary uniqueness comes from the 8-char cryptographic random component\n * 2. The timestamp provides time-based uniqueness\n * 3. The counter only needs to be unique within the same millisecond\n * 4. Counter is periodically reset with jitter to reduce predictability\n *\n * The counter adds defense-in-depth but is not the sole uniqueness mechanism.\n */\nlet cursorCounter = 0\n\n/**\n * Track number of cursor names generated to periodically reset counter.\n */\nlet cursorsSinceReset = 0\n\n/**\n * Number of cursor names before resetting counter with jitter.\n * Prevents long-lived predictable counter sequences.\n */\nconst CURSOR_COUNTER_RESET_INTERVAL = 1000\n\n/**\n * Prefix for all auto-generated cursor names.\n * This prefix is part of the security model - it ensures generated names\n * follow a predictable, safe format.\n */\nconst CURSOR_NAME_PREFIX = 'pg_cursor_' as const\n\n/**\n * Generate a unique cursor name\n *\n * Uses cryptographic randomness to prevent name prediction attacks.\n * The generated format is: `pg_cursor_{timestamp}_{counter}_{random}`\n *\n * Security properties:\n * - Timestamp provides uniqueness across time\n * - Counter provides uniqueness within millisecond (with periodic jitter reset)\n * - 8 hex chars (32 bits) of cryptographic randomness prevents prediction\n * - Prefix ensures name always starts with letter (pg)\n * - Format guarantees valid PostgreSQL identifier\n *\n * Serverless safety:\n * - Counter is reset with random jitter every 1000 generations\n * - 8 random hex chars provide primary unpredictability\n * - Timestamp ensures no collision across time\n *\n * @returns A unique, cryptographically unpredictable cursor name\n */\nfunction generateCursorName(): string {\n  // Periodically reset counter with random jitter for serverless safety\n  if (cursorsSinceReset >= CURSOR_COUNTER_RESET_INTERVAL) {\n    cursorCounter = Math.floor(Math.random() * 1000000)\n    cursorsSinceReset = 0\n  }\n\n  const timestamp = Date.now()\n  const counter = ++cursorCounter\n  cursorsSinceReset++\n  const random = randomHex(8)\n  // Format: pg_cursor_1234567890123_1_a1b2c3d4\n  // Always valid: starts with 'p', contains only alphanumerics and underscores\n  return `${CURSOR_NAME_PREFIX}${timestamp}_${counter}_${random}`\n}\n\n/**\n * Reset cursor counter state. Intended for testing only.\n *\n * @security In production, this should never be exposed to external callers.\n *           Only exported for use in test cleanup between test cases.\n */\nexport function resetCursorCounterState(): void {\n  cursorCounter = 0\n  cursorsSinceReset = 0\n}\n\n/**\n * Error class for cursor validation failures.\n * Provides structured error information without leaking potentially malicious input.\n */\nexport class CursorValidationError extends Error {\n  /** Error code for programmatic handling */\n  readonly code: string\n\n  constructor(message: string, code: string = 'INVALID_CURSOR_NAME') {\n    super(message)\n    this.name = 'CursorValidationError'\n    this.code = code\n  }\n}\n\n/**\n * Validate a cursor name against PostgreSQL identifier rules\n * and security requirements.\n *\n * This function implements multiple layers of validation:\n *\n * 1. **Non-empty check**: Cursor names cannot be empty\n * 2. **Length check**: Cannot exceed PostgreSQL's 63-character limit\n * 3. **PostgreSQL identifier rules**: Must start with letter or underscore,\n *    contain only alphanumeric characters and underscores\n *\n * Security notes:\n * - Error messages do not echo the input back to prevent information leakage\n * - The regex pattern in isValidIdentifier explicitly rejects:\n *   - Quotes (single, double, backtick)\n *   - Semicolons and other SQL delimiters\n *   - Whitespace (spaces, tabs, newlines)\n *   - Dollar signs (used for dollar-quoting in PostgreSQL)\n *   - All other special characters\n *\n * @param cursorName - The cursor name to validate\n * @throws CursorValidationError if the cursor name is invalid\n *\n * @example\n * ```typescript\n * validateCursorName('my_cursor')      // OK\n * validateCursorName('_private')       // OK\n * validateCursorName('Cursor123')      // OK\n * validateCursorName('123cursor')      // Throws - starts with number\n * validateCursorName('my cursor')      // Throws - contains space\n * validateCursorName('cursor\"; DROP')  // Throws - contains special chars\n * ```\n */\nexport function validateCursorName(cursorName: string): void {\n  // Empty check with clear error\n  if (!cursorName || cursorName.length === 0) {\n    throw new CursorValidationError(\n      'Invalid cursor name: cannot be empty',\n      'CURSOR_NAME_EMPTY'\n    )\n  }\n\n  // Length check - PostgreSQL truncates identifiers silently at 63 chars,\n  // but we reject to prevent unexpected behavior\n  if (cursorName.length > MAX_IDENTIFIER_LENGTH) {\n    throw new CursorValidationError(\n      `Invalid cursor name: exceeds maximum length of ${MAX_IDENTIFIER_LENGTH} characters`,\n      'CURSOR_NAME_TOO_LONG'\n    )\n  }\n\n  // Use the shared validation function for PostgreSQL identifier rules\n  // This rejects names with:\n  // - Special characters (quotes, semicolons, spaces, etc.)\n  // - Names not starting with letter or underscore\n  // - SQL injection payloads\n  // - Dollar signs (valid in PG but excluded for security)\n  if (!isValidIdentifier(cursorName)) {\n    throw new CursorValidationError(\n      'Invalid cursor name: must start with a letter or underscore, and contain only letters, numbers, and underscores',\n      'CURSOR_NAME_INVALID_FORMAT'\n    )\n  }\n}\n\n/**\n * Validates an isolation level against the allowed whitelist.\n *\n * @param level - The isolation level to validate\n * @returns The normalized (lowercase) isolation level\n * @throws CursorValidationError if the isolation level is invalid\n */\nfunction validateIsolationLevel(level: string): IsolationLevel {\n  const normalized = level.toLowerCase() as IsolationLevel\n  if (!VALID_ISOLATION_LEVELS.includes(normalized)) {\n    throw new CursorValidationError(\n      'Invalid isolation level: must be one of: read uncommitted, read committed, repeatable read, serializable',\n      'INVALID_ISOLATION_LEVEL'\n    )\n  }\n  return normalized\n}\n\n/**\n * Internal cursor implementation\n */\nclass CursorImpl<T extends Row = Row> implements Cursor<T> {\n  private _isOpen = true\n  private _totalFetched = 0\n  private _fields: FieldInfo[] = []\n  private readonly cursorName: string\n  private readonly batchSize: number\n  private readonly transport: Transport\n  private readonly parsers: Record<number, TypeParser>\n  private inTransaction = false\n\n  constructor(\n    transport: Transport,\n    cursorName: string,\n    batchSize: number,\n    parsers: Record<number, TypeParser>\n  ) {\n    this.transport = transport\n    this.cursorName = cursorName\n    this.batchSize = batchSize\n    this.parsers = parsers\n  }\n\n  /**\n   * Initialize the cursor (called after DECLARE)\n   */\n  _setFields(fields: FieldInfo[]): void {\n    this._fields = fields\n  }\n\n  _setInTransaction(inTransaction: boolean): void {\n    this.inTransaction = inTransaction\n  }\n\n  get isOpen(): boolean {\n    return this._isOpen\n  }\n\n  get totalFetched(): number {\n    return this._totalFetched\n  }\n\n  get fields(): FieldInfo[] {\n    return this._fields\n  }\n\n  async fetch(count?: number): Promise<T[]> {\n    const result = await this.fetchWithInfo(count)\n    return result.rows\n  }\n\n  async fetchWithInfo(count?: number): Promise<CursorFetchResult<T>> {\n    if (!this._isOpen) {\n      return { rows: [], hasMore: false, totalFetched: this._totalFetched }\n    }\n\n    const fetchCount = count ?? this.batchSize\n    const result = await this.transport.query<T>(\n      `FETCH ${fetchCount} FROM \"${this.cursorName}\"`\n    )\n\n    // Store fields from first fetch if not already set\n    if (this._fields.length === 0 && result.fields.length > 0) {\n      this._fields = result.fields\n    }\n\n    const parsedRows = parseRows(result.rows, this._fields, this.parsers)\n    this._totalFetched += parsedRows.length\n\n    const hasMore = parsedRows.length === fetchCount\n\n    return {\n      rows: parsedRows,\n      hasMore,\n      totalFetched: this._totalFetched,\n    }\n  }\n\n  async close(): Promise<void> {\n    if (!this._isOpen) {\n      return\n    }\n\n    this._isOpen = false\n\n    try {\n      // Close the cursor\n      await this.transport.query(`CLOSE \"${this.cursorName}\"`)\n\n      // Commit the transaction if we started one\n      if (this.inTransaction) {\n        await this.transport.query('COMMIT')\n      }\n    } catch (error) {\n      // Try to rollback on error\n      if (this.inTransaction) {\n        try {\n          await this.transport.query('ROLLBACK')\n        } catch {\n          // Ignore rollback errors\n        }\n      }\n      throw error\n    }\n  }\n\n  async *[Symbol.asyncIterator](): AsyncIterableIterator<T> {\n    try {\n      while (this._isOpen) {\n        const { rows, hasMore } = await this.fetchWithInfo()\n\n        for (const row of rows) {\n          yield row\n        }\n\n        if (!hasMore) {\n          break\n        }\n      }\n    } finally {\n      await this.close()\n    }\n  }\n}\n\n/**\n * Create a cursor for a query\n */\nexport async function createCursor<T extends Row = Row>(\n  transport: Transport,\n  sql: string,\n  params: unknown[],\n  parsers: Record<number, TypeParser>,\n  options: StreamOptions = {}\n): Promise<Cursor<T>> {\n  // Generate or validate cursor name\n  const cursorName = options.cursorName ?? generateCursorName()\n\n  // Validate the cursor name (whether user-provided or generated)\n  // This prevents SQL injection attacks through cursor names\n  validateCursorName(cursorName)\n\n  const batchSize = options.batchSize ?? DEFAULT_BATCH_SIZE\n  const readOnly = options.readOnly ?? true\n\n  // Build transaction options\n  const txParts: string[] = ['BEGIN']\n  if (options.isolationLevel) {\n    // Validate isolation level to prevent SQL injection\n    // This uses a whitelist approach - only known-safe values are accepted\n    const normalized = validateIsolationLevel(options.isolationLevel)\n    txParts.push(`ISOLATION LEVEL ${normalized.toUpperCase()}`)\n  }\n  if (readOnly) {\n    txParts.push('READ ONLY')\n  }\n\n  // Start transaction and declare cursor\n  await transport.query(txParts.join(' '))\n\n  try {\n    // Declare the cursor\n    // For parameterized queries, we need to use a prepared statement approach\n    // PostgreSQL cursors don't directly support parameters in DECLARE\n    // So we build the query with proper escaping for the cursor\n    const declareResult = await declareCursor<T>(transport, cursorName, sql, params)\n\n    const cursor = new CursorImpl<T>(transport, cursorName, batchSize, parsers)\n    cursor._setFields(declareResult.fields)\n    cursor._setInTransaction(true)\n\n    return cursor\n  } catch (error) {\n    // Rollback on error\n    try {\n      await transport.query('ROLLBACK')\n    } catch {\n      // Ignore rollback errors\n    }\n    throw error\n  }\n}\n\n/**\n * Declare a cursor for a query with parameters\n */\nasync function declareCursor<T extends Row>(\n  transport: Transport,\n  cursorName: string,\n  sql: string,\n  params: unknown[]\n): Promise<QueryResult<T>> {\n  // For queries without parameters, declare directly\n  if (params.length === 0) {\n    return transport.query<T>(`DECLARE \"${cursorName}\" CURSOR FOR ${sql}`)\n  }\n\n  // For parameterized queries, we use a slightly different approach\n  // PostgreSQL's DECLARE doesn't support $n parameters directly,\n  // but the transport will handle parameter substitution\n  // We can use EXECUTE with a prepared statement\n  //\n  // However, for HTTP transport, parameters are handled server-side\n  // So we send the DECLARE with the query and parameters\n  return transport.query<T>(\n    `DECLARE \"${cursorName}\" CURSOR FOR ${sql}`,\n    params\n  )\n}\n\n/**\n * Create a stream result for a query\n */\nexport function createStreamResult<T extends Row = Row>(\n  transport: Transport,\n  sql: string,\n  params: unknown[],\n  parsers: Record<number, TypeParser>,\n  options: StreamOptions = {}\n): StreamResult<T> {\n  const batchSize = options.batchSize ?? DEFAULT_BATCH_SIZE\n\n  return {\n    sql,\n    params,\n\n    async *[Symbol.asyncIterator](): AsyncIterableIterator<T> {\n      const cursor = await createCursor<T>(transport, sql, params, parsers, {\n        ...options,\n        batchSize,\n      })\n\n      try {\n        for await (const row of cursor) {\n          yield row\n        }\n      } finally {\n        if (cursor.isOpen) {\n          await cursor.close()\n        }\n      }\n    },\n\n    batch(size: number): AsyncIterable<T[]> {\n      return {\n        async *[Symbol.asyncIterator](): AsyncIterableIterator<T[]> {\n          const cursor = await createCursor<T>(transport, sql, params, parsers, {\n            ...options,\n            batchSize: size,\n          })\n\n          try {\n            while (cursor.isOpen) {\n              const { rows, hasMore } = await cursor.fetchWithInfo(size)\n\n              if (rows.length > 0) {\n                yield rows\n              }\n\n              if (!hasMore) {\n                break\n              }\n            }\n          } finally {\n            if (cursor.isOpen) {\n              await cursor.close()\n            }\n          }\n        },\n      }\n    },\n\n    async cursor(): Promise<Cursor<T>> {\n      return createCursor<T>(transport, sql, params, parsers, options)\n    },\n  }\n}\n\n/**\n * Build parameterized SQL string from template\n */\nexport function buildParameterizedSql(\n  strings: TemplateStringsArray,\n  values: unknown[]\n): { sql: string; params: unknown[] } {\n  const parts: string[] = []\n  for (let i = 0; i < strings.length; i++) {\n    parts.push(strings[i]!)\n    if (i < values.length) {\n      parts.push(`$${i + 1}`)\n    }\n  }\n  return {\n    sql: parts.join(''),\n    params: values,\n  }\n}\n","/**\n * CDC Subscription for postgres.do\n *\n * Provides a user-friendly API for subscribing to database changes:\n * - Callback API (onChange, onInsert, onUpdate, onDelete)\n * - Async iterator API for use with for-await-of loops\n * - TypeScript generics for typed change payloads\n * - Automatic connection management and reconnection\n */\n\nimport type {\n  Row,\n  CDCChangeEvent,\n  CDCSubscriptionOptions,\n} from './types'\nimport type { CDCTransport } from './types'\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Options for creating a subscription\n */\nexport interface SubscribeOptions extends CDCSubscriptionOptions {\n  /** Called for every change event */\n  onChange?: (event: CDCChangeEvent) => void | Promise<void>\n  /** Called for INSERT events */\n  onInsert?: (row: Row) => void | Promise<void>\n  /** Called for UPDATE events */\n  onUpdate?: (newRow: Row, oldRow?: Row) => void | Promise<void>\n  /** Called for DELETE events */\n  onDelete?: (oldRow: Row) => void | Promise<void>\n  /** Called when an error occurs */\n  onError?: (error: Error) => void\n}\n\n/**\n * Typed subscribe options with generics\n */\nexport interface TypedSubscribeOptions<T extends Row> extends Omit<SubscribeOptions, 'onChange' | 'onInsert' | 'onUpdate' | 'onDelete'> {\n  /** Called for every change event */\n  onChange?: (event: CDCChangeEvent & { newRow?: T; oldRow?: T }) => void | Promise<void>\n  /** Called for INSERT events */\n  onInsert?: (row: T) => void | Promise<void>\n  /** Called for UPDATE events */\n  onUpdate?: (newRow: T, oldRow?: T) => void | Promise<void>\n  /** Called for DELETE events */\n  onDelete?: (oldRow: T) => void | Promise<void>\n  /** Called when an error occurs */\n  onError?: (error: Error) => void\n}\n\n/**\n * Subscription interface for CDC streaming\n */\nexport interface Subscription<T extends Row = Row> extends AsyncIterable<CDCChangeEvent & { newRow?: T; oldRow?: T }> {\n  /** Unique subscription ID */\n  readonly id: string\n  /** Table name */\n  readonly table: string\n  /** Schema name */\n  readonly schema: string\n  /** Whether the subscription is currently active */\n  readonly isActive: boolean\n  /** Last processed LSN for resumption */\n  readonly lastLsn: string | null\n\n  /** Unsubscribe and stop receiving events */\n  unsubscribe(): Promise<void>\n\n  /** Register a handler for all change events */\n  onChange(handler: (event: CDCChangeEvent & { newRow?: T; oldRow?: T }) => void | Promise<void>): this\n\n  /** Register a handler for INSERT events */\n  onInsert(handler: (row: T) => void | Promise<void>): this\n\n  /** Register a handler for UPDATE events */\n  onUpdate(handler: (newRow: T, oldRow?: T) => void | Promise<void>): this\n\n  /** Register a handler for DELETE events */\n  onDelete(handler: (oldRow: T) => void | Promise<void>): this\n}\n\n// =============================================================================\n// Implementation\n// =============================================================================\n\n/**\n * Internal state for managing the subscription\n */\ninterface SubscriptionState {\n  active: boolean\n  lastLsn: string | null\n  changeHandlers: Array<(event: CDCChangeEvent) => void | Promise<void>>\n  insertHandlers: Array<(row: Row) => void | Promise<void>>\n  updateHandlers: Array<(newRow: Row, oldRow?: Row) => void | Promise<void>>\n  deleteHandlers: Array<(oldRow: Row) => void | Promise<void>>\n  errorHandler: ((error: Error) => void) | null\n  eventQueue: CDCChangeEvent[]\n  eventResolvers: Array<(result: IteratorResult<CDCChangeEvent>) => void>\n  iteratorDone: boolean\n}\n\n/**\n * CDC Subscription implementation\n */\nexport class CDCSubscription<T extends Row = Row> implements Subscription<T> {\n  readonly id: string\n  readonly table: string\n  readonly schema: string\n\n  private state: SubscriptionState\n  private unsubscribeCallback: () => Promise<void>\n\n  constructor(\n    id: string,\n    table: string,\n    schema: string,\n    transport: CDCTransport,\n    unsubscribeCallback: () => Promise<void>,\n    options: SubscribeOptions = {}\n  ) {\n    this.id = id\n    this.table = table\n    this.schema = schema\n    void transport // Transport reference kept for future reconnection support\n    this.unsubscribeCallback = unsubscribeCallback\n\n    this.state = {\n      active: true,\n      lastLsn: options.resumeFrom ?? null,\n      changeHandlers: [],\n      insertHandlers: [],\n      updateHandlers: [],\n      deleteHandlers: [],\n      errorHandler: options.onError ?? null,\n      eventQueue: [],\n      eventResolvers: [],\n      iteratorDone: false,\n    }\n\n    // Register initial handlers from options\n    if (options.onChange) {\n      this.state.changeHandlers.push(options.onChange)\n    }\n    if (options.onInsert) {\n      this.state.insertHandlers.push(options.onInsert)\n    }\n    if (options.onUpdate) {\n      this.state.updateHandlers.push(options.onUpdate)\n    }\n    if (options.onDelete) {\n      this.state.deleteHandlers.push(options.onDelete)\n    }\n  }\n\n  get isActive(): boolean {\n    return this.state.active\n  }\n\n  get lastLsn(): string | null {\n    return this.state.lastLsn\n  }\n\n  /**\n   * Handle an incoming event from the transport\n   */\n  handleEvent(event: CDCChangeEvent): void {\n    if (!this.state.active) return\n\n    // Update last LSN\n    this.state.lastLsn = event.lsn\n\n    // Call change handlers\n    for (const handler of this.state.changeHandlers) {\n      try {\n        void handler(event)\n      } catch (error) {\n        this.handleError(error instanceof Error ? error : new Error(String(error)))\n      }\n    }\n\n    // Call operation-specific handlers\n    switch (event.operation) {\n      case 'INSERT':\n        if (event.newRow) {\n          for (const handler of this.state.insertHandlers) {\n            try {\n              void handler(event.newRow)\n            } catch (error) {\n              this.handleError(error instanceof Error ? error : new Error(String(error)))\n            }\n          }\n        }\n        break\n\n      case 'UPDATE':\n        if (event.newRow) {\n          for (const handler of this.state.updateHandlers) {\n            try {\n              void handler(event.newRow, event.oldRow)\n            } catch (error) {\n              this.handleError(error instanceof Error ? error : new Error(String(error)))\n            }\n          }\n        }\n        break\n\n      case 'DELETE':\n        if (event.oldRow) {\n          for (const handler of this.state.deleteHandlers) {\n            try {\n              void handler(event.oldRow)\n            } catch (error) {\n              this.handleError(error instanceof Error ? error : new Error(String(error)))\n            }\n          }\n        }\n        break\n    }\n\n    // If there are pending iterator resolvers, resolve the next one\n    if (this.state.eventResolvers.length > 0) {\n      const resolver = this.state.eventResolvers.shift()!\n      resolver({ value: event, done: false })\n    } else {\n      // Otherwise queue the event\n      this.state.eventQueue.push(event)\n    }\n  }\n\n  /**\n   * Handle an error from the transport\n   */\n  handleError(error: Error): void {\n    if (this.state.errorHandler) {\n      this.state.errorHandler(error)\n    }\n  }\n\n  /**\n   * Mark the subscription as inactive\n   */\n  setInactive(): void {\n    this.state.active = false\n    this.state.iteratorDone = true\n\n    // Resolve any pending iterator requests with done\n    while (this.state.eventResolvers.length > 0) {\n      const resolver = this.state.eventResolvers.shift()!\n      resolver({ value: undefined as unknown as CDCChangeEvent, done: true })\n    }\n  }\n\n  async unsubscribe(): Promise<void> {\n    if (!this.state.active) return\n\n    await this.unsubscribeCallback()\n    this.setInactive()\n  }\n\n  onChange(handler: (event: CDCChangeEvent & { newRow?: T; oldRow?: T }) => void | Promise<void>): this {\n    this.state.changeHandlers.push(handler as (event: CDCChangeEvent) => void | Promise<void>)\n    return this\n  }\n\n  onInsert(handler: (row: T) => void | Promise<void>): this {\n    this.state.insertHandlers.push(handler as (row: Row) => void | Promise<void>)\n    return this\n  }\n\n  onUpdate(handler: (newRow: T, oldRow?: T) => void | Promise<void>): this {\n    this.state.updateHandlers.push(handler as (newRow: Row, oldRow?: Row) => void | Promise<void>)\n    return this\n  }\n\n  onDelete(handler: (oldRow: T) => void | Promise<void>): this {\n    this.state.deleteHandlers.push(handler as (oldRow: Row) => void | Promise<void>)\n    return this\n  }\n\n  /**\n   * Async iterator implementation for for-await-of support\n   */\n  [Symbol.asyncIterator](): AsyncIterator<CDCChangeEvent & { newRow?: T; oldRow?: T }> {\n    return {\n      next: async (): Promise<IteratorResult<CDCChangeEvent & { newRow?: T; oldRow?: T }>> => {\n        // If subscription is inactive and queue is empty, we're done\n        if (this.state.iteratorDone && this.state.eventQueue.length === 0) {\n          return { value: undefined as unknown as CDCChangeEvent, done: true }\n        }\n\n        // If there's an event in the queue, return it\n        if (this.state.eventQueue.length > 0) {\n          const event = this.state.eventQueue.shift()!\n          return { value: event as CDCChangeEvent & { newRow?: T; oldRow?: T }, done: false }\n        }\n\n        // Wait for the next event\n        return new Promise((resolve) => {\n          this.state.eventResolvers.push(resolve as (result: IteratorResult<CDCChangeEvent>) => void)\n        })\n      },\n\n      return: async (): Promise<IteratorResult<CDCChangeEvent & { newRow?: T; oldRow?: T }>> => {\n        // Called when breaking out of for-await-of\n        // Don't unsubscribe - allow the user to continue later\n        return { value: undefined as unknown as CDCChangeEvent, done: true }\n      },\n    }\n  }\n}\n\n// =============================================================================\n// Validation Helpers\n// =============================================================================\n\n/**\n * Regular expression for valid table/schema names\n * Must start with letter or underscore, contain only alphanumeric and underscores\n */\nconst VALID_IDENTIFIER_REGEX = /^[a-zA-Z_][a-zA-Z0-9_]*$/\n\n/**\n * Validate a table name to prevent SQL injection\n */\nexport function validateTableName(name: string): { table: string; schema: string } {\n  if (!name || name.trim() === '') {\n    throw new Error('Table name cannot be empty')\n  }\n\n  // Check for SQL injection patterns\n  if (name.includes(';') || name.includes('--') || name.includes('/*') || name.includes('*/')) {\n    throw new Error('Invalid table name: contains forbidden characters')\n  }\n\n  // Split into schema.table if present\n  const parts = name.split('.')\n  if (parts.length > 2) {\n    throw new Error('Invalid table name: too many parts')\n  }\n\n  let schema = 'public'\n  let table: string\n\n  if (parts.length === 2) {\n    schema = parts[0]!\n    table = parts[1]!\n  } else {\n    table = parts[0]!\n  }\n\n  // Validate schema name\n  if (!VALID_IDENTIFIER_REGEX.test(schema)) {\n    throw new Error(`Invalid schema name: \"${schema}\"`)\n  }\n\n  // Validate table name\n  if (!VALID_IDENTIFIER_REGEX.test(table)) {\n    throw new Error(`Invalid table name: \"${table}\"`)\n  }\n\n  return { table, schema }\n}\n\n/**\n * Generate a unique subscription ID\n */\nexport function generateSubscriptionId(): string {\n  return `sub-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`\n}\n","/**\n * PostgreSQL client for postgres.do\n * SQL tagged template function with Drizzle ORM compatibility\n */\n\nimport type {\n  Sql,\n  TransactionSql,\n  ReservedSql,\n  PendingQuery,\n  Row,\n  PostgresConfig,\n  Transport,\n  TransactionOptions,\n  TypeParser,\n  QueryResult,\n  StreamResult,\n  CDCTransport,\n  CDCClientSubscription,\n  CDCClientSubscribeOptions,\n  CDCClientSubscriptionInfo,\n} from './types'\nimport { PostgresError, ConnectionError, TimeoutError } from './types'\nimport { createHttpTransport } from './transport/http'\nimport { createRpcTransport } from './transport/rpc'\nimport { createCdcWsTransport } from './transport/cdc-ws'\nimport { createCdcSseTransport } from './transport/cdc-sse'\nimport type { QueryMiddleware, QueryRequest } from './middleware'\nimport { generateQueryId, executeWithMiddleware } from './middleware'\nimport { createStreamResult, buildParameterizedSql as buildStreamSql } from './streaming'\nimport {\n  CDCSubscription,\n  validateTableName,\n  generateSubscriptionId,\n  type SubscribeOptions,\n} from './subscription'\n\n/** Default type parsers for common PostgreSQL types */\nconst DEFAULT_PARSERS: Record<number, TypeParser> = {\n  // Boolean\n  16: (value: string) => value === 't' || value === 'true',\n  // Integer types\n  20: (value: string) => BigInt(value), // int8/bigint\n  21: (value: string) => parseInt(value, 10), // int2\n  23: (value: string) => parseInt(value, 10), // int4\n  26: (value: string) => parseInt(value, 10), // oid\n  // Float types\n  700: (value: string) => parseFloat(value), // float4\n  701: (value: string) => parseFloat(value), // float8\n  1700: (value: string) => parseFloat(value), // numeric\n  // Date/time types\n  1082: (value: string) => value, // date (keep as string for flexibility)\n  1083: (value: string) => value, // time\n  1114: (value: string) => new Date(value), // timestamp\n  1184: (value: string) => new Date(value), // timestamptz\n  // JSON types\n  114: (value: string) => JSON.parse(value), // json\n  3802: (value: string) => JSON.parse(value), // jsonb\n  // Array types are handled by the server\n}\n\n/**\n * Parse a postgres:// URL into config\n */\nfunction parseConnectionUrl(url: string): Partial<PostgresConfig> {\n  try {\n    const parsed = new URL(url)\n    const config: Partial<PostgresConfig> = {}\n\n    // Extract protocol (postgres:// or postgresql://)\n    if (!parsed.protocol.startsWith('postgres')) {\n      throw new Error('Invalid protocol: must be postgres:// or postgresql://')\n    }\n\n    // Use the host directly for postgres.do\n    // URL format: postgres://db.postgres.do/database_name\n    const baseUrl = `https://${parsed.host}`\n\n    // Extract API key from password or query param\n    if (parsed.password) {\n      config.apiKey = decodeURIComponent(parsed.password)\n    }\n    if (parsed.searchParams.has('apiKey')) {\n      config.apiKey = parsed.searchParams.get('apiKey')!\n    }\n\n    // SSL setting - use conditional to avoid exactOptionalPropertyTypes issue\n    const sslMode = parsed.searchParams.get('sslmode')\n    if (sslMode && (sslMode === 'require' || sslMode === 'prefer' || sslMode === 'allow' || sslMode === 'disable')) {\n      config.ssl = sslMode\n    }\n\n    // Store the URL for transport\n    config.url = baseUrl + parsed.pathname\n\n    return config\n  } catch (error) {\n    throw new ConnectionError(`Invalid connection URL: ${error instanceof Error ? error.message : String(error)}`)\n  }\n}\n\n/**\n * Build parameterized SQL from template strings\n */\nfunction buildParameterizedSql(\n  strings: TemplateStringsArray,\n  values: unknown[]\n): string {\n  const parts: string[] = []\n  for (let i = 0; i < strings.length; i++) {\n    parts.push(strings[i]!)\n    if (i < values.length) {\n      parts.push(`$${i + 1}`)\n    }\n  }\n  return parts.join('')\n}\n\n/**\n * Create a pending query that can be executed\n */\nfunction createPendingQuery<T extends Row>(\n  transport: Transport,\n  strings: TemplateStringsArray,\n  values: unknown[],\n  parsers: Record<number, TypeParser>,\n  middlewares: QueryMiddleware[] = []\n): PendingQuery<T> {\n  const sql = buildParameterizedSql(strings, values)\n\n  // Create the promise that executes the query\n  const execute = async (): Promise<T[]> => {\n    if (middlewares.length === 0) {\n      // No middlewares - execute directly\n      const result = await transport.query<T>(sql, values)\n      return parseRows(result.rows, result.fields, parsers)\n    }\n\n    // Execute through middleware chain\n    const request: QueryRequest = {\n      sql,\n      params: values,\n      timestamp: Date.now(),\n      queryId: generateQueryId(),\n    }\n\n    const response = await executeWithMiddleware<T>(\n      middlewares as QueryMiddleware<T>[],\n      request,\n      async () => transport.query<T>(sql, values)\n    )\n\n    if (!response.success && response.error) {\n      throw response.error\n    }\n\n    return parseRows(response.result.rows, response.result.fields, parsers)\n  }\n\n  // Create the pending query object\n  const promise = execute() as PendingQuery<T>\n\n  // Add metadata\n  Object.defineProperty(promise, 'strings', { value: strings })\n  Object.defineProperty(promise, 'values', { value: values })\n  Object.defineProperty(promise, 'execute', { value: execute })\n  Object.defineProperty(promise, 'toString', {\n    value: () => sql,\n  })\n\n  return promise\n}\n\n/**\n * Parse rows using type parsers\n */\nfunction parseRows<T extends Row>(\n  rows: T[],\n  fields: QueryResult['fields'],\n  parsers: Record<number, TypeParser>\n): T[] {\n  if (!fields || fields.length === 0) {\n    return rows\n  }\n\n  // Create a map of column name to parser\n  const columnParsers = new Map<string, TypeParser>()\n  for (const field of fields) {\n    const parser = parsers[field.dataTypeID]\n    if (parser) {\n      columnParsers.set(field.name, parser)\n    }\n  }\n\n  // If no parsers apply, return rows as-is\n  if (columnParsers.size === 0) {\n    return rows\n  }\n\n  // Parse each row\n  return rows.map((row) => {\n    const parsed: Record<string, unknown> = {}\n    for (const [key, value] of Object.entries(row)) {\n      const parser = columnParsers.get(key)\n      if (parser && typeof value === 'string') {\n        try {\n          parsed[key] = parser(value)\n        } catch {\n          parsed[key] = value // Keep original if parsing fails\n        }\n      } else {\n        parsed[key] = value\n      }\n    }\n    return parsed as T\n  })\n}\n\n// ============================================================================\n// Advisory Lock Helpers\n// ============================================================================\n\n/** PostgreSQL bigint max value: 2^63 - 1 */\nconst BIGINT_MAX = BigInt('9223372036854775807')\n\n/** PostgreSQL int4 max value: 2^31 - 1 */\nconst INT4_MAX = 2147483647\n\n/**\n * Validate a single advisory lock key.\n *\n * Lock keys must be:\n * - Non-negative integers\n * - Within PostgreSQL bigint range (0 to 2^63 - 1)\n *\n * @param key - The lock key to validate\n * @throws {PostgresError} If the key is invalid (PostgreSQL error code '22023')\n */\nfunction validateLockKey(key: number | bigint): void {\n  // Check for non-integer FIRST (before BigInt conversion throws its own error)\n  if (typeof key === 'number' && !Number.isInteger(key)) {\n    throw new PostgresError('Advisory lock key must be an integer', {\n      code: '22023',\n      severity: 'ERROR',\n    })\n  }\n\n  const keyBigInt = BigInt(key)\n\n  // Check for negative values\n  if (keyBigInt < BigInt(0)) {\n    throw new PostgresError('Advisory lock key must be non-negative', {\n      code: '22023',\n      severity: 'ERROR',\n    })\n  }\n\n  // Check for overflow (PostgreSQL bigint max)\n  if (keyBigInt > BIGINT_MAX) {\n    throw new PostgresError('Advisory lock key exceeds PostgreSQL bigint maximum', {\n      code: '22023',\n      severity: 'ERROR',\n    })\n  }\n}\n\n/**\n * Validate a two-key advisory lock pair.\n *\n * Two-key locks use PostgreSQL's int4 range for both classid and objid:\n * - Non-negative integers\n * - Within int4 range (0 to 2^31 - 1)\n *\n * @param classId - The lock class/namespace identifier\n * @param objId - The object identifier within the namespace\n * @throws {PostgresError} If either key is invalid (PostgreSQL error code '22023')\n */\nfunction validateTwoKeyLock(classId: number, objId: number): void {\n  // Check for non-integers\n  if (!Number.isInteger(classId) || !Number.isInteger(objId)) {\n    throw new PostgresError('Advisory lock keys must be integers', {\n      code: '22023',\n      severity: 'ERROR',\n    })\n  }\n\n  // Check for negative values\n  if (classId < 0 || objId < 0) {\n    throw new PostgresError('Advisory lock keys must be non-negative', {\n      code: '22023',\n      severity: 'ERROR',\n    })\n  }\n\n  // Check for int4 overflow\n  if (classId > INT4_MAX || objId > INT4_MAX) {\n    throw new PostgresError('Advisory lock key exceeds PostgreSQL int4 maximum', {\n      code: '22023',\n      severity: 'ERROR',\n    })\n  }\n}\n\n/**\n * Build the SQL for an advisory lock operation.\n *\n * @param lockFn - The PostgreSQL lock function name\n * @param args - The lock key arguments (single bigint or two int4s)\n * @returns The SQL string for the lock operation\n */\nfunction buildAdvisoryLockSql(lockFn: string, ...args: Array<number | bigint>): string {\n  if (args.length === 1) {\n    return `SELECT ${lockFn}(${BigInt(args[0]!)})`\n  }\n  return `SELECT ${lockFn}(${args[0]}, ${args[1]})`\n}\n\n// ============================================================================\n// Two-Phase Commit (2PC) Helpers\n// ============================================================================\n\n/**\n * Regular expression for validating two-phase commit transaction IDs.\n *\n * Transaction IDs must:\n * - Start with a letter or underscore\n * - Contain only alphanumeric characters and underscores\n * - Be non-empty\n *\n * This prevents SQL injection in PREPARE TRANSACTION, COMMIT PREPARED,\n * and ROLLBACK PREPARED statements.\n */\nconst TRANSACTION_ID_REGEX = /^[a-zA-Z_][a-zA-Z0-9_]*$/\n\n/**\n * Validate a transaction ID for two-phase commit operations.\n *\n * Two-phase commit (2PC) allows a transaction to be prepared on one\n * connection and committed/rolled back on another, enabling distributed\n * transactions across multiple databases or services.\n *\n * @param transactionId - The transaction ID to validate\n * @throws {PostgresError} If the transaction ID is invalid (PostgreSQL error code '22023')\n *\n * @example\n * ```typescript\n * validateTransactionId('my_tx_123')  // OK\n * validateTransactionId('_private')   // OK\n * validateTransactionId('123_bad')    // throws - cannot start with number\n * validateTransactionId('has space')  // throws - no spaces allowed\n * validateTransactionId(\"'; DROP\")    // throws - SQL injection attempt blocked\n * ```\n */\nfunction validateTransactionId(transactionId: string): void {\n  if (!TRANSACTION_ID_REGEX.test(transactionId)) {\n    throw new PostgresError(\n      'Invalid transaction ID: must be alphanumeric with underscores, starting with letter or underscore',\n      {\n        code: '22023',\n        severity: 'ERROR',\n      }\n    )\n  }\n}\n\n// ============================================================================\n// Transaction Hook Helpers\n// ============================================================================\n\n/**\n * Execute an array of transaction lifecycle callbacks sequentially.\n *\n * This is used for transaction hooks (onCommit/onRollback) where:\n * - All callbacks should be attempted even if earlier ones fail\n * - Callback errors are logged but not propagated to the caller\n * - Callbacks execute in registration order (FIFO)\n *\n * @param callbacks - Array of callback functions to execute\n * @param phase - The phase name for error logging ('commit' or 'rollback')\n */\nasync function executeTransactionCallbacks(\n  callbacks: Array<() => void | Promise<void>>,\n  phase: 'commit' | 'rollback'\n): Promise<void> {\n  for (const callback of callbacks) {\n    try {\n      await callback()\n    } catch (error) {\n      // Log but don't propagate - ensures all callbacks are attempted\n      console.error(`Transaction ${phase} callback error:`, error)\n    }\n  }\n}\n\n// ============================================================================\n// Transaction Context and State\n// ============================================================================\n\n/**\n * Transaction context for tracking mutable state during a transaction.\n *\n * This context is created fresh for each transaction attempt and holds:\n * - Transaction metadata (txid, name)\n * - Lifecycle hooks (onCommit, onRollback callbacks)\n * - Two-phase commit state (prepared flag and transaction ID)\n * - Retry state (current attempt number)\n */\ninterface TransactionContext {\n  /** PostgreSQL transaction ID fetched via txid_current() */\n  txid: string | undefined\n  /** User-provided transaction name for debugging/logging */\n  txName: string | undefined\n  /** Callbacks to execute after successful COMMIT */\n  onCommitCallbacks: Array<() => void | Promise<void>>\n  /** Callbacks to execute after ROLLBACK (errors ignored) */\n  onRollbackCallbacks: Array<() => void | Promise<void>>\n  /** Whether PREPARE TRANSACTION has been called (2PC mode) */\n  isPrepared: boolean\n  /** The transaction ID used in PREPARE TRANSACTION */\n  preparedTxId: string | undefined\n  /** Current retry attempt number (0 for first attempt, 1 for first retry, etc.) */\n  retryCount: number\n}\n\n/**\n * Create a transaction SQL client\n */\nfunction createTransactionSql(\n  transport: Transport,\n  parsers: Record<number, TypeParser>,\n  savepointCounter: { count: number },\n  txContext: TransactionContext\n): TransactionSql {\n  // Create the base tagged template function\n  const taggedTemplate = <T extends Row = Row>(\n    strings: TemplateStringsArray,\n    ...values: unknown[]\n  ): PendingQuery<T> => {\n    return createPendingQuery<T>(transport, strings, values, parsers)\n  }\n\n  // Middleware array for TransactionSql (usually empty within transaction)\n  const txMiddlewares: QueryMiddleware[] = []\n\n  // Create the transaction sql object with all required methods\n  const txSql = Object.assign(taggedTemplate, {\n    unsafe: async <T extends Row = Row>(\n      query: string,\n      params?: unknown[]\n    ): Promise<T[]> => {\n      const result = await transport.query<T>(query, params)\n      return parseRows(result.rows, result.fields, parsers)\n    },\n\n    savepoint: async <T>(\n      fn: (sql: TransactionSql) => Promise<T>\n    ): Promise<T> => {\n      const savepointName = `sp_${++savepointCounter.count}`\n\n      // Create savepoint\n      await transport.query(`SAVEPOINT ${savepointName}`)\n\n      try {\n        const result = await fn(txSql as unknown as TransactionSql)\n        // Release savepoint on success\n        await transport.query(`RELEASE SAVEPOINT ${savepointName}`)\n        return result\n      } catch (error) {\n        // Rollback to savepoint on error\n        await transport.query(`ROLLBACK TO SAVEPOINT ${savepointName}`)\n        throw error\n      }\n    },\n\n    stream: <T extends Row = Row>(\n      strings: TemplateStringsArray,\n      ...values: unknown[]\n    ): StreamResult<T> => {\n      const { sql: query, params } = buildStreamSql(strings, values)\n      return createStreamResult<T>(transport, query, params, parsers)\n    },\n\n    use: function (middleware: QueryMiddleware): TransactionSql {\n      txMiddlewares.push(middleware)\n      return txSql as unknown as TransactionSql\n    },\n\n    options: {\n      parsers,\n      serializers: {} as Record<number, (value: unknown) => string>,\n    },\n\n    // =========================================================================\n    // Advisory Lock Methods\n    // =========================================================================\n    // PostgreSQL advisory locks are application-level cooperative locks.\n    // Transaction-scoped locks (*_xact_*) are automatically released when\n    // the transaction ends (commit or rollback).\n\n    /**\n     * Acquire an exclusive advisory lock (blocking).\n     * Supports single-key (bigint) and two-key (int4, int4) variants.\n     */\n    advisoryLock: async (keyOrClassId: number | bigint, objId?: number): Promise<void> => {\n      if (objId !== undefined) {\n        // Two-key variant: pg_advisory_xact_lock(classid, objid)\n        validateTwoKeyLock(keyOrClassId as number, objId)\n        await transport.query(buildAdvisoryLockSql('pg_advisory_xact_lock', keyOrClassId as number, objId))\n      } else {\n        // Single-key variant: pg_advisory_xact_lock(key)\n        validateLockKey(keyOrClassId)\n        await transport.query(buildAdvisoryLockSql('pg_advisory_xact_lock', keyOrClassId))\n      }\n    },\n\n    /**\n     * Try to acquire an exclusive advisory lock (non-blocking).\n     * Returns true if lock acquired, false if lock is held by another session.\n     */\n    tryAdvisoryLock: async (keyOrClassId: number | bigint, objId?: number): Promise<boolean> => {\n      let sql: string\n      if (objId !== undefined) {\n        validateTwoKeyLock(keyOrClassId as number, objId)\n        sql = buildAdvisoryLockSql('pg_try_advisory_xact_lock', keyOrClassId as number, objId)\n      } else {\n        validateLockKey(keyOrClassId)\n        sql = buildAdvisoryLockSql('pg_try_advisory_xact_lock', keyOrClassId)\n      }\n      const result = await transport.query<{ pg_try_advisory_xact_lock: boolean }>(sql)\n      return result.rows[0]?.pg_try_advisory_xact_lock ?? false\n    },\n\n    /**\n     * Acquire a shared advisory lock (blocking).\n     * Multiple sessions can hold a shared lock simultaneously.\n     * Blocks if an exclusive lock is held.\n     */\n    advisoryLockShared: async (keyOrClassId: number | bigint, objId?: number): Promise<void> => {\n      if (objId !== undefined) {\n        validateTwoKeyLock(keyOrClassId as number, objId)\n        await transport.query(buildAdvisoryLockSql('pg_advisory_xact_lock_shared', keyOrClassId as number, objId))\n      } else {\n        validateLockKey(keyOrClassId)\n        await transport.query(buildAdvisoryLockSql('pg_advisory_xact_lock_shared', keyOrClassId))\n      }\n    },\n\n    /**\n     * Try to acquire a shared advisory lock (non-blocking).\n     * Returns true if lock acquired, false if an exclusive lock is held.\n     */\n    tryAdvisoryLockShared: async (keyOrClassId: number | bigint, objId?: number): Promise<boolean> => {\n      let sql: string\n      if (objId !== undefined) {\n        validateTwoKeyLock(keyOrClassId as number, objId)\n        sql = buildAdvisoryLockSql('pg_try_advisory_xact_lock_shared', keyOrClassId as number, objId)\n      } else {\n        validateLockKey(keyOrClassId)\n        sql = buildAdvisoryLockSql('pg_try_advisory_xact_lock_shared', keyOrClassId)\n      }\n      const result = await transport.query<{ pg_try_advisory_xact_lock_shared: boolean }>(sql)\n      return result.rows[0]?.pg_try_advisory_xact_lock_shared ?? false\n    },\n\n    // Two-phase commit support - allows distributed transaction coordination\n    prepare: async (transactionId: string): Promise<string> => {\n      validateTransactionId(transactionId)\n      txContext.isPrepared = true\n      txContext.preparedTxId = transactionId\n      await transport.query(`PREPARE TRANSACTION '${transactionId}'`)\n      return transactionId\n    },\n\n    // Transaction hooks\n    onCommit: (fn: () => void | Promise<void>): void => {\n      txContext.onCommitCallbacks.push(fn)\n    },\n\n    onRollback: (fn: () => void | Promise<void>): void => {\n      txContext.onRollbackCallbacks.push(fn)\n    },\n  }) as unknown as TransactionSql\n\n  // Define 'txid' as a getter that reads from context (Object.assign doesn't preserve getters).\n  // The txid is eagerly fetched after BEGIN via txid_current() and stored in txContext.\n  Object.defineProperty(txSql, 'txid', {\n    get: () => txContext.txid,\n    configurable: true,\n    enumerable: true,\n  })\n\n  // Define 'name' as a getter for the user-provided transaction name (function.name is read-only)\n  Object.defineProperty(txSql, 'name', {\n    get: () => txContext.txName,\n    configurable: true,\n    enumerable: true,\n  })\n\n  // Define 'retryCount' as a getter for the current retry attempt number\n  Object.defineProperty(txSql, 'retryCount', {\n    get: () => txContext.retryCount,\n    configurable: true,\n    enumerable: true,\n  })\n\n  return txSql\n}\n\n/**\n * Create the main SQL client\n */\nexport function createClient(config: PostgresConfig = {}): Sql {\n  // Merge default parsers with custom parsers\n  const parsers: Record<number, TypeParser> = {\n    ...DEFAULT_PARSERS,\n    ...config.parsers,\n  }\n\n  // Determine base URL\n  let baseUrl = config.url || 'https://db.postgres.do'\n  if (!baseUrl.startsWith('http')) {\n    // Parse as postgres:// URL\n    const parsed = parseConnectionUrl(baseUrl)\n    baseUrl = parsed.url || 'https://db.postgres.do'\n    config = { ...config, ...parsed }\n  }\n\n  // Create transport\n  const transport: Transport = config.transport === 'ws'\n    ? createRpcTransport({\n        url: baseUrl.replace('https://', 'wss://').replace('http://', 'ws://') + '/rpc',\n        apiKey: config.apiKey,\n        WebSocket: config.WebSocket,\n        connectTimeout: config.connectTimeout,\n      })\n    : createHttpTransport({\n        baseUrl,\n        apiKey: config.apiKey,\n        fetch: config.fetch,\n        timeout: config.queryTimeout,\n      })\n\n  // Middleware array - mutable to support .use() chaining\n  const middlewares: QueryMiddleware[] = []\n\n  /**\n   * Main SQL tagged template function\n   */\n  const sql = function <T extends Row = Row>(\n    strings: TemplateStringsArray,\n    ...values: unknown[]\n  ): PendingQuery<T> {\n    return createPendingQuery<T>(transport, strings, values, parsers, middlewares)\n  } as Sql\n\n  /**\n   * Execute raw SQL query (used by Drizzle ORM)\n   */\n  sql.unsafe = async <T extends Row = Row>(\n    query: string,\n    params?: unknown[]\n  ): Promise<T[]> => {\n    if (middlewares.length === 0) {\n      const result = await transport.query<T>(query, params)\n      return parseRows(result.rows, result.fields, parsers)\n    }\n\n    // Execute through middleware chain\n    const request: QueryRequest = {\n      sql: query,\n      params: params || [],\n      timestamp: Date.now(),\n      queryId: generateQueryId(),\n    }\n\n    const response = await executeWithMiddleware<T>(\n      middlewares as QueryMiddleware<T>[],\n      request,\n      async () => transport.query<T>(query, params)\n    )\n\n    if (!response.success && response.error) {\n      throw response.error\n    }\n\n    return parseRows(response.result.rows, response.result.fields, parsers)\n  }\n\n  /**\n   * Begin a transaction\n   */\n  sql.begin = async <T>(\n    fn: (sql: TransactionSql) => Promise<T>,\n    options?: TransactionOptions\n  ): Promise<T> => {\n    // Merge client-level transactionRetry defaults with transaction-level options\n    // Transaction-level options override client-level defaults\n    const clientRetryConfig = config.transactionRetry ?? {}\n    const maxRetries = options?.maxRetries ?? clientRetryConfig.maxRetries ?? 3\n    const shouldRetryOnSerializationFailure = options?.retryOnSerializationFailure ?? clientRetryConfig.retryOnSerializationFailure ?? false\n    const shouldRetryOnDeadlock = options?.retryOnDeadlock ?? clientRetryConfig.retryOnDeadlock ?? false\n    const backoffMs = options?.backoffMs ?? clientRetryConfig.backoffMs ?? 10\n    const onRetry = options?.onRetry\n\n    /**\n     * Check if an error is retryable based on the configured options.\n     * Retryable errors are:\n     * - 40001: Serialization failure (when retryOnSerializationFailure is enabled)\n     * - 40P01: Deadlock detected (when retryOnDeadlock is enabled)\n     */\n    const isRetryableError = (error: unknown): boolean => {\n      if (!(error instanceof PostgresError)) {\n        return false\n      }\n      if (shouldRetryOnSerializationFailure && error.pgCode === '40001') {\n        return true\n      }\n      if (shouldRetryOnDeadlock && error.pgCode === '40P01') {\n        return true\n      }\n      return false\n    }\n\n    // Track start time for total timeout across retries\n    // Note: totalTimeout can be 0 (immediate timeout), undefined (no timeout), or negative (treated as no timeout)\n    // Fall back to client-level queryTimeout if transaction-level timeout is not specified\n    const effectiveTimeout = options?.timeout ?? config.queryTimeout\n    // Negative timeouts are treated as \"no timeout\" for backward compatibility\n    const hasTotalTimeout = effectiveTimeout !== undefined && effectiveTimeout >= 0\n    const totalTimeout = hasTotalTimeout ? effectiveTimeout : undefined\n    const startTime = hasTotalTimeout ? Date.now() : 0\n    const perRetryTimeout = options?.perRetryTimeout\n\n    /**\n     * Calculate the timeout for the current attempt.\n     *\n     * Timeout precedence:\n     * 1. If `timeout` is set (including 0), use the remaining time from the total timeout\n     * 2. If only `perRetryTimeout` is set, use it directly (fresh timeout per attempt)\n     * 3. If neither is set, return undefined (no timeout)\n     *\n     * Returns undefined if no timeout is set.\n     * Throws TimeoutError if total timeout has been exceeded.\n     */\n    const getAttemptTimeout = (): number | undefined => {\n      // Total timeout takes precedence (including 0)\n      if (hasTotalTimeout && totalTimeout !== undefined) {\n        const elapsed = Date.now() - startTime\n        const remaining = totalTimeout - elapsed\n        if (remaining <= 0) {\n          throw new TimeoutError(`Transaction timed out after ${totalTimeout}ms`)\n        }\n        return remaining\n      }\n\n      // Per-retry timeout: each attempt gets a fresh timeout\n      if (perRetryTimeout) {\n        return perRetryTimeout\n      }\n\n      return undefined\n    }\n\n    const executeTransaction = async (attempt: number): Promise<T> => {\n      // Check if we've exceeded total timeout before starting a new attempt\n      // This check is for retry attempts where time has already elapsed\n      if (hasTotalTimeout && attempt > 1) {\n        getAttemptTimeout() // Throws if timeout exceeded during retries\n      }\n\n      // Build BEGIN statement with options\n      const beginParts = ['BEGIN']\n\n      if (options?.isolationLevel) {\n        // Validate isolation level to prevent SQL injection\n        const validLevels = ['read uncommitted', 'read committed', 'repeatable read', 'serializable']\n        const normalized = options.isolationLevel.toLowerCase()\n        if (!validLevels.includes(normalized)) {\n          throw new Error(`Invalid isolation level: \"${options.isolationLevel}\"`)\n        }\n        beginParts.push(`ISOLATION LEVEL ${normalized.toUpperCase()}`)\n      }\n      if (options?.readOnly) {\n        beginParts.push('READ ONLY')\n      }\n      if (options?.deferrable) {\n        beginParts.push('DEFERRABLE')\n      }\n\n      // Start transaction - may fail with serialization failure in rare cases\n      try {\n        await transport.query(beginParts.join(' '))\n      } catch (beginError) {\n        // Check if BEGIN failed with a retryable error\n        if (isRetryableError(beginError) && attempt < maxRetries) {\n          // Call onRetry callback if provided\n          if (onRetry) {\n            await onRetry(attempt, beginError as Error)\n          }\n          // Exponential backoff\n          const delay = backoffMs * Math.pow(2, attempt - 1)\n          await new Promise((resolve) => setTimeout(resolve, delay))\n          return executeTransaction(attempt + 1)\n        }\n        throw beginError\n      }\n\n      // Create transaction context\n      const txContext: TransactionContext = {\n        txid: undefined,\n        txName: options?.name,\n        onCommitCallbacks: [],\n        onRollbackCallbacks: [],\n        isPrepared: false,\n        preparedTxId: undefined,\n        retryCount: attempt - 1, // 0 for first attempt, 1 for first retry, etc.\n      }\n\n      const savepointCounter = { count: 0 }\n      const txSql = createTransactionSql(transport, parsers, savepointCounter, txContext)\n\n      // Eagerly fetch PostgreSQL transaction ID (xid) so it's available throughout the callback.\n      // This queries txid_current() which returns the internal transaction identifier,\n      // useful for debugging, logging, and correlating with pg_stat_activity or pg_locks.\n      // Errors are silently ignored since txid is optional debugging metadata.\n      try {\n        const txidResult = await transport.query<{ txid_current: string }>('SELECT txid_current()::text')\n        txContext.txid = txidResult.rows[0]?.txid_current\n      } catch {\n        // Non-fatal: txid is optional metadata for debugging/logging\n      }\n\n      // Handle timeout if specified - uses remaining time from total timeout or per-retry timeout\n      // The timeout wraps the entire transaction including user callback AND COMMIT\n      let timeoutHandle: ReturnType<typeof setTimeout> | undefined\n      let timedOut = false\n\n      const attemptTimeout = getAttemptTimeout()\n      if (attemptTimeout !== undefined) {\n        timeoutHandle = setTimeout(() => {\n          timedOut = true\n        }, attemptTimeout)\n      }\n\n      /**\n       * Check if we've timed out and throw if so.\n       * This is called at key points during the transaction.\n       */\n      const checkTimeout = (): void => {\n        if (timedOut) {\n          const timeoutForMessage = totalTimeout ?? perRetryTimeout ?? attemptTimeout\n          throw new TimeoutError(`Transaction timed out after ${timeoutForMessage}ms`)\n        }\n      }\n\n      try {\n        // Execute user callback\n        const result = await fn(txSql)\n\n        // Check for timeout after user callback\n        checkTimeout()\n\n        // If transaction was prepared for 2PC, don't COMMIT\n        if (txContext.isPrepared) {\n          // onCommit callbacks will be called when commitPrepared is called\n          if (timeoutHandle) clearTimeout(timeoutHandle)\n          return result\n        }\n\n        // COMMIT is also covered by the timeout\n        await transport.query('COMMIT')\n\n        // Check for timeout after COMMIT\n        checkTimeout()\n\n        // Clear timeout after successful commit\n        if (timeoutHandle) clearTimeout(timeoutHandle)\n\n        // Execute onCommit callbacks (errors logged but not propagated)\n        await executeTransactionCallbacks(txContext.onCommitCallbacks, 'commit')\n\n        return result\n      } catch (error) {\n        // Clear timeout if still pending\n        if (timeoutHandle) {\n          clearTimeout(timeoutHandle)\n        }\n\n        // If we timed out during execution, throw TimeoutError\n        if (timedOut && !(error instanceof TimeoutError)) {\n          const timeoutForMessage = totalTimeout ?? perRetryTimeout ?? attemptTimeout\n          throw new TimeoutError(`Transaction timed out after ${timeoutForMessage}ms`)\n        }\n\n        // Always attempt ROLLBACK on error (including timeout) unless prepared for 2PC.\n        // Even if the transaction timed out, PostgreSQL still has an open transaction\n        // that needs cleanup to avoid leaving connections in bad state.\n        if (!txContext.isPrepared) {\n          try {\n            await transport.query('ROLLBACK')\n          } catch {\n            // Ignore rollback errors - connection might be in invalid state\n          }\n        }\n\n        // Execute onRollback callbacks (errors logged but not propagated)\n        await executeTransactionCallbacks(txContext.onRollbackCallbacks, 'rollback')\n\n        // Don't retry if we've hit a timeout\n        if (error instanceof TimeoutError) {\n          throw error\n        }\n\n        // Check for retryable errors (serialization failure or deadlock)\n        if (isRetryableError(error) && attempt < maxRetries) {\n          // Call onRetry callback if provided\n          if (onRetry) {\n            await onRetry(attempt, error as Error)\n          }\n          // Exponential backoff\n          const delay = backoffMs * Math.pow(2, attempt - 1)\n          await new Promise((resolve) => setTimeout(resolve, delay))\n          return executeTransaction(attempt + 1)\n        }\n\n        throw error\n      }\n    }\n\n    return executeTransaction(1)\n  }\n\n  /**\n   * Create a savepoint (only valid within a transaction)\n   */\n  sql.savepoint = async <T>(\n    _fn: (sql: TransactionSql) => Promise<T>\n  ): Promise<T> => {\n    throw new PostgresError('savepoint() can only be called within a transaction', {\n      code: '25001',\n      severity: 'ERROR',\n    })\n  }\n\n  /**\n   * Stream large result sets using PostgreSQL cursors\n   * Memory stays constant regardless of result size\n   */\n  sql.stream = <T extends Row = Row>(\n    strings: TemplateStringsArray,\n    ...values: unknown[]\n  ): StreamResult<T> => {\n    const { sql: query, params } = buildStreamSql(strings, values)\n    return createStreamResult<T>(transport, query, params, parsers)\n  }\n\n  /**\n   * End the connection\n   */\n  sql.end = async (): Promise<void> => {\n    await transport.close()\n  }\n\n  /**\n   * Reserve a connection (for connection pooling scenarios)\n   */\n  sql.reserve = async (): Promise<ReservedSql> => {\n    // For HTTP transport, we create a new instance\n    // For WS transport, we could potentially implement true connection reservation\n    const reservedSql = createClient(config) as ReservedSql\n    reservedSql.release = async () => {\n      await reservedSql.end()\n    }\n    return reservedSql\n  }\n\n  /**\n   * Commit a prepared transaction (two-phase commit)\n   */\n  sql.commitPrepared = async (transactionId: string): Promise<void> => {\n    validateTransactionId(transactionId)\n    await transport.query(`COMMIT PREPARED '${transactionId}'`)\n  }\n\n  /**\n   * Rollback a prepared transaction (two-phase commit)\n   */\n  sql.rollbackPrepared = async (transactionId: string): Promise<void> => {\n    validateTransactionId(transactionId)\n    await transport.query(`ROLLBACK PREPARED '${transactionId}'`)\n  }\n\n  /**\n   * Add a middleware to the chain\n   * Returns the same Sql instance for chaining\n   */\n  sql.use = function (middleware: QueryMiddleware): Sql {\n    middlewares.push(middleware)\n    return sql\n  }\n\n  /**\n   * Options object (for Drizzle compatibility)\n   * Includes both parsers and serializers that Drizzle expects\n   */\n  sql.options = {\n    parsers,\n    serializers: {} as Record<number, (value: unknown) => string>,\n  }\n\n  // ===========================================================================\n  // CDC Subscription Implementation\n  // ===========================================================================\n  //\n  // CDC (Change Data Capture) provides real-time streaming of database changes.\n  // This implementation uses a single shared transport (WebSocket or SSE) for\n  // all subscriptions to minimize resource usage and connection overhead.\n\n  // ---------------------------------------------------------------------------\n  // CDC State Management\n  // ---------------------------------------------------------------------------\n  //\n  // Transport lifecycle:\n  //   null -> pending (creating) -> connected -> null (disconnected)\n  //\n  // cdcTransport: Holds the active connection once established\n  // cdcTransportPending: Acts as a mutex/lock to prevent duplicate transports\n  //                      when multiple subscribe() calls race during initialization\n  let cdcTransport: CDCTransport | null = null\n  let cdcTransportPending: Promise<CDCTransport> | null = null\n  const activeSubscriptions = new Map<string, CDCSubscription>()\n\n  /**\n   * Create a CDC transport instance based on configuration.\n   *\n   * Encapsulates transport creation logic, keeping the main concurrency\n   * control function focused on its primary responsibility.\n   *\n   * @param cdcUrl - The CDC endpoint URL (wss:// for WebSocket, https:// for SSE)\n   * @returns The created transport instance (not yet connected)\n   */\n  function createCdcTransportInstance(cdcUrl: string): CDCTransport {\n    if (config.transport === 'ws') {\n      // WebSocket transport: bidirectional, lower latency, requires WS support\n      const wsConfig: Parameters<typeof createCdcWsTransport>[0] = { url: cdcUrl }\n      if (config.apiKey !== undefined) wsConfig.apiKey = config.apiKey\n      if (config.WebSocket !== undefined) wsConfig.WebSocket = config.WebSocket\n      if (config.connectTimeout !== undefined) wsConfig.connectTimeout = config.connectTimeout\n      return createCdcWsTransport(wsConfig)\n    } else {\n      // SSE transport: HTTP-based, works through proxies, wider compatibility\n      const sseConfig: Parameters<typeof createCdcSseTransport>[0] = { url: cdcUrl }\n      if (config.apiKey !== undefined) sseConfig.apiKey = config.apiKey\n      if (config.fetch !== undefined) sseConfig.fetch = config.fetch\n      return createCdcSseTransport(sseConfig)\n    }\n  }\n\n  /**\n   * Configure event handlers for a CDC transport.\n   *\n   * Routes transport-level events to the appropriate subscription instances\n   * and handles transport lifecycle events (close/disconnect).\n   *\n   * @param transport - The CDC transport to configure\n   */\n  function configureCdcTransportHandlers(transport: CDCTransport): void {\n    // Route CDC change events to the subscription that owns them\n    transport.onEvent((subscriptionId: string, event) => {\n      const subscription = activeSubscriptions.get(subscriptionId)\n      if (subscription) {\n        subscription.handleEvent(event)\n      }\n    })\n\n    // Route errors to the subscription that should handle them\n    transport.onError((subscriptionId: string, error) => {\n      const subscription = activeSubscriptions.get(subscriptionId)\n      if (subscription) {\n        subscription.handleError(error)\n      }\n    })\n\n    // Handle transport close: mark all subscriptions inactive and reset state\n    transport.onClose(() => {\n      activeSubscriptions.forEach(subscription => {\n        subscription.setInactive()\n      })\n      activeSubscriptions.clear()\n      // Reset transport state to allow fresh reconnection on next subscribe()\n      cdcTransport = null\n      cdcTransportPending = null\n    })\n  }\n\n  /**\n   * Get or create the shared CDC transport.\n   *\n   * CONCURRENCY CONTROL - PENDING PROMISE PATTERN:\n   * -----------------------------------------------\n   * This function uses a \"pending promise\" pattern to serialize transport\n   * creation and prevent race conditions when multiple subscribe() calls\n   * happen concurrently. Without this pattern, the following race occurs:\n   *\n   *   Call A: checks cdcTransport (null) -> starts creating transport\n   *   Call B: checks cdcTransport (null) -> starts creating ANOTHER transport\n   *   Call A: finishes, sets cdcTransport\n   *   Call B: finishes, OVERWRITES cdcTransport (resource leak!)\n   *\n   * The pattern works in four steps:\n   *\n   * STEP 1 - FAST PATH: If cdcTransport exists, return it immediately.\n   *          This is the common case after initial connection.\n   *\n   * STEP 2 - AWAIT PENDING: If cdcTransportPending is set, another call is\n   *          already creating the transport. Await that same promise to share\n   *          the result. This prevents duplicate transports.\n   *\n   * STEP 3 - CREATE NEW: We're the first caller. Set cdcTransportPending\n   *          SYNCHRONOUSLY (before any await) so concurrent calls will see it\n   *          and wait for our promise. Then perform async creation.\n   *\n   * STEP 4 - CLEANUP: In the finally block, clear cdcTransportPending.\n   *          On success: cdcTransport is set, subsequent calls use fast path\n   *          On failure: cdcTransport is null, next call can retry fresh\n   *\n   * @returns The shared CDC transport instance\n   * @throws {ConnectionError} If transport creation or connection fails\n   */\n  const getOrCreateCdcTransport = async (): Promise<CDCTransport> => {\n    // -------------------------------------------------------------------------\n    // STEP 1: FAST PATH - Return existing transport\n    // -------------------------------------------------------------------------\n    if (cdcTransport) {\n      return cdcTransport\n    }\n\n    // -------------------------------------------------------------------------\n    // STEP 2: AWAIT PENDING - Join existing creation in progress\n    // -------------------------------------------------------------------------\n    // CRITICAL: This check must happen BEFORE we set cdcTransportPending below.\n    // cdcTransportPending acts as a mutex - if set, await it instead of racing.\n    if (cdcTransportPending) {\n      return cdcTransportPending\n    }\n\n    // -------------------------------------------------------------------------\n    // STEP 3: CREATE NEW - We're first, set pending SYNCHRONOUSLY then await\n    // -------------------------------------------------------------------------\n    // Set cdcTransportPending IMMEDIATELY (no await before this line).\n    // Any concurrent calls arriving during our async work will see this\n    // pending promise and await it instead of starting their own creation.\n    cdcTransportPending = (async (): Promise<CDCTransport> => {\n      // Build CDC endpoint URL (wss:// for WebSocket, https:// for SSE)\n      const cdcUrl = baseUrl.replace('https://', config.transport === 'ws' ? 'wss://' : 'https://') + '/cdc'\n\n      // Create transport instance (helper function for clarity)\n      const transport = createCdcTransportInstance(cdcUrl)\n\n      // Wire up event handlers to route events to subscriptions\n      configureCdcTransportHandlers(transport)\n\n      // Connect to server - THIS is the async operation that creates the race\n      // window that cdcTransportPending protects against\n      await transport.connect()\n\n      // Store for fast path on subsequent calls\n      cdcTransport = transport\n      return transport\n    })()\n\n    try {\n      return await cdcTransportPending\n    } finally {\n      // -----------------------------------------------------------------------\n      // STEP 4: CLEANUP - Clear pending regardless of success/failure\n      // -----------------------------------------------------------------------\n      // SUCCESS: cdcTransport is set -> subsequent calls use fast path\n      // FAILURE: cdcTransport is null -> next call retries fresh\n      //\n      // The finally block ensures we never leave cdcTransportPending set\n      // indefinitely, which would block all future subscribe() calls.\n      cdcTransportPending = null\n    }\n  }\n\n  /**\n   * Subscribe to changes on a table\n   */\n  sql.subscribe = async <T extends Row = Row>(\n    tableName: string,\n    options?: CDCClientSubscribeOptions<T>\n  ): Promise<CDCClientSubscription<T>> => {\n    // Validate table name to prevent SQL injection\n    const { table, schema } = validateTableName(tableName)\n\n    // Get or create CDC transport\n    const transport = await getOrCreateCdcTransport()\n\n    // Generate subscription ID\n    const subscriptionId = generateSubscriptionId()\n\n    // Create unsubscribe callback\n    const unsubscribeCallback = async (): Promise<void> => {\n      activeSubscriptions.delete(subscriptionId)\n      await transport.unsubscribe(subscriptionId)\n\n      // If no more subscriptions, disconnect the transport\n      if (activeSubscriptions.size === 0 && cdcTransport) {\n        await cdcTransport.disconnect()\n        cdcTransport = null\n      }\n    }\n\n    // Create subscription instance\n    const subscription = new CDCSubscription<T>(\n      subscriptionId,\n      table,\n      schema,\n      transport,\n      unsubscribeCallback,\n      options as SubscribeOptions\n    )\n\n    // Register subscription\n    activeSubscriptions.set(subscriptionId, subscription as CDCSubscription)\n\n    // Subscribe via transport - build options object only with defined values\n    const subscriptionOptions: Parameters<typeof transport.subscribe>[3] = {}\n    if (options?.events !== undefined) subscriptionOptions.events = options.events\n    if (options?.filter !== undefined) subscriptionOptions.filter = options.filter\n    if (options?.resumeFrom !== undefined) subscriptionOptions.resumeFrom = options.resumeFrom\n    if (options?.includeOldRow !== undefined) subscriptionOptions.includeOldRow = options.includeOldRow\n    if (options?.trackChangedColumns !== undefined) subscriptionOptions.trackChangedColumns = options.trackChangedColumns\n    if (options?.batchSize !== undefined) subscriptionOptions.batchSize = options.batchSize\n    if (options?.heartbeatInterval !== undefined) subscriptionOptions.heartbeatInterval = options.heartbeatInterval\n    await transport.subscribe(subscriptionId, table, schema, subscriptionOptions)\n\n    return subscription\n  }\n\n  /**\n   * Unsubscribe from a subscription by ID\n   */\n  sql.unsubscribe = async (subscriptionId: string): Promise<void> => {\n    const subscription = activeSubscriptions.get(subscriptionId)\n    if (subscription) {\n      await subscription.unsubscribe()\n    }\n    // If subscription not found, silently succeed (idempotent behavior)\n  }\n\n  /**\n   * Get all active subscriptions\n   */\n  sql.subscriptions = (): CDCClientSubscriptionInfo[] => {\n    return Array.from(activeSubscriptions.values()).map(sub => ({\n      id: sub.id,\n      table: sub.table,\n      schema: sub.schema,\n      isActive: sub.isActive,\n    }))\n  }\n\n  return sql\n}\n\n/**\n * Main entry point - create a postgres client\n * @param urlOrConfig - Connection URL or config object\n * @param options - Additional options\n */\nexport function postgres(\n  urlOrConfig?: string | PostgresConfig,\n  options?: PostgresConfig\n): Sql {\n  if (typeof urlOrConfig === 'string') {\n    const parsed = parseConnectionUrl(urlOrConfig)\n    return createClient({ ...parsed, ...options })\n  }\n\n  return createClient({ ...urlOrConfig, ...options })\n}\n\n// Default export\nexport default postgres\n","/**\n * Authentication integration for postgres.do\n *\n * Provides authentication helpers using oauth.do for both\n * client-side (browser) and server-side (Node.js/Cloudflare Workers) usage.\n *\n * The DO-based architecture means each authenticated user can have their own\n * database, simplifying security by eliminating row-level access control.\n */\n\n// Re-export from oauth.do based on environment\n// Users should import from the appropriate subpath for their environment:\n// - Server: import { ensureLoggedIn } from 'oauth.do/node'\n// - Browser: import { ensureLoggedIn } from 'oauth.do/browser'\n\nimport type { Sql, PostgresConfig } from './types'\nimport { createClient } from './client'\nimport {\n  // Re-export shared auth types and utilities\n  type AuthenticatedUser,\n  type AuthTokenValidationResult as TokenValidationResult,\n  extractBearerToken,\n  generateDatabaseId,\n  validateToken as sharedValidateToken,\n  DEFAULT_OAUTH_URL,\n} from '@dotdo/postgres-shared'\n\n// Re-export for backwards compatibility\nexport type { AuthenticatedUser, TokenValidationResult }\nexport { extractBearerToken, generateDatabaseId }\n\nexport interface AuthenticatedClientOptions extends PostgresConfig {\n  /** OAuth API URL (default: https://oauth.do) */\n  oauthUrl?: string\n}\n\nexport interface AuthenticatedContext {\n  user: AuthenticatedUser\n  token: string\n}\n\n/**\n * Create an authenticated postgres client for server-side usage\n *\n * This function verifies the user's authentication token and returns\n * a postgres client configured for their specific database.\n *\n * @example\n * ```typescript\n * import { createAuthenticatedClient } from 'postgres.do'\n * import { ensureLoggedIn } from 'oauth.do/node'\n *\n * export default {\n *   async fetch(request: Request) {\n *     // Verify authentication\n *     const auth = await ensureLoggedIn(request)\n *\n *     // Create client for this user's database\n *     const sql = createAuthenticatedClient(auth.token, {\n *       url: `https://db.postgres.do/${auth.user.id}`\n *     })\n *\n *     const users = await sql`SELECT * FROM users`\n *     return Response.json(users)\n *   }\n * }\n * ```\n */\nexport function createAuthenticatedClient(\n  token: string,\n  options: AuthenticatedClientOptions = {}\n): Sql {\n  return createClient({\n    ...options,\n    apiKey: token,\n  })\n}\n\n/**\n * Create a postgres client from an authenticated request (server-side)\n *\n * This is a convenience function that extracts the Bearer token from\n * the request Authorization header.\n *\n * @example\n * ```typescript\n * import { createClientFromRequest } from 'postgres.do'\n *\n * export default {\n *   async fetch(request: Request) {\n *     const sql = createClientFromRequest(request, {\n *       url: 'https://db.postgres.do/mydb'\n *     })\n *\n *     const users = await sql`SELECT * FROM users`\n *     return Response.json(users)\n *   }\n * }\n * ```\n */\nexport function createClientFromRequest(\n  request: Request,\n  options: AuthenticatedClientOptions = {}\n): Sql {\n  const authHeader = request.headers.get('Authorization')\n  const token = authHeader?.startsWith('Bearer ') ? authHeader.slice(7) : undefined\n\n  const clientOptions = { ...options }\n  if (token !== undefined) {\n    clientOptions.apiKey = token\n  }\n  return createClient(clientOptions)\n}\n\n/**\n * Higher-order function to wrap a request handler with authentication\n *\n * @example\n * ```typescript\n * import { withAuth } from 'postgres.do'\n *\n * export default {\n *   fetch: withAuth(async (request, { user, sql }) => {\n *     // user is guaranteed to be authenticated\n *     // sql is configured for this user's database\n *     const data = await sql`SELECT * FROM my_table`\n *     return Response.json({ user, data })\n *   })\n * }\n * ```\n */\nexport function withAuth(\n  handler: (\n    request: Request,\n    context: { user: AuthenticatedUser; sql: Sql; token: string }\n  ) => Promise<Response>,\n  options: AuthenticatedClientOptions & {\n    /** Custom function to verify and extract user from token */\n    verifyToken?: (token: string) => Promise<AuthenticatedUser | null>\n    /** URL to get database URL for user (default: uses user.id) */\n    getDatabaseUrl?: (user: AuthenticatedUser) => string\n    /** Custom unauthorized response */\n    onUnauthorized?: (request: Request) => Response\n  } = {}\n): (request: Request) => Promise<Response> {\n  return async (request: Request): Promise<Response> => {\n    // Extract token from Authorization header\n    const authHeader = request.headers.get('Authorization')\n    const token = authHeader?.startsWith('Bearer ') ? authHeader.slice(7) : null\n\n    if (!token) {\n      if (options.onUnauthorized) {\n        return options.onUnauthorized(request)\n      }\n      return new Response(JSON.stringify({ error: 'Unauthorized' }), {\n        status: 401,\n        headers: { 'Content-Type': 'application/json' },\n      })\n    }\n\n    // Verify token and get user\n    let user: AuthenticatedUser | null = null\n\n    if (options.verifyToken) {\n      user = await options.verifyToken(token)\n    } else {\n      // Default: verify with oauth.do using shared validateToken\n      const oauthUrl = options.oauthUrl || DEFAULT_OAUTH_URL\n      const result = await sharedValidateToken(token, { oauthUrl })\n      if (result.valid && result.user) {\n        user = result.user\n      }\n    }\n\n    if (!user) {\n      if (options.onUnauthorized) {\n        return options.onUnauthorized(request)\n      }\n      return new Response(JSON.stringify({ error: 'Invalid token' }), {\n        status: 401,\n        headers: { 'Content-Type': 'application/json' },\n      })\n    }\n\n    // Get database URL for this user\n    const dbUrl = options.getDatabaseUrl\n      ? options.getDatabaseUrl(user)\n      : `https://db.postgres.do/${user.id}`\n\n    // Create authenticated SQL client\n    const sql = createClient({\n      ...options,\n      url: dbUrl,\n      apiKey: token,\n    })\n\n    try {\n      return await handler(request, { user, sql, token })\n    } finally {\n      // Clean up connection\n      await sql.end()\n    }\n  }\n}\n\n/**\n * Extract user ID from a request's authentication token\n * Useful when you need just the user ID without creating a client\n */\nexport async function extractUserId(\n  request: Request,\n  options: { oauthUrl?: string } = {}\n): Promise<string | null> {\n  const token = extractBearerToken(request)\n\n  if (!token) {\n    return null\n  }\n\n  const oauthUrl = options.oauthUrl || DEFAULT_OAUTH_URL\n  const result = await sharedValidateToken(token, { oauthUrl })\n\n  if (result.valid && result.user) {\n    return result.user.id\n  }\n\n  return null\n}\n\n/**\n * Validate a token and return the full result\n */\nexport async function validateToken(\n  token: string,\n  options: { oauthUrl?: string } = {}\n): Promise<TokenValidationResult> {\n  const oauthUrl = options.oauthUrl || DEFAULT_OAUTH_URL\n  return sharedValidateToken(token, { oauthUrl })\n}\n\n/**\n * Create a user-scoped database client\n * The database URL is derived from the user's ID\n *\n * @example\n * ```typescript\n * import { createUserScopedClient } from 'postgres.do'\n *\n * // After validating the user\n * const sql = createUserScopedClient(user.id, token)\n *\n * const data = await sql`SELECT * FROM my_table`\n * ```\n */\nexport function createUserScopedClient(\n  userId: string,\n  token: string,\n  options: AuthenticatedClientOptions = {}\n): Sql {\n  // Generate user-scoped database URL using shared generateDatabaseId\n  const baseUrl = options.url || 'https://db.postgres.do'\n  const userDbUrl = `${baseUrl}/${generateDatabaseId(userId)}`\n\n  return createClient({\n    ...options,\n    url: userDbUrl,\n    apiKey: token,\n  })\n}\n","/**\n * Connection URL parsing for postgres.do\n *\n * Parses postgres:// URLs into configuration objects\n */\n\nimport type { PostgresConfig } from './types'\nimport { ConnectionError } from './types'\n\n/**\n * Parsed connection information\n */\nexport interface ConnectionInfo {\n  /** The https base URL for postgres.do */\n  url: string\n  /** Database name */\n  database?: string\n  /** API key for authentication */\n  apiKey?: string\n  /** SSL mode */\n  ssl?: PostgresConfig['ssl']\n  /** Additional parameters from URL query string */\n  params: Record<string, string>\n}\n\n/**\n * Parse a postgres:// connection URL\n *\n * @param connectionUrl - The postgres:// or postgresql:// URL\n * @returns Parsed connection information\n *\n * @example\n * ```typescript\n * // Basic URL\n * parseConnectionUrl('postgres://db.postgres.do/mydb')\n * // => { url: 'https://db.postgres.do/mydb', database: 'mydb', params: {} }\n *\n * // With API key in password\n * parseConnectionUrl('postgres://user:apikey123@db.postgres.do/mydb')\n * // => { url: 'https://db.postgres.do/mydb', apiKey: 'apikey123', params: {} }\n *\n * // With query parameters\n * parseConnectionUrl('postgres://db.postgres.do/mydb?sslmode=require')\n * // => { url: 'https://db.postgres.do/mydb', ssl: 'require', params: { sslmode: 'require' } }\n * ```\n */\nexport function parseConnectionUrl(connectionUrl: string): ConnectionInfo {\n  let parsed: URL\n\n  try {\n    parsed = new URL(connectionUrl)\n  } catch (error) {\n    throw new ConnectionError(\n      `Invalid connection URL: ${error instanceof Error ? error.message : String(error)}`\n    )\n  }\n\n  // Validate protocol\n  if (!parsed.protocol.startsWith('postgres')) {\n    throw new ConnectionError(\n      `Invalid protocol \"${parsed.protocol}\": must be postgres:// or postgresql://`\n    )\n  }\n\n  // Validate host is present\n  if (!parsed.host) {\n    throw new ConnectionError('Invalid connection URL: missing host')\n  }\n\n  // Extract components\n  const info: ConnectionInfo = {\n    url: `https://${parsed.host}${parsed.pathname}`,\n    params: {},\n  }\n\n  // Database name from pathname\n  const pathname = parsed.pathname\n  if (pathname && pathname !== '/') {\n    info.database = pathname.slice(1) // Remove leading /\n  }\n\n  // API key from password field\n  if (parsed.password) {\n    info.apiKey = decodeURIComponent(parsed.password)\n  }\n\n  // API key from query parameter (takes precedence)\n  const apiKeyParam = parsed.searchParams.get('apiKey') || parsed.searchParams.get('apikey')\n  if (apiKeyParam) {\n    info.apiKey = apiKeyParam\n  }\n\n  // SSL mode\n  const sslMode = parsed.searchParams.get('sslmode') || parsed.searchParams.get('ssl')\n  if (sslMode) {\n    info.ssl = sslMode as PostgresConfig['ssl']\n  }\n\n  // Collect all query parameters\n  for (const [key, value] of parsed.searchParams) {\n    info.params[key] = value\n  }\n\n  return info\n}\n\n/**\n * Convert ConnectionInfo to PostgresConfig\n */\nexport function connectionInfoToConfig(info: ConnectionInfo): Partial<PostgresConfig> {\n  const config: Partial<PostgresConfig> = {\n    url: info.url,\n  }\n\n  if (info.apiKey) {\n    config.apiKey = info.apiKey\n  }\n\n  if (info.ssl) {\n    config.ssl = info.ssl\n  }\n\n  // Handle transport parameter\n  const transport = info.params['transport']\n  if (transport === 'ws' || transport === 'websocket') {\n    config.transport = 'ws'\n  }\n\n  // Handle timeout parameters\n  const connectTimeout = info.params['connect_timeout'] || info.params['connectTimeout']\n  if (connectTimeout) {\n    config.connectTimeout = parseInt(connectTimeout, 10) * 1000 // Convert to ms\n  }\n\n  const queryTimeout = info.params['statement_timeout'] || info.params['queryTimeout']\n  if (queryTimeout) {\n    config.queryTimeout = parseInt(queryTimeout, 10) * 1000 // Convert to ms\n  }\n\n  return config\n}\n\n/**\n * Build a connection URL from config options\n */\nexport function buildConnectionUrl(config: PostgresConfig): string {\n  const baseUrl = config.url || 'https://db.postgres.do'\n  const url = new URL(baseUrl.replace('https://', 'postgres://').replace('http://', 'postgres://'))\n\n  if (config.apiKey) {\n    url.password = config.apiKey\n  }\n\n  if (config.ssl) {\n    url.searchParams.set('sslmode', typeof config.ssl === 'boolean' ? 'require' : config.ssl)\n  }\n\n  if (config.transport === 'ws') {\n    url.searchParams.set('transport', 'ws')\n  }\n\n  return url.toString()\n}\n\n/**\n * Validate a connection URL without parsing\n */\nexport function isValidConnectionUrl(connectionUrl: string): boolean {\n  try {\n    const url = new URL(connectionUrl)\n    return url.protocol.startsWith('postgres')\n  } catch {\n    return false\n  }\n}\n","/**\n * Lazy Extension Loader for PostgreSQL\n *\n * Provides lazy loading of PostgreSQL extensions to improve cold start times.\n * Extensions are loaded on-demand when they are first needed, either through\n * explicit calls or automatic detection from SQL queries.\n *\n * @module extensions\n *\n * @example\n * ```typescript\n * import { LazyExtensionLoader, createLazyExtensionLoader } from 'postgres.do/extensions'\n *\n * // Create a loader with a query executor\n * const loader = new LazyExtensionLoader({\n *   query: async (sql) => pg.exec(sql)\n * })\n *\n * // Explicitly ensure an extension is loaded\n * await loader.ensureLoaded('vector')\n *\n * // Auto-detect and load extensions from SQL\n * await loader.executeWithAutoLoad(\"SELECT embedding <-> '[1,2,3]' FROM items\")\n * ```\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Supported PostgreSQL extension names\n */\nexport type ExtensionName =\n  | 'vector'\n  | 'pg_trgm'\n  | 'pgcrypto'\n  | 'hstore'\n  | 'citext'\n  | 'uuid-ossp'\n  | 'cube'\n  | 'earthdistance'\n  | 'fuzzystrmatch'\n  | 'intarray'\n  | 'ltree'\n  | 'tablefunc'\n  | 'unaccent'\n  | 'btree_gin'\n  | 'btree_gist'\n  | 'bloom'\n\n/**\n * Metadata for a PostgreSQL extension\n */\nexport interface ExtensionMetadata {\n  /** Extension identifier used in our registry */\n  name: ExtensionName\n  /** Display name for the extension */\n  displayName: string\n  /** The actual PostgreSQL extension name (used in CREATE EXTENSION) */\n  extensionName: string\n  /** Description of what the extension provides */\n  description: string\n  /** Whether the extension is available in PGLite WASM */\n  available: boolean\n  /** Dependencies that must be loaded first */\n  dependencies?: ExtensionName[]\n  /** Regex patterns to detect when this extension is needed in SQL */\n  detectionPatterns: RegExp[]\n  /** Common functions provided by this extension */\n  functions?: string[]\n  /** Custom types provided by this extension */\n  types?: string[]\n  /** Custom operators provided by this extension */\n  operators?: string[]\n}\n\n/**\n * Interface for executing queries\n */\nexport interface QueryExecutor {\n  query(sql: string, params?: unknown[]): Promise<{ rows: unknown[] }>\n}\n\n/**\n * Result of loading a single extension\n */\nexport interface ExtensionLoadResult {\n  /** Extension name */\n  name: ExtensionName\n  /** Whether the extension was loaded successfully */\n  success: boolean\n  /** Whether the extension was already loaded (cache hit) */\n  wasAlreadyLoaded: boolean\n  /** Time taken to load in milliseconds (0 if already loaded) */\n  loadTimeMs: number\n  /** Error message if loading failed */\n  error?: string\n}\n\n/**\n * Result of executing a query with auto-loading\n */\nexport interface ExecuteWithAutoLoadResult {\n  /** Extensions that were loaded for this query */\n  extensionsLoaded: ExtensionName[]\n  /** Query result */\n  result: { rows: unknown[] }\n  /** Total time spent loading extensions */\n  extensionLoadTimeMs: number\n}\n\n/**\n * Statistics about extension loading\n */\nexport interface ExtensionLoaderStats {\n  /** Number of extensions currently loaded */\n  totalLoaded: number\n  /** Names of loaded extensions */\n  loadedExtensions: ExtensionName[]\n  /** Number of cache hits (requests for already-loaded extensions) */\n  cacheHits: number\n  /** Load times for each extension in milliseconds */\n  loadTimes: Record<string, number>\n  /** Number of times auto-detection was run */\n  autoDetectionCount: number\n}\n\n/**\n * Options for the LazyExtensionLoader\n */\nexport interface LazyExtensionLoaderOptions {\n  /** Whether to log debug information */\n  debug?: boolean\n  /** Whether to disable automatic extension detection */\n  disableAutoDetection?: boolean\n  /** Timeout for loading each extension in milliseconds */\n  loadTimeoutMs?: number\n}\n\n// ============================================================================\n// Extension Registry\n// ============================================================================\n\n/**\n * Registry of supported PostgreSQL extensions with their metadata\n */\nexport const EXTENSION_REGISTRY: Record<ExtensionName, ExtensionMetadata> = {\n  vector: {\n    name: 'vector',\n    displayName: 'pgvector',\n    extensionName: 'vector',\n    description: 'Vector similarity search for PostgreSQL',\n    available: true,\n    detectionPatterns: [\n      /::vector\\b/i,\n      /\\bvector\\s*\\(/i,\n      /<->/,\n      /<=>/,\n      /<#>/,\n      /\\bl2_distance\\s*\\(/i,\n      /\\bcosine_distance\\s*\\(/i,\n      /\\binner_product\\s*\\(/i,\n      /\\bivfflat\\b/i,\n      /\\bhnsw\\b/i,\n    ],\n    functions: ['l2_distance', 'cosine_distance', 'inner_product', 'vector'],\n    types: ['vector'],\n    operators: ['<->', '<=>', '<#>'],\n  },\n\n  pg_trgm: {\n    name: 'pg_trgm',\n    displayName: 'pg_trgm',\n    extensionName: 'pg_trgm',\n    description: 'Trigram matching for text similarity',\n    available: true,\n    detectionPatterns: [\n      /\\bsimilarity\\s*\\(/i,\n      /\\bshow_trgm\\s*\\(/i,\n      /\\bword_similarity\\s*\\(/i,\n      /\\bstrict_word_similarity\\s*\\(/i,\n      /\\bgin_trgm_ops\\b/i,\n      /\\bgist_trgm_ops\\b/i,\n      /%>/,\n      /<%/,\n      /<<%/,\n      /%>>/,\n    ],\n    functions: ['similarity', 'show_trgm', 'word_similarity', 'strict_word_similarity'],\n    operators: ['%', '%>', '<%', '<<%', '%>>'],\n  },\n\n  pgcrypto: {\n    name: 'pgcrypto',\n    displayName: 'pgcrypto',\n    extensionName: 'pgcrypto',\n    description: 'Cryptographic functions',\n    available: true,\n    detectionPatterns: [\n      /\\bcrypt\\s*\\(/i,\n      /\\bgen_salt\\s*\\(/i,\n      /\\bgen_random_uuid\\s*\\(/i,\n      /\\bgen_random_bytes\\s*\\(/i,\n      /\\bdigest\\s*\\(/i,\n      /\\bhmac\\s*\\(/i,\n      /\\bencrypt\\s*\\(/i,\n      /\\bdecrypt\\s*\\(/i,\n      /\\bpgp_sym_encrypt\\s*\\(/i,\n      /\\bpgp_sym_decrypt\\s*\\(/i,\n      /\\bpgp_pub_encrypt\\s*\\(/i,\n      /\\bpgp_pub_decrypt\\s*\\(/i,\n      /\\barmor\\s*\\(/i,\n      /\\bdearmor\\s*\\(/i,\n    ],\n    functions: [\n      'crypt',\n      'gen_salt',\n      'gen_random_uuid',\n      'gen_random_bytes',\n      'digest',\n      'hmac',\n      'encrypt',\n      'decrypt',\n      'pgp_sym_encrypt',\n      'pgp_sym_decrypt',\n    ],\n  },\n\n  hstore: {\n    name: 'hstore',\n    displayName: 'hstore',\n    extensionName: 'hstore',\n    description: 'Key-value store data type',\n    available: true,\n    detectionPatterns: [\n      /::hstore\\b/i,\n      /\\bhstore\\s*\\(/i,\n      /\\bhstore_to_json\\s*\\(/i,\n      /\\bhstore_to_jsonb\\s*\\(/i,\n      /\\beach\\s*\\(/i,\n      /\\bexist\\s*\\(/i,\n      /\\bdefined\\s*\\(/i,\n      /\\bdelete\\s*\\(/i,\n      /\\bpopulate_record\\s*\\(/i,\n      /->\\s*'[^']+'/,\n      /=>/,\n    ],\n    functions: ['hstore', 'hstore_to_json', 'hstore_to_jsonb', 'each', 'exist', 'defined'],\n    types: ['hstore'],\n    operators: ['->', '=>', '?', '?&', '?|', '@>', '<@'],\n  },\n\n  citext: {\n    name: 'citext',\n    displayName: 'citext',\n    extensionName: 'citext',\n    description: 'Case-insensitive text data type',\n    available: true,\n    detectionPatterns: [/::citext\\b/i, /\\bcitext\\b/i],\n    types: ['citext'],\n  },\n\n  'uuid-ossp': {\n    name: 'uuid-ossp',\n    displayName: 'uuid-ossp',\n    extensionName: 'uuid-ossp',\n    description: 'UUID generation functions',\n    available: true,\n    detectionPatterns: [\n      /\\buuid_generate_v1\\s*\\(/i,\n      /\\buuid_generate_v1mc\\s*\\(/i,\n      /\\buuid_generate_v3\\s*\\(/i,\n      /\\buuid_generate_v4\\s*\\(/i,\n      /\\buuid_generate_v5\\s*\\(/i,\n      /\\buuid_nil\\s*\\(/i,\n      /\\buuid_ns_dns\\s*\\(/i,\n      /\\buuid_ns_url\\s*\\(/i,\n      /\\buuid_ns_oid\\s*\\(/i,\n      /\\buuid_ns_x500\\s*\\(/i,\n    ],\n    functions: [\n      'uuid_generate_v1',\n      'uuid_generate_v1mc',\n      'uuid_generate_v3',\n      'uuid_generate_v4',\n      'uuid_generate_v5',\n      'uuid_nil',\n    ],\n  },\n\n  cube: {\n    name: 'cube',\n    displayName: 'cube',\n    extensionName: 'cube',\n    description: 'Multi-dimensional cube data type',\n    available: true,\n    detectionPatterns: [/::cube\\b/i, /\\bcube\\s*\\(/i, /\\bcube_distance\\s*\\(/i, /\\bcube_dim\\s*\\(/i],\n    functions: ['cube', 'cube_distance', 'cube_dim', 'cube_ll_coord', 'cube_ur_coord'],\n    types: ['cube'],\n  },\n\n  earthdistance: {\n    name: 'earthdistance',\n    displayName: 'earthdistance',\n    extensionName: 'earthdistance',\n    description: 'Earth distance calculations using cube',\n    available: true,\n    dependencies: ['cube'],\n    detectionPatterns: [\n      /\\bearth\\s*\\(/i,\n      /\\bearth_distance\\s*\\(/i,\n      /\\bearth_box\\s*\\(/i,\n      /\\bll_to_earth\\s*\\(/i,\n      /\\blatitude\\s*\\(/i,\n      /\\blongitude\\s*\\(/i,\n      /\\bgc_to_sec\\s*\\(/i,\n      /\\bsec_to_gc\\s*\\(/i,\n    ],\n    functions: [\n      'earth',\n      'earth_distance',\n      'earth_box',\n      'll_to_earth',\n      'latitude',\n      'longitude',\n      'gc_to_sec',\n      'sec_to_gc',\n    ],\n  },\n\n  fuzzystrmatch: {\n    name: 'fuzzystrmatch',\n    displayName: 'fuzzystrmatch',\n    extensionName: 'fuzzystrmatch',\n    description: 'Fuzzy string matching functions',\n    available: true,\n    detectionPatterns: [\n      /\\bsoundex\\s*\\(/i,\n      /\\bdifference\\s*\\(/i,\n      /\\blevenshtein\\s*\\(/i,\n      /\\blevenshtein_less_equal\\s*\\(/i,\n      /\\bmetaphone\\s*\\(/i,\n      /\\bdmetaphone\\s*\\(/i,\n    ],\n    functions: ['soundex', 'difference', 'levenshtein', 'levenshtein_less_equal', 'metaphone', 'dmetaphone'],\n  },\n\n  intarray: {\n    name: 'intarray',\n    displayName: 'intarray',\n    extensionName: 'intarray',\n    description: 'Integer array functions and operators',\n    available: true,\n    detectionPatterns: [\n      /\\bicount\\s*\\(/i,\n      /\\bsort\\s*\\(/i,\n      /\\bsort_asc\\s*\\(/i,\n      /\\bsort_desc\\s*\\(/i,\n      /\\buniq\\s*\\(/i,\n      /\\bidx\\s*\\(/i,\n      /\\bsubarray\\s*\\(/i,\n      /\\bintset\\s*\\(/i,\n    ],\n    functions: ['icount', 'sort', 'sort_asc', 'sort_desc', 'uniq', 'idx', 'subarray', 'intset'],\n  },\n\n  ltree: {\n    name: 'ltree',\n    displayName: 'ltree',\n    extensionName: 'ltree',\n    description: 'Hierarchical tree-like data',\n    available: true,\n    detectionPatterns: [\n      /::ltree\\b/i,\n      /\\bltree\\s*\\(/i,\n      /\\blquery\\b/i,\n      /\\bltxtquery\\b/i,\n      /\\bsubltree\\s*\\(/i,\n      /\\bsubpath\\s*\\(/i,\n      /\\bnlevel\\s*\\(/i,\n      /\\bindex\\s*\\(/i,\n      /\\blca\\s*\\(/i,\n      /@>/,\n      /<@/,\n      /~/,\n      /\\?/,\n    ],\n    functions: ['subltree', 'subpath', 'nlevel', 'index', 'lca'],\n    types: ['ltree', 'lquery', 'ltxtquery'],\n  },\n\n  tablefunc: {\n    name: 'tablefunc',\n    displayName: 'tablefunc',\n    extensionName: 'tablefunc',\n    description: 'Table-returning functions including crosstab',\n    available: true,\n    detectionPatterns: [\n      /\\bcrosstab\\s*\\(/i,\n      /\\bcrosstab2\\s*\\(/i,\n      /\\bcrosstab3\\s*\\(/i,\n      /\\bcrosstab4\\s*\\(/i,\n      /\\bconnectby\\s*\\(/i,\n      /\\bnormal_rand\\s*\\(/i,\n    ],\n    functions: ['crosstab', 'crosstab2', 'crosstab3', 'crosstab4', 'connectby', 'normal_rand'],\n  },\n\n  unaccent: {\n    name: 'unaccent',\n    displayName: 'unaccent',\n    extensionName: 'unaccent',\n    description: 'Remove accents from text',\n    available: true,\n    detectionPatterns: [/\\bunaccent\\s*\\(/i],\n    functions: ['unaccent'],\n  },\n\n  btree_gin: {\n    name: 'btree_gin',\n    displayName: 'btree_gin',\n    extensionName: 'btree_gin',\n    description: 'GIN operator classes for btree-indexable data types',\n    available: true,\n    detectionPatterns: [/\\bUSING\\s+gin\\s*\\(/i, /\\bgin_btree_ops\\b/i],\n  },\n\n  btree_gist: {\n    name: 'btree_gist',\n    displayName: 'btree_gist',\n    extensionName: 'btree_gist',\n    description: 'GiST operator classes for btree-indexable data types',\n    available: true,\n    detectionPatterns: [/\\bUSING\\s+gist\\s*\\(/i, /\\bgist_btree_ops\\b/i],\n  },\n\n  bloom: {\n    name: 'bloom',\n    displayName: 'bloom',\n    extensionName: 'bloom',\n    description: 'Bloom filter index access method',\n    available: true,\n    detectionPatterns: [/\\bUSING\\s+bloom\\s*\\(/i, /\\bbloom_ops\\b/i],\n  },\n}\n\n// ============================================================================\n// Extension Detection\n// ============================================================================\n\n/**\n * Detect which extensions are needed for a SQL query\n *\n * Analyzes the SQL string and returns a list of extensions that should be\n * loaded before executing the query.\n *\n * @param sql - The SQL query to analyze\n * @returns Array of extension names that were detected\n *\n * @example\n * ```typescript\n * const extensions = detectExtensions(\"SELECT embedding <-> '[1,2,3]' FROM items\")\n * // Returns: ['vector']\n *\n * const extensions = detectExtensions(\"SELECT similarity(name, 'test') FROM users\")\n * // Returns: ['pg_trgm']\n * ```\n */\nexport function detectExtensions(sql: string): ExtensionName[] {\n  const detected = new Set<ExtensionName>()\n\n  for (const [name, metadata] of Object.entries(EXTENSION_REGISTRY)) {\n    for (const pattern of metadata.detectionPatterns) {\n      if (pattern.test(sql)) {\n        detected.add(name as ExtensionName)\n        break // No need to check more patterns for this extension\n      }\n    }\n  }\n\n  return Array.from(detected)\n}\n\n// ============================================================================\n// LazyExtensionLoader Class\n// ============================================================================\n\n/**\n * Lazy extension loader for PostgreSQL\n *\n * Loads extensions on-demand when they are first needed, improving cold start\n * times by avoiding loading all extensions at initialization.\n *\n * @example\n * ```typescript\n * const loader = new LazyExtensionLoader({\n *   query: async (sql) => pg.exec(sql)\n * })\n *\n * // Load a specific extension\n * await loader.ensureLoaded('vector')\n *\n * // Auto-detect and load from SQL\n * await loader.executeWithAutoLoad(\"SELECT embedding <-> '[1,2,3]' FROM items\")\n *\n * // Get statistics\n * console.log(loader.getStats())\n * ```\n */\nexport class LazyExtensionLoader {\n  private executor: QueryExecutor\n  private options: Required<LazyExtensionLoaderOptions>\n  private loadedExtensions: Set<ExtensionName> = new Set()\n  private loadingPromises: Map<ExtensionName, Promise<ExtensionLoadResult>> = new Map()\n  private loadTimes: Map<ExtensionName, number> = new Map()\n  private cacheHits: number = 0\n  private autoDetectionCount: number = 0\n\n  constructor(executor: QueryExecutor, options: LazyExtensionLoaderOptions = {}) {\n    this.executor = executor\n    this.options = {\n      debug: options.debug ?? false,\n      disableAutoDetection: options.disableAutoDetection ?? false,\n      loadTimeoutMs: options.loadTimeoutMs ?? 10000,\n    }\n  }\n\n  /**\n   * Ensure an extension is loaded, loading it if necessary\n   *\n   * @param name - The extension to load\n   * @returns Result of the load operation\n   */\n  async ensureLoaded(name: ExtensionName): Promise<ExtensionLoadResult> {\n    // Check if already loaded\n    if (this.loadedExtensions.has(name)) {\n      this.cacheHits++\n      return {\n        name,\n        success: true,\n        wasAlreadyLoaded: true,\n        loadTimeMs: 0,\n      }\n    }\n\n    // Check if currently loading (dedup concurrent requests)\n    const existingPromise = this.loadingPromises.get(name)\n    if (existingPromise) {\n      return existingPromise\n    }\n\n    // Start loading\n    const loadPromise = this.loadExtension(name)\n    this.loadingPromises.set(name, loadPromise)\n\n    try {\n      const result = await loadPromise\n      return result\n    } finally {\n      this.loadingPromises.delete(name)\n    }\n  }\n\n  /**\n   * Internal method to load an extension\n   */\n  private async loadExtension(name: ExtensionName): Promise<ExtensionLoadResult> {\n    const startTime = performance.now()\n\n    // Check if extension exists in registry\n    const metadata = EXTENSION_REGISTRY[name]\n    if (!metadata) {\n      return {\n        name,\n        success: false,\n        wasAlreadyLoaded: false,\n        loadTimeMs: performance.now() - startTime,\n        error: `Unknown extension: ${name}`,\n      }\n    }\n\n    // Load dependencies first\n    if (metadata.dependencies) {\n      for (const dep of metadata.dependencies) {\n        const depResult = await this.ensureLoaded(dep)\n        if (!depResult.success) {\n          return {\n            name,\n            success: false,\n            wasAlreadyLoaded: false,\n            loadTimeMs: performance.now() - startTime,\n            error: `Failed to load dependency \"${dep}\": ${depResult.error}`,\n          }\n        }\n      }\n    }\n\n    try {\n      // Create the extension\n      const sql = `CREATE EXTENSION IF NOT EXISTS \"${metadata.extensionName}\"`\n      await this.executor.query(sql)\n\n      const loadTimeMs = performance.now() - startTime\n      this.loadedExtensions.add(name)\n      this.loadTimes.set(name, loadTimeMs)\n\n      if (this.options.debug) {\n        console.log(`[LazyExtensionLoader] Loaded extension \"${name}\" in ${loadTimeMs.toFixed(2)}ms`)\n      }\n\n      return {\n        name,\n        success: true,\n        wasAlreadyLoaded: false,\n        loadTimeMs,\n      }\n    } catch (error) {\n      const errorMessage = error instanceof Error ? error.message : String(error)\n\n      if (this.options.debug) {\n        console.error(`[LazyExtensionLoader] Failed to load extension \"${name}\":`, error)\n      }\n\n      return {\n        name,\n        success: false,\n        wasAlreadyLoaded: false,\n        loadTimeMs: performance.now() - startTime,\n        error: errorMessage,\n      }\n    }\n  }\n\n  /**\n   * Load multiple extensions\n   *\n   * @param names - Array of extension names to load\n   * @returns Array of load results\n   */\n  async loadExtensions(names: ExtensionName[]): Promise<ExtensionLoadResult[]> {\n    // Sort by dependencies - extensions without dependencies first\n    const sorted = this.sortByDependencies(names)\n\n    const results: ExtensionLoadResult[] = []\n    for (const name of sorted) {\n      const result = await this.ensureLoaded(name)\n      results.push(result)\n    }\n\n    return results\n  }\n\n  /**\n   * Sort extensions by dependencies (topological sort)\n   */\n  private sortByDependencies(names: ExtensionName[]): ExtensionName[] {\n    const nameSet = new Set(names)\n    const sorted: ExtensionName[] = []\n    const visited = new Set<ExtensionName>()\n\n    const visit = (name: ExtensionName) => {\n      if (visited.has(name)) return\n      visited.add(name)\n\n      const metadata = EXTENSION_REGISTRY[name]\n      if (metadata?.dependencies) {\n        for (const dep of metadata.dependencies) {\n          if (nameSet.has(dep) || !this.loadedExtensions.has(dep)) {\n            nameSet.add(dep)\n            visit(dep)\n          }\n        }\n      }\n\n      sorted.push(name)\n    }\n\n    for (const name of names) {\n      visit(name)\n    }\n\n    return sorted\n  }\n\n  /**\n   * Detect extensions needed for a SQL query\n   *\n   * @param sql - The SQL query to analyze\n   * @returns Array of extension names detected\n   */\n  detectExtensions(sql: string): ExtensionName[] {\n    this.autoDetectionCount++\n    return detectExtensions(sql)\n  }\n\n  /**\n   * Execute a query with automatic extension loading\n   *\n   * Analyzes the SQL, loads any detected extensions, then executes the query.\n   *\n   * @param sql - The SQL query to execute\n   * @param params - Optional query parameters\n   * @returns Result including loaded extensions and query result\n   */\n  async executeWithAutoLoad(sql: string, params?: unknown[]): Promise<ExecuteWithAutoLoadResult> {\n    const extensionsLoaded: ExtensionName[] = []\n    let extensionLoadTimeMs = 0\n\n    // Detect and load extensions if auto-detection is enabled\n    if (!this.options.disableAutoDetection) {\n      const detected = this.detectExtensions(sql)\n\n      for (const name of detected) {\n        if (!this.loadedExtensions.has(name)) {\n          // Note: performance timing handled by ensureLoaded\n          const result = await this.ensureLoaded(name)\n          if (result.success && !result.wasAlreadyLoaded) {\n            extensionsLoaded.push(name)\n            extensionLoadTimeMs += result.loadTimeMs\n          }\n        }\n      }\n    }\n\n    // Execute the query\n    const result = await this.executor.query(sql, params)\n\n    return {\n      extensionsLoaded,\n      result,\n      extensionLoadTimeMs,\n    }\n  }\n\n  /**\n   * Preload a set of extensions\n   *\n   * Useful for preloading extensions you know will be needed.\n   *\n   * @param names - Array of extension names to preload\n   * @returns Array of load results\n   */\n  async preload(names: ExtensionName[]): Promise<ExtensionLoadResult[]> {\n    return this.loadExtensions(names)\n  }\n\n  /**\n   * Check if an extension is loaded\n   *\n   * @param name - The extension name to check\n   * @returns True if the extension is loaded\n   */\n  isLoaded(name: ExtensionName): boolean {\n    return this.loadedExtensions.has(name)\n  }\n\n  /**\n   * Get list of loaded extensions\n   *\n   * @returns Array of loaded extension names\n   */\n  getLoadedExtensions(): ExtensionName[] {\n    return Array.from(this.loadedExtensions)\n  }\n\n  /**\n   * Get loading statistics\n   *\n   * @returns Statistics about extension loading\n   */\n  getStats(): ExtensionLoaderStats {\n    return {\n      totalLoaded: this.loadedExtensions.size,\n      loadedExtensions: Array.from(this.loadedExtensions),\n      cacheHits: this.cacheHits,\n      loadTimes: Object.fromEntries(this.loadTimes),\n      autoDetectionCount: this.autoDetectionCount,\n    }\n  }\n\n  /**\n   * Reset the loader state\n   *\n   * Clears loaded extensions and statistics. Useful for testing or\n   * when you need to reload extensions (e.g., after a database reset).\n   */\n  reset(): void {\n    this.loadedExtensions.clear()\n    this.loadingPromises.clear()\n    this.loadTimes.clear()\n    this.cacheHits = 0\n    this.autoDetectionCount = 0\n  }\n\n  // ============================================================================\n  // Static Methods\n  // ============================================================================\n\n  /**\n   * Get metadata for an extension\n   *\n   * @param name - The extension name\n   * @returns Extension metadata or undefined if not found\n   */\n  static getMetadata(name: ExtensionName): ExtensionMetadata | undefined {\n    return EXTENSION_REGISTRY[name]\n  }\n\n  /**\n   * Get all available extensions\n   *\n   * @returns Array of extension metadata for available extensions\n   */\n  static getAvailableExtensions(): ExtensionMetadata[] {\n    return Object.values(EXTENSION_REGISTRY).filter((m) => m.available)\n  }\n\n  /**\n   * Check if a SQL query would trigger detection of a specific extension\n   *\n   * @param sql - The SQL query to check\n   * @param extensionName - The extension to check for\n   * @returns True if the extension would be detected\n   */\n  static wouldDetect(sql: string, extensionName: ExtensionName): boolean {\n    const detected = detectExtensions(sql)\n    return detected.includes(extensionName)\n  }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\n/**\n * Create a LazyExtensionLoader instance\n *\n * @param executor - Query executor for running SQL\n * @param options - Loader options\n * @returns New LazyExtensionLoader instance\n *\n * @example\n * ```typescript\n * const loader = createLazyExtensionLoader({\n *   query: async (sql) => pg.exec(sql)\n * })\n *\n * await loader.ensureLoaded('vector')\n * ```\n */\nexport function createLazyExtensionLoader(\n  executor: QueryExecutor,\n  options?: LazyExtensionLoaderOptions\n): LazyExtensionLoader {\n  return new LazyExtensionLoader(executor, options)\n}\n","/**\n * PGLite Connection Pool\n *\n * A connection pool implementation for PGLite that efficiently manages\n * database connections, particularly optimized for Cloudflare Workers\n * where memory is constrained and each Durable Object is the sole client.\n *\n * ## Design Philosophy\n *\n * Unlike traditional connection pools that manage multiple physical database\n * connections, this pool manages \"virtual\" clients over a single PGLite instance.\n * Since PGLite runs PostgreSQL in-process (WASM), there's no network latency,\n * making client acquisition essentially free. The pool's value comes from:\n *\n * 1. **Controlled concurrency** - Prevents overwhelming the single-threaded WASM\n *    instance with parallel operations that could cause memory pressure\n * 2. **Familiar API** - Provides the standard pool.query/transaction interface\n *    that developers expect from postgres.js, pg-pool, etc.\n * 3. **Queue management** - FIFO request queuing with configurable timeouts\n *\n * ## Key Features\n *\n * - **Configurable pool size** - Defaults to 1 (optimal for Workers with max_connections=1)\n * - **FIFO queue** - Requests are processed in order with timeout support\n * - **Automatic cleanup** - Clients released after query/transaction completion\n * - **Transaction support** - Full isolation level and read-only transaction support\n * - **Statistics tracking** - Real-time pool metrics for monitoring\n * - **Idempotent operations** - Safe to call release() multiple times\n *\n * ## Memory Optimization\n *\n * For Cloudflare Workers (128MB limit), use maxSize=1 to serialize operations.\n * This prevents memory spikes from concurrent queries and aligns with PGLite's\n * max_connections=1 optimization in WASM builds.\n *\n * @example Basic usage\n * ```typescript\n * import { PGlitePool } from './pool'\n *\n * const pool = new PGlitePool({\n *   pglite: myPGLiteInstance,\n *   maxSize: 1,  // Optimal for Workers (max_connections=1)\n *   acquireTimeout: 30000,\n * })\n *\n * // Simple query - client automatically acquired and released\n * const result = await pool.query('SELECT * FROM users WHERE id = $1', [1])\n * ```\n *\n * @example Transactions\n * ```typescript\n * // Transaction with automatic commit/rollback\n * const user = await pool.transaction(async (client) => {\n *   await client.query('INSERT INTO users (name) VALUES ($1)', ['Alice'])\n *   return await client.query('SELECT * FROM users WHERE name = $1', ['Alice'])\n * })\n * ```\n *\n * @example Manual client management\n * ```typescript\n * // Manual acquire/release when you need more control\n * const client = await pool.acquire()\n * try {\n *   await client.query('SELECT 1')\n *   await client.query('SELECT 2')\n * } finally {\n *   pool.release(client)\n * }\n *\n * await pool.end()\n * ```\n *\n * @example Statistics monitoring\n * ```typescript\n * const stats = pool.getStats()\n * console.log(`Active: ${stats.activeCount}/${stats.maxSize}`)\n * console.log(`Waiting: ${stats.waitingCount}`)\n * ```\n *\n * @module\n */\n\nimport { PoolError } from '@dotdo/postgres-shared'\n\n// Re-export PoolError for backwards compatibility\nexport { PoolError }\n\n// =============================================================================\n// Type Definitions\n// =============================================================================\n\n/**\n * PGLite-like interface that the pool works with.\n *\n * This interface defines the minimal contract required from a PGLite instance.\n * It allows the pool to work with different PGLite variants (full, tiny) and\n * enables easy mocking in tests.\n *\n * @remarks\n * The pool does not own the PGLite instance lifecycle - call {@link PGlitePool.destroy}\n * if you want the pool to also close the underlying connection.\n */\nexport interface PGLiteLike {\n  /**\n   * Promise that resolves when PGLite is ready to accept queries.\n   * The pool awaits this before creating clients.\n   */\n  waitReady: Promise<void>\n\n  /**\n   * Synchronous ready check. True after waitReady resolves.\n   */\n  ready: boolean\n\n  /**\n   * Execute a SQL query with optional parameters.\n   *\n   * @typeParam T - The row type for the query result\n   * @param sql - SQL query string with $1, $2, etc. placeholders\n   * @param params - Parameter values to bind to placeholders\n   * @returns Query result with rows, field metadata, and affected row count\n   */\n  query<T = unknown>(sql: string, params?: unknown[]): Promise<{\n    rows: T[]\n    fields: Array<{ name: string; dataTypeID: number }>\n    affectedRows?: number\n  }>\n\n  /**\n   * Close the PGLite connection and release resources.\n   */\n  close(): Promise<void>\n}\n\n/**\n * Query result from a pool client operation.\n *\n * @typeParam T - The row type for typed queries\n */\nexport interface PoolQueryResult<T = unknown> {\n  /** Array of result rows, typed as T */\n  rows: T[]\n  /** Field metadata including column names and PostgreSQL type OIDs */\n  fields: Array<{ name: string; dataTypeID: number }>\n  /** Number of rows affected (for INSERT/UPDATE/DELETE) */\n  affectedRows?: number\n}\n\n/**\n * Pool client that wraps access to the underlying PGLite connection.\n *\n * Clients are acquired from the pool, used for queries, and then released back.\n * The pool tracks client state to prevent use-after-release bugs.\n *\n * @example\n * ```typescript\n * const client = await pool.acquire()\n * try {\n *   const result = await client.query<User>('SELECT * FROM users WHERE id = $1', [1])\n *   console.log(result.rows[0])\n * } finally {\n *   pool.release(client)\n * }\n * ```\n */\nexport interface PoolClient {\n  /** Unique client ID within the pool (monotonically increasing) */\n  readonly id: number\n\n  /** Whether this client is currently in use (acquired but not released) */\n  inUse: boolean\n\n  /** Reference to the underlying PGLite instance */\n  readonly pglite: PGLiteLike\n\n  /** Timestamp when the client was acquired, undefined when idle */\n  acquiredAt?: Date | undefined\n\n  /**\n   * Execute a query using this client.\n   *\n   * @typeParam T - The expected row type for typed results\n   * @param sql - SQL query string with $1, $2, etc. placeholders\n   * @param params - Parameter values to bind to placeholders\n   * @returns Query result with typed rows\n   * @throws {PoolError} If the client has been released (use-after-release)\n   *\n   * @example\n   * ```typescript\n   * const result = await client.query<User>(\n   *   'SELECT * FROM users WHERE id = $1',\n   *   [userId]\n   * )\n   * ```\n   */\n  query<T = unknown>(sql: string, params?: unknown[]): Promise<PoolQueryResult<T>>\n}\n\n/**\n * PostgreSQL transaction isolation levels.\n *\n * @see {@link https://www.postgresql.org/docs/current/transaction-iso.html PostgreSQL Isolation Levels}\n *\n * - `'read uncommitted'` - Allows dirty reads (PostgreSQL treats as read committed)\n * - `'read committed'` - Default level, prevents dirty reads\n * - `'repeatable read'` - Snapshot isolation, prevents non-repeatable reads\n * - `'serializable'` - Strictest level, prevents phantom reads\n */\nexport type PoolIsolationLevel =\n  | 'read uncommitted'\n  | 'read committed'\n  | 'repeatable read'\n  | 'serializable'\n\n/**\n * Options for transaction execution.\n */\nexport interface PoolTransactionOptions {\n  /**\n   * Transaction isolation level.\n   * Higher isolation levels provide stronger consistency guarantees\n   * but may reduce concurrency.\n   *\n   * @default 'read committed' (PostgreSQL default)\n   */\n  isolationLevel?: PoolIsolationLevel\n\n  /**\n   * Whether the transaction is read-only.\n   * Read-only transactions can be optimized by the database engine\n   * and will error if write operations are attempted.\n   *\n   * @default false\n   */\n  readOnly?: boolean\n}\n\n/**\n * Configuration for creating a PGLite pool.\n */\nexport interface PGlitePoolConfig {\n  /**\n   * The PGLite instance to pool.\n   * The pool does not own this instance - it will not be closed\n   * when {@link PGlitePool.end} is called. Use {@link PGlitePool.destroy}\n   * to close both the pool and the underlying PGLite instance.\n   */\n  pglite: PGLiteLike\n\n  /**\n   * Maximum number of virtual clients in the pool.\n   *\n   * Since PGLite runs in-process (no network), this effectively controls\n   * how many concurrent operations can execute before new requests queue.\n   *\n   * **Cloudflare Workers recommendation:** Use `maxSize: 1` to serialize\n   * operations and prevent memory spikes from concurrent WASM execution.\n   * This aligns with PGLite's `max_connections=1` optimization.\n   *\n   * @default 1\n   */\n  maxSize?: number\n\n  /**\n   * Timeout in milliseconds for acquiring a client from the pool.\n   *\n   * When the pool is at capacity, new acquire requests wait in a queue.\n   * If a client cannot be acquired within this timeout, the request fails\n   * with a {@link PoolError}.\n   *\n   * Set to `0` for no timeout (wait indefinitely - not recommended for production).\n   *\n   * @default 30000 (30 seconds)\n   */\n  acquireTimeout?: number\n}\n\n/**\n * Real-time pool statistics for monitoring and debugging.\n *\n * Use {@link PGlitePool.getStats} to retrieve current statistics.\n *\n * @example\n * ```typescript\n * const stats = pool.getStats()\n *\n * // Check pool utilization\n * const utilization = stats.activeCount / stats.maxSize\n *\n * // Alert if requests are queuing\n * if (stats.waitingCount > 10) {\n *   console.warn('High queue depth:', stats.waitingCount)\n * }\n * ```\n */\nexport interface PoolStats {\n  /** Total number of clients created (active + idle) */\n  totalCount: number\n  /** Number of idle clients ready to be acquired */\n  idleCount: number\n  /** Number of clients currently in use */\n  activeCount: number\n  /** Number of requests waiting in queue for a client */\n  waitingCount: number\n  /** Maximum pool size from configuration */\n  maxSize: number\n}\n\n// =============================================================================\n// Internal Types and Implementation\n// =============================================================================\n\n/**\n * Queued request waiting for a client.\n * @internal\n */\ninterface QueuedRequest {\n  resolve: (client: PoolClient) => void\n  reject: (error: Error) => void\n  timeoutId: ReturnType<typeof setTimeout>\n}\n\n/**\n * Internal pool client implementation.\n *\n * This class tracks the client lifecycle (acquired/released) and prevents\n * use-after-release bugs by checking state before every query.\n *\n * @internal\n */\nclass PoolClientImpl implements PoolClient {\n  readonly id: number\n  inUse: boolean = false\n  readonly pglite: PGLiteLike\n  acquiredAt?: Date | undefined\n\n  /** True after release, prevents use-after-release */\n  private released: boolean = false\n\n  constructor(id: number, pglite: PGLiteLike) {\n    this.id = id\n    this.pglite = pglite\n  }\n\n  async query<T = unknown>(sql: string, params?: unknown[]): Promise<PoolQueryResult<T>> {\n    if (!this.inUse || this.released) {\n      throw new PoolError('Cannot use a released client', {\n        context: { clientId: this.id },\n      })\n    }\n    return this.pglite.query<T>(sql, params)\n  }\n\n  /**\n   * Mark this client as released.\n   * Called by the pool when releasing - resets state for reuse.\n   * @internal\n   */\n  _markReleased(): void {\n    this.released = true\n    this.inUse = false\n    this.acquiredAt = undefined\n  }\n\n  /**\n   * Mark this client as acquired.\n   * Called by the pool when acquiring - prepares for use.\n   * @internal\n   */\n  _markAcquired(): void {\n    this.released = false\n    this.inUse = true\n    this.acquiredAt = new Date()\n  }\n}\n\n// =============================================================================\n// PGlitePool Class\n// =============================================================================\n\n/**\n * PGLite Connection Pool.\n *\n * Manages virtual connections to a PGLite instance, providing connection\n * pooling semantics even though PGLite is a single-connection in-process\n * database.\n *\n * @see {@link PGlitePoolConfig} for configuration options\n * @see {@link PoolStats} for available statistics\n */\nexport class PGlitePool {\n  // ---------------------------------------------------------------------------\n  // Configuration (immutable after construction)\n  // ---------------------------------------------------------------------------\n  private readonly pglite: PGLiteLike\n  private readonly maxSize: number\n  private readonly acquireTimeout: number\n\n  // ---------------------------------------------------------------------------\n  // Client tracking\n  // ---------------------------------------------------------------------------\n  /** All clients in the pool (by ID) */\n  private readonly clients: Map<number, PoolClientImpl> = new Map()\n  /** Stack of idle clients available for acquisition (LIFO for cache locality) */\n  private readonly idleClients: PoolClientImpl[] = []\n  /** Queue of requests waiting for a client (FIFO for fairness) */\n  private readonly waitingRequests: QueuedRequest[] = []\n\n  // ---------------------------------------------------------------------------\n  // Pool state\n  // ---------------------------------------------------------------------------\n  /** Auto-incrementing client ID counter */\n  private nextClientId: number = 0\n  /** Whether the pool has been closed via end() or destroy() */\n  private closed: boolean = false\n  /** Cached ready promise to avoid re-awaiting */\n  private readyPromise: Promise<void> | null = null\n\n  /**\n   * Create a new PGLite connection pool.\n   *\n   * @param config - Pool configuration options\n   *\n   * @example\n   * ```typescript\n   * const pool = new PGlitePool({\n   *   pglite: myPGLiteInstance,\n   *   maxSize: 1,\n   *   acquireTimeout: 30000,\n   * })\n   * ```\n   */\n  constructor(config: PGlitePoolConfig) {\n    this.pglite = config.pglite\n    this.maxSize = config.maxSize ?? 1\n    this.acquireTimeout = config.acquireTimeout ?? 30000\n  }\n\n  // ---------------------------------------------------------------------------\n  // Statistics Getters\n  // ---------------------------------------------------------------------------\n\n  /**\n   * Total number of clients created in the pool.\n   * Clients are created lazily as needed, up to maxSize.\n   */\n  get totalCount(): number {\n    return this.clients.size\n  }\n\n  /**\n   * Number of idle clients available for immediate acquisition.\n   */\n  get idleCount(): number {\n    return this.idleClients.length\n  }\n\n  /**\n   * Number of clients currently in use (acquired but not released).\n   */\n  get activeCount(): number {\n    let count = 0\n    for (const client of this.clients.values()) {\n      if (client.inUse) {\n        count++\n      }\n    }\n    return count\n  }\n\n  /**\n   * Number of requests waiting in queue for a client.\n   * Non-zero indicates pool is at capacity.\n   */\n  get waitingCount(): number {\n    return this.waitingRequests.length\n  }\n\n  /**\n   * Whether the pool has been closed via {@link end} or {@link destroy}.\n   * Closed pools reject all new acquire requests.\n   */\n  get isClosed(): boolean {\n    return this.closed\n  }\n\n  /**\n   * Get a snapshot of current pool statistics.\n   *\n   * @returns Current pool statistics for monitoring\n   *\n   * @example\n   * ```typescript\n   * const stats = pool.getStats()\n   * console.log(`Pool: ${stats.activeCount}/${stats.maxSize} active, ${stats.waitingCount} waiting`)\n   * ```\n   */\n  getStats(): PoolStats {\n    return {\n      totalCount: this.totalCount,\n      idleCount: this.idleCount,\n      activeCount: this.activeCount,\n      waitingCount: this.waitingCount,\n      maxSize: this.maxSize,\n    }\n  }\n\n  // ---------------------------------------------------------------------------\n  // Private Helper Methods\n  // ---------------------------------------------------------------------------\n\n  /**\n   * Check if PGLite is ready (synchronous check).\n   * Used to determine if we can skip the async ready wait.\n   */\n  private isReady(): boolean {\n    return this.readyPromise !== null || this.pglite.ready\n  }\n\n  /**\n   * Ensure PGLite is ready before operations.\n   * Caches the ready promise to avoid re-awaiting.\n   */\n  private async ensureReady(): Promise<void> {\n    if (!this.readyPromise) {\n      this.readyPromise = this.pglite.waitReady\n    }\n    await this.readyPromise\n  }\n\n  /**\n   * Create a new pool client.\n   * Called when pool capacity allows expansion.\n   */\n  private createClient(): PoolClientImpl {\n    const id = ++this.nextClientId\n    const client = new PoolClientImpl(id, this.pglite)\n    this.clients.set(id, client)\n    return client\n  }\n\n  /**\n   * Create a queued request that waits for a client with timeout.\n   * This encapsulates the common pattern of timeout-bounded waiting.\n   *\n   * @returns Promise that resolves with a client or rejects on timeout\n   */\n  private createQueuedRequest(): Promise<PoolClient> {\n    return new Promise<PoolClient>((resolve, reject) => {\n      const timeoutId = setTimeout(() => {\n        // Remove from waiting queue on timeout\n        const index = this.waitingRequests.findIndex(\n          (r) => r.resolve === resolve\n        )\n        if (index !== -1) {\n          this.waitingRequests.splice(index, 1)\n        }\n        reject(new PoolError('Timeout waiting for available client', {\n          context: {\n            timeoutMs: this.acquireTimeout,\n            waitingCount: this.waitingRequests.length,\n            activeCount: this.activeCount,\n          },\n        }))\n      }, this.acquireTimeout)\n\n      this.waitingRequests.push({ resolve, reject, timeoutId })\n    })\n  }\n\n  // ---------------------------------------------------------------------------\n  // Client Acquisition and Release\n  // ---------------------------------------------------------------------------\n\n  /**\n   * Acquire a client from the pool.\n   *\n   * If a client is immediately available (idle client exists or pool can grow),\n   * the acquisition is nearly instantaneous. Otherwise, the request is queued\n   * and waits until a client becomes available or the timeout is reached.\n   *\n   * **Important:** Always release the client when done, preferably using\n   * try/finally to ensure release even on errors.\n   *\n   * @returns A pool client that must be released after use\n   * @throws {PoolError} If the pool is closed\n   * @throws {PoolError} If timeout is reached while waiting for a client\n   *\n   * @example\n   * ```typescript\n   * const client = await pool.acquire()\n   * try {\n   *   await client.query('SELECT * FROM users')\n   * } finally {\n   *   pool.release(client)\n   * }\n   * ```\n   */\n  acquire(): Promise<PoolClient> {\n    if (this.closed) {\n      return Promise.reject(new PoolError('Pool has been closed'))\n    }\n\n    // Fast path: If PGLite is ready and pool is at capacity with no idle clients,\n    // queue immediately. This makes queuing synchronous which is important for\n    // correct waitingCount tracking in tests and monitoring.\n    if (this.isReady() && this.clients.size >= this.maxSize && this.idleClients.length === 0) {\n      return this.createQueuedRequest()\n    }\n\n    // Otherwise, do the full async flow\n    return this.acquireAsync()\n  }\n\n  /**\n   * Internal async acquisition logic.\n   * Handles the full flow: wait for ready, check idle, create new, or queue.\n   */\n  private async acquireAsync(): Promise<PoolClient> {\n    // Ensure PGLite is ready before proceeding\n    await this.ensureReady()\n\n    // Check if closed after awaiting (pool may have closed while waiting)\n    if (this.closed) {\n      throw new PoolError('Pool has been closed')\n    }\n\n    // Try to reuse an idle client (LIFO for better cache locality)\n    const idleClient = this.idleClients.pop()\n    if (idleClient) {\n      idleClient._markAcquired()\n      return idleClient\n    }\n\n    // If we can create more clients, expand the pool\n    if (this.clients.size < this.maxSize) {\n      const client = this.createClient()\n      client._markAcquired()\n      return client\n    }\n\n    // Pool at capacity - queue and wait for a client to be released\n    return this.createQueuedRequest()\n  }\n\n  /**\n   * Release a client back to the pool.\n   *\n   * This operation is idempotent - calling release() multiple times on the\n   * same client is safe and will only have effect the first time.\n   *\n   * When released, if there are queued requests waiting for a client,\n   * the first waiting request receives this client immediately (FIFO).\n   * Otherwise, the client is added to the idle pool for reuse.\n   *\n   * @param client - The client to release (must have been acquired from this pool)\n   * @throws {PoolError} If the client is not from this pool (wrong pool or invalid)\n   *\n   * @example\n   * ```typescript\n   * const client = await pool.acquire()\n   * try {\n   *   await client.query('SELECT 1')\n   * } finally {\n   *   pool.release(client) // Always release, even on error\n   * }\n   * ```\n   */\n  release(client: PoolClient): void {\n    const poolClient = this.clients.get(client.id)\n    if (!poolClient) {\n      throw new PoolError('Invalid client', {\n        context: { clientId: client.id },\n      })\n    }\n\n    // Idempotent: already released, no-op\n    if (!poolClient.inUse) {\n      return\n    }\n\n    // Mark as released\n    poolClient._markReleased()\n\n    // If there are waiting requests and pool isn't closed, fulfill the first one\n    if (this.waitingRequests.length > 0 && !this.closed) {\n      const request = this.waitingRequests.shift()!\n      clearTimeout(request.timeoutId)\n      poolClient._markAcquired()\n      request.resolve(poolClient)\n      return\n    }\n\n    // Otherwise, add to idle pool for reuse\n    this.idleClients.push(poolClient)\n  }\n\n  // ---------------------------------------------------------------------------\n  // Query Execution\n  // ---------------------------------------------------------------------------\n\n  /**\n   * Execute a query using a pooled client.\n   *\n   * This is the simplest way to execute queries - the client is automatically\n   * acquired before the query and released after, even if the query fails.\n   *\n   * For multiple queries in sequence, consider using {@link acquire} manually\n   * or {@link transaction} to avoid acquire/release overhead per query.\n   *\n   * @typeParam T - The expected row type for typed results\n   * @param sql - SQL query string with $1, $2, etc. placeholders\n   * @param params - Parameter values to bind to placeholders\n   * @returns Query result with typed rows\n   * @throws {PoolError} If client acquisition fails\n   * @throws {Error} If the query execution fails\n   *\n   * @example\n   * ```typescript\n   * // Simple query\n   * const result = await pool.query('SELECT * FROM users WHERE id = $1', [userId])\n   *\n   * // Typed query\n   * interface User { id: number; name: string }\n   * const { rows } = await pool.query<User>('SELECT * FROM users')\n   * const user = rows[0] // Type: User\n   * ```\n   */\n  async query<T = unknown>(\n    sql: string,\n    params?: unknown[]\n  ): Promise<PoolQueryResult<T>> {\n    const client = await this.acquire()\n    try {\n      return await client.query<T>(sql, params)\n    } finally {\n      this.release(client)\n    }\n  }\n\n  // ---------------------------------------------------------------------------\n  // Transaction Support\n  // ---------------------------------------------------------------------------\n\n  /** Valid PostgreSQL isolation levels (lowercase for comparison) */\n  private static readonly VALID_ISOLATION_LEVELS = [\n    'read uncommitted',\n    'read committed',\n    'repeatable read',\n    'serializable',\n  ] as const\n\n  /**\n   * Build the BEGIN statement for a transaction with options.\n   *\n   * @param options - Transaction options\n   * @returns SQL string for BEGIN with isolation level and access mode\n   * @throws {Error} If isolation level is invalid\n   */\n  private buildBeginStatement(options?: PoolTransactionOptions): string {\n    let beginSql = 'BEGIN'\n\n    if (options?.isolationLevel) {\n      const normalized = options.isolationLevel.toLowerCase()\n      if (!PGlitePool.VALID_ISOLATION_LEVELS.includes(normalized as PoolIsolationLevel)) {\n        throw new Error(`Invalid isolation level: \"${options.isolationLevel}\"`)\n      }\n      beginSql += ` ISOLATION LEVEL ${normalized.toUpperCase()}`\n    }\n\n    if (options?.readOnly) {\n      beginSql += ' READ ONLY'\n    }\n\n    return beginSql\n  }\n\n  /**\n   * Execute a transaction using a pooled client.\n   *\n   * The client is held for the duration of the transaction and automatically\n   * released when complete. The transaction is committed on success or rolled\n   * back if the callback throws an error.\n   *\n   * @typeParam T - The return type of the transaction callback\n   * @param fn - Transaction callback function that receives the client\n   * @param options - Transaction options (isolation level, read-only)\n   * @returns Result of the transaction callback\n   * @throws {PoolError} If client acquisition fails\n   * @throws {Error} If isolation level validation fails\n   * @throws {Error} Any error thrown by the callback (transaction is rolled back)\n   *\n   * @example\n   * ```typescript\n   * // Basic transaction\n   * const result = await pool.transaction(async (client) => {\n   *   await client.query('INSERT INTO users (name) VALUES ($1)', ['Alice'])\n   *   const { rows } = await client.query('SELECT * FROM users WHERE name = $1', ['Alice'])\n   *   return rows[0]\n   * })\n   *\n   * // Transaction with options\n   * await pool.transaction(async (client) => {\n   *   const { rows } = await client.query('SELECT * FROM accounts')\n   *   return rows\n   * }, { isolationLevel: 'serializable', readOnly: true })\n   * ```\n   */\n  async transaction<T>(\n    fn: (client: PoolClient) => Promise<T>,\n    options?: PoolTransactionOptions\n  ): Promise<T> {\n    const client = await this.acquire()\n    try {\n      const beginSql = this.buildBeginStatement(options)\n      await client.query(beginSql)\n\n      try {\n        const result = await fn(client)\n        await client.query('COMMIT')\n        return result\n      } catch (error) {\n        // Always attempt rollback on error\n        try {\n          await client.query('ROLLBACK')\n        } catch {\n          // Ignore rollback errors - original error is more important\n        }\n        throw error\n      }\n    } finally {\n      this.release(client)\n    }\n  }\n\n  // ---------------------------------------------------------------------------\n  // Pool Lifecycle\n  // ---------------------------------------------------------------------------\n\n  /**\n   * Close the pool and release all clients.\n   *\n   * This operation:\n   * 1. Marks the pool as closed (rejects new acquire requests)\n   * 2. Rejects all pending queued requests with PoolError\n   * 3. Clears all client references\n   *\n   * The underlying PGLite instance is NOT closed - use {@link destroy}\n   * if you want to close both the pool and the PGLite connection.\n   *\n   * This operation is idempotent - calling end() multiple times is safe.\n   *\n   * @example\n   * ```typescript\n   * // Clean shutdown\n   * await pool.end()\n   * // Pool is now closed, but PGLite can still be used directly\n   * ```\n   */\n  async end(): Promise<void> {\n    if (this.closed) {\n      return\n    }\n\n    this.closed = true\n\n    // Reject all waiting requests with clear error message\n    for (const request of this.waitingRequests) {\n      clearTimeout(request.timeoutId)\n      request.reject(new PoolError('Pool is closing'))\n    }\n    this.waitingRequests.length = 0\n\n    // Clear idle clients\n    this.idleClients.length = 0\n\n    // Clear all clients\n    this.clients.clear()\n  }\n\n  /**\n   * Destroy the pool and close the underlying PGLite instance.\n   *\n   * This is the \"full shutdown\" method that:\n   * 1. Calls {@link end} to close the pool\n   * 2. Calls close() on the PGLite instance\n   *\n   * After destroy(), neither the pool nor the PGLite instance can be used.\n   *\n   * @example\n   * ```typescript\n   * // Full cleanup when completely done with the database\n   * await pool.destroy()\n   * ```\n   */\n  async destroy(): Promise<void> {\n    await this.end()\n    await this.pglite.close()\n  }\n}\n","/**\n * postgres.do - PostgreSQL for Cloudflare Workers\n *\n * SQL tagged template client with Drizzle ORM compatibility\n *\n * @example\n * ```typescript\n * import postgres from 'postgres.do';\n *\n * const sql = postgres('postgres://db.postgres.do/mydb');\n *\n * // Tagged template queries\n * const users = await sql`SELECT * FROM users WHERE id = ${userId}`;\n *\n * // Works with Drizzle ORM\n * import { drizzle } from 'drizzle-orm/postgres-js';\n * const db = drizzle(sql);\n * ```\n */\n\n// Main client exports\nexport { postgres, createClient } from './client'\nexport { default } from './client'\n\n// Authentication integration with oauth.do\nexport {\n  createAuthenticatedClient,\n  createClientFromRequest,\n  withAuth,\n  extractUserId,\n  validateToken,\n  createUserScopedClient,\n  extractBearerToken,\n  generateDatabaseId,\n  type AuthenticatedClientOptions,\n  type AuthenticatedUser,\n  type AuthenticatedContext,\n  type TokenValidationResult,\n} from './auth'\n\n// Connection utilities\nexport { parseConnectionUrl, type ConnectionInfo } from './connection'\n\n// Transport implementations\nexport { createHttpTransport, HttpTransport } from './transport/http'\n// RpcTransport is the capnweb-based WebSocket transport (replaces legacy WsTransport)\nexport { createRpcTransport, RpcTransport, type RpcTransportConfig } from './transport/rpc'\n// Backward-compatible aliases for legacy code using WsTransport\nexport { RpcTransport as WsTransport, createRpcTransport as createWsTransport } from './transport/rpc'\n\n// CDC (Change Data Capture) Transports\nexport { CDCWsTransport, createCdcWsTransport } from './transport/cdc-ws'\nexport { CDCSseTransport, createCdcSseTransport } from './transport/cdc-sse'\n\n// CDC (Change Data Capture) Client Subscription\nexport {\n  CDCSubscription,\n  validateTableName,\n  generateSubscriptionId,\n  type Subscription,\n  type SubscribeOptions,\n  type TypedSubscribeOptions,\n} from './subscription'\n\n// Types\nexport type {\n  // Core types\n  Sql,\n  TransactionSql,\n  ReservedSql,\n  PendingQuery,\n  Row,\n  QueryResult,\n  FieldInfo,\n  TypeParser,\n\n  // Configuration\n  PostgresConfig,\n  TransactionOptions,\n  IsolationLevel,\n\n  // Transport types\n  Transport,\n  HttpTransportConfig,\n  WsTransportConfig,\n\n  // CDC (Change Data Capture) types\n  CDCOperation,\n  CDCChangeEvent,\n  CDCTransport,\n  CDCSubscriptionOptions,\n  CDCWsTransportConfig,\n  CDCSseTransportConfig,\n\n  // CDC Client types (high-level API)\n  CDCClientSubscription,\n  CDCClientSubscribeOptions,\n  CDCClientSubscriptionInfo,\n} from './types'\n\n// Errors\nexport {\n  PostgresError,\n  ConnectionError,\n  TimeoutError,\n  type PostgresErrorFields,\n} from './types'\n\n// Streaming API for large datasets\nexport type {\n  StreamOptions,\n  StreamResult,\n  Cursor,\n  CursorFetchResult,\n} from './types'\nexport {\n  createStreamResult,\n  createCursor,\n  buildParameterizedSql as buildStreamSql,\n} from './streaming'\n\n// Lazy Extension Loading\nexport {\n  LazyExtensionLoader,\n  createLazyExtensionLoader,\n  detectExtensions,\n  EXTENSION_REGISTRY,\n  type ExtensionName,\n  type ExtensionMetadata,\n  type QueryExecutor,\n  type ExtensionLoadResult,\n  type ExecuteWithAutoLoadResult,\n  type ExtensionLoaderStats,\n  type LazyExtensionLoaderOptions,\n} from './extensions'\n\n// Connection pool\nexport {\n  PGlitePool,\n  PoolError,\n  type PGLiteLike,\n  type PoolClient,\n  type PoolQueryResult,\n  type PGlitePoolConfig,\n  type PoolStats,\n  type PoolTransactionOptions,\n  type PoolIsolationLevel,\n} from './pool'\n\n// Query Middleware\nexport {\n  // Core middleware functions\n  generateQueryId,\n  executeWithMiddleware,\n  composeMiddleware,\n  // Built-in middlewares\n  loggingMiddleware,\n  metricsMiddleware,\n  rateLimitMiddleware,\n  tracingMiddleware,\n  transformMiddleware,\n  retryMiddleware,\n  // Types\n  type QueryRequest,\n  type QueryResponse,\n  type QueryMiddleware,\n  type NextFunction,\n  type LoggingMiddlewareOptions,\n  type MetricsMiddlewareOptions,\n  type QueryMetric,\n  type RateLimitMiddlewareOptions,\n  type TracingMiddlewareOptions,\n  type QueryTrace,\n  type TransformMiddlewareOptions,\n  type RetryMiddlewareOptions,\n} from './middleware'\n","/**\n * PGLite Transport for postgres.do\n *\n * Provides a local PostgreSQL implementation using PGLite WASM\n * that can be used as a transport layer for the postgres.do client.\n *\n * @example\n * ```typescript\n * import { postgres } from 'postgres.do'\n * import { createPGLiteTransport, PGLite } from 'postgres.do/pglite'\n *\n * // Create a PGLite instance (in-memory)\n * const pglite = new PGLite()\n * await pglite.waitReady\n *\n * // Create a postgres.do client with PGLite transport\n * const sql = postgres({ transport: createPGLiteTransport(pglite) })\n *\n * // Use like normal postgres.do client\n * const users = await sql`SELECT * FROM users`\n * ```\n */\n\nimport type { PGlite } from '@dotdo/pglite'\nimport type { Transport, Row, QueryResult, TransactionOptions } from '../types.js'\n\n// Re-export PGLite for convenience\nexport { PGlite } from '@dotdo/pglite'\n\n/**\n * PGLite transport configuration\n */\nexport interface PGLiteTransportConfig {\n  /**\n   * The PGLite instance to use for queries\n   */\n  pglite: PGlite\n\n  /**\n   * Whether to automatically initialize the PGLite instance\n   * Default: true\n   */\n  autoInit?: boolean\n}\n\n/**\n * PGLite Transport implementation\n *\n * Provides a Transport interface compatible with the postgres.do client\n * that uses PGLite WASM for local PostgreSQL execution.\n */\nexport class PGLiteTransport implements Transport {\n  private pglite: PGlite\n  private autoInit: boolean\n  private initialized = false\n\n  constructor(config: PGLiteTransportConfig) {\n    this.pglite = config.pglite\n    this.autoInit = config.autoInit ?? true\n  }\n\n  /**\n   * Ensure PGLite is ready before executing queries\n   */\n  private async ensureReady(): Promise<void> {\n    if (this.initialized) return\n\n    if (this.autoInit && this.pglite.waitReady) {\n      await this.pglite.waitReady\n    }\n\n    this.initialized = true\n  }\n\n  /**\n   * Execute a SQL query with optional parameters\n   */\n  async query<T extends Row = Row>(\n    sql: string,\n    params?: unknown[]\n  ): Promise<QueryResult<T>> {\n    await this.ensureReady()\n\n    const result = await this.pglite.query<T>(sql, params)\n\n    return {\n      rows: result.rows,\n      rowCount: result.affectedRows ?? result.rows.length,\n      fields: result.fields.map((field: { name: string; dataTypeID: number }) => ({\n        name: field.name,\n        dataTypeID: field.dataTypeID,\n        tableID: 0,\n        columnID: 0,\n        dataTypeSize: -1,\n        dataTypeModifier: -1,\n        format: 0,\n      })),\n      command: this.extractCommand(sql),\n    }\n  }\n\n  /**\n   * Execute multiple queries in a transaction\n   */\n  async transaction<T>(\n    queries: Array<{ sql: string; params?: unknown[] }>,\n    options?: TransactionOptions\n  ): Promise<T> {\n    await this.ensureReady()\n\n    // Build BEGIN statement with options\n    const beginParts = ['BEGIN']\n\n    if (options?.isolationLevel) {\n      // Validate isolation level to prevent SQL injection\n      const validLevels = ['read uncommitted', 'read committed', 'repeatable read', 'serializable']\n      const normalized = options.isolationLevel.toLowerCase()\n      if (!validLevels.includes(normalized)) {\n        throw new Error(`Invalid isolation level: \"${options.isolationLevel}\"`)\n      }\n      beginParts.push(`ISOLATION LEVEL ${normalized.toUpperCase()}`)\n    }\n    if (options?.readOnly) {\n      beginParts.push('READ ONLY')\n    }\n    if (options?.deferrable) {\n      beginParts.push('DEFERRABLE')\n    }\n\n    // Start transaction\n    await this.pglite.query(beginParts.join(' '))\n\n    try {\n      const results: unknown[] = []\n\n      for (const q of queries) {\n        const result = await this.pglite.query(q.sql, q.params)\n        results.push(result.rows)\n      }\n\n      await this.pglite.query('COMMIT')\n      return results as T\n    } catch (error) {\n      await this.pglite.query('ROLLBACK')\n      throw error\n    }\n  }\n\n  /**\n   * Close the PGLite connection\n   */\n  async close(): Promise<void> {\n    if (this.pglite.close) {\n      await this.pglite.close()\n    }\n    this.initialized = false\n  }\n\n  /**\n   * Check if the transport is connected (PGLite is always connected when initialized)\n   */\n  isConnected(): boolean {\n    // PGLite's ready property indicates if it's ready for queries\n    // The 'ready' property is true when PGLite has finished initialization\n    return this.initialized || this.pglite.ready === true\n  }\n\n  /**\n   * Get the underlying PGLite instance\n   */\n  getPGLite(): PGlite {\n    return this.pglite\n  }\n\n  /**\n   * Extract the SQL command type from a query string\n   */\n  private extractCommand(sql: string): string {\n    const trimmed = sql.trim().toUpperCase()\n    const firstWord = trimmed.split(/\\s+/)[0]\n    return firstWord || 'UNKNOWN'\n  }\n}\n\n/**\n * Create a PGLite transport from a PGLite instance\n *\n * @param pglite - The PGLite instance to use\n * @param options - Optional configuration\n * @returns A Transport implementation using PGLite\n *\n * @example\n * ```typescript\n * import { PGlite } from '@dotdo/pglite'\n * import { createPGLiteTransport } from 'postgres.do/pglite'\n *\n * const pglite = new PGlite()\n * const transport = createPGLiteTransport(pglite)\n * ```\n */\nexport function createPGLiteTransport(\n  pglite: PGlite,\n  options?: Omit<PGLiteTransportConfig, 'pglite'>\n): PGLiteTransport {\n  return new PGLiteTransport({\n    pglite,\n    ...options,\n  })\n}\n\n/**\n * Create a postgres.do-compatible SQL function backed by PGLite\n *\n * This provides a convenient way to use PGLite with the postgres.do API\n *\n * @param pgliteOrOptions - PGLite instance or PGLite options\n * @returns A postgres.do SQL tagged template function\n *\n * @example\n * ```typescript\n * import { createPGLiteSql } from 'postgres.do/pglite'\n *\n * // With existing PGLite instance\n * const pglite = new PGlite()\n * const sql = await createPGLiteSql(pglite)\n *\n * // Execute queries using postgres.do API\n * const users = await sql`SELECT * FROM users WHERE id = ${userId}`\n * ```\n */\nexport async function createPGLiteSql(pglite: PGlite): Promise<PGLiteSql> {\n  await pglite.waitReady\n\n  const transport = new PGLiteTransport({ pglite })\n\n  // Create the SQL tagged template function\n  const sql = function <T extends Row = Row>(\n    strings: TemplateStringsArray,\n    ...values: unknown[]\n  ): Promise<T[]> {\n    // Build parameterized query\n    const parts: string[] = []\n    for (let i = 0; i < strings.length; i++) {\n      const str = strings[i]\n      if (str !== undefined) {\n        parts.push(str)\n      }\n      if (i < values.length) {\n        parts.push(`$${i + 1}`)\n      }\n    }\n    const query = parts.join('')\n\n    return transport.query<T>(query, values).then((result) => result.rows)\n  } as PGLiteSql\n\n  // Add unsafe method for raw queries\n  sql.unsafe = async <T extends Row = Row>(\n    query: string,\n    params?: unknown[]\n  ): Promise<T[]> => {\n    const result = await transport.query<T>(query, params)\n    return result.rows\n  }\n\n  // Add transaction support\n  sql.begin = async <T>(\n    fn: (sql: PGLiteTransactionSql) => Promise<T>,\n    options?: TransactionOptions\n  ): Promise<T> => {\n    await pglite.waitReady\n\n    // Build BEGIN statement with options\n    const beginParts = ['BEGIN']\n    if (options?.isolationLevel) {\n      // Validate isolation level to prevent SQL injection\n      const validLevels = ['read uncommitted', 'read committed', 'repeatable read', 'serializable']\n      const normalized = options.isolationLevel.toLowerCase()\n      if (!validLevels.includes(normalized)) {\n        throw new Error(`Invalid isolation level: \"${options.isolationLevel}\"`)\n      }\n      beginParts.push(`ISOLATION LEVEL ${normalized.toUpperCase()}`)\n    }\n    if (options?.readOnly) {\n      beginParts.push('READ ONLY')\n    }\n    if (options?.deferrable) {\n      beginParts.push('DEFERRABLE')\n    }\n\n    await pglite.query(beginParts.join(' '))\n\n    const txSql = createTransactionSql(pglite)\n\n    try {\n      const result = await fn(txSql)\n      await pglite.query('COMMIT')\n      return result\n    } catch (error) {\n      await pglite.query('ROLLBACK')\n      throw error\n    }\n  }\n\n  // Add savepoint (throws since it's only valid in transactions)\n  sql.savepoint = async <T>(): Promise<T> => {\n    throw new Error('savepoint() can only be called within a transaction')\n  }\n\n  // Add end method\n  sql.end = async (): Promise<void> => {\n    await transport.close()\n  }\n\n  // Add options for Drizzle compatibility\n  sql.options = {\n    parsers: {},\n    serializers: {},\n  }\n\n  // Add reserve method (creates a new client)\n  sql.reserve = async (): Promise<PGLiteReservedSql> => {\n    const reserved = await createPGLiteSql(pglite)\n    ;(reserved as PGLiteReservedSql).release = async () => {\n      // No-op for PGLite since connections are not pooled\n    }\n    return reserved as PGLiteReservedSql\n  }\n\n  // Add transport for direct access\n  sql.transport = transport\n\n  // Add pglite for direct access\n  sql.pglite = pglite\n\n  return sql\n}\n\n/**\n * Create a transaction-scoped SQL function\n */\nfunction createTransactionSql(pglite: PGlite): PGLiteTransactionSql {\n  let savepointCounter = 0\n\n  const txSql = function <T extends Row = Row>(\n    strings: TemplateStringsArray,\n    ...values: unknown[]\n  ): Promise<T[]> {\n    const parts: string[] = []\n    for (let i = 0; i < strings.length; i++) {\n      const str = strings[i]\n      if (str !== undefined) {\n        parts.push(str)\n      }\n      if (i < values.length) {\n        parts.push(`$${i + 1}`)\n      }\n    }\n    const query = parts.join('')\n\n    return pglite.query<T>(query, values).then((result: { rows: T[] }) => result.rows)\n  } as PGLiteTransactionSql\n\n  txSql.unsafe = async <T extends Row = Row>(\n    query: string,\n    params?: unknown[]\n  ): Promise<T[]> => {\n    const result = await pglite.query<T>(query, params)\n    return result.rows\n  }\n\n  txSql.savepoint = async <T>(\n    fn: (sql: PGLiteTransactionSql) => Promise<T>\n  ): Promise<T> => {\n    const savepointName = `sp_${++savepointCounter}`\n    await pglite.query(`SAVEPOINT ${savepointName}`)\n\n    try {\n      const result = await fn(txSql)\n      await pglite.query(`RELEASE SAVEPOINT ${savepointName}`)\n      return result\n    } catch (error) {\n      await pglite.query(`ROLLBACK TO SAVEPOINT ${savepointName}`)\n      throw error\n    }\n  }\n\n  txSql.options = {\n    parsers: {},\n    serializers: {},\n  }\n\n  return txSql\n}\n\n/**\n * PGLite-backed SQL interface\n */\nexport interface PGLiteSql {\n  /**\n   * Execute a SQL query using tagged template literal\n   */\n  <T extends Row = Row>(\n    strings: TemplateStringsArray,\n    ...values: unknown[]\n  ): Promise<T[]>\n\n  /**\n   * Execute raw SQL\n   */\n  unsafe<T extends Row = Row>(query: string, params?: unknown[]): Promise<T[]>\n\n  /**\n   * Begin a transaction\n   */\n  begin<T>(\n    fn: (sql: PGLiteTransactionSql) => Promise<T>,\n    options?: TransactionOptions\n  ): Promise<T>\n\n  /**\n   * Create a savepoint (only valid in transactions)\n   */\n  savepoint<T>(fn: (sql: PGLiteTransactionSql) => Promise<T>): Promise<T>\n\n  /**\n   * End the connection\n   */\n  end(): Promise<void>\n\n  /**\n   * Reserve a connection\n   */\n  reserve(): Promise<PGLiteReservedSql>\n\n  /**\n   * Options for Drizzle compatibility\n   */\n  options: {\n    parsers: Record<number, (value: string) => unknown>\n    serializers: Record<number, (value: unknown) => string>\n  }\n\n  /**\n   * The underlying transport\n   */\n  transport: PGLiteTransport\n\n  /**\n   * The underlying PGLite instance\n   */\n  pglite: PGlite\n}\n\n/**\n * Transaction-scoped SQL interface\n */\nexport interface PGLiteTransactionSql {\n  /**\n   * Execute a SQL query using tagged template literal\n   */\n  <T extends Row = Row>(\n    strings: TemplateStringsArray,\n    ...values: unknown[]\n  ): Promise<T[]>\n\n  /**\n   * Execute raw SQL\n   */\n  unsafe<T extends Row = Row>(query: string, params?: unknown[]): Promise<T[]>\n\n  /**\n   * Create a savepoint within the transaction\n   */\n  savepoint<T>(fn: (sql: PGLiteTransactionSql) => Promise<T>): Promise<T>\n\n  /**\n   * Options for Drizzle compatibility\n   */\n  options: {\n    parsers: Record<number, (value: string) => unknown>\n    serializers: Record<number, (value: unknown) => string>\n  }\n}\n\n/**\n * Reserved connection SQL interface\n */\nexport interface PGLiteReservedSql extends PGLiteSql {\n  /**\n   * Release the reserved connection\n   */\n  release(): Promise<void>\n}\n","#!/usr/bin/env node\n/**\n * postgres.do CLI\n *\n * Comprehensive CLI for postgres.do database management including:\n * - Database creation and management\n * - Schema introspection, generation, diff, and sync\n * - Migration management (run, status, rollback, create)\n * - Backup and restore\n * - Logs viewing\n * - Interactive SQL shell\n *\n * @example\n * ```bash\n * # Database management\n * postgres.do create mydb\n * postgres.do list\n * postgres.do delete mydb --force\n *\n * # Backup and restore\n * postgres.do backup mydb -o backup.sql\n * postgres.do restore backup.sql --database mydb\n *\n * # View logs\n * postgres.do logs mydb --tail\n *\n * # Interactive shell\n * postgres.do shell mydb\n *\n * # Schema commands\n * postgres.do introspect --url postgres://... --output ./schema.ts\n * postgres.do schema:diff --from $LOCAL_URL --to $PROD_URL\n *\n * # Migration commands\n * postgres.do migrate --url $DATABASE_URL\n * postgres.do migrate:status --url $DATABASE_URL\n * ```\n *\n * @module cli\n */\n\nimport { Command } from 'commander'\nimport { writeFileSync, readFileSync, existsSync } from 'node:fs'\nimport { resolve, dirname } from 'node:path'\nimport { mkdirSync } from 'node:fs'\n\nimport {\n  generateSchemaFromDatabase,\n  generateSchemaFromTypeScript,\n  generateSchemaWithTypes,\n  type SchemaGeneratorOptions,\n} from '../drizzle/schema-generator.js'\nimport postgres from '../index.js'\nimport type { Sql } from '../types.js'\n\n// Import command implementations\nimport { runMigrate } from './commands/migrate.js'\nimport { runMigrateStatus } from './commands/migrate-status.js'\nimport { runMigrateRollback } from './commands/migrate-rollback.js'\nimport { runMigrateCreate } from './commands/migrate-create.js'\nimport { runMigrateValidate } from './commands/migrate-validate.js'\nimport { runMigrateDryRun } from './commands/migrate-dry-run.js'\nimport { runMigrateDashboard } from './commands/migrate-dashboard.js'\nimport {\n  runMigrateFromNeon,\n  runMigrateFromSupabase,\n  runMigrateValidateSchema,\n  runImportPgDump,\n  runQueryCompatibilityTest,\n} from './commands/migrate-from-external.js'\nimport { runSchemaDiff } from './commands/schema-diff.js'\nimport { runSchemaPull, runSchemaPush } from './commands/schema-sync.js'\nimport { runDev } from './commands/dev.js'\nimport { runDevReset } from './commands/dev-reset.js'\nimport { runCreate, runList, runInfo, runDelete } from './commands/create.js'\nimport { runBackup, runBackupList, runBackupDownload } from './commands/backup.js'\nimport { runRestore, runRestoreFromUrl, runRestoreFromDatabase } from './commands/restore.js'\nimport { runLogs, runLogStats } from './commands/logs.js'\nimport { runShell } from './commands/shell.js'\nimport { loginWithApiKey, logout, getCurrentUser, isLoggedIn as _isLoggedIn } from './cli-auth.js'\nimport { loadConfig, updateConfig, resetConfig } from './config.js'\nimport { printResult, printInfo, type OutputOptions, type OutputFormat } from './output.js'\n\n// Helper to build output options from global CLI options\nfunction buildOutputOptions(globalOpts: { apiUrl?: string; json?: boolean; verbose?: boolean; color?: boolean }): OutputOptions & { apiUrl?: string } {\n  return {\n    ...(globalOpts.json ? { format: 'json' as OutputFormat } : {}),\n    ...(globalOpts.verbose !== undefined ? { verbose: globalOpts.verbose } : {}),\n    ...(globalOpts.color === false ? { noColor: true } : {}),\n    ...(globalOpts.apiUrl ? { apiUrl: globalOpts.apiUrl } : {}),\n  }\n}\n\n// ============================================================================\n// CLI Setup with Commander\n// ============================================================================\n\nconst program = new Command()\n\nprogram\n  .name('postgres.do')\n  .description('PostgreSQL for Cloudflare Workers - Database management CLI')\n  .version('0.0.1')\n\n// ============================================================================\n// Global Options\n// ============================================================================\n\nprogram\n  .option('--api-url <url>', 'Override API URL')\n  .option('--json', 'Output in JSON format')\n  .option('--verbose', 'Enable verbose output')\n  .option('--no-color', 'Disable colored output')\n\n// ============================================================================\n// Database Commands\n// ============================================================================\n\nprogram\n  .command('create <name>')\n  .description('Create a new database')\n  .option('-r, --region <region>', 'Database region', 'auto')\n  .option('-p, --plan <plan>', 'Database plan (free, pro, enterprise)', 'free')\n  .option('--no-wait', 'Do not wait for database to be ready')\n  .option('-t, --timeout <ms>', 'Wait timeout in milliseconds', '60000')\n  .action(async (name, options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n    await runCreate({\n      name,\n      region: options.region,\n      plan: options.plan,\n      wait: options.wait,\n      timeout: parseInt(options.timeout, 10),\n      ...buildOutputOptions(globalOpts),\n    })\n  })\n\nprogram\n  .command('list')\n  .alias('ls')\n  .description('List all databases')\n  .action(async (_options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n    await runList(buildOutputOptions(globalOpts))\n  })\n\nprogram\n  .command('info <name>')\n  .description('Get database information')\n  .action(async (name, _options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n    await runInfo(name, buildOutputOptions(globalOpts))\n  })\n\nprogram\n  .command('delete <name>')\n  .alias('rm')\n  .description('Delete a database')\n  .option('-f, --force', 'Force deletion without confirmation')\n  .action(async (name, options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n    await runDelete(name, {\n      ...buildOutputOptions(globalOpts),\n      ...(options.force ? { force: options.force } : {}),\n    })\n  })\n\n// ============================================================================\n// Backup Commands\n// ============================================================================\n\nprogram\n  .command('backup <name>')\n  .description('Create a backup of a database')\n  .option('-o, --output <file>', 'Output file path')\n  .option('-b, --backup-format <format>', 'Backup format (sql, custom, tar)', 'sql')\n  .option('--schema-only', 'Backup schema only (no data)')\n  .option('--data-only', 'Backup data only (no schema)')\n  .option('--tables <tables>', 'Comma-separated list of tables to backup')\n  .option('--exclude-tables <tables>', 'Comma-separated list of tables to exclude')\n  .option('-c, --compress', 'Compress output')\n  .action(async (name, options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n    await runBackup({\n      name,\n      output: options.output,\n      backupFormat: options.backupFormat,\n      schemaOnly: options.schemaOnly,\n      dataOnly: options.dataOnly,\n      tables: options.tables,\n      excludeTables: options.excludeTables,\n      compress: options.compress,\n      apiUrl: globalOpts.apiUrl,\n      format: globalOpts.json ? 'json' : undefined,\n      verbose: globalOpts.verbose,\n      noColor: globalOpts.color === false,\n    })\n  })\n\nprogram\n  .command('backup:list <name>')\n  .description('List available backups for a database')\n  .action(async (name, _options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n    await runBackupList(name, buildOutputOptions(globalOpts))\n  })\n\nprogram\n  .command('backup:download <name> <backupId>')\n  .description('Download a specific backup')\n  .option('-o, --output <file>', 'Output file path')\n  .action(async (name, backupId, options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n    await runBackupDownload(name, backupId, {\n      output: options.output,\n      apiUrl: globalOpts.apiUrl,\n      format: globalOpts.json ? 'json' : undefined,\n      verbose: globalOpts.verbose,\n      noColor: globalOpts.color === false,\n    })\n  })\n\n// ============================================================================\n// Restore Commands\n// ============================================================================\n\nprogram\n  .command('restore <file>')\n  .description('Restore a database from a backup file')\n  .option('-d, --database <name>', 'Target database name')\n  .option('--clean', 'Drop existing objects before restore')\n  .option('--create', 'Create database before restore')\n  .option('--data-only', 'Restore data only (no schema)')\n  .option('--schema-only', 'Restore schema only (no data)')\n  .option('--tables <tables>', 'Comma-separated list of tables to restore')\n  .option('--ignore-errors', 'Continue on error')\n  .option('-j, --jobs <n>', 'Number of parallel jobs')\n  .action(async (file, options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n    await runRestore({\n      file,\n      database: options.database,\n      clean: options.clean,\n      create: options.create,\n      dataOnly: options.dataOnly,\n      schemaOnly: options.schemaOnly,\n      tables: options.tables,\n      ignoreErrors: options.ignoreErrors,\n      jobs: options.jobs ? parseInt(options.jobs, 10) : undefined,\n      apiUrl: globalOpts.apiUrl,\n      format: globalOpts.json ? 'json' : undefined,\n      verbose: globalOpts.verbose,\n      noColor: globalOpts.color === false,\n    })\n  })\n\nprogram\n  .command('restore:url <url>')\n  .description('Restore a database from a URL')\n  .requiredOption('-d, --database <name>', 'Target database name')\n  .option('--clean', 'Drop existing objects before restore')\n  .option('--create', 'Create database before restore')\n  .action(async (url, options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n    await runRestoreFromUrl(url, {\n      file: '',\n      database: options.database,\n      clean: options.clean,\n      create: options.create,\n      apiUrl: globalOpts.apiUrl,\n      format: globalOpts.json ? 'json' : undefined,\n      verbose: globalOpts.verbose,\n      noColor: globalOpts.color === false,\n    })\n  })\n\nprogram\n  .command('clone <source> <target>')\n  .description('Clone a database to a new database')\n  .option('--clean', 'Drop existing objects in target before cloning')\n  .action(async (source, target, options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n    await runRestoreFromDatabase(source, target, {\n      clean: options.clean,\n      apiUrl: globalOpts.apiUrl,\n      format: globalOpts.json ? 'json' : undefined,\n      verbose: globalOpts.verbose,\n      noColor: globalOpts.color === false,\n    })\n  })\n\n// ============================================================================\n// Logs Commands\n// ============================================================================\n\nprogram\n  .command('logs <name>')\n  .description('View database logs')\n  .option('-f, --tail', 'Follow logs in real-time')\n  .option('-n, --lines <n>', 'Number of lines to show', '100')\n  .option('--since <duration>', 'Show logs since (e.g., \"1h\", \"30m\", \"2024-01-15T10:00:00Z\")')\n  .option('--until <timestamp>', 'Show logs until timestamp')\n  .option('-l, --level <level>', 'Filter by log level (debug, info, warning, error)')\n  .option('-q, --query <query>', 'Filter by search query')\n  .option('--no-timestamps', 'Hide timestamps')\n  .action(async (name, options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n    await runLogs({\n      name,\n      tail: options.tail,\n      lines: parseInt(options.lines, 10),\n      since: options.since,\n      until: options.until,\n      level: options.level,\n      query: options.query,\n      timestamps: options.timestamps,\n      apiUrl: globalOpts.apiUrl,\n      format: globalOpts.json ? 'json' : undefined,\n      verbose: globalOpts.verbose,\n      noColor: globalOpts.color === false,\n    })\n  })\n\nprogram\n  .command('logs:stats <name>')\n  .description('View log statistics')\n  .option('--since <duration>', 'Stats since (e.g., \"1h\", \"24h\", \"7d\")')\n  .option('--until <timestamp>', 'Stats until timestamp')\n  .action(async (name, options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n    await runLogStats(name, {\n      since: options.since,\n      until: options.until,\n      apiUrl: globalOpts.apiUrl,\n      format: globalOpts.json ? 'json' : undefined,\n      verbose: globalOpts.verbose,\n      noColor: globalOpts.color === false,\n    })\n  })\n\n// ============================================================================\n// Shell Command\n// ============================================================================\n\nprogram\n  .command('shell <name>')\n  .alias('sql')\n  .description('Start interactive SQL REPL')\n  .option('-c, --command <sql>', 'Execute a single command and exit')\n  .option('-f, --file <file>', 'Execute commands from file')\n  .option('-t, --timing', 'Show query timing')\n  .option('-o, --output-format <format>', 'Output format (table, csv, json, aligned)', 'table')\n  .action(async (name, options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n    await runShell({\n      name,\n      command: options.command,\n      file: options.file,\n      timing: options.timing,\n      outputFormat: options.outputFormat,\n      apiUrl: globalOpts.apiUrl,\n      format: globalOpts.json ? 'json' : undefined,\n      verbose: globalOpts.verbose,\n      noColor: globalOpts.color === false,\n    })\n  })\n\n// ============================================================================\n// Dev Commands\n// ============================================================================\n\nprogram\n  .command('dev')\n  .description('Start local development server with PGLite')\n  .option('--migrations-dir <path>', 'Path to migrations directory', './migrations')\n  .option('--seeds-dir <path>', 'Path to seeds directory', './seeds')\n  .option('--data-dir <path>', 'Path to data directory', './.postgres.do')\n  .option('--persist', 'Enable persistent storage')\n  .option('--port <port>', 'Port number', '5432')\n  .option('--no-watch', 'Disable file watching')\n  .option('--wrangler', 'Enable wrangler integration')\n  .option('--seed', 'Run seeds after migrations')\n  .action(async (options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n    await runDev({\n      command: 'dev',\n      url: undefined,\n      help: undefined,\n      verbose: globalOpts.verbose,\n      json: globalOpts.json,\n      migrationsDir: options.migrationsDir,\n      seedsDir: options.seedsDir,\n      dataDir: options.dataDir,\n      persist: options.persist,\n      port: parseInt(options.port, 10),\n      watch: options.watch,\n      wrangler: options.wrangler,\n      seed: options.seed,\n    })\n  })\n\nprogram\n  .command('dev:reset')\n  .description('Reset local development database')\n  .option('--migrations-dir <path>', 'Path to migrations directory', './migrations')\n  .option('--seeds-dir <path>', 'Path to seeds directory', './seeds')\n  .option('--data-dir <path>', 'Path to data directory', './.postgres.do')\n  .option('--persist', 'Enable persistent storage')\n  .option('--seed', 'Run seeds after reset')\n  .option('--do <id>', 'Reset specific Durable Object')\n  .action(async (options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n    await runDevReset({\n      command: 'dev:reset',\n      url: undefined,\n      help: undefined,\n      verbose: globalOpts.verbose,\n      json: globalOpts.json,\n      migrationsDir: options.migrationsDir,\n      seedsDir: options.seedsDir,\n      dataDir: options.dataDir,\n      persist: options.persist,\n      seed: options.seed,\n      doId: options.do,\n    })\n  })\n\n// ============================================================================\n// Schema Commands\n// ============================================================================\n\nprogram\n  .command('introspect')\n  .description('Generate Drizzle schema from existing database')\n  .requiredOption('-u, --url <url>', 'Database connection URL')\n  .option('-o, --output <path>', 'Output file path', './schema.ts')\n  .option('-s, --schema <name>', 'Database schema to introspect', 'public')\n  .option('--include-relations', 'Include relation definitions')\n  .option('--include-indexes', 'Include index definitions')\n  .option('--include <tables>', 'Comma-separated list of tables to include')\n  .option('--exclude <tables>', 'Comma-separated list of tables to exclude')\n  .option('--types', 'Also generate TypeScript type definitions')\n  .action(async (options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n    await runIntrospect({\n      url: options.url,\n      output: options.output,\n      schema: options.schema,\n      includeRelations: options.includeRelations,\n      includeIndexes: options.includeIndexes,\n      includeTables: options.include?.split(','),\n      excludeTables: options.exclude?.split(','),\n      generateTypes: options.types,\n      verbose: globalOpts.verbose,\n      json: globalOpts.json,\n    })\n  })\n\nprogram\n  .command('generate')\n  .description('Generate Drizzle schema from TypeScript interfaces')\n  .requiredOption('-i, --input <path>', 'Input TypeScript file with interfaces')\n  .option('-o, --output <path>', 'Output file path', './schema.ts')\n  .option('-s, --schema <name>', 'Schema name to use', 'public')\n  .option('--include-relations', 'Include relation definitions')\n  .action(async (options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n    await runGenerate({\n      input: options.input,\n      output: options.output,\n      schema: options.schema,\n      includeRelations: options.includeRelations,\n      verbose: globalOpts.verbose,\n    })\n  })\n\nprogram\n  .command('schema:diff')\n  .description('Compare two database schemas')\n  .option('--from <url>', 'Source database URL')\n  .option('--to <url>', 'Target database URL')\n  .option('-s, --schema <name>', 'Database schema to compare', 'public')\n  .option('--include <tables>', 'Comma-separated list of tables to include')\n  .option('--exclude <tables>', 'Comma-separated list of tables to exclude')\n  .option('--include-indexes', 'Include index comparison')\n  .option('--ignore-case', 'Ignore case differences in names')\n  .option('--generate-migration', 'Generate migration from diff')\n  .option('--migration-name <name>', 'Name for generated migration')\n  .option('--migrations-dir <path>', 'Migrations directory', './migrations')\n  .option('--format <type>', 'Migration format (ts, sql)', 'ts')\n  .option('--safe', 'Use IF EXISTS/IF NOT EXISTS in SQL')\n  .option('--exit-code', 'Exit with code 1 if schemas differ')\n  .action(async (options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n    await runSchemaDiff({\n      command: 'schema:diff',\n      url: undefined,\n      help: undefined,\n      verbose: globalOpts.verbose,\n      json: globalOpts.json,\n      from: options.from,\n      to: options.to,\n      schema: options.schema,\n      includeTables: options.include?.split(','),\n      excludeTables: options.exclude?.split(','),\n      includeIndexes: options.includeIndexes,\n      ignoreCase: options.ignoreCase,\n      generateMigration: options.generateMigration,\n      migrationName: options.migrationName,\n      migrationsDir: options.migrationsDir,\n      migrationFormat: options.format,\n      safeMode: options.safe,\n      exitCode: options.exitCode,\n    })\n  })\n\nprogram\n  .command('schema:pull')\n  .description('Pull schema from database to local file')\n  .option('-u, --url <url>', 'Database URL')\n  .option('-o, --output <path>', 'Output file path', './schema.ts')\n  .option('-s, --schema <name>', 'Database schema', 'public')\n  .option('--include <tables>', 'Comma-separated list of tables to include')\n  .option('--exclude <tables>', 'Comma-separated list of tables to exclude')\n  .option('--include-relations', 'Include relation definitions')\n  .option('--include-indexes', 'Include index definitions')\n  .option('--types', 'Also generate TypeScript type definitions')\n  .action(async (options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n    await runSchemaPull({\n      command: 'schema:pull',\n      url: options.url,\n      help: undefined,\n      verbose: globalOpts.verbose,\n      json: globalOpts.json,\n      output: options.output,\n      schema: options.schema,\n      includeTables: options.include?.split(','),\n      excludeTables: options.exclude?.split(','),\n      includeRelations: options.includeRelations,\n      includeIndexes: options.includeIndexes,\n      generateTypes: options.types,\n    })\n  })\n\nprogram\n  .command('schema:push')\n  .description('Push local schema to database')\n  .option('-u, --url <url>', 'Database URL')\n  .requiredOption('-i, --input <path>', 'Input Drizzle schema file')\n  .option('-s, --schema <name>', 'Database schema', 'public')\n  .option('--include <tables>', 'Comma-separated list of tables to include')\n  .option('--exclude <tables>', 'Comma-separated list of tables to exclude')\n  .option('--dry-run', 'Preview changes without applying')\n  .option('-f, --force', 'Force push even with destructive changes')\n  .action(async (options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n    await runSchemaPush({\n      command: 'schema:push',\n      url: options.url,\n      help: undefined,\n      verbose: globalOpts.verbose,\n      json: globalOpts.json,\n      input: options.input,\n      schema: options.schema,\n      includeTables: options.include?.split(','),\n      excludeTables: options.exclude?.split(','),\n      dryRun: options.dryRun,\n      force: options.force,\n    })\n  })\n\n// ============================================================================\n// Migration Commands\n// ============================================================================\n\nprogram\n  .command('migrate')\n  .description('Run pending migrations')\n  .option('-u, --url <url>', 'Database connection URL')\n  .option('--migrations-dir <path>', 'Path to migrations directory', './migrations')\n  .action(async (options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n    await runMigrate({\n      command: 'migrate',\n      url: options.url,\n      help: undefined,\n      verbose: globalOpts.verbose,\n      json: globalOpts.json,\n      migrationsDir: options.migrationsDir,\n    })\n  })\n\nprogram\n  .command('migrate:status')\n  .description('Show current migration status')\n  .option('-u, --url <url>', 'Database connection URL')\n  .option('--migrations-dir <path>', 'Path to migrations directory', './migrations')\n  .action(async (options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n    await runMigrateStatus({\n      command: 'migrate:status',\n      url: options.url,\n      help: undefined,\n      verbose: globalOpts.verbose,\n      json: globalOpts.json,\n      migrationsDir: options.migrationsDir,\n    })\n  })\n\nprogram\n  .command('migrate:rollback')\n  .description('Rollback migrations')\n  .option('-u, --url <url>', 'Database connection URL')\n  .option('--migrations-dir <path>', 'Path to migrations directory', './migrations')\n  .option('--to <version>', 'Target version to rollback to')\n  .option('-n, --steps <n>', 'Number of migrations to rollback', '1')\n  .option('--dry-run', 'Preview rollback without making changes')\n  .option('-f, --force', 'Force rollback of non-reversible migrations')\n  .action(async (options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n    await runMigrateRollback({\n      command: 'migrate:rollback',\n      url: options.url,\n      help: undefined,\n      verbose: globalOpts.verbose,\n      json: globalOpts.json,\n      migrationsDir: options.migrationsDir,\n      toVersion: options.to ? parseInt(options.to, 10) : undefined,\n      steps: parseInt(options.steps, 10),\n      dryRun: options.dryRun,\n      force: options.force,\n    })\n  })\n\nprogram\n  .command('migrate:create <name>')\n  .description('Create a new migration file')\n  .option('--migrations-dir <path>', 'Path to migrations directory', './migrations')\n  .option('--format <type>', 'Migration format (ts, sql)', 'ts')\n  .action(async (name, options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n    await runMigrateCreate({\n      command: 'migrate:create',\n      url: undefined,\n      help: undefined,\n      verbose: globalOpts.verbose,\n      json: globalOpts.json,\n      migrationsDir: options.migrationsDir,\n      name,\n      migrationFormat: options.format,\n    })\n  })\n\nprogram\n  .command('migrate:validate')\n  .description('Validate migrations before deployment')\n  .option('-u, --url <url>', 'Database connection URL for syntax checking')\n  .option('--migrations-dir <path>', 'Path to migrations directory', './migrations')\n  .action(async (options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n    await runMigrateValidate({\n      command: 'migrate:validate',\n      url: options.url,\n      help: undefined,\n      verbose: globalOpts.verbose,\n      json: globalOpts.json,\n      migrationsDir: options.migrationsDir,\n    })\n  })\n\nprogram\n  .command('migrate:dry-run')\n  .description('Preview migrations without running them')\n  .option('-u, --url <url>', 'Database connection URL')\n  .option('--migrations-dir <path>', 'Path to migrations directory', './migrations')\n  .action(async (options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n    await runMigrateDryRun({\n      command: 'migrate:dry-run',\n      url: options.url,\n      help: undefined,\n      verbose: globalOpts.verbose,\n      json: globalOpts.json,\n      migrationsDir: options.migrationsDir,\n    })\n  })\n\nprogram\n  .command('migrate:dashboard')\n  .description('View migration progress dashboard across all DOs')\n  .option('--api-url <url>', 'API URL for postgres.do')\n  .option('-k, --api-key <key>', 'API key for authentication')\n  .option('-w, --watch', 'Watch mode - continuously refresh dashboard')\n  .option('--refresh <ms>', 'Refresh interval in milliseconds for watch mode', '5000')\n  .option('--version <n>', 'Show DOs at specific schema version')\n  .option('--failed', 'Show failed migrations')\n  .option('--operations', 'List all migration operations')\n  .option('--operation <id>', 'Show specific operation details')\n  .option('--retry <id>', 'Retry failed migrations for an operation')\n  .option('-l, --limit <n>', 'Limit number of results', '100')\n  .action(async (options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n    await runMigrateDashboard({\n      command: 'migrate:dashboard',\n      url: undefined,\n      help: undefined,\n      verbose: globalOpts.verbose,\n      json: globalOpts.json,\n      apiUrl: options.apiUrl || globalOpts.apiUrl,\n      apiKey: options.apiKey,\n      watch: options.watch,\n      refreshInterval: options.refresh ? parseInt(options.refresh, 10) : undefined,\n      showVersion: options.version ? parseInt(options.version, 10) : undefined,\n      showFailed: options.failed,\n      listOperations: options.operations,\n      operationId: options.operation,\n      retry: options.retry,\n      limit: options.limit ? parseInt(options.limit, 10) : undefined,\n    })\n  })\n\n// ============================================================================\n// External Migration Commands (Neon/Supabase)\n// ============================================================================\n\nprogram\n  .command('migrate:from-neon')\n  .description('Migrate from Neon to postgres.do (PGLite)')\n  .requiredOption('-c, --connection-string <url>', 'Neon connection string')\n  .option('-o, --output-dir <path>', 'Output directory for migration files', './migration-output')\n  .option('--include-data', 'Include data migration')\n  .option('--tables <tables>', 'Comma-separated list of tables to migrate')\n  .option('--exclude-tables <tables>', 'Comma-separated list of tables to exclude')\n  .option('--batch-size <n>', 'Batch size for data migration', '1000')\n  .option('--validate', 'Validate schema compatibility before migration')\n  .option('--dry-run', 'Preview migration without writing files')\n  .option('--validate-integrity', 'Validate data integrity after migration')\n  .action(async (options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n    const opts: Parameters<typeof runMigrateFromNeon>[0] = {\n      connectionString: options.connectionString,\n      outputDir: options.outputDir,\n      includeData: options.includeData,\n      validate: options.validate,\n      dryRun: options.dryRun,\n      validateIntegrity: options.validateIntegrity,\n      json: globalOpts.json,\n      verbose: globalOpts.verbose,\n    }\n    if (options.tables) {\n      opts.tables = options.tables.split(',')\n    }\n    if (options.excludeTables) {\n      opts.excludeTables = options.excludeTables.split(',')\n    }\n    if (options.batchSize) {\n      opts.batchSize = parseInt(options.batchSize, 10)\n    }\n    await runMigrateFromNeon(opts)\n  })\n\nprogram\n  .command('migrate:from-supabase')\n  .description('Migrate from Supabase to postgres.do (PGLite)')\n  .requiredOption('-c, --connection-string <url>', 'Supabase connection string')\n  .option('-o, --output-dir <path>', 'Output directory for migration files', './migration-output')\n  .option('--include-data', 'Include data migration')\n  .option('--tables <tables>', 'Comma-separated list of tables to migrate')\n  .option('--exclude-tables <tables>', 'Comma-separated list of tables to exclude (default: Supabase internal tables)')\n  .option('--batch-size <n>', 'Batch size for data migration', '1000')\n  .option('--validate', 'Validate schema compatibility before migration')\n  .option('--dry-run', 'Preview migration without writing files')\n  .option('--validate-integrity', 'Validate data integrity after migration')\n  .action(async (options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n    const opts: Parameters<typeof runMigrateFromSupabase>[0] = {\n      connectionString: options.connectionString,\n      outputDir: options.outputDir,\n      includeData: options.includeData,\n      validate: options.validate,\n      dryRun: options.dryRun,\n      validateIntegrity: options.validateIntegrity,\n      json: globalOpts.json,\n      verbose: globalOpts.verbose,\n    }\n    if (options.tables) {\n      opts.tables = options.tables.split(',')\n    }\n    if (options.excludeTables) {\n      opts.excludeTables = options.excludeTables.split(',')\n    }\n    if (options.batchSize) {\n      opts.batchSize = parseInt(options.batchSize, 10)\n    }\n    await runMigrateFromSupabase(opts)\n  })\n\nprogram\n  .command('migrate:validate-schema')\n  .description('Validate schema compatibility with PGLite')\n  .requiredOption('-c, --connection-string <url>', 'Database connection string')\n  .option('--strict', 'Treat warnings as errors')\n  .action(async (options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n    await runMigrateValidateSchema({\n      connectionString: options.connectionString,\n      strict: options.strict,\n      json: globalOpts.json,\n      verbose: globalOpts.verbose,\n    })\n  })\n\nprogram\n  .command('migrate:import-dump')\n  .description('Import a pg_dump file and transform for PGLite')\n  .requiredOption('-f, --file <path>', 'Path to the pg_dump SQL file')\n  .option('-o, --output-dir <path>', 'Output directory for transformed files', './migration-output')\n  .option('--validate', 'Validate schema compatibility')\n  .option('--dry-run', 'Preview without writing files')\n  .action(async (options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n    await runImportPgDump({\n      file: options.file,\n      outputDir: options.outputDir,\n      validate: options.validate,\n      dryRun: options.dryRun,\n      json: globalOpts.json,\n      verbose: globalOpts.verbose,\n    })\n  })\n\nprogram\n  .command('migrate:test-queries')\n  .description('Test query compatibility with PGLite')\n  .option('-f, --queries-file <path>', 'Path to file containing queries')\n  .option('-q, --query <queries...>', 'Individual queries to test')\n  .action(async (options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n    await runQueryCompatibilityTest({\n      queriesFile: options.queriesFile,\n      queries: options.query,\n      json: globalOpts.json,\n      verbose: globalOpts.verbose,\n    })\n  })\n\n// ============================================================================\n// Auth Commands\n// ============================================================================\n\nprogram\n  .command('login')\n  .description('Login to postgres.do')\n  .option('-k, --api-key <key>', 'API key to use for authentication')\n  .action(async (options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n\n    if (options.apiKey) {\n      const result = await loginWithApiKey(options.apiKey, globalOpts.apiUrl)\n      if (result.success) {\n        printInfo(`Logged in successfully as ${result.user?.email || 'user'}`, {\n          format: globalOpts.json ? 'json' : undefined,\n        })\n      } else {\n        printResult({ success: false, error: result.error }, {\n          format: globalOpts.json ? 'json' : undefined,\n        })\n        process.exit(1)\n      }\n    } else {\n      console.log('Interactive login not yet implemented.')\n      console.log('Please use: postgres.do login --api-key <your-api-key>')\n      console.log('Or set POSTGRES_DO_API_KEY environment variable')\n      process.exit(1)\n    }\n  })\n\nprogram\n  .command('logout')\n  .description('Logout from postgres.do')\n  .action(async (_options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n    logout(globalOpts.apiUrl)\n    printInfo('Logged out successfully', buildOutputOptions(globalOpts))\n  })\n\nprogram\n  .command('whoami')\n  .description('Show current logged in user')\n  .action(async (_options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n\n    const user = await getCurrentUser(globalOpts.apiUrl)\n    if (user) {\n      printResult({\n        success: true,\n        data: user,\n      }, buildOutputOptions(globalOpts))\n    } else {\n      printResult({\n        success: false,\n        error: 'Not logged in',\n      }, buildOutputOptions(globalOpts))\n      process.exit(1)\n    }\n  })\n\n// ============================================================================\n// Config Commands\n// ============================================================================\n\nprogram\n  .command('config')\n  .description('View or update CLI configuration')\n  .option('--get <key>', 'Get a configuration value')\n  .option('--set <key=value>', 'Set a configuration value')\n  .option('--reset', 'Reset configuration to defaults')\n  .action(async (options, cmd) => {\n    const globalOpts = cmd.optsWithGlobals()\n\n    if (options.reset) {\n      resetConfig()\n      printInfo('Configuration reset to defaults', {\n        format: globalOpts.json ? 'json' : undefined,\n      })\n    } else if (options.get) {\n      const config = loadConfig()\n      const value = (config as Record<string, unknown>)[options.get]\n      if (globalOpts.json) {\n        console.log(JSON.stringify({ [options.get]: value }))\n      } else {\n        console.log(value !== undefined ? value : '(not set)')\n      }\n    } else if (options.set) {\n      const [key, ...valueParts] = options.set.split('=')\n      const value = valueParts.join('=')\n      updateConfig({ [key]: value } as Record<string, unknown>)\n      printInfo(`Set ${key} = ${value}`, {\n        format: globalOpts.json ? 'json' : undefined,\n      })\n    } else {\n      const config = loadConfig()\n      printResult({\n        success: true,\n        data: config,\n      }, {\n        format: globalOpts.json ? 'json' : undefined,\n      })\n    }\n  })\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction ensureDirectoryExists(filePath: string): void {\n  const dir = dirname(filePath)\n  if (!existsSync(dir)) {\n    mkdirSync(dir, { recursive: true })\n  }\n}\n\ninterface IntrospectOptions {\n  url: string\n  output: string\n  schema: string\n  includeRelations?: boolean\n  includeIndexes?: boolean\n  includeTables?: string[]\n  excludeTables?: string[]\n  generateTypes?: boolean\n  verbose?: boolean\n  json?: boolean\n}\n\nasync function runIntrospect(options: IntrospectOptions): Promise<void> {\n  const url = options.url || process.env['DATABASE_URL']\n\n  if (!url) {\n    console.error('Error: Database URL is required')\n    console.error('Provide --url or set DATABASE_URL environment variable')\n    process.exit(1)\n  }\n\n  const outputPath = resolve(process.cwd(), options.output || './schema.ts')\n\n  console.log('Connecting to database...')\n\n  const sql: Sql = postgres(url)\n\n  try {\n    const generatorOptions: SchemaGeneratorOptions = {}\n    if (options.schema !== undefined) generatorOptions.schema = options.schema\n    if (options.includeRelations !== undefined) generatorOptions.includeRelations = options.includeRelations\n    if (options.includeIndexes !== undefined) generatorOptions.includeIndexes = options.includeIndexes\n    if (options.includeTables !== undefined) generatorOptions.includeTables = options.includeTables\n    if (options.excludeTables !== undefined) generatorOptions.excludeTables = options.excludeTables\n\n    console.log(`Introspecting schema '${options.schema || 'public'}'...`)\n\n    if (options.generateTypes) {\n      const { schema, types } = await generateSchemaWithTypes(sql, generatorOptions)\n\n      ensureDirectoryExists(outputPath)\n      writeFileSync(outputPath, schema)\n      console.log(`Schema written to: ${outputPath}`)\n\n      const typesPath = outputPath.replace(/\\.ts$/, '.types.ts')\n      writeFileSync(typesPath, types)\n      console.log(`Types written to: ${typesPath}`)\n    } else {\n      const schema = await generateSchemaFromDatabase(sql, generatorOptions)\n\n      ensureDirectoryExists(outputPath)\n      writeFileSync(outputPath, schema)\n      console.log(`Schema written to: ${outputPath}`)\n    }\n\n    console.log('Done!')\n  } finally {\n    await sql.end()\n  }\n}\n\ninterface GenerateOptions {\n  input: string\n  output: string\n  schema: string\n  includeRelations?: boolean\n  verbose?: boolean\n}\n\nasync function runGenerate(options: GenerateOptions): Promise<void> {\n  if (!options.input) {\n    console.error('Error: Input file is required')\n    console.error('Provide --input with path to TypeScript file')\n    process.exit(1)\n  }\n\n  const inputPath = resolve(process.cwd(), options.input)\n  const outputPath = resolve(process.cwd(), options.output || './schema.ts')\n\n  if (!existsSync(inputPath)) {\n    console.error(`Error: Input file not found: ${inputPath}`)\n    process.exit(1)\n  }\n\n  console.log(`Reading types from: ${inputPath}`)\n\n  const source = readFileSync(inputPath, 'utf-8')\n\n  const generatorOptions: SchemaGeneratorOptions = {}\n  if (options.schema !== undefined) generatorOptions.schema = options.schema\n  if (options.includeRelations !== undefined) generatorOptions.includeRelations = options.includeRelations\n\n  console.log('Generating Drizzle schema...')\n\n  const schema = generateSchemaFromTypeScript(source, generatorOptions)\n\n  ensureDirectoryExists(outputPath)\n  writeFileSync(outputPath, schema)\n\n  console.log(`Schema written to: ${outputPath}`)\n  console.log('Done!')\n}\n\n// ============================================================================\n// Main\n// ============================================================================\n\nprogram.parse()\n\n// Export for programmatic use\nexport { program }\nexport { runMigrate, runMigrateStatus, runMigrateRollback, runMigrateCreate, runMigrateValidate, runMigrateDryRun, runMigrateDashboard }\nexport { runMigrateFromNeon, runMigrateFromSupabase, runMigrateValidateSchema, runImportPgDump, runQueryCompatibilityTest }\nexport { runSchemaDiff, runSchemaPull, runSchemaPush }\nexport { runDev, runDevReset }\nexport { runCreate, runList, runInfo, runDelete }\nexport { runBackup, runBackupList, runBackupDownload }\nexport { runRestore, runRestoreFromUrl, runRestoreFromDatabase }\nexport { runLogs, runLogStats }\nexport { runShell }\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 * Migrate Command\n *\n * Run pending migrations against a database.\n *\n * @module cli/commands/migrate\n */\n\nimport { resolve } from 'node:path'\nimport { existsSync } from 'node:fs'\nimport type { MigrateCLIOptions } from '../types.js'\nimport { formatSuccess, formatError, formatInfo, formatMigrationResult, formatDuration } from '../formatting.js'\nimport { loadMigrationsFromDirectory, createQueryExecutor } from '../utils.js'\n\n/**\n * Run migrations command\n */\nexport async function runMigrate(options: MigrateCLIOptions): Promise<void> {\n  const url = options.url || process.env['DATABASE_URL']\n\n  if (!url) {\n    console.error(formatError('Database URL is required'))\n    console.error(formatInfo('Provide --url or set DATABASE_URL environment variable'))\n    process.exit(1)\n  }\n\n  // Load migrations from directory\n  const migrationsDir = resolve(process.cwd(), options.migrationsDir || './migrations')\n\n  if (!existsSync(migrationsDir)) {\n    console.error(formatError(`Migrations directory not found: ${migrationsDir}`))\n    console.error(formatInfo('Create a migrations directory or specify one with --migrations-dir'))\n    process.exit(1)\n  }\n\n  console.log(formatInfo(`Loading migrations from: ${migrationsDir}`))\n\n  try {\n    const migrations = loadMigrationsFromDirectory(migrationsDir)\n\n    if (migrations.length === 0) {\n      console.log(formatInfo('No migrations found'))\n      return\n    }\n\n    console.log(formatInfo(`Found ${migrations.length} migration(s)`))\n\n    // Import migration system dynamically to avoid bundling issues\n    const { createMigrationRegistry, createMigrationRunner } = await import('@dotdo/postgres/migrations')\n\n    // Create registry - cast MigrationDefinition to Migration (structurally compatible)\n    const registry = createMigrationRegistry({ migrations: migrations as import('@dotdo/postgres/migrations').Migration[] })\n\n    // Connect to database\n    console.log(formatInfo('Connecting to database...'))\n    const executor = await createQueryExecutor(url)\n\n    // Create runner with progress callback - use conditional spreading for optional properties\n    const runner = createMigrationRunner(executor, registry, {\n      ...(options.verbose ? { debug: options.verbose } : {}),\n      onProgress: (event) => {\n        if (options.verbose || event.phase === 'completed' || event.phase === 'failed') {\n          // Adapt MigrationProgressEvent to MigrationProgressDisplay\n          const displayEvent = {\n            migration: event.migration,\n            index: event.index,\n            total: event.total,\n            phase: event.phase,\n            ...(event.durationMs !== undefined && { durationMs: event.durationMs }),\n            ...(event.error !== undefined && { error: event.error }),\n          }\n          console.log(formatMigrationResult(displayEvent))\n        }\n      },\n    })\n\n    // Run migrations\n    console.log(formatInfo('Running migrations...'))\n    const startTime = Date.now()\n    const result = await runner.migrate()\n    const duration = Date.now() - startTime\n\n    // Output result\n    if (options.json) {\n      console.log(JSON.stringify(result, null, 2))\n    } else {\n      console.log('')\n      if (result.success) {\n        if (result.migrationsRun === 0) {\n          console.log(formatSuccess('Database is up to date'))\n        } else {\n          console.log(formatSuccess(`Successfully ran ${result.migrationsRun} migration(s) in ${formatDuration(duration)}`))\n        }\n        console.log(formatInfo(`Schema version: ${result.fromVersion} -> ${result.toVersion}`))\n      } else {\n        console.error(formatError('Migration failed'))\n        const failedResult = result.results.find((r) => !r.success)\n        if (failedResult) {\n          console.error(formatError(`Failed on: ${failedResult.id}`))\n          console.error(formatError(`Error: ${failedResult.error}`))\n        }\n        process.exit(1)\n      }\n    }\n\n    // Cleanup\n    if ('end' in executor && typeof executor.end === 'function') {\n      await executor.end()\n    }\n  } catch (error) {\n    console.error(formatError('Migration error:'), error instanceof Error ? error.message : error)\n    if (options.verbose && error instanceof Error && error.stack) {\n      console.error(error.stack)\n    }\n    process.exit(1)\n  }\n}\n","/**\n * CLI Formatting Utilities\n *\n * Terminal formatting and styling for CLI output.\n *\n * @module cli/formatting\n */\n\nimport type { MigrationProgressDisplay, RollbackProgressDisplay } from './types.js'\n\n// ============================================================================\n// ANSI Color Codes\n// ============================================================================\n\nconst colors = {\n  reset: '\\x1b[0m',\n  bold: '\\x1b[1m',\n  dim: '\\x1b[2m',\n\n  // Foreground colors\n  red: '\\x1b[31m',\n  green: '\\x1b[32m',\n  yellow: '\\x1b[33m',\n  blue: '\\x1b[34m',\n  magenta: '\\x1b[35m',\n  cyan: '\\x1b[36m',\n  white: '\\x1b[37m',\n  gray: '\\x1b[90m',\n}\n\n// Check if colors should be used\nconst supportsColor = process.stdout.isTTY && !process.env['NO_COLOR']\n\nfunction colorize(text: string, color: keyof typeof colors): string {\n  if (!supportsColor) {\n    return text\n  }\n  return `${colors[color]}${text}${colors.reset}`\n}\n\n// ============================================================================\n// Status Formatting\n// ============================================================================\n\n/**\n * Format a success message\n */\nexport function formatSuccess(message: string): string {\n  return colorize(`✓ ${message}`, 'green')\n}\n\n/**\n * Format an error message\n */\nexport function formatError(message: string): string {\n  return colorize(`✗ ${message}`, 'red')\n}\n\n/**\n * Format a warning message\n */\nexport function formatWarning(message: string): string {\n  return colorize(`! ${message}`, 'yellow')\n}\n\n/**\n * Format an info message\n */\nexport function formatInfo(message: string): string {\n  return colorize(`→ ${message}`, 'blue')\n}\n\n/**\n * Format a dim/secondary message\n */\nexport function formatDim(message: string): string {\n  return colorize(message, 'gray')\n}\n\n/**\n * Format a progress/step message\n */\nexport function formatProgress(message: string): string {\n  return colorize(`  ${message}`, 'cyan')\n}\n\n// ============================================================================\n// Progress Formatting\n// ============================================================================\n\n/**\n * Format a migration progress event\n */\nexport function formatMigrationResult(event: MigrationProgressDisplay): string {\n  const { migration, index, total, phase, durationMs, error } = event\n  const progress = `[${index + 1}/${total}]`\n  const version = `v${migration.version}`\n\n  switch (phase) {\n    case 'starting':\n      return `${formatDim(progress)} ${formatInfo(`Starting migration ${version}: ${migration.name}`)}`\n    case 'executing':\n      return `${formatDim(progress)} ${formatDim(`Executing ${version}...`)}`\n    case 'completed':\n      const time = durationMs ? ` (${formatDuration(durationMs)})` : ''\n      return `${formatDim(progress)} ${formatSuccess(`Applied ${version}: ${migration.name}${time}`)}`\n    case 'failed':\n      return `${formatDim(progress)} ${formatError(`Failed ${version}: ${migration.name}`)}${error ? `\\n    ${formatError(error)}` : ''}`\n    case 'skipped':\n      return `${formatDim(progress)} ${formatDim(`Skipped ${version}: ${migration.name} (already applied)`)}`\n    default:\n      return `${formatDim(progress)} ${migration.id}`\n  }\n}\n\n/**\n * Format a rollback progress event\n */\nexport function formatRollbackResult(event: RollbackProgressDisplay): string {\n  const { migration, index, total, phase, durationMs, error, isDryRun } = event\n  const progress = `[${index + 1}/${total}]`\n  const version = `v${migration.version}`\n  const dryRunLabel = isDryRun ? ' (dry run)' : ''\n\n  switch (phase) {\n    case 'starting':\n      return `${formatDim(progress)} ${formatInfo(`Rolling back ${version}: ${migration.name}${dryRunLabel}`)}`\n    case 'executing':\n      return `${formatDim(progress)} ${formatDim(`Executing rollback ${version}...`)}`\n    case 'completed':\n      const time = durationMs ? ` (${formatDuration(durationMs)})` : ''\n      return `${formatDim(progress)} ${formatSuccess(`Rolled back ${version}: ${migration.name}${time}${dryRunLabel}`)}`\n    case 'failed':\n      return `${formatDim(progress)} ${formatError(`Rollback failed ${version}: ${migration.name}`)}${error ? `\\n    ${formatError(error)}` : ''}`\n    case 'skipped':\n      return `${formatDim(progress)} ${formatDim(`Skipped ${version}: ${migration.name} (not applied or non-reversible)`)}`\n    default:\n      return `${formatDim(progress)} ${migration.id}`\n  }\n}\n\n// ============================================================================\n// Duration Formatting\n// ============================================================================\n\n/**\n * Format a duration in milliseconds to a human-readable string\n */\nexport function formatDuration(ms: number): string {\n  if (ms < 1000) {\n    return `${ms}ms`\n  }\n  if (ms < 60000) {\n    return `${(ms / 1000).toFixed(2)}s`\n  }\n  const minutes = Math.floor(ms / 60000)\n  const seconds = ((ms % 60000) / 1000).toFixed(0)\n  return `${minutes}m ${seconds}s`\n}\n\n// ============================================================================\n// Table Formatting\n// ============================================================================\n\n/**\n * Format data as a simple ASCII table\n */\nexport function formatTable(headers: string[], rows: string[][]): string {\n  // Calculate column widths\n  const widths = headers.map((h, i) => {\n    const maxRowWidth = Math.max(...rows.map((r) => (r[i] || '').length))\n    return Math.max(h.length, maxRowWidth)\n  })\n\n  // Format header\n  const headerRow = headers.map((h, i) => h.padEnd(widths[i] || 0)).join(' | ')\n  const separator = widths.map((w) => '-'.repeat(w)).join('-+-')\n\n  // Format rows\n  const dataRows = rows.map((row) =>\n    row.map((cell, i) => (cell || '').padEnd(widths[i] || 0)).join(' | ')\n  )\n\n  return [headerRow, separator, ...dataRows].join('\\n')\n}\n\n// ============================================================================\n// Spinner (Simple)\n// ============================================================================\n\nconst spinnerFrames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']\n\n/**\n * Create a simple spinner\n */\nexport function createSpinner(message: string) {\n  let frame = 0\n  let intervalId: NodeJS.Timeout | null = null\n\n  return {\n    start() {\n      if (!supportsColor) {\n        console.log(message)\n        return\n      }\n      intervalId = setInterval(() => {\n        process.stdout.write(`\\r${colorize(spinnerFrames[frame] || '⠋', 'cyan')} ${message}`)\n        frame = (frame + 1) % spinnerFrames.length\n      }, 80)\n    },\n    stop(finalMessage?: string) {\n      if (intervalId) {\n        clearInterval(intervalId)\n        process.stdout.write('\\r' + ' '.repeat(message.length + 3) + '\\r')\n        if (finalMessage) {\n          console.log(finalMessage)\n        }\n      }\n    },\n    succeed(msg?: string) {\n      this.stop(formatSuccess(msg || message))\n    },\n    fail(msg?: string) {\n      this.stop(formatError(msg || message))\n    },\n  }\n}\n\n// ============================================================================\n// Progress Bar\n// ============================================================================\n\n/**\n * Create a simple progress bar\n */\nexport function formatProgressBar(current: number, total: number, width = 30): string {\n  const percent = Math.round((current / total) * 100)\n  const filled = Math.round((current / total) * width)\n  const empty = width - filled\n\n  const bar = `[${'█'.repeat(filled)}${'░'.repeat(empty)}]`\n  return `${bar} ${percent}%`\n}\n","/**\n * CLI Utilities\n *\n * Helper functions for the postgres.do CLI.\n *\n * @module cli/utils\n */\n\nimport { join, extname } from 'node:path'\nimport { existsSync, readFileSync, readdirSync, statSync } from 'node:fs'\n\n/**\n * Migration definition (simplified for loading)\n */\nexport interface MigrationDefinition {\n  id: string\n  name: string\n  version: number\n  up: string\n  down?: string | undefined\n  isReversible?: boolean | undefined\n  tags?: string[] | undefined\n  transactional?: boolean | undefined\n  timeoutMs?: number | undefined\n}\n\n/**\n * Query executor interface\n */\nexport interface QueryExecutor {\n  query<T = unknown>(\n    sql: string,\n    params?: unknown[]\n  ): Promise<{\n    rows: T[]\n    fields: { name: string; dataTypeID: number }[]\n    affectedRows?: number\n  }>\n  end?: () => Promise<void>\n}\n\n/**\n * Load migrations from a directory\n *\n * Supports multiple formats:\n * - TypeScript files (*.ts) exporting a Migration object\n * - JavaScript files (*.js) exporting a Migration object\n * - SQL directories with up.sql/down.sql files\n *\n * @param dir Path to migrations directory\n * @returns Array of migrations sorted by version\n */\nexport function loadMigrationsFromDirectory(dir: string): MigrationDefinition[] {\n  const migrations: MigrationDefinition[] = []\n  const entries = readdirSync(dir)\n\n  for (const entry of entries) {\n    const entryPath = join(dir, entry)\n    const stat = statSync(entryPath)\n\n    // Skip hidden files and non-migration files\n    if (entry.startsWith('.') || entry.startsWith('_')) {\n      continue\n    }\n\n    if (stat.isDirectory()) {\n      // SQL-style migration directory\n      const upPath = join(entryPath, 'up.sql')\n      const downPath = join(entryPath, 'down.sql')\n\n      if (existsSync(upPath)) {\n        const migration = loadSqlMigration(entry, entryPath, upPath, downPath)\n        if (migration) {\n          migrations.push(migration)\n        }\n      }\n    } else if (stat.isFile()) {\n      const ext = extname(entry)\n\n      if (ext === '.ts' || ext === '.js' || ext === '.mjs') {\n        // TypeScript/JavaScript migration\n        const migration = loadTsMigration(entry, entryPath)\n        if (migration) {\n          migrations.push(migration)\n        }\n      } else if (ext === '.sql') {\n        // Single SQL file migration\n        const migration = loadSingleSqlMigration(entry, entryPath)\n        if (migration) {\n          migrations.push(migration)\n        }\n      }\n    }\n  }\n\n  // Sort by version\n  return migrations.sort((a, b) => a.version - b.version)\n}\n\n/**\n * Load a SQL-style migration from a directory\n */\nfunction loadSqlMigration(\n  dirName: string,\n  _dirPath: string,\n  upPath: string,\n  downPath: string\n): MigrationDefinition | null {\n  // Parse migration info from directory name\n  // Expected format: NNNN_name or timestamp_name\n  const match = dirName.match(/^(\\d+)_(.+)$/)\n  if (!match || !match[1] || !match[2]) {\n    console.warn(`Skipping invalid migration directory: ${dirName}`)\n    return null\n  }\n\n  const version = parseInt(match[1], 10)\n  const name = match[2].replace(/_/g, ' ')\n\n  const up = readFileSync(upPath, 'utf-8').trim()\n  const down = existsSync(downPath)\n    ? readFileSync(downPath, 'utf-8').trim()\n    : undefined\n\n  return {\n    id: dirName,\n    name,\n    version,\n    up,\n    down,\n    isReversible: !!down,\n    tags: ['sql'],\n  }\n}\n\n/**\n * Load a single SQL file migration\n */\nfunction loadSingleSqlMigration(\n  filename: string,\n  filePath: string\n): MigrationDefinition | null {\n  // Parse migration info from filename\n  // Expected format: NNNN_name.sql\n  const match = filename.match(/^(\\d+)_(.+)\\.sql$/)\n  if (!match || !match[1] || !match[2]) {\n    console.warn(`Skipping invalid migration file: ${filename}`)\n    return null\n  }\n\n  const version = parseInt(match[1], 10)\n  const name = match[2].replace(/_/g, ' ')\n\n  const content = readFileSync(filePath, 'utf-8').trim()\n\n  // Try to split into up/down sections\n  // Look for -- DOWN or -- ROLLBACK marker\n  const downMarkers = ['-- DOWN', '--DOWN', '-- ROLLBACK', '--ROLLBACK']\n  let up = content\n  let down: string | undefined\n\n  for (const marker of downMarkers) {\n    const index = content.toUpperCase().indexOf(marker.toUpperCase())\n    if (index !== -1) {\n      up = content.substring(0, index).trim()\n      down = content.substring(index + marker.length).trim()\n      break\n    }\n  }\n\n  return {\n    id: filename.replace(/\\.sql$/, ''),\n    name,\n    version,\n    up,\n    down,\n    isReversible: !!down,\n    tags: ['sql'],\n  }\n}\n\n/**\n * Load a TypeScript/JavaScript migration\n *\n * This function reads the file and parses it to extract migration info.\n * For full runtime loading, use dynamic imports.\n */\nfunction loadTsMigration(\n  filename: string,\n  filePath: string\n): MigrationDefinition | null {\n  // Parse migration info from filename\n  // Expected format: NNNN_name.ts\n  const match = filename.match(/^(\\d+)_(.+)\\.(ts|js|mjs)$/)\n  if (!match || !match[1] || !match[2]) {\n    console.warn(`Skipping invalid migration file: ${filename}`)\n    return null\n  }\n\n  const version = parseInt(match[1], 10)\n  const namePart = match[2]\n  const baseName = namePart.replace(/_/g, ' ')\n\n  // Read and parse the file\n  const content = readFileSync(filePath, 'utf-8')\n\n  // Try to extract migration object\n  // This is a simple parser - for complex cases, use dynamic import\n  const migration = parseTypescriptMigration(content, {\n    id: filename.replace(/\\.(ts|js|mjs)$/, ''),\n    name: baseName,\n    version,\n  })\n\n  return migration\n}\n\n/**\n * Parse a TypeScript migration file to extract migration info\n *\n * This is a simple parser that extracts template literal SQL.\n * It handles common patterns but may not work for all cases.\n */\nfunction parseTypescriptMigration(\n  content: string,\n  defaults: { id: string; name: string; version: number }\n): MigrationDefinition | null {\n  // Extract id\n  const idMatch = content.match(/id:\\s*['\"`]([^'\"`]+)['\"`]/)\n  const id = idMatch?.[1] || defaults.id\n\n  // Extract name\n  const nameMatch = content.match(/name:\\s*['\"`]([^'\"`]+)['\"`]/)\n  const name = nameMatch?.[1] || defaults.name\n\n  // Extract version\n  const versionMatch = content.match(/version:\\s*(\\d+)/)\n  const version = versionMatch?.[1] ? parseInt(versionMatch[1], 10) : defaults.version\n\n  // Extract up SQL (template literal)\n  const upMatch = content.match(/up:\\s*`([\\s\\S]*?)`/)\n  const up = upMatch?.[1]?.trim()\n\n  if (!up) {\n    // Try extracting from string literal\n    const upStringMatch = content.match(/up:\\s*['\"]([^'\"]+)['\"]/)\n    if (!upStringMatch?.[1]) {\n      console.warn(`Could not extract up SQL from: ${defaults.id}`)\n      return null\n    }\n  }\n\n  // Extract down SQL (template literal)\n  const downMatch = content.match(/down:\\s*`([\\s\\S]*?)`/)\n  const down = downMatch?.[1]?.trim()\n\n  // Extract isReversible\n  const reversibleMatch = content.match(/isReversible:\\s*(true|false)/)\n  const isReversible = reversibleMatch?.[1] === 'true' || (reversibleMatch?.[1] !== 'false' && !!down)\n\n  // Extract tags\n  const tagsMatch = content.match(/tags:\\s*\\[([^\\]]*)\\]/)\n  let tags: string[] | undefined\n  if (tagsMatch?.[1]) {\n    tags = tagsMatch[1]\n      .split(',')\n      .map((t) => t.trim().replace(/['\"`]/g, ''))\n      .filter((t) => t.length > 0)\n  }\n\n  // Extract transactional\n  const transactionalMatch = content.match(/transactional:\\s*(true|false)/)\n  const transactional = transactionalMatch?.[1] !== 'false'\n\n  return {\n    id,\n    name,\n    version,\n    up: up || '',\n    down,\n    isReversible,\n    tags,\n    transactional,\n  }\n}\n\n/**\n * Create a query executor from a database URL\n */\nexport async function createQueryExecutor(url: string): Promise<QueryExecutor> {\n  // Import postgres.do client dynamically\n  const postgres = (await import('../index.js')).default\n\n  const sql = postgres(url)\n\n  // Wrap in QueryExecutor interface\n  const executor: QueryExecutor = {\n    async query<T = unknown>(sqlStr: string, params?: unknown[]) {\n      // Use tagged template for proper escaping\n      if (params && params.length > 0) {\n        // Substitute parameters ($1, $2, etc)\n        let parameterizedSql = sqlStr\n        params.forEach((param, i) => {\n          const placeholder = `$${i + 1}`\n          // This is a simplified approach - real implementation would use proper parameterization\n          parameterizedSql = parameterizedSql.replace(\n            placeholder,\n            typeof param === 'string' ? `'${param.replace(/'/g, \"''\")}'` : String(param)\n          )\n        })\n        const result = await sql.unsafe(parameterizedSql)\n        return {\n          rows: result as T[],\n          fields: [] as { name: string; dataTypeID: number }[],\n        }\n      }\n\n      const result = await sql.unsafe(sqlStr)\n      return {\n        rows: result as T[],\n        fields: [] as { name: string; dataTypeID: number }[],\n      }\n    },\n    async end() {\n      await sql.end()\n    },\n  }\n  return executor\n}\n\n/**\n * Parse a migration version string or number\n */\nexport function parseVersion(value: string | number): number {\n  if (typeof value === 'number') {\n    return value\n  }\n\n  // Handle formats like \"0001\" or \"v1\" or just \"1\"\n  const cleaned = value.replace(/^v/i, '')\n  const version = parseInt(cleaned, 10)\n\n  if (isNaN(version)) {\n    throw new Error(`Invalid version: ${value}`)\n  }\n\n  return version\n}\n\n/**\n * Validate a migration definition\n */\nexport function validateMigration(migration: MigrationDefinition): string[] {\n  const errors: string[] = []\n\n  if (!migration.id || typeof migration.id !== 'string') {\n    errors.push('Migration ID must be a non-empty string')\n  }\n\n  if (!migration.name || typeof migration.name !== 'string') {\n    errors.push('Migration name must be a non-empty string')\n  }\n\n  if (typeof migration.version !== 'number' || migration.version < 1) {\n    errors.push('Migration version must be a positive integer')\n  }\n\n  if (!migration.up || typeof migration.up !== 'string') {\n    errors.push('Migration up SQL must be a non-empty string')\n  }\n\n  return errors\n}\n","/**\n * Migrate Status Command\n *\n * Show the current migration status of a database.\n *\n * @module cli/commands/migrate-status\n */\n\nimport { resolve } from 'node:path'\nimport { existsSync } from 'node:fs'\nimport type { MigrateCLIOptions } from '../types.js'\nimport { formatSuccess, formatError, formatInfo, formatWarning, formatTable } from '../formatting.js'\nimport { loadMigrationsFromDirectory, createQueryExecutor } from '../utils.js'\n\n/**\n * Show migration status command\n */\nexport async function runMigrateStatus(options: MigrateCLIOptions): Promise<void> {\n  const url = options.url || process.env['DATABASE_URL']\n\n  if (!url) {\n    console.error(formatError('Database URL is required'))\n    console.error(formatInfo('Provide --url or set DATABASE_URL environment variable'))\n    process.exit(1)\n  }\n\n  // Load migrations from directory\n  const migrationsDir = resolve(process.cwd(), options.migrationsDir || './migrations')\n\n  if (!existsSync(migrationsDir)) {\n    console.error(formatError(`Migrations directory not found: ${migrationsDir}`))\n    console.error(formatInfo('Create a migrations directory or specify one with --migrations-dir'))\n    process.exit(1)\n  }\n\n  try {\n    const migrations = loadMigrationsFromDirectory(migrationsDir)\n\n    // Import migration system dynamically\n    const { createMigrationRegistry, createMigrationRunner } = await import('@dotdo/postgres/migrations')\n\n    // Create registry - cast MigrationDefinition to Migration (structurally compatible)\n    const registry = createMigrationRegistry({\n      migrations: migrations as import('@dotdo/postgres/migrations').Migration[],\n      validateOnCreate: false, // Allow empty migrations\n      allowVersionGaps: true,\n    })\n\n    // Connect to database\n    console.log(formatInfo('Connecting to database...'))\n    const executor = await createQueryExecutor(url)\n\n    // Create runner - use conditional spreading for optional properties\n    const runner = createMigrationRunner(executor, registry, {\n      ...(options.verbose ? { debug: options.verbose } : {}),\n    })\n\n    // Get schema version\n    const schemaVersion = await runner.getSchemaVersion()\n    const comparison = await runner.compareVersion()\n\n    // Output result\n    if (options.json) {\n      console.log(JSON.stringify({\n        currentVersion: schemaVersion.currentVersion,\n        appliedCount: schemaVersion.appliedCount,\n        lastMigrationAt: schemaVersion.lastMigrationAt,\n        pendingCount: comparison.pendingCount,\n        needsMigration: comparison.needsMigration,\n        registeredMigrations: migrations.length,\n        migrations: schemaVersion.migrations,\n        pendingVersions: comparison.missingVersions,\n      }, null, 2))\n    } else {\n      console.log('')\n      console.log(formatInfo('Migration Status'))\n      console.log('================')\n      console.log('')\n      console.log(`Current Version:    ${schemaVersion.currentVersion}`)\n      console.log(`Applied Migrations: ${schemaVersion.appliedCount}`)\n      console.log(`Pending Migrations: ${comparison.pendingCount}`)\n      console.log(`Last Migration:     ${schemaVersion.lastMigrationAt || 'Never'}`)\n      console.log('')\n\n      if (comparison.needsMigration) {\n        console.log(formatWarning(`${comparison.pendingCount} pending migration(s) to apply:`))\n        for (const version of comparison.missingVersions) {\n          const migration = migrations.find((m) => m.version === version)\n          console.log(`  - [${version}] ${migration?.name || 'Unknown'}`)\n        }\n        console.log('')\n        console.log(formatInfo('Run `npx postgres.do migrate` to apply pending migrations'))\n      } else {\n        console.log(formatSuccess('Database is up to date'))\n      }\n\n      // Show applied migrations table if verbose\n      if (options.verbose && schemaVersion.migrations.length > 0) {\n        console.log('')\n        console.log(formatInfo('Applied Migrations:'))\n        const headers = ['Version', 'ID', 'Status', 'Applied At']\n        const rows = schemaVersion.migrations.map((m) => [\n          m.version.toString(),\n          m.id,\n          m.status,\n          m.applied_at,\n        ])\n        console.log(formatTable(headers, rows))\n      }\n\n      // Show registered migrations if verbose\n      if (options.verbose && migrations.length > 0) {\n        console.log('')\n        console.log(formatInfo('Registered Migrations:'))\n        const headers = ['Version', 'ID', 'Name', 'Reversible']\n        const rows = migrations.map((m) => [\n          m.version.toString(),\n          m.id,\n          m.name,\n          m.down ? 'Yes' : 'No',\n        ])\n        console.log(formatTable(headers, rows))\n      }\n    }\n\n    // Cleanup\n    if ('end' in executor && typeof executor.end === 'function') {\n      await executor.end()\n    }\n  } catch (error) {\n    console.error(formatError('Status check error:'), error instanceof Error ? error.message : error)\n    if (options.verbose && error instanceof Error && error.stack) {\n      console.error(error.stack)\n    }\n    process.exit(1)\n  }\n}\n","/**\n * Migrate Rollback Command\n *\n * Rollback migrations from a database.\n *\n * @module cli/commands/migrate-rollback\n */\n\nimport { resolve } from 'node:path'\nimport { existsSync } from 'node:fs'\nimport type { MigrateCLIOptions } from '../types.js'\nimport { formatSuccess, formatError, formatInfo, formatWarning, formatRollbackResult, formatDuration } from '../formatting.js'\nimport { loadMigrationsFromDirectory, createQueryExecutor } from '../utils.js'\n\n/**\n * Rollback migrations command\n */\nexport async function runMigrateRollback(options: MigrateCLIOptions): Promise<void> {\n  const url = options.url || process.env['DATABASE_URL']\n\n  if (!url) {\n    console.error(formatError('Database URL is required'))\n    console.error(formatInfo('Provide --url or set DATABASE_URL environment variable'))\n    process.exit(1)\n  }\n\n  // Load migrations from directory\n  const migrationsDir = resolve(process.cwd(), options.migrationsDir || './migrations')\n\n  if (!existsSync(migrationsDir)) {\n    console.error(formatError(`Migrations directory not found: ${migrationsDir}`))\n    console.error(formatInfo('Create a migrations directory or specify one with --migrations-dir'))\n    process.exit(1)\n  }\n\n  try {\n    const migrations = loadMigrationsFromDirectory(migrationsDir)\n\n    // Import migration system dynamically\n    const { createMigrationRegistry, createMigrationRunner } = await import('@dotdo/postgres/migrations')\n\n    // Create registry - cast MigrationDefinition to Migration (structurally compatible)\n    const registry = createMigrationRegistry({ migrations: migrations as import('@dotdo/postgres/migrations').Migration[] })\n\n    // Connect to database\n    console.log(formatInfo('Connecting to database...'))\n    const executor = await createQueryExecutor(url)\n\n    // Create runner - use conditional spreading for optional properties\n    const runner = createMigrationRunner(executor, registry, {\n      ...(options.verbose ? { debug: options.verbose } : {}),\n    })\n\n    // Get current version\n    const schemaVersion = await runner.getSchemaVersion()\n\n    if (schemaVersion.currentVersion === 0) {\n      console.log(formatInfo('No migrations to rollback'))\n      return\n    }\n\n    // Determine rollback target\n    let targetVersion: number\n\n    if (options.steps !== undefined) {\n      // Rollback N steps\n      const appliedVersions = schemaVersion.migrations\n        .filter((m) => m.status === 'applied')\n        .map((m) => m.version)\n        .sort((a, b) => b - a)\n\n      const stepsToRollback = Math.min(options.steps, appliedVersions.length)\n      targetVersion = stepsToRollback >= appliedVersions.length\n        ? 0\n        : appliedVersions[stepsToRollback] || 0\n    } else if (options.toVersion !== undefined) {\n      // Rollback to specific version\n      targetVersion = options.toVersion\n    } else {\n      // Default: rollback last migration\n      const appliedVersions = schemaVersion.migrations\n        .filter((m) => m.status === 'applied')\n        .map((m) => m.version)\n        .sort((a, b) => b - a)\n\n      if (appliedVersions.length < 2) {\n        targetVersion = 0\n      } else {\n        targetVersion = appliedVersions[1] || 0\n      }\n    }\n\n    console.log(formatInfo(`Current version: ${schemaVersion.currentVersion}`))\n    console.log(formatInfo(`Target version: ${targetVersion}`))\n\n    // Plan rollback first - use conditional spreading for optional properties\n    const plan = await runner.planRollback({ toVersion: targetVersion, ...(options.force ? { force: options.force } : {}) })\n\n    if (plan.migrations.length === 0) {\n      if (plan.blockers.length > 0) {\n        console.log(formatWarning('Cannot rollback - blocked by:'))\n        for (const blocker of plan.blockers) {\n          console.log(`  - [${blocker.version}] ${blocker.id}: ${blocker.reason}`)\n        }\n        if (!options.force) {\n          console.log(formatInfo('Use --force to attempt rollback anyway'))\n        }\n        process.exit(1)\n      }\n      console.log(formatInfo('Nothing to rollback'))\n      return\n    }\n\n    // Show what will be rolled back\n    console.log('')\n    console.log(formatWarning(`Will rollback ${plan.migrations.length} migration(s):`))\n    for (const migration of plan.migrations) {\n      const reversible = migration.down ? 'Yes' : 'No'\n      console.log(`  - [${migration.version}] ${migration.id} (reversible: ${reversible})`)\n    }\n    console.log('')\n\n    // Dry run mode\n    if (options.dryRun) {\n      console.log(formatInfo('Dry run mode - no changes made'))\n      const result = await runner.rollback({\n        toVersion: targetVersion,\n        dryRun: true,\n        ...(options.force ? { force: options.force } : {}),\n      })\n\n      if (options.json) {\n        console.log(JSON.stringify(result, null, 2))\n      } else {\n        console.log(formatInfo(`Would rollback from version ${result.fromVersion} to ${result.toVersion}`))\n        console.log(formatInfo(`Would rollback ${result.rolledBackCount} migration(s)`))\n      }\n      return\n    }\n\n    // Execute rollback - use conditional spreading for optional properties\n    console.log(formatInfo('Rolling back...'))\n    const startTime = Date.now()\n    const result = await runner.rollback({\n      toVersion: targetVersion,\n      ...(options.force ? { force: options.force } : {}),\n      onProgress: (event) => {\n        if (options.verbose || event.phase === 'completed' || event.phase === 'failed') {\n          // Adapt RollbackProgressEvent to RollbackProgressDisplay\n          const displayEvent = {\n            migration: event.migration,\n            index: event.index,\n            total: event.total,\n            phase: event.phase,\n            ...(event.durationMs !== undefined && { durationMs: event.durationMs }),\n            ...(event.error !== undefined && { error: event.error }),\n            ...(event.isDryRun !== undefined && { isDryRun: event.isDryRun }),\n          }\n          console.log(formatRollbackResult(displayEvent))\n        }\n      },\n    })\n    const duration = Date.now() - startTime\n\n    // Output result\n    if (options.json) {\n      console.log(JSON.stringify(result, null, 2))\n    } else {\n      console.log('')\n      if (result.success) {\n        console.log(formatSuccess(`Successfully rolled back ${result.rolledBackCount} migration(s) in ${formatDuration(duration)}`))\n        console.log(formatInfo(`Schema version: ${result.fromVersion} -> ${result.toVersion}`))\n      } else {\n        console.error(formatError('Rollback failed'))\n        const failedResult = result.results.find((r) => !r.success && !r.skipped)\n        if (failedResult) {\n          console.error(formatError(`Failed on: ${failedResult.id}`))\n          console.error(formatError(`Error: ${failedResult.error}`))\n        }\n        if (result.blockedBy && result.blockedBy.length > 0) {\n          console.log(formatWarning('Blocked by:'))\n          for (const blocker of result.blockedBy) {\n            console.log(`  - [${blocker.version}] ${blocker.id}: ${blocker.reason}`)\n          }\n        }\n        process.exit(1)\n      }\n    }\n\n    // Cleanup\n    if ('end' in executor && typeof executor.end === 'function') {\n      await executor.end()\n    }\n  } catch (error) {\n    console.error(formatError('Rollback error:'), error instanceof Error ? error.message : error)\n    if (options.verbose && error instanceof Error && error.stack) {\n      console.error(error.stack)\n    }\n    process.exit(1)\n  }\n}\n","/**\n * Migrate Create Command\n *\n * Create a new migration file.\n *\n * @module cli/commands/migrate-create\n */\n\nimport { resolve, join } from 'node:path'\nimport { existsSync, mkdirSync, writeFileSync, readdirSync } from 'node:fs'\nimport type { MigrateCLIOptions } from '../types.js'\nimport { formatSuccess, formatError, formatInfo } from '../formatting.js'\n\n/**\n * Migration file template\n */\nfunction getMigrationTemplate(options: {\n  id: string\n  name: string\n  version: number\n  tableName?: string\n}): string {\n  const { id, name, version, tableName } = options\n\n  // Generate sample SQL based on name\n  let upSql = '-- Add your migration SQL here'\n  let downSql = '-- Add your rollback SQL here'\n\n  // Try to infer table operations from name\n  const nameLower = name.toLowerCase()\n  if (nameLower.includes('create') && tableName) {\n    upSql = `CREATE TABLE IF NOT EXISTS ${tableName} (\n  id SERIAL PRIMARY KEY,\n  created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP\n);\n\n-- Add your columns here`\n    downSql = `DROP TABLE IF EXISTS ${tableName};`\n  } else if (nameLower.includes('add') && tableName) {\n    upSql = `ALTER TABLE ${tableName}\n  ADD COLUMN column_name TEXT;`\n    downSql = `ALTER TABLE ${tableName}\n  DROP COLUMN column_name;`\n  } else if (nameLower.includes('index') && tableName) {\n    upSql = `CREATE INDEX IF NOT EXISTS idx_${tableName}_column_name ON ${tableName} (column_name);`\n    downSql = `DROP INDEX IF EXISTS idx_${tableName}_column_name;`\n  }\n\n  return `/**\n * Migration: ${name}\n * Version: ${version}\n * ID: ${id}\n *\n * @module migrations/${id}\n */\n\nimport type { Migration } from '@dotdo/postgres/migrations'\n\nexport const migration: Migration = {\n  id: '${id}',\n  name: '${name}',\n  version: ${version},\n  up: \\`\n    ${upSql}\n  \\`,\n  down: \\`\n    ${downSql}\n  \\`,\n  // Set to false if this migration cannot be safely rolled back\n  isReversible: true,\n  // Tags for categorization (optional)\n  tags: ['schema'],\n  // Set to false for operations that can't run in a transaction\n  // transactional: true,\n}\n\nexport default migration\n`\n}\n\n/**\n * SQL-only migration file template\n */\nfunction getSqlMigrationTemplate(options: {\n  id: string\n  name: string\n  version: number\n  tableName?: string\n}): { up: string; down: string } {\n  const { name, tableName } = options\n\n  let upSql = '-- Add your migration SQL here\\n'\n  let downSql = '-- Add your rollback SQL here\\n'\n\n  const nameLower = name.toLowerCase()\n  if (nameLower.includes('create') && tableName) {\n    upSql = `-- Create ${tableName} table\nCREATE TABLE IF NOT EXISTS ${tableName} (\n  id SERIAL PRIMARY KEY,\n  created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP\n);\n\n-- Add your columns here\n`\n    downSql = `-- Drop ${tableName} table\nDROP TABLE IF EXISTS ${tableName};\n`\n  } else if (nameLower.includes('add') && tableName) {\n    upSql = `-- Add column to ${tableName}\nALTER TABLE ${tableName}\n  ADD COLUMN column_name TEXT;\n`\n    downSql = `-- Remove column from ${tableName}\nALTER TABLE ${tableName}\n  DROP COLUMN column_name;\n`\n  } else if (nameLower.includes('index') && tableName) {\n    upSql = `-- Create index on ${tableName}\nCREATE INDEX IF NOT EXISTS idx_${tableName}_column_name ON ${tableName} (column_name);\n`\n    downSql = `-- Drop index on ${tableName}\nDROP INDEX IF EXISTS idx_${tableName}_column_name;\n`\n  }\n\n  return { up: upSql, down: downSql }\n}\n\n/**\n * Get the next version number by scanning existing migrations\n */\nfunction getNextVersion(migrationsDir: string): number {\n  if (!existsSync(migrationsDir)) {\n    return 1\n  }\n\n  const files = readdirSync(migrationsDir)\n  let maxVersion = 0\n\n  for (const file of files) {\n    // Match patterns like:\n    // - 0001_create_users.ts\n    // - 0001_create_users/up.sql\n    // - 20240115_create_users.ts\n    const match = file.match(/^(\\d+)/)\n    if (match && match[1]) {\n      const version = parseInt(match[1], 10)\n      if (version > maxVersion) {\n        maxVersion = version\n      }\n    }\n  }\n\n  return maxVersion + 1\n}\n\n/**\n * Convert name to snake_case\n */\nfunction toSnakeCase(str: string): string {\n  return str\n    .replace(/([a-z])([A-Z])/g, '$1_$2')\n    .replace(/[^a-zA-Z0-9]+/g, '_')\n    .replace(/^_|_$/g, '')\n    .toLowerCase()\n}\n\n/**\n * Extract table name from migration name\n */\nfunction extractTableName(name: string): string | undefined {\n  const snakeName = toSnakeCase(name)\n\n  // Common patterns:\n  // - create_users -> users\n  // - add_email_to_users -> users\n  // - create_user_profiles -> user_profiles\n  const patterns = [\n    /^create_(.+)$/,\n    /^add_\\w+_to_(\\w+)$/,\n    /^remove_\\w+_from_(\\w+)$/,\n    /^alter_(\\w+)$/,\n    /^update_(\\w+)$/,\n    /^drop_(\\w+)$/,\n    /^index_(\\w+)$/,\n    /^add_index_to_(\\w+)$/,\n  ]\n\n  for (const pattern of patterns) {\n    const match = snakeName.match(pattern)\n    if (match && match[1]) {\n      return match[1]\n    }\n  }\n\n  return undefined\n}\n\n/**\n * Create migration command\n */\nexport async function runMigrateCreate(options: MigrateCLIOptions): Promise<void> {\n  if (!options.name) {\n    console.error(formatError('Migration name is required'))\n    console.error(formatInfo('Usage: npx postgres.do migrate:create <name>'))\n    console.error(formatInfo('Example: npx postgres.do migrate:create create_users'))\n    process.exit(1)\n  }\n\n  const migrationsDir = resolve(process.cwd(), options.migrationsDir || './migrations')\n\n  // Ensure migrations directory exists\n  if (!existsSync(migrationsDir)) {\n    mkdirSync(migrationsDir, { recursive: true })\n    console.log(formatInfo(`Created migrations directory: ${migrationsDir}`))\n  }\n\n  // Get next version number\n  const version = getNextVersion(migrationsDir)\n  const paddedVersion = version.toString().padStart(4, '0')\n\n  // Generate migration ID\n  const snakeName = toSnakeCase(options.name)\n  const id = `${paddedVersion}_${snakeName}`\n\n  // Extract table name if possible\n  const tableName = extractTableName(options.name)\n\n  // Determine output format\n  const format = options.migrationFormat || 'ts'\n\n  if (format === 'sql') {\n    // Create SQL migration with up.sql and down.sql files\n    const migrationDir = join(migrationsDir, id)\n    mkdirSync(migrationDir, { recursive: true })\n\n    const { up, down } = getSqlMigrationTemplate({\n      id,\n      name: options.name,\n      version,\n      ...(tableName != null ? { tableName } : {}),\n    })\n\n    const upPath = join(migrationDir, 'up.sql')\n    const downPath = join(migrationDir, 'down.sql')\n\n    writeFileSync(upPath, up)\n    writeFileSync(downPath, down)\n\n    if (options.json) {\n      console.log(JSON.stringify({\n        id,\n        name: options.name,\n        version,\n        directory: migrationDir,\n        files: ['up.sql', 'down.sql'],\n      }, null, 2))\n    } else {\n      console.log('')\n      console.log(formatSuccess(`Created migration: ${id}`))\n      console.log(formatInfo(`Directory: ${migrationDir}`))\n      console.log(formatInfo('Files:'))\n      console.log(`  - ${upPath}`)\n      console.log(`  - ${downPath}`)\n      console.log('')\n      console.log(formatInfo('Edit the SQL files to add your migration logic'))\n    }\n  } else {\n    // Create TypeScript migration file\n    const filename = `${id}.ts`\n    const filePath = join(migrationsDir, filename)\n\n    // Check if file already exists\n    if (existsSync(filePath)) {\n      console.error(formatError(`Migration file already exists: ${filePath}`))\n      process.exit(1)\n    }\n\n    const content = getMigrationTemplate({\n      id,\n      name: options.name,\n      version,\n      ...(tableName != null ? { tableName } : {}),\n    })\n\n    writeFileSync(filePath, content)\n\n    if (options.json) {\n      console.log(JSON.stringify({\n        id,\n        name: options.name,\n        version,\n        file: filePath,\n      }, null, 2))\n    } else {\n      console.log('')\n      console.log(formatSuccess(`Created migration: ${id}`))\n      console.log(formatInfo(`File: ${filePath}`))\n      console.log('')\n      console.log(formatInfo('Edit the file to add your migration SQL'))\n    }\n  }\n}\n","/**\n * Migrate Validate Command\n *\n * Validate migrations before deployment.\n * Performs syntax checking, destructive operation detection,\n * and best practice enforcement.\n *\n * @module cli/commands/migrate-validate\n */\n\nimport { resolve } from 'node:path'\nimport { existsSync } from 'node:fs'\nimport type { MigrateCLIOptions } from '../types.js'\nimport {\n  formatSuccess,\n  formatError,\n  formatInfo,\n  formatWarning,\n  formatDim,\n} from '../formatting.js'\nimport { loadMigrationsFromDirectory, createQueryExecutor } from '../utils.js'\n\n/**\n * Severity color mapping\n */\nfunction formatSeverity(severity: 'error' | 'warning' | 'info'): string {\n  switch (severity) {\n    case 'error':\n      return formatError('ERROR')\n    case 'warning':\n      return formatWarning('WARN')\n    case 'info':\n      return formatDim('INFO')\n    default:\n      return severity\n  }\n}\n\n/**\n * Migrate validate command\n */\nexport async function runMigrateValidate(options: MigrateCLIOptions): Promise<void> {\n  // Load migrations from directory\n  const migrationsDir = resolve(process.cwd(), options.migrationsDir || './migrations')\n\n  if (!existsSync(migrationsDir)) {\n    console.error(formatError(`Migrations directory not found: ${migrationsDir}`))\n    console.error(formatInfo('Create a migrations directory or specify one with --migrations-dir'))\n    process.exit(1)\n  }\n\n  console.log(formatInfo(`Validating migrations from: ${migrationsDir}`))\n\n  try {\n    const migrations = loadMigrationsFromDirectory(migrationsDir)\n\n    if (migrations.length === 0) {\n      console.log(formatWarning('No migrations found'))\n      return\n    }\n\n    console.log(formatInfo(`Found ${migrations.length} migration(s) to validate`))\n    console.log('')\n\n    // Import validation module dynamically\n    const { createMigrationRegistry } = await import('@dotdo/postgres/migrations')\n    const { createMigrationValidator } = await import('@dotdo/postgres/migrations/validator')\n\n    // Create registry - cast MigrationDefinition to Migration (structurally compatible)\n    const registry = createMigrationRegistry({\n      migrations: migrations as import('@dotdo/postgres/migrations').Migration[],\n      validateOnCreate: false,\n      allowVersionGaps: true,\n    })\n\n    // If URL is provided, enable syntax checking\n    const url = options.url || process.env['DATABASE_URL']\n    let executor: import('@dotdo/postgres/migrations').QueryExecutor | undefined\n    if (url && !options.dryRun) {\n      console.log(formatInfo('Connecting to database for syntax validation...'))\n      executor = await createQueryExecutor(url)\n    }\n\n    // Create validator with options - use conditional spreading for optional properties\n    const validator = createMigrationValidator({\n      warnDestructive: true,\n      checkDownMigrations: true,\n      checkVersionGaps: true,\n      checkChecksums: true,\n      checkBestPractices: true,\n      ...(url && !options.dryRun ? { checkSyntax: true } : {}),\n      ...(executor ? { executor } : {}),\n    })\n\n    // Run validation\n    console.log(formatInfo('Running validation checks...'))\n    const result = await validator.validateAll(registry)\n\n    // Output results\n    if (options.json) {\n      console.log(JSON.stringify(result, null, 2))\n    } else {\n      // Summary\n      console.log('')\n      console.log('Validation Results')\n      console.log('==================')\n      console.log('')\n      console.log(`Migrations checked: ${migrations.length}`)\n      console.log(`Errors:            ${result.errorCount}`)\n      console.log(`Warnings:          ${result.warningCount}`)\n      console.log('')\n\n      // Show issues by migration\n      if (result.issues.length > 0) {\n        console.log('Issues Found:')\n        console.log('')\n\n        // Group by migration\n        const issuesByMigration = new Map<string, typeof result.issues>()\n        for (const issue of result.issues) {\n          const existing = issuesByMigration.get(issue.migrationId) || []\n          existing.push(issue)\n          issuesByMigration.set(issue.migrationId, existing)\n        }\n\n        for (const [migrationId, issues] of issuesByMigration) {\n          console.log(`  ${formatInfo(migrationId)}`)\n          for (const issue of issues) {\n            const severity = formatSeverity(issue.severity)\n            console.log(`    ${severity} [${issue.category}] ${issue.message}`)\n            if (issue.suggestion && options.verbose) {\n              console.log(`         ${formatDim(`Suggestion: ${issue.suggestion}`)}`)\n            }\n            if (issue.sql && options.verbose) {\n              const truncatedSql = issue.sql.length > 60\n                ? issue.sql.substring(0, 60) + '...'\n                : issue.sql\n              console.log(`         ${formatDim(`SQL: ${truncatedSql}`)}`)\n            }\n          }\n          console.log('')\n        }\n      }\n\n      // Show missing down migrations\n      if (result.missingDownMigrations.length > 0 && options.verbose) {\n        console.log(formatWarning('Migrations without rollback support:'))\n        for (const id of result.missingDownMigrations) {\n          console.log(`  - ${id}`)\n        }\n        console.log('')\n      }\n\n      // Show version gaps\n      if (result.versionGaps.length > 0) {\n        console.log(formatWarning('Version gaps detected:'))\n        console.log(`  Missing versions: ${result.versionGaps.join(', ')}`)\n        console.log('')\n      }\n\n      // Show checksum conflicts\n      if (result.checksumConflicts.length > 0) {\n        console.log(formatWarning('Duplicate migration content detected:'))\n        for (const conflict of result.checksumConflicts) {\n          console.log(`  - ${conflict.migrationIds.join(', ')}`)\n        }\n        console.log('')\n      }\n\n      // Per-migration details in verbose mode\n      if (options.verbose) {\n        console.log('')\n        console.log('Migration Details:')\n        console.log('')\n\n        for (const migResult of result.results) {\n          const status = migResult.valid\n            ? formatSuccess('VALID')\n            : formatError('INVALID')\n          console.log(`  ${status} ${migResult.migrationId}`)\n\n          if (migResult.affectedTables.length > 0) {\n            console.log(`    Tables: ${migResult.affectedTables.join(', ')}`)\n          }\n\n          if (migResult.operations.length > 0) {\n            const ops = migResult.operations.map((o: { type: string }) => o.type).join(', ')\n            console.log(`    Operations: ${ops}`)\n          }\n\n          const destructiveOps = migResult.operations.filter((o: { isDestructive: boolean }) => o.isDestructive)\n          if (destructiveOps.length > 0) {\n            console.log(`    ${formatWarning(`Destructive operations: ${destructiveOps.length}`)}`)\n          }\n        }\n        console.log('')\n      }\n\n      // Final summary\n      if (result.valid) {\n        console.log(formatSuccess('All migrations passed validation'))\n      } else {\n        console.log(formatError(`Validation failed with ${result.errorCount} error(s)`))\n        process.exit(1)\n      }\n    }\n\n    // Cleanup executor if we created one\n    if (executor && 'end' in executor) {\n      await (executor as { end: () => Promise<void> }).end()\n    }\n  } catch (error) {\n    console.error(formatError('Validation error:'), error instanceof Error ? error.message : error)\n    if (options.verbose && error instanceof Error && error.stack) {\n      console.error(error.stack)\n    }\n    process.exit(1)\n  }\n}\n","/**\n * Migrate Dry Run Command\n *\n * Preview migrations that would be applied without executing them.\n * Shows the SQL that would be run and affected tables.\n *\n * @module cli/commands/migrate-dry-run\n */\n\nimport { resolve } from 'node:path'\nimport { existsSync } from 'node:fs'\nimport type { MigrateCLIOptions } from '../types.js'\nimport {\n  formatSuccess,\n  formatError,\n  formatInfo,\n  formatWarning,\n  formatDim,\n} from '../formatting.js'\nimport { loadMigrationsFromDirectory, createQueryExecutor } from '../utils.js'\n\n/**\n * Migrate dry-run command\n */\nexport async function runMigrateDryRun(options: MigrateCLIOptions): Promise<void> {\n  const url = options.url || process.env['DATABASE_URL']\n\n  if (!url) {\n    console.error(formatError('Database URL is required'))\n    console.error(formatInfo('Provide --url or set DATABASE_URL environment variable'))\n    process.exit(1)\n  }\n\n  // Load migrations from directory\n  const migrationsDir = resolve(process.cwd(), options.migrationsDir || './migrations')\n\n  if (!existsSync(migrationsDir)) {\n    console.error(formatError(`Migrations directory not found: ${migrationsDir}`))\n    console.error(formatInfo('Create a migrations directory or specify one with --migrations-dir'))\n    process.exit(1)\n  }\n\n  console.log(formatInfo(`Loading migrations from: ${migrationsDir}`))\n\n  try {\n    const migrations = loadMigrationsFromDirectory(migrationsDir)\n\n    if (migrations.length === 0) {\n      console.log(formatInfo('No migrations found'))\n      return\n    }\n\n    console.log(formatInfo(`Found ${migrations.length} migration(s)`))\n\n    // Import migration system dynamically\n    const { createMigrationRegistry, createMigrationRunner } = await import('@dotdo/postgres/migrations')\n    const { createMigrationValidator } = await import('@dotdo/postgres/migrations/validator')\n\n    // Create registry - cast MigrationDefinition to Migration (structurally compatible)\n    const registry = createMigrationRegistry({\n      migrations: migrations as import('@dotdo/postgres/migrations').Migration[],\n      validateOnCreate: false,\n      allowVersionGaps: true,\n    })\n\n    // Connect to database\n    console.log(formatInfo('Connecting to database...'))\n    const executor = await createQueryExecutor(url)\n\n    // Create runner - use conditional spreading for optional properties\n    const runner = createMigrationRunner(executor, registry, {\n      ...(options.verbose ? { debug: options.verbose } : {}),\n    })\n\n    // Get pending migrations\n    const schemaVersion = await runner.getSchemaVersion()\n    const comparison = await runner.compareVersion()\n\n    // Output results\n    if (options.json) {\n      const pendingMigrations = migrations.filter((m) =>\n        comparison.missingVersions.includes(m.version)\n      )\n\n      console.log(JSON.stringify({\n        currentVersion: schemaVersion.currentVersion,\n        targetVersion: registry.getLatestVersion(),\n        pendingCount: comparison.pendingCount,\n        needsMigration: comparison.needsMigration,\n        pendingMigrations: pendingMigrations.map((m) => ({\n          id: m.id,\n          name: m.name,\n          version: m.version,\n          hasDown: !!m.down,\n          upSql: m.up,\n          downSql: m.down,\n        })),\n      }, null, 2))\n    } else {\n      console.log('')\n      console.log('Migration Dry Run')\n      console.log('=================')\n      console.log('')\n      console.log(`Current version: ${schemaVersion.currentVersion}`)\n      console.log(`Target version:  ${registry.getLatestVersion()}`)\n      console.log('')\n\n      if (!comparison.needsMigration) {\n        console.log(formatSuccess('Database is up to date - no migrations needed'))\n      } else {\n        console.log(formatWarning(`${comparison.pendingCount} migration(s) would be applied:`))\n        console.log('')\n\n        // Get pending migrations\n        const pendingMigrations = migrations.filter((m) =>\n          comparison.missingVersions.includes(m.version)\n        ).sort((a, b) => a.version - b.version)\n\n        // Create validator for operation detection\n        const validator = createMigrationValidator()\n\n        for (const migration of pendingMigrations) {\n          console.log(`  ${formatInfo(`v${migration.version}: ${migration.name}`)}`)\n          console.log(`  ${formatDim(`ID: ${migration.id}`)}`)\n\n          // Detect operations\n          const operations = validator.detectOperations(migration.up)\n          const tables = validator.extractTableNames(migration.up)\n\n          if (tables.length > 0) {\n            console.log(`  ${formatDim(`Tables: ${tables.join(', ')}`)}`)\n          }\n\n          if (operations.length > 0) {\n            const opTypes = [...new Set(operations.map((o: { type: string }) => o.type))]\n            console.log(`  ${formatDim(`Operations: ${opTypes.join(', ')}`)}`)\n\n            // Warn about destructive operations\n            const destructive = operations.filter((o: { isDestructive: boolean }) => o.isDestructive)\n            if (destructive.length > 0) {\n              console.log(`  ${formatWarning('Destructive operations detected!')}`)\n            }\n          }\n\n          if (!migration.down) {\n            console.log(`  ${formatWarning('No rollback SQL defined')}`)\n          }\n\n          // Show SQL if verbose\n          if (options.verbose) {\n            console.log('')\n            console.log('  SQL to execute:')\n            const lines = migration.up.trim().split('\\n')\n            for (const line of lines) {\n              console.log(`    ${formatDim(line)}`)\n            }\n          }\n\n          console.log('')\n        }\n\n        // Summary\n        console.log(formatInfo('Run `npx postgres.do migrate` to apply these migrations'))\n      }\n    }\n\n    // Cleanup\n    if ('end' in executor && typeof executor.end === 'function') {\n      await executor.end()\n    }\n  } catch (error) {\n    console.error(formatError('Dry run error:'), error instanceof Error ? error.message : error)\n    if (options.verbose && error instanceof Error && error.stack) {\n      console.error(error.stack)\n    }\n    process.exit(1)\n  }\n}\n","/**\n * Migrate Dashboard Command\n *\n * Displays a real-time dashboard showing migration progress across all DOs.\n * Provides version distribution, failed migration tracking, and velocity metrics.\n *\n * @module cli/commands/migrate-dashboard\n */\n\nimport type { MigrateDashboardCLIOptions } from '../types.js'\nimport {\n  formatSuccess,\n  formatError,\n  formatInfo,\n  formatWarning,\n  formatDim,\n  formatTable,\n  formatProgressBar,\n  formatDuration,\n} from '../formatting.js'\n\n/**\n * Migration status summary from API\n */\nexport interface MigrationStatusSummary {\n  /** Total number of DOs being tracked */\n  totalDOs: number\n  /** Distribution of DOs by schema version */\n  versionDistribution: Record<string, number>\n  /** Current target version (latest) */\n  currentVersion: number\n  /** Number of failed migrations */\n  failedMigrations: number\n  /** Number of DOs currently migrating */\n  runningMigrations: number\n  /** Migration velocity (DOs per hour) */\n  migrationVelocity: number\n  /** Estimated time to completion in milliseconds */\n  estimatedTimeRemainingMs: number | null\n  /** Overall completion percentage */\n  percentComplete: number\n  /** Timestamp of last update */\n  lastUpdated: string\n}\n\n/**\n * DO migration detail for list views\n */\nexport interface DOMigrationDetail {\n  /** Durable Object ID */\n  doId: string\n  /** Current schema version */\n  version: number\n  /** Migration status */\n  status: 'pending' | 'running' | 'completed' | 'failed' | 'skipped'\n  /** Last migration attempt timestamp */\n  lastAttempt?: string\n  /** Error message if failed */\n  error?: string\n  /** Execution time in milliseconds */\n  executionTimeMs?: number\n}\n\n/**\n * Active migration operation\n */\nexport interface MigrationOperationSummary {\n  /** Migration operation ID */\n  migrationId: string\n  /** Target schema version */\n  targetVersion: number\n  /** Operation status */\n  status: 'pending' | 'running' | 'paused' | 'completed' | 'failed'\n  /** Total DOs in this operation */\n  totalDOs: number\n  /** Completed DOs */\n  completedDOs: number\n  /** Failed DOs */\n  failedDOs: number\n  /** When operation started */\n  startedAt: string\n  /** When operation completed (if applicable) */\n  completedAt?: string\n  /** Who initiated the operation */\n  initiatedBy?: string\n}\n\n/**\n * API client for migration status endpoints\n */\nclass MigrationStatusClient {\n  constructor(\n    private apiUrl: string,\n    private apiKey?: string\n  ) {}\n\n  private async fetch<T>(path: string, options?: RequestInit): Promise<T> {\n    const url = `${this.apiUrl}${path}`\n    const headers: Record<string, string> = {\n      'Content-Type': 'application/json',\n    }\n\n    if (this.apiKey) {\n      headers['Authorization'] = `Bearer ${this.apiKey}`\n    }\n\n    const response = await globalThis.fetch(url, {\n      ...options,\n      headers: {\n        ...headers,\n        ...options?.headers,\n      },\n    })\n\n    if (!response.ok) {\n      const error = await response.text()\n      throw new Error(`API request failed: ${response.status} ${error}`)\n    }\n\n    return response.json() as Promise<T>\n  }\n\n  /**\n   * Get overall migration status summary\n   */\n  async getStatus(): Promise<MigrationStatusSummary> {\n    return this.fetch<MigrationStatusSummary>('/api/migrations/status')\n  }\n\n  /**\n   * Get DOs at a specific version\n   */\n  async getDOsByVersion(\n    version: number,\n    options?: { limit?: number; offset?: number }\n  ): Promise<{ dos: DOMigrationDetail[]; total: number }> {\n    const params = new URLSearchParams()\n    params.set('version', version.toString())\n    if (options?.limit) params.set('limit', options.limit.toString())\n    if (options?.offset) params.set('offset', options.offset.toString())\n\n    return this.fetch<{ dos: DOMigrationDetail[]; total: number }>(\n      `/api/migrations/dos?${params.toString()}`\n    )\n  }\n\n  /**\n   * Get failed migrations\n   */\n  async getFailedMigrations(options?: {\n    limit?: number\n    offset?: number\n  }): Promise<{ dos: DOMigrationDetail[]; total: number }> {\n    const params = new URLSearchParams()\n    if (options?.limit) params.set('limit', options.limit.toString())\n    if (options?.offset) params.set('offset', options.offset.toString())\n\n    return this.fetch<{ dos: DOMigrationDetail[]; total: number }>(\n      `/api/migrations/failed?${params.toString()}`\n    )\n  }\n\n  /**\n   * List all migration operations\n   */\n  async listOperations(): Promise<MigrationOperationSummary[]> {\n    return this.fetch<MigrationOperationSummary[]>('/api/migrations/operations')\n  }\n\n  /**\n   * Get specific migration operation details\n   */\n  async getOperation(migrationId: string): Promise<MigrationOperationSummary> {\n    return this.fetch<MigrationOperationSummary>(`/api/migrations/operations/${migrationId}`)\n  }\n\n  /**\n   * Retry failed migrations for an operation\n   */\n  async retryFailed(migrationId: string): Promise<{ retried: number }> {\n    return this.fetch<{ retried: number }>(`/api/migrations/operations/${migrationId}/retry`, {\n      method: 'POST',\n    })\n  }\n}\n\n/**\n * Format version distribution as a visual chart\n */\nfunction formatVersionDistribution(\n  distribution: Record<string, number>,\n  total: number,\n  currentVersion: number\n): string {\n  const lines: string[] = []\n\n  // Sort versions in descending order\n  const versions = Object.keys(distribution)\n    .map(Number)\n    .sort((a, b) => b - a)\n\n  for (const version of versions) {\n    const count = distribution[version.toString()] ?? 0\n    const percent = total > 0 ? Math.round((count / total) * 100) : 0\n    const isCurrent = version === currentVersion\n    const label = isCurrent ? `v${version} (current)` : `v${version}`\n    const bar = formatProgressBar(count, total, 20)\n\n    lines.push(`  ${label.padEnd(15)} ${bar} ${count.toLocaleString()} (${percent}%)`)\n  }\n\n  return lines.join('\\n')\n}\n\n/**\n * Format migration status for display\n */\nfunction formatStatusDisplay(status: MigrationStatusSummary): string {\n  const lines: string[] = []\n\n  lines.push('')\n  lines.push(formatInfo('Migration Status Dashboard'))\n  lines.push('==========================')\n  lines.push('')\n\n  // Overview metrics\n  lines.push(`Total DOs:          ${status.totalDOs.toLocaleString()}`)\n  lines.push('')\n\n  // Version distribution\n  lines.push('Version Distribution:')\n  lines.push(formatVersionDistribution(status.versionDistribution, status.totalDOs, status.currentVersion))\n  lines.push('')\n\n  // Migration metrics\n  if (status.failedMigrations > 0) {\n    const failedPercent = ((status.failedMigrations / status.totalDOs) * 100).toFixed(1)\n    lines.push(formatWarning(`Failed Migrations: ${status.failedMigrations} (${failedPercent}%)`))\n  } else {\n    lines.push(formatSuccess(`Failed Migrations: 0`))\n  }\n\n  if (status.runningMigrations > 0) {\n    lines.push(formatInfo(`Currently Migrating: ${status.runningMigrations}`))\n  }\n\n  lines.push('')\n\n  // Velocity and ETA\n  if (status.migrationVelocity > 0) {\n    lines.push(`Migration Velocity: ${status.migrationVelocity.toLocaleString()} DOs/hour`)\n\n    if (status.estimatedTimeRemainingMs !== null && status.estimatedTimeRemainingMs > 0) {\n      lines.push(`ETA to 100%:        ~${formatDuration(status.estimatedTimeRemainingMs)}`)\n    }\n  }\n\n  // Completion status\n  lines.push('')\n  if (status.percentComplete === 100) {\n    lines.push(formatSuccess('All DOs are at the current schema version!'))\n  } else {\n    const progressBar = formatProgressBar(status.percentComplete, 100, 30)\n    lines.push(`Overall Progress:   ${progressBar}`)\n  }\n\n  lines.push('')\n  lines.push(formatDim(`Last updated: ${new Date(status.lastUpdated).toLocaleString()}`))\n\n  return lines.join('\\n')\n}\n\n/**\n * Format failed migrations list\n */\nfunction formatFailedMigrations(failed: DOMigrationDetail[]): string {\n  if (failed.length === 0) {\n    return formatSuccess('No failed migrations')\n  }\n\n  const headers = ['DO ID', 'Version', 'Error', 'Last Attempt']\n  const rows = failed.map((d) => [\n    d.doId,\n    d.version.toString(),\n    d.error ? (d.error.length > 40 ? d.error.slice(0, 40) + '...' : d.error) : '',\n    d.lastAttempt ?? '',\n  ])\n\n  return formatTable(headers, rows)\n}\n\n/**\n * Format operations list\n */\nfunction formatOperationsList(operations: MigrationOperationSummary[]): string {\n  if (operations.length === 0) {\n    return formatDim('No migration operations found')\n  }\n\n  const headers = ['ID', 'Target', 'Status', 'Progress', 'Started', 'Initiated By']\n  const rows = operations.map((op) => {\n    const progress = op.totalDOs > 0\n      ? `${op.completedDOs}/${op.totalDOs} (${Math.round((op.completedDOs / op.totalDOs) * 100)}%)`\n      : '0/0'\n\n    return [\n      op.migrationId,\n      `v${op.targetVersion}`,\n      op.status,\n      progress,\n      op.startedAt ? new Date(op.startedAt).toLocaleDateString() : '',\n      op.initiatedBy ?? '',\n    ]\n  })\n\n  return formatTable(headers, rows)\n}\n\n/**\n * Run the migrate:dashboard command\n */\nexport async function runMigrateDashboard(options: MigrateDashboardCLIOptions): Promise<void> {\n  const apiUrl = options.apiUrl ?? process.env['POSTGRES_DO_API_URL'] ?? 'https://api.postgres.do'\n  const apiKey = options.apiKey ?? process.env['POSTGRES_DO_API_KEY']\n\n  if (!apiKey) {\n    console.error(formatError('API key is required'))\n    console.error(formatInfo('Provide --api-key or set POSTGRES_DO_API_KEY environment variable'))\n    process.exit(1)\n  }\n\n  const client = new MigrationStatusClient(apiUrl, apiKey)\n\n  try {\n    // Handle different subcommands\n    if (options.showFailed) {\n      // Show failed migrations\n      console.log(formatInfo('Fetching failed migrations...'))\n      const { dos, total } = await client.getFailedMigrations(options.limit !== undefined ? { limit: options.limit } : undefined)\n\n      if (options.json) {\n        console.log(JSON.stringify({ dos, total }, null, 2))\n      } else {\n        console.log('')\n        console.log(formatWarning(`Failed Migrations (${total} total)`))\n        console.log('='.repeat(40))\n        console.log('')\n        console.log(formatFailedMigrations(dos))\n      }\n      return\n    }\n\n    if (options.showVersion !== undefined) {\n      // Show DOs at specific version\n      console.log(formatInfo(`Fetching DOs at version ${options.showVersion}...`))\n      const { dos, total } = await client.getDOsByVersion(options.showVersion, options.limit !== undefined ? { limit: options.limit } : undefined)\n\n      if (options.json) {\n        console.log(JSON.stringify({ dos, total }, null, 2))\n      } else {\n        console.log('')\n        console.log(formatInfo(`DOs at Version ${options.showVersion} (${total} total)`))\n        console.log('='.repeat(40))\n        console.log('')\n\n        const headers = ['DO ID', 'Status', 'Last Attempt', 'Duration']\n        const rows = dos.map((d) => [\n          d.doId,\n          d.status,\n          d.lastAttempt ?? '',\n          d.executionTimeMs ? formatDuration(d.executionTimeMs) : '',\n        ])\n\n        console.log(formatTable(headers, rows))\n      }\n      return\n    }\n\n    if (options.listOperations) {\n      // List all operations\n      console.log(formatInfo('Fetching migration operations...'))\n      const operations = await client.listOperations()\n\n      if (options.json) {\n        console.log(JSON.stringify(operations, null, 2))\n      } else {\n        console.log('')\n        console.log(formatInfo('Migration Operations'))\n        console.log('='.repeat(40))\n        console.log('')\n        console.log(formatOperationsList(operations))\n      }\n      return\n    }\n\n    if (options.operationId) {\n      // Show specific operation details\n      console.log(formatInfo(`Fetching operation ${options.operationId}...`))\n      const operation = await client.getOperation(options.operationId)\n\n      if (options.json) {\n        console.log(JSON.stringify(operation, null, 2))\n      } else {\n        console.log('')\n        console.log(formatInfo(`Migration Operation: ${operation.migrationId}`))\n        console.log('='.repeat(40))\n        console.log('')\n        console.log(`Target Version: v${operation.targetVersion}`)\n        console.log(`Status:         ${operation.status}`)\n        console.log(`Total DOs:      ${operation.totalDOs}`)\n        console.log(`Completed:      ${operation.completedDOs}`)\n        console.log(`Failed:         ${operation.failedDOs}`)\n        console.log(`Started:        ${operation.startedAt}`)\n        if (operation.completedAt) {\n          console.log(`Completed:      ${operation.completedAt}`)\n        }\n        if (operation.initiatedBy) {\n          console.log(`Initiated By:   ${operation.initiatedBy}`)\n        }\n        console.log('')\n        const progress = operation.totalDOs > 0\n          ? Math.round((operation.completedDOs / operation.totalDOs) * 100)\n          : 0\n        console.log(`Progress: ${formatProgressBar(progress, 100, 30)}`)\n      }\n      return\n    }\n\n    if (options.retry) {\n      // Retry failed migrations for an operation\n      console.log(formatInfo(`Retrying failed migrations for operation ${options.retry}...`))\n      const result = await client.retryFailed(options.retry)\n\n      if (options.json) {\n        console.log(JSON.stringify(result, null, 2))\n      } else {\n        console.log(formatSuccess(`Queued ${result.retried} failed migrations for retry`))\n      }\n      return\n    }\n\n    // Default: Show dashboard\n    if (options.watch) {\n      // Watch mode - refresh dashboard periodically\n      const refreshInterval = options.refreshInterval ?? 5000\n\n      console.log(formatInfo(`Starting dashboard in watch mode (refresh every ${refreshInterval / 1000}s)...`))\n      console.log(formatDim('Press Ctrl+C to exit'))\n      console.log('')\n\n      const runDashboard = async (): Promise<void> => {\n        try {\n          const status = await client.getStatus()\n\n          // Clear screen\n          process.stdout.write('\\x1b[2J\\x1b[H')\n\n          if (options.json) {\n            console.log(JSON.stringify(status, null, 2))\n          } else {\n            console.log(formatStatusDisplay(status))\n          }\n        } catch (error) {\n          console.error(formatError(`Failed to fetch status: ${error instanceof Error ? error.message : error}`))\n        }\n      }\n\n      // Initial run\n      await runDashboard()\n\n      // Set up interval\n      const intervalId = setInterval(() => void runDashboard(), refreshInterval)\n\n      // Handle graceful shutdown\n      process.on('SIGINT', () => {\n        clearInterval(intervalId)\n        console.log('')\n        console.log(formatInfo('Dashboard stopped'))\n        process.exit(0)\n      })\n\n      // Keep process running\n      await new Promise(() => {})\n    } else {\n      // Single snapshot\n      console.log(formatInfo('Fetching migration status...'))\n      const status = await client.getStatus()\n\n      if (options.json) {\n        console.log(JSON.stringify(status, null, 2))\n      } else {\n        console.log(formatStatusDisplay(status))\n      }\n    }\n  } catch (error) {\n    console.error(formatError(`Dashboard error: ${error instanceof Error ? error.message : error}`))\n    if (options.verbose && error instanceof Error && error.stack) {\n      console.error(error.stack)\n    }\n    process.exit(1)\n  }\n}\n","/**\n * External Migration Commands\n *\n * CLI commands for migrating from external PostgreSQL providers (Neon, Supabase)\n * to postgres.do (PGLite).\n *\n * @module cli/commands/migrate-from-external\n */\n\nimport { resolve } from 'node:path'\nimport { writeFileSync, mkdirSync, existsSync } from 'node:fs'\nimport {\n  formatSuccess,\n  formatError,\n  formatInfo,\n  formatWarning,\n  formatDim,\n  formatProgress,\n  formatDuration,\n} from '../formatting.js'\n\n// Import migration tooling from @dotdo/postgres\nimport {\n  exportSchema,\n  transformSchema,\n  validateSchemaCompatibility,\n  detectProvider,\n  DataMigrator,\n  createProgressReporter,\n  type SchemaExportOptions,\n  type ExportedSchema,\n  type TransformResult,\n  type ProgressEvent,\n  type DatabaseProvider,\n  type SchemaValidationOptions,\n} from '@dotdo/postgres/migration-tooling'\n\n/**\n * Options for migrate from-neon command\n */\nexport interface MigrateFromNeonOptions {\n  /** Neon connection string */\n  connectionString: string\n  /** Output directory for migration files */\n  outputDir?: string\n  /** Include data migration */\n  includeData?: boolean\n  /** Specific tables to migrate */\n  tables?: string[]\n  /** Tables to exclude */\n  excludeTables?: string[]\n  /** Batch size for data migration */\n  batchSize?: number\n  /** Validate schema before migration */\n  validate?: boolean\n  /** Output as JSON */\n  json?: boolean\n  /** Verbose output */\n  verbose?: boolean\n  /** Dry run - don't actually write files */\n  dryRun?: boolean\n  /** Validate data integrity after migration */\n  validateIntegrity?: boolean\n}\n\n/**\n * Options for migrate from-supabase command\n */\nexport interface MigrateFromSupabaseOptions {\n  /** Supabase connection string */\n  connectionString: string\n  /** Output directory for migration files */\n  outputDir?: string\n  /** Include data migration */\n  includeData?: boolean\n  /** Specific tables to migrate */\n  tables?: string[]\n  /** Tables to exclude (default: Supabase internal tables) */\n  excludeTables?: string[]\n  /** Batch size for data migration */\n  batchSize?: number\n  /** Validate schema before migration */\n  validate?: boolean\n  /** Output as JSON */\n  json?: boolean\n  /** Verbose output */\n  verbose?: boolean\n  /** Dry run - don't actually write files */\n  dryRun?: boolean\n  /** Validate data integrity after migration */\n  validateIntegrity?: boolean\n}\n\n/**\n * Result of a migration operation\n */\nexport interface MigrationResult {\n  success: boolean\n  provider: DatabaseProvider\n  schema?: {\n    tables: number\n    views: number\n    functions: number\n    triggers: number\n    extensions: string[]\n  }\n  validation?: {\n    isCompatible: boolean\n    errorCount: number\n    warningCount: number\n    complexityScore: number\n  }\n  transform?: {\n    warnings: number\n    unsupportedExtensions: string[]\n  }\n  data?: {\n    tablesProcessed: number\n    totalRows: number\n  }\n  outputFiles?: string[]\n  errors?: string[]\n  warnings?: string[]\n  duration: number\n}\n\n/**\n * Default Supabase internal tables to exclude\n */\nconst SUPABASE_INTERNAL_TABLES = [\n  'auth.users',\n  'auth.sessions',\n  'auth.refresh_tokens',\n  'auth.mfa_factors',\n  'auth.mfa_challenges',\n  'auth.mfa_amr_claims',\n  'auth.flow_state',\n  'auth.saml_providers',\n  'auth.saml_relay_states',\n  'auth.sso_providers',\n  'auth.sso_domains',\n  'auth.identities',\n  'auth.one_time_tokens',\n  'storage.objects',\n  'storage.buckets',\n  'storage.migrations',\n  'realtime.messages',\n  'realtime.subscription',\n  'supabase_functions.hooks',\n  'supabase_functions.migrations',\n  'extensions.pg_stat_statements',\n]\n\n/**\n * Run migrate from-neon command\n */\nexport async function runMigrateFromNeon(options: MigrateFromNeonOptions): Promise<void> {\n  const startTime = Date.now()\n  const result: MigrationResult = {\n    success: false,\n    provider: 'neon',\n    duration: 0,\n  }\n\n  // Validate provider\n  const provider = detectProvider(options.connectionString)\n  if (provider !== 'neon') {\n    console.error(formatError(`Connection string does not appear to be a Neon database`))\n    console.error(formatInfo(`Detected provider: ${provider}`))\n    console.error(formatInfo(`For Neon, connection string should contain '.neon.tech'`))\n    if (options.json) {\n      console.log(JSON.stringify({ success: false, error: 'Invalid provider', detected: provider }))\n    }\n    process.exit(1)\n  }\n\n  const outputDir = resolve(process.cwd(), options.outputDir || './migration-output')\n\n  if (!options.json) {\n    console.log('')\n    console.log(formatInfo('postgres.do Migration Tooling'))\n    console.log(formatDim('Migrating from Neon to postgres.do (PGLite)'))\n    console.log('')\n  }\n\n  const reporter = createProgressReporter()\n\n  if (!options.json && options.verbose) {\n    reporter.onProgress((event) => {\n      console.log(formatProgress(`[${event.phase}] ${event.progress}% - ${event.message || ''}`))\n    })\n  }\n\n  try {\n    // Step 1: Export schema\n    reporter.startPhase('schema_export')\n    if (!options.json) {\n      console.log(formatInfo('Exporting schema from Neon...'))\n    }\n\n    const exportOptions: SchemaExportOptions = {\n      connectionString: options.connectionString,\n      includeData: false,\n      includeViews: true,\n      includeFunctions: true,\n      includeTriggers: true,\n      includeExtensions: true,\n      ...(options.tables && { tables: options.tables }),\n      ...(options.excludeTables && { excludeTables: options.excludeTables }),\n    }\n\n    const schema = await exportSchema(exportOptions)\n    reporter.endPhase('schema_export')\n\n    result.schema = {\n      tables: schema.tables.length,\n      views: schema.views.length,\n      functions: schema.functions.length,\n      triggers: schema.triggers.length,\n      extensions: schema.extensions,\n    }\n\n    if (!options.json) {\n      console.log(formatSuccess(`Exported ${schema.tables.length} tables, ${schema.views.length} views`))\n    }\n\n    // Step 2: Validate schema (if requested)\n    if (options.validate) {\n      reporter.startPhase('validation')\n      if (!options.json) {\n        console.log(formatInfo('Validating schema compatibility...'))\n      }\n\n      const validation = validateSchemaCompatibility(schema)\n      reporter.endPhase('validation')\n\n      result.validation = {\n        isCompatible: validation.isCompatible,\n        errorCount: validation.errorCount,\n        warningCount: validation.warningCount,\n        complexityScore: validation.complexityScore,\n      }\n\n      if (!options.json) {\n        if (validation.isCompatible) {\n          console.log(formatSuccess('Schema is compatible with PGLite'))\n        } else {\n          console.log(formatWarning(`Schema has ${validation.errorCount} compatibility issues`))\n        }\n\n        if (validation.warningCount > 0 && options.verbose) {\n          console.log(formatWarning(`${validation.warningCount} warnings detected`))\n          validation.issues\n            .filter((i) => i.severity === 'warning')\n            .slice(0, 5)\n            .forEach((issue) => {\n              console.log(formatDim(`  - ${issue.message}`))\n            })\n        }\n      }\n    }\n\n    // Step 3: Transform schema\n    reporter.startPhase('schema_transform')\n    if (!options.json) {\n      console.log(formatInfo('Transforming schema for PGLite...'))\n    }\n\n    const transformed = await transformSchema(schema, {\n      viewStrategy: 'preserve',\n    })\n    reporter.endPhase('schema_transform')\n\n    result.transform = {\n      warnings: transformed.warnings.length,\n      unsupportedExtensions: transformed.unsupportedExtensions || [],\n    }\n\n    if (!options.json && transformed.warnings.length > 0 && options.verbose) {\n      console.log(formatWarning(`${transformed.warnings.length} transformation warnings`))\n    }\n\n    // Step 4: Write output files\n    if (!options.dryRun) {\n      result.outputFiles = []\n\n      // Create output directory\n      if (!existsSync(outputDir)) {\n        mkdirSync(outputDir, { recursive: true })\n      }\n\n      // Write schema SQL\n      const schemaPath = resolve(outputDir, 'schema.sql')\n      writeFileSync(schemaPath, transformed.sql)\n      result.outputFiles.push(schemaPath)\n\n      // Write schema JSON (for programmatic use)\n      const schemaJsonPath = resolve(outputDir, 'schema.json')\n      writeFileSync(schemaJsonPath, JSON.stringify(transformed.schema, null, 2))\n      result.outputFiles.push(schemaJsonPath)\n\n      // Write validation report (if validated)\n      if (result.validation) {\n        const validationPath = resolve(outputDir, 'validation-report.json')\n        writeFileSync(validationPath, JSON.stringify(result.validation, null, 2))\n        result.outputFiles.push(validationPath)\n      }\n\n      if (!options.json) {\n        console.log(formatSuccess(`Output written to: ${outputDir}`))\n        result.outputFiles.forEach((f) => {\n          console.log(formatDim(`  - ${f}`))\n        })\n      }\n    } else {\n      if (!options.json) {\n        console.log(formatInfo('Dry run - no files written'))\n      }\n    }\n\n    // Step 5: Data migration (if requested)\n    if (options.includeData && !options.dryRun) {\n      reporter.startPhase('data_migration')\n      if (!options.json) {\n        console.log(formatInfo('Starting data migration...'))\n      }\n\n      const migrator = new DataMigrator({\n        sourceConnection: options.connectionString,\n        targetConnection: 'pglite://local',\n      })\n\n      const dataResult = await migrator.migrateAll({\n        schema: transformed.schema,\n        onProgress: (event: ProgressEvent) => {\n          if (!options.json && options.verbose) {\n            console.log(\n              formatProgress(\n                `[${event.phase}] ${event.progress}% - ${event.details?.table || ''} (${event.details?.rowsProcessed || 0} rows)`\n              )\n            )\n          }\n        },\n        ...(options.validateIntegrity !== undefined && { validateIntegrity: options.validateIntegrity }),\n      })\n\n      reporter.endPhase('data_migration')\n\n      result.data = {\n        tablesProcessed: dataResult.tablesProcessed.length,\n        totalRows: dataResult.tablesProcessed.reduce((sum, t) => sum + t.rowsProcessed, 0),\n      }\n\n      if (!options.json) {\n        console.log(formatSuccess(`Migrated ${result.data.totalRows} rows from ${result.data.tablesProcessed} tables`))\n      }\n    }\n\n    result.success = true\n    result.duration = Date.now() - startTime\n\n    if (options.json) {\n      console.log(JSON.stringify(result, null, 2))\n    } else {\n      console.log('')\n      console.log(formatSuccess(`Migration completed in ${formatDuration(result.duration)}`))\n    }\n  } catch (error) {\n    result.success = false\n    result.duration = Date.now() - startTime\n    result.errors = [error instanceof Error ? error.message : String(error)]\n\n    if (options.json) {\n      console.log(JSON.stringify(result, null, 2))\n    } else {\n      console.error(formatError(`Migration failed: ${error instanceof Error ? error.message : error}`))\n      if (options.verbose && error instanceof Error && error.stack) {\n        console.error(formatDim(error.stack))\n      }\n    }\n    process.exit(1)\n  }\n}\n\n/**\n * Run migrate from-supabase command\n */\nexport async function runMigrateFromSupabase(options: MigrateFromSupabaseOptions): Promise<void> {\n  const startTime = Date.now()\n  const result: MigrationResult = {\n    success: false,\n    provider: 'supabase',\n    duration: 0,\n  }\n\n  // Validate provider\n  const provider = detectProvider(options.connectionString)\n  if (provider !== 'supabase') {\n    console.error(formatError(`Connection string does not appear to be a Supabase database`))\n    console.error(formatInfo(`Detected provider: ${provider}`))\n    console.error(formatInfo(`For Supabase, connection string should contain '.supabase.co'`))\n    if (options.json) {\n      console.log(JSON.stringify({ success: false, error: 'Invalid provider', detected: provider }))\n    }\n    process.exit(1)\n  }\n\n  const outputDir = resolve(process.cwd(), options.outputDir || './migration-output')\n\n  // Default to excluding Supabase internal tables\n  const excludeTables = options.excludeTables || SUPABASE_INTERNAL_TABLES\n\n  if (!options.json) {\n    console.log('')\n    console.log(formatInfo('postgres.do Migration Tooling'))\n    console.log(formatDim('Migrating from Supabase to postgres.do (PGLite)'))\n    console.log('')\n    if (excludeTables.length > 0 && options.verbose) {\n      console.log(formatDim(`Excluding ${excludeTables.length} Supabase internal tables`))\n    }\n  }\n\n  const reporter = createProgressReporter()\n\n  if (!options.json && options.verbose) {\n    reporter.onProgress((event) => {\n      console.log(formatProgress(`[${event.phase}] ${event.progress}% - ${event.message || ''}`))\n    })\n  }\n\n  try {\n    // Step 1: Export schema\n    reporter.startPhase('schema_export')\n    if (!options.json) {\n      console.log(formatInfo('Exporting schema from Supabase...'))\n    }\n\n    const exportOptions: SchemaExportOptions = {\n      connectionString: options.connectionString,\n      includeData: false,\n      includeViews: true,\n      includeFunctions: true,\n      includeTriggers: true,\n      includeExtensions: true,\n      ...(options.tables && { tables: options.tables }),\n      excludeTables: excludeTables,\n      schemas: ['public'], // Default to public schema for Supabase\n    }\n\n    const schema = await exportSchema(exportOptions)\n    reporter.endPhase('schema_export')\n\n    result.schema = {\n      tables: schema.tables.length,\n      views: schema.views.length,\n      functions: schema.functions.length,\n      triggers: schema.triggers.length,\n      extensions: schema.extensions,\n    }\n\n    if (!options.json) {\n      console.log(formatSuccess(`Exported ${schema.tables.length} tables, ${schema.views.length} views`))\n    }\n\n    // Step 2: Validate schema (if requested)\n    if (options.validate) {\n      reporter.startPhase('validation')\n      if (!options.json) {\n        console.log(formatInfo('Validating schema compatibility...'))\n      }\n\n      const validation = validateSchemaCompatibility(schema)\n      reporter.endPhase('validation')\n\n      result.validation = {\n        isCompatible: validation.isCompatible,\n        errorCount: validation.errorCount,\n        warningCount: validation.warningCount,\n        complexityScore: validation.complexityScore,\n      }\n\n      if (!options.json) {\n        if (validation.isCompatible) {\n          console.log(formatSuccess('Schema is compatible with PGLite'))\n        } else {\n          console.log(formatWarning(`Schema has ${validation.errorCount} compatibility issues`))\n        }\n\n        if (validation.warningCount > 0 && options.verbose) {\n          console.log(formatWarning(`${validation.warningCount} warnings detected`))\n          validation.issues\n            .filter((i) => i.severity === 'warning')\n            .slice(0, 5)\n            .forEach((issue) => {\n              console.log(formatDim(`  - ${issue.message}`))\n            })\n        }\n      }\n    }\n\n    // Step 3: Transform schema\n    reporter.startPhase('schema_transform')\n    if (!options.json) {\n      console.log(formatInfo('Transforming schema for PGLite...'))\n    }\n\n    const transformed = await transformSchema(schema, {\n      viewStrategy: 'preserve',\n    })\n    reporter.endPhase('schema_transform')\n\n    result.transform = {\n      warnings: transformed.warnings.length,\n      unsupportedExtensions: transformed.unsupportedExtensions || [],\n    }\n\n    if (!options.json && transformed.warnings.length > 0 && options.verbose) {\n      console.log(formatWarning(`${transformed.warnings.length} transformation warnings`))\n    }\n\n    // Step 4: Write output files\n    if (!options.dryRun) {\n      result.outputFiles = []\n\n      // Create output directory\n      if (!existsSync(outputDir)) {\n        mkdirSync(outputDir, { recursive: true })\n      }\n\n      // Write schema SQL\n      const schemaPath = resolve(outputDir, 'schema.sql')\n      writeFileSync(schemaPath, transformed.sql)\n      result.outputFiles.push(schemaPath)\n\n      // Write schema JSON (for programmatic use)\n      const schemaJsonPath = resolve(outputDir, 'schema.json')\n      writeFileSync(schemaJsonPath, JSON.stringify(transformed.schema, null, 2))\n      result.outputFiles.push(schemaJsonPath)\n\n      // Write validation report (if validated)\n      if (result.validation) {\n        const validationPath = resolve(outputDir, 'validation-report.json')\n        writeFileSync(validationPath, JSON.stringify(result.validation, null, 2))\n        result.outputFiles.push(validationPath)\n      }\n\n      // Write migration guide for Supabase-specific features\n      const migrationGuidePath = resolve(outputDir, 'MIGRATION_GUIDE.md')\n      writeFileSync(migrationGuidePath, generateSupabaseMigrationGuide(schema, transformed))\n      result.outputFiles.push(migrationGuidePath)\n\n      if (!options.json) {\n        console.log(formatSuccess(`Output written to: ${outputDir}`))\n        result.outputFiles.forEach((f) => {\n          console.log(formatDim(`  - ${f}`))\n        })\n      }\n    } else {\n      if (!options.json) {\n        console.log(formatInfo('Dry run - no files written'))\n      }\n    }\n\n    // Step 5: Data migration (if requested)\n    if (options.includeData && !options.dryRun) {\n      reporter.startPhase('data_migration')\n      if (!options.json) {\n        console.log(formatInfo('Starting data migration...'))\n      }\n\n      const migrator = new DataMigrator({\n        sourceConnection: options.connectionString,\n        targetConnection: 'pglite://local',\n      })\n\n      const dataResult = await migrator.migrateAll({\n        schema: transformed.schema,\n        onProgress: (event: ProgressEvent) => {\n          if (!options.json && options.verbose) {\n            console.log(\n              formatProgress(\n                `[${event.phase}] ${event.progress}% - ${event.details?.table || ''} (${event.details?.rowsProcessed || 0} rows)`\n              )\n            )\n          }\n        },\n        ...(options.validateIntegrity !== undefined && { validateIntegrity: options.validateIntegrity }),\n      })\n\n      reporter.endPhase('data_migration')\n\n      result.data = {\n        tablesProcessed: dataResult.tablesProcessed.length,\n        totalRows: dataResult.tablesProcessed.reduce((sum, t) => sum + t.rowsProcessed, 0),\n      }\n\n      if (!options.json) {\n        console.log(formatSuccess(`Migrated ${result.data.totalRows} rows from ${result.data.tablesProcessed} tables`))\n      }\n    }\n\n    result.success = true\n    result.duration = Date.now() - startTime\n\n    if (options.json) {\n      console.log(JSON.stringify(result, null, 2))\n    } else {\n      console.log('')\n      console.log(formatSuccess(`Migration completed in ${formatDuration(result.duration)}`))\n    }\n  } catch (error) {\n    result.success = false\n    result.duration = Date.now() - startTime\n    result.errors = [error instanceof Error ? error.message : String(error)]\n\n    if (options.json) {\n      console.log(JSON.stringify(result, null, 2))\n    } else {\n      console.error(formatError(`Migration failed: ${error instanceof Error ? error.message : error}`))\n      if (options.verbose && error instanceof Error && error.stack) {\n        console.error(formatDim(error.stack))\n      }\n    }\n    process.exit(1)\n  }\n}\n\n/**\n * Generate a migration guide for Supabase-specific features\n */\nfunction generateSupabaseMigrationGuide(schema: ExportedSchema, transformed: TransformResult): string {\n  const lines: string[] = [\n    '# Supabase to postgres.do Migration Guide',\n    '',\n    'This guide covers migrating from Supabase to postgres.do (PGLite).',\n    '',\n    '## What Was Migrated',\n    '',\n    `- **Tables:** ${schema.tables.length}`,\n    `- **Views:** ${schema.views.length}`,\n    `- **Functions:** ${schema.functions.length}`,\n    `- **Triggers:** ${schema.triggers.length}`,\n    '',\n    '## Supabase-Specific Features',\n    '',\n    '### Authentication (auth schema)',\n    '',\n    'Supabase auth tables were excluded from migration. You will need to:',\n    '',\n    '1. Implement your own authentication using the postgres.do SDK',\n    '2. Or integrate with a third-party auth provider',\n    '',\n    '### Storage (storage schema)',\n    '',\n    'Supabase storage objects were excluded. You will need to:',\n    '',\n    '1. Use Cloudflare R2 for object storage',\n    '2. Update file references in your application',\n    '',\n    '### Realtime',\n    '',\n    'Supabase realtime is not available in postgres.do. Consider:',\n    '',\n    '1. Using Cloudflare Durable Objects for real-time state',\n    '2. Implementing WebSocket connections in your Workers',\n    '',\n    '### Row Level Security (RLS)',\n    '',\n    'RLS policies from Supabase are preserved in the schema. However:',\n    '',\n    '1. postgres.do runs in a trusted environment (your Worker)',\n    '2. Consider implementing access control in your application layer',\n    '',\n    '## Extension Compatibility',\n    '',\n  ]\n\n  if (transformed.unsupportedExtensions && transformed.unsupportedExtensions.length > 0) {\n    lines.push('The following extensions are not supported in PGLite:')\n    lines.push('')\n    transformed.unsupportedExtensions.forEach((ext) => {\n      lines.push(`- \\`${ext}\\``)\n    })\n    lines.push('')\n    lines.push('Consider alternative approaches for functionality provided by these extensions.')\n  } else {\n    lines.push('All used extensions are compatible with PGLite.')\n  }\n\n  lines.push('')\n  lines.push('## Transformation Warnings')\n  lines.push('')\n\n  if (transformed.warnings.length > 0) {\n    transformed.warnings.forEach((warning) => {\n      lines.push(`- **${warning.type}:** ${warning.message}`)\n    })\n  } else {\n    lines.push('No transformation warnings.')\n  }\n\n  lines.push('')\n  lines.push('## Next Steps')\n  lines.push('')\n  lines.push('1. Review `schema.sql` and make any necessary adjustments')\n  lines.push('2. Apply the schema to your postgres.do database')\n  lines.push('3. Update your application code to use the postgres.do client SDK')\n  lines.push('4. Test thoroughly before migrating production data')\n  lines.push('')\n  lines.push('## Resources')\n  lines.push('')\n  lines.push('- [postgres.do Documentation](https://postgres.do/docs)')\n  lines.push('- [PGLite Compatibility](https://postgres.do/docs/pglite)')\n  lines.push('- [Migration API Reference](https://postgres.do/docs/migration)')\n  lines.push('')\n\n  return lines.join('\\n')\n}\n\n/**\n * Run schema validation command\n */\nexport async function runMigrateValidateSchema(options: {\n  connectionString: string\n  json?: boolean\n  verbose?: boolean\n  strict?: boolean\n}): Promise<void> {\n  const provider = detectProvider(options.connectionString)\n\n  if (!options.json) {\n    console.log('')\n    console.log(formatInfo(`Validating schema from ${provider}...`))\n    console.log('')\n  }\n\n  try {\n    const schema = await exportSchema({\n      connectionString: options.connectionString,\n      includeViews: true,\n      includeFunctions: true,\n      includeTriggers: true,\n      includeExtensions: true,\n    })\n\n    const validationOpts: SchemaValidationOptions = {}\n    if (options.strict !== undefined) {\n      validationOpts.strict = options.strict\n    }\n    const validation = validateSchemaCompatibility(schema, validationOpts)\n\n    if (options.json) {\n      console.log(JSON.stringify(validation, null, 2))\n    } else {\n      console.log(formatInfo(`Schema Analysis:`))\n      console.log(formatDim(`  Tables: ${schema.tables.length}`))\n      console.log(formatDim(`  Views: ${schema.views.length}`))\n      console.log(formatDim(`  Functions: ${schema.functions.length}`))\n      console.log(formatDim(`  Extensions: ${schema.extensions.join(', ') || 'none'}`))\n      console.log('')\n\n      if (validation.isCompatible) {\n        console.log(formatSuccess('Schema is compatible with PGLite'))\n      } else {\n        console.log(formatError(`Schema has ${validation.errorCount} blocking issues`))\n      }\n\n      if (validation.warningCount > 0) {\n        console.log(formatWarning(`${validation.warningCount} warnings`))\n      }\n\n      console.log(formatDim(`Complexity score: ${validation.complexityScore}/10`))\n      console.log('')\n\n      if (validation.issues.length > 0 && (options.verbose || !validation.isCompatible)) {\n        console.log(formatInfo('Issues:'))\n        const issueLimit = options.verbose ? validation.issues.length : 10\n        validation.issues.slice(0, issueLimit).forEach((issue) => {\n          const icon = issue.severity === 'error' ? '!' : issue.severity === 'warning' ? '?' : '-'\n          const color = issue.severity === 'error' ? formatError : issue.severity === 'warning' ? formatWarning : formatDim\n          console.log(color(`  ${icon} [${issue.code}] ${issue.message}`))\n          if (issue.suggestion && options.verbose) {\n            console.log(formatDim(`    Suggestion: ${issue.suggestion}`))\n          }\n        })\n\n        if (validation.issues.length > issueLimit) {\n          console.log(formatDim(`  ... and ${validation.issues.length - issueLimit} more issues`))\n        }\n      }\n    }\n\n    // Exit with error code if not compatible\n    if (!validation.isCompatible) {\n      process.exit(1)\n    }\n  } catch (error) {\n    if (options.json) {\n      console.log(JSON.stringify({ success: false, error: error instanceof Error ? error.message : String(error) }))\n    } else {\n      console.error(formatError(`Validation failed: ${error instanceof Error ? error.message : error}`))\n    }\n    process.exit(1)\n  }\n}\n\n/**\n * Options for pg_dump import\n */\nexport interface ImportPgDumpOptions {\n  /** Path to the pg_dump file */\n  file: string\n  /** Output directory for transformed files */\n  outputDir?: string\n  /** Validate schema compatibility */\n  validate?: boolean\n  /** Output as JSON */\n  json?: boolean\n  /** Verbose output */\n  verbose?: boolean\n  /** Dry run - don't write files */\n  dryRun?: boolean\n}\n\n/**\n * Parse a pg_dump SQL file and extract schema information\n */\nfunction parsePgDumpFile(content: string): ExportedSchema {\n  const tables: ExportedSchema['tables'] = []\n  const views: ExportedSchema['views'] = []\n  const functions: ExportedSchema['functions'] = []\n  const triggers: ExportedSchema['triggers'] = []\n  const extensions: string[] = []\n\n  // Simple regex-based parsing for CREATE TABLE statements\n  const createTableRegex = /CREATE TABLE\\s+(?:IF NOT EXISTS\\s+)?(?:\"?(\\w+)\"?\\.)?\"?(\\w+)\"?\\s*\\(([\\s\\S]*?)\\);/gi\n  const createViewRegex = /CREATE(?:\\s+OR\\s+REPLACE)?\\s+VIEW\\s+(?:\"?(\\w+)\"?\\.)?\"?(\\w+)\"?\\s+AS\\s+([\\s\\S]*?);/gi\n  const createFunctionRegex = /CREATE(?:\\s+OR\\s+REPLACE)?\\s+FUNCTION\\s+(?:\"?(\\w+)\"?\\.)?\"?(\\w+)\"?\\s*\\([\\s\\S]*?\\)\\s+RETURNS[\\s\\S]*?LANGUAGE\\s+(\\w+)[\\s\\S]*?AS[\\s\\S]*?\\$\\$[\\s\\S]*?\\$\\$/gi\n  const createExtensionRegex = /CREATE EXTENSION(?:\\s+IF NOT EXISTS)?\\s+\"?(\\w+)\"?/gi\n\n  let match: RegExpExecArray | null\n\n  // Parse extensions\n  while ((match = createExtensionRegex.exec(content)) !== null) {\n    if (match[1]) {\n      extensions.push(match[1])\n    }\n  }\n\n  // Parse tables\n  while ((match = createTableRegex.exec(content)) !== null) {\n    const schemaName = match[1] || 'public'\n    const tableName = match[2]\n    const columnsBlock = match[3]\n\n    if (!tableName || !columnsBlock) continue\n\n    // Parse columns\n    const columns: ExportedSchema['tables'][0]['columns'] = []\n    const columnLines = columnsBlock.split(',').map((l) => l.trim()).filter((l) => l && !l.startsWith('PRIMARY KEY') && !l.startsWith('FOREIGN KEY') && !l.startsWith('CONSTRAINT'))\n\n    for (const line of columnLines) {\n      const colMatch = line.match(/\"?(\\w+)\"?\\s+(\\w+(?:\\([^)]+\\))?)\\s*(.*)/i)\n      if (colMatch) {\n        const colName = colMatch[1]\n        const colType = colMatch[2]\n        const constraints = colMatch[3] || ''\n\n        if (!colName || !colType) continue\n\n        const column: ExportedSchema['tables'][0]['columns'][0] = {\n          name: colName,\n          type: colType,\n          nullable: !constraints.toUpperCase().includes('NOT NULL'),\n          unique: constraints.toUpperCase().includes('UNIQUE'),\n        }\n        const defaultMatch = constraints.match(/DEFAULT\\s+([^,\\s]+)/i)\n        if (defaultMatch?.[1]) {\n          column.default = defaultMatch[1]\n        }\n        columns.push(column)\n      }\n    }\n\n    // Parse primary key\n    const pkMatch = columnsBlock.match(/PRIMARY\\s+KEY\\s*\\(([^)]+)\\)/i)\n    const primaryKey = pkMatch?.[1]\n      ? { columns: pkMatch[1].split(',').map((c) => c.trim().replace(/\"/g, '')) }\n      : null\n\n    // Parse foreign keys\n    const foreignKeys: ExportedSchema['tables'][0]['foreignKeys'] = []\n    const fkRegex = /FOREIGN\\s+KEY\\s*\\(([^)]+)\\)\\s+REFERENCES\\s+\"?(\\w+)\"?\\s*\\(([^)]+)\\)/gi\n    let fkMatch: RegExpExecArray | null\n    while ((fkMatch = fkRegex.exec(columnsBlock)) !== null) {\n      if (fkMatch[1] && fkMatch[2] && fkMatch[3]) {\n        foreignKeys.push({\n          columns: fkMatch[1].split(',').map((c) => c.trim().replace(/\"/g, '')),\n          references: {\n            table: fkMatch[2],\n            columns: fkMatch[3].split(',').map((c) => c.trim().replace(/\"/g, '')),\n          },\n        })\n      }\n    }\n\n    tables.push({\n      name: tableName,\n      schema: schemaName,\n      columns,\n      primaryKey,\n      foreignKeys,\n      indexes: [],\n    })\n  }\n\n  // Parse views\n  while ((match = createViewRegex.exec(content)) !== null) {\n    if (match[2] && match[3]) {\n      views.push({\n        name: match[2],\n        schema: match[1] || 'public',\n        definition: match[3].trim(),\n      })\n    }\n  }\n\n  // Parse functions\n  while ((match = createFunctionRegex.exec(content)) !== null) {\n    if (match[2] && match[3]) {\n      functions.push({\n        name: match[2],\n        schema: match[1] || 'public',\n        definition: match[0],\n        language: match[3],\n      })\n    }\n  }\n\n  return { tables, views, functions, triggers, extensions }\n}\n\n/**\n * Run pg_dump import command\n */\nexport async function runImportPgDump(options: ImportPgDumpOptions): Promise<void> {\n  const { readFileSync, writeFileSync, mkdirSync, existsSync } = await import('node:fs')\n  const { resolve } = await import('node:path')\n\n  const startTime = Date.now()\n\n  if (!existsSync(options.file)) {\n    if (options.json) {\n      console.log(JSON.stringify({ success: false, error: `File not found: ${options.file}` }))\n    } else {\n      console.error(formatError(`File not found: ${options.file}`))\n    }\n    process.exit(1)\n  }\n\n  const outputDir = resolve(process.cwd(), options.outputDir || './migration-output')\n\n  if (!options.json) {\n    console.log('')\n    console.log(formatInfo('postgres.do Migration Tooling'))\n    console.log(formatDim('Importing pg_dump file'))\n    console.log('')\n  }\n\n  try {\n    // Read and parse the dump file\n    if (!options.json) {\n      console.log(formatInfo(`Reading ${options.file}...`))\n    }\n\n    const content = readFileSync(options.file, 'utf-8')\n    const schema = parsePgDumpFile(content)\n\n    if (!options.json) {\n      console.log(formatSuccess(`Parsed ${schema.tables.length} tables, ${schema.views.length} views, ${schema.functions.length} functions`))\n    }\n\n    // Validate if requested\n    if (options.validate) {\n      if (!options.json) {\n        console.log(formatInfo('Validating schema compatibility...'))\n      }\n\n      const validation = validateSchemaCompatibility(schema)\n\n      if (!options.json) {\n        if (validation.isCompatible) {\n          console.log(formatSuccess('Schema is compatible with PGLite'))\n        } else {\n          console.log(formatWarning(`Schema has ${validation.errorCount} compatibility issues`))\n        }\n      }\n    }\n\n    // Transform schema\n    if (!options.json) {\n      console.log(formatInfo('Transforming schema for PGLite...'))\n    }\n\n    const transformed = await transformSchema(schema, {\n      viewStrategy: 'preserve',\n    })\n\n    // Write output files\n    if (!options.dryRun) {\n      if (!existsSync(outputDir)) {\n        mkdirSync(outputDir, { recursive: true })\n      }\n\n      // Write transformed SQL\n      const schemaPath = resolve(outputDir, 'schema.sql')\n      writeFileSync(schemaPath, transformed.sql)\n\n      // Write schema JSON\n      const schemaJsonPath = resolve(outputDir, 'schema.json')\n      writeFileSync(schemaJsonPath, JSON.stringify(transformed.schema, null, 2))\n\n      if (!options.json) {\n        console.log(formatSuccess(`Output written to: ${outputDir}`))\n        console.log(formatDim(`  - ${schemaPath}`))\n        console.log(formatDim(`  - ${schemaJsonPath}`))\n      }\n    } else {\n      if (!options.json) {\n        console.log(formatInfo('Dry run - no files written'))\n      }\n    }\n\n    const duration = Date.now() - startTime\n\n    if (options.json) {\n      console.log(JSON.stringify({\n        success: true,\n        schema: {\n          tables: schema.tables.length,\n          views: schema.views.length,\n          functions: schema.functions.length,\n          extensions: schema.extensions,\n        },\n        transform: {\n          warnings: transformed.warnings.length,\n        },\n        duration,\n      }, null, 2))\n    } else {\n      console.log('')\n      console.log(formatSuccess(`Import completed in ${formatDuration(duration)}`))\n    }\n  } catch (error) {\n    if (options.json) {\n      console.log(JSON.stringify({ success: false, error: error instanceof Error ? error.message : String(error) }))\n    } else {\n      console.error(formatError(`Import failed: ${error instanceof Error ? error.message : error}`))\n    }\n    process.exit(1)\n  }\n}\n\n/**\n * Options for query compatibility test\n */\nexport interface QueryCompatibilityTestOptions {\n  /** Path to file containing test queries (one per line) */\n  queriesFile?: string\n  /** Individual queries to test */\n  queries?: string[]\n  /** Output as JSON */\n  json?: boolean\n  /** Verbose output */\n  verbose?: boolean\n}\n\n/**\n * Query test result\n */\nexport interface QueryTestResult {\n  query: string\n  compatible: boolean\n  issues?: string[]\n  suggestion?: string\n}\n\n/**\n * Check if a query uses PGLite-compatible features\n */\nfunction checkQueryCompatibility(query: string): QueryTestResult {\n  const issues: string[] = []\n\n  // Check for unsupported features\n  const unsupportedPatterns: Array<{ pattern: RegExp; feature: string; suggestion: string }> = [\n    {\n      pattern: /\\bLISTEN\\b/i,\n      feature: 'LISTEN/NOTIFY',\n      suggestion: 'Use polling or application-level pub/sub instead',\n    },\n    {\n      pattern: /\\bNOTIFY\\b/i,\n      feature: 'LISTEN/NOTIFY',\n      suggestion: 'Use polling or application-level pub/sub instead',\n    },\n    {\n      pattern: /\\bCREATE\\s+SUBSCRIPTION\\b/i,\n      feature: 'Logical replication',\n      suggestion: 'Use application-level data sync instead',\n    },\n    {\n      pattern: /\\bCREATE\\s+PUBLICATION\\b/i,\n      feature: 'Logical replication',\n      suggestion: 'Use application-level data sync instead',\n    },\n    {\n      pattern: /\\bCREATE\\s+FOREIGN\\s+TABLE\\b/i,\n      feature: 'Foreign data wrappers',\n      suggestion: 'Fetch data from external sources in application code',\n    },\n    {\n      pattern: /\\bST_\\w+\\s*\\(/i,\n      feature: 'PostGIS functions',\n      suggestion: 'Store coordinates as separate columns or use GeoJSON in text/jsonb',\n    },\n    {\n      pattern: /\\bgeography\\s*\\(/i,\n      feature: 'PostGIS geography type',\n      suggestion: 'Use text or jsonb to store GeoJSON',\n    },\n    {\n      pattern: /\\bgeometry\\s*\\(/i,\n      feature: 'PostGIS geometry type',\n      suggestion: 'Use text or jsonb to store GeoJSON',\n    },\n    {\n      pattern: /\\bts_rank\\s*\\(/i,\n      feature: 'Full-text search ranking',\n      suggestion: 'Implement ranking in application code or use LIKE with scoring',\n    },\n    {\n      pattern: /\\bplainto_tsquery\\s*\\(/i,\n      feature: 'Full-text search',\n      suggestion: 'Use LIKE/ILIKE for simple searches or implement in application',\n    },\n    {\n      pattern: /\\bto_tsvector\\s*\\(/i,\n      feature: 'Full-text search',\n      suggestion: 'Use LIKE/ILIKE for simple searches or implement in application',\n    },\n  ]\n\n  for (const { pattern, feature, suggestion } of unsupportedPatterns) {\n    if (pattern.test(query)) {\n      issues.push(`Uses ${feature}`)\n      return {\n        query,\n        compatible: false,\n        issues,\n        suggestion,\n      }\n    }\n  }\n\n  // Check for PostgreSQL-specific syntax that might need attention\n  const warningPatterns: Array<{ pattern: RegExp; warning: string }> = [\n    { pattern: /\\bRETURNING\\s+\\*/i, warning: 'RETURNING * is supported but may be slower than selecting specific columns' },\n    { pattern: /\\bFOR\\s+UPDATE\\s+SKIP\\s+LOCKED\\b/i, warning: 'SKIP LOCKED works but may behave differently in single-connection mode' },\n    { pattern: /\\bFOR\\s+UPDATE\\s+NOWAIT\\b/i, warning: 'NOWAIT works but may behave differently in single-connection mode' },\n  ]\n\n  for (const { pattern, warning } of warningPatterns) {\n    if (pattern.test(query)) {\n      issues.push(warning)\n    }\n  }\n\n  const result: QueryTestResult = {\n    query,\n    compatible: issues.length === 0 || issues.every((i) => i.includes('may')),\n  }\n  if (issues.length > 0) {\n    result.issues = issues\n  }\n  return result\n}\n\n/**\n * Run query compatibility test command\n */\nexport async function runQueryCompatibilityTest(options: QueryCompatibilityTestOptions): Promise<void> {\n  const queries: string[] = []\n\n  // Collect queries from file\n  if (options.queriesFile) {\n    const { readFileSync, existsSync } = await import('node:fs')\n\n    if (!existsSync(options.queriesFile)) {\n      if (options.json) {\n        console.log(JSON.stringify({ success: false, error: `File not found: ${options.queriesFile}` }))\n      } else {\n        console.error(formatError(`File not found: ${options.queriesFile}`))\n      }\n      process.exit(1)\n    }\n\n    const content = readFileSync(options.queriesFile, 'utf-8')\n    // Split by semicolons, trim, and filter empty lines\n    const fileQueries = content\n      .split(';')\n      .map((q) => q.trim())\n      .filter((q) => q && !q.startsWith('--'))\n    queries.push(...fileQueries)\n  }\n\n  // Add individual queries\n  if (options.queries) {\n    queries.push(...options.queries)\n  }\n\n  if (queries.length === 0) {\n    if (options.json) {\n      console.log(JSON.stringify({ success: false, error: 'No queries provided' }))\n    } else {\n      console.error(formatError('No queries provided. Use --queries-file or --queries'))\n    }\n    process.exit(1)\n  }\n\n  if (!options.json) {\n    console.log('')\n    console.log(formatInfo('Query Compatibility Test'))\n    console.log(formatDim(`Testing ${queries.length} queries for PGLite compatibility`))\n    console.log('')\n  }\n\n  const results: QueryTestResult[] = []\n  let compatibleCount = 0\n  let incompatibleCount = 0\n\n  for (const query of queries) {\n    const result = checkQueryCompatibility(query)\n    results.push(result)\n\n    if (result.compatible) {\n      compatibleCount++\n    } else {\n      incompatibleCount++\n    }\n\n    if (!options.json && options.verbose) {\n      const status = result.compatible ? formatSuccess('OK') : formatError('INCOMPATIBLE')\n      console.log(`${status} ${query.substring(0, 60)}${query.length > 60 ? '...' : ''}`)\n      if (result.issues && result.issues.length > 0) {\n        result.issues.forEach((issue) => {\n          console.log(formatDim(`  - ${issue}`))\n        })\n      }\n      if (result.suggestion) {\n        console.log(formatWarning(`  Suggestion: ${result.suggestion}`))\n      }\n    }\n  }\n\n  if (options.json) {\n    console.log(JSON.stringify({\n      success: true,\n      summary: {\n        total: queries.length,\n        compatible: compatibleCount,\n        incompatible: incompatibleCount,\n      },\n      results: options.verbose ? results : undefined,\n    }, null, 2))\n  } else {\n    console.log('')\n    console.log(formatInfo('Summary:'))\n    console.log(formatDim(`  Total queries: ${queries.length}`))\n    console.log(formatSuccess(`  Compatible: ${compatibleCount}`))\n    if (incompatibleCount > 0) {\n      console.log(formatError(`  Incompatible: ${incompatibleCount}`))\n    }\n    console.log('')\n\n    if (incompatibleCount > 0 && !options.verbose) {\n      console.log(formatWarning('Run with --verbose to see details of incompatible queries'))\n    }\n  }\n\n  // Exit with error if there are incompatible queries\n  if (incompatibleCount > 0) {\n    process.exit(1)\n  }\n}\n","/**\n * Schema Diff CLI Command\n *\n * Compare database schemas and generate migration SQL.\n *\n * @example\n * ```bash\n * # Diff two databases\n * npx postgres.do schema:diff --from $LOCAL_DB_URL --to $PROD_DB_URL\n *\n * # Generate migration from diff\n * npx postgres.do schema:diff --from $LOCAL_DB_URL --to $PROD_DB_URL --generate-migration\n *\n * # Output as JSON\n * npx postgres.do schema:diff --from $LOCAL_DB_URL --to $PROD_DB_URL --json\n * ```\n *\n * @module cli/commands/schema-diff\n */\n\nimport { writeFileSync } from 'node:fs'\nimport { resolve, dirname } from 'node:path'\nimport { mkdirSync, existsSync } from 'node:fs'\n\nimport postgres from '../../index.js'\nimport type { Sql } from '../../types.js'\nimport {\n  compareSchemas,\n  generateMigrationSQL,\n  generateDrizzleMigration,\n  formatSchemaDiff,\n  formatSchemaDiffJSON,\n  type SchemaDiffOptions,\n  type MigrationSQLOptions,\n} from '../../drizzle/schema-diff.js'\nimport type { SchemaDiffCLIOptions } from '../types.js'\nimport { formatSuccess, formatError, formatWarning, formatInfo } from '../formatting.js'\n\n/**\n * Run schema:diff command\n */\nexport async function runSchemaDiff(options: SchemaDiffCLIOptions): Promise<void> {\n  const fromUrl = options.from || process.env['SOURCE_DATABASE_URL'] || process.env['DATABASE_URL']\n  const toUrl = options.to || process.env['TARGET_DATABASE_URL']\n\n  if (!fromUrl) {\n    console.error(formatError('Source database URL is required'))\n    console.error('Provide --from or set SOURCE_DATABASE_URL/DATABASE_URL environment variable')\n    process.exit(1)\n  }\n\n  if (!toUrl) {\n    console.error(formatError('Target database URL is required'))\n    console.error('Provide --to or set TARGET_DATABASE_URL environment variable')\n    process.exit(1)\n  }\n\n  let sourceClient: Sql | null = null\n  let targetClient: Sql | null = null\n\n  try {\n    if (options.verbose) {\n      console.log(formatInfo('Connecting to source database...'))\n    }\n    sourceClient = postgres(fromUrl)\n\n    if (options.verbose) {\n      console.log(formatInfo('Connecting to target database...'))\n    }\n    targetClient = postgres(toUrl)\n\n    // Build diff options - only include defined values\n    const diffOptions: SchemaDiffOptions = {\n      compareIndexes: options.includeIndexes !== false,\n    }\n    if (options.ignoreCase !== undefined) diffOptions.ignoreCase = options.ignoreCase\n    if (options.includeTables !== undefined) diffOptions.includeTables = options.includeTables\n    if (options.excludeTables !== undefined) diffOptions.excludeTables = options.excludeTables\n\n    if (options.verbose) {\n      console.log(formatInfo('Comparing schemas...'))\n    }\n\n    // Build combined options for compareSchemas\n    const compareOptions: SchemaDiffOptions & { schema?: string; includeIndexes?: boolean } = {\n      ...diffOptions,\n    }\n    if (options.schema !== undefined) compareOptions.schema = options.schema\n    if (options.includeIndexes !== undefined) compareOptions.includeIndexes = options.includeIndexes\n\n    const diff = await compareSchemas(sourceClient, targetClient, compareOptions)\n\n    // Output results\n    if (options.json) {\n      console.log(formatSchemaDiffJSON(diff))\n    } else {\n      console.log(formatSchemaDiff(diff, { color: !options.noColor }))\n    }\n\n    // Generate migration if requested\n    if (options.generateMigration && !diff.isIdentical) {\n      const migrationOptions: MigrationSQLOptions = {\n        includeComments: true,\n      }\n      if (options.safeMode !== undefined) migrationOptions.safeMode = options.safeMode\n      if (options.schema !== undefined) migrationOptions.schema = options.schema\n      if (options.wrapInTransaction !== undefined) migrationOptions.wrapInTransaction = options.wrapInTransaction\n\n      const migration = generateMigrationSQL(diff, migrationOptions)\n\n      // Show warnings\n      if (migration.warnings.length > 0) {\n        console.log('')\n        console.log(formatWarning('Warnings:'))\n        for (const warning of migration.warnings) {\n          console.log(`  - ${warning}`)\n        }\n      }\n\n      // Determine output path\n      const outputDir = options.migrationsDir || './migrations'\n      const timestamp = new Date().toISOString().replace(/[-:T]/g, '').slice(0, 14)\n      const migrationName = options.migrationName || 'schema_sync'\n      const fileName = `${timestamp}_${migrationName}`\n\n      if (options.migrationFormat === 'sql') {\n        // Generate raw SQL files\n        const upPath = resolve(process.cwd(), outputDir, `${fileName}.up.sql`)\n        const downPath = resolve(process.cwd(), outputDir, `${fileName}.down.sql`)\n\n        ensureDirectoryExists(upPath)\n        writeFileSync(upPath, migration.upSQL)\n        writeFileSync(downPath, migration.downSQL)\n\n        console.log('')\n        console.log(formatSuccess(`Migration created:`))\n        console.log(`  Up:   ${upPath}`)\n        console.log(`  Down: ${downPath}`)\n      } else {\n        // Generate Drizzle migration file\n        const migrationPath = resolve(process.cwd(), outputDir, `${fileName}.ts`)\n        const drizzleMigration = generateDrizzleMigration(diff, migrationName, migrationOptions)\n\n        ensureDirectoryExists(migrationPath)\n        writeFileSync(migrationPath, drizzleMigration)\n\n        console.log('')\n        console.log(formatSuccess(`Migration created: ${migrationPath}`))\n      }\n\n      if (!migration.isReversible) {\n        console.log(formatWarning('Note: This migration may not be fully reversible'))\n      }\n    } else if (options.generateMigration && diff.isIdentical) {\n      console.log('')\n      console.log(formatInfo('No migration needed - schemas are identical'))\n    }\n\n    // Exit with code 1 if schemas differ (useful for CI)\n    if (options.exitCode && !diff.isIdentical) {\n      process.exit(1)\n    }\n  } finally {\n    if (sourceClient) {\n      await sourceClient.end()\n    }\n    if (targetClient) {\n      await targetClient.end()\n    }\n  }\n}\n\n/**\n * Ensure directory exists for a file path\n */\nfunction ensureDirectoryExists(filePath: string): void {\n  const dir = dirname(filePath)\n  if (!existsSync(dir)) {\n    mkdirSync(dir, { recursive: true })\n  }\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","/**\n * Schema Sync CLI Commands\n *\n * Pull and push database schemas.\n *\n * @example\n * ```bash\n * # Pull schema from database to local file\n * npx postgres.do schema:pull --url $DATABASE_URL --output ./schema.ts\n *\n * # Push local schema to database (diff and apply)\n * npx postgres.do schema:push --url $DATABASE_URL --input ./schema.ts\n *\n * # Push with dry run\n * npx postgres.do schema:push --url $DATABASE_URL --input ./schema.ts --dry-run\n * ```\n *\n * @module cli/commands/schema-sync\n */\n\nimport { writeFileSync, readFileSync } from 'node:fs'\nimport { resolve, dirname } from 'node:path'\nimport { mkdirSync, existsSync } from 'node:fs'\n\nimport postgres from '../../index.js'\nimport type { Sql } from '../../types.js'\nimport {\n  generateSchemaFromDatabase,\n  generateSchemaWithTypes,\n  introspectDatabase,\n  parseTypeScriptInterfaces,\n  convertInterfacesToTables,\n  type DatabaseSchemaDefinition,\n} from '../../drizzle/schema-generator.js'\nimport {\n  diffSchemas,\n  generateMigrationSQL,\n  formatSchemaDiff,\n  type SchemaDiffOptions,\n} from '../../drizzle/schema-diff.js'\nimport type { SchemaSyncCLIOptions } from '../types.js'\nimport { formatSuccess, formatError, formatWarning, formatInfo, formatProgress } from '../formatting.js'\n\n/**\n * Run schema:pull command\n *\n * Pull schema from a database and generate Drizzle schema file\n */\nexport async function runSchemaPull(options: SchemaSyncCLIOptions): Promise<void> {\n  const url = options.url || process.env['DATABASE_URL']\n\n  if (!url) {\n    console.error(formatError('Database URL is required'))\n    console.error('Provide --url or set DATABASE_URL environment variable')\n    process.exit(1)\n  }\n\n  const outputPath = resolve(process.cwd(), options.output || './schema.ts')\n\n  let client: Sql | null = null\n\n  try {\n    if (options.verbose) {\n      console.log(formatInfo('Connecting to database...'))\n    }\n    client = postgres(url)\n\n    if (options.verbose) {\n      console.log(formatInfo(`Introspecting schema '${options.schema || 'public'}'...`))\n    }\n\n    // Build generator options - only include defined values\n    const generatorOptions: {\n      schema?: string\n      includeRelations?: boolean\n      includeIndexes?: boolean\n      includeTables?: string[]\n      excludeTables?: string[]\n    } = {}\n    if (options.schema !== undefined) generatorOptions.schema = options.schema\n    if (options.includeRelations !== undefined) generatorOptions.includeRelations = options.includeRelations\n    if (options.includeIndexes !== undefined) generatorOptions.includeIndexes = options.includeIndexes\n    if (options.includeTables !== undefined) generatorOptions.includeTables = options.includeTables\n    if (options.excludeTables !== undefined) generatorOptions.excludeTables = options.excludeTables\n\n    if (options.generateTypes) {\n      const { schema, types } = await generateSchemaWithTypes(client, generatorOptions)\n\n      ensureDirectoryExists(outputPath)\n      writeFileSync(outputPath, schema)\n      console.log(formatSuccess(`Schema written to: ${outputPath}`))\n\n      const typesPath = outputPath.replace(/\\.ts$/, '.types.ts')\n      writeFileSync(typesPath, types)\n      console.log(formatSuccess(`Types written to: ${typesPath}`))\n    } else {\n      const schema = await generateSchemaFromDatabase(client, generatorOptions)\n\n      ensureDirectoryExists(outputPath)\n      writeFileSync(outputPath, schema)\n      console.log(formatSuccess(`Schema written to: ${outputPath}`))\n    }\n\n    if (options.json) {\n      const dbSchema = await introspectDatabase(client, generatorOptions)\n      console.log(JSON.stringify(dbSchema, null, 2))\n    }\n  } finally {\n    if (client) {\n      await client.end()\n    }\n  }\n}\n\n/**\n * Run schema:push command\n *\n * Push local schema to database by comparing and applying changes\n */\nexport async function runSchemaPush(options: SchemaSyncCLIOptions): Promise<void> {\n  const url = options.url || process.env['DATABASE_URL']\n\n  if (!url) {\n    console.error(formatError('Database URL is required'))\n    console.error('Provide --url or set DATABASE_URL environment variable')\n    process.exit(1)\n  }\n\n  if (!options.input) {\n    console.error(formatError('Input schema file is required'))\n    console.error('Provide --input with path to Drizzle schema file')\n    process.exit(1)\n  }\n\n  const inputPath = resolve(process.cwd(), options.input)\n\n  if (!existsSync(inputPath)) {\n    console.error(formatError(`Input file not found: ${inputPath}`))\n    process.exit(1)\n  }\n\n  let client: Sql | null = null\n\n  try {\n    if (options.verbose) {\n      console.log(formatInfo('Connecting to database...'))\n    }\n    client = postgres(url)\n\n    // Get current database schema\n    if (options.verbose) {\n      console.log(formatInfo('Introspecting current database schema...'))\n    }\n\n    const introspectOptions: { schema?: string; includeIndexes: boolean } = {\n      includeIndexes: true,\n    }\n    if (options.schema !== undefined) introspectOptions.schema = options.schema\n\n    const currentSchema = await introspectDatabase(client, introspectOptions)\n\n    // Parse desired schema from input file\n    if (options.verbose) {\n      console.log(formatInfo('Parsing local schema file...'))\n    }\n\n    const desiredSchema = await parseSchemaFile(inputPath, options.schema)\n\n    // Compare schemas\n    if (options.verbose) {\n      console.log(formatInfo('Comparing schemas...'))\n    }\n\n    const diffOptions: SchemaDiffOptions = {\n      compareIndexes: true,\n    }\n    if (options.excludeTables !== undefined) diffOptions.excludeTables = options.excludeTables\n    if (options.includeTables !== undefined) diffOptions.includeTables = options.includeTables\n\n    // Note: we diff from current -> desired to get the changes needed\n    const diff = diffSchemas(currentSchema, desiredSchema, diffOptions)\n\n    if (diff.isIdentical) {\n      console.log(formatSuccess('Schema is already up to date'))\n      return\n    }\n\n    // Show diff\n    console.log(formatSchemaDiff(diff, { color: !options.noColor }))\n\n    // Generate migration\n    const migrationOptions: { includeComments: boolean; safeMode: boolean; schema?: string } = {\n      includeComments: true,\n      safeMode: true,\n    }\n    if (options.schema !== undefined) migrationOptions.schema = options.schema\n\n    const migration = generateMigrationSQL(diff, migrationOptions)\n\n    // Show warnings\n    if (migration.warnings.length > 0) {\n      console.log('')\n      console.log(formatWarning('Warnings:'))\n      for (const warning of migration.warnings) {\n        console.log(`  - ${warning}`)\n      }\n    }\n\n    // Dry run - just show what would be executed\n    if (options.dryRun) {\n      console.log('')\n      console.log(formatInfo('Dry run - SQL that would be executed:'))\n      console.log('')\n      console.log(migration.upSQL)\n      return\n    }\n\n    // Require confirmation for destructive changes\n    if (!options.force && (diff.summary.tablesRemoved > 0 || diff.summary.columnsRemoved > 0)) {\n      console.log('')\n      console.log(formatWarning('This operation will remove tables/columns and may cause data loss.'))\n      console.log('Use --force to proceed or --dry-run to preview changes.')\n      process.exit(1)\n    }\n\n    // Apply changes\n    console.log('')\n    console.log(formatInfo('Applying schema changes...'))\n\n    for (let i = 0; i < migration.up.length; i++) {\n      const statement = migration.up[i]!\n      if (options.verbose) {\n        console.log(formatProgress(`Executing (${i + 1}/${migration.up.length}): ${statement.slice(0, 60)}...`))\n      }\n\n      try {\n        await client.unsafe(statement)\n      } catch (error) {\n        console.error(formatError(`Failed to execute: ${statement}`))\n        console.error(error instanceof Error ? error.message : String(error))\n\n        if (!options.force) {\n          console.error('')\n          console.error('Use --force to continue despite errors')\n          process.exit(1)\n        }\n      }\n    }\n\n    console.log('')\n    console.log(formatSuccess(`Schema push complete - ${migration.up.length} statements executed`))\n  } finally {\n    if (client) {\n      await client.end()\n    }\n  }\n}\n\n/**\n * Parse a Drizzle schema file and extract table definitions\n *\n * This is a simplified parser that works with common Drizzle schema patterns.\n * For complex schemas, consider using the TypeScript compiler API.\n */\nasync function parseSchemaFile(filePath: string, schemaName?: string): Promise<DatabaseSchemaDefinition> {\n  const source = readFileSync(filePath, 'utf-8')\n\n  // Try to parse as TypeScript interfaces first (for type definitions)\n  const interfaces = parseTypeScriptInterfaces(source)\n  if (interfaces.length > 0) {\n    const convertOptions: { schema?: string } = {}\n    if (schemaName !== undefined) convertOptions.schema = schemaName\n    const tables = convertInterfacesToTables(interfaces, convertOptions)\n    return {\n      tables,\n      enums: [],\n      schemaName: schemaName ?? 'public',\n    }\n  }\n\n  // Parse Drizzle table definitions\n  const tables = parseDrizzleTables(source, schemaName ?? 'public')\n  const enums = parseDrizzleEnums(source)\n\n  return {\n    tables,\n    enums,\n    schemaName: schemaName ?? 'public',\n  }\n}\n\n/**\n * Parse Drizzle pgTable definitions from source code\n */\nfunction parseDrizzleTables(source: string, schema: string): DatabaseSchemaDefinition['tables'] {\n  const tables: DatabaseSchemaDefinition['tables'] = []\n\n  // Match pgTable definitions\n  // Pattern: export const tableName = pgTable('table_name', { ... })\n  const tableRegex = /export\\s+const\\s+(\\w+)\\s*=\\s*pgTable\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*,\\s*\\{([^}]+)\\}/g\n\n  let match\n  while ((match = tableRegex.exec(source)) !== null) {\n    const tableName = match[2] ?? match[1]!\n    const columnsBody = match[3] ?? ''\n\n    const columns = parseDrizzleColumns(columnsBody)\n\n    tables.push({\n      name: tableName,\n      schema,\n      columns,\n      indexes: [],\n    })\n  }\n\n  return tables\n}\n\n/**\n * Parse Drizzle column definitions\n */\nfunction parseDrizzleColumns(body: string): DatabaseSchemaDefinition['tables'][0]['columns'] {\n  const columns: DatabaseSchemaDefinition['tables'][0]['columns'] = []\n\n  // Match column definitions\n  // Pattern: columnName: type('column_name').modifiers()\n  const columnRegex = /(\\w+):\\s*(\\w+)\\s*\\(\\s*['\"]([^'\"]+)['\"]/g\n\n  let match\n  while ((match = columnRegex.exec(body)) !== null) {\n    const columnDbName = match[3] ?? match[1]!\n    const drizzleType = match[2]!\n\n    // Get the full column definition to parse modifiers\n    const startIndex = match.index + match[0].length\n    const restOfBody = body.slice(startIndex)\n\n    // Find the end of this column definition (next comma at same level or end)\n    let depth = 1\n    let endIndex = 0\n    for (let i = 0; i < restOfBody.length; i++) {\n      const char = restOfBody[i]\n      if (char === '(' || char === '{' || char === '[') depth++\n      else if (char === ')' || char === '}' || char === ']') depth--\n      else if (char === ',' && depth === 0) {\n        endIndex = i\n        break\n      }\n      if (depth === 0) {\n        endIndex = i\n        break\n      }\n    }\n\n    const columnDef = restOfBody.slice(0, endIndex)\n\n    // Parse modifiers\n    const isPrimaryKey = columnDef.includes('.primaryKey()')\n    const isNotNull = columnDef.includes('.notNull()')\n    const isUnique = columnDef.includes('.unique()')\n    const hasDefault = columnDef.includes('.default(') || columnDef.includes('.defaultNow()')\n\n    // Get default value\n    let defaultValue: string | undefined\n    if (columnDef.includes('.defaultNow()')) {\n      defaultValue = 'now()'\n    } else if (columnDef.includes('.$defaultFn(')) {\n      // Custom default function - likely UUID\n      if (columnDef.includes('randomUUID')) {\n        defaultValue = 'gen_random_uuid()'\n      }\n    } else {\n      const defaultMatch = columnDef.match(/\\.default\\s*\\(\\s*([^)]+)\\s*\\)/)\n      if (defaultMatch) {\n        defaultValue = defaultMatch[1]\n      }\n    }\n\n    // Map Drizzle type to PostgreSQL type\n    const pgType = drizzleTypeToPgType(drizzleType)\n\n    const column: DatabaseSchemaDefinition['tables'][0]['columns'][0] = {\n      name: columnDbName,\n      pgType,\n      nullable: !isNotNull && !isPrimaryKey,\n      hasDefault,\n      isPrimaryKey,\n      isUnique,\n      isArray: false,\n    }\n    if (defaultValue !== undefined) {\n      column.defaultValue = defaultValue\n    }\n    columns.push(column)\n  }\n\n  return columns\n}\n\n/**\n * Parse Drizzle pgEnum definitions\n */\nfunction parseDrizzleEnums(source: string): DatabaseSchemaDefinition['enums'] {\n  const enums: DatabaseSchemaDefinition['enums'] = []\n\n  // Match pgEnum definitions\n  // Pattern: export const enumName = pgEnum('enum_name', ['value1', 'value2'])\n  const enumRegex = /export\\s+const\\s+(\\w+)\\s*=\\s*pgEnum\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*,\\s*\\[([^\\]]+)\\]/g\n\n  let match\n  while ((match = enumRegex.exec(source)) !== null) {\n    const enumName = match[2]!\n    const valuesStr = match[3] ?? ''\n\n    // Parse values\n    const values = valuesStr\n      .split(',')\n      .map(v => v.trim().replace(/^['\"]|['\"]$/g, ''))\n      .filter(Boolean)\n\n    enums.push({ name: enumName, values })\n  }\n\n  return enums\n}\n\n/**\n * Map Drizzle column type to PostgreSQL type\n */\nfunction drizzleTypeToPgType(drizzleType: string): string {\n  const typeMap: Record<string, string> = {\n    text: 'text',\n    varchar: 'character varying',\n    char: 'character',\n    integer: 'integer',\n    smallint: 'smallint',\n    bigint: 'bigint',\n    serial: 'serial',\n    smallserial: 'smallserial',\n    bigserial: 'bigserial',\n    real: 'real',\n    doublePrecision: 'double precision',\n    numeric: 'numeric',\n    decimal: 'numeric',\n    boolean: 'boolean',\n    date: 'date',\n    time: 'time',\n    timestamp: 'timestamp',\n    interval: 'interval',\n    uuid: 'uuid',\n    json: 'json',\n    jsonb: 'jsonb',\n    bytea: 'bytea',\n    inet: 'inet',\n    cidr: 'cidr',\n    macaddr: 'macaddr',\n    point: 'point',\n  }\n\n  return typeMap[drizzleType] ?? drizzleType\n}\n\n/**\n * Ensure directory exists for a file path\n */\nfunction ensureDirectoryExists(filePath: string): void {\n  const dir = dirname(filePath)\n  if (!existsSync(dir)) {\n    mkdirSync(dir, { recursive: true })\n  }\n}\n","/**\n * Dev Command\n *\n * Start local development environment for postgres.do with:\n * - Local PostgreSQL using PGLite\n * - Migration watching and hot reload\n * - Optional wrangler integration\n *\n * @module cli/commands/dev\n */\n\nimport { resolve, join } from 'node:path'\nimport { existsSync, watch, readFileSync, readdirSync, statSync } from 'node:fs'\nimport type { DevCLIOptions } from '../types.js'\nimport {\n  formatSuccess,\n  formatError,\n  formatInfo,\n  formatWarning,\n  formatDim,\n  formatMigrationResult,\n  formatDuration,\n  createSpinner,\n} from '../formatting.js'\nimport { loadMigrationsFromDirectory } from '../utils.js'\n\n/**\n * Configuration for the dev server\n */\ninterface DevServerConfig {\n  migrationsDir: string\n  seedsDir: string\n  port: number\n  dataDir: string | null // null = in-memory\n  verbose: boolean\n  watch: boolean\n  wrangler: boolean\n}\n\n/**\n * Dev server state\n */\ninterface DevServerState {\n  pglite: unknown | null\n  sql: unknown | null\n  isRunning: boolean\n  lastMigrationHash: string | null\n  migrationWatcher: ReturnType<typeof watch> | null\n  seedWatcher: ReturnType<typeof watch> | null\n}\n\nconst state: DevServerState = {\n  pglite: null,\n  sql: null,\n  isRunning: false,\n  lastMigrationHash: null,\n  migrationWatcher: null,\n  seedWatcher: null,\n}\n\n/**\n * Start the dev server\n */\nexport async function runDev(options: DevCLIOptions): Promise<void> {\n  const config: DevServerConfig = {\n    migrationsDir: resolve(process.cwd(), options.migrationsDir || './migrations'),\n    seedsDir: resolve(process.cwd(), options.seedsDir || './seeds'),\n    port: options.port || 5432,\n    dataDir: options.persist ? resolve(process.cwd(), options.dataDir || './.postgres.do') : null,\n    verbose: options.verbose || false,\n    watch: options.watch !== false, // Default to true\n    wrangler: options.wrangler || false,\n  }\n\n  console.log('')\n  console.log(formatInfo('Starting postgres.do dev server...'))\n  console.log('')\n\n  // Initialize PGLite\n  await initializePGLite(config)\n\n  // Run initial migrations\n  if (existsSync(config.migrationsDir)) {\n    await applyMigrations(config)\n  } else {\n    console.log(formatDim(`  No migrations directory found at ${config.migrationsDir}`))\n    console.log(formatDim('  Create migrations with: npx postgres.do migrate:create <name>'))\n  }\n\n  // Run seeds if requested\n  if (options.seed && existsSync(config.seedsDir)) {\n    await runSeeds(config)\n  }\n\n  // Start watchers if enabled\n  if (config.watch) {\n    startWatchers(config)\n  }\n\n  // Print connection info\n  printConnectionInfo(config)\n\n  // Handle shutdown\n  setupShutdownHandlers(config)\n\n  // Keep process running\n  await keepAlive(config)\n}\n\n/**\n * Initialize PGLite instance\n */\nasync function initializePGLite(config: DevServerConfig): Promise<void> {\n  const spinner = createSpinner('Initializing PGLite...')\n  spinner.start()\n\n  try {\n    // Dynamic import to handle optional dependency\n    const { PGlite } = await import('@dotdo/pglite')\n    const { createPGLiteSql } = await import('../../pglite/index.js')\n\n    // Create PGLite instance\n    const pgliteConfig = config.dataDir ? { dataDir: config.dataDir } : {}\n    const pglite = new PGlite(pgliteConfig)\n    await pglite.waitReady\n\n    // Create SQL interface\n    const sql = await createPGLiteSql(pglite)\n\n    state.pglite = pglite\n    state.sql = sql\n    state.isRunning = true\n\n    spinner.succeed(`PGLite initialized ${config.dataDir ? `(persistent: ${config.dataDir})` : '(in-memory)'}`)\n  } catch (error) {\n    spinner.fail('Failed to initialize PGLite')\n    if (error instanceof Error && error.message.includes('Cannot find module')) {\n      console.error(formatError('PGLite is not installed. Install it with:'))\n      console.error(formatInfo('  npm install @dotdo/pglite'))\n    } else {\n      console.error(formatError(error instanceof Error ? error.message : String(error)))\n    }\n    process.exit(1)\n  }\n}\n\n/**\n * Apply migrations from directory\n */\nasync function applyMigrations(config: DevServerConfig): Promise<void> {\n  console.log('')\n  console.log(formatInfo('Running migrations...'))\n\n  try {\n    const migrations = loadMigrationsFromDirectory(config.migrationsDir)\n\n    if (migrations.length === 0) {\n      console.log(formatDim('  No migrations found'))\n      return\n    }\n\n    // Import migration system\n    const { createMigrationRegistry, createMigrationRunner } = await import('@dotdo/postgres/migrations')\n\n    // Create registry - cast MigrationDefinition to Migration (structurally compatible)\n    const registry = createMigrationRegistry({ migrations: migrations as import('@dotdo/postgres/migrations').Migration[] })\n\n    // Create query executor from PGLite\n    const sql = state.sql as { unsafe: (query: string) => Promise<unknown[]> }\n    const executor = {\n      async query<T>(sqlStr: string): Promise<{ rows: T[]; fields: { name: string; dataTypeID: number }[] }> {\n        const result = await sql.unsafe(sqlStr)\n        return { rows: result as T[], fields: [] }\n      },\n    }\n\n    // Create runner - use conditional spreading for optional properties\n    const runner = createMigrationRunner(executor, registry, {\n      ...(config.verbose ? { debug: config.verbose } : {}),\n      onProgress: (event) => {\n        if (config.verbose || event.phase === 'completed' || event.phase === 'failed') {\n          // Adapt MigrationProgressEvent to MigrationProgressDisplay\n          const displayEvent = {\n            migration: event.migration,\n            index: event.index,\n            total: event.total,\n            phase: event.phase,\n            ...(event.durationMs !== undefined && { durationMs: event.durationMs }),\n            ...(event.error !== undefined && { error: event.error }),\n          }\n          console.log(formatMigrationResult(displayEvent))\n        }\n      },\n    })\n\n    // Run migrations\n    const startTime = Date.now()\n    const result = await runner.migrate()\n    const duration = Date.now() - startTime\n\n    // Store hash for change detection\n    state.lastMigrationHash = computeMigrationHash(config.migrationsDir)\n\n    if (result.success) {\n      if (result.migrationsRun === 0) {\n        console.log(formatDim('  Database is up to date'))\n      } else {\n        console.log(formatSuccess(`  Applied ${result.migrationsRun} migration(s) in ${formatDuration(duration)}`))\n      }\n    } else {\n      console.error(formatError('  Migration failed'))\n      const failedResult = result.results.find((r: { success: boolean }) => !r.success)\n      if (failedResult) {\n        console.error(formatError(`  Failed on: ${failedResult.id}`))\n        console.error(formatError(`  Error: ${failedResult.error}`))\n      }\n    }\n  } catch (error) {\n    console.error(formatError('Migration error:'), error instanceof Error ? error.message : error)\n    if (config.verbose && error instanceof Error && error.stack) {\n      console.error(error.stack)\n    }\n  }\n}\n\n/**\n * Run seed files\n */\nasync function runSeeds(config: DevServerConfig): Promise<void> {\n  console.log('')\n  console.log(formatInfo('Running seeds...'))\n\n  try {\n    const seedFiles = findSeedFiles(config.seedsDir)\n\n    if (seedFiles.length === 0) {\n      console.log(formatDim('  No seed files found'))\n      return\n    }\n\n    for (const seedFile of seedFiles) {\n      console.log(formatDim(`  Running ${seedFile.name}...`))\n\n      try {\n        // Try to load and run the seed\n        const seedPath = seedFile.path\n\n        // For SQL seeds\n        if (seedFile.name.endsWith('.sql')) {\n          const sql = state.sql as { unsafe: (query: string) => Promise<unknown[]> }\n          const content = readFileSync(seedPath, 'utf-8')\n          await sql.unsafe(content)\n          console.log(formatSuccess(`    Applied ${seedFile.name}`))\n        }\n        // For TypeScript/JavaScript seeds\n        else if (seedFile.name.endsWith('.ts') || seedFile.name.endsWith('.js')) {\n          // Dynamic import\n          const seedModule = await import(seedPath)\n          const seedFn = seedModule.default || seedModule.seed\n\n          if (typeof seedFn === 'function') {\n            await seedFn(state.sql)\n            console.log(formatSuccess(`    Applied ${seedFile.name}`))\n          } else {\n            console.log(formatWarning(`    Skipped ${seedFile.name} (no default export or seed function)`))\n          }\n        }\n      } catch (error) {\n        console.error(formatError(`    Failed ${seedFile.name}:`), error instanceof Error ? error.message : error)\n      }\n    }\n  } catch (error) {\n    console.error(formatError('Seed error:'), error instanceof Error ? error.message : error)\n  }\n}\n\n/**\n * Find seed files in directory\n */\nfunction findSeedFiles(dir: string): Array<{ name: string; path: string }> {\n  if (!existsSync(dir)) {\n    return []\n  }\n\n  const entries = readdirSync(dir)\n  const seedFiles: Array<{ name: string; path: string }> = []\n\n  for (const entry of entries) {\n    if (entry.startsWith('.') || entry.startsWith('_')) {\n      continue\n    }\n\n    const entryPath = join(dir, entry)\n    const stat = statSync(entryPath)\n\n    if (stat.isFile() && (entry.endsWith('.sql') || entry.endsWith('.ts') || entry.endsWith('.js'))) {\n      seedFiles.push({ name: entry, path: entryPath })\n    }\n  }\n\n  // Sort by name for consistent ordering\n  return seedFiles.sort((a, b) => a.name.localeCompare(b.name))\n}\n\n/**\n * Start file watchers for hot reload\n */\nfunction startWatchers(config: DevServerConfig): void {\n  console.log('')\n  console.log(formatInfo('Watching for changes...'))\n\n  // Watch migrations directory\n  if (existsSync(config.migrationsDir)) {\n    try {\n      state.migrationWatcher = watch(config.migrationsDir, { recursive: true }, (eventType, filename) => {\n        if (filename && (filename.endsWith('.ts') || filename.endsWith('.js') || filename.endsWith('.sql'))) {\n          handleMigrationChange(config, eventType, filename)\n        }\n      })\n      console.log(formatDim(`  Watching migrations: ${config.migrationsDir}`))\n    } catch (error) {\n      console.log(formatWarning(`  Could not watch migrations directory: ${error instanceof Error ? error.message : error}`))\n    }\n  }\n\n  // Watch seeds directory\n  if (existsSync(config.seedsDir)) {\n    try {\n      state.seedWatcher = watch(config.seedsDir, { recursive: true }, (eventType, filename) => {\n        if (filename && (filename.endsWith('.ts') || filename.endsWith('.js') || filename.endsWith('.sql'))) {\n          handleSeedChange(config, eventType, filename)\n        }\n      })\n      console.log(formatDim(`  Watching seeds: ${config.seedsDir}`))\n    } catch (error) {\n      console.log(formatWarning(`  Could not watch seeds directory: ${error instanceof Error ? error.message : error}`))\n    }\n  }\n}\n\n/**\n * Handle migration file changes\n */\nlet migrationChangeTimeout: NodeJS.Timeout | null = null\n\nfunction handleMigrationChange(config: DevServerConfig, eventType: string, filename: string): void {\n  // Debounce to avoid multiple triggers\n  if (migrationChangeTimeout) {\n    clearTimeout(migrationChangeTimeout)\n  }\n\n  migrationChangeTimeout = setTimeout(async () => {\n    const newHash = computeMigrationHash(config.migrationsDir)\n\n    if (newHash !== state.lastMigrationHash) {\n      console.log('')\n      console.log(formatInfo(`Migration ${eventType}: ${filename}`))\n\n      // Re-run migrations\n      await applyMigrations(config)\n    }\n  }, 100)\n}\n\n/**\n * Handle seed file changes\n */\nfunction handleSeedChange(_config: DevServerConfig, eventType: string, filename: string): void {\n  console.log('')\n  console.log(formatInfo(`Seed ${eventType}: ${filename}`))\n  console.log(formatDim('  Run `npx postgres.do dev:reset --seed` to re-apply seeds'))\n}\n\n/**\n * Compute hash of migration directory for change detection\n */\nfunction computeMigrationHash(dir: string): string {\n  if (!existsSync(dir)) {\n    return ''\n  }\n\n  try {\n    const migrations = loadMigrationsFromDirectory(dir)\n    return migrations.map((m) => `${m.id}:${m.version}:${m.up.length}`).join('|')\n  } catch {\n    return ''\n  }\n}\n\n/**\n * Print connection information\n */\nfunction printConnectionInfo(config: DevServerConfig): void {\n  console.log('')\n  console.log('----------------------------------------')\n  console.log(formatSuccess('postgres.do dev server is running!'))\n  console.log('----------------------------------------')\n  console.log('')\n  console.log('Connection Info:')\n  console.log(formatDim('  Type:     PGLite (embedded PostgreSQL)'))\n  console.log(formatDim(`  Storage:  ${config.dataDir || 'In-memory'}`))\n  console.log('')\n  console.log('Available Commands:')\n  console.log(formatDim('  npx postgres.do dev:reset       Reset database'))\n  console.log(formatDim('  npx postgres.do dev:reset --seed  Reset and seed'))\n  console.log(formatDim('  npx postgres.do migrate:create <name>  Create migration'))\n  console.log('')\n\n  if (config.wrangler) {\n    console.log(formatInfo('Wrangler integration enabled'))\n    console.log(formatDim('  Your Durable Objects will use this dev database'))\n    console.log('')\n  }\n\n  console.log(formatDim('Press Ctrl+C to stop'))\n  console.log('')\n}\n\n/**\n * Setup shutdown handlers\n */\nfunction setupShutdownHandlers(_config: DevServerConfig): void {\n  const shutdown = async () => {\n    console.log('')\n    console.log(formatInfo('Shutting down...'))\n\n    // Stop watchers\n    if (state.migrationWatcher) {\n      state.migrationWatcher.close()\n    }\n    if (state.seedWatcher) {\n      state.seedWatcher.close()\n    }\n\n    // Close PGLite\n    if (state.sql) {\n      try {\n        const sql = state.sql as { end: () => Promise<void> }\n        await sql.end()\n      } catch {\n        // Ignore errors during shutdown\n      }\n    }\n\n    state.isRunning = false\n    console.log(formatSuccess('Goodbye!'))\n    process.exit(0)\n  }\n\n  process.on('SIGINT', shutdown)\n  process.on('SIGTERM', shutdown)\n}\n\n/**\n * Keep process alive\n */\nasync function keepAlive(_config: DevServerConfig): Promise<void> {\n  // Keep the process running by waiting indefinitely\n  return new Promise(() => {\n    // This promise never resolves, keeping the process alive\n    // The shutdown handlers will call process.exit()\n  })\n}\n","/**\n * Dev Reset Command\n *\n * Reset the local development database to a clean state:\n * - Drop all tables and recreate\n * - Optionally re-run seeds\n * - Can target specific DO instance\n *\n * @module cli/commands/dev-reset\n */\n\nimport { resolve, join } from 'node:path'\nimport { existsSync, readFileSync, readdirSync, statSync, rmSync, mkdirSync } from 'node:fs'\nimport type { DevCLIOptions } from '../types.js'\nimport {\n  formatSuccess,\n  formatError,\n  formatInfo,\n  formatWarning,\n  formatDim,\n  formatMigrationResult,\n  formatDuration,\n  createSpinner,\n} from '../formatting.js'\nimport { loadMigrationsFromDirectory } from '../utils.js'\n\n/**\n * Reset the development database\n */\nexport async function runDevReset(options: DevCLIOptions): Promise<void> {\n  const migrationsDir = resolve(process.cwd(), options.migrationsDir || './migrations')\n  const seedsDir = resolve(process.cwd(), options.seedsDir || './seeds')\n  const dataDir = options.persist ? resolve(process.cwd(), options.dataDir || './.postgres.do') : null\n  const verbose = options.verbose || false\n  const shouldSeed = options.seed || false\n\n  console.log('')\n  console.log(formatInfo('Resetting development database...'))\n  console.log('')\n\n  try {\n    // If using persistent storage, we can delete the data directory\n    if (dataDir && existsSync(dataDir)) {\n      console.log(formatDim(`  Removing data directory: ${dataDir}`))\n      rmSync(dataDir, { recursive: true, force: true })\n      mkdirSync(dataDir, { recursive: true })\n    }\n\n    // Initialize PGLite\n    const spinner = createSpinner('Initializing fresh database...')\n    spinner.start()\n\n    // Dynamic import\n    const { PGlite } = await import('@dotdo/pglite')\n    const { createPGLiteSql } = await import('../../pglite/index.js')\n\n    // Create fresh PGLite instance\n    const pgliteConfig = dataDir ? { dataDir } : {}\n    const pglite = new PGlite(pgliteConfig)\n    await pglite.waitReady\n\n    // Create SQL interface\n    const sql = await createPGLiteSql(pglite)\n\n    spinner.succeed('Fresh database initialized')\n\n    // Run migrations\n    if (existsSync(migrationsDir)) {\n      console.log('')\n      console.log(formatInfo('Running migrations...'))\n\n      const migrations = loadMigrationsFromDirectory(migrationsDir)\n\n      if (migrations.length === 0) {\n        console.log(formatDim('  No migrations found'))\n      } else {\n        // Import migration system\n        const { createMigrationRegistry, createMigrationRunner } = await import('@dotdo/postgres/migrations')\n\n        // Create registry - cast MigrationDefinition to Migration (structurally compatible)\n        const registry = createMigrationRegistry({ migrations: migrations as import('@dotdo/postgres/migrations').Migration[] })\n\n        // Create query executor from PGLite\n        const executor = {\n          async query<T>(sqlStr: string): Promise<{ rows: T[]; fields: { name: string; dataTypeID: number }[] }> {\n            const result = await sql.unsafe(sqlStr)\n            return { rows: result as T[], fields: [] }\n          },\n        }\n\n        // Create runner - use conditional spreading for optional properties\n        const runner = createMigrationRunner(executor, registry, {\n          ...(verbose ? { debug: verbose } : {}),\n          onProgress: (event) => {\n            if (verbose || event.phase === 'completed' || event.phase === 'failed') {\n              // Adapt MigrationProgressEvent to MigrationProgressDisplay\n              const displayEvent = {\n                migration: event.migration,\n                index: event.index,\n                total: event.total,\n                phase: event.phase,\n                ...(event.durationMs !== undefined && { durationMs: event.durationMs }),\n                ...(event.error !== undefined && { error: event.error }),\n              }\n              console.log(formatMigrationResult(displayEvent))\n            }\n          },\n        })\n\n        // Run migrations\n        const startTime = Date.now()\n        const result = await runner.migrate()\n        const duration = Date.now() - startTime\n\n        if (result.success) {\n          console.log(formatSuccess(`  Applied ${result.migrationsRun} migration(s) in ${formatDuration(duration)}`))\n        } else {\n          console.error(formatError('  Migration failed'))\n          const failedResult = result.results.find((r: { success: boolean }) => !r.success)\n          if (failedResult) {\n            console.error(formatError(`  Failed on: ${failedResult.id}`))\n            console.error(formatError(`  Error: ${failedResult.error}`))\n          }\n          await sql.end()\n          process.exit(1)\n        }\n      }\n    }\n\n    // Run seeds if requested\n    if (shouldSeed && existsSync(seedsDir)) {\n      console.log('')\n      console.log(formatInfo('Running seeds...'))\n\n      const seedFiles = findSeedFiles(seedsDir)\n\n      if (seedFiles.length === 0) {\n        console.log(formatDim('  No seed files found'))\n      } else {\n        for (const seedFile of seedFiles) {\n          console.log(formatDim(`  Running ${seedFile.name}...`))\n\n          try {\n            // For SQL seeds\n            if (seedFile.name.endsWith('.sql')) {\n              const content = readFileSync(seedFile.path, 'utf-8')\n              await sql.unsafe(content)\n              console.log(formatSuccess(`    Applied ${seedFile.name}`))\n            }\n            // For TypeScript/JavaScript seeds\n            else if (seedFile.name.endsWith('.ts') || seedFile.name.endsWith('.js')) {\n              // Dynamic import\n              const seedModule = await import(seedFile.path)\n              const seedFn = seedModule.default || seedModule.seed\n\n              if (typeof seedFn === 'function') {\n                await seedFn(sql)\n                console.log(formatSuccess(`    Applied ${seedFile.name}`))\n              } else {\n                console.log(formatWarning(`    Skipped ${seedFile.name} (no default export or seed function)`))\n              }\n            }\n          } catch (error) {\n            console.error(formatError(`    Failed ${seedFile.name}:`), error instanceof Error ? error.message : error)\n          }\n        }\n      }\n    } else if (shouldSeed) {\n      console.log('')\n      console.log(formatWarning(`Seeds directory not found: ${seedsDir}`))\n    }\n\n    // Cleanup\n    await sql.end()\n\n    console.log('')\n    console.log(formatSuccess('Database reset complete!'))\n    console.log('')\n\n    // Output JSON if requested\n    if (options.json) {\n      console.log(JSON.stringify({\n        success: true,\n        dataDir,\n        migrationsApplied: existsSync(migrationsDir) ? loadMigrationsFromDirectory(migrationsDir).length : 0,\n        seedsApplied: shouldSeed && existsSync(seedsDir) ? findSeedFiles(seedsDir).length : 0,\n      }, null, 2))\n    }\n  } catch (error) {\n    console.error(formatError('Reset failed:'), error instanceof Error ? error.message : error)\n    if (verbose && error instanceof Error && error.stack) {\n      console.error(error.stack)\n    }\n    process.exit(1)\n  }\n}\n\n/**\n * Find seed files in directory\n */\nfunction findSeedFiles(dir: string): Array<{ name: string; path: string }> {\n  if (!existsSync(dir)) {\n    return []\n  }\n\n  const entries = readdirSync(dir)\n  const seedFiles: Array<{ name: string; path: string }> = []\n\n  for (const entry of entries) {\n    if (entry.startsWith('.') || entry.startsWith('_')) {\n      continue\n    }\n\n    const entryPath = join(dir, entry)\n    const stat = statSync(entryPath)\n\n    if (stat.isFile() && (entry.endsWith('.sql') || entry.endsWith('.ts') || entry.endsWith('.js'))) {\n      seedFiles.push({ name: entry, path: entryPath })\n    }\n  }\n\n  // Sort by name for consistent ordering\n  return seedFiles.sort((a, b) => a.name.localeCompare(b.name))\n}\n","/**\n * CLI Configuration Loader\n *\n * Loads and manages configuration from ~/.postgres.do/config.json\n *\n * @module cli/config\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\n\n/**\n * CLI Configuration structure\n */\nexport interface CLIConfig {\n  /** Default API URL for postgres.do service */\n  apiUrl?: string\n  /** Default database name */\n  defaultDatabase?: string\n  /** Output format preference */\n  outputFormat?: 'json' | 'table' | 'plain'\n  /** Enable verbose output by default */\n  verbose?: boolean\n  /** Authentication tokens (keyed by API URL) */\n  auth?: {\n    [apiUrl: string]: {\n      token: string\n      expiresAt?: string\n      refreshToken?: string\n    }\n  }\n  /** Recent databases (for autocomplete) */\n  recentDatabases?: string[]\n  /** Migration settings */\n  migrations?: {\n    defaultDir?: string\n    format?: 'ts' | 'sql'\n  }\n}\n\n/**\n * Default configuration values\n */\nconst DEFAULT_CONFIG: CLIConfig = {\n  apiUrl: 'https://api.postgres.do',\n  outputFormat: 'table',\n  verbose: false,\n  auth: {},\n  recentDatabases: [],\n  migrations: {\n    defaultDir: './migrations',\n    format: 'ts',\n  },\n}\n\n/**\n * Get the configuration directory path\n */\nexport function getConfigDir(): string {\n  return join(homedir(), '.postgres.do')\n}\n\n/**\n * Get the configuration file path\n */\nexport function getConfigPath(): string {\n  return join(getConfigDir(), 'config.json')\n}\n\n/**\n * Ensure the configuration directory exists\n */\nexport function ensureConfigDir(): void {\n  const configDir = getConfigDir()\n  if (!existsSync(configDir)) {\n    mkdirSync(configDir, { recursive: true, mode: 0o700 })\n  }\n}\n\n/**\n * Load configuration from disk\n *\n * @returns The loaded configuration merged with defaults\n */\nexport function loadConfig(): CLIConfig {\n  const configPath = getConfigPath()\n\n  if (!existsSync(configPath)) {\n    return { ...DEFAULT_CONFIG }\n  }\n\n  try {\n    const content = readFileSync(configPath, 'utf-8')\n    const userConfig = JSON.parse(content) as Partial<CLIConfig>\n\n    // Deep merge with defaults\n    return {\n      ...DEFAULT_CONFIG,\n      ...userConfig,\n      auth: {\n        ...DEFAULT_CONFIG.auth,\n        ...userConfig.auth,\n      },\n      migrations: {\n        ...DEFAULT_CONFIG.migrations,\n        ...userConfig.migrations,\n      },\n    }\n  } catch (error) {\n    // If config is corrupted, return defaults\n    console.warn(`Warning: Could not parse config file: ${configPath}`)\n    return { ...DEFAULT_CONFIG }\n  }\n}\n\n/**\n * Save configuration to disk\n *\n * @param config - The configuration to save\n */\nexport function saveConfig(config: CLIConfig): void {\n  ensureConfigDir()\n  const configPath = getConfigPath()\n\n  try {\n    writeFileSync(configPath, JSON.stringify(config, null, 2), {\n      mode: 0o600, // User read/write only for security\n    })\n  } catch (error) {\n    throw new Error(`Failed to save config: ${error instanceof Error ? error.message : 'Unknown error'}`)\n  }\n}\n\n/**\n * Update specific configuration values\n *\n * @param updates - Partial configuration updates\n * @returns The updated configuration\n */\nexport function updateConfig(updates: Partial<CLIConfig>): CLIConfig {\n  const config = loadConfig()\n\n  // Merge updates explicitly to handle optional properties\n  const updated: CLIConfig = { ...config }\n\n  // Apply updates\n  if (updates.apiUrl !== undefined) updated.apiUrl = updates.apiUrl\n  if (updates.defaultDatabase !== undefined) updated.defaultDatabase = updates.defaultDatabase\n  if (updates.outputFormat !== undefined) updated.outputFormat = updates.outputFormat\n  if (updates.verbose !== undefined) updated.verbose = updates.verbose\n  if (updates.recentDatabases !== undefined) updated.recentDatabases = updates.recentDatabases\n\n  // Merge auth\n  if (updates.auth) {\n    updated.auth = { ...config.auth, ...updates.auth }\n  }\n\n  // Merge migrations\n  if (updates.migrations) {\n    updated.migrations = { ...config.migrations, ...updates.migrations }\n  }\n\n  saveConfig(updated)\n  return updated\n}\n\n/**\n * Get a specific configuration value\n *\n * @param key - Configuration key\n * @returns The configuration value or undefined\n */\nexport function getConfigValue<K extends keyof CLIConfig>(key: K): CLIConfig[K] {\n  const config = loadConfig()\n  return config[key]\n}\n\n/**\n * Set a specific configuration value\n *\n * @param key - Configuration key\n * @param value - Configuration value\n */\nexport function setConfigValue<K extends keyof CLIConfig>(key: K, value: CLIConfig[K]): void {\n  updateConfig({ [key]: value } as Partial<CLIConfig>)\n}\n\n/**\n * Add a database to recent databases list\n *\n * @param database - Database name to add\n */\nexport function addRecentDatabase(database: string): void {\n  const config = loadConfig()\n  const recent = config.recentDatabases || []\n\n  // Remove if already exists, then add to front\n  const filtered = recent.filter((d) => d !== database)\n  filtered.unshift(database)\n\n  // Keep only last 10\n  const updated = filtered.slice(0, 10)\n\n  updateConfig({ recentDatabases: updated })\n}\n\n/**\n * Get the effective API URL\n *\n * @param override - Optional URL override from command line\n * @returns The API URL to use\n */\nexport function getApiUrl(override?: string): string {\n  if (override) return override\n  if (process.env['POSTGRES_DO_API_URL']) return process.env['POSTGRES_DO_API_URL']\n  return loadConfig().apiUrl || DEFAULT_CONFIG.apiUrl!\n}\n\n/**\n * Reset configuration to defaults\n */\nexport function resetConfig(): void {\n  saveConfig({ ...DEFAULT_CONFIG })\n}\n","/**\n * CLI Authentication Integration\n *\n * Store and load authentication tokens for the CLI.\n * Uses secure storage in ~/.postgres.do/config.json\n *\n * @module cli/cli-auth\n */\n\nimport { loadConfig, saveConfig, getApiUrl } from './config.js'\nimport { validateToken, type TokenValidationResult } from '../auth.js'\n\n/**\n * Authentication token info\n */\nexport interface AuthToken {\n  token: string\n  expiresAt?: Date\n  refreshToken?: string\n  user?: {\n    id: string\n    email: string\n    name?: string\n  }\n}\n\n/**\n * Login result\n */\nexport interface LoginResult {\n  success: boolean\n  token?: string\n  user?: {\n    id: string\n    email: string\n    name?: string\n  }\n  error?: string\n}\n\n/**\n * Store authentication token for an API URL\n *\n * @param token - The authentication token\n * @param apiUrl - The API URL (defaults to configured URL)\n * @param expiresAt - Optional expiration date\n * @param refreshToken - Optional refresh token\n */\nexport function storeToken(\n  token: string,\n  apiUrl?: string,\n  expiresAt?: Date,\n  refreshToken?: string\n): void {\n  const config = loadConfig()\n  const url = apiUrl || getApiUrl()\n\n  config.auth = config.auth || {}\n  const authEntry: { token: string; expiresAt?: string; refreshToken?: string } = { token }\n  if (expiresAt) authEntry.expiresAt = expiresAt.toISOString()\n  if (refreshToken) authEntry.refreshToken = refreshToken\n  config.auth[url] = authEntry\n\n  saveConfig(config)\n}\n\n/**\n * Load authentication token for an API URL\n *\n * @param apiUrl - The API URL (defaults to configured URL)\n * @returns The stored token info or null if not found\n */\nexport function loadToken(apiUrl?: string): AuthToken | null {\n  const config = loadConfig()\n  const url = apiUrl || getApiUrl()\n\n  const authInfo = config.auth?.[url]\n  if (!authInfo) return null\n\n  const result: AuthToken = { token: authInfo.token }\n  if (authInfo.expiresAt) result.expiresAt = new Date(authInfo.expiresAt)\n  if (authInfo.refreshToken) result.refreshToken = authInfo.refreshToken\n  return result\n}\n\n/**\n * Remove authentication token for an API URL\n *\n * @param apiUrl - The API URL (defaults to configured URL)\n */\nexport function removeToken(apiUrl?: string): void {\n  const config = loadConfig()\n  const url = apiUrl || getApiUrl()\n\n  if (config.auth?.[url]) {\n    delete config.auth[url]\n    saveConfig(config)\n  }\n}\n\n/**\n * Check if a token is stored and not expired\n *\n * @param apiUrl - The API URL (defaults to configured URL)\n * @returns True if a valid token is stored\n */\nexport function hasValidToken(apiUrl?: string): boolean {\n  const auth = loadToken(apiUrl)\n  if (!auth) return false\n\n  // Check if expired\n  if (auth.expiresAt && auth.expiresAt < new Date()) {\n    return false\n  }\n\n  return true\n}\n\n/**\n * Get the current authentication token\n *\n * Checks for token in this order:\n * 1. POSTGRES_DO_API_KEY environment variable\n * 2. Stored token in config\n *\n * @param apiUrl - The API URL (defaults to configured URL)\n * @returns The token or null if not found\n */\nexport function getToken(apiUrl?: string): string | null {\n  // Check environment variable first\n  if (process.env['POSTGRES_DO_API_KEY']) {\n    return process.env['POSTGRES_DO_API_KEY']\n  }\n\n  // Check stored token\n  const auth = loadToken(apiUrl)\n  if (auth && hasValidToken(apiUrl)) {\n    return auth.token\n  }\n\n  return null\n}\n\n/**\n * Ensure we have a valid token, throwing if not\n *\n * @param apiUrl - The API URL (defaults to configured URL)\n * @returns The valid token\n * @throws Error if no valid token is available\n */\nexport function requireToken(apiUrl?: string): string {\n  const token = getToken(apiUrl)\n  if (!token) {\n    throw new Error(\n      'Authentication required. Run `postgres.do login` or set POSTGRES_DO_API_KEY environment variable.'\n    )\n  }\n  return token\n}\n\n/**\n * Validate and refresh the current token\n *\n * @param apiUrl - The API URL (defaults to configured URL)\n * @returns Validation result\n */\nexport async function validateCurrentToken(apiUrl?: string): Promise<TokenValidationResult> {\n  const token = getToken(apiUrl)\n  if (!token) {\n    return {\n      valid: false,\n      error: 'No token available',\n    }\n  }\n\n  const url = apiUrl || getApiUrl()\n  const oauthUrl = url.replace('api.postgres.do', 'oauth.do')\n\n  return validateToken(token, { oauthUrl })\n}\n\n/**\n * Login with credentials (for non-interactive use)\n *\n * @param email - User email\n * @param password - User password\n * @param apiUrl - The API URL (defaults to configured URL)\n * @returns Login result\n */\nexport async function loginWithCredentials(\n  email: string,\n  password: string,\n  apiUrl?: string\n): Promise<LoginResult> {\n  const url = apiUrl || getApiUrl()\n  const oauthUrl = url.replace('api.postgres.do', 'oauth.do')\n\n  try {\n    const response = await fetch(`${oauthUrl}/api/auth/login`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify({ email, password }),\n    })\n\n    if (!response.ok) {\n      const error = await response.json().catch(() => ({ message: 'Login failed' }))\n      return {\n        success: false,\n        error: (error as { message?: string }).message || 'Login failed',\n      }\n    }\n\n    const data = await response.json() as {\n      token: string\n      expiresAt?: string\n      refreshToken?: string\n      user?: { id: string; email: string; name?: string }\n    }\n\n    // Store the token\n    storeToken(\n      data.token,\n      url,\n      data.expiresAt ? new Date(data.expiresAt) : undefined,\n      data.refreshToken\n    )\n\n    const result: LoginResult = {\n      success: true,\n      token: data.token,\n    }\n    if (data.user) result.user = data.user\n    return result\n  } catch (error) {\n    return {\n      success: false,\n      error: `Login error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n    }\n  }\n}\n\n/**\n * Login with API key\n *\n * @param apiKey - The API key\n * @param apiUrl - The API URL (defaults to configured URL)\n * @returns Login result\n */\nexport async function loginWithApiKey(apiKey: string, apiUrl?: string): Promise<LoginResult> {\n  const url = apiUrl || getApiUrl()\n\n  // Validate the API key\n  const validation = await validateToken(apiKey, {\n    oauthUrl: url.replace('api.postgres.do', 'oauth.do'),\n  })\n\n  if (!validation.valid) {\n    return {\n      success: false,\n      error: validation.error || 'Invalid API key',\n    }\n  }\n\n  // Store the token\n  storeToken(apiKey, url, validation.expiresAt)\n\n  const result: LoginResult = {\n    success: true,\n    token: apiKey,\n  }\n  if (validation.user) result.user = validation.user\n  return result\n}\n\n/**\n * Logout (remove stored token)\n *\n * @param apiUrl - The API URL (defaults to configured URL)\n */\nexport function logout(apiUrl?: string): void {\n  removeToken(apiUrl)\n}\n\n/**\n * Get current user info if logged in\n *\n * @param apiUrl - The API URL (defaults to configured URL)\n * @returns User info or null if not logged in\n */\nexport async function getCurrentUser(apiUrl?: string): Promise<{\n  id: string\n  email: string\n  name?: string\n} | null> {\n  const validation = await validateCurrentToken(apiUrl)\n  return validation.valid && validation.user ? validation.user : null\n}\n\n/**\n * Check if user is logged in\n *\n * @param apiUrl - The API URL (defaults to configured URL)\n * @returns True if logged in\n */\nexport function isLoggedIn(apiUrl?: string): boolean {\n  return hasValidToken(apiUrl)\n}\n","/**\n * CLI Output Formatter\n *\n * Provides formatting utilities for JSON, table, and plain text output.\n *\n * @module cli/output\n */\n\nimport { formatTable as formatAsciiTable } from './formatting.js'\n\n/**\n * Output format type\n */\nexport type OutputFormat = 'json' | 'table' | 'plain'\n\n/**\n * Output formatter options\n */\nexport interface OutputOptions {\n  format?: OutputFormat | undefined\n  noColor?: boolean | undefined\n  verbose?: boolean | undefined\n}\n\n/**\n * Get current output format from options and environment\n */\nexport function getOutputFormat(options: OutputOptions): OutputFormat {\n  if (options.format) return options.format\n  if (process.env['POSTGRES_DO_OUTPUT_FORMAT']) {\n    return process.env['POSTGRES_DO_OUTPUT_FORMAT'] as OutputFormat\n  }\n  return 'table'\n}\n\n/**\n * Check if colors should be used\n */\nexport function shouldUseColor(options: OutputOptions): boolean {\n  if (options.noColor) return false\n  if (process.env['NO_COLOR']) return false\n  return process.stdout.isTTY ?? false\n}\n\n// ANSI color codes\nconst colors = {\n  reset: '\\x1b[0m',\n  bold: '\\x1b[1m',\n  dim: '\\x1b[2m',\n  red: '\\x1b[31m',\n  green: '\\x1b[32m',\n  yellow: '\\x1b[33m',\n  blue: '\\x1b[34m',\n  magenta: '\\x1b[35m',\n  cyan: '\\x1b[36m',\n  white: '\\x1b[37m',\n  gray: '\\x1b[90m',\n}\n\n/**\n * Apply color to text\n */\nfunction colorize(text: string, color: keyof typeof colors, options: OutputOptions): string {\n  if (!shouldUseColor(options)) return text\n  return `${colors[color]}${text}${colors.reset}`\n}\n\n/**\n * Format data based on output format\n */\nexport function formatOutput(\n  data: unknown,\n  options: OutputOptions = {}\n): string {\n  const format = getOutputFormat(options)\n\n  switch (format) {\n    case 'json':\n      return formatJson(data)\n    case 'table':\n      return formatTableOutput(data, options)\n    case 'plain':\n      return formatPlain(data)\n    default:\n      return formatTableOutput(data, options)\n  }\n}\n\n/**\n * Format data as JSON\n */\nexport function formatJson(data: unknown): string {\n  return JSON.stringify(data, null, 2)\n}\n\n/**\n * Format data as plain text\n */\nexport function formatPlain(data: unknown): string {\n  if (data === null || data === undefined) return ''\n  if (typeof data === 'string') return data\n  if (typeof data !== 'object') return String(data)\n\n  if (Array.isArray(data)) {\n    return data.map((item) => formatPlain(item)).join('\\n')\n  }\n\n  // Object: key=value pairs\n  return Object.entries(data as Record<string, unknown>)\n    .map(([key, value]) => `${key}=${formatValue(value)}`)\n    .join('\\n')\n}\n\n/**\n * Format a single value for plain text\n */\nfunction formatValue(value: unknown): string {\n  if (value === null || value === undefined) return ''\n  if (typeof value === 'object') return JSON.stringify(value)\n  return String(value)\n}\n\n/**\n * Format data as ASCII table\n */\nexport function formatTableOutput(data: unknown, options: OutputOptions = {}): string {\n  if (data === null || data === undefined) return ''\n  if (typeof data !== 'object') return String(data)\n\n  if (Array.isArray(data)) {\n    if (data.length === 0) return colorize('(empty)', 'dim', options)\n\n    // Check if array of objects\n    if (typeof data[0] === 'object' && data[0] !== null) {\n      return formatObjectArray(data as Record<string, unknown>[], options)\n    }\n\n    // Array of primitives\n    return data.map((item) => String(item)).join('\\n')\n  }\n\n  // Single object\n  return formatSingleObject(data as Record<string, unknown>, options)\n}\n\n/**\n * Format an array of objects as a table\n */\nfunction formatObjectArray(\n  data: Record<string, unknown>[],\n  options: OutputOptions\n): string {\n  if (data.length === 0) return colorize('(empty)', 'dim', options)\n\n  // Get all unique keys\n  const keys = new Set<string>()\n  for (const item of data) {\n    for (const key of Object.keys(item)) {\n      keys.add(key)\n    }\n  }\n\n  const headers = Array.from(keys)\n  const rows = data.map((item) =>\n    headers.map((key) => formatCellValue(item[key]))\n  )\n\n  return formatAsciiTable(headers, rows)\n}\n\n/**\n * Format a single object as key-value pairs\n */\nfunction formatSingleObject(\n  data: Record<string, unknown>,\n  options: OutputOptions\n): string {\n  const maxKeyLength = Math.max(...Object.keys(data).map((k) => k.length))\n\n  return Object.entries(data)\n    .map(([key, value]) => {\n      const paddedKey = key.padEnd(maxKeyLength)\n      const formattedKey = colorize(paddedKey, 'cyan', options)\n      return `${formattedKey}  ${formatCellValue(value)}`\n    })\n    .join('\\n')\n}\n\n/**\n * Format a cell value for table display\n */\nfunction formatCellValue(value: unknown): string {\n  if (value === null) return 'null'\n  if (value === undefined) return ''\n  if (typeof value === 'boolean') return value ? 'true' : 'false'\n  if (value instanceof Date) return value.toISOString()\n  if (typeof value === 'object') return JSON.stringify(value)\n  return String(value)\n}\n\n/**\n * Print formatted output to stdout\n */\nexport function print(data: unknown, options: OutputOptions = {}): void {\n  console.log(formatOutput(data, options))\n}\n\n/**\n * Print error output to stderr\n */\nexport function printError(message: string, options: OutputOptions = {}): void {\n  const format = getOutputFormat(options)\n\n  if (format === 'json') {\n    console.error(JSON.stringify({ error: message }))\n  } else {\n    console.error(colorize(`Error: ${message}`, 'red', options))\n  }\n}\n\n/**\n * Print success message\n */\nexport function printSuccess(message: string, options: OutputOptions = {}): void {\n  const format = getOutputFormat(options)\n\n  if (format === 'json') {\n    console.log(JSON.stringify({ success: true, message }))\n  } else {\n    console.log(colorize(`Success: ${message}`, 'green', options))\n  }\n}\n\n/**\n * Print warning message\n */\nexport function printWarning(message: string, options: OutputOptions = {}): void {\n  const format = getOutputFormat(options)\n\n  if (format === 'json') {\n    console.log(JSON.stringify({ warning: message }))\n  } else {\n    console.log(colorize(`Warning: ${message}`, 'yellow', options))\n  }\n}\n\n/**\n * Print info message\n */\nexport function printInfo(message: string, options: OutputOptions = {}): void {\n  const format = getOutputFormat(options)\n\n  if (format === 'json') {\n    // Skip info messages in JSON mode unless verbose\n    if (options.verbose) {\n      console.log(JSON.stringify({ info: message }))\n    }\n  } else {\n    console.log(colorize(message, 'blue', options))\n  }\n}\n\n/**\n * Print verbose message (only if verbose is enabled)\n */\nexport function printVerbose(message: string, options: OutputOptions = {}): void {\n  if (!options.verbose) return\n\n  const format = getOutputFormat(options)\n\n  if (format === 'json') {\n    console.log(JSON.stringify({ verbose: message }))\n  } else {\n    console.log(colorize(`[verbose] ${message}`, 'dim', options))\n  }\n}\n\n/**\n * Create a result object for commands\n */\nexport interface CommandResult<T = unknown> {\n  success: boolean\n  data?: T | undefined\n  message?: string | undefined\n  error?: string | undefined\n}\n\n/**\n * Print a command result\n */\nexport function printResult<T>(result: CommandResult<T>, options: OutputOptions = {}): void {\n  const format = getOutputFormat(options)\n\n  if (format === 'json') {\n    console.log(JSON.stringify(result, null, 2))\n    return\n  }\n\n  if (result.success) {\n    if (result.message) {\n      printSuccess(result.message, options)\n    }\n    if (result.data !== undefined) {\n      print(result.data, options)\n    }\n  } else {\n    if (result.error) {\n      printError(result.error, options)\n    }\n  }\n}\n\n/**\n * Format bytes to human readable string\n */\nexport function formatBytes(bytes: number): string {\n  const units = ['B', 'KB', 'MB', 'GB', 'TB']\n  let unitIndex = 0\n  let value = bytes\n\n  while (value >= 1024 && unitIndex < units.length - 1) {\n    value /= 1024\n    unitIndex++\n  }\n\n  return `${value.toFixed(unitIndex === 0 ? 0 : 2)} ${units[unitIndex]}`\n}\n\n/**\n * Format duration to human readable string\n */\nexport function formatDuration(ms: number): string {\n  if (ms < 1000) return `${ms}ms`\n  if (ms < 60000) return `${(ms / 1000).toFixed(2)}s`\n\n  const minutes = Math.floor(ms / 60000)\n  const seconds = ((ms % 60000) / 1000).toFixed(0)\n  return `${minutes}m ${seconds}s`\n}\n","/**\n * Create Command\n *\n * Create a new database on postgres.do\n *\n * @module cli/commands/create\n */\n\nimport { requireToken } from '../cli-auth.js'\nimport { getApiUrl, addRecentDatabase } from '../config.js'\nimport { printResult, printInfo, printVerbose, type OutputOptions, type CommandResult } from '../output.js'\n\n/**\n * Create command options\n */\nexport interface CreateOptions extends OutputOptions {\n  /** Database name */\n  name: string\n  /** Region for the database */\n  region?: string | undefined\n  /** Database plan */\n  plan?: 'free' | 'pro' | 'enterprise' | undefined\n  /** Wait for database to be ready */\n  wait?: boolean | undefined\n  /** Timeout for waiting (ms) */\n  timeout?: number | undefined\n  /** API URL override */\n  apiUrl?: string | undefined\n}\n\n/**\n * Database creation result\n */\nexport interface DatabaseInfo {\n  id: string\n  name: string\n  status: 'creating' | 'ready' | 'error'\n  region: string\n  plan: string\n  connectionUrl?: string\n  createdAt: string\n}\n\n/**\n * Create a new database\n */\nexport async function runCreate(options: CreateOptions): Promise<void> {\n  const { name, region, plan, wait = true, timeout = 60000 } = options\n\n  // Validate database name\n  if (!name) {\n    printResult({\n      success: false,\n      error: 'Database name is required',\n    }, options)\n    process.exit(1)\n  }\n\n  if (!/^[a-z][a-z0-9_-]{0,62}$/.test(name)) {\n    printResult({\n      success: false,\n      error: 'Database name must start with a letter, contain only lowercase letters, numbers, underscores, and hyphens, and be 1-63 characters long',\n    }, options)\n    process.exit(1)\n  }\n\n  try {\n    const token = requireToken(options.apiUrl)\n    const apiUrl = getApiUrl(options.apiUrl)\n\n    printInfo(`Creating database '${name}'...`, options)\n    printVerbose(`API URL: ${apiUrl}`, options)\n\n    // Create the database\n    const response = await fetch(`${apiUrl}/v1/databases`, {\n      method: 'POST',\n      headers: {\n        'Authorization': `Bearer ${token}`,\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify({\n        name,\n        region: region || 'auto',\n        plan: plan || 'free',\n      }),\n    })\n\n    if (!response.ok) {\n      const error = await response.json().catch(() => ({ message: 'Failed to create database' }))\n      printResult({\n        success: false,\n        error: (error as { message?: string; error?: string }).message || (error as { error?: string }).error || 'Failed to create database',\n      }, options)\n      process.exit(1)\n    }\n\n    let database = await response.json() as DatabaseInfo\n\n    // Wait for database to be ready if requested\n    if (wait && database.status === 'creating') {\n      printInfo('Waiting for database to be ready...', options)\n\n      const startTime = Date.now()\n      while (database.status === 'creating' && Date.now() - startTime < timeout) {\n        await new Promise((resolve) => setTimeout(resolve, 2000))\n\n        const statusResponse = await fetch(`${apiUrl}/v1/databases/${database.id}`, {\n          headers: {\n            'Authorization': `Bearer ${token}`,\n          },\n        })\n\n        if (statusResponse.ok) {\n          database = await statusResponse.json() as DatabaseInfo\n          printVerbose(`Status: ${database.status}`, options)\n        }\n      }\n\n      if (database.status === 'creating') {\n        printResult({\n          success: false,\n          error: 'Timeout waiting for database to be ready',\n        }, options)\n        process.exit(1)\n      }\n    }\n\n    // Add to recent databases\n    addRecentDatabase(name)\n\n    const result: CommandResult<DatabaseInfo> = {\n      success: true,\n      message: `Database '${name}' created successfully`,\n      data: database,\n    }\n\n    printResult(result, options)\n\n    if (database.connectionUrl && !options.format) {\n      console.log('\\nConnection URL:')\n      console.log(`  ${database.connectionUrl}`)\n      console.log('\\nUsage:')\n      console.log(`  postgres.do shell ${name}`)\n      console.log(`  export DATABASE_URL=\"${database.connectionUrl}\"`)\n    }\n  } catch (error) {\n    printResult({\n      success: false,\n      error: error instanceof Error ? error.message : 'Unknown error creating database',\n    }, options)\n    process.exit(1)\n  }\n}\n\n/**\n * List all databases\n */\nexport async function runList(options: OutputOptions & { apiUrl?: string }): Promise<void> {\n  try {\n    const token = requireToken(options.apiUrl)\n    const apiUrl = getApiUrl(options.apiUrl)\n\n    printInfo('Fetching databases...', options)\n\n    const response = await fetch(`${apiUrl}/v1/databases`, {\n      headers: {\n        'Authorization': `Bearer ${token}`,\n      },\n    })\n\n    if (!response.ok) {\n      const error = await response.json().catch(() => ({ message: 'Failed to list databases' }))\n      printResult({\n        success: false,\n        error: (error as { message?: string }).message || 'Failed to list databases',\n      }, options)\n      process.exit(1)\n    }\n\n    const databases = await response.json() as DatabaseInfo[]\n\n    printResult({\n      success: true,\n      data: databases,\n    }, options)\n  } catch (error) {\n    printResult({\n      success: false,\n      error: error instanceof Error ? error.message : 'Unknown error listing databases',\n    }, options)\n    process.exit(1)\n  }\n}\n\n/**\n * Get database info\n */\nexport async function runInfo(\n  nameOrId: string,\n  options: OutputOptions & { apiUrl?: string }\n): Promise<void> {\n  try {\n    const token = requireToken(options.apiUrl)\n    const apiUrl = getApiUrl(options.apiUrl)\n\n    printInfo(`Fetching database '${nameOrId}'...`, options)\n\n    const response = await fetch(`${apiUrl}/v1/databases/${nameOrId}`, {\n      headers: {\n        'Authorization': `Bearer ${token}`,\n      },\n    })\n\n    if (!response.ok) {\n      if (response.status === 404) {\n        printResult({\n          success: false,\n          error: `Database '${nameOrId}' not found`,\n        }, options)\n      } else {\n        const error = await response.json().catch(() => ({ message: 'Failed to get database info' }))\n        printResult({\n          success: false,\n          error: (error as { message?: string }).message || 'Failed to get database info',\n        }, options)\n      }\n      process.exit(1)\n    }\n\n    const database = await response.json() as DatabaseInfo\n\n    printResult({\n      success: true,\n      data: database,\n    }, options)\n  } catch (error) {\n    printResult({\n      success: false,\n      error: error instanceof Error ? error.message : 'Unknown error getting database info',\n    }, options)\n    process.exit(1)\n  }\n}\n\n/**\n * Delete a database\n */\nexport async function runDelete(\n  nameOrId: string,\n  options: OutputOptions & { apiUrl?: string; force?: boolean }\n): Promise<void> {\n  if (!options.force) {\n    console.error('Warning: This will permanently delete the database and all its data.')\n    console.error('Use --force to confirm deletion.')\n    process.exit(1)\n  }\n\n  try {\n    const token = requireToken(options.apiUrl)\n    const apiUrl = getApiUrl(options.apiUrl)\n\n    printInfo(`Deleting database '${nameOrId}'...`, options)\n\n    const response = await fetch(`${apiUrl}/v1/databases/${nameOrId}`, {\n      method: 'DELETE',\n      headers: {\n        'Authorization': `Bearer ${token}`,\n      },\n    })\n\n    if (!response.ok) {\n      if (response.status === 404) {\n        printResult({\n          success: false,\n          error: `Database '${nameOrId}' not found`,\n        }, options)\n      } else {\n        const error = await response.json().catch(() => ({ message: 'Failed to delete database' }))\n        printResult({\n          success: false,\n          error: (error as { message?: string }).message || 'Failed to delete database',\n        }, options)\n      }\n      process.exit(1)\n    }\n\n    printResult({\n      success: true,\n      message: `Database '${nameOrId}' deleted successfully`,\n    }, options)\n  } catch (error) {\n    printResult({\n      success: false,\n      error: error instanceof Error ? error.message : 'Unknown error deleting database',\n    }, options)\n    process.exit(1)\n  }\n}\n","/**\n * Backup Command\n *\n * Export/backup a database from postgres.do\n *\n * @module cli/commands/backup\n */\n\nimport { createWriteStream, existsSync, mkdirSync } from 'node:fs'\nimport { dirname, resolve } from 'node:path'\nimport { pipeline } from 'node:stream/promises'\nimport { Readable } from 'node:stream'\nimport { requireToken } from '../cli-auth.js'\nimport { getApiUrl } from '../config.js'\nimport { printResult, printInfo, printVerbose, formatBytes, formatDuration, type OutputOptions } from '../output.js'\n\n/**\n * Backup format type\n */\nexport type BackupFormat = 'sql' | 'custom' | 'directory' | 'tar'\n\n/**\n * Backup command options\n */\nexport interface BackupOptions extends OutputOptions {\n  /** Database name or ID */\n  name: string\n  /** Output file path */\n  output?: string | undefined\n  /** Backup format */\n  backupFormat?: BackupFormat | undefined\n  /** Include schema only (no data) */\n  schemaOnly?: boolean | undefined\n  /** Include data only (no schema) */\n  dataOnly?: boolean | undefined\n  /** Specific tables to backup (comma-separated) */\n  tables?: string | undefined\n  /** Tables to exclude (comma-separated) */\n  excludeTables?: string | undefined\n  /** Compress output */\n  compress?: boolean | undefined\n  /** API URL override */\n  apiUrl?: string | undefined\n}\n\n/**\n * Backup result info\n */\nexport interface BackupResult {\n  database: string\n  outputFile: string\n  size: number\n  backupFormat: string\n  duration: number\n  tables?: string[]\n}\n\n/**\n * Run backup command\n */\nexport async function runBackup(options: BackupOptions): Promise<void> {\n  const {\n    name,\n    output,\n    backupFormat = 'sql',\n    schemaOnly = false,\n    dataOnly = false,\n    tables,\n    excludeTables,\n    compress = false,\n  } = options\n\n  if (!name) {\n    printResult({\n      success: false,\n      error: 'Database name is required',\n    }, options)\n    process.exit(1)\n  }\n\n  // Determine output file\n  const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19)\n  const extension = getExtension(backupFormat, compress)\n  const outputFile = output || resolve(process.cwd(), `${name}-backup-${timestamp}${extension}`)\n\n  try {\n    const token = requireToken(options.apiUrl)\n    const apiUrl = getApiUrl(options.apiUrl)\n\n    printInfo(`Backing up database '${name}'...`, options)\n    printVerbose(`Output: ${outputFile}`, options)\n    printVerbose(`Format: ${backupFormat}`, options)\n\n    const startTime = Date.now()\n\n    // Build backup request\n    const params = new URLSearchParams()\n    params.set('format', backupFormat)\n    if (schemaOnly) params.set('schema_only', 'true')\n    if (dataOnly) params.set('data_only', 'true')\n    if (tables) params.set('tables', tables)\n    if (excludeTables) params.set('exclude_tables', excludeTables)\n    if (compress) params.set('compress', 'true')\n\n    // Request backup from API\n    const response = await fetch(`${apiUrl}/v1/databases/${name}/backup?${params}`, {\n      method: 'POST',\n      headers: {\n        'Authorization': `Bearer ${token}`,\n      },\n    })\n\n    if (!response.ok) {\n      const error = await response.json().catch(() => ({ message: 'Failed to create backup' }))\n      printResult({\n        success: false,\n        error: (error as { message?: string; error?: string }).message || (error as { error?: string }).error || 'Failed to create backup',\n      }, options)\n      process.exit(1)\n    }\n\n    // Ensure output directory exists\n    const outputDir = dirname(outputFile)\n    if (!existsSync(outputDir)) {\n      mkdirSync(outputDir, { recursive: true })\n    }\n\n    // Stream response to file\n    if (!response.body) {\n      throw new Error('No response body received')\n    }\n\n    const fileStream = createWriteStream(outputFile)\n    const readable = Readable.fromWeb(response.body as import('stream/web').ReadableStream)\n\n    let bytesWritten = 0\n    readable.on('data', (chunk: Buffer) => {\n      bytesWritten += chunk.length\n      if (options.verbose) {\n        process.stdout.write(`\\rDownloaded: ${formatBytes(bytesWritten)}`)\n      }\n    })\n\n    await pipeline(readable, fileStream)\n\n    if (options.verbose) {\n      process.stdout.write('\\n')\n    }\n\n    const duration = Date.now() - startTime\n\n    const result: BackupResult = {\n      database: name,\n      outputFile,\n      size: bytesWritten,\n      backupFormat,\n      duration,\n    }\n    if (tables) result.tables = tables.split(',')\n\n    printResult({\n      success: true,\n      message: `Backup completed: ${outputFile} (${formatBytes(bytesWritten)}) in ${formatDuration(duration)}`,\n      data: result,\n    }, options)\n  } catch (error) {\n    printResult({\n      success: false,\n      error: error instanceof Error ? error.message : 'Unknown error during backup',\n    }, options)\n    process.exit(1)\n  }\n}\n\n/**\n * List available backups for a database\n */\nexport async function runBackupList(\n  name: string,\n  options: OutputOptions & { apiUrl?: string }\n): Promise<void> {\n  try {\n    const token = requireToken(options.apiUrl)\n    const apiUrl = getApiUrl(options.apiUrl)\n\n    printInfo(`Fetching backups for '${name}'...`, options)\n\n    const response = await fetch(`${apiUrl}/v1/databases/${name}/backups`, {\n      headers: {\n        'Authorization': `Bearer ${token}`,\n      },\n    })\n\n    if (!response.ok) {\n      const error = await response.json().catch(() => ({ message: 'Failed to list backups' }))\n      printResult({\n        success: false,\n        error: (error as { message?: string }).message || 'Failed to list backups',\n      }, options)\n      process.exit(1)\n    }\n\n    const backups = await response.json()\n\n    printResult({\n      success: true,\n      data: backups,\n    }, options)\n  } catch (error) {\n    printResult({\n      success: false,\n      error: error instanceof Error ? error.message : 'Unknown error listing backups',\n    }, options)\n    process.exit(1)\n  }\n}\n\n/**\n * Download a specific backup\n */\nexport async function runBackupDownload(\n  name: string,\n  backupId: string,\n  options: OutputOptions & { apiUrl?: string; output?: string }\n): Promise<void> {\n  try {\n    const token = requireToken(options.apiUrl)\n    const apiUrl = getApiUrl(options.apiUrl)\n\n    printInfo(`Downloading backup '${backupId}'...`, options)\n\n    const response = await fetch(`${apiUrl}/v1/databases/${name}/backups/${backupId}/download`, {\n      headers: {\n        'Authorization': `Bearer ${token}`,\n      },\n    })\n\n    if (!response.ok) {\n      const error = await response.json().catch(() => ({ message: 'Failed to download backup' }))\n      printResult({\n        success: false,\n        error: (error as { message?: string }).message || 'Failed to download backup',\n      }, options)\n      process.exit(1)\n    }\n\n    // Determine output file from Content-Disposition or generate one\n    const contentDisposition = response.headers.get('Content-Disposition')\n    const filenameMatch = contentDisposition?.match(/filename=\"?(.+)\"?/)\n    const filename = filenameMatch?.[1] || `${name}-${backupId}.sql`\n    const outputFile = options.output || resolve(process.cwd(), filename)\n\n    // Ensure output directory exists\n    const outputDir = dirname(outputFile)\n    if (!existsSync(outputDir)) {\n      mkdirSync(outputDir, { recursive: true })\n    }\n\n    // Stream response to file\n    if (!response.body) {\n      throw new Error('No response body received')\n    }\n\n    const fileStream = createWriteStream(outputFile)\n    const readable = Readable.fromWeb(response.body as import('stream/web').ReadableStream)\n\n    let bytesWritten = 0\n    readable.on('data', (chunk: Buffer) => {\n      bytesWritten += chunk.length\n      if (options.verbose) {\n        process.stdout.write(`\\rDownloaded: ${formatBytes(bytesWritten)}`)\n      }\n    })\n\n    await pipeline(readable, fileStream)\n\n    if (options.verbose) {\n      process.stdout.write('\\n')\n    }\n\n    printResult({\n      success: true,\n      message: `Backup downloaded: ${outputFile} (${formatBytes(bytesWritten)})`,\n      data: { outputFile, size: bytesWritten },\n    }, options)\n  } catch (error) {\n    printResult({\n      success: false,\n      error: error instanceof Error ? error.message : 'Unknown error downloading backup',\n    }, options)\n    process.exit(1)\n  }\n}\n\n/**\n * Get file extension based on backupFormat and compression\n */\nfunction getExtension(backupFormat: string, compress: boolean): string {\n  const extensions: Record<string, string> = {\n    sql: '.sql',\n    custom: '.dump',\n    directory: '',\n    tar: '.tar',\n  }\n\n  const ext = extensions[backupFormat] || '.sql'\n  return compress && backupFormat === 'sql' ? `${ext}.gz` : ext\n}\n","/**\n * Restore Command\n *\n * Import/restore a database to postgres.do\n *\n * @module cli/commands/restore\n */\n\nimport { createReadStream, existsSync, statSync } from 'node:fs'\nimport { basename, resolve } from 'node:path'\nimport { requireToken } from '../cli-auth.js'\nimport { getApiUrl, addRecentDatabase } from '../config.js'\nimport { printResult, printInfo, printVerbose, formatBytes, formatDuration, type OutputOptions } from '../output.js'\n\n/**\n * Restore command options\n */\nexport interface RestoreOptions extends OutputOptions {\n  /** Input file path */\n  file: string\n  /** Target database name (will create if doesn't exist) */\n  database?: string | undefined\n  /** Drop existing objects before restore */\n  clean?: boolean | undefined\n  /** Create database before restore */\n  create?: boolean | undefined\n  /** Restore data only (no schema) */\n  dataOnly?: boolean | undefined\n  /** Restore schema only (no data) */\n  schemaOnly?: boolean | undefined\n  /** Specific tables to restore (comma-separated) */\n  tables?: string | undefined\n  /** Continue on error */\n  ignoreErrors?: boolean | undefined\n  /** Number of parallel jobs */\n  jobs?: number | undefined\n  /** API URL override */\n  apiUrl?: string | undefined\n}\n\n/**\n * Restore result info\n */\nexport interface RestoreResult {\n  database: string\n  inputFile: string\n  size: number\n  duration: number\n  tablesRestored?: number\n  rowsRestored?: number\n  errors?: string[]\n}\n\n/**\n * Run restore command\n */\nexport async function runRestore(options: RestoreOptions): Promise<void> {\n  const {\n    file,\n    database,\n    clean = false,\n    create = false,\n    dataOnly = false,\n    schemaOnly = false,\n    tables,\n    ignoreErrors = false,\n    jobs,\n  } = options\n\n  if (!file) {\n    printResult({\n      success: false,\n      error: 'Input file is required',\n    }, options)\n    process.exit(1)\n  }\n\n  // Resolve and validate input file\n  const inputFile = resolve(process.cwd(), file)\n  if (!existsSync(inputFile)) {\n    printResult({\n      success: false,\n      error: `File not found: ${inputFile}`,\n    }, options)\n    process.exit(1)\n  }\n\n  const fileStats = statSync(inputFile)\n  if (!fileStats.isFile()) {\n    printResult({\n      success: false,\n      error: `Not a file: ${inputFile}`,\n    }, options)\n    process.exit(1)\n  }\n\n  // Determine database name from file if not provided\n  const targetDatabase = database || inferDatabaseName(basename(inputFile))\n\n  try {\n    const token = requireToken(options.apiUrl)\n    const apiUrl = getApiUrl(options.apiUrl)\n\n    printInfo(`Restoring to database '${targetDatabase}'...`, options)\n    printVerbose(`Input file: ${inputFile} (${formatBytes(fileStats.size)})`, options)\n\n    const startTime = Date.now()\n\n    // Build restore request URL\n    const params = new URLSearchParams()\n    if (clean) params.set('clean', 'true')\n    if (create) params.set('create', 'true')\n    if (dataOnly) params.set('data_only', 'true')\n    if (schemaOnly) params.set('schema_only', 'true')\n    if (tables) params.set('tables', tables)\n    if (ignoreErrors) params.set('ignore_errors', 'true')\n    if (jobs) params.set('jobs', String(jobs))\n\n    // Detect format from file extension\n    const format = detectFormat(inputFile)\n    params.set('format', format)\n\n    // Create file stream\n    const fileStream = createReadStream(inputFile)\n\n    // Upload and restore\n    const response = await fetch(`${apiUrl}/v1/databases/${targetDatabase}/restore?${params}`, {\n      method: 'POST',\n      headers: {\n        'Authorization': `Bearer ${token}`,\n        'Content-Type': getContentType(format),\n        'Content-Length': String(fileStats.size),\n      },\n      body: fileStream as unknown as BodyInit,\n      duplex: 'half',\n    } as RequestInit)\n\n    if (!response.ok) {\n      const error = await response.json().catch(() => ({ message: 'Failed to restore database' }))\n      printResult({\n        success: false,\n        error: (error as { message?: string; error?: string }).message || (error as { error?: string }).error || 'Failed to restore database',\n      }, options)\n      process.exit(1)\n    }\n\n    const result = await response.json() as {\n      tablesRestored?: number\n      rowsRestored?: number\n      errors?: string[]\n    }\n\n    const duration = Date.now() - startTime\n\n    // Add to recent databases\n    addRecentDatabase(targetDatabase)\n\n    const restoreResult: RestoreResult = {\n      database: targetDatabase,\n      inputFile,\n      size: fileStats.size,\n      duration,\n    }\n    if (result.tablesRestored !== undefined) restoreResult.tablesRestored = result.tablesRestored\n    if (result.rowsRestored !== undefined) restoreResult.rowsRestored = result.rowsRestored\n    if (result.errors) restoreResult.errors = result.errors\n\n    const hasErrors = result.errors && result.errors.length > 0\n\n    printResult({\n      success: !hasErrors || ignoreErrors,\n      message: `Restore completed${hasErrors ? ' with errors' : ''}: ${formatBytes(fileStats.size)} in ${formatDuration(duration)}`,\n      data: restoreResult,\n    }, options)\n\n    if (hasErrors && !ignoreErrors) {\n      process.exit(1)\n    }\n  } catch (error) {\n    printResult({\n      success: false,\n      error: error instanceof Error ? error.message : 'Unknown error during restore',\n    }, options)\n    process.exit(1)\n  }\n}\n\n/**\n * Restore from a URL\n */\nexport async function runRestoreFromUrl(\n  url: string,\n  options: RestoreOptions\n): Promise<void> {\n  const { database } = options\n\n  if (!database) {\n    printResult({\n      success: false,\n      error: 'Database name is required when restoring from URL',\n    }, options)\n    process.exit(1)\n  }\n\n  try {\n    const token = requireToken(options.apiUrl)\n    const apiUrl = getApiUrl(options.apiUrl)\n\n    printInfo(`Restoring from URL to database '${database}'...`, options)\n    printVerbose(`Source URL: ${url}`, options)\n\n    const startTime = Date.now()\n\n    // Build restore request\n    const params = new URLSearchParams()\n    if (options.clean) params.set('clean', 'true')\n    if (options.create) params.set('create', 'true')\n    if (options.dataOnly) params.set('data_only', 'true')\n    if (options.schemaOnly) params.set('schema_only', 'true')\n    if (options.tables) params.set('tables', options.tables)\n    if (options.ignoreErrors) params.set('ignore_errors', 'true')\n\n    const response = await fetch(`${apiUrl}/v1/databases/${database}/restore-url?${params}`, {\n      method: 'POST',\n      headers: {\n        'Authorization': `Bearer ${token}`,\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify({ url }),\n    })\n\n    if (!response.ok) {\n      const error = await response.json().catch(() => ({ message: 'Failed to restore from URL' }))\n      printResult({\n        success: false,\n        error: (error as { message?: string }).message || 'Failed to restore from URL',\n      }, options)\n      process.exit(1)\n    }\n\n    const result = await response.json() as {\n      tablesRestored?: number\n      rowsRestored?: number\n      errors?: string[]\n    }\n\n    const duration = Date.now() - startTime\n\n    // Add to recent databases\n    addRecentDatabase(database)\n\n    printResult({\n      success: true,\n      message: `Restore completed in ${formatDuration(duration)}`,\n      data: {\n        database,\n        sourceUrl: url,\n        duration,\n        ...result,\n      },\n    }, options)\n  } catch (error) {\n    printResult({\n      success: false,\n      error: error instanceof Error ? error.message : 'Unknown error during restore',\n    }, options)\n    process.exit(1)\n  }\n}\n\n/**\n * Restore from another postgres.do database\n */\nexport async function runRestoreFromDatabase(\n  source: string,\n  target: string,\n  options: OutputOptions & { apiUrl?: string; clean?: boolean }\n): Promise<void> {\n  try {\n    const token = requireToken(options.apiUrl)\n    const apiUrl = getApiUrl(options.apiUrl)\n\n    printInfo(`Cloning database '${source}' to '${target}'...`, options)\n\n    const startTime = Date.now()\n\n    const params = new URLSearchParams()\n    if (options.clean) params.set('clean', 'true')\n\n    const response = await fetch(`${apiUrl}/v1/databases/${target}/clone?${params}`, {\n      method: 'POST',\n      headers: {\n        'Authorization': `Bearer ${token}`,\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify({ source }),\n    })\n\n    if (!response.ok) {\n      const error = await response.json().catch(() => ({ message: 'Failed to clone database' }))\n      printResult({\n        success: false,\n        error: (error as { message?: string }).message || 'Failed to clone database',\n      }, options)\n      process.exit(1)\n    }\n\n    const result = await response.json()\n    const duration = Date.now() - startTime\n\n    // Add to recent databases\n    addRecentDatabase(target)\n\n    printResult({\n      success: true,\n      message: `Database cloned successfully in ${formatDuration(duration)}`,\n      data: {\n        source,\n        target,\n        duration,\n        ...result,\n      },\n    }, options)\n  } catch (error) {\n    printResult({\n      success: false,\n      error: error instanceof Error ? error.message : 'Unknown error during clone',\n    }, options)\n    process.exit(1)\n  }\n}\n\n/**\n * Infer database name from filename\n */\nfunction inferDatabaseName(filename: string): string {\n  // Remove extension and timestamp patterns\n  let name = filename\n    .replace(/\\.(sql|dump|tar)(\\.gz)?$/i, '')\n    .replace(/-backup-\\d{4}-\\d{2}-\\d{2}T\\d{2}-\\d{2}-\\d{2}$/i, '')\n    .replace(/-\\d{14}$/i, '') // Alternative timestamp format\n\n  // Ensure valid database name\n  name = name.toLowerCase().replace(/[^a-z0-9_-]/g, '_')\n\n  if (!name || !/^[a-z]/.test(name)) {\n    name = 'restored_' + name\n  }\n\n  return name.slice(0, 63)\n}\n\n/**\n * Detect backup format from file extension\n */\nfunction detectFormat(filename: string): string {\n  const lower = filename.toLowerCase()\n\n  if (lower.endsWith('.dump') || lower.endsWith('.dump.gz')) {\n    return 'custom'\n  }\n  if (lower.endsWith('.tar') || lower.endsWith('.tar.gz')) {\n    return 'tar'\n  }\n  // Default to SQL\n  return 'sql'\n}\n\n/**\n * Get content type for format\n */\nfunction getContentType(format: string): string {\n  switch (format) {\n    case 'custom':\n      return 'application/octet-stream'\n    case 'tar':\n      return 'application/x-tar'\n    case 'sql':\n    default:\n      return 'application/sql'\n  }\n}\n","/**\n * Logs Command\n *\n * View database logs from postgres.do\n *\n * @module cli/commands/logs\n */\n\nimport { requireToken } from '../cli-auth.js'\nimport { getApiUrl } from '../config.js'\nimport { printResult, printInfo, type OutputOptions } from '../output.js'\n\n/**\n * Logs command options\n */\nexport interface LogsOptions extends OutputOptions {\n  /** Database name or ID */\n  name: string\n  /** Tail logs (follow mode) */\n  tail?: boolean | undefined\n  /** Number of lines to show */\n  lines?: number | undefined\n  /** Show logs since timestamp or duration (e.g., \"1h\", \"30m\", \"2024-01-15T10:00:00Z\") */\n  since?: string | undefined\n  /** Show logs until timestamp */\n  until?: string | undefined\n  /** Filter by log level */\n  level?: 'debug' | 'info' | 'warning' | 'error' | undefined\n  /** Filter by search query */\n  query?: string | undefined\n  /** Show timestamps */\n  timestamps?: boolean | undefined\n  /** API URL override */\n  apiUrl?: string | undefined\n}\n\n/**\n * Log entry structure\n */\nexport interface LogEntry {\n  timestamp: string\n  level: 'debug' | 'info' | 'warning' | 'error'\n  message: string\n  source?: string\n  metadata?: Record<string, unknown>\n}\n\n/**\n * Run logs command\n */\nexport async function runLogs(options: LogsOptions): Promise<void> {\n  const {\n    name,\n    tail = false,\n    lines = 100,\n    since,\n    until,\n    level,\n    query,\n    timestamps = true,\n  } = options\n\n  if (!name) {\n    printResult({\n      success: false,\n      error: 'Database name is required',\n    }, options)\n    process.exit(1)\n  }\n\n  try {\n    const token = requireToken(options.apiUrl)\n    const apiUrl = getApiUrl(options.apiUrl)\n\n    if (tail) {\n      await runTailLogs(name, token, apiUrl, options)\n    } else {\n      const fetchOptions: LogsOptions & { lines: number; timestamps: boolean } = {\n        ...options,\n        name,\n        lines,\n        timestamps,\n      }\n      if (since) fetchOptions.since = since\n      if (until) fetchOptions.until = until\n      if (level) fetchOptions.level = level\n      if (query) fetchOptions.query = query\n      await runFetchLogs(name, token, apiUrl, fetchOptions)\n    }\n  } catch (error) {\n    printResult({\n      success: false,\n      error: error instanceof Error ? error.message : 'Unknown error fetching logs',\n    }, options)\n    process.exit(1)\n  }\n}\n\n/**\n * Fetch historical logs\n */\nasync function runFetchLogs(\n  name: string,\n  token: string,\n  apiUrl: string,\n  options: LogsOptions & { lines: number; timestamps: boolean }\n): Promise<void> {\n  const { lines, since, until, level, query, timestamps } = options\n\n  printInfo(`Fetching logs for '${name}'...`, options)\n\n  // Build query parameters\n  const params = new URLSearchParams()\n  params.set('limit', String(lines))\n  if (since) params.set('since', parseDuration(since))\n  if (until) params.set('until', until)\n  if (level) params.set('level', level)\n  if (query) params.set('query', query)\n\n  const response = await fetch(`${apiUrl}/v1/databases/${name}/logs?${params}`, {\n    headers: {\n      'Authorization': `Bearer ${token}`,\n    },\n  })\n\n  if (!response.ok) {\n    const error = await response.json().catch(() => ({ message: 'Failed to fetch logs' }))\n    printResult({\n      success: false,\n      error: (error as { message?: string }).message || 'Failed to fetch logs',\n    }, options)\n    process.exit(1)\n  }\n\n  const data = await response.json() as { logs: LogEntry[]; hasMore?: boolean }\n\n  if (options.format === 'json') {\n    printResult({\n      success: true,\n      data: data.logs,\n    }, options)\n    return\n  }\n\n  // Print logs in human-readable format\n  if (data.logs.length === 0) {\n    printInfo('No logs found', options)\n    return\n  }\n\n  for (const log of data.logs) {\n    printLogEntry(log, { ...options, timestamps })\n  }\n\n  if (data.hasMore) {\n    printInfo(`\\nShowing ${data.logs.length} logs. Use --lines to see more.`, options)\n  }\n}\n\n/**\n * Tail logs in real-time\n */\nasync function runTailLogs(\n  name: string,\n  token: string,\n  apiUrl: string,\n  options: LogsOptions\n): Promise<void> {\n  const { since, level, query, timestamps = true } = options\n\n  printInfo(`Tailing logs for '${name}' (Ctrl+C to stop)...`, options)\n  console.log('')\n\n  // Build query parameters for SSE endpoint\n  const params = new URLSearchParams()\n  if (since) params.set('since', parseDuration(since))\n  if (level) params.set('level', level)\n  if (query) params.set('query', query)\n\n  const response = await fetch(`${apiUrl}/v1/databases/${name}/logs/stream?${params}`, {\n    headers: {\n      'Authorization': `Bearer ${token}`,\n      'Accept': 'text/event-stream',\n    },\n  })\n\n  if (!response.ok) {\n    const error = await response.json().catch(() => ({ message: 'Failed to connect to log stream' }))\n    printResult({\n      success: false,\n      error: (error as { message?: string }).message || 'Failed to connect to log stream',\n    }, options)\n    process.exit(1)\n  }\n\n  if (!response.body) {\n    printResult({\n      success: false,\n      error: 'No response body received',\n    }, options)\n    process.exit(1)\n  }\n\n  // Handle graceful shutdown\n  const controller = new AbortController()\n  process.on('SIGINT', () => {\n    console.log('\\nStopping log tail...')\n    controller.abort()\n  })\n\n  // Read SSE stream\n  const reader = response.body.getReader()\n  const decoder = new TextDecoder()\n  let buffer = ''\n\n  try {\n    while (true) {\n      const { done, value } = await reader.read()\n      if (done) break\n\n      buffer += decoder.decode(value, { stream: true })\n\n      // Process complete SSE events\n      const events = buffer.split('\\n\\n')\n      buffer = events.pop() || '' // Keep incomplete event in buffer\n\n      for (const event of events) {\n        const lines = event.split('\\n')\n        let data = ''\n\n        for (const line of lines) {\n          if (line.startsWith('data: ')) {\n            data = line.slice(6)\n          }\n        }\n\n        if (data) {\n          try {\n            const log = JSON.parse(data) as LogEntry\n            printLogEntry(log, { ...options, timestamps: timestamps ?? true })\n          } catch {\n            // Skip invalid JSON\n          }\n        }\n      }\n    }\n  } catch (error) {\n    if ((error as Error).name === 'AbortError') {\n      // Normal shutdown\n      return\n    }\n    throw error\n  }\n}\n\n/**\n * Print a single log entry\n */\nfunction printLogEntry(log: LogEntry, options: { timestamps: boolean } & OutputOptions): void {\n  const levelColors: Record<string, string> = {\n    debug: '\\x1b[90m', // gray\n    info: '\\x1b[36m',  // cyan\n    warning: '\\x1b[33m', // yellow\n    error: '\\x1b[31m', // red\n  }\n\n  const reset = '\\x1b[0m'\n  const supportsColor = process.stdout.isTTY && !process.env['NO_COLOR'] && !options.noColor\n\n  let output = ''\n\n  // Timestamp\n  if (options.timestamps) {\n    const timestamp = new Date(log.timestamp).toISOString()\n    output += supportsColor ? `\\x1b[90m${timestamp}\\x1b[0m ` : `${timestamp} `\n  }\n\n  // Level\n  const levelStr = log.level.toUpperCase().padEnd(7)\n  if (supportsColor) {\n    output += `${levelColors[log.level] || ''}${levelStr}${reset} `\n  } else {\n    output += `${levelStr} `\n  }\n\n  // Source\n  if (log.source) {\n    output += supportsColor ? `\\x1b[35m[${log.source}]\\x1b[0m ` : `[${log.source}] `\n  }\n\n  // Message\n  output += log.message\n\n  // Metadata (if verbose)\n  if (options.verbose && log.metadata && Object.keys(log.metadata).length > 0) {\n    output += supportsColor\n      ? `\\n  \\x1b[90m${JSON.stringify(log.metadata)}\\x1b[0m`\n      : `\\n  ${JSON.stringify(log.metadata)}`\n  }\n\n  console.log(output)\n}\n\n/**\n * Parse duration string to ISO timestamp\n *\n * Supports formats like:\n * - \"1h\" (1 hour ago)\n * - \"30m\" (30 minutes ago)\n * - \"2d\" (2 days ago)\n * - ISO timestamp (passed through)\n */\nfunction parseDuration(input: string): string {\n  // Check if it's already an ISO timestamp\n  if (input.includes('T') || input.includes('-')) {\n    return input\n  }\n\n  const match = input.match(/^(\\d+)([smhd])$/i)\n  if (!match) {\n    return input\n  }\n\n  const value = parseInt(match[1]!, 10)\n  const unit = match[2]!.toLowerCase()\n\n  const multipliers: Record<string, number> = {\n    s: 1000,\n    m: 60 * 1000,\n    h: 60 * 60 * 1000,\n    d: 24 * 60 * 60 * 1000,\n  }\n\n  const ms = value * (multipliers[unit] || 0)\n  const since = new Date(Date.now() - ms)\n\n  return since.toISOString()\n}\n\n/**\n * Get log statistics\n */\nexport async function runLogStats(\n  name: string,\n  options: OutputOptions & { apiUrl?: string; since?: string; until?: string }\n): Promise<void> {\n  try {\n    const token = requireToken(options.apiUrl)\n    const apiUrl = getApiUrl(options.apiUrl)\n\n    printInfo(`Fetching log statistics for '${name}'...`, options)\n\n    const params = new URLSearchParams()\n    if (options.since) params.set('since', parseDuration(options.since))\n    if (options.until) params.set('until', options.until)\n\n    const response = await fetch(`${apiUrl}/v1/databases/${name}/logs/stats?${params}`, {\n      headers: {\n        'Authorization': `Bearer ${token}`,\n      },\n    })\n\n    if (!response.ok) {\n      const error = await response.json().catch(() => ({ message: 'Failed to fetch log stats' }))\n      printResult({\n        success: false,\n        error: (error as { message?: string }).message || 'Failed to fetch log stats',\n      }, options)\n      process.exit(1)\n    }\n\n    const stats = await response.json()\n\n    printResult({\n      success: true,\n      data: stats,\n    }, options)\n  } catch (error) {\n    printResult({\n      success: false,\n      error: error instanceof Error ? error.message : 'Unknown error fetching log stats',\n    }, options)\n    process.exit(1)\n  }\n}\n","/**\n * Shell Command\n *\n * Interactive SQL REPL for postgres.do databases\n *\n * @module cli/commands/shell\n */\n\nimport * as readline from 'node:readline'\nimport { requireToken } from '../cli-auth.js'\nimport { getApiUrl, addRecentDatabase } from '../config.js'\nimport { printResult, printInfo, formatDuration, type OutputOptions } from '../output.js'\nimport { formatTable } from '../formatting.js'\n\n/**\n * Shell command options\n */\nexport interface ShellOptions extends OutputOptions {\n  /** Database name or ID */\n  name: string\n  /** Execute a single command and exit */\n  command?: string | undefined\n  /** Read commands from file */\n  file?: string | undefined\n  /** Enable timing output */\n  timing?: boolean | undefined\n  /** Output format for query results */\n  outputFormat?: 'table' | 'csv' | 'json' | 'aligned' | undefined\n  /** API URL override */\n  apiUrl?: string | undefined\n}\n\n/**\n * Query result from API\n */\ninterface QueryResult {\n  rows: Record<string, unknown>[]\n  fields: { name: string; dataTypeID: number }[]\n  rowCount: number\n  command: string\n  duration?: number\n}\n\n/**\n * Shell state\n */\ninterface ShellState {\n  token: string\n  apiUrl: string\n  database: string\n  multiLineBuffer: string[]\n  isMultiLine: boolean\n  timing: boolean\n  outputFormat: 'table' | 'csv' | 'json' | 'aligned'\n  history: string[]\n}\n\n/**\n * Run shell command\n */\nexport async function runShell(options: ShellOptions): Promise<void> {\n  const { name, command, file, timing = false, outputFormat = 'table' } = options\n\n  if (!name) {\n    printResult({\n      success: false,\n      error: 'Database name is required',\n    }, options)\n    process.exit(1)\n  }\n\n  try {\n    const token = requireToken(options.apiUrl)\n    const apiUrl = getApiUrl(options.apiUrl)\n\n    // Add to recent databases\n    addRecentDatabase(name)\n\n    // Execute single command if provided\n    if (command) {\n      await executeSingleCommand(name, command, token, apiUrl, options)\n      return\n    }\n\n    // Execute file if provided\n    if (file) {\n      await executeFile(name, file, token, apiUrl, options)\n      return\n    }\n\n    // Start interactive REPL\n    await startRepl(name, token, apiUrl, {\n      ...options,\n      timing: timing ?? false,\n      outputFormat: outputFormat ?? 'table',\n    })\n  } catch (error) {\n    printResult({\n      success: false,\n      error: error instanceof Error ? error.message : 'Unknown error starting shell',\n    }, options)\n    process.exit(1)\n  }\n}\n\n/**\n * Execute a single SQL command\n */\nasync function executeSingleCommand(\n  database: string,\n  sql: string,\n  token: string,\n  apiUrl: string,\n  options: ShellOptions\n): Promise<void> {\n  const result = await executeQuery(database, sql, token, apiUrl)\n\n  if ('error' in result) {\n    printResult({\n      success: false,\n      error: result.error,\n    }, options)\n    process.exit(1)\n  }\n\n  printQueryResult(result, { ...(options.format !== undefined ? { format: options.format } : {}) })\n}\n\n/**\n * Execute SQL commands from a file\n */\nasync function executeFile(\n  database: string,\n  filePath: string,\n  token: string,\n  apiUrl: string,\n  options: ShellOptions\n): Promise<void> {\n  const { readFileSync, existsSync } = await import('node:fs')\n  const { resolve } = await import('node:path')\n\n  const fullPath = resolve(process.cwd(), filePath)\n  if (!existsSync(fullPath)) {\n    printResult({\n      success: false,\n      error: `File not found: ${fullPath}`,\n    }, options)\n    process.exit(1)\n  }\n\n  const content = readFileSync(fullPath, 'utf-8')\n\n  // Split into statements (simple split on semicolons)\n  const statements = content\n    .split(';')\n    .map((s) => s.trim())\n    .filter((s) => s.length > 0 && !s.startsWith('--'))\n\n  printInfo(`Executing ${statements.length} statement(s)...`, options)\n\n  let successCount = 0\n  let errorCount = 0\n\n  for (const statement of statements) {\n    const result = await executeQuery(database, statement, token, apiUrl)\n\n    if ('error' in result) {\n      console.error(`Error: ${result.error}`)\n      console.error(`  Statement: ${statement.substring(0, 50)}...`)\n      errorCount++\n    } else {\n      if (options.verbose) {\n        printQueryResult(result, { ...(options.format !== undefined ? { format: options.format } : {}) })\n      }\n      successCount++\n    }\n  }\n\n  console.log('')\n  printInfo(`Completed: ${successCount} succeeded, ${errorCount} failed`, options)\n\n  if (errorCount > 0) {\n    process.exit(1)\n  }\n}\n\n/**\n * Start interactive REPL\n */\nasync function startRepl(\n  database: string,\n  token: string,\n  apiUrl: string,\n  options: ShellOptions & { timing: boolean; outputFormat: 'table' | 'csv' | 'json' | 'aligned' }\n): Promise<void> {\n  const state: ShellState = {\n    token,\n    apiUrl,\n    database,\n    multiLineBuffer: [],\n    isMultiLine: false,\n    timing: options.timing,\n    outputFormat: options.outputFormat,\n    history: [],\n  }\n\n  console.log(`postgres.do shell - connected to '${database}'`)\n  console.log('Type \"\\\\?\" for help, \"\\\\q\" to quit')\n  console.log('')\n\n  const rl = readline.createInterface({\n    input: process.stdin,\n    output: process.stdout,\n    prompt: getPrompt(state),\n    terminal: true,\n    historySize: 100,\n  })\n\n  rl.on('line', async (line) => {\n    await handleLine(line, state, rl)\n  })\n\n  rl.on('close', () => {\n    console.log('\\nGoodbye!')\n    process.exit(0)\n  })\n\n  rl.prompt()\n}\n\n/**\n * Handle a line of input\n */\nasync function handleLine(\n  line: string,\n  state: ShellState,\n  rl: readline.Interface\n): Promise<void> {\n  const trimmedLine = line.trim()\n\n  // Handle backslash commands\n  if (trimmedLine.startsWith('\\\\') && !state.isMultiLine) {\n    await handleBackslashCommand(trimmedLine, state, rl)\n    rl.setPrompt(getPrompt(state))\n    rl.prompt()\n    return\n  }\n\n  // Handle multi-line input\n  if (state.isMultiLine || !trimmedLine.endsWith(';')) {\n    state.multiLineBuffer.push(line)\n    state.isMultiLine = !trimmedLine.endsWith(';')\n\n    if (state.isMultiLine) {\n      rl.setPrompt(getPrompt(state))\n      rl.prompt()\n      return\n    }\n  }\n\n  // Execute the query\n  const sql = state.isMultiLine || state.multiLineBuffer.length > 0\n    ? [...state.multiLineBuffer, line].join('\\n')\n    : line\n\n  state.multiLineBuffer = []\n  state.isMultiLine = false\n\n  if (sql.trim().length === 0) {\n    rl.setPrompt(getPrompt(state))\n    rl.prompt()\n    return\n  }\n\n  // Add to history\n  state.history.push(sql)\n\n  const startTime = Date.now()\n  const result = await executeQuery(state.database, sql, state.token, state.apiUrl)\n  const duration = Date.now() - startTime\n\n  if ('error' in result) {\n    console.error(`ERROR: ${result.error}`)\n  } else {\n    const printOptions: { format?: string } = {}\n    if (state.outputFormat === 'json') printOptions.format = 'json'\n    printQueryResult(result, printOptions)\n\n    if (state.timing) {\n      console.log(`Time: ${formatDuration(duration)}`)\n    }\n  }\n\n  console.log('')\n  rl.setPrompt(getPrompt(state))\n  rl.prompt()\n}\n\n/**\n * Handle backslash commands\n */\nasync function handleBackslashCommand(\n  command: string,\n  state: ShellState,\n  rl: readline.Interface\n): Promise<void> {\n  const [cmd, ...args] = command.split(/\\s+/)\n\n  switch (cmd) {\n    case '\\\\q':\n    case '\\\\quit':\n      rl.close()\n      break\n\n    case '\\\\?':\n    case '\\\\help':\n      printHelp()\n      break\n\n    case '\\\\d':\n    case '\\\\dt': {\n      // List tables\n      const result = await executeQuery(\n        state.database,\n        `SELECT table_name, table_type\n         FROM information_schema.tables\n         WHERE table_schema = 'public'\n         ORDER BY table_name`,\n        state.token,\n        state.apiUrl\n      )\n      if ('error' in result) {\n        console.error(`ERROR: ${result.error}`)\n      } else {\n        printQueryResult(result, { format: 'table' })\n      }\n      break\n    }\n\n    case '\\\\d+': {\n      // Describe table\n      const tableName = args[0]\n      if (!tableName) {\n        console.error('Usage: \\\\d+ <table_name>')\n        break\n      }\n      const result = await executeQuery(\n        state.database,\n        `SELECT column_name, data_type, is_nullable, column_default\n         FROM information_schema.columns\n         WHERE table_schema = 'public' AND table_name = '${tableName}'\n         ORDER BY ordinal_position`,\n        state.token,\n        state.apiUrl\n      )\n      if ('error' in result) {\n        console.error(`ERROR: ${result.error}`)\n      } else {\n        console.log(`Table \"${tableName}\":`)\n        printQueryResult(result, { format: 'table' })\n      }\n      break\n    }\n\n    case '\\\\di': {\n      // List indexes\n      const result = await executeQuery(\n        state.database,\n        `SELECT indexname, tablename, indexdef\n         FROM pg_indexes\n         WHERE schemaname = 'public'\n         ORDER BY tablename, indexname`,\n        state.token,\n        state.apiUrl\n      )\n      if ('error' in result) {\n        console.error(`ERROR: ${result.error}`)\n      } else {\n        printQueryResult(result, { format: 'table' })\n      }\n      break\n    }\n\n    case '\\\\l':\n    case '\\\\list':\n      console.log(`Connected to: ${state.database}`)\n      break\n\n    case '\\\\timing':\n      state.timing = !state.timing\n      console.log(`Timing is ${state.timing ? 'on' : 'off'}.`)\n      break\n\n    case '\\\\x':\n      state.outputFormat = state.outputFormat === 'aligned' ? 'table' : 'aligned'\n      console.log(`Expanded display is ${state.outputFormat === 'aligned' ? 'on' : 'off'}.`)\n      break\n\n    case '\\\\o':\n      const format = args[0] as typeof state.outputFormat\n      if (format && ['table', 'csv', 'json', 'aligned'].includes(format)) {\n        state.outputFormat = format\n        console.log(`Output format: ${state.outputFormat}`)\n      } else {\n        console.log(`Current output format: ${state.outputFormat}`)\n        console.log('Usage: \\\\o [table|csv|json|aligned]')\n      }\n      break\n\n    case '\\\\i': {\n      // Include file\n      const filePath = args[0]\n      if (!filePath) {\n        console.error('Usage: \\\\i <filename>')\n        break\n      }\n      try {\n        const { readFileSync, existsSync } = await import('node:fs')\n        const { resolve } = await import('node:path')\n\n        const fullPath = resolve(process.cwd(), filePath)\n        if (!existsSync(fullPath)) {\n          console.error(`File not found: ${fullPath}`)\n          break\n        }\n\n        const content = readFileSync(fullPath, 'utf-8')\n        const statements = content.split(';').filter((s) => s.trim().length > 0)\n\n        for (const statement of statements) {\n          const result = await executeQuery(state.database, statement, state.token, state.apiUrl)\n          if ('error' in result) {\n            console.error(`ERROR: ${result.error}`)\n          } else {\n            const opts: { format?: string } = {}\n            if (state.outputFormat === 'json') opts.format = 'json'\n            printQueryResult(result, opts)\n          }\n        }\n      } catch (error) {\n        console.error(`Error reading file: ${error instanceof Error ? error.message : 'Unknown error'}`)\n      }\n      break\n    }\n\n    case '\\\\e':\n    case '\\\\edit':\n      console.log('Editor mode not supported in this version.')\n      break\n\n    case '\\\\!': {\n      // Shell command\n      const shellCmd = args.join(' ')\n      if (!shellCmd) {\n        console.error('Usage: \\\\! <command>')\n        break\n      }\n      const { execSync } = await import('node:child_process')\n      try {\n        const output = execSync(shellCmd, { encoding: 'utf-8' })\n        console.log(output)\n      } catch (error) {\n        console.error(`Command failed: ${error instanceof Error ? error.message : 'Unknown error'}`)\n      }\n      break\n    }\n\n    default:\n      console.error(`Unknown command: ${cmd}. Type \\\\? for help.`)\n  }\n}\n\n/**\n * Execute a SQL query\n */\nasync function executeQuery(\n  database: string,\n  sql: string,\n  token: string,\n  apiUrl: string\n): Promise<QueryResult | { error: string }> {\n  try {\n    const response = await fetch(`${apiUrl}/v1/databases/${database}/query`, {\n      method: 'POST',\n      headers: {\n        'Authorization': `Bearer ${token}`,\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify({ sql }),\n    })\n\n    if (!response.ok) {\n      const error = await response.json().catch(() => ({ message: 'Query failed' }))\n      return {\n        error: (error as { message?: string; error?: string }).message || (error as { error?: string }).error || 'Query failed',\n      }\n    }\n\n    return await response.json() as QueryResult\n  } catch (error) {\n    return {\n      error: error instanceof Error ? error.message : 'Unknown error',\n    }\n  }\n}\n\n/**\n * Print query result\n */\nfunction printQueryResult(result: QueryResult, options: { format?: string }): void {\n  const { rows, fields, rowCount, command } = result\n\n  // Handle non-SELECT commands\n  if (command !== 'SELECT' && rows.length === 0) {\n    console.log(`${command} ${rowCount}`)\n    return\n  }\n\n  if (rows.length === 0) {\n    console.log('(0 rows)')\n    return\n  }\n\n  if (options.format === 'json') {\n    console.log(JSON.stringify(rows, null, 2))\n    return\n  }\n\n  // Format as table\n  const headers = fields.map((f) => f.name)\n  const tableRows = rows.map((row) =>\n    headers.map((h) => formatCellValue(row[h]))\n  )\n\n  console.log(formatTable(headers, tableRows))\n  console.log(`(${rowCount} row${rowCount === 1 ? '' : 's'})`)\n}\n\n/**\n * Format a cell value for display\n */\nfunction formatCellValue(value: unknown): string {\n  if (value === null) return 'NULL'\n  if (value === undefined) return ''\n  if (typeof value === 'object') return JSON.stringify(value)\n  return String(value)\n}\n\n/**\n * Get prompt string\n */\nfunction getPrompt(state: ShellState): string {\n  if (state.isMultiLine) {\n    return `${state.database}-> `\n  }\n  return `${state.database}=> `\n}\n\n/**\n * Print help\n */\nfunction printHelp(): void {\n  console.log(`\nGeneral:\n  \\\\q, \\\\quit        Exit psql\n  \\\\?, \\\\help        Show this help\n\nInformational:\n  \\\\d, \\\\dt          List tables\n  \\\\d+ <table>      Describe table\n  \\\\di              List indexes\n  \\\\l, \\\\list        Show current database\n\nFormatting:\n  \\\\x               Toggle expanded output\n  \\\\o [format]      Set output format (table|csv|json|aligned)\n  \\\\timing          Toggle query timing\n\nInput/Output:\n  \\\\i <file>        Execute commands from file\n  \\\\! <command>     Execute shell command\n\nQuery Buffer:\n  Type SQL ending with semicolon to execute\n  Multi-line queries supported\n`)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAKA,eAouBa,eA6DA,iBAYA;AAlzBb;AAAA;AAAA;AAKA,oBAKO;AA+tBA,IAAM,gBAAN,cAA4B,cAAAA,cAAoB;AAAA;AAAA,MAE5C;AAAA;AAAA,MAEA;AAAA;AAAA,MAEA;AAAA;AAAA,MAEA;AAAA;AAAA,MAEA;AAAA,MAET,YAAY,SAAiB,SAA8B,CAAC,GAAG;AAE7D,cAAM,UAAwB,EAAE,QAAQ,OAAO,QAAQ,UAAU;AACjE,YAAI,OAAO,WAAW,OAAW,SAAQ,SAAS,OAAO;AACzD,YAAI,OAAO,UAAU,OAAW,SAAQ,QAAQ,OAAO;AACvD,YAAI,OAAO,WAAW,OAAW,SAAQ,SAAS,OAAO;AACzD,YAAI,OAAO,eAAe,OAAW,SAAQ,aAAa,OAAO;AAEjE,cAAM,SAAS;AAAA,UACb,MAAM;AAAA,UACN;AAAA,QACF,CAAC;AAED,eAAO,eAAe,MAAM,QAAQ,EAAE,OAAO,iBAAiB,UAAU,MAAM,cAAc,KAAK,CAAC;AAElG,eAAO,eAAe,MAAM,QAAQ,EAAE,OAAO,OAAO,QAAQ,WAAW,UAAU,OAAO,cAAc,KAAK,CAAC;AAE5G,aAAK,WAAW,OAAO,YAAY;AACnC,aAAK,SAAS,OAAO;AACrB,aAAK,OAAO,OAAO;AACnB,aAAK,WAAW,OAAO;AACvB,aAAK,SAAS,OAAO,QAAQ;AAAA,MAC/B;AAAA;AAAA,MAGA,IAAI,SAA6B;AAC/B,eAAO,KAAK,QAAQ;AAAA,MACtB;AAAA;AAAA,MAGA,IAAI,QAA4B;AAC9B,eAAO,KAAK,QAAQ;AAAA,MACtB;AAAA;AAAA,MAGA,IAAI,SAA6B;AAC/B,eAAO,KAAK,QAAQ;AAAA,MACtB;AAAA;AAAA,MAGA,IAAI,aAAiC;AACnC,eAAO,KAAK,QAAQ;AAAA,MACtB;AAAA,IACF;AAMO,IAAM,kBAAN,cAA8B,cAAAC,gBAAsB;AAAA,MACzD,YAAY,SAAiB;AAC3B,cAAM,OAAO;AAEb,eAAO,eAAe,MAAM,QAAQ,EAAE,OAAO,mBAAmB,UAAU,MAAM,cAAc,KAAK,CAAC;AAAA,MACtG;AAAA,IACF;AAMO,IAAM,eAAN,cAA2B,cAAAC,uBAA6B;AAAA,MAC7D,YAAY,UAAkB,mBAAmB;AAE/C,cAAM,eAAe,QAAQ,MAAM,YAAY;AAC/C,cAAM,YAAY,eAAe,CAAC;AAClC,cAAM,YAAY,YAAY,SAAS,WAAW,EAAE,IAAI;AACxD,cAAM,SAAS;AAEf,eAAO,eAAe,MAAM,QAAQ,EAAE,OAAO,gBAAgB,UAAU,MAAM,cAAc,KAAK,CAAC;AAEjG,YAAI,YAAY,qBAAqB,YAAY,8BAA8B,SAAS,MAAM;AAC5F,iBAAO,eAAe,MAAM,WAAW,EAAE,OAAO,SAAS,UAAU,MAAM,cAAc,KAAK,CAAC;AAAA,QAC/F;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACrmBO,SAAS,oBAAoB,QAA4C;AAC9E,SAAO,IAAI,cAAc,MAAM;AACjC;AA7NA,IAgBM,UASO;AAzBb;AAAA;AAAA;AAaA;AAGA,IAAM,WAAW;AAAA,MACf,SAAS;AAAA;AAAA,MACT,SAAS;AAAA,IACX;AAMO,IAAM,gBAAN,MAAyC;AAAA,MAC7B;AAAA,MACA;AAAA,MACT,YAAY;AAAA,MAEpB,YAAY,QAA6B;AACvC,aAAK,SAAS;AAAA,UACZ,GAAG;AAAA,UACH,GAAG;AAAA,QACL;AACA,aAAK,YAAY,OAAO,SAAS,WAAW;AAC5C,aAAK,YAAY;AAAA,MACnB;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,MACJ,KACA,QACyB;AACzB,cAAM,WAAW,MAAM,KAAK,QAA0B,UAAU;AAAA,UAC9D;AAAA,UACA,QAAQ,UAAU,CAAC;AAAA,QACrB,CAAC;AAED,eAAO,KAAK,mBAAmB,QAAQ;AAAA,MACzC;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,YACJ,SACA,SACY;AACZ,cAAM,WAAW,MAAM,KAAK,QAA6B,gBAAgB;AAAA,UACvE;AAAA,UACA,SAAS,UAAU,KAAK,4BAA4B,OAAO,IAAI;AAAA,QACjE,CAAC;AAGD,eAAO,SAAS;AAAA,MAClB;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,QAAuB;AAC3B,aAAK,YAAY;AAAA,MACnB;AAAA;AAAA;AAAA;AAAA,MAKA,cAAuB;AACrB,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,QACZ,MACA,MACY;AACZ,cAAM,MAAM,GAAG,KAAK,OAAO,OAAO,GAAG,IAAI;AACzC,cAAM,UAAkC;AAAA,UACtC,gBAAgB;AAAA,UAChB,GAAG,KAAK,OAAO;AAAA,QACjB;AAEA,YAAI,KAAK,OAAO,QAAQ;AACtB,kBAAQ,eAAe,IAAI,UAAU,KAAK,OAAO,MAAM;AAAA,QACzD;AAEA,cAAM,aAAa,IAAI,gBAAgB;AACvC,cAAM,YAAY,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,OAAO,OAAO;AAE1E,YAAI;AACF,gBAAM,WAAW,MAAM,KAAK,UAAU,KAAK;AAAA,YACzC,QAAQ;AAAA,YACR;AAAA,YACA,MAAM,KAAK,UAAU,IAAI;AAAA,YACzB,QAAQ,WAAW;AAAA,UACrB,CAAC;AAED,uBAAa,SAAS;AAEtB,cAAI,CAAC,SAAS,IAAI;AAChB,kBAAM,QAAQ,MAAM,KAAK,mBAAmB,QAAQ;AACpD,kBAAM;AAAA,UACR;AAEA,iBAAO,MAAM,SAAS,KAAK;AAAA,QAC7B,SAAS,OAAO;AACd,uBAAa,SAAS;AAEtB,cAAI,iBAAiB,OAAO;AAC1B,gBAAI,MAAM,SAAS,cAAc;AAC/B,oBAAM,IAAI,aAAa,2BAA2B,KAAK,OAAO,OAAO,IAAI;AAAA,YAC3E;AACA,gBAAI,iBAAiB,iBAAiB,iBAAiB,iBAAiB;AACtE,oBAAM;AAAA,YACR;AAAA,UACF;AAEA,gBAAM,IAAI;AAAA,YACR,qCAAqC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,UAC7F;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,mBAAmB,UAAoC;AACnE,YAAI;AACF,gBAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,cAAI,KAAK,OAAO,MAAM;AACpB,mBAAO,IAAI,cAAc,KAAK,MAAM,WAAW,kBAAkB;AAAA,cAC/D,MAAM,KAAK,MAAM;AAAA,cACjB,UAAU,KAAK,MAAM,YAAY;AAAA,cACjC,QAAQ,KAAK,MAAM;AAAA,cACnB,MAAM,KAAK,MAAM;AAAA,cACjB,UAAU,KAAK,MAAM;AAAA,cACrB,QAAQ,KAAK,MAAM;AAAA,cACnB,OAAO,KAAK,MAAM;AAAA,cAClB,QAAQ,KAAK,MAAM;AAAA,cACnB,YAAY,KAAK,MAAM;AAAA,YACzB,CAAC;AAAA,UACH;AAEA,iBAAO,IAAI,gBAAgB,KAAK,OAAO,WAAW,QAAQ,SAAS,MAAM,KAAK,SAAS,UAAU,EAAE;AAAA,QACrG,QAAQ;AACN,iBAAO,IAAI,gBAAgB,QAAQ,SAAS,MAAM,KAAK,SAAS,UAAU,EAAE;AAAA,QAC9E;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,mBAAkC,UAA4C;AACpF,eAAO;AAAA,UACL,MAAM,SAAS,QAAQ,CAAC;AAAA,UACxB,UAAU,SAAS,YAAY,SAAS,MAAM,UAAU;AAAA,UACxD,QAAQ,SAAS,UAAU,CAAC;AAAA,UAC5B,SAAS,SAAS,WAAW;AAAA,QAC/B;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,4BAA4B,SAAsD;AACxF,eAAO;AAAA,UACL,gBAAgB,QAAQ;AAAA,UACxB,UAAU,QAAQ;AAAA,UAClB,YAAY,QAAQ;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACoBO,SAAS,iBACd,UACA,SACe;AACf,SAAO,IAAI,WAAW,UAAU,OAAO;AACzC;AApNA,IAkEa;AAlEb;AAAA;AAAA;AAkEO,IAAM,aAAN,MAAM,YAAwC;AAAA,MAC3C;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX,YAA+B;AAAA,MAC/B;AAAA,MAER,YAAY,UAA4B,SAAsC;AAC5E,aAAK,WAAW;AAChB,aAAK,UAAU,WAAW;AAAA,MAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAqBA,IAAO,IAAgC;AACrC,eAAO,IAAI,YAAc,YAAY;AAEnC,cAAI,KAAK,SAAS,aAAa,GAAG;AAChC,kBAAMC,UAAS,MAAM,KAAK,QAAQ;AAClC,kBAAMC,UAAS,GAAGD,OAAM;AAGxB,gBAAIC,mBAAkB,aAAY;AAChC,qBAAOA,QAAO,QAAQ;AAAA,YACxB;AAEA,mBAAOA;AAAA,UACT;AAGA,gBAAM,SAAS,MAAM,KAAK,QAAQ;AAClC,gBAAM,SAAS,GAAG,MAAM;AAExB,cAAI,kBAAkB,WAAW,kBAAkB,aAAY;AAC7D,mBAAO;AAAA,UACT;AAEA,iBAAO;AAAA,QACT,GAAG,KAAK,OAAO;AAAA,MACjB;AAAA;AAAA;AAAA;AAAA,MAKA,QAAW,IAAgD;AACzD,eAAO,IAAI,YAAc,YAAY;AACnC,gBAAM,SAAS,MAAM,KAAK,QAAQ;AAClC,gBAAM,SAAS,GAAG,MAAM;AACxB,iBAAO,OAAO,QAAQ;AAAA,QACxB,GAAG,KAAK,OAAO;AAAA,MACjB;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,UAAsB;AAE1B,YAAI,KAAK,YAAY,KAAK,iBAAiB,QAAW;AACpD,iBAAO,KAAK;AAAA,QACd;AAGA,YAAI,KAAK,WAAW;AAClB,iBAAO,KAAK;AAAA,QACd;AAGA,aAAK,YAAY,KAAK,SAAS;AAE/B,YAAI;AACF,eAAK,eAAe,MAAM,KAAK;AAC/B,eAAK,WAAW;AAChB,iBAAO,KAAK;AAAA,QACd,UAAE;AACA,eAAK,YAAY;AAAA,QACnB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,QAAc;AACZ,aAAK,WAAW;AAChB,aAAK,eAAe;AACpB,aAAK,YAAY;AAAA,MACnB;AAAA;AAAA;AAAA;AAAA,MAKA,aAAsB;AACpB,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKA,KACE,aACA,YAC8B;AAC9B,eAAO,KAAK,QAAQ,EAAE,KAAK,aAAa,UAAU;AAAA,MACpD;AAAA;AAAA;AAAA;AAAA,MAKA,MACE,YACsB;AACtB,eAAO,KAAK,QAAQ,EAAE,MAAM,UAAU;AAAA,MACxC;AAAA;AAAA;AAAA;AAAA,MAKA,QAAQ,WAA6C;AACnD,eAAO,KAAK,QAAQ,EAAE,QAAQ,SAAS;AAAA,MACzC;AAAA,IACF;AAAA;AAAA;;;ACsfO,SAAS,mBAAmB,QAA0C;AAC3E,SAAO,IAAI,aAAa,MAAM;AAChC;AAlsBA,IA2CMC,WAkEO;AA7Gb;AAAA;AAAA;AAmBA;AACA;AAuBA,IAAMA,YAAW;AAAA,MACf,KAAK;AAAA,MACL,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,WAAW;AAAA,MACX,cAAc;AAAA;AAAA,IAChB;AA4DO,IAAM,eAAN,MAA6D;AAAA,MACjD;AAAA,MACA;AAAA,MACT,KAAuB;AAAA,MACvB,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,aAAmC;AAAA,MACnC,YAAY;AAAA,MACZ,kBAAkB,oBAAI,IAA4B;AAAA,MAClD,eAAoC;AAAA,MACpC,aAAa;AAAA,MAErB,YAAY,QAA4B;AACtC,aAAK,SAAS;AAAA,UACZ,KAAK,OAAO,OAAOA,UAAS;AAAA,UAC5B,QAAQ,OAAO;AAAA,UACf,WAAW,OAAO;AAAA,UAClB,gBAAgB,OAAO,kBAAkBA,UAAS;AAAA,UAClD,gBAAgB,OAAO,kBAAkBA,UAAS;AAAA,UAClD,WAAW,OAAO,aAAaA,UAAS;AAAA,UACxC,cAAc,OAAO,gBAAgBA,UAAS;AAAA,QAChD;AACA,aAAK,gBAAgB,OAAO,aAAa,WAAW;AAAA,MACtD;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,SAAS,KAAa,QAA4B;AAChD,YAAI,CAAC,KAAK,cAAc;AACtB,eAAK,eAAe;AAAA,YAClB,SAAS,CAAC;AAAA,YACV,WAAW,CAAC;AAAA,YACZ,OAAO;AAAA,UACT;AAGA,cAAI,KAAK,OAAO,iBAAiB,GAAG;AAClC,2BAAe,MAAM,KAAK,WAAW,CAAC;AAAA,UACxC,OAAO;AACL,iBAAK,aAAa,QAAQ;AAAA,cACxB,MAAM,KAAK,WAAW;AAAA,cACtB,KAAK,OAAO;AAAA,YACd;AAAA,UACF;AAAA,QACF;AAEA,cAAM,UAAU,KAAK,aAAa,QAAQ;AAC1C,aAAK,aAAa,QAAQ,KAAK,EAAE,KAAK,QAAQ,UAAU,CAAC,EAAE,CAAC;AAE5D,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,eAAuC;AAC3C,YAAI,CAAC,KAAK,gBAAgB,KAAK,aAAa,QAAQ,WAAW,GAAG;AAChE,iBAAO,CAAC;AAAA,QACV;AAEA,cAAM,KAAK,gBAAgB;AAE3B,cAAM,QAAQ,KAAK;AACnB,aAAK,eAAe;AAEpB,YAAI,MAAM,OAAO;AACf,uBAAa,MAAM,KAAK;AAAA,QAC1B;AAEA,cAAM,KAAK,KAAK,cAAc;AAC9B,cAAM,WAAW,MAAM,KAAK,YAA8B,IAAI;AAAA,UAC5D,MAAM;AAAA,UACN;AAAA,UACA,SAAS,MAAM;AAAA,QACjB,CAAC;AAED,eAAO,SAAS,QAAQ,IAAI,CAAC,GAAG,OAAO;AAAA,UACrC,SAAS;AAAA,UACT,MAAM,EAAE;AAAA,UACR,QAAQ,EAAE;AAAA,UACV,UAAU,EAAE;AAAA,UACZ,YAAY,EAAE;AAAA,QAChB,EAAE;AAAA,MACJ;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,UAAU,UAAoC;AAIlD,cAAM,IAAI,MAAM,wDAAwD;AAAA,MAC1E;AAAA;AAAA;AAAA;AAAA,MAKA,eAAwB;AACtB,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKA,kBAAwB;AACtB,aAAK,aAAa;AAAA,MACpB;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,iBAAgC;AACpC,aAAK,aAAa;AAClB,cAAM,KAAK,WAAW;AAAA,MACxB;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,aAA4B;AACxC,YAAI,CAAC,KAAK,gBAAgB,KAAK,aAAa,QAAQ,WAAW,GAAG;AAChE;AAAA,QACF;AAEA,cAAM,QAAQ,KAAK;AACnB,aAAK,eAAe;AAEpB,YAAI,MAAM,OAAO;AACf,uBAAa,MAAM,KAAK;AAAA,QAC1B;AAEA,YAAI;AACF,gBAAM,KAAK,gBAAgB;AAE3B,gBAAM,KAAK,KAAK,cAAc;AAC9B,gBAAM,WAAW,MAAM,KAAK,YAA8B,IAAI;AAAA,YAC5D,MAAM;AAAA,YACN;AAAA,YACA,SAAS,MAAM;AAAA,UACjB,CAAC;AAGD,mBAAS,IAAI,GAAG,IAAI,MAAM,UAAU,QAAQ,KAAK;AAC/C,kBAAM,WAAW,MAAM,UAAU,CAAC;AAClC,kBAAM,SAAS,SAAS,QAAQ,CAAC;AACjC,gBAAI,YAAY,QAAQ;AACtB,uBAAS,QAAQ;AAAA,gBACf,SAAS;AAAA,gBACT,MAAM,OAAO;AAAA,gBACb,QAAQ,OAAO;AAAA,gBACf,UAAU,OAAO;AAAA,gBACjB,YAAY,OAAO;AAAA,cACrB,CAAC;AAAA,YACH,WAAW,UAAU;AACnB,uBAAS,OAAO,IAAI,MAAM,uBAAuB,CAAC,EAAE,CAAC;AAAA,YACvD;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AAEd,qBAAW,YAAY,MAAM,WAAW;AACtC,gBAAI,UAAU;AACZ,uBAAS,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,YAC3E;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,SACE,KACA,QACiB;AACjB,eAAO,iBAAiB,YAAY;AAClC,gBAAM,SAAS,MAAM,KAAK,MAAS,KAAK,MAAM;AAC9C,iBAAO,OAAO;AAAA,QAChB,GAAG,IAAI;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,MACJ,KACA,QACyB;AAEzB,YAAI,KAAK,OAAO,aAAa,KAAK,YAAY;AAC5C,iBAAO,IAAI,QAAQ,CAACC,WAAS,WAAW;AACtC,kBAAM,UAAU,KAAK,SAAS,KAAK,MAAM;AAEzC,gBAAI,CAAC,KAAK,cAAc;AACtB,qBAAO,IAAI,MAAM,+CAA+C,CAAC;AACjE;AAAA,YACF;AAEA,iBAAK,aAAa,UAAU,OAAO,IAAI;AAAA,cACrC,SAAS,CAAC,WAAW;AACnB,gBAAAA,UAAQ;AAAA,kBACN,MAAM,OAAO;AAAA,kBACb,QAAQ,OAAO;AAAA,kBACf,UAAU,OAAO;AAAA,kBACjB,SAAS;AAAA,gBACX,CAAC;AAAA,cACH;AAAA,cACA;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAEA,cAAM,KAAK,gBAAgB;AAE3B,cAAM,KAAK,KAAK,cAAc;AAC9B,cAAM,WAAW,MAAM,KAAK,YAAiC,IAAI;AAAA,UAC/D,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,QAAQ,UAAU,CAAC;AAAA,QACrB,CAAC;AAED,eAAO;AAAA,UACL,MAAM,SAAS,QAAQ,CAAC;AAAA,UACxB,QAAS,SAAS,UAAU,CAAC;AAAA,UAC7B,UAAU,SAAS,YAAY,SAAS,MAAM,UAAU;AAAA,UACxD,SAAS,SAAS,WAAW;AAAA,QAC/B;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,MACJ,SACgC;AAChC,cAAM,KAAK,gBAAgB;AAE3B,cAAM,KAAK,KAAK,cAAc;AAC9B,cAAM,WAAW,MAAM,KAAK,YAA8B,IAAI;AAAA,UAC5D,MAAM;AAAA,UACN;AAAA,UACA;AAAA,QACF,CAAC;AAED,eAAO,SAAS,QAAQ,IAAI,QAAM;AAAA,UAChC,MAAM,EAAE;AAAA,UACR,QAAQ,EAAE;AAAA,UACV,UAAU,EAAE;AAAA,UACZ,SAAS;AAAA,QACX,EAAE;AAAA,MACJ;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,iBACJ,SACA,SACgC;AAChC,cAAM,KAAK,gBAAgB;AAE3B,cAAM,KAAK,KAAK,cAAc;AAC9B,cAAM,WAAW,MAAM,KAAK,YAA8B,IAAI;AAAA,UAC5D,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,SAAS,UAAU,KAAK,4BAA4B,OAAO,IAAI;AAAA,QACjE,CAAC;AAED,eAAO,SAAS,QAAQ,IAAI,QAAM;AAAA,UAChC,MAAM,EAAE;AAAA,UACR,QAAQ,EAAE;AAAA,UACV,UAAU,EAAE;AAAA,UACZ,SAAS;AAAA,QACX,EAAE;AAAA,MACJ;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,YACJ,SACA,SACY;AACZ,cAAM,UAAU,MAAM,KAAK,iBAAiB,SAAS,OAAO;AAC5D,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,QAAuB;AAE3B,YAAI,KAAK,cAAc;AACrB,gBAAM,KAAK,WAAW;AAAA,QACxB;AAEA,aAAK,iBAAiB,IAAI,gBAAgB,mBAAmB,CAAC;AAE9D,YAAI,KAAK,IAAI;AACX,eAAK,GAAG,MAAM,KAAM,2BAA2B;AAC/C,eAAK,KAAK;AAAA,QACZ;AAEA,aAAK,YAAY;AACjB,aAAK,gBAAgB;AACrB,aAAK,aAAa;AAAA,MACpB;AAAA;AAAA;AAAA;AAAA,MAKA,cAAuB;AACrB,eAAO,KAAK,aAAa,KAAK;AAAA,MAChC;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,MAAc,kBAAiC;AAC7C,YAAI,KAAK,YAAY,GAAG;AACtB;AAAA,QACF;AAEA,YAAI,KAAK,YAAY;AACnB,iBAAO,KAAK;AAAA,QACd;AAEA,aAAK,aAAa,KAAK,QAAQ;AAC/B,YAAI;AACF,gBAAM,KAAK;AAAA,QACb,UAAE;AACA,eAAK,aAAa;AAAA,QACpB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,UAAyB;AACrC,eAAO,IAAI,QAAQ,CAACA,WAAS,WAAW;AACtC,gBAAM,YAAY,WAAW,MAAM;AACjC,mBAAO,IAAI,aAAa,wCAAwC,KAAK,OAAO,cAAc,IAAI,CAAC;AAC/F,gBAAI,KAAK,IAAI;AACX,mBAAK,GAAG,MAAM;AACd,mBAAK,KAAK;AAAA,YACZ;AAAA,UACF,GAAG,KAAK,OAAO,cAAc;AAE7B,cAAI;AACF,iBAAK,KAAK,IAAI,KAAK,cAAc,KAAK,OAAO,GAAG;AAAA,UAClD,SAAS,OAAO;AACd,yBAAa,SAAS;AACtB,mBAAO,IAAI,gBAAgB,+BAA+B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE,CAAC;AACnH;AAAA,UACF;AAEA,eAAK,GAAG,SAAS,YAAY;AAC3B,iBAAK,YAAY;AAGjB,gBAAI,KAAK,OAAO,QAAQ;AACtB,kBAAI;AACF,sBAAM,KAAK,aAAa;AACxB,6BAAa,SAAS;AACtB,gBAAAA,UAAQ;AAAA,cACV,SAAS,OAAO;AACd,6BAAa,SAAS;AACtB,uBAAO,KAAK;AAAA,cACd;AAAA,YACF,OAAO;AACL,mBAAK,gBAAgB;AACrB,2BAAa,SAAS;AACtB,cAAAA,UAAQ;AAAA,YACV;AAAA,UACF;AAEA,eAAK,GAAG,YAAY,CAAC,UAAU;AAC7B,iBAAK,cAAc,MAAM,IAAI;AAAA,UAC/B;AAEA,eAAK,GAAG,UAAU,MAAM;AACtB,yBAAa,SAAS;AACtB,kBAAM,QAAQ,IAAI,gBAAgB,0BAA0B;AAC5D,iBAAK,iBAAiB,KAAK;AAC3B,mBAAO,KAAK;AAAA,UACd;AAEA,eAAK,GAAG,UAAU,CAAC,UAAU;AAC3B,yBAAa,SAAS;AACtB,iBAAK,YAAY;AACjB,iBAAK,gBAAgB;AAErB,gBAAI,CAAC,MAAM,UAAU;AACnB,oBAAM,QAAQ,IAAI,gBAAgB,kCAAkC,MAAM,IAAI,IAAI,MAAM,MAAM,EAAE;AAChG,mBAAK,iBAAiB,KAAK;AAC3B,qBAAO,KAAK;AAAA,YACd;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,eAA8B;AAC1C,cAAM,KAAK,KAAK,cAAc;AAC9B,cAAM,WAAW,MAAM,KAAK,YAA6B,IAAI;AAAA,UAC3D,MAAM;AAAA,UACN;AAAA,UACA,QAAQ,KAAK,OAAO;AAAA,QACtB,CAAC;AAED,YAAI,CAAC,SAAS,SAAS;AACrB,gBAAM,IAAI,gBAAgB,uBAAuB;AAAA,QACnD;AAEA,aAAK,gBAAgB;AAAA,MACvB;AAAA;AAAA;AAAA;AAAA,MAKQ,YAAe,IAAY,SAA8B;AAC/D,eAAO,IAAI,QAAQ,CAACA,WAAS,WAAW;AACtC,gBAAM,UAAU,WAAW,MAAM;AAC/B,iBAAK,gBAAgB,OAAO,EAAE;AAC9B,mBAAO,IAAI,aAAa,mBAAmB,CAAC;AAAA,UAC9C,GAAG,KAAK,OAAO,cAAc;AAE7B,eAAK,gBAAgB,IAAI,IAAI;AAAA,YAC3B,SAASA;AAAA,YACT;AAAA,YACA;AAAA,UACF,CAAC;AAED,cAAI,KAAK,MAAM,KAAK,GAAG,eAAe,UAAU,MAAM;AACpD,iBAAK,GAAG,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,UACtC,OAAO;AACL,yBAAa,OAAO;AACpB,iBAAK,gBAAgB,OAAO,EAAE;AAC9B,mBAAO,IAAI,gBAAgB,4BAA4B,CAAC;AAAA,UAC1D;AAAA,QACF,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKQ,cAAc,MAAoB;AACxC,YAAI;AAEJ,YAAI;AACF,oBAAU,KAAK,MAAM,IAAI;AAAA,QAC3B,QAAQ;AACN,kBAAQ,MAAM,gCAAgC,IAAI;AAClD;AAAA,QACF;AAGA,YAAI,QAAQ,SAAS,mBAAqB;AACxC;AAAA,QACF;AAGA,YAAI,QAAQ,WAAW,OAAO,QAAQ,OAAO,UAAU;AACrD,gBAAM,UAAU,KAAK,gBAAgB,IAAI,QAAQ,EAAE;AACnD,cAAI,SAAS;AACX,yBAAa,QAAQ,OAAO;AAC5B,iBAAK,gBAAgB,OAAO,QAAQ,EAAE;AAEtC,gBAAI,QAAQ,SAAS,qBAAsB;AACzC,oBAAM,eAAe;AACrB,sBAAQ,OAAO,IAAI,cAAc,aAAa,MAAM,WAAW,kBAAkB;AAAA,gBAC/E,MAAM,aAAa,MAAM;AAAA,gBACzB,UAAU,aAAa,MAAM,YAAY;AAAA,gBACzC,QAAQ,aAAa,MAAM;AAAA,gBAC3B,MAAM,aAAa,MAAM;AAAA,gBACzB,UAAU,aAAa,MAAM;AAAA,gBAC7B,QAAQ,aAAa,MAAM;AAAA,gBAC3B,OAAO,aAAa,MAAM;AAAA,gBAC1B,QAAQ,aAAa,MAAM;AAAA,gBAC3B,YAAY,aAAa,MAAM;AAAA,cACjC,CAAC,CAAC;AAAA,YACJ,OAAO;AACL,sBAAQ,QAAQ,OAAO;AAAA,YACzB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,iBAAiB,OAAoB;AAC3C,mBAAW,CAAC,EAAE,OAAO,KAAK,KAAK,iBAAiB;AAC9C,uBAAa,QAAQ,OAAO;AAC5B,kBAAQ,OAAO,KAAK;AAAA,QACtB;AACA,aAAK,gBAAgB,MAAM;AAG3B,YAAI,KAAK,cAAc;AACrB,qBAAW,YAAY,KAAK,aAAa,WAAW;AAClD,qBAAS,OAAO,KAAK;AAAA,UACvB;AACA,cAAI,KAAK,aAAa,OAAO;AAC3B,yBAAa,KAAK,aAAa,KAAK;AAAA,UACtC;AACA,eAAK,eAAe;AAAA,QACtB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,gBAAwB;AAC9B,eAAO,EAAE,KAAK;AAAA,MAChB;AAAA;AAAA;AAAA;AAAA,MAKQ,4BAA4B,SAAsD;AACxF,eAAO;AAAA,UACL,gBAAgB,QAAQ;AAAA,UACxB,UAAU,QAAQ;AAAA,UAClB,YAAY,QAAQ;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACuEO,SAAS,qBAAqB,QAA8C;AACjF,SAAO,IAAI,eAAe,MAAM;AAClC;AAhtBA,IAiHMC,WAaO;AA9Hb;AAAA;AAAA;AAkBA;AA+FA,IAAMA,YAAW;AAAA,MACf,gBAAgB;AAAA,MAChB,cAAc;AAAA;AAAA,MACd,oBAAoB;AAAA,MACpB,mBAAmB;AAAA,MACnB,sBAAsB;AAAA,IACxB;AAOO,IAAM,iBAAN,MAA6C;AAAA,MACjC;AAAA,MAOA;AAAA,MACT,KAAuB;AAAA,MACvB,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,aAAmC;AAAA,MACnC,cAA6B;AAAA,MAC7B,mBAAmB;AAAA,MACnB,iBAAuD;AAAA,MACvD,YAAmD;AAAA,MACnD,kBAAkB;AAAA;AAAA,MAGlB,uBAAuB,oBAAI,IAAkC;AAAA,MAC7D,yBAAyB,oBAAI,IAAkC;AAAA,MAC/D,cAA2C;AAAA;AAAA,MAG3C,eAAiF;AAAA,MACjF,eAAwE;AAAA,MACxE,mBAAoF;AAAA,MACpF,eAAoC;AAAA;AAAA,MAGpC,sBAAsB,oBAAI,IAOhC;AAAA,MAEF,YAAY,QAA8B;AACxC,aAAK,SAAS;AAAA,UACZ,KAAK,OAAO;AAAA,UACZ,QAAQ,OAAO;AAAA,UACf,WAAW,OAAO;AAAA,UAClB,gBAAgB,OAAO,kBAAkBA,UAAS;AAAA,UAClD,cAAc,OAAO,gBAAgBA,UAAS;AAAA,QAChD;AACA,aAAK,gBAAgB,OAAO,aAAa,WAAW;AAAA,MACtD;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,UAAyB;AAC7B,YAAI,KAAK,aAAa,KAAK,eAAe;AACxC;AAAA,QACF;AAEA,YAAI,KAAK,YAAY;AACnB,iBAAO,KAAK;AAAA,QACd;AAEA,aAAK,kBAAkB;AACvB,aAAK,aAAa,KAAK,SAAS;AAEhC,YAAI;AACF,gBAAM,KAAK;AAAA,QACb,UAAE;AACA,eAAK,aAAa;AAAA,QACpB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,WAA0B;AAChC,eAAO,IAAI,QAAQ,CAACC,WAAS,WAAW;AACtC,gBAAM,YAAY,WAAW,MAAM;AACjC,mBAAO,IAAI,aAAa,wCAAwC,KAAK,OAAO,cAAc,IAAI,CAAC;AAC/F,gBAAI,KAAK,IAAI;AACX,mBAAK,GAAG,MAAM;AACd,mBAAK,KAAK;AAAA,YACZ;AAAA,UACF,GAAG,KAAK,OAAO,cAAc;AAE7B,cAAI;AACF,iBAAK,KAAK,IAAI,KAAK,cAAc,KAAK,OAAO,GAAG;AAAA,UAClD,SAAS,OAAO;AACd,yBAAa,SAAS;AACtB;AAAA,cACE,IAAI;AAAA,gBACF,+BAA+B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,cACvF;AAAA,YACF;AACA;AAAA,UACF;AAEA,eAAK,GAAG,SAAS,MAAM;AACrB,iBAAK,YAAY;AACjB,iBAAK,mBAAmB;AAGxB,gBAAI,KAAK,OAAO,QAAQ;AACtB,mBAAK,aAAa,EACf,KAAK,MAAM;AACV,6BAAa,SAAS;AACtB,gBAAAA,UAAQ;AAER,oBAAI,KAAK,OAAO,eAAe,GAAG;AAChC,uBAAK,kBAAkB;AAAA,gBACzB;AAAA,cACF,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,6BAAa,SAAS;AACtB,uBAAO,KAAK;AAAA,cACd,CAAC;AAAA,YACL,OAAO;AACL,mBAAK,gBAAgB;AACrB,2BAAa,SAAS;AACtB,cAAAA,UAAQ;AAER,kBAAI,KAAK,OAAO,eAAe,GAAG;AAChC,qBAAK,kBAAkB;AAAA,cACzB;AAAA,YACF;AAAA,UACF;AAEA,eAAK,GAAG,YAAY,CAAC,UAAU;AAC7B,iBAAK,cAAc,MAAM,IAAI;AAAA,UAC/B;AAEA,eAAK,GAAG,UAAU,MAAM;AACtB,yBAAa,SAAS;AACtB,kBAAM,QAAQ,IAAI,gBAAgB,0BAA0B;AAC5D,iBAAK,iBAAiB,KAAK;AAC3B,mBAAO,KAAK;AAAA,UACd;AAEA,eAAK,GAAG,UAAU,CAAC,UAAU;AAC3B,yBAAa,SAAS;AACtB,iBAAK,YAAY;AACjB,iBAAK,gBAAgB;AACrB,iBAAK,iBAAiB;AAEtB,gBAAI,CAAC,MAAM,YAAY,KAAK,iBAAiB;AAC3C,mBAAK,kBAAkB;AAAA,YACzB,WAAW,CAAC,KAAK,iBAAiB;AAChC,mBAAK,eAAe;AAAA,YACtB,OAAO;AACL,oBAAM,QAAQ,IAAI,gBAAgB,qBAAqB,MAAM,IAAI,IAAI,MAAM,MAAM,EAAE;AACnF,mBAAK,iBAAiB,KAAK;AAC3B,qBAAO,KAAK;AAAA,YACd;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKQ,eAA8B;AACpC,eAAO,IAAI,QAAQ,CAACA,WAAS,WAAW;AACtC,gBAAM,YAAY,WAAW,MAAM;AACjC,iBAAK,cAAc;AACnB,mBAAO,IAAI,aAAa,0BAA0B,CAAC;AAAA,UACrD,GAAG,KAAK,OAAO,cAAc;AAE7B,eAAK,cAAc;AAAA,YACjB,SAAS,MAAM;AACb,2BAAa,SAAS;AACtB,mBAAK,cAAc;AACnB,mBAAK,gBAAgB;AACrB,cAAAA,UAAQ;AAAA,YACV;AAAA,YACA,QAAQ,CAAC,UAAiB;AACxB,2BAAa,SAAS;AACtB,mBAAK,cAAc;AACnB,qBAAO,KAAK;AAAA,YACd;AAAA,YACA,SAAS;AAAA,UACX;AAEA,eAAK,KAAK;AAAA,YACR,MAAM;AAAA,YACN,QAAQ,KAAK,OAAO;AAAA,UACtB,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,aAA4B;AAChC,aAAK,kBAAkB;AAEvB,YAAI,KAAK,gBAAgB;AACvB,uBAAa,KAAK,cAAc;AAChC,eAAK,iBAAiB;AAAA,QACxB;AAEA,aAAK,iBAAiB;AACtB,aAAK,iBAAiB,IAAI,gBAAgB,mBAAmB,CAAC;AAE9D,YAAI,KAAK,IAAI;AACX,eAAK,GAAG,MAAM,KAAM,2BAA2B;AAC/C,eAAK,KAAK;AAAA,QACZ;AAEA,aAAK,YAAY;AACjB,aAAK,gBAAgB;AACrB,aAAK,oBAAoB,MAAM;AAC/B,aAAK,eAAe;AAAA,MACtB;AAAA;AAAA;AAAA;AAAA,MAKA,cAAuB;AACrB,eAAO,KAAK,aAAa,KAAK;AAAA,MAChC;AAAA;AAAA;AAAA;AAAA,MAKA,iBAAgC;AAC9B,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,UACJ,gBACA,OACA,QACA,SACe;AACf,eAAO,IAAI,QAAQ,CAACA,WAAS,WAAW;AACtC,gBAAM,YAAY,WAAW,MAAM;AACjC,iBAAK,qBAAqB,OAAO,cAAc;AAC/C,mBAAO,IAAI,aAAa,gCAAgC,CAAC;AAAA,UAC3D,GAAG,KAAK,OAAO,cAAc;AAE7B,eAAK,qBAAqB,IAAI,gBAAgB;AAAA,YAC5C,SAAS,MAAM;AACb,2BAAa,SAAS;AAEtB,mBAAK,oBAAoB,IAAI,gBAAgB,EAAE,OAAO,QAAQ,QAAQ,CAAC;AACvE,cAAAA,UAAQ;AAAA,YACV;AAAA,YACA,QAAQ,CAAC,UAAU;AACjB,2BAAa,SAAS;AACtB,qBAAO,KAAK;AAAA,YACd;AAAA,YACA,SAAS;AAAA,UACX,CAAC;AAED,eAAK,KAAK;AAAA,YACR,MAAM;AAAA,YACN;AAAA,YACA;AAAA,YACA;AAAA,YACA,SAAS;AAAA,cACP,QAAQ,QAAQ;AAAA,cAChB,QAAQ,QAAQ;AAAA,cAChB,YAAY,QAAQ;AAAA,cACpB,eAAe,QAAQ;AAAA,cACvB,qBAAqB,QAAQ;AAAA,cAC7B,WAAW,QAAQ;AAAA,cACnB,mBAAmB,QAAQ;AAAA,YAC7B;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,YAAY,gBAAuC;AACvD,aAAK,oBAAoB,OAAO,cAAc;AAE9C,eAAO,IAAI,QAAQ,CAACA,cAAY;AAC9B,gBAAM,YAAY,WAAW,MAAM;AACjC,iBAAK,uBAAuB,OAAO,cAAc;AAEjD,YAAAA,UAAQ;AAAA,UACV,GAAG,KAAK,OAAO,cAAc;AAE7B,eAAK,uBAAuB,IAAI,gBAAgB;AAAA,YAC9C,SAAS,MAAM;AACb,2BAAa,SAAS;AACtB,cAAAA,UAAQ;AAAA,YACV;AAAA,YACA,QAAQ,MAAM;AACZ,2BAAa,SAAS;AAEtB,cAAAA,UAAQ;AAAA,YACV;AAAA,YACA,SAAS;AAAA,UACX,CAAC;AAED,eAAK,KAAK;AAAA,YACR,MAAM;AAAA,YACN;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKA,QAAQ,SAAwE;AAC9E,aAAK,eAAe;AAAA,MACtB;AAAA;AAAA;AAAA;AAAA,MAKA,QAAQ,SAA+D;AACrE,aAAK,eAAe;AAAA,MACtB;AAAA;AAAA;AAAA;AAAA,MAKA,YAAY,SAAuE;AACjF,aAAK,mBAAmB;AAAA,MAC1B;AAAA;AAAA;AAAA;AAAA,MAKA,QAAQ,SAA2B;AACjC,aAAK,eAAe;AAAA,MACtB;AAAA;AAAA;AAAA;AAAA,MAKQ,KAAK,SAAwB;AAEnC,YAAI,KAAK,MAAM,KAAK,GAAG,eAAe,KAAK,cAAc,MAAM;AAC7D,eAAK,GAAG,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,QACtC;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,cAAc,MAAoB;AACxC,YAAI;AAEJ,YAAI;AACF,oBAAU,KAAK,MAAM,IAAI;AAAA,QAC3B,QAAQ;AACN,kBAAQ,MAAM,gCAAgC,IAAI;AAClD;AAAA,QACF;AAEA,gBAAQ,QAAQ,MAAM;AAAA,UACpB,KAAK;AACH,iBAAK,mBAAmB,OAAO;AAC/B;AAAA,UAEF,KAAK;AACH,iBAAK,mBAAmB,OAAO;AAC/B;AAAA,UAEF,KAAK;AACH,iBAAK,sBAAsB,OAAO;AAClC;AAAA,UAEF,KAAK;AACH,iBAAK,wBAAwB,OAAO;AACpC;AAAA,UAEF,KAAK;AACH,iBAAK,iBAAiB,OAAO;AAC7B;AAAA,UAEF,KAAK;AAEH;AAAA,UAEF;AAEE;AAAA,QACJ;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,mBAAmB,SAAgC;AACzD,cAAM,EAAE,gBAAgB,MAAM,IAAI;AAGlC,aAAK,cAAc,MAAM;AAGzB,cAAM,cAA8B;AAAA,UAClC,IAAI,MAAM;AAAA,UACV,KAAK,MAAM;AAAA,UACX,WAAW,MAAM;AAAA,UACjB,OAAO,MAAM;AAAA,UACb,QAAQ,MAAM;AAAA,UACd,WAAW,IAAI,KAAK,MAAM,SAAS;AAAA,UACnC,QAAQ,MAAM;AAAA,UACd,QAAQ,MAAM;AAAA,UACd,gBAAgB,MAAM;AAAA,UACtB,KAAK,MAAM;AAAA,UACX,qBAAqB,MAAM;AAAA,QAC7B;AAEA,aAAK,eAAe,gBAAgB,WAAW;AAG/C,aAAK,KAAK;AAAA,UACR,MAAM;AAAA,UACN;AAAA,UACA,KAAK,MAAM;AAAA,QACb,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKQ,mBAAmB,SAAgC;AACzD,cAAM,QAAQ,IAAI,MAAM,QAAQ,MAAM,OAAO;AAE7C,YAAI,QAAQ,gBAAgB;AAC1B,eAAK,eAAe,QAAQ,gBAAgB,KAAK;AAAA,QACnD,OAAO;AAEL,qBAAW,kBAAkB,KAAK,oBAAoB,KAAK,GAAG;AAC5D,iBAAK,eAAe,gBAAgB,KAAK;AAAA,UAC3C;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,sBAAsB,SAA0C;AACtE,cAAM,UAAU,KAAK,qBAAqB,IAAI,QAAQ,cAAc;AACpE,YAAI,SAAS;AACX,eAAK,qBAAqB,OAAO,QAAQ,cAAc;AACvD,uBAAa,QAAQ,OAAO;AAE5B,cAAI,QAAQ,SAAS;AACnB,oBAAQ,QAAQ;AAAA,UAClB,OAAO;AACL,oBAAQ,OAAO,IAAI,MAAM,QAAQ,SAAS,qBAAqB,CAAC;AAAA,UAClE;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,wBAAwB,SAA4C;AAC1E,cAAM,UAAU,KAAK,uBAAuB,IAAI,QAAQ,cAAc;AACtE,YAAI,SAAS;AACX,eAAK,uBAAuB,OAAO,QAAQ,cAAc;AACzD,uBAAa,QAAQ,OAAO;AAC5B,kBAAQ,QAAQ;AAAA,QAClB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,iBAAiB,SAAqC;AAC5D,YAAI,KAAK,aAAa;AACpB,cAAI,QAAQ,SAAS;AACnB,iBAAK,YAAY,QAAQ;AAAA,UAC3B,OAAO;AACL,iBAAK,YAAY,OAAO,IAAI,gBAAgB,QAAQ,SAAS,uBAAuB,CAAC;AAAA,UACvF;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,oBAA0B;AAChC,aAAK,iBAAiB;AACtB,YAAI,KAAK,OAAO,eAAe,GAAG;AAChC,eAAK,YAAY,YAAY,MAAM;AACjC,iBAAK,KAAK,EAAE,MAAM,kBAAoB,CAAC;AAAA,UACzC,GAAG,KAAK,OAAO,YAAY;AAAA,QAC7B;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,mBAAyB;AAC/B,YAAI,KAAK,WAAW;AAClB,wBAAc,KAAK,SAAS;AAC5B,eAAK,YAAY;AAAA,QACnB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,oBAA0B;AAChC,YAAI,CAAC,KAAK,iBAAiB;AACzB;AAAA,QACF;AAEA,aAAK;AAEL,YAAI,KAAK,mBAAmBD,UAAS,sBAAsB;AACzD,gBAAM,QAAQ,IAAI,gBAAgB,oCAAoC;AACtE,qBAAW,kBAAkB,KAAK,oBAAoB,KAAK,GAAG;AAC5D,iBAAK,eAAe,gBAAgB,KAAK;AAAA,UAC3C;AACA,eAAK,eAAe;AACpB;AAAA,QACF;AAGA,cAAM,QAAQ,KAAK;AAAA,UACjBA,UAAS,qBAAqB,KAAK,IAAI,GAAG,KAAK,mBAAmB,CAAC,IAAI,KAAK,OAAO,IAAI;AAAA,UACvFA,UAAS;AAAA,QACX;AAEA,aAAK,iBAAiB,WAAW,MAAM;AACrC,eAAK,mBAAmB,KAAK,kBAAkB,KAAK,eAAe,MAAS;AAC5E,eAAK,UAAU;AAAA,QACjB,GAAG,KAAK;AAAA,MACV;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,YAA2B;AACvC,YAAI;AACF,gBAAM,KAAK,SAAS;AAGpB,qBAAW,CAAC,gBAAgB,EAAE,OAAO,QAAQ,QAAQ,CAAC,KAAK,KAAK,qBAAqB;AAEnF,kBAAM,gBAAgB;AAAA,cACpB,GAAG;AAAA,cACH,YAAY,KAAK,eAAe,QAAQ;AAAA,YAC1C;AAEA,gBAAI;AACF,oBAAM,KAAK,UAAU,gBAAgB,OAAO,QAAQ,aAAa;AAAA,YACnE,SAAS,OAAO;AACd,mBAAK,eAAe,gBAAgB,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,YAC/F;AAAA,UACF;AAAA,QACF,QAAQ;AAEN,cAAI,KAAK,iBAAiB;AACxB,iBAAK,kBAAkB;AAAA,UACzB;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,iBAAiB,OAAoB;AAC3C,mBAAW,WAAW,KAAK,qBAAqB,OAAO,GAAG;AACxD,uBAAa,QAAQ,OAAO;AAC5B,kBAAQ,OAAO,KAAK;AAAA,QACtB;AACA,aAAK,qBAAqB,MAAM;AAEhC,mBAAW,WAAW,KAAK,uBAAuB,OAAO,GAAG;AAC1D,uBAAa,QAAQ,OAAO;AAC5B,kBAAQ,OAAO,KAAK;AAAA,QACtB;AACA,aAAK,uBAAuB,MAAM;AAElC,YAAI,KAAK,aAAa;AACpB,uBAAa,KAAK,YAAY,OAAO;AACrC,eAAK,YAAY,OAAO,KAAK;AAC7B,eAAK,cAAc;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACkUO,SAAS,sBAAsB,QAAgD;AACpF,SAAO,IAAI,gBAAgB,MAAM;AACnC;AA7gCA,IAwEME,WAwCO;AAhHb;AAAA;AAAA;AAyBA;AA+CA,IAAMA,YAAW;AAAA,MACf,SAAS;AAAA,MACT,gBAAgB;AAAA,MAChB,sBAAsB;AAAA;AAAA,MAEtB,WAAW;AAAA,MACX,gBAAgB;AAAA;AAAA,MAEhB,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,sBAAsB;AAAA;AAAA,MAEtB,eAAe,KAAK;AAAA;AAAA,IACtB;AA2BO,IAAM,kBAAN,MAA8C;AAAA,MAC3C;AAAA,MAQA;AAAA,MACA,YAAY;AAAA,MACZ,cAA6B;AAAA,MAC7B,kBAAkB;AAAA,MAClB,mBAAmB;AAAA,MACnB,iBAAuD;AAAA,MACvD,kBAA0C;AAAA;AAAA,MAG1C,eAAiF;AAAA,MACjF,eAAwE;AAAA,MACxE,mBAAoF;AAAA,MACpF,eAAoC;AAAA;AAAA,MAGpC,sBAAsB,oBAAI,IAI/B;AAAA;AAAA,MAGK,uBAAuB,oBAAI,IAGhC;AAAA,MACK,yBAAyB,oBAAI,IAGlC;AAAA;AAAA;AAAA,MAKc,UAAU,IAAI,YAAY;AAAA;AAAA,MAGnC;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAA6B,CAAC;AAAA,MAC9B,aAAmD;AAAA;AAAA,MAGnD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,MAChB,kBAA4B,CAAC;AAAA,MAC7B,iBAAwD;AAAA;AAAA,MAGxD;AAAA,MACA,oBAAoB;AAAA;AAAA,MAGpB;AAAA;AAAA,MAGA,UAAU;AAAA,QAChB,gBAAgB;AAAA,QAChB,eAAe;AAAA,QACf,gBAAgB;AAAA,QAChB,eAAe;AAAA,QACf,eAAe;AAAA,MACjB;AAAA,MAEA,YAAY,QAAgE;AAC1E,cAAM,kBAAkB;AACxB,aAAK,SAAS;AAAA,UACZ,KAAK,OAAO;AAAA,UACZ,SAAS,OAAO,WAAWA,UAAS;AAAA,QACtC;AACA,YAAI,OAAO,WAAW,QAAW;AAC/B,eAAK,OAAO,SAAS,OAAO;AAAA,QAC9B;AACA,YAAI,OAAO,eAAe,QAAW;AACnC,eAAK,OAAO,aAAa,OAAO;AAAA,QAClC;AACA,YAAI,OAAO,UAAU,QAAW;AAC9B,eAAK,OAAO,QAAQ,OAAO;AAAA,QAC7B;AACA,YAAI,OAAO,YAAY,QAAW;AAChC,eAAK,OAAO,UAAU,OAAO;AAAA,QAC/B;AACA,aAAK,YAAY,OAAO,SAAS,WAAW;AAC5C,aAAK,cAAc,OAAO,cAAc;AAGxC,aAAK,iBAAiB,gBAAgB,kBAAkB;AACxD,aAAK,YAAY,gBAAgB,aAAaA,UAAS;AACvD,aAAK,iBAAiB,gBAAgB,kBAAkBA,UAAS;AACjE,aAAK,oBAAoB,gBAAgB,qBAAqB;AAC9D,aAAK,oBAAoB,gBAAgB,qBAAqB;AAC9D,aAAK,iBAAiB,gBAAgB,kBAAkBA,UAAS;AACjE,aAAK,iBAAiB,gBAAgB,kBAAkBA,UAAS;AACjE,aAAK,qBAAqB,KAAK;AAC/B,aAAK,gBAAgB,gBAAgB,iBAAiBA,UAAS;AAAA,MACjE;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,UAAyB;AAC7B,YAAI,KAAK,WAAW;AAClB;AAAA,QACF;AAEA,aAAK,kBAAkB;AACvB,aAAK,kBAAkB,IAAI,gBAAgB;AAE3C,cAAM,KAAK,SAAS;AAAA,MACtB;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,WAA0B;AACtC,cAAM,UAAkC;AAAA,UACtC,QAAQ;AAAA,UACR,iBAAiB;AAAA;AAAA,UAEjB,YAAY;AAAA,UACZ,GAAG,KAAK,OAAO;AAAA,QACjB;AAGA,YAAI,KAAK,mBAAmB;AAC1B,kBAAQ,iBAAiB,IAAI;AAAA,QAC/B;AAEA,YAAI,KAAK,OAAO,QAAQ;AACtB,kBAAQ,eAAe,IAAI,UAAU,KAAK,OAAO,MAAM;AAAA,QACzD;AAEA,YAAI,KAAK,aAAa;AACpB,kBAAQ,eAAe,IAAI,KAAK;AAAA,QAClC;AAGA,cAAM,MAAM,KAAK,qBAAqB;AAEtC,YAAI;AACF,gBAAM,cAA2B;AAAA,YAC/B,QAAQ;AAAA,YACR;AAAA,YACA,WAAW;AAAA,UACb;AACA,cAAI,KAAK,iBAAiB,QAAQ;AAChC,wBAAY,SAAS,KAAK,gBAAgB;AAAA,UAC5C;AACA,gBAAM,WAAW,MAAM,KAAK,UAAU,KAAK,WAAW;AAEtD,cAAI,CAAC,SAAS,IAAI;AAChB,kBAAM,YAAY,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,EAAE;AACtD,kBAAM,IAAI,gBAAgB,0BAA0B,SAAS,MAAM,IAAI,SAAS,UAAU,GAAG,YAAY,MAAM,SAAS,KAAK,EAAE,EAAE;AAAA,UACnI;AAEA,gBAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;AACvD,cAAI,CAAC,eAAe,CAAC,YAAY,SAAS,mBAAmB,GAAG;AAC9D,kBAAM,IAAI,gBAAgB,yDAAyD,WAAW,EAAE;AAAA,UAClG;AAEA,eAAK,YAAY;AACjB,eAAK,mBAAmB;AAGxB,qBAAW,CAAC,gBAAgB,EAAE,SAAAC,UAAQ,CAAC,KAAK,KAAK,sBAAsB;AACrE,YAAAA,UAAQ;AACR,iBAAK,qBAAqB,OAAO,cAAc;AAAA,UACjD;AAGA,gBAAM,KAAK,cAAc,QAAQ;AAAA,QACnC,SAAS,OAAO;AACd,cAAI,iBAAiB,SAAS,MAAM,SAAS,cAAc;AAEzD;AAAA,UACF;AAGA,qBAAW,CAAC,gBAAgB,EAAE,OAAO,CAAC,KAAK,KAAK,sBAAsB;AACpE,mBAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAChE,iBAAK,qBAAqB,OAAO,cAAc;AAAA,UACjD;AAEA,gBAAM;AAAA,QACR;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,uBAA+B;AACrC,cAAM,MAAM,IAAI,IAAI,KAAK,OAAO,GAAG;AAGnC,cAAM,SAAS,MAAM,KAAK,KAAK,oBAAoB,OAAO,CAAC,EAAE,IAAI,OAAK,EAAE,KAAK;AAC7E,YAAI,OAAO,SAAS,GAAG;AACrB,cAAI,aAAa,IAAI,UAAU,OAAO,KAAK,GAAG,CAAC;AAAA,QACjD;AAGA,cAAM,UAAU,IAAI,IAAI,MAAM,KAAK,KAAK,oBAAoB,OAAO,CAAC,EAAE,IAAI,OAAK,EAAE,MAAM,CAAC;AACxF,YAAI,QAAQ,OAAO,GAAG;AACpB,cAAI,aAAa,IAAI,WAAW,MAAM,KAAK,OAAO,EAAE,KAAK,GAAG,CAAC;AAAA,QAC/D;AAGA,cAAM,kBAAkB,MAAM,KAAK,KAAK,oBAAoB,KAAK,CAAC;AAClE,YAAI,gBAAgB,SAAS,GAAG;AAC9B,cAAI,aAAa,IAAI,mBAAmB,gBAAgB,KAAK,GAAG,CAAC;AAAA,QACnE;AAGA,cAAM,WAAW,MAAM,KAAK,KAAK,oBAAoB,OAAO,CAAC,EAAE,CAAC;AAChE,YAAI,UAAU;AACZ,cAAI,SAAS,QAAQ,QAAQ;AAC3B,gBAAI,aAAa,IAAI,UAAU,SAAS,QAAQ,OAAO,KAAK,GAAG,CAAC;AAAA,UAClE;AACA,cAAI,SAAS,QAAQ,QAAQ;AAC3B,gBAAI,aAAa,IAAI,UAAU,SAAS,QAAQ,MAAM;AAAA,UACxD;AACA,cAAI,SAAS,QAAQ,eAAe;AAClC,gBAAI,aAAa,IAAI,iBAAiB,MAAM;AAAA,UAC9C;AACA,cAAI,SAAS,QAAQ,qBAAqB;AACxC,gBAAI,aAAa,IAAI,uBAAuB,MAAM;AAAA,UACpD;AACA,cAAI,SAAS,QAAQ,WAAW;AAC9B,gBAAI,aAAa,IAAI,aAAa,OAAO,SAAS,QAAQ,SAAS,CAAC;AAAA,UACtE;AAAA,QACF;AAEA,eAAO,IAAI,SAAS;AAAA,MACtB;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,cAAc,UAAmC;AAC7D,YAAI,CAAC,SAAS,MAAM;AAClB,gBAAM,IAAI,gBAAgB,uBAAuB;AAAA,QACnD;AAEA,cAAM,SAAS,SAAS,KAAK,UAAU;AACvC,YAAI,SAAS;AAGb,YAAI,KAAK,mBAAmB;AAC1B,eAAK,sBAAsB;AAAA,QAC7B;AAEA,YAAI;AACF,iBAAO,MAAM;AACX,kBAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAE1C,gBAAI,MAAM;AAER,mBAAK,gBAAgB;AACrB,mBAAK,qBAAqB;AAG1B,mBAAK,YAAY;AACjB,kBAAI,KAAK,iBAAiB;AACxB,qBAAK,kBAAkB;AAAA,cACzB;AACA;AAAA,YACF;AAGA,gBAAI,OAAO;AACT,mBAAK,QAAQ,iBAAiB,MAAM;AACpC,mBAAK,qBAAqB,MAAM;AAAA,YAClC;AAGA,sBAAU,KAAK,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAGrD,gBAAI,KAAK,oBAAoB,KAAK,eAAe;AAE/C,oBAAM,KAAK,8BAA8B,MAAM;AAC/C,uBAAS;AACT,mBAAK,oBAAoB;AACzB;AAAA,YACF;AAGA,kBAAM,SAAS,OAAO,MAAM,MAAM;AAClC,qBAAS,OAAO,IAAI,KAAK;AAGzB,iBAAK,oBAAoB,OAAO;AAEhC,uBAAW,aAAa,QAAQ;AAC9B,kBAAI,UAAU,KAAK,GAAG;AACpB,qBAAK,oBAAoB,SAAS;AAAA,cACpC;AAAA,YACF;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AACd,eAAK,YAAY;AACjB,eAAK,gBAAgB;AACrB,eAAK,qBAAqB;AAE1B,cAAI,iBAAiB,SAAS,MAAM,SAAS,cAAc;AAEzD;AAAA,UACF;AAGA,qBAAW,kBAAkB,KAAK,oBAAoB,KAAK,GAAG;AAC5D,iBAAK,eAAe,gBAAgB,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,UAC/F;AAEA,cAAI,KAAK,iBAAiB;AACxB,iBAAK,kBAAkB;AAAA,UACzB;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,8BAA8B,QAA+B;AACzE,cAAM,SAAS,OAAO,MAAM,MAAM;AAElC,iBAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,gBAAM,YAAY,OAAO,CAAC;AAC1B,cAAI,aAAa,UAAU,KAAK,GAAG;AACjC,iBAAK,oBAAoB,SAAS;AAAA,UACpC;AAGA,cAAI,IAAI,KAAK,IAAI,OAAO,GAAG;AACzB,kBAAM,IAAI,QAAQ,CAAAA,cAAW,WAAWA,WAAS,CAAC,CAAC;AAAA,UACrD;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,oBAAoB,WAAyB;AACnD,YAAI;AACJ,YAAI;AACJ,YAAI;AAEJ,cAAM,QAAQ,UAAU,MAAM,IAAI;AAClC,mBAAW,QAAQ,OAAO;AACxB,cAAI,KAAK,WAAW,GAAG,GAAG;AAExB;AAAA,UACF;AAEA,gBAAM,aAAa,KAAK,QAAQ,GAAG;AACnC,cAAI,eAAe,IAAI;AACrB;AAAA,UACF;AAEA,gBAAM,QAAQ,KAAK,UAAU,GAAG,UAAU;AAE1C,gBAAM,QAAQ,KAAK,UAAU,aAAa,CAAC,EAAE,UAAU;AAEvD,kBAAQ,OAAO;AAAA,YACb,KAAK;AACH,mBAAK;AACL;AAAA,YACF,KAAK;AACH,0BAAY;AACZ;AAAA,YACF,KAAK;AACH,qBAAO,OAAO,OAAO,OAAO,QAAQ;AACpC;AAAA,YACF,KAAK,SAAS;AACZ,oBAAM,UAAU,SAAS,OAAO,EAAE;AAClC,kBAAI,CAAC,MAAM,OAAO,GAAG;AACnB,qBAAK,OAAO,UAAU;AAAA,cACxB;AACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAGA,YAAI,IAAI;AACN,eAAK,cAAc;AAAA,QACrB;AAEA,YAAI,CAAC,MAAM;AACT;AAAA,QACF;AAGA,YAAI;AACJ,YAAI;AACF,sBAAY,KAAK,MAAM,IAAI;AAAA,QAC7B,SAAS,OAAO;AAEd,qBAAW,kBAAkB,KAAK,oBAAoB,KAAK,GAAG;AAC5D,iBAAK,eAAe,gBAAgB,IAAI,MAAM,mCAAmC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE,CAAC;AAAA,UAC5I;AACA;AAAA,QACF;AAGA,aAAK,kBAAkB,IAAI,aAAa,UAAU,MAAM,SAAS;AAAA,MACnE;AAAA;AAAA;AAAA;AAAA,MAKQ,kBAAkB,IAAwB,WAAmB,WAA+B;AAClG,cAAM,iBAAiB,UAAU,kBAAkB,MAAM,KAAK,KAAK,oBAAoB,KAAK,CAAC,EAAE,CAAC;AAGhG,aAAK,gBAAgB,KAAK,IAAI;AAC9B,aAAK,QAAQ;AAEb,gBAAQ,WAAW;AAAA,UACjB,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK,YAAY;AACf,gBAAI,CAAC,eAAgB;AAErB,kBAAM,cAA8B;AAAA,cAClC,IAAI,MAAM,GAAG,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC;AAAA,cACxC,KAAK,MAAM;AAAA,cACX,WAAW,UAAU,YAAY;AAAA,cACjC,OAAO,UAAU,SAAS;AAAA,cAC1B,QAAQ,UAAU,UAAU;AAAA,cAC5B,WAAW,oBAAI,KAAK;AAAA,cACpB,KAAK,UAAU,OAAO;AAAA,cACtB,qBAAqB,UAAU,uBAAuB;AAAA,YACxD;AAEA,gBAAI,cAAc,YAAY,UAAU,MAAM;AAC5C,oBAAM,aAAa,UAAU;AAC7B,0BAAY,SAAS,WAAW,OAAO,UAAU;AACjD,0BAAY,SAAS,WAAW,OAAO,UAAU;AAAA,YACnD,WAAW,cAAc,UAAU;AACjC,0BAAY,SAAS,UAAU;AAAA,YACjC,WAAW,cAAc,UAAU;AACjC,0BAAY,SAAS,UAAU;AAAA,YACjC;AAEA,gBAAI,UAAU,gBAAgB;AAC5B,0BAAY,iBAAiB,UAAU;AAAA,YACzC;AAGA,gBAAI,KAAK,gBAAgB;AACvB,mBAAK,WAAW,gBAAgB,WAAW;AAAA,YAC7C,OAAO;AACL,mBAAK,eAAe,gBAAgB,WAAW;AAAA,YACjD;AACA;AAAA,UACF;AAAA,UAEA,KAAK;AAEH,iBAAK,0BAA0B;AAC/B;AAAA,UAEF,KAAK;AAAA,UACL,KAAK;AAEH,gBAAI,cAAc,YAAY,KAAK,gBAAgB;AACjD,mBAAK,gBAAgB;AAAA,YACvB;AACA;AAAA,UAEF,KAAK;AACH,gBAAI,gBAAgB;AAClB,mBAAK,eAAe,gBAAgB,IAAI,MAAM,UAAU,WAAW,UAAU,SAAS,eAAe,CAAC;AAAA,YACxG;AACA;AAAA,UAEF,KAAK;AACH,gBAAI,UAAU,gBAAgB;AAC5B,oBAAM,UAAU,KAAK,qBAAqB,IAAI,UAAU,cAAc;AACtE,kBAAI,SAAS;AACX,oBAAI,UAAU,SAAS;AACrB,0BAAQ,QAAQ;AAAA,gBAClB,OAAO;AACL,0BAAQ,OAAO,IAAI,MAAM,UAAU,SAAS,qBAAqB,CAAC;AAAA,gBACpE;AACA,qBAAK,qBAAqB,OAAO,UAAU,cAAc;AAAA,cAC3D;AAAA,YACF;AACA;AAAA,UAEF,KAAK;AACH,gBAAI,UAAU,gBAAgB;AAC5B,oBAAM,UAAU,KAAK,uBAAuB,IAAI,UAAU,cAAc;AACxE,kBAAI,SAAS;AACX,wBAAQ,QAAQ;AAChB,qBAAK,uBAAuB,OAAO,UAAU,cAAc;AAAA,cAC7D;AAAA,YACF;AACA;AAAA,QACJ;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAOQ,WAAW,gBAAwB,OAA6B;AACtE,aAAK,WAAW,KAAK;AAAA,UACnB;AAAA,UACA;AAAA,UACA,WAAW,KAAK,IAAI;AAAA,QACtB,CAAC;AACD,aAAK,QAAQ;AAGb,YAAI,KAAK,WAAW,UAAU,KAAK,WAAW;AAC5C,eAAK,gBAAgB;AACrB;AAAA,QACF;AAGA,YAAI,CAAC,KAAK,YAAY;AACpB,eAAK,aAAa,WAAW,MAAM;AACjC,iBAAK,gBAAgB;AAAA,UACvB,GAAG,KAAK,cAAc;AAAA,QACxB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,kBAAwB;AAC9B,YAAI,KAAK,YAAY;AACnB,uBAAa,KAAK,UAAU;AAC5B,eAAK,aAAa;AAAA,QACpB;AAEA,YAAI,KAAK,WAAW,WAAW,GAAG;AAChC;AAAA,QACF;AAGA,cAAM,uBAAuB,oBAAI,IAA8B;AAE/D,mBAAW,EAAE,gBAAgB,MAAM,KAAK,KAAK,YAAY;AACvD,gBAAM,SAAS,qBAAqB,IAAI,cAAc,KAAK,CAAC;AAC5D,iBAAO,KAAK,KAAK;AACjB,+BAAqB,IAAI,gBAAgB,MAAM;AAAA,QACjD;AAGA,mBAAW,CAAC,gBAAgB,MAAM,KAAK,sBAAsB;AAC3D,qBAAW,SAAS,QAAQ;AAC1B,iBAAK,eAAe,gBAAgB,KAAK;AAAA,UAC3C;AAAA,QACF;AAEA,aAAK,QAAQ;AACb,aAAK,aAAa,CAAC;AAAA,MACrB;AAAA;AAAA;AAAA;AAAA;AAAA,MAOQ,wBAA8B;AACpC,YAAI,CAAC,KAAK,kBAAmB;AAE7B,aAAK,qBAAqB;AAC1B,aAAK,gBAAgB,KAAK,IAAI;AAC9B,aAAK,kBAAkB,CAAC;AAExB,aAAK,iBAAiB,YAAY,MAAM;AACtC,eAAK,sBAAsB;AAAA,QAC7B,GAAG,KAAK,kBAAkB;AAAA,MAC5B;AAAA;AAAA;AAAA;AAAA,MAKQ,uBAA6B;AACnC,YAAI,KAAK,gBAAgB;AACvB,wBAAc,KAAK,cAAc;AACjC,eAAK,iBAAiB;AAAA,QACxB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,wBAA8B;AACpC,cAAM,MAAM,KAAK,IAAI;AACrB,cAAM,qBAAqB,MAAM,KAAK;AAGtC,YAAI,qBAAqB,KAAK,qBAAqB,GAAG;AAEpD,qBAAW,kBAAkB,KAAK,oBAAoB,KAAK,GAAG;AAC5D,iBAAK,eAAe,gBAAgB,IAAI,MAAM,+CAA+C,CAAC;AAAA,UAChG;AAAA,QACF;AAGA,aAAK,uBAAuB;AAAA,MAC9B;AAAA;AAAA;AAAA;AAAA,MAKQ,yBAA+B;AAErC,aAAK,gBAAgB,KAAK,KAAK,QAAQ,cAAc;AACrD,YAAI,KAAK,gBAAgB,SAAS,IAAI;AACpC,eAAK,gBAAgB,MAAM;AAAA,QAC7B;AAGA,cAAM,eAAe,KAAK,gBAAgB,SAAS,IAC/C,KAAK,gBAAgB,KAAK,gBAAgB,SAAS,CAAC,IAAK,KAAK,gBAAgB,CAAC,IAC/E;AACJ,cAAM,kBAAkB,gBAAgB,KAAK,gBAAgB,UAAU,KAAK,qBAAqB;AAIjG,YAAI;AAEJ,YAAI,kBAAkB,KAAK;AAEzB,wBAAc,KAAK;AAAA,QACrB,WAAW,kBAAkB,GAAG;AAE9B,wBAAc,KAAK;AAAA,YACjB,KAAK,qBAAqBD,UAAS;AAAA,YACnC,KAAK;AAAA,UACP;AAAA,QACF,OAAO;AAEL,wBAAc,KAAK;AAAA,YACjB,KAAK,qBAAqBA,UAAS;AAAA,YACnC,KAAK;AAAA,UACP;AAAA,QACF;AAGA,YAAI,KAAK,IAAI,cAAc,KAAK,kBAAkB,IAAI,KAAK,qBAAqB,KAAK;AACnF,eAAK,qBAAqB,KAAK,MAAM,WAAW;AAChD,eAAK,qBAAqB;AAC1B,eAAK,sBAAsB;AAAA,QAC7B;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,4BAAkC;AACxC,aAAK,gBAAgB,KAAK,IAAI;AAAA,MAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUQ,oBAA0B;AAChC,YAAI,CAAC,KAAK,iBAAiB;AACzB;AAAA,QACF;AAEA,aAAK;AACL,aAAK,QAAQ;AAEb,YAAI,KAAK,mBAAmBA,UAAS,sBAAsB;AACzD,gBAAM,QAAQ,IAAI,gBAAgB,oCAAoC;AACtE,qBAAW,kBAAkB,KAAK,oBAAoB,KAAK,GAAG;AAC5D,iBAAK,eAAe,gBAAgB,KAAK;AAAA,UAC3C;AACA,eAAK,eAAe;AACpB;AAAA,QACF;AAGA,cAAM,YAAY,KAAK,OAAO,UAAU,KAAK,IAAI,KAAK,KAAK,mBAAmB,CAAC;AAI/E,cAAM,SAAS,KAAK,OAAO,IAAI,YAAY;AAG3C,cAAM,WAAW;AACjB,cAAM,QAAQ,KAAK,IAAI,YAAY,QAAQ,QAAQ;AAEnD,aAAK,iBAAiB,WAAW,YAAY;AAC3C,eAAK,mBAAmB,KAAK,kBAAkB,KAAK,eAAe,MAAS;AAE5E,cAAI;AACF,iBAAK,kBAAkB,IAAI,gBAAgB;AAC3C,kBAAM,KAAK,SAAS;AAAA,UACtB,SAAS,OAAO;AAEd,gBAAI,KAAK,iBAAiB;AACxB,mBAAK,kBAAkB;AAAA,YACzB;AAAA,UACF;AAAA,QACF,GAAG,KAAK;AAAA,MACV;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,aAA4B;AAChC,aAAK,kBAAkB;AAGvB,YAAI,KAAK,gBAAgB;AACvB,uBAAa,KAAK,cAAc;AAChC,eAAK,iBAAiB;AAAA,QACxB;AAEA,YAAI,KAAK,YAAY;AACnB,uBAAa,KAAK,UAAU;AAC5B,eAAK,aAAa;AAAA,QACpB;AAEA,aAAK,qBAAqB;AAG1B,aAAK,gBAAgB;AAErB,YAAI,KAAK,iBAAiB;AACxB,eAAK,gBAAgB,MAAM;AAC3B,eAAK,kBAAkB;AAAA,QACzB;AAEA,aAAK,YAAY;AACjB,aAAK,oBAAoB,MAAM;AAG/B,aAAK,oBAAoB;AAGzB,mBAAW,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,KAAK,sBAAsB;AACtD,iBAAO,IAAI,gBAAgB,mBAAmB,CAAC;AAAA,QACjD;AACA,aAAK,qBAAqB,MAAM;AAEhC,mBAAW,CAAC,EAAE,EAAE,SAAAC,UAAQ,CAAC,KAAK,KAAK,wBAAwB;AACzD,UAAAA,UAAQ;AAAA,QACV;AACA,aAAK,uBAAuB,MAAM;AAElC,aAAK,eAAe;AAAA,MACtB;AAAA;AAAA;AAAA;AAAA,MAKA,aAA4C;AAC1C,eAAO,EAAE,GAAG,KAAK,QAAQ;AAAA,MAC3B;AAAA;AAAA;AAAA;AAAA,MAKA,eAAqB;AACnB,aAAK,UAAU;AAAA,UACb,gBAAgB;AAAA,UAChB,eAAe;AAAA,UACf,gBAAgB;AAAA,UAChB,eAAe;AAAA,UACf,eAAe;AAAA,QACjB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,wBAAgC;AAC9B,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKA,cAAuB;AACrB,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKA,iBAAgC;AAC9B,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,MAAM,UACJ,gBACA,OACA,QACA,SACe;AAEf,aAAK,oBAAoB,IAAI,gBAAgB,EAAE,OAAO,QAAQ,QAAQ,CAAC;AAGvE,YAAI,KAAK,WAAW;AAElB,gBAAM,UAAU,IAAI,QAAc,CAACA,WAAS,WAAW;AACrD,iBAAK,qBAAqB,IAAI,gBAAgB,EAAE,SAAAA,WAAS,OAAO,CAAC;AAAA,UACnE,CAAC;AAGD,cAAI,KAAK,iBAAiB;AACxB,iBAAK,gBAAgB,MAAM;AAAA,UAC7B;AACA,eAAK,kBAAkB,IAAI,gBAAgB;AAC3C,eAAK,SAAS,EAAE,MAAM,MAAM;AAAA,UAE5B,CAAC;AAED,iBAAO;AAAA,QACT,OAAO;AAEL,iBAAO,IAAI,QAAc,CAACA,WAAS,WAAW;AAC5C,iBAAK,qBAAqB,IAAI,gBAAgB,EAAE,SAAAA,WAAS,OAAO,CAAC;AACjE,YAAAA,UAAQ;AAAA,UACV,CAAC;AAAA,QACH;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,MAAM,YAAY,gBAAuC;AACvD,aAAK,oBAAoB,OAAO,cAAc;AAG9C,YAAI,KAAK,oBAAoB,SAAS,GAAG;AACvC,gBAAM,KAAK,WAAW;AACtB;AAAA,QACF;AAGA,YAAI,KAAK,WAAW;AAClB,iBAAO,IAAI,QAAc,CAACA,WAAS,WAAW;AAC5C,iBAAK,uBAAuB,IAAI,gBAAgB,EAAE,SAAAA,WAAS,OAAO,CAAC;AAGnE,gBAAI,KAAK,iBAAiB;AACxB,mBAAK,gBAAgB,MAAM;AAAA,YAC7B;AACA,iBAAK,kBAAkB,IAAI,gBAAgB;AAC3C,iBAAK,SAAS,EAAE,MAAM,MAAM;AAAA,YAE5B,CAAC;AAGD,uBAAW,MAAM;AACf,oBAAM,UAAU,KAAK,uBAAuB,IAAI,cAAc;AAC9D,kBAAI,SAAS;AACX,wBAAQ,QAAQ;AAChB,qBAAK,uBAAuB,OAAO,cAAc;AAAA,cACnD;AAAA,YACF,GAAG,GAAG;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,QAAQ,SAAwE;AAC9E,aAAK,eAAe;AAAA,MACtB;AAAA;AAAA;AAAA;AAAA,MAKA,QAAQ,SAA+D;AACrE,aAAK,eAAe;AAAA,MACtB;AAAA;AAAA;AAAA;AAAA,MAKA,YAAY,SAAuE;AACjF,aAAK,mBAAmB;AAAA,MAC1B;AAAA;AAAA;AAAA;AAAA,MAKA,QAAQ,SAA2B;AACjC,aAAK,eAAe;AAAA,MACtB;AAAA,IACF;AAAA;AAAA;;;AC7wBO,SAAS,kBAA0B;AACxC,QAAM,YAAY,KAAK,IAAI,EAAE,SAAS,EAAE;AACxC,QAAM,SAAS,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,6BAA6B,6BAA6B;AAC1G,SAAO,KAAK,SAAS,IAAI,MAAM;AACjC;AA4BA,eAAsB,sBACpB,aACA,SACA,UAC2B;AAC3B,QAAM,YAAY,KAAK,IAAI;AAI3B,QAAM,QAAQ,YAAY;AAAA,IACxB,CAAC,MAAM,eAAe;AACpB,aAAO,MAAM,WAAW,SAAS,IAAI;AAAA,IACvC;AAAA;AAAA,IAEA,YAAuC;AACrC,UAAI;AACF,cAAM,SAAS,MAAM,SAAS;AAC9B,eAAO;AAAA,UACL;AAAA,UACA,YAAY,KAAK,IAAI,IAAI;AAAA,UACzB,SAAS;AAAA,QACX;AAAA,MACF,SAAS,OAAO;AACd,eAAO;AAAA,UACL,QAAQ;AAAA,YACN,MAAM,CAAC;AAAA,YACP,UAAU;AAAA,YACV,QAAQ,CAAC;AAAA,YACT,SAAS;AAAA,UACX;AAAA,UACA,YAAY,KAAK,IAAI,IAAI;AAAA,UACzB,SAAS;AAAA,UACT,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,QACjE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO,MAAM;AACf;AAwDO,SAAS,kBAAkB,UAAoC,CAAC,GAAoB;AACzF,QAAM;AAAA,IACJ,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,YAAY;AAAA,IACZ;AAAA,IACA,SAAS;AAAA,EACX,IAAI;AAEJ,SAAO,OAAO,SAAS,SAAS;AAC9B,UAAM,WAAW,MAAM,KAAK;AAG5B,QAAI,uBAAuB,UAAa,SAAS,aAAa,oBAAoB;AAChF,aAAO;AAAA,IACT;AAEA,UAAM,UAAmC;AAAA,MACvC,SAAS,QAAQ;AAAA,MACjB,KAAK,QAAQ;AAAA,MACb,YAAY,SAAS;AAAA,MACrB,SAAS,SAAS;AAAA,MAClB,UAAU,SAAS,OAAO;AAAA,IAC5B;AAEA,QAAI,WAAW;AACb,cAAQ,SAAS,QAAQ;AAAA,IAC3B;AAEA,QAAI,CAAC,SAAS,WAAW,SAAS,OAAO;AACvC,cAAQ,QAAQ,SAAS,MAAM;AAAA,IACjC;AAEA,UAAM,UAAU,SAAS,UACrB,GAAG,MAAM,uBAAuB,SAAS,UAAU,OACnD,GAAG,MAAM,uBAAuB,SAAS,UAAU,OAAO,SAAS,OAAO,OAAO;AAErF,WAAO,SAAS,UAAU,QAAQ,SAAS,SAAS,OAAO;AAE3D,WAAO;AAAA,EACT;AACF;AAQA,SAAS,cAAc,OAAe,SAAiB,MAAsC;AAC3F,QAAM,QACJ,UAAU,UACN,QAAQ,QACR,UAAU,SACR,QAAQ,OACR,UAAU,UACR,QAAQ,QACR,QAAQ;AAElB,MAAI,MAAM;AACR,UAAM,SAAS,IAAI;AAAA,EACrB,OAAO;AACL,UAAM,OAAO;AAAA,EACf;AACF;AA2EO,SAAS,kBAAkB,SAAoD;AACpF,QAAM;AAAA,IACJ;AAAA,IACA,OAAO,CAAC;AAAA,IACR,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ,IAAI;AAEJ,SAAO,OAAO,SAAS,SAAS;AAC9B,UAAM,WAAW,MAAM,KAAK;AAE5B,UAAM,aAAa;AAAA,MACjB,SAAS,QAAQ;AAAA,MACjB,OAAO,QAAQ,IAAI,MAAM,GAAG,6BAA6B;AAAA,MACzD,SAAS,SAAS;AAAA,MAClB,SAAS,SAAS,OAAO;AAAA,MACzB,WAAW,KAAK,IAAI;AAAA,MACpB;AAAA,IACF;AAGA,UAAM,iBAA8B;AAAA,MAClC,GAAG;AAAA,MACH,MAAM;AAAA,MACN,OAAO,SAAS;AAAA,IAClB;AAEA,QAAI,WAAW;AACb,qBAAe,SAAS,WAAW,SAAS,YAAY,OAAO;AAAA,IACjE;AAEA,aAAS,cAAc;AAGvB,aAAS;AAAA,MACP,GAAG;AAAA,MACH,MAAM;AAAA,MACN,OAAO;AAAA,IACT,CAAC;AAGD,aAAS;AAAA,MACP,GAAG;AAAA,MACH,MAAM;AAAA,MACN,OAAO,SAAS,OAAO;AAAA,IACzB,CAAC;AAGD,QAAI,CAAC,SAAS,SAAS;AACrB,eAAS;AAAA,QACP,GAAG;AAAA,QACH,MAAM;AAAA,QACN,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AACF;AAUA,SAAS,WAAW,OAAe,SAA2B;AAC5D,aAAW,UAAU,SAAS;AAC5B,QAAI,SAAS,QAAQ;AACnB,aAAO,MAAM,MAAM;AAAA,IACrB;AAAA,EACF;AACA,SAAO;AACT;AA+CO,SAAS,oBAAoB,SAAsD;AACxF,QAAM,EAAE,YAAY,UAAU,QAAQ,MAAM,WAAW,cAAc,IAAI;AAEzE,QAAM,UAAU,oBAAI,IAAgD;AAEpE,SAAO,OAAO,SAAS,SAAS;AAC9B,UAAM,MAAM,MAAM,OAAO;AACzB,UAAM,MAAM,KAAK,IAAI;AAErB,QAAI,SAAS,QAAQ,IAAI,GAAG;AAC5B,QAAI,CAAC,UAAU,OAAO,OAAO,SAAS;AACpC,eAAS,EAAE,OAAO,GAAG,SAAS,MAAM,SAAS;AAC7C,cAAQ,IAAI,KAAK,MAAM;AAAA,IACzB;AAEA,WAAO;AAEP,QAAI,OAAO,QAAQ,YAAY;AAC7B,YAAM,mBAAmB,KAAK,MAAM,OAAO,UAAU,OAAO,aAAa;AACzE,sBAAgB,SAAS,gBAAgB;AAEzC,aAAO;AAAA,QACL,QAAQ;AAAA,UACN,MAAM,CAAC;AAAA,UACP,UAAU;AAAA,UACV,QAAQ,CAAC;AAAA,UACT,SAAS;AAAA,QACX;AAAA,QACA,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,OAAO,IAAI,MAAM,qCAAqC,gBAAgB,WAAW;AAAA,QACjF,UAAU,EAAE,aAAa,MAAM,YAAY,iBAAiB;AAAA,MAC9D;AAAA,IACF;AAEA,WAAO,KAAK;AAAA,EACd;AACF;AAyEO,SAAS,kBAAkB,UAAoC,CAAC,GAAoB;AACzF,QAAM;AAAA,IACJ,SAAS;AAAA,IACT,SAAS,MAAM,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,6BAA6B,cAAc;AAAA,IAC3F;AAAA,EACF,IAAI;AAEJ,SAAO,OAAO,SAAS,SAAS;AAC9B,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,gBAAgB,OAAO;AAE7B,UAAM,UACJ,OAAO,kBAAkB,aACrB,cAAc,OAAO,IACrB,iBAAkB,QAAQ,SAAS,WAAsB,gBAAgB;AAE/E,UAAM,WAAW,MAAM,KAAK;AAE5B,UAAM,QAAoB;AAAA,MACxB;AAAA,MACA,QAAQ;AAAA,MACR,cAAc,QAAQ,SAAS;AAAA,MAC/B,SAAS,QAAQ;AAAA,MACjB,KAAK,QAAQ;AAAA,MACb;AAAA,MACA,SAAS,KAAK,IAAI;AAAA,MAClB,YAAY,SAAS;AAAA,MACrB,SAAS,SAAS;AAAA,MAClB,OAAO,SAAS,OAAO;AAAA,IACzB;AAEA,cAAU,KAAK;AAGf,WAAO;AAAA,MACL,GAAG;AAAA,MACH,UAAU;AAAA,QACR,GAAG,SAAS;AAAA,QACZ;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;AA8CO,SAAS,oBAAoB,SAAsD;AACxF,QAAM,EAAE,gBAAgB,gBAAgB,IAAI;AAE5C,SAAO,OAAO,SAAS,SAAS;AAE9B,QAAI,gBAAgB;AAClB,YAAM,cAAc,eAAe,QAAQ,KAAK,QAAQ,MAAM;AAC9D,cAAQ,MAAM,YAAY;AAC1B,cAAQ,SAAS,YAAY;AAAA,IAC/B;AAEA,UAAM,WAAW,MAAM,KAAK;AAG5B,QAAI,mBAAmB,SAAS,SAAS;AACvC,aAAO;AAAA,QACL,GAAG;AAAA,QACH,QAAQ,gBAAgB,SAAS,MAAM;AAAA,MACzC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;AAuDO,SAAS,gBAAgB,UAAkC,CAAC,GAAoB;AACrF,QAAM;AAAA,IACJ,aAAa;AAAA,IACb,cAAc;AAAA,IACd,aAAa;AAAA,IACb,qBAAqB;AAAA,IACrB,cAAc,MAAM;AAAA,IACpB;AAAA,EACF,IAAI;AAEJ,SAAO,OAAO,SAAS,SAAS;AAC9B,QAAI;AACJ,QAAI,UAAU;AAEd,WAAO,WAAW,YAAY;AAC5B,qBAAe,MAAM,KAAK;AAE1B,UAAI,aAAa,SAAS;AACxB,eAAO;AAAA,MACT;AAEA,UAAI,CAAC,aAAa,SAAS,CAAC,YAAY,aAAa,KAAK,GAAG;AAC3D,eAAO;AAAA,MACT;AAEA,UAAI,UAAU,YAAY;AACxB,cAAM,QAAQ,qBACV,KAAK,IAAI,cAAc,KAAK,IAAI,GAAG,OAAO,GAAG,UAAU,IACvD;AAEJ,kBAAU,UAAU,GAAG,aAAa,OAAO,OAAO;AAElD,cAAM,IAAI,QAAQ,CAACC,cAAY,WAAWA,WAAS,KAAK,CAAC;AAAA,MAC3D;AAEA;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;AAyCO,SAAS,qBAAqB,aAAiD;AACpF,SAAO,OAAO,SAAS,SAAS;AAC9B,UAAM,QAAQ,YAAY;AAAA,MACxB,CAAC,QAAQ,eAAe,MAAM,WAAW,SAAS,MAAM;AAAA,MACxD;AAAA,IACF;AACA,WAAO,MAAM;AAAA,EACf;AACF;AA5+BA,IAiEM,+BAKA,eAKA,qBAKA,6BAMA,4BAMA,2BAKA,+BAKA,6BAKA;AA3GN;AAAA;AAAA;AAiEA,IAAM,gCAAgC;AAKtC,IAAM,gBAAgB;AAKtB,IAAM,sBAAsB;AAK5B,IAAM,8BAA8B;AAMpC,IAAM,6BAA6B;AAMnC,IAAM,4BAA4B,CAAC,GAAG,GAAG,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAM,MAAM,GAAI;AAKpF,IAAM,gCAAgC;AAKtC,IAAM,8BAA8B;AAKpC,IAAM,iBAAiB;AAAA;AAAA;;;ACZvB,SAAS,UACP,MACA,QACA,SACK;AACL,MAAI,CAAC,UAAU,OAAO,WAAW,KAAK,OAAO,KAAK,OAAO,EAAE,WAAW,GAAG;AACvE,WAAO;AAAA,EACT;AAGA,QAAM,gBAAgB,oBAAI,IAAwB;AAClD,aAAW,SAAS,QAAQ;AAC1B,UAAM,SAAS,QAAQ,MAAM,UAAU;AACvC,QAAI,QAAQ;AACV,oBAAc,IAAI,MAAM,MAAM,MAAM;AAAA,IACtC;AAAA,EACF;AAGA,MAAI,cAAc,SAAS,GAAG;AAC5B,WAAO;AAAA,EACT;AAGA,SAAO,KAAK,IAAI,CAAC,QAAQ;AACvB,UAAM,SAAkC,CAAC;AACzC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,YAAM,SAAS,cAAc,IAAI,GAAG;AACpC,UAAI,UAAU,OAAO,UAAU,UAAU;AACvC,YAAI;AACF,iBAAO,GAAG,IAAI,OAAO,KAAK;AAAA,QAC5B,QAAQ;AACN,iBAAO,GAAG,IAAI;AAAA,QAChB;AAAA,MACF,OAAO;AACL,eAAO,GAAG,IAAI;AAAA,MAChB;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC;AACH;AAKA,SAAS,UAAU,QAAwB;AAGzC,MAAI,OAAO,WAAW,eAAe,OAAO,iBAAiB;AAC3D,UAAM,QAAQ,IAAI,WAAW,KAAK,KAAK,SAAS,CAAC,CAAC;AAClD,WAAO,gBAAgB,KAAK;AAC5B,WAAO,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAC5D,KAAK,EAAE,EACP,MAAM,GAAG,MAAM;AAAA,EACpB;AAEA,MAAI,SAAS;AACb,QAAM,QAAQ;AACd,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,cAAU,MAAM,KAAK,MAAM,KAAK,OAAO,IAAI,MAAM,MAAM,CAAC;AAAA,EAC1D;AACA,SAAO;AACT;AA0DA,SAAS,qBAA6B;AAEpC,MAAI,qBAAqB,+BAA+B;AACtD,oBAAgB,KAAK,MAAM,KAAK,OAAO,IAAI,GAAO;AAClD,wBAAoB;AAAA,EACtB;AAEA,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,UAAU,EAAE;AAClB;AACA,QAAM,SAAS,UAAU,CAAC;AAG1B,SAAO,GAAG,kBAAkB,GAAG,SAAS,IAAI,OAAO,IAAI,MAAM;AAC/D;AA6DO,SAAS,mBAAmB,YAA0B;AAE3D,MAAI,CAAC,cAAc,WAAW,WAAW,GAAG;AAC1C,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAIA,MAAI,WAAW,SAAS,yCAAuB;AAC7C,UAAM,IAAI;AAAA,MACR,kDAAkD,uCAAqB;AAAA,MACvE;AAAA,IACF;AAAA,EACF;AAQA,MAAI,KAAC,qCAAkB,UAAU,GAAG;AAClC,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AASA,SAAS,uBAAuB,OAA+B;AAC7D,QAAM,aAAa,MAAM,YAAY;AACrC,MAAI,CAAC,uBAAuB,SAAS,UAAU,GAAG;AAChD,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAoIA,eAAsB,aACpB,WACA,KACA,QACA,SACA,UAAyB,CAAC,GACN;AAEpB,QAAM,aAAa,QAAQ,cAAc,mBAAmB;AAI5D,qBAAmB,UAAU;AAE7B,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,WAAW,QAAQ,YAAY;AAGrC,QAAM,UAAoB,CAAC,OAAO;AAClC,MAAI,QAAQ,gBAAgB;AAG1B,UAAM,aAAa,uBAAuB,QAAQ,cAAc;AAChE,YAAQ,KAAK,mBAAmB,WAAW,YAAY,CAAC,EAAE;AAAA,EAC5D;AACA,MAAI,UAAU;AACZ,YAAQ,KAAK,WAAW;AAAA,EAC1B;AAGA,QAAM,UAAU,MAAM,QAAQ,KAAK,GAAG,CAAC;AAEvC,MAAI;AAKF,UAAM,gBAAgB,MAAM,cAAiB,WAAW,YAAY,KAAK,MAAM;AAE/E,UAAM,SAAS,IAAI,WAAc,WAAW,YAAY,WAAW,OAAO;AAC1E,WAAO,WAAW,cAAc,MAAM;AACtC,WAAO,kBAAkB,IAAI;AAE7B,WAAO;AAAA,EACT,SAAS,OAAO;AAEd,QAAI;AACF,YAAM,UAAU,MAAM,UAAU;AAAA,IAClC,QAAQ;AAAA,IAER;AACA,UAAM;AAAA,EACR;AACF;AAKA,eAAe,cACb,WACA,YACA,KACA,QACyB;AAEzB,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO,UAAU,MAAS,YAAY,UAAU,gBAAgB,GAAG,EAAE;AAAA,EACvE;AASA,SAAO,UAAU;AAAA,IACf,YAAY,UAAU,gBAAgB,GAAG;AAAA,IACzC;AAAA,EACF;AACF;AAKO,SAAS,mBACd,WACA,KACA,QACA,SACA,UAAyB,CAAC,GACT;AACjB,QAAM,YAAY,QAAQ,aAAa;AAEvC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IAEA,QAAQ,OAAO,aAAa,IAA8B;AACxD,YAAM,SAAS,MAAM,aAAgB,WAAW,KAAK,QAAQ,SAAS;AAAA,QACpE,GAAG;AAAA,QACH;AAAA,MACF,CAAC;AAED,UAAI;AACF,yBAAiB,OAAO,QAAQ;AAC9B,gBAAM;AAAA,QACR;AAAA,MACF,UAAE;AACA,YAAI,OAAO,QAAQ;AACjB,gBAAM,OAAO,MAAM;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,MAAkC;AACtC,aAAO;AAAA,QACL,QAAQ,OAAO,aAAa,IAAgC;AAC1D,gBAAM,SAAS,MAAM,aAAgB,WAAW,KAAK,QAAQ,SAAS;AAAA,YACpE,GAAG;AAAA,YACH,WAAW;AAAA,UACb,CAAC;AAED,cAAI;AACF,mBAAO,OAAO,QAAQ;AACpB,oBAAM,EAAE,MAAM,QAAQ,IAAI,MAAM,OAAO,cAAc,IAAI;AAEzD,kBAAI,KAAK,SAAS,GAAG;AACnB,sBAAM;AAAA,cACR;AAEA,kBAAI,CAAC,SAAS;AACZ;AAAA,cACF;AAAA,YACF;AAAA,UACF,UAAE;AACA,gBAAI,OAAO,QAAQ;AACjB,oBAAM,OAAO,MAAM;AAAA,YACrB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,SAA6B;AACjC,aAAO,aAAgB,WAAW,KAAK,QAAQ,SAAS,OAAO;AAAA,IACjE;AAAA,EACF;AACF;AAKO,SAAS,sBACd,SACA,QACoC;AACpC,QAAM,QAAkB,CAAC;AACzB,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAM,KAAK,QAAQ,CAAC,CAAE;AACtB,QAAI,IAAI,OAAO,QAAQ;AACrB,YAAM,KAAK,IAAI,IAAI,CAAC,EAAE;AAAA,IACxB;AAAA,EACF;AACA,SAAO;AAAA,IACL,KAAK,MAAM,KAAK,EAAE;AAAA,IAClB,QAAQ;AAAA,EACV;AACF;AA9nBA,IAqEA,mBAMM,wBAeA,oBAqFF,eAKA,mBAME,+BAOA,oBAqDO,uBAiGP;AAvVN;AAAA;AAAA;AAqEA,wBAAyD;AAMzD,IAAM,yBAAyB,OAAO,OAAO;AAAA,MAC3C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAU;AAUV,IAAM,qBAAqB;AAqF3B,IAAI,gBAAgB;AAKpB,IAAI,oBAAoB;AAMxB,IAAM,gCAAgC;AAOtC,IAAM,qBAAqB;AAqDpB,IAAM,wBAAN,cAAoC,MAAM;AAAA;AAAA,MAEtC;AAAA,MAET,YAAY,SAAiB,OAAe,uBAAuB;AACjE,cAAM,OAAO;AACb,aAAK,OAAO;AACZ,aAAK,OAAO;AAAA,MACd;AAAA,IACF;AAwFA,IAAM,aAAN,MAA2D;AAAA,MACjD,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,UAAuB,CAAC;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACT,gBAAgB;AAAA,MAExB,YACE,WACA,YACA,WACA,SACA;AACA,aAAK,YAAY;AACjB,aAAK,aAAa;AAClB,aAAK,YAAY;AACjB,aAAK,UAAU;AAAA,MACjB;AAAA;AAAA;AAAA;AAAA,MAKA,WAAW,QAA2B;AACpC,aAAK,UAAU;AAAA,MACjB;AAAA,MAEA,kBAAkB,eAA8B;AAC9C,aAAK,gBAAgB;AAAA,MACvB;AAAA,MAEA,IAAI,SAAkB;AACpB,eAAO,KAAK;AAAA,MACd;AAAA,MAEA,IAAI,eAAuB;AACzB,eAAO,KAAK;AAAA,MACd;AAAA,MAEA,IAAI,SAAsB;AACxB,eAAO,KAAK;AAAA,MACd;AAAA,MAEA,MAAM,MAAM,OAA8B;AACxC,cAAM,SAAS,MAAM,KAAK,cAAc,KAAK;AAC7C,eAAO,OAAO;AAAA,MAChB;AAAA,MAEA,MAAM,cAAc,OAA+C;AACjE,YAAI,CAAC,KAAK,SAAS;AACjB,iBAAO,EAAE,MAAM,CAAC,GAAG,SAAS,OAAO,cAAc,KAAK,cAAc;AAAA,QACtE;AAEA,cAAM,aAAa,SAAS,KAAK;AACjC,cAAM,SAAS,MAAM,KAAK,UAAU;AAAA,UAClC,SAAS,UAAU,UAAU,KAAK,UAAU;AAAA,QAC9C;AAGA,YAAI,KAAK,QAAQ,WAAW,KAAK,OAAO,OAAO,SAAS,GAAG;AACzD,eAAK,UAAU,OAAO;AAAA,QACxB;AAEA,cAAM,aAAa,UAAU,OAAO,MAAM,KAAK,SAAS,KAAK,OAAO;AACpE,aAAK,iBAAiB,WAAW;AAEjC,cAAM,UAAU,WAAW,WAAW;AAEtC,eAAO;AAAA,UACL,MAAM;AAAA,UACN;AAAA,UACA,cAAc,KAAK;AAAA,QACrB;AAAA,MACF;AAAA,MAEA,MAAM,QAAuB;AAC3B,YAAI,CAAC,KAAK,SAAS;AACjB;AAAA,QACF;AAEA,aAAK,UAAU;AAEf,YAAI;AAEF,gBAAM,KAAK,UAAU,MAAM,UAAU,KAAK,UAAU,GAAG;AAGvD,cAAI,KAAK,eAAe;AACtB,kBAAM,KAAK,UAAU,MAAM,QAAQ;AAAA,UACrC;AAAA,QACF,SAAS,OAAO;AAEd,cAAI,KAAK,eAAe;AACtB,gBAAI;AACF,oBAAM,KAAK,UAAU,MAAM,UAAU;AAAA,YACvC,QAAQ;AAAA,YAER;AAAA,UACF;AACA,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,MAEA,QAAQ,OAAO,aAAa,IAA8B;AACxD,YAAI;AACF,iBAAO,KAAK,SAAS;AACnB,kBAAM,EAAE,MAAM,QAAQ,IAAI,MAAM,KAAK,cAAc;AAEnD,uBAAW,OAAO,MAAM;AACtB,oBAAM;AAAA,YACR;AAEA,gBAAI,CAAC,SAAS;AACZ;AAAA,YACF;AAAA,UACF;AAAA,QACF,UAAE;AACA,gBAAM,KAAK,MAAM;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AC1IO,SAAS,kBAAkB,MAAiD;AACjF,MAAI,CAAC,QAAQ,KAAK,KAAK,MAAM,IAAI;AAC/B,UAAM,IAAI,MAAM,4BAA4B;AAAA,EAC9C;AAGA,MAAI,KAAK,SAAS,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,IAAI,GAAG;AAC3F,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AAGA,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,MAAI,MAAM,SAAS,GAAG;AACpB,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACtD;AAEA,MAAI,SAAS;AACb,MAAI;AAEJ,MAAI,MAAM,WAAW,GAAG;AACtB,aAAS,MAAM,CAAC;AAChB,YAAQ,MAAM,CAAC;AAAA,EACjB,OAAO;AACL,YAAQ,MAAM,CAAC;AAAA,EACjB;AAGA,MAAI,CAAC,uBAAuB,KAAK,MAAM,GAAG;AACxC,UAAM,IAAI,MAAM,yBAAyB,MAAM,GAAG;AAAA,EACpD;AAGA,MAAI,CAAC,uBAAuB,KAAK,KAAK,GAAG;AACvC,UAAM,IAAI,MAAM,wBAAwB,KAAK,GAAG;AAAA,EAClD;AAEA,SAAO,EAAE,OAAO,OAAO;AACzB;AAKO,SAAS,yBAAiC;AAC/C,SAAO,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC;AACxE;AAnXA,IA2Ga,iBAuNP;AAlUN;AAAA;AAAA;AA2GO,IAAM,kBAAN,MAAsE;AAAA,MAClE;AAAA,MACA;AAAA,MACA;AAAA,MAED;AAAA,MACA;AAAA,MAER,YACE,IACA,OACA,QACA,WACA,qBACA,UAA4B,CAAC,GAC7B;AACA,aAAK,KAAK;AACV,aAAK,QAAQ;AACb,aAAK,SAAS;AACd,aAAK;AACL,aAAK,sBAAsB;AAE3B,aAAK,QAAQ;AAAA,UACX,QAAQ;AAAA,UACR,SAAS,QAAQ,cAAc;AAAA,UAC/B,gBAAgB,CAAC;AAAA,UACjB,gBAAgB,CAAC;AAAA,UACjB,gBAAgB,CAAC;AAAA,UACjB,gBAAgB,CAAC;AAAA,UACjB,cAAc,QAAQ,WAAW;AAAA,UACjC,YAAY,CAAC;AAAA,UACb,gBAAgB,CAAC;AAAA,UACjB,cAAc;AAAA,QAChB;AAGA,YAAI,QAAQ,UAAU;AACpB,eAAK,MAAM,eAAe,KAAK,QAAQ,QAAQ;AAAA,QACjD;AACA,YAAI,QAAQ,UAAU;AACpB,eAAK,MAAM,eAAe,KAAK,QAAQ,QAAQ;AAAA,QACjD;AACA,YAAI,QAAQ,UAAU;AACpB,eAAK,MAAM,eAAe,KAAK,QAAQ,QAAQ;AAAA,QACjD;AACA,YAAI,QAAQ,UAAU;AACpB,eAAK,MAAM,eAAe,KAAK,QAAQ,QAAQ;AAAA,QACjD;AAAA,MACF;AAAA,MAEA,IAAI,WAAoB;AACtB,eAAO,KAAK,MAAM;AAAA,MACpB;AAAA,MAEA,IAAI,UAAyB;AAC3B,eAAO,KAAK,MAAM;AAAA,MACpB;AAAA;AAAA;AAAA;AAAA,MAKA,YAAY,OAA6B;AACvC,YAAI,CAAC,KAAK,MAAM,OAAQ;AAGxB,aAAK,MAAM,UAAU,MAAM;AAG3B,mBAAW,WAAW,KAAK,MAAM,gBAAgB;AAC/C,cAAI;AACF,iBAAK,QAAQ,KAAK;AAAA,UACpB,SAAS,OAAO;AACd,iBAAK,YAAY,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,UAC5E;AAAA,QACF;AAGA,gBAAQ,MAAM,WAAW;AAAA,UACvB,KAAK;AACH,gBAAI,MAAM,QAAQ;AAChB,yBAAW,WAAW,KAAK,MAAM,gBAAgB;AAC/C,oBAAI;AACF,uBAAK,QAAQ,MAAM,MAAM;AAAA,gBAC3B,SAAS,OAAO;AACd,uBAAK,YAAY,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,gBAC5E;AAAA,cACF;AAAA,YACF;AACA;AAAA,UAEF,KAAK;AACH,gBAAI,MAAM,QAAQ;AAChB,yBAAW,WAAW,KAAK,MAAM,gBAAgB;AAC/C,oBAAI;AACF,uBAAK,QAAQ,MAAM,QAAQ,MAAM,MAAM;AAAA,gBACzC,SAAS,OAAO;AACd,uBAAK,YAAY,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,gBAC5E;AAAA,cACF;AAAA,YACF;AACA;AAAA,UAEF,KAAK;AACH,gBAAI,MAAM,QAAQ;AAChB,yBAAW,WAAW,KAAK,MAAM,gBAAgB;AAC/C,oBAAI;AACF,uBAAK,QAAQ,MAAM,MAAM;AAAA,gBAC3B,SAAS,OAAO;AACd,uBAAK,YAAY,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,gBAC5E;AAAA,cACF;AAAA,YACF;AACA;AAAA,QACJ;AAGA,YAAI,KAAK,MAAM,eAAe,SAAS,GAAG;AACxC,gBAAM,WAAW,KAAK,MAAM,eAAe,MAAM;AACjD,mBAAS,EAAE,OAAO,OAAO,MAAM,MAAM,CAAC;AAAA,QACxC,OAAO;AAEL,eAAK,MAAM,WAAW,KAAK,KAAK;AAAA,QAClC;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,YAAY,OAAoB;AAC9B,YAAI,KAAK,MAAM,cAAc;AAC3B,eAAK,MAAM,aAAa,KAAK;AAAA,QAC/B;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,cAAoB;AAClB,aAAK,MAAM,SAAS;AACpB,aAAK,MAAM,eAAe;AAG1B,eAAO,KAAK,MAAM,eAAe,SAAS,GAAG;AAC3C,gBAAM,WAAW,KAAK,MAAM,eAAe,MAAM;AACjD,mBAAS,EAAE,OAAO,QAAwC,MAAM,KAAK,CAAC;AAAA,QACxE;AAAA,MACF;AAAA,MAEA,MAAM,cAA6B;AACjC,YAAI,CAAC,KAAK,MAAM,OAAQ;AAExB,cAAM,KAAK,oBAAoB;AAC/B,aAAK,YAAY;AAAA,MACnB;AAAA,MAEA,SAAS,SAA6F;AACpG,aAAK,MAAM,eAAe,KAAK,OAA0D;AACzF,eAAO;AAAA,MACT;AAAA,MAEA,SAAS,SAAiD;AACxD,aAAK,MAAM,eAAe,KAAK,OAA6C;AAC5E,eAAO;AAAA,MACT;AAAA,MAEA,SAAS,SAAgE;AACvE,aAAK,MAAM,eAAe,KAAK,OAA8D;AAC7F,eAAO;AAAA,MACT;AAAA,MAEA,SAAS,SAAoD;AAC3D,aAAK,MAAM,eAAe,KAAK,OAAgD;AAC/E,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,CAAC,OAAO,aAAa,IAAgE;AACnF,eAAO;AAAA,UACL,MAAM,YAAkF;AAEtF,gBAAI,KAAK,MAAM,gBAAgB,KAAK,MAAM,WAAW,WAAW,GAAG;AACjE,qBAAO,EAAE,OAAO,QAAwC,MAAM,KAAK;AAAA,YACrE;AAGA,gBAAI,KAAK,MAAM,WAAW,SAAS,GAAG;AACpC,oBAAM,QAAQ,KAAK,MAAM,WAAW,MAAM;AAC1C,qBAAO,EAAE,OAAO,OAAsD,MAAM,MAAM;AAAA,YACpF;AAGA,mBAAO,IAAI,QAAQ,CAACC,cAAY;AAC9B,mBAAK,MAAM,eAAe,KAAKA,SAA2D;AAAA,YAC5F,CAAC;AAAA,UACH;AAAA,UAEA,QAAQ,YAAkF;AAGxF,mBAAO,EAAE,OAAO,QAAwC,MAAM,KAAK;AAAA,UACrE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAUA,IAAM,yBAAyB;AAAA;AAAA;;;AClQ/B,SAAS,mBAAmB,KAAsC;AAChE,MAAI;AACF,UAAM,SAAS,IAAI,IAAI,GAAG;AAC1B,UAAM,SAAkC,CAAC;AAGzC,QAAI,CAAC,OAAO,SAAS,WAAW,UAAU,GAAG;AAC3C,YAAM,IAAI,MAAM,wDAAwD;AAAA,IAC1E;AAIA,UAAM,UAAU,WAAW,OAAO,IAAI;AAGtC,QAAI,OAAO,UAAU;AACnB,aAAO,SAAS,mBAAmB,OAAO,QAAQ;AAAA,IACpD;AACA,QAAI,OAAO,aAAa,IAAI,QAAQ,GAAG;AACrC,aAAO,SAAS,OAAO,aAAa,IAAI,QAAQ;AAAA,IAClD;AAGA,UAAM,UAAU,OAAO,aAAa,IAAI,SAAS;AACjD,QAAI,YAAY,YAAY,aAAa,YAAY,YAAY,YAAY,WAAW,YAAY,YAAY;AAC9G,aAAO,MAAM;AAAA,IACf;AAGA,WAAO,MAAM,UAAU,OAAO;AAE9B,WAAO;AAAA,EACT,SAAS,OAAO;AACd,UAAM,IAAI,gBAAgB,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,EAC/G;AACF;AAKA,SAASC,uBACP,SACA,QACQ;AACR,QAAM,QAAkB,CAAC;AACzB,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAM,KAAK,QAAQ,CAAC,CAAE;AACtB,QAAI,IAAI,OAAO,QAAQ;AACrB,YAAM,KAAK,IAAI,IAAI,CAAC,EAAE;AAAA,IACxB;AAAA,EACF;AACA,SAAO,MAAM,KAAK,EAAE;AACtB;AAKA,SAAS,mBACP,WACA,SACA,QACA,SACA,cAAiC,CAAC,GACjB;AACjB,QAAM,MAAMA,uBAAsB,SAAS,MAAM;AAGjD,QAAM,UAAU,YAA0B;AACxC,QAAI,YAAY,WAAW,GAAG;AAE5B,YAAM,SAAS,MAAM,UAAU,MAAS,KAAK,MAAM;AACnD,aAAOC,WAAU,OAAO,MAAM,OAAO,QAAQ,OAAO;AAAA,IACtD;AAGA,UAAM,UAAwB;AAAA,MAC5B;AAAA,MACA,QAAQ;AAAA,MACR,WAAW,KAAK,IAAI;AAAA,MACpB,SAAS,gBAAgB;AAAA,IAC3B;AAEA,UAAM,WAAW,MAAM;AAAA,MACrB;AAAA,MACA;AAAA,MACA,YAAY,UAAU,MAAS,KAAK,MAAM;AAAA,IAC5C;AAEA,QAAI,CAAC,SAAS,WAAW,SAAS,OAAO;AACvC,YAAM,SAAS;AAAA,IACjB;AAEA,WAAOA,WAAU,SAAS,OAAO,MAAM,SAAS,OAAO,QAAQ,OAAO;AAAA,EACxE;AAGA,QAAM,UAAU,QAAQ;AAGxB,SAAO,eAAe,SAAS,WAAW,EAAE,OAAO,QAAQ,CAAC;AAC5D,SAAO,eAAe,SAAS,UAAU,EAAE,OAAO,OAAO,CAAC;AAC1D,SAAO,eAAe,SAAS,WAAW,EAAE,OAAO,QAAQ,CAAC;AAC5D,SAAO,eAAe,SAAS,YAAY;AAAA,IACzC,OAAO,MAAM;AAAA,EACf,CAAC;AAED,SAAO;AACT;AAKA,SAASA,WACP,MACA,QACA,SACK;AACL,MAAI,CAAC,UAAU,OAAO,WAAW,GAAG;AAClC,WAAO;AAAA,EACT;AAGA,QAAM,gBAAgB,oBAAI,IAAwB;AAClD,aAAW,SAAS,QAAQ;AAC1B,UAAM,SAAS,QAAQ,MAAM,UAAU;AACvC,QAAI,QAAQ;AACV,oBAAc,IAAI,MAAM,MAAM,MAAM;AAAA,IACtC;AAAA,EACF;AAGA,MAAI,cAAc,SAAS,GAAG;AAC5B,WAAO;AAAA,EACT;AAGA,SAAO,KAAK,IAAI,CAAC,QAAQ;AACvB,UAAM,SAAkC,CAAC;AACzC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,YAAM,SAAS,cAAc,IAAI,GAAG;AACpC,UAAI,UAAU,OAAO,UAAU,UAAU;AACvC,YAAI;AACF,iBAAO,GAAG,IAAI,OAAO,KAAK;AAAA,QAC5B,QAAQ;AACN,iBAAO,GAAG,IAAI;AAAA,QAChB;AAAA,MACF,OAAO;AACL,eAAO,GAAG,IAAI;AAAA,MAChB;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC;AACH;AAsBA,SAAS,gBAAgB,KAA4B;AAEnD,MAAI,OAAO,QAAQ,YAAY,CAAC,OAAO,UAAU,GAAG,GAAG;AACrD,UAAM,IAAI,cAAc,wCAAwC;AAAA,MAC9D,MAAM;AAAA,MACN,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,QAAM,YAAY,OAAO,GAAG;AAG5B,MAAI,YAAY,OAAO,CAAC,GAAG;AACzB,UAAM,IAAI,cAAc,0CAA0C;AAAA,MAChE,MAAM;AAAA,MACN,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAGA,MAAI,YAAY,YAAY;AAC1B,UAAM,IAAI,cAAc,uDAAuD;AAAA,MAC7E,MAAM;AAAA,MACN,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AACF;AAaA,SAAS,mBAAmB,SAAiB,OAAqB;AAEhE,MAAI,CAAC,OAAO,UAAU,OAAO,KAAK,CAAC,OAAO,UAAU,KAAK,GAAG;AAC1D,UAAM,IAAI,cAAc,uCAAuC;AAAA,MAC7D,MAAM;AAAA,MACN,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAGA,MAAI,UAAU,KAAK,QAAQ,GAAG;AAC5B,UAAM,IAAI,cAAc,2CAA2C;AAAA,MACjE,MAAM;AAAA,MACN,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAGA,MAAI,UAAU,YAAY,QAAQ,UAAU;AAC1C,UAAM,IAAI,cAAc,qDAAqD;AAAA,MAC3E,MAAM;AAAA,MACN,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AACF;AASA,SAAS,qBAAqB,WAAmB,MAAsC;AACrF,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,UAAU,MAAM,IAAI,OAAO,KAAK,CAAC,CAAE,CAAC;AAAA,EAC7C;AACA,SAAO,UAAU,MAAM,IAAI,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;AAChD;AAsCA,SAAS,sBAAsB,eAA6B;AAC1D,MAAI,CAAC,qBAAqB,KAAK,aAAa,GAAG;AAC7C,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AACF;AAiBA,eAAe,4BACb,WACA,OACe;AACf,aAAW,YAAY,WAAW;AAChC,QAAI;AACF,YAAM,SAAS;AAAA,IACjB,SAAS,OAAO;AAEd,cAAQ,MAAM,eAAe,KAAK,oBAAoB,KAAK;AAAA,IAC7D;AAAA,EACF;AACF;AAmCA,SAAS,qBACP,WACA,SACA,kBACA,WACgB;AAEhB,QAAM,iBAAiB,CACrB,YACG,WACiB;AACpB,WAAO,mBAAsB,WAAW,SAAS,QAAQ,OAAO;AAAA,EAClE;AAGA,QAAM,gBAAmC,CAAC;AAG1C,QAAM,QAAQ,OAAO,OAAO,gBAAgB;AAAA,IAC1C,QAAQ,OACN,OACA,WACiB;AACjB,YAAM,SAAS,MAAM,UAAU,MAAS,OAAO,MAAM;AACrD,aAAOA,WAAU,OAAO,MAAM,OAAO,QAAQ,OAAO;AAAA,IACtD;AAAA,IAEA,WAAW,OACT,OACe;AACf,YAAM,gBAAgB,MAAM,EAAE,iBAAiB,KAAK;AAGpD,YAAM,UAAU,MAAM,aAAa,aAAa,EAAE;AAElD,UAAI;AACF,cAAM,SAAS,MAAM,GAAG,KAAkC;AAE1D,cAAM,UAAU,MAAM,qBAAqB,aAAa,EAAE;AAC1D,eAAO;AAAA,MACT,SAAS,OAAO;AAEd,cAAM,UAAU,MAAM,yBAAyB,aAAa,EAAE;AAC9D,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IAEA,QAAQ,CACN,YACG,WACiB;AACpB,YAAM,EAAE,KAAK,OAAO,OAAO,IAAI,sBAAe,SAAS,MAAM;AAC7D,aAAO,mBAAsB,WAAW,OAAO,QAAQ,OAAO;AAAA,IAChE;AAAA,IAEA,KAAK,SAAU,YAA6C;AAC1D,oBAAc,KAAK,UAAU;AAC7B,aAAO;AAAA,IACT;AAAA,IAEA,SAAS;AAAA,MACP;AAAA,MACA,aAAa,CAAC;AAAA,IAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAaA,cAAc,OAAO,cAA+B,UAAkC;AACpF,UAAI,UAAU,QAAW;AAEvB,2BAAmB,cAAwB,KAAK;AAChD,cAAM,UAAU,MAAM,qBAAqB,yBAAyB,cAAwB,KAAK,CAAC;AAAA,MACpG,OAAO;AAEL,wBAAgB,YAAY;AAC5B,cAAM,UAAU,MAAM,qBAAqB,yBAAyB,YAAY,CAAC;AAAA,MACnF;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,iBAAiB,OAAO,cAA+B,UAAqC;AAC1F,UAAI;AACJ,UAAI,UAAU,QAAW;AACvB,2BAAmB,cAAwB,KAAK;AAChD,cAAM,qBAAqB,6BAA6B,cAAwB,KAAK;AAAA,MACvF,OAAO;AACL,wBAAgB,YAAY;AAC5B,cAAM,qBAAqB,6BAA6B,YAAY;AAAA,MACtE;AACA,YAAM,SAAS,MAAM,UAAU,MAA8C,GAAG;AAChF,aAAO,OAAO,KAAK,CAAC,GAAG,6BAA6B;AAAA,IACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,oBAAoB,OAAO,cAA+B,UAAkC;AAC1F,UAAI,UAAU,QAAW;AACvB,2BAAmB,cAAwB,KAAK;AAChD,cAAM,UAAU,MAAM,qBAAqB,gCAAgC,cAAwB,KAAK,CAAC;AAAA,MAC3G,OAAO;AACL,wBAAgB,YAAY;AAC5B,cAAM,UAAU,MAAM,qBAAqB,gCAAgC,YAAY,CAAC;AAAA,MAC1F;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,uBAAuB,OAAO,cAA+B,UAAqC;AAChG,UAAI;AACJ,UAAI,UAAU,QAAW;AACvB,2BAAmB,cAAwB,KAAK;AAChD,cAAM,qBAAqB,oCAAoC,cAAwB,KAAK;AAAA,MAC9F,OAAO;AACL,wBAAgB,YAAY;AAC5B,cAAM,qBAAqB,oCAAoC,YAAY;AAAA,MAC7E;AACA,YAAM,SAAS,MAAM,UAAU,MAAqD,GAAG;AACvF,aAAO,OAAO,KAAK,CAAC,GAAG,oCAAoC;AAAA,IAC7D;AAAA;AAAA,IAGA,SAAS,OAAO,kBAA2C;AACzD,4BAAsB,aAAa;AACnC,gBAAU,aAAa;AACvB,gBAAU,eAAe;AACzB,YAAM,UAAU,MAAM,wBAAwB,aAAa,GAAG;AAC9D,aAAO;AAAA,IACT;AAAA;AAAA,IAGA,UAAU,CAAC,OAAyC;AAClD,gBAAU,kBAAkB,KAAK,EAAE;AAAA,IACrC;AAAA,IAEA,YAAY,CAAC,OAAyC;AACpD,gBAAU,oBAAoB,KAAK,EAAE;AAAA,IACvC;AAAA,EACF,CAAC;AAID,SAAO,eAAe,OAAO,QAAQ;AAAA,IACnC,KAAK,MAAM,UAAU;AAAA,IACrB,cAAc;AAAA,IACd,YAAY;AAAA,EACd,CAAC;AAGD,SAAO,eAAe,OAAO,QAAQ;AAAA,IACnC,KAAK,MAAM,UAAU;AAAA,IACrB,cAAc;AAAA,IACd,YAAY;AAAA,EACd,CAAC;AAGD,SAAO,eAAe,OAAO,cAAc;AAAA,IACzC,KAAK,MAAM,UAAU;AAAA,IACrB,cAAc;AAAA,IACd,YAAY;AAAA,EACd,CAAC;AAED,SAAO;AACT;AAKO,SAAS,aAAa,SAAyB,CAAC,GAAQ;AAE7D,QAAM,UAAsC;AAAA,IAC1C,GAAG;AAAA,IACH,GAAG,OAAO;AAAA,EACZ;AAGA,MAAI,UAAU,OAAO,OAAO;AAC5B,MAAI,CAAC,QAAQ,WAAW,MAAM,GAAG;AAE/B,UAAM,SAAS,mBAAmB,OAAO;AACzC,cAAU,OAAO,OAAO;AACxB,aAAS,EAAE,GAAG,QAAQ,GAAG,OAAO;AAAA,EAClC;AAGA,QAAM,YAAuB,OAAO,cAAc,OAC9C,mBAAmB;AAAA,IACjB,KAAK,QAAQ,QAAQ,YAAY,QAAQ,EAAE,QAAQ,WAAW,OAAO,IAAI;AAAA,IACzE,QAAQ,OAAO;AAAA,IACf,WAAW,OAAO;AAAA,IAClB,gBAAgB,OAAO;AAAA,EACzB,CAAC,IACD,oBAAoB;AAAA,IAClB;AAAA,IACA,QAAQ,OAAO;AAAA,IACf,OAAO,OAAO;AAAA,IACd,SAAS,OAAO;AAAA,EAClB,CAAC;AAGL,QAAM,cAAiC,CAAC;AAKxC,QAAM,MAAM,SACV,YACG,QACc;AACjB,WAAO,mBAAsB,WAAW,SAAS,QAAQ,SAAS,WAAW;AAAA,EAC/E;AAKA,MAAI,SAAS,OACX,OACA,WACiB;AACjB,QAAI,YAAY,WAAW,GAAG;AAC5B,YAAM,SAAS,MAAM,UAAU,MAAS,OAAO,MAAM;AACrD,aAAOA,WAAU,OAAO,MAAM,OAAO,QAAQ,OAAO;AAAA,IACtD;AAGA,UAAM,UAAwB;AAAA,MAC5B,KAAK;AAAA,MACL,QAAQ,UAAU,CAAC;AAAA,MACnB,WAAW,KAAK,IAAI;AAAA,MACpB,SAAS,gBAAgB;AAAA,IAC3B;AAEA,UAAM,WAAW,MAAM;AAAA,MACrB;AAAA,MACA;AAAA,MACA,YAAY,UAAU,MAAS,OAAO,MAAM;AAAA,IAC9C;AAEA,QAAI,CAAC,SAAS,WAAW,SAAS,OAAO;AACvC,YAAM,SAAS;AAAA,IACjB;AAEA,WAAOA,WAAU,SAAS,OAAO,MAAM,SAAS,OAAO,QAAQ,OAAO;AAAA,EACxE;AAKA,MAAI,QAAQ,OACV,IACA,YACe;AAGf,UAAM,oBAAoB,OAAO,oBAAoB,CAAC;AACtD,UAAM,aAAa,SAAS,cAAc,kBAAkB,cAAc;AAC1E,UAAM,oCAAoC,SAAS,+BAA+B,kBAAkB,+BAA+B;AACnI,UAAM,wBAAwB,SAAS,mBAAmB,kBAAkB,mBAAmB;AAC/F,UAAM,YAAY,SAAS,aAAa,kBAAkB,aAAa;AACvE,UAAM,UAAU,SAAS;AAQzB,UAAM,mBAAmB,CAAC,UAA4B;AACpD,UAAI,EAAE,iBAAiB,gBAAgB;AACrC,eAAO;AAAA,MACT;AACA,UAAI,qCAAqC,MAAM,WAAW,SAAS;AACjE,eAAO;AAAA,MACT;AACA,UAAI,yBAAyB,MAAM,WAAW,SAAS;AACrD,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAKA,UAAM,mBAAmB,SAAS,WAAW,OAAO;AAEpD,UAAM,kBAAkB,qBAAqB,UAAa,oBAAoB;AAC9E,UAAM,eAAe,kBAAkB,mBAAmB;AAC1D,UAAM,YAAY,kBAAkB,KAAK,IAAI,IAAI;AACjD,UAAM,kBAAkB,SAAS;AAajC,UAAM,oBAAoB,MAA0B;AAElD,UAAI,mBAAmB,iBAAiB,QAAW;AACjD,cAAM,UAAU,KAAK,IAAI,IAAI;AAC7B,cAAM,YAAY,eAAe;AACjC,YAAI,aAAa,GAAG;AAClB,gBAAM,IAAI,aAAa,+BAA+B,YAAY,IAAI;AAAA,QACxE;AACA,eAAO;AAAA,MACT;AAGA,UAAI,iBAAiB;AACnB,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT;AAEA,UAAM,qBAAqB,OAAO,YAAgC;AAGhE,UAAI,mBAAmB,UAAU,GAAG;AAClC,0BAAkB;AAAA,MACpB;AAGA,YAAM,aAAa,CAAC,OAAO;AAE3B,UAAI,SAAS,gBAAgB;AAE3B,cAAM,cAAc,CAAC,oBAAoB,kBAAkB,mBAAmB,cAAc;AAC5F,cAAM,aAAa,QAAQ,eAAe,YAAY;AACtD,YAAI,CAAC,YAAY,SAAS,UAAU,GAAG;AACrC,gBAAM,IAAI,MAAM,6BAA6B,QAAQ,cAAc,GAAG;AAAA,QACxE;AACA,mBAAW,KAAK,mBAAmB,WAAW,YAAY,CAAC,EAAE;AAAA,MAC/D;AACA,UAAI,SAAS,UAAU;AACrB,mBAAW,KAAK,WAAW;AAAA,MAC7B;AACA,UAAI,SAAS,YAAY;AACvB,mBAAW,KAAK,YAAY;AAAA,MAC9B;AAGA,UAAI;AACF,cAAM,UAAU,MAAM,WAAW,KAAK,GAAG,CAAC;AAAA,MAC5C,SAAS,YAAY;AAEnB,YAAI,iBAAiB,UAAU,KAAK,UAAU,YAAY;AAExD,cAAI,SAAS;AACX,kBAAM,QAAQ,SAAS,UAAmB;AAAA,UAC5C;AAEA,gBAAM,QAAQ,YAAY,KAAK,IAAI,GAAG,UAAU,CAAC;AACjD,gBAAM,IAAI,QAAQ,CAACC,cAAY,WAAWA,WAAS,KAAK,CAAC;AACzD,iBAAO,mBAAmB,UAAU,CAAC;AAAA,QACvC;AACA,cAAM;AAAA,MACR;AAGA,YAAM,YAAgC;AAAA,QACpC,MAAM;AAAA,QACN,QAAQ,SAAS;AAAA,QACjB,mBAAmB,CAAC;AAAA,QACpB,qBAAqB,CAAC;AAAA,QACtB,YAAY;AAAA,QACZ,cAAc;AAAA,QACd,YAAY,UAAU;AAAA;AAAA,MACxB;AAEA,YAAM,mBAAmB,EAAE,OAAO,EAAE;AACpC,YAAM,QAAQ,qBAAqB,WAAW,SAAS,kBAAkB,SAAS;AAMlF,UAAI;AACF,cAAM,aAAa,MAAM,UAAU,MAAgC,6BAA6B;AAChG,kBAAU,OAAO,WAAW,KAAK,CAAC,GAAG;AAAA,MACvC,QAAQ;AAAA,MAER;AAIA,UAAI;AACJ,UAAI,WAAW;AAEf,YAAM,iBAAiB,kBAAkB;AACzC,UAAI,mBAAmB,QAAW;AAChC,wBAAgB,WAAW,MAAM;AAC/B,qBAAW;AAAA,QACb,GAAG,cAAc;AAAA,MACnB;AAMA,YAAM,eAAe,MAAY;AAC/B,YAAI,UAAU;AACZ,gBAAM,oBAAoB,gBAAgB,mBAAmB;AAC7D,gBAAM,IAAI,aAAa,+BAA+B,iBAAiB,IAAI;AAAA,QAC7E;AAAA,MACF;AAEA,UAAI;AAEF,cAAM,SAAS,MAAM,GAAG,KAAK;AAG7B,qBAAa;AAGb,YAAI,UAAU,YAAY;AAExB,cAAI,cAAe,cAAa,aAAa;AAC7C,iBAAO;AAAA,QACT;AAGA,cAAM,UAAU,MAAM,QAAQ;AAG9B,qBAAa;AAGb,YAAI,cAAe,cAAa,aAAa;AAG7C,cAAM,4BAA4B,UAAU,mBAAmB,QAAQ;AAEvE,eAAO;AAAA,MACT,SAAS,OAAO;AAEd,YAAI,eAAe;AACjB,uBAAa,aAAa;AAAA,QAC5B;AAGA,YAAI,YAAY,EAAE,iBAAiB,eAAe;AAChD,gBAAM,oBAAoB,gBAAgB,mBAAmB;AAC7D,gBAAM,IAAI,aAAa,+BAA+B,iBAAiB,IAAI;AAAA,QAC7E;AAKA,YAAI,CAAC,UAAU,YAAY;AACzB,cAAI;AACF,kBAAM,UAAU,MAAM,UAAU;AAAA,UAClC,QAAQ;AAAA,UAER;AAAA,QACF;AAGA,cAAM,4BAA4B,UAAU,qBAAqB,UAAU;AAG3E,YAAI,iBAAiB,cAAc;AACjC,gBAAM;AAAA,QACR;AAGA,YAAI,iBAAiB,KAAK,KAAK,UAAU,YAAY;AAEnD,cAAI,SAAS;AACX,kBAAM,QAAQ,SAAS,KAAc;AAAA,UACvC;AAEA,gBAAM,QAAQ,YAAY,KAAK,IAAI,GAAG,UAAU,CAAC;AACjD,gBAAM,IAAI,QAAQ,CAACA,cAAY,WAAWA,WAAS,KAAK,CAAC;AACzD,iBAAO,mBAAmB,UAAU,CAAC;AAAA,QACvC;AAEA,cAAM;AAAA,MACR;AAAA,IACF;AAEA,WAAO,mBAAmB,CAAC;AAAA,EAC7B;AAKA,MAAI,YAAY,OACd,QACe;AACf,UAAM,IAAI,cAAc,uDAAuD;AAAA,MAC7E,MAAM;AAAA,MACN,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAMA,MAAI,SAAS,CACX,YACG,WACiB;AACpB,UAAM,EAAE,KAAK,OAAO,OAAO,IAAI,sBAAe,SAAS,MAAM;AAC7D,WAAO,mBAAsB,WAAW,OAAO,QAAQ,OAAO;AAAA,EAChE;AAKA,MAAI,MAAM,YAA2B;AACnC,UAAM,UAAU,MAAM;AAAA,EACxB;AAKA,MAAI,UAAU,YAAkC;AAG9C,UAAM,cAAc,aAAa,MAAM;AACvC,gBAAY,UAAU,YAAY;AAChC,YAAM,YAAY,IAAI;AAAA,IACxB;AACA,WAAO;AAAA,EACT;AAKA,MAAI,iBAAiB,OAAO,kBAAyC;AACnE,0BAAsB,aAAa;AACnC,UAAM,UAAU,MAAM,oBAAoB,aAAa,GAAG;AAAA,EAC5D;AAKA,MAAI,mBAAmB,OAAO,kBAAyC;AACrE,0BAAsB,aAAa;AACnC,UAAM,UAAU,MAAM,sBAAsB,aAAa,GAAG;AAAA,EAC9D;AAMA,MAAI,MAAM,SAAU,YAAkC;AACpD,gBAAY,KAAK,UAAU;AAC3B,WAAO;AAAA,EACT;AAMA,MAAI,UAAU;AAAA,IACZ;AAAA,IACA,aAAa,CAAC;AAAA,EAChB;AAoBA,MAAI,eAAoC;AACxC,MAAI,sBAAoD;AACxD,QAAM,sBAAsB,oBAAI,IAA6B;AAW7D,WAAS,2BAA2B,QAA8B;AAChE,QAAI,OAAO,cAAc,MAAM;AAE7B,YAAM,WAAuD,EAAE,KAAK,OAAO;AAC3E,UAAI,OAAO,WAAW,OAAW,UAAS,SAAS,OAAO;AAC1D,UAAI,OAAO,cAAc,OAAW,UAAS,YAAY,OAAO;AAChE,UAAI,OAAO,mBAAmB,OAAW,UAAS,iBAAiB,OAAO;AAC1E,aAAO,qBAAqB,QAAQ;AAAA,IACtC,OAAO;AAEL,YAAM,YAAyD,EAAE,KAAK,OAAO;AAC7E,UAAI,OAAO,WAAW,OAAW,WAAU,SAAS,OAAO;AAC3D,UAAI,OAAO,UAAU,OAAW,WAAU,QAAQ,OAAO;AACzD,aAAO,sBAAsB,SAAS;AAAA,IACxC;AAAA,EACF;AAUA,WAAS,8BAA8BC,YAA+B;AAEpE,IAAAA,WAAU,QAAQ,CAAC,gBAAwB,UAAU;AACnD,YAAM,eAAe,oBAAoB,IAAI,cAAc;AAC3D,UAAI,cAAc;AAChB,qBAAa,YAAY,KAAK;AAAA,MAChC;AAAA,IACF,CAAC;AAGD,IAAAA,WAAU,QAAQ,CAAC,gBAAwB,UAAU;AACnD,YAAM,eAAe,oBAAoB,IAAI,cAAc;AAC3D,UAAI,cAAc;AAChB,qBAAa,YAAY,KAAK;AAAA,MAChC;AAAA,IACF,CAAC;AAGD,IAAAA,WAAU,QAAQ,MAAM;AACtB,0BAAoB,QAAQ,kBAAgB;AAC1C,qBAAa,YAAY;AAAA,MAC3B,CAAC;AACD,0BAAoB,MAAM;AAE1B,qBAAe;AACf,4BAAsB;AAAA,IACxB,CAAC;AAAA,EACH;AAoCA,QAAM,0BAA0B,YAAmC;AAIjE,QAAI,cAAc;AAChB,aAAO;AAAA,IACT;AAOA,QAAI,qBAAqB;AACvB,aAAO;AAAA,IACT;AAQA,2BAAuB,YAAmC;AAExD,YAAM,SAAS,QAAQ,QAAQ,YAAY,OAAO,cAAc,OAAO,WAAW,UAAU,IAAI;AAGhG,YAAMA,aAAY,2BAA2B,MAAM;AAGnD,oCAA8BA,UAAS;AAIvC,YAAMA,WAAU,QAAQ;AAGxB,qBAAeA;AACf,aAAOA;AAAA,IACT,GAAG;AAEH,QAAI;AACF,aAAO,MAAM;AAAA,IACf,UAAE;AASA,4BAAsB;AAAA,IACxB;AAAA,EACF;AAKA,MAAI,YAAY,OACd,WACA,YACsC;AAEtC,UAAM,EAAE,OAAO,OAAO,IAAI,kBAAkB,SAAS;AAGrD,UAAMA,aAAY,MAAM,wBAAwB;AAGhD,UAAM,iBAAiB,uBAAuB;AAG9C,UAAM,sBAAsB,YAA2B;AACrD,0BAAoB,OAAO,cAAc;AACzC,YAAMA,WAAU,YAAY,cAAc;AAG1C,UAAI,oBAAoB,SAAS,KAAK,cAAc;AAClD,cAAM,aAAa,WAAW;AAC9B,uBAAe;AAAA,MACjB;AAAA,IACF;AAGA,UAAM,eAAe,IAAI;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,MACAA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAGA,wBAAoB,IAAI,gBAAgB,YAA+B;AAGvE,UAAM,sBAAiE,CAAC;AACxE,QAAI,SAAS,WAAW,OAAW,qBAAoB,SAAS,QAAQ;AACxE,QAAI,SAAS,WAAW,OAAW,qBAAoB,SAAS,QAAQ;AACxE,QAAI,SAAS,eAAe,OAAW,qBAAoB,aAAa,QAAQ;AAChF,QAAI,SAAS,kBAAkB,OAAW,qBAAoB,gBAAgB,QAAQ;AACtF,QAAI,SAAS,wBAAwB,OAAW,qBAAoB,sBAAsB,QAAQ;AAClG,QAAI,SAAS,cAAc,OAAW,qBAAoB,YAAY,QAAQ;AAC9E,QAAI,SAAS,sBAAsB,OAAW,qBAAoB,oBAAoB,QAAQ;AAC9F,UAAMA,WAAU,UAAU,gBAAgB,OAAO,QAAQ,mBAAmB;AAE5E,WAAO;AAAA,EACT;AAKA,MAAI,cAAc,OAAO,mBAA0C;AACjE,UAAM,eAAe,oBAAoB,IAAI,cAAc;AAC3D,QAAI,cAAc;AAChB,YAAM,aAAa,YAAY;AAAA,IACjC;AAAA,EAEF;AAKA,MAAI,gBAAgB,MAAmC;AACrD,WAAO,MAAM,KAAK,oBAAoB,OAAO,CAAC,EAAE,IAAI,UAAQ;AAAA,MAC1D,IAAI,IAAI;AAAA,MACR,OAAO,IAAI;AAAA,MACX,QAAQ,IAAI;AAAA,MACZ,UAAU,IAAI;AAAA,IAChB,EAAE;AAAA,EACJ;AAEA,SAAO;AACT;AAOO,SAAS,SACd,aACA,SACK;AACL,MAAI,OAAO,gBAAgB,UAAU;AACnC,UAAM,SAAS,mBAAmB,WAAW;AAC7C,WAAO,aAAa,EAAE,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAAA,EAC/C;AAEA,SAAO,aAAa,EAAE,GAAG,aAAa,GAAG,QAAQ,CAAC;AACpD;AAlwCA,IAsCM,iBAyLA,YAGA,UA0GA,sBAy7BC;AArwCP;AAAA;AAAA;AAsBA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAQA,IAAM,kBAA8C;AAAA;AAAA,MAElD,IAAI,CAAC,UAAkB,UAAU,OAAO,UAAU;AAAA;AAAA,MAElD,IAAI,CAAC,UAAkB,OAAO,KAAK;AAAA;AAAA,MACnC,IAAI,CAAC,UAAkB,SAAS,OAAO,EAAE;AAAA;AAAA,MACzC,IAAI,CAAC,UAAkB,SAAS,OAAO,EAAE;AAAA;AAAA,MACzC,IAAI,CAAC,UAAkB,SAAS,OAAO,EAAE;AAAA;AAAA;AAAA,MAEzC,KAAK,CAAC,UAAkB,WAAW,KAAK;AAAA;AAAA,MACxC,KAAK,CAAC,UAAkB,WAAW,KAAK;AAAA;AAAA,MACxC,MAAM,CAAC,UAAkB,WAAW,KAAK;AAAA;AAAA;AAAA,MAEzC,MAAM,CAAC,UAAkB;AAAA;AAAA,MACzB,MAAM,CAAC,UAAkB;AAAA;AAAA,MACzB,MAAM,CAAC,UAAkB,IAAI,KAAK,KAAK;AAAA;AAAA,MACvC,MAAM,CAAC,UAAkB,IAAI,KAAK,KAAK;AAAA;AAAA;AAAA,MAEvC,KAAK,CAAC,UAAkB,KAAK,MAAM,KAAK;AAAA;AAAA,MACxC,MAAM,CAAC,UAAkB,KAAK,MAAM,KAAK;AAAA;AAAA;AAAA,IAE3C;AAoKA,IAAM,aAAa,OAAO,qBAAqB;AAG/C,IAAM,WAAW;AA0GjB,IAAM,uBAAuB;AAy7B7B,IAAO,iBAAQ;AAAA;AAAA;;;ACjsCR,SAAS,0BACd,OACA,UAAsC,CAAC,GAClC;AACL,SAAO,aAAa;AAAA,IAClB,GAAG;AAAA,IACH,QAAQ;AAAA,EACV,CAAC;AACH;AAwBO,SAAS,wBACd,SACA,UAAsC,CAAC,GAClC;AACL,QAAM,aAAa,QAAQ,QAAQ,IAAI,eAAe;AACtD,QAAM,QAAQ,YAAY,WAAW,SAAS,IAAI,WAAW,MAAM,CAAC,IAAI;AAExE,QAAM,gBAAgB,EAAE,GAAG,QAAQ;AACnC,MAAI,UAAU,QAAW;AACvB,kBAAc,SAAS;AAAA,EACzB;AACA,SAAO,aAAa,aAAa;AACnC;AAmBO,SAAS,SACd,SAIA,UAOI,CAAC,GACoC;AACzC,SAAO,OAAO,YAAwC;AAEpD,UAAM,aAAa,QAAQ,QAAQ,IAAI,eAAe;AACtD,UAAM,QAAQ,YAAY,WAAW,SAAS,IAAI,WAAW,MAAM,CAAC,IAAI;AAExE,QAAI,CAAC,OAAO;AACV,UAAI,QAAQ,gBAAgB;AAC1B,eAAO,QAAQ,eAAe,OAAO;AAAA,MACvC;AACA,aAAO,IAAI,SAAS,KAAK,UAAU,EAAE,OAAO,eAAe,CAAC,GAAG;AAAA,QAC7D,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAChD,CAAC;AAAA,IACH;AAGA,QAAI,OAAiC;AAErC,QAAI,QAAQ,aAAa;AACvB,aAAO,MAAM,QAAQ,YAAY,KAAK;AAAA,IACxC,OAAO;AAEL,YAAM,WAAW,QAAQ,YAAY;AACrC,YAAM,SAAS,UAAM,uBAAAC,eAAoB,OAAO,EAAE,SAAS,CAAC;AAC5D,UAAI,OAAO,SAAS,OAAO,MAAM;AAC/B,eAAO,OAAO;AAAA,MAChB;AAAA,IACF;AAEA,QAAI,CAAC,MAAM;AACT,UAAI,QAAQ,gBAAgB;AAC1B,eAAO,QAAQ,eAAe,OAAO;AAAA,MACvC;AACA,aAAO,IAAI,SAAS,KAAK,UAAU,EAAE,OAAO,gBAAgB,CAAC,GAAG;AAAA,QAC9D,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAChD,CAAC;AAAA,IACH;AAGA,UAAM,QAAQ,QAAQ,iBAClB,QAAQ,eAAe,IAAI,IAC3B,0BAA0B,KAAK,EAAE;AAGrC,UAAM,MAAM,aAAa;AAAA,MACvB,GAAG;AAAA,MACH,KAAK;AAAA,MACL,QAAQ;AAAA,IACV,CAAC;AAED,QAAI;AACF,aAAO,MAAM,QAAQ,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;AAAA,IACpD,UAAE;AAEA,YAAM,IAAI,IAAI;AAAA,IAChB;AAAA,EACF;AACF;AAMA,eAAsB,cACpB,SACA,UAAiC,CAAC,GACV;AACxB,QAAM,YAAQ,2CAAmB,OAAO;AAExC,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,SAAS,UAAM,uBAAAA,eAAoB,OAAO,EAAE,SAAS,CAAC;AAE5D,MAAI,OAAO,SAAS,OAAO,MAAM;AAC/B,WAAO,OAAO,KAAK;AAAA,EACrB;AAEA,SAAO;AACT;AAKA,eAAsB,cACpB,OACA,UAAiC,CAAC,GACF;AAChC,QAAM,WAAW,QAAQ,YAAY;AACrC,aAAO,uBAAAA,eAAoB,OAAO,EAAE,SAAS,CAAC;AAChD;AAgBO,SAAS,uBACd,QACA,OACA,UAAsC,CAAC,GAClC;AAEL,QAAM,UAAU,QAAQ,OAAO;AAC/B,QAAM,YAAY,GAAG,OAAO,QAAI,2CAAmB,MAAM,CAAC;AAE1D,SAAO,aAAa;AAAA,IAClB,GAAG;AAAA,IACH,KAAK;AAAA,IACL,QAAQ;AAAA,EACV,CAAC;AACH;AA5QA,IAiBA;AAjBA;AAAA;AAAA;AAgBA;AACA,6BAQO;AAAA;AAAA;;;ACqBA,SAASC,oBAAmB,eAAuC;AACxE,MAAI;AAEJ,MAAI;AACF,aAAS,IAAI,IAAI,aAAa;AAAA,EAChC,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IACnF;AAAA,EACF;AAGA,MAAI,CAAC,OAAO,SAAS,WAAW,UAAU,GAAG;AAC3C,UAAM,IAAI;AAAA,MACR,qBAAqB,OAAO,QAAQ;AAAA,IACtC;AAAA,EACF;AAGA,MAAI,CAAC,OAAO,MAAM;AAChB,UAAM,IAAI,gBAAgB,sCAAsC;AAAA,EAClE;AAGA,QAAM,OAAuB;AAAA,IAC3B,KAAK,WAAW,OAAO,IAAI,GAAG,OAAO,QAAQ;AAAA,IAC7C,QAAQ,CAAC;AAAA,EACX;AAGA,QAAM,WAAW,OAAO;AACxB,MAAI,YAAY,aAAa,KAAK;AAChC,SAAK,WAAW,SAAS,MAAM,CAAC;AAAA,EAClC;AAGA,MAAI,OAAO,UAAU;AACnB,SAAK,SAAS,mBAAmB,OAAO,QAAQ;AAAA,EAClD;AAGA,QAAM,cAAc,OAAO,aAAa,IAAI,QAAQ,KAAK,OAAO,aAAa,IAAI,QAAQ;AACzF,MAAI,aAAa;AACf,SAAK,SAAS;AAAA,EAChB;AAGA,QAAM,UAAU,OAAO,aAAa,IAAI,SAAS,KAAK,OAAO,aAAa,IAAI,KAAK;AACnF,MAAI,SAAS;AACX,SAAK,MAAM;AAAA,EACb;AAGA,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,cAAc;AAC9C,SAAK,OAAO,GAAG,IAAI;AAAA,EACrB;AAEA,SAAO;AACT;AAxGA;AAAA;AAAA;AAOA;AAAA;AAAA;;;AC8cO,SAAS,iBAAiB,KAA8B;AAC7D,QAAM,WAAW,oBAAI,IAAmB;AAExC,aAAW,CAAC,MAAM,QAAQ,KAAK,OAAO,QAAQ,kBAAkB,GAAG;AACjE,eAAW,WAAW,SAAS,mBAAmB;AAChD,UAAI,QAAQ,KAAK,GAAG,GAAG;AACrB,iBAAS,IAAI,IAAqB;AAClC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,QAAQ;AAC5B;AAiXO,SAAS,0BACd,UACA,SACqB;AACrB,SAAO,IAAI,oBAAoB,UAAU,OAAO;AAClD;AAx1BA,IAmJa,oBA2WA;AA9fb;AAAA;AAAA;AAmJO,IAAM,qBAA+D;AAAA,MAC1E,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,QACb,eAAe;AAAA,QACf,aAAa;AAAA,QACb,WAAW;AAAA,QACX,mBAAmB;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,WAAW,CAAC,eAAe,mBAAmB,iBAAiB,QAAQ;AAAA,QACvE,OAAO,CAAC,QAAQ;AAAA,QAChB,WAAW,CAAC,OAAO,OAAO,KAAK;AAAA,MACjC;AAAA,MAEA,SAAS;AAAA,QACP,MAAM;AAAA,QACN,aAAa;AAAA,QACb,eAAe;AAAA,QACf,aAAa;AAAA,QACb,WAAW;AAAA,QACX,mBAAmB;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,WAAW,CAAC,cAAc,aAAa,mBAAmB,wBAAwB;AAAA,QAClF,WAAW,CAAC,KAAK,MAAM,MAAM,OAAO,KAAK;AAAA,MAC3C;AAAA,MAEA,UAAU;AAAA,QACR,MAAM;AAAA,QACN,aAAa;AAAA,QACb,eAAe;AAAA,QACf,aAAa;AAAA,QACb,WAAW;AAAA,QACX,mBAAmB;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MAEA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,QACb,eAAe;AAAA,QACf,aAAa;AAAA,QACb,WAAW;AAAA,QACX,mBAAmB;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,WAAW,CAAC,UAAU,kBAAkB,mBAAmB,QAAQ,SAAS,SAAS;AAAA,QACrF,OAAO,CAAC,QAAQ;AAAA,QAChB,WAAW,CAAC,MAAM,MAAM,KAAK,MAAM,MAAM,MAAM,IAAI;AAAA,MACrD;AAAA,MAEA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,QACb,eAAe;AAAA,QACf,aAAa;AAAA,QACb,WAAW;AAAA,QACX,mBAAmB,CAAC,eAAe,aAAa;AAAA,QAChD,OAAO,CAAC,QAAQ;AAAA,MAClB;AAAA,MAEA,aAAa;AAAA,QACX,MAAM;AAAA,QACN,aAAa;AAAA,QACb,eAAe;AAAA,QACf,aAAa;AAAA,QACb,WAAW;AAAA,QACX,mBAAmB;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MAEA,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,aAAa;AAAA,QACb,eAAe;AAAA,QACf,aAAa;AAAA,QACb,WAAW;AAAA,QACX,mBAAmB,CAAC,aAAa,gBAAgB,yBAAyB,kBAAkB;AAAA,QAC5F,WAAW,CAAC,QAAQ,iBAAiB,YAAY,iBAAiB,eAAe;AAAA,QACjF,OAAO,CAAC,MAAM;AAAA,MAChB;AAAA,MAEA,eAAe;AAAA,QACb,MAAM;AAAA,QACN,aAAa;AAAA,QACb,eAAe;AAAA,QACf,aAAa;AAAA,QACb,WAAW;AAAA,QACX,cAAc,CAAC,MAAM;AAAA,QACrB,mBAAmB;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MAEA,eAAe;AAAA,QACb,MAAM;AAAA,QACN,aAAa;AAAA,QACb,eAAe;AAAA,QACf,aAAa;AAAA,QACb,WAAW;AAAA,QACX,mBAAmB;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,WAAW,CAAC,WAAW,cAAc,eAAe,0BAA0B,aAAa,YAAY;AAAA,MACzG;AAAA,MAEA,UAAU;AAAA,QACR,MAAM;AAAA,QACN,aAAa;AAAA,QACb,eAAe;AAAA,QACf,aAAa;AAAA,QACb,WAAW;AAAA,QACX,mBAAmB;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,WAAW,CAAC,UAAU,QAAQ,YAAY,aAAa,QAAQ,OAAO,YAAY,QAAQ;AAAA,MAC5F;AAAA,MAEA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,QACb,eAAe;AAAA,QACf,aAAa;AAAA,QACb,WAAW;AAAA,QACX,mBAAmB;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,WAAW,CAAC,YAAY,WAAW,UAAU,SAAS,KAAK;AAAA,QAC3D,OAAO,CAAC,SAAS,UAAU,WAAW;AAAA,MACxC;AAAA,MAEA,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,QACb,eAAe;AAAA,QACf,aAAa;AAAA,QACb,WAAW;AAAA,QACX,mBAAmB;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,WAAW,CAAC,YAAY,aAAa,aAAa,aAAa,aAAa,aAAa;AAAA,MAC3F;AAAA,MAEA,UAAU;AAAA,QACR,MAAM;AAAA,QACN,aAAa;AAAA,QACb,eAAe;AAAA,QACf,aAAa;AAAA,QACb,WAAW;AAAA,QACX,mBAAmB,CAAC,kBAAkB;AAAA,QACtC,WAAW,CAAC,UAAU;AAAA,MACxB;AAAA,MAEA,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,QACb,eAAe;AAAA,QACf,aAAa;AAAA,QACb,WAAW;AAAA,QACX,mBAAmB,CAAC,uBAAuB,oBAAoB;AAAA,MACjE;AAAA,MAEA,YAAY;AAAA,QACV,MAAM;AAAA,QACN,aAAa;AAAA,QACb,eAAe;AAAA,QACf,aAAa;AAAA,QACb,WAAW;AAAA,QACX,mBAAmB,CAAC,wBAAwB,qBAAqB;AAAA,MACnE;AAAA,MAEA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,QACb,eAAe;AAAA,QACf,aAAa;AAAA,QACb,WAAW;AAAA,QACX,mBAAmB,CAAC,yBAAyB,gBAAgB;AAAA,MAC/D;AAAA,IACF;AAiEO,IAAM,sBAAN,MAA0B;AAAA,MACvB;AAAA,MACA;AAAA,MACA,mBAAuC,oBAAI,IAAI;AAAA,MAC/C,kBAAoE,oBAAI,IAAI;AAAA,MAC5E,YAAwC,oBAAI,IAAI;AAAA,MAChD,YAAoB;AAAA,MACpB,qBAA6B;AAAA,MAErC,YAAY,UAAyB,UAAsC,CAAC,GAAG;AAC7E,aAAK,WAAW;AAChB,aAAK,UAAU;AAAA,UACb,OAAO,QAAQ,SAAS;AAAA,UACxB,sBAAsB,QAAQ,wBAAwB;AAAA,UACtD,eAAe,QAAQ,iBAAiB;AAAA,QAC1C;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,MAAM,aAAa,MAAmD;AAEpE,YAAI,KAAK,iBAAiB,IAAI,IAAI,GAAG;AACnC,eAAK;AACL,iBAAO;AAAA,YACL;AAAA,YACA,SAAS;AAAA,YACT,kBAAkB;AAAA,YAClB,YAAY;AAAA,UACd;AAAA,QACF;AAGA,cAAM,kBAAkB,KAAK,gBAAgB,IAAI,IAAI;AACrD,YAAI,iBAAiB;AACnB,iBAAO;AAAA,QACT;AAGA,cAAM,cAAc,KAAK,cAAc,IAAI;AAC3C,aAAK,gBAAgB,IAAI,MAAM,WAAW;AAE1C,YAAI;AACF,gBAAM,SAAS,MAAM;AACrB,iBAAO;AAAA,QACT,UAAE;AACA,eAAK,gBAAgB,OAAO,IAAI;AAAA,QAClC;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,cAAc,MAAmD;AAC7E,cAAM,YAAY,YAAY,IAAI;AAGlC,cAAM,WAAW,mBAAmB,IAAI;AACxC,YAAI,CAAC,UAAU;AACb,iBAAO;AAAA,YACL;AAAA,YACA,SAAS;AAAA,YACT,kBAAkB;AAAA,YAClB,YAAY,YAAY,IAAI,IAAI;AAAA,YAChC,OAAO,sBAAsB,IAAI;AAAA,UACnC;AAAA,QACF;AAGA,YAAI,SAAS,cAAc;AACzB,qBAAW,OAAO,SAAS,cAAc;AACvC,kBAAM,YAAY,MAAM,KAAK,aAAa,GAAG;AAC7C,gBAAI,CAAC,UAAU,SAAS;AACtB,qBAAO;AAAA,gBACL;AAAA,gBACA,SAAS;AAAA,gBACT,kBAAkB;AAAA,gBAClB,YAAY,YAAY,IAAI,IAAI;AAAA,gBAChC,OAAO,8BAA8B,GAAG,MAAM,UAAU,KAAK;AAAA,cAC/D;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,YAAI;AAEF,gBAAM,MAAM,mCAAmC,SAAS,aAAa;AACrE,gBAAM,KAAK,SAAS,MAAM,GAAG;AAE7B,gBAAM,aAAa,YAAY,IAAI,IAAI;AACvC,eAAK,iBAAiB,IAAI,IAAI;AAC9B,eAAK,UAAU,IAAI,MAAM,UAAU;AAEnC,cAAI,KAAK,QAAQ,OAAO;AACtB,oBAAQ,IAAI,2CAA2C,IAAI,QAAQ,WAAW,QAAQ,CAAC,CAAC,IAAI;AAAA,UAC9F;AAEA,iBAAO;AAAA,YACL;AAAA,YACA,SAAS;AAAA,YACT,kBAAkB;AAAA,YAClB;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AACd,gBAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAE1E,cAAI,KAAK,QAAQ,OAAO;AACtB,oBAAQ,MAAM,mDAAmD,IAAI,MAAM,KAAK;AAAA,UAClF;AAEA,iBAAO;AAAA,YACL;AAAA,YACA,SAAS;AAAA,YACT,kBAAkB;AAAA,YAClB,YAAY,YAAY,IAAI,IAAI;AAAA,YAChC,OAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,MAAM,eAAe,OAAwD;AAE3E,cAAM,SAAS,KAAK,mBAAmB,KAAK;AAE5C,cAAM,UAAiC,CAAC;AACxC,mBAAW,QAAQ,QAAQ;AACzB,gBAAM,SAAS,MAAM,KAAK,aAAa,IAAI;AAC3C,kBAAQ,KAAK,MAAM;AAAA,QACrB;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKQ,mBAAmB,OAAyC;AAClE,cAAM,UAAU,IAAI,IAAI,KAAK;AAC7B,cAAM,SAA0B,CAAC;AACjC,cAAM,UAAU,oBAAI,IAAmB;AAEvC,cAAM,QAAQ,CAAC,SAAwB;AACrC,cAAI,QAAQ,IAAI,IAAI,EAAG;AACvB,kBAAQ,IAAI,IAAI;AAEhB,gBAAM,WAAW,mBAAmB,IAAI;AACxC,cAAI,UAAU,cAAc;AAC1B,uBAAW,OAAO,SAAS,cAAc;AACvC,kBAAI,QAAQ,IAAI,GAAG,KAAK,CAAC,KAAK,iBAAiB,IAAI,GAAG,GAAG;AACvD,wBAAQ,IAAI,GAAG;AACf,sBAAM,GAAG;AAAA,cACX;AAAA,YACF;AAAA,UACF;AAEA,iBAAO,KAAK,IAAI;AAAA,QAClB;AAEA,mBAAW,QAAQ,OAAO;AACxB,gBAAM,IAAI;AAAA,QACZ;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,iBAAiB,KAA8B;AAC7C,aAAK;AACL,eAAO,iBAAiB,GAAG;AAAA,MAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWA,MAAM,oBAAoB,KAAa,QAAwD;AAC7F,cAAM,mBAAoC,CAAC;AAC3C,YAAI,sBAAsB;AAG1B,YAAI,CAAC,KAAK,QAAQ,sBAAsB;AACtC,gBAAM,WAAW,KAAK,iBAAiB,GAAG;AAE1C,qBAAW,QAAQ,UAAU;AAC3B,gBAAI,CAAC,KAAK,iBAAiB,IAAI,IAAI,GAAG;AAEpC,oBAAMC,UAAS,MAAM,KAAK,aAAa,IAAI;AAC3C,kBAAIA,QAAO,WAAW,CAACA,QAAO,kBAAkB;AAC9C,iCAAiB,KAAK,IAAI;AAC1B,uCAAuBA,QAAO;AAAA,cAChC;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAGA,cAAM,SAAS,MAAM,KAAK,SAAS,MAAM,KAAK,MAAM;AAEpD,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,MAAM,QAAQ,OAAwD;AACpE,eAAO,KAAK,eAAe,KAAK;AAAA,MAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,SAAS,MAA8B;AACrC,eAAO,KAAK,iBAAiB,IAAI,IAAI;AAAA,MACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,sBAAuC;AACrC,eAAO,MAAM,KAAK,KAAK,gBAAgB;AAAA,MACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,WAAiC;AAC/B,eAAO;AAAA,UACL,aAAa,KAAK,iBAAiB;AAAA,UACnC,kBAAkB,MAAM,KAAK,KAAK,gBAAgB;AAAA,UAClD,WAAW,KAAK;AAAA,UAChB,WAAW,OAAO,YAAY,KAAK,SAAS;AAAA,UAC5C,oBAAoB,KAAK;AAAA,QAC3B;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,QAAc;AACZ,aAAK,iBAAiB,MAAM;AAC5B,aAAK,gBAAgB,MAAM;AAC3B,aAAK,UAAU,MAAM;AACrB,aAAK,YAAY;AACjB,aAAK,qBAAqB;AAAA,MAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAYA,OAAO,YAAY,MAAoD;AACrE,eAAO,mBAAmB,IAAI;AAAA,MAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,OAAO,yBAA8C;AACnD,eAAO,OAAO,OAAO,kBAAkB,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS;AAAA,MACpE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,OAAO,YAAY,KAAa,eAAuC;AACrE,cAAM,WAAW,iBAAiB,GAAG;AACrC,eAAO,SAAS,SAAS,aAAa;AAAA,MACxC;AAAA,IACF;AAAA;AAAA;;;AC7zBA,IAkFAC,yBAwPM,gBA4DO;AAtYb;AAAA;AAAA;AAkFA,IAAAA,0BAA0B;AAwP1B,IAAM,iBAAN,MAA2C;AAAA,MAChC;AAAA,MACT,QAAiB;AAAA,MACR;AAAA,MACT;AAAA;AAAA,MAGQ,WAAoB;AAAA,MAE5B,YAAY,IAAY,QAAoB;AAC1C,aAAK,KAAK;AACV,aAAK,SAAS;AAAA,MAChB;AAAA,MAEA,MAAM,MAAmB,KAAa,QAAiD;AACrF,YAAI,CAAC,KAAK,SAAS,KAAK,UAAU;AAChC,gBAAM,IAAI,kCAAU,gCAAgC;AAAA,YAClD,SAAS,EAAE,UAAU,KAAK,GAAG;AAAA,UAC/B,CAAC;AAAA,QACH;AACA,eAAO,KAAK,OAAO,MAAS,KAAK,MAAM;AAAA,MACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,gBAAsB;AACpB,aAAK,WAAW;AAChB,aAAK,QAAQ;AACb,aAAK,aAAa;AAAA,MACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,gBAAsB;AACpB,aAAK,WAAW;AAChB,aAAK,QAAQ;AACb,aAAK,aAAa,oBAAI,KAAK;AAAA,MAC7B;AAAA,IACF;AAgBO,IAAM,aAAN,MAAM,YAAW;AAAA;AAAA;AAAA;AAAA,MAIL;AAAA,MACA;AAAA,MACA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,UAAuC,oBAAI,IAAI;AAAA;AAAA,MAE/C,cAAgC,CAAC;AAAA;AAAA,MAEjC,kBAAmC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,MAM7C,eAAuB;AAAA;AAAA,MAEvB,SAAkB;AAAA;AAAA,MAElB,eAAqC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAgB7C,YAAY,QAA0B;AACpC,aAAK,SAAS,OAAO;AACrB,aAAK,UAAU,OAAO,WAAW;AACjC,aAAK,iBAAiB,OAAO,kBAAkB;AAAA,MACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,IAAI,aAAqB;AACvB,eAAO,KAAK,QAAQ;AAAA,MACtB;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,YAAoB;AACtB,eAAO,KAAK,YAAY;AAAA,MAC1B;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,cAAsB;AACxB,YAAI,QAAQ;AACZ,mBAAW,UAAU,KAAK,QAAQ,OAAO,GAAG;AAC1C,cAAI,OAAO,OAAO;AAChB;AAAA,UACF;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,IAAI,eAAuB;AACzB,eAAO,KAAK,gBAAgB;AAAA,MAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,IAAI,WAAoB;AACtB,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAaA,WAAsB;AACpB,eAAO;AAAA,UACL,YAAY,KAAK;AAAA,UACjB,WAAW,KAAK;AAAA,UAChB,aAAa,KAAK;AAAA,UAClB,cAAc,KAAK;AAAA,UACnB,SAAS,KAAK;AAAA,QAChB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUQ,UAAmB;AACzB,eAAO,KAAK,iBAAiB,QAAQ,KAAK,OAAO;AAAA,MACnD;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,MAAc,cAA6B;AACzC,YAAI,CAAC,KAAK,cAAc;AACtB,eAAK,eAAe,KAAK,OAAO;AAAA,QAClC;AACA,cAAM,KAAK;AAAA,MACb;AAAA;AAAA;AAAA;AAAA;AAAA,MAMQ,eAA+B;AACrC,cAAM,KAAK,EAAE,KAAK;AAClB,cAAM,SAAS,IAAI,eAAe,IAAI,KAAK,MAAM;AACjD,aAAK,QAAQ,IAAI,IAAI,MAAM;AAC3B,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQQ,sBAA2C;AACjD,eAAO,IAAI,QAAoB,CAACC,WAAS,WAAW;AAClD,gBAAM,YAAY,WAAW,MAAM;AAEjC,kBAAM,QAAQ,KAAK,gBAAgB;AAAA,cACjC,CAAC,MAAM,EAAE,YAAYA;AAAA,YACvB;AACA,gBAAI,UAAU,IAAI;AAChB,mBAAK,gBAAgB,OAAO,OAAO,CAAC;AAAA,YACtC;AACA,mBAAO,IAAI,kCAAU,wCAAwC;AAAA,cAC3D,SAAS;AAAA,gBACP,WAAW,KAAK;AAAA,gBAChB,cAAc,KAAK,gBAAgB;AAAA,gBACnC,aAAa,KAAK;AAAA,cACpB;AAAA,YACF,CAAC,CAAC;AAAA,UACJ,GAAG,KAAK,cAAc;AAEtB,eAAK,gBAAgB,KAAK,EAAE,SAAAA,WAAS,QAAQ,UAAU,CAAC;AAAA,QAC1D,CAAC;AAAA,MACH;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,MA8BA,UAA+B;AAC7B,YAAI,KAAK,QAAQ;AACf,iBAAO,QAAQ,OAAO,IAAI,kCAAU,sBAAsB,CAAC;AAAA,QAC7D;AAKA,YAAI,KAAK,QAAQ,KAAK,KAAK,QAAQ,QAAQ,KAAK,WAAW,KAAK,YAAY,WAAW,GAAG;AACxF,iBAAO,KAAK,oBAAoB;AAAA,QAClC;AAGA,eAAO,KAAK,aAAa;AAAA,MAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,MAAc,eAAoC;AAEhD,cAAM,KAAK,YAAY;AAGvB,YAAI,KAAK,QAAQ;AACf,gBAAM,IAAI,kCAAU,sBAAsB;AAAA,QAC5C;AAGA,cAAM,aAAa,KAAK,YAAY,IAAI;AACxC,YAAI,YAAY;AACd,qBAAW,cAAc;AACzB,iBAAO;AAAA,QACT;AAGA,YAAI,KAAK,QAAQ,OAAO,KAAK,SAAS;AACpC,gBAAM,SAAS,KAAK,aAAa;AACjC,iBAAO,cAAc;AACrB,iBAAO;AAAA,QACT;AAGA,eAAO,KAAK,oBAAoB;AAAA,MAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAyBA,QAAQ,QAA0B;AAChC,cAAM,aAAa,KAAK,QAAQ,IAAI,OAAO,EAAE;AAC7C,YAAI,CAAC,YAAY;AACf,gBAAM,IAAI,kCAAU,kBAAkB;AAAA,YACpC,SAAS,EAAE,UAAU,OAAO,GAAG;AAAA,UACjC,CAAC;AAAA,QACH;AAGA,YAAI,CAAC,WAAW,OAAO;AACrB;AAAA,QACF;AAGA,mBAAW,cAAc;AAGzB,YAAI,KAAK,gBAAgB,SAAS,KAAK,CAAC,KAAK,QAAQ;AACnD,gBAAM,UAAU,KAAK,gBAAgB,MAAM;AAC3C,uBAAa,QAAQ,SAAS;AAC9B,qBAAW,cAAc;AACzB,kBAAQ,QAAQ,UAAU;AAC1B;AAAA,QACF;AAGA,aAAK,YAAY,KAAK,UAAU;AAAA,MAClC;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,MAiCA,MAAM,MACJ,KACA,QAC6B;AAC7B,cAAM,SAAS,MAAM,KAAK,QAAQ;AAClC,YAAI;AACF,iBAAO,MAAM,OAAO,MAAS,KAAK,MAAM;AAAA,QAC1C,UAAE;AACA,eAAK,QAAQ,MAAM;AAAA,QACrB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,OAAwB,yBAAyB;AAAA,QAC/C;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASQ,oBAAoB,SAA0C;AACpE,YAAI,WAAW;AAEf,YAAI,SAAS,gBAAgB;AAC3B,gBAAM,aAAa,QAAQ,eAAe,YAAY;AACtD,cAAI,CAAC,YAAW,uBAAuB,SAAS,UAAgC,GAAG;AACjF,kBAAM,IAAI,MAAM,6BAA6B,QAAQ,cAAc,GAAG;AAAA,UACxE;AACA,sBAAY,oBAAoB,WAAW,YAAY,CAAC;AAAA,QAC1D;AAEA,YAAI,SAAS,UAAU;AACrB,sBAAY;AAAA,QACd;AAEA,eAAO;AAAA,MACT;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,MAiCA,MAAM,YACJ,IACA,SACY;AACZ,cAAM,SAAS,MAAM,KAAK,QAAQ;AAClC,YAAI;AACF,gBAAM,WAAW,KAAK,oBAAoB,OAAO;AACjD,gBAAM,OAAO,MAAM,QAAQ;AAE3B,cAAI;AACF,kBAAM,SAAS,MAAM,GAAG,MAAM;AAC9B,kBAAM,OAAO,MAAM,QAAQ;AAC3B,mBAAO;AAAA,UACT,SAAS,OAAO;AAEd,gBAAI;AACF,oBAAM,OAAO,MAAM,UAAU;AAAA,YAC/B,QAAQ;AAAA,YAER;AACA,kBAAM;AAAA,UACR;AAAA,QACF,UAAE;AACA,eAAK,QAAQ,MAAM;AAAA,QACrB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MA0BA,MAAM,MAAqB;AACzB,YAAI,KAAK,QAAQ;AACf;AAAA,QACF;AAEA,aAAK,SAAS;AAGd,mBAAW,WAAW,KAAK,iBAAiB;AAC1C,uBAAa,QAAQ,SAAS;AAC9B,kBAAQ,OAAO,IAAI,kCAAU,iBAAiB,CAAC;AAAA,QACjD;AACA,aAAK,gBAAgB,SAAS;AAG9B,aAAK,YAAY,SAAS;AAG1B,aAAK,QAAQ,MAAM;AAAA,MACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAiBA,MAAM,UAAyB;AAC7B,cAAM,KAAK,IAAI;AACf,cAAM,KAAK,OAAO,MAAM;AAAA,MAC1B;AAAA,IACF;AAAA;AAAA;;;ACn4BA;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;AAAA;AAAA;AAAA;AAAA;AAAA,4BAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBA;AACA;AAGA;AAgBA;AAGA;AAEA;AAEA;AAGA;AACA;AAGA;AA8CA;AAcA;AAOA;AAeA;AAaA;AAAA;AAAA;;;ACtJA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwMO,SAAS,sBACd,QACA,SACiB;AACjB,SAAO,IAAI,gBAAgB;AAAA,IACzB;AAAA,IACA,GAAG;AAAA,EACL,CAAC;AACH;AAsBA,eAAsB,gBAAgB,QAAoC;AACxE,QAAM,OAAO;AAEb,QAAM,YAAY,IAAI,gBAAgB,EAAE,OAAO,CAAC;AAGhD,QAAM,MAAM,SACV,YACG,QACW;AAEd,UAAM,QAAkB,CAAC;AACzB,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,YAAM,MAAM,QAAQ,CAAC;AACrB,UAAI,QAAQ,QAAW;AACrB,cAAM,KAAK,GAAG;AAAA,MAChB;AACA,UAAI,IAAI,OAAO,QAAQ;AACrB,cAAM,KAAK,IAAI,IAAI,CAAC,EAAE;AAAA,MACxB;AAAA,IACF;AACA,UAAM,QAAQ,MAAM,KAAK,EAAE;AAE3B,WAAO,UAAU,MAAS,OAAO,MAAM,EAAE,KAAK,CAAC,WAAW,OAAO,IAAI;AAAA,EACvE;AAGA,MAAI,SAAS,OACX,OACA,WACiB;AACjB,UAAM,SAAS,MAAM,UAAU,MAAS,OAAO,MAAM;AACrD,WAAO,OAAO;AAAA,EAChB;AAGA,MAAI,QAAQ,OACV,IACA,YACe;AACf,UAAM,OAAO;AAGb,UAAM,aAAa,CAAC,OAAO;AAC3B,QAAI,SAAS,gBAAgB;AAE3B,YAAM,cAAc,CAAC,oBAAoB,kBAAkB,mBAAmB,cAAc;AAC5F,YAAM,aAAa,QAAQ,eAAe,YAAY;AACtD,UAAI,CAAC,YAAY,SAAS,UAAU,GAAG;AACrC,cAAM,IAAI,MAAM,6BAA6B,QAAQ,cAAc,GAAG;AAAA,MACxE;AACA,iBAAW,KAAK,mBAAmB,WAAW,YAAY,CAAC,EAAE;AAAA,IAC/D;AACA,QAAI,SAAS,UAAU;AACrB,iBAAW,KAAK,WAAW;AAAA,IAC7B;AACA,QAAI,SAAS,YAAY;AACvB,iBAAW,KAAK,YAAY;AAAA,IAC9B;AAEA,UAAM,OAAO,MAAM,WAAW,KAAK,GAAG,CAAC;AAEvC,UAAM,QAAQC,sBAAqB,MAAM;AAEzC,QAAI;AACF,YAAM,SAAS,MAAM,GAAG,KAAK;AAC7B,YAAM,OAAO,MAAM,QAAQ;AAC3B,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,OAAO,MAAM,UAAU;AAC7B,YAAM;AAAA,IACR;AAAA,EACF;AAGA,MAAI,YAAY,YAA2B;AACzC,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AAGA,MAAI,MAAM,YAA2B;AACnC,UAAM,UAAU,MAAM;AAAA,EACxB;AAGA,MAAI,UAAU;AAAA,IACZ,SAAS,CAAC;AAAA,IACV,aAAa,CAAC;AAAA,EAChB;AAGA,MAAI,UAAU,YAAwC;AACpD,UAAM,WAAW,MAAM,gBAAgB,MAAM;AAC5C,IAAC,SAA+B,UAAU,YAAY;AAAA,IAEvD;AACA,WAAO;AAAA,EACT;AAGA,MAAI,YAAY;AAGhB,MAAI,SAAS;AAEb,SAAO;AACT;AAKA,SAASA,sBAAqB,QAAsC;AAClE,MAAI,mBAAmB;AAEvB,QAAM,QAAQ,SACZ,YACG,QACW;AACd,UAAM,QAAkB,CAAC;AACzB,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,YAAM,MAAM,QAAQ,CAAC;AACrB,UAAI,QAAQ,QAAW;AACrB,cAAM,KAAK,GAAG;AAAA,MAChB;AACA,UAAI,IAAI,OAAO,QAAQ;AACrB,cAAM,KAAK,IAAI,IAAI,CAAC,EAAE;AAAA,MACxB;AAAA,IACF;AACA,UAAM,QAAQ,MAAM,KAAK,EAAE;AAE3B,WAAO,OAAO,MAAS,OAAO,MAAM,EAAE,KAAK,CAAC,WAA0B,OAAO,IAAI;AAAA,EACnF;AAEA,QAAM,SAAS,OACb,OACA,WACiB;AACjB,UAAM,SAAS,MAAM,OAAO,MAAS,OAAO,MAAM;AAClD,WAAO,OAAO;AAAA,EAChB;AAEA,QAAM,YAAY,OAChB,OACe;AACf,UAAM,gBAAgB,MAAM,EAAE,gBAAgB;AAC9C,UAAM,OAAO,MAAM,aAAa,aAAa,EAAE;AAE/C,QAAI;AACF,YAAM,SAAS,MAAM,GAAG,KAAK;AAC7B,YAAM,OAAO,MAAM,qBAAqB,aAAa,EAAE;AACvD,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,OAAO,MAAM,yBAAyB,aAAa,EAAE;AAC3D,YAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,UAAU;AAAA,IACd,SAAS,CAAC;AAAA,IACV,aAAa,CAAC;AAAA,EAChB;AAEA,SAAO;AACT;AAzYA,IA2BA,eAwBa;AAnDb;AAAA;AAAA;AA2BA,oBAAuB;AAwBhB,IAAM,kBAAN,MAA2C;AAAA,MACxC;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MAEtB,YAAY,QAA+B;AACzC,aAAK,SAAS,OAAO;AACrB,aAAK,WAAW,OAAO,YAAY;AAAA,MACrC;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,cAA6B;AACzC,YAAI,KAAK,YAAa;AAEtB,YAAI,KAAK,YAAY,KAAK,OAAO,WAAW;AAC1C,gBAAM,KAAK,OAAO;AAAA,QACpB;AAEA,aAAK,cAAc;AAAA,MACrB;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,MACJ,KACA,QACyB;AACzB,cAAM,KAAK,YAAY;AAEvB,cAAM,SAAS,MAAM,KAAK,OAAO,MAAS,KAAK,MAAM;AAErD,eAAO;AAAA,UACL,MAAM,OAAO;AAAA,UACb,UAAU,OAAO,gBAAgB,OAAO,KAAK;AAAA,UAC7C,QAAQ,OAAO,OAAO,IAAI,CAAC,WAAiD;AAAA,YAC1E,MAAM,MAAM;AAAA,YACZ,YAAY,MAAM;AAAA,YAClB,SAAS;AAAA,YACT,UAAU;AAAA,YACV,cAAc;AAAA,YACd,kBAAkB;AAAA,YAClB,QAAQ;AAAA,UACV,EAAE;AAAA,UACF,SAAS,KAAK,eAAe,GAAG;AAAA,QAClC;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,YACJ,SACA,SACY;AACZ,cAAM,KAAK,YAAY;AAGvB,cAAM,aAAa,CAAC,OAAO;AAE3B,YAAI,SAAS,gBAAgB;AAE3B,gBAAM,cAAc,CAAC,oBAAoB,kBAAkB,mBAAmB,cAAc;AAC5F,gBAAM,aAAa,QAAQ,eAAe,YAAY;AACtD,cAAI,CAAC,YAAY,SAAS,UAAU,GAAG;AACrC,kBAAM,IAAI,MAAM,6BAA6B,QAAQ,cAAc,GAAG;AAAA,UACxE;AACA,qBAAW,KAAK,mBAAmB,WAAW,YAAY,CAAC,EAAE;AAAA,QAC/D;AACA,YAAI,SAAS,UAAU;AACrB,qBAAW,KAAK,WAAW;AAAA,QAC7B;AACA,YAAI,SAAS,YAAY;AACvB,qBAAW,KAAK,YAAY;AAAA,QAC9B;AAGA,cAAM,KAAK,OAAO,MAAM,WAAW,KAAK,GAAG,CAAC;AAE5C,YAAI;AACF,gBAAM,UAAqB,CAAC;AAE5B,qBAAW,KAAK,SAAS;AACvB,kBAAM,SAAS,MAAM,KAAK,OAAO,MAAM,EAAE,KAAK,EAAE,MAAM;AACtD,oBAAQ,KAAK,OAAO,IAAI;AAAA,UAC1B;AAEA,gBAAM,KAAK,OAAO,MAAM,QAAQ;AAChC,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,gBAAM,KAAK,OAAO,MAAM,UAAU;AAClC,gBAAM;AAAA,QACR;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,QAAuB;AAC3B,YAAI,KAAK,OAAO,OAAO;AACrB,gBAAM,KAAK,OAAO,MAAM;AAAA,QAC1B;AACA,aAAK,cAAc;AAAA,MACrB;AAAA;AAAA;AAAA;AAAA,MAKA,cAAuB;AAGrB,eAAO,KAAK,eAAe,KAAK,OAAO,UAAU;AAAA,MACnD;AAAA;AAAA;AAAA;AAAA,MAKA,YAAoB;AAClB,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKQ,eAAe,KAAqB;AAC1C,cAAM,UAAU,IAAI,KAAK,EAAE,YAAY;AACvC,cAAM,YAAY,QAAQ,MAAM,KAAK,EAAE,CAAC;AACxC,eAAO,aAAa;AAAA,MACtB;AAAA,IACF;AAAA;AAAA;;;ACtLA;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;AAyCA,uBAAwB;AACxB,IAAAC,mBAAwD;AACxD,IAAAC,qBAAiC;AACjC,IAAAD,mBAA0B;;;AC0I1B,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;;;AD9sCA;;;AE5CA,IAAAE,oBAAwB;AACxB,IAAAC,kBAA2B;;;ACK3B,IAAM,SAAS;AAAA,EACb,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA;AAAA,EAGL,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AACR;AAGA,IAAM,gBAAgB,QAAQ,OAAO,SAAS,CAAC,QAAQ,IAAI,UAAU;AAErE,SAAS,SAAS,MAAc,OAAoC;AAClE,MAAI,CAAC,eAAe;AAClB,WAAO;AAAA,EACT;AACA,SAAO,GAAG,OAAO,KAAK,CAAC,GAAG,IAAI,GAAG,OAAO,KAAK;AAC/C;AASO,SAAS,cAAc,SAAyB;AACrD,SAAO,SAAS,UAAK,OAAO,IAAI,OAAO;AACzC;AAKO,SAAS,YAAY,SAAyB;AACnD,SAAO,SAAS,UAAK,OAAO,IAAI,KAAK;AACvC;AAKO,SAAS,cAAc,SAAyB;AACrD,SAAO,SAAS,KAAK,OAAO,IAAI,QAAQ;AAC1C;AAKO,SAAS,WAAW,SAAyB;AAClD,SAAO,SAAS,UAAK,OAAO,IAAI,MAAM;AACxC;AAKO,SAAS,UAAU,SAAyB;AACjD,SAAO,SAAS,SAAS,MAAM;AACjC;AAKO,SAAS,eAAe,SAAyB;AACtD,SAAO,SAAS,KAAK,OAAO,IAAI,MAAM;AACxC;AASO,SAAS,sBAAsB,OAAyC;AAC7E,QAAM,EAAE,WAAW,OAAO,OAAO,OAAO,YAAY,MAAM,IAAI;AAC9D,QAAM,WAAW,IAAI,QAAQ,CAAC,IAAI,KAAK;AACvC,QAAM,UAAU,IAAI,UAAU,OAAO;AAErC,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO,GAAG,UAAU,QAAQ,CAAC,IAAI,WAAW,sBAAsB,OAAO,KAAK,UAAU,IAAI,EAAE,CAAC;AAAA,IACjG,KAAK;AACH,aAAO,GAAG,UAAU,QAAQ,CAAC,IAAI,UAAU,aAAa,OAAO,KAAK,CAAC;AAAA,IACvE,KAAK;AACH,YAAM,OAAO,aAAa,KAAK,eAAe,UAAU,CAAC,MAAM;AAC/D,aAAO,GAAG,UAAU,QAAQ,CAAC,IAAI,cAAc,WAAW,OAAO,KAAK,UAAU,IAAI,GAAG,IAAI,EAAE,CAAC;AAAA,IAChG,KAAK;AACH,aAAO,GAAG,UAAU,QAAQ,CAAC,IAAI,YAAY,UAAU,OAAO,KAAK,UAAU,IAAI,EAAE,CAAC,GAAG,QAAQ;AAAA,MAAS,YAAY,KAAK,CAAC,KAAK,EAAE;AAAA,IACnI,KAAK;AACH,aAAO,GAAG,UAAU,QAAQ,CAAC,IAAI,UAAU,WAAW,OAAO,KAAK,UAAU,IAAI,oBAAoB,CAAC;AAAA,IACvG;AACE,aAAO,GAAG,UAAU,QAAQ,CAAC,IAAI,UAAU,EAAE;AAAA,EACjD;AACF;AAKO,SAAS,qBAAqB,OAAwC;AAC3E,QAAM,EAAE,WAAW,OAAO,OAAO,OAAO,YAAY,OAAO,SAAS,IAAI;AACxE,QAAM,WAAW,IAAI,QAAQ,CAAC,IAAI,KAAK;AACvC,QAAM,UAAU,IAAI,UAAU,OAAO;AACrC,QAAM,cAAc,WAAW,eAAe;AAE9C,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO,GAAG,UAAU,QAAQ,CAAC,IAAI,WAAW,gBAAgB,OAAO,KAAK,UAAU,IAAI,GAAG,WAAW,EAAE,CAAC;AAAA,IACzG,KAAK;AACH,aAAO,GAAG,UAAU,QAAQ,CAAC,IAAI,UAAU,sBAAsB,OAAO,KAAK,CAAC;AAAA,IAChF,KAAK;AACH,YAAM,OAAO,aAAa,KAAK,eAAe,UAAU,CAAC,MAAM;AAC/D,aAAO,GAAG,UAAU,QAAQ,CAAC,IAAI,cAAc,eAAe,OAAO,KAAK,UAAU,IAAI,GAAG,IAAI,GAAG,WAAW,EAAE,CAAC;AAAA,IAClH,KAAK;AACH,aAAO,GAAG,UAAU,QAAQ,CAAC,IAAI,YAAY,mBAAmB,OAAO,KAAK,UAAU,IAAI,EAAE,CAAC,GAAG,QAAQ;AAAA,MAAS,YAAY,KAAK,CAAC,KAAK,EAAE;AAAA,IAC5I,KAAK;AACH,aAAO,GAAG,UAAU,QAAQ,CAAC,IAAI,UAAU,WAAW,OAAO,KAAK,UAAU,IAAI,kCAAkC,CAAC;AAAA,IACrH;AACE,aAAO,GAAG,UAAU,QAAQ,CAAC,IAAI,UAAU,EAAE;AAAA,EACjD;AACF;AASO,SAAS,eAAe,IAAoB;AACjD,MAAI,KAAK,KAAM;AACb,WAAO,GAAG,EAAE;AAAA,EACd;AACA,MAAI,KAAK,KAAO;AACd,WAAO,IAAI,KAAK,KAAM,QAAQ,CAAC,CAAC;AAAA,EAClC;AACA,QAAM,UAAU,KAAK,MAAM,KAAK,GAAK;AACrC,QAAM,WAAY,KAAK,MAAS,KAAM,QAAQ,CAAC;AAC/C,SAAO,GAAG,OAAO,KAAK,OAAO;AAC/B;AASO,SAAS,YAAY,SAAmB,MAA0B;AAEvE,QAAM,SAAS,QAAQ,IAAI,CAAC,GAAG,MAAM;AACnC,UAAM,cAAc,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,MAAM,CAAC;AACpE,WAAO,KAAK,IAAI,EAAE,QAAQ,WAAW;AAAA,EACvC,CAAC;AAGD,QAAM,YAAY,QAAQ,IAAI,CAAC,GAAG,MAAM,EAAE,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,KAAK;AAC5E,QAAM,YAAY,OAAO,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,KAAK;AAG7D,QAAM,WAAW,KAAK;AAAA,IAAI,CAAC,QACzB,IAAI,IAAI,CAAC,MAAM,OAAO,QAAQ,IAAI,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,KAAK;AAAA,EACtE;AAEA,SAAO,CAAC,WAAW,WAAW,GAAG,QAAQ,EAAE,KAAK,IAAI;AACtD;AAMA,IAAM,gBAAgB,CAAC,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,QAAG;AAKhE,SAAS,cAAc,SAAiB;AAC7C,MAAI,QAAQ;AACZ,MAAI,aAAoC;AAExC,SAAO;AAAA,IACL,QAAQ;AACN,UAAI,CAAC,eAAe;AAClB,gBAAQ,IAAI,OAAO;AACnB;AAAA,MACF;AACA,mBAAa,YAAY,MAAM;AAC7B,gBAAQ,OAAO,MAAM,KAAK,SAAS,cAAc,KAAK,KAAK,UAAK,MAAM,CAAC,IAAI,OAAO,EAAE;AACpF,iBAAS,QAAQ,KAAK,cAAc;AAAA,MACtC,GAAG,EAAE;AAAA,IACP;AAAA,IACA,KAAK,cAAuB;AAC1B,UAAI,YAAY;AACd,sBAAc,UAAU;AACxB,gBAAQ,OAAO,MAAM,OAAO,IAAI,OAAO,QAAQ,SAAS,CAAC,IAAI,IAAI;AACjE,YAAI,cAAc;AAChB,kBAAQ,IAAI,YAAY;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAAA,IACA,QAAQ,KAAc;AACpB,WAAK,KAAK,cAAc,OAAO,OAAO,CAAC;AAAA,IACzC;AAAA,IACA,KAAK,KAAc;AACjB,WAAK,KAAK,YAAY,OAAO,OAAO,CAAC;AAAA,IACvC;AAAA,EACF;AACF;AASO,SAAS,kBAAkB,SAAiB,OAAe,QAAQ,IAAY;AACpF,QAAM,UAAU,KAAK,MAAO,UAAU,QAAS,GAAG;AAClD,QAAM,SAAS,KAAK,MAAO,UAAU,QAAS,KAAK;AACnD,QAAM,QAAQ,QAAQ;AAEtB,QAAM,MAAM,IAAI,SAAI,OAAO,MAAM,CAAC,GAAG,SAAI,OAAO,KAAK,CAAC;AACtD,SAAO,GAAG,GAAG,IAAI,OAAO;AAC1B;;;AC1OA,uBAA8B;AAC9B,qBAAgE;AA2CzD,SAAS,4BAA4B,KAAoC;AAC9E,QAAM,aAAoC,CAAC;AAC3C,QAAM,cAAU,4BAAY,GAAG;AAE/B,aAAW,SAAS,SAAS;AAC3B,UAAM,gBAAY,uBAAK,KAAK,KAAK;AACjC,UAAM,WAAO,yBAAS,SAAS;AAG/B,QAAI,MAAM,WAAW,GAAG,KAAK,MAAM,WAAW,GAAG,GAAG;AAClD;AAAA,IACF;AAEA,QAAI,KAAK,YAAY,GAAG;AAEtB,YAAM,aAAS,uBAAK,WAAW,QAAQ;AACvC,YAAM,eAAW,uBAAK,WAAW,UAAU;AAE3C,cAAI,2BAAW,MAAM,GAAG;AACtB,cAAM,YAAY,iBAAiB,OAAO,WAAW,QAAQ,QAAQ;AACrE,YAAI,WAAW;AACb,qBAAW,KAAK,SAAS;AAAA,QAC3B;AAAA,MACF;AAAA,IACF,WAAW,KAAK,OAAO,GAAG;AACxB,YAAM,UAAM,0BAAQ,KAAK;AAEzB,UAAI,QAAQ,SAAS,QAAQ,SAAS,QAAQ,QAAQ;AAEpD,cAAM,YAAY,gBAAgB,OAAO,SAAS;AAClD,YAAI,WAAW;AACb,qBAAW,KAAK,SAAS;AAAA,QAC3B;AAAA,MACF,WAAW,QAAQ,QAAQ;AAEzB,cAAM,YAAY,uBAAuB,OAAO,SAAS;AACzD,YAAI,WAAW;AACb,qBAAW,KAAK,SAAS;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO,WAAW,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,OAAO;AACxD;AAKA,SAAS,iBACP,SACA,UACA,QACA,UAC4B;AAG5B,QAAM,QAAQ,QAAQ,MAAM,cAAc;AAC1C,MAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG;AACpC,YAAQ,KAAK,yCAAyC,OAAO,EAAE;AAC/D,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS,MAAM,CAAC,GAAG,EAAE;AACrC,QAAM,OAAO,MAAM,CAAC,EAAE,QAAQ,MAAM,GAAG;AAEvC,QAAM,SAAK,6BAAa,QAAQ,OAAO,EAAE,KAAK;AAC9C,QAAM,WAAO,2BAAW,QAAQ,QAC5B,6BAAa,UAAU,OAAO,EAAE,KAAK,IACrC;AAEJ,SAAO;AAAA,IACL,IAAI;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,CAAC,CAAC;AAAA,IAChB,MAAM,CAAC,KAAK;AAAA,EACd;AACF;AAKA,SAAS,uBACP,UACA,UAC4B;AAG5B,QAAM,QAAQ,SAAS,MAAM,mBAAmB;AAChD,MAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG;AACpC,YAAQ,KAAK,oCAAoC,QAAQ,EAAE;AAC3D,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS,MAAM,CAAC,GAAG,EAAE;AACrC,QAAM,OAAO,MAAM,CAAC,EAAE,QAAQ,MAAM,GAAG;AAEvC,QAAM,cAAU,6BAAa,UAAU,OAAO,EAAE,KAAK;AAIrD,QAAM,cAAc,CAAC,WAAW,UAAU,eAAe,YAAY;AACrE,MAAI,KAAK;AACT,MAAI;AAEJ,aAAW,UAAU,aAAa;AAChC,UAAM,QAAQ,QAAQ,YAAY,EAAE,QAAQ,OAAO,YAAY,CAAC;AAChE,QAAI,UAAU,IAAI;AAChB,WAAK,QAAQ,UAAU,GAAG,KAAK,EAAE,KAAK;AACtC,aAAO,QAAQ,UAAU,QAAQ,OAAO,MAAM,EAAE,KAAK;AACrD;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,IAAI,SAAS,QAAQ,UAAU,EAAE;AAAA,IACjC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,CAAC,CAAC;AAAA,IAChB,MAAM,CAAC,KAAK;AAAA,EACd;AACF;AAQA,SAAS,gBACP,UACA,UAC4B;AAG5B,QAAM,QAAQ,SAAS,MAAM,2BAA2B;AACxD,MAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG;AACpC,YAAQ,KAAK,oCAAoC,QAAQ,EAAE;AAC3D,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS,MAAM,CAAC,GAAG,EAAE;AACrC,QAAM,WAAW,MAAM,CAAC;AACxB,QAAM,WAAW,SAAS,QAAQ,MAAM,GAAG;AAG3C,QAAM,cAAU,6BAAa,UAAU,OAAO;AAI9C,QAAM,YAAY,yBAAyB,SAAS;AAAA,IAClD,IAAI,SAAS,QAAQ,kBAAkB,EAAE;AAAA,IACzC,MAAM;AAAA,IACN;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAQA,SAAS,yBACP,SACA,UAC4B;AAE5B,QAAM,UAAU,QAAQ,MAAM,2BAA2B;AACzD,QAAM,KAAK,UAAU,CAAC,KAAK,SAAS;AAGpC,QAAM,YAAY,QAAQ,MAAM,6BAA6B;AAC7D,QAAM,OAAO,YAAY,CAAC,KAAK,SAAS;AAGxC,QAAM,eAAe,QAAQ,MAAM,kBAAkB;AACrD,QAAM,UAAU,eAAe,CAAC,IAAI,SAAS,aAAa,CAAC,GAAG,EAAE,IAAI,SAAS;AAG7E,QAAM,UAAU,QAAQ,MAAM,oBAAoB;AAClD,QAAM,KAAK,UAAU,CAAC,GAAG,KAAK;AAE9B,MAAI,CAAC,IAAI;AAEP,UAAM,gBAAgB,QAAQ,MAAM,wBAAwB;AAC5D,QAAI,CAAC,gBAAgB,CAAC,GAAG;AACvB,cAAQ,KAAK,kCAAkC,SAAS,EAAE,EAAE;AAC5D,aAAO;AAAA,IACT;AAAA,EACF;AAGA,QAAM,YAAY,QAAQ,MAAM,sBAAsB;AACtD,QAAM,OAAO,YAAY,CAAC,GAAG,KAAK;AAGlC,QAAM,kBAAkB,QAAQ,MAAM,8BAA8B;AACpE,QAAM,eAAe,kBAAkB,CAAC,MAAM,UAAW,kBAAkB,CAAC,MAAM,WAAW,CAAC,CAAC;AAG/F,QAAM,YAAY,QAAQ,MAAM,sBAAsB;AACtD,MAAI;AACJ,MAAI,YAAY,CAAC,GAAG;AAClB,WAAO,UAAU,CAAC,EACf,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,UAAU,EAAE,CAAC,EACzC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAAA,EAC/B;AAGA,QAAM,qBAAqB,QAAQ,MAAM,+BAA+B;AACxE,QAAM,gBAAgB,qBAAqB,CAAC,MAAM;AAElD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,IAAI,MAAM;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAKA,eAAsB,oBAAoB,KAAqC;AAE7E,QAAMC,aAAY,MAAM,6DAAuB;AAE/C,QAAM,MAAMA,UAAS,GAAG;AAGxB,QAAM,WAA0B;AAAA,IAC9B,MAAM,MAAmB,QAAgB,QAAoB;AAE3D,UAAI,UAAU,OAAO,SAAS,GAAG;AAE/B,YAAI,mBAAmB;AACvB,eAAO,QAAQ,CAAC,OAAO,MAAM;AAC3B,gBAAM,cAAc,IAAI,IAAI,CAAC;AAE7B,6BAAmB,iBAAiB;AAAA,YAClC;AAAA,YACA,OAAO,UAAU,WAAW,IAAI,MAAM,QAAQ,MAAM,IAAI,CAAC,MAAM,OAAO,KAAK;AAAA,UAC7E;AAAA,QACF,CAAC;AACD,cAAMC,UAAS,MAAM,IAAI,OAAO,gBAAgB;AAChD,eAAO;AAAA,UACL,MAAMA;AAAA,UACN,QAAQ,CAAC;AAAA,QACX;AAAA,MACF;AAEA,YAAM,SAAS,MAAM,IAAI,OAAO,MAAM;AACtC,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ,CAAC;AAAA,MACX;AAAA,IACF;AAAA,IACA,MAAM,MAAM;AACV,YAAM,IAAI,IAAI;AAAA,IAChB;AAAA,EACF;AACA,SAAO;AACT;;;AFvTA,eAAsB,WAAW,SAA2C;AAC1E,QAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI,cAAc;AAErD,MAAI,CAAC,KAAK;AACR,YAAQ,MAAM,YAAY,0BAA0B,CAAC;AACrD,YAAQ,MAAM,WAAW,wDAAwD,CAAC;AAClF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,oBAAgB,2BAAQ,QAAQ,IAAI,GAAG,QAAQ,iBAAiB,cAAc;AAEpF,MAAI,KAAC,4BAAW,aAAa,GAAG;AAC9B,YAAQ,MAAM,YAAY,mCAAmC,aAAa,EAAE,CAAC;AAC7E,YAAQ,MAAM,WAAW,oEAAoE,CAAC;AAC9F,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,IAAI,WAAW,4BAA4B,aAAa,EAAE,CAAC;AAEnE,MAAI;AACF,UAAM,aAAa,4BAA4B,aAAa;AAE5D,QAAI,WAAW,WAAW,GAAG;AAC3B,cAAQ,IAAI,WAAW,qBAAqB,CAAC;AAC7C;AAAA,IACF;AAEA,YAAQ,IAAI,WAAW,SAAS,WAAW,MAAM,eAAe,CAAC;AAGjE,UAAM,EAAE,yBAAyB,sBAAsB,IAAI,MAAM,OAAO,4BAA4B;AAGpG,UAAM,WAAW,wBAAwB,EAAE,WAA2E,CAAC;AAGvH,YAAQ,IAAI,WAAW,2BAA2B,CAAC;AACnD,UAAM,WAAW,MAAM,oBAAoB,GAAG;AAG9C,UAAM,SAAS,sBAAsB,UAAU,UAAU;AAAA,MACvD,GAAI,QAAQ,UAAU,EAAE,OAAO,QAAQ,QAAQ,IAAI,CAAC;AAAA,MACpD,YAAY,CAAC,UAAU;AACrB,YAAI,QAAQ,WAAW,MAAM,UAAU,eAAe,MAAM,UAAU,UAAU;AAE9E,gBAAM,eAAe;AAAA,YACnB,WAAW,MAAM;AAAA,YACjB,OAAO,MAAM;AAAA,YACb,OAAO,MAAM;AAAA,YACb,OAAO,MAAM;AAAA,YACb,GAAI,MAAM,eAAe,UAAa,EAAE,YAAY,MAAM,WAAW;AAAA,YACrE,GAAI,MAAM,UAAU,UAAa,EAAE,OAAO,MAAM,MAAM;AAAA,UACxD;AACA,kBAAQ,IAAI,sBAAsB,YAAY,CAAC;AAAA,QACjD;AAAA,MACF;AAAA,IACF,CAAC;AAGD,YAAQ,IAAI,WAAW,uBAAuB,CAAC;AAC/C,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,SAAS,MAAM,OAAO,QAAQ;AACpC,UAAM,WAAW,KAAK,IAAI,IAAI;AAG9B,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAC7C,OAAO;AACL,cAAQ,IAAI,EAAE;AACd,UAAI,OAAO,SAAS;AAClB,YAAI,OAAO,kBAAkB,GAAG;AAC9B,kBAAQ,IAAI,cAAc,wBAAwB,CAAC;AAAA,QACrD,OAAO;AACL,kBAAQ,IAAI,cAAc,oBAAoB,OAAO,aAAa,oBAAoB,eAAe,QAAQ,CAAC,EAAE,CAAC;AAAA,QACnH;AACA,gBAAQ,IAAI,WAAW,mBAAmB,OAAO,WAAW,OAAO,OAAO,SAAS,EAAE,CAAC;AAAA,MACxF,OAAO;AACL,gBAAQ,MAAM,YAAY,kBAAkB,CAAC;AAC7C,cAAM,eAAe,OAAO,QAAQ,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO;AAC1D,YAAI,cAAc;AAChB,kBAAQ,MAAM,YAAY,cAAc,aAAa,EAAE,EAAE,CAAC;AAC1D,kBAAQ,MAAM,YAAY,UAAU,aAAa,KAAK,EAAE,CAAC;AAAA,QAC3D;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAGA,QAAI,SAAS,YAAY,OAAO,SAAS,QAAQ,YAAY;AAC3D,YAAM,SAAS,IAAI;AAAA,IACrB;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,YAAY,kBAAkB,GAAG,iBAAiB,QAAQ,MAAM,UAAU,KAAK;AAC7F,QAAI,QAAQ,WAAW,iBAAiB,SAAS,MAAM,OAAO;AAC5D,cAAQ,MAAM,MAAM,KAAK;AAAA,IAC3B;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;AG5GA,IAAAC,oBAAwB;AACxB,IAAAC,kBAA2B;AAQ3B,eAAsB,iBAAiB,SAA2C;AAChF,QAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI,cAAc;AAErD,MAAI,CAAC,KAAK;AACR,YAAQ,MAAM,YAAY,0BAA0B,CAAC;AACrD,YAAQ,MAAM,WAAW,wDAAwD,CAAC;AAClF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,oBAAgB,2BAAQ,QAAQ,IAAI,GAAG,QAAQ,iBAAiB,cAAc;AAEpF,MAAI,KAAC,4BAAW,aAAa,GAAG;AAC9B,YAAQ,MAAM,YAAY,mCAAmC,aAAa,EAAE,CAAC;AAC7E,YAAQ,MAAM,WAAW,oEAAoE,CAAC;AAC9F,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI;AACF,UAAM,aAAa,4BAA4B,aAAa;AAG5D,UAAM,EAAE,yBAAyB,sBAAsB,IAAI,MAAM,OAAO,4BAA4B;AAGpG,UAAM,WAAW,wBAAwB;AAAA,MACvC;AAAA,MACA,kBAAkB;AAAA;AAAA,MAClB,kBAAkB;AAAA,IACpB,CAAC;AAGD,YAAQ,IAAI,WAAW,2BAA2B,CAAC;AACnD,UAAM,WAAW,MAAM,oBAAoB,GAAG;AAG9C,UAAM,SAAS,sBAAsB,UAAU,UAAU;AAAA,MACvD,GAAI,QAAQ,UAAU,EAAE,OAAO,QAAQ,QAAQ,IAAI,CAAC;AAAA,IACtD,CAAC;AAGD,UAAM,gBAAgB,MAAM,OAAO,iBAAiB;AACpD,UAAM,aAAa,MAAM,OAAO,eAAe;AAG/C,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU;AAAA,QACzB,gBAAgB,cAAc;AAAA,QAC9B,cAAc,cAAc;AAAA,QAC5B,iBAAiB,cAAc;AAAA,QAC/B,cAAc,WAAW;AAAA,QACzB,gBAAgB,WAAW;AAAA,QAC3B,sBAAsB,WAAW;AAAA,QACjC,YAAY,cAAc;AAAA,QAC1B,iBAAiB,WAAW;AAAA,MAC9B,GAAG,MAAM,CAAC,CAAC;AAAA,IACb,OAAO;AACL,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,WAAW,kBAAkB,CAAC;AAC1C,cAAQ,IAAI,kBAAkB;AAC9B,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,uBAAuB,cAAc,cAAc,EAAE;AACjE,cAAQ,IAAI,uBAAuB,cAAc,YAAY,EAAE;AAC/D,cAAQ,IAAI,uBAAuB,WAAW,YAAY,EAAE;AAC5D,cAAQ,IAAI,uBAAuB,cAAc,mBAAmB,OAAO,EAAE;AAC7E,cAAQ,IAAI,EAAE;AAEd,UAAI,WAAW,gBAAgB;AAC7B,gBAAQ,IAAI,cAAc,GAAG,WAAW,YAAY,iCAAiC,CAAC;AACtF,mBAAW,WAAW,WAAW,iBAAiB;AAChD,gBAAM,YAAY,WAAW,KAAK,CAAC,MAAM,EAAE,YAAY,OAAO;AAC9D,kBAAQ,IAAI,QAAQ,OAAO,KAAK,WAAW,QAAQ,SAAS,EAAE;AAAA,QAChE;AACA,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,WAAW,2DAA2D,CAAC;AAAA,MACrF,OAAO;AACL,gBAAQ,IAAI,cAAc,wBAAwB,CAAC;AAAA,MACrD;AAGA,UAAI,QAAQ,WAAW,cAAc,WAAW,SAAS,GAAG;AAC1D,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,WAAW,qBAAqB,CAAC;AAC7C,cAAM,UAAU,CAAC,WAAW,MAAM,UAAU,YAAY;AACxD,cAAM,OAAO,cAAc,WAAW,IAAI,CAAC,MAAM;AAAA,UAC/C,EAAE,QAAQ,SAAS;AAAA,UACnB,EAAE;AAAA,UACF,EAAE;AAAA,UACF,EAAE;AAAA,QACJ,CAAC;AACD,gBAAQ,IAAI,YAAY,SAAS,IAAI,CAAC;AAAA,MACxC;AAGA,UAAI,QAAQ,WAAW,WAAW,SAAS,GAAG;AAC5C,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,WAAW,wBAAwB,CAAC;AAChD,cAAM,UAAU,CAAC,WAAW,MAAM,QAAQ,YAAY;AACtD,cAAM,OAAO,WAAW,IAAI,CAAC,MAAM;AAAA,UACjC,EAAE,QAAQ,SAAS;AAAA,UACnB,EAAE;AAAA,UACF,EAAE;AAAA,UACF,EAAE,OAAO,QAAQ;AAAA,QACnB,CAAC;AACD,gBAAQ,IAAI,YAAY,SAAS,IAAI,CAAC;AAAA,MACxC;AAAA,IACF;AAGA,QAAI,SAAS,YAAY,OAAO,SAAS,QAAQ,YAAY;AAC3D,YAAM,SAAS,IAAI;AAAA,IACrB;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,YAAY,qBAAqB,GAAG,iBAAiB,QAAQ,MAAM,UAAU,KAAK;AAChG,QAAI,QAAQ,WAAW,iBAAiB,SAAS,MAAM,OAAO;AAC5D,cAAQ,MAAM,MAAM,KAAK;AAAA,IAC3B;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;AChIA,IAAAC,oBAAwB;AACxB,IAAAC,kBAA2B;AAQ3B,eAAsB,mBAAmB,SAA2C;AAClF,QAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI,cAAc;AAErD,MAAI,CAAC,KAAK;AACR,YAAQ,MAAM,YAAY,0BAA0B,CAAC;AACrD,YAAQ,MAAM,WAAW,wDAAwD,CAAC;AAClF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,oBAAgB,2BAAQ,QAAQ,IAAI,GAAG,QAAQ,iBAAiB,cAAc;AAEpF,MAAI,KAAC,4BAAW,aAAa,GAAG;AAC9B,YAAQ,MAAM,YAAY,mCAAmC,aAAa,EAAE,CAAC;AAC7E,YAAQ,MAAM,WAAW,oEAAoE,CAAC;AAC9F,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI;AACF,UAAM,aAAa,4BAA4B,aAAa;AAG5D,UAAM,EAAE,yBAAyB,sBAAsB,IAAI,MAAM,OAAO,4BAA4B;AAGpG,UAAM,WAAW,wBAAwB,EAAE,WAA2E,CAAC;AAGvH,YAAQ,IAAI,WAAW,2BAA2B,CAAC;AACnD,UAAM,WAAW,MAAM,oBAAoB,GAAG;AAG9C,UAAM,SAAS,sBAAsB,UAAU,UAAU;AAAA,MACvD,GAAI,QAAQ,UAAU,EAAE,OAAO,QAAQ,QAAQ,IAAI,CAAC;AAAA,IACtD,CAAC;AAGD,UAAM,gBAAgB,MAAM,OAAO,iBAAiB;AAEpD,QAAI,cAAc,mBAAmB,GAAG;AACtC,cAAQ,IAAI,WAAW,2BAA2B,CAAC;AACnD;AAAA,IACF;AAGA,QAAI;AAEJ,QAAI,QAAQ,UAAU,QAAW;AAE/B,YAAM,kBAAkB,cAAc,WACnC,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS,EACpC,IAAI,CAAC,MAAM,EAAE,OAAO,EACpB,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAEvB,YAAM,kBAAkB,KAAK,IAAI,QAAQ,OAAO,gBAAgB,MAAM;AACtE,sBAAgB,mBAAmB,gBAAgB,SAC/C,IACA,gBAAgB,eAAe,KAAK;AAAA,IAC1C,WAAW,QAAQ,cAAc,QAAW;AAE1C,sBAAgB,QAAQ;AAAA,IAC1B,OAAO;AAEL,YAAM,kBAAkB,cAAc,WACnC,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS,EACpC,IAAI,CAAC,MAAM,EAAE,OAAO,EACpB,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAEvB,UAAI,gBAAgB,SAAS,GAAG;AAC9B,wBAAgB;AAAA,MAClB,OAAO;AACL,wBAAgB,gBAAgB,CAAC,KAAK;AAAA,MACxC;AAAA,IACF;AAEA,YAAQ,IAAI,WAAW,oBAAoB,cAAc,cAAc,EAAE,CAAC;AAC1E,YAAQ,IAAI,WAAW,mBAAmB,aAAa,EAAE,CAAC;AAG1D,UAAM,OAAO,MAAM,OAAO,aAAa,EAAE,WAAW,eAAe,GAAI,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC,EAAG,CAAC;AAEvH,QAAI,KAAK,WAAW,WAAW,GAAG;AAChC,UAAI,KAAK,SAAS,SAAS,GAAG;AAC5B,gBAAQ,IAAI,cAAc,+BAA+B,CAAC;AAC1D,mBAAW,WAAW,KAAK,UAAU;AACnC,kBAAQ,IAAI,QAAQ,QAAQ,OAAO,KAAK,QAAQ,EAAE,KAAK,QAAQ,MAAM,EAAE;AAAA,QACzE;AACA,YAAI,CAAC,QAAQ,OAAO;AAClB,kBAAQ,IAAI,WAAW,wCAAwC,CAAC;AAAA,QAClE;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,cAAQ,IAAI,WAAW,qBAAqB,CAAC;AAC7C;AAAA,IACF;AAGA,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,cAAc,iBAAiB,KAAK,WAAW,MAAM,gBAAgB,CAAC;AAClF,eAAW,aAAa,KAAK,YAAY;AACvC,YAAM,aAAa,UAAU,OAAO,QAAQ;AAC5C,cAAQ,IAAI,QAAQ,UAAU,OAAO,KAAK,UAAU,EAAE,iBAAiB,UAAU,GAAG;AAAA,IACtF;AACA,YAAQ,IAAI,EAAE;AAGd,QAAI,QAAQ,QAAQ;AAClB,cAAQ,IAAI,WAAW,gCAAgC,CAAC;AACxD,YAAMC,UAAS,MAAM,OAAO,SAAS;AAAA,QACnC,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,GAAI,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,MAClD,CAAC;AAED,UAAI,QAAQ,MAAM;AAChB,gBAAQ,IAAI,KAAK,UAAUA,SAAQ,MAAM,CAAC,CAAC;AAAA,MAC7C,OAAO;AACL,gBAAQ,IAAI,WAAW,+BAA+BA,QAAO,WAAW,OAAOA,QAAO,SAAS,EAAE,CAAC;AAClG,gBAAQ,IAAI,WAAW,kBAAkBA,QAAO,eAAe,eAAe,CAAC;AAAA,MACjF;AACA;AAAA,IACF;AAGA,YAAQ,IAAI,WAAW,iBAAiB,CAAC;AACzC,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,SAAS,MAAM,OAAO,SAAS;AAAA,MACnC,WAAW;AAAA,MACX,GAAI,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,MAChD,YAAY,CAAC,UAAU;AACrB,YAAI,QAAQ,WAAW,MAAM,UAAU,eAAe,MAAM,UAAU,UAAU;AAE9E,gBAAM,eAAe;AAAA,YACnB,WAAW,MAAM;AAAA,YACjB,OAAO,MAAM;AAAA,YACb,OAAO,MAAM;AAAA,YACb,OAAO,MAAM;AAAA,YACb,GAAI,MAAM,eAAe,UAAa,EAAE,YAAY,MAAM,WAAW;AAAA,YACrE,GAAI,MAAM,UAAU,UAAa,EAAE,OAAO,MAAM,MAAM;AAAA,YACtD,GAAI,MAAM,aAAa,UAAa,EAAE,UAAU,MAAM,SAAS;AAAA,UACjE;AACA,kBAAQ,IAAI,qBAAqB,YAAY,CAAC;AAAA,QAChD;AAAA,MACF;AAAA,IACF,CAAC;AACD,UAAM,WAAW,KAAK,IAAI,IAAI;AAG9B,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAC7C,OAAO;AACL,cAAQ,IAAI,EAAE;AACd,UAAI,OAAO,SAAS;AAClB,gBAAQ,IAAI,cAAc,4BAA4B,OAAO,eAAe,oBAAoB,eAAe,QAAQ,CAAC,EAAE,CAAC;AAC3H,gBAAQ,IAAI,WAAW,mBAAmB,OAAO,WAAW,OAAO,OAAO,SAAS,EAAE,CAAC;AAAA,MACxF,OAAO;AACL,gBAAQ,MAAM,YAAY,iBAAiB,CAAC;AAC5C,cAAM,eAAe,OAAO,QAAQ,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,EAAE,OAAO;AACxE,YAAI,cAAc;AAChB,kBAAQ,MAAM,YAAY,cAAc,aAAa,EAAE,EAAE,CAAC;AAC1D,kBAAQ,MAAM,YAAY,UAAU,aAAa,KAAK,EAAE,CAAC;AAAA,QAC3D;AACA,YAAI,OAAO,aAAa,OAAO,UAAU,SAAS,GAAG;AACnD,kBAAQ,IAAI,cAAc,aAAa,CAAC;AACxC,qBAAW,WAAW,OAAO,WAAW;AACtC,oBAAQ,IAAI,QAAQ,QAAQ,OAAO,KAAK,QAAQ,EAAE,KAAK,QAAQ,MAAM,EAAE;AAAA,UACzE;AAAA,QACF;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAGA,QAAI,SAAS,YAAY,OAAO,SAAS,QAAQ,YAAY;AAC3D,YAAM,SAAS,IAAI;AAAA,IACrB;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,YAAY,iBAAiB,GAAG,iBAAiB,QAAQ,MAAM,UAAU,KAAK;AAC5F,QAAI,QAAQ,WAAW,iBAAiB,SAAS,MAAM,OAAO;AAC5D,cAAQ,MAAM,MAAM,KAAK;AAAA,IAC3B;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;AChMA,IAAAC,oBAA8B;AAC9B,IAAAC,kBAAkE;AAOlE,SAAS,qBAAqB,SAKnB;AACT,QAAM,EAAE,IAAI,MAAM,SAAS,UAAU,IAAI;AAGzC,MAAI,QAAQ;AACZ,MAAI,UAAU;AAGd,QAAM,YAAY,KAAK,YAAY;AACnC,MAAI,UAAU,SAAS,QAAQ,KAAK,WAAW;AAC7C,YAAQ,8BAA8B,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAO/C,cAAU,wBAAwB,SAAS;AAAA,EAC7C,WAAW,UAAU,SAAS,KAAK,KAAK,WAAW;AACjD,YAAQ,eAAe,SAAS;AAAA;AAEhC,cAAU,eAAe,SAAS;AAAA;AAAA,EAEpC,WAAW,UAAU,SAAS,OAAO,KAAK,WAAW;AACnD,YAAQ,kCAAkC,SAAS,mBAAmB,SAAS;AAC/E,cAAU,4BAA4B,SAAS;AAAA,EACjD;AAEA,SAAO;AAAA,gBACO,IAAI;AAAA,cACN,OAAO;AAAA,SACZ,EAAE;AAAA;AAAA,wBAEa,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAMjB,EAAE;AAAA,WACA,IAAI;AAAA,aACF,OAAO;AAAA;AAAA,MAEd,KAAK;AAAA;AAAA;AAAA,MAGL,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYb;AAKA,SAAS,wBAAwB,SAKA;AAC/B,QAAM,EAAE,MAAM,UAAU,IAAI;AAE5B,MAAI,QAAQ;AACZ,MAAI,UAAU;AAEd,QAAM,YAAY,KAAK,YAAY;AACnC,MAAI,UAAU,SAAS,QAAQ,KAAK,WAAW;AAC7C,YAAQ,aAAa,SAAS;AAAA,6BACL,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQlC,cAAU,WAAW,SAAS;AAAA,uBACX,SAAS;AAAA;AAAA,EAE9B,WAAW,UAAU,SAAS,KAAK,KAAK,WAAW;AACjD,YAAQ,oBAAoB,SAAS;AAAA,cAC3B,SAAS;AAAA;AAAA;AAGnB,cAAU,yBAAyB,SAAS;AAAA,cAClC,SAAS;AAAA;AAAA;AAAA,EAGrB,WAAW,UAAU,SAAS,OAAO,KAAK,WAAW;AACnD,YAAQ,sBAAsB,SAAS;AAAA,iCACV,SAAS,mBAAmB,SAAS;AAAA;AAElE,cAAU,oBAAoB,SAAS;AAAA,2BAChB,SAAS;AAAA;AAAA,EAElC;AAEA,SAAO,EAAE,IAAI,OAAO,MAAM,QAAQ;AACpC;AAKA,SAAS,eAAe,eAA+B;AACrD,MAAI,KAAC,4BAAW,aAAa,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,QAAM,YAAQ,6BAAY,aAAa;AACvC,MAAI,aAAa;AAEjB,aAAW,QAAQ,OAAO;AAKxB,UAAM,QAAQ,KAAK,MAAM,QAAQ;AACjC,QAAI,SAAS,MAAM,CAAC,GAAG;AACrB,YAAM,UAAU,SAAS,MAAM,CAAC,GAAG,EAAE;AACrC,UAAI,UAAU,YAAY;AACxB,qBAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAEA,SAAO,aAAa;AACtB;AAKA,SAAS,YAAY,KAAqB;AACxC,SAAO,IACJ,QAAQ,mBAAmB,OAAO,EAClC,QAAQ,kBAAkB,GAAG,EAC7B,QAAQ,UAAU,EAAE,EACpB,YAAY;AACjB;AAKA,SAAS,iBAAiB,MAAkC;AAC1D,QAAM,YAAY,YAAY,IAAI;AAMlC,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,aAAW,WAAW,UAAU;AAC9B,UAAM,QAAQ,UAAU,MAAM,OAAO;AACrC,QAAI,SAAS,MAAM,CAAC,GAAG;AACrB,aAAO,MAAM,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,SAAO;AACT;AAKA,eAAsB,iBAAiB,SAA2C;AAChF,MAAI,CAAC,QAAQ,MAAM;AACjB,YAAQ,MAAM,YAAY,4BAA4B,CAAC;AACvD,YAAQ,MAAM,WAAW,8CAA8C,CAAC;AACxE,YAAQ,MAAM,WAAW,sDAAsD,CAAC;AAChF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,oBAAgB,2BAAQ,QAAQ,IAAI,GAAG,QAAQ,iBAAiB,cAAc;AAGpF,MAAI,KAAC,4BAAW,aAAa,GAAG;AAC9B,mCAAU,eAAe,EAAE,WAAW,KAAK,CAAC;AAC5C,YAAQ,IAAI,WAAW,iCAAiC,aAAa,EAAE,CAAC;AAAA,EAC1E;AAGA,QAAM,UAAU,eAAe,aAAa;AAC5C,QAAM,gBAAgB,QAAQ,SAAS,EAAE,SAAS,GAAG,GAAG;AAGxD,QAAM,YAAY,YAAY,QAAQ,IAAI;AAC1C,QAAM,KAAK,GAAG,aAAa,IAAI,SAAS;AAGxC,QAAM,YAAY,iBAAiB,QAAQ,IAAI;AAG/C,QAAM,SAAS,QAAQ,mBAAmB;AAE1C,MAAI,WAAW,OAAO;AAEpB,UAAM,mBAAe,wBAAK,eAAe,EAAE;AAC3C,mCAAU,cAAc,EAAE,WAAW,KAAK,CAAC;AAE3C,UAAM,EAAE,IAAI,KAAK,IAAI,wBAAwB;AAAA,MAC3C;AAAA,MACA,MAAM,QAAQ;AAAA,MACd;AAAA,MACA,GAAI,aAAa,OAAO,EAAE,UAAU,IAAI,CAAC;AAAA,IAC3C,CAAC;AAED,UAAM,aAAS,wBAAK,cAAc,QAAQ;AAC1C,UAAM,eAAW,wBAAK,cAAc,UAAU;AAE9C,uCAAc,QAAQ,EAAE;AACxB,uCAAc,UAAU,IAAI;AAE5B,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU;AAAA,QACzB;AAAA,QACA,MAAM,QAAQ;AAAA,QACd;AAAA,QACA,WAAW;AAAA,QACX,OAAO,CAAC,UAAU,UAAU;AAAA,MAC9B,GAAG,MAAM,CAAC,CAAC;AAAA,IACb,OAAO;AACL,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,cAAc,sBAAsB,EAAE,EAAE,CAAC;AACrD,cAAQ,IAAI,WAAW,cAAc,YAAY,EAAE,CAAC;AACpD,cAAQ,IAAI,WAAW,QAAQ,CAAC;AAChC,cAAQ,IAAI,OAAO,MAAM,EAAE;AAC3B,cAAQ,IAAI,OAAO,QAAQ,EAAE;AAC7B,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,WAAW,gDAAgD,CAAC;AAAA,IAC1E;AAAA,EACF,OAAO;AAEL,UAAM,WAAW,GAAG,EAAE;AACtB,UAAM,eAAW,wBAAK,eAAe,QAAQ;AAG7C,YAAI,4BAAW,QAAQ,GAAG;AACxB,cAAQ,MAAM,YAAY,kCAAkC,QAAQ,EAAE,CAAC;AACvE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,UAAU,qBAAqB;AAAA,MACnC;AAAA,MACA,MAAM,QAAQ;AAAA,MACd;AAAA,MACA,GAAI,aAAa,OAAO,EAAE,UAAU,IAAI,CAAC;AAAA,IAC3C,CAAC;AAED,uCAAc,UAAU,OAAO;AAE/B,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU;AAAA,QACzB;AAAA,QACA,MAAM,QAAQ;AAAA,QACd;AAAA,QACA,MAAM;AAAA,MACR,GAAG,MAAM,CAAC,CAAC;AAAA,IACb,OAAO;AACL,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,cAAc,sBAAsB,EAAE,EAAE,CAAC;AACrD,cAAQ,IAAI,WAAW,SAAS,QAAQ,EAAE,CAAC;AAC3C,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,WAAW,yCAAyC,CAAC;AAAA,IACnE;AAAA,EACF;AACF;;;ACtSA,IAAAC,oBAAwB;AACxB,IAAAC,kBAA2B;AAc3B,SAAS,eAAe,UAAgD;AACtE,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO,YAAY,OAAO;AAAA,IAC5B,KAAK;AACH,aAAO,cAAc,MAAM;AAAA,IAC7B,KAAK;AACH,aAAO,UAAU,MAAM;AAAA,IACzB;AACE,aAAO;AAAA,EACX;AACF;AAKA,eAAsB,mBAAmB,SAA2C;AAElF,QAAM,oBAAgB,2BAAQ,QAAQ,IAAI,GAAG,QAAQ,iBAAiB,cAAc;AAEpF,MAAI,KAAC,4BAAW,aAAa,GAAG;AAC9B,YAAQ,MAAM,YAAY,mCAAmC,aAAa,EAAE,CAAC;AAC7E,YAAQ,MAAM,WAAW,oEAAoE,CAAC;AAC9F,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,IAAI,WAAW,+BAA+B,aAAa,EAAE,CAAC;AAEtE,MAAI;AACF,UAAM,aAAa,4BAA4B,aAAa;AAE5D,QAAI,WAAW,WAAW,GAAG;AAC3B,cAAQ,IAAI,cAAc,qBAAqB,CAAC;AAChD;AAAA,IACF;AAEA,YAAQ,IAAI,WAAW,SAAS,WAAW,MAAM,2BAA2B,CAAC;AAC7E,YAAQ,IAAI,EAAE;AAGd,UAAM,EAAE,wBAAwB,IAAI,MAAM,OAAO,4BAA4B;AAC7E,UAAM,EAAE,yBAAyB,IAAI,MAAM,OAAO,sCAAsC;AAGxF,UAAM,WAAW,wBAAwB;AAAA,MACvC;AAAA,MACA,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,IACpB,CAAC;AAGD,UAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI,cAAc;AACrD,QAAI;AACJ,QAAI,OAAO,CAAC,QAAQ,QAAQ;AAC1B,cAAQ,IAAI,WAAW,iDAAiD,CAAC;AACzE,iBAAW,MAAM,oBAAoB,GAAG;AAAA,IAC1C;AAGA,UAAM,YAAY,yBAAyB;AAAA,MACzC,iBAAiB;AAAA,MACjB,qBAAqB;AAAA,MACrB,kBAAkB;AAAA,MAClB,gBAAgB;AAAA,MAChB,oBAAoB;AAAA,MACpB,GAAI,OAAO,CAAC,QAAQ,SAAS,EAAE,aAAa,KAAK,IAAI,CAAC;AAAA,MACtD,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,IACjC,CAAC;AAGD,YAAQ,IAAI,WAAW,8BAA8B,CAAC;AACtD,UAAM,SAAS,MAAM,UAAU,YAAY,QAAQ;AAGnD,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAC7C,OAAO;AAEL,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,oBAAoB;AAChC,cAAQ,IAAI,oBAAoB;AAChC,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,uBAAuB,WAAW,MAAM,EAAE;AACtD,cAAQ,IAAI,sBAAsB,OAAO,UAAU,EAAE;AACrD,cAAQ,IAAI,sBAAsB,OAAO,YAAY,EAAE;AACvD,cAAQ,IAAI,EAAE;AAGd,UAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,gBAAQ,IAAI,eAAe;AAC3B,gBAAQ,IAAI,EAAE;AAGd,cAAM,oBAAoB,oBAAI,IAAkC;AAChE,mBAAW,SAAS,OAAO,QAAQ;AACjC,gBAAM,WAAW,kBAAkB,IAAI,MAAM,WAAW,KAAK,CAAC;AAC9D,mBAAS,KAAK,KAAK;AACnB,4BAAkB,IAAI,MAAM,aAAa,QAAQ;AAAA,QACnD;AAEA,mBAAW,CAAC,aAAa,MAAM,KAAK,mBAAmB;AACrD,kBAAQ,IAAI,KAAK,WAAW,WAAW,CAAC,EAAE;AAC1C,qBAAW,SAAS,QAAQ;AAC1B,kBAAM,WAAW,eAAe,MAAM,QAAQ;AAC9C,oBAAQ,IAAI,OAAO,QAAQ,KAAK,MAAM,QAAQ,KAAK,MAAM,OAAO,EAAE;AAClE,gBAAI,MAAM,cAAc,QAAQ,SAAS;AACvC,sBAAQ,IAAI,YAAY,UAAU,eAAe,MAAM,UAAU,EAAE,CAAC,EAAE;AAAA,YACxE;AACA,gBAAI,MAAM,OAAO,QAAQ,SAAS;AAChC,oBAAM,eAAe,MAAM,IAAI,SAAS,KACpC,MAAM,IAAI,UAAU,GAAG,EAAE,IAAI,QAC7B,MAAM;AACV,sBAAQ,IAAI,YAAY,UAAU,QAAQ,YAAY,EAAE,CAAC,EAAE;AAAA,YAC7D;AAAA,UACF;AACA,kBAAQ,IAAI,EAAE;AAAA,QAChB;AAAA,MACF;AAGA,UAAI,OAAO,sBAAsB,SAAS,KAAK,QAAQ,SAAS;AAC9D,gBAAQ,IAAI,cAAc,sCAAsC,CAAC;AACjE,mBAAW,MAAM,OAAO,uBAAuB;AAC7C,kBAAQ,IAAI,OAAO,EAAE,EAAE;AAAA,QACzB;AACA,gBAAQ,IAAI,EAAE;AAAA,MAChB;AAGA,UAAI,OAAO,YAAY,SAAS,GAAG;AACjC,gBAAQ,IAAI,cAAc,wBAAwB,CAAC;AACnD,gBAAQ,IAAI,uBAAuB,OAAO,YAAY,KAAK,IAAI,CAAC,EAAE;AAClE,gBAAQ,IAAI,EAAE;AAAA,MAChB;AAGA,UAAI,OAAO,kBAAkB,SAAS,GAAG;AACvC,gBAAQ,IAAI,cAAc,uCAAuC,CAAC;AAClE,mBAAW,YAAY,OAAO,mBAAmB;AAC/C,kBAAQ,IAAI,OAAO,SAAS,aAAa,KAAK,IAAI,CAAC,EAAE;AAAA,QACvD;AACA,gBAAQ,IAAI,EAAE;AAAA,MAChB;AAGA,UAAI,QAAQ,SAAS;AACnB,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,oBAAoB;AAChC,gBAAQ,IAAI,EAAE;AAEd,mBAAW,aAAa,OAAO,SAAS;AACtC,gBAAM,SAAS,UAAU,QACrB,cAAc,OAAO,IACrB,YAAY,SAAS;AACzB,kBAAQ,IAAI,KAAK,MAAM,IAAI,UAAU,WAAW,EAAE;AAElD,cAAI,UAAU,eAAe,SAAS,GAAG;AACvC,oBAAQ,IAAI,eAAe,UAAU,eAAe,KAAK,IAAI,CAAC,EAAE;AAAA,UAClE;AAEA,cAAI,UAAU,WAAW,SAAS,GAAG;AACnC,kBAAM,MAAM,UAAU,WAAW,IAAI,CAAC,MAAwB,EAAE,IAAI,EAAE,KAAK,IAAI;AAC/E,oBAAQ,IAAI,mBAAmB,GAAG,EAAE;AAAA,UACtC;AAEA,gBAAM,iBAAiB,UAAU,WAAW,OAAO,CAAC,MAAkC,EAAE,aAAa;AACrG,cAAI,eAAe,SAAS,GAAG;AAC7B,oBAAQ,IAAI,OAAO,cAAc,2BAA2B,eAAe,MAAM,EAAE,CAAC,EAAE;AAAA,UACxF;AAAA,QACF;AACA,gBAAQ,IAAI,EAAE;AAAA,MAChB;AAGA,UAAI,OAAO,OAAO;AAChB,gBAAQ,IAAI,cAAc,kCAAkC,CAAC;AAAA,MAC/D,OAAO;AACL,gBAAQ,IAAI,YAAY,0BAA0B,OAAO,UAAU,WAAW,CAAC;AAC/E,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAGA,QAAI,YAAY,SAAS,UAAU;AACjC,YAAO,SAA0C,IAAI;AAAA,IACvD;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,YAAY,mBAAmB,GAAG,iBAAiB,QAAQ,MAAM,UAAU,KAAK;AAC9F,QAAI,QAAQ,WAAW,iBAAiB,SAAS,MAAM,OAAO;AAC5D,cAAQ,MAAM,MAAM,KAAK;AAAA,IAC3B;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;ACjNA,IAAAC,oBAAwB;AACxB,IAAAC,kBAA2B;AAc3B,eAAsB,iBAAiB,SAA2C;AAChF,QAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI,cAAc;AAErD,MAAI,CAAC,KAAK;AACR,YAAQ,MAAM,YAAY,0BAA0B,CAAC;AACrD,YAAQ,MAAM,WAAW,wDAAwD,CAAC;AAClF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,oBAAgB,2BAAQ,QAAQ,IAAI,GAAG,QAAQ,iBAAiB,cAAc;AAEpF,MAAI,KAAC,4BAAW,aAAa,GAAG;AAC9B,YAAQ,MAAM,YAAY,mCAAmC,aAAa,EAAE,CAAC;AAC7E,YAAQ,MAAM,WAAW,oEAAoE,CAAC;AAC9F,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,IAAI,WAAW,4BAA4B,aAAa,EAAE,CAAC;AAEnE,MAAI;AACF,UAAM,aAAa,4BAA4B,aAAa;AAE5D,QAAI,WAAW,WAAW,GAAG;AAC3B,cAAQ,IAAI,WAAW,qBAAqB,CAAC;AAC7C;AAAA,IACF;AAEA,YAAQ,IAAI,WAAW,SAAS,WAAW,MAAM,eAAe,CAAC;AAGjE,UAAM,EAAE,yBAAyB,sBAAsB,IAAI,MAAM,OAAO,4BAA4B;AACpG,UAAM,EAAE,yBAAyB,IAAI,MAAM,OAAO,sCAAsC;AAGxF,UAAM,WAAW,wBAAwB;AAAA,MACvC;AAAA,MACA,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,IACpB,CAAC;AAGD,YAAQ,IAAI,WAAW,2BAA2B,CAAC;AACnD,UAAM,WAAW,MAAM,oBAAoB,GAAG;AAG9C,UAAM,SAAS,sBAAsB,UAAU,UAAU;AAAA,MACvD,GAAI,QAAQ,UAAU,EAAE,OAAO,QAAQ,QAAQ,IAAI,CAAC;AAAA,IACtD,CAAC;AAGD,UAAM,gBAAgB,MAAM,OAAO,iBAAiB;AACpD,UAAM,aAAa,MAAM,OAAO,eAAe;AAG/C,QAAI,QAAQ,MAAM;AAChB,YAAM,oBAAoB,WAAW;AAAA,QAAO,CAAC,MAC3C,WAAW,gBAAgB,SAAS,EAAE,OAAO;AAAA,MAC/C;AAEA,cAAQ,IAAI,KAAK,UAAU;AAAA,QACzB,gBAAgB,cAAc;AAAA,QAC9B,eAAe,SAAS,iBAAiB;AAAA,QACzC,cAAc,WAAW;AAAA,QACzB,gBAAgB,WAAW;AAAA,QAC3B,mBAAmB,kBAAkB,IAAI,CAAC,OAAO;AAAA,UAC/C,IAAI,EAAE;AAAA,UACN,MAAM,EAAE;AAAA,UACR,SAAS,EAAE;AAAA,UACX,SAAS,CAAC,CAAC,EAAE;AAAA,UACb,OAAO,EAAE;AAAA,UACT,SAAS,EAAE;AAAA,QACb,EAAE;AAAA,MACJ,GAAG,MAAM,CAAC,CAAC;AAAA,IACb,OAAO;AACL,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,mBAAmB;AAC/B,cAAQ,IAAI,mBAAmB;AAC/B,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,oBAAoB,cAAc,cAAc,EAAE;AAC9D,cAAQ,IAAI,oBAAoB,SAAS,iBAAiB,CAAC,EAAE;AAC7D,cAAQ,IAAI,EAAE;AAEd,UAAI,CAAC,WAAW,gBAAgB;AAC9B,gBAAQ,IAAI,cAAc,+CAA+C,CAAC;AAAA,MAC5E,OAAO;AACL,gBAAQ,IAAI,cAAc,GAAG,WAAW,YAAY,iCAAiC,CAAC;AACtF,gBAAQ,IAAI,EAAE;AAGd,cAAM,oBAAoB,WAAW;AAAA,UAAO,CAAC,MAC3C,WAAW,gBAAgB,SAAS,EAAE,OAAO;AAAA,QAC/C,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,OAAO;AAGtC,cAAM,YAAY,yBAAyB;AAE3C,mBAAW,aAAa,mBAAmB;AACzC,kBAAQ,IAAI,KAAK,WAAW,IAAI,UAAU,OAAO,KAAK,UAAU,IAAI,EAAE,CAAC,EAAE;AACzE,kBAAQ,IAAI,KAAK,UAAU,OAAO,UAAU,EAAE,EAAE,CAAC,EAAE;AAGnD,gBAAM,aAAa,UAAU,iBAAiB,UAAU,EAAE;AAC1D,gBAAM,SAAS,UAAU,kBAAkB,UAAU,EAAE;AAEvD,cAAI,OAAO,SAAS,GAAG;AACrB,oBAAQ,IAAI,KAAK,UAAU,WAAW,OAAO,KAAK,IAAI,CAAC,EAAE,CAAC,EAAE;AAAA,UAC9D;AAEA,cAAI,WAAW,SAAS,GAAG;AACzB,kBAAM,UAAU,CAAC,GAAG,IAAI,IAAI,WAAW,IAAI,CAAC,MAAwB,EAAE,IAAI,CAAC,CAAC;AAC5E,oBAAQ,IAAI,KAAK,UAAU,eAAe,QAAQ,KAAK,IAAI,CAAC,EAAE,CAAC,EAAE;AAGjE,kBAAM,cAAc,WAAW,OAAO,CAAC,MAAkC,EAAE,aAAa;AACxF,gBAAI,YAAY,SAAS,GAAG;AAC1B,sBAAQ,IAAI,KAAK,cAAc,kCAAkC,CAAC,EAAE;AAAA,YACtE;AAAA,UACF;AAEA,cAAI,CAAC,UAAU,MAAM;AACnB,oBAAQ,IAAI,KAAK,cAAc,yBAAyB,CAAC,EAAE;AAAA,UAC7D;AAGA,cAAI,QAAQ,SAAS;AACnB,oBAAQ,IAAI,EAAE;AACd,oBAAQ,IAAI,mBAAmB;AAC/B,kBAAM,QAAQ,UAAU,GAAG,KAAK,EAAE,MAAM,IAAI;AAC5C,uBAAW,QAAQ,OAAO;AACxB,sBAAQ,IAAI,OAAO,UAAU,IAAI,CAAC,EAAE;AAAA,YACtC;AAAA,UACF;AAEA,kBAAQ,IAAI,EAAE;AAAA,QAChB;AAGA,gBAAQ,IAAI,WAAW,yDAAyD,CAAC;AAAA,MACnF;AAAA,IACF;AAGA,QAAI,SAAS,YAAY,OAAO,SAAS,QAAQ,YAAY;AAC3D,YAAM,SAAS,IAAI;AAAA,IACrB;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,YAAY,gBAAgB,GAAG,iBAAiB,QAAQ,MAAM,UAAU,KAAK;AAC3F,QAAI,QAAQ,WAAW,iBAAiB,SAAS,MAAM,OAAO;AAC5D,cAAQ,MAAM,MAAM,KAAK;AAAA,IAC3B;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;ACvFA,IAAM,wBAAN,MAA4B;AAAA,EAC1B,YACU,QACA,QACR;AAFQ;AACA;AAAA,EACP;AAAA,EAEH,MAAc,MAAS,MAAc,SAAmC;AACtE,UAAM,MAAM,GAAG,KAAK,MAAM,GAAG,IAAI;AACjC,UAAM,UAAkC;AAAA,MACtC,gBAAgB;AAAA,IAClB;AAEA,QAAI,KAAK,QAAQ;AACf,cAAQ,eAAe,IAAI,UAAU,KAAK,MAAM;AAAA,IAClD;AAEA,UAAM,WAAW,MAAM,WAAW,MAAM,KAAK;AAAA,MAC3C,GAAG;AAAA,MACH,SAAS;AAAA,QACP,GAAG;AAAA,QACH,GAAG,SAAS;AAAA,MACd;AAAA,IACF,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,YAAM,IAAI,MAAM,uBAAuB,SAAS,MAAM,IAAI,KAAK,EAAE;AAAA,IACnE;AAEA,WAAO,SAAS,KAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAA6C;AACjD,WAAO,KAAK,MAA8B,wBAAwB;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBACJ,SACA,SACsD;AACtD,UAAM,SAAS,IAAI,gBAAgB;AACnC,WAAO,IAAI,WAAW,QAAQ,SAAS,CAAC;AACxC,QAAI,SAAS,MAAO,QAAO,IAAI,SAAS,QAAQ,MAAM,SAAS,CAAC;AAChE,QAAI,SAAS,OAAQ,QAAO,IAAI,UAAU,QAAQ,OAAO,SAAS,CAAC;AAEnE,WAAO,KAAK;AAAA,MACV,uBAAuB,OAAO,SAAS,CAAC;AAAA,IAC1C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB,SAG+B;AACvD,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,SAAS,MAAO,QAAO,IAAI,SAAS,QAAQ,MAAM,SAAS,CAAC;AAChE,QAAI,SAAS,OAAQ,QAAO,IAAI,UAAU,QAAQ,OAAO,SAAS,CAAC;AAEnE,WAAO,KAAK;AAAA,MACV,0BAA0B,OAAO,SAAS,CAAC;AAAA,IAC7C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAuD;AAC3D,WAAO,KAAK,MAAmC,4BAA4B;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,aAAyD;AAC1E,WAAO,KAAK,MAAiC,8BAA8B,WAAW,EAAE;AAAA,EAC1F;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,aAAmD;AACnE,WAAO,KAAK,MAA2B,8BAA8B,WAAW,UAAU;AAAA,MACxF,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACF;AAKA,SAAS,0BACP,cACA,OACA,gBACQ;AACR,QAAM,QAAkB,CAAC;AAGzB,QAAM,WAAW,OAAO,KAAK,YAAY,EACtC,IAAI,MAAM,EACV,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAEvB,aAAW,WAAW,UAAU;AAC9B,UAAM,QAAQ,aAAa,QAAQ,SAAS,CAAC,KAAK;AAClD,UAAM,UAAU,QAAQ,IAAI,KAAK,MAAO,QAAQ,QAAS,GAAG,IAAI;AAChE,UAAM,YAAY,YAAY;AAC9B,UAAM,QAAQ,YAAY,IAAI,OAAO,eAAe,IAAI,OAAO;AAC/D,UAAM,MAAM,kBAAkB,OAAO,OAAO,EAAE;AAE9C,UAAM,KAAK,KAAK,MAAM,OAAO,EAAE,CAAC,IAAI,GAAG,IAAI,MAAM,eAAe,CAAC,KAAK,OAAO,IAAI;AAAA,EACnF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAKA,SAAS,oBAAoB,QAAwC;AACnE,QAAM,QAAkB,CAAC;AAEzB,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,WAAW,4BAA4B,CAAC;AACnD,QAAM,KAAK,4BAA4B;AACvC,QAAM,KAAK,EAAE;AAGb,QAAM,KAAK,uBAAuB,OAAO,SAAS,eAAe,CAAC,EAAE;AACpE,QAAM,KAAK,EAAE;AAGb,QAAM,KAAK,uBAAuB;AAClC,QAAM,KAAK,0BAA0B,OAAO,qBAAqB,OAAO,UAAU,OAAO,cAAc,CAAC;AACxG,QAAM,KAAK,EAAE;AAGb,MAAI,OAAO,mBAAmB,GAAG;AAC/B,UAAM,iBAAkB,OAAO,mBAAmB,OAAO,WAAY,KAAK,QAAQ,CAAC;AACnF,UAAM,KAAK,cAAc,sBAAsB,OAAO,gBAAgB,KAAK,aAAa,IAAI,CAAC;AAAA,EAC/F,OAAO;AACL,UAAM,KAAK,cAAc,sBAAsB,CAAC;AAAA,EAClD;AAEA,MAAI,OAAO,oBAAoB,GAAG;AAChC,UAAM,KAAK,WAAW,wBAAwB,OAAO,iBAAiB,EAAE,CAAC;AAAA,EAC3E;AAEA,QAAM,KAAK,EAAE;AAGb,MAAI,OAAO,oBAAoB,GAAG;AAChC,UAAM,KAAK,uBAAuB,OAAO,kBAAkB,eAAe,CAAC,WAAW;AAEtF,QAAI,OAAO,6BAA6B,QAAQ,OAAO,2BAA2B,GAAG;AACnF,YAAM,KAAK,wBAAwB,eAAe,OAAO,wBAAwB,CAAC,EAAE;AAAA,IACtF;AAAA,EACF;AAGA,QAAM,KAAK,EAAE;AACb,MAAI,OAAO,oBAAoB,KAAK;AAClC,UAAM,KAAK,cAAc,4CAA4C,CAAC;AAAA,EACxE,OAAO;AACL,UAAM,cAAc,kBAAkB,OAAO,iBAAiB,KAAK,EAAE;AACrE,UAAM,KAAK,uBAAuB,WAAW,EAAE;AAAA,EACjD;AAEA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,UAAU,iBAAiB,IAAI,KAAK,OAAO,WAAW,EAAE,eAAe,CAAC,EAAE,CAAC;AAEtF,SAAO,MAAM,KAAK,IAAI;AACxB;AAKA,SAAS,uBAAuB,QAAqC;AACnE,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO,cAAc,sBAAsB;AAAA,EAC7C;AAEA,QAAM,UAAU,CAAC,SAAS,WAAW,SAAS,cAAc;AAC5D,QAAM,OAAO,OAAO,IAAI,CAAC,MAAM;AAAA,IAC7B,EAAE;AAAA,IACF,EAAE,QAAQ,SAAS;AAAA,IACnB,EAAE,QAAS,EAAE,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,GAAG,EAAE,IAAI,QAAQ,EAAE,QAAS;AAAA,IAC3E,EAAE,eAAe;AAAA,EACnB,CAAC;AAED,SAAO,YAAY,SAAS,IAAI;AAClC;AAKA,SAAS,qBAAqB,YAAiD;AAC7E,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO,UAAU,+BAA+B;AAAA,EAClD;AAEA,QAAM,UAAU,CAAC,MAAM,UAAU,UAAU,YAAY,WAAW,cAAc;AAChF,QAAM,OAAO,WAAW,IAAI,CAAC,OAAO;AAClC,UAAM,WAAW,GAAG,WAAW,IAC3B,GAAG,GAAG,YAAY,IAAI,GAAG,QAAQ,KAAK,KAAK,MAAO,GAAG,eAAe,GAAG,WAAY,GAAG,CAAC,OACvF;AAEJ,WAAO;AAAA,MACL,GAAG;AAAA,MACH,IAAI,GAAG,aAAa;AAAA,MACpB,GAAG;AAAA,MACH;AAAA,MACA,GAAG,YAAY,IAAI,KAAK,GAAG,SAAS,EAAE,mBAAmB,IAAI;AAAA,MAC7D,GAAG,eAAe;AAAA,IACpB;AAAA,EACF,CAAC;AAED,SAAO,YAAY,SAAS,IAAI;AAClC;AAKA,eAAsB,oBAAoB,SAAoD;AAC5F,QAAM,SAAS,QAAQ,UAAU,QAAQ,IAAI,qBAAqB,KAAK;AACvE,QAAM,SAAS,QAAQ,UAAU,QAAQ,IAAI,qBAAqB;AAElE,MAAI,CAAC,QAAQ;AACX,YAAQ,MAAM,YAAY,qBAAqB,CAAC;AAChD,YAAQ,MAAM,WAAW,mEAAmE,CAAC;AAC7F,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,IAAI,sBAAsB,QAAQ,MAAM;AAEvD,MAAI;AAEF,QAAI,QAAQ,YAAY;AAEtB,cAAQ,IAAI,WAAW,+BAA+B,CAAC;AACvD,YAAM,EAAE,KAAK,MAAM,IAAI,MAAM,OAAO,oBAAoB,QAAQ,UAAU,SAAY,EAAE,OAAO,QAAQ,MAAM,IAAI,MAAS;AAE1H,UAAI,QAAQ,MAAM;AAChB,gBAAQ,IAAI,KAAK,UAAU,EAAE,KAAK,MAAM,GAAG,MAAM,CAAC,CAAC;AAAA,MACrD,OAAO;AACL,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,cAAc,sBAAsB,KAAK,SAAS,CAAC;AAC/D,gBAAQ,IAAI,IAAI,OAAO,EAAE,CAAC;AAC1B,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,uBAAuB,GAAG,CAAC;AAAA,MACzC;AACA;AAAA,IACF;AAEA,QAAI,QAAQ,gBAAgB,QAAW;AAErC,cAAQ,IAAI,WAAW,2BAA2B,QAAQ,WAAW,KAAK,CAAC;AAC3E,YAAM,EAAE,KAAK,MAAM,IAAI,MAAM,OAAO,gBAAgB,QAAQ,aAAa,QAAQ,UAAU,SAAY,EAAE,OAAO,QAAQ,MAAM,IAAI,MAAS;AAE3I,UAAI,QAAQ,MAAM;AAChB,gBAAQ,IAAI,KAAK,UAAU,EAAE,KAAK,MAAM,GAAG,MAAM,CAAC,CAAC;AAAA,MACrD,OAAO;AACL,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,WAAW,kBAAkB,QAAQ,WAAW,KAAK,KAAK,SAAS,CAAC;AAChF,gBAAQ,IAAI,IAAI,OAAO,EAAE,CAAC;AAC1B,gBAAQ,IAAI,EAAE;AAEd,cAAM,UAAU,CAAC,SAAS,UAAU,gBAAgB,UAAU;AAC9D,cAAM,OAAO,IAAI,IAAI,CAAC,MAAM;AAAA,UAC1B,EAAE;AAAA,UACF,EAAE;AAAA,UACF,EAAE,eAAe;AAAA,UACjB,EAAE,kBAAkB,eAAe,EAAE,eAAe,IAAI;AAAA,QAC1D,CAAC;AAED,gBAAQ,IAAI,YAAY,SAAS,IAAI,CAAC;AAAA,MACxC;AACA;AAAA,IACF;AAEA,QAAI,QAAQ,gBAAgB;AAE1B,cAAQ,IAAI,WAAW,kCAAkC,CAAC;AAC1D,YAAM,aAAa,MAAM,OAAO,eAAe;AAE/C,UAAI,QAAQ,MAAM;AAChB,gBAAQ,IAAI,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC;AAAA,MACjD,OAAO;AACL,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,WAAW,sBAAsB,CAAC;AAC9C,gBAAQ,IAAI,IAAI,OAAO,EAAE,CAAC;AAC1B,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,qBAAqB,UAAU,CAAC;AAAA,MAC9C;AACA;AAAA,IACF;AAEA,QAAI,QAAQ,aAAa;AAEvB,cAAQ,IAAI,WAAW,sBAAsB,QAAQ,WAAW,KAAK,CAAC;AACtE,YAAM,YAAY,MAAM,OAAO,aAAa,QAAQ,WAAW;AAE/D,UAAI,QAAQ,MAAM;AAChB,gBAAQ,IAAI,KAAK,UAAU,WAAW,MAAM,CAAC,CAAC;AAAA,MAChD,OAAO;AACL,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,WAAW,wBAAwB,UAAU,WAAW,EAAE,CAAC;AACvE,gBAAQ,IAAI,IAAI,OAAO,EAAE,CAAC;AAC1B,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,oBAAoB,UAAU,aAAa,EAAE;AACzD,gBAAQ,IAAI,mBAAmB,UAAU,MAAM,EAAE;AACjD,gBAAQ,IAAI,mBAAmB,UAAU,QAAQ,EAAE;AACnD,gBAAQ,IAAI,mBAAmB,UAAU,YAAY,EAAE;AACvD,gBAAQ,IAAI,mBAAmB,UAAU,SAAS,EAAE;AACpD,gBAAQ,IAAI,mBAAmB,UAAU,SAAS,EAAE;AACpD,YAAI,UAAU,aAAa;AACzB,kBAAQ,IAAI,mBAAmB,UAAU,WAAW,EAAE;AAAA,QACxD;AACA,YAAI,UAAU,aAAa;AACzB,kBAAQ,IAAI,mBAAmB,UAAU,WAAW,EAAE;AAAA,QACxD;AACA,gBAAQ,IAAI,EAAE;AACd,cAAM,WAAW,UAAU,WAAW,IAClC,KAAK,MAAO,UAAU,eAAe,UAAU,WAAY,GAAG,IAC9D;AACJ,gBAAQ,IAAI,aAAa,kBAAkB,UAAU,KAAK,EAAE,CAAC,EAAE;AAAA,MACjE;AACA;AAAA,IACF;AAEA,QAAI,QAAQ,OAAO;AAEjB,cAAQ,IAAI,WAAW,4CAA4C,QAAQ,KAAK,KAAK,CAAC;AACtF,YAAM,SAAS,MAAM,OAAO,YAAY,QAAQ,KAAK;AAErD,UAAI,QAAQ,MAAM;AAChB,gBAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,MAC7C,OAAO;AACL,gBAAQ,IAAI,cAAc,UAAU,OAAO,OAAO,8BAA8B,CAAC;AAAA,MACnF;AACA;AAAA,IACF;AAGA,QAAI,QAAQ,OAAO;AAEjB,YAAM,kBAAkB,QAAQ,mBAAmB;AAEnD,cAAQ,IAAI,WAAW,mDAAmD,kBAAkB,GAAI,OAAO,CAAC;AACxG,cAAQ,IAAI,UAAU,sBAAsB,CAAC;AAC7C,cAAQ,IAAI,EAAE;AAEd,YAAM,eAAe,YAA2B;AAC9C,YAAI;AACF,gBAAM,SAAS,MAAM,OAAO,UAAU;AAGtC,kBAAQ,OAAO,MAAM,eAAe;AAEpC,cAAI,QAAQ,MAAM;AAChB,oBAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,UAC7C,OAAO;AACL,oBAAQ,IAAI,oBAAoB,MAAM,CAAC;AAAA,UACzC;AAAA,QACF,SAAS,OAAO;AACd,kBAAQ,MAAM,YAAY,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,KAAK,EAAE,CAAC;AAAA,QACxG;AAAA,MACF;AAGA,YAAM,aAAa;AAGnB,YAAM,aAAa,YAAY,MAAM,KAAK,aAAa,GAAG,eAAe;AAGzE,cAAQ,GAAG,UAAU,MAAM;AACzB,sBAAc,UAAU;AACxB,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,WAAW,mBAAmB,CAAC;AAC3C,gBAAQ,KAAK,CAAC;AAAA,MAChB,CAAC;AAGD,YAAM,IAAI,QAAQ,MAAM;AAAA,MAAC,CAAC;AAAA,IAC5B,OAAO;AAEL,cAAQ,IAAI,WAAW,8BAA8B,CAAC;AACtD,YAAM,SAAS,MAAM,OAAO,UAAU;AAEtC,UAAI,QAAQ,MAAM;AAChB,gBAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,MAC7C,OAAO;AACL,gBAAQ,IAAI,oBAAoB,MAAM,CAAC;AAAA,MACzC;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,YAAY,oBAAoB,iBAAiB,QAAQ,MAAM,UAAU,KAAK,EAAE,CAAC;AAC/F,QAAI,QAAQ,WAAW,iBAAiB,SAAS,MAAM,OAAO;AAC5D,cAAQ,MAAM,MAAM,KAAK;AAAA,IAC3B;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;AC5eA,IAAAC,oBAAwB;AACxB,IAAAC,kBAAqD;AAYrD,+BAaO;AA8FP,IAAM,2BAA2B;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKA,eAAsB,mBAAmB,SAAgD;AACvF,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,SAA0B;AAAA,IAC9B,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAGA,QAAM,eAAW,yCAAe,QAAQ,gBAAgB;AACxD,MAAI,aAAa,QAAQ;AACvB,YAAQ,MAAM,YAAY,yDAAyD,CAAC;AACpF,YAAQ,MAAM,WAAW,sBAAsB,QAAQ,EAAE,CAAC;AAC1D,YAAQ,MAAM,WAAW,yDAAyD,CAAC;AACnF,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,oBAAoB,UAAU,SAAS,CAAC,CAAC;AAAA,IAC/F;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,gBAAY,2BAAQ,QAAQ,IAAI,GAAG,QAAQ,aAAa,oBAAoB;AAElF,MAAI,CAAC,QAAQ,MAAM;AACjB,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,WAAW,+BAA+B,CAAC;AACvD,YAAQ,IAAI,UAAU,6CAA6C,CAAC;AACpE,YAAQ,IAAI,EAAE;AAAA,EAChB;AAEA,QAAM,eAAW,iDAAuB;AAExC,MAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS;AACpC,aAAS,WAAW,CAAC,UAAU;AAC7B,cAAQ,IAAI,eAAe,IAAI,MAAM,KAAK,KAAK,MAAM,QAAQ,OAAO,MAAM,WAAW,EAAE,EAAE,CAAC;AAAA,IAC5F,CAAC;AAAA,EACH;AAEA,MAAI;AAEF,aAAS,WAAW,eAAe;AACnC,QAAI,CAAC,QAAQ,MAAM;AACjB,cAAQ,IAAI,WAAW,+BAA+B,CAAC;AAAA,IACzD;AAEA,UAAM,gBAAqC;AAAA,MACzC,kBAAkB,QAAQ;AAAA,MAC1B,aAAa;AAAA,MACb,cAAc;AAAA,MACd,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,mBAAmB;AAAA,MACnB,GAAI,QAAQ,UAAU,EAAE,QAAQ,QAAQ,OAAO;AAAA,MAC/C,GAAI,QAAQ,iBAAiB,EAAE,eAAe,QAAQ,cAAc;AAAA,IACtE;AAEA,UAAM,SAAS,UAAM,uCAAa,aAAa;AAC/C,aAAS,SAAS,eAAe;AAEjC,WAAO,SAAS;AAAA,MACd,QAAQ,OAAO,OAAO;AAAA,MACtB,OAAO,OAAO,MAAM;AAAA,MACpB,WAAW,OAAO,UAAU;AAAA,MAC5B,UAAU,OAAO,SAAS;AAAA,MAC1B,YAAY,OAAO;AAAA,IACrB;AAEA,QAAI,CAAC,QAAQ,MAAM;AACjB,cAAQ,IAAI,cAAc,YAAY,OAAO,OAAO,MAAM,YAAY,OAAO,MAAM,MAAM,QAAQ,CAAC;AAAA,IACpG;AAGA,QAAI,QAAQ,UAAU;AACpB,eAAS,WAAW,YAAY;AAChC,UAAI,CAAC,QAAQ,MAAM;AACjB,gBAAQ,IAAI,WAAW,oCAAoC,CAAC;AAAA,MAC9D;AAEA,YAAM,iBAAa,sDAA4B,MAAM;AACrD,eAAS,SAAS,YAAY;AAE9B,aAAO,aAAa;AAAA,QAClB,cAAc,WAAW;AAAA,QACzB,YAAY,WAAW;AAAA,QACvB,cAAc,WAAW;AAAA,QACzB,iBAAiB,WAAW;AAAA,MAC9B;AAEA,UAAI,CAAC,QAAQ,MAAM;AACjB,YAAI,WAAW,cAAc;AAC3B,kBAAQ,IAAI,cAAc,kCAAkC,CAAC;AAAA,QAC/D,OAAO;AACL,kBAAQ,IAAI,cAAc,cAAc,WAAW,UAAU,uBAAuB,CAAC;AAAA,QACvF;AAEA,YAAI,WAAW,eAAe,KAAK,QAAQ,SAAS;AAClD,kBAAQ,IAAI,cAAc,GAAG,WAAW,YAAY,oBAAoB,CAAC;AACzE,qBAAW,OACR,OAAO,CAAC,MAAM,EAAE,aAAa,SAAS,EACtC,MAAM,GAAG,CAAC,EACV,QAAQ,CAAC,UAAU;AAClB,oBAAQ,IAAI,UAAU,OAAO,MAAM,OAAO,EAAE,CAAC;AAAA,UAC/C,CAAC;AAAA,QACL;AAAA,MACF;AAAA,IACF;AAGA,aAAS,WAAW,kBAAkB;AACtC,QAAI,CAAC,QAAQ,MAAM;AACjB,cAAQ,IAAI,WAAW,mCAAmC,CAAC;AAAA,IAC7D;AAEA,UAAM,cAAc,UAAM,0CAAgB,QAAQ;AAAA,MAChD,cAAc;AAAA,IAChB,CAAC;AACD,aAAS,SAAS,kBAAkB;AAEpC,WAAO,YAAY;AAAA,MACjB,UAAU,YAAY,SAAS;AAAA,MAC/B,uBAAuB,YAAY,yBAAyB,CAAC;AAAA,IAC/D;AAEA,QAAI,CAAC,QAAQ,QAAQ,YAAY,SAAS,SAAS,KAAK,QAAQ,SAAS;AACvE,cAAQ,IAAI,cAAc,GAAG,YAAY,SAAS,MAAM,0BAA0B,CAAC;AAAA,IACrF;AAGA,QAAI,CAAC,QAAQ,QAAQ;AACnB,aAAO,cAAc,CAAC;AAGtB,UAAI,KAAC,4BAAW,SAAS,GAAG;AAC1B,uCAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,MAC1C;AAGA,YAAM,iBAAa,2BAAQ,WAAW,YAAY;AAClD,yCAAc,YAAY,YAAY,GAAG;AACzC,aAAO,YAAY,KAAK,UAAU;AAGlC,YAAM,qBAAiB,2BAAQ,WAAW,aAAa;AACvD,yCAAc,gBAAgB,KAAK,UAAU,YAAY,QAAQ,MAAM,CAAC,CAAC;AACzE,aAAO,YAAY,KAAK,cAAc;AAGtC,UAAI,OAAO,YAAY;AACrB,cAAM,qBAAiB,2BAAQ,WAAW,wBAAwB;AAClE,2CAAc,gBAAgB,KAAK,UAAU,OAAO,YAAY,MAAM,CAAC,CAAC;AACxE,eAAO,YAAY,KAAK,cAAc;AAAA,MACxC;AAEA,UAAI,CAAC,QAAQ,MAAM;AACjB,gBAAQ,IAAI,cAAc,sBAAsB,SAAS,EAAE,CAAC;AAC5D,eAAO,YAAY,QAAQ,CAAC,MAAM;AAChC,kBAAQ,IAAI,UAAU,OAAO,CAAC,EAAE,CAAC;AAAA,QACnC,CAAC;AAAA,MACH;AAAA,IACF,OAAO;AACL,UAAI,CAAC,QAAQ,MAAM;AACjB,gBAAQ,IAAI,WAAW,4BAA4B,CAAC;AAAA,MACtD;AAAA,IACF;AAGA,QAAI,QAAQ,eAAe,CAAC,QAAQ,QAAQ;AAC1C,eAAS,WAAW,gBAAgB;AACpC,UAAI,CAAC,QAAQ,MAAM;AACjB,gBAAQ,IAAI,WAAW,4BAA4B,CAAC;AAAA,MACtD;AAEA,YAAM,WAAW,IAAI,sCAAa;AAAA,QAChC,kBAAkB,QAAQ;AAAA,QAC1B,kBAAkB;AAAA,MACpB,CAAC;AAED,YAAM,aAAa,MAAM,SAAS,WAAW;AAAA,QAC3C,QAAQ,YAAY;AAAA,QACpB,YAAY,CAAC,UAAyB;AACpC,cAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS;AACpC,oBAAQ;AAAA,cACN;AAAA,gBACE,IAAI,MAAM,KAAK,KAAK,MAAM,QAAQ,OAAO,MAAM,SAAS,SAAS,EAAE,KAAK,MAAM,SAAS,iBAAiB,CAAC;AAAA,cAC3G;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,GAAI,QAAQ,sBAAsB,UAAa,EAAE,mBAAmB,QAAQ,kBAAkB;AAAA,MAChG,CAAC;AAED,eAAS,SAAS,gBAAgB;AAElC,aAAO,OAAO;AAAA,QACZ,iBAAiB,WAAW,gBAAgB;AAAA,QAC5C,WAAW,WAAW,gBAAgB,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,eAAe,CAAC;AAAA,MACnF;AAEA,UAAI,CAAC,QAAQ,MAAM;AACjB,gBAAQ,IAAI,cAAc,YAAY,OAAO,KAAK,SAAS,cAAc,OAAO,KAAK,eAAe,SAAS,CAAC;AAAA,MAChH;AAAA,IACF;AAEA,WAAO,UAAU;AACjB,WAAO,WAAW,KAAK,IAAI,IAAI;AAE/B,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAC7C,OAAO;AACL,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,cAAc,0BAA0B,eAAe,OAAO,QAAQ,CAAC,EAAE,CAAC;AAAA,IACxF;AAAA,EACF,SAAS,OAAO;AACd,WAAO,UAAU;AACjB,WAAO,WAAW,KAAK,IAAI,IAAI;AAC/B,WAAO,SAAS,CAAC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAEvE,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAC7C,OAAO;AACL,cAAQ,MAAM,YAAY,qBAAqB,iBAAiB,QAAQ,MAAM,UAAU,KAAK,EAAE,CAAC;AAChG,UAAI,QAAQ,WAAW,iBAAiB,SAAS,MAAM,OAAO;AAC5D,gBAAQ,MAAM,UAAU,MAAM,KAAK,CAAC;AAAA,MACtC;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAKA,eAAsB,uBAAuB,SAAoD;AAC/F,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,SAA0B;AAAA,IAC9B,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAGA,QAAM,eAAW,yCAAe,QAAQ,gBAAgB;AACxD,MAAI,aAAa,YAAY;AAC3B,YAAQ,MAAM,YAAY,6DAA6D,CAAC;AACxF,YAAQ,MAAM,WAAW,sBAAsB,QAAQ,EAAE,CAAC;AAC1D,YAAQ,MAAM,WAAW,+DAA+D,CAAC;AACzF,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,oBAAoB,UAAU,SAAS,CAAC,CAAC;AAAA,IAC/F;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,gBAAY,2BAAQ,QAAQ,IAAI,GAAG,QAAQ,aAAa,oBAAoB;AAGlF,QAAM,gBAAgB,QAAQ,iBAAiB;AAE/C,MAAI,CAAC,QAAQ,MAAM;AACjB,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,WAAW,+BAA+B,CAAC;AACvD,YAAQ,IAAI,UAAU,iDAAiD,CAAC;AACxE,YAAQ,IAAI,EAAE;AACd,QAAI,cAAc,SAAS,KAAK,QAAQ,SAAS;AAC/C,cAAQ,IAAI,UAAU,aAAa,cAAc,MAAM,2BAA2B,CAAC;AAAA,IACrF;AAAA,EACF;AAEA,QAAM,eAAW,iDAAuB;AAExC,MAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS;AACpC,aAAS,WAAW,CAAC,UAAU;AAC7B,cAAQ,IAAI,eAAe,IAAI,MAAM,KAAK,KAAK,MAAM,QAAQ,OAAO,MAAM,WAAW,EAAE,EAAE,CAAC;AAAA,IAC5F,CAAC;AAAA,EACH;AAEA,MAAI;AAEF,aAAS,WAAW,eAAe;AACnC,QAAI,CAAC,QAAQ,MAAM;AACjB,cAAQ,IAAI,WAAW,mCAAmC,CAAC;AAAA,IAC7D;AAEA,UAAM,gBAAqC;AAAA,MACzC,kBAAkB,QAAQ;AAAA,MAC1B,aAAa;AAAA,MACb,cAAc;AAAA,MACd,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,mBAAmB;AAAA,MACnB,GAAI,QAAQ,UAAU,EAAE,QAAQ,QAAQ,OAAO;AAAA,MAC/C;AAAA,MACA,SAAS,CAAC,QAAQ;AAAA;AAAA,IACpB;AAEA,UAAM,SAAS,UAAM,uCAAa,aAAa;AAC/C,aAAS,SAAS,eAAe;AAEjC,WAAO,SAAS;AAAA,MACd,QAAQ,OAAO,OAAO;AAAA,MACtB,OAAO,OAAO,MAAM;AAAA,MACpB,WAAW,OAAO,UAAU;AAAA,MAC5B,UAAU,OAAO,SAAS;AAAA,MAC1B,YAAY,OAAO;AAAA,IACrB;AAEA,QAAI,CAAC,QAAQ,MAAM;AACjB,cAAQ,IAAI,cAAc,YAAY,OAAO,OAAO,MAAM,YAAY,OAAO,MAAM,MAAM,QAAQ,CAAC;AAAA,IACpG;AAGA,QAAI,QAAQ,UAAU;AACpB,eAAS,WAAW,YAAY;AAChC,UAAI,CAAC,QAAQ,MAAM;AACjB,gBAAQ,IAAI,WAAW,oCAAoC,CAAC;AAAA,MAC9D;AAEA,YAAM,iBAAa,sDAA4B,MAAM;AACrD,eAAS,SAAS,YAAY;AAE9B,aAAO,aAAa;AAAA,QAClB,cAAc,WAAW;AAAA,QACzB,YAAY,WAAW;AAAA,QACvB,cAAc,WAAW;AAAA,QACzB,iBAAiB,WAAW;AAAA,MAC9B;AAEA,UAAI,CAAC,QAAQ,MAAM;AACjB,YAAI,WAAW,cAAc;AAC3B,kBAAQ,IAAI,cAAc,kCAAkC,CAAC;AAAA,QAC/D,OAAO;AACL,kBAAQ,IAAI,cAAc,cAAc,WAAW,UAAU,uBAAuB,CAAC;AAAA,QACvF;AAEA,YAAI,WAAW,eAAe,KAAK,QAAQ,SAAS;AAClD,kBAAQ,IAAI,cAAc,GAAG,WAAW,YAAY,oBAAoB,CAAC;AACzE,qBAAW,OACR,OAAO,CAAC,MAAM,EAAE,aAAa,SAAS,EACtC,MAAM,GAAG,CAAC,EACV,QAAQ,CAAC,UAAU;AAClB,oBAAQ,IAAI,UAAU,OAAO,MAAM,OAAO,EAAE,CAAC;AAAA,UAC/C,CAAC;AAAA,QACL;AAAA,MACF;AAAA,IACF;AAGA,aAAS,WAAW,kBAAkB;AACtC,QAAI,CAAC,QAAQ,MAAM;AACjB,cAAQ,IAAI,WAAW,mCAAmC,CAAC;AAAA,IAC7D;AAEA,UAAM,cAAc,UAAM,0CAAgB,QAAQ;AAAA,MAChD,cAAc;AAAA,IAChB,CAAC;AACD,aAAS,SAAS,kBAAkB;AAEpC,WAAO,YAAY;AAAA,MACjB,UAAU,YAAY,SAAS;AAAA,MAC/B,uBAAuB,YAAY,yBAAyB,CAAC;AAAA,IAC/D;AAEA,QAAI,CAAC,QAAQ,QAAQ,YAAY,SAAS,SAAS,KAAK,QAAQ,SAAS;AACvE,cAAQ,IAAI,cAAc,GAAG,YAAY,SAAS,MAAM,0BAA0B,CAAC;AAAA,IACrF;AAGA,QAAI,CAAC,QAAQ,QAAQ;AACnB,aAAO,cAAc,CAAC;AAGtB,UAAI,KAAC,4BAAW,SAAS,GAAG;AAC1B,uCAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,MAC1C;AAGA,YAAM,iBAAa,2BAAQ,WAAW,YAAY;AAClD,yCAAc,YAAY,YAAY,GAAG;AACzC,aAAO,YAAY,KAAK,UAAU;AAGlC,YAAM,qBAAiB,2BAAQ,WAAW,aAAa;AACvD,yCAAc,gBAAgB,KAAK,UAAU,YAAY,QAAQ,MAAM,CAAC,CAAC;AACzE,aAAO,YAAY,KAAK,cAAc;AAGtC,UAAI,OAAO,YAAY;AACrB,cAAM,qBAAiB,2BAAQ,WAAW,wBAAwB;AAClE,2CAAc,gBAAgB,KAAK,UAAU,OAAO,YAAY,MAAM,CAAC,CAAC;AACxE,eAAO,YAAY,KAAK,cAAc;AAAA,MACxC;AAGA,YAAM,yBAAqB,2BAAQ,WAAW,oBAAoB;AAClE,yCAAc,oBAAoB,+BAA+B,QAAQ,WAAW,CAAC;AACrF,aAAO,YAAY,KAAK,kBAAkB;AAE1C,UAAI,CAAC,QAAQ,MAAM;AACjB,gBAAQ,IAAI,cAAc,sBAAsB,SAAS,EAAE,CAAC;AAC5D,eAAO,YAAY,QAAQ,CAAC,MAAM;AAChC,kBAAQ,IAAI,UAAU,OAAO,CAAC,EAAE,CAAC;AAAA,QACnC,CAAC;AAAA,MACH;AAAA,IACF,OAAO;AACL,UAAI,CAAC,QAAQ,MAAM;AACjB,gBAAQ,IAAI,WAAW,4BAA4B,CAAC;AAAA,MACtD;AAAA,IACF;AAGA,QAAI,QAAQ,eAAe,CAAC,QAAQ,QAAQ;AAC1C,eAAS,WAAW,gBAAgB;AACpC,UAAI,CAAC,QAAQ,MAAM;AACjB,gBAAQ,IAAI,WAAW,4BAA4B,CAAC;AAAA,MACtD;AAEA,YAAM,WAAW,IAAI,sCAAa;AAAA,QAChC,kBAAkB,QAAQ;AAAA,QAC1B,kBAAkB;AAAA,MACpB,CAAC;AAED,YAAM,aAAa,MAAM,SAAS,WAAW;AAAA,QAC3C,QAAQ,YAAY;AAAA,QACpB,YAAY,CAAC,UAAyB;AACpC,cAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS;AACpC,oBAAQ;AAAA,cACN;AAAA,gBACE,IAAI,MAAM,KAAK,KAAK,MAAM,QAAQ,OAAO,MAAM,SAAS,SAAS,EAAE,KAAK,MAAM,SAAS,iBAAiB,CAAC;AAAA,cAC3G;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,GAAI,QAAQ,sBAAsB,UAAa,EAAE,mBAAmB,QAAQ,kBAAkB;AAAA,MAChG,CAAC;AAED,eAAS,SAAS,gBAAgB;AAElC,aAAO,OAAO;AAAA,QACZ,iBAAiB,WAAW,gBAAgB;AAAA,QAC5C,WAAW,WAAW,gBAAgB,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,eAAe,CAAC;AAAA,MACnF;AAEA,UAAI,CAAC,QAAQ,MAAM;AACjB,gBAAQ,IAAI,cAAc,YAAY,OAAO,KAAK,SAAS,cAAc,OAAO,KAAK,eAAe,SAAS,CAAC;AAAA,MAChH;AAAA,IACF;AAEA,WAAO,UAAU;AACjB,WAAO,WAAW,KAAK,IAAI,IAAI;AAE/B,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAC7C,OAAO;AACL,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,cAAc,0BAA0B,eAAe,OAAO,QAAQ,CAAC,EAAE,CAAC;AAAA,IACxF;AAAA,EACF,SAAS,OAAO;AACd,WAAO,UAAU;AACjB,WAAO,WAAW,KAAK,IAAI,IAAI;AAC/B,WAAO,SAAS,CAAC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAEvE,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAC7C,OAAO;AACL,cAAQ,MAAM,YAAY,qBAAqB,iBAAiB,QAAQ,MAAM,UAAU,KAAK,EAAE,CAAC;AAChG,UAAI,QAAQ,WAAW,iBAAiB,SAAS,MAAM,OAAO;AAC5D,gBAAQ,MAAM,UAAU,MAAM,KAAK,CAAC;AAAA,MACtC;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAKA,SAAS,+BAA+B,QAAwB,aAAsC;AACpG,QAAM,QAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB,OAAO,OAAO,MAAM;AAAA,IACrC,gBAAgB,OAAO,MAAM,MAAM;AAAA,IACnC,oBAAoB,OAAO,UAAU,MAAM;AAAA,IAC3C,mBAAmB,OAAO,SAAS,MAAM;AAAA,IACzC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,YAAY,yBAAyB,YAAY,sBAAsB,SAAS,GAAG;AACrF,UAAM,KAAK,uDAAuD;AAClE,UAAM,KAAK,EAAE;AACb,gBAAY,sBAAsB,QAAQ,CAAC,QAAQ;AACjD,YAAM,KAAK,OAAO,GAAG,IAAI;AAAA,IAC3B,CAAC;AACD,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,iFAAiF;AAAA,EAC9F,OAAO;AACL,UAAM,KAAK,iDAAiD;AAAA,EAC9D;AAEA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,4BAA4B;AACvC,QAAM,KAAK,EAAE;AAEb,MAAI,YAAY,SAAS,SAAS,GAAG;AACnC,gBAAY,SAAS,QAAQ,CAAC,YAAY;AACxC,YAAM,KAAK,OAAO,QAAQ,IAAI,OAAO,QAAQ,OAAO,EAAE;AAAA,IACxD,CAAC;AAAA,EACH,OAAO;AACL,UAAM,KAAK,6BAA6B;AAAA,EAC1C;AAEA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,eAAe;AAC1B,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,2DAA2D;AACtE,QAAM,KAAK,kDAAkD;AAC7D,QAAM,KAAK,mEAAmE;AAC9E,QAAM,KAAK,qDAAqD;AAChE,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,cAAc;AACzB,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,yDAAyD;AACpE,QAAM,KAAK,2DAA2D;AACtE,QAAM,KAAK,iEAAiE;AAC5E,QAAM,KAAK,EAAE;AAEb,SAAO,MAAM,KAAK,IAAI;AACxB;AAKA,eAAsB,yBAAyB,SAK7B;AAChB,QAAM,eAAW,yCAAe,QAAQ,gBAAgB;AAExD,MAAI,CAAC,QAAQ,MAAM;AACjB,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,WAAW,0BAA0B,QAAQ,KAAK,CAAC;AAC/D,YAAQ,IAAI,EAAE;AAAA,EAChB;AAEA,MAAI;AACF,UAAM,SAAS,UAAM,uCAAa;AAAA,MAChC,kBAAkB,QAAQ;AAAA,MAC1B,cAAc;AAAA,MACd,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,mBAAmB;AAAA,IACrB,CAAC;AAED,UAAM,iBAA0C,CAAC;AACjD,QAAI,QAAQ,WAAW,QAAW;AAChC,qBAAe,SAAS,QAAQ;AAAA,IAClC;AACA,UAAM,iBAAa,sDAA4B,QAAQ,cAAc;AAErE,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC;AAAA,IACjD,OAAO;AACL,cAAQ,IAAI,WAAW,kBAAkB,CAAC;AAC1C,cAAQ,IAAI,UAAU,aAAa,OAAO,OAAO,MAAM,EAAE,CAAC;AAC1D,cAAQ,IAAI,UAAU,YAAY,OAAO,MAAM,MAAM,EAAE,CAAC;AACxD,cAAQ,IAAI,UAAU,gBAAgB,OAAO,UAAU,MAAM,EAAE,CAAC;AAChE,cAAQ,IAAI,UAAU,iBAAiB,OAAO,WAAW,KAAK,IAAI,KAAK,MAAM,EAAE,CAAC;AAChF,cAAQ,IAAI,EAAE;AAEd,UAAI,WAAW,cAAc;AAC3B,gBAAQ,IAAI,cAAc,kCAAkC,CAAC;AAAA,MAC/D,OAAO;AACL,gBAAQ,IAAI,YAAY,cAAc,WAAW,UAAU,kBAAkB,CAAC;AAAA,MAChF;AAEA,UAAI,WAAW,eAAe,GAAG;AAC/B,gBAAQ,IAAI,cAAc,GAAG,WAAW,YAAY,WAAW,CAAC;AAAA,MAClE;AAEA,cAAQ,IAAI,UAAU,qBAAqB,WAAW,eAAe,KAAK,CAAC;AAC3E,cAAQ,IAAI,EAAE;AAEd,UAAI,WAAW,OAAO,SAAS,MAAM,QAAQ,WAAW,CAAC,WAAW,eAAe;AACjF,gBAAQ,IAAI,WAAW,SAAS,CAAC;AACjC,cAAM,aAAa,QAAQ,UAAU,WAAW,OAAO,SAAS;AAChE,mBAAW,OAAO,MAAM,GAAG,UAAU,EAAE,QAAQ,CAAC,UAAU;AACxD,gBAAM,OAAO,MAAM,aAAa,UAAU,MAAM,MAAM,aAAa,YAAY,MAAM;AACrF,gBAAM,QAAQ,MAAM,aAAa,UAAU,cAAc,MAAM,aAAa,YAAY,gBAAgB;AACxG,kBAAQ,IAAI,MAAM,KAAK,IAAI,KAAK,MAAM,IAAI,KAAK,MAAM,OAAO,EAAE,CAAC;AAC/D,cAAI,MAAM,cAAc,QAAQ,SAAS;AACvC,oBAAQ,IAAI,UAAU,mBAAmB,MAAM,UAAU,EAAE,CAAC;AAAA,UAC9D;AAAA,QACF,CAAC;AAED,YAAI,WAAW,OAAO,SAAS,YAAY;AACzC,kBAAQ,IAAI,UAAU,aAAa,WAAW,OAAO,SAAS,UAAU,cAAc,CAAC;AAAA,QACzF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,CAAC,WAAW,cAAc;AAC5B,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,SAAS,OAAO;AACd,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,CAAC,CAAC;AAAA,IAC/G,OAAO;AACL,cAAQ,MAAM,YAAY,sBAAsB,iBAAiB,QAAQ,MAAM,UAAU,KAAK,EAAE,CAAC;AAAA,IACnG;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAuBA,SAAS,gBAAgB,SAAiC;AACxD,QAAM,SAAmC,CAAC;AAC1C,QAAM,QAAiC,CAAC;AACxC,QAAM,YAAyC,CAAC;AAChD,QAAM,WAAuC,CAAC;AAC9C,QAAM,aAAuB,CAAC;AAG9B,QAAM,mBAAmB;AACzB,QAAM,kBAAkB;AACxB,QAAM,sBAAsB;AAC5B,QAAM,uBAAuB;AAE7B,MAAI;AAGJ,UAAQ,QAAQ,qBAAqB,KAAK,OAAO,OAAO,MAAM;AAC5D,QAAI,MAAM,CAAC,GAAG;AACZ,iBAAW,KAAK,MAAM,CAAC,CAAC;AAAA,IAC1B;AAAA,EACF;AAGA,UAAQ,QAAQ,iBAAiB,KAAK,OAAO,OAAO,MAAM;AACxD,UAAM,aAAa,MAAM,CAAC,KAAK;AAC/B,UAAM,YAAY,MAAM,CAAC;AACzB,UAAM,eAAe,MAAM,CAAC;AAE5B,QAAI,CAAC,aAAa,CAAC,aAAc;AAGjC,UAAM,UAAkD,CAAC;AACzD,UAAM,cAAc,aAAa,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,WAAW,aAAa,KAAK,CAAC,EAAE,WAAW,aAAa,KAAK,CAAC,EAAE,WAAW,YAAY,CAAC;AAE/K,eAAW,QAAQ,aAAa;AAC9B,YAAM,WAAW,KAAK,MAAM,yCAAyC;AACrE,UAAI,UAAU;AACZ,cAAM,UAAU,SAAS,CAAC;AAC1B,cAAM,UAAU,SAAS,CAAC;AAC1B,cAAM,cAAc,SAAS,CAAC,KAAK;AAEnC,YAAI,CAAC,WAAW,CAAC,QAAS;AAE1B,cAAM,SAAoD;AAAA,UACxD,MAAM;AAAA,UACN,MAAM;AAAA,UACN,UAAU,CAAC,YAAY,YAAY,EAAE,SAAS,UAAU;AAAA,UACxD,QAAQ,YAAY,YAAY,EAAE,SAAS,QAAQ;AAAA,QACrD;AACA,cAAM,eAAe,YAAY,MAAM,sBAAsB;AAC7D,YAAI,eAAe,CAAC,GAAG;AACrB,iBAAO,UAAU,aAAa,CAAC;AAAA,QACjC;AACA,gBAAQ,KAAK,MAAM;AAAA,MACrB;AAAA,IACF;AAGA,UAAM,UAAU,aAAa,MAAM,8BAA8B;AACjE,UAAM,aAAa,UAAU,CAAC,IAC1B,EAAE,SAAS,QAAQ,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,MAAM,EAAE,CAAC,EAAE,IACxE;AAGJ,UAAM,cAA0D,CAAC;AACjE,UAAM,UAAU;AAChB,QAAI;AACJ,YAAQ,UAAU,QAAQ,KAAK,YAAY,OAAO,MAAM;AACtD,UAAI,QAAQ,CAAC,KAAK,QAAQ,CAAC,KAAK,QAAQ,CAAC,GAAG;AAC1C,oBAAY,KAAK;AAAA,UACf,SAAS,QAAQ,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,UACpE,YAAY;AAAA,YACV,OAAO,QAAQ,CAAC;AAAA,YAChB,SAAS,QAAQ,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,UACtE;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,CAAC;AAAA,IACZ,CAAC;AAAA,EACH;AAGA,UAAQ,QAAQ,gBAAgB,KAAK,OAAO,OAAO,MAAM;AACvD,QAAI,MAAM,CAAC,KAAK,MAAM,CAAC,GAAG;AACxB,YAAM,KAAK;AAAA,QACT,MAAM,MAAM,CAAC;AAAA,QACb,QAAQ,MAAM,CAAC,KAAK;AAAA,QACpB,YAAY,MAAM,CAAC,EAAE,KAAK;AAAA,MAC5B,CAAC;AAAA,IACH;AAAA,EACF;AAGA,UAAQ,QAAQ,oBAAoB,KAAK,OAAO,OAAO,MAAM;AAC3D,QAAI,MAAM,CAAC,KAAK,MAAM,CAAC,GAAG;AACxB,gBAAU,KAAK;AAAA,QACb,MAAM,MAAM,CAAC;AAAA,QACb,QAAQ,MAAM,CAAC,KAAK;AAAA,QACpB,YAAY,MAAM,CAAC;AAAA,QACnB,UAAU,MAAM,CAAC;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,OAAO,WAAW,UAAU,WAAW;AAC1D;AAKA,eAAsB,gBAAgB,SAA6C;AACjF,QAAM,EAAE,cAAAC,eAAc,eAAAC,gBAAe,WAAAC,YAAW,YAAAC,aAAW,IAAI,MAAM,OAAO,IAAS;AACrF,QAAM,EAAE,SAAAC,UAAQ,IAAI,MAAM,OAAO,MAAW;AAE5C,QAAM,YAAY,KAAK,IAAI;AAE3B,MAAI,CAACD,aAAW,QAAQ,IAAI,GAAG;AAC7B,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,mBAAmB,QAAQ,IAAI,GAAG,CAAC,CAAC;AAAA,IAC1F,OAAO;AACL,cAAQ,MAAM,YAAY,mBAAmB,QAAQ,IAAI,EAAE,CAAC;AAAA,IAC9D;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,YAAYC,UAAQ,QAAQ,IAAI,GAAG,QAAQ,aAAa,oBAAoB;AAElF,MAAI,CAAC,QAAQ,MAAM;AACjB,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,WAAW,+BAA+B,CAAC;AACvD,YAAQ,IAAI,UAAU,wBAAwB,CAAC;AAC/C,YAAQ,IAAI,EAAE;AAAA,EAChB;AAEA,MAAI;AAEF,QAAI,CAAC,QAAQ,MAAM;AACjB,cAAQ,IAAI,WAAW,WAAW,QAAQ,IAAI,KAAK,CAAC;AAAA,IACtD;AAEA,UAAM,UAAUJ,cAAa,QAAQ,MAAM,OAAO;AAClD,UAAM,SAAS,gBAAgB,OAAO;AAEtC,QAAI,CAAC,QAAQ,MAAM;AACjB,cAAQ,IAAI,cAAc,UAAU,OAAO,OAAO,MAAM,YAAY,OAAO,MAAM,MAAM,WAAW,OAAO,UAAU,MAAM,YAAY,CAAC;AAAA,IACxI;AAGA,QAAI,QAAQ,UAAU;AACpB,UAAI,CAAC,QAAQ,MAAM;AACjB,gBAAQ,IAAI,WAAW,oCAAoC,CAAC;AAAA,MAC9D;AAEA,YAAM,iBAAa,sDAA4B,MAAM;AAErD,UAAI,CAAC,QAAQ,MAAM;AACjB,YAAI,WAAW,cAAc;AAC3B,kBAAQ,IAAI,cAAc,kCAAkC,CAAC;AAAA,QAC/D,OAAO;AACL,kBAAQ,IAAI,cAAc,cAAc,WAAW,UAAU,uBAAuB,CAAC;AAAA,QACvF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,CAAC,QAAQ,MAAM;AACjB,cAAQ,IAAI,WAAW,mCAAmC,CAAC;AAAA,IAC7D;AAEA,UAAM,cAAc,UAAM,0CAAgB,QAAQ;AAAA,MAChD,cAAc;AAAA,IAChB,CAAC;AAGD,QAAI,CAAC,QAAQ,QAAQ;AACnB,UAAI,CAACG,aAAW,SAAS,GAAG;AAC1B,QAAAD,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,MAC1C;AAGA,YAAM,aAAaE,UAAQ,WAAW,YAAY;AAClD,MAAAH,eAAc,YAAY,YAAY,GAAG;AAGzC,YAAM,iBAAiBG,UAAQ,WAAW,aAAa;AACvD,MAAAH,eAAc,gBAAgB,KAAK,UAAU,YAAY,QAAQ,MAAM,CAAC,CAAC;AAEzE,UAAI,CAAC,QAAQ,MAAM;AACjB,gBAAQ,IAAI,cAAc,sBAAsB,SAAS,EAAE,CAAC;AAC5D,gBAAQ,IAAI,UAAU,OAAO,UAAU,EAAE,CAAC;AAC1C,gBAAQ,IAAI,UAAU,OAAO,cAAc,EAAE,CAAC;AAAA,MAChD;AAAA,IACF,OAAO;AACL,UAAI,CAAC,QAAQ,MAAM;AACjB,gBAAQ,IAAI,WAAW,4BAA4B,CAAC;AAAA,MACtD;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,IAAI,IAAI;AAE9B,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU;AAAA,QACzB,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,QAAQ,OAAO,OAAO;AAAA,UACtB,OAAO,OAAO,MAAM;AAAA,UACpB,WAAW,OAAO,UAAU;AAAA,UAC5B,YAAY,OAAO;AAAA,QACrB;AAAA,QACA,WAAW;AAAA,UACT,UAAU,YAAY,SAAS;AAAA,QACjC;AAAA,QACA;AAAA,MACF,GAAG,MAAM,CAAC,CAAC;AAAA,IACb,OAAO;AACL,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,cAAc,uBAAuB,eAAe,QAAQ,CAAC,EAAE,CAAC;AAAA,IAC9E;AAAA,EACF,SAAS,OAAO;AACd,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,CAAC,CAAC;AAAA,IAC/G,OAAO;AACL,cAAQ,MAAM,YAAY,kBAAkB,iBAAiB,QAAQ,MAAM,UAAU,KAAK,EAAE,CAAC;AAAA,IAC/F;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AA6BA,SAAS,wBAAwB,OAAgC;AAC/D,QAAM,SAAmB,CAAC;AAG1B,QAAM,sBAAuF;AAAA,IAC3F;AAAA,MACE,SAAS;AAAA,MACT,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,EACF;AAEA,aAAW,EAAE,SAAS,SAAS,WAAW,KAAK,qBAAqB;AAClE,QAAI,QAAQ,KAAK,KAAK,GAAG;AACvB,aAAO,KAAK,QAAQ,OAAO,EAAE;AAC7B,aAAO;AAAA,QACL;AAAA,QACA,YAAY;AAAA,QACZ;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,kBAA+D;AAAA,IACnE,EAAE,SAAS,qBAAqB,SAAS,6EAA6E;AAAA,IACtH,EAAE,SAAS,qCAAqC,SAAS,yEAAyE;AAAA,IAClI,EAAE,SAAS,8BAA8B,SAAS,oEAAoE;AAAA,EACxH;AAEA,aAAW,EAAE,SAAS,QAAQ,KAAK,iBAAiB;AAClD,QAAI,QAAQ,KAAK,KAAK,GAAG;AACvB,aAAO,KAAK,OAAO;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,SAA0B;AAAA,IAC9B;AAAA,IACA,YAAY,OAAO,WAAW,KAAK,OAAO,MAAM,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC;AAAA,EAC1E;AACA,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO,SAAS;AAAA,EAClB;AACA,SAAO;AACT;AAKA,eAAsB,0BAA0B,SAAuD;AACrG,QAAM,UAAoB,CAAC;AAG3B,MAAI,QAAQ,aAAa;AACvB,UAAM,EAAE,cAAAD,eAAc,YAAAG,aAAW,IAAI,MAAM,OAAO,IAAS;AAE3D,QAAI,CAACA,aAAW,QAAQ,WAAW,GAAG;AACpC,UAAI,QAAQ,MAAM;AAChB,gBAAQ,IAAI,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,mBAAmB,QAAQ,WAAW,GAAG,CAAC,CAAC;AAAA,MACjG,OAAO;AACL,gBAAQ,MAAM,YAAY,mBAAmB,QAAQ,WAAW,EAAE,CAAC;AAAA,MACrE;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,UAAUH,cAAa,QAAQ,aAAa,OAAO;AAEzD,UAAM,cAAc,QACjB,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,WAAW,IAAI,CAAC;AACzC,YAAQ,KAAK,GAAG,WAAW;AAAA,EAC7B;AAGA,MAAI,QAAQ,SAAS;AACnB,YAAQ,KAAK,GAAG,QAAQ,OAAO;AAAA,EACjC;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU,EAAE,SAAS,OAAO,OAAO,sBAAsB,CAAC,CAAC;AAAA,IAC9E,OAAO;AACL,cAAQ,MAAM,YAAY,sDAAsD,CAAC;AAAA,IACnF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,CAAC,QAAQ,MAAM;AACjB,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,WAAW,0BAA0B,CAAC;AAClD,YAAQ,IAAI,UAAU,WAAW,QAAQ,MAAM,mCAAmC,CAAC;AACnF,YAAQ,IAAI,EAAE;AAAA,EAChB;AAEA,QAAM,UAA6B,CAAC;AACpC,MAAI,kBAAkB;AACtB,MAAI,oBAAoB;AAExB,aAAW,SAAS,SAAS;AAC3B,UAAM,SAAS,wBAAwB,KAAK;AAC5C,YAAQ,KAAK,MAAM;AAEnB,QAAI,OAAO,YAAY;AACrB;AAAA,IACF,OAAO;AACL;AAAA,IACF;AAEA,QAAI,CAAC,QAAQ,QAAQ,QAAQ,SAAS;AACpC,YAAM,SAAS,OAAO,aAAa,cAAc,IAAI,IAAI,YAAY,cAAc;AACnF,cAAQ,IAAI,GAAG,MAAM,IAAI,MAAM,UAAU,GAAG,EAAE,CAAC,GAAG,MAAM,SAAS,KAAK,QAAQ,EAAE,EAAE;AAClF,UAAI,OAAO,UAAU,OAAO,OAAO,SAAS,GAAG;AAC7C,eAAO,OAAO,QAAQ,CAAC,UAAU;AAC/B,kBAAQ,IAAI,UAAU,OAAO,KAAK,EAAE,CAAC;AAAA,QACvC,CAAC;AAAA,MACH;AACA,UAAI,OAAO,YAAY;AACrB,gBAAQ,IAAI,cAAc,iBAAiB,OAAO,UAAU,EAAE,CAAC;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,MAAM;AAChB,YAAQ,IAAI,KAAK,UAAU;AAAA,MACzB,SAAS;AAAA,MACT,SAAS;AAAA,QACP,OAAO,QAAQ;AAAA,QACf,YAAY;AAAA,QACZ,cAAc;AAAA,MAChB;AAAA,MACA,SAAS,QAAQ,UAAU,UAAU;AAAA,IACvC,GAAG,MAAM,CAAC,CAAC;AAAA,EACb,OAAO;AACL,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,WAAW,UAAU,CAAC;AAClC,YAAQ,IAAI,UAAU,oBAAoB,QAAQ,MAAM,EAAE,CAAC;AAC3D,YAAQ,IAAI,cAAc,iBAAiB,eAAe,EAAE,CAAC;AAC7D,QAAI,oBAAoB,GAAG;AACzB,cAAQ,IAAI,YAAY,mBAAmB,iBAAiB,EAAE,CAAC;AAAA,IACjE;AACA,YAAQ,IAAI,EAAE;AAEd,QAAI,oBAAoB,KAAK,CAAC,QAAQ,SAAS;AAC7C,cAAQ,IAAI,cAAc,2DAA2D,CAAC;AAAA,IACxF;AAAA,EACF;AAGA,MAAI,oBAAoB,GAAG;AACzB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;ACzvCA,IAAAK,kBAA8B;AAC9B,IAAAC,oBAAiC;AACjC,IAAAD,mBAAsC;AAEtC;;;AC8MA,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;AA6BO,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,qBAAqB,KAAqB;AACjD,SAAO,IAAI,QAAQ,MAAM,KAAK,EAAE,QAAQ,OAAO,KAAK;AACtD;;;AD9qCA,eAAsB,cAAc,SAA8C;AAChF,QAAM,UAAU,QAAQ,QAAQ,QAAQ,IAAI,qBAAqB,KAAK,QAAQ,IAAI,cAAc;AAChG,QAAM,QAAQ,QAAQ,MAAM,QAAQ,IAAI,qBAAqB;AAE7D,MAAI,CAAC,SAAS;AACZ,YAAQ,MAAM,YAAY,iCAAiC,CAAC;AAC5D,YAAQ,MAAM,6EAA6E;AAC3F,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,CAAC,OAAO;AACV,YAAQ,MAAM,YAAY,iCAAiC,CAAC;AAC5D,YAAQ,MAAM,8DAA8D;AAC5E,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,eAA2B;AAC/B,MAAI,eAA2B;AAE/B,MAAI;AACF,QAAI,QAAQ,SAAS;AACnB,cAAQ,IAAI,WAAW,kCAAkC,CAAC;AAAA,IAC5D;AACA,mBAAe,eAAS,OAAO;AAE/B,QAAI,QAAQ,SAAS;AACnB,cAAQ,IAAI,WAAW,kCAAkC,CAAC;AAAA,IAC5D;AACA,mBAAe,eAAS,KAAK;AAG7B,UAAM,cAAiC;AAAA,MACrC,gBAAgB,QAAQ,mBAAmB;AAAA,IAC7C;AACA,QAAI,QAAQ,eAAe,OAAW,aAAY,aAAa,QAAQ;AACvE,QAAI,QAAQ,kBAAkB,OAAW,aAAY,gBAAgB,QAAQ;AAC7E,QAAI,QAAQ,kBAAkB,OAAW,aAAY,gBAAgB,QAAQ;AAE7E,QAAI,QAAQ,SAAS;AACnB,cAAQ,IAAI,WAAW,sBAAsB,CAAC;AAAA,IAChD;AAGA,UAAM,iBAAoF;AAAA,MACxF,GAAG;AAAA,IACL;AACA,QAAI,QAAQ,WAAW,OAAW,gBAAe,SAAS,QAAQ;AAClE,QAAI,QAAQ,mBAAmB,OAAW,gBAAe,iBAAiB,QAAQ;AAElF,UAAM,OAAO,MAAM,eAAe,cAAc,cAAc,cAAc;AAG5E,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,qBAAqB,IAAI,CAAC;AAAA,IACxC,OAAO;AACL,cAAQ,IAAI,iBAAiB,MAAM,EAAE,OAAO,CAAC,QAAQ,QAAQ,CAAC,CAAC;AAAA,IACjE;AAGA,QAAI,QAAQ,qBAAqB,CAAC,KAAK,aAAa;AAClD,YAAM,mBAAwC;AAAA,QAC5C,iBAAiB;AAAA,MACnB;AACA,UAAI,QAAQ,aAAa,OAAW,kBAAiB,WAAW,QAAQ;AACxE,UAAI,QAAQ,WAAW,OAAW,kBAAiB,SAAS,QAAQ;AACpE,UAAI,QAAQ,sBAAsB,OAAW,kBAAiB,oBAAoB,QAAQ;AAE1F,YAAM,YAAY,qBAAqB,MAAM,gBAAgB;AAG7D,UAAI,UAAU,SAAS,SAAS,GAAG;AACjC,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,cAAc,WAAW,CAAC;AACtC,mBAAW,WAAW,UAAU,UAAU;AACxC,kBAAQ,IAAI,OAAO,OAAO,EAAE;AAAA,QAC9B;AAAA,MACF;AAGA,YAAM,YAAY,QAAQ,iBAAiB;AAC3C,YAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,UAAU,EAAE,EAAE,MAAM,GAAG,EAAE;AAC5E,YAAM,gBAAgB,QAAQ,iBAAiB;AAC/C,YAAM,WAAW,GAAG,SAAS,IAAI,aAAa;AAE9C,UAAI,QAAQ,oBAAoB,OAAO;AAErC,cAAM,aAAS,2BAAQ,QAAQ,IAAI,GAAG,WAAW,GAAG,QAAQ,SAAS;AACrE,cAAM,eAAW,2BAAQ,QAAQ,IAAI,GAAG,WAAW,GAAG,QAAQ,WAAW;AAEzE,8BAAsB,MAAM;AAC5B,2CAAc,QAAQ,UAAU,KAAK;AACrC,2CAAc,UAAU,UAAU,OAAO;AAEzC,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,cAAc,oBAAoB,CAAC;AAC/C,gBAAQ,IAAI,WAAW,MAAM,EAAE;AAC/B,gBAAQ,IAAI,WAAW,QAAQ,EAAE;AAAA,MACnC,OAAO;AAEL,cAAM,oBAAgB,2BAAQ,QAAQ,IAAI,GAAG,WAAW,GAAG,QAAQ,KAAK;AACxE,cAAM,mBAAmB,yBAAyB,MAAM,eAAe,gBAAgB;AAEvF,8BAAsB,aAAa;AACnC,2CAAc,eAAe,gBAAgB;AAE7C,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAI,cAAc,sBAAsB,aAAa,EAAE,CAAC;AAAA,MAClE;AAEA,UAAI,CAAC,UAAU,cAAc;AAC3B,gBAAQ,IAAI,cAAc,kDAAkD,CAAC;AAAA,MAC/E;AAAA,IACF,WAAW,QAAQ,qBAAqB,KAAK,aAAa;AACxD,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,WAAW,6CAA6C,CAAC;AAAA,IACvE;AAGA,QAAI,QAAQ,YAAY,CAAC,KAAK,aAAa;AACzC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,UAAE;AACA,QAAI,cAAc;AAChB,YAAM,aAAa,IAAI;AAAA,IACzB;AACA,QAAI,cAAc;AAChB,YAAM,aAAa,IAAI;AAAA,IACzB;AAAA,EACF;AACF;AAKA,SAAS,sBAAsB,UAAwB;AACrD,QAAM,UAAM,2BAAQ,QAAQ;AAC5B,MAAI,KAAC,6BAAW,GAAG,GAAG;AACpB,oCAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACpC;AACF;;;AEhKA,IAAAE,mBAA4C;AAC5C,IAAAC,qBAAiC;AACjC,IAAAD,mBAAsC;AAEtC;AAwBA,eAAsB,cAAc,SAA8C;AAChF,QAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI,cAAc;AAErD,MAAI,CAAC,KAAK;AACR,YAAQ,MAAM,YAAY,0BAA0B,CAAC;AACrD,YAAQ,MAAM,wDAAwD;AACtE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,iBAAa,4BAAQ,QAAQ,IAAI,GAAG,QAAQ,UAAU,aAAa;AAEzE,MAAI,SAAqB;AAEzB,MAAI;AACF,QAAI,QAAQ,SAAS;AACnB,cAAQ,IAAI,WAAW,2BAA2B,CAAC;AAAA,IACrD;AACA,aAAS,eAAS,GAAG;AAErB,QAAI,QAAQ,SAAS;AACnB,cAAQ,IAAI,WAAW,yBAAyB,QAAQ,UAAU,QAAQ,MAAM,CAAC;AAAA,IACnF;AAGA,UAAM,mBAMF,CAAC;AACL,QAAI,QAAQ,WAAW,OAAW,kBAAiB,SAAS,QAAQ;AACpE,QAAI,QAAQ,qBAAqB,OAAW,kBAAiB,mBAAmB,QAAQ;AACxF,QAAI,QAAQ,mBAAmB,OAAW,kBAAiB,iBAAiB,QAAQ;AACpF,QAAI,QAAQ,kBAAkB,OAAW,kBAAiB,gBAAgB,QAAQ;AAClF,QAAI,QAAQ,kBAAkB,OAAW,kBAAiB,gBAAgB,QAAQ;AAElF,QAAI,QAAQ,eAAe;AACzB,YAAM,EAAE,QAAQ,MAAM,IAAI,MAAM,wBAAwB,QAAQ,gBAAgB;AAEhF,MAAAE,uBAAsB,UAAU;AAChC,0CAAc,YAAY,MAAM;AAChC,cAAQ,IAAI,cAAc,sBAAsB,UAAU,EAAE,CAAC;AAE7D,YAAM,YAAY,WAAW,QAAQ,SAAS,WAAW;AACzD,0CAAc,WAAW,KAAK;AAC9B,cAAQ,IAAI,cAAc,qBAAqB,SAAS,EAAE,CAAC;AAAA,IAC7D,OAAO;AACL,YAAM,SAAS,MAAM,2BAA2B,QAAQ,gBAAgB;AAExE,MAAAA,uBAAsB,UAAU;AAChC,0CAAc,YAAY,MAAM;AAChC,cAAQ,IAAI,cAAc,sBAAsB,UAAU,EAAE,CAAC;AAAA,IAC/D;AAEA,QAAI,QAAQ,MAAM;AAChB,YAAM,WAAW,MAAM,mBAAmB,QAAQ,gBAAgB;AAClE,cAAQ,IAAI,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,IAC/C;AAAA,EACF,UAAE;AACA,QAAI,QAAQ;AACV,YAAM,OAAO,IAAI;AAAA,IACnB;AAAA,EACF;AACF;AAOA,eAAsB,cAAc,SAA8C;AAChF,QAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI,cAAc;AAErD,MAAI,CAAC,KAAK;AACR,YAAQ,MAAM,YAAY,0BAA0B,CAAC;AACrD,YAAQ,MAAM,wDAAwD;AACtE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,CAAC,QAAQ,OAAO;AAClB,YAAQ,MAAM,YAAY,+BAA+B,CAAC;AAC1D,YAAQ,MAAM,kDAAkD;AAChE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,gBAAY,4BAAQ,QAAQ,IAAI,GAAG,QAAQ,KAAK;AAEtD,MAAI,KAAC,6BAAW,SAAS,GAAG;AAC1B,YAAQ,MAAM,YAAY,yBAAyB,SAAS,EAAE,CAAC;AAC/D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,SAAqB;AAEzB,MAAI;AACF,QAAI,QAAQ,SAAS;AACnB,cAAQ,IAAI,WAAW,2BAA2B,CAAC;AAAA,IACrD;AACA,aAAS,eAAS,GAAG;AAGrB,QAAI,QAAQ,SAAS;AACnB,cAAQ,IAAI,WAAW,0CAA0C,CAAC;AAAA,IACpE;AAEA,UAAM,oBAAkE;AAAA,MACtE,gBAAgB;AAAA,IAClB;AACA,QAAI,QAAQ,WAAW,OAAW,mBAAkB,SAAS,QAAQ;AAErE,UAAM,gBAAgB,MAAM,mBAAmB,QAAQ,iBAAiB;AAGxE,QAAI,QAAQ,SAAS;AACnB,cAAQ,IAAI,WAAW,8BAA8B,CAAC;AAAA,IACxD;AAEA,UAAM,gBAAgB,MAAM,gBAAgB,WAAW,QAAQ,MAAM;AAGrE,QAAI,QAAQ,SAAS;AACnB,cAAQ,IAAI,WAAW,sBAAsB,CAAC;AAAA,IAChD;AAEA,UAAM,cAAiC;AAAA,MACrC,gBAAgB;AAAA,IAClB;AACA,QAAI,QAAQ,kBAAkB,OAAW,aAAY,gBAAgB,QAAQ;AAC7E,QAAI,QAAQ,kBAAkB,OAAW,aAAY,gBAAgB,QAAQ;AAG7E,UAAM,OAAO,YAAY,eAAe,eAAe,WAAW;AAElE,QAAI,KAAK,aAAa;AACpB,cAAQ,IAAI,cAAc,8BAA8B,CAAC;AACzD;AAAA,IACF;AAGA,YAAQ,IAAI,iBAAiB,MAAM,EAAE,OAAO,CAAC,QAAQ,QAAQ,CAAC,CAAC;AAG/D,UAAM,mBAAqF;AAAA,MACzF,iBAAiB;AAAA,MACjB,UAAU;AAAA,IACZ;AACA,QAAI,QAAQ,WAAW,OAAW,kBAAiB,SAAS,QAAQ;AAEpE,UAAM,YAAY,qBAAqB,MAAM,gBAAgB;AAG7D,QAAI,UAAU,SAAS,SAAS,GAAG;AACjC,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,cAAc,WAAW,CAAC;AACtC,iBAAW,WAAW,UAAU,UAAU;AACxC,gBAAQ,IAAI,OAAO,OAAO,EAAE;AAAA,MAC9B;AAAA,IACF;AAGA,QAAI,QAAQ,QAAQ;AAClB,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,WAAW,uCAAuC,CAAC;AAC/D,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,UAAU,KAAK;AAC3B;AAAA,IACF;AAGA,QAAI,CAAC,QAAQ,UAAU,KAAK,QAAQ,gBAAgB,KAAK,KAAK,QAAQ,iBAAiB,IAAI;AACzF,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,cAAc,oEAAoE,CAAC;AAC/F,cAAQ,IAAI,yDAAyD;AACrE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,WAAW,4BAA4B,CAAC;AAEpD,aAAS,IAAI,GAAG,IAAI,UAAU,GAAG,QAAQ,KAAK;AAC5C,YAAM,YAAY,UAAU,GAAG,CAAC;AAChC,UAAI,QAAQ,SAAS;AACnB,gBAAQ,IAAI,eAAe,cAAc,IAAI,CAAC,IAAI,UAAU,GAAG,MAAM,MAAM,UAAU,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC;AAAA,MACzG;AAEA,UAAI;AACF,cAAM,OAAO,OAAO,SAAS;AAAA,MAC/B,SAAS,OAAO;AACd,gBAAQ,MAAM,YAAY,sBAAsB,SAAS,EAAE,CAAC;AAC5D,gBAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAEpE,YAAI,CAAC,QAAQ,OAAO;AAClB,kBAAQ,MAAM,EAAE;AAChB,kBAAQ,MAAM,wCAAwC;AACtD,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAEA,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,cAAc,0BAA0B,UAAU,GAAG,MAAM,sBAAsB,CAAC;AAAA,EAChG,UAAE;AACA,QAAI,QAAQ;AACV,YAAM,OAAO,IAAI;AAAA,IACnB;AAAA,EACF;AACF;AAQA,eAAe,gBAAgB,UAAkB,YAAwD;AACvG,QAAM,aAAS,+BAAa,UAAU,OAAO;AAG7C,QAAM,aAAa,0BAA0B,MAAM;AACnD,MAAI,WAAW,SAAS,GAAG;AACzB,UAAM,iBAAsC,CAAC;AAC7C,QAAI,eAAe,OAAW,gBAAe,SAAS;AACtD,UAAMC,UAAS,0BAA0B,YAAY,cAAc;AACnE,WAAO;AAAA,MACL,QAAAA;AAAA,MACA,OAAO,CAAC;AAAA,MACR,YAAY,cAAc;AAAA,IAC5B;AAAA,EACF;AAGA,QAAM,SAAS,mBAAmB,QAAQ,cAAc,QAAQ;AAChE,QAAM,QAAQ,kBAAkB,MAAM;AAEtC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,YAAY,cAAc;AAAA,EAC5B;AACF;AAKA,SAAS,mBAAmB,QAAgB,QAAoD;AAC9F,QAAM,SAA6C,CAAC;AAIpD,QAAM,aAAa;AAEnB,MAAI;AACJ,UAAQ,QAAQ,WAAW,KAAK,MAAM,OAAO,MAAM;AACjD,UAAM,YAAY,MAAM,CAAC,KAAK,MAAM,CAAC;AACrC,UAAM,cAAc,MAAM,CAAC,KAAK;AAEhC,UAAM,UAAU,oBAAoB,WAAW;AAE/C,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,SAAS,CAAC;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAKA,SAAS,oBAAoB,MAAgE;AAC3F,QAAM,UAA4D,CAAC;AAInE,QAAM,cAAc;AAEpB,MAAI;AACJ,UAAQ,QAAQ,YAAY,KAAK,IAAI,OAAO,MAAM;AAChD,UAAM,eAAe,MAAM,CAAC,KAAK,MAAM,CAAC;AACxC,UAAM,cAAc,MAAM,CAAC;AAG3B,UAAM,aAAa,MAAM,QAAQ,MAAM,CAAC,EAAE;AAC1C,UAAM,aAAa,KAAK,MAAM,UAAU;AAGxC,QAAI,QAAQ;AACZ,QAAI,WAAW;AACf,aAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,YAAM,OAAO,WAAW,CAAC;AACzB,UAAI,SAAS,OAAO,SAAS,OAAO,SAAS,IAAK;AAAA,eACzC,SAAS,OAAO,SAAS,OAAO,SAAS,IAAK;AAAA,eAC9C,SAAS,OAAO,UAAU,GAAG;AACpC,mBAAW;AACX;AAAA,MACF;AACA,UAAI,UAAU,GAAG;AACf,mBAAW;AACX;AAAA,MACF;AAAA,IACF;AAEA,UAAM,YAAY,WAAW,MAAM,GAAG,QAAQ;AAG9C,UAAM,eAAe,UAAU,SAAS,eAAe;AACvD,UAAM,YAAY,UAAU,SAAS,YAAY;AACjD,UAAM,WAAW,UAAU,SAAS,WAAW;AAC/C,UAAM,aAAa,UAAU,SAAS,WAAW,KAAK,UAAU,SAAS,eAAe;AAGxF,QAAI;AACJ,QAAI,UAAU,SAAS,eAAe,GAAG;AACvC,qBAAe;AAAA,IACjB,WAAW,UAAU,SAAS,cAAc,GAAG;AAE7C,UAAI,UAAU,SAAS,YAAY,GAAG;AACpC,uBAAe;AAAA,MACjB;AAAA,IACF,OAAO;AACL,YAAM,eAAe,UAAU,MAAM,+BAA+B;AACpE,UAAI,cAAc;AAChB,uBAAe,aAAa,CAAC;AAAA,MAC/B;AAAA,IACF;AAGA,UAAM,SAAS,oBAAoB,WAAW;AAE9C,UAAM,SAA8D;AAAA,MAClE,MAAM;AAAA,MACN;AAAA,MACA,UAAU,CAAC,aAAa,CAAC;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,IACX;AACA,QAAI,iBAAiB,QAAW;AAC9B,aAAO,eAAe;AAAA,IACxB;AACA,YAAQ,KAAK,MAAM;AAAA,EACrB;AAEA,SAAO;AACT;AAKA,SAAS,kBAAkB,QAAmD;AAC5E,QAAM,QAA2C,CAAC;AAIlD,QAAM,YAAY;AAElB,MAAI;AACJ,UAAQ,QAAQ,UAAU,KAAK,MAAM,OAAO,MAAM;AAChD,UAAM,WAAW,MAAM,CAAC;AACxB,UAAM,YAAY,MAAM,CAAC,KAAK;AAG9B,UAAM,SAAS,UACZ,MAAM,GAAG,EACT,IAAI,OAAK,EAAE,KAAK,EAAE,QAAQ,gBAAgB,EAAE,CAAC,EAC7C,OAAO,OAAO;AAEjB,UAAM,KAAK,EAAE,MAAM,UAAU,OAAO,CAAC;AAAA,EACvC;AAEA,SAAO;AACT;AAKA,SAAS,oBAAoB,aAA6B;AACxD,QAAM,UAAkC;AAAA,IACtC,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,WAAW;AAAA,IACX,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,IACX,UAAU;AAAA,IACV,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,OAAO;AAAA,EACT;AAEA,SAAO,QAAQ,WAAW,KAAK;AACjC;AAKA,SAASD,uBAAsB,UAAwB;AACrD,QAAM,UAAM,4BAAQ,QAAQ;AAC5B,MAAI,KAAC,6BAAW,GAAG,GAAG;AACpB,oCAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACpC;AACF;;;AC5cA,IAAAE,qBAA8B;AAC9B,IAAAC,mBAAuE;AAuCvE,IAAM,QAAwB;AAAA,EAC5B,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,WAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,aAAa;AACf;AAKA,eAAsB,OAAO,SAAuC;AAClE,QAAM,SAA0B;AAAA,IAC9B,mBAAe,4BAAQ,QAAQ,IAAI,GAAG,QAAQ,iBAAiB,cAAc;AAAA,IAC7E,cAAU,4BAAQ,QAAQ,IAAI,GAAG,QAAQ,YAAY,SAAS;AAAA,IAC9D,MAAM,QAAQ,QAAQ;AAAA,IACtB,SAAS,QAAQ,cAAU,4BAAQ,QAAQ,IAAI,GAAG,QAAQ,WAAW,gBAAgB,IAAI;AAAA,IACzF,SAAS,QAAQ,WAAW;AAAA,IAC5B,OAAO,QAAQ,UAAU;AAAA;AAAA,IACzB,UAAU,QAAQ,YAAY;AAAA,EAChC;AAEA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,WAAW,oCAAoC,CAAC;AAC5D,UAAQ,IAAI,EAAE;AAGd,QAAM,iBAAiB,MAAM;AAG7B,UAAI,6BAAW,OAAO,aAAa,GAAG;AACpC,UAAM,gBAAgB,MAAM;AAAA,EAC9B,OAAO;AACL,YAAQ,IAAI,UAAU,sCAAsC,OAAO,aAAa,EAAE,CAAC;AACnF,YAAQ,IAAI,UAAU,iEAAiE,CAAC;AAAA,EAC1F;AAGA,MAAI,QAAQ,YAAQ,6BAAW,OAAO,QAAQ,GAAG;AAC/C,UAAM,SAAS,MAAM;AAAA,EACvB;AAGA,MAAI,OAAO,OAAO;AAChB,kBAAc,MAAM;AAAA,EACtB;AAGA,sBAAoB,MAAM;AAG1B,wBAAsB,MAAM;AAG5B,QAAM,UAAU,MAAM;AACxB;AAKA,eAAe,iBAAiB,QAAwC;AACtE,QAAM,UAAU,cAAc,wBAAwB;AACtD,UAAQ,MAAM;AAEd,MAAI;AAEF,UAAM,EAAE,QAAAC,QAAO,IAAI,MAAM,OAAO,eAAe;AAC/C,UAAM,EAAE,iBAAAC,iBAAgB,IAAI,MAAM;AAGlC,UAAM,eAAe,OAAO,UAAU,EAAE,SAAS,OAAO,QAAQ,IAAI,CAAC;AACrE,UAAM,SAAS,IAAID,QAAO,YAAY;AACtC,UAAM,OAAO;AAGb,UAAM,MAAM,MAAMC,iBAAgB,MAAM;AAExC,UAAM,SAAS;AACf,UAAM,MAAM;AACZ,UAAM,YAAY;AAElB,YAAQ,QAAQ,sBAAsB,OAAO,UAAU,gBAAgB,OAAO,OAAO,MAAM,aAAa,EAAE;AAAA,EAC5G,SAAS,OAAO;AACd,YAAQ,KAAK,6BAA6B;AAC1C,QAAI,iBAAiB,SAAS,MAAM,QAAQ,SAAS,oBAAoB,GAAG;AAC1E,cAAQ,MAAM,YAAY,2CAA2C,CAAC;AACtE,cAAQ,MAAM,WAAW,6BAA6B,CAAC;AAAA,IACzD,OAAO;AACL,cAAQ,MAAM,YAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,CAAC;AAAA,IACnF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAKA,eAAe,gBAAgB,QAAwC;AACrE,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,WAAW,uBAAuB,CAAC;AAE/C,MAAI;AACF,UAAM,aAAa,4BAA4B,OAAO,aAAa;AAEnE,QAAI,WAAW,WAAW,GAAG;AAC3B,cAAQ,IAAI,UAAU,uBAAuB,CAAC;AAC9C;AAAA,IACF;AAGA,UAAM,EAAE,yBAAyB,sBAAsB,IAAI,MAAM,OAAO,4BAA4B;AAGpG,UAAM,WAAW,wBAAwB,EAAE,WAA2E,CAAC;AAGvH,UAAM,MAAM,MAAM;AAClB,UAAM,WAAW;AAAA,MACf,MAAM,MAAS,QAAwF;AACrG,cAAMC,UAAS,MAAM,IAAI,OAAO,MAAM;AACtC,eAAO,EAAE,MAAMA,SAAe,QAAQ,CAAC,EAAE;AAAA,MAC3C;AAAA,IACF;AAGA,UAAM,SAAS,sBAAsB,UAAU,UAAU;AAAA,MACvD,GAAI,OAAO,UAAU,EAAE,OAAO,OAAO,QAAQ,IAAI,CAAC;AAAA,MAClD,YAAY,CAAC,UAAU;AACrB,YAAI,OAAO,WAAW,MAAM,UAAU,eAAe,MAAM,UAAU,UAAU;AAE7E,gBAAM,eAAe;AAAA,YACnB,WAAW,MAAM;AAAA,YACjB,OAAO,MAAM;AAAA,YACb,OAAO,MAAM;AAAA,YACb,OAAO,MAAM;AAAA,YACb,GAAI,MAAM,eAAe,UAAa,EAAE,YAAY,MAAM,WAAW;AAAA,YACrE,GAAI,MAAM,UAAU,UAAa,EAAE,OAAO,MAAM,MAAM;AAAA,UACxD;AACA,kBAAQ,IAAI,sBAAsB,YAAY,CAAC;AAAA,QACjD;AAAA,MACF;AAAA,IACF,CAAC;AAGD,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,SAAS,MAAM,OAAO,QAAQ;AACpC,UAAM,WAAW,KAAK,IAAI,IAAI;AAG9B,UAAM,oBAAoB,qBAAqB,OAAO,aAAa;AAEnE,QAAI,OAAO,SAAS;AAClB,UAAI,OAAO,kBAAkB,GAAG;AAC9B,gBAAQ,IAAI,UAAU,0BAA0B,CAAC;AAAA,MACnD,OAAO;AACL,gBAAQ,IAAI,cAAc,aAAa,OAAO,aAAa,oBAAoB,eAAe,QAAQ,CAAC,EAAE,CAAC;AAAA,MAC5G;AAAA,IACF,OAAO;AACL,cAAQ,MAAM,YAAY,oBAAoB,CAAC;AAC/C,YAAM,eAAe,OAAO,QAAQ,KAAK,CAAC,MAA4B,CAAC,EAAE,OAAO;AAChF,UAAI,cAAc;AAChB,gBAAQ,MAAM,YAAY,gBAAgB,aAAa,EAAE,EAAE,CAAC;AAC5D,gBAAQ,MAAM,YAAY,YAAY,aAAa,KAAK,EAAE,CAAC;AAAA,MAC7D;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,YAAY,kBAAkB,GAAG,iBAAiB,QAAQ,MAAM,UAAU,KAAK;AAC7F,QAAI,OAAO,WAAW,iBAAiB,SAAS,MAAM,OAAO;AAC3D,cAAQ,MAAM,MAAM,KAAK;AAAA,IAC3B;AAAA,EACF;AACF;AAKA,eAAe,SAAS,QAAwC;AAC9D,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,WAAW,kBAAkB,CAAC;AAE1C,MAAI;AACF,UAAM,YAAY,cAAc,OAAO,QAAQ;AAE/C,QAAI,UAAU,WAAW,GAAG;AAC1B,cAAQ,IAAI,UAAU,uBAAuB,CAAC;AAC9C;AAAA,IACF;AAEA,eAAW,YAAY,WAAW;AAChC,cAAQ,IAAI,UAAU,aAAa,SAAS,IAAI,KAAK,CAAC;AAEtD,UAAI;AAEF,cAAM,WAAW,SAAS;AAG1B,YAAI,SAAS,KAAK,SAAS,MAAM,GAAG;AAClC,gBAAM,MAAM,MAAM;AAClB,gBAAM,cAAU,+BAAa,UAAU,OAAO;AAC9C,gBAAM,IAAI,OAAO,OAAO;AACxB,kBAAQ,IAAI,cAAc,eAAe,SAAS,IAAI,EAAE,CAAC;AAAA,QAC3D,WAES,SAAS,KAAK,SAAS,KAAK,KAAK,SAAS,KAAK,SAAS,KAAK,GAAG;AAEvE,gBAAM,aAAa,MAAM,OAAO;AAChC,gBAAM,SAAS,WAAW,WAAW,WAAW;AAEhD,cAAI,OAAO,WAAW,YAAY;AAChC,kBAAM,OAAO,MAAM,GAAG;AACtB,oBAAQ,IAAI,cAAc,eAAe,SAAS,IAAI,EAAE,CAAC;AAAA,UAC3D,OAAO;AACL,oBAAQ,IAAI,cAAc,eAAe,SAAS,IAAI,uCAAuC,CAAC;AAAA,UAChG;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,YAAY,cAAc,SAAS,IAAI,GAAG,GAAG,iBAAiB,QAAQ,MAAM,UAAU,KAAK;AAAA,MAC3G;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,YAAY,aAAa,GAAG,iBAAiB,QAAQ,MAAM,UAAU,KAAK;AAAA,EAC1F;AACF;AAKA,SAAS,cAAc,KAAoD;AACzE,MAAI,KAAC,6BAAW,GAAG,GAAG;AACpB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,cAAU,8BAAY,GAAG;AAC/B,QAAM,YAAmD,CAAC;AAE1D,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,WAAW,GAAG,KAAK,MAAM,WAAW,GAAG,GAAG;AAClD;AAAA,IACF;AAEA,UAAM,gBAAY,yBAAK,KAAK,KAAK;AACjC,UAAM,WAAO,2BAAS,SAAS;AAE/B,QAAI,KAAK,OAAO,MAAM,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,KAAK,KAAK,MAAM,SAAS,KAAK,IAAI;AAC/F,gBAAU,KAAK,EAAE,MAAM,OAAO,MAAM,UAAU,CAAC;AAAA,IACjD;AAAA,EACF;AAGA,SAAO,UAAU,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAC9D;AAKA,SAAS,cAAc,QAA+B;AACpD,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,WAAW,yBAAyB,CAAC;AAGjD,UAAI,6BAAW,OAAO,aAAa,GAAG;AACpC,QAAI;AACF,YAAM,uBAAmB,wBAAM,OAAO,eAAe,EAAE,WAAW,KAAK,GAAG,CAAC,WAAW,aAAa;AACjG,YAAI,aAAa,SAAS,SAAS,KAAK,KAAK,SAAS,SAAS,KAAK,KAAK,SAAS,SAAS,MAAM,IAAI;AACnG,gCAAsB,QAAQ,WAAW,QAAQ;AAAA,QACnD;AAAA,MACF,CAAC;AACD,cAAQ,IAAI,UAAU,0BAA0B,OAAO,aAAa,EAAE,CAAC;AAAA,IACzE,SAAS,OAAO;AACd,cAAQ,IAAI,cAAc,2CAA2C,iBAAiB,QAAQ,MAAM,UAAU,KAAK,EAAE,CAAC;AAAA,IACxH;AAAA,EACF;AAGA,UAAI,6BAAW,OAAO,QAAQ,GAAG;AAC/B,QAAI;AACF,YAAM,kBAAc,wBAAM,OAAO,UAAU,EAAE,WAAW,KAAK,GAAG,CAAC,WAAW,aAAa;AACvF,YAAI,aAAa,SAAS,SAAS,KAAK,KAAK,SAAS,SAAS,KAAK,KAAK,SAAS,SAAS,MAAM,IAAI;AACnG,2BAAiB,QAAQ,WAAW,QAAQ;AAAA,QAC9C;AAAA,MACF,CAAC;AACD,cAAQ,IAAI,UAAU,qBAAqB,OAAO,QAAQ,EAAE,CAAC;AAAA,IAC/D,SAAS,OAAO;AACd,cAAQ,IAAI,cAAc,sCAAsC,iBAAiB,QAAQ,MAAM,UAAU,KAAK,EAAE,CAAC;AAAA,IACnH;AAAA,EACF;AACF;AAKA,IAAI,yBAAgD;AAEpD,SAAS,sBAAsB,QAAyB,WAAmB,UAAwB;AAEjG,MAAI,wBAAwB;AAC1B,iBAAa,sBAAsB;AAAA,EACrC;AAEA,2BAAyB,WAAW,YAAY;AAC9C,UAAM,UAAU,qBAAqB,OAAO,aAAa;AAEzD,QAAI,YAAY,MAAM,mBAAmB;AACvC,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,WAAW,aAAa,SAAS,KAAK,QAAQ,EAAE,CAAC;AAG7D,YAAM,gBAAgB,MAAM;AAAA,IAC9B;AAAA,EACF,GAAG,GAAG;AACR;AAKA,SAAS,iBAAiB,SAA0B,WAAmB,UAAwB;AAC7F,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,WAAW,QAAQ,SAAS,KAAK,QAAQ,EAAE,CAAC;AACxD,UAAQ,IAAI,UAAU,4DAA4D,CAAC;AACrF;AAKA,SAAS,qBAAqB,KAAqB;AACjD,MAAI,KAAC,6BAAW,GAAG,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,aAAa,4BAA4B,GAAG;AAClD,WAAO,WAAW,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,IAAI,EAAE,GAAG,MAAM,EAAE,EAAE,KAAK,GAAG;AAAA,EAC9E,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKA,SAAS,oBAAoB,QAA+B;AAC1D,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,0CAA0C;AACtD,UAAQ,IAAI,cAAc,oCAAoC,CAAC;AAC/D,UAAQ,IAAI,0CAA0C;AACtD,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,kBAAkB;AAC9B,UAAQ,IAAI,UAAU,0CAA0C,CAAC;AACjE,UAAQ,IAAI,UAAU,eAAe,OAAO,WAAW,WAAW,EAAE,CAAC;AACrE,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,qBAAqB;AACjC,UAAQ,IAAI,UAAU,kDAAkD,CAAC;AACzE,UAAQ,IAAI,UAAU,oDAAoD,CAAC;AAC3E,UAAQ,IAAI,UAAU,2DAA2D,CAAC;AAClF,UAAQ,IAAI,EAAE;AAEd,MAAI,OAAO,UAAU;AACnB,YAAQ,IAAI,WAAW,8BAA8B,CAAC;AACtD,YAAQ,IAAI,UAAU,mDAAmD,CAAC;AAC1E,YAAQ,IAAI,EAAE;AAAA,EAChB;AAEA,UAAQ,IAAI,UAAU,sBAAsB,CAAC;AAC7C,UAAQ,IAAI,EAAE;AAChB;AAKA,SAAS,sBAAsB,SAAgC;AAC7D,QAAM,WAAW,YAAY;AAC3B,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,WAAW,kBAAkB,CAAC;AAG1C,QAAI,MAAM,kBAAkB;AAC1B,YAAM,iBAAiB,MAAM;AAAA,IAC/B;AACA,QAAI,MAAM,aAAa;AACrB,YAAM,YAAY,MAAM;AAAA,IAC1B;AAGA,QAAI,MAAM,KAAK;AACb,UAAI;AACF,cAAM,MAAM,MAAM;AAClB,cAAM,IAAI,IAAI;AAAA,MAChB,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,UAAM,YAAY;AAClB,YAAQ,IAAI,cAAc,UAAU,CAAC;AACrC,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,GAAG,UAAU,QAAQ;AAC7B,UAAQ,GAAG,WAAW,QAAQ;AAChC;AAKA,eAAe,UAAU,SAAyC;AAEhE,SAAO,IAAI,QAAQ,MAAM;AAAA,EAGzB,CAAC;AACH;;;ACncA,IAAAC,qBAA8B;AAC9B,IAAAC,mBAAmF;AAiBnF,eAAsB,YAAY,SAAuC;AACvE,QAAM,oBAAgB,4BAAQ,QAAQ,IAAI,GAAG,QAAQ,iBAAiB,cAAc;AACpF,QAAM,eAAW,4BAAQ,QAAQ,IAAI,GAAG,QAAQ,YAAY,SAAS;AACrE,QAAM,UAAU,QAAQ,cAAU,4BAAQ,QAAQ,IAAI,GAAG,QAAQ,WAAW,gBAAgB,IAAI;AAChG,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,aAAa,QAAQ,QAAQ;AAEnC,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,WAAW,mCAAmC,CAAC;AAC3D,UAAQ,IAAI,EAAE;AAEd,MAAI;AAEF,QAAI,eAAW,6BAAW,OAAO,GAAG;AAClC,cAAQ,IAAI,UAAU,8BAA8B,OAAO,EAAE,CAAC;AAC9D,mCAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAChD,sCAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,IACxC;AAGA,UAAM,UAAU,cAAc,gCAAgC;AAC9D,YAAQ,MAAM;AAGd,UAAM,EAAE,QAAAC,QAAO,IAAI,MAAM,OAAO,eAAe;AAC/C,UAAM,EAAE,iBAAAC,iBAAgB,IAAI,MAAM;AAGlC,UAAM,eAAe,UAAU,EAAE,QAAQ,IAAI,CAAC;AAC9C,UAAM,SAAS,IAAID,QAAO,YAAY;AACtC,UAAM,OAAO;AAGb,UAAM,MAAM,MAAMC,iBAAgB,MAAM;AAExC,YAAQ,QAAQ,4BAA4B;AAG5C,YAAI,6BAAW,aAAa,GAAG;AAC7B,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,WAAW,uBAAuB,CAAC;AAE/C,YAAM,aAAa,4BAA4B,aAAa;AAE5D,UAAI,WAAW,WAAW,GAAG;AAC3B,gBAAQ,IAAI,UAAU,uBAAuB,CAAC;AAAA,MAChD,OAAO;AAEL,cAAM,EAAE,yBAAyB,sBAAsB,IAAI,MAAM,OAAO,4BAA4B;AAGpG,cAAM,WAAW,wBAAwB,EAAE,WAA2E,CAAC;AAGvH,cAAM,WAAW;AAAA,UACf,MAAM,MAAS,QAAwF;AACrG,kBAAMC,UAAS,MAAM,IAAI,OAAO,MAAM;AACtC,mBAAO,EAAE,MAAMA,SAAe,QAAQ,CAAC,EAAE;AAAA,UAC3C;AAAA,QACF;AAGA,cAAM,SAAS,sBAAsB,UAAU,UAAU;AAAA,UACvD,GAAI,UAAU,EAAE,OAAO,QAAQ,IAAI,CAAC;AAAA,UACpC,YAAY,CAAC,UAAU;AACrB,gBAAI,WAAW,MAAM,UAAU,eAAe,MAAM,UAAU,UAAU;AAEtE,oBAAM,eAAe;AAAA,gBACnB,WAAW,MAAM;AAAA,gBACjB,OAAO,MAAM;AAAA,gBACb,OAAO,MAAM;AAAA,gBACb,OAAO,MAAM;AAAA,gBACb,GAAI,MAAM,eAAe,UAAa,EAAE,YAAY,MAAM,WAAW;AAAA,gBACrE,GAAI,MAAM,UAAU,UAAa,EAAE,OAAO,MAAM,MAAM;AAAA,cACxD;AACA,sBAAQ,IAAI,sBAAsB,YAAY,CAAC;AAAA,YACjD;AAAA,UACF;AAAA,QACF,CAAC;AAGD,cAAM,YAAY,KAAK,IAAI;AAC3B,cAAM,SAAS,MAAM,OAAO,QAAQ;AACpC,cAAM,WAAW,KAAK,IAAI,IAAI;AAE9B,YAAI,OAAO,SAAS;AAClB,kBAAQ,IAAI,cAAc,aAAa,OAAO,aAAa,oBAAoB,eAAe,QAAQ,CAAC,EAAE,CAAC;AAAA,QAC5G,OAAO;AACL,kBAAQ,MAAM,YAAY,oBAAoB,CAAC;AAC/C,gBAAM,eAAe,OAAO,QAAQ,KAAK,CAAC,MAA4B,CAAC,EAAE,OAAO;AAChF,cAAI,cAAc;AAChB,oBAAQ,MAAM,YAAY,gBAAgB,aAAa,EAAE,EAAE,CAAC;AAC5D,oBAAQ,MAAM,YAAY,YAAY,aAAa,KAAK,EAAE,CAAC;AAAA,UAC7D;AACA,gBAAM,IAAI,IAAI;AACd,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAGA,QAAI,kBAAc,6BAAW,QAAQ,GAAG;AACtC,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,WAAW,kBAAkB,CAAC;AAE1C,YAAM,YAAYC,eAAc,QAAQ;AAExC,UAAI,UAAU,WAAW,GAAG;AAC1B,gBAAQ,IAAI,UAAU,uBAAuB,CAAC;AAAA,MAChD,OAAO;AACL,mBAAW,YAAY,WAAW;AAChC,kBAAQ,IAAI,UAAU,aAAa,SAAS,IAAI,KAAK,CAAC;AAEtD,cAAI;AAEF,gBAAI,SAAS,KAAK,SAAS,MAAM,GAAG;AAClC,oBAAM,cAAU,+BAAa,SAAS,MAAM,OAAO;AACnD,oBAAM,IAAI,OAAO,OAAO;AACxB,sBAAQ,IAAI,cAAc,eAAe,SAAS,IAAI,EAAE,CAAC;AAAA,YAC3D,WAES,SAAS,KAAK,SAAS,KAAK,KAAK,SAAS,KAAK,SAAS,KAAK,GAAG;AAEvE,oBAAM,aAAa,MAAM,OAAO,SAAS;AACzC,oBAAM,SAAS,WAAW,WAAW,WAAW;AAEhD,kBAAI,OAAO,WAAW,YAAY;AAChC,sBAAM,OAAO,GAAG;AAChB,wBAAQ,IAAI,cAAc,eAAe,SAAS,IAAI,EAAE,CAAC;AAAA,cAC3D,OAAO;AACL,wBAAQ,IAAI,cAAc,eAAe,SAAS,IAAI,uCAAuC,CAAC;AAAA,cAChG;AAAA,YACF;AAAA,UACF,SAAS,OAAO;AACd,oBAAQ,MAAM,YAAY,cAAc,SAAS,IAAI,GAAG,GAAG,iBAAiB,QAAQ,MAAM,UAAU,KAAK;AAAA,UAC3G;AAAA,QACF;AAAA,MACF;AAAA,IACF,WAAW,YAAY;AACrB,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,cAAc,8BAA8B,QAAQ,EAAE,CAAC;AAAA,IACrE;AAGA,UAAM,IAAI,IAAI;AAEd,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,cAAc,0BAA0B,CAAC;AACrD,YAAQ,IAAI,EAAE;AAGd,QAAI,QAAQ,MAAM;AAChB,cAAQ,IAAI,KAAK,UAAU;AAAA,QACzB,SAAS;AAAA,QACT;AAAA,QACA,uBAAmB,6BAAW,aAAa,IAAI,4BAA4B,aAAa,EAAE,SAAS;AAAA,QACnG,cAAc,kBAAc,6BAAW,QAAQ,IAAIA,eAAc,QAAQ,EAAE,SAAS;AAAA,MACtF,GAAG,MAAM,CAAC,CAAC;AAAA,IACb;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,YAAY,eAAe,GAAG,iBAAiB,QAAQ,MAAM,UAAU,KAAK;AAC1F,QAAI,WAAW,iBAAiB,SAAS,MAAM,OAAO;AACpD,cAAQ,MAAM,MAAM,KAAK;AAAA,IAC3B;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAKA,SAASA,eAAc,KAAoD;AACzE,MAAI,KAAC,6BAAW,GAAG,GAAG;AACpB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,cAAU,8BAAY,GAAG;AAC/B,QAAM,YAAmD,CAAC;AAE1D,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,WAAW,GAAG,KAAK,MAAM,WAAW,GAAG,GAAG;AAClD;AAAA,IACF;AAEA,UAAM,gBAAY,yBAAK,KAAK,KAAK;AACjC,UAAM,WAAO,2BAAS,SAAS;AAE/B,QAAI,KAAK,OAAO,MAAM,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,KAAK,KAAK,MAAM,SAAS,KAAK,IAAI;AAC/F,gBAAU,KAAK,EAAE,MAAM,OAAO,MAAM,UAAU,CAAC;AAAA,IACjD;AAAA,EACF;AAGA,SAAO,UAAU,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAC9D;;;ACvNA,IAAAC,mBAAmE;AACnE,qBAAwB;AACxB,IAAAC,qBAAqB;AAkCrB,IAAM,iBAA4B;AAAA,EAChC,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,SAAS;AAAA,EACT,MAAM,CAAC;AAAA,EACP,iBAAiB,CAAC;AAAA,EAClB,YAAY;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV;AACF;AAKO,SAAS,eAAuB;AACrC,aAAO,6BAAK,wBAAQ,GAAG,cAAc;AACvC;AAKO,SAAS,gBAAwB;AACtC,aAAO,yBAAK,aAAa,GAAG,aAAa;AAC3C;AAKO,SAAS,kBAAwB;AACtC,QAAM,YAAY,aAAa;AAC/B,MAAI,KAAC,6BAAW,SAAS,GAAG;AAC1B,oCAAU,WAAW,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AAAA,EACvD;AACF;AAOO,SAAS,aAAwB;AACtC,QAAM,aAAa,cAAc;AAEjC,MAAI,KAAC,6BAAW,UAAU,GAAG;AAC3B,WAAO,EAAE,GAAG,eAAe;AAAA,EAC7B;AAEA,MAAI;AACF,UAAM,cAAU,+BAAa,YAAY,OAAO;AAChD,UAAM,aAAa,KAAK,MAAM,OAAO;AAGrC,WAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,MAAM;AAAA,QACJ,GAAG,eAAe;AAAA,QAClB,GAAG,WAAW;AAAA,MAChB;AAAA,MACA,YAAY;AAAA,QACV,GAAG,eAAe;AAAA,QAClB,GAAG,WAAW;AAAA,MAChB;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AAEd,YAAQ,KAAK,yCAAyC,UAAU,EAAE;AAClE,WAAO,EAAE,GAAG,eAAe;AAAA,EAC7B;AACF;AAOO,SAAS,WAAW,QAAyB;AAClD,kBAAgB;AAChB,QAAM,aAAa,cAAc;AAEjC,MAAI;AACF,wCAAc,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG;AAAA,MACzD,MAAM;AAAA;AAAA,IACR,CAAC;AAAA,EACH,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAAA,EACtG;AACF;AAQO,SAAS,aAAa,SAAwC;AACnE,QAAM,SAAS,WAAW;AAG1B,QAAM,UAAqB,EAAE,GAAG,OAAO;AAGvC,MAAI,QAAQ,WAAW,OAAW,SAAQ,SAAS,QAAQ;AAC3D,MAAI,QAAQ,oBAAoB,OAAW,SAAQ,kBAAkB,QAAQ;AAC7E,MAAI,QAAQ,iBAAiB,OAAW,SAAQ,eAAe,QAAQ;AACvE,MAAI,QAAQ,YAAY,OAAW,SAAQ,UAAU,QAAQ;AAC7D,MAAI,QAAQ,oBAAoB,OAAW,SAAQ,kBAAkB,QAAQ;AAG7E,MAAI,QAAQ,MAAM;AAChB,YAAQ,OAAO,EAAE,GAAG,OAAO,MAAM,GAAG,QAAQ,KAAK;AAAA,EACnD;AAGA,MAAI,QAAQ,YAAY;AACtB,YAAQ,aAAa,EAAE,GAAG,OAAO,YAAY,GAAG,QAAQ,WAAW;AAAA,EACrE;AAEA,aAAW,OAAO;AAClB,SAAO;AACT;AA4BO,SAAS,kBAAkB,UAAwB;AACxD,QAAM,SAAS,WAAW;AAC1B,QAAM,SAAS,OAAO,mBAAmB,CAAC;AAG1C,QAAM,WAAW,OAAO,OAAO,CAAC,MAAM,MAAM,QAAQ;AACpD,WAAS,QAAQ,QAAQ;AAGzB,QAAM,UAAU,SAAS,MAAM,GAAG,EAAE;AAEpC,eAAa,EAAE,iBAAiB,QAAQ,CAAC;AAC3C;AAQO,SAAS,UAAU,UAA2B;AACnD,MAAI,SAAU,QAAO;AACrB,MAAI,QAAQ,IAAI,qBAAqB,EAAG,QAAO,QAAQ,IAAI,qBAAqB;AAChF,SAAO,WAAW,EAAE,UAAU,eAAe;AAC/C;AAKO,SAAS,cAAoB;AAClC,aAAW,EAAE,GAAG,eAAe,CAAC;AAClC;;;ACtNA;AAsCO,SAAS,WACd,OACA,QACA,WACA,cACM;AACN,QAAM,SAAS,WAAW;AAC1B,QAAM,MAAM,UAAU,UAAU;AAEhC,SAAO,OAAO,OAAO,QAAQ,CAAC;AAC9B,QAAM,YAA0E,EAAE,MAAM;AACxF,MAAI,UAAW,WAAU,YAAY,UAAU,YAAY;AAC3D,MAAI,aAAc,WAAU,eAAe;AAC3C,SAAO,KAAK,GAAG,IAAI;AAEnB,aAAW,MAAM;AACnB;AAQO,SAAS,UAAU,QAAmC;AAC3D,QAAM,SAAS,WAAW;AAC1B,QAAM,MAAM,UAAU,UAAU;AAEhC,QAAM,WAAW,OAAO,OAAO,GAAG;AAClC,MAAI,CAAC,SAAU,QAAO;AAEtB,QAAM,SAAoB,EAAE,OAAO,SAAS,MAAM;AAClD,MAAI,SAAS,UAAW,QAAO,YAAY,IAAI,KAAK,SAAS,SAAS;AACtE,MAAI,SAAS,aAAc,QAAO,eAAe,SAAS;AAC1D,SAAO;AACT;AAOO,SAAS,YAAY,QAAuB;AACjD,QAAM,SAAS,WAAW;AAC1B,QAAM,MAAM,UAAU,UAAU;AAEhC,MAAI,OAAO,OAAO,GAAG,GAAG;AACtB,WAAO,OAAO,KAAK,GAAG;AACtB,eAAW,MAAM;AAAA,EACnB;AACF;AAQO,SAAS,cAAc,QAA0B;AACtD,QAAM,OAAO,UAAU,MAAM;AAC7B,MAAI,CAAC,KAAM,QAAO;AAGlB,MAAI,KAAK,aAAa,KAAK,YAAY,oBAAI,KAAK,GAAG;AACjD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAYO,SAAS,SAAS,QAAgC;AAEvD,MAAI,QAAQ,IAAI,qBAAqB,GAAG;AACtC,WAAO,QAAQ,IAAI,qBAAqB;AAAA,EAC1C;AAGA,QAAM,OAAO,UAAU,MAAM;AAC7B,MAAI,QAAQ,cAAc,MAAM,GAAG;AACjC,WAAO,KAAK;AAAA,EACd;AAEA,SAAO;AACT;AASO,SAAS,aAAa,QAAyB;AACpD,QAAM,QAAQ,SAAS,MAAM;AAC7B,MAAI,CAAC,OAAO;AACV,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAQA,eAAsB,qBAAqB,QAAiD;AAC1F,QAAM,QAAQ,SAAS,MAAM;AAC7B,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,MAAM,UAAU,UAAU;AAChC,QAAM,WAAW,IAAI,QAAQ,mBAAmB,UAAU;AAE1D,SAAO,cAAc,OAAO,EAAE,SAAS,CAAC;AAC1C;AAuEA,eAAsB,gBAAgB,QAAgB,QAAuC;AAC3F,QAAM,MAAM,UAAU,UAAU;AAGhC,QAAM,aAAa,MAAM,cAAc,QAAQ;AAAA,IAC7C,UAAU,IAAI,QAAQ,mBAAmB,UAAU;AAAA,EACrD,CAAC;AAED,MAAI,CAAC,WAAW,OAAO;AACrB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,WAAW,SAAS;AAAA,IAC7B;AAAA,EACF;AAGA,aAAW,QAAQ,KAAK,WAAW,SAAS;AAE5C,QAAM,SAAsB;AAAA,IAC1B,SAAS;AAAA,IACT,OAAO;AAAA,EACT;AACA,MAAI,WAAW,KAAM,QAAO,OAAO,WAAW;AAC9C,SAAO;AACT;AAOO,SAAS,OAAO,QAAuB;AAC5C,cAAY,MAAM;AACpB;AAQA,eAAsB,eAAe,QAI3B;AACR,QAAM,aAAa,MAAM,qBAAqB,MAAM;AACpD,SAAO,WAAW,SAAS,WAAW,OAAO,WAAW,OAAO;AACjE;;;AC/QO,SAAS,gBAAgB,SAAsC;AACpE,MAAI,QAAQ,OAAQ,QAAO,QAAQ;AACnC,MAAI,QAAQ,IAAI,2BAA2B,GAAG;AAC5C,WAAO,QAAQ,IAAI,2BAA2B;AAAA,EAChD;AACA,SAAO;AACT;AAKO,SAAS,eAAe,SAAiC;AAC9D,MAAI,QAAQ,QAAS,QAAO;AAC5B,MAAI,QAAQ,IAAI,UAAU,EAAG,QAAO;AACpC,SAAO,QAAQ,OAAO,SAAS;AACjC;AAGA,IAAMC,UAAS;AAAA,EACb,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AACR;AAKA,SAASC,UAAS,MAAc,OAA4B,SAAgC;AAC1F,MAAI,CAAC,eAAe,OAAO,EAAG,QAAO;AACrC,SAAO,GAAGD,QAAO,KAAK,CAAC,GAAG,IAAI,GAAGA,QAAO,KAAK;AAC/C;AAKO,SAAS,aACd,MACA,UAAyB,CAAC,GAClB;AACR,QAAM,SAAS,gBAAgB,OAAO;AAEtC,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,WAAW,IAAI;AAAA,IACxB,KAAK;AACH,aAAO,kBAAkB,MAAM,OAAO;AAAA,IACxC,KAAK;AACH,aAAO,YAAY,IAAI;AAAA,IACzB;AACE,aAAO,kBAAkB,MAAM,OAAO;AAAA,EAC1C;AACF;AAKO,SAAS,WAAW,MAAuB;AAChD,SAAO,KAAK,UAAU,MAAM,MAAM,CAAC;AACrC;AAKO,SAAS,YAAY,MAAuB;AACjD,MAAI,SAAS,QAAQ,SAAS,OAAW,QAAO;AAChD,MAAI,OAAO,SAAS,SAAU,QAAO;AACrC,MAAI,OAAO,SAAS,SAAU,QAAO,OAAO,IAAI;AAEhD,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,WAAO,KAAK,IAAI,CAAC,SAAS,YAAY,IAAI,CAAC,EAAE,KAAK,IAAI;AAAA,EACxD;AAGA,SAAO,OAAO,QAAQ,IAA+B,EAClD,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,GAAG,IAAIE,aAAY,KAAK,CAAC,EAAE,EACpD,KAAK,IAAI;AACd;AAKA,SAASA,aAAY,OAAwB;AAC3C,MAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAClD,MAAI,OAAO,UAAU,SAAU,QAAO,KAAK,UAAU,KAAK;AAC1D,SAAO,OAAO,KAAK;AACrB;AAKO,SAAS,kBAAkB,MAAe,UAAyB,CAAC,GAAW;AACpF,MAAI,SAAS,QAAQ,SAAS,OAAW,QAAO;AAChD,MAAI,OAAO,SAAS,SAAU,QAAO,OAAO,IAAI;AAEhD,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,QAAI,KAAK,WAAW,EAAG,QAAOD,UAAS,WAAW,OAAO,OAAO;AAGhE,QAAI,OAAO,KAAK,CAAC,MAAM,YAAY,KAAK,CAAC,MAAM,MAAM;AACnD,aAAO,kBAAkB,MAAmC,OAAO;AAAA,IACrE;AAGA,WAAO,KAAK,IAAI,CAAC,SAAS,OAAO,IAAI,CAAC,EAAE,KAAK,IAAI;AAAA,EACnD;AAGA,SAAO,mBAAmB,MAAiC,OAAO;AACpE;AAKA,SAAS,kBACP,MACA,SACQ;AACR,MAAI,KAAK,WAAW,EAAG,QAAOA,UAAS,WAAW,OAAO,OAAO;AAGhE,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,QAAQ,MAAM;AACvB,eAAW,OAAO,OAAO,KAAK,IAAI,GAAG;AACnC,WAAK,IAAI,GAAG;AAAA,IACd;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,KAAK,IAAI;AAC/B,QAAM,OAAO,KAAK;AAAA,IAAI,CAAC,SACrB,QAAQ,IAAI,CAAC,QAAQ,gBAAgB,KAAK,GAAG,CAAC,CAAC;AAAA,EACjD;AAEA,SAAO,YAAiB,SAAS,IAAI;AACvC;AAKA,SAAS,mBACP,MACA,SACQ;AACR,QAAM,eAAe,KAAK,IAAI,GAAG,OAAO,KAAK,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;AAEvE,SAAO,OAAO,QAAQ,IAAI,EACvB,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AACrB,UAAM,YAAY,IAAI,OAAO,YAAY;AACzC,UAAM,eAAeA,UAAS,WAAW,QAAQ,OAAO;AACxD,WAAO,GAAG,YAAY,KAAK,gBAAgB,KAAK,CAAC;AAAA,EACnD,CAAC,EACA,KAAK,IAAI;AACd;AAKA,SAAS,gBAAgB,OAAwB;AAC/C,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,OAAO,UAAU,UAAW,QAAO,QAAQ,SAAS;AACxD,MAAI,iBAAiB,KAAM,QAAO,MAAM,YAAY;AACpD,MAAI,OAAO,UAAU,SAAU,QAAO,KAAK,UAAU,KAAK;AAC1D,SAAO,OAAO,KAAK;AACrB;AAKO,SAAS,MAAM,MAAe,UAAyB,CAAC,GAAS;AACtE,UAAQ,IAAI,aAAa,MAAM,OAAO,CAAC;AACzC;AAKO,SAAS,WAAW,SAAiB,UAAyB,CAAC,GAAS;AAC7E,QAAM,SAAS,gBAAgB,OAAO;AAEtC,MAAI,WAAW,QAAQ;AACrB,YAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,QAAQ,CAAC,CAAC;AAAA,EAClD,OAAO;AACL,YAAQ,MAAMA,UAAS,UAAU,OAAO,IAAI,OAAO,OAAO,CAAC;AAAA,EAC7D;AACF;AAKO,SAAS,aAAa,SAAiB,UAAyB,CAAC,GAAS;AAC/E,QAAM,SAAS,gBAAgB,OAAO;AAEtC,MAAI,WAAW,QAAQ;AACrB,YAAQ,IAAI,KAAK,UAAU,EAAE,SAAS,MAAM,QAAQ,CAAC,CAAC;AAAA,EACxD,OAAO;AACL,YAAQ,IAAIA,UAAS,YAAY,OAAO,IAAI,SAAS,OAAO,CAAC;AAAA,EAC/D;AACF;AAkBO,SAAS,UAAU,SAAiB,UAAyB,CAAC,GAAS;AAC5E,QAAM,SAAS,gBAAgB,OAAO;AAEtC,MAAI,WAAW,QAAQ;AAErB,QAAI,QAAQ,SAAS;AACnB,cAAQ,IAAI,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC,CAAC;AAAA,IAC/C;AAAA,EACF,OAAO;AACL,YAAQ,IAAIE,UAAS,SAAS,QAAQ,OAAO,CAAC;AAAA,EAChD;AACF;AAKO,SAAS,aAAa,SAAiB,UAAyB,CAAC,GAAS;AAC/E,MAAI,CAAC,QAAQ,QAAS;AAEtB,QAAM,SAAS,gBAAgB,OAAO;AAEtC,MAAI,WAAW,QAAQ;AACrB,YAAQ,IAAI,KAAK,UAAU,EAAE,SAAS,QAAQ,CAAC,CAAC;AAAA,EAClD,OAAO;AACL,YAAQ,IAAIA,UAAS,aAAa,OAAO,IAAI,OAAO,OAAO,CAAC;AAAA,EAC9D;AACF;AAeO,SAAS,YAAe,QAA0B,UAAyB,CAAC,GAAS;AAC1F,QAAM,SAAS,gBAAgB,OAAO;AAEtC,MAAI,WAAW,QAAQ;AACrB,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC3C;AAAA,EACF;AAEA,MAAI,OAAO,SAAS;AAClB,QAAI,OAAO,SAAS;AAClB,mBAAa,OAAO,SAAS,OAAO;AAAA,IACtC;AACA,QAAI,OAAO,SAAS,QAAW;AAC7B,YAAM,OAAO,MAAM,OAAO;AAAA,IAC5B;AAAA,EACF,OAAO;AACL,QAAI,OAAO,OAAO;AAChB,iBAAW,OAAO,OAAO,OAAO;AAAA,IAClC;AAAA,EACF;AACF;AAKO,SAAS,YAAY,OAAuB;AACjD,QAAM,QAAQ,CAAC,KAAK,MAAM,MAAM,MAAM,IAAI;AAC1C,MAAI,YAAY;AAChB,MAAI,QAAQ;AAEZ,SAAO,SAAS,QAAQ,YAAY,MAAM,SAAS,GAAG;AACpD,aAAS;AACT;AAAA,EACF;AAEA,SAAO,GAAG,MAAM,QAAQ,cAAc,IAAI,IAAI,CAAC,CAAC,IAAI,MAAM,SAAS,CAAC;AACtE;AAKO,SAASC,gBAAe,IAAoB;AACjD,MAAI,KAAK,IAAM,QAAO,GAAG,EAAE;AAC3B,MAAI,KAAK,IAAO,QAAO,IAAI,KAAK,KAAM,QAAQ,CAAC,CAAC;AAEhD,QAAM,UAAU,KAAK,MAAM,KAAK,GAAK;AACrC,QAAM,WAAY,KAAK,MAAS,KAAM,QAAQ,CAAC;AAC/C,SAAO,GAAG,OAAO,KAAK,OAAO;AAC/B;;;ACpSA,eAAsB,UAAU,SAAuC;AACrE,QAAM,EAAE,MAAM,QAAQ,MAAM,OAAO,MAAM,UAAU,IAAM,IAAI;AAG7D,MAAI,CAAC,MAAM;AACT,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,OAAO;AAAA,IACT,GAAG,OAAO;AACV,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,CAAC,0BAA0B,KAAK,IAAI,GAAG;AACzC,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,OAAO;AAAA,IACT,GAAG,OAAO;AACV,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI;AACF,UAAM,QAAQ,aAAa,QAAQ,MAAM;AACzC,UAAM,SAAS,UAAU,QAAQ,MAAM;AAEvC,cAAU,sBAAsB,IAAI,QAAQ,OAAO;AACnD,iBAAa,YAAY,MAAM,IAAI,OAAO;AAG1C,UAAM,WAAW,MAAM,MAAM,GAAG,MAAM,iBAAiB;AAAA,MACrD,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,iBAAiB,UAAU,KAAK;AAAA,QAChC,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB;AAAA,QACA,QAAQ,UAAU;AAAA,QAClB,MAAM,QAAQ;AAAA,MAChB,CAAC;AAAA,IACH,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQ,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,EAAE,SAAS,4BAA4B,EAAE;AAC1F,kBAAY;AAAA,QACV,SAAS;AAAA,QACT,OAAQ,MAA+C,WAAY,MAA6B,SAAS;AAAA,MAC3G,GAAG,OAAO;AACV,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAI,WAAW,MAAM,SAAS,KAAK;AAGnC,QAAI,QAAQ,SAAS,WAAW,YAAY;AAC1C,gBAAU,uCAAuC,OAAO;AAExD,YAAM,YAAY,KAAK,IAAI;AAC3B,aAAO,SAAS,WAAW,cAAc,KAAK,IAAI,IAAI,YAAY,SAAS;AACzE,cAAM,IAAI,QAAQ,CAACC,cAAY,WAAWA,WAAS,GAAI,CAAC;AAExD,cAAM,iBAAiB,MAAM,MAAM,GAAG,MAAM,iBAAiB,SAAS,EAAE,IAAI;AAAA,UAC1E,SAAS;AAAA,YACP,iBAAiB,UAAU,KAAK;AAAA,UAClC;AAAA,QACF,CAAC;AAED,YAAI,eAAe,IAAI;AACrB,qBAAW,MAAM,eAAe,KAAK;AACrC,uBAAa,WAAW,SAAS,MAAM,IAAI,OAAO;AAAA,QACpD;AAAA,MACF;AAEA,UAAI,SAAS,WAAW,YAAY;AAClC,oBAAY;AAAA,UACV,SAAS;AAAA,UACT,OAAO;AAAA,QACT,GAAG,OAAO;AACV,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAGA,sBAAkB,IAAI;AAEtB,UAAM,SAAsC;AAAA,MAC1C,SAAS;AAAA,MACT,SAAS,aAAa,IAAI;AAAA,MAC1B,MAAM;AAAA,IACR;AAEA,gBAAY,QAAQ,OAAO;AAE3B,QAAI,SAAS,iBAAiB,CAAC,QAAQ,QAAQ;AAC7C,cAAQ,IAAI,mBAAmB;AAC/B,cAAQ,IAAI,KAAK,SAAS,aAAa,EAAE;AACzC,cAAQ,IAAI,UAAU;AACtB,cAAQ,IAAI,uBAAuB,IAAI,EAAE;AACzC,cAAQ,IAAI,0BAA0B,SAAS,aAAa,GAAG;AAAA,IACjE;AAAA,EACF,SAAS,OAAO;AACd,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,IAClD,GAAG,OAAO;AACV,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAKA,eAAsB,QAAQ,SAA6D;AACzF,MAAI;AACF,UAAM,QAAQ,aAAa,QAAQ,MAAM;AACzC,UAAM,SAAS,UAAU,QAAQ,MAAM;AAEvC,cAAU,yBAAyB,OAAO;AAE1C,UAAM,WAAW,MAAM,MAAM,GAAG,MAAM,iBAAiB;AAAA,MACrD,SAAS;AAAA,QACP,iBAAiB,UAAU,KAAK;AAAA,MAClC;AAAA,IACF,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQ,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,EAAE,SAAS,2BAA2B,EAAE;AACzF,kBAAY;AAAA,QACV,SAAS;AAAA,QACT,OAAQ,MAA+B,WAAW;AAAA,MACpD,GAAG,OAAO;AACV,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,YAAY,MAAM,SAAS,KAAK;AAEtC,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,MAAM;AAAA,IACR,GAAG,OAAO;AAAA,EACZ,SAAS,OAAO;AACd,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,IAClD,GAAG,OAAO;AACV,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAKA,eAAsB,QACpB,UACA,SACe;AACf,MAAI;AACF,UAAM,QAAQ,aAAa,QAAQ,MAAM;AACzC,UAAM,SAAS,UAAU,QAAQ,MAAM;AAEvC,cAAU,sBAAsB,QAAQ,QAAQ,OAAO;AAEvD,UAAM,WAAW,MAAM,MAAM,GAAG,MAAM,iBAAiB,QAAQ,IAAI;AAAA,MACjE,SAAS;AAAA,QACP,iBAAiB,UAAU,KAAK;AAAA,MAClC;AAAA,IACF,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,UAAI,SAAS,WAAW,KAAK;AAC3B,oBAAY;AAAA,UACV,SAAS;AAAA,UACT,OAAO,aAAa,QAAQ;AAAA,QAC9B,GAAG,OAAO;AAAA,MACZ,OAAO;AACL,cAAM,QAAQ,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,EAAE,SAAS,8BAA8B,EAAE;AAC5F,oBAAY;AAAA,UACV,SAAS;AAAA,UACT,OAAQ,MAA+B,WAAW;AAAA,QACpD,GAAG,OAAO;AAAA,MACZ;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,WAAW,MAAM,SAAS,KAAK;AAErC,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,MAAM;AAAA,IACR,GAAG,OAAO;AAAA,EACZ,SAAS,OAAO;AACd,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,IAClD,GAAG,OAAO;AACV,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAKA,eAAsB,UACpB,UACA,SACe;AACf,MAAI,CAAC,QAAQ,OAAO;AAClB,YAAQ,MAAM,sEAAsE;AACpF,YAAQ,MAAM,kCAAkC;AAChD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI;AACF,UAAM,QAAQ,aAAa,QAAQ,MAAM;AACzC,UAAM,SAAS,UAAU,QAAQ,MAAM;AAEvC,cAAU,sBAAsB,QAAQ,QAAQ,OAAO;AAEvD,UAAM,WAAW,MAAM,MAAM,GAAG,MAAM,iBAAiB,QAAQ,IAAI;AAAA,MACjE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,iBAAiB,UAAU,KAAK;AAAA,MAClC;AAAA,IACF,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,UAAI,SAAS,WAAW,KAAK;AAC3B,oBAAY;AAAA,UACV,SAAS;AAAA,UACT,OAAO,aAAa,QAAQ;AAAA,QAC9B,GAAG,OAAO;AAAA,MACZ,OAAO;AACL,cAAM,QAAQ,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,EAAE,SAAS,4BAA4B,EAAE;AAC1F,oBAAY;AAAA,UACV,SAAS;AAAA,UACT,OAAQ,MAA+B,WAAW;AAAA,QACpD,GAAG,OAAO;AAAA,MACZ;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,SAAS,aAAa,QAAQ;AAAA,IAChC,GAAG,OAAO;AAAA,EACZ,SAAS,OAAO;AACd,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,IAClD,GAAG,OAAO;AACV,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;ACjSA,IAAAC,mBAAyD;AACzD,IAAAC,qBAAiC;AACjC,sBAAyB;AACzB,yBAAyB;AAiDzB,eAAsB,UAAU,SAAuC;AACrE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,eAAe;AAAA,IACf,aAAa;AAAA,IACb,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA,WAAW;AAAA,EACb,IAAI;AAEJ,MAAI,CAAC,MAAM;AACT,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,OAAO;AAAA,IACT,GAAG,OAAO;AACV,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG,EAAE,MAAM,GAAG,EAAE;AAC5E,QAAM,YAAY,aAAa,cAAc,QAAQ;AACrD,QAAM,aAAa,cAAU,4BAAQ,QAAQ,IAAI,GAAG,GAAG,IAAI,WAAW,SAAS,GAAG,SAAS,EAAE;AAE7F,MAAI;AACF,UAAM,QAAQ,aAAa,QAAQ,MAAM;AACzC,UAAM,SAAS,UAAU,QAAQ,MAAM;AAEvC,cAAU,wBAAwB,IAAI,QAAQ,OAAO;AACrD,iBAAa,WAAW,UAAU,IAAI,OAAO;AAC7C,iBAAa,WAAW,YAAY,IAAI,OAAO;AAE/C,UAAM,YAAY,KAAK,IAAI;AAG3B,UAAM,SAAS,IAAI,gBAAgB;AACnC,WAAO,IAAI,UAAU,YAAY;AACjC,QAAI,WAAY,QAAO,IAAI,eAAe,MAAM;AAChD,QAAI,SAAU,QAAO,IAAI,aAAa,MAAM;AAC5C,QAAI,OAAQ,QAAO,IAAI,UAAU,MAAM;AACvC,QAAI,cAAe,QAAO,IAAI,kBAAkB,aAAa;AAC7D,QAAI,SAAU,QAAO,IAAI,YAAY,MAAM;AAG3C,UAAM,WAAW,MAAM,MAAM,GAAG,MAAM,iBAAiB,IAAI,WAAW,MAAM,IAAI;AAAA,MAC9E,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,iBAAiB,UAAU,KAAK;AAAA,MAClC;AAAA,IACF,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQ,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,EAAE,SAAS,0BAA0B,EAAE;AACxF,kBAAY;AAAA,QACV,SAAS;AAAA,QACT,OAAQ,MAA+C,WAAY,MAA6B,SAAS;AAAA,MAC3G,GAAG,OAAO;AACV,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,gBAAY,4BAAQ,UAAU;AACpC,QAAI,KAAC,6BAAW,SAAS,GAAG;AAC1B,sCAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,IAC1C;AAGA,QAAI,CAAC,SAAS,MAAM;AAClB,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AAEA,UAAM,iBAAa,oCAAkB,UAAU;AAC/C,UAAM,WAAW,4BAAS,QAAQ,SAAS,IAA2C;AAEtF,QAAI,eAAe;AACnB,aAAS,GAAG,QAAQ,CAAC,UAAkB;AACrC,sBAAgB,MAAM;AACtB,UAAI,QAAQ,SAAS;AACnB,gBAAQ,OAAO,MAAM,iBAAiB,YAAY,YAAY,CAAC,EAAE;AAAA,MACnE;AAAA,IACF,CAAC;AAED,cAAM,0BAAS,UAAU,UAAU;AAEnC,QAAI,QAAQ,SAAS;AACnB,cAAQ,OAAO,MAAM,IAAI;AAAA,IAC3B;AAEA,UAAM,WAAW,KAAK,IAAI,IAAI;AAE9B,UAAM,SAAuB;AAAA,MAC3B,UAAU;AAAA,MACV;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF;AACA,QAAI,OAAQ,QAAO,SAAS,OAAO,MAAM,GAAG;AAE5C,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,SAAS,qBAAqB,UAAU,KAAK,YAAY,YAAY,CAAC,QAAQC,gBAAe,QAAQ,CAAC;AAAA,MACtG,MAAM;AAAA,IACR,GAAG,OAAO;AAAA,EACZ,SAAS,OAAO;AACd,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,IAClD,GAAG,OAAO;AACV,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAKA,eAAsB,cACpB,MACA,SACe;AACf,MAAI;AACF,UAAM,QAAQ,aAAa,QAAQ,MAAM;AACzC,UAAM,SAAS,UAAU,QAAQ,MAAM;AAEvC,cAAU,yBAAyB,IAAI,QAAQ,OAAO;AAEtD,UAAM,WAAW,MAAM,MAAM,GAAG,MAAM,iBAAiB,IAAI,YAAY;AAAA,MACrE,SAAS;AAAA,QACP,iBAAiB,UAAU,KAAK;AAAA,MAClC;AAAA,IACF,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQ,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,EAAE,SAAS,yBAAyB,EAAE;AACvF,kBAAY;AAAA,QACV,SAAS;AAAA,QACT,OAAQ,MAA+B,WAAW;AAAA,MACpD,GAAG,OAAO;AACV,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,UAAU,MAAM,SAAS,KAAK;AAEpC,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,MAAM;AAAA,IACR,GAAG,OAAO;AAAA,EACZ,SAAS,OAAO;AACd,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,IAClD,GAAG,OAAO;AACV,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAKA,eAAsB,kBACpB,MACA,UACA,SACe;AACf,MAAI;AACF,UAAM,QAAQ,aAAa,QAAQ,MAAM;AACzC,UAAM,SAAS,UAAU,QAAQ,MAAM;AAEvC,cAAU,uBAAuB,QAAQ,QAAQ,OAAO;AAExD,UAAM,WAAW,MAAM,MAAM,GAAG,MAAM,iBAAiB,IAAI,YAAY,QAAQ,aAAa;AAAA,MAC1F,SAAS;AAAA,QACP,iBAAiB,UAAU,KAAK;AAAA,MAClC;AAAA,IACF,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQ,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,EAAE,SAAS,4BAA4B,EAAE;AAC1F,kBAAY;AAAA,QACV,SAAS;AAAA,QACT,OAAQ,MAA+B,WAAW;AAAA,MACpD,GAAG,OAAO;AACV,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,qBAAqB,SAAS,QAAQ,IAAI,qBAAqB;AACrE,UAAM,gBAAgB,oBAAoB,MAAM,mBAAmB;AACnE,UAAM,WAAW,gBAAgB,CAAC,KAAK,GAAG,IAAI,IAAI,QAAQ;AAC1D,UAAM,aAAa,QAAQ,cAAU,4BAAQ,QAAQ,IAAI,GAAG,QAAQ;AAGpE,UAAM,gBAAY,4BAAQ,UAAU;AACpC,QAAI,KAAC,6BAAW,SAAS,GAAG;AAC1B,sCAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,IAC1C;AAGA,QAAI,CAAC,SAAS,MAAM;AAClB,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AAEA,UAAM,iBAAa,oCAAkB,UAAU;AAC/C,UAAM,WAAW,4BAAS,QAAQ,SAAS,IAA2C;AAEtF,QAAI,eAAe;AACnB,aAAS,GAAG,QAAQ,CAAC,UAAkB;AACrC,sBAAgB,MAAM;AACtB,UAAI,QAAQ,SAAS;AACnB,gBAAQ,OAAO,MAAM,iBAAiB,YAAY,YAAY,CAAC,EAAE;AAAA,MACnE;AAAA,IACF,CAAC;AAED,cAAM,0BAAS,UAAU,UAAU;AAEnC,QAAI,QAAQ,SAAS;AACnB,cAAQ,OAAO,MAAM,IAAI;AAAA,IAC3B;AAEA,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,SAAS,sBAAsB,UAAU,KAAK,YAAY,YAAY,CAAC;AAAA,MACvE,MAAM,EAAE,YAAY,MAAM,aAAa;AAAA,IACzC,GAAG,OAAO;AAAA,EACZ,SAAS,OAAO;AACd,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,IAClD,GAAG,OAAO;AACV,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAKA,SAAS,aAAa,cAAsB,UAA2B;AACrE,QAAM,aAAqC;AAAA,IACzC,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,KAAK;AAAA,EACP;AAEA,QAAM,MAAM,WAAW,YAAY,KAAK;AACxC,SAAO,YAAY,iBAAiB,QAAQ,GAAG,GAAG,QAAQ;AAC5D;;;AC3SA,IAAAC,mBAAuD;AACvD,IAAAC,qBAAkC;AA+ClC,eAAsB,WAAW,SAAwC;AACvE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,WAAW;AAAA,IACX,aAAa;AAAA,IACb;AAAA,IACA,eAAe;AAAA,IACf;AAAA,EACF,IAAI;AAEJ,MAAI,CAAC,MAAM;AACT,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,OAAO;AAAA,IACT,GAAG,OAAO;AACV,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,gBAAY,4BAAQ,QAAQ,IAAI,GAAG,IAAI;AAC7C,MAAI,KAAC,6BAAW,SAAS,GAAG;AAC1B,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,OAAO,mBAAmB,SAAS;AAAA,IACrC,GAAG,OAAO;AACV,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,gBAAY,2BAAS,SAAS;AACpC,MAAI,CAAC,UAAU,OAAO,GAAG;AACvB,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,OAAO,eAAe,SAAS;AAAA,IACjC,GAAG,OAAO;AACV,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,iBAAiB,YAAY,sBAAkB,6BAAS,SAAS,CAAC;AAExE,MAAI;AACF,UAAM,QAAQ,aAAa,QAAQ,MAAM;AACzC,UAAM,SAAS,UAAU,QAAQ,MAAM;AAEvC,cAAU,0BAA0B,cAAc,QAAQ,OAAO;AACjE,iBAAa,eAAe,SAAS,KAAK,YAAY,UAAU,IAAI,CAAC,KAAK,OAAO;AAEjF,UAAM,YAAY,KAAK,IAAI;AAG3B,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,MAAO,QAAO,IAAI,SAAS,MAAM;AACrC,QAAI,OAAQ,QAAO,IAAI,UAAU,MAAM;AACvC,QAAI,SAAU,QAAO,IAAI,aAAa,MAAM;AAC5C,QAAI,WAAY,QAAO,IAAI,eAAe,MAAM;AAChD,QAAI,OAAQ,QAAO,IAAI,UAAU,MAAM;AACvC,QAAI,aAAc,QAAO,IAAI,iBAAiB,MAAM;AACpD,QAAI,KAAM,QAAO,IAAI,QAAQ,OAAO,IAAI,CAAC;AAGzC,UAAM,SAAS,aAAa,SAAS;AACrC,WAAO,IAAI,UAAU,MAAM;AAG3B,UAAM,iBAAa,mCAAiB,SAAS;AAG7C,UAAM,WAAW,MAAM,MAAM,GAAG,MAAM,iBAAiB,cAAc,YAAY,MAAM,IAAI;AAAA,MACzF,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,iBAAiB,UAAU,KAAK;AAAA,QAChC,gBAAgB,eAAe,MAAM;AAAA,QACrC,kBAAkB,OAAO,UAAU,IAAI;AAAA,MACzC;AAAA,MACA,MAAM;AAAA,MACN,QAAQ;AAAA,IACV,CAAgB;AAEhB,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQ,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,EAAE,SAAS,6BAA6B,EAAE;AAC3F,kBAAY;AAAA,QACV,SAAS;AAAA,QACT,OAAQ,MAA+C,WAAY,MAA6B,SAAS;AAAA,MAC3G,GAAG,OAAO;AACV,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,SAAS,MAAM,SAAS,KAAK;AAMnC,UAAM,WAAW,KAAK,IAAI,IAAI;AAG9B,sBAAkB,cAAc;AAEhC,UAAM,gBAA+B;AAAA,MACnC,UAAU;AAAA,MACV;AAAA,MACA,MAAM,UAAU;AAAA,MAChB;AAAA,IACF;AACA,QAAI,OAAO,mBAAmB,OAAW,eAAc,iBAAiB,OAAO;AAC/E,QAAI,OAAO,iBAAiB,OAAW,eAAc,eAAe,OAAO;AAC3E,QAAI,OAAO,OAAQ,eAAc,SAAS,OAAO;AAEjD,UAAM,YAAY,OAAO,UAAU,OAAO,OAAO,SAAS;AAE1D,gBAAY;AAAA,MACV,SAAS,CAAC,aAAa;AAAA,MACvB,SAAS,oBAAoB,YAAY,iBAAiB,EAAE,KAAK,YAAY,UAAU,IAAI,CAAC,OAAOC,gBAAe,QAAQ,CAAC;AAAA,MAC3H,MAAM;AAAA,IACR,GAAG,OAAO;AAEV,QAAI,aAAa,CAAC,cAAc;AAC9B,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,SAAS,OAAO;AACd,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,IAClD,GAAG,OAAO;AACV,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAKA,eAAsB,kBACpB,KACA,SACe;AACf,QAAM,EAAE,SAAS,IAAI;AAErB,MAAI,CAAC,UAAU;AACb,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,OAAO;AAAA,IACT,GAAG,OAAO;AACV,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI;AACF,UAAM,QAAQ,aAAa,QAAQ,MAAM;AACzC,UAAM,SAAS,UAAU,QAAQ,MAAM;AAEvC,cAAU,mCAAmC,QAAQ,QAAQ,OAAO;AACpE,iBAAa,eAAe,GAAG,IAAI,OAAO;AAE1C,UAAM,YAAY,KAAK,IAAI;AAG3B,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,MAAO,QAAO,IAAI,SAAS,MAAM;AAC7C,QAAI,QAAQ,OAAQ,QAAO,IAAI,UAAU,MAAM;AAC/C,QAAI,QAAQ,SAAU,QAAO,IAAI,aAAa,MAAM;AACpD,QAAI,QAAQ,WAAY,QAAO,IAAI,eAAe,MAAM;AACxD,QAAI,QAAQ,OAAQ,QAAO,IAAI,UAAU,QAAQ,MAAM;AACvD,QAAI,QAAQ,aAAc,QAAO,IAAI,iBAAiB,MAAM;AAE5D,UAAM,WAAW,MAAM,MAAM,GAAG,MAAM,iBAAiB,QAAQ,gBAAgB,MAAM,IAAI;AAAA,MACvF,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,iBAAiB,UAAU,KAAK;AAAA,QAChC,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,IAAI,CAAC;AAAA,IAC9B,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQ,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,EAAE,SAAS,6BAA6B,EAAE;AAC3F,kBAAY;AAAA,QACV,SAAS;AAAA,QACT,OAAQ,MAA+B,WAAW;AAAA,MACpD,GAAG,OAAO;AACV,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,SAAS,MAAM,SAAS,KAAK;AAMnC,UAAM,WAAW,KAAK,IAAI,IAAI;AAG9B,sBAAkB,QAAQ;AAE1B,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,SAAS,wBAAwBA,gBAAe,QAAQ,CAAC;AAAA,MACzD,MAAM;AAAA,QACJ;AAAA,QACA,WAAW;AAAA,QACX;AAAA,QACA,GAAG;AAAA,MACL;AAAA,IACF,GAAG,OAAO;AAAA,EACZ,SAAS,OAAO;AACd,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,IAClD,GAAG,OAAO;AACV,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAKA,eAAsB,uBACpB,QACA,QACA,SACe;AACf,MAAI;AACF,UAAM,QAAQ,aAAa,QAAQ,MAAM;AACzC,UAAM,SAAS,UAAU,QAAQ,MAAM;AAEvC,cAAU,qBAAqB,MAAM,SAAS,MAAM,QAAQ,OAAO;AAEnE,UAAM,YAAY,KAAK,IAAI;AAE3B,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,MAAO,QAAO,IAAI,SAAS,MAAM;AAE7C,UAAM,WAAW,MAAM,MAAM,GAAG,MAAM,iBAAiB,MAAM,UAAU,MAAM,IAAI;AAAA,MAC/E,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,iBAAiB,UAAU,KAAK;AAAA,QAChC,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,OAAO,CAAC;AAAA,IACjC,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQ,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,EAAE,SAAS,2BAA2B,EAAE;AACzF,kBAAY;AAAA,QACV,SAAS;AAAA,QACT,OAAQ,MAA+B,WAAW;AAAA,MACpD,GAAG,OAAO;AACV,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,SAAS,MAAM,SAAS,KAAK;AACnC,UAAM,WAAW,KAAK,IAAI,IAAI;AAG9B,sBAAkB,MAAM;AAExB,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,SAAS,mCAAmCA,gBAAe,QAAQ,CAAC;AAAA,MACpE,MAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA,GAAG;AAAA,MACL;AAAA,IACF,GAAG,OAAO;AAAA,EACZ,SAAS,OAAO;AACd,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,IAClD,GAAG,OAAO;AACV,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAKA,SAAS,kBAAkB,UAA0B;AAEnD,MAAI,OAAO,SACR,QAAQ,6BAA6B,EAAE,EACvC,QAAQ,iDAAiD,EAAE,EAC3D,QAAQ,aAAa,EAAE;AAG1B,SAAO,KAAK,YAAY,EAAE,QAAQ,gBAAgB,GAAG;AAErD,MAAI,CAAC,QAAQ,CAAC,SAAS,KAAK,IAAI,GAAG;AACjC,WAAO,cAAc;AAAA,EACvB;AAEA,SAAO,KAAK,MAAM,GAAG,EAAE;AACzB;AAKA,SAAS,aAAa,UAA0B;AAC9C,QAAM,QAAQ,SAAS,YAAY;AAEnC,MAAI,MAAM,SAAS,OAAO,KAAK,MAAM,SAAS,UAAU,GAAG;AACzD,WAAO;AAAA,EACT;AACA,MAAI,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,SAAS,GAAG;AACvD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAKA,SAAS,eAAe,QAAwB;AAC9C,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL;AACE,aAAO;AAAA,EACX;AACF;;;AC3UA,eAAsB,QAAQ,SAAqC;AACjE,QAAM;AAAA,IACJ;AAAA,IACA,OAAO;AAAA,IACP,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,EACf,IAAI;AAEJ,MAAI,CAAC,MAAM;AACT,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,OAAO;AAAA,IACT,GAAG,OAAO;AACV,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI;AACF,UAAM,QAAQ,aAAa,QAAQ,MAAM;AACzC,UAAM,SAAS,UAAU,QAAQ,MAAM;AAEvC,QAAI,MAAM;AACR,YAAM,YAAY,MAAM,OAAO,QAAQ,OAAO;AAAA,IAChD,OAAO;AACL,YAAM,eAAqE;AAAA,QACzE,GAAG;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,MAAO,cAAa,QAAQ;AAChC,UAAI,MAAO,cAAa,QAAQ;AAChC,UAAI,MAAO,cAAa,QAAQ;AAChC,UAAI,MAAO,cAAa,QAAQ;AAChC,YAAM,aAAa,MAAM,OAAO,QAAQ,YAAY;AAAA,IACtD;AAAA,EACF,SAAS,OAAO;AACd,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,IAClD,GAAG,OAAO;AACV,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAKA,eAAe,aACb,MACA,OACA,QACA,SACe;AACf,QAAM,EAAE,OAAO,OAAO,OAAO,OAAO,OAAO,WAAW,IAAI;AAE1D,YAAU,sBAAsB,IAAI,QAAQ,OAAO;AAGnD,QAAM,SAAS,IAAI,gBAAgB;AACnC,SAAO,IAAI,SAAS,OAAO,KAAK,CAAC;AACjC,MAAI,MAAO,QAAO,IAAI,SAAS,cAAc,KAAK,CAAC;AACnD,MAAI,MAAO,QAAO,IAAI,SAAS,KAAK;AACpC,MAAI,MAAO,QAAO,IAAI,SAAS,KAAK;AACpC,MAAI,MAAO,QAAO,IAAI,SAAS,KAAK;AAEpC,QAAM,WAAW,MAAM,MAAM,GAAG,MAAM,iBAAiB,IAAI,SAAS,MAAM,IAAI;AAAA,IAC5E,SAAS;AAAA,MACP,iBAAiB,UAAU,KAAK;AAAA,IAClC;AAAA,EACF,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,QAAQ,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,EAAE,SAAS,uBAAuB,EAAE;AACrF,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,OAAQ,MAA+B,WAAW;AAAA,IACpD,GAAG,OAAO;AACV,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,MAAI,QAAQ,WAAW,QAAQ;AAC7B,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,MAAM,KAAK;AAAA,IACb,GAAG,OAAO;AACV;AAAA,EACF;AAGA,MAAI,KAAK,KAAK,WAAW,GAAG;AAC1B,cAAU,iBAAiB,OAAO;AAClC;AAAA,EACF;AAEA,aAAW,OAAO,KAAK,MAAM;AAC3B,kBAAc,KAAK,EAAE,GAAG,SAAS,WAAW,CAAC;AAAA,EAC/C;AAEA,MAAI,KAAK,SAAS;AAChB,cAAU;AAAA,UAAa,KAAK,KAAK,MAAM,mCAAmC,OAAO;AAAA,EACnF;AACF;AAKA,eAAe,YACb,MACA,OACA,QACA,SACe;AACf,QAAM,EAAE,OAAO,OAAO,OAAO,aAAa,KAAK,IAAI;AAEnD,YAAU,qBAAqB,IAAI,yBAAyB,OAAO;AACnE,UAAQ,IAAI,EAAE;AAGd,QAAM,SAAS,IAAI,gBAAgB;AACnC,MAAI,MAAO,QAAO,IAAI,SAAS,cAAc,KAAK,CAAC;AACnD,MAAI,MAAO,QAAO,IAAI,SAAS,KAAK;AACpC,MAAI,MAAO,QAAO,IAAI,SAAS,KAAK;AAEpC,QAAM,WAAW,MAAM,MAAM,GAAG,MAAM,iBAAiB,IAAI,gBAAgB,MAAM,IAAI;AAAA,IACnF,SAAS;AAAA,MACP,iBAAiB,UAAU,KAAK;AAAA,MAChC,UAAU;AAAA,IACZ;AAAA,EACF,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,QAAQ,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,EAAE,SAAS,kCAAkC,EAAE;AAChG,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,OAAQ,MAA+B,WAAW;AAAA,IACpD,GAAG,OAAO;AACV,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,CAAC,SAAS,MAAM;AAClB,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,OAAO;AAAA,IACT,GAAG,OAAO;AACV,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,aAAa,IAAI,gBAAgB;AACvC,UAAQ,GAAG,UAAU,MAAM;AACzB,YAAQ,IAAI,wBAAwB;AACpC,eAAW,MAAM;AAAA,EACnB,CAAC;AAGD,QAAM,SAAS,SAAS,KAAK,UAAU;AACvC,QAAM,UAAU,IAAI,YAAY;AAChC,MAAI,SAAS;AAEb,MAAI;AACF,WAAO,MAAM;AACX,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AAEV,gBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAGhD,YAAM,SAAS,OAAO,MAAM,MAAM;AAClC,eAAS,OAAO,IAAI,KAAK;AAEzB,iBAAW,SAAS,QAAQ;AAC1B,cAAM,QAAQ,MAAM,MAAM,IAAI;AAC9B,YAAI,OAAO;AAEX,mBAAW,QAAQ,OAAO;AACxB,cAAI,KAAK,WAAW,QAAQ,GAAG;AAC7B,mBAAO,KAAK,MAAM,CAAC;AAAA,UACrB;AAAA,QACF;AAEA,YAAI,MAAM;AACR,cAAI;AACF,kBAAM,MAAM,KAAK,MAAM,IAAI;AAC3B,0BAAc,KAAK,EAAE,GAAG,SAAS,YAAY,cAAc,KAAK,CAAC;AAAA,UACnE,QAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,QAAK,MAAgB,SAAS,cAAc;AAE1C;AAAA,IACF;AACA,UAAM;AAAA,EACR;AACF;AAKA,SAAS,cAAc,KAAe,SAAwD;AAC5F,QAAM,cAAsC;AAAA,IAC1C,OAAO;AAAA;AAAA,IACP,MAAM;AAAA;AAAA,IACN,SAAS;AAAA;AAAA,IACT,OAAO;AAAA;AAAA,EACT;AAEA,QAAM,QAAQ;AACd,QAAMC,iBAAgB,QAAQ,OAAO,SAAS,CAAC,QAAQ,IAAI,UAAU,KAAK,CAAC,QAAQ;AAEnF,MAAI,SAAS;AAGb,MAAI,QAAQ,YAAY;AACtB,UAAM,YAAY,IAAI,KAAK,IAAI,SAAS,EAAE,YAAY;AACtD,cAAUA,iBAAgB,WAAW,SAAS,aAAa,GAAG,SAAS;AAAA,EACzE;AAGA,QAAM,WAAW,IAAI,MAAM,YAAY,EAAE,OAAO,CAAC;AACjD,MAAIA,gBAAe;AACjB,cAAU,GAAG,YAAY,IAAI,KAAK,KAAK,EAAE,GAAG,QAAQ,GAAG,KAAK;AAAA,EAC9D,OAAO;AACL,cAAU,GAAG,QAAQ;AAAA,EACvB;AAGA,MAAI,IAAI,QAAQ;AACd,cAAUA,iBAAgB,YAAY,IAAI,MAAM,cAAc,IAAI,IAAI,MAAM;AAAA,EAC9E;AAGA,YAAU,IAAI;AAGd,MAAI,QAAQ,WAAW,IAAI,YAAY,OAAO,KAAK,IAAI,QAAQ,EAAE,SAAS,GAAG;AAC3E,cAAUA,iBACN;AAAA,YAAe,KAAK,UAAU,IAAI,QAAQ,CAAC,YAC3C;AAAA,IAAO,KAAK,UAAU,IAAI,QAAQ,CAAC;AAAA,EACzC;AAEA,UAAQ,IAAI,MAAM;AACpB;AAWA,SAAS,cAAc,OAAuB;AAE5C,MAAI,MAAM,SAAS,GAAG,KAAK,MAAM,SAAS,GAAG,GAAG;AAC9C,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MAAM,MAAM,kBAAkB;AAC5C,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,SAAS,MAAM,CAAC,GAAI,EAAE;AACpC,QAAM,OAAO,MAAM,CAAC,EAAG,YAAY;AAEnC,QAAM,cAAsC;AAAA,IAC1C,GAAG;AAAA,IACH,GAAG,KAAK;AAAA,IACR,GAAG,KAAK,KAAK;AAAA,IACb,GAAG,KAAK,KAAK,KAAK;AAAA,EACpB;AAEA,QAAM,KAAK,SAAS,YAAY,IAAI,KAAK;AACzC,QAAM,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,EAAE;AAEtC,SAAO,MAAM,YAAY;AAC3B;AAKA,eAAsB,YACpB,MACA,SACe;AACf,MAAI;AACF,UAAM,QAAQ,aAAa,QAAQ,MAAM;AACzC,UAAM,SAAS,UAAU,QAAQ,MAAM;AAEvC,cAAU,gCAAgC,IAAI,QAAQ,OAAO;AAE7D,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,MAAO,QAAO,IAAI,SAAS,cAAc,QAAQ,KAAK,CAAC;AACnE,QAAI,QAAQ,MAAO,QAAO,IAAI,SAAS,QAAQ,KAAK;AAEpD,UAAM,WAAW,MAAM,MAAM,GAAG,MAAM,iBAAiB,IAAI,eAAe,MAAM,IAAI;AAAA,MAClF,SAAS;AAAA,QACP,iBAAiB,UAAU,KAAK;AAAA,MAClC;AAAA,IACF,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQ,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,EAAE,SAAS,4BAA4B,EAAE;AAC1F,kBAAY;AAAA,QACV,SAAS;AAAA,QACT,OAAQ,MAA+B,WAAW;AAAA,MACpD,GAAG,OAAO;AACV,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,QAAQ,MAAM,SAAS,KAAK;AAElC,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,MAAM;AAAA,IACR,GAAG,OAAO;AAAA,EACZ,SAAS,OAAO;AACd,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,IAClD,GAAG,OAAO;AACV,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;ACxXA,eAA0B;AAoD1B,eAAsB,SAAS,SAAsC;AACnE,QAAM,EAAE,MAAM,SAAS,MAAM,SAAS,OAAO,eAAe,QAAQ,IAAI;AAExE,MAAI,CAAC,MAAM;AACT,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,OAAO;AAAA,IACT,GAAG,OAAO;AACV,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI;AACF,UAAM,QAAQ,aAAa,QAAQ,MAAM;AACzC,UAAM,SAAS,UAAU,QAAQ,MAAM;AAGvC,sBAAkB,IAAI;AAGtB,QAAI,SAAS;AACX,YAAM,qBAAqB,MAAM,SAAS,OAAO,QAAQ,OAAO;AAChE;AAAA,IACF;AAGA,QAAI,MAAM;AACR,YAAM,YAAY,MAAM,MAAM,OAAO,QAAQ,OAAO;AACpD;AAAA,IACF;AAGA,UAAM,UAAU,MAAM,OAAO,QAAQ;AAAA,MACnC,GAAG;AAAA,MACH,QAAQ,UAAU;AAAA,MAClB,cAAc,gBAAgB;AAAA,IAChC,CAAC;AAAA,EACH,SAAS,OAAO;AACd,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,IAClD,GAAG,OAAO;AACV,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAKA,eAAe,qBACb,UACA,KACA,OACA,QACA,SACe;AACf,QAAM,SAAS,MAAM,aAAa,UAAU,KAAK,OAAO,MAAM;AAE9D,MAAI,WAAW,QAAQ;AACrB,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,OAAO,OAAO;AAAA,IAChB,GAAG,OAAO;AACV,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,mBAAiB,QAAQ,EAAE,GAAI,QAAQ,WAAW,SAAY,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC,EAAG,CAAC;AAClG;AAKA,eAAe,YACb,UACA,UACA,OACA,QACA,SACe;AACf,QAAM,EAAE,cAAAC,eAAc,YAAAC,aAAW,IAAI,MAAM,OAAO,IAAS;AAC3D,QAAM,EAAE,SAAAC,UAAQ,IAAI,MAAM,OAAO,MAAW;AAE5C,QAAM,WAAWA,UAAQ,QAAQ,IAAI,GAAG,QAAQ;AAChD,MAAI,CAACD,aAAW,QAAQ,GAAG;AACzB,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,OAAO,mBAAmB,QAAQ;AAAA,IACpC,GAAG,OAAO;AACV,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,UAAUD,cAAa,UAAU,OAAO;AAG9C,QAAM,aAAa,QAChB,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC,EAAE,WAAW,IAAI,CAAC;AAEpD,YAAU,aAAa,WAAW,MAAM,oBAAoB,OAAO;AAEnE,MAAI,eAAe;AACnB,MAAI,aAAa;AAEjB,aAAW,aAAa,YAAY;AAClC,UAAM,SAAS,MAAM,aAAa,UAAU,WAAW,OAAO,MAAM;AAEpE,QAAI,WAAW,QAAQ;AACrB,cAAQ,MAAM,UAAU,OAAO,KAAK,EAAE;AACtC,cAAQ,MAAM,gBAAgB,UAAU,UAAU,GAAG,EAAE,CAAC,KAAK;AAC7D;AAAA,IACF,OAAO;AACL,UAAI,QAAQ,SAAS;AACnB,yBAAiB,QAAQ,EAAE,GAAI,QAAQ,WAAW,SAAY,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC,EAAG,CAAC;AAAA,MAClG;AACA;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,IAAI,EAAE;AACd,YAAU,cAAc,YAAY,eAAe,UAAU,WAAW,OAAO;AAE/E,MAAI,aAAa,GAAG;AAClB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAKA,eAAe,UACb,UACA,OACA,QACA,SACe;AACf,QAAMG,SAAoB;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB,CAAC;AAAA,IAClB,aAAa;AAAA,IACb,QAAQ,QAAQ;AAAA,IAChB,cAAc,QAAQ;AAAA,IACtB,SAAS,CAAC;AAAA,EACZ;AAEA,UAAQ,IAAI,qCAAqC,QAAQ,GAAG;AAC5D,UAAQ,IAAI,oCAAoC;AAChD,UAAQ,IAAI,EAAE;AAEd,QAAM,KAAc,yBAAgB;AAAA,IAClC,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,IAChB,QAAQ,UAAUA,MAAK;AAAA,IACvB,UAAU;AAAA,IACV,aAAa;AAAA,EACf,CAAC;AAED,KAAG,GAAG,QAAQ,OAAO,SAAS;AAC5B,UAAM,WAAW,MAAMA,QAAO,EAAE;AAAA,EAClC,CAAC;AAED,KAAG,GAAG,SAAS,MAAM;AACnB,YAAQ,IAAI,YAAY;AACxB,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AAED,KAAG,OAAO;AACZ;AAKA,eAAe,WACb,MACAA,QACA,IACe;AACf,QAAM,cAAc,KAAK,KAAK;AAG9B,MAAI,YAAY,WAAW,IAAI,KAAK,CAACA,OAAM,aAAa;AACtD,UAAM,uBAAuB,aAAaA,QAAO,EAAE;AACnD,OAAG,UAAU,UAAUA,MAAK,CAAC;AAC7B,OAAG,OAAO;AACV;AAAA,EACF;AAGA,MAAIA,OAAM,eAAe,CAAC,YAAY,SAAS,GAAG,GAAG;AACnD,IAAAA,OAAM,gBAAgB,KAAK,IAAI;AAC/B,IAAAA,OAAM,cAAc,CAAC,YAAY,SAAS,GAAG;AAE7C,QAAIA,OAAM,aAAa;AACrB,SAAG,UAAU,UAAUA,MAAK,CAAC;AAC7B,SAAG,OAAO;AACV;AAAA,IACF;AAAA,EACF;AAGA,QAAM,MAAMA,OAAM,eAAeA,OAAM,gBAAgB,SAAS,IAC5D,CAAC,GAAGA,OAAM,iBAAiB,IAAI,EAAE,KAAK,IAAI,IAC1C;AAEJ,EAAAA,OAAM,kBAAkB,CAAC;AACzB,EAAAA,OAAM,cAAc;AAEpB,MAAI,IAAI,KAAK,EAAE,WAAW,GAAG;AAC3B,OAAG,UAAU,UAAUA,MAAK,CAAC;AAC7B,OAAG,OAAO;AACV;AAAA,EACF;AAGA,EAAAA,OAAM,QAAQ,KAAK,GAAG;AAEtB,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,SAAS,MAAM,aAAaA,OAAM,UAAU,KAAKA,OAAM,OAAOA,OAAM,MAAM;AAChF,QAAM,WAAW,KAAK,IAAI,IAAI;AAE9B,MAAI,WAAW,QAAQ;AACrB,YAAQ,MAAM,UAAU,OAAO,KAAK,EAAE;AAAA,EACxC,OAAO;AACL,UAAM,eAAoC,CAAC;AAC3C,QAAIA,OAAM,iBAAiB,OAAQ,cAAa,SAAS;AACzD,qBAAiB,QAAQ,YAAY;AAErC,QAAIA,OAAM,QAAQ;AAChB,cAAQ,IAAI,SAASC,gBAAe,QAAQ,CAAC,EAAE;AAAA,IACjD;AAAA,EACF;AAEA,UAAQ,IAAI,EAAE;AACd,KAAG,UAAU,UAAUD,MAAK,CAAC;AAC7B,KAAG,OAAO;AACZ;AAKA,eAAe,uBACb,SACAA,QACA,IACe;AACf,QAAM,CAAC,KAAK,GAAG,IAAI,IAAI,QAAQ,MAAM,KAAK;AAE1C,UAAQ,KAAK;AAAA,IACX,KAAK;AAAA,IACL,KAAK;AACH,SAAG,MAAM;AACT;AAAA,IAEF,KAAK;AAAA,IACL,KAAK;AACH,gBAAU;AACV;AAAA,IAEF,KAAK;AAAA,IACL,KAAK,QAAQ;AAEX,YAAM,SAAS,MAAM;AAAA,QACnBA,OAAM;AAAA,QACN;AAAA;AAAA;AAAA;AAAA,QAIAA,OAAM;AAAA,QACNA,OAAM;AAAA,MACR;AACA,UAAI,WAAW,QAAQ;AACrB,gBAAQ,MAAM,UAAU,OAAO,KAAK,EAAE;AAAA,MACxC,OAAO;AACL,yBAAiB,QAAQ,EAAE,QAAQ,QAAQ,CAAC;AAAA,MAC9C;AACA;AAAA,IACF;AAAA,IAEA,KAAK,QAAQ;AAEX,YAAM,YAAY,KAAK,CAAC;AACxB,UAAI,CAAC,WAAW;AACd,gBAAQ,MAAM,0BAA0B;AACxC;AAAA,MACF;AACA,YAAM,SAAS,MAAM;AAAA,QACnBA,OAAM;AAAA,QACN;AAAA;AAAA,2DAEmD,SAAS;AAAA;AAAA,QAE5DA,OAAM;AAAA,QACNA,OAAM;AAAA,MACR;AACA,UAAI,WAAW,QAAQ;AACrB,gBAAQ,MAAM,UAAU,OAAO,KAAK,EAAE;AAAA,MACxC,OAAO;AACL,gBAAQ,IAAI,UAAU,SAAS,IAAI;AACnC,yBAAiB,QAAQ,EAAE,QAAQ,QAAQ,CAAC;AAAA,MAC9C;AACA;AAAA,IACF;AAAA,IAEA,KAAK,QAAQ;AAEX,YAAM,SAAS,MAAM;AAAA,QACnBA,OAAM;AAAA,QACN;AAAA;AAAA;AAAA;AAAA,QAIAA,OAAM;AAAA,QACNA,OAAM;AAAA,MACR;AACA,UAAI,WAAW,QAAQ;AACrB,gBAAQ,MAAM,UAAU,OAAO,KAAK,EAAE;AAAA,MACxC,OAAO;AACL,yBAAiB,QAAQ,EAAE,QAAQ,QAAQ,CAAC;AAAA,MAC9C;AACA;AAAA,IACF;AAAA,IAEA,KAAK;AAAA,IACL,KAAK;AACH,cAAQ,IAAI,iBAAiBA,OAAM,QAAQ,EAAE;AAC7C;AAAA,IAEF,KAAK;AACH,MAAAA,OAAM,SAAS,CAACA,OAAM;AACtB,cAAQ,IAAI,aAAaA,OAAM,SAAS,OAAO,KAAK,GAAG;AACvD;AAAA,IAEF,KAAK;AACH,MAAAA,OAAM,eAAeA,OAAM,iBAAiB,YAAY,UAAU;AAClE,cAAQ,IAAI,uBAAuBA,OAAM,iBAAiB,YAAY,OAAO,KAAK,GAAG;AACrF;AAAA,IAEF,KAAK;AACH,YAAM,SAAS,KAAK,CAAC;AACrB,UAAI,UAAU,CAAC,SAAS,OAAO,QAAQ,SAAS,EAAE,SAAS,MAAM,GAAG;AAClE,QAAAA,OAAM,eAAe;AACrB,gBAAQ,IAAI,kBAAkBA,OAAM,YAAY,EAAE;AAAA,MACpD,OAAO;AACL,gBAAQ,IAAI,0BAA0BA,OAAM,YAAY,EAAE;AAC1D,gBAAQ,IAAI,qCAAqC;AAAA,MACnD;AACA;AAAA,IAEF,KAAK,OAAO;AAEV,YAAM,WAAW,KAAK,CAAC;AACvB,UAAI,CAAC,UAAU;AACb,gBAAQ,MAAM,uBAAuB;AACrC;AAAA,MACF;AACA,UAAI;AACF,cAAM,EAAE,cAAAH,eAAc,YAAAC,aAAW,IAAI,MAAM,OAAO,IAAS;AAC3D,cAAM,EAAE,SAAAC,UAAQ,IAAI,MAAM,OAAO,MAAW;AAE5C,cAAM,WAAWA,UAAQ,QAAQ,IAAI,GAAG,QAAQ;AAChD,YAAI,CAACD,aAAW,QAAQ,GAAG;AACzB,kBAAQ,MAAM,mBAAmB,QAAQ,EAAE;AAC3C;AAAA,QACF;AAEA,cAAM,UAAUD,cAAa,UAAU,OAAO;AAC9C,cAAM,aAAa,QAAQ,MAAM,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC;AAEvE,mBAAW,aAAa,YAAY;AAClC,gBAAM,SAAS,MAAM,aAAaG,OAAM,UAAU,WAAWA,OAAM,OAAOA,OAAM,MAAM;AACtF,cAAI,WAAW,QAAQ;AACrB,oBAAQ,MAAM,UAAU,OAAO,KAAK,EAAE;AAAA,UACxC,OAAO;AACL,kBAAM,OAA4B,CAAC;AACnC,gBAAIA,OAAM,iBAAiB,OAAQ,MAAK,SAAS;AACjD,6BAAiB,QAAQ,IAAI;AAAA,UAC/B;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,uBAAuB,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAAA,MACjG;AACA;AAAA,IACF;AAAA,IAEA,KAAK;AAAA,IACL,KAAK;AACH,cAAQ,IAAI,4CAA4C;AACxD;AAAA,IAEF,KAAK,OAAO;AAEV,YAAM,WAAW,KAAK,KAAK,GAAG;AAC9B,UAAI,CAAC,UAAU;AACb,gBAAQ,MAAM,sBAAsB;AACpC;AAAA,MACF;AACA,YAAM,EAAE,SAAS,IAAI,MAAM,OAAO,eAAoB;AACtD,UAAI;AACF,cAAM,SAAS,SAAS,UAAU,EAAE,UAAU,QAAQ,CAAC;AACvD,gBAAQ,IAAI,MAAM;AAAA,MACpB,SAAS,OAAO;AACd,gBAAQ,MAAM,mBAAmB,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAAA,MAC7F;AACA;AAAA,IACF;AAAA,IAEA;AACE,cAAQ,MAAM,oBAAoB,GAAG,sBAAsB;AAAA,EAC/D;AACF;AAKA,eAAe,aACb,UACA,KACA,OACA,QAC0C;AAC1C,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,GAAG,MAAM,iBAAiB,QAAQ,UAAU;AAAA,MACvE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,iBAAiB,UAAU,KAAK;AAAA,QAChC,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,IAAI,CAAC;AAAA,IAC9B,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQ,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,EAAE,SAAS,eAAe,EAAE;AAC7E,aAAO;AAAA,QACL,OAAQ,MAA+C,WAAY,MAA6B,SAAS;AAAA,MAC3G;AAAA,IACF;AAEA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B,SAAS,OAAO;AACd,WAAO;AAAA,MACL,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,IAClD;AAAA,EACF;AACF;AAKA,SAAS,iBAAiB,QAAqB,SAAoC;AACjF,QAAM,EAAE,MAAM,QAAQ,UAAU,QAAQ,IAAI;AAG5C,MAAI,YAAY,YAAY,KAAK,WAAW,GAAG;AAC7C,YAAQ,IAAI,GAAG,OAAO,IAAI,QAAQ,EAAE;AACpC;AAAA,EACF;AAEA,MAAI,KAAK,WAAW,GAAG;AACrB,YAAQ,IAAI,UAAU;AACtB;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW,QAAQ;AAC7B,YAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AACzC;AAAA,EACF;AAGA,QAAM,UAAU,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI;AACxC,QAAM,YAAY,KAAK;AAAA,IAAI,CAAC,QAC1B,QAAQ,IAAI,CAAC,MAAME,iBAAgB,IAAI,CAAC,CAAC,CAAC;AAAA,EAC5C;AAEA,UAAQ,IAAI,YAAY,SAAS,SAAS,CAAC;AAC3C,UAAQ,IAAI,IAAI,QAAQ,OAAO,aAAa,IAAI,KAAK,GAAG,GAAG;AAC7D;AAKA,SAASA,iBAAgB,OAAwB;AAC/C,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,OAAO,UAAU,SAAU,QAAO,KAAK,UAAU,KAAK;AAC1D,SAAO,OAAO,KAAK;AACrB;AAKA,SAAS,UAAUF,QAA2B;AAC5C,MAAIA,OAAM,aAAa;AACrB,WAAO,GAAGA,OAAM,QAAQ;AAAA,EAC1B;AACA,SAAO,GAAGA,OAAM,QAAQ;AAC1B;AAKA,SAAS,YAAkB;AACzB,UAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAuBb;AACD;;;AxBtfA,SAAS,mBAAmB,YAA0H;AACpJ,SAAO;AAAA,IACL,GAAI,WAAW,OAAO,EAAE,QAAQ,OAAuB,IAAI,CAAC;AAAA,IAC5D,GAAI,WAAW,YAAY,SAAY,EAAE,SAAS,WAAW,QAAQ,IAAI,CAAC;AAAA,IAC1E,GAAI,WAAW,UAAU,QAAQ,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,IACtD,GAAI,WAAW,SAAS,EAAE,QAAQ,WAAW,OAAO,IAAI,CAAC;AAAA,EAC3D;AACF;AAMA,IAAM,UAAU,IAAI,yBAAQ;AAE5B,QACG,KAAK,aAAa,EAClB,YAAY,6DAA6D,EACzE,QAAQ,OAAO;AAMlB,QACG,OAAO,mBAAmB,kBAAkB,EAC5C,OAAO,UAAU,uBAAuB,EACxC,OAAO,aAAa,uBAAuB,EAC3C,OAAO,cAAc,wBAAwB;AAMhD,QACG,QAAQ,eAAe,EACvB,YAAY,uBAAuB,EACnC,OAAO,yBAAyB,mBAAmB,MAAM,EACzD,OAAO,qBAAqB,yCAAyC,MAAM,EAC3E,OAAO,aAAa,sCAAsC,EAC1D,OAAO,sBAAsB,gCAAgC,OAAO,EACpE,OAAO,OAAO,MAAM,SAAS,QAAQ;AACpC,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,UAAU;AAAA,IACd;AAAA,IACA,QAAQ,QAAQ;AAAA,IAChB,MAAM,QAAQ;AAAA,IACd,MAAM,QAAQ;AAAA,IACd,SAAS,SAAS,QAAQ,SAAS,EAAE;AAAA,IACrC,GAAG,mBAAmB,UAAU;AAAA,EAClC,CAAC;AACH,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,MAAM,IAAI,EACV,YAAY,oBAAoB,EAChC,OAAO,OAAO,UAAU,QAAQ;AAC/B,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,QAAQ,mBAAmB,UAAU,CAAC;AAC9C,CAAC;AAEH,QACG,QAAQ,aAAa,EACrB,YAAY,0BAA0B,EACtC,OAAO,OAAO,MAAM,UAAU,QAAQ;AACrC,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,QAAQ,MAAM,mBAAmB,UAAU,CAAC;AACpD,CAAC;AAEH,QACG,QAAQ,eAAe,EACvB,MAAM,IAAI,EACV,YAAY,mBAAmB,EAC/B,OAAO,eAAe,qCAAqC,EAC3D,OAAO,OAAO,MAAM,SAAS,QAAQ;AACpC,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,UAAU,MAAM;AAAA,IACpB,GAAG,mBAAmB,UAAU;AAAA,IAChC,GAAI,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,EAClD,CAAC;AACH,CAAC;AAMH,QACG,QAAQ,eAAe,EACvB,YAAY,+BAA+B,EAC3C,OAAO,uBAAuB,kBAAkB,EAChD,OAAO,gCAAgC,oCAAoC,KAAK,EAChF,OAAO,iBAAiB,8BAA8B,EACtD,OAAO,eAAe,8BAA8B,EACpD,OAAO,qBAAqB,0CAA0C,EACtE,OAAO,6BAA6B,2CAA2C,EAC/E,OAAO,kBAAkB,iBAAiB,EAC1C,OAAO,OAAO,MAAM,SAAS,QAAQ;AACpC,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,UAAU;AAAA,IACd;AAAA,IACA,QAAQ,QAAQ;AAAA,IAChB,cAAc,QAAQ;AAAA,IACtB,YAAY,QAAQ;AAAA,IACpB,UAAU,QAAQ;AAAA,IAClB,QAAQ,QAAQ;AAAA,IAChB,eAAe,QAAQ;AAAA,IACvB,UAAU,QAAQ;AAAA,IAClB,QAAQ,WAAW;AAAA,IACnB,QAAQ,WAAW,OAAO,SAAS;AAAA,IACnC,SAAS,WAAW;AAAA,IACpB,SAAS,WAAW,UAAU;AAAA,EAChC,CAAC;AACH,CAAC;AAEH,QACG,QAAQ,oBAAoB,EAC5B,YAAY,uCAAuC,EACnD,OAAO,OAAO,MAAM,UAAU,QAAQ;AACrC,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,cAAc,MAAM,mBAAmB,UAAU,CAAC;AAC1D,CAAC;AAEH,QACG,QAAQ,mCAAmC,EAC3C,YAAY,4BAA4B,EACxC,OAAO,uBAAuB,kBAAkB,EAChD,OAAO,OAAO,MAAM,UAAU,SAAS,QAAQ;AAC9C,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,kBAAkB,MAAM,UAAU;AAAA,IACtC,QAAQ,QAAQ;AAAA,IAChB,QAAQ,WAAW;AAAA,IACnB,QAAQ,WAAW,OAAO,SAAS;AAAA,IACnC,SAAS,WAAW;AAAA,IACpB,SAAS,WAAW,UAAU;AAAA,EAChC,CAAC;AACH,CAAC;AAMH,QACG,QAAQ,gBAAgB,EACxB,YAAY,uCAAuC,EACnD,OAAO,yBAAyB,sBAAsB,EACtD,OAAO,WAAW,sCAAsC,EACxD,OAAO,YAAY,gCAAgC,EACnD,OAAO,eAAe,+BAA+B,EACrD,OAAO,iBAAiB,+BAA+B,EACvD,OAAO,qBAAqB,2CAA2C,EACvE,OAAO,mBAAmB,mBAAmB,EAC7C,OAAO,kBAAkB,yBAAyB,EAClD,OAAO,OAAO,MAAM,SAAS,QAAQ;AACpC,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,WAAW;AAAA,IACf;AAAA,IACA,UAAU,QAAQ;AAAA,IAClB,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,IAChB,UAAU,QAAQ;AAAA,IAClB,YAAY,QAAQ;AAAA,IACpB,QAAQ,QAAQ;AAAA,IAChB,cAAc,QAAQ;AAAA,IACtB,MAAM,QAAQ,OAAO,SAAS,QAAQ,MAAM,EAAE,IAAI;AAAA,IAClD,QAAQ,WAAW;AAAA,IACnB,QAAQ,WAAW,OAAO,SAAS;AAAA,IACnC,SAAS,WAAW;AAAA,IACpB,SAAS,WAAW,UAAU;AAAA,EAChC,CAAC;AACH,CAAC;AAEH,QACG,QAAQ,mBAAmB,EAC3B,YAAY,+BAA+B,EAC3C,eAAe,yBAAyB,sBAAsB,EAC9D,OAAO,WAAW,sCAAsC,EACxD,OAAO,YAAY,gCAAgC,EACnD,OAAO,OAAO,KAAK,SAAS,QAAQ;AACnC,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,kBAAkB,KAAK;AAAA,IAC3B,MAAM;AAAA,IACN,UAAU,QAAQ;AAAA,IAClB,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,IAChB,QAAQ,WAAW;AAAA,IACnB,QAAQ,WAAW,OAAO,SAAS;AAAA,IACnC,SAAS,WAAW;AAAA,IACpB,SAAS,WAAW,UAAU;AAAA,EAChC,CAAC;AACH,CAAC;AAEH,QACG,QAAQ,yBAAyB,EACjC,YAAY,oCAAoC,EAChD,OAAO,WAAW,gDAAgD,EAClE,OAAO,OAAO,QAAQ,QAAQ,SAAS,QAAQ;AAC9C,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,uBAAuB,QAAQ,QAAQ;AAAA,IAC3C,OAAO,QAAQ;AAAA,IACf,QAAQ,WAAW;AAAA,IACnB,QAAQ,WAAW,OAAO,SAAS;AAAA,IACnC,SAAS,WAAW;AAAA,IACpB,SAAS,WAAW,UAAU;AAAA,EAChC,CAAC;AACH,CAAC;AAMH,QACG,QAAQ,aAAa,EACrB,YAAY,oBAAoB,EAChC,OAAO,cAAc,0BAA0B,EAC/C,OAAO,mBAAmB,2BAA2B,KAAK,EAC1D,OAAO,sBAAsB,6DAA6D,EAC1F,OAAO,uBAAuB,2BAA2B,EACzD,OAAO,uBAAuB,mDAAmD,EACjF,OAAO,uBAAuB,wBAAwB,EACtD,OAAO,mBAAmB,iBAAiB,EAC3C,OAAO,OAAO,MAAM,SAAS,QAAQ;AACpC,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA,MAAM,QAAQ;AAAA,IACd,OAAO,SAAS,QAAQ,OAAO,EAAE;AAAA,IACjC,OAAO,QAAQ;AAAA,IACf,OAAO,QAAQ;AAAA,IACf,OAAO,QAAQ;AAAA,IACf,OAAO,QAAQ;AAAA,IACf,YAAY,QAAQ;AAAA,IACpB,QAAQ,WAAW;AAAA,IACnB,QAAQ,WAAW,OAAO,SAAS;AAAA,IACnC,SAAS,WAAW;AAAA,IACpB,SAAS,WAAW,UAAU;AAAA,EAChC,CAAC;AACH,CAAC;AAEH,QACG,QAAQ,mBAAmB,EAC3B,YAAY,qBAAqB,EACjC,OAAO,sBAAsB,uCAAuC,EACpE,OAAO,uBAAuB,uBAAuB,EACrD,OAAO,OAAO,MAAM,SAAS,QAAQ;AACpC,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,YAAY,MAAM;AAAA,IACtB,OAAO,QAAQ;AAAA,IACf,OAAO,QAAQ;AAAA,IACf,QAAQ,WAAW;AAAA,IACnB,QAAQ,WAAW,OAAO,SAAS;AAAA,IACnC,SAAS,WAAW;AAAA,IACpB,SAAS,WAAW,UAAU;AAAA,EAChC,CAAC;AACH,CAAC;AAMH,QACG,QAAQ,cAAc,EACtB,MAAM,KAAK,EACX,YAAY,4BAA4B,EACxC,OAAO,uBAAuB,mCAAmC,EACjE,OAAO,qBAAqB,4BAA4B,EACxD,OAAO,gBAAgB,mBAAmB,EAC1C,OAAO,gCAAgC,6CAA6C,OAAO,EAC3F,OAAO,OAAO,MAAM,SAAS,QAAQ;AACpC,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,SAAS;AAAA,IACb;AAAA,IACA,SAAS,QAAQ;AAAA,IACjB,MAAM,QAAQ;AAAA,IACd,QAAQ,QAAQ;AAAA,IAChB,cAAc,QAAQ;AAAA,IACtB,QAAQ,WAAW;AAAA,IACnB,QAAQ,WAAW,OAAO,SAAS;AAAA,IACnC,SAAS,WAAW;AAAA,IACpB,SAAS,WAAW,UAAU;AAAA,EAChC,CAAC;AACH,CAAC;AAMH,QACG,QAAQ,KAAK,EACb,YAAY,4CAA4C,EACxD,OAAO,2BAA2B,gCAAgC,cAAc,EAChF,OAAO,sBAAsB,2BAA2B,SAAS,EACjE,OAAO,qBAAqB,0BAA0B,gBAAgB,EACtE,OAAO,aAAa,2BAA2B,EAC/C,OAAO,iBAAiB,eAAe,MAAM,EAC7C,OAAO,cAAc,uBAAuB,EAC5C,OAAO,cAAc,6BAA6B,EAClD,OAAO,UAAU,4BAA4B,EAC7C,OAAO,OAAO,SAAS,QAAQ;AAC9B,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,OAAO;AAAA,IACX,SAAS;AAAA,IACT,KAAK;AAAA,IACL,MAAM;AAAA,IACN,SAAS,WAAW;AAAA,IACpB,MAAM,WAAW;AAAA,IACjB,eAAe,QAAQ;AAAA,IACvB,UAAU,QAAQ;AAAA,IAClB,SAAS,QAAQ;AAAA,IACjB,SAAS,QAAQ;AAAA,IACjB,MAAM,SAAS,QAAQ,MAAM,EAAE;AAAA,IAC/B,OAAO,QAAQ;AAAA,IACf,UAAU,QAAQ;AAAA,IAClB,MAAM,QAAQ;AAAA,EAChB,CAAC;AACH,CAAC;AAEH,QACG,QAAQ,WAAW,EACnB,YAAY,kCAAkC,EAC9C,OAAO,2BAA2B,gCAAgC,cAAc,EAChF,OAAO,sBAAsB,2BAA2B,SAAS,EACjE,OAAO,qBAAqB,0BAA0B,gBAAgB,EACtE,OAAO,aAAa,2BAA2B,EAC/C,OAAO,UAAU,uBAAuB,EACxC,OAAO,aAAa,+BAA+B,EACnD,OAAO,OAAO,SAAS,QAAQ;AAC9B,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,YAAY;AAAA,IAChB,SAAS;AAAA,IACT,KAAK;AAAA,IACL,MAAM;AAAA,IACN,SAAS,WAAW;AAAA,IACpB,MAAM,WAAW;AAAA,IACjB,eAAe,QAAQ;AAAA,IACvB,UAAU,QAAQ;AAAA,IAClB,SAAS,QAAQ;AAAA,IACjB,SAAS,QAAQ;AAAA,IACjB,MAAM,QAAQ;AAAA,IACd,MAAM,QAAQ;AAAA,EAChB,CAAC;AACH,CAAC;AAMH,QACG,QAAQ,YAAY,EACpB,YAAY,gDAAgD,EAC5D,eAAe,mBAAmB,yBAAyB,EAC3D,OAAO,uBAAuB,oBAAoB,aAAa,EAC/D,OAAO,uBAAuB,iCAAiC,QAAQ,EACvE,OAAO,uBAAuB,8BAA8B,EAC5D,OAAO,qBAAqB,2BAA2B,EACvD,OAAO,sBAAsB,2CAA2C,EACxE,OAAO,sBAAsB,2CAA2C,EACxE,OAAO,WAAW,2CAA2C,EAC7D,OAAO,OAAO,SAAS,QAAQ;AAC9B,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,cAAc;AAAA,IAClB,KAAK,QAAQ;AAAA,IACb,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,kBAAkB,QAAQ;AAAA,IAC1B,gBAAgB,QAAQ;AAAA,IACxB,eAAe,QAAQ,SAAS,MAAM,GAAG;AAAA,IACzC,eAAe,QAAQ,SAAS,MAAM,GAAG;AAAA,IACzC,eAAe,QAAQ;AAAA,IACvB,SAAS,WAAW;AAAA,IACpB,MAAM,WAAW;AAAA,EACnB,CAAC;AACH,CAAC;AAEH,QACG,QAAQ,UAAU,EAClB,YAAY,oDAAoD,EAChE,eAAe,sBAAsB,uCAAuC,EAC5E,OAAO,uBAAuB,oBAAoB,aAAa,EAC/D,OAAO,uBAAuB,sBAAsB,QAAQ,EAC5D,OAAO,uBAAuB,8BAA8B,EAC5D,OAAO,OAAO,SAAS,QAAQ;AAC9B,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,YAAY;AAAA,IAChB,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,kBAAkB,QAAQ;AAAA,IAC1B,SAAS,WAAW;AAAA,EACtB,CAAC;AACH,CAAC;AAEH,QACG,QAAQ,aAAa,EACrB,YAAY,8BAA8B,EAC1C,OAAO,gBAAgB,qBAAqB,EAC5C,OAAO,cAAc,qBAAqB,EAC1C,OAAO,uBAAuB,8BAA8B,QAAQ,EACpE,OAAO,sBAAsB,2CAA2C,EACxE,OAAO,sBAAsB,2CAA2C,EACxE,OAAO,qBAAqB,0BAA0B,EACtD,OAAO,iBAAiB,kCAAkC,EAC1D,OAAO,wBAAwB,8BAA8B,EAC7D,OAAO,2BAA2B,8BAA8B,EAChE,OAAO,2BAA2B,wBAAwB,cAAc,EACxE,OAAO,mBAAmB,8BAA8B,IAAI,EAC5D,OAAO,UAAU,oCAAoC,EACrD,OAAO,eAAe,oCAAoC,EAC1D,OAAO,OAAO,SAAS,QAAQ;AAC9B,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,cAAc;AAAA,IAClB,SAAS;AAAA,IACT,KAAK;AAAA,IACL,MAAM;AAAA,IACN,SAAS,WAAW;AAAA,IACpB,MAAM,WAAW;AAAA,IACjB,MAAM,QAAQ;AAAA,IACd,IAAI,QAAQ;AAAA,IACZ,QAAQ,QAAQ;AAAA,IAChB,eAAe,QAAQ,SAAS,MAAM,GAAG;AAAA,IACzC,eAAe,QAAQ,SAAS,MAAM,GAAG;AAAA,IACzC,gBAAgB,QAAQ;AAAA,IACxB,YAAY,QAAQ;AAAA,IACpB,mBAAmB,QAAQ;AAAA,IAC3B,eAAe,QAAQ;AAAA,IACvB,eAAe,QAAQ;AAAA,IACvB,iBAAiB,QAAQ;AAAA,IACzB,UAAU,QAAQ;AAAA,IAClB,UAAU,QAAQ;AAAA,EACpB,CAAC;AACH,CAAC;AAEH,QACG,QAAQ,aAAa,EACrB,YAAY,yCAAyC,EACrD,OAAO,mBAAmB,cAAc,EACxC,OAAO,uBAAuB,oBAAoB,aAAa,EAC/D,OAAO,uBAAuB,mBAAmB,QAAQ,EACzD,OAAO,sBAAsB,2CAA2C,EACxE,OAAO,sBAAsB,2CAA2C,EACxE,OAAO,uBAAuB,8BAA8B,EAC5D,OAAO,qBAAqB,2BAA2B,EACvD,OAAO,WAAW,2CAA2C,EAC7D,OAAO,OAAO,SAAS,QAAQ;AAC9B,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,cAAc;AAAA,IAClB,SAAS;AAAA,IACT,KAAK,QAAQ;AAAA,IACb,MAAM;AAAA,IACN,SAAS,WAAW;AAAA,IACpB,MAAM,WAAW;AAAA,IACjB,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,eAAe,QAAQ,SAAS,MAAM,GAAG;AAAA,IACzC,eAAe,QAAQ,SAAS,MAAM,GAAG;AAAA,IACzC,kBAAkB,QAAQ;AAAA,IAC1B,gBAAgB,QAAQ;AAAA,IACxB,eAAe,QAAQ;AAAA,EACzB,CAAC;AACH,CAAC;AAEH,QACG,QAAQ,aAAa,EACrB,YAAY,+BAA+B,EAC3C,OAAO,mBAAmB,cAAc,EACxC,eAAe,sBAAsB,2BAA2B,EAChE,OAAO,uBAAuB,mBAAmB,QAAQ,EACzD,OAAO,sBAAsB,2CAA2C,EACxE,OAAO,sBAAsB,2CAA2C,EACxE,OAAO,aAAa,kCAAkC,EACtD,OAAO,eAAe,0CAA0C,EAChE,OAAO,OAAO,SAAS,QAAQ;AAC9B,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,cAAc;AAAA,IAClB,SAAS;AAAA,IACT,KAAK,QAAQ;AAAA,IACb,MAAM;AAAA,IACN,SAAS,WAAW;AAAA,IACpB,MAAM,WAAW;AAAA,IACjB,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,IAChB,eAAe,QAAQ,SAAS,MAAM,GAAG;AAAA,IACzC,eAAe,QAAQ,SAAS,MAAM,GAAG;AAAA,IACzC,QAAQ,QAAQ;AAAA,IAChB,OAAO,QAAQ;AAAA,EACjB,CAAC;AACH,CAAC;AAMH,QACG,QAAQ,SAAS,EACjB,YAAY,wBAAwB,EACpC,OAAO,mBAAmB,yBAAyB,EACnD,OAAO,2BAA2B,gCAAgC,cAAc,EAChF,OAAO,OAAO,SAAS,QAAQ;AAC9B,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,WAAW;AAAA,IACf,SAAS;AAAA,IACT,KAAK,QAAQ;AAAA,IACb,MAAM;AAAA,IACN,SAAS,WAAW;AAAA,IACpB,MAAM,WAAW;AAAA,IACjB,eAAe,QAAQ;AAAA,EACzB,CAAC;AACH,CAAC;AAEH,QACG,QAAQ,gBAAgB,EACxB,YAAY,+BAA+B,EAC3C,OAAO,mBAAmB,yBAAyB,EACnD,OAAO,2BAA2B,gCAAgC,cAAc,EAChF,OAAO,OAAO,SAAS,QAAQ;AAC9B,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,iBAAiB;AAAA,IACrB,SAAS;AAAA,IACT,KAAK,QAAQ;AAAA,IACb,MAAM;AAAA,IACN,SAAS,WAAW;AAAA,IACpB,MAAM,WAAW;AAAA,IACjB,eAAe,QAAQ;AAAA,EACzB,CAAC;AACH,CAAC;AAEH,QACG,QAAQ,kBAAkB,EAC1B,YAAY,qBAAqB,EACjC,OAAO,mBAAmB,yBAAyB,EACnD,OAAO,2BAA2B,gCAAgC,cAAc,EAChF,OAAO,kBAAkB,+BAA+B,EACxD,OAAO,mBAAmB,oCAAoC,GAAG,EACjE,OAAO,aAAa,yCAAyC,EAC7D,OAAO,eAAe,6CAA6C,EACnE,OAAO,OAAO,SAAS,QAAQ;AAC9B,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,mBAAmB;AAAA,IACvB,SAAS;AAAA,IACT,KAAK,QAAQ;AAAA,IACb,MAAM;AAAA,IACN,SAAS,WAAW;AAAA,IACpB,MAAM,WAAW;AAAA,IACjB,eAAe,QAAQ;AAAA,IACvB,WAAW,QAAQ,KAAK,SAAS,QAAQ,IAAI,EAAE,IAAI;AAAA,IACnD,OAAO,SAAS,QAAQ,OAAO,EAAE;AAAA,IACjC,QAAQ,QAAQ;AAAA,IAChB,OAAO,QAAQ;AAAA,EACjB,CAAC;AACH,CAAC;AAEH,QACG,QAAQ,uBAAuB,EAC/B,YAAY,6BAA6B,EACzC,OAAO,2BAA2B,gCAAgC,cAAc,EAChF,OAAO,mBAAmB,8BAA8B,IAAI,EAC5D,OAAO,OAAO,MAAM,SAAS,QAAQ;AACpC,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,iBAAiB;AAAA,IACrB,SAAS;AAAA,IACT,KAAK;AAAA,IACL,MAAM;AAAA,IACN,SAAS,WAAW;AAAA,IACpB,MAAM,WAAW;AAAA,IACjB,eAAe,QAAQ;AAAA,IACvB;AAAA,IACA,iBAAiB,QAAQ;AAAA,EAC3B,CAAC;AACH,CAAC;AAEH,QACG,QAAQ,kBAAkB,EAC1B,YAAY,uCAAuC,EACnD,OAAO,mBAAmB,6CAA6C,EACvE,OAAO,2BAA2B,gCAAgC,cAAc,EAChF,OAAO,OAAO,SAAS,QAAQ;AAC9B,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,mBAAmB;AAAA,IACvB,SAAS;AAAA,IACT,KAAK,QAAQ;AAAA,IACb,MAAM;AAAA,IACN,SAAS,WAAW;AAAA,IACpB,MAAM,WAAW;AAAA,IACjB,eAAe,QAAQ;AAAA,EACzB,CAAC;AACH,CAAC;AAEH,QACG,QAAQ,iBAAiB,EACzB,YAAY,yCAAyC,EACrD,OAAO,mBAAmB,yBAAyB,EACnD,OAAO,2BAA2B,gCAAgC,cAAc,EAChF,OAAO,OAAO,SAAS,QAAQ;AAC9B,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,iBAAiB;AAAA,IACrB,SAAS;AAAA,IACT,KAAK,QAAQ;AAAA,IACb,MAAM;AAAA,IACN,SAAS,WAAW;AAAA,IACpB,MAAM,WAAW;AAAA,IACjB,eAAe,QAAQ;AAAA,EACzB,CAAC;AACH,CAAC;AAEH,QACG,QAAQ,mBAAmB,EAC3B,YAAY,kDAAkD,EAC9D,OAAO,mBAAmB,yBAAyB,EACnD,OAAO,uBAAuB,4BAA4B,EAC1D,OAAO,eAAe,6CAA6C,EACnE,OAAO,kBAAkB,mDAAmD,MAAM,EAClF,OAAO,iBAAiB,qCAAqC,EAC7D,OAAO,YAAY,wBAAwB,EAC3C,OAAO,gBAAgB,+BAA+B,EACtD,OAAO,oBAAoB,iCAAiC,EAC5D,OAAO,gBAAgB,0CAA0C,EACjE,OAAO,mBAAmB,2BAA2B,KAAK,EAC1D,OAAO,OAAO,SAAS,QAAQ;AAC9B,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,oBAAoB;AAAA,IACxB,SAAS;AAAA,IACT,KAAK;AAAA,IACL,MAAM;AAAA,IACN,SAAS,WAAW;AAAA,IACpB,MAAM,WAAW;AAAA,IACjB,QAAQ,QAAQ,UAAU,WAAW;AAAA,IACrC,QAAQ,QAAQ;AAAA,IAChB,OAAO,QAAQ;AAAA,IACf,iBAAiB,QAAQ,UAAU,SAAS,QAAQ,SAAS,EAAE,IAAI;AAAA,IACnE,aAAa,QAAQ,UAAU,SAAS,QAAQ,SAAS,EAAE,IAAI;AAAA,IAC/D,YAAY,QAAQ;AAAA,IACpB,gBAAgB,QAAQ;AAAA,IACxB,aAAa,QAAQ;AAAA,IACrB,OAAO,QAAQ;AAAA,IACf,OAAO,QAAQ,QAAQ,SAAS,QAAQ,OAAO,EAAE,IAAI;AAAA,EACvD,CAAC;AACH,CAAC;AAMH,QACG,QAAQ,mBAAmB,EAC3B,YAAY,2CAA2C,EACvD,eAAe,iCAAiC,wBAAwB,EACxE,OAAO,2BAA2B,wCAAwC,oBAAoB,EAC9F,OAAO,kBAAkB,wBAAwB,EACjD,OAAO,qBAAqB,2CAA2C,EACvE,OAAO,6BAA6B,2CAA2C,EAC/E,OAAO,oBAAoB,iCAAiC,MAAM,EAClE,OAAO,cAAc,gDAAgD,EACrE,OAAO,aAAa,yCAAyC,EAC7D,OAAO,wBAAwB,yCAAyC,EACxE,OAAO,OAAO,SAAS,QAAQ;AAC9B,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,OAAiD;AAAA,IACrD,kBAAkB,QAAQ;AAAA,IAC1B,WAAW,QAAQ;AAAA,IACnB,aAAa,QAAQ;AAAA,IACrB,UAAU,QAAQ;AAAA,IAClB,QAAQ,QAAQ;AAAA,IAChB,mBAAmB,QAAQ;AAAA,IAC3B,MAAM,WAAW;AAAA,IACjB,SAAS,WAAW;AAAA,EACtB;AACA,MAAI,QAAQ,QAAQ;AAClB,SAAK,SAAS,QAAQ,OAAO,MAAM,GAAG;AAAA,EACxC;AACA,MAAI,QAAQ,eAAe;AACzB,SAAK,gBAAgB,QAAQ,cAAc,MAAM,GAAG;AAAA,EACtD;AACA,MAAI,QAAQ,WAAW;AACrB,SAAK,YAAY,SAAS,QAAQ,WAAW,EAAE;AAAA,EACjD;AACA,QAAM,mBAAmB,IAAI;AAC/B,CAAC;AAEH,QACG,QAAQ,uBAAuB,EAC/B,YAAY,+CAA+C,EAC3D,eAAe,iCAAiC,4BAA4B,EAC5E,OAAO,2BAA2B,wCAAwC,oBAAoB,EAC9F,OAAO,kBAAkB,wBAAwB,EACjD,OAAO,qBAAqB,2CAA2C,EACvE,OAAO,6BAA6B,+EAA+E,EACnH,OAAO,oBAAoB,iCAAiC,MAAM,EAClE,OAAO,cAAc,gDAAgD,EACrE,OAAO,aAAa,yCAAyC,EAC7D,OAAO,wBAAwB,yCAAyC,EACxE,OAAO,OAAO,SAAS,QAAQ;AAC9B,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,OAAqD;AAAA,IACzD,kBAAkB,QAAQ;AAAA,IAC1B,WAAW,QAAQ;AAAA,IACnB,aAAa,QAAQ;AAAA,IACrB,UAAU,QAAQ;AAAA,IAClB,QAAQ,QAAQ;AAAA,IAChB,mBAAmB,QAAQ;AAAA,IAC3B,MAAM,WAAW;AAAA,IACjB,SAAS,WAAW;AAAA,EACtB;AACA,MAAI,QAAQ,QAAQ;AAClB,SAAK,SAAS,QAAQ,OAAO,MAAM,GAAG;AAAA,EACxC;AACA,MAAI,QAAQ,eAAe;AACzB,SAAK,gBAAgB,QAAQ,cAAc,MAAM,GAAG;AAAA,EACtD;AACA,MAAI,QAAQ,WAAW;AACrB,SAAK,YAAY,SAAS,QAAQ,WAAW,EAAE;AAAA,EACjD;AACA,QAAM,uBAAuB,IAAI;AACnC,CAAC;AAEH,QACG,QAAQ,yBAAyB,EACjC,YAAY,2CAA2C,EACvD,eAAe,iCAAiC,4BAA4B,EAC5E,OAAO,YAAY,0BAA0B,EAC7C,OAAO,OAAO,SAAS,QAAQ;AAC9B,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,yBAAyB;AAAA,IAC7B,kBAAkB,QAAQ;AAAA,IAC1B,QAAQ,QAAQ;AAAA,IAChB,MAAM,WAAW;AAAA,IACjB,SAAS,WAAW;AAAA,EACtB,CAAC;AACH,CAAC;AAEH,QACG,QAAQ,qBAAqB,EAC7B,YAAY,gDAAgD,EAC5D,eAAe,qBAAqB,8BAA8B,EAClE,OAAO,2BAA2B,0CAA0C,oBAAoB,EAChG,OAAO,cAAc,+BAA+B,EACpD,OAAO,aAAa,+BAA+B,EACnD,OAAO,OAAO,SAAS,QAAQ;AAC9B,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,gBAAgB;AAAA,IACpB,MAAM,QAAQ;AAAA,IACd,WAAW,QAAQ;AAAA,IACnB,UAAU,QAAQ;AAAA,IAClB,QAAQ,QAAQ;AAAA,IAChB,MAAM,WAAW;AAAA,IACjB,SAAS,WAAW;AAAA,EACtB,CAAC;AACH,CAAC;AAEH,QACG,QAAQ,sBAAsB,EAC9B,YAAY,sCAAsC,EAClD,OAAO,6BAA6B,iCAAiC,EACrE,OAAO,4BAA4B,4BAA4B,EAC/D,OAAO,OAAO,SAAS,QAAQ;AAC9B,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,0BAA0B;AAAA,IAC9B,aAAa,QAAQ;AAAA,IACrB,SAAS,QAAQ;AAAA,IACjB,MAAM,WAAW;AAAA,IACjB,SAAS,WAAW;AAAA,EACtB,CAAC;AACH,CAAC;AAMH,QACG,QAAQ,OAAO,EACf,YAAY,sBAAsB,EAClC,OAAO,uBAAuB,mCAAmC,EACjE,OAAO,OAAO,SAAS,QAAQ;AAC9B,QAAM,aAAa,IAAI,gBAAgB;AAEvC,MAAI,QAAQ,QAAQ;AAClB,UAAM,SAAS,MAAM,gBAAgB,QAAQ,QAAQ,WAAW,MAAM;AACtE,QAAI,OAAO,SAAS;AAClB,gBAAU,6BAA6B,OAAO,MAAM,SAAS,MAAM,IAAI;AAAA,QACrE,QAAQ,WAAW,OAAO,SAAS;AAAA,MACrC,CAAC;AAAA,IACH,OAAO;AACL,kBAAY,EAAE,SAAS,OAAO,OAAO,OAAO,MAAM,GAAG;AAAA,QACnD,QAAQ,WAAW,OAAO,SAAS;AAAA,MACrC,CAAC;AACD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,OAAO;AACL,YAAQ,IAAI,wCAAwC;AACpD,YAAQ,IAAI,wDAAwD;AACpE,YAAQ,IAAI,iDAAiD;AAC7D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,yBAAyB,EACrC,OAAO,OAAO,UAAU,QAAQ;AAC/B,QAAM,aAAa,IAAI,gBAAgB;AACvC,SAAO,WAAW,MAAM;AACxB,YAAU,2BAA2B,mBAAmB,UAAU,CAAC;AACrE,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,6BAA6B,EACzC,OAAO,OAAO,UAAU,QAAQ;AAC/B,QAAM,aAAa,IAAI,gBAAgB;AAEvC,QAAM,OAAO,MAAM,eAAe,WAAW,MAAM;AACnD,MAAI,MAAM;AACR,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,MAAM;AAAA,IACR,GAAG,mBAAmB,UAAU,CAAC;AAAA,EACnC,OAAO;AACL,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,OAAO;AAAA,IACT,GAAG,mBAAmB,UAAU,CAAC;AACjC,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAMH,QACG,QAAQ,QAAQ,EAChB,YAAY,kCAAkC,EAC9C,OAAO,eAAe,2BAA2B,EACjD,OAAO,qBAAqB,2BAA2B,EACvD,OAAO,WAAW,iCAAiC,EACnD,OAAO,OAAO,SAAS,QAAQ;AAC9B,QAAM,aAAa,IAAI,gBAAgB;AAEvC,MAAI,QAAQ,OAAO;AACjB,gBAAY;AACZ,cAAU,mCAAmC;AAAA,MAC3C,QAAQ,WAAW,OAAO,SAAS;AAAA,IACrC,CAAC;AAAA,EACH,WAAW,QAAQ,KAAK;AACtB,UAAM,SAAS,WAAW;AAC1B,UAAM,QAAS,OAAmC,QAAQ,GAAG;AAC7D,QAAI,WAAW,MAAM;AACnB,cAAQ,IAAI,KAAK,UAAU,EAAE,CAAC,QAAQ,GAAG,GAAG,MAAM,CAAC,CAAC;AAAA,IACtD,OAAO;AACL,cAAQ,IAAI,UAAU,SAAY,QAAQ,WAAW;AAAA,IACvD;AAAA,EACF,WAAW,QAAQ,KAAK;AACtB,UAAM,CAAC,KAAK,GAAG,UAAU,IAAI,QAAQ,IAAI,MAAM,GAAG;AAClD,UAAM,QAAQ,WAAW,KAAK,GAAG;AACjC,iBAAa,EAAE,CAAC,GAAG,GAAG,MAAM,CAA4B;AACxD,cAAU,OAAO,GAAG,MAAM,KAAK,IAAI;AAAA,MACjC,QAAQ,WAAW,OAAO,SAAS;AAAA,IACrC,CAAC;AAAA,EACH,OAAO;AACL,UAAM,SAAS,WAAW;AAC1B,gBAAY;AAAA,MACV,SAAS;AAAA,MACT,MAAM;AAAA,IACR,GAAG;AAAA,MACD,QAAQ,WAAW,OAAO,SAAS;AAAA,IACrC,CAAC;AAAA,EACH;AACF,CAAC;AAMH,SAASG,uBAAsB,UAAwB;AACrD,QAAM,UAAM,4BAAQ,QAAQ;AAC5B,MAAI,KAAC,6BAAW,GAAG,GAAG;AACpB,oCAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACpC;AACF;AAeA,eAAe,cAAc,SAA2C;AACtE,QAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI,cAAc;AAErD,MAAI,CAAC,KAAK;AACR,YAAQ,MAAM,iCAAiC;AAC/C,YAAQ,MAAM,wDAAwD;AACtE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,iBAAa,4BAAQ,QAAQ,IAAI,GAAG,QAAQ,UAAU,aAAa;AAEzE,UAAQ,IAAI,2BAA2B;AAEvC,QAAM,MAAW,eAAS,GAAG;AAE7B,MAAI;AACF,UAAM,mBAA2C,CAAC;AAClD,QAAI,QAAQ,WAAW,OAAW,kBAAiB,SAAS,QAAQ;AACpE,QAAI,QAAQ,qBAAqB,OAAW,kBAAiB,mBAAmB,QAAQ;AACxF,QAAI,QAAQ,mBAAmB,OAAW,kBAAiB,iBAAiB,QAAQ;AACpF,QAAI,QAAQ,kBAAkB,OAAW,kBAAiB,gBAAgB,QAAQ;AAClF,QAAI,QAAQ,kBAAkB,OAAW,kBAAiB,gBAAgB,QAAQ;AAElF,YAAQ,IAAI,yBAAyB,QAAQ,UAAU,QAAQ,MAAM;AAErE,QAAI,QAAQ,eAAe;AACzB,YAAM,EAAE,QAAQ,MAAM,IAAI,MAAM,wBAAwB,KAAK,gBAAgB;AAE7E,MAAAA,uBAAsB,UAAU;AAChC,0CAAc,YAAY,MAAM;AAChC,cAAQ,IAAI,sBAAsB,UAAU,EAAE;AAE9C,YAAM,YAAY,WAAW,QAAQ,SAAS,WAAW;AACzD,0CAAc,WAAW,KAAK;AAC9B,cAAQ,IAAI,qBAAqB,SAAS,EAAE;AAAA,IAC9C,OAAO;AACL,YAAM,SAAS,MAAM,2BAA2B,KAAK,gBAAgB;AAErE,MAAAA,uBAAsB,UAAU;AAChC,0CAAc,YAAY,MAAM;AAChC,cAAQ,IAAI,sBAAsB,UAAU,EAAE;AAAA,IAChD;AAEA,YAAQ,IAAI,OAAO;AAAA,EACrB,UAAE;AACA,UAAM,IAAI,IAAI;AAAA,EAChB;AACF;AAUA,eAAe,YAAY,SAAyC;AAClE,MAAI,CAAC,QAAQ,OAAO;AAClB,YAAQ,MAAM,+BAA+B;AAC7C,YAAQ,MAAM,8CAA8C;AAC5D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,gBAAY,4BAAQ,QAAQ,IAAI,GAAG,QAAQ,KAAK;AACtD,QAAM,iBAAa,4BAAQ,QAAQ,IAAI,GAAG,QAAQ,UAAU,aAAa;AAEzE,MAAI,KAAC,6BAAW,SAAS,GAAG;AAC1B,YAAQ,MAAM,gCAAgC,SAAS,EAAE;AACzD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,IAAI,uBAAuB,SAAS,EAAE;AAE9C,QAAM,aAAS,+BAAa,WAAW,OAAO;AAE9C,QAAM,mBAA2C,CAAC;AAClD,MAAI,QAAQ,WAAW,OAAW,kBAAiB,SAAS,QAAQ;AACpE,MAAI,QAAQ,qBAAqB,OAAW,kBAAiB,mBAAmB,QAAQ;AAExF,UAAQ,IAAI,8BAA8B;AAE1C,QAAM,SAAS,6BAA6B,QAAQ,gBAAgB;AAEpE,EAAAA,uBAAsB,UAAU;AAChC,sCAAc,YAAY,MAAM;AAEhC,UAAQ,IAAI,sBAAsB,UAAU,EAAE;AAC9C,UAAQ,IAAI,OAAO;AACrB;AAMA,QAAQ,MAAM;","names":["SharedPostgresError","SharedConnectionError","SharedConnectionTimeoutError","result","mapped","DEFAULTS","resolve","DEFAULTS","resolve","DEFAULTS","resolve","resolve","resolve","buildParameterizedSql","parseRows","resolve","transport","sharedValidateToken","parseConnectionUrl","result","import_postgres_shared","resolve","parseConnectionUrl","createTransactionSql","import_node_fs","import_node_path","import_node_path","import_node_fs","postgres","result","import_node_path","import_node_fs","import_node_path","import_node_fs","result","import_node_path","import_node_fs","import_node_path","import_node_fs","import_node_path","import_node_fs","import_node_path","import_node_fs","readFileSync","writeFileSync","mkdirSync","existsSync","resolve","import_node_fs","import_node_path","import_node_fs","import_node_path","ensureDirectoryExists","tables","import_node_path","import_node_fs","PGlite","createPGLiteSql","result","import_node_path","import_node_fs","PGlite","createPGLiteSql","result","findSeedFiles","import_node_fs","import_node_path","colors","colorize","formatValue","colorize","formatDuration","resolve","import_node_fs","import_node_path","formatDuration","import_node_fs","import_node_path","formatDuration","supportsColor","readFileSync","existsSync","resolve","state","formatDuration","formatCellValue","ensureDirectoryExists"]}