{"version":3,"file":"sqlite_vec.cjs","names":["#opts","#_cache","#_dims"],"sources":["../../../src/batteries/vector/sqlite_vec/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/sqlite_vec\n */\n\nimport { evaluateFilter } from '../filters'\nimport { normalizeScore } from '../helpers'\nimport { validateRecords } from '../validation'\nimport { BaseVectorStore, CallableVectorStore } from '../contract'\nimport {\n  E_VECTOR_STORE_DRIVER_UNAVAILABLE,\n  E_VECTOR_STORE_CONNECTION_FAILED,\n  E_VECTOR_STORE_COLLECTION_FAILED,\n  E_VECTOR_STORE_UPSERT_FAILED,\n  E_VECTOR_STORE_SEARCH_FAILED,\n  E_VECTOR_STORE_DELETE_FAILED,\n  E_VECTOR_STORE_DIMENSION_MISMATCH,\n} from '../exceptions'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from '../types'\n\n/** Construction options for {@link SqliteVecVectorStore}. */\nexport interface SqliteVecVectorStoreOptions extends BaseVectorStoreOptions {\n  /** Database location: a filesystem path, or `':memory:'` for an in-memory database. */\n  connection: {\n    path: string\n  }\n}\n\ninterface VecRow {\n  rowid: bigint\n  distance: number\n}\n\ninterface CachedStore {\n  db: any\n  drivers?: { Database: any; sqliteVec: any }\n}\n\nexport class SqliteVecVectorStore extends BaseVectorStore {\n  readonly capabilities: VectorStoreCapabilities = {\n    transactions: true,\n    namedVectors: false,\n    rename: true,\n    rawSql: true,\n    builtInEncoding: false,\n    // Strongly consistent (local file/in-memory): visible on resolve, so the option is a no-op.\n    consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n  }\n\n  #_cache: CachedStore | null = null\n  #_dims: Map<string, number> = new Map()\n\n  constructor(options: SqliteVecVectorStoreOptions) {\n    super(options)\n  }\n\n  get #opts(): SqliteVecVectorStoreOptions {\n    return this.options as SqliteVecVectorStoreOptions\n  }\n\n  /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */\n  static isAvailable(): boolean {\n    return typeof process !== 'undefined'\n  }\n  isAvailable(): boolean {\n    return typeof process !== 'undefined'\n  }\n\n  async connect(): Promise<void> {\n    if (this.#_cache) {\n      return\n    }\n\n    let Database: any\n    let sqliteVec: any\n\n    try {\n      const mod1 = await import('better-sqlite3')\n      Database = mod1.default\n    } catch (e) {\n      throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['better-sqlite3 / sqlite-vec'])\n    }\n\n    try {\n      sqliteVec = await import('sqlite-vec')\n    } catch (e) {\n      throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['better-sqlite3 / sqlite-vec'])\n    }\n\n    const path = this.#opts.connection?.path ?? ':memory:'\n    let db: any\n\n    try {\n      db = new Database(path)\n    } catch (e: any) {\n      throw new E_VECTOR_STORE_CONNECTION_FAILED([e?.message ?? String(e)])\n    }\n\n    sqliteVec.load(db)\n\n    this.#_cache = { db, drivers: { Database, sqliteVec } }\n  }\n\n  async close(): Promise<void> {\n    if (this.#_cache?.db) {\n      this.#_cache.db.close()\n      this.#_cache = null\n    }\n  }\n\n  /** The underlying SQLite database handle; throws if the store is not connected. */\n  get db(): any {\n    if (!this.#_cache?.db) {\n      throw new Error('Not connected')\n    }\n    return this.#_cache.db\n  }\n\n  async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n    await this.connect()\n    const { collection, vector } = spec\n    const dims = vector.dimensions\n    const tbl = `\"${collection}\"`\n    const metaTbl = `\"${collection}__meta\"`\n\n    const { db } = this\n\n    const exists = await this.hasCollection(collection)\n    if (!ifNotExists && exists) {\n      throw new E_VECTOR_STORE_COLLECTION_FAILED(['create', 'collection exists'])\n    }\n\n    try {\n      db.exec(`CREATE VIRTUAL TABLE IF NOT EXISTS ${tbl} USING vec0(embedding float[${dims}])`)\n      db.exec(\n        `CREATE TABLE IF NOT EXISTS ${metaTbl} (rowid INTEGER PRIMARY KEY, id TEXT UNIQUE, document TEXT, metadata TEXT)`\n      )\n      this.#_dims.set(collection, dims)\n    } catch (e: any) {\n      throw new E_VECTOR_STORE_COLLECTION_FAILED(['create', e?.message ?? String(e)])\n    }\n  }\n\n  async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n    await this.connect()\n    const tbl = `\"${collection}\"`\n    const metaTbl = `\"${collection}__meta\"`\n\n    const has = await this.hasCollection(collection)\n    if (!has) {\n      if (!ifExists) {\n        throw new E_VECTOR_STORE_COLLECTION_FAILED(['drop', 'collection does not exist'])\n      }\n      return\n    }\n\n    const { db } = this\n    try {\n      db.exec(`DROP TABLE IF EXISTS ${tbl}`)\n      db.exec(`DROP TABLE IF EXISTS ${metaTbl}`)\n      this.#_dims.delete(collection)\n    } catch (e: any) {\n      throw new E_VECTOR_STORE_COLLECTION_FAILED(['drop', e?.message ?? String(e)])\n    }\n  }\n\n  async hasCollection(collection: string): Promise<boolean> {\n    await this.connect()\n    const { db } = this\n    try {\n      const res: any = db\n        .prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name=?`)\n        .get(collection)\n      return !!res?.name\n    } catch {\n      return false\n    }\n  }\n\n  async renameCollection(from: string, to: string): Promise<void> {\n    await this.connect()\n    const hasFrom = await this.hasCollection(from)\n    if (!hasFrom) {\n      throw new E_VECTOR_STORE_COLLECTION_FAILED(['rename', 'source collection does not exist'])\n    }\n\n    const hasTo = await this.hasCollection(to)\n    if (hasTo) {\n      throw new E_VECTOR_STORE_COLLECTION_FAILED(['rename', 'target collection already exists'])\n    }\n\n    const { db } = this\n    try {\n      db.exec(`ALTER TABLE \"${from}\" RENAME TO \"${to}\"`)\n      db.exec(`ALTER TABLE \"${from}__meta\" RENAME TO \"${to}__meta\"`)\n      const dims = this.#_dims.get(from)\n      if (dims !== undefined) {\n        this.#_dims.set(to, dims)\n        this.#_dims.delete(from)\n      }\n    } catch (e: any) {\n      throw new E_VECTOR_STORE_COLLECTION_FAILED(['rename', e?.message ?? String(e)])\n    }\n  }\n\n  async executeUpsert(plan: UpsertPlan): Promise<void> {\n    await this.connect()\n    validateRecords(plan.records)\n\n    const collection = plan.collection\n    const dims = this.#_dims.get(collection)\n    const { db } = this\n\n    const resolvedRows: {\n      id: string\n      vector: number[]\n      document?: string\n      metadata?: Record<string, unknown>\n    }[] = []\n\n    for (const r of plan.records) {\n      let vector = r.vector\n      if (!vector && r.document) {\n        const [v] = await this.encode([r.document], 'document')\n        vector = v\n      }\n\n      if (vector && dims !== undefined && vector.length !== dims) {\n        throw new E_VECTOR_STORE_DIMENSION_MISMATCH([dims, vector.length])\n      }\n\n      resolvedRows.push({\n        id: r.id,\n        vector: vector ?? [],\n        document: r.document,\n        metadata: r.metadata as Record<string, unknown> | undefined,\n      })\n    }\n\n    const stmtMetaInsert = db.prepare(\n      `INSERT INTO \"${collection}__meta\" (id, document, metadata) VALUES (?, ?, ?)`\n    )\n    const stmtMetaUpdate = db.prepare(\n      `UPDATE \"${collection}__meta\" SET document = ?, metadata = ? WHERE id = ?`\n    )\n    const stmtRowid = db.prepare(`SELECT rowid FROM \"${collection}__meta\" WHERE id = ?`)\n    const stmtVecDelete = db.prepare(`DELETE FROM \"${collection}\" WHERE rowid = ?`)\n    const stmtVecInsert = db.prepare(`INSERT INTO \"${collection}\" (rowid, embedding) VALUES (?, ?)`)\n\n    const txn = db.transaction(() => {\n      for (const r of resolvedRows) {\n        const buf = new Float32Array(r.vector)\n        let rowid: bigint | undefined\n\n        const rowidRes: any = stmtRowid.get(r.id)\n        if (rowidRes?.rowid) {\n          rowid = BigInt(rowidRes.rowid)\n          stmtMetaUpdate.run(r.document ?? null, JSON.stringify(r.metadata ?? {}), r.id)\n          stmtVecDelete.run(rowid)\n          stmtVecInsert.run(rowid, buf)\n        } else {\n          const insertMeta = stmtMetaInsert.run(\n            r.id,\n            r.document ?? null,\n            JSON.stringify(r.metadata ?? {})\n          )\n          rowid = BigInt(insertMeta.lastInsertRowid)\n          stmtVecInsert.run(rowid, buf)\n        }\n      }\n    })\n\n    try {\n      txn()\n    } catch (e: any) {\n      throw new E_VECTOR_STORE_UPSERT_FAILED([e?.message ?? String(e)])\n    }\n  }\n\n  async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n    await this.connect()\n    const { db } = this\n    const collection = plan.collection\n    const tbl = `\"${collection}\"`\n    const metaTbl = `\"${collection}__meta\"`\n\n    const near = plan.near\n    const limit = (plan.offset ?? 0) + plan.topK\n\n    try {\n      if (near) {\n        let qvec: number[] | undefined\n\n        if ('vector' in near) {\n          qvec = near.vector\n        } else if ('serverText' in near) {\n          const [v] = await this.encode([near.serverText], 'query')\n          qvec = v\n        } else if ('id' in near) {\n          const refRow: any = db.prepare(`SELECT rowid FROM ${metaTbl} WHERE id = ?`).get(near.id)\n          if (refRow?.rowid) {\n            const refVecRes: any = db\n              .prepare(`SELECT embedding FROM ${tbl} WHERE rowid = ?`)\n              .get(BigInt(refRow.rowid))\n            if (refVecRes?.embedding) {\n              qvec = Array.from(new Float32Array(refVecRes.embedding.buffer || refVecRes.embedding))\n            }\n          }\n        }\n\n        if (!qvec) {\n          throw new E_VECTOR_STORE_SEARCH_FAILED(['no query vector provided'])\n        }\n\n        const matchClause = `embedding MATCH ? ORDER BY distance LIMIT ${limit}`\n        const matchBuf = new Float32Array(qvec)\n\n        const matches: VecRow[] = []\n        const stmtMatch = db.prepare(`SELECT rowid, distance FROM ${tbl} WHERE ${matchClause}`)\n        for (const row of stmtMatch.iterate(matchBuf)) {\n          matches.push({ rowid: BigInt(row.rowid), distance: row.distance })\n        }\n\n        let results: VectorMatch[] = []\n        for (const m of matches) {\n          const meta: any = db\n            .prepare(`SELECT rowid, id, document, metadata FROM ${metaTbl} WHERE rowid = ?`)\n            .get(m.rowid)\n          if (!meta) {\n            continue\n          }\n\n          const parsedMeta =\n            typeof meta.metadata === 'string' ? JSON.parse(meta.metadata) : meta.metadata\n\n          if (plan.filter && !evaluateFilter(plan.filter, parsedMeta as any)) {\n            continue\n          }\n\n          let score = normalizeScore(\n            Number(m.distance),\n            this.options.metric ?? 'euclidean',\n            'distance'\n          )\n\n          const proj: VectorMatch = {}\n          if (plan.projection.id) proj.id = meta.id\n          if (plan.projection.vector) {\n            const vecRes: any = db\n              .prepare(`SELECT embedding FROM ${tbl} WHERE rowid = ?`)\n              .get(m.rowid)\n            if (vecRes?.embedding) {\n              proj.vector = Array.from(\n                new Float32Array(vecRes.embedding.buffer || vecRes.embedding)\n              )\n            }\n          }\n          if (plan.projection.document && meta.document !== undefined) proj.document = meta.document\n          if (plan.projection.metadata && parsedMeta !== undefined)\n            proj.metadata = parsedMeta as any\n          if (score !== undefined) proj.score = score\n          results.push(proj)\n        }\n\n        const offset = plan.offset ?? 0\n        return results.slice(offset, offset + plan.topK)\n      } else {\n        const rows: any[] = db.prepare(`SELECT rowid, id, document, metadata FROM ${metaTbl}`).all()\n        let scored: { row: any; score?: number }[] = []\n\n        for (const row of rows) {\n          const parsedMeta =\n            typeof row.metadata === 'string' ? JSON.parse(row.metadata) : row.metadata\n\n          if (plan.filter && !evaluateFilter(plan.filter, parsedMeta as any)) {\n            continue\n          }\n\n          scored.push({ row, score: undefined })\n        }\n\n        const offset = plan.offset ?? 0\n        const limited = scored.slice(offset, offset + plan.topK)\n\n        return limited.map(({ row }) => {\n          const parsedMeta =\n            typeof row.metadata === 'string' ? JSON.parse(row.metadata) : row.metadata\n          const out: VectorMatch = {}\n\n          if (plan.projection.id) out.id = row.id\n\n          if (plan.projection.vector) {\n            const vecRes: any = db\n              .prepare(`SELECT embedding FROM ${tbl} WHERE rowid = ?`)\n              .get(BigInt(row.rowid))\n            if (vecRes?.embedding) {\n              out.vector = Array.from(new Float32Array(vecRes.embedding.buffer || vecRes.embedding))\n            }\n          }\n\n          if (plan.projection.document && row.document !== undefined) out.document = row.document\n          if (plan.projection.metadata && parsedMeta !== undefined) out.metadata = parsedMeta as any\n\n          return out\n        })\n      }\n    } catch (e: any) {\n      throw new E_VECTOR_STORE_SEARCH_FAILED([e?.message ?? String(e)])\n    }\n  }\n\n  async executeDelete(plan: DeletePlan): Promise<void> {\n    await this.connect()\n    const collection = plan.collection\n    const metaTbl = `\"${collection}__meta\"`\n    const tbl = `\"${collection}\"`\n\n    const { db } = this\n\n    try {\n      if (plan.ids && plan.ids.length > 0) {\n        const stmtIds = db.prepare(\n          `SELECT rowid, metadata FROM ${metaTbl} WHERE id IN (${plan.ids.map(() => '?').join(', ')})`\n        )\n        const rowids: bigint[] = stmtIds.all(...plan.ids).map((r: any) => BigInt(r.rowid))\n        if (rowids.length > 0) {\n          const rowidPlaceholders = rowids.map(() => '?').join(', ')\n          db.prepare(`DELETE FROM ${metaTbl} WHERE rowid IN (${rowidPlaceholders})`).run(...rowids)\n          db.prepare(`DELETE FROM ${tbl} WHERE rowid IN (${rowidPlaceholders})`).run(...rowids)\n        }\n      } else if (plan.filter) {\n        const rows: any[] = db.prepare(`SELECT rowid, metadata FROM ${metaTbl}`).all()\n        const toDeleteRowids: bigint[] = []\n\n        for (const row of rows) {\n          const parsedMeta =\n            typeof row.metadata === 'string' ? JSON.parse(row.metadata) : row.metadata\n          if (evaluateFilter(plan.filter, parsedMeta as any)) {\n            toDeleteRowids.push(BigInt(row.rowid))\n          }\n        }\n\n        if (toDeleteRowids.length > 0) {\n          const rowidPlaceholders = toDeleteRowids.map(() => '?').join(', ')\n          db.prepare(`DELETE FROM ${metaTbl} WHERE rowid IN (${rowidPlaceholders})`).run(\n            ...toDeleteRowids\n          )\n          db.prepare(`DELETE FROM ${tbl} WHERE rowid IN (${rowidPlaceholders})`).run(\n            ...toDeleteRowids\n          )\n        }\n      } else {\n        db.exec(`DELETE FROM ${metaTbl}`)\n        db.exec(`DELETE FROM ${tbl}`)\n      }\n    } catch (e: any) {\n      throw new E_VECTOR_STORE_DELETE_FAILED([e?.message ?? String(e)])\n    }\n  }\n\n  async transaction(fn: (tx: CallableVectorStore) => Promise<void>): Promise<void> {\n    await this.connect()\n    const { db } = this\n\n    db.exec('BEGIN')\n    try {\n      await fn(this.asCallable())\n      db.exec('COMMIT')\n    } catch (e) {\n      db.exec('ROLLBACK')\n      throw e\n    }\n  }\n}\n"],"mappings":";;;;;;;;;;;AAsCA,IAAa,uBAAb,cAA0C,kCAAA,gBAAgB;CACxD,eAAiD;EAC/C,cAAc;EACd,cAAc;EACd,QAAQ;EACR,QAAQ;EACR,iBAAiB;EAEjB,aAAa;GAAE,cAAc;GAAO,SAAS;GAAU,OAAO,CAAC,QAAQ;EAAE;CAC3E;CAEA,UAA8B;CAC9B,yBAA8B,IAAI,IAAI;CAEtC,YAAY,SAAsC;EAChD,MAAM,OAAO;CACf;CAEA,IAAIA,QAAqC;EACvC,OAAO,KAAK;CACd;;CAGA,OAAO,cAAuB;EAC5B,OAAO,OAAO,YAAY;CAC5B;CACA,cAAuB;EACrB,OAAO,OAAO,YAAY;CAC5B;CAEA,MAAM,UAAyB;EAC7B,IAAI,KAAKC,SACP;EAGF,IAAI;EACJ,IAAI;EAEJ,IAAI;GAEF,YAAW,MADQ,OAAO,mBACV;EAClB,SAAS,GAAG;GACV,MAAM,IAAI,oCAAA,kCAAkC,CAAC,6BAA6B,CAAC;EAC7E;EAEA,IAAI;GACF,YAAY,MAAM,OAAO;EAC3B,SAAS,GAAG;GACV,MAAM,IAAI,oCAAA,kCAAkC,CAAC,6BAA6B,CAAC;EAC7E;EAEA,MAAM,OAAO,KAAKD,MAAM,YAAY,QAAQ;EAC5C,IAAI;EAEJ,IAAI;GACF,KAAK,IAAI,SAAS,IAAI;EACxB,SAAS,GAAQ;GACf,MAAM,IAAI,oCAAA,iCAAiC,CAAC,GAAG,WAAW,OAAO,CAAC,CAAC,CAAC;EACtE;EAEA,UAAU,KAAK,EAAE;EAEjB,KAAKC,UAAU;GAAE;GAAI,SAAS;IAAE;IAAU;GAAU;EAAE;CACxD;CAEA,MAAM,QAAuB;EAC3B,IAAI,KAAKA,SAAS,IAAI;GACpB,KAAKA,QAAQ,GAAG,MAAM;GACtB,KAAKA,UAAU;EACjB;CACF;;CAGA,IAAI,KAAU;EACZ,IAAI,CAAC,KAAKA,SAAS,IACjB,MAAM,IAAI,MAAM,eAAe;EAEjC,OAAO,KAAKA,QAAQ;CACtB;CAEA,MAAM,iBAAiB,MAAsB,aAAqC;EAChF,MAAM,KAAK,QAAQ;EACnB,MAAM,EAAE,YAAY,WAAW;EAC/B,MAAM,OAAO,OAAO;EACpB,MAAM,MAAM,IAAI,WAAW;EAC3B,MAAM,UAAU,IAAI,WAAW;EAE/B,MAAM,EAAE,OAAO;EAEf,MAAM,SAAS,MAAM,KAAK,cAAc,UAAU;EAClD,IAAI,CAAC,eAAe,QAClB,MAAM,IAAI,oCAAA,iCAAiC,CAAC,UAAU,mBAAmB,CAAC;EAG5E,IAAI;GACF,GAAG,KAAK,sCAAsC,IAAI,8BAA8B,KAAK,GAAG;GACxF,GAAG,KACD,8BAA8B,QAAQ,2EACxC;GACA,KAAKC,OAAO,IAAI,YAAY,IAAI;EAClC,SAAS,GAAQ;GACf,MAAM,IAAI,oCAAA,iCAAiC,CAAC,UAAU,GAAG,WAAW,OAAO,CAAC,CAAC,CAAC;EAChF;CACF;CAEA,MAAM,eAAe,YAAoB,UAAkC;EACzE,MAAM,KAAK,QAAQ;EACnB,MAAM,MAAM,IAAI,WAAW;EAC3B,MAAM,UAAU,IAAI,WAAW;EAG/B,IAAI,CAAC,MADa,KAAK,cAAc,UAAU,GACrC;GACR,IAAI,CAAC,UACH,MAAM,IAAI,oCAAA,iCAAiC,CAAC,QAAQ,2BAA2B,CAAC;GAElF;EACF;EAEA,MAAM,EAAE,OAAO;EACf,IAAI;GACF,GAAG,KAAK,wBAAwB,KAAK;GACrC,GAAG,KAAK,wBAAwB,SAAS;GACzC,KAAKA,OAAO,OAAO,UAAU;EAC/B,SAAS,GAAQ;GACf,MAAM,IAAI,oCAAA,iCAAiC,CAAC,QAAQ,GAAG,WAAW,OAAO,CAAC,CAAC,CAAC;EAC9E;CACF;CAEA,MAAM,cAAc,YAAsC;EACxD,MAAM,KAAK,QAAQ;EACnB,MAAM,EAAE,OAAO;EACf,IAAI;GAIF,OAAO,CAAC,CAHS,GACd,QAAQ,8DAA8D,EACtE,IAAI,UACE,GAAK;EAChB,QAAQ;GACN,OAAO;EACT;CACF;CAEA,MAAM,iBAAiB,MAAc,IAA2B;EAC9D,MAAM,KAAK,QAAQ;EAEnB,IAAI,CAAC,MADiB,KAAK,cAAc,IAAI,GAE3C,MAAM,IAAI,oCAAA,iCAAiC,CAAC,UAAU,kCAAkC,CAAC;EAI3F,IAAI,MADgB,KAAK,cAAc,EAAE,GAEvC,MAAM,IAAI,oCAAA,iCAAiC,CAAC,UAAU,kCAAkC,CAAC;EAG3F,MAAM,EAAE,OAAO;EACf,IAAI;GACF,GAAG,KAAK,gBAAgB,KAAK,eAAe,GAAG,EAAE;GACjD,GAAG,KAAK,gBAAgB,KAAK,qBAAqB,GAAG,QAAQ;GAC7D,MAAM,OAAO,KAAKA,OAAO,IAAI,IAAI;GACjC,IAAI,SAAS,KAAA,GAAW;IACtB,KAAKA,OAAO,IAAI,IAAI,IAAI;IACxB,KAAKA,OAAO,OAAO,IAAI;GACzB;EACF,SAAS,GAAQ;GACf,MAAM,IAAI,oCAAA,iCAAiC,CAAC,UAAU,GAAG,WAAW,OAAO,CAAC,CAAC,CAAC;EAChF;CACF;CAEA,MAAM,cAAc,MAAiC;EACnD,MAAM,KAAK,QAAQ;EACnB,oCAAA,gBAAgB,KAAK,OAAO;EAE5B,MAAM,aAAa,KAAK;EACxB,MAAM,OAAO,KAAKA,OAAO,IAAI,UAAU;EACvC,MAAM,EAAE,OAAO;EAEf,MAAM,eAKA,CAAC;EAEP,KAAK,MAAM,KAAK,KAAK,SAAS;GAC5B,IAAI,SAAS,EAAE;GACf,IAAI,CAAC,UAAU,EAAE,UAAU;IACzB,MAAM,CAAC,KAAK,MAAM,KAAK,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU;IACtD,SAAS;GACX;GAEA,IAAI,UAAU,SAAS,KAAA,KAAa,OAAO,WAAW,MACpD,MAAM,IAAI,oCAAA,kCAAkC,CAAC,MAAM,OAAO,MAAM,CAAC;GAGnE,aAAa,KAAK;IAChB,IAAI,EAAE;IACN,QAAQ,UAAU,CAAC;IACnB,UAAU,EAAE;IACZ,UAAU,EAAE;GACd,CAAC;EACH;EAEA,MAAM,iBAAiB,GAAG,QACxB,gBAAgB,WAAW,kDAC7B;EACA,MAAM,iBAAiB,GAAG,QACxB,WAAW,WAAW,oDACxB;EACA,MAAM,YAAY,GAAG,QAAQ,sBAAsB,WAAW,qBAAqB;EACnF,MAAM,gBAAgB,GAAG,QAAQ,gBAAgB,WAAW,kBAAkB;EAC9E,MAAM,gBAAgB,GAAG,QAAQ,gBAAgB,WAAW,mCAAmC;EAE/F,MAAM,MAAM,GAAG,kBAAkB;GAC/B,KAAK,MAAM,KAAK,cAAc;IAC5B,MAAM,MAAM,IAAI,aAAa,EAAE,MAAM;IACrC,IAAI;IAEJ,MAAM,WAAgB,UAAU,IAAI,EAAE,EAAE;IACxC,IAAI,UAAU,OAAO;KACnB,QAAQ,OAAO,SAAS,KAAK;KAC7B,eAAe,IAAI,EAAE,YAAY,MAAM,KAAK,UAAU,EAAE,YAAY,CAAC,CAAC,GAAG,EAAE,EAAE;KAC7E,cAAc,IAAI,KAAK;KACvB,cAAc,IAAI,OAAO,GAAG;IAC9B,OAAO;KACL,MAAM,aAAa,eAAe,IAChC,EAAE,IACF,EAAE,YAAY,MACd,KAAK,UAAU,EAAE,YAAY,CAAC,CAAC,CACjC;KACA,QAAQ,OAAO,WAAW,eAAe;KACzC,cAAc,IAAI,OAAO,GAAG;IAC9B;GACF;EACF,CAAC;EAED,IAAI;GACF,IAAI;EACN,SAAS,GAAQ;GACf,MAAM,IAAI,oCAAA,6BAA6B,CAAC,GAAG,WAAW,OAAO,CAAC,CAAC,CAAC;EAClE;CACF;CAEA,MAAM,cAAc,MAA0C;EAC5D,MAAM,KAAK,QAAQ;EACnB,MAAM,EAAE,OAAO;EACf,MAAM,aAAa,KAAK;EACxB,MAAM,MAAM,IAAI,WAAW;EAC3B,MAAM,UAAU,IAAI,WAAW;EAE/B,MAAM,OAAO,KAAK;EAClB,MAAM,SAAS,KAAK,UAAU,KAAK,KAAK;EAExC,IAAI;GACF,IAAI,MAAM;IACR,IAAI;IAEJ,IAAI,YAAY,MACd,OAAO,KAAK;SACP,IAAI,gBAAgB,MAAM;KAC/B,MAAM,CAAC,KAAK,MAAM,KAAK,OAAO,CAAC,KAAK,UAAU,GAAG,OAAO;KACxD,OAAO;IACT,OAAO,IAAI,QAAQ,MAAM;KACvB,MAAM,SAAc,GAAG,QAAQ,qBAAqB,QAAQ,cAAc,EAAE,IAAI,KAAK,EAAE;KACvF,IAAI,QAAQ,OAAO;MACjB,MAAM,YAAiB,GACpB,QAAQ,yBAAyB,IAAI,iBAAiB,EACtD,IAAI,OAAO,OAAO,KAAK,CAAC;MAC3B,IAAI,WAAW,WACb,OAAO,MAAM,KAAK,IAAI,aAAa,UAAU,UAAU,UAAU,UAAU,SAAS,CAAC;KAEzF;IACF;IAEA,IAAI,CAAC,MACH,MAAM,IAAI,oCAAA,6BAA6B,CAAC,0BAA0B,CAAC;IAGrE,MAAM,cAAc,6CAA6C;IACjE,MAAM,WAAW,IAAI,aAAa,IAAI;IAEtC,MAAM,UAAoB,CAAC;IAC3B,MAAM,YAAY,GAAG,QAAQ,+BAA+B,IAAI,SAAS,aAAa;IACtF,KAAK,MAAM,OAAO,UAAU,QAAQ,QAAQ,GAC1C,QAAQ,KAAK;KAAE,OAAO,OAAO,IAAI,KAAK;KAAG,UAAU,IAAI;IAAS,CAAC;IAGnE,IAAI,UAAyB,CAAC;IAC9B,KAAK,MAAM,KAAK,SAAS;KACvB,MAAM,OAAY,GACf,QAAQ,6CAA6C,QAAQ,iBAAiB,EAC9E,IAAI,EAAE,KAAK;KACd,IAAI,CAAC,MACH;KAGF,MAAM,aACJ,OAAO,KAAK,aAAa,WAAW,KAAK,MAAM,KAAK,QAAQ,IAAI,KAAK;KAEvE,IAAI,KAAK,UAAU,CAAC,iCAAA,eAAe,KAAK,QAAQ,UAAiB,GAC/D;KAGF,IAAI,QAAQ,iCAAA,eACV,OAAO,EAAE,QAAQ,GACjB,KAAK,QAAQ,UAAU,aACvB,UACF;KAEA,MAAM,OAAoB,CAAC;KAC3B,IAAI,KAAK,WAAW,IAAI,KAAK,KAAK,KAAK;KACvC,IAAI,KAAK,WAAW,QAAQ;MAC1B,MAAM,SAAc,GACjB,QAAQ,yBAAyB,IAAI,iBAAiB,EACtD,IAAI,EAAE,KAAK;MACd,IAAI,QAAQ,WACV,KAAK,SAAS,MAAM,KAClB,IAAI,aAAa,OAAO,UAAU,UAAU,OAAO,SAAS,CAC9D;KAEJ;KACA,IAAI,KAAK,WAAW,YAAY,KAAK,aAAa,KAAA,GAAW,KAAK,WAAW,KAAK;KAClF,IAAI,KAAK,WAAW,YAAY,eAAe,KAAA,GAC7C,KAAK,WAAW;KAClB,IAAI,UAAU,KAAA,GAAW,KAAK,QAAQ;KACtC,QAAQ,KAAK,IAAI;IACnB;IAEA,MAAM,SAAS,KAAK,UAAU;IAC9B,OAAO,QAAQ,MAAM,QAAQ,SAAS,KAAK,IAAI;GACjD,OAAO;IACL,MAAM,OAAc,GAAG,QAAQ,6CAA6C,SAAS,EAAE,IAAI;IAC3F,IAAI,SAAyC,CAAC;IAE9C,KAAK,MAAM,OAAO,MAAM;KACtB,MAAM,aACJ,OAAO,IAAI,aAAa,WAAW,KAAK,MAAM,IAAI,QAAQ,IAAI,IAAI;KAEpE,IAAI,KAAK,UAAU,CAAC,iCAAA,eAAe,KAAK,QAAQ,UAAiB,GAC/D;KAGF,OAAO,KAAK;MAAE;MAAK,OAAO,KAAA;KAAU,CAAC;IACvC;IAEA,MAAM,SAAS,KAAK,UAAU;IAG9B,OAFgB,OAAO,MAAM,QAAQ,SAAS,KAAK,IAE5C,EAAQ,KAAK,EAAE,UAAU;KAC9B,MAAM,aACJ,OAAO,IAAI,aAAa,WAAW,KAAK,MAAM,IAAI,QAAQ,IAAI,IAAI;KACpE,MAAM,MAAmB,CAAC;KAE1B,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,IAAI;KAErC,IAAI,KAAK,WAAW,QAAQ;MAC1B,MAAM,SAAc,GACjB,QAAQ,yBAAyB,IAAI,iBAAiB,EACtD,IAAI,OAAO,IAAI,KAAK,CAAC;MACxB,IAAI,QAAQ,WACV,IAAI,SAAS,MAAM,KAAK,IAAI,aAAa,OAAO,UAAU,UAAU,OAAO,SAAS,CAAC;KAEzF;KAEA,IAAI,KAAK,WAAW,YAAY,IAAI,aAAa,KAAA,GAAW,IAAI,WAAW,IAAI;KAC/E,IAAI,KAAK,WAAW,YAAY,eAAe,KAAA,GAAW,IAAI,WAAW;KAEzE,OAAO;IACT,CAAC;GACH;EACF,SAAS,GAAQ;GACf,MAAM,IAAI,oCAAA,6BAA6B,CAAC,GAAG,WAAW,OAAO,CAAC,CAAC,CAAC;EAClE;CACF;CAEA,MAAM,cAAc,MAAiC;EACnD,MAAM,KAAK,QAAQ;EACnB,MAAM,aAAa,KAAK;EACxB,MAAM,UAAU,IAAI,WAAW;EAC/B,MAAM,MAAM,IAAI,WAAW;EAE3B,MAAM,EAAE,OAAO;EAEf,IAAI;GACF,IAAI,KAAK,OAAO,KAAK,IAAI,SAAS,GAAG;IAInC,MAAM,SAHU,GAAG,QACjB,+BAA+B,QAAQ,gBAAgB,KAAK,IAAI,UAAU,GAAG,EAAE,KAAK,IAAI,EAAE,EAEnE,EAAQ,IAAI,GAAG,KAAK,GAAG,EAAE,KAAK,MAAW,OAAO,EAAE,KAAK,CAAC;IACjF,IAAI,OAAO,SAAS,GAAG;KACrB,MAAM,oBAAoB,OAAO,UAAU,GAAG,EAAE,KAAK,IAAI;KACzD,GAAG,QAAQ,eAAe,QAAQ,mBAAmB,kBAAkB,EAAE,EAAE,IAAI,GAAG,MAAM;KACxF,GAAG,QAAQ,eAAe,IAAI,mBAAmB,kBAAkB,EAAE,EAAE,IAAI,GAAG,MAAM;IACtF;GACF,OAAO,IAAI,KAAK,QAAQ;IACtB,MAAM,OAAc,GAAG,QAAQ,+BAA+B,SAAS,EAAE,IAAI;IAC7E,MAAM,iBAA2B,CAAC;IAElC,KAAK,MAAM,OAAO,MAAM;KACtB,MAAM,aACJ,OAAO,IAAI,aAAa,WAAW,KAAK,MAAM,IAAI,QAAQ,IAAI,IAAI;KACpE,IAAI,iCAAA,eAAe,KAAK,QAAQ,UAAiB,GAC/C,eAAe,KAAK,OAAO,IAAI,KAAK,CAAC;IAEzC;IAEA,IAAI,eAAe,SAAS,GAAG;KAC7B,MAAM,oBAAoB,eAAe,UAAU,GAAG,EAAE,KAAK,IAAI;KACjE,GAAG,QAAQ,eAAe,QAAQ,mBAAmB,kBAAkB,EAAE,EAAE,IACzE,GAAG,cACL;KACA,GAAG,QAAQ,eAAe,IAAI,mBAAmB,kBAAkB,EAAE,EAAE,IACrE,GAAG,cACL;IACF;GACF,OAAO;IACL,GAAG,KAAK,eAAe,SAAS;IAChC,GAAG,KAAK,eAAe,KAAK;GAC9B;EACF,SAAS,GAAQ;GACf,MAAM,IAAI,oCAAA,6BAA6B,CAAC,GAAG,WAAW,OAAO,CAAC,CAAC,CAAC;EAClE;CACF;CAEA,MAAM,YAAY,IAA+D;EAC/E,MAAM,KAAK,QAAQ;EACnB,MAAM,EAAE,OAAO;EAEf,GAAG,KAAK,OAAO;EACf,IAAI;GACF,MAAM,GAAG,KAAK,WAAW,CAAC;GAC1B,GAAG,KAAK,QAAQ;EAClB,SAAS,GAAG;GACV,GAAG,KAAK,UAAU;GAClB,MAAM;EACR;CACF;AACF"}