@routstr/sdk 0.1.7 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../storage/drivers/localStorage.ts","../../storage/drivers/memory.ts","../../storage/drivers/sqlite.ts","../../storage/drivers/indexedDB.ts","../../storage/keys.ts","../../storage/store.ts","../../storage/index.ts"],"names":["isBun"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { StorageDriver } from \"../types\";\n\nconst canUseLocalStorage = (): boolean => {\n return (\n typeof window !== \"undefined\" && typeof window.localStorage !== \"undefined\"\n );\n};\n\nconst isQuotaExceeded = (error: unknown): boolean => {\n const e = error as { name?: string; code?: number } | null;\n return (\n !!e &&\n (e?.name === \"QuotaExceededError\" || e?.code === 22 || e?.code === 1014)\n );\n};\n\nconst NON_CRITICAL_KEYS = new Set<string>([\"modelsFromAllProviders\"]);\n\nexport const localStorageDriver: StorageDriver = {\n async getItem<T>(key: string, defaultValue: T): Promise<T> {\n if (!canUseLocalStorage()) return defaultValue;\n try {\n const item = window.localStorage.getItem(key);\n if (item === null) return defaultValue;\n try {\n return JSON.parse(item) as T;\n } catch (parseError) {\n if (typeof defaultValue === \"string\") {\n return item as T;\n }\n throw parseError;\n }\n } catch (error) {\n console.error(`Error retrieving item with key \"${key}\":`, error);\n if (canUseLocalStorage()) {\n try {\n window.localStorage.removeItem(key);\n } catch (removeError) {\n console.error(\n `Error removing corrupted item with key \"${key}\":`,\n removeError\n );\n }\n }\n return defaultValue;\n }\n },\n async setItem<T>(key: string, value: T): Promise<void> {\n if (!canUseLocalStorage()) return;\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch (error) {\n if (isQuotaExceeded(error)) {\n if (NON_CRITICAL_KEYS.has(key)) {\n console.warn(\n `Storage quota exceeded; skipping non-critical key \"${key}\".`\n );\n return;\n }\n try {\n window.localStorage.removeItem(\"modelsFromAllProviders\");\n } catch {}\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n return;\n } catch (retryError) {\n console.warn(\n `Storage quota exceeded; unable to persist key \"${key}\" after cleanup attempt.`,\n retryError\n );\n return;\n }\n }\n console.error(`Error storing item with key \"${key}\":`, error);\n }\n },\n async removeItem(key: string): Promise<void> {\n if (!canUseLocalStorage()) return;\n try {\n window.localStorage.removeItem(key);\n } catch (error) {\n console.error(`Error removing item with key \"${key}\":`, error);\n }\n },\n};\n","import type { StorageDriver } from \"../types\";\n\nexport const createMemoryDriver = (\n seed?: Record<string, string>\n): StorageDriver => {\n const store = new Map<string, string>();\n\n if (seed) {\n for (const [key, value] of Object.entries(seed)) {\n store.set(key, value);\n }\n }\n\n return {\n async getItem<T>(key: string, defaultValue: T): Promise<T> {\n const item = store.get(key);\n if (item === undefined) return defaultValue;\n try {\n return JSON.parse(item) as T;\n } catch (parseError) {\n if (typeof defaultValue === \"string\") {\n return item as T;\n }\n throw parseError;\n }\n },\n async setItem<T>(key: string, value: T): Promise<void> {\n store.set(key, JSON.stringify(value));\n },\n async removeItem(key: string): Promise<void> {\n store.delete(key);\n },\n };\n};\n","import type { StorageDriver } from \"../types\";\n\ntype BetterSqlite3Database = {\n prepare: (sql: string) => {\n run: (...params: any[]) => { changes: number };\n get: (...params: any[]) => any;\n };\n exec: (sql: string) => void;\n close?: () => void;\n};\n\nexport interface SqliteDriverOptions {\n dbPath?: string;\n tableName?: string;\n}\n\nconst isBun = (): boolean => {\n return typeof process.versions.bun !== \"undefined\";\n};\n\nconst createDatabase = (dbPath: string): BetterSqlite3Database => {\n if (isBun()) {\n throw new Error(\n \"SQLite driver not supported in Bun. Use createMemoryDriver() instead.\"\n );\n }\n\n let Database: any = null;\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n Database = require(\"better-sqlite3\");\n } catch (error) {\n throw new Error(\n `better-sqlite3 is required for sqlite storage. Install it to use sqlite storage. (${error})`\n );\n }\n return new Database(dbPath);\n};\n\nexport const createSqliteDriver = (\n options: SqliteDriverOptions = {}\n): StorageDriver => {\n const dbPath = options.dbPath || \"routstr.sqlite\";\n const tableName = options.tableName || \"sdk_storage\";\n\n const db = createDatabase(dbPath);\n db.exec(\n `CREATE TABLE IF NOT EXISTS ${tableName} (key TEXT PRIMARY KEY, value TEXT NOT NULL)`\n );\n\n const selectStmt = db.prepare(`SELECT value FROM ${tableName} WHERE key = ?`);\n const upsertStmt = db.prepare(\n `INSERT INTO ${tableName} (key, value) VALUES (?, ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value`\n );\n const deleteStmt = db.prepare(`DELETE FROM ${tableName} WHERE key = ?`);\n\n return {\n async getItem<T>(key: string, defaultValue: T): Promise<T> {\n try {\n const row = selectStmt.get(key);\n if (!row || typeof row.value !== \"string\") return defaultValue;\n try {\n return JSON.parse(row.value) as T;\n } catch (parseError) {\n if (typeof defaultValue === \"string\") {\n return row.value as T;\n }\n throw parseError;\n }\n } catch (error) {\n console.error(`SQLite getItem failed for key \"${key}\":`, error);\n return defaultValue;\n }\n },\n async setItem<T>(key: string, value: T): Promise<void> {\n try {\n upsertStmt.run(key, JSON.stringify(value));\n } catch (error) {\n console.error(`SQLite setItem failed for key \"${key}\":`, error);\n }\n },\n async removeItem(key: string): Promise<void> {\n try {\n deleteStmt.run(key);\n } catch (error) {\n console.error(`SQLite removeItem failed for key \"${key}\":`, error);\n }\n },\n };\n};\n","import type { StorageDriver } from \"../types\";\n\nexport interface IndexedDBDriverOptions {\n dbName?: string;\n storeName?: string;\n}\n\nconst openDatabase = (\n dbName: string,\n storeName: string\n): Promise<IDBDatabase> => {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(dbName, 1);\n\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains(storeName)) {\n db.createObjectStore(storeName);\n }\n };\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n};\n\nexport const createIndexedDBDriver = (\n options: IndexedDBDriverOptions = {}\n): StorageDriver => {\n const dbName = options.dbName || \"routstr-sdk\";\n const storeName = options.storeName || \"sdk_storage\";\n\n let dbPromise: Promise<IDBDatabase> | null = null;\n\n const getDb = (): Promise<IDBDatabase> => {\n if (!dbPromise) {\n dbPromise = openDatabase(dbName, storeName);\n }\n return dbPromise;\n };\n\n return {\n async getItem<T>(key: string, defaultValue: T): Promise<T> {\n try {\n const db = await getDb();\n return new Promise<T>((resolve, reject) => {\n const tx = db.transaction(storeName, \"readonly\");\n const store = tx.objectStore(storeName);\n const request = store.get(key);\n\n request.onsuccess = () => {\n const raw = request.result;\n if (raw === undefined) {\n resolve(defaultValue);\n return;\n }\n // Values are stored as raw JSON strings\n if (typeof raw === \"string\") {\n try {\n resolve(JSON.parse(raw) as T);\n } catch {\n if (typeof defaultValue === \"string\") {\n resolve(raw as T);\n } else {\n resolve(defaultValue);\n }\n }\n } else {\n // If stored as a native JS value (e.g. from a previous driver)\n resolve(raw as T);\n }\n };\n request.onerror = () => reject(request.error);\n });\n } catch (error) {\n console.error(`IndexedDB getItem failed for key \"${key}\":`, error);\n return defaultValue;\n }\n },\n\n async setItem<T>(key: string, value: T): Promise<void> {\n try {\n const db = await getDb();\n return new Promise<void>((resolve, reject) => {\n const tx = db.transaction(storeName, \"readwrite\");\n const store = tx.objectStore(storeName);\n store.put(JSON.stringify(value), key);\n\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n } catch (error) {\n console.error(`IndexedDB setItem failed for key \"${key}\":`, error);\n }\n },\n\n async removeItem(key: string): Promise<void> {\n try {\n const db = await getDb();\n return new Promise<void>((resolve, reject) => {\n const tx = db.transaction(storeName, \"readwrite\");\n const store = tx.objectStore(storeName);\n store.delete(key);\n\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n } catch (error) {\n console.error(`IndexedDB removeItem failed for key \"${key}\":`, error);\n }\n },\n };\n};\n","export const SDK_STORAGE_KEYS = {\n MODELS_FROM_ALL_PROVIDERS: \"modelsFromAllProviders\",\n LAST_USED_MODEL: \"lastUsedModel\",\n BASE_URLS_LIST: \"base_urls_list\",\n DISABLED_PROVIDERS: \"disabled_providers\",\n MINTS_FROM_ALL_PROVIDERS: \"mints_from_all_providers\",\n INFO_FROM_ALL_PROVIDERS: \"info_from_all_providers\",\n LAST_MODELS_UPDATE: \"lastModelsUpdate\",\n LAST_BASE_URLS_UPDATE: \"lastBaseUrlsUpdate\",\n LOCAL_CASHU_TOKENS: \"local_cashu_tokens\",\n API_KEYS: \"api_keys\",\n CHILD_KEYS: \"child_keys\",\n ROUTSTR21_MODELS: \"routstr21Models\",\n LAST_ROUTSTR21_MODELS_UPDATE: \"lastRoutstr21ModelsUpdate\",\n CACHED_RECEIVE_TOKENS: \"cached_receive_tokens\",\n} as const;\n\nexport type SdkStorageKey =\n (typeof SDK_STORAGE_KEYS)[keyof typeof SDK_STORAGE_KEYS];\n","import { createStore, type StoreApi } from \"zustand/vanilla\";\nimport type { DiscoveryAdapter } from \"../discovery/interfaces\";\nimport type { StorageAdapter, ProviderRegistry } from \"../wallet/interfaces\";\nimport type { ProviderInfo, Model } from \"../core\";\nimport { getDecodedToken } from \"@cashu/cashu-ts\";\nimport { SDK_STORAGE_KEYS } from \"./keys\";\nimport type { StorageDriver, SdkStorageState } from \"./types\";\n\nconst normalizeBaseUrl = (baseUrl: string): string =>\n baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n\nconst getCashuTokenBalance = (token: string): number => {\n try {\n const decoded = getDecodedToken(token);\n const unitDivisor = decoded.unit === \"msat\" ? 1000 : 1;\n let sum = 0;\n for (const proof of decoded.proofs) {\n sum += proof.amount / unitDivisor;\n }\n return sum;\n } catch {\n return 0;\n }\n};\n\nexport interface SdkStoreOptions {\n driver: StorageDriver;\n}\n\nexport interface SdkStorageStore extends SdkStorageState {\n setModelsFromAllProviders: (value: Record<string, Model[]>) => void;\n setLastUsedModel: (value: string | null) => void;\n setBaseUrlsList: (value: string[]) => void;\n setBaseUrlsLastUpdate: (value: number | null) => void;\n setDisabledProviders: (value: string[]) => void;\n setMintsFromAllProviders: (value: Record<string, string[]>) => void;\n setInfoFromAllProviders: (value: Record<string, ProviderInfo>) => void;\n setLastModelsUpdate: (value: Record<string, number>) => void;\n setCachedTokens: (\n value:\n | Array<{\n baseUrl: string;\n token: string;\n balance?: number;\n lastUsed?: number | null;\n }>\n | ((\n current: SdkStorageStore[\"cachedTokens\"]\n ) => SdkStorageStore[\"cachedTokens\"])\n ) => void;\n setApiKeys: (\n value:\n | Array<{\n baseUrl: string;\n key: string;\n balance?: number;\n lastUsed?: number | null;\n }>\n | ((current: SdkStorageStore[\"apiKeys\"]) => SdkStorageStore[\"apiKeys\"])\n ) => void;\n setChildKeys: (\n value: Array<{\n parentBaseUrl: string;\n childKey: string;\n balance?: number;\n balanceLimit?: number;\n validityDate?: number;\n createdAt?: number;\n }>\n ) => void;\n setRoutstr21Models: (value: string[]) => void;\n setRoutstr21ModelsLastUpdate: (value: number | null) => void;\n setCachedReceiveTokens: (\n value: Array<{\n token: string;\n amount: number;\n unit: \"sat\" | \"msat\";\n createdAt?: number;\n }>\n ) => void;\n}\n\n/** Store type returned after async initialization */\nexport type SdkStore = StoreApi<SdkStorageStore>;\n\nexport const createSdkStore = async ({\n driver,\n}: SdkStoreOptions): Promise<SdkStore> => {\n // Hydrate all initial state from the async driver in parallel\n const [\n rawModels,\n lastUsedModel,\n rawBaseUrls,\n lastBaseUrlsUpdate,\n rawDisabledProviders,\n rawMints,\n rawInfo,\n rawLastModelsUpdate,\n rawCachedTokens,\n rawApiKeys,\n rawChildKeys,\n rawRoutstr21Models,\n rawLastRoutstr21ModelsUpdate,\n rawCachedReceiveTokens,\n ] = await Promise.all([\n driver.getItem<Record<string, Model[]>>(\n SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS,\n {}\n ),\n driver.getItem<string | null>(SDK_STORAGE_KEYS.LAST_USED_MODEL, null),\n driver.getItem<string[]>(SDK_STORAGE_KEYS.BASE_URLS_LIST, []),\n driver.getItem<number | null>(SDK_STORAGE_KEYS.LAST_BASE_URLS_UPDATE, null),\n driver.getItem<string[]>(SDK_STORAGE_KEYS.DISABLED_PROVIDERS, []),\n driver.getItem<Record<string, string[]>>(\n SDK_STORAGE_KEYS.MINTS_FROM_ALL_PROVIDERS,\n {}\n ),\n driver.getItem<Record<string, ProviderInfo>>(\n SDK_STORAGE_KEYS.INFO_FROM_ALL_PROVIDERS,\n {}\n ),\n driver.getItem<Record<string, number>>(\n SDK_STORAGE_KEYS.LAST_MODELS_UPDATE,\n {}\n ),\n driver.getItem<\n Array<{\n baseUrl: string;\n token: string;\n balance?: number;\n lastUsed?: number | null;\n }>\n >(SDK_STORAGE_KEYS.LOCAL_CASHU_TOKENS, []),\n driver.getItem<\n Array<{\n baseUrl: string;\n key: string;\n balance?: number;\n lastUsed?: number | null;\n }>\n >(SDK_STORAGE_KEYS.API_KEYS, []),\n driver.getItem<\n Array<{\n parentBaseUrl: string;\n childKey: string;\n balance?: number;\n balanceLimit?: number;\n validityDate?: number;\n createdAt?: number;\n }>\n >(SDK_STORAGE_KEYS.CHILD_KEYS, []),\n driver.getItem<string[]>(SDK_STORAGE_KEYS.ROUTSTR21_MODELS, []),\n driver.getItem<number | null>(\n SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE,\n null\n ),\n driver.getItem<\n Array<{\n token: string;\n amount: number;\n unit: \"sat\" | \"msat\";\n createdAt?: number;\n }>\n >(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, []),\n ]);\n\n // Normalize all hydrated state\n const modelsFromAllProviders = Object.fromEntries(\n Object.entries(rawModels).map(([baseUrl, models]) => [\n normalizeBaseUrl(baseUrl),\n models,\n ])\n );\n\n const baseUrlsList = rawBaseUrls.map((url) => normalizeBaseUrl(url));\n\n const disabledProviders = rawDisabledProviders.map((url) =>\n normalizeBaseUrl(url)\n );\n\n const mintsFromAllProviders = Object.fromEntries(\n Object.entries(rawMints).map(([baseUrl, mints]) => [\n normalizeBaseUrl(baseUrl),\n mints.map((mint) => (mint.endsWith(\"/\") ? mint.slice(0, -1) : mint)),\n ])\n );\n\n const infoFromAllProviders = Object.fromEntries(\n Object.entries(rawInfo).map(([baseUrl, info]) => [\n normalizeBaseUrl(baseUrl),\n info,\n ])\n );\n\n const lastModelsUpdate = Object.fromEntries(\n Object.entries(rawLastModelsUpdate).map(([baseUrl, timestamp]) => [\n normalizeBaseUrl(baseUrl),\n timestamp,\n ])\n );\n\n const cachedTokens = rawCachedTokens.map((entry) => ({\n ...entry,\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n balance:\n typeof entry.balance === \"number\"\n ? entry.balance\n : getCashuTokenBalance(entry.token),\n lastUsed: entry.lastUsed ?? null,\n }));\n\n const apiKeys = rawApiKeys.map((entry) => ({\n ...entry,\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n balance: entry.balance ?? 0,\n lastUsed: entry.lastUsed ?? null,\n }));\n\n const childKeys = rawChildKeys.map((entry) => ({\n parentBaseUrl: normalizeBaseUrl(entry.parentBaseUrl),\n childKey: entry.childKey,\n balance: entry.balance ?? 0,\n balanceLimit: entry.balanceLimit,\n validityDate: entry.validityDate,\n createdAt: entry.createdAt ?? Date.now(),\n }));\n\n const routstr21Models = rawRoutstr21Models;\n const lastRoutstr21ModelsUpdate = rawLastRoutstr21ModelsUpdate;\n\n const cachedReceiveTokens = rawCachedReceiveTokens?.map((entry) => ({\n token: entry.token,\n amount: entry.amount,\n unit: entry.unit || \"sat\",\n createdAt: entry.createdAt ?? Date.now(),\n }));\n\n // Create the store with hydrated state.\n // All setters update in-memory state synchronously and persist to driver\n // as fire-and-forget (no await on setItem).\n return createStore<SdkStorageStore>((set, get) => ({\n modelsFromAllProviders,\n lastUsedModel,\n baseUrlsList,\n lastBaseUrlsUpdate,\n disabledProviders,\n mintsFromAllProviders,\n infoFromAllProviders,\n lastModelsUpdate,\n cachedTokens,\n apiKeys,\n childKeys,\n routstr21Models,\n lastRoutstr21ModelsUpdate,\n cachedReceiveTokens,\n setModelsFromAllProviders: (value) => {\n const normalized: Record<string, Model[]> = {};\n for (const [baseUrl, models] of Object.entries(value)) {\n normalized[normalizeBaseUrl(baseUrl)] = models;\n }\n void driver.setItem(\n SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS,\n normalized\n );\n set({ modelsFromAllProviders: normalized });\n },\n setLastUsedModel: (value) => {\n void driver.setItem(SDK_STORAGE_KEYS.LAST_USED_MODEL, value);\n set({ lastUsedModel: value });\n },\n setBaseUrlsList: (value) => {\n const normalized = value.map((url) => normalizeBaseUrl(url));\n void driver.setItem(SDK_STORAGE_KEYS.BASE_URLS_LIST, normalized);\n set({ baseUrlsList: normalized });\n },\n setBaseUrlsLastUpdate: (value) => {\n void driver.setItem(SDK_STORAGE_KEYS.LAST_BASE_URLS_UPDATE, value);\n set({ lastBaseUrlsUpdate: value });\n },\n setDisabledProviders: (value) => {\n const normalized = value.map((url) => normalizeBaseUrl(url));\n void driver.setItem(SDK_STORAGE_KEYS.DISABLED_PROVIDERS, normalized);\n set({ disabledProviders: normalized });\n },\n setMintsFromAllProviders: (value) => {\n const normalized: Record<string, string[]> = {};\n for (const [baseUrl, mints] of Object.entries(value)) {\n normalized[normalizeBaseUrl(baseUrl)] = mints.map((mint) =>\n mint.endsWith(\"/\") ? mint.slice(0, -1) : mint\n );\n }\n void driver.setItem(\n SDK_STORAGE_KEYS.MINTS_FROM_ALL_PROVIDERS,\n normalized\n );\n set({ mintsFromAllProviders: normalized });\n },\n setInfoFromAllProviders: (value) => {\n const normalized: Record<string, ProviderInfo> = {};\n for (const [baseUrl, info] of Object.entries(value)) {\n normalized[normalizeBaseUrl(baseUrl)] = info;\n }\n void driver.setItem(SDK_STORAGE_KEYS.INFO_FROM_ALL_PROVIDERS, normalized);\n set({ infoFromAllProviders: normalized });\n },\n setLastModelsUpdate: (value) => {\n const normalized: Record<string, number> = {};\n for (const [baseUrl, timestamp] of Object.entries(value)) {\n normalized[normalizeBaseUrl(baseUrl)] = timestamp;\n }\n void driver.setItem(SDK_STORAGE_KEYS.LAST_MODELS_UPDATE, normalized);\n set({ lastModelsUpdate: normalized });\n },\n setCachedTokens: (value) => {\n set((state) => {\n const updates =\n typeof value === \"function\" ? value(state.cachedTokens) : value;\n const normalized = updates.map((entry) => ({\n ...entry,\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n balance:\n typeof entry.balance === \"number\"\n ? entry.balance\n : getCashuTokenBalance(entry.token),\n lastUsed: entry.lastUsed ?? null,\n }));\n void driver.setItem(SDK_STORAGE_KEYS.LOCAL_CASHU_TOKENS, normalized);\n return { cachedTokens: normalized };\n });\n },\n setApiKeys: (value) => {\n set((state) => {\n const updates =\n typeof value === \"function\" ? value(state.apiKeys) : value;\n const normalized = updates.map((entry) => ({\n ...entry,\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n balance: entry.balance ?? 0,\n lastUsed: entry.lastUsed ?? null,\n }));\n void driver.setItem(SDK_STORAGE_KEYS.API_KEYS, normalized);\n return { apiKeys: normalized };\n });\n },\n setChildKeys: (\n value:\n | Array<{\n parentBaseUrl: string;\n childKey: string;\n balance?: number;\n balanceLimit?: number;\n validityDate?: number;\n createdAt?: number;\n }>\n | ((\n current: SdkStorageStore[\"childKeys\"]\n ) => SdkStorageStore[\"childKeys\"])\n ) => {\n set((state) => {\n const updates =\n typeof value === \"function\" ? value(state.childKeys) : value;\n const normalized = updates.map((entry) => ({\n parentBaseUrl: normalizeBaseUrl(entry.parentBaseUrl),\n childKey: entry.childKey,\n balance: entry.balance ?? 0,\n balanceLimit: entry.balanceLimit,\n validityDate: entry.validityDate,\n createdAt: entry.createdAt ?? Date.now(),\n }));\n void driver.setItem(SDK_STORAGE_KEYS.CHILD_KEYS, normalized);\n return { childKeys: normalized };\n });\n },\n setRoutstr21Models: (value) => {\n void driver.setItem(SDK_STORAGE_KEYS.ROUTSTR21_MODELS, value);\n set({ routstr21Models: value });\n },\n setRoutstr21ModelsLastUpdate: (value) => {\n void driver.setItem(SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE, value);\n set({ lastRoutstr21ModelsUpdate: value });\n },\n setCachedReceiveTokens: (value) => {\n const normalized = value.map((entry) => ({\n token: entry.token,\n amount: entry.amount,\n unit: entry.unit || \"sat\",\n createdAt: entry.createdAt ?? Date.now(),\n }));\n void driver.setItem(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, normalized);\n set({ cachedReceiveTokens: normalized });\n },\n }));\n};\n\nexport const createDiscoveryAdapterFromStore = (\n store: SdkStore\n): DiscoveryAdapter => ({\n getCachedModels: () => store.getState().modelsFromAllProviders,\n setCachedModels: (models) =>\n store.getState().setModelsFromAllProviders(models),\n getCachedMints: () => store.getState().mintsFromAllProviders,\n setCachedMints: (mints) => store.getState().setMintsFromAllProviders(mints),\n getCachedProviderInfo: () => store.getState().infoFromAllProviders,\n setCachedProviderInfo: (info) =>\n store.getState().setInfoFromAllProviders(info),\n getProviderLastUpdate: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const timestamps = store.getState().lastModelsUpdate;\n return timestamps[normalized] || null;\n },\n setProviderLastUpdate: (baseUrl, timestamp) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const timestamps = { ...store.getState().lastModelsUpdate };\n timestamps[normalized] = timestamp;\n store.getState().setLastModelsUpdate(timestamps);\n },\n getLastUsedModel: () => store.getState().lastUsedModel,\n setLastUsedModel: (modelId) => store.getState().setLastUsedModel(modelId),\n getDisabledProviders: () => store.getState().disabledProviders,\n getBaseUrlsList: () => store.getState().baseUrlsList,\n setBaseUrlsList: (urls) => store.getState().setBaseUrlsList(urls),\n getBaseUrlsLastUpdate: () => store.getState().lastBaseUrlsUpdate,\n setBaseUrlsLastUpdate: (timestamp) =>\n store.getState().setBaseUrlsLastUpdate(timestamp),\n getRoutstr21Models: () => store.getState().routstr21Models,\n setRoutstr21Models: (models) => store.getState().setRoutstr21Models(models),\n getRoutstr21ModelsLastUpdate: () =>\n store.getState().lastRoutstr21ModelsUpdate,\n setRoutstr21ModelsLastUpdate: (timestamp) =>\n store.getState().setRoutstr21ModelsLastUpdate(timestamp),\n});\n\nexport const createStorageAdapterFromStore = (\n store: SdkStore\n): StorageAdapter => ({\n getToken: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const entry = store\n .getState()\n .cachedTokens.find((token) => token.baseUrl === normalized);\n if (!entry) return null;\n const next = store\n .getState()\n .cachedTokens.map((token) =>\n token.baseUrl === normalized\n ? { ...token, lastUsed: Date.now() }\n : token\n );\n store.getState().setCachedTokens(next);\n return entry.token;\n },\n setToken: (baseUrl, token) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const tokens = store.getState().cachedTokens;\n const balance = getCashuTokenBalance(token);\n const existingIndex = tokens.findIndex(\n (entry) => entry.baseUrl === normalized\n );\n if (existingIndex !== -1) {\n throw new Error(`Token already exists for baseUrl: ${normalized}`);\n }\n const next = [...tokens];\n next.push({\n baseUrl: normalized,\n token,\n balance,\n lastUsed: Date.now(),\n });\n store.getState().setCachedTokens(next);\n },\n removeToken: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const next = store\n .getState()\n .cachedTokens.filter((entry) => entry.baseUrl !== normalized);\n store.getState().setCachedTokens(next);\n },\n updateTokenBalance: (baseUrl, balance) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const tokens = store.getState().cachedTokens;\n const next = tokens.map((entry) =>\n entry.baseUrl === normalized ? { ...entry, balance } : entry\n );\n store.getState().setCachedTokens(next);\n },\n getCachedTokenDistribution: () => {\n const cachedTokens = store.getState().cachedTokens;\n const distributionMap: Record<string, number> = {};\n\n for (const entry of cachedTokens) {\n const sum = entry.balance || 0;\n if (sum > 0) {\n distributionMap[entry.baseUrl] =\n (distributionMap[entry.baseUrl] || 0) + sum;\n }\n }\n\n return Object.entries(distributionMap)\n .map(([baseUrl, amt]) => ({ baseUrl, amount: amt }))\n .sort((a, b) => b.amount - a.amount);\n },\n getApiKeyDistribution: () => {\n const apiKeys = store.getState().apiKeys;\n const distributionMap: Record<string, number> = {};\n\n for (const entry of apiKeys) {\n const sum = entry.balance || 0;\n if (sum > 0) {\n distributionMap[entry.baseUrl] =\n (distributionMap[entry.baseUrl] || 0) + sum;\n }\n }\n\n return Object.entries(distributionMap)\n .map(([baseUrl, amt]) => ({ baseUrl, amount: amt }))\n .sort((a, b) => b.amount - a.amount);\n },\n saveProviderInfo: (baseUrl, info) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const next = { ...store.getState().infoFromAllProviders };\n next[normalized] = info;\n store.getState().setInfoFromAllProviders(next);\n },\n getProviderInfo: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n return store.getState().infoFromAllProviders[normalized] || null;\n },\n\n // ========== API Keys (for apikeys mode) ==========\n\n getApiKey: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const entry = store\n .getState()\n .apiKeys.find((key) => key.baseUrl === normalized);\n if (!entry) return null;\n // Update lastUsed timestamp\n const next = store\n .getState()\n .apiKeys.map((key) =>\n key.baseUrl === normalized ? { ...key, lastUsed: Date.now() } : key\n );\n store.getState().setApiKeys(next);\n return entry;\n },\n\n setApiKey: (baseUrl, key) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const keys = store.getState().apiKeys;\n const existingIndex = keys.findIndex(\n (entry) => entry.baseUrl === normalized\n );\n if (existingIndex !== -1) {\n throw new Error(`ApiKey already exists for baseUrl: ${normalized}`);\n }\n const next = [...keys];\n next.push({\n baseUrl: normalized,\n key,\n balance: 0,\n lastUsed: Date.now(),\n });\n store.getState().setApiKeys(next);\n },\n\n updateApiKeyBalance: (baseUrl, balance) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const keys = store.getState().apiKeys;\n const next = keys.map((entry) =>\n entry.baseUrl === normalized ? { ...entry, balance } : entry\n );\n store.getState().setApiKeys(next);\n },\n\n removeApiKey: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const next = store\n .getState()\n .apiKeys.filter((entry) => entry.baseUrl !== normalized);\n store.getState().setApiKeys(next);\n },\n\n getAllApiKeys: () => {\n return store.getState().apiKeys.map((entry) => ({\n baseUrl: entry.baseUrl,\n key: entry.key,\n balance: entry.balance,\n lastUsed: entry.lastUsed,\n }));\n },\n\n // ========== Child Keys ==========\n\n getChildKey: (parentBaseUrl) => {\n const normalized = normalizeBaseUrl(parentBaseUrl);\n const entry = store\n .getState()\n .childKeys.find((key) => key.parentBaseUrl === normalized);\n if (!entry) return null;\n return {\n parentBaseUrl: entry.parentBaseUrl,\n childKey: entry.childKey,\n balance: entry.balance,\n balanceLimit: entry.balanceLimit,\n validityDate: entry.validityDate,\n createdAt: entry.createdAt,\n };\n },\n\n setChildKey: (\n parentBaseUrl,\n childKey,\n balance,\n validityDate,\n balanceLimit\n ) => {\n const normalized = normalizeBaseUrl(parentBaseUrl);\n const keys = store.getState().childKeys;\n const existingIndex = keys.findIndex(\n (entry) => entry.parentBaseUrl === normalized\n );\n if (existingIndex !== -1) {\n // Update existing child key\n const next = keys.map((entry) =>\n entry.parentBaseUrl === normalized\n ? {\n ...entry,\n childKey,\n balance: balance ?? 0,\n validityDate,\n balanceLimit,\n createdAt: Date.now(),\n }\n : entry\n );\n store.getState().setChildKeys(next);\n } else {\n // Add new child key\n const next = [...keys];\n next.push({\n parentBaseUrl: normalized,\n childKey,\n balance: balance ?? 0,\n validityDate,\n balanceLimit,\n createdAt: Date.now(),\n });\n store.getState().setChildKeys(next);\n }\n },\n\n updateChildKeyBalance: (parentBaseUrl, balance) => {\n const normalized = normalizeBaseUrl(parentBaseUrl);\n const keys = store.getState().childKeys;\n const next = keys.map((entry) =>\n entry.parentBaseUrl === normalized ? { ...entry, balance } : entry\n );\n store.getState().setChildKeys(next);\n },\n\n removeChildKey: (parentBaseUrl) => {\n const normalized = normalizeBaseUrl(parentBaseUrl);\n const next = store\n .getState()\n .childKeys.filter((entry) => entry.parentBaseUrl !== normalized);\n store.getState().setChildKeys(next);\n },\n\n getAllChildKeys: () => {\n return store.getState().childKeys.map((entry) => ({\n parentBaseUrl: entry.parentBaseUrl,\n childKey: entry.childKey,\n balance: entry.balance,\n balanceLimit: entry.balanceLimit,\n validityDate: entry.validityDate,\n createdAt: entry.createdAt,\n }));\n },\n\n getCachedReceiveTokens: () => {\n return store.getState().cachedReceiveTokens;\n },\n\n setCachedReceiveTokens: (tokens) => {\n store.getState().setCachedReceiveTokens(tokens);\n },\n});\n\nexport const createProviderRegistryFromStore = (\n store: SdkStore\n): ProviderRegistry => ({\n getModelsForProvider: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n return store.getState().modelsFromAllProviders[normalized] || [];\n },\n getDisabledProviders: () => store.getState().disabledProviders,\n getProviderMints: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n return store.getState().mintsFromAllProviders[normalized] || [];\n },\n getProviderInfo: async (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const cached = store.getState().infoFromAllProviders[normalized];\n if (cached) return cached;\n try {\n const response = await fetch(`${normalized}v1/info`);\n if (!response.ok) {\n throw new Error(`Failed ${response.status}`);\n }\n const info = (await response.json()) as ProviderInfo;\n const next = { ...store.getState().infoFromAllProviders };\n next[normalized] = info;\n store.getState().setInfoFromAllProviders(next);\n return info;\n } catch (error) {\n console.warn(`Failed to fetch provider info from ${normalized}:`, error);\n return null;\n }\n },\n getAllProvidersModels: () => store.getState().modelsFromAllProviders,\n});\n","import { localStorageDriver } from \"./drivers/localStorage\";\nimport { createMemoryDriver } from \"./drivers/memory\";\nimport { createSqliteDriver } from \"./drivers/sqlite\";\nimport { createIndexedDBDriver } from \"./drivers/indexedDB\";\nimport type { StorageDriver } from \"./types\";\nimport {\n createSdkStore,\n createDiscoveryAdapterFromStore,\n createProviderRegistryFromStore,\n createStorageAdapterFromStore,\n type SdkStore,\n} from \"./store\";\n\nexport type { StorageDriver } from \"./types\";\nexport type { SdkStore } from \"./store\";\nexport type { DiscoveryAdapter } from \"../discovery/interfaces\";\nexport type { StorageAdapter, ProviderRegistry } from \"../wallet/interfaces\";\nexport { SDK_STORAGE_KEYS } from \"./keys\";\nexport {\n createSdkStore,\n createDiscoveryAdapterFromStore,\n createProviderRegistryFromStore,\n createStorageAdapterFromStore,\n} from \"./store\";\nexport {\n localStorageDriver,\n createMemoryDriver,\n createSqliteDriver,\n createIndexedDBDriver,\n};\n\nconst isBrowser = (): boolean => {\n try {\n return (\n typeof window !== \"undefined\" &&\n typeof window.localStorage !== \"undefined\"\n );\n } catch {\n return false;\n }\n};\n\nconst isNode = (): boolean => {\n try {\n return (\n typeof process !== \"undefined\" &&\n process.versions != null &&\n process.versions.node != null\n );\n } catch {\n return false;\n }\n};\n\nlet defaultDriver: StorageDriver | null = null;\n\nconst isBun = (): boolean => {\n return typeof process.versions.bun !== \"undefined\";\n};\n\nexport const getDefaultSdkDriver = (): StorageDriver => {\n if (defaultDriver) return defaultDriver;\n if (isBrowser()) {\n defaultDriver = localStorageDriver;\n return defaultDriver;\n }\n if (isBun()) {\n defaultDriver = createMemoryDriver();\n return defaultDriver;\n }\n if (isNode()) {\n defaultDriver = createSqliteDriver();\n return defaultDriver;\n }\n defaultDriver = createMemoryDriver();\n return defaultDriver;\n};\n\nlet defaultStorePromise: Promise<SdkStore> | null = null;\n\nexport const getDefaultSdkStore = (): Promise<SdkStore> => {\n if (!defaultStorePromise) {\n defaultStorePromise = createSdkStore({ driver: getDefaultSdkDriver() });\n }\n return defaultStorePromise;\n};\n\nexport const getDefaultDiscoveryAdapter = async () =>\n createDiscoveryAdapterFromStore(await getDefaultSdkStore());\n\nexport const getDefaultStorageAdapter = async () =>\n createStorageAdapterFromStore(await getDefaultSdkStore());\n\nexport const getDefaultProviderRegistry = async () =>\n createProviderRegistryFromStore(await getDefaultSdkStore());\n"]}
1
+ {"version":3,"sources":["../../storage/drivers/localStorage.ts","../../storage/drivers/memory.ts","../../storage/drivers/sqlite.ts","../../storage/drivers/indexedDB.ts","../../storage/keys.ts","../../storage/store.ts","../../storage/index.ts"],"names":["isBun"],"mappings":";;;;;;;;;;;AAEA,IAAM,qBAAqB,MAAe;AACxC,EAAA,OACE,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,OAAO,YAAA,KAAiB,WAAA;AAEpE,CAAA;AAEA,IAAM,eAAA,GAAkB,CAAC,KAAA,KAA4B;AACnD,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,OACE,CAAC,CAAC,CAAA,KACD,CAAA,EAAG,IAAA,KAAS,wBAAwB,CAAA,EAAG,IAAA,KAAS,EAAA,IAAM,CAAA,EAAG,IAAA,KAAS,IAAA,CAAA;AAEvE,CAAA;AAEA,IAAM,iBAAA,mBAAoB,IAAI,GAAA,CAAY,CAAC,wBAAwB,CAAC,CAAA;AAE7D,IAAM,kBAAA,GAAoC;AAAA,EAC/C,MAAM,OAAA,CAAW,GAAA,EAAa,YAAA,EAA6B;AACzD,IAAA,IAAI,CAAC,kBAAA,EAAmB,EAAG,OAAO,YAAA;AAClC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AAC5C,MAAA,IAAI,IAAA,KAAS,MAAM,OAAO,YAAA;AAC1B,MAAA,IAAI;AACF,QAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,MACxB,SAAS,UAAA,EAAY;AACnB,QAAA,IAAI,OAAO,iBAAiB,QAAA,EAAU;AACpC,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,MAAM,UAAA;AAAA,MACR;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,gCAAA,EAAmC,GAAG,CAAA,EAAA,CAAA,EAAM,KAAK,CAAA;AAC/D,MAAA,IAAI,oBAAmB,EAAG;AACxB,QAAA,IAAI;AACF,UAAA,MAAA,CAAO,YAAA,CAAa,WAAW,GAAG,CAAA;AAAA,QACpC,SAAS,WAAA,EAAa;AACpB,UAAA,OAAA,CAAQ,KAAA;AAAA,YACN,2CAA2C,GAAG,CAAA,EAAA,CAAA;AAAA,YAC9C;AAAA,WACF;AAAA,QACF;AAAA,MACF;AACA,MAAA,OAAO,YAAA;AAAA,IACT;AAAA,EACF,CAAA;AAAA,EACA,MAAM,OAAA,CAAW,GAAA,EAAa,KAAA,EAAyB;AACrD,IAAA,IAAI,CAAC,oBAAmB,EAAG;AAC3B,IAAA,IAAI;AACF,MAAA,MAAA,CAAO,aAAa,OAAA,CAAQ,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,IACxD,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,eAAA,CAAgB,KAAK,CAAA,EAAG;AAC1B,QAAA,IAAI,iBAAA,CAAkB,GAAA,CAAI,GAAG,CAAA,EAAG;AAC9B,UAAA,OAAA,CAAQ,IAAA;AAAA,YACN,sDAAsD,GAAG,CAAA,EAAA;AAAA,WAC3D;AACA,UAAA;AAAA,QACF;AACA,QAAA,IAAI;AACF,UAAA,MAAA,CAAO,YAAA,CAAa,WAAW,wBAAwB,CAAA;AAAA,QACzD,CAAA,CAAA,MAAQ;AAAA,QAAC;AACT,QAAA,IAAI;AACF,UAAA,MAAA,CAAO,aAAa,OAAA,CAAQ,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AACtD,UAAA;AAAA,QACF,SAAS,UAAA,EAAY;AACnB,UAAA,OAAA,CAAQ,IAAA;AAAA,YACN,kDAAkD,GAAG,CAAA,wBAAA,CAAA;AAAA,YACrD;AAAA,WACF;AACA,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,6BAAA,EAAgC,GAAG,CAAA,EAAA,CAAA,EAAM,KAAK,CAAA;AAAA,IAC9D;AAAA,EACF,CAAA;AAAA,EACA,MAAM,WAAW,GAAA,EAA4B;AAC3C,IAAA,IAAI,CAAC,oBAAmB,EAAG;AAC3B,IAAA,IAAI;AACF,MAAA,MAAA,CAAO,YAAA,CAAa,WAAW,GAAG,CAAA;AAAA,IACpC,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,8BAAA,EAAiC,GAAG,CAAA,EAAA,CAAA,EAAM,KAAK,CAAA;AAAA,IAC/D;AAAA,EACF;AACF;;;AClFO,IAAM,kBAAA,GAAqB,CAChC,IAAA,KACkB;AAClB,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAoB;AAEtC,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,MAAA,KAAA,CAAM,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,IACtB;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,OAAA,CAAW,GAAA,EAAa,YAAA,EAA6B;AACzD,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAC1B,MAAA,IAAI,IAAA,KAAS,QAAW,OAAO,YAAA;AAC/B,MAAA,IAAI;AACF,QAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,MACxB,SAAS,UAAA,EAAY;AACnB,QAAA,IAAI,OAAO,iBAAiB,QAAA,EAAU;AACpC,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,MAAM,UAAA;AAAA,MACR;AAAA,IACF,CAAA;AAAA,IACA,MAAM,OAAA,CAAW,GAAA,EAAa,KAAA,EAAyB;AACrD,MAAA,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,IACtC,CAAA;AAAA,IACA,MAAM,WAAW,GAAA,EAA4B;AAC3C,MAAA,KAAA,CAAM,OAAO,GAAG,CAAA;AAAA,IAClB;AAAA,GACF;AACF;;;ACjBA,IAAM,QAAQ,MAAe;AAC3B,EAAA,OAAO,OAAO,OAAA,CAAQ,QAAA,CAAS,GAAA,KAAQ,WAAA;AACzC,CAAA;AAEA,IAAM,cAAA,GAAiB,CAAC,MAAA,KAA0C;AAChE,EAAA,IAAI,OAAM,EAAG;AACX,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,QAAA,GAAgB,IAAA;AACpB,EAAA,IAAI;AAEF,IAAA,QAAA,GAAW,UAAQ,gBAAgB,CAAA;AAAA,EACrC,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,qFAAqF,KAAK,CAAA,CAAA;AAAA,KAC5F;AAAA,EACF;AACA,EAAA,OAAO,IAAI,SAAS,MAAM,CAAA;AAC5B,CAAA;AAEO,IAAM,kBAAA,GAAqB,CAChC,OAAA,GAA+B,EAAC,KACd;AAClB,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,gBAAA;AACjC,EAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,aAAA;AAEvC,EAAA,MAAM,EAAA,GAAK,eAAe,MAAM,CAAA;AAChC,EAAA,EAAA,CAAG,IAAA;AAAA,IACD,8BAA8B,SAAS,CAAA,4CAAA;AAAA,GACzC;AAEA,EAAA,MAAM,UAAA,GAAa,EAAA,CAAG,OAAA,CAAQ,CAAA,kBAAA,EAAqB,SAAS,CAAA,cAAA,CAAgB,CAAA;AAC5E,EAAA,MAAM,aAAa,EAAA,CAAG,OAAA;AAAA,IACpB,eAAe,SAAS,CAAA;AAAA,0DAAA;AAAA,GAE1B;AACA,EAAA,MAAM,UAAA,GAAa,EAAA,CAAG,OAAA,CAAQ,CAAA,YAAA,EAAe,SAAS,CAAA,cAAA,CAAgB,CAAA;AAEtE,EAAA,OAAO;AAAA,IACL,MAAM,OAAA,CAAW,GAAA,EAAa,YAAA,EAA6B;AACzD,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAM,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA;AAC9B,QAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,CAAI,KAAA,KAAU,UAAU,OAAO,YAAA;AAClD,QAAA,IAAI;AACF,UAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAK,CAAA;AAAA,QAC7B,SAAS,UAAA,EAAY;AACnB,UAAA,IAAI,OAAO,iBAAiB,QAAA,EAAU;AACpC,YAAA,OAAO,GAAA,CAAI,KAAA;AAAA,UACb;AACA,UAAA,MAAM,UAAA;AAAA,QACR;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,+BAAA,EAAkC,GAAG,CAAA,EAAA,CAAA,EAAM,KAAK,CAAA;AAC9D,QAAA,OAAO,YAAA;AAAA,MACT;AAAA,IACF,CAAA;AAAA,IACA,MAAM,OAAA,CAAW,GAAA,EAAa,KAAA,EAAyB;AACrD,MAAA,IAAI;AACF,QAAA,UAAA,CAAW,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,MAC3C,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,+BAAA,EAAkC,GAAG,CAAA,EAAA,CAAA,EAAM,KAAK,CAAA;AAAA,MAChE;AAAA,IACF,CAAA;AAAA,IACA,MAAM,WAAW,GAAA,EAA4B;AAC3C,MAAA,IAAI;AACF,QAAA,UAAA,CAAW,IAAI,GAAG,CAAA;AAAA,MACpB,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,kCAAA,EAAqC,GAAG,CAAA,EAAA,CAAA,EAAM,KAAK,CAAA;AAAA,MACnE;AAAA,IACF;AAAA,GACF;AACF;;;ACnFA,IAAM,YAAA,GAAe,CACnB,MAAA,EACA,SAAA,KACyB;AACzB,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,IAAA,CAAK,MAAA,EAAQ,CAAC,CAAA;AAExC,IAAA,OAAA,CAAQ,kBAAkB,MAAM;AAC9B,MAAA,MAAM,KAAK,OAAA,CAAQ,MAAA;AACnB,MAAA,IAAI,CAAC,EAAA,CAAG,gBAAA,CAAiB,QAAA,CAAS,SAAS,CAAA,EAAG;AAC5C,QAAA,EAAA,CAAG,kBAAkB,SAAS,CAAA;AAAA,MAChC;AAAA,IACF,CAAA;AAEA,IAAA,OAAA,CAAQ,SAAA,GAAY,MAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA;AAChD,IAAA,OAAA,CAAQ,OAAA,GAAU,MAAM,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AAAA,EAC9C,CAAC,CAAA;AACH,CAAA;AAEO,IAAM,qBAAA,GAAwB,CACnC,OAAA,GAAkC,EAAC,KACjB;AAClB,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,aAAA;AACjC,EAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,aAAA;AAEvC,EAAA,IAAI,SAAA,GAAyC,IAAA;AAE7C,EAAA,MAAM,QAAQ,MAA4B;AACxC,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,SAAA,GAAY,YAAA,CAAa,QAAQ,SAAS,CAAA;AAAA,IAC5C;AACA,IAAA,OAAO,SAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,OAAA,CAAW,GAAA,EAAa,YAAA,EAA6B;AACzD,MAAA,IAAI;AACF,QAAA,MAAM,EAAA,GAAK,MAAM,KAAA,EAAM;AACvB,QAAA,OAAO,IAAI,OAAA,CAAW,CAAC,OAAA,EAAS,MAAA,KAAW;AACzC,UAAA,MAAM,EAAA,GAAK,EAAA,CAAG,WAAA,CAAY,SAAA,EAAW,UAAU,CAAA;AAC/C,UAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,WAAA,CAAY,SAAS,CAAA;AACtC,UAAA,MAAM,OAAA,GAAU,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAE7B,UAAA,OAAA,CAAQ,YAAY,MAAM;AACxB,YAAA,MAAM,MAAM,OAAA,CAAQ,MAAA;AACpB,YAAA,IAAI,QAAQ,KAAA,CAAA,EAAW;AACrB,cAAA,OAAA,CAAQ,YAAY,CAAA;AACpB,cAAA;AAAA,YACF;AAEA,YAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,cAAA,IAAI;AACF,gBAAA,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAM,CAAA;AAAA,cAC9B,CAAA,CAAA,MAAQ;AACN,gBAAA,IAAI,OAAO,iBAAiB,QAAA,EAAU;AACpC,kBAAA,OAAA,CAAQ,GAAQ,CAAA;AAAA,gBAClB,CAAA,MAAO;AACL,kBAAA,OAAA,CAAQ,YAAY,CAAA;AAAA,gBACtB;AAAA,cACF;AAAA,YACF,CAAA,MAAO;AAEL,cAAA,OAAA,CAAQ,GAAQ,CAAA;AAAA,YAClB;AAAA,UACF,CAAA;AACA,UAAA,OAAA,CAAQ,OAAA,GAAU,MAAM,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AAAA,QAC9C,CAAC,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,kCAAA,EAAqC,GAAG,CAAA,EAAA,CAAA,EAAM,KAAK,CAAA;AACjE,QAAA,OAAO,YAAA;AAAA,MACT;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,OAAA,CAAW,GAAA,EAAa,KAAA,EAAyB;AACrD,MAAA,IAAI;AACF,QAAA,MAAM,EAAA,GAAK,MAAM,KAAA,EAAM;AACvB,QAAA,OAAO,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC5C,UAAA,MAAM,EAAA,GAAK,EAAA,CAAG,WAAA,CAAY,SAAA,EAAW,WAAW,CAAA;AAChD,UAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,WAAA,CAAY,SAAS,CAAA;AACtC,UAAA,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,KAAK,GAAG,GAAG,CAAA;AAEpC,UAAA,EAAA,CAAG,UAAA,GAAa,MAAM,OAAA,EAAQ;AAC9B,UAAA,EAAA,CAAG,OAAA,GAAU,MAAM,MAAA,CAAO,EAAA,CAAG,KAAK,CAAA;AAAA,QACpC,CAAC,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,kCAAA,EAAqC,GAAG,CAAA,EAAA,CAAA,EAAM,KAAK,CAAA;AAAA,MACnE;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,WAAW,GAAA,EAA4B;AAC3C,MAAA,IAAI;AACF,QAAA,MAAM,EAAA,GAAK,MAAM,KAAA,EAAM;AACvB,QAAA,OAAO,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC5C,UAAA,MAAM,EAAA,GAAK,EAAA,CAAG,WAAA,CAAY,SAAA,EAAW,WAAW,CAAA;AAChD,UAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,WAAA,CAAY,SAAS,CAAA;AACtC,UAAA,KAAA,CAAM,OAAO,GAAG,CAAA;AAEhB,UAAA,EAAA,CAAG,UAAA,GAAa,MAAM,OAAA,EAAQ;AAC9B,UAAA,EAAA,CAAG,OAAA,GAAU,MAAM,MAAA,CAAO,EAAA,CAAG,KAAK,CAAA;AAAA,QACpC,CAAC,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,qCAAA,EAAwC,GAAG,CAAA,EAAA,CAAA,EAAM,KAAK,CAAA;AAAA,MACtE;AAAA,IACF;AAAA,GACF;AACF;;;AChHO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,yBAAA,EAA2B,wBAAA;AAAA,EAC3B,eAAA,EAAiB,eAAA;AAAA,EACjB,cAAA,EAAgB,gBAAA;AAAA,EAChB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,uBAAA,EAAyB,yBAAA;AAAA,EACzB,kBAAA,EAAoB,kBAAA;AAAA,EACpB,qBAAA,EAAuB,oBAAA;AAAA,EACvB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,QAAA,EAAU,UAAA;AAAA,EACV,UAAA,EAAY,YAAA;AAAA,EACZ,gBAAA,EAAkB,iBAAA;AAAA,EAClB,4BAAA,EAA8B,2BAAA;AAAA,EAC9B,qBAAA,EAAuB,uBAAA;AAAA,EACvB,cAAA,EAAgB;AAClB;;;ACRA,IAAM,gBAAA,GAAmB,CAAC,OAAA,KACxB,OAAA,CAAQ,SAAS,GAAG,CAAA,GAAI,OAAA,GAAU,CAAA,EAAG,OAAO,CAAA,CAAA,CAAA;AAE9C,IAAM,oBAAA,GAAuB,CAAC,KAAA,KAA0B;AACtD,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,gBAAgB,KAAK,CAAA;AACrC,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,IAAA,KAAS,MAAA,GAAS,GAAA,GAAO,CAAA;AACrD,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,KAAA,MAAW,KAAA,IAAS,QAAQ,MAAA,EAAQ;AAClC,MAAA,GAAA,IAAO,MAAM,MAAA,GAAS,WAAA;AAAA,IACxB;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,CAAA;AAAA,EACT;AACF,CAAA;AA+EO,IAAM,iBAAiB,OAAO;AAAA,EACnC;AACF,CAAA,KAA0C;AAExC,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,kBAAA;AAAA,IACA,oBAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,mBAAA;AAAA,IACA,eAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,kBAAA;AAAA,IACA,4BAAA;AAAA,IACA,sBAAA;AAAA,IACA;AAAA,GACF,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,IACpB,MAAA,CAAO,OAAA;AAAA,MACL,gBAAA,CAAiB,yBAAA;AAAA,MACjB;AAAC,KACH;AAAA,IACA,MAAA,CAAO,OAAA,CAAuB,gBAAA,CAAiB,eAAA,EAAiB,IAAI,CAAA;AAAA,IACpE,MAAA,CAAO,OAAA,CAAkB,gBAAA,CAAiB,cAAA,EAAgB,EAAE,CAAA;AAAA,IAC5D,MAAA,CAAO,OAAA,CAAuB,gBAAA,CAAiB,qBAAA,EAAuB,IAAI,CAAA;AAAA,IAC1E,MAAA,CAAO,OAAA,CAAkB,gBAAA,CAAiB,kBAAA,EAAoB,EAAE,CAAA;AAAA,IAChE,MAAA,CAAO,OAAA;AAAA,MACL,gBAAA,CAAiB,wBAAA;AAAA,MACjB;AAAC,KACH;AAAA,IACA,MAAA,CAAO,OAAA;AAAA,MACL,gBAAA,CAAiB,uBAAA;AAAA,MACjB;AAAC,KACH;AAAA,IACA,MAAA,CAAO,OAAA;AAAA,MACL,gBAAA,CAAiB,kBAAA;AAAA,MACjB;AAAC,KACH;AAAA,IACA,MAAA,CAAO,OAAA,CAOL,gBAAA,CAAiB,kBAAA,EAAoB,EAAE,CAAA;AAAA,IACzC,MAAA,CAAO,OAAA,CAOL,gBAAA,CAAiB,QAAA,EAAU,EAAE,CAAA;AAAA,IAC/B,MAAA,CAAO,OAAA,CASL,gBAAA,CAAiB,UAAA,EAAY,EAAE,CAAA;AAAA,IACjC,MAAA,CAAO,OAAA,CAAkB,gBAAA,CAAiB,gBAAA,EAAkB,EAAE,CAAA;AAAA,IAC9D,MAAA,CAAO,OAAA;AAAA,MACL,gBAAA,CAAiB,4BAAA;AAAA,MACjB;AAAA,KACF;AAAA,IACA,MAAA,CAAO,OAAA,CAOL,gBAAA,CAAiB,qBAAA,EAAuB,EAAE,CAAA;AAAA,IAC5C,MAAA,CAAO,OAAA,CAgBL,gBAAA,CAAiB,cAAA,EAAgB,EAAE;AAAA,GACtC,CAAA;AAGD,EAAA,MAAM,yBAAyB,MAAA,CAAO,WAAA;AAAA,IACpC,MAAA,CAAO,QAAQ,SAAS,CAAA,CAAE,IAAI,CAAC,CAAC,OAAA,EAAS,MAAM,CAAA,KAAM;AAAA,MACnD,iBAAiB,OAAO,CAAA;AAAA,MACxB;AAAA,KACD;AAAA,GACH;AAEA,EAAA,MAAM,eAAe,WAAA,CAAY,GAAA,CAAI,CAAC,GAAA,KAAQ,gBAAA,CAAiB,GAAG,CAAC,CAAA;AAEnE,EAAA,MAAM,oBAAoB,oBAAA,CAAqB,GAAA;AAAA,IAAI,CAAC,GAAA,KAClD,gBAAA,CAAiB,GAAG;AAAA,GACtB;AAEA,EAAA,MAAM,wBAAwB,MAAA,CAAO,WAAA;AAAA,IACnC,MAAA,CAAO,QAAQ,QAAQ,CAAA,CAAE,IAAI,CAAC,CAAC,OAAA,EAAS,KAAK,CAAA,KAAM;AAAA,MACjD,iBAAiB,OAAO,CAAA;AAAA,MACxB,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAU,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,IAAI,IAAK;AAAA,KACpE;AAAA,GACH;AAEA,EAAA,MAAM,uBAAuB,MAAA,CAAO,WAAA;AAAA,IAClC,MAAA,CAAO,QAAQ,OAAO,CAAA,CAAE,IAAI,CAAC,CAAC,OAAA,EAAS,IAAI,CAAA,KAAM;AAAA,MAC/C,iBAAiB,OAAO,CAAA;AAAA,MACxB;AAAA,KACD;AAAA,GACH;AAEA,EAAA,MAAM,mBAAmB,MAAA,CAAO,WAAA;AAAA,IAC9B,MAAA,CAAO,QAAQ,mBAAmB,CAAA,CAAE,IAAI,CAAC,CAAC,OAAA,EAAS,SAAS,CAAA,KAAM;AAAA,MAChE,iBAAiB,OAAO,CAAA;AAAA,MACxB;AAAA,KACD;AAAA,GACH;AAEA,EAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,IACnD,GAAG,KAAA;AAAA,IACH,OAAA,EAAS,gBAAA,CAAiB,KAAA,CAAM,OAAO,CAAA;AAAA,IACvC,OAAA,EACE,OAAO,KAAA,CAAM,OAAA,KAAY,WACrB,KAAA,CAAM,OAAA,GACN,oBAAA,CAAqB,KAAA,CAAM,KAAK,CAAA;AAAA,IACtC,QAAA,EAAU,MAAM,QAAA,IAAY;AAAA,GAC9B,CAAE,CAAA;AAEF,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,IACzC,GAAG,KAAA;AAAA,IACH,OAAA,EAAS,gBAAA,CAAiB,KAAA,CAAM,OAAO,CAAA;AAAA,IACvC,OAAA,EAAS,MAAM,OAAA,IAAW,CAAA;AAAA,IAC1B,QAAA,EAAU,MAAM,QAAA,IAAY;AAAA,GAC9B,CAAE,CAAA;AAEF,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,IAC7C,aAAA,EAAe,gBAAA,CAAiB,KAAA,CAAM,aAAa,CAAA;AAAA,IACnD,UAAU,KAAA,CAAM,QAAA;AAAA,IAChB,OAAA,EAAS,MAAM,OAAA,IAAW,CAAA;AAAA,IAC1B,cAAc,KAAA,CAAM,YAAA;AAAA,IACpB,cAAc,KAAA,CAAM,YAAA;AAAA,IACpB,SAAA,EAAW,KAAA,CAAM,SAAA,IAAa,IAAA,CAAK,GAAA;AAAI,GACzC,CAAE,CAAA;AAEF,EAAA,MAAM,eAAA,GAAkB,kBAAA;AACxB,EAAA,MAAM,yBAAA,GAA4B,4BAAA;AAElC,EAAA,MAAM,mBAAA,GAAsB,sBAAA,EAAwB,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,IAClE,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,QAAQ,KAAA,CAAM,MAAA;AAAA,IACd,IAAA,EAAM,MAAM,IAAA,IAAQ,KAAA;AAAA,IACpB,SAAA,EAAW,KAAA,CAAM,SAAA,IAAa,IAAA,CAAK,GAAA;AAAI,GACzC,CAAE,CAAA;AAEF,EAAA,MAAM,aAAA,GAAgB,gBAAA;AAKtB,EAAA,OAAO,WAAA,CAA6B,CAAC,GAAA,EAAK,GAAA,MAAS;AAAA,IACjD,sBAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA,kBAAA;AAAA,IACA,iBAAA;AAAA,IACA,qBAAA;AAAA,IACA,oBAAA;AAAA,IACA,gBAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,eAAA;AAAA,IACA,yBAAA;AAAA,IACA,mBAAA;AAAA,IACA,aAAA;AAAA,IACA,yBAAA,EAA2B,CAAC,KAAA,KAAU;AACpC,MAAA,MAAM,aAAsC,EAAC;AAC7C,MAAA,KAAA,MAAW,CAAC,OAAA,EAAS,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AACrD,QAAA,UAAA,CAAW,gBAAA,CAAiB,OAAO,CAAC,CAAA,GAAI,MAAA;AAAA,MAC1C;AACA,MAAA,KAAK,MAAA,CAAO,OAAA;AAAA,QACV,gBAAA,CAAiB,yBAAA;AAAA,QACjB;AAAA,OACF;AACA,MAAA,GAAA,CAAI,EAAE,sBAAA,EAAwB,UAAA,EAAY,CAAA;AAAA,IAC5C,CAAA;AAAA,IACA,gBAAA,EAAkB,CAAC,KAAA,KAAU;AAC3B,MAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,eAAA,EAAiB,KAAK,CAAA;AAC3D,MAAA,GAAA,CAAI,EAAE,aAAA,EAAe,KAAA,EAAO,CAAA;AAAA,IAC9B,CAAA;AAAA,IACA,eAAA,EAAiB,CAAC,KAAA,KAAU;AAC1B,MAAA,MAAM,aAAa,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,KAAQ,gBAAA,CAAiB,GAAG,CAAC,CAAA;AAC3D,MAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,cAAA,EAAgB,UAAU,CAAA;AAC/D,MAAA,GAAA,CAAI,EAAE,YAAA,EAAc,UAAA,EAAY,CAAA;AAAA,IAClC,CAAA;AAAA,IACA,qBAAA,EAAuB,CAAC,KAAA,KAAU;AAChC,MAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,qBAAA,EAAuB,KAAK,CAAA;AACjE,MAAA,GAAA,CAAI,EAAE,kBAAA,EAAoB,KAAA,EAAO,CAAA;AAAA,IACnC,CAAA;AAAA,IACA,oBAAA,EAAsB,CAAC,KAAA,KAAU;AAC/B,MAAA,MAAM,aAAa,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,KAAQ,gBAAA,CAAiB,GAAG,CAAC,CAAA;AAC3D,MAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,kBAAA,EAAoB,UAAU,CAAA;AACnE,MAAA,GAAA,CAAI,EAAE,iBAAA,EAAmB,UAAA,EAAY,CAAA;AAAA,IACvC,CAAA;AAAA,IACA,wBAAA,EAA0B,CAAC,KAAA,KAAU;AACnC,MAAA,MAAM,aAAuC,EAAC;AAC9C,MAAA,KAAA,MAAW,CAAC,OAAA,EAAS,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AACpD,QAAA,UAAA,CAAW,gBAAA,CAAiB,OAAO,CAAC,CAAA,GAAI,KAAA,CAAM,GAAA;AAAA,UAAI,CAAC,IAAA,KACjD,IAAA,CAAK,QAAA,CAAS,GAAG,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI;AAAA,SAC3C;AAAA,MACF;AACA,MAAA,KAAK,MAAA,CAAO,OAAA;AAAA,QACV,gBAAA,CAAiB,wBAAA;AAAA,QACjB;AAAA,OACF;AACA,MAAA,GAAA,CAAI,EAAE,qBAAA,EAAuB,UAAA,EAAY,CAAA;AAAA,IAC3C,CAAA;AAAA,IACA,uBAAA,EAAyB,CAAC,KAAA,KAAU;AAClC,MAAA,MAAM,aAA2C,EAAC;AAClD,MAAA,KAAA,MAAW,CAAC,OAAA,EAAS,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AACnD,QAAA,UAAA,CAAW,gBAAA,CAAiB,OAAO,CAAC,CAAA,GAAI,IAAA;AAAA,MAC1C;AACA,MAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,uBAAA,EAAyB,UAAU,CAAA;AACxE,MAAA,GAAA,CAAI,EAAE,oBAAA,EAAsB,UAAA,EAAY,CAAA;AAAA,IAC1C,CAAA;AAAA,IACA,mBAAA,EAAqB,CAAC,KAAA,KAAU;AAC9B,MAAA,MAAM,aAAqC,EAAC;AAC5C,MAAA,KAAA,MAAW,CAAC,OAAA,EAAS,SAAS,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxD,QAAA,UAAA,CAAW,gBAAA,CAAiB,OAAO,CAAC,CAAA,GAAI,SAAA;AAAA,MAC1C;AACA,MAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,kBAAA,EAAoB,UAAU,CAAA;AACnE,MAAA,GAAA,CAAI,EAAE,gBAAA,EAAkB,UAAA,EAAY,CAAA;AAAA,IACtC,CAAA;AAAA,IACA,eAAA,EAAiB,CAAC,KAAA,KAAU;AAC1B,MAAA,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,QAAA,MAAM,UACJ,OAAO,KAAA,KAAU,aAAa,KAAA,CAAM,KAAA,CAAM,YAAY,CAAA,GAAI,KAAA;AAC5D,QAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,UACzC,GAAG,KAAA;AAAA,UACH,OAAA,EAAS,gBAAA,CAAiB,KAAA,CAAM,OAAO,CAAA;AAAA,UACvC,OAAA,EACE,OAAO,KAAA,CAAM,OAAA,KAAY,WACrB,KAAA,CAAM,OAAA,GACN,oBAAA,CAAqB,KAAA,CAAM,KAAK,CAAA;AAAA,UACtC,QAAA,EAAU,MAAM,QAAA,IAAY;AAAA,SAC9B,CAAE,CAAA;AACF,QAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,kBAAA,EAAoB,UAAU,CAAA;AACnE,QAAA,OAAO,EAAE,cAAc,UAAA,EAAW;AAAA,MACpC,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,UAAA,EAAY,CAAC,KAAA,KAAU;AACrB,MAAA,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,QAAA,MAAM,UACJ,OAAO,KAAA,KAAU,aAAa,KAAA,CAAM,KAAA,CAAM,OAAO,CAAA,GAAI,KAAA;AACvD,QAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,UACzC,GAAG,KAAA;AAAA,UACH,OAAA,EAAS,gBAAA,CAAiB,KAAA,CAAM,OAAO,CAAA;AAAA,UACvC,OAAA,EAAS,MAAM,OAAA,IAAW,CAAA;AAAA,UAC1B,QAAA,EAAU,MAAM,QAAA,IAAY;AAAA,SAC9B,CAAE,CAAA;AACF,QAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,QAAA,EAAU,UAAU,CAAA;AACzD,QAAA,OAAO,EAAE,SAAS,UAAA,EAAW;AAAA,MAC/B,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,YAAA,EAAc,CACZ,KAAA,KAYG;AACH,MAAA,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,QAAA,MAAM,UACJ,OAAO,KAAA,KAAU,aAAa,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA,GAAI,KAAA;AACzD,QAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,UACzC,aAAA,EAAe,gBAAA,CAAiB,KAAA,CAAM,aAAa,CAAA;AAAA,UACnD,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,OAAA,EAAS,MAAM,OAAA,IAAW,CAAA;AAAA,UAC1B,cAAc,KAAA,CAAM,YAAA;AAAA,UACpB,cAAc,KAAA,CAAM,YAAA;AAAA,UACpB,SAAA,EAAW,KAAA,CAAM,SAAA,IAAa,IAAA,CAAK,GAAA;AAAI,SACzC,CAAE,CAAA;AACF,QAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,UAAA,EAAY,UAAU,CAAA;AAC3D,QAAA,OAAO,EAAE,WAAW,UAAA,EAAW;AAAA,MACjC,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,kBAAA,EAAoB,CAAC,KAAA,KAAU;AAC7B,MAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,gBAAA,EAAkB,KAAK,CAAA;AAC5D,MAAA,GAAA,CAAI,EAAE,eAAA,EAAiB,KAAA,EAAO,CAAA;AAAA,IAChC,CAAA;AAAA,IACA,4BAAA,EAA8B,CAAC,KAAA,KAAU;AACvC,MAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,4BAAA,EAA8B,KAAK,CAAA;AACxE,MAAA,GAAA,CAAI,EAAE,yBAAA,EAA2B,KAAA,EAAO,CAAA;AAAA,IAC1C,CAAA;AAAA,IACA,sBAAA,EAAwB,CAAC,KAAA,KAAU;AACjC,MAAA,MAAM,UAAA,GAAa,KAAA,CAAM,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,QACvC,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,QAAQ,KAAA,CAAM,MAAA;AAAA,QACd,IAAA,EAAM,MAAM,IAAA,IAAQ,KAAA;AAAA,QACpB,SAAA,EAAW,KAAA,CAAM,SAAA,IAAa,IAAA,CAAK,GAAA;AAAI,OACzC,CAAE,CAAA;AACF,MAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,qBAAA,EAAuB,UAAU,CAAA;AACtE,MAAA,GAAA,CAAI,EAAE,mBAAA,EAAqB,UAAA,EAAY,CAAA;AAAA,IACzC,CAAA;AAAA,IACA,gBAAA,EAAkB,CAAC,KAAA,KAAU;AAC3B,MAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,cAAA,EAAgB,KAAK,CAAA;AAC1D,MAAA,GAAA,CAAI,EAAE,aAAA,EAAe,KAAA,EAAO,CAAA;AAAA,IAC9B;AAAA,GACF,CAAE,CAAA;AACJ;AAEO,IAAM,+BAAA,GAAkC,CAC7C,KAAA,MACsB;AAAA,EACtB,eAAA,EAAiB,MAAM,KAAA,CAAM,QAAA,EAAS,CAAE,sBAAA;AAAA,EACxC,iBAAiB,CAAC,MAAA,KAChB,MAAM,QAAA,EAAS,CAAE,0BAA0B,MAAM,CAAA;AAAA,EACnD,cAAA,EAAgB,MAAM,KAAA,CAAM,QAAA,EAAS,CAAE,qBAAA;AAAA,EACvC,gBAAgB,CAAC,KAAA,KAAU,MAAM,QAAA,EAAS,CAAE,yBAAyB,KAAK,CAAA;AAAA,EAC1E,qBAAA,EAAuB,MAAM,KAAA,CAAM,QAAA,EAAS,CAAE,oBAAA;AAAA,EAC9C,uBAAuB,CAAC,IAAA,KACtB,MAAM,QAAA,EAAS,CAAE,wBAAwB,IAAI,CAAA;AAAA,EAC/C,qBAAA,EAAuB,CAAC,OAAA,KAAY;AAClC,IAAA,MAAM,UAAA,GAAa,iBAAiB,OAAO,CAAA;AAC3C,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,QAAA,EAAS,CAAE,gBAAA;AACpC,IAAA,OAAO,UAAA,CAAW,UAAU,CAAA,IAAK,IAAA;AAAA,EACnC,CAAA;AAAA,EACA,qBAAA,EAAuB,CAAC,OAAA,EAAS,SAAA,KAAc;AAC7C,IAAA,MAAM,UAAA,GAAa,iBAAiB,OAAO,CAAA;AAC3C,IAAA,MAAM,aAAa,EAAE,GAAG,KAAA,CAAM,QAAA,GAAW,gBAAA,EAAiB;AAC1D,IAAA,UAAA,CAAW,UAAU,CAAA,GAAI,SAAA;AACzB,IAAA,KAAA,CAAM,QAAA,EAAS,CAAE,mBAAA,CAAoB,UAAU,CAAA;AAAA,EACjD,CAAA;AAAA,EACA,gBAAA,EAAkB,MAAM,KAAA,CAAM,QAAA,EAAS,CAAE,aAAA;AAAA,EACzC,kBAAkB,CAAC,OAAA,KAAY,MAAM,QAAA,EAAS,CAAE,iBAAiB,OAAO,CAAA;AAAA,EACxE,oBAAA,EAAsB,MAAM,KAAA,CAAM,QAAA,EAAS,CAAE,iBAAA;AAAA,EAC7C,eAAA,EAAiB,MAAM,KAAA,CAAM,QAAA,EAAS,CAAE,YAAA;AAAA,EACxC,iBAAiB,CAAC,IAAA,KAAS,MAAM,QAAA,EAAS,CAAE,gBAAgB,IAAI,CAAA;AAAA,EAChE,qBAAA,EAAuB,MAAM,KAAA,CAAM,QAAA,EAAS,CAAE,kBAAA;AAAA,EAC9C,uBAAuB,CAAC,SAAA,KACtB,MAAM,QAAA,EAAS,CAAE,sBAAsB,SAAS,CAAA;AAAA,EAClD,kBAAA,EAAoB,MAAM,KAAA,CAAM,QAAA,EAAS,CAAE,eAAA;AAAA,EAC3C,oBAAoB,CAAC,MAAA,KAAW,MAAM,QAAA,EAAS,CAAE,mBAAmB,MAAM,CAAA;AAAA,EAC1E,4BAAA,EAA8B,MAC5B,KAAA,CAAM,QAAA,EAAS,CAAE,yBAAA;AAAA,EACnB,8BAA8B,CAAC,SAAA,KAC7B,MAAM,QAAA,EAAS,CAAE,6BAA6B,SAAS;AAC3D,CAAA;AAEO,IAAM,6BAAA,GAAgC,CAC3C,KAAA,MACoB;AAAA,EACpB,QAAA,EAAU,CAAC,OAAA,KAAY;AACrB,IAAA,MAAM,UAAA,GAAa,iBAAiB,OAAO,CAAA;AAC3C,IAAA,MAAM,KAAA,GAAQ,KAAA,CACX,QAAA,EAAS,CACT,YAAA,CAAa,KAAK,CAAC,KAAA,KAAU,KAAA,CAAM,OAAA,KAAY,UAAU,CAAA;AAC5D,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,IAAA,MAAM,IAAA,GAAO,KAAA,CACV,QAAA,EAAS,CACT,YAAA,CAAa,GAAA;AAAA,MAAI,CAAC,KAAA,KACjB,KAAA,CAAM,OAAA,KAAY,UAAA,GACd,EAAE,GAAG,KAAA,EAAO,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,EAAE,GACjC;AAAA,KACN;AACF,IAAA,KAAA,CAAM,QAAA,EAAS,CAAE,eAAA,CAAgB,IAAI,CAAA;AACrC,IAAA,OAAO,KAAA,CAAM,KAAA;AAAA,EACf,CAAA;AAAA,EACA,QAAA,EAAU,CAAC,OAAA,EAAS,KAAA,KAAU;AAC5B,IAAA,MAAM,UAAA,GAAa,iBAAiB,OAAO,CAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,QAAA,EAAS,CAAE,YAAA;AAChC,IAAA,MAAM,OAAA,GAAU,qBAAqB,KAAK,CAAA;AAC1C,IAAA,MAAM,gBAAgB,MAAA,CAAO,SAAA;AAAA,MAC3B,CAAC,KAAA,KAAU,KAAA,CAAM,OAAA,KAAY;AAAA,KAC/B;AACA,IAAA,IAAI,kBAAkB,EAAA,EAAI;AACxB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqC,UAAU,CAAA,CAAE,CAAA;AAAA,IACnE;AACA,IAAA,MAAM,IAAA,GAAO,CAAC,GAAG,MAAM,CAAA;AACvB,IAAA,IAAA,CAAK,IAAA,CAAK;AAAA,MACR,OAAA,EAAS,UAAA;AAAA,MACT,KAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA,EAAU,KAAK,GAAA;AAAI,KACpB,CAAA;AACD,IAAA,KAAA,CAAM,QAAA,EAAS,CAAE,eAAA,CAAgB,IAAI,CAAA;AAAA,EACvC,CAAA;AAAA,EACA,WAAA,EAAa,CAAC,OAAA,KAAY;AACxB,IAAA,MAAM,UAAA,GAAa,iBAAiB,OAAO,CAAA;AAC3C,IAAA,MAAM,IAAA,GAAO,KAAA,CACV,QAAA,EAAS,CACT,YAAA,CAAa,OAAO,CAAC,KAAA,KAAU,KAAA,CAAM,OAAA,KAAY,UAAU,CAAA;AAC9D,IAAA,KAAA,CAAM,QAAA,EAAS,CAAE,eAAA,CAAgB,IAAI,CAAA;AAAA,EACvC,CAAA;AAAA,EACA,kBAAA,EAAoB,CAAC,OAAA,EAAS,OAAA,KAAY;AACxC,IAAA,MAAM,UAAA,GAAa,iBAAiB,OAAO,CAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,QAAA,EAAS,CAAE,YAAA;AAChC,IAAA,MAAM,OAAO,MAAA,CAAO,GAAA;AAAA,MAAI,CAAC,UACvB,KAAA,CAAM,OAAA,KAAY,aAAa,EAAE,GAAG,KAAA,EAAO,OAAA,EAAQ,GAAI;AAAA,KACzD;AACA,IAAA,KAAA,CAAM,QAAA,EAAS,CAAE,eAAA,CAAgB,IAAI,CAAA;AAAA,EACvC,CAAA;AAAA,EACA,4BAA4B,MAAM;AAChC,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,QAAA,EAAS,CAAE,YAAA;AACtC,IAAA,MAAM,kBAA0C,EAAC;AAEjD,IAAA,KAAA,MAAW,SAAS,YAAA,EAAc;AAChC,MAAA,MAAM,GAAA,GAAM,MAAM,OAAA,IAAW,CAAA;AAC7B,MAAA,IAAI,MAAM,CAAA,EAAG;AACX,QAAA,eAAA,CAAgB,MAAM,OAAO,CAAA,GAAA,CAC1B,gBAAgB,KAAA,CAAM,OAAO,KAAK,CAAA,IAAK,GAAA;AAAA,MAC5C;AAAA,IACF;AAEA,IAAA,OAAO,MAAA,CAAO,QAAQ,eAAe,CAAA,CAClC,IAAI,CAAC,CAAC,OAAA,EAAS,GAAG,CAAA,MAAO,EAAE,SAAS,MAAA,EAAQ,GAAA,EAAI,CAAE,CAAA,CAClD,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,MAAM,CAAA;AAAA,EACvC,CAAA;AAAA,EACA,uBAAuB,MAAM;AAC3B,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,QAAA,EAAS,CAAE,OAAA;AACjC,IAAA,MAAM,kBAA0C,EAAC;AAEjD,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,GAAA,GAAM,MAAM,OAAA,IAAW,CAAA;AAC7B,MAAA,IAAI,MAAM,CAAA,EAAG;AACX,QAAA,eAAA,CAAgB,MAAM,OAAO,CAAA,GAAA,CAC1B,gBAAgB,KAAA,CAAM,OAAO,KAAK,CAAA,IAAK,GAAA;AAAA,MAC5C;AAAA,IACF;AAEA,IAAA,OAAO,MAAA,CAAO,QAAQ,eAAe,CAAA,CAClC,IAAI,CAAC,CAAC,OAAA,EAAS,GAAG,CAAA,MAAO,EAAE,SAAS,MAAA,EAAQ,GAAA,EAAI,CAAE,CAAA,CAClD,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,MAAM,CAAA;AAAA,EACvC,CAAA;AAAA,EACA,gBAAA,EAAkB,CAAC,OAAA,EAAS,IAAA,KAAS;AACnC,IAAA,MAAM,UAAA,GAAa,iBAAiB,OAAO,CAAA;AAC3C,IAAA,MAAM,OAAO,EAAE,GAAG,KAAA,CAAM,QAAA,GAAW,oBAAA,EAAqB;AACxD,IAAA,IAAA,CAAK,UAAU,CAAA,GAAI,IAAA;AACnB,IAAA,KAAA,CAAM,QAAA,EAAS,CAAE,uBAAA,CAAwB,IAAI,CAAA;AAAA,EAC/C,CAAA;AAAA,EACA,eAAA,EAAiB,CAAC,OAAA,KAAY;AAC5B,IAAA,MAAM,UAAA,GAAa,iBAAiB,OAAO,CAAA;AAC3C,IAAA,OAAO,KAAA,CAAM,QAAA,EAAS,CAAE,oBAAA,CAAqB,UAAU,CAAA,IAAK,IAAA;AAAA,EAC9D,CAAA;AAAA;AAAA,EAIA,SAAA,EAAW,CAAC,OAAA,KAAY;AACtB,IAAA,MAAM,UAAA,GAAa,iBAAiB,OAAO,CAAA;AAC3C,IAAA,MAAM,KAAA,GAAQ,KAAA,CACX,QAAA,EAAS,CACT,OAAA,CAAQ,KAAK,CAAC,GAAA,KAAQ,GAAA,CAAI,OAAA,KAAY,UAAU,CAAA;AACnD,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,IAAA,MAAM,IAAA,GAAO,KAAA,CACV,QAAA,EAAS,CACT,OAAA,CAAQ,GAAA;AAAA,MAAI,CAAC,GAAA,KACZ,GAAA,CAAI,OAAA,KAAY,UAAA,GAAa,EAAE,GAAG,GAAA,EAAK,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,EAAE,GAAI;AAAA,KAClE;AACF,IAAA,KAAA,CAAM,QAAA,EAAS,CAAE,UAAA,CAAW,IAAI,CAAA;AAChC,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAAA,EAEA,SAAA,EAAW,CAAC,OAAA,EAAS,GAAA,KAAQ;AAC3B,IAAA,MAAM,UAAA,GAAa,iBAAiB,OAAO,CAAA;AAC3C,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,QAAA,EAAS,CAAE,OAAA;AAC9B,IAAA,MAAM,gBAAgB,IAAA,CAAK,SAAA;AAAA,MACzB,CAAC,KAAA,KAAU,KAAA,CAAM,OAAA,KAAY;AAAA,KAC/B;AACA,IAAA,IAAI,kBAAkB,EAAA,EAAI;AACxB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mCAAA,EAAsC,UAAU,CAAA,CAAE,CAAA;AAAA,IACpE;AACA,IAAA,MAAM,IAAA,GAAO,CAAC,GAAG,IAAI,CAAA;AACrB,IAAA,IAAA,CAAK,IAAA,CAAK;AAAA,MACR,OAAA,EAAS,UAAA;AAAA,MACT,GAAA;AAAA,MACA,OAAA,EAAS,CAAA;AAAA,MACT,QAAA,EAAU,KAAK,GAAA;AAAI,KACpB,CAAA;AACD,IAAA,KAAA,CAAM,QAAA,EAAS,CAAE,UAAA,CAAW,IAAI,CAAA;AAAA,EAClC,CAAA;AAAA,EAEA,mBAAA,EAAqB,CAAC,OAAA,EAAS,OAAA,KAAY;AACzC,IAAA,MAAM,UAAA,GAAa,iBAAiB,OAAO,CAAA;AAC3C,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,QAAA,EAAS,CAAE,OAAA;AAC9B,IAAA,MAAM,OAAO,IAAA,CAAK,GAAA;AAAA,MAAI,CAAC,UACrB,KAAA,CAAM,OAAA,KAAY,aAAa,EAAE,GAAG,KAAA,EAAO,OAAA,EAAQ,GAAI;AAAA,KACzD;AACA,IAAA,KAAA,CAAM,QAAA,EAAS,CAAE,UAAA,CAAW,IAAI,CAAA;AAAA,EAClC,CAAA;AAAA,EAEA,YAAA,EAAc,CAAC,OAAA,KAAY;AACzB,IAAA,MAAM,UAAA,GAAa,iBAAiB,OAAO,CAAA;AAC3C,IAAA,MAAM,IAAA,GAAO,KAAA,CACV,QAAA,EAAS,CACT,OAAA,CAAQ,OAAO,CAAC,KAAA,KAAU,KAAA,CAAM,OAAA,KAAY,UAAU,CAAA;AACzD,IAAA,KAAA,CAAM,QAAA,EAAS,CAAE,UAAA,CAAW,IAAI,CAAA;AAAA,EAClC,CAAA;AAAA,EAEA,eAAe,MAAM;AACnB,IAAA,OAAO,MAAM,QAAA,EAAS,CAAE,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MAC9C,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,KAAK,KAAA,CAAM,GAAA;AAAA,MACX,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAU,KAAA,CAAM;AAAA,KAClB,CAAE,CAAA;AAAA,EACJ,CAAA;AAAA;AAAA,EAIA,WAAA,EAAa,CAAC,aAAA,KAAkB;AAC9B,IAAA,MAAM,UAAA,GAAa,iBAAiB,aAAa,CAAA;AACjD,IAAA,MAAM,KAAA,GAAQ,KAAA,CACX,QAAA,EAAS,CACT,SAAA,CAAU,KAAK,CAAC,GAAA,KAAQ,GAAA,CAAI,aAAA,KAAkB,UAAU,CAAA;AAC3D,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,IAAA,OAAO;AAAA,MACL,eAAe,KAAA,CAAM,aAAA;AAAA,MACrB,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,cAAc,KAAA,CAAM,YAAA;AAAA,MACpB,cAAc,KAAA,CAAM,YAAA;AAAA,MACpB,WAAW,KAAA,CAAM;AAAA,KACnB;AAAA,EACF,CAAA;AAAA,EAEA,aAAa,CACX,aAAA,EACA,QAAA,EACA,OAAA,EACA,cACA,YAAA,KACG;AACH,IAAA,MAAM,UAAA,GAAa,iBAAiB,aAAa,CAAA;AACjD,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,QAAA,EAAS,CAAE,SAAA;AAC9B,IAAA,MAAM,gBAAgB,IAAA,CAAK,SAAA;AAAA,MACzB,CAAC,KAAA,KAAU,KAAA,CAAM,aAAA,KAAkB;AAAA,KACrC;AACA,IAAA,IAAI,kBAAkB,EAAA,EAAI;AAExB,MAAA,MAAM,OAAO,IAAA,CAAK,GAAA;AAAA,QAAI,CAAC,KAAA,KACrB,KAAA,CAAM,aAAA,KAAkB,UAAA,GACpB;AAAA,UACE,GAAG,KAAA;AAAA,UACH,QAAA;AAAA,UACA,SAAS,OAAA,IAAW,CAAA;AAAA,UACpB,YAAA;AAAA,UACA,YAAA;AAAA,UACA,SAAA,EAAW,KAAK,GAAA;AAAI,SACtB,GACA;AAAA,OACN;AACA,MAAA,KAAA,CAAM,QAAA,EAAS,CAAE,YAAA,CAAa,IAAI,CAAA;AAAA,IACpC,CAAA,MAAO;AAEL,MAAA,MAAM,IAAA,GAAO,CAAC,GAAG,IAAI,CAAA;AACrB,MAAA,IAAA,CAAK,IAAA,CAAK;AAAA,QACR,aAAA,EAAe,UAAA;AAAA,QACf,QAAA;AAAA,QACA,SAAS,OAAA,IAAW,CAAA;AAAA,QACpB,YAAA;AAAA,QACA,YAAA;AAAA,QACA,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AACD,MAAA,KAAA,CAAM,QAAA,EAAS,CAAE,YAAA,CAAa,IAAI,CAAA;AAAA,IACpC;AAAA,EACF,CAAA;AAAA,EAEA,qBAAA,EAAuB,CAAC,aAAA,EAAe,OAAA,KAAY;AACjD,IAAA,MAAM,UAAA,GAAa,iBAAiB,aAAa,CAAA;AACjD,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,QAAA,EAAS,CAAE,SAAA;AAC9B,IAAA,MAAM,OAAO,IAAA,CAAK,GAAA;AAAA,MAAI,CAAC,UACrB,KAAA,CAAM,aAAA,KAAkB,aAAa,EAAE,GAAG,KAAA,EAAO,OAAA,EAAQ,GAAI;AAAA,KAC/D;AACA,IAAA,KAAA,CAAM,QAAA,EAAS,CAAE,YAAA,CAAa,IAAI,CAAA;AAAA,EACpC,CAAA;AAAA,EAEA,cAAA,EAAgB,CAAC,aAAA,KAAkB;AACjC,IAAA,MAAM,UAAA,GAAa,iBAAiB,aAAa,CAAA;AACjD,IAAA,MAAM,IAAA,GAAO,KAAA,CACV,QAAA,EAAS,CACT,SAAA,CAAU,OAAO,CAAC,KAAA,KAAU,KAAA,CAAM,aAAA,KAAkB,UAAU,CAAA;AACjE,IAAA,KAAA,CAAM,QAAA,EAAS,CAAE,YAAA,CAAa,IAAI,CAAA;AAAA,EACpC,CAAA;AAAA,EAEA,iBAAiB,MAAM;AACrB,IAAA,OAAO,MAAM,QAAA,EAAS,CAAE,SAAA,CAAU,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MAChD,eAAe,KAAA,CAAM,aAAA;AAAA,MACrB,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,cAAc,KAAA,CAAM,YAAA;AAAA,MACpB,cAAc,KAAA,CAAM,YAAA;AAAA,MACpB,WAAW,KAAA,CAAM;AAAA,KACnB,CAAE,CAAA;AAAA,EACJ,CAAA;AAAA,EAEA,wBAAwB,MAAM;AAC5B,IAAA,OAAO,KAAA,CAAM,UAAS,CAAE,mBAAA;AAAA,EAC1B,CAAA;AAAA,EAEA,sBAAA,EAAwB,CAAC,MAAA,KAAW;AAClC,IAAA,KAAA,CAAM,QAAA,EAAS,CAAE,sBAAA,CAAuB,MAAM,CAAA;AAAA,EAChD;AACF,CAAA;AAEO,IAAM,+BAAA,GAAkC,CAC7C,KAAA,MACsB;AAAA,EACtB,oBAAA,EAAsB,CAAC,OAAA,KAAY;AACjC,IAAA,MAAM,UAAA,GAAa,iBAAiB,OAAO,CAAA;AAC3C,IAAA,OAAO,MAAM,QAAA,EAAS,CAAE,sBAAA,CAAuB,UAAU,KAAK,EAAC;AAAA,EACjE,CAAA;AAAA,EACA,oBAAA,EAAsB,MAAM,KAAA,CAAM,QAAA,EAAS,CAAE,iBAAA;AAAA,EAC7C,gBAAA,EAAkB,CAAC,OAAA,KAAY;AAC7B,IAAA,MAAM,UAAA,GAAa,iBAAiB,OAAO,CAAA;AAC3C,IAAA,OAAO,MAAM,QAAA,EAAS,CAAE,qBAAA,CAAsB,UAAU,KAAK,EAAC;AAAA,EAChE,CAAA;AAAA,EACA,eAAA,EAAiB,OAAO,OAAA,KAAY;AAClC,IAAA,MAAM,UAAA,GAAa,iBAAiB,OAAO,CAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,QAAA,EAAS,CAAE,qBAAqB,UAAU,CAAA;AAC/D,IAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,UAAU,CAAA,OAAA,CAAS,CAAA;AACnD,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,MAC7C;AACA,MAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,MAAA,MAAM,OAAO,EAAE,GAAG,KAAA,CAAM,QAAA,GAAW,oBAAA,EAAqB;AACxD,MAAA,IAAA,CAAK,UAAU,CAAA,GAAI,IAAA;AACnB,MAAA,KAAA,CAAM,QAAA,EAAS,CAAE,uBAAA,CAAwB,IAAI,CAAA;AAC7C,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,mCAAA,EAAsC,UAAU,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACvE,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA;AAAA,EACA,qBAAA,EAAuB,MAAM,KAAA,CAAM,QAAA,EAAS,CAAE;AAChD,CAAA;;;AC3tBA,IAAM,YAAY,MAAe;AAC/B,EAAA,IAAI;AACF,IAAA,OACE,OAAO,MAAA,KAAW,WAAA,IAClB,OAAO,OAAO,YAAA,KAAiB,WAAA;AAAA,EAEnC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF,CAAA;AAEA,IAAM,SAAS,MAAe;AAC5B,EAAA,IAAI;AACF,IAAA,OACE,OAAO,YAAY,WAAA,IACnB,OAAA,CAAQ,YAAY,IAAA,IACpB,OAAA,CAAQ,SAAS,IAAA,IAAQ,IAAA;AAAA,EAE7B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF,CAAA;AAEA,IAAI,aAAA,GAAsC,IAAA;AAE1C,IAAMA,SAAQ,MAAe;AAC3B,EAAA,OAAO,OAAO,OAAA,CAAQ,QAAA,CAAS,GAAA,KAAQ,WAAA;AACzC,CAAA;AAEO,IAAM,sBAAsB,MAAqB;AACtD,EAAA,IAAI,eAAe,OAAO,aAAA;AAC1B,EAAA,IAAI,WAAU,EAAG;AACf,IAAA,aAAA,GAAgB,kBAAA;AAChB,IAAA,OAAO,aAAA;AAAA,EACT;AACA,EAAA,IAAIA,QAAM,EAAG;AACX,IAAA,aAAA,GAAgB,kBAAA,EAAmB;AACnC,IAAA,OAAO,aAAA;AAAA,EACT;AACA,EAAA,IAAI,QAAO,EAAG;AACZ,IAAA,aAAA,GAAgB,kBAAA,EAAmB;AACnC,IAAA,OAAO,aAAA;AAAA,EACT;AACA,EAAA,aAAA,GAAgB,kBAAA,EAAmB;AACnC,EAAA,OAAO,aAAA;AACT;AAEA,IAAI,mBAAA,GAAgD,IAAA;AAE7C,IAAM,qBAAqB,MAAyB;AACzD,EAAA,IAAI,CAAC,mBAAA,EAAqB;AACxB,IAAA,mBAAA,GAAsB,cAAA,CAAe,EAAE,MAAA,EAAQ,mBAAA,IAAuB,CAAA;AAAA,EACxE;AACA,EAAA,OAAO,mBAAA;AACT;AAEO,IAAM,0BAAA,GAA6B,YACxC,+BAAA,CAAgC,MAAM,oBAAoB;AAErD,IAAM,wBAAA,GAA2B,YACtC,6BAAA,CAA8B,MAAM,oBAAoB;AAEnD,IAAM,0BAAA,GAA6B,YACxC,+BAAA,CAAgC,MAAM,oBAAoB","file":"index.mjs","sourcesContent":["import type { StorageDriver } from \"../types\";\n\nconst canUseLocalStorage = (): boolean => {\n return (\n typeof window !== \"undefined\" && typeof window.localStorage !== \"undefined\"\n );\n};\n\nconst isQuotaExceeded = (error: unknown): boolean => {\n const e = error as { name?: string; code?: number } | null;\n return (\n !!e &&\n (e?.name === \"QuotaExceededError\" || e?.code === 22 || e?.code === 1014)\n );\n};\n\nconst NON_CRITICAL_KEYS = new Set<string>([\"modelsFromAllProviders\"]);\n\nexport const localStorageDriver: StorageDriver = {\n async getItem<T>(key: string, defaultValue: T): Promise<T> {\n if (!canUseLocalStorage()) return defaultValue;\n try {\n const item = window.localStorage.getItem(key);\n if (item === null) return defaultValue;\n try {\n return JSON.parse(item) as T;\n } catch (parseError) {\n if (typeof defaultValue === \"string\") {\n return item as T;\n }\n throw parseError;\n }\n } catch (error) {\n console.error(`Error retrieving item with key \"${key}\":`, error);\n if (canUseLocalStorage()) {\n try {\n window.localStorage.removeItem(key);\n } catch (removeError) {\n console.error(\n `Error removing corrupted item with key \"${key}\":`,\n removeError\n );\n }\n }\n return defaultValue;\n }\n },\n async setItem<T>(key: string, value: T): Promise<void> {\n if (!canUseLocalStorage()) return;\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch (error) {\n if (isQuotaExceeded(error)) {\n if (NON_CRITICAL_KEYS.has(key)) {\n console.warn(\n `Storage quota exceeded; skipping non-critical key \"${key}\".`\n );\n return;\n }\n try {\n window.localStorage.removeItem(\"modelsFromAllProviders\");\n } catch {}\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n return;\n } catch (retryError) {\n console.warn(\n `Storage quota exceeded; unable to persist key \"${key}\" after cleanup attempt.`,\n retryError\n );\n return;\n }\n }\n console.error(`Error storing item with key \"${key}\":`, error);\n }\n },\n async removeItem(key: string): Promise<void> {\n if (!canUseLocalStorage()) return;\n try {\n window.localStorage.removeItem(key);\n } catch (error) {\n console.error(`Error removing item with key \"${key}\":`, error);\n }\n },\n};\n","import type { StorageDriver } from \"../types\";\n\nexport const createMemoryDriver = (\n seed?: Record<string, string>\n): StorageDriver => {\n const store = new Map<string, string>();\n\n if (seed) {\n for (const [key, value] of Object.entries(seed)) {\n store.set(key, value);\n }\n }\n\n return {\n async getItem<T>(key: string, defaultValue: T): Promise<T> {\n const item = store.get(key);\n if (item === undefined) return defaultValue;\n try {\n return JSON.parse(item) as T;\n } catch (parseError) {\n if (typeof defaultValue === \"string\") {\n return item as T;\n }\n throw parseError;\n }\n },\n async setItem<T>(key: string, value: T): Promise<void> {\n store.set(key, JSON.stringify(value));\n },\n async removeItem(key: string): Promise<void> {\n store.delete(key);\n },\n };\n};\n","import type { StorageDriver } from \"../types\";\n\ntype BetterSqlite3Database = {\n prepare: (sql: string) => {\n run: (...params: any[]) => { changes: number };\n get: (...params: any[]) => any;\n };\n exec: (sql: string) => void;\n close?: () => void;\n};\n\nexport interface SqliteDriverOptions {\n dbPath?: string;\n tableName?: string;\n}\n\nconst isBun = (): boolean => {\n return typeof process.versions.bun !== \"undefined\";\n};\n\nconst createDatabase = (dbPath: string): BetterSqlite3Database => {\n if (isBun()) {\n throw new Error(\n \"SQLite driver not supported in Bun. Use createMemoryDriver() instead.\"\n );\n }\n\n let Database: any = null;\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n Database = require(\"better-sqlite3\");\n } catch (error) {\n throw new Error(\n `better-sqlite3 is required for sqlite storage. Install it to use sqlite storage. (${error})`\n );\n }\n return new Database(dbPath);\n};\n\nexport const createSqliteDriver = (\n options: SqliteDriverOptions = {}\n): StorageDriver => {\n const dbPath = options.dbPath || \"routstr.sqlite\";\n const tableName = options.tableName || \"sdk_storage\";\n\n const db = createDatabase(dbPath);\n db.exec(\n `CREATE TABLE IF NOT EXISTS ${tableName} (key TEXT PRIMARY KEY, value TEXT NOT NULL)`\n );\n\n const selectStmt = db.prepare(`SELECT value FROM ${tableName} WHERE key = ?`);\n const upsertStmt = db.prepare(\n `INSERT INTO ${tableName} (key, value) VALUES (?, ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value`\n );\n const deleteStmt = db.prepare(`DELETE FROM ${tableName} WHERE key = ?`);\n\n return {\n async getItem<T>(key: string, defaultValue: T): Promise<T> {\n try {\n const row = selectStmt.get(key);\n if (!row || typeof row.value !== \"string\") return defaultValue;\n try {\n return JSON.parse(row.value) as T;\n } catch (parseError) {\n if (typeof defaultValue === \"string\") {\n return row.value as T;\n }\n throw parseError;\n }\n } catch (error) {\n console.error(`SQLite getItem failed for key \"${key}\":`, error);\n return defaultValue;\n }\n },\n async setItem<T>(key: string, value: T): Promise<void> {\n try {\n upsertStmt.run(key, JSON.stringify(value));\n } catch (error) {\n console.error(`SQLite setItem failed for key \"${key}\":`, error);\n }\n },\n async removeItem(key: string): Promise<void> {\n try {\n deleteStmt.run(key);\n } catch (error) {\n console.error(`SQLite removeItem failed for key \"${key}\":`, error);\n }\n },\n };\n};\n","import type { StorageDriver } from \"../types\";\n\nexport interface IndexedDBDriverOptions {\n dbName?: string;\n storeName?: string;\n}\n\nconst openDatabase = (\n dbName: string,\n storeName: string\n): Promise<IDBDatabase> => {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(dbName, 1);\n\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains(storeName)) {\n db.createObjectStore(storeName);\n }\n };\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n};\n\nexport const createIndexedDBDriver = (\n options: IndexedDBDriverOptions = {}\n): StorageDriver => {\n const dbName = options.dbName || \"routstr-sdk\";\n const storeName = options.storeName || \"sdk_storage\";\n\n let dbPromise: Promise<IDBDatabase> | null = null;\n\n const getDb = (): Promise<IDBDatabase> => {\n if (!dbPromise) {\n dbPromise = openDatabase(dbName, storeName);\n }\n return dbPromise;\n };\n\n return {\n async getItem<T>(key: string, defaultValue: T): Promise<T> {\n try {\n const db = await getDb();\n return new Promise<T>((resolve, reject) => {\n const tx = db.transaction(storeName, \"readonly\");\n const store = tx.objectStore(storeName);\n const request = store.get(key);\n\n request.onsuccess = () => {\n const raw = request.result;\n if (raw === undefined) {\n resolve(defaultValue);\n return;\n }\n // Values are stored as raw JSON strings\n if (typeof raw === \"string\") {\n try {\n resolve(JSON.parse(raw) as T);\n } catch {\n if (typeof defaultValue === \"string\") {\n resolve(raw as T);\n } else {\n resolve(defaultValue);\n }\n }\n } else {\n // If stored as a native JS value (e.g. from a previous driver)\n resolve(raw as T);\n }\n };\n request.onerror = () => reject(request.error);\n });\n } catch (error) {\n console.error(`IndexedDB getItem failed for key \"${key}\":`, error);\n return defaultValue;\n }\n },\n\n async setItem<T>(key: string, value: T): Promise<void> {\n try {\n const db = await getDb();\n return new Promise<void>((resolve, reject) => {\n const tx = db.transaction(storeName, \"readwrite\");\n const store = tx.objectStore(storeName);\n store.put(JSON.stringify(value), key);\n\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n } catch (error) {\n console.error(`IndexedDB setItem failed for key \"${key}\":`, error);\n }\n },\n\n async removeItem(key: string): Promise<void> {\n try {\n const db = await getDb();\n return new Promise<void>((resolve, reject) => {\n const tx = db.transaction(storeName, \"readwrite\");\n const store = tx.objectStore(storeName);\n store.delete(key);\n\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n } catch (error) {\n console.error(`IndexedDB removeItem failed for key \"${key}\":`, error);\n }\n },\n };\n};\n","export const SDK_STORAGE_KEYS = {\n MODELS_FROM_ALL_PROVIDERS: \"modelsFromAllProviders\",\n LAST_USED_MODEL: \"lastUsedModel\",\n BASE_URLS_LIST: \"base_urls_list\",\n DISABLED_PROVIDERS: \"disabled_providers\",\n MINTS_FROM_ALL_PROVIDERS: \"mints_from_all_providers\",\n INFO_FROM_ALL_PROVIDERS: \"info_from_all_providers\",\n LAST_MODELS_UPDATE: \"lastModelsUpdate\",\n LAST_BASE_URLS_UPDATE: \"lastBaseUrlsUpdate\",\n LOCAL_CASHU_TOKENS: \"local_cashu_tokens\",\n API_KEYS: \"api_keys\",\n CHILD_KEYS: \"child_keys\",\n ROUTSTR21_MODELS: \"routstr21Models\",\n LAST_ROUTSTR21_MODELS_UPDATE: \"lastRoutstr21ModelsUpdate\",\n CACHED_RECEIVE_TOKENS: \"cached_receive_tokens\",\n USAGE_TRACKING: \"usage_tracking\",\n} as const;\n\nexport type SdkStorageKey =\n (typeof SDK_STORAGE_KEYS)[keyof typeof SDK_STORAGE_KEYS];\n","import { createStore, type StoreApi } from \"zustand/vanilla\";\nimport type { DiscoveryAdapter } from \"../discovery/interfaces\";\nimport type { StorageAdapter, ProviderRegistry } from \"../wallet/interfaces\";\nimport type { ProviderInfo, Model } from \"../core\";\nimport { getDecodedToken } from \"@cashu/cashu-ts\";\nimport { SDK_STORAGE_KEYS } from \"./keys\";\nimport type { StorageDriver, SdkStorageState } from \"./types\";\n\nconst normalizeBaseUrl = (baseUrl: string): string =>\n baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n\nconst getCashuTokenBalance = (token: string): number => {\n try {\n const decoded = getDecodedToken(token);\n const unitDivisor = decoded.unit === \"msat\" ? 1000 : 1;\n let sum = 0;\n for (const proof of decoded.proofs) {\n sum += proof.amount / unitDivisor;\n }\n return sum;\n } catch {\n return 0;\n }\n};\n\nexport interface SdkStoreOptions {\n driver: StorageDriver;\n}\n\nexport interface SdkStorageStore extends SdkStorageState {\n setModelsFromAllProviders: (value: Record<string, Model[]>) => void;\n setLastUsedModel: (value: string | null) => void;\n setBaseUrlsList: (value: string[]) => void;\n setBaseUrlsLastUpdate: (value: number | null) => void;\n setDisabledProviders: (value: string[]) => void;\n setMintsFromAllProviders: (value: Record<string, string[]>) => void;\n setInfoFromAllProviders: (value: Record<string, ProviderInfo>) => void;\n setLastModelsUpdate: (value: Record<string, number>) => void;\n setCachedTokens: (\n value:\n | Array<{\n baseUrl: string;\n token: string;\n balance?: number;\n lastUsed?: number | null;\n }>\n | ((\n current: SdkStorageStore[\"cachedTokens\"]\n ) => SdkStorageStore[\"cachedTokens\"])\n ) => void;\n setApiKeys: (\n value:\n | Array<{\n baseUrl: string;\n key: string;\n balance?: number;\n lastUsed?: number | null;\n }>\n | ((current: SdkStorageStore[\"apiKeys\"]) => SdkStorageStore[\"apiKeys\"])\n ) => void;\n setChildKeys: (\n value: Array<{\n parentBaseUrl: string;\n childKey: string;\n balance?: number;\n balanceLimit?: number;\n validityDate?: number;\n createdAt?: number;\n }>\n ) => void;\n setRoutstr21Models: (value: string[]) => void;\n setRoutstr21ModelsLastUpdate: (value: number | null) => void;\n setCachedReceiveTokens: (\n value: Array<{\n token: string;\n amount: number;\n unit: \"sat\" | \"msat\";\n createdAt?: number;\n }>\n ) => void;\n setUsageTracking: (\n value: Array<{\n id: string;\n timestamp: number;\n modelId: string;\n baseUrl: string;\n requestId: string;\n cost: number;\n satsCost: number;\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n client?: string;\n sessionId?: string;\n tags?: string[];\n }>\n ) => void;\n}\n\n/** Store type returned after async initialization */\nexport type SdkStore = StoreApi<SdkStorageStore>;\n\nexport const createSdkStore = async ({\n driver,\n}: SdkStoreOptions): Promise<SdkStore> => {\n // Hydrate all initial state from the async driver in parallel\n const [\n rawModels,\n lastUsedModel,\n rawBaseUrls,\n lastBaseUrlsUpdate,\n rawDisabledProviders,\n rawMints,\n rawInfo,\n rawLastModelsUpdate,\n rawCachedTokens,\n rawApiKeys,\n rawChildKeys,\n rawRoutstr21Models,\n rawLastRoutstr21ModelsUpdate,\n rawCachedReceiveTokens,\n rawUsageTracking,\n ] = await Promise.all([\n driver.getItem<Record<string, Model[]>>(\n SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS,\n {}\n ),\n driver.getItem<string | null>(SDK_STORAGE_KEYS.LAST_USED_MODEL, null),\n driver.getItem<string[]>(SDK_STORAGE_KEYS.BASE_URLS_LIST, []),\n driver.getItem<number | null>(SDK_STORAGE_KEYS.LAST_BASE_URLS_UPDATE, null),\n driver.getItem<string[]>(SDK_STORAGE_KEYS.DISABLED_PROVIDERS, []),\n driver.getItem<Record<string, string[]>>(\n SDK_STORAGE_KEYS.MINTS_FROM_ALL_PROVIDERS,\n {}\n ),\n driver.getItem<Record<string, ProviderInfo>>(\n SDK_STORAGE_KEYS.INFO_FROM_ALL_PROVIDERS,\n {}\n ),\n driver.getItem<Record<string, number>>(\n SDK_STORAGE_KEYS.LAST_MODELS_UPDATE,\n {}\n ),\n driver.getItem<\n Array<{\n baseUrl: string;\n token: string;\n balance?: number;\n lastUsed?: number | null;\n }>\n >(SDK_STORAGE_KEYS.LOCAL_CASHU_TOKENS, []),\n driver.getItem<\n Array<{\n baseUrl: string;\n key: string;\n balance?: number;\n lastUsed?: number | null;\n }>\n >(SDK_STORAGE_KEYS.API_KEYS, []),\n driver.getItem<\n Array<{\n parentBaseUrl: string;\n childKey: string;\n balance?: number;\n balanceLimit?: number;\n validityDate?: number;\n createdAt?: number;\n }>\n >(SDK_STORAGE_KEYS.CHILD_KEYS, []),\n driver.getItem<string[]>(SDK_STORAGE_KEYS.ROUTSTR21_MODELS, []),\n driver.getItem<number | null>(\n SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE,\n null\n ),\n driver.getItem<\n Array<{\n token: string;\n amount: number;\n unit: \"sat\" | \"msat\";\n createdAt?: number;\n }>\n >(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, []),\n driver.getItem<\n Array<{\n id: string;\n timestamp: number;\n modelId: string;\n baseUrl: string;\n requestId: string;\n cost: number;\n satsCost: number;\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n client?: string;\n sessionId?: string;\n tags?: string[];\n }>\n >(SDK_STORAGE_KEYS.USAGE_TRACKING, []),\n ]);\n\n // Normalize all hydrated state\n const modelsFromAllProviders = Object.fromEntries(\n Object.entries(rawModels).map(([baseUrl, models]) => [\n normalizeBaseUrl(baseUrl),\n models,\n ])\n );\n\n const baseUrlsList = rawBaseUrls.map((url) => normalizeBaseUrl(url));\n\n const disabledProviders = rawDisabledProviders.map((url) =>\n normalizeBaseUrl(url)\n );\n\n const mintsFromAllProviders = Object.fromEntries(\n Object.entries(rawMints).map(([baseUrl, mints]) => [\n normalizeBaseUrl(baseUrl),\n mints.map((mint) => (mint.endsWith(\"/\") ? mint.slice(0, -1) : mint)),\n ])\n );\n\n const infoFromAllProviders = Object.fromEntries(\n Object.entries(rawInfo).map(([baseUrl, info]) => [\n normalizeBaseUrl(baseUrl),\n info,\n ])\n );\n\n const lastModelsUpdate = Object.fromEntries(\n Object.entries(rawLastModelsUpdate).map(([baseUrl, timestamp]) => [\n normalizeBaseUrl(baseUrl),\n timestamp,\n ])\n );\n\n const cachedTokens = rawCachedTokens.map((entry) => ({\n ...entry,\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n balance:\n typeof entry.balance === \"number\"\n ? entry.balance\n : getCashuTokenBalance(entry.token),\n lastUsed: entry.lastUsed ?? null,\n }));\n\n const apiKeys = rawApiKeys.map((entry) => ({\n ...entry,\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n balance: entry.balance ?? 0,\n lastUsed: entry.lastUsed ?? null,\n }));\n\n const childKeys = rawChildKeys.map((entry) => ({\n parentBaseUrl: normalizeBaseUrl(entry.parentBaseUrl),\n childKey: entry.childKey,\n balance: entry.balance ?? 0,\n balanceLimit: entry.balanceLimit,\n validityDate: entry.validityDate,\n createdAt: entry.createdAt ?? Date.now(),\n }));\n\n const routstr21Models = rawRoutstr21Models;\n const lastRoutstr21ModelsUpdate = rawLastRoutstr21ModelsUpdate;\n\n const cachedReceiveTokens = rawCachedReceiveTokens?.map((entry) => ({\n token: entry.token,\n amount: entry.amount,\n unit: entry.unit || \"sat\",\n createdAt: entry.createdAt ?? Date.now(),\n }));\n\n const usageTracking = rawUsageTracking;\n\n // Create the store with hydrated state.\n // All setters update in-memory state synchronously and persist to driver\n // as fire-and-forget (no await on setItem).\n return createStore<SdkStorageStore>((set, get) => ({\n modelsFromAllProviders,\n lastUsedModel,\n baseUrlsList,\n lastBaseUrlsUpdate,\n disabledProviders,\n mintsFromAllProviders,\n infoFromAllProviders,\n lastModelsUpdate,\n cachedTokens,\n apiKeys,\n childKeys,\n routstr21Models,\n lastRoutstr21ModelsUpdate,\n cachedReceiveTokens,\n usageTracking,\n setModelsFromAllProviders: (value) => {\n const normalized: Record<string, Model[]> = {};\n for (const [baseUrl, models] of Object.entries(value)) {\n normalized[normalizeBaseUrl(baseUrl)] = models;\n }\n void driver.setItem(\n SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS,\n normalized\n );\n set({ modelsFromAllProviders: normalized });\n },\n setLastUsedModel: (value) => {\n void driver.setItem(SDK_STORAGE_KEYS.LAST_USED_MODEL, value);\n set({ lastUsedModel: value });\n },\n setBaseUrlsList: (value) => {\n const normalized = value.map((url) => normalizeBaseUrl(url));\n void driver.setItem(SDK_STORAGE_KEYS.BASE_URLS_LIST, normalized);\n set({ baseUrlsList: normalized });\n },\n setBaseUrlsLastUpdate: (value) => {\n void driver.setItem(SDK_STORAGE_KEYS.LAST_BASE_URLS_UPDATE, value);\n set({ lastBaseUrlsUpdate: value });\n },\n setDisabledProviders: (value) => {\n const normalized = value.map((url) => normalizeBaseUrl(url));\n void driver.setItem(SDK_STORAGE_KEYS.DISABLED_PROVIDERS, normalized);\n set({ disabledProviders: normalized });\n },\n setMintsFromAllProviders: (value) => {\n const normalized: Record<string, string[]> = {};\n for (const [baseUrl, mints] of Object.entries(value)) {\n normalized[normalizeBaseUrl(baseUrl)] = mints.map((mint) =>\n mint.endsWith(\"/\") ? mint.slice(0, -1) : mint\n );\n }\n void driver.setItem(\n SDK_STORAGE_KEYS.MINTS_FROM_ALL_PROVIDERS,\n normalized\n );\n set({ mintsFromAllProviders: normalized });\n },\n setInfoFromAllProviders: (value) => {\n const normalized: Record<string, ProviderInfo> = {};\n for (const [baseUrl, info] of Object.entries(value)) {\n normalized[normalizeBaseUrl(baseUrl)] = info;\n }\n void driver.setItem(SDK_STORAGE_KEYS.INFO_FROM_ALL_PROVIDERS, normalized);\n set({ infoFromAllProviders: normalized });\n },\n setLastModelsUpdate: (value) => {\n const normalized: Record<string, number> = {};\n for (const [baseUrl, timestamp] of Object.entries(value)) {\n normalized[normalizeBaseUrl(baseUrl)] = timestamp;\n }\n void driver.setItem(SDK_STORAGE_KEYS.LAST_MODELS_UPDATE, normalized);\n set({ lastModelsUpdate: normalized });\n },\n setCachedTokens: (value) => {\n set((state) => {\n const updates =\n typeof value === \"function\" ? value(state.cachedTokens) : value;\n const normalized = updates.map((entry) => ({\n ...entry,\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n balance:\n typeof entry.balance === \"number\"\n ? entry.balance\n : getCashuTokenBalance(entry.token),\n lastUsed: entry.lastUsed ?? null,\n }));\n void driver.setItem(SDK_STORAGE_KEYS.LOCAL_CASHU_TOKENS, normalized);\n return { cachedTokens: normalized };\n });\n },\n setApiKeys: (value) => {\n set((state) => {\n const updates =\n typeof value === \"function\" ? value(state.apiKeys) : value;\n const normalized = updates.map((entry) => ({\n ...entry,\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n balance: entry.balance ?? 0,\n lastUsed: entry.lastUsed ?? null,\n }));\n void driver.setItem(SDK_STORAGE_KEYS.API_KEYS, normalized);\n return { apiKeys: normalized };\n });\n },\n setChildKeys: (\n value:\n | Array<{\n parentBaseUrl: string;\n childKey: string;\n balance?: number;\n balanceLimit?: number;\n validityDate?: number;\n createdAt?: number;\n }>\n | ((\n current: SdkStorageStore[\"childKeys\"]\n ) => SdkStorageStore[\"childKeys\"])\n ) => {\n set((state) => {\n const updates =\n typeof value === \"function\" ? value(state.childKeys) : value;\n const normalized = updates.map((entry) => ({\n parentBaseUrl: normalizeBaseUrl(entry.parentBaseUrl),\n childKey: entry.childKey,\n balance: entry.balance ?? 0,\n balanceLimit: entry.balanceLimit,\n validityDate: entry.validityDate,\n createdAt: entry.createdAt ?? Date.now(),\n }));\n void driver.setItem(SDK_STORAGE_KEYS.CHILD_KEYS, normalized);\n return { childKeys: normalized };\n });\n },\n setRoutstr21Models: (value) => {\n void driver.setItem(SDK_STORAGE_KEYS.ROUTSTR21_MODELS, value);\n set({ routstr21Models: value });\n },\n setRoutstr21ModelsLastUpdate: (value) => {\n void driver.setItem(SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE, value);\n set({ lastRoutstr21ModelsUpdate: value });\n },\n setCachedReceiveTokens: (value) => {\n const normalized = value.map((entry) => ({\n token: entry.token,\n amount: entry.amount,\n unit: entry.unit || \"sat\",\n createdAt: entry.createdAt ?? Date.now(),\n }));\n void driver.setItem(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, normalized);\n set({ cachedReceiveTokens: normalized });\n },\n setUsageTracking: (value) => {\n void driver.setItem(SDK_STORAGE_KEYS.USAGE_TRACKING, value);\n set({ usageTracking: value });\n },\n }));\n};\n\nexport const createDiscoveryAdapterFromStore = (\n store: SdkStore\n): DiscoveryAdapter => ({\n getCachedModels: () => store.getState().modelsFromAllProviders,\n setCachedModels: (models) =>\n store.getState().setModelsFromAllProviders(models),\n getCachedMints: () => store.getState().mintsFromAllProviders,\n setCachedMints: (mints) => store.getState().setMintsFromAllProviders(mints),\n getCachedProviderInfo: () => store.getState().infoFromAllProviders,\n setCachedProviderInfo: (info) =>\n store.getState().setInfoFromAllProviders(info),\n getProviderLastUpdate: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const timestamps = store.getState().lastModelsUpdate;\n return timestamps[normalized] || null;\n },\n setProviderLastUpdate: (baseUrl, timestamp) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const timestamps = { ...store.getState().lastModelsUpdate };\n timestamps[normalized] = timestamp;\n store.getState().setLastModelsUpdate(timestamps);\n },\n getLastUsedModel: () => store.getState().lastUsedModel,\n setLastUsedModel: (modelId) => store.getState().setLastUsedModel(modelId),\n getDisabledProviders: () => store.getState().disabledProviders,\n getBaseUrlsList: () => store.getState().baseUrlsList,\n setBaseUrlsList: (urls) => store.getState().setBaseUrlsList(urls),\n getBaseUrlsLastUpdate: () => store.getState().lastBaseUrlsUpdate,\n setBaseUrlsLastUpdate: (timestamp) =>\n store.getState().setBaseUrlsLastUpdate(timestamp),\n getRoutstr21Models: () => store.getState().routstr21Models,\n setRoutstr21Models: (models) => store.getState().setRoutstr21Models(models),\n getRoutstr21ModelsLastUpdate: () =>\n store.getState().lastRoutstr21ModelsUpdate,\n setRoutstr21ModelsLastUpdate: (timestamp) =>\n store.getState().setRoutstr21ModelsLastUpdate(timestamp),\n});\n\nexport const createStorageAdapterFromStore = (\n store: SdkStore\n): StorageAdapter => ({\n getToken: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const entry = store\n .getState()\n .cachedTokens.find((token) => token.baseUrl === normalized);\n if (!entry) return null;\n const next = store\n .getState()\n .cachedTokens.map((token) =>\n token.baseUrl === normalized\n ? { ...token, lastUsed: Date.now() }\n : token\n );\n store.getState().setCachedTokens(next);\n return entry.token;\n },\n setToken: (baseUrl, token) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const tokens = store.getState().cachedTokens;\n const balance = getCashuTokenBalance(token);\n const existingIndex = tokens.findIndex(\n (entry) => entry.baseUrl === normalized\n );\n if (existingIndex !== -1) {\n throw new Error(`Token already exists for baseUrl: ${normalized}`);\n }\n const next = [...tokens];\n next.push({\n baseUrl: normalized,\n token,\n balance,\n lastUsed: Date.now(),\n });\n store.getState().setCachedTokens(next);\n },\n removeToken: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const next = store\n .getState()\n .cachedTokens.filter((entry) => entry.baseUrl !== normalized);\n store.getState().setCachedTokens(next);\n },\n updateTokenBalance: (baseUrl, balance) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const tokens = store.getState().cachedTokens;\n const next = tokens.map((entry) =>\n entry.baseUrl === normalized ? { ...entry, balance } : entry\n );\n store.getState().setCachedTokens(next);\n },\n getCachedTokenDistribution: () => {\n const cachedTokens = store.getState().cachedTokens;\n const distributionMap: Record<string, number> = {};\n\n for (const entry of cachedTokens) {\n const sum = entry.balance || 0;\n if (sum > 0) {\n distributionMap[entry.baseUrl] =\n (distributionMap[entry.baseUrl] || 0) + sum;\n }\n }\n\n return Object.entries(distributionMap)\n .map(([baseUrl, amt]) => ({ baseUrl, amount: amt }))\n .sort((a, b) => b.amount - a.amount);\n },\n getApiKeyDistribution: () => {\n const apiKeys = store.getState().apiKeys;\n const distributionMap: Record<string, number> = {};\n\n for (const entry of apiKeys) {\n const sum = entry.balance || 0;\n if (sum > 0) {\n distributionMap[entry.baseUrl] =\n (distributionMap[entry.baseUrl] || 0) + sum;\n }\n }\n\n return Object.entries(distributionMap)\n .map(([baseUrl, amt]) => ({ baseUrl, amount: amt }))\n .sort((a, b) => b.amount - a.amount);\n },\n saveProviderInfo: (baseUrl, info) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const next = { ...store.getState().infoFromAllProviders };\n next[normalized] = info;\n store.getState().setInfoFromAllProviders(next);\n },\n getProviderInfo: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n return store.getState().infoFromAllProviders[normalized] || null;\n },\n\n // ========== API Keys (for apikeys mode) ==========\n\n getApiKey: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const entry = store\n .getState()\n .apiKeys.find((key) => key.baseUrl === normalized);\n if (!entry) return null;\n // Update lastUsed timestamp\n const next = store\n .getState()\n .apiKeys.map((key) =>\n key.baseUrl === normalized ? { ...key, lastUsed: Date.now() } : key\n );\n store.getState().setApiKeys(next);\n return entry;\n },\n\n setApiKey: (baseUrl, key) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const keys = store.getState().apiKeys;\n const existingIndex = keys.findIndex(\n (entry) => entry.baseUrl === normalized\n );\n if (existingIndex !== -1) {\n throw new Error(`ApiKey already exists for baseUrl: ${normalized}`);\n }\n const next = [...keys];\n next.push({\n baseUrl: normalized,\n key,\n balance: 0,\n lastUsed: Date.now(),\n });\n store.getState().setApiKeys(next);\n },\n\n updateApiKeyBalance: (baseUrl, balance) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const keys = store.getState().apiKeys;\n const next = keys.map((entry) =>\n entry.baseUrl === normalized ? { ...entry, balance } : entry\n );\n store.getState().setApiKeys(next);\n },\n\n removeApiKey: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const next = store\n .getState()\n .apiKeys.filter((entry) => entry.baseUrl !== normalized);\n store.getState().setApiKeys(next);\n },\n\n getAllApiKeys: () => {\n return store.getState().apiKeys.map((entry) => ({\n baseUrl: entry.baseUrl,\n key: entry.key,\n balance: entry.balance,\n lastUsed: entry.lastUsed,\n }));\n },\n\n // ========== Child Keys ==========\n\n getChildKey: (parentBaseUrl) => {\n const normalized = normalizeBaseUrl(parentBaseUrl);\n const entry = store\n .getState()\n .childKeys.find((key) => key.parentBaseUrl === normalized);\n if (!entry) return null;\n return {\n parentBaseUrl: entry.parentBaseUrl,\n childKey: entry.childKey,\n balance: entry.balance,\n balanceLimit: entry.balanceLimit,\n validityDate: entry.validityDate,\n createdAt: entry.createdAt,\n };\n },\n\n setChildKey: (\n parentBaseUrl,\n childKey,\n balance,\n validityDate,\n balanceLimit\n ) => {\n const normalized = normalizeBaseUrl(parentBaseUrl);\n const keys = store.getState().childKeys;\n const existingIndex = keys.findIndex(\n (entry) => entry.parentBaseUrl === normalized\n );\n if (existingIndex !== -1) {\n // Update existing child key\n const next = keys.map((entry) =>\n entry.parentBaseUrl === normalized\n ? {\n ...entry,\n childKey,\n balance: balance ?? 0,\n validityDate,\n balanceLimit,\n createdAt: Date.now(),\n }\n : entry\n );\n store.getState().setChildKeys(next);\n } else {\n // Add new child key\n const next = [...keys];\n next.push({\n parentBaseUrl: normalized,\n childKey,\n balance: balance ?? 0,\n validityDate,\n balanceLimit,\n createdAt: Date.now(),\n });\n store.getState().setChildKeys(next);\n }\n },\n\n updateChildKeyBalance: (parentBaseUrl, balance) => {\n const normalized = normalizeBaseUrl(parentBaseUrl);\n const keys = store.getState().childKeys;\n const next = keys.map((entry) =>\n entry.parentBaseUrl === normalized ? { ...entry, balance } : entry\n );\n store.getState().setChildKeys(next);\n },\n\n removeChildKey: (parentBaseUrl) => {\n const normalized = normalizeBaseUrl(parentBaseUrl);\n const next = store\n .getState()\n .childKeys.filter((entry) => entry.parentBaseUrl !== normalized);\n store.getState().setChildKeys(next);\n },\n\n getAllChildKeys: () => {\n return store.getState().childKeys.map((entry) => ({\n parentBaseUrl: entry.parentBaseUrl,\n childKey: entry.childKey,\n balance: entry.balance,\n balanceLimit: entry.balanceLimit,\n validityDate: entry.validityDate,\n createdAt: entry.createdAt,\n }));\n },\n\n getCachedReceiveTokens: () => {\n return store.getState().cachedReceiveTokens;\n },\n\n setCachedReceiveTokens: (tokens) => {\n store.getState().setCachedReceiveTokens(tokens);\n },\n});\n\nexport const createProviderRegistryFromStore = (\n store: SdkStore\n): ProviderRegistry => ({\n getModelsForProvider: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n return store.getState().modelsFromAllProviders[normalized] || [];\n },\n getDisabledProviders: () => store.getState().disabledProviders,\n getProviderMints: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n return store.getState().mintsFromAllProviders[normalized] || [];\n },\n getProviderInfo: async (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const cached = store.getState().infoFromAllProviders[normalized];\n if (cached) return cached;\n try {\n const response = await fetch(`${normalized}v1/info`);\n if (!response.ok) {\n throw new Error(`Failed ${response.status}`);\n }\n const info = (await response.json()) as ProviderInfo;\n const next = { ...store.getState().infoFromAllProviders };\n next[normalized] = info;\n store.getState().setInfoFromAllProviders(next);\n return info;\n } catch (error) {\n console.warn(`Failed to fetch provider info from ${normalized}:`, error);\n return null;\n }\n },\n getAllProvidersModels: () => store.getState().modelsFromAllProviders,\n});\n","import { localStorageDriver } from \"./drivers/localStorage\";\nimport { createMemoryDriver } from \"./drivers/memory\";\nimport { createSqliteDriver } from \"./drivers/sqlite\";\nimport { createIndexedDBDriver } from \"./drivers/indexedDB\";\nimport type { StorageDriver } from \"./types\";\nimport {\n createSdkStore,\n createDiscoveryAdapterFromStore,\n createProviderRegistryFromStore,\n createStorageAdapterFromStore,\n type SdkStore,\n} from \"./store\";\n\nexport type { StorageDriver } from \"./types\";\nexport type { SdkStore } from \"./store\";\nexport type { DiscoveryAdapter } from \"../discovery/interfaces\";\nexport type { StorageAdapter, ProviderRegistry } from \"../wallet/interfaces\";\nexport { SDK_STORAGE_KEYS } from \"./keys\";\nexport {\n createSdkStore,\n createDiscoveryAdapterFromStore,\n createProviderRegistryFromStore,\n createStorageAdapterFromStore,\n} from \"./store\";\nexport {\n localStorageDriver,\n createMemoryDriver,\n createSqliteDriver,\n createIndexedDBDriver,\n};\n\nconst isBrowser = (): boolean => {\n try {\n return (\n typeof window !== \"undefined\" &&\n typeof window.localStorage !== \"undefined\"\n );\n } catch {\n return false;\n }\n};\n\nconst isNode = (): boolean => {\n try {\n return (\n typeof process !== \"undefined\" &&\n process.versions != null &&\n process.versions.node != null\n );\n } catch {\n return false;\n }\n};\n\nlet defaultDriver: StorageDriver | null = null;\n\nconst isBun = (): boolean => {\n return typeof process.versions.bun !== \"undefined\";\n};\n\nexport const getDefaultSdkDriver = (): StorageDriver => {\n if (defaultDriver) return defaultDriver;\n if (isBrowser()) {\n defaultDriver = localStorageDriver;\n return defaultDriver;\n }\n if (isBun()) {\n defaultDriver = createMemoryDriver();\n return defaultDriver;\n }\n if (isNode()) {\n defaultDriver = createSqliteDriver();\n return defaultDriver;\n }\n defaultDriver = createMemoryDriver();\n return defaultDriver;\n};\n\nlet defaultStorePromise: Promise<SdkStore> | null = null;\n\nexport const getDefaultSdkStore = (): Promise<SdkStore> => {\n if (!defaultStorePromise) {\n defaultStorePromise = createSdkStore({ driver: getDefaultSdkDriver() });\n }\n return defaultStorePromise;\n};\n\nexport const getDefaultDiscoveryAdapter = async () =>\n createDiscoveryAdapterFromStore(await getDefaultSdkStore());\n\nexport const getDefaultStorageAdapter = async () =>\n createStorageAdapterFromStore(await getDefaultSdkStore());\n\nexport const getDefaultProviderRegistry = async () =>\n createProviderRegistryFromStore(await getDefaultSdkStore());\n"]}
@@ -65,6 +65,11 @@ interface ProviderTokenResult {
65
65
  selectedMintUrl?: string;
66
66
  amountSpent?: number;
67
67
  }
