{"version":3,"file":"pinecone.mjs","names":["#waitVisible","#ns","#dims","#index","#settle","#pc","#consistencyMode"],"sources":["../../../src/batteries/vector/pinecone/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/pinecone\n */\n\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isInstanceOf } from '@nhtio/adk/guards'\nimport { normalizeScore, sanitizeMetadata } from '../helpers'\nimport { isFilterCondition, isRawFilter, isFilterGroup, evaluateFilter } from '../filters'\nimport {\n  E_VECTOR_STORE_DRIVER_UNAVAILABLE,\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  E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR,\n  E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n  E_VECTOR_STORE_CONNECTION_FAILED,\n  E_VECTOR_STORE_CONSISTENCY_TIMEOUT,\n} from '../exceptions'\nimport type { VectorFilter } from '../filters'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type {\n  VectorMatch,\n  VectorStoreCapabilities,\n  BaseVectorStoreOptions,\n  VectorMetadata,\n  VectorConsistency,\n} from '../types'\n\nexport interface PineconeVectorStoreOptions extends BaseVectorStoreOptions {\n  /** Pinecone API key. */\n  apiKey: string\n  /** Name of the Pinecone index this store operates against. */\n  index: string\n  /**\n   * When set, the physical Pinecone namespace becomes `${namespacePrefix}__${collection}`.\n   * The logical collection name the builder/base see is unchanged — only the physical\n   * namespace string is prefixed. Lets callers (and the test suite) isolate otherwise\n   * identically-named collections into distinct, uncontended namespaces. Pinecone\n   * namespaces are implicit (born on first upsert), so a fresh prefix costs nothing.\n   */\n  namespacePrefix?: string\n  /** Connection and authentication parameters for the backend. */\n  connection?: { controllerHostUrl?: string }\n}\n\nconst getPineconeClient = async () => {\n  try {\n    const mod = await import('@pinecone-database/pinecone')\n    return mod.Pinecone\n  } catch {\n    throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@pinecone-database/pinecone'])\n  }\n}\n\nexport class PineconeVectorStore extends BaseVectorStore {\n  readonly capabilities: VectorStoreCapabilities = {\n    transactions: false,\n    namedVectors: false,\n    rename: false,\n    rawSql: false,\n    builtInEncoding: false,\n    // Pinecone serverless is eventually consistent: the option is honored, and the default\n    // is 'strong' so out-of-the-box behavior matches the strongly-consistent adapters.\n    consistency: {\n      configurable: true,\n      default: 'strong',\n      modes: ['strong', 'best-effort', 'eventual'],\n    },\n  }\n  #pc: any | null = null\n  #index: any | null = null\n  #dims: Map<string, number> = new Map()\n\n  // Resolve the effective consistency mode for one write, honoring precedence:\n  //   per-operation override (plan.consistency) > store option > adapter-declared default.\n  #consistencyMode(perOp?: VectorConsistency): VectorConsistency {\n    return (\n      perOp ??\n      (this.options as PineconeVectorStoreOptions).consistency ??\n      this.capabilities.consistency.default\n    )\n  }\n\n  // Map a logical collection name to its physical Pinecone namespace. Only the physical\n  // namespace string is prefixed; #dims and everything the base/builder see stay keyed on\n  // the logical name.\n  #ns(collection: string): string {\n    const prefix = (this.options as PineconeVectorStoreOptions).namespacePrefix\n    return prefix ? `${prefix}__${collection}` : collection\n  }\n\n  // Returns true if visibility was confirmed within the bound, false on timeout.\n  // Polls the SAME read paths the adapter reads through downstream:\n  //   present ids → must appear in BOTH query() matches AND listPaginated()\n  //   absent  ids → must be gone from BOTH listPaginated() AND fetch()\n  async #waitVisible(\n    ns: any,\n    collection: string,\n    opts: { present?: string[]; absent?: string[]; probeVector?: number[] }\n  ): Promise<boolean> {\n    const present = opts.present ?? []\n    const absent = opts.absent ?? []\n    if (present.length === 0 && absent.length === 0) return true\n    const physicalNs = this.#ns(collection)\n    const dims = this.#dims.get(collection) ?? 3\n    const queryVec = opts.probeVector ?? new Array(dims).fill(0).map((_, i) => (i === 0 ? 1 : 0))\n    const deadline = Date.now() + 10_000 // 10s ceiling; freshness is ~seconds\n    const topK = Math.max(present.length + absent.length + 5, 10)\n    while (true) {\n      let presentOk = true\n      let absentOk = true\n      if (present.length > 0) {\n        let listed = new Set<string>()\n        try {\n          const lr = await this.#index!.listPaginated({ namespace: physicalNs, limit: 99 })\n          listed = new Set((lr.vectors ?? []).map((v: any) => v.id))\n        } catch {\n          listed = new Set()\n        }\n        let queried = new Set<string>()\n        try {\n          const qr = await ns.query({ vector: queryVec, topK, includeValues: false })\n          queried = new Set((qr.matches ?? []).map((m: any) => m.id))\n        } catch {\n          queried = new Set()\n        }\n        presentOk = present.every((id) => listed.has(id) && queried.has(id))\n      }\n      if (absent.length > 0) {\n        let listed = new Set<string>()\n        try {\n          const lr = await this.#index!.listPaginated({ namespace: physicalNs, limit: 99 })\n          listed = new Set((lr.vectors ?? []).map((v: any) => v.id))\n        } catch {\n          listed = new Set()\n        }\n        let fetched: Record<string, unknown> = {}\n        try {\n          const fr = await ns.fetch({ ids: absent })\n          fetched = fr.records ?? {}\n        } catch {\n          fetched = {}\n        }\n        absentOk = absent.every((id) => !listed.has(id) && fetched[id] === undefined)\n      }\n      if (presentOk && absentOk) return true\n      if (Date.now() >= deadline) return false\n      await new Promise((r) => setTimeout(r, 300))\n    }\n  }\n\n  // Apply the resolved consistency-mode semantics for one write:\n  //   strong      → wait, and THROW E_VECTOR_STORE_CONSISTENCY_TIMEOUT if not confirmed.\n  //   best-effort → wait up to the bound, then resolve whether or not confirmed (no throw).\n  //   eventual    → no wait at all.\n  // `mode` is the effective mode for THIS operation (already resolved from the precedence\n  // chain by the caller via #consistencyMode(plan.consistency)).\n  async #settle(\n    ns: any,\n    collection: string,\n    opts: { present?: string[]; absent?: string[] },\n    what: string,\n    mode: VectorConsistency\n  ): Promise<void> {\n    if (mode === 'eventual') return\n    const confirmed = await this.#waitVisible(ns, collection, opts)\n    if (!confirmed && mode === 'strong') {\n      throw new E_VECTOR_STORE_CONSISTENCY_TIMEOUT([what])\n    }\n    // best-effort: resolve regardless\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  async connect(): Promise<void> {\n    if (this.#pc) return\n    const Pinecone = await getPineconeClient()\n    const opts = this.options as PineconeVectorStoreOptions\n    try {\n      this.#pc = new Pinecone({ apiKey: opts.apiKey, ...opts.connection })\n      this.#index = this.#pc.index(opts.index)\n    } catch (err) {\n      throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n    }\n  }\n  async close(): Promise<void> {\n    this.#pc = null\n    this.#index = null\n  }\n  async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n    const collection = spec.collection\n    if (ifNotExists) {\n      if (await this.hasCollection(collection)) return\n    }\n    if (this.#dims.has(collection)) {\n      const existingDim = this.#dims.get(collection)!\n      if (existingDim !== spec.vector.dimensions) {\n        throw new E_VECTOR_STORE_COLLECTION_FAILED([\n          'createCollection',\n          `Collection ${collection} already exists with dimension ${existingDim}`,\n        ])\n      }\n      return\n    }\n    this.#dims.set(collection, spec.vector.dimensions)\n  }\n  async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n    if (ifExists) {\n      if (!(await this.hasCollection(collection))) return\n    } else if (!(await this.hasCollection(collection))) {\n      return\n    }\n    await this.connect()\n    const physicalNs = this.#ns(collection)\n    const ns = this.#index!.namespace(physicalNs)\n    try {\n      // Get all IDs via pagination\n      let page: any = { next: null }\n      const ids: string[] = []\n      do {\n        const lr = await this.#index!.listPaginated({\n          namespace: physicalNs,\n          limit: 99,\n          startingToken: page.next,\n        })\n        if (lr.vectors) ids.push(...lr.vectors.map((v: any) => v.id))\n        page.next = lr.pagination?.next\n      } while (page.next)\n\n      // Delete all found IDs\n      if (ids.length > 0) {\n        await ns.deleteMany({ ids })\n      }\n\n      // Settle on absence\n      await this.#settle(\n        ns,\n        collection,\n        { absent: ids },\n        'dropCollection ' + collection,\n        this.#consistencyMode()\n      )\n    } catch (err: any) {\n      // Re-throw consistency timeout directly (don't swallow)\n      if (\n        isInstanceOf(err, 'E_VECTOR_STORE_CONSISTENCY_TIMEOUT', E_VECTOR_STORE_CONSISTENCY_TIMEOUT)\n      )\n        throw err\n      const msg = String(err)\n      if (ifExists && msg.includes('not found')) return\n      throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', msg])\n    }\n  }\n  async hasCollection(collection: string): Promise<boolean> {\n    await this.connect()\n    const stats = await this.#index!.describeIndexStats()\n    return !!stats.namespaces?.[this.#ns(collection)]\n  }\n  async renameCollection(_from: string, _to: string): Promise<void> {\n    throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'pinecone'])\n  }\n  async executeUpsert(plan: UpsertPlan): Promise<void> {\n    if (plan.records.length === 0) return\n    validateRecords(plan.records)\n    await this.connect()\n    const collection = plan.collection\n    const ns = this.#index!.namespace(this.#ns(collection))\n    const dims = this.#dims.get(collection)\n    const vectors: any[] = []\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      if (!vector) {\n        throw new E_VECTOR_STORE_UPSERT_FAILED(['Record missing vector and document'])\n      }\n      if (dims !== undefined && vector.length !== dims) {\n        throw new E_VECTOR_STORE_DIMENSION_MISMATCH([dims, vector.length])\n      }\n      vectors.push({\n        id: r.id,\n        values: vector,\n        metadata: { ...sanitizeMetadata(r.metadata), __document: r.document ?? '' },\n      })\n    }\n    try {\n      await ns.upsert({ records: vectors })\n      // Call settle after upsert to wait for visibility (per-op override > store > default)\n      await this.#settle(\n        ns,\n        collection,\n        { present: vectors.map((v) => v.id) },\n        'upsert ' + vectors.length + ' record(s)',\n        this.#consistencyMode(plan.consistency)\n      )\n    } catch (err) {\n      if (\n        isInstanceOf(err, 'E_VECTOR_STORE_CONSISTENCY_TIMEOUT', E_VECTOR_STORE_CONSISTENCY_TIMEOUT)\n      )\n        throw err\n      throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n    }\n  }\n  async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n    await this.connect()\n    const collection = plan.collection\n    const physicalNs = this.#ns(collection)\n    const ns = this.#index!.namespace(physicalNs)\n    const metric = this.options.metric ?? 'cosine'\n    let queryVector: number[] | undefined\n    if (plan.near) {\n      if ('vector' in plan.near) {\n        queryVector = plan.near.vector\n      } else if ('serverText' in plan.near) {\n        const [v] = await this.encode([plan.near.serverText], 'query')\n        queryVector = v\n      } else if ('id' in plan.near) {\n        const res = await ns.fetch({ ids: [plan.near.id] })\n        const record = res.records[plan.near.id]\n        if (!record) {\n          throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n        }\n        queryVector = record.values\n      }\n    }\n    const offset = plan.offset ?? 0\n    const k = plan.topK + offset\n    if (queryVector) {\n      const filter = translatePineconeFilter(plan.filter)\n      const res = await ns.query({\n        vector: queryVector,\n        topK: k,\n        filter,\n        includeMetadata: true,\n        includeValues: !!plan.projection.vector,\n      })\n      const rawMatches = res.matches ?? []\n      const sliceMatches = rawMatches.slice(offset)\n      const matches: VectorMatch[] = []\n      for (const match of sliceMatches) {\n        const proj: VectorMatch = {}\n        if (plan.projection.id) {\n          proj.id = match.id\n        }\n        if (plan.projection.vector && match.values) {\n          proj.vector = match.values\n        }\n        if (plan.projection.document && match.metadata) {\n          proj.document = match.metadata.__document\n        }\n        if (plan.projection.metadata && match.metadata) {\n          const meta: VectorMetadata = {}\n          for (const key in match.metadata) {\n            if (key !== '__document') {\n              meta[key] = match.metadata[key]\n            }\n          }\n          proj.metadata = meta\n        }\n        if (plan.near) {\n          proj.score = normalizeScore(match.score!, metric, 'similarity')\n        }\n        matches.push(proj)\n      }\n      return matches\n    } else {\n      // Filter-scan: Pinecone v7 listPaginated filter is broken, so we get all records\n      // and filter client-side. First, get all IDs without filter, then fetch.\n      let page: any = { next: null }\n      const ids: string[] = []\n      do {\n        // Get all IDs without filter - Pinecone v7 listPaginated without filter works\n        const listRes = await this.#index!.listPaginated({\n          limit: 99,\n          startingToken: page.next,\n          namespace: physicalNs,\n        })\n        if (listRes.vectors) {\n          ids.push(...listRes.vectors.map((v: any) => v.id))\n        }\n        page.next = listRes.pagination?.next\n      } while (page.next)\n      if (ids.length === 0) return []\n\n      // Fetch all records and filter client-side\n      const allRecords: any = {}\n      for (let i = 0; i < ids.length; i += 100) {\n        const batch = ids.slice(i, i + 100)\n        const fetchRes = await ns.fetch({ ids: batch })\n        if (fetchRes && fetchRes.records) {\n          for (const id in fetchRes.records) {\n            allRecords[id] = fetchRes.records[id]\n          }\n        }\n      }\n      const matches: VectorMatch[] = []\n      for (const id in allRecords) {\n        const record = allRecords[id]\n        if (record.metadata) {\n          const evalMeta: VectorMetadata = {}\n          for (const key in record.metadata) {\n            if (key !== '__document') {\n              evalMeta[key] = record.metadata[key]\n            }\n          }\n          // If no filter, include all records; otherwise evaluate the filter\n          if (!plan.filter || evaluateFilter(plan.filter, evalMeta)) {\n            const proj: VectorMatch = {}\n            if (plan.projection.id) {\n              proj.id = id\n            }\n            if (plan.projection.vector && record.values) {\n              proj.vector = record.values\n            }\n            if (plan.projection.document && record.metadata) {\n              proj.document = record.metadata.__document\n            }\n            if (plan.projection.metadata && record.metadata) {\n              const meta: VectorMetadata = {}\n              for (const key in record.metadata) {\n                if (key !== '__document') {\n                  meta[key] = record.metadata[key]\n                }\n              }\n              proj.metadata = meta as VectorMetadata\n            }\n            matches.push(proj)\n          }\n        }\n      }\n      return matches.slice(offset, offset + plan.topK)\n    }\n  }\n  async executeDelete(plan: DeletePlan): Promise<void> {\n    await this.connect()\n    const collection = plan.collection\n    const physicalNs = this.#ns(collection)\n    const ns = this.#index!.namespace(physicalNs)\n    const mode = this.#consistencyMode(plan.consistency)\n    try {\n      if (plan.ids && plan.ids.length > 0) {\n        await ns.deleteMany({ ids: plan.ids })\n        // Call settle after delete-by-ids to wait for absence\n        await this.#settle(ns, collection, { absent: plan.ids }, 'delete by id', mode)\n      } else if (plan.filter) {\n        // Pinecone v7 listPaginated filter is broken, and Pinecone doesn't support\n        // filtering by record ID. Get all IDs and filter client-side.\n        let page: any = { next: null }\n        const ids: string[] = []\n        do {\n          const listRes = await this.#index!.listPaginated({\n            limit: 99,\n            startingToken: page.next,\n            namespace: physicalNs,\n          })\n          if (listRes.vectors) {\n            ids.push(...listRes.vectors.map((v: any) => v.id))\n          }\n          page.next = listRes.pagination?.next\n        } while (page.next)\n\n        // For Pinecone, we can only filter by metadata fields.\n        // If the filter is on 'id', filter client-side without metadata.\n        // Otherwise, fetch records and filter by metadata.\n        const deleteIds: string[] = []\n\n        // Check if filter targets 'id' field (Pinecone record ID)\n        const filterTargetsId = plan.filter ? isFilterOnId(plan.filter) : false\n\n        if (filterTargetsId) {\n          // Filter by record ID directly\n          for (const id of ids) {\n            if (evaluateFilter(plan.filter, { id })) {\n              deleteIds.push(id)\n            }\n          }\n        } else {\n          // Filter by metadata\n          for (const id of ids) {\n            const res = await ns.fetch({ ids: [id] })\n            const record = res.records[id]\n            if (record && record.metadata) {\n              const evalMeta: VectorMetadata = {}\n              for (const key in record.metadata) {\n                if (key !== '__document') {\n                  evalMeta[key] = record.metadata[key]\n                }\n              }\n              if (evaluateFilter(plan.filter, evalMeta)) {\n                deleteIds.push(id)\n              }\n            }\n          }\n        }\n\n        if (deleteIds.length > 0) {\n          await ns.deleteMany({ ids: deleteIds })\n          // Call settle after delete-by-filter to wait for absence\n          await this.#settle(ns, collection, { absent: deleteIds }, 'delete by filter', mode)\n        }\n      } else {\n        // Delete all via list+deleteMany pattern (no more deleteAll + settleEmpty)\n        let page: any = { next: null }\n        const allIds: string[] = []\n        do {\n          const lr = await this.#index!.listPaginated({\n            namespace: physicalNs,\n            limit: 99,\n            startingToken: page.next,\n          })\n          if (lr.vectors) allIds.push(...lr.vectors.map((v: any) => v.id))\n          page.next = lr.pagination?.next\n        } while (page.next)\n\n        if (allIds.length > 0) {\n          await ns.deleteMany({ ids: allIds })\n        }\n        // Settle on absence\n        await this.#settle(ns, collection, { absent: allIds }, 'delete all', mode)\n      }\n    } catch (err) {\n      // Re-throw consistency timeout directly (don't swallow)\n      if (\n        isInstanceOf(err, 'E_VECTOR_STORE_CONSISTENCY_TIMEOUT', E_VECTOR_STORE_CONSISTENCY_TIMEOUT)\n      )\n        throw err\n      throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n    }\n  }\n}\n\n// Check if a filter targets the 'id' field (Pinecone record ID)\nconst isFilterOnId = (filter?: VectorFilter): boolean => {\n  if (!filter) return false\n  if (isRawFilter(filter)) {\n    return false\n  }\n  if (isFilterCondition(filter)) {\n    return filter.field === 'id'\n  }\n  if (isFilterGroup(filter)) {\n    const { and, or, not } = filter\n    if (and && and.length > 0) {\n      return and.some((f) => isFilterOnId(f))\n    }\n    if (or && or.length > 0) {\n      return or.some((f) => isFilterOnId(f))\n    }\n    if (not) {\n      return isFilterOnId(not)\n    }\n  }\n  return false\n}\n\n/** Translate a neutral {@link VectorFilter} into a Pinecone metadata filter object. */\nexport const translatePineconeFilter = (\n  filter?: VectorFilter\n): Record<string, unknown> | undefined => {\n  if (!filter) return undefined\n  if (isRawFilter(filter)) {\n    if (filter.$dialect === 'pinecone') {\n      return filter.$raw as Record<string, unknown>\n    }\n    throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', String(filter.$dialect)])\n  }\n  if (isFilterCondition(filter)) {\n    const { field, op, value } = filter\n    if (value === undefined) {\n      throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', op])\n    }\n    if (op === 'eq') {\n      return { [field]: { $eq: value } }\n    }\n    if (op === 'ne') {\n      return { [field]: { $ne: value } }\n    }\n    if (op === 'gt') {\n      return { [field]: { $gt: value } }\n    }\n    if (op === 'gte') {\n      return { [field]: { $gte: value } }\n    }\n    if (op === 'lt') {\n      return { [field]: { $lt: value } }\n    }\n    if (op === 'lte') {\n      return { [field]: { $lte: value } }\n    }\n    if (op === 'in') {\n      return { [field]: { $in: value } }\n    }\n    if (op === 'nin') {\n      return { [field]: { $nin: value } }\n    }\n    if (op === 'exists') {\n      throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', op])\n    }\n    if (op === 'contains') {\n      throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', op])\n    }\n    return undefined\n  }\n  if (isFilterGroup(filter)) {\n    const { and, or, not } = filter\n    if (and) {\n      const children = and\n        .map((f) => translatePineconeFilter(f) as Record<string, unknown>)\n        .filter((c) => c !== undefined)\n      if (children.length === 0) return undefined\n      if (children.length === 1) return children[0]\n      return { $and: children }\n    }\n    if (or) {\n      const children = or\n        .map((f) => translatePineconeFilter(f) as Record<string, unknown>)\n        .filter((c) => c !== undefined)\n      if (children.length === 0) return undefined\n      if (children.length === 1) return children[0]\n      return { $or: children }\n    }\n    if (not) {\n      throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', 'not'])\n    }\n    return undefined\n  }\n  return undefined\n}\n"],"mappings":";;;;;;;;;;;AAgDA,IAAM,oBAAoB,YAAY;CACpC,IAAI;EAEF,QAAO,MADW,OAAO,gCACd;CACb,QAAQ;EACN,MAAM,IAAI,kCAAkC,CAAC,6BAA6B,CAAC;CAC7E;AACF;AAEA,IAAa,sBAAb,cAAyC,gBAAgB;CACvD,eAAiD;EAC/C,cAAc;EACd,cAAc;EACd,QAAQ;EACR,QAAQ;EACR,iBAAiB;EAGjB,aAAa;GACX,cAAc;GACd,SAAS;GACT,OAAO;IAAC;IAAU;IAAe;GAAU;EAC7C;CACF;CACA,MAAkB;CAClB,SAAqB;CACrB,wBAA6B,IAAI,IAAI;CAIrC,iBAAiB,OAA8C;EAC7D,OACE,SACC,KAAK,QAAuC,eAC7C,KAAK,aAAa,YAAY;CAElC;CAKA,IAAI,YAA4B;EAC9B,MAAM,SAAU,KAAK,QAAuC;EAC5D,OAAO,SAAS,GAAG,OAAO,IAAI,eAAe;CAC/C;CAMA,MAAMA,aACJ,IACA,YACA,MACkB;EAClB,MAAM,UAAU,KAAK,WAAW,CAAC;EACjC,MAAM,SAAS,KAAK,UAAU,CAAC;EAC/B,IAAI,QAAQ,WAAW,KAAK,OAAO,WAAW,GAAG,OAAO;EACxD,MAAM,aAAa,KAAKC,IAAI,UAAU;EACtC,MAAM,OAAO,KAAKC,MAAM,IAAI,UAAU,KAAK;EAC3C,MAAM,WAAW,KAAK,eAAe,IAAI,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,MAAO,MAAM,IAAI,IAAI,CAAE;EAC5F,MAAM,WAAW,KAAK,IAAI,IAAI;EAC9B,MAAM,OAAO,KAAK,IAAI,QAAQ,SAAS,OAAO,SAAS,GAAG,EAAE;EAC5D,OAAO,MAAM;GACX,IAAI,YAAY;GAChB,IAAI,WAAW;GACf,IAAI,QAAQ,SAAS,GAAG;IACtB,IAAI,yBAAS,IAAI,IAAY;IAC7B,IAAI;KACF,MAAM,KAAK,MAAM,KAAKC,OAAQ,cAAc;MAAE,WAAW;MAAY,OAAO;KAAG,CAAC;KAChF,SAAS,IAAI,KAAK,GAAG,WAAW,CAAC,GAAG,KAAK,MAAW,EAAE,EAAE,CAAC;IAC3D,QAAQ;KACN,yBAAS,IAAI,IAAI;IACnB;IACA,IAAI,0BAAU,IAAI,IAAY;IAC9B,IAAI;KACF,MAAM,KAAK,MAAM,GAAG,MAAM;MAAE,QAAQ;MAAU;MAAM,eAAe;KAAM,CAAC;KAC1E,UAAU,IAAI,KAAK,GAAG,WAAW,CAAC,GAAG,KAAK,MAAW,EAAE,EAAE,CAAC;IAC5D,QAAQ;KACN,0BAAU,IAAI,IAAI;IACpB;IACA,YAAY,QAAQ,OAAO,OAAO,OAAO,IAAI,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC;GACrE;GACA,IAAI,OAAO,SAAS,GAAG;IACrB,IAAI,yBAAS,IAAI,IAAY;IAC7B,IAAI;KACF,MAAM,KAAK,MAAM,KAAKA,OAAQ,cAAc;MAAE,WAAW;MAAY,OAAO;KAAG,CAAC;KAChF,SAAS,IAAI,KAAK,GAAG,WAAW,CAAC,GAAG,KAAK,MAAW,EAAE,EAAE,CAAC;IAC3D,QAAQ;KACN,yBAAS,IAAI,IAAI;IACnB;IACA,IAAI,UAAmC,CAAC;IACxC,IAAI;KAEF,WAAU,MADO,GAAG,MAAM,EAAE,KAAK,OAAO,CAAC,GAC5B,WAAW,CAAC;IAC3B,QAAQ;KACN,UAAU,CAAC;IACb;IACA,WAAW,OAAO,OAAO,OAAO,CAAC,OAAO,IAAI,EAAE,KAAK,QAAQ,QAAQ,KAAA,CAAS;GAC9E;GACA,IAAI,aAAa,UAAU,OAAO;GAClC,IAAI,KAAK,IAAI,KAAK,UAAU,OAAO;GACnC,MAAM,IAAI,SAAS,MAAM,WAAW,GAAG,GAAG,CAAC;EAC7C;CACF;CAQA,MAAMC,QACJ,IACA,YACA,MACA,MACA,MACe;EACf,IAAI,SAAS,YAAY;EAEzB,IAAI,CAAC,MADmB,KAAKJ,aAAa,IAAI,YAAY,IAAI,KAC5C,SAAS,UACzB,MAAM,IAAI,mCAAmC,CAAC,IAAI,CAAC;CAGvD;;CAGA,OAAO,cAAuB;EAC5B,OAAO,OAAO,YAAY;CAC5B;CACA,cAAuB;EACrB,OAAO,OAAO,YAAY;CAC5B;CACA,MAAM,UAAyB;EAC7B,IAAI,KAAKK,KAAK;EACd,MAAM,WAAW,MAAM,kBAAkB;EACzC,MAAM,OAAO,KAAK;EAClB,IAAI;GACF,KAAKA,MAAM,IAAI,SAAS;IAAE,QAAQ,KAAK;IAAQ,GAAG,KAAK;GAAW,CAAC;GACnE,KAAKF,SAAS,KAAKE,IAAI,MAAM,KAAK,KAAK;EACzC,SAAS,KAAK;GACZ,MAAM,IAAI,iCAAiC,CAAC,OAAO,GAAG,CAAC,CAAC;EAC1D;CACF;CACA,MAAM,QAAuB;EAC3B,KAAKA,MAAM;EACX,KAAKF,SAAS;CAChB;CACA,MAAM,iBAAiB,MAAsB,aAAqC;EAChF,MAAM,aAAa,KAAK;EACxB,IAAI;OACE,MAAM,KAAK,cAAc,UAAU,GAAG;EAAA;EAE5C,IAAI,KAAKD,MAAM,IAAI,UAAU,GAAG;GAC9B,MAAM,cAAc,KAAKA,MAAM,IAAI,UAAU;GAC7C,IAAI,gBAAgB,KAAK,OAAO,YAC9B,MAAM,IAAI,iCAAiC,CACzC,oBACA,cAAc,WAAW,iCAAiC,aAC5D,CAAC;GAEH;EACF;EACA,KAAKA,MAAM,IAAI,YAAY,KAAK,OAAO,UAAU;CACnD;CACA,MAAM,eAAe,YAAoB,UAAkC;EACzE,IAAI;OACE,CAAE,MAAM,KAAK,cAAc,UAAU,GAAI;EAAA,OACxC,IAAI,CAAE,MAAM,KAAK,cAAc,UAAU,GAC9C;EAEF,MAAM,KAAK,QAAQ;EACnB,MAAM,aAAa,KAAKD,IAAI,UAAU;EACtC,MAAM,KAAK,KAAKE,OAAQ,UAAU,UAAU;EAC5C,IAAI;GAEF,IAAI,OAAY,EAAE,MAAM,KAAK;GAC7B,MAAM,MAAgB,CAAC;GACvB,GAAG;IACD,MAAM,KAAK,MAAM,KAAKA,OAAQ,cAAc;KAC1C,WAAW;KACX,OAAO;KACP,eAAe,KAAK;IACtB,CAAC;IACD,IAAI,GAAG,SAAS,IAAI,KAAK,GAAG,GAAG,QAAQ,KAAK,MAAW,EAAE,EAAE,CAAC;IAC5D,KAAK,OAAO,GAAG,YAAY;GAC7B,SAAS,KAAK;GAGd,IAAI,IAAI,SAAS,GACf,MAAM,GAAG,WAAW,EAAE,IAAI,CAAC;GAI7B,MAAM,KAAKC,QACT,IACA,YACA,EAAE,QAAQ,IAAI,GACd,oBAAoB,YACpB,KAAKE,iBAAiB,CACxB;EACF,SAAS,KAAU;GAEjB,IACE,aAAa,KAAK,sCAAsC,kCAAkC,GAE1F,MAAM;GACR,MAAM,MAAM,OAAO,GAAG;GACtB,IAAI,YAAY,IAAI,SAAS,WAAW,GAAG;GAC3C,MAAM,IAAI,iCAAiC,CAAC,kBAAkB,GAAG,CAAC;EACpE;CACF;CACA,MAAM,cAAc,YAAsC;EACxD,MAAM,KAAK,QAAQ;EAEnB,OAAO,CAAC,EAAC,MADW,KAAKH,OAAQ,mBAAmB,GACrC,aAAa,KAAKF,IAAI,UAAU;CACjD;CACA,MAAM,iBAAiB,OAAe,KAA4B;EAChE,MAAM,IAAI,qCAAqC,CAAC,oBAAoB,UAAU,CAAC;CACjF;CACA,MAAM,cAAc,MAAiC;EACnD,IAAI,KAAK,QAAQ,WAAW,GAAG;EAC/B,gBAAgB,KAAK,OAAO;EAC5B,MAAM,KAAK,QAAQ;EACnB,MAAM,aAAa,KAAK;EACxB,MAAM,KAAK,KAAKE,OAAQ,UAAU,KAAKF,IAAI,UAAU,CAAC;EACtD,MAAM,OAAO,KAAKC,MAAM,IAAI,UAAU;EACtC,MAAM,UAAiB,CAAC;EACxB,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;GACA,IAAI,CAAC,QACH,MAAM,IAAI,6BAA6B,CAAC,oCAAoC,CAAC;GAE/E,IAAI,SAAS,KAAA,KAAa,OAAO,WAAW,MAC1C,MAAM,IAAI,kCAAkC,CAAC,MAAM,OAAO,MAAM,CAAC;GAEnE,QAAQ,KAAK;IACX,IAAI,EAAE;IACN,QAAQ;IACR,UAAU;KAAE,GAAG,iBAAiB,EAAE,QAAQ;KAAG,YAAY,EAAE,YAAY;IAAG;GAC5E,CAAC;EACH;EACA,IAAI;GACF,MAAM,GAAG,OAAO,EAAE,SAAS,QAAQ,CAAC;GAEpC,MAAM,KAAKE,QACT,IACA,YACA,EAAE,SAAS,QAAQ,KAAK,MAAM,EAAE,EAAE,EAAE,GACpC,YAAY,QAAQ,SAAS,cAC7B,KAAKE,iBAAiB,KAAK,WAAW,CACxC;EACF,SAAS,KAAK;GACZ,IACE,aAAa,KAAK,sCAAsC,kCAAkC,GAE1F,MAAM;GACR,MAAM,IAAI,6BAA6B,CAAC,OAAO,GAAG,CAAC,CAAC;EACtD;CACF;CACA,MAAM,cAAc,MAA0C;EAC5D,MAAM,KAAK,QAAQ;EACnB,MAAM,aAAa,KAAK;EACxB,MAAM,aAAa,KAAKL,IAAI,UAAU;EACtC,MAAM,KAAK,KAAKE,OAAQ,UAAU,UAAU;EAC5C,MAAM,SAAS,KAAK,QAAQ,UAAU;EACtC,IAAI;EACJ,IAAI,KAAK;OACH,YAAY,KAAK,MACnB,cAAc,KAAK,KAAK;QACnB,IAAI,gBAAgB,KAAK,MAAM;IACpC,MAAM,CAAC,KAAK,MAAM,KAAK,OAAO,CAAC,KAAK,KAAK,UAAU,GAAG,OAAO;IAC7D,cAAc;GAChB,OAAO,IAAI,QAAQ,KAAK,MAAM;IAE5B,MAAM,UAAS,MADG,GAAG,MAAM,EAAE,KAAK,CAAC,KAAK,KAAK,EAAE,EAAE,CAAC,GAC/B,QAAQ,KAAK,KAAK;IACrC,IAAI,CAAC,QACH,MAAM,IAAI,6BAA6B,CAAC,8BAA8B,KAAK,KAAK,EAAE,CAAC;IAErF,cAAc,OAAO;GACvB;;EAEF,MAAM,SAAS,KAAK,UAAU;EAC9B,MAAM,IAAI,KAAK,OAAO;EACtB,IAAI,aAAa;GACf,MAAM,SAAS,wBAAwB,KAAK,MAAM;GASlD,MAAM,iBADa,MAPD,GAAG,MAAM;IACzB,QAAQ;IACR,MAAM;IACN;IACA,iBAAiB;IACjB,eAAe,CAAC,CAAC,KAAK,WAAW;GACnC,CAAC,GACsB,WAAW,CAAC,GACH,MAAM,MAAM;GAC5C,MAAM,UAAyB,CAAC;GAChC,KAAK,MAAM,SAAS,cAAc;IAChC,MAAM,OAAoB,CAAC;IAC3B,IAAI,KAAK,WAAW,IAClB,KAAK,KAAK,MAAM;IAElB,IAAI,KAAK,WAAW,UAAU,MAAM,QAClC,KAAK,SAAS,MAAM;IAEtB,IAAI,KAAK,WAAW,YAAY,MAAM,UACpC,KAAK,WAAW,MAAM,SAAS;IAEjC,IAAI,KAAK,WAAW,YAAY,MAAM,UAAU;KAC9C,MAAM,OAAuB,CAAC;KAC9B,KAAK,MAAM,OAAO,MAAM,UACtB,IAAI,QAAQ,cACV,KAAK,OAAO,MAAM,SAAS;KAG/B,KAAK,WAAW;IAClB;IACA,IAAI,KAAK,MACP,KAAK,QAAQ,eAAe,MAAM,OAAQ,QAAQ,YAAY;IAEhE,QAAQ,KAAK,IAAI;GACnB;GACA,OAAO;EACT,OAAO;GAGL,IAAI,OAAY,EAAE,MAAM,KAAK;GAC7B,MAAM,MAAgB,CAAC;GACvB,GAAG;IAED,MAAM,UAAU,MAAM,KAAKA,OAAQ,cAAc;KAC/C,OAAO;KACP,eAAe,KAAK;KACpB,WAAW;IACb,CAAC;IACD,IAAI,QAAQ,SACV,IAAI,KAAK,GAAG,QAAQ,QAAQ,KAAK,MAAW,EAAE,EAAE,CAAC;IAEnD,KAAK,OAAO,QAAQ,YAAY;GAClC,SAAS,KAAK;GACd,IAAI,IAAI,WAAW,GAAG,OAAO,CAAC;GAG9B,MAAM,aAAkB,CAAC;GACzB,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,KAAK;IACxC,MAAM,QAAQ,IAAI,MAAM,GAAG,IAAI,GAAG;IAClC,MAAM,WAAW,MAAM,GAAG,MAAM,EAAE,KAAK,MAAM,CAAC;IAC9C,IAAI,YAAY,SAAS,SACvB,KAAK,MAAM,MAAM,SAAS,SACxB,WAAW,MAAM,SAAS,QAAQ;GAGxC;GACA,MAAM,UAAyB,CAAC;GAChC,KAAK,MAAM,MAAM,YAAY;IAC3B,MAAM,SAAS,WAAW;IAC1B,IAAI,OAAO,UAAU;KACnB,MAAM,WAA2B,CAAC;KAClC,KAAK,MAAM,OAAO,OAAO,UACvB,IAAI,QAAQ,cACV,SAAS,OAAO,OAAO,SAAS;KAIpC,IAAI,CAAC,KAAK,UAAU,eAAe,KAAK,QAAQ,QAAQ,GAAG;MACzD,MAAM,OAAoB,CAAC;MAC3B,IAAI,KAAK,WAAW,IAClB,KAAK,KAAK;MAEZ,IAAI,KAAK,WAAW,UAAU,OAAO,QACnC,KAAK,SAAS,OAAO;MAEvB,IAAI,KAAK,WAAW,YAAY,OAAO,UACrC,KAAK,WAAW,OAAO,SAAS;MAElC,IAAI,KAAK,WAAW,YAAY,OAAO,UAAU;OAC/C,MAAM,OAAuB,CAAC;OAC9B,KAAK,MAAM,OAAO,OAAO,UACvB,IAAI,QAAQ,cACV,KAAK,OAAO,OAAO,SAAS;OAGhC,KAAK,WAAW;MAClB;MACA,QAAQ,KAAK,IAAI;KACnB;IACF;GACF;GACA,OAAO,QAAQ,MAAM,QAAQ,SAAS,KAAK,IAAI;EACjD;CACF;CACA,MAAM,cAAc,MAAiC;EACnD,MAAM,KAAK,QAAQ;EACnB,MAAM,aAAa,KAAK;EACxB,MAAM,aAAa,KAAKF,IAAI,UAAU;EACtC,MAAM,KAAK,KAAKE,OAAQ,UAAU,UAAU;EAC5C,MAAM,OAAO,KAAKG,iBAAiB,KAAK,WAAW;EACnD,IAAI;GACF,IAAI,KAAK,OAAO,KAAK,IAAI,SAAS,GAAG;IACnC,MAAM,GAAG,WAAW,EAAE,KAAK,KAAK,IAAI,CAAC;IAErC,MAAM,KAAKF,QAAQ,IAAI,YAAY,EAAE,QAAQ,KAAK,IAAI,GAAG,gBAAgB,IAAI;GAC/E,OAAO,IAAI,KAAK,QAAQ;IAGtB,IAAI,OAAY,EAAE,MAAM,KAAK;IAC7B,MAAM,MAAgB,CAAC;IACvB,GAAG;KACD,MAAM,UAAU,MAAM,KAAKD,OAAQ,cAAc;MAC/C,OAAO;MACP,eAAe,KAAK;MACpB,WAAW;KACb,CAAC;KACD,IAAI,QAAQ,SACV,IAAI,KAAK,GAAG,QAAQ,QAAQ,KAAK,MAAW,EAAE,EAAE,CAAC;KAEnD,KAAK,OAAO,QAAQ,YAAY;IAClC,SAAS,KAAK;IAKd,MAAM,YAAsB,CAAC;IAK7B,IAFwB,KAAK,SAAS,aAAa,KAAK,MAAM,IAAI;UAI3D,MAAM,MAAM,KACf,IAAI,eAAe,KAAK,QAAQ,EAAE,GAAG,CAAC,GACpC,UAAU,KAAK,EAAE;IAAA,OAKrB,KAAK,MAAM,MAAM,KAAK;KAEpB,MAAM,UAAS,MADG,GAAG,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GACrB,QAAQ;KAC3B,IAAI,UAAU,OAAO,UAAU;MAC7B,MAAM,WAA2B,CAAC;MAClC,KAAK,MAAM,OAAO,OAAO,UACvB,IAAI,QAAQ,cACV,SAAS,OAAO,OAAO,SAAS;MAGpC,IAAI,eAAe,KAAK,QAAQ,QAAQ,GACtC,UAAU,KAAK,EAAE;KAErB;IACF;IAGF,IAAI,UAAU,SAAS,GAAG;KACxB,MAAM,GAAG,WAAW,EAAE,KAAK,UAAU,CAAC;KAEtC,MAAM,KAAKC,QAAQ,IAAI,YAAY,EAAE,QAAQ,UAAU,GAAG,oBAAoB,IAAI;IACpF;GACF,OAAO;IAEL,IAAI,OAAY,EAAE,MAAM,KAAK;IAC7B,MAAM,SAAmB,CAAC;IAC1B,GAAG;KACD,MAAM,KAAK,MAAM,KAAKD,OAAQ,cAAc;MAC1C,WAAW;MACX,OAAO;MACP,eAAe,KAAK;KACtB,CAAC;KACD,IAAI,GAAG,SAAS,OAAO,KAAK,GAAG,GAAG,QAAQ,KAAK,MAAW,EAAE,EAAE,CAAC;KAC/D,KAAK,OAAO,GAAG,YAAY;IAC7B,SAAS,KAAK;IAEd,IAAI,OAAO,SAAS,GAClB,MAAM,GAAG,WAAW,EAAE,KAAK,OAAO,CAAC;IAGrC,MAAM,KAAKC,QAAQ,IAAI,YAAY,EAAE,QAAQ,OAAO,GAAG,cAAc,IAAI;GAC3E;EACF,SAAS,KAAK;GAEZ,IACE,aAAa,KAAK,sCAAsC,kCAAkC,GAE1F,MAAM;GACR,MAAM,IAAI,6BAA6B,CAAC,OAAO,GAAG,CAAC,CAAC;EACtD;CACF;AACF;AAGA,IAAM,gBAAgB,WAAmC;CACvD,IAAI,CAAC,QAAQ,OAAO;CACpB,IAAI,YAAY,MAAM,GACpB,OAAO;CAET,IAAI,kBAAkB,MAAM,GAC1B,OAAO,OAAO,UAAU;CAE1B,IAAI,cAAc,MAAM,GAAG;EACzB,MAAM,EAAE,KAAK,IAAI,QAAQ;EACzB,IAAI,OAAO,IAAI,SAAS,GACtB,OAAO,IAAI,MAAM,MAAM,aAAa,CAAC,CAAC;EAExC,IAAI,MAAM,GAAG,SAAS,GACpB,OAAO,GAAG,MAAM,MAAM,aAAa,CAAC,CAAC;EAEvC,IAAI,KACF,OAAO,aAAa,GAAG;CAE3B;CACA,OAAO;AACT;;AAGA,IAAa,2BACX,WACwC;CACxC,IAAI,CAAC,QAAQ,OAAO,KAAA;CACpB,IAAI,YAAY,MAAM,GAAG;EACvB,IAAI,OAAO,aAAa,YACtB,OAAO,OAAO;EAEhB,MAAM,IAAI,2CAA2C,CAAC,YAAY,OAAO,OAAO,QAAQ,CAAC,CAAC;CAC5F;CACA,IAAI,kBAAkB,MAAM,GAAG;EAC7B,MAAM,EAAE,OAAO,IAAI,UAAU;EAC7B,IAAI,UAAU,KAAA,GACZ,MAAM,IAAI,2CAA2C,CAAC,YAAY,EAAE,CAAC;EAEvE,IAAI,OAAO,MACT,OAAO,GAAG,QAAQ,EAAE,KAAK,MAAM,EAAE;EAEnC,IAAI,OAAO,MACT,OAAO,GAAG,QAAQ,EAAE,KAAK,MAAM,EAAE;EAEnC,IAAI,OAAO,MACT,OAAO,GAAG,QAAQ,EAAE,KAAK,MAAM,EAAE;EAEnC,IAAI,OAAO,OACT,OAAO,GAAG,QAAQ,EAAE,MAAM,MAAM,EAAE;EAEpC,IAAI,OAAO,MACT,OAAO,GAAG,QAAQ,EAAE,KAAK,MAAM,EAAE;EAEnC,IAAI,OAAO,OACT,OAAO,GAAG,QAAQ,EAAE,MAAM,MAAM,EAAE;EAEpC,IAAI,OAAO,MACT,OAAO,GAAG,QAAQ,EAAE,KAAK,MAAM,EAAE;EAEnC,IAAI,OAAO,OACT,OAAO,GAAG,QAAQ,EAAE,MAAM,MAAM,EAAE;EAEpC,IAAI,OAAO,UACT,MAAM,IAAI,2CAA2C,CAAC,YAAY,EAAE,CAAC;EAEvE,IAAI,OAAO,YACT,MAAM,IAAI,2CAA2C,CAAC,YAAY,EAAE,CAAC;EAEvE;CACF;CACA,IAAI,cAAc,MAAM,GAAG;EACzB,MAAM,EAAE,KAAK,IAAI,QAAQ;EACzB,IAAI,KAAK;GACP,MAAM,WAAW,IACd,KAAK,MAAM,wBAAwB,CAAC,CAA4B,EAChE,QAAQ,MAAM,MAAM,KAAA,CAAS;GAChC,IAAI,SAAS,WAAW,GAAG,OAAO,KAAA;GAClC,IAAI,SAAS,WAAW,GAAG,OAAO,SAAS;GAC3C,OAAO,EAAE,MAAM,SAAS;EAC1B;EACA,IAAI,IAAI;GACN,MAAM,WAAW,GACd,KAAK,MAAM,wBAAwB,CAAC,CAA4B,EAChE,QAAQ,MAAM,MAAM,KAAA,CAAS;GAChC,IAAI,SAAS,WAAW,GAAG,OAAO,KAAA;GAClC,IAAI,SAAS,WAAW,GAAG,OAAO,SAAS;GAC3C,OAAO,EAAE,KAAK,SAAS;EACzB;EACA,IAAI,KACF,MAAM,IAAI,2CAA2C,CAAC,YAAY,KAAK,CAAC;EAE1E;CACF;AAEF"}