68
+ interface BalanceState {
69
+ totalBalance: number;
70
+ providerBalances: Record<string, number>;
71
+ mintBalances: Record<string, number>;
72
+ }
68
73
  /**
69
74
  * BalanceManager handles token refunds and topups from providers
70
75
  */
@@ -74,6 +79,7 @@ declare class BalanceManager {
74
79
  private providerRegistry?;
75
80
  private cashuSpender;
76
81
  constructor(walletAdapter: WalletAdapter, storageAdapter: StorageAdapter, providerRegistry?: ProviderRegistry | undefined, cashuSpender?: CashuSpender);
82
+ getBalanceState(): Promise<BalanceState>;
77
83
  /**
78
84
  * Unified refund - handles both NIP-60 and legacy wallet refunds
79
85
  */
@@ -216,4 +222,4 @@ declare class CashuSpender {
216
222
  private _getProviderTokenBalance;
217
223
  }
218
224
 
219
- export { BalanceManager, CashuSpender, type CreateProviderTokenOptions, ProviderRegistry, type ProviderTokenResult, type RefundApiKeyOptions, type RefundOptions, type SpendOptions, StorageAdapter, type TopUpOptions, WalletAdapter };
225
+ export { BalanceManager, type BalanceState, CashuSpender, type CreateProviderTokenOptions, ProviderRegistry, type ProviderTokenResult, type RefundApiKeyOptions, type RefundOptions, type SpendOptions, StorageAdapter, type TopUpOptions, WalletAdapter };
@@ -65,6 +65,11 @@ interface ProviderTokenResult {
65
65
  selectedMintUrl?: string;
66
66
  amountSpent?: number;
67
67
  }
68
+ interface BalanceState {
69
+ totalBalance: number;
70
+ providerBalances: Record<string, number>;
71
+ mintBalances: Record<string, number>;
72
+ }
68
73
  /**
69
74
  * BalanceManager handles token refunds and topups from providers
70
75
  */
@@ -74,6 +79,7 @@ declare class BalanceManager {
74
79
  private providerRegistry?;
75
80
  private cashuSpender;
76
81
  constructor(walletAdapter: WalletAdapter, storageAdapter: StorageAdapter, providerRegistry?: ProviderRegistry | undefined, cashuSpender?: CashuSpender);
82
+ getBalanceState(): Promise<BalanceState>;
77
83
  /**
78
84
  * Unified refund - handles both NIP-60 and legacy wallet refunds
79
85
  */
@@ -216,4 +222,4 @@ declare class CashuSpender {
216
222
  private _getProviderTokenBalance;
217
223
  }
218
224
 
219
- export { BalanceManager, CashuSpender, type CreateProviderTokenOptions, ProviderRegistry, type ProviderTokenResult, type RefundApiKeyOptions, type RefundOptions, type SpendOptions, StorageAdapter, type TopUpOptions, WalletAdapter };
225
+ export { BalanceManager, type BalanceState, CashuSpender, type CreateProviderTokenOptions, ProviderRegistry, type ProviderTokenResult, type RefundApiKeyOptions, type RefundOptions, type SpendOptions, StorageAdapter, type TopUpOptions, WalletAdapter };
@@ -108,6 +108,9 @@ var CashuSpender = class {
108
108
  return result;
109
109
  }
110
110
  async _getBalanceState() {
111
+ if (this.balanceManager) {
112
+ return this.balanceManager.getBalanceState();
113
+ }
111
114
  const mintBalances = await this.walletAdapter.getBalances();
112
115
  const units = this.walletAdapter.getMintUnits();
113
116
  let totalMintBalance = 0;
@@ -123,15 +126,16 @@ var CashuSpender = class {
123
126
  const providerBalances = {};
124
127
  let totalProviderBalance = 0;
125
128
  for (const pending of pendingDistribution) {
126
- providerBalances[pending.baseUrl] = pending.amount;
129
+ providerBalances[pending.baseUrl] = (providerBalances[pending.baseUrl] || 0) + pending.amount;
127
130
  totalProviderBalance += pending.amount;
128
131
  }
129
132
  const apiKeys = this.storageAdapter.getAllApiKeys();
130
133
  for (const apiKey of apiKeys) {
131
134
  if (!providerBalances[apiKey.baseUrl]) {
132
- providerBalances[apiKey.baseUrl] = apiKey.balance;
133
- totalProviderBalance += apiKey.balance;
135
+ providerBalances[apiKey.baseUrl] = 0;
134
136
  }
137
+ providerBalances[apiKey.baseUrl] += apiKey.balance;
138
+ totalProviderBalance += apiKey.balance;
135
139
  }
136
140
  return {
137
141
  totalBalance: totalMintBalance + totalProviderBalance,
@@ -280,25 +284,12 @@ var CashuSpender = class {
280
284
  `[CashuSpender] _spendInternal: Could not reuse token, will create new token`
281
285
  );
282
286
  }
283
- const balances = await this.walletAdapter.getBalances();
284
- const units = this.walletAdapter.getMintUnits();
285
- let totalBalance = 0;
286
- for (const url in balances) {
287
- const balance = balances[url];
288
- const unit = units[url];
289
- const balanceInSats = getBalanceInSats(balance, unit);
290
- totalBalance += balanceInSats;
291
- }
292
- const pendingDistribution = this.storageAdapter.getCachedTokenDistribution();
293
- const totalPending = pendingDistribution.reduce(
294
- (sum, item) => sum + item.amount,
295
- 0
296
- );
287
+ const balanceState = await this._getBalanceState();
288
+ const totalAvailableBalance = balanceState.totalBalance;
297
289
  this._log(
298
290
  "DEBUG",
299
- `[CashuSpender] _spendInternal: totalBalance=${totalBalance}, totalPending=${totalPending}, adjustedAmount=${adjustedAmount}`
291
+ `[CashuSpender] _spendInternal: totalAvailableBalance=${totalAvailableBalance}, adjustedAmount=${adjustedAmount}`
300
292
  );
301
- const totalAvailableBalance = totalBalance + totalPending;
302
293
  if (totalAvailableBalance < adjustedAmount) {
303
294
  this._log(
304
295
  "ERROR",
@@ -306,8 +297,7 @@ var CashuSpender = class {
306
297
  );
307
298
  return this._createInsufficientBalanceError(
308
299
  adjustedAmount,
309
- balances,
310
- units,
300
+ balanceState.mintBalances,
311
301
  totalAvailableBalance
312
302
  );
313
303
  }
@@ -327,8 +317,7 @@ var CashuSpender = class {
327
317
  if ((tokenResult.error || "").includes("Insufficient balance")) {
328
318
  return this._createInsufficientBalanceError(
329
319
  adjustedAmount,
330
- balances,
331
- units,
320
+ balanceState.mintBalances,
332
321
  totalAvailableBalance
333
322
  );
334
323
  }
@@ -373,6 +362,7 @@ var CashuSpender = class {
373
362
  "DEBUG",
374
363
  `[CashuSpender] _spendInternal: Successfully spent ${spentAmount}, returning token with balance=${spentAmount}`
375
364
  );
365
+ const units = this.walletAdapter.getMintUnits();
376
366
  return {
377
367
  token,
378
368
  status: "success",
@@ -510,13 +500,11 @@ var CashuSpender = class {
510
500
  /**
511
501
  * Create an insufficient balance error result
512
502
  */
513
- _createInsufficientBalanceError(required, balances, units, availableBalance) {
503
+ _createInsufficientBalanceError(required, normalizedBalances, availableBalance) {
514
504
  let maxBalance = 0;
515
505
  let maxMintUrl = "";
516
- for (const mintUrl in balances) {
517
- const balance = balances[mintUrl];
518
- const unit = units[mintUrl];
519
- const balanceInSats = getBalanceInSats(balance, unit);
506
+ for (const mintUrl in normalizedBalances) {
507
+ const balanceInSats = normalizedBalances[mintUrl];
520
508
  if (balanceInSats > maxBalance) {
521
509
  maxBalance = balanceInSats;
522
510
  maxMintUrl = mintUrl;
@@ -577,6 +565,39 @@ var BalanceManager = class {
577
565
  }
578
566
  }
579
567
  cashuSpender;
568
+ async getBalanceState() {
569
+ const mintBalances = await this.walletAdapter.getBalances();
570
+ const units = this.walletAdapter.getMintUnits();
571
+ let totalMintBalance = 0;
572
+ const normalizedMintBalances = {};
573
+ for (const url in mintBalances) {
574
+ const balance = mintBalances[url];
575
+ const unit = units[url];
576
+ const balanceInSats = getBalanceInSats(balance, unit);
577
+ normalizedMintBalances[url] = balanceInSats;
578
+ totalMintBalance += balanceInSats;
579
+ }
580
+ const pendingDistribution = this.storageAdapter.getCachedTokenDistribution();
581
+ const providerBalances = {};
582
+ let totalProviderBalance = 0;
583
+ for (const pending of pendingDistribution) {
584
+ providerBalances[pending.baseUrl] = (providerBalances[pending.baseUrl] || 0) + pending.amount;
585
+ totalProviderBalance += pending.amount;
586
+ }
587
+ const apiKeys = this.storageAdapter.getAllApiKeys();
588
+ for (const apiKey of apiKeys) {
589
+ if (!providerBalances[apiKey.baseUrl]) {
590
+ providerBalances[apiKey.baseUrl] = 0;
591
+ }
592
+ providerBalances[apiKey.baseUrl] += apiKey.balance;
593
+ totalProviderBalance += apiKey.balance;
594
+ }
595
+ return {
596
+ totalBalance: totalMintBalance + totalProviderBalance,
597
+ providerBalances,
598
+ mintBalances: normalizedMintBalances
599
+ };
600
+ }
580
601
  /**
581
602
  * Unified refund - handles both NIP-60 and legacy wallet refunds
582
603
  */
@@ -806,17 +827,17 @@ var BalanceManager = class {
806
827
  if (!adjustedAmount || isNaN(adjustedAmount)) {
807
828
  return { success: false, error: "Invalid top up amount" };
808
829
  }
830
+ const balanceState = await this.getBalanceState();
809
831
  const balances = await this.walletAdapter.getBalances();
810
832
  const units = this.walletAdapter.getMintUnits();
811
- let totalMintBalance = 0;
812
- for (const url in balances) {
813
- const unit = units[url];
814
- const balanceInSats = getBalanceInSats(balances[url], unit);
815
- totalMintBalance += balanceInSats;
816
- }
817
- const pendingDistribution = this.storageAdapter.getCachedTokenDistribution();
818
- const refundablePending = pendingDistribution.filter((entry) => entry.baseUrl !== baseUrl).reduce((sum, entry) => sum + entry.amount, 0);
819
- if (totalMintBalance < adjustedAmount && totalMintBalance + refundablePending >= adjustedAmount && retryCount < 1) {
833
+ const totalMintBalance = Object.values(balanceState.mintBalances).reduce(
834
+ (sum, value) => sum + value,
835
+ 0
836
+ );
837
+ const refundableProviderBalance = Object.entries(
838
+ balanceState.providerBalances
839
+ ).filter(([providerBaseUrl]) => providerBaseUrl !== baseUrl).reduce((sum, [, value]) => sum + value, 0);
840
+ if (totalMintBalance < adjustedAmount && totalMintBalance + refundableProviderBalance >= adjustedAmount && retryCount < 1) {
820
841
  await this._refundOtherProvidersForTopUp(baseUrl, mintUrl);
821
842
  return this.createProviderToken({
822
843
  ...options,
@@ -938,10 +959,14 @@ var BalanceManager = class {
938
959
  }
939
960
  async _refundOtherProvidersForTopUp(baseUrl, mintUrl) {
940
961
  const pendingDistribution = this.storageAdapter.getCachedTokenDistribution();
962
+ const apiKeyDistribution = this.storageAdapter.getApiKeyDistribution();
941
963
  const toRefund = pendingDistribution.filter(
942
964
  (pending) => pending.baseUrl !== baseUrl
943
965
  );
944
- const refundResults = await Promise.allSettled(
966
+ const apiKeysToRefund = apiKeyDistribution.filter(
967
+ (apiKey) => apiKey.baseUrl !== baseUrl && apiKey.amount > 0
968
+ );
969
+ const tokenRefundResults = await Promise.allSettled(
945
970
  toRefund.map(async (pending) => {
946
971
  const token = this.storageAdapter.getToken(pending.baseUrl);
947
972
  if (!token) {
@@ -959,11 +984,32 @@ var BalanceManager = class {
959
984
  return { baseUrl: pending.baseUrl, success: result.success };
960
985
  })
961
986
  );
962
- for (const result of refundResults) {
987
+ for (const result of tokenRefundResults) {
963
988
  if (result.status === "fulfilled" && result.value.success) {
964
989
  this.storageAdapter.removeToken(result.value.baseUrl);
965
990
  }
966
991
  }
992
+ const apiKeyRefundResults = await Promise.allSettled(
993
+ apiKeysToRefund.map(async (apiKeyEntry) => {
994
+ const fullApiKeyEntry = this.storageAdapter.getApiKey(
995
+ apiKeyEntry.baseUrl
996
+ );
997
+ if (!fullApiKeyEntry) {
998
+ return { baseUrl: apiKeyEntry.baseUrl, success: false };
999
+ }
1000
+ const result = await this.refundApiKey({
1001
+ mintUrl,
1002
+ baseUrl: apiKeyEntry.baseUrl,
1003
+ apiKey: fullApiKeyEntry.key
1004
+ });
1005
+ return { baseUrl: apiKeyEntry.baseUrl, success: result.success };
1006
+ })
1007
+ );
1008
+ for (const result of apiKeyRefundResults) {
1009
+ if (result.status === "fulfilled" && result.value.success) {
1010
+ this.storageAdapter.updateApiKeyBalance(result.value.baseUrl, 0);
1011
+ }
1012
+ }
967
1013
  }
968
1014
  /**
969
1015
  * Fetch refund token from provider API