@routstr/sdk 0.3.9 → 0.3.11
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.
- package/dist/browser.d.mts +12 -0
- package/dist/browser.d.ts +12 -0
- package/dist/browser.js +6413 -0
- package/dist/browser.js.map +1 -0
- package/dist/browser.mjs +6361 -0
- package/dist/browser.mjs.map +1 -0
- package/dist/bun.d.mts +29 -0
- package/dist/bun.d.ts +29 -0
- package/dist/bun.js +6791 -0
- package/dist/bun.js.map +1 -0
- package/dist/bun.mjs +6733 -0
- package/dist/bun.mjs.map +1 -0
- package/dist/bunSqlite-BmXWNc25.d.ts +18 -0
- package/dist/bunSqlite-Bro9efsl.d.mts +18 -0
- package/dist/client/index.d.mts +85 -42
- package/dist/client/index.d.ts +85 -42
- package/dist/client/index.js +1243 -1584
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +1239 -1585
- package/dist/client/index.mjs.map +1 -1
- package/dist/discovery/index.d.mts +33 -3
- package/dist/discovery/index.d.ts +33 -3
- package/dist/discovery/index.js +30 -31
- package/dist/discovery/index.js.map +1 -1
- package/dist/discovery/index.mjs +30 -31
- package/dist/discovery/index.mjs.map +1 -1
- package/dist/index.d.mts +9 -7
- package/dist/index.d.ts +9 -7
- package/dist/index.js +1264 -1648
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1260 -1645
- package/dist/index.mjs.map +1 -1
- package/dist/node.d.mts +22 -0
- package/dist/node.d.ts +22 -0
- package/dist/node.js +6857 -0
- package/dist/node.js.map +1 -0
- package/dist/node.mjs +6801 -0
- package/dist/node.mjs.map +1 -0
- package/dist/storage/bun.d.mts +16 -0
- package/dist/storage/bun.d.ts +16 -0
- package/dist/storage/bun.js +1970 -0
- package/dist/storage/bun.js.map +1 -0
- package/dist/storage/bun.mjs +1946 -0
- package/dist/storage/bun.mjs.map +1 -0
- package/dist/storage/index.d.mts +4 -30
- package/dist/storage/index.d.ts +4 -30
- package/dist/storage/index.js +238 -650
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/index.mjs +239 -647
- package/dist/storage/index.mjs.map +1 -1
- package/dist/storage/node.d.mts +22 -0
- package/dist/storage/node.d.ts +22 -0
- package/dist/storage/node.js +2034 -0
- package/dist/storage/node.js.map +1 -0
- package/dist/storage/node.mjs +2012 -0
- package/dist/storage/node.mjs.map +1 -0
- package/dist/{store-58VcEUoA.d.ts → store-CAQLSbEj.d.ts} +52 -1
- package/dist/{store-C6dfj1cc.d.mts → store-CuXwe5Rg.d.mts} +52 -1
- package/dist/wallet/index.js +38 -24
- package/dist/wallet/index.js.map +1 -1
- package/dist/wallet/index.mjs +38 -24
- package/dist/wallet/index.mjs.map +1 -1
- package/package.json +26 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../storage/drivers/localStorage.ts","../../storage/drivers/memory.ts","../../core/types.ts","../../storage/drivers/sqlite.ts","../../storage/drivers/indexedDB.ts","../../storage/keys.ts","../../storage/usageTracking/indexedDB.ts","../../storage/usageTracking/sqlite.ts","../../storage/usageTracking/bunSqlite.ts","../../storage/usageTracking/memory.ts","../../storage/store.ts","../../storage/shardedDiscoveryAdapter.ts","../../storage/index.ts"],"names":["isBrowser","openDatabase","options","MIGRATION_MARKER_KEY","normalizeBaseUrl","isBun","cachedDbModule","loadDatabase","buildWhereClause","matchesFilters"],"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;;;ACpBA,SAAS,kBAAkB,MAAA,EAA4B;AACrD,EAAA,MAAM,GAAA,GAAM,CAAC,IAAA,KAAqB,MAAA,GAAS,CAAC,MAAA,EAAQ,GAAG,IAAI,CAAA,GAAI,IAAA;AAC/D,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,IAAI,IAAA,KAAS,OAAA,CAAQ,IAAI,GAAG,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,IAC1C,IAAA,EAAM,IAAI,IAAA,KAAS,OAAA,CAAQ,KAAK,GAAG,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,IAC5C,KAAA,EAAO,IAAI,IAAA,KAAS,OAAA,CAAQ,MAAM,GAAG,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,IAC9C,KAAA,EAAO,IAAI,IAAA,KAAS,OAAA,CAAQ,IAAI,GAAG,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,IAC5C,KAAA,EAAO,CAAC,CAAA,KAAM,iBAAA,CAAkB,MAAA,GAAS,GAAG,MAAM,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,GAAK,CAAC;AAAA,GAC/D;AACF;AAEO,IAAM,gBAA2B,iBAAA,EAAkB;;;ACN1D,IAAM,QAAQ,MAAe;AAC3B,EAAA,OAAO,OAAO,OAAA,CAAQ,QAAA,CAAS,GAAA,KAAQ,WAAA;AACzC,CAAA;AAEA,IAAI,cAAA,GAAsB,IAAA;AAE1B,IAAM,YAAA,GAAe,OAAO,MAAA,KAAmD;AAC7E,EAAA,IAAI,OAAM,EAAG;AACX,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI;AACF,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,cAAA,GAAA,CAAkB,MAAM,OAAO,gBAAgB,CAAA,EAAG,OAAA;AAAA,IACpD;AACA,IAAA,OAAO,IAAI,eAAe,MAAM,CAAA;AAAA,EAClC,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,qFAAqF,KAAK,CAAA,CAAA;AAAA,KAC5F;AAAA,EACF;AACF,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,IAAI,EAAA;AACJ,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,UAAA;AAEJ,EAAA,MAAM,SAAS,YAAY;AACzB,IAAA,IAAI,CAAC,EAAA,EAAI;AACP,MAAA,EAAA,GAAK,MAAM,aAAa,MAAM,CAAA;AAC9B,MAAA,EAAA,CAAG,IAAA;AAAA,QACD,8BAA8B,SAAS,CAAA,4CAAA;AAAA,OACzC;AAEA,MAAA,UAAA,GAAa,EAAA,CAAG,OAAA,CAAQ,CAAA,kBAAA,EAAqB,SAAS,CAAA,cAAA,CAAgB,CAAA;AACtE,MAAA,UAAA,GAAa,EAAA,CAAG,OAAA;AAAA,QACd,eAAe,SAAS,CAAA;AAAA,0DAAA;AAAA,OAE1B;AACA,MAAA,UAAA,GAAa,EAAA,CAAG,OAAA,CAAQ,CAAA,YAAA,EAAe,SAAS,CAAA,cAAA,CAAgB,CAAA;AAAA,IAClE;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,aAAa,YAAY;AAC7B,IAAA,IAAI,CAAC,EAAA,EAAI;AACP,MAAA,MAAM,MAAA,EAAO;AAAA,IACf;AAAA,EACF,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,OAAA,CAAW,GAAA,EAAa,YAAA,EAA6B;AACzD,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,EAAW;AACjB,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,MAAM,UAAA,EAAW;AACjB,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,MAAM,UAAA,EAAW;AACjB,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;AAIA,eAAsB,qBAAA,CACpB,QACA,OAAA,EACwB;AACxB,EAAA,MAAM,MAAA,GAAA,CAAU,OAAA,EAAS,MAAA,IAAU,aAAA,EAAe,MAAM,iBAAiB,CAAA;AAIzE,EAAA,MAAM,UAAU,MAAM;AAAA;AAAA,IAAiC;AAAA,GAAY,EAAG,OAAA;AACtE,EAAA,MAAM,EAAA,GAAK,IAAI,MAAA,CAAO,MAAM,CAAA;AAE5B,EAAA,EAAA,CAAG,GAAA,CAAI;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAKN,CAAA;AAED,EAAA,OAAO;AAAA,IACL,MAAM,OAAA,CAAW,GAAA,EAAa,YAAA,EAA6B;AACzD,MAAA,IAAI;AACF,QAAA,MAAM,MAAM,EAAA,CACT,KAAA,CAAM,6CAA6C,CAAA,CACnD,IAAI,GAAG,CAAA;AACV,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,MAAA,CAAO,KAAA,CAAM,CAAA,wBAAA,EAA2B,GAAG,CAAA,EAAA,CAAA,EAAM,KAAK,CAAA;AACtD,QAAA,OAAO,YAAA;AAAA,MACT;AAAA,IACF,CAAA;AAAA,IACA,MAAM,OAAA,CAAW,GAAA,EAAa,KAAA,EAAyB;AACrD,MAAA,IAAI;AACF,QAAA,EAAA,CAAG,KAAA;AAAA,UACD;AAAA,UACA,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,MAClC,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,KAAA,CAAM,CAAA,wBAAA,EAA2B,GAAG,CAAA,EAAA,CAAA,EAAM,KAAK,CAAA;AAAA,MACxD;AAAA,IACF,CAAA;AAAA,IACA,MAAM,WAAW,GAAA,EAA4B;AAC3C,MAAA,IAAI;AACF,QAAA,EAAA,CAAG,KAAA,CAAM,uCAAuC,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA;AAAA,MAC3D,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,KAAA,CAAM,CAAA,2BAAA,EAA8B,GAAG,CAAA,EAAA,CAAA,EAAM,KAAK,CAAA;AAAA,MAC3D;AAAA,IACF;AAAA,GACF;AACF;;;ACpKA,IAAM,SAAA,GAAY,OAAO,SAAA,KAAc,WAAA;AAEvC,IAAM,YAAA,GAAe,CACnB,MAAA,EACA,SAAA,KACyB;AACzB,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,IAAI,KAAA,CAAM,4BAA4B,CAAC,CAAA;AAAA,EAC/D;AACA,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;;;ACrHO,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,QAAA,EAAU,UAAA;AAAA,EACV,UAAA,EAAY,YAAA;AAAA,EACZ,aAAA,EAAe,eAAA;AAAA,EACf,gBAAA,EAAkB,iBAAA;AAAA,EAClB,4BAAA,EAA8B,2BAAA;AAAA,EAC9B,qBAAA,EAAuB,uBAAA;AAAA,EACvB,cAAA,EAAgB,gBAAA;AAAA,EAChB,UAAA,EAAY,YAAA;AAAA,EACZ,gBAAA,EAAkB,kBAAA;AAAA,EAClB,WAAA,EAAa,aAAA;AAAA,EACb,qBAAA,EAAuB;AACzB;;;ACTA,IAAM,eAAA,GAAkB,aAAA;AACxB,IAAM,kBAAA,GAAqB,gBAAA;AAC3B,IAAM,oBAAA,GAAuB,6BAAA;AAE7B,IAAMA,UAAAA,GAAY,OAAO,SAAA,KAAc,WAAA;AAEvC,IAAM,gBAAA,GAAmB,CAAC,OAAA,KACxB,OAAA,CAAQ,SAAS,GAAG,CAAA,GAAI,OAAA,GAAU,CAAA,EAAG,OAAO,CAAA,CAAA,CAAA;AAE9C,IAAMC,aAAAA,GAAe,CACnB,MAAA,EACA,SAAA,KACyB;AACzB,EAAA,IAAI,CAACD,UAAAA,EAAW;AACd,IAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,IAAI,KAAA,CAAM,4BAA4B,CAAC,CAAA;AAAA,EAC/D;AAEA,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,MAAM,QAAQ,EAAA,CAAG,iBAAA,CAAkB,WAAW,EAAE,OAAA,EAAS,MAAM,CAAA;AAC/D,QAAA,KAAA,CAAM,YAAY,WAAA,EAAa,WAAA,EAAa,EAAE,MAAA,EAAQ,OAAO,CAAA;AAC7D,QAAA,KAAA,CAAM,YAAY,SAAA,EAAW,SAAA,EAAW,EAAE,MAAA,EAAQ,OAAO,CAAA;AACzD,QAAA,KAAA,CAAM,YAAY,SAAA,EAAW,SAAA,EAAW,EAAE,MAAA,EAAQ,OAAO,CAAA;AACzD,QAAA,KAAA,CAAM,YAAY,WAAA,EAAa,WAAA,EAAa,EAAE,MAAA,EAAQ,OAAO,CAAA;AAC7D,QAAA,KAAA,CAAM,YAAY,QAAA,EAAU,QAAA,EAAU,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,MACzD;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;AAEA,IAAM,cAAA,GAAiB,CACrB,KAAA,EACA,OAAA,GAAmD,EAAC,KACxC;AACZ,EAAA,IAAI,OAAO,OAAA,CAAQ,MAAA,KAAW,YAAY,KAAA,CAAM,SAAA,IAAa,QAAQ,MAAA,EAAQ;AAC3E,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,OAAA,CAAQ,KAAA,KAAU,YAAY,KAAA,CAAM,SAAA,IAAa,QAAQ,KAAA,EAAO;AACzE,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAA,CAAQ,OAAA,IAAW,KAAA,CAAM,OAAA,KAAY,QAAQ,OAAA,EAAS;AACxD,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAA,CAAQ,WAAW,gBAAA,CAAiB,KAAA,CAAM,OAAO,CAAA,KAAM,gBAAA,CAAiB,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC5F,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAA,CAAQ,SAAA,IAAa,KAAA,CAAM,SAAA,KAAc,QAAQ,SAAA,EAAW;AAC9D,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAA,CAAQ,MAAA,IAAU,KAAA,CAAM,MAAA,KAAW,QAAQ,MAAA,EAAQ;AACrD,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT,CAAA;AAEO,IAAM,kCAAA,GAAqC,CAChD,OAAA,GAA+C,EAAC,KACxB;AACxB,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,eAAA;AACjC,EAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,kBAAA;AACvC,EAAA,MAAM,sBAAsB,OAAA,CAAQ,mBAAA;AAEpC,EAAA,IAAI,SAAA,GAAyC,IAAA;AAC7C,EAAA,IAAI,gBAAA,GAAyC,IAAA;AAE7C,EAAA,MAAM,QAAQ,MAA4B;AACxC,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,SAAA,GAAYC,aAAAA,CAAa,QAAQ,SAAS,CAAA;AAAA,IAC5C;AACA,IAAA,OAAO,SAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,OAAA,GAAU,OAAO,OAAA,KAAiD;AACtE,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC1B,IAAA,MAAM,EAAA,GAAK,MAAM,KAAA,EAAM;AACvB,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,WAAA,CAAY,SAAA,EAAW,WAAW,CAAA;AAChD,MAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,WAAA,CAAY,SAAS,CAAA;AACtC,MAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,QAAA,KAAA,CAAM,GAAA,CAAI,EAAE,GAAG,KAAA,EAAO,SAAS,gBAAA,CAAiB,KAAA,CAAM,OAAO,CAAA,EAAG,CAAA;AAAA,MAClE;AACA,MAAA,EAAA,CAAG,UAAA,GAAa,MAAM,OAAA,EAAQ;AAC9B,MAAA,EAAA,CAAG,OAAA,GAAU,MAAM,MAAA,CAAO,EAAA,CAAG,KAAK,CAAA;AAAA,IACpC,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,iBAAiB,YAA2B;AAChD,IAAA,IAAI,CAAC,mBAAA,EAAqB;AAC1B,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,MAAA,gBAAA,GAAA,CAAoB,YAAY;AAC9B,QAAA,MAAM,QAAA,GAAW,MAAM,mBAAA,CAAoB,OAAA;AAAA,UACzC,oBAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,QAAA,EAAU;AAEd,QAAA,MAAM,aAAA,GAAgB,MAAM,mBAAA,CAAoB,OAAA;AAAA,UAC9C,gBAAA,CAAiB,cAAA;AAAA,UACjB;AAAC,SACH;AAEA,QAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,UAAA,MAAM,QAAQ,aAAa,CAAA;AAC3B,UAAA,MAAM,mBAAA,CAAoB,UAAA,CAAW,gBAAA,CAAiB,cAAc,CAAA;AAAA,QACtE;AAEA,QAAA,MAAM,mBAAA,CAAoB,OAAA,CAAQ,oBAAA,EAAsB,IAAI,CAAA;AAAA,MAC9D,CAAA,GAAG;AAAA,IACL;AACA,IAAA,MAAM,gBAAA;AAAA,EACR,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,OAAA,GAAyB;AAC7B,MAAA,MAAM,cAAA,EAAe;AAAA,IACvB,CAAA;AAAA,IAEA,MAAM,OAAO,KAAA,EAA0C;AACrD,MAAA,MAAM,cAAA,EAAe;AACrB,MAAA,MAAM,OAAA,CAAQ,CAAC,KAAK,CAAC,CAAA;AAAA,IACvB,CAAA;AAAA,IAEA,MAAM,WAAW,OAAA,EAA8C;AAC7D,MAAA,MAAM,cAAA,EAAe;AACrB,MAAA,MAAM,QAAQ,OAAO,CAAA;AAAA,IACvB,CAAA;AAAA,IAEA,MAAM,IAAA,CAAKC,QAAAA,GAAoC,EAAC,EAAkC;AAChF,MAAA,MAAM,cAAA,EAAe;AACrB,MAAA,MAAM,EAAA,GAAK,MAAM,KAAA,EAAM;AACvB,MAAA,OAAO,IAAI,OAAA,CAA8B,CAAC,OAAA,EAAS,MAAA,KAAW;AAC5D,QAAA,MAAM,EAAA,GAAK,EAAA,CAAG,WAAA,CAAY,SAAA,EAAW,UAAU,CAAA;AAC/C,QAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,WAAA,CAAY,SAAS,CAAA;AACtC,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,WAAW,CAAA;AACrC,QAAA,MAAM,SAAA,GAAgC,MAAA;AACtC,QAAA,MAAM,OAAA,GAAU,KAAA,CAAM,UAAA,CAAW,IAAA,EAAM,SAAS,CAAA;AAChD,QAAA,MAAM,UAAgC,EAAC;AACvC,QAAA,MAAM,QAAQA,QAAAA,CAAQ,KAAA;AAEtB,QAAA,OAAA,CAAQ,YAAY,MAAM;AACxB,UAAA,MAAM,SAAS,OAAA,CAAQ,MAAA;AACvB,UAAA,IAAI,CAAC,MAAA,EAAQ;AACX,YAAA,OAAA,CAAQ,OAAO,CAAA;AACf,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,UAAA,IAAI,cAAA,CAAe,KAAA,EAAOA,QAAO,CAAA,EAAG;AAClC,YAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAClB,YAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,OAAA,CAAQ,UAAU,KAAA,EAAO;AACxD,cAAA,OAAA,CAAQ,OAAO,CAAA;AACf,cAAA;AAAA,YACF;AAAA,UACF;AACA,UAAA,MAAA,CAAO,QAAA,EAAS;AAAA,QAClB,CAAA;AAEA,QAAA,OAAA,CAAQ,OAAA,GAAU,MAAM,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AAAA,MAC9C,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,KAAA,CAAMA,QAAAA,GAAmD,EAAC,EAAoB;AAClF,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,IAAA,CAAKA,QAAO,CAAA;AACvC,MAAA,OAAO,OAAA,CAAQ,MAAA;AAAA,IACjB,CAAA;AAAA,IAEA,MAAM,gBAAgB,SAAA,EAAoC;AACxD,MAAA,MAAM,cAAA,EAAe;AACrB,MAAA,MAAM,EAAA,GAAK,MAAM,KAAA,EAAM;AACvB,MAAA,OAAO,IAAI,OAAA,CAAgB,CAAC,OAAA,EAAS,MAAA,KAAW;AAC9C,QAAA,MAAM,EAAA,GAAK,EAAA,CAAG,WAAA,CAAY,SAAA,EAAW,WAAW,CAAA;AAChD,QAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,WAAA,CAAY,SAAS,CAAA;AACtC,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,WAAW,CAAA;AACrC,QAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,UAAA,CAAW,SAAA,EAAW,IAAI,CAAA;AACpD,QAAA,MAAM,OAAA,GAAU,KAAA,CAAM,UAAA,CAAW,KAAK,CAAA;AACtC,QAAA,IAAI,OAAA,GAAU,CAAA;AAEd,QAAA,OAAA,CAAQ,YAAY,MAAM;AACxB,UAAA,MAAM,SAAS,OAAA,CAAQ,MAAA;AACvB,UAAA,IAAI,CAAC,MAAA,EAAQ;AACX,YAAA,OAAA,CAAQ,OAAO,CAAA;AACf,YAAA;AAAA,UACF;AACA,UAAA,OAAA,IAAW,CAAA;AACX,UAAA,MAAA,CAAO,MAAA,EAAO;AACd,UAAA,MAAA,CAAO,QAAA,EAAS;AAAA,QAClB,CAAA;AAEA,QAAA,OAAA,CAAQ,OAAA,GAAU,MAAM,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AAAA,MAC9C,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,KAAA,GAAuB;AAC3B,MAAA,MAAM,cAAA,EAAe;AACrB,MAAA,MAAM,EAAA,GAAK,MAAM,KAAA,EAAM;AACvB,MAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,QAAA,MAAM,EAAA,GAAK,EAAA,CAAG,WAAA,CAAY,SAAA,EAAW,WAAW,CAAA;AAChD,QAAA,EAAA,CAAG,WAAA,CAAY,SAAS,CAAA,CAAE,KAAA,EAAM;AAChC,QAAA,EAAA,CAAG,UAAA,GAAa,MAAM,OAAA,EAAQ;AAC9B,QAAA,EAAA,CAAG,OAAA,GAAU,MAAM,MAAA,CAAO,EAAA,CAAG,KAAK,CAAA;AAAA,MACpC,CAAC,CAAA;AAAA,IACH;AAAA,GACF;AACF;;;ACzMA,IAAMC,qBAAAA,GAAuB,6BAAA;AAE7B,IAAMC,iBAAAA,GAAmB,CAAC,OAAA,KACxB,OAAA,CAAQ,SAAS,GAAG,CAAA,GAAI,OAAA,GAAU,CAAA,EAAG,OAAO,CAAA,CAAA,CAAA;AAE9C,IAAMC,SAAQ,MAAe;AAC3B,EAAA,OAAO,OAAO,OAAA,CAAQ,QAAA,CAAS,GAAA,KAAQ,WAAA;AACzC,CAAA;AAEA,IAAIC,eAAAA,GAAsB,IAAA;AAE1B,IAAMC,aAAAA,GAAe,OAAO,MAAA,KAAmD;AAC7E,EAAA,IAAIF,QAAM,EAAG;AACX,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI;AACF,IAAA,IAAI,CAACC,eAAAA,EAAgB;AACnB,MAAAA,eAAAA,GAAAA,CAAkB,MAAM,OAAO,gBAAgB,CAAA,EAAG,OAAA;AAAA,IACpD;AACA,IAAA,OAAO,IAAIA,gBAAe,MAAM,CAAA;AAAA,EAClC,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,4FAA4F,KAAK,CAAA,CAAA;AAAA,KACnG;AAAA,EACF;AACF,CAAA;AAEA,IAAM,gBAAA,GAAmB,CACvB,OAAA,GAAmD,EAAC,KACb;AACvC,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,MAAM,SAAoB,EAAC;AAE3B,EAAA,IAAI,OAAO,OAAA,CAAQ,MAAA,KAAW,QAAA,EAAU;AACtC,IAAA,OAAA,CAAQ,KAAK,eAAe,CAAA;AAC5B,IAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,MAAM,CAAA;AAAA,EAC5B;AACA,EAAA,IAAI,OAAO,OAAA,CAAQ,KAAA,KAAU,QAAA,EAAU;AACrC,IAAA,OAAA,CAAQ,KAAK,eAAe,CAAA;AAC5B,IAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,KAAK,CAAA;AAAA,EAC3B;AACA,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,OAAA,CAAQ,KAAK,cAAc,CAAA;AAC3B,IAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,OAAO,CAAA;AAAA,EAC7B;AACA,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,OAAA,CAAQ,KAAK,cAAc,CAAA;AAC3B,IAAA,MAAA,CAAO,IAAA,CAAKF,iBAAAA,CAAiB,OAAA,CAAQ,OAAO,CAAC,CAAA;AAAA,EAC/C;AACA,EAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,IAAA,OAAA,CAAQ,KAAK,gBAAgB,CAAA;AAC7B,IAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,SAAS,CAAA;AAAA,EAC/B;AACA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,OAAA,CAAQ,KAAK,YAAY,CAAA;AACzB,IAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,MAAM,CAAA;AAAA,EAC5B;AAEA,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,QAAQ,MAAA,GAAS,CAAA,GAAI,SAAS,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AAAA,IAC7D;AAAA,GACF;AACF,CAAA;AAEO,IAAM,+BAAA,GAAkC,CAC7C,OAAA,GAA4C,EAAC,KACrB;AACxB,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,gBAAA;AACjC,EAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,gBAAA;AACvC,EAAA,MAAM,sBAAsB,OAAA,CAAQ,mBAAA;AAEpC,EAAA,IAAI,EAAA;AACJ,EAAA,IAAI,UAAA;AAEJ,EAAA,IAAI,iBAAA,GAAoB,KAAA;AAExB,EAAA,MAAM,SAAS,YAAY;AACzB,IAAA,IAAI,CAAC,EAAA,EAAI;AACP,MAAA,EAAA,GAAK,MAAMG,cAAa,MAAM,CAAA;AAC9B,MAAA,EAAA,CAAG,IAAA,CAAK;AAAA,mCAAA,EACuB,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uCAAA,EAeL,SAAS,iBAAiB,SAAS,CAAA;AAAA,uCAAA,EACnC,SAAS,gBAAgB,SAAS,CAAA;AAAA,uCAAA,EAClC,SAAS,gBAAgB,SAAS,CAAA;AAAA,uCAAA,EAClC,SAAS,kBAAkB,SAAS,CAAA;AAAA,uCAAA,EACpC,SAAS,cAAc,SAAS,CAAA;AAAA,MAAA,CAClE,CAAA;AAED,MAAA,UAAA,GAAa,GAAG,OAAA,CAAQ;AAAA,+BAAA,EACG,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAKnC,CAAA;AAAA,IACH;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,aAAa,YAAY;AAC7B,IAAA,IAAI,CAAC,EAAA,EAAI;AACP,MAAA,MAAM,MAAA,EAAO;AAAA,IACf;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAAoC;AACrD,IAAA,UAAA,CAAW,GAAA;AAAA,MACT,KAAA,CAAM,EAAA;AAAA,MACN,KAAA,CAAM,SAAA;AAAA,MACN,KAAA,CAAM,OAAA;AAAA,MACNH,iBAAAA,CAAiB,MAAM,OAAO,CAAA;AAAA,MAC9B,KAAA,CAAM,SAAA;AAAA,MACN,KAAA,CAAM,IAAA;AAAA,MACN,KAAA,CAAM,QAAA;AAAA,MACN,KAAA,CAAM,YAAA;AAAA,MACN,KAAA,CAAM,gBAAA;AAAA,MACN,KAAA,CAAM,WAAA;AAAA,MACN,MAAM,MAAA,IAAU,IAAA;AAAA,MAChB,MAAM,SAAA,IAAa,IAAA;AAAA,MACnB,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,IAAA,IAAQ,EAAE;AAAA,KACjC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,iBAAiB,YAA2B;AAChD,IAAA,IAAI,CAAC,uBAAuB,iBAAA,EAAmB;AAE/C,IAAA,MAAM,QAAA,GAAW,MAAM,mBAAA,CAAoB,OAAA;AAAA,MACzCD,qBAAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,iBAAA,GAAoB,IAAA;AACpB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,aAAA,GAAgB,MAAM,mBAAA,CAAoB,OAAA;AAAA,MAC9C,gBAAA,CAAiB,cAAA;AAAA,MACjB;AAAC,KACH;AAEA,IAAA,KAAA,MAAW,SAAS,aAAA,EAAe;AACjC,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB;AAEA,IAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,MAAA,MAAM,mBAAA,CAAoB,UAAA,CAAW,gBAAA,CAAiB,cAAc,CAAA;AAAA,IACtE;AACA,IAAA,MAAM,mBAAA,CAAoB,OAAA,CAAQA,qBAAAA,EAAsB,IAAI,CAAA;AAC5D,IAAA,iBAAA,GAAoB,IAAA;AAAA,EACtB,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,CAAC,GAAA,MAAkC;AAAA,IAChD,IAAI,GAAA,CAAI,EAAA;AAAA,IACR,WAAW,GAAA,CAAI,SAAA;AAAA,IACf,SAAS,GAAA,CAAI,QAAA;AAAA,IACb,SAAS,GAAA,CAAI,QAAA;AAAA,IACb,WAAW,GAAA,CAAI,UAAA;AAAA,IACf,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,UAAU,GAAA,CAAI,SAAA;AAAA,IACd,cAAc,GAAA,CAAI,aAAA;AAAA,IAClB,kBAAkB,GAAA,CAAI,iBAAA;AAAA,IACtB,aAAa,GAAA,CAAI,YAAA;AAAA,IACjB,MAAA,EAAQ,IAAI,MAAA,IAAU,MAAA;AAAA,IACtB,SAAA,EAAW,IAAI,UAAA,IAAc,MAAA;AAAA,IAC7B,IAAA,EAAM,OAAO,GAAA,CAAI,IAAA,KAAS,WAAW,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA,GAAI;AAAA,GAC9D,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,OAAA,GAAyB;AAC7B,MAAA,MAAM,UAAA,EAAW;AACjB,MAAA,MAAM,cAAA,EAAe;AAAA,IACvB,CAAA;AAAA,IAEA,MAAM,OAAO,KAAA,EAA0C;AACrD,MAAA,MAAM,UAAA,EAAW;AACjB,MAAA,MAAM,cAAA,EAAe;AACrB,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB,CAAA;AAAA,IAEA,MAAM,WAAW,OAAA,EAA8C;AAC7D,MAAA,MAAM,UAAA,EAAW;AACjB,MAAA,MAAM,cAAA,EAAe;AACrB,MAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,QAAA,SAAA,CAAU,KAAK,CAAA;AAAA,MACjB;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,IAAA,CAAKD,QAAAA,GAAoC,EAAC,EAAkC;AAChF,MAAA,MAAM,UAAA,EAAW;AACjB,MAAA,MAAM,cAAA,EAAe;AACrB,MAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAO,GAAI,iBAAiBA,QAAO,CAAA;AAChD,MAAA,MAAM,QAAA,GAAW,OAAOA,QAAAA,CAAQ,KAAA,KAAU,WAAW,UAAA,GAAa,EAAA;AAClE,MAAA,MAAM,OAAO,EAAA,CAAG,OAAA;AAAA,QACd,CAAA,cAAA,EAAiB,SAAS,CAAA,CAAA,EAAI,GAAG,2BAA2B,QAAQ,CAAA;AAAA,OACtE;AACA,MAAA,MAAM,OAAO,IAAA,CAAK,GAAA;AAAA,QAChB,GAAI,OAAOA,QAAAA,CAAQ,KAAA,KAAU,QAAA,GAAW,CAAC,GAAG,MAAA,EAAQA,QAAAA,CAAQ,KAAK,CAAA,GAAI;AAAA,OACvE;AACA,MAAA,OAAO,IAAA,CAAK,IAAI,MAAM,CAAA;AAAA,IACxB,CAAA;AAAA,IAEA,MAAM,KAAA,CAAMA,QAAAA,GAAmD,EAAC,EAAoB;AAClF,MAAA,MAAM,UAAA,EAAW;AACjB,MAAA,MAAM,cAAA,EAAe;AACrB,MAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAO,GAAI,iBAAiBA,QAAO,CAAA;AAChD,MAAA,MAAM,OAAO,EAAA,CAAG,OAAA,CAAQ,iCAAiC,SAAS,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAA;AAC3E,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAG,MAAM,CAAA;AAC9B,MAAA,OAAO,MAAA,CAAO,GAAA,EAAK,KAAA,IAAS,CAAC,CAAA;AAAA,IAC/B,CAAA;AAAA,IAEA,MAAM,gBAAgB,SAAA,EAAoC;AACxD,MAAA,MAAM,UAAA,EAAW;AACjB,MAAA,MAAM,cAAA,EAAe;AACrB,MAAA,MAAM,IAAA,GAAO,EAAA,CAAG,OAAA,CAAQ,CAAA,YAAA,EAAe,SAAS,CAAA,oBAAA,CAAsB,CAAA;AACtE,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA;AACjC,MAAA,OAAO,MAAA,CAAO,OAAA;AAAA,IAChB,CAAA;AAAA,IAEA,MAAM,KAAA,GAAuB;AAC3B,MAAA,MAAM,UAAA,EAAW;AACjB,MAAA,MAAM,cAAA,EAAe;AACrB,MAAA,EAAA,CAAG,OAAA,CAAQ,CAAA,YAAA,EAAe,SAAS,CAAA,CAAE,EAAE,GAAA,EAAI;AAAA,IAC7C;AAAA,GACF;AACF;;;AC5PA,IAAMC,qBAAAA,GAAuB,6BAAA;AAE7B,IAAMC,iBAAAA,GAAmB,CAAC,OAAA,KACxB,OAAA,CAAQ,SAAS,GAAG,CAAA,GAAI,OAAA,GAAU,CAAA,EAAG,OAAO,CAAA,CAAA,CAAA;AAE9C,IAAMI,iBAAAA,GAAmB,CACvB,OAAA,GAAmD,EAAC,KACb;AACvC,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,MAAM,SAAoB,EAAC;AAE3B,EAAA,IAAI,OAAO,OAAA,CAAQ,MAAA,KAAW,QAAA,EAAU;AACtC,IAAA,OAAA,CAAQ,KAAK,eAAe,CAAA;AAC5B,IAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,MAAM,CAAA;AAAA,EAC5B;AACA,EAAA,IAAI,OAAO,OAAA,CAAQ,KAAA,KAAU,QAAA,EAAU;AACrC,IAAA,OAAA,CAAQ,KAAK,eAAe,CAAA;AAC5B,IAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,KAAK,CAAA;AAAA,EAC3B;AACA,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,OAAA,CAAQ,KAAK,cAAc,CAAA;AAC3B,IAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,OAAO,CAAA;AAAA,EAC7B;AACA,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,OAAA,CAAQ,KAAK,cAAc,CAAA;AAC3B,IAAA,MAAA,CAAO,IAAA,CAAKJ,iBAAAA,CAAiB,OAAA,CAAQ,OAAO,CAAC,CAAA;AAAA,EAC/C;AACA,EAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,IAAA,OAAA,CAAQ,KAAK,gBAAgB,CAAA;AAC7B,IAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,SAAS,CAAA;AAAA,EAC/B;AACA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,OAAA,CAAQ,KAAK,YAAY,CAAA;AACzB,IAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,MAAM,CAAA;AAAA,EAC5B;AAEA,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,QAAQ,MAAA,GAAS,CAAA,GAAI,SAAS,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AAAA,IAC7D;AAAA,GACF;AACF,CAAA;AAYO,IAAM,kCAAA,GAAqC,CAChD,OAAA,GAA+C,EAAC,KACxB;AACxB,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,gBAAA;AACjC,EAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,gBAAA;AACvC,EAAA,MAAM,sBAAsB,OAAA,CAAQ,mBAAA;AACpC,EAAA,MAAM,cAAA,GAAiB,QAAQ,MAAA,EAAQ,QAAA;AAEvC,EAAA,IAAI,gBAAA,GAAyC,IAAA;AAE7C,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,EAAA,GAAK,IAAI,cAAA,CAAe,MAAM,CAAA;AAEpC,EAAA,EAAA,CAAG,GAAA,CAAI;AAAA,+BAAA,EACwB,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAevC,CAAA;AAED,EAAA,EAAA,CAAG,GAAA,CAAI,CAAA,+BAAA,EAAkC,SAAS,CAAA,cAAA,EAAiB,SAAS,CAAA,WAAA,CAAa,CAAA;AACzF,EAAA,EAAA,CAAG,GAAA,CAAI,CAAA,+BAAA,EAAkC,SAAS,CAAA,aAAA,EAAgB,SAAS,CAAA,UAAA,CAAY,CAAA;AACvF,EAAA,EAAA,CAAG,GAAA,CAAI,CAAA,+BAAA,EAAkC,SAAS,CAAA,aAAA,EAAgB,SAAS,CAAA,UAAA,CAAY,CAAA;AAEvF,EAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAAoC;AACrD,IAAA,EAAA,CAAG,KAAA,CAAM;AAAA,6BAAA,EACkB,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAKnC,CAAA,CAAE,GAAA;AAAA,MACD,KAAA,CAAM,EAAA;AAAA,MACN,KAAA,CAAM,SAAA;AAAA,MACN,KAAA,CAAM,OAAA;AAAA,MACNA,iBAAAA,CAAiB,MAAM,OAAO,CAAA;AAAA,MAC9B,KAAA,CAAM,SAAA;AAAA,MACN,KAAA,CAAM,IAAA;AAAA,MACN,KAAA,CAAM,QAAA;AAAA,MACN,KAAA,CAAM,YAAA;AAAA,MACN,KAAA,CAAM,gBAAA;AAAA,MACN,KAAA,CAAM,WAAA;AAAA,MACN,MAAM,MAAA,IAAU,IAAA;AAAA,MAChB,MAAM,SAAA,IAAa,IAAA;AAAA,MACnB,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,IAAA,IAAQ,EAAE;AAAA,KACjC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,CAAC,GAAA,MAAkC;AAAA,IAChD,IAAI,GAAA,CAAI,EAAA;AAAA,IACR,WAAW,GAAA,CAAI,SAAA;AAAA,IACf,SAAS,GAAA,CAAI,QAAA;AAAA,IACb,SAAS,GAAA,CAAI,QAAA;AAAA,IACb,WAAW,GAAA,CAAI,UAAA;AAAA,IACf,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,UAAU,GAAA,CAAI,SAAA;AAAA,IACd,cAAc,GAAA,CAAI,aAAA;AAAA,IAClB,kBAAkB,GAAA,CAAI,iBAAA;AAAA,IACtB,aAAa,GAAA,CAAI,YAAA;AAAA,IACjB,MAAA,EAAQ,IAAI,MAAA,IAAU,MAAA;AAAA,IACtB,SAAA,EAAW,IAAI,UAAA,IAAc,MAAA;AAAA,IAC7B,IAAA,EAAM,OAAO,GAAA,CAAI,IAAA,KAAS,WAAW,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA,GAAI;AAAA,GAC9D,CAAA;AAEA,EAAA,MAAM,iBAAiB,YAA2B;AAChD,IAAA,IAAI,CAAC,mBAAA,EAAqB;AAC1B,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,MAAA,gBAAA,GAAA,CAAoB,YAAY;AAC9B,QAAA,MAAM,QAAA,GAAW,MAAM,mBAAA,CAAoB,OAAA;AAAA,UACzCD,qBAAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,QAAA,EAAU;AAEd,QAAA,MAAM,aAAA,GAAgB,MAAM,mBAAA,CAAoB,OAAA;AAAA,UAC9C,gBAAA,CAAiB,cAAA;AAAA,UACjB;AAAC,SACH;AAEA,QAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,UAAA,KAAA,MAAW,SAAS,aAAA,EAAe;AACjC,YAAA,SAAA,CAAU,KAAK,CAAA;AAAA,UACjB;AACA,UAAA,MAAM,mBAAA,CAAoB,UAAA,CAAW,gBAAA,CAAiB,cAAc,CAAA;AAAA,QACtE;AAEA,QAAA,MAAM,mBAAA,CAAoB,OAAA,CAAQA,qBAAAA,EAAsB,IAAI,CAAA;AAAA,MAC9D,CAAA,GAAG;AAAA,IACL;AACA,IAAA,MAAM,gBAAA;AAAA,EACR,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,OAAA,GAAyB;AAC7B,MAAA,MAAM,cAAA,EAAe;AAAA,IACvB,CAAA;AAAA,IAEA,MAAM,OAAO,KAAA,EAA0C;AACrD,MAAA,MAAM,cAAA,EAAe;AACrB,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB,CAAA;AAAA,IAEA,MAAM,WAAW,OAAA,EAA8C;AAC7D,MAAA,MAAM,cAAA,EAAe;AACrB,MAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,QAAA,SAAA,CAAU,KAAK,CAAA;AAAA,MACjB;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,IAAA,CAAKD,QAAAA,GAAoC,EAAC,EAAkC;AAChF,MAAA,MAAM,cAAA,EAAe;AACrB,MAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAO,GAAIM,kBAAiBN,QAAO,CAAA;AAChD,MAAA,MAAM,QAAA,GAAW,OAAOA,QAAAA,CAAQ,KAAA,KAAU,WAAW,UAAA,GAAa,EAAA;AAClE,MAAA,MAAM,QAAQ,CAAA,cAAA,EAAiB,SAAS,CAAA,CAAA,EAAI,GAAG,2BAA2B,QAAQ,CAAA,CAAA;AAElF,MAAA,IAAI,IAAA;AACJ,MAAA,IAAI,OAAOA,QAAAA,CAAQ,KAAA,KAAU,QAAA,EAAU;AACrC,QAAA,IAAA,GAAO,EAAA,CAAG,MAAM,KAAK,CAAA,CAAE,IAAI,GAAG,MAAA,EAAQA,SAAQ,KAAK,CAAA;AAAA,MACrD,CAAA,MAAO;AACL,QAAA,IAAA,GAAO,GAAG,KAAA,CAAM,KAAK,CAAA,CAAE,GAAA,CAAI,GAAG,MAAM,CAAA;AAAA,MACtC;AAEA,MAAA,OAAO,IAAA,CAAK,IAAI,MAAM,CAAA;AAAA,IACxB,CAAA;AAAA,IAEA,MAAM,KAAA,CAAMA,QAAAA,GAAmD,EAAC,EAAoB;AAClF,MAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAO,GAAIM,kBAAiBN,QAAO,CAAA;AAChD,MAAA,MAAM,KAAA,GAAQ,CAAA,8BAAA,EAAiC,SAAS,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAC/D,MAAA,MAAM,MAAM,EAAA,CAAG,KAAA,CAAM,KAAK,CAAA,CAAE,GAAA,CAAI,GAAG,MAAM,CAAA;AACzC,MAAA,OAAO,MAAA,CAAO,GAAA,EAAK,KAAA,IAAS,CAAC,CAAA;AAAA,IAC/B,CAAA;AAAA,IAEA,MAAM,gBAAgB,SAAA,EAAoC;AACxD,MAAA,MAAM,cAAA,EAAe;AACrB,MAAA,MAAM,MAAA,GAAS,SAAA;AACf,MAAA,MAAM,MAAA,GAAS,GAAG,KAAA,CAAM,CAAA,YAAA,EAAe,SAAS,CAAA,oBAAA,CAAsB,CAAA,CAAE,IAAI,MAAM,CAAA;AAClF,MAAA,OAAO,OAAO,OAAA,IAAW,CAAA;AAAA,IAC3B,CAAA;AAAA,IAEA,MAAM,KAAA,GAAuB;AAC3B,MAAA,MAAM,cAAA,EAAe;AACrB,MAAA,EAAA,CAAG,KAAA,CAAM,CAAA,YAAA,EAAe,SAAS,CAAA,CAAE,EAAE,GAAA,EAAI;AAAA,IAC3C;AAAA,GACF;AACF;;;ACzNA,IAAME,iBAAAA,GAAmB,CAAC,OAAA,KACxB,OAAA,CAAQ,SAAS,GAAG,CAAA,GAAI,OAAA,GAAU,CAAA,EAAG,OAAO,CAAA,CAAA,CAAA;AAE9C,IAAMK,eAAAA,GAAiB,CACrB,KAAA,EACA,OAAA,GAAmD,EAAC,KACxC;AACZ,EAAA,IAAI,OAAO,OAAA,CAAQ,MAAA,KAAW,YAAY,KAAA,CAAM,SAAA,IAAa,QAAQ,MAAA,EAAQ;AAC3E,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,OAAA,CAAQ,KAAA,KAAU,YAAY,KAAA,CAAM,SAAA,IAAa,QAAQ,KAAA,EAAO;AACzE,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAA,CAAQ,OAAA,IAAW,KAAA,CAAM,OAAA,KAAY,QAAQ,OAAA,EAAS;AACxD,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAA,CAAQ,WAAWL,iBAAAA,CAAiB,KAAA,CAAM,OAAO,CAAA,KAAMA,iBAAAA,CAAiB,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC5F,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAA,CAAQ,SAAA,IAAa,KAAA,CAAM,SAAA,KAAc,QAAQ,SAAA,EAAW;AAC9D,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAA,CAAQ,MAAA,IAAU,KAAA,CAAM,MAAA,KAAW,QAAQ,MAAA,EAAQ;AACrD,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT,CAAA;AAEO,IAAM,+BAAA,GAAkC,CAC7C,IAAA,GAA6B,EAAC,KACN;AACxB,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAgC;AAElD,EAAA,KAAA,MAAW,SAAS,IAAA,EAAM;AACxB,IAAA,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,EAAE,GAAG,KAAA,EAAO,OAAA,EAASA,iBAAAA,CAAiB,KAAA,CAAM,OAAO,CAAA,EAAG,CAAA;AAAA,EAC5E;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,OAAA,GAAyB;AAC7B,MAAA;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,OAAO,KAAA,EAA0C;AACrD,MAAA,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,EAAE,GAAG,KAAA,EAAO,OAAA,EAASA,iBAAAA,CAAiB,KAAA,CAAM,OAAO,CAAA,EAAG,CAAA;AAAA,IAC5E,CAAA;AAAA,IAEA,MAAM,WAAW,OAAA,EAA8C;AAC7D,MAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,QAAA,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,EAAE,GAAG,KAAA,EAAO,OAAA,EAASA,iBAAAA,CAAiB,KAAA,CAAM,OAAO,CAAA,EAAG,CAAA;AAAA,MAC5E;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,IAAA,CAAK,OAAA,GAAoC,EAAC,EAAkC;AAChF,MAAA,MAAM,OAAA,GAAU,CAAC,GAAG,KAAA,CAAM,QAAQ,CAAA,CAC/B,MAAA,CAAO,CAAC,KAAA,KAAUK,eAAAA,CAAe,OAAO,OAAO,CAAC,EAChD,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,SAAS,CAAA;AAC3C,MAAA,IAAI,OAAO,OAAA,CAAQ,KAAA,KAAU,QAAA,EAAU;AACrC,QAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,OAAA,CAAQ,KAAK,CAAA;AAAA,MACvC;AACA,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,KAAA,CAAM,OAAA,GAAmD,EAAC,EAAoB;AAClF,MAAA,OAAA,CAAQ,MAAM,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA,EAAG,MAAA;AAAA,IACpC,CAAA;AAAA,IAEA,MAAM,gBAAgB,SAAA,EAAoC;AACxD,MAAA,IAAI,OAAA,GAAU,CAAA;AACd,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,KAAK,CAAA,IAAK,KAAA,CAAM,SAAQ,EAAG;AACzC,QAAA,IAAI,KAAA,CAAM,YAAY,SAAA,EAAW;AAC/B,UAAA,KAAA,CAAM,OAAO,EAAE,CAAA;AACf,UAAA,OAAA,IAAW,CAAA;AAAA,QACb;AAAA,MACF;AACA,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,KAAA,GAAuB;AAC3B,MAAA,KAAA,CAAM,KAAA,EAAM;AAAA,IACd;AAAA,GACF;AACF;AC5EA,IAAML,iBAAAA,GAAmB,CAAC,OAAA,KACxB,OAAA,CAAQ,SAAS,GAAG,CAAA,GAAI,OAAA,GAAU,CAAA,EAAG,OAAO,CAAA,CAAA,CAAA;AAuF9C,IAAM,mBAAmB,CAAC,MAAA,KACxB,WAAA,CAA6B,CAAC,KAAK,GAAA,MAAS;AAAA,EAC1C,wBAAwB,EAAC;AAAA,EACzB,aAAA,EAAe,IAAA;AAAA,EACf,cAAc,EAAC;AAAA,EACf,kBAAA,EAAoB,IAAA;AAAA,EACpB,mBAAmB,EAAC;AAAA,EACpB,uBAAuB,EAAC;AAAA,EACxB,sBAAsB,EAAC;AAAA,EACvB,kBAAkB,EAAC;AAAA,EACnB,SAAS,EAAC;AAAA,EACV,WAAW,EAAC;AAAA,EACZ,cAAc,EAAC;AAAA,EACf,iBAAiB,EAAC;AAAA,EAClB,yBAAA,EAA2B,IAAA;AAAA,EAC3B,qBAAqB,EAAC;AAAA,EACtB,WAAW,EAAC;AAAA,EACZ,iBAAiB,EAAC;AAAA,EAClB,YAAY,EAAC;AAAA,EACb,qBAAqB,EAAC;AAAA,EACtB,yBAAA,EAA2B,CAAC,KAAA,KAAU;AACpC,IAAA,MAAM,aAAsC,EAAC;AAC7C,IAAA,KAAA,MAAW,CAAC,OAAA,EAAS,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AACrD,MAAA,UAAA,CAAWA,iBAAAA,CAAiB,OAAO,CAAC,CAAA,GAAI,MAAA;AAAA,IAC1C;AACA,IAAA,KAAK,MAAA,CAAO,OAAA;AAAA,MACV,gBAAA,CAAiB,yBAAA;AAAA,MACjB;AAAA,KACF;AACA,IAAA,GAAA,CAAI,EAAE,sBAAA,EAAwB,UAAA,EAAY,CAAA;AAAA,EAC5C,CAAA;AAAA,EACA,gBAAA,EAAkB,CAAC,KAAA,KAAU;AAC3B,IAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,eAAA,EAAiB,KAAK,CAAA;AAC3D,IAAA,GAAA,CAAI,EAAE,aAAA,EAAe,KAAA,EAAO,CAAA;AAAA,EAC9B,CAAA;AAAA,EACA,eAAA,EAAiB,CAAC,KAAA,KAAU;AAC1B,IAAA,MAAM,aAAa,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,KAAQA,iBAAAA,CAAiB,GAAG,CAAC,CAAA;AAC3D,IAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,cAAA,EAAgB,UAAU,CAAA;AAC/D,IAAA,GAAA,CAAI,EAAE,YAAA,EAAc,UAAA,EAAY,CAAA;AAAA,EAClC,CAAA;AAAA,EACA,qBAAA,EAAuB,CAAC,KAAA,KAAU;AAChC,IAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,qBAAA,EAAuB,KAAK,CAAA;AACjE,IAAA,GAAA,CAAI,EAAE,kBAAA,EAAoB,KAAA,EAAO,CAAA;AAAA,EACnC,CAAA;AAAA,EACA,oBAAA,EAAsB,CAAC,KAAA,KAAU;AAC/B,IAAA,MAAM,aAAa,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,KAAQA,iBAAAA,CAAiB,GAAG,CAAC,CAAA;AAC3D,IAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,kBAAA,EAAoB,UAAU,CAAA;AACnE,IAAA,GAAA,CAAI,EAAE,iBAAA,EAAmB,UAAA,EAAY,CAAA;AAAA,EACvC,CAAA;AAAA,EACA,wBAAA,EAA0B,CAAC,KAAA,KAAU;AACnC,IAAA,MAAM,aAAuC,EAAC;AAC9C,IAAA,KAAA,MAAW,CAAC,OAAA,EAAS,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AACpD,MAAA,UAAA,CAAWA,iBAAAA,CAAiB,OAAO,CAAC,CAAA,GAAI,KAAA,CAAM,GAAA;AAAA,QAAI,CAAC,IAAA,KACjD,IAAA,CAAK,QAAA,CAAS,GAAG,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI;AAAA,OAC3C;AAAA,IACF;AACA,IAAA,KAAK,MAAA,CAAO,OAAA;AAAA,MACV,gBAAA,CAAiB,wBAAA;AAAA,MACjB;AAAA,KACF;AACA,IAAA,GAAA,CAAI,EAAE,qBAAA,EAAuB,UAAA,EAAY,CAAA;AAAA,EAC3C,CAAA;AAAA,EACA,uBAAA,EAAyB,CAAC,KAAA,KAAU;AAClC,IAAA,MAAM,aAA2C,EAAC;AAClD,IAAA,KAAA,MAAW,CAAC,OAAA,EAAS,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AACnD,MAAA,UAAA,CAAWA,iBAAAA,CAAiB,OAAO,CAAC,CAAA,GAAI,IAAA;AAAA,IAC1C;AACA,IAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,uBAAA,EAAyB,UAAU,CAAA;AACxE,IAAA,GAAA,CAAI,EAAE,oBAAA,EAAsB,UAAA,EAAY,CAAA;AAAA,EAC1C,CAAA;AAAA,EACA,mBAAA,EAAqB,CAAC,KAAA,KAAU;AAC9B,IAAA,MAAM,aAAqC,EAAC;AAC5C,IAAA,KAAA,MAAW,CAAC,OAAA,EAAS,SAAS,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxD,MAAA,UAAA,CAAWA,iBAAAA,CAAiB,OAAO,CAAC,CAAA,GAAI,SAAA;AAAA,IAC1C;AACA,IAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,kBAAA,EAAoB,UAAU,CAAA;AACnE,IAAA,GAAA,CAAI,EAAE,gBAAA,EAAkB,UAAA,EAAY,CAAA;AAAA,EACtC,CAAA;AAAA,EACA,UAAA,EAAY,CAAC,KAAA,KAAU;AACrB,IAAA,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,MAAM,UACJ,OAAO,KAAA,KAAU,aAAa,KAAA,CAAM,KAAA,CAAM,OAAO,CAAA,GAAI,KAAA;AACvD,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,QACzC,GAAG,KAAA;AAAA,QACH,OAAA,EAASA,iBAAAA,CAAiB,KAAA,CAAM,OAAO,CAAA;AAAA,QACvC,OAAA,EAAS,MAAM,OAAA,IAAW,CAAA;AAAA,QAC1B,QAAA,EAAU,MAAM,QAAA,IAAY;AAAA,OAC9B,CAAE,CAAA;AACF,MAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,QAAA,EAAU,UAAU,CAAA;AACzD,MAAA,OAAO,EAAE,SAAS,UAAA,EAAW;AAAA,IAC/B,CAAC,CAAA;AAAA,EACH,CAAA;AAAA,EACA,YAAA,EAAc,CACZ,KAAA,KAYG;AACH,IAAA,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,MAAM,UACJ,OAAO,KAAA,KAAU,aAAa,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA,GAAI,KAAA;AACzD,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,QACzC,aAAA,EAAeA,iBAAAA,CAAiB,KAAA,CAAM,aAAa,CAAA;AAAA,QACnD,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,OAAA,EAAS,MAAM,OAAA,IAAW,CAAA;AAAA,QAC1B,cAAc,KAAA,CAAM,YAAA;AAAA,QACpB,cAAc,KAAA,CAAM,YAAA;AAAA,QACpB,SAAA,EAAW,KAAA,CAAM,SAAA,IAAa,IAAA,CAAK,GAAA;AAAI,OACzC,CAAE,CAAA;AACF,MAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,UAAA,EAAY,UAAU,CAAA;AAC3D,MAAA,OAAO,EAAE,WAAW,UAAA,EAAW;AAAA,IACjC,CAAC,CAAA;AAAA,EACH,CAAA;AAAA,EACA,eAAA,EAAiB,CAAC,KAAA,KAAU;AAC1B,IAAA,MAAM,aAQF,EAAC;AACL,IAAA,KAAA,MAAW,CAAC,OAAA,EAAS,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AACrD,MAAA,UAAA,CAAWA,kBAAiB,OAAO,CAAC,IAAI,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,QAC7D,GAAG,KAAA;AAAA,QACH,OAAA,EAASA,iBAAAA,CAAiB,KAAA,CAAM,OAAO,CAAA;AAAA,QACvC,SAAA,EAAW,KAAA,CAAM,SAAA,IAAa,IAAA,CAAK,GAAA,EAAI;AAAA,QACvC,QAAA,EAAU,MAAM,QAAA,IAAY;AAAA,OAC9B,CAAE,CAAA;AAAA,IACJ;AACA,IAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,aAAA,EAAe,UAAU,CAAA;AAC9D,IAAA,GAAA,CAAI,EAAE,YAAA,EAAc,UAAA,EAAY,CAAA;AAAA,EAClC,CAAA;AAAA,EACA,yBAAA,EAA2B,CAAC,KAAA,EAAO,QAAA,KAAa;AAC9C,IAAA,MAAM,aAAA,GAAgB,KAAI,CAAE,YAAA;AAC5B,IAAA,MAAM,gBAQF,EAAC;AAEL,IAAA,KAAA,MAAW,CAAC,OAAA,EAAS,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,EAAG;AAC7D,MAAA,aAAA,CAAc,OAAO,IAAI,MAAA,CAAO,GAAA;AAAA,QAAI,CAAC,UACnC,KAAA,CAAM,KAAA,KAAU,QAAQ,EAAE,GAAG,KAAA,EAAO,QAAA,EAAS,GAAI;AAAA,OACnD;AAAA,IACF;AAEA,IAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,aAAA,EAAe,aAAa,CAAA;AACjE,IAAA,GAAA,CAAI,EAAE,YAAA,EAAc,aAAA,EAAe,CAAA;AAAA,EACrC,CAAA;AAAA,EACA,kBAAA,EAAoB,CAAC,KAAA,KAAU;AAC7B,IAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,gBAAA,EAAkB,KAAK,CAAA;AAC5D,IAAA,GAAA,CAAI,EAAE,eAAA,EAAiB,KAAA,EAAO,CAAA;AAAA,EAChC,CAAA;AAAA,EACA,4BAAA,EAA8B,CAAC,KAAA,KAAU;AACvC,IAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,4BAAA,EAA8B,KAAK,CAAA;AACxE,IAAA,GAAA,CAAI,EAAE,yBAAA,EAA2B,KAAA,EAAO,CAAA;AAAA,EAC1C,CAAA;AAAA,EACA,sBAAA,EAAwB,CAAC,KAAA,KAAU;AACjC,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACvC,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,IAAA,EAAM,MAAM,IAAA,IAAQ,KAAA;AAAA,MACpB,SAAA,EAAW,KAAA,CAAM,SAAA,IAAa,IAAA,CAAK,GAAA;AAAI,KACzC,CAAE,CAAA;AACF,IAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,qBAAA,EAAuB,UAAU,CAAA;AACtE,IAAA,GAAA,CAAI,EAAE,mBAAA,EAAqB,UAAA,EAAY,CAAA;AAAA,EACzC,CAAA;AAAA,EACA,YAAA,EAAc,CAAC,KAAA,KAAU;AACvB,IAAA,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,MAAM,UACJ,OAAO,KAAA,KAAU,aAAa,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA,GAAI,KAAA;AACzD,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,QACzC,GAAG,KAAA;AAAA,QACH,SAAA,EAAW,KAAA,CAAM,SAAA,IAAa,IAAA,CAAK,GAAA,EAAI;AAAA,QACvC,QAAA,EAAU,MAAM,QAAA,IAAY;AAAA,OAC9B,CAAE,CAAA;AACF,MAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,UAAA,EAAY,UAAU,CAAA;AAC3D,MAAA,OAAO,EAAE,WAAW,UAAA,EAAW;AAAA,IACjC,CAAC,CAAA;AAAA,EACH,CAAA;AAAA;AAAA,EAEA,kBAAA,EAAoB,CAAC,KAAA,KAAU;AAC7B,IAAA,MAAM,aAAa,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,KAAQA,iBAAAA,CAAiB,GAAG,CAAC,CAAA;AAC3D,IAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,gBAAA,EAAkB,UAAU,CAAA;AACjE,IAAA,GAAA,CAAI,EAAE,eAAA,EAAiB,UAAA,EAAY,CAAA;AAAA,EACrC,CAAA;AAAA,EACA,iBAAA,EAAmB,CAAC,OAAA,KAAY;AAC9B,IAAA,MAAM,UAAA,GAAaA,kBAAiB,OAAO,CAAA;AAC3C,IAAA,MAAM,OAAA,GAAU,KAAI,CAAE,eAAA;AACtB,IAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA,EAAG;AACjC,MAAA,MAAM,OAAA,GAAU,CAAC,GAAG,OAAA,EAAS,UAAU,CAAA;AACvC,MAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,gBAAA,EAAkB,OAAO,CAAA;AAC9D,MAAA,GAAA,CAAI,EAAE,eAAA,EAAiB,OAAA,EAAS,CAAA;AAAA,IAClC;AAAA,EACF,CAAA;AAAA,EACA,oBAAA,EAAsB,CAAC,OAAA,KAAY;AACjC,IAAA,MAAM,UAAA,GAAaA,kBAAiB,OAAO,CAAA;AAC3C,IAAA,MAAM,OAAA,GAAU,KAAI,CAAE,eAAA;AACtB,IAAA,MAAM,UAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,KAAQ,QAAQ,UAAU,CAAA;AAC1D,IAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,gBAAA,EAAkB,OAAO,CAAA;AAC9D,IAAA,GAAA,CAAI,EAAE,eAAA,EAAiB,OAAA,EAAS,CAAA;AAAA,EAClC,CAAA;AAAA,EACA,aAAA,EAAe,CAAC,KAAA,KAAU;AACxB,IAAA,MAAM,aAAqC,EAAC;AAC5C,IAAA,KAAA,MAAW,CAAC,OAAA,EAAS,SAAS,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxD,MAAA,UAAA,CAAWA,iBAAAA,CAAiB,OAAO,CAAC,CAAA,GAAI,SAAA;AAAA,IAC1C;AACA,IAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,WAAA,EAAa,UAAU,CAAA;AAC5D,IAAA,GAAA,CAAI,EAAE,UAAA,EAAY,UAAA,EAAY,CAAA;AAAA,EAChC,CAAA;AAAA,EACA,sBAAA,EAAwB,CAAC,OAAA,EAAS,SAAA,KAAc;AAC9C,IAAA,MAAM,UAAA,GAAaA,kBAAiB,OAAO,CAAA;AAC3C,IAAA,MAAM,OAAA,GAAU,KAAI,CAAE,UAAA;AACtB,IAAA,MAAM,UAAU,EAAE,GAAG,SAAS,CAAC,UAAU,GAAG,SAAA,EAAU;AACtD,IAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,WAAA,EAAa,OAAO,CAAA;AACzD,IAAA,GAAA,CAAI,EAAE,UAAA,EAAY,OAAA,EAAS,CAAA;AAAA,EAC7B,CAAA;AAAA,EACA,sBAAA,EAAwB,CAAC,KAAA,KAAU;AACjC,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACvC,OAAA,EAASA,iBAAAA,CAAiB,KAAA,CAAM,OAAO,CAAA;AAAA,MACvC,WAAW,KAAA,CAAM;AAAA,KACnB,CAAE,CAAA;AACF,IAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,qBAAA,EAAuB,UAAU,CAAA;AACtE,IAAA,GAAA,CAAI,EAAE,mBAAA,EAAqB,UAAA,EAAY,CAAA;AAAA,EACzC,CAAA;AAAA,EACA,qBAAA,EAAuB,CAAC,OAAA,EAAS,SAAA,KAAc;AAC7C,IAAA,MAAM,UAAA,GAAaA,kBAAiB,OAAO,CAAA;AAC3C,IAAA,MAAM,OAAA,GAAU,KAAI,CAAE,mBAAA;AACtB,IAAA,IAAI,CAAC,QAAQ,IAAA,CAAK,CAAC,UAAU,KAAA,CAAM,OAAA,KAAY,UAAU,CAAA,EAAG;AAC1D,MAAA,MAAM,OAAA,GAAU,CAAC,GAAG,OAAA,EAAS,EAAE,OAAA,EAAS,UAAA,EAAY,WAAW,CAAA;AAC/D,MAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,qBAAA,EAAuB,OAAO,CAAA;AACnE,MAAA,GAAA,CAAI,EAAE,mBAAA,EAAqB,OAAA,EAAS,CAAA;AAAA,IACtC;AAAA,EACF,CAAA;AAAA,EACA,0BAAA,EAA4B,CAAC,OAAA,KAAY;AACvC,IAAA,MAAM,UAAA,GAAaA,kBAAiB,OAAO,CAAA;AAC3C,IAAA,MAAM,OAAA,GAAU,KAAI,CAAE,mBAAA;AACtB,IAAA,MAAM,UAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,YAAY,UAAU,CAAA;AACtE,IAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,qBAAA,EAAuB,OAAO,CAAA;AACnE,IAAA,GAAA,CAAI,EAAE,mBAAA,EAAqB,OAAA,EAAS,CAAA;AAAA,EACtC,CAAA;AAAA,EACA,0BAA0B,MAAM;AAC9B,IAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,qBAAA,EAAuB,EAAE,CAAA;AAC9D,IAAA,GAAA,CAAI,EAAE,mBAAA,EAAqB,EAAC,EAAG,CAAA;AAAA,EACjC;AACF,CAAA,CAAE,CAAA;AAEJ,IAAM,sBAAA,GAAyB,OAC7B,KAAA,EACA,MAAA,KACkB;AAClB,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,UAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA,IACA,kBAAA;AAAA,IACA,4BAAA;AAAA,IACA,sBAAA;AAAA,IACA,YAAA;AAAA,IACA,kBAAA;AAAA,IACA,aAAA;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,QAAA,EAAU,EAAE,CAAA;AAAA,IAC/B,MAAA,CAAO,OAAA,CASL,gBAAA,CAAiB,UAAA,EAAY,EAAE,CAAA;AAAA,IACjC,MAAA,CAAO,OAAA,CAUL,gBAAA,CAAiB,aAAA,EAAe,EAAE,CAAA;AAAA,IACpC,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,CAQL,gBAAA,CAAiB,UAAA,EAAY,EAAE,CAAA;AAAA,IACjC,MAAA,CAAO,OAAA,CAAkB,gBAAA,CAAiB,gBAAA,EAAkB,EAAE,CAAA;AAAA,IAC9D,MAAA,CAAO,OAAA,CAAgC,gBAAA,CAAiB,WAAA,EAAa,EAAE,CAAA;AAAA,IACvE,MAAA,CAAO,OAAA;AAAA,MACL,gBAAA,CAAiB,qBAAA;AAAA,MACjB;AAAC;AACH,GACD,CAAA;AAED,EAAA,MAAM,yBAAyB,MAAA,CAAO,WAAA;AAAA,IACpC,MAAA,CAAO,QAAQ,SAAS,CAAA,CAAE,IAAI,CAAC,CAAC,OAAA,EAAS,MAAM,CAAA,KAAM;AAAA,MACnDA,kBAAiB,OAAO,CAAA;AAAA,MACxB;AAAA,KACD;AAAA,GACH;AAEA,EAAA,MAAM,eAAe,WAAA,CAAY,GAAA,CAAI,CAAC,GAAA,KAAQA,iBAAAA,CAAiB,GAAG,CAAC,CAAA;AAEnE,EAAA,MAAM,oBAAoB,oBAAA,CAAqB,GAAA;AAAA,IAAI,CAAC,GAAA,KAClDA,iBAAAA,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,MACjDA,kBAAiB,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/CA,kBAAiB,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,MAChEA,kBAAiB,OAAO,CAAA;AAAA,MACxB;AAAA,KACD;AAAA,GACH;AAEA,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,IACzC,GAAG,KAAA;AAAA,IACH,OAAA,EAASA,iBAAAA,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,EAAeA,iBAAAA,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,eAAe,MAAA,CAAO,WAAA;AAAA,IAC1B,MAAA,CAAO,QAAQ,eAAe,CAAA,CAAE,IAAI,CAAC,CAAC,OAAA,EAAS,MAAM,CAAA,KAAM;AAAA,MACzDA,kBAAiB,OAAO,CAAA;AAAA,MACxB,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,QACrB,OAAA,EAASA,iBAAAA,CAAiB,KAAA,CAAM,OAAO,CAAA;AAAA,QACvC,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,SAAA,EAAW,KAAA,CAAM,SAAA,IAAa,IAAA,CAAK,GAAA,EAAI;AAAA,QACvC,QAAA,EAAU,MAAM,QAAA,IAAY;AAAA,OAC9B,CAAE;AAAA,KACH;AAAA,GACH;AAEA,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,SAAA,GAAY,YAAA,CAAa,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,IAC7C,GAAG,KAAA;AAAA,IACH,SAAA,EAAW,KAAA,CAAM,SAAA,IAAa,IAAA,CAAK,GAAA,EAAI;AAAA,IACvC,QAAA,EAAU,MAAM,QAAA,IAAY;AAAA,GAC9B,CAAE,CAAA;AAEF,EAAA,MAAM,kBAAkB,kBAAA,CAAmB,GAAA;AAAA,IAAI,CAAC,GAAA,KAC9CA,iBAAAA,CAAiB,GAAG;AAAA,GACtB;AACA,EAAA,MAAM,aAAa,MAAA,CAAO,WAAA;AAAA,IACxB,MAAA,CAAO,QAAQ,aAAa,CAAA,CAAE,IAAI,CAAC,CAAC,OAAA,EAAS,SAAS,CAAA,KAAM;AAAA,MAC1DA,kBAAiB,OAAO,CAAA;AAAA,MACxB;AAAA,KACD;AAAA,GACH;AACA,EAAA,MAAM,mBAAA,GAAsB,sBAAA,CAAuB,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,IACjE,OAAA,EAASA,iBAAAA,CAAiB,KAAA,CAAM,OAAO,CAAA;AAAA,IACvC,WAAW,KAAA,CAAM;AAAA,GACnB,CAAE,CAAA;AAEF,EAAA,KAAA,CAAM,QAAA,CAAS;AAAA,IACb,sBAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA,kBAAA;AAAA,IACA,iBAAA;AAAA,IACA,qBAAA;AAAA,IACA,oBAAA;AAAA,IACA,gBAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA,IACA,yBAAA;AAAA,IACA,mBAAA;AAAA,IACA,SAAA;AAAA,IACA,eAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH,CAAA;AAEO,IAAM,iBAAiB,CAAC;AAAA,EAC7B;AACF,CAAA,KAAoE;AAClE,EAAA,MAAM,KAAA,GAAQ,iBAAiB,MAAM,CAAA;AACrC,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,OAAA,EAAS,sBAAA,CAAuB,KAAA,EAAO,MAAM;AAAA,GAC/C;AACF;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,GAAaA,kBAAiB,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,GAAaA,kBAAiB,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,sBAAsB,CAAC,IAAA,KAAS,MAAM,QAAA,EAAS,CAAE,qBAAqB,IAAI,CAAA;AAAA,EAC1E,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,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,eAAA,CAAgB,MAAM,OAAO,CAAA,GAAA,CAC1B,gBAAgB,KAAA,CAAM,OAAO,KAAK,CAAA,IAAK,GAAA;AAAA,IAC5C;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,GAAaA,kBAAiB,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,GAAaA,kBAAiB,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,GAAaA,kBAAiB,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;AACnB,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAAA,EAEA,SAAA,EAAW,CAAC,OAAA,EAAS,GAAA,KAAQ;AAC3B,IAAA,MAAM,UAAA,GAAaA,kBAAiB,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,GAAaA,kBAAiB,OAAO,CAAA;AAC3C,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,QAAA,EAAS,CAAE,OAAA;AAC9B,IAAA,MAAM,OAAO,IAAA,CAAK,GAAA;AAAA,MAAI,CAAC,KAAA,KACrB,KAAA,CAAM,OAAA,KAAY,UAAA,GACd,EAAE,GAAG,KAAA,EAAO,OAAA,EAAS,QAAA,EAAU,IAAA,CAAK,GAAA,IAAM,GAC1C;AAAA,KACN;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,GAAaA,kBAAiB,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,GAAaA,kBAAiB,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,GAAaA,kBAAiB,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,GAAaA,kBAAiB,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,GAAaA,kBAAiB,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,CAAA;AAAA;AAAA,EAIA,iBAAiB,MAAM;AACrB,IAAA,OAAO,KAAA,CAAM,UAAS,CAAE,YAAA;AAAA,EAC1B,CAAA;AAAA,EAEA,yBAAA,EAA2B,CAAC,OAAA,KAAY;AACtC,IAAA,MAAM,UAAA,GAAaA,kBAAiB,OAAO,CAAA;AAC3C,IAAA,OAAO,MAAM,QAAA,EAAS,CAAE,YAAA,CAAa,UAAU,KAAK,EAAC;AAAA,EACvD,CAAA;AAAA,EAEA,cAAA,EAAgB,CAAC,OAAA,EAAS,KAAA,KAAU;AAClC,IAAA,MAAM,UAAA,GAAaA,kBAAiB,OAAO,CAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,QAAA,EAAS,CAAE,YAAA;AAChC,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,UAAU,CAAA,IAAK,EAAC;AACxC,IAAA,MAAM,IAAA,GAAO,EAAE,GAAG,MAAA,EAAO;AACzB,IAAA,IAAA,CAAK,UAAU,CAAA,GAAI;AAAA,MACjB,GAAG,QAAA;AAAA,MACH,EAAE,SAAS,UAAA,EAAY,KAAA,EAAO,WAAW,IAAA,CAAK,GAAA,EAAI,EAAG,QAAA,EAAU,CAAA;AAAE,KACnE;AACA,IAAA,KAAA,CAAM,QAAA,EAAS,CAAE,eAAA,CAAgB,IAAI,CAAA;AAAA,EACvC,CAAA;AAAA,EAEA,iBAAA,EAAmB,CAAC,OAAA,EAAS,KAAA,KAAU;AACrC,IAAA,MAAM,UAAA,GAAaA,kBAAiB,OAAO,CAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,QAAA,EAAS,CAAE,YAAA;AAChC,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,UAAU,CAAA,IAAK,EAAC;AACxC,IAAA,MAAM,IAAA,GAAO,EAAE,GAAG,MAAA,EAAO;AACzB,IAAA,IAAA,CAAK,UAAU,IAAI,QAAA,CAAS,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,UAAU,KAAK,CAAA;AACnE,IAAA,IAAI,IAAA,CAAK,UAAU,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AACjC,MAAA,OAAO,KAAK,UAAU,CAAA;AAAA,IACxB;AACA,IAAA,KAAA,CAAM,QAAA,EAAS,CAAE,eAAA,CAAgB,IAAI,CAAA;AAAA,EACvC,CAAA;AAAA,EAEA,2BAAA,EAA6B,CAAC,OAAA,KAAY;AACxC,IAAA,MAAM,UAAA,GAAaA,kBAAiB,OAAO,CAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,QAAA,EAAS,CAAE,YAAA;AAChC,IAAA,MAAM,IAAA,GAAO,EAAE,GAAG,MAAA,EAAO;AACzB,IAAA,OAAO,KAAK,UAAU,CAAA;AACtB,IAAA,KAAA,CAAM,QAAA,EAAS,CAAE,eAAA,CAAgB,IAAI,CAAA;AAAA,EACvC,CAAA;AAAA,EAEA,yBAAA,EAA2B,CAAC,KAAA,EAAO,QAAA,KAAa;AAC9C,IAAA,KAAA,CAAM,QAAA,EAAS,CAAE,yBAAA,CAA0B,KAAA,EAAO,QAAQ,CAAA;AAAA,EAC5D;AACF,CAAA;AAEO,IAAM,+BAAA,GAAkC,CAC7C,KAAA,EACA,MAAA,KACqB;AACrB,EAAA,MAAM,GAAA,GAAA,CAAO,MAAA,IAAU,aAAA,EAAe,KAAA,CAAM,kBAAkB,CAAA;AAC9D,EAAA,OAAO;AAAA,IACL,oBAAA,EAAsB,CAAC,OAAA,KAAY;AACjC,MAAA,MAAM,UAAA,GAAaA,kBAAiB,OAAO,CAAA;AAC3C,MAAA,OAAO,MAAM,QAAA,EAAS,CAAE,sBAAA,CAAuB,UAAU,KAAK,EAAC;AAAA,IACjE,CAAA;AAAA,IACA,oBAAA,EAAsB,MAAM,KAAA,CAAM,QAAA,EAAS,CAAE,iBAAA;AAAA,IAC7C,gBAAA,EAAkB,CAAC,OAAA,KAAY;AAC7B,MAAA,MAAM,UAAA,GAAaA,kBAAiB,OAAO,CAAA;AAC3C,MAAA,OAAO,MAAM,QAAA,EAAS,CAAE,qBAAA,CAAsB,UAAU,KAAK,EAAC;AAAA,IAChE,CAAA;AAAA,IACA,eAAA,EAAiB,OAAO,OAAA,KAAY;AAClC,MAAA,MAAM,UAAA,GAAaA,kBAAiB,OAAO,CAAA;AAC3C,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,QAAA,EAAS,CAAE,qBAAqB,UAAU,CAAA;AAC/D,MAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,UAAU,CAAA,OAAA,CAAS,CAAA;AACnD,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,QAC7C;AACA,QAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,QAAA,MAAM,OAAO,EAAE,GAAG,KAAA,CAAM,QAAA,GAAW,oBAAA,EAAqB;AACxD,QAAA,IAAA,CAAK,UAAU,CAAA,GAAI,IAAA;AACnB,QAAA,KAAA,CAAM,QAAA,EAAS,CAAE,uBAAA,CAAwB,IAAI,CAAA;AAC7C,QAAA,OAAO,IAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,IAAA,CAAK,CAAA,mCAAA,EAAsC,UAAU,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACnE,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAA;AAAA,IACA,qBAAA,EAAuB,MAAM,KAAA,CAAM,QAAA,EAAS,CAAE;AAAA,GAChD;AACF;;;AC31BA,IAAM,gBAAA,GAAmB,kBAAA;AACzB,IAAM,mBAAA,GAAsB,4BAAA;AAC5B,IAAM,kBAAA,GAAqB,uBAAA;AAC3B,IAAMD,qBAAAA,GAAuB,6BAAA;AAE7B,IAAM,aAAA,GAAgB,CAAC,OAAA,KACrB,kBAAA,CAAmB,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,GAAI,OAAA,GAAU,CAAA,EAAG,OAAO,CAAA,CAAA,CAAG,CAAA;AAEpE,IAAM,QAAA,GAAW,CAAC,OAAA,KAChB,CAAA,EAAG,gBAAgB,CAAA,EAAG,aAAA,CAAc,OAAO,CAAC,CAAA,CAAA;AAE9C,IAAM,UAAA,GAAa,CAAC,OAAA,KAClB,CAAA,EAAG,mBAAmB,CAAA,EAAG,aAAA,CAAc,OAAO,CAAC,CAAA,CAAA;AAMjD,IAAMC,iBAAAA,GAAmB,CAAC,OAAA,KACxB,OAAA,CAAQ,SAAS,GAAG,CAAA,GAAI,OAAA,GAAU,CAAA,EAAG,OAAO,CAAA,CAAA,CAAA;AAevC,IAAM,6BAAA,GAAgC,OAC3C,OAAA,KAC8B;AAC9B,EAAA,MAAM,EAAE,QAAO,GAAI,OAAA;AAInB,EAAA,MAAM,eAAe,MAAM,MAAA,CAAO,QAEhC,gBAAA,CAAiB,yBAAA,EAA2B,EAAE,CAAA;AAEhD,EAAA,MAAM,mBAAmB,MAAM,MAAA,CAAO,QAEpC,gBAAA,CAAiB,kBAAA,EAAoB,EAAE,CAAA;AAEzC,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA,CAAE,SAAS,CAAA,EAAG;AAExC,IAAA,MAAM,oBAA8B,EAAC;AACrC,IAAA,KAAA,MAAW,CAAC,OAAA,EAAS,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,EAAG;AAC5D,MAAA,MAAM,UAAA,GAAaA,kBAAiB,OAAO,CAAA;AAC3C,MAAA,MAAM,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,UAAU,GAAG,MAAM,CAAA;AACjD,MAAA,MAAM,EAAA,GAAK,gBAAA,CAAiB,UAAU,CAAA,IAAK,KAAK,GAAA,EAAI;AACpD,MAAA,MAAM,MAAA,CAAO,OAAA,CAAQ,UAAA,CAAW,UAAU,GAAG,EAAE,CAAA;AAC/C,MAAA,iBAAA,CAAkB,KAAK,UAAU,CAAA;AAAA,IACnC;AAGA,IAAA,MAAM,aAAA,GAAgB,MAAM,MAAA,CAAO,OAAA;AAAA,MACjC,kBAAA;AAAA,MACA;AAAC,KACH;AACA,IAAA,MAAM,MAAA,GAAS,CAAC,mBAAG,IAAI,GAAA,CAAI,CAAC,GAAG,aAAA,EAAe,GAAG,iBAAiB,CAAC,CAAC,CAAA;AACpE,IAAA,MAAM,MAAA,CAAO,OAAA,CAAQ,kBAAA,EAAoB,MAAM,CAAA;AAG/C,IAAA,MAAM,MAAA,CAAO,UAAA,CAAW,gBAAA,CAAiB,yBAAyB,CAAA;AAClE,IAAA,MAAM,MAAA,CAAO,UAAA,CAAW,gBAAA,CAAiB,kBAAkB,CAAA;AAAA,EAC7D;AAEA,EAAA,MAAM,MAAA,CAAO,OAAA,CAAQD,qBAAAA,EAAsB,IAAI,CAAA;AAI/C,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,OAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,kBAAA;AAAA,IACA,kBAAA;AAAA,IACA;AAAA,GACF,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,IACpB,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,CAAuB,gBAAA,CAAiB,eAAA,EAAiB,IAAI,CAAA;AAAA,IACpE,MAAA,CAAO,OAAA,CAAkB,gBAAA,CAAiB,kBAAA,EAAoB,EAAE,CAAA;AAAA,IAChE,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,gBAAA,EAAkB,EAAE,CAAA;AAAA,IAC9D,MAAA,CAAO,OAAA;AAAA,MACL,gBAAA,CAAiB,4BAAA;AAAA,MACjB;AAAA;AACF,GACD,CAAA;AAID,EAAA,MAAM,eAAA,uBAAsB,GAAA,EAAqB;AACjD,EAAA,MAAM,mBAAA,uBAA0B,GAAA,EAAoB;AAOpD,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AACtC,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAY;AACvC,EAAA,KAAA,MAAW,OAAA,IAAW,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,EAAG;AAC1C,IAAA,cAAA,CAAe,GAAA,CAAIC,iBAAAA,CAAiB,OAAO,CAAC,CAAA;AAAA,EAC9C;AACA,EAAA,KAAA,MAAW,OAAA,IAAW,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC3C,IAAA,cAAA,CAAe,GAAA,CAAIA,iBAAAA,CAAiB,OAAO,CAAC,CAAA;AAAA,EAC9C;AACA,EAAA,KAAA,MAAW,WAAW,WAAA,EAAa;AACjC,IAAA,cAAA,CAAe,GAAA,CAAIA,iBAAAA,CAAiB,OAAO,CAAC,CAAA;AAAA,EAC9C;AACA,EAAA,KAAA,MAAW,WAAW,WAAA,EAAa;AACjC,IAAA,cAAA,CAAe,GAAA,CAAIA,iBAAAA,CAAiB,OAAO,CAAC,CAAA;AAAA,EAC9C;AACA,EAAA,KAAA,MAAW,OAAA,IAAW,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA,EAAG;AAC/C,IAAA,cAAA,CAAe,GAAA,CAAIA,iBAAAA,CAAiB,OAAO,CAAC,CAAA;AAAA,EAC9C;AACA,EAAA,MAAM,cAAA,GAAiB,MAAM,MAAA,CAAO,OAAA;AAAA,IAClC,kBAAA;AAAA,IACA;AAAC,GACH;AACA,EAAA,KAAA,MAAW,WAAW,cAAA,EAAgB;AACpC,IAAA,MAAM,UAAA,GAAaA,kBAAiB,OAAO,CAAA;AAC3C,IAAA,aAAA,CAAc,IAAI,UAAU,CAAA;AAC5B,IAAA,cAAA,CAAe,IAAI,UAAU,CAAA;AAAA,EAC/B;AAGA,EAAA,KAAA,MAAW,WAAW,cAAA,EAAgB;AACpC,IAAA,MAAM,UAAA,GAAaA,kBAAiB,OAAO,CAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,OAAA;AAAA,MAC1B,SAAS,UAAU,CAAA;AAAA,MACnB;AAAA,KACF;AACA,IAAA,MAAM,EAAA,GAAK,MAAM,MAAA,CAAO,OAAA;AAAA,MACtB,WAAW,UAAU,CAAA;AAAA,MACrB;AAAA,KACF;AAEA,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,eAAA,CAAgB,GAAA,CAAI,YAAY,MAAM,CAAA;AAAA,IACxC;AACA,IAAA,IAAI,OAAO,IAAA,EAAM;AACf,MAAA,mBAAA,CAAoB,GAAA,CAAI,YAAY,EAAE,CAAA;AAAA,IACxC;AACA,IAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,EAAA,KAAO,IAAA,EAAM;AAClC,MAAA,aAAA,CAAc,IAAI,UAAU,CAAA;AAAA,IAC9B;AAAA,EACF;AAIA,EAAA,IAAI,QAAkC,MAAA,CAAO,WAAA;AAAA,IAC3C,MAAA,CAAO,QAAQ,QAAQ,CAAA,CAAE,IAAI,CAAC,CAAC,OAAA,EAAS,QAAQ,CAAA,KAAM;AAAA,MACpDA,kBAAiB,OAAO,CAAA;AAAA,MACxB,QAAA,CAAS,GAAA,CAAI,CAAC,IAAA,KAAU,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,IAAI,IAAK;AAAA,KACvE;AAAA,GACH;AAEA,EAAA,IAAI,OAAqC,MAAA,CAAO,WAAA;AAAA,IAC9C,MAAA,CAAO,QAAQ,OAAO,CAAA,CAAE,IAAI,CAAC,CAAC,OAAA,EAAS,KAAK,CAAA,KAAM;AAAA,MAChDA,kBAAiB,OAAO,CAAA;AAAA,MACxB;AAAA,KACD;AAAA,GACH;AAEA,EAAA,IAAI,cAAA,GAAgC,aAAA;AACpC,EAAA,IAAI,kBAAA,GAA+B,WAAA,CAAY,GAAA,CAAIA,iBAAgB,CAAA;AACnE,EAAA,IAAI,aAAA,GAA0B,WAAA,CAAY,GAAA,CAAIA,iBAAgB,CAAA;AAC9D,EAAA,IAAI,mBAAA,GAAqC,kBAAA;AACzC,EAAA,IAAI,gBAAA,GAA6B,kBAAA;AACjC,EAAA,IAAI,0BAAA,GAA4C,yBAAA;AAEhD,EAAA,MAAM,uBAAuB,MAAY;AACvC,IAAA,KAAK,OAAO,OAAA,CAAQ,kBAAA,EAAoB,CAAC,GAAG,aAAa,CAAC,CAAA;AAAA,EAC5D,CAAA;AAIA,EAAA,OAAO;AAAA;AAAA,IAGL,iBAAiB,MAA+B;AAC9C,MAAA,MAAM,SAAkC,EAAC;AACzC,MAAA,KAAA,MAAW,CAAC,OAAA,EAAS,MAAM,CAAA,IAAK,eAAA,CAAgB,SAAQ,EAAG;AACzD,QAAA,MAAA,CAAO,OAAO,CAAA,GAAI,MAAA;AAAA,MACpB;AACA,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,IAEA,eAAA,EAAiB,CAAC,MAAA,KAA0C;AAC1D,MAAA,MAAM,WAAW,IAAI,GAAA;AAAA,QACnB,MAAA,CAAO,KAAK,MAAM,CAAA,CAAE,IAAI,CAAC,OAAA,KAAYA,iBAAAA,CAAiB,OAAO,CAAC;AAAA,OAChE;AAKA,MAAA,KAAA,MAAW,WAAW,CAAC,GAAG,eAAA,CAAgB,IAAA,EAAM,CAAA,EAAG;AACjD,QAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAIA,iBAAAA,CAAiB,OAAO,CAAC,CAAA,EAAG;AAC5C,UAAA,aAAA,CAAc,OAAO,OAAO,CAAA;AAC5B,UAAA,eAAA,CAAgB,OAAO,OAAO,CAAA;AAC9B,UAAA,mBAAA,CAAoB,OAAO,OAAO,CAAA;AAClC,UAAA,KAAK,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,OAAO,CAAC,CAAA;AACxC,UAAA,KAAK,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,OAAO,CAAC,CAAA;AAAA,QAC5C;AAAA,MACF;AAGA,MAAA,KAAA,MAAW,CAAC,OAAA,EAAS,SAAS,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzD,QAAA,MAAM,UAAA,GAAaA,kBAAiB,OAAO,CAAA;AAC3C,QAAA,aAAA,CAAc,IAAI,UAAU,CAAA;AAC5B,QAAA,eAAA,CAAgB,GAAA,CAAI,YAAY,SAAS,CAAA;AACzC,QAAA,MAAM,KAAK,mBAAA,CAAoB,GAAA,CAAI,UAAU,CAAA,IAAK,KAAK,GAAA,EAAI;AAC3D,QAAA,mBAAA,CAAoB,GAAA,CAAI,YAAY,EAAE,CAAA;AACtC,QAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,UAAU,GAAG,SAAS,CAAA;AACnD,QAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAA,CAAW,UAAU,GAAG,EAAE,CAAA;AAAA,MAChD;AAEA,MAAA,oBAAA,EAAqB;AAAA,IACvB,CAAA;AAAA,IAEA,qBAAA,EAAuB,CAAC,OAAA,KAAmC;AACzD,MAAA,OAAO,mBAAA,CAAoB,GAAA,CAAIA,iBAAAA,CAAiB,OAAO,CAAC,CAAA,IAAK,IAAA;AAAA,IAC/D,CAAA;AAAA,IAEA,qBAAA,EAAuB,CAAC,OAAA,EAAiB,SAAA,KAA4B;AACnE,MAAA,MAAM,UAAA,GAAaA,kBAAiB,OAAO,CAAA;AAC3C,MAAA,aAAA,CAAc,IAAI,UAAU,CAAA;AAC5B,MAAA,mBAAA,CAAoB,GAAA,CAAI,YAAY,SAAS,CAAA;AAC7C,MAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAA,CAAW,UAAU,GAAG,SAAS,CAAA;AACrD,MAAA,oBAAA,EAAqB;AAAA,IACvB,CAAA;AAAA;AAAA,IAIA,gBAAgB,MAAM,KAAA;AAAA,IAEtB,cAAA,EAAgB,CAAC,KAAA,KAAoC;AACnD,MAAA,MAAM,aAAuC,EAAC;AAC9C,MAAA,KAAA,MAAW,CAAC,OAAA,EAAS,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AACvD,QAAA,UAAA,CAAWA,iBAAAA,CAAiB,OAAO,CAAC,CAAA,GAAI,QAAA,CAAS,GAAA;AAAA,UAAI,CAAC,IAAA,KACpD,IAAA,CAAK,QAAA,CAAS,GAAG,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI;AAAA,SAC3C;AAAA,MACF;AACA,MAAA,KAAA,GAAQ,UAAA;AACR,MAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,wBAAA,EAA0B,UAAU,CAAA;AAAA,IAC3E,CAAA;AAAA;AAAA,IAIA,uBAAuB,MAAM,IAAA;AAAA,IAE7B,qBAAA,EAAuB,CAAC,KAAA,KAAwC;AAC9D,MAAA,MAAM,aAA2C,EAAC;AAClD,MAAA,KAAA,MAAW,CAAC,OAAA,EAAS,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AACpD,QAAA,UAAA,CAAWA,iBAAAA,CAAiB,OAAO,CAAC,CAAA,GAAI,KAAA;AAAA,MAC1C;AACA,MAAA,IAAA,GAAO,UAAA;AACP,MAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,uBAAA,EAAyB,UAAU,CAAA;AAAA,IAC1E,CAAA;AAAA;AAAA,IAIA,kBAAkB,MAAM,cAAA;AAAA,IACxB,gBAAA,EAAkB,CAAC,OAAA,KAAoB;AACrC,MAAA,cAAA,GAAiB,OAAA;AACjB,MAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,eAAA,EAAiB,OAAO,CAAA;AAAA,IAC/D,CAAA;AAAA;AAAA,IAIA,sBAAsB,MAAM,kBAAA;AAAA,IAE5B,oBAAA,EAAsB,CAAC,IAAA,KAAmB;AACxC,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAIA,iBAAgB,CAAA;AAC5C,MAAA,kBAAA,GAAqB,UAAA;AACrB,MAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,kBAAA,EAAoB,UAAU,CAAA;AAAA,IACrE,CAAA;AAAA;AAAA,IAIA,iBAAiB,MAAM,aAAA;AAAA,IACvB,uBAAuB,MAAM,mBAAA;AAAA,IAE7B,eAAA,EAAiB,CAAC,IAAA,KAAmB;AACnC,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAIA,iBAAgB,CAAA;AAC5C,MAAA,aAAA,GAAgB,UAAA;AAChB,MAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,cAAA,EAAgB,UAAU,CAAA;AAAA,IACjE,CAAA;AAAA,IAEA,qBAAA,EAAuB,CAAC,SAAA,KAAsB;AAC5C,MAAA,mBAAA,GAAsB,SAAA;AACtB,MAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,qBAAA,EAAuB,SAAS,CAAA;AAAA,IACvE,CAAA;AAAA;AAAA,IAIA,oBAAoB,MAAM,gBAAA;AAAA,IAE1B,kBAAA,EAAoB,CAAC,MAAA,KAAqB;AACxC,MAAA,gBAAA,GAAmB,MAAA;AACnB,MAAA,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAA,CAAiB,gBAAA,EAAkB,MAAM,CAAA;AAAA,IAC/D,CAAA;AAAA,IAEA,8BAA8B,MAAM,0BAAA;AAAA,IAEpC,4BAAA,EAA8B,CAAC,SAAA,KAAsB;AACnD,MAAA,0BAAA,GAA6B,SAAA;AAC7B,MAAA,KAAK,MAAA,CAAO,OAAA;AAAA,QACV,gBAAA,CAAiB,4BAAA;AAAA,QACjB;AAAA,OACF;AAAA,IACF;AAAA,GACF;AACF;AAEO,IAAM,0CAAA,GAA6C,CACxD,OAAA,EACA,MAAA,KACqB;AACrB,EAAA,MAAM,GAAA,GAAA,CAAO,MAAA,IAAU,aAAA,EAAe,KAAA,CAAM,kBAAkB,CAAA;AAE9D,EAAA,OAAO;AAAA,IACL,oBAAA,EAAsB,CAAC,OAAA,KAA6B;AAClD,MAAA,MAAM,UAAA,GAAaA,kBAAiB,OAAO,CAAA;AAC3C,MAAA,OAAO,OAAA,CAAQ,eAAA,EAAgB,CAAE,UAAU,KAAK,EAAC;AAAA,IACnD,CAAA;AAAA,IAEA,oBAAA,EAAsB,MAAgB,OAAA,CAAQ,oBAAA,EAAqB;AAAA,IAEnE,gBAAA,EAAkB,CAAC,OAAA,KAA8B;AAC/C,MAAA,MAAM,UAAA,GAAaA,kBAAiB,OAAO,CAAA;AAC3C,MAAA,OAAO,OAAA,CAAQ,cAAA,EAAe,CAAE,UAAU,KAAK,EAAC;AAAA,IAClD,CAAA;AAAA,IAEA,eAAA,EAAiB,OAAO,OAAA,KAAkD;AACxE,MAAA,MAAM,UAAA,GAAaA,kBAAiB,OAAO,CAAA;AAC3C,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,qBAAA,EAAsB,CAAE,UAAU,CAAA;AACzD,MAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,UAAU,CAAA,OAAA,CAAS,CAAA;AACnD,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,QAC7C;AACA,QAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,QAAA,OAAA,CAAQ,qBAAA,CAAsB;AAAA,UAC5B,GAAG,QAAQ,qBAAA,EAAsB;AAAA,UACjC,CAAC,UAAU,GAAG;AAAA,SACf,CAAA;AACD,QAAA,OAAO,IAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,IAAA,CAAK,CAAA,mCAAA,EAAsC,UAAU,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACnE,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAA;AAAA,IAEA,qBAAA,EAAuB,MACrB,OAAA,CAAQ,eAAA;AAAgB,GAC5B;AACF;;;ACxVA,IAAMJ,aAAY,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,IAAMK,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,IAAIL,YAAU,EAAG;AACf,IAAA,aAAA,GAAgB,kBAAA;AAChB,IAAA,OAAO,aAAA;AAAA,EACT;AACA,EAAA,IAAIK,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,YAAA,GAAyD,IAAA;AAC7D,IAAI,0BAAA,GAAyD,IAAA;AAEtD,IAAM,qBAAqB,MAAyB;AACzD,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,YAAA,GAAe,cAAA,CAAe,EAAE,MAAA,EAAQ,mBAAA,IAAuB,CAAA;AAAA,EACjE;AACA,EAAA,OAAO,YAAA,CAAa,OAAA,CAAQ,IAAA,CAAK,MAAM,aAAc,KAAK,CAAA;AAC5D;AAEO,IAAM,gCAAgC,MAA2B;AACtE,EAAA,IAAI,4BAA4B,OAAO,0BAAA;AAEvC,EAAA,MAAM,gBAAgB,mBAAA,EAAoB;AAE1C,EAAA,IAAIL,YAAU,EAAG;AACf,IAAA,0BAAA,GAA6B,kCAAA,CAAmC;AAAA,MAC9D,mBAAA,EAAqB;AAAA,KACtB,CAAA;AACD,IAAA,OAAO,0BAAA;AAAA,EACT;AAEA,EAAA,IAAIK,QAAM,EAAG;AACX,IAAA,0BAAA,GAA6B,kCAAA,EAAmC;AAChE,IAAA,OAAO,0BAAA;AAAA,EACT;AAEA,EAAA,IAAI,QAAO,EAAG;AACZ,IAAA,0BAAA,GAA6B,+BAAA,CAAgC;AAAA,MAC3D,mBAAA,EAAqB;AAAA,KACtB,CAAA;AACD,IAAA,OAAO,0BAAA;AAAA,EACT;AAEA,EAAA,0BAAA,GAA6B,+BAAA,EAAgC;AAC7D,EAAA,OAAO,0BAAA;AACT;AAKO,IAAM,6BAAA,GAAgC,CAAC,MAAA,KAAsC;AAClF,EAAA,0BAAA,GAA6B,MAAA;AAC/B;AAEA,IAAI,uBAAA,GAAmD,IAAA;AAEhD,IAAM,6BAA6B,YAAuC;AAC/E,EAAA,IAAI,yBAAyB,OAAO,uBAAA;AAEpC,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,uBAAA,GAA0B,MAAM,6BAAA,CAA8B,EAAE,MAAA,EAAQ,CAAA;AACxE,EAAA,OAAO,uBAAA;AACT;AAEO,IAAM,wBAAA,GAA2B,YACtC,6BAAA,CAA8B,MAAM,oBAAoB;AAEnD,IAAM,0BAAA,GAA6B,YACxC,0CAAA,CAA2C,MAAM,4BAA4B","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","/**\n * Core types for the Routstr SDK\n * These types are shared across wallet and client modules\n */\n\nexport interface SdkLogger {\n log(...args: unknown[]): void;\n warn(...args: unknown[]): void;\n error(...args: unknown[]): void;\n debug(...args: unknown[]): void;\n child(prefix: string): SdkLogger;\n}\n\nfunction makeConsoleLogger(prefix?: string): SdkLogger {\n const fmt = (args: unknown[]) => (prefix ? [prefix, ...args] : args);\n return {\n log: (...args) => console.log(...fmt(args)),\n warn: (...args) => console.warn(...fmt(args)),\n error: (...args) => console.error(...fmt(args)),\n debug: (...args) => console.log(...fmt(args)),\n child: (p) => makeConsoleLogger(prefix ? `${prefix}:${p}` : p),\n };\n}\n\nexport const consoleLogger: SdkLogger = makeConsoleLogger();\n\nexport const noopLogger: SdkLogger = {\n log: () => {},\n warn: () => {},\n error: () => {},\n debug: () => {},\n child: () => noopLogger,\n};\n\nexport interface MessageContentType {\n type: \"text\" | \"image_url\" | \"file\";\n text?: string;\n image_url?: {\n url: string;\n storageId?: string;\n };\n file?: {\n url: string;\n name?: string;\n mimeType?: string;\n size?: number;\n };\n hidden?: boolean;\n thinking?: string;\n citations?: string[];\n}\n\nexport interface Message {\n role: string;\n content: string | MessageContentType[];\n _eventId?: string;\n _prevId?: string;\n _createdAt?: number;\n _modelId?: string;\n satsSpent?: number;\n}\n\nexport interface TransactionHistory {\n type: \"spent\" | \"mint\" | \"send\" | \"import\" | \"refund\";\n amount: number;\n timestamp: number;\n status: \"success\" | \"failed\";\n model?: string;\n message?: string;\n balance?: number;\n}\n\nexport interface ModelPricing {\n prompt: number;\n completion: number;\n request: number;\n image: number;\n web_search: number;\n internal_reasoning: number;\n}\n\nexport interface ModelSatsPricing extends ModelPricing {\n max_completion_cost: number;\n max_prompt_cost: number;\n max_cost: number;\n}\n\nexport interface ModelArchitecture {\n modality: string;\n input_modalities: readonly string[];\n output_modalities: readonly string[];\n tokenizer: string;\n instruct_type: string | null;\n}\n\nexport interface PerRequestLimits {\n readonly prompt_tokens?: number;\n readonly completion_tokens?: number;\n readonly requests_per_minute?: number;\n readonly images_per_minute?: number;\n readonly web_searches_per_minute?: number;\n readonly [key: string]: number | undefined;\n}\n\nexport interface Model {\n id: string;\n name: string;\n created?: number;\n description?: string;\n context_length?: number;\n architecture?: ModelArchitecture;\n pricing?: ModelPricing;\n sats_pricing: ModelSatsPricing;\n per_request_limits?: PerRequestLimits;\n}\n\n/**\n * Result from spending cashu tokens\n */\nexport interface SpendResult {\n token: string | null;\n status: \"success\" | \"failed\";\n balance: number;\n unit?: \"sat\" | \"msat\";\n error?: string;\n errorDetails?: {\n required: number;\n available: number;\n maxMintBalance: number;\n maxMintUrl: string;\n };\n}\n\n/**\n * Result from refund operations\n */\nexport interface RefundResult {\n success: boolean;\n refundedAmount?: number;\n message?: string;\n requestId?: string;\n}\n\n/**\n * Result from top up operations\n */\nexport interface TopUpResult {\n success: boolean;\n toppedUpAmount?: number;\n message?: string;\n requestId?: string;\n recoveredToken?: boolean;\n}\n\n/**\n * API error verdict for retry logic\n */\nexport interface APIErrorVerdict {\n retry: boolean;\n reason: string;\n newBaseUrl?: string; // New provider to retry with (for 50X errors)\n}\n\n/**\n * Image data from API response\n */\nexport interface ImageData {\n type: \"image_url\";\n image_url: {\n url: string;\n };\n index?: number;\n}\n\n/**\n * Annotation data from API response\n */\nexport interface AnnotationData {\n type: \"url_citation\";\n start_index: number;\n end_index: number;\n url: string;\n title: string;\n}\n\n/**\n * Usage statistics from API response\n */\nexport interface UsageStats {\n total_tokens?: number;\n prompt_tokens?: number;\n completion_tokens?: number;\n cost?: number;\n sats_cost?: number;\n}\n\n/**\n * Result from streaming response processing\n */\nexport interface StreamingResult {\n content: string;\n thinking?: string;\n images?: ImageData[];\n usage?: UsageStats;\n model?: string;\n responseId?: string;\n finish_reason?: string;\n citations?: string[];\n annotations?: AnnotationData[];\n}\n\n/**\n * Parameters for fetching AI response\n */\nexport interface FetchAIResponseParams {\n messageHistory: Message[];\n selectedModel: Model;\n baseUrl: string;\n mintUrl: string;\n balance: number;\n transactionHistory: TransactionHistory[];\n}\n\n/**\n * Candidate provider for failover\n */\nexport interface CandidateProvider {\n baseUrl: string;\n model: Model;\n cost: number;\n}\n\n/**\n * Mint selection result\n */\nexport interface MintSelection {\n selectedMintUrl: string | null;\n selectedMintBalance: number;\n}\n\n/**\n * Pending token entry\n */\nexport interface PendingTokenEntry {\n baseUrl: string;\n amount: number;\n}\n\n/**\n * Provider information from /v1/info endpoint\n */\nexport interface ProviderInfo {\n mints?: string[];\n [key: string]: any;\n}\n\n/**\n * Model discovery result\n */\nexport interface ModelDiscoveryResult {\n models: Model[];\n bestById: Map<string, { model: Model; base: string }>;\n totalProcessed: number;\n}\n\n/**\n * Mint discovery result\n */\nexport interface MintDiscoveryResult {\n mintsFromProviders: Record<string, string[]>;\n infoFromProviders: Record<string, ProviderInfo>;\n}\n","import type { StorageDriver } from \"../types\";\nimport type { SdkLogger } from \"../../core/types\";\nimport { consoleLogger } from \"../../core/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\nlet cachedDbModule: any = null;\n\nconst loadDatabase = async (dbPath: string): Promise<BetterSqlite3Database> => {\n if (isBun()) {\n throw new Error(\n \"SQLite driver not supported in Bun. Use createBunSqliteDriver() instead.\"\n );\n }\n\n try {\n if (!cachedDbModule) {\n cachedDbModule = (await import(\"better-sqlite3\")).default;\n }\n return new cachedDbModule(dbPath);\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};\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 let db: BetterSqlite3Database;\n let selectStmt: any;\n let upsertStmt: any;\n let deleteStmt: any;\n\n const initDb = async () => {\n if (!db) {\n db = await loadDatabase(dbPath);\n db.exec(\n `CREATE TABLE IF NOT EXISTS ${tableName} (key TEXT PRIMARY KEY, value TEXT NOT NULL)`\n );\n\n selectStmt = db.prepare(`SELECT value FROM ${tableName} WHERE key = ?`);\n upsertStmt = db.prepare(\n `INSERT INTO ${tableName} (key, value) VALUES (?, ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value`\n );\n deleteStmt = db.prepare(`DELETE FROM ${tableName} WHERE key = ?`);\n }\n };\n\n const ensureInit = async () => {\n if (!db) {\n await initDb();\n }\n };\n\n return {\n async getItem<T>(key: string, defaultValue: T): Promise<T> {\n try {\n await ensureInit();\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 await ensureInit();\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 await ensureInit();\n deleteStmt.run(key);\n } catch (error) {\n console.error(`SQLite removeItem failed for key \"${key}\":`, error);\n }\n },\n };\n};\n\n// Bun-specific SQLite driver - requires bun:sqlite at runtime\n// This function is only meant to be used in Bun environments\nexport async function createBunSqliteDriver(\n dbPath: string,\n options?: { logger?: SdkLogger }\n): Promise<StorageDriver> {\n const logger = (options?.logger ?? consoleLogger).child(\"BunSqliteDriver\");\n // @ts-ignore - bun:sqlite is only available at runtime in Bun environments\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const SQLite = (await import(/* webpackIgnore: true */ \"bun:sqlite\")).default;\n const db = new SQLite(dbPath);\n\n db.run(`\n CREATE TABLE IF NOT EXISTS sdk_storage (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n )\n `);\n\n return {\n async getItem<T>(key: string, defaultValue: T): Promise<T> {\n try {\n const row = db\n .query(\"SELECT value FROM sdk_storage WHERE key = ?\")\n .get(key) as { value: string } | undefined;\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 logger.error(`getItem failed for key \"${key}\":`, error);\n return defaultValue;\n }\n },\n async setItem<T>(key: string, value: T): Promise<void> {\n try {\n db.query(\n \"INSERT INTO sdk_storage (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value\"\n ).run(key, JSON.stringify(value));\n } catch (error) {\n logger.error(`setItem failed for key \"${key}\":`, error);\n }\n },\n async removeItem(key: string): Promise<void> {\n try {\n db.query(\"DELETE FROM sdk_storage WHERE key = ?\").run(key);\n } catch (error) {\n logger.error(`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 isBrowser = typeof indexedDB !== \"undefined\";\n\nconst openDatabase = (\n dbName: string,\n storeName: string\n): Promise<IDBDatabase> => {\n if (!isBrowser) {\n return Promise.reject(new Error(\"IndexedDB is not available\"));\n }\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 API_KEYS: \"api_keys\",\n CHILD_KEYS: \"child_keys\",\n XCASHU_TOKENS: \"xcashu_tokens\",\n ROUTSTR21_MODELS: \"routstr21Models\",\n LAST_ROUTSTR21_MODELS_UPDATE: \"lastRoutstr21ModelsUpdate\",\n CACHED_RECEIVE_TOKENS: \"cached_receive_tokens\",\n USAGE_TRACKING: \"usage_tracking\",\n CLIENT_IDS: \"client_ids\",\n FAILED_PROVIDERS: \"failed_providers\",\n LAST_FAILED: \"last_failed\",\n PROVIDERS_ON_COOLDOWN: \"providers_on_cooldown\",\n} as const;\n\nexport type SdkStorageKey =\n (typeof SDK_STORAGE_KEYS)[keyof typeof SDK_STORAGE_KEYS];\n","import { SDK_STORAGE_KEYS } from \"../keys\";\nimport type { StorageDriver } from \"../types\";\nimport type { ListUsageTrackingOptions, UsageTrackingDriver } from \"./interfaces\";\nimport type { UsageTrackingEntry } from \"./types\";\n\nexport interface IndexedDBUsageTrackingDriverOptions {\n dbName?: string;\n storeName?: string;\n legacyStorageDriver?: StorageDriver;\n}\n\nconst DEFAULT_DB_NAME = \"routstr-sdk\";\nconst DEFAULT_STORE_NAME = \"usage_tracking\";\nconst MIGRATION_MARKER_KEY = \"usage_tracking_migration_v1\";\n\nconst isBrowser = typeof indexedDB !== \"undefined\";\n\nconst normalizeBaseUrl = (baseUrl: string): string =>\n baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n\nconst openDatabase = (\n dbName: string,\n storeName: string\n): Promise<IDBDatabase> => {\n if (!isBrowser) {\n return Promise.reject(new Error(\"IndexedDB is not available\"));\n }\n\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 const store = db.createObjectStore(storeName, { keyPath: \"id\" });\n store.createIndex(\"timestamp\", \"timestamp\", { unique: false });\n store.createIndex(\"modelId\", \"modelId\", { unique: false });\n store.createIndex(\"baseUrl\", \"baseUrl\", { unique: false });\n store.createIndex(\"sessionId\", \"sessionId\", { unique: false });\n store.createIndex(\"client\", \"client\", { unique: false });\n }\n };\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n};\n\nconst matchesFilters = (\n entry: UsageTrackingEntry,\n options: Omit<ListUsageTrackingOptions, \"limit\"> = {}\n): boolean => {\n if (typeof options.before === \"number\" && entry.timestamp >= options.before) {\n return false;\n }\n if (typeof options.after === \"number\" && entry.timestamp <= options.after) {\n return false;\n }\n if (options.modelId && entry.modelId !== options.modelId) {\n return false;\n }\n if (options.baseUrl && normalizeBaseUrl(entry.baseUrl) !== normalizeBaseUrl(options.baseUrl)) {\n return false;\n }\n if (options.sessionId && entry.sessionId !== options.sessionId) {\n return false;\n }\n if (options.client && entry.client !== options.client) {\n return false;\n }\n return true;\n};\n\nexport const createIndexedDBUsageTrackingDriver = (\n options: IndexedDBUsageTrackingDriverOptions = {}\n): UsageTrackingDriver => {\n const dbName = options.dbName || DEFAULT_DB_NAME;\n const storeName = options.storeName || DEFAULT_STORE_NAME;\n const legacyStorageDriver = options.legacyStorageDriver;\n\n let dbPromise: Promise<IDBDatabase> | null = null;\n let migrationPromise: Promise<void> | null = null;\n\n const getDb = (): Promise<IDBDatabase> => {\n if (!dbPromise) {\n dbPromise = openDatabase(dbName, storeName);\n }\n return dbPromise;\n };\n\n const putMany = async (entries: UsageTrackingEntry[]): Promise<void> => {\n if (entries.length === 0) return;\n const db = await getDb();\n await new Promise<void>((resolve, reject) => {\n const tx = db.transaction(storeName, \"readwrite\");\n const store = tx.objectStore(storeName);\n for (const entry of entries) {\n store.put({ ...entry, baseUrl: normalizeBaseUrl(entry.baseUrl) });\n }\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n };\n\n const ensureMigrated = async (): Promise<void> => {\n if (!legacyStorageDriver) return;\n if (!migrationPromise) {\n migrationPromise = (async () => {\n const migrated = await legacyStorageDriver.getItem<boolean>(\n MIGRATION_MARKER_KEY,\n false\n );\n if (migrated) return;\n\n const legacyEntries = await legacyStorageDriver.getItem<UsageTrackingEntry[]>(\n SDK_STORAGE_KEYS.USAGE_TRACKING,\n []\n );\n\n if (legacyEntries.length > 0) {\n await putMany(legacyEntries);\n await legacyStorageDriver.removeItem(SDK_STORAGE_KEYS.USAGE_TRACKING);\n }\n\n await legacyStorageDriver.setItem(MIGRATION_MARKER_KEY, true);\n })();\n }\n await migrationPromise;\n };\n\n return {\n async migrate(): Promise<void> {\n await ensureMigrated();\n },\n\n async append(entry: UsageTrackingEntry): Promise<void> {\n await ensureMigrated();\n await putMany([entry]);\n },\n\n async appendMany(entries: UsageTrackingEntry[]): Promise<void> {\n await ensureMigrated();\n await putMany(entries);\n },\n\n async list(options: ListUsageTrackingOptions = {}): Promise<UsageTrackingEntry[]> {\n await ensureMigrated();\n const db = await getDb();\n return new Promise<UsageTrackingEntry[]>((resolve, reject) => {\n const tx = db.transaction(storeName, \"readonly\");\n const store = tx.objectStore(storeName);\n const index = store.index(\"timestamp\");\n const direction: IDBCursorDirection = \"prev\";\n const request = index.openCursor(null, direction);\n const results: UsageTrackingEntry[] = [];\n const limit = options.limit;\n\n request.onsuccess = () => {\n const cursor = request.result;\n if (!cursor) {\n resolve(results);\n return;\n }\n\n const value = cursor.value as UsageTrackingEntry;\n if (matchesFilters(value, options)) {\n results.push(value);\n if (typeof limit === \"number\" && results.length >= limit) {\n resolve(results);\n return;\n }\n }\n cursor.continue();\n };\n\n request.onerror = () => reject(request.error);\n });\n },\n\n async count(options: Omit<ListUsageTrackingOptions, \"limit\"> = {}): Promise<number> {\n const results = await this.list(options);\n return results.length;\n },\n\n async deleteOlderThan(timestamp: number): Promise<number> {\n await ensureMigrated();\n const db = await getDb();\n return new Promise<number>((resolve, reject) => {\n const tx = db.transaction(storeName, \"readwrite\");\n const store = tx.objectStore(storeName);\n const index = store.index(\"timestamp\");\n const range = IDBKeyRange.upperBound(timestamp, true);\n const request = index.openCursor(range);\n let deleted = 0;\n\n request.onsuccess = () => {\n const cursor = request.result;\n if (!cursor) {\n resolve(deleted);\n return;\n }\n deleted += 1;\n cursor.delete();\n cursor.continue();\n };\n\n request.onerror = () => reject(request.error);\n });\n },\n\n async clear(): Promise<void> {\n await ensureMigrated();\n const db = await getDb();\n await new Promise<void>((resolve, reject) => {\n const tx = db.transaction(storeName, \"readwrite\");\n tx.objectStore(storeName).clear();\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n },\n };\n};\n","import { SDK_STORAGE_KEYS } from \"../keys\";\nimport type { StorageDriver } from \"../types\";\nimport type { ListUsageTrackingOptions, UsageTrackingDriver } from \"./interfaces\";\nimport type { UsageTrackingEntry } from \"./types\";\n\ntype BetterSqlite3Database = {\n prepare: (sql: string) => {\n run: (...params: any[]) => { changes: number };\n get: (...params: any[]) => any;\n all: (...params: any[]) => any[];\n };\n exec: (sql: string) => void;\n};\n\nexport interface SqliteUsageTrackingDriverOptions {\n dbPath?: string;\n tableName?: string;\n legacyStorageDriver?: StorageDriver;\n}\n\nconst MIGRATION_MARKER_KEY = \"usage_tracking_migration_v1\";\n\nconst normalizeBaseUrl = (baseUrl: string): string =>\n baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n\nconst isBun = (): boolean => {\n return typeof process.versions.bun !== \"undefined\";\n};\n\nlet cachedDbModule: any = null;\n\nconst loadDatabase = async (dbPath: string): Promise<BetterSqlite3Database> => {\n if (isBun()) {\n throw new Error(\n \"SQLite driver not supported in Bun. Use createMemoryDriver() instead.\"\n );\n }\n\n try {\n if (!cachedDbModule) {\n cachedDbModule = (await import(\"better-sqlite3\")).default;\n }\n return new cachedDbModule(dbPath);\n } catch (error) {\n throw new Error(\n `better-sqlite3 is required for sqlite usage tracking. Install it to use sqlite storage. (${error})`\n );\n }\n};\n\nconst buildWhereClause = (\n options: Omit<ListUsageTrackingOptions, \"limit\"> = {}\n): { sql: string; params: unknown[] } => {\n const clauses: string[] = [];\n const params: unknown[] = [];\n\n if (typeof options.before === \"number\") {\n clauses.push(\"timestamp < ?\");\n params.push(options.before);\n }\n if (typeof options.after === \"number\") {\n clauses.push(\"timestamp > ?\");\n params.push(options.after);\n }\n if (options.modelId) {\n clauses.push(\"model_id = ?\");\n params.push(options.modelId);\n }\n if (options.baseUrl) {\n clauses.push(\"base_url = ?\");\n params.push(normalizeBaseUrl(options.baseUrl));\n }\n if (options.sessionId) {\n clauses.push(\"session_id = ?\");\n params.push(options.sessionId);\n }\n if (options.client) {\n clauses.push(\"client = ?\");\n params.push(options.client);\n }\n\n return {\n sql: clauses.length > 0 ? `WHERE ${clauses.join(\" AND \")}` : \"\",\n params,\n };\n};\n\nexport const createSqliteUsageTrackingDriver = (\n options: SqliteUsageTrackingDriverOptions = {}\n): UsageTrackingDriver => {\n const dbPath = options.dbPath || \"routstr.sqlite\";\n const tableName = options.tableName || \"usage_tracking\";\n const legacyStorageDriver = options.legacyStorageDriver;\n\n let db: BetterSqlite3Database;\n let insertStmt: any;\n\n let migrationComplete = false;\n\n const initDb = async () => {\n if (!db) {\n db = await loadDatabase(dbPath);\n db.exec(`\n CREATE TABLE IF NOT EXISTS ${tableName} (\n id TEXT PRIMARY KEY,\n timestamp INTEGER NOT NULL,\n model_id TEXT NOT NULL,\n base_url TEXT NOT NULL,\n request_id TEXT NOT NULL,\n cost REAL NOT NULL,\n sats_cost REAL NOT NULL,\n prompt_tokens INTEGER NOT NULL,\n completion_tokens INTEGER NOT NULL,\n total_tokens INTEGER NOT NULL,\n client TEXT,\n session_id TEXT,\n tags TEXT\n );\n CREATE INDEX IF NOT EXISTS idx_${tableName}_timestamp ON ${tableName}(timestamp);\n CREATE INDEX IF NOT EXISTS idx_${tableName}_model_id ON ${tableName}(model_id);\n CREATE INDEX IF NOT EXISTS idx_${tableName}_base_url ON ${tableName}(base_url);\n CREATE INDEX IF NOT EXISTS idx_${tableName}_session_id ON ${tableName}(session_id);\n CREATE INDEX IF NOT EXISTS idx_${tableName}_client ON ${tableName}(client);\n `);\n\n insertStmt = db.prepare(`\n INSERT OR REPLACE INTO ${tableName} (\n id, timestamp, model_id, base_url, request_id,\n cost, sats_cost, prompt_tokens, completion_tokens, total_tokens,\n client, session_id, tags\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n }\n };\n\n const ensureInit = async () => {\n if (!db) {\n await initDb();\n }\n };\n\n const appendOne = (entry: UsageTrackingEntry): void => {\n insertStmt.run(\n entry.id,\n entry.timestamp,\n entry.modelId,\n normalizeBaseUrl(entry.baseUrl),\n entry.requestId,\n entry.cost,\n entry.satsCost,\n entry.promptTokens,\n entry.completionTokens,\n entry.totalTokens,\n entry.client ?? null,\n entry.sessionId ?? null,\n JSON.stringify(entry.tags ?? [])\n );\n };\n\n const ensureMigrated = async (): Promise<void> => {\n if (!legacyStorageDriver || migrationComplete) return;\n\n const migrated = await legacyStorageDriver.getItem<boolean>(\n MIGRATION_MARKER_KEY,\n false\n );\n if (migrated) {\n migrationComplete = true;\n return;\n }\n\n const legacyEntries = await legacyStorageDriver.getItem<UsageTrackingEntry[]>(\n SDK_STORAGE_KEYS.USAGE_TRACKING,\n []\n );\n\n for (const entry of legacyEntries) {\n appendOne(entry);\n }\n\n if (legacyEntries.length > 0) {\n await legacyStorageDriver.removeItem(SDK_STORAGE_KEYS.USAGE_TRACKING);\n }\n await legacyStorageDriver.setItem(MIGRATION_MARKER_KEY, true);\n migrationComplete = true;\n };\n\n const mapRow = (row: any): UsageTrackingEntry => ({\n id: row.id,\n timestamp: row.timestamp,\n modelId: row.model_id,\n baseUrl: row.base_url,\n requestId: row.request_id,\n cost: row.cost,\n satsCost: row.sats_cost,\n promptTokens: row.prompt_tokens,\n completionTokens: row.completion_tokens,\n totalTokens: row.total_tokens,\n client: row.client ?? undefined,\n sessionId: row.session_id ?? undefined,\n tags: typeof row.tags === \"string\" ? JSON.parse(row.tags) : undefined,\n });\n\n return {\n async migrate(): Promise<void> {\n await ensureInit();\n await ensureMigrated();\n },\n\n async append(entry: UsageTrackingEntry): Promise<void> {\n await ensureInit();\n await ensureMigrated();\n appendOne(entry);\n },\n\n async appendMany(entries: UsageTrackingEntry[]): Promise<void> {\n await ensureInit();\n await ensureMigrated();\n for (const entry of entries) {\n appendOne(entry);\n }\n },\n\n async list(options: ListUsageTrackingOptions = {}): Promise<UsageTrackingEntry[]> {\n await ensureInit();\n await ensureMigrated();\n const { sql, params } = buildWhereClause(options);\n const limitSql = typeof options.limit === \"number\" ? \" LIMIT ?\" : \"\";\n const stmt = db.prepare(\n `SELECT * FROM ${tableName} ${sql} ORDER BY timestamp DESC${limitSql}`\n );\n const rows = stmt.all(\n ...(typeof options.limit === \"number\" ? [...params, options.limit] : params)\n );\n return rows.map(mapRow);\n },\n\n async count(options: Omit<ListUsageTrackingOptions, \"limit\"> = {}): Promise<number> {\n await ensureInit();\n await ensureMigrated();\n const { sql, params } = buildWhereClause(options);\n const stmt = db.prepare(`SELECT COUNT(*) as count FROM ${tableName} ${sql}`);\n const row = stmt.get(...params);\n return Number(row?.count ?? 0);\n },\n\n async deleteOlderThan(timestamp: number): Promise<number> {\n await ensureInit();\n await ensureMigrated();\n const stmt = db.prepare(`DELETE FROM ${tableName} WHERE timestamp < ?`);\n const result = stmt.run(timestamp);\n return result.changes;\n },\n\n async clear(): Promise<void> {\n await ensureInit();\n await ensureMigrated();\n db.prepare(`DELETE FROM ${tableName}`).run();\n },\n };\n};\n","import { SDK_STORAGE_KEYS } from \"../keys\";\nimport type { StorageDriver } from \"../types\";\nimport type {\n ListUsageTrackingOptions,\n UsageTrackingDriver,\n} from \"./interfaces\";\nimport type { UsageTrackingEntry } from \"./types\";\n\nconst MIGRATION_MARKER_KEY = \"usage_tracking_migration_v1\";\n\nconst normalizeBaseUrl = (baseUrl: string): string =>\n baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n\nconst buildWhereClause = (\n options: Omit<ListUsageTrackingOptions, \"limit\"> = {}\n): { sql: string; params: unknown[] } => {\n const clauses: string[] = [];\n const params: unknown[] = [];\n\n if (typeof options.before === \"number\") {\n clauses.push(\"timestamp < ?\");\n params.push(options.before);\n }\n if (typeof options.after === \"number\") {\n clauses.push(\"timestamp > ?\");\n params.push(options.after);\n }\n if (options.modelId) {\n clauses.push(\"model_id = ?\");\n params.push(options.modelId);\n }\n if (options.baseUrl) {\n clauses.push(\"base_url = ?\");\n params.push(normalizeBaseUrl(options.baseUrl));\n }\n if (options.sessionId) {\n clauses.push(\"session_id = ?\");\n params.push(options.sessionId);\n }\n if (options.client) {\n clauses.push(\"client = ?\");\n params.push(options.client);\n }\n\n return {\n sql: clauses.length > 0 ? `WHERE ${clauses.join(\" AND \")}` : \"\",\n params,\n };\n};\n\nexport interface BunSqliteUsageTrackingDriverOptions {\n dbPath?: string;\n tableName?: string;\n legacyStorageDriver?: StorageDriver;\n sqlite?: {\n Database: any;\n };\n}\n\n// Bun-specific SQLite usage tracking driver using bun:sqlite\nexport const createBunSqliteUsageTrackingDriver = (\n options: BunSqliteUsageTrackingDriverOptions = {}\n): UsageTrackingDriver => {\n const dbPath = options.dbPath || \"routstr.sqlite\";\n const tableName = options.tableName || \"usage_tracking\";\n const legacyStorageDriver = options.legacyStorageDriver;\n const SQLiteDatabase = options.sqlite?.Database;\n\n let migrationPromise: Promise<void> | null = null;\n\n if (!SQLiteDatabase) {\n throw new Error(\n \"Bun SQLite Database constructor is required. Pass { sqlite: { Database } } when creating the driver.\"\n );\n }\n\n const db = new SQLiteDatabase(dbPath);\n\n db.run(`\n CREATE TABLE IF NOT EXISTS ${tableName} (\n id TEXT PRIMARY KEY,\n timestamp INTEGER NOT NULL,\n model_id TEXT NOT NULL,\n base_url TEXT NOT NULL,\n request_id TEXT NOT NULL,\n cost REAL NOT NULL,\n sats_cost REAL NOT NULL,\n prompt_tokens INTEGER NOT NULL,\n completion_tokens INTEGER NOT NULL,\n total_tokens INTEGER NOT NULL,\n client TEXT,\n session_id TEXT,\n tags TEXT\n )\n `);\n\n db.run(`CREATE INDEX IF NOT EXISTS idx_${tableName}_timestamp ON ${tableName}(timestamp)`);\n db.run(`CREATE INDEX IF NOT EXISTS idx_${tableName}_model_id ON ${tableName}(model_id)`);\n db.run(`CREATE INDEX IF NOT EXISTS idx_${tableName}_base_url ON ${tableName}(base_url)`);\n\n const appendOne = (entry: UsageTrackingEntry): void => {\n db.query(`\n INSERT OR REPLACE INTO ${tableName} (\n id, timestamp, model_id, base_url, request_id,\n cost, sats_cost, prompt_tokens, completion_tokens, total_tokens,\n client, session_id, tags\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).run(\n entry.id,\n entry.timestamp,\n entry.modelId,\n normalizeBaseUrl(entry.baseUrl),\n entry.requestId,\n entry.cost,\n entry.satsCost,\n entry.promptTokens,\n entry.completionTokens,\n entry.totalTokens,\n entry.client ?? null,\n entry.sessionId ?? null,\n JSON.stringify(entry.tags ?? [])\n );\n };\n\n const mapRow = (row: any): UsageTrackingEntry => ({\n id: row.id,\n timestamp: row.timestamp,\n modelId: row.model_id,\n baseUrl: row.base_url,\n requestId: row.request_id,\n cost: row.cost,\n satsCost: row.sats_cost,\n promptTokens: row.prompt_tokens,\n completionTokens: row.completion_tokens,\n totalTokens: row.total_tokens,\n client: row.client ?? undefined,\n sessionId: row.session_id ?? undefined,\n tags: typeof row.tags === \"string\" ? JSON.parse(row.tags) : undefined,\n });\n\n const ensureMigrated = async (): Promise<void> => {\n if (!legacyStorageDriver) return;\n if (!migrationPromise) {\n migrationPromise = (async () => {\n const migrated = await legacyStorageDriver.getItem<boolean>(\n MIGRATION_MARKER_KEY,\n false\n );\n if (migrated) return;\n\n const legacyEntries = await legacyStorageDriver.getItem<UsageTrackingEntry[]>(\n SDK_STORAGE_KEYS.USAGE_TRACKING,\n []\n );\n\n if (legacyEntries.length > 0) {\n for (const entry of legacyEntries) {\n appendOne(entry);\n }\n await legacyStorageDriver.removeItem(SDK_STORAGE_KEYS.USAGE_TRACKING);\n }\n\n await legacyStorageDriver.setItem(MIGRATION_MARKER_KEY, true);\n })();\n }\n await migrationPromise;\n };\n\n return {\n async migrate(): Promise<void> {\n await ensureMigrated();\n },\n\n async append(entry: UsageTrackingEntry): Promise<void> {\n await ensureMigrated();\n appendOne(entry);\n },\n\n async appendMany(entries: UsageTrackingEntry[]): Promise<void> {\n await ensureMigrated();\n for (const entry of entries) {\n appendOne(entry);\n }\n },\n\n async list(options: ListUsageTrackingOptions = {}): Promise<UsageTrackingEntry[]> {\n await ensureMigrated();\n const { sql, params } = buildWhereClause(options);\n const limitSql = typeof options.limit === \"number\" ? \" LIMIT ?\" : \"\";\n const query = `SELECT * FROM ${tableName} ${sql} ORDER BY timestamp DESC${limitSql}`;\n \n let rows: any[];\n if (typeof options.limit === \"number\") {\n rows = db.query(query).all(...params, options.limit);\n } else {\n rows = db.query(query).all(...params);\n }\n\n return rows.map(mapRow);\n },\n\n async count(options: Omit<ListUsageTrackingOptions, \"limit\"> = {}): Promise<number> {\n const { sql, params } = buildWhereClause(options);\n const query = `SELECT COUNT(*) as count FROM ${tableName} ${sql}`;\n const row = db.query(query).get(...params);\n return Number(row?.count ?? 0);\n },\n\n async deleteOlderThan(timestamp: number): Promise<number> {\n await ensureMigrated();\n const before = timestamp;\n const result = db.query(`DELETE FROM ${tableName} WHERE timestamp < ?`).run(before);\n return result.changes ?? 0;\n },\n\n async clear(): Promise<void> {\n await ensureMigrated();\n db.query(`DELETE FROM ${tableName}`).run();\n },\n };\n};\n","import type { ListUsageTrackingOptions, UsageTrackingDriver } from \"./interfaces\";\nimport type { UsageTrackingEntry } from \"./types\";\n\nconst normalizeBaseUrl = (baseUrl: string): string =>\n baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n\nconst matchesFilters = (\n entry: UsageTrackingEntry,\n options: Omit<ListUsageTrackingOptions, \"limit\"> = {}\n): boolean => {\n if (typeof options.before === \"number\" && entry.timestamp >= options.before) {\n return false;\n }\n if (typeof options.after === \"number\" && entry.timestamp <= options.after) {\n return false;\n }\n if (options.modelId && entry.modelId !== options.modelId) {\n return false;\n }\n if (options.baseUrl && normalizeBaseUrl(entry.baseUrl) !== normalizeBaseUrl(options.baseUrl)) {\n return false;\n }\n if (options.sessionId && entry.sessionId !== options.sessionId) {\n return false;\n }\n if (options.client && entry.client !== options.client) {\n return false;\n }\n return true;\n};\n\nexport const createMemoryUsageTrackingDriver = (\n seed: UsageTrackingEntry[] = []\n): UsageTrackingDriver => {\n const store = new Map<string, UsageTrackingEntry>();\n\n for (const entry of seed) {\n store.set(entry.id, { ...entry, baseUrl: normalizeBaseUrl(entry.baseUrl) });\n }\n\n return {\n async migrate(): Promise<void> {\n return;\n },\n\n async append(entry: UsageTrackingEntry): Promise<void> {\n store.set(entry.id, { ...entry, baseUrl: normalizeBaseUrl(entry.baseUrl) });\n },\n\n async appendMany(entries: UsageTrackingEntry[]): Promise<void> {\n for (const entry of entries) {\n store.set(entry.id, { ...entry, baseUrl: normalizeBaseUrl(entry.baseUrl) });\n }\n },\n\n async list(options: ListUsageTrackingOptions = {}): Promise<UsageTrackingEntry[]> {\n const entries = [...store.values()]\n .filter((entry) => matchesFilters(entry, options))\n .sort((a, b) => b.timestamp - a.timestamp);\n if (typeof options.limit === \"number\") {\n return entries.slice(0, options.limit);\n }\n return entries;\n },\n\n async count(options: Omit<ListUsageTrackingOptions, \"limit\"> = {}): Promise<number> {\n return (await this.list(options)).length;\n },\n\n async deleteOlderThan(timestamp: number): Promise<number> {\n let deleted = 0;\n for (const [id, entry] of store.entries()) {\n if (entry.timestamp < timestamp) {\n store.delete(id);\n deleted += 1;\n }\n }\n return deleted;\n },\n\n async clear(): Promise<void> {\n store.clear();\n },\n };\n};\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, SdkLogger } from \"../core\";\nimport { consoleLogger } from \"../core/types\";\nimport { SDK_STORAGE_KEYS } from \"./keys\";\nimport type { StorageDriver, SdkStorageState } from \"./types\";\n\nconst normalizeBaseUrl = (baseUrl: string): string =>\n baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\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 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 setXcashuTokens: (\n value: Record<\n string,\n Array<{\n baseUrl: string;\n token: string;\n createdAt?: number;\n tryCount?: number;\n }>\n >\n ) => void;\n updateXcashuTokenTryCount: (token: string, tryCount: number) => 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 setClientIds: (\n value:\n | Array<{\n clientId: string;\n name: string;\n apiKey: string;\n createdAt?: number;\n lastUsed?: number | null;\n }>\n | ((\n current: SdkStorageStore[\"clientIds\"]\n ) => SdkStorageStore[\"clientIds\"])\n ) => void;\n // ========== Failure Tracking ==========\n setFailedProviders: (value: string[]) => void;\n addFailedProvider: (baseUrl: string) => void;\n removeFailedProvider: (baseUrl: string) => void;\n setLastFailed: (value: Record<string, number>) => void;\n setLastFailedTimestamp: (baseUrl: string, timestamp: number) => void;\n setProvidersOnCooldown: (\n value: Array<{ baseUrl: string; timestamp: number }>\n ) => void;\n addProviderOnCooldown: (baseUrl: string, timestamp: number) => void;\n removeProviderFromCooldown: (baseUrl: string) => void;\n clearProvidersOnCooldown: () => void;\n}\n\n/** Store type returned after async initialization */\nexport type SdkStore = StoreApi<SdkStorageStore>;\n\nconst createEmptyStore = (driver: StorageDriver): SdkStore =>\n createStore<SdkStorageStore>((set, get) => ({\n modelsFromAllProviders: {},\n lastUsedModel: null,\n baseUrlsList: [],\n lastBaseUrlsUpdate: null,\n disabledProviders: [],\n mintsFromAllProviders: {},\n infoFromAllProviders: {},\n lastModelsUpdate: {},\n apiKeys: [],\n childKeys: [],\n xcashuTokens: {},\n routstr21Models: [],\n lastRoutstr21ModelsUpdate: null,\n cachedReceiveTokens: [],\n clientIds: [],\n failedProviders: [],\n lastFailed: {},\n providersOnCooldown: [],\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 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 setXcashuTokens: (value) => {\n const normalized: Record<\n string,\n Array<{\n baseUrl: string;\n token: string;\n createdAt: number;\n tryCount: number;\n }>\n > = {};\n for (const [baseUrl, tokens] of Object.entries(value)) {\n normalized[normalizeBaseUrl(baseUrl)] = tokens.map((entry) => ({\n ...entry,\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n createdAt: entry.createdAt ?? Date.now(),\n tryCount: entry.tryCount ?? 0,\n }));\n }\n void driver.setItem(SDK_STORAGE_KEYS.XCASHU_TOKENS, normalized);\n set({ xcashuTokens: normalized });\n },\n updateXcashuTokenTryCount: (token, tryCount) => {\n const currentTokens = get().xcashuTokens;\n const updatedTokens: Record<\n string,\n Array<{\n baseUrl: string;\n token: string;\n createdAt: number;\n tryCount: number;\n }>\n > = {};\n\n for (const [baseUrl, tokens] of Object.entries(currentTokens)) {\n updatedTokens[baseUrl] = tokens.map((entry) =>\n entry.token === token ? { ...entry, tryCount } : entry\n );\n }\n\n void driver.setItem(SDK_STORAGE_KEYS.XCASHU_TOKENS, updatedTokens);\n set({ xcashuTokens: updatedTokens });\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 setClientIds: (value) => {\n set((state) => {\n const updates =\n typeof value === \"function\" ? value(state.clientIds) : value;\n const normalized = updates.map((entry) => ({\n ...entry,\n createdAt: entry.createdAt ?? Date.now(),\n lastUsed: entry.lastUsed ?? null,\n }));\n void driver.setItem(SDK_STORAGE_KEYS.CLIENT_IDS, normalized);\n return { clientIds: normalized };\n });\n },\n // ========== Failure Tracking ==========\n setFailedProviders: (value) => {\n const normalized = value.map((url) => normalizeBaseUrl(url));\n void driver.setItem(SDK_STORAGE_KEYS.FAILED_PROVIDERS, normalized);\n set({ failedProviders: normalized });\n },\n addFailedProvider: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const current = get().failedProviders;\n if (!current.includes(normalized)) {\n const updated = [...current, normalized];\n void driver.setItem(SDK_STORAGE_KEYS.FAILED_PROVIDERS, updated);\n set({ failedProviders: updated });\n }\n },\n removeFailedProvider: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const current = get().failedProviders;\n const updated = current.filter((url) => url !== normalized);\n void driver.setItem(SDK_STORAGE_KEYS.FAILED_PROVIDERS, updated);\n set({ failedProviders: updated });\n },\n setLastFailed: (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_FAILED, normalized);\n set({ lastFailed: normalized });\n },\n setLastFailedTimestamp: (baseUrl, timestamp) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const current = get().lastFailed;\n const updated = { ...current, [normalized]: timestamp };\n void driver.setItem(SDK_STORAGE_KEYS.LAST_FAILED, updated);\n set({ lastFailed: updated });\n },\n setProvidersOnCooldown: (value) => {\n const normalized = value.map((entry) => ({\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n timestamp: entry.timestamp,\n }));\n void driver.setItem(SDK_STORAGE_KEYS.PROVIDERS_ON_COOLDOWN, normalized);\n set({ providersOnCooldown: normalized });\n },\n addProviderOnCooldown: (baseUrl, timestamp) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const current = get().providersOnCooldown;\n if (!current.some((entry) => entry.baseUrl === normalized)) {\n const updated = [...current, { baseUrl: normalized, timestamp }];\n void driver.setItem(SDK_STORAGE_KEYS.PROVIDERS_ON_COOLDOWN, updated);\n set({ providersOnCooldown: updated });\n }\n },\n removeProviderFromCooldown: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const current = get().providersOnCooldown;\n const updated = current.filter((entry) => entry.baseUrl !== normalized);\n void driver.setItem(SDK_STORAGE_KEYS.PROVIDERS_ON_COOLDOWN, updated);\n set({ providersOnCooldown: updated });\n },\n clearProvidersOnCooldown: () => {\n void driver.setItem(SDK_STORAGE_KEYS.PROVIDERS_ON_COOLDOWN, []);\n set({ providersOnCooldown: [] });\n },\n }));\n\nconst hydrateStoreFromDriver = async (\n store: SdkStore,\n driver: StorageDriver\n): Promise<void> => {\n const [\n rawModels,\n lastUsedModel,\n rawBaseUrls,\n lastBaseUrlsUpdate,\n rawDisabledProviders,\n rawMints,\n rawInfo,\n rawLastModelsUpdate,\n rawApiKeys,\n rawChildKeys,\n rawXcashuTokens,\n rawRoutstr21Models,\n rawLastRoutstr21ModelsUpdate,\n rawCachedReceiveTokens,\n rawClientIds,\n rawFailedProviders,\n rawLastFailed,\n rawProvidersOnCooldown,\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 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<\n Record<\n string,\n Array<{\n baseUrl: string;\n token: string;\n createdAt?: number;\n tryCount?: number;\n }>\n >\n >(SDK_STORAGE_KEYS.XCASHU_TOKENS, {}),\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 clientId: string;\n name: string;\n apiKey: string;\n createdAt?: number;\n lastUsed?: number | null;\n }>\n >(SDK_STORAGE_KEYS.CLIENT_IDS, []),\n driver.getItem<string[]>(SDK_STORAGE_KEYS.FAILED_PROVIDERS, []),\n driver.getItem<Record<string, number>>(SDK_STORAGE_KEYS.LAST_FAILED, {}),\n driver.getItem<Array<{ baseUrl: string; timestamp: number }>>(\n SDK_STORAGE_KEYS.PROVIDERS_ON_COOLDOWN,\n []\n ),\n ]);\n\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 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 xcashuTokens = Object.fromEntries(\n Object.entries(rawXcashuTokens).map(([baseUrl, tokens]) => [\n normalizeBaseUrl(baseUrl),\n tokens.map((entry) => ({\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n token: entry.token,\n createdAt: entry.createdAt ?? Date.now(),\n tryCount: entry.tryCount ?? 0,\n })),\n ])\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 clientIds = rawClientIds.map((entry) => ({\n ...entry,\n createdAt: entry.createdAt ?? Date.now(),\n lastUsed: entry.lastUsed ?? null,\n }));\n\n const failedProviders = rawFailedProviders.map((url) =>\n normalizeBaseUrl(url)\n );\n const lastFailed = Object.fromEntries(\n Object.entries(rawLastFailed).map(([baseUrl, timestamp]) => [\n normalizeBaseUrl(baseUrl),\n timestamp,\n ])\n );\n const providersOnCooldown = rawProvidersOnCooldown.map((entry) => ({\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n timestamp: entry.timestamp,\n }));\n\n store.setState({\n modelsFromAllProviders,\n lastUsedModel,\n baseUrlsList,\n lastBaseUrlsUpdate,\n disabledProviders,\n mintsFromAllProviders,\n infoFromAllProviders,\n lastModelsUpdate,\n apiKeys,\n childKeys,\n xcashuTokens,\n routstr21Models,\n lastRoutstr21ModelsUpdate,\n cachedReceiveTokens,\n clientIds,\n failedProviders,\n lastFailed,\n providersOnCooldown,\n });\n};\n\nexport const createSdkStore = ({\n driver,\n}: SdkStoreOptions): { store: SdkStore; hydrate: Promise<void> } => {\n const store = createEmptyStore(driver);\n return {\n store,\n hydrate: hydrateStoreFromDriver(store, driver),\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 setDisabledProviders: (urls) => store.getState().setDisabledProviders(urls),\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 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 distributionMap[entry.baseUrl] =\n (distributionMap[entry.baseUrl] || 0) + sum;\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 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\n ? { ...entry, balance, lastUsed: Date.now() }\n : 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 // ========== XCashu Tokens (multiple tokens per baseUrl) ==========\n\n getXcashuTokens: () => {\n return store.getState().xcashuTokens;\n },\n\n getXcashuTokensForBaseUrl: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n return store.getState().xcashuTokens[normalized] || [];\n },\n\n addXcashuToken: (baseUrl, token) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const tokens = store.getState().xcashuTokens;\n const existing = tokens[normalized] || [];\n const next = { ...tokens };\n next[normalized] = [\n ...existing,\n { baseUrl: normalized, token, createdAt: Date.now(), tryCount: 0 },\n ];\n store.getState().setXcashuTokens(next);\n },\n\n removeXcashuToken: (baseUrl, token) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const tokens = store.getState().xcashuTokens;\n const existing = tokens[normalized] || [];\n const next = { ...tokens };\n next[normalized] = existing.filter((entry) => entry.token !== token);\n if (next[normalized].length === 0) {\n delete next[normalized];\n }\n store.getState().setXcashuTokens(next);\n },\n\n clearXcashuTokensForBaseUrl: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const tokens = store.getState().xcashuTokens;\n const next = { ...tokens };\n delete next[normalized];\n store.getState().setXcashuTokens(next);\n },\n\n updateXcashuTokenTryCount: (token, tryCount) => {\n store.getState().updateXcashuTokenTryCount(token, tryCount);\n },\n});\n\nexport const createProviderRegistryFromStore = (\n store: SdkStore,\n logger?: SdkLogger\n): ProviderRegistry => {\n const log = (logger ?? consoleLogger).child(\"ProviderRegistry\");\n return {\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 log.warn(`Failed to fetch provider info from ${normalized}:`, error);\n return null;\n }\n },\n getAllProvidersModels: () => store.getState().modelsFromAllProviders,\n };\n};\n","/**\n * Sharded DiscoveryAdapter\n *\n * Replaces the SQLite/IndexedDB ModelsDatabase layer with provider-scoped\n * sharding over the existing key-value StorageDriver.\n *\n * Instead of one giant blob:\n * modelsFromAllProviders → Record<string, Model[]>\n * lastModelsUpdate → Record<string, number>\n *\n * We use provider-scoped keys:\n * models:provider:<encodedBaseUrl> → Model[]\n * models:provider_timestamp:<encodedBaseUrl> → number\n *\n * All model data is hydrated into memory at creation time so the\n * synchronous DiscoveryAdapter contract is satisfied. Writes are\n * fire-and-forget via void driver.setItem(...).\n */\n\nimport type { DiscoveryAdapter } from \"../discovery/interfaces\";\nimport type { ProviderRegistry } from \"../wallet/interfaces\";\nimport type { Model, ProviderInfo, SdkLogger } from \"../core/types\";\nimport { consoleLogger } from \"../core/types\";\nimport type { StorageDriver } from \"./types\";\nimport { SDK_STORAGE_KEYS } from \"./keys\";\n\n// ---------------------------------------------------------------------------\n// Key helpers\n// ---------------------------------------------------------------------------\n\nconst MODEL_KEY_PREFIX = \"models:provider:\";\nconst MODEL_TS_KEY_PREFIX = \"models:provider_timestamp:\";\nconst PROVIDER_INDEX_KEY = \"models:provider_index\";\nconst MIGRATION_MARKER_KEY = \"models_sharded_migration_v1\";\n\nconst encodeBaseUrl = (baseUrl: string): string =>\n encodeURIComponent(baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`);\n\nconst modelKey = (baseUrl: string): string =>\n `${MODEL_KEY_PREFIX}${encodeBaseUrl(baseUrl)}`;\n\nconst modelTsKey = (baseUrl: string): string =>\n `${MODEL_TS_KEY_PREFIX}${encodeBaseUrl(baseUrl)}`;\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst normalizeBaseUrl = (baseUrl: string): string =>\n baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface ShardedDiscoveryAdapterOptions {\n /** Key-value StorageDriver */\n driver: StorageDriver;\n}\n\n// ---------------------------------------------------------------------------\n// Async factory — returns a fully-hydrated synchronous adapter\n// ---------------------------------------------------------------------------\n\nexport const createShardedDiscoveryAdapter = async (\n options: ShardedDiscoveryAdapterOptions,\n): Promise<DiscoveryAdapter> => {\n const { driver } = options;\n\n // ---- Migration from legacy key-value blob ----\n\n const legacyModels = await driver.getItem<\n Record<string, Model[]>\n >(SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS, {});\n\n const legacyTimestamps = await driver.getItem<\n Record<string, number>\n >(SDK_STORAGE_KEYS.LAST_MODELS_UPDATE, {});\n\n if (Object.keys(legacyModels).length > 0) {\n // Write each provider's models to a sharded key\n const migratedProviders: string[] = [];\n for (const [baseUrl, models] of Object.entries(legacyModels)) {\n const normalized = normalizeBaseUrl(baseUrl);\n await driver.setItem(modelKey(normalized), models);\n const ts = legacyTimestamps[normalized] ?? Date.now();\n await driver.setItem(modelTsKey(normalized), ts);\n migratedProviders.push(normalized);\n }\n\n // Update the index with migrated providers\n const existingIndex = await driver.getItem<string[]>(\n PROVIDER_INDEX_KEY,\n [],\n );\n const merged = [...new Set([...existingIndex, ...migratedProviders])];\n await driver.setItem(PROVIDER_INDEX_KEY, merged);\n\n // Clear legacy keys\n await driver.removeItem(SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS);\n await driver.removeItem(SDK_STORAGE_KEYS.LAST_MODELS_UPDATE);\n }\n\n await driver.setItem(MIGRATION_MARKER_KEY, true);\n\n // ---- Hydrate non-model fields once ----\n\n const [\n rawMints,\n rawInfo,\n lastUsedModel,\n rawDisabled,\n rawBaseUrls,\n lastBaseUrlsUpdate,\n rawRoutstr21Models,\n lastRoutstr21ModelsUpdate,\n ] = await Promise.all([\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<string | null>(SDK_STORAGE_KEYS.LAST_USED_MODEL, null),\n driver.getItem<string[]>(SDK_STORAGE_KEYS.DISABLED_PROVIDERS, []),\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.ROUTSTR21_MODELS, []),\n driver.getItem<number | null>(\n SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE,\n null,\n ),\n ]);\n\n // ---- Hydrate model data from sharded keys ----\n\n const modelsByBaseUrl = new Map<string, Model[]>();\n const timestampsByBaseUrl = new Map<string, number>();\n\n // Read the provider index to know which sharded keys exist.\n // We also include providers from info/mints/baseUrls/disabled lists\n // and the legacy blob (just migrated) in case a provider has been\n // configured but hasn't had models cached yet, or the index is\n // missing during migration.\n const providerIndex = new Set<string>();\n const knownProviders = new Set<string>();\n for (const baseUrl of Object.keys(rawInfo)) {\n knownProviders.add(normalizeBaseUrl(baseUrl));\n }\n for (const baseUrl of Object.keys(rawMints)) {\n knownProviders.add(normalizeBaseUrl(baseUrl));\n }\n for (const baseUrl of rawBaseUrls) {\n knownProviders.add(normalizeBaseUrl(baseUrl));\n }\n for (const baseUrl of rawDisabled) {\n knownProviders.add(normalizeBaseUrl(baseUrl));\n }\n for (const baseUrl of Object.keys(legacyModels)) {\n knownProviders.add(normalizeBaseUrl(baseUrl));\n }\n const indexProviders = await driver.getItem<string[]>(\n PROVIDER_INDEX_KEY,\n [],\n );\n for (const baseUrl of indexProviders) {\n const normalized = normalizeBaseUrl(baseUrl);\n providerIndex.add(normalized);\n knownProviders.add(normalized);\n }\n\n // Read sharded model data for each known provider\n for (const baseUrl of knownProviders) {\n const normalized = normalizeBaseUrl(baseUrl);\n const models = await driver.getItem<Model[] | null>(\n modelKey(normalized),\n null,\n );\n const ts = await driver.getItem<number | null>(\n modelTsKey(normalized),\n null,\n );\n\n if (models !== null) {\n modelsByBaseUrl.set(normalized, models);\n }\n if (ts !== null) {\n timestampsByBaseUrl.set(normalized, ts);\n }\n if (models !== null || ts !== null) {\n providerIndex.add(normalized);\n }\n }\n\n // ---- Mutable state for non-model fields (kept in sync with kv) ----\n\n let mints: Record<string, string[]> = Object.fromEntries(\n Object.entries(rawMints).map(([baseUrl, mintList]) => [\n normalizeBaseUrl(baseUrl),\n mintList.map((mint) => (mint.endsWith(\"/\") ? mint.slice(0, -1) : mint)),\n ]),\n );\n\n let info: Record<string, ProviderInfo> = Object.fromEntries(\n Object.entries(rawInfo).map(([baseUrl, entry]) => [\n normalizeBaseUrl(baseUrl),\n entry,\n ]),\n );\n\n let _lastUsedModel: string | null = lastUsedModel;\n let _disabledProviders: string[] = rawDisabled.map(normalizeBaseUrl);\n let _baseUrlsList: string[] = rawBaseUrls.map(normalizeBaseUrl);\n let _lastBaseUrlsUpdate: number | null = lastBaseUrlsUpdate;\n let _routstr21Models: string[] = rawRoutstr21Models;\n let _lastRoutstr21ModelsUpdate: number | null = lastRoutstr21ModelsUpdate;\n\n const persistProviderIndex = (): void => {\n void driver.setItem(PROVIDER_INDEX_KEY, [...providerIndex]);\n };\n\n // ---- Build the adapter ----\n\n return {\n // -- Models (sharded kv) --\n\n getCachedModels: (): Record<string, Model[]> => {\n const result: Record<string, Model[]> = {};\n for (const [baseUrl, models] of modelsByBaseUrl.entries()) {\n result[baseUrl] = models;\n }\n return result;\n },\n\n setCachedModels: (models: Record<string, Model[]>): void => {\n const nextKeys = new Set(\n Object.keys(models).map((baseUrl) => normalizeBaseUrl(baseUrl)),\n );\n\n // Remove providers with cached models that are no longer present.\n // Providers that only have timestamps are left alone so failed-fetch\n // backoff timestamps survive later model-cache writes.\n for (const baseUrl of [...modelsByBaseUrl.keys()]) {\n if (!nextKeys.has(normalizeBaseUrl(baseUrl))) {\n providerIndex.delete(baseUrl);\n modelsByBaseUrl.delete(baseUrl);\n timestampsByBaseUrl.delete(baseUrl);\n void driver.removeItem(modelKey(baseUrl));\n void driver.removeItem(modelTsKey(baseUrl));\n }\n }\n\n // Write new/updated providers\n for (const [baseUrl, modelList] of Object.entries(models)) {\n const normalized = normalizeBaseUrl(baseUrl);\n providerIndex.add(normalized);\n modelsByBaseUrl.set(normalized, modelList);\n const ts = timestampsByBaseUrl.get(normalized) ?? Date.now();\n timestampsByBaseUrl.set(normalized, ts);\n void driver.setItem(modelKey(normalized), modelList);\n void driver.setItem(modelTsKey(normalized), ts);\n }\n\n persistProviderIndex();\n },\n\n getProviderLastUpdate: (baseUrl: string): number | null => {\n return timestampsByBaseUrl.get(normalizeBaseUrl(baseUrl)) ?? null;\n },\n\n setProviderLastUpdate: (baseUrl: string, timestamp: number): void => {\n const normalized = normalizeBaseUrl(baseUrl);\n providerIndex.add(normalized);\n timestampsByBaseUrl.set(normalized, timestamp);\n void driver.setItem(modelTsKey(normalized), timestamp);\n persistProviderIndex();\n },\n\n // -- Mints (kv) --\n\n getCachedMints: () => mints,\n\n setCachedMints: (value: Record<string, string[]>) => {\n const normalized: Record<string, string[]> = {};\n for (const [baseUrl, mintList] of Object.entries(value)) {\n normalized[normalizeBaseUrl(baseUrl)] = mintList.map((mint) =>\n mint.endsWith(\"/\") ? mint.slice(0, -1) : mint,\n );\n }\n mints = normalized;\n void driver.setItem(SDK_STORAGE_KEYS.MINTS_FROM_ALL_PROVIDERS, normalized);\n },\n\n // -- Provider info (kv) --\n\n getCachedProviderInfo: () => info,\n\n setCachedProviderInfo: (value: Record<string, ProviderInfo>) => {\n const normalized: Record<string, ProviderInfo> = {};\n for (const [baseUrl, entry] of Object.entries(value)) {\n normalized[normalizeBaseUrl(baseUrl)] = entry;\n }\n info = normalized;\n void driver.setItem(SDK_STORAGE_KEYS.INFO_FROM_ALL_PROVIDERS, normalized);\n },\n\n // -- Last used model (kv) --\n\n getLastUsedModel: () => _lastUsedModel,\n setLastUsedModel: (modelId: string) => {\n _lastUsedModel = modelId;\n void driver.setItem(SDK_STORAGE_KEYS.LAST_USED_MODEL, modelId);\n },\n\n // -- Disabled providers (kv) --\n\n getDisabledProviders: () => _disabledProviders,\n\n setDisabledProviders: (urls: string[]) => {\n const normalized = urls.map(normalizeBaseUrl);\n _disabledProviders = normalized;\n void driver.setItem(SDK_STORAGE_KEYS.DISABLED_PROVIDERS, normalized);\n },\n\n // -- Base URLs (kv) --\n\n getBaseUrlsList: () => _baseUrlsList,\n getBaseUrlsLastUpdate: () => _lastBaseUrlsUpdate,\n\n setBaseUrlsList: (urls: string[]) => {\n const normalized = urls.map(normalizeBaseUrl);\n _baseUrlsList = normalized;\n void driver.setItem(SDK_STORAGE_KEYS.BASE_URLS_LIST, normalized);\n },\n\n setBaseUrlsLastUpdate: (timestamp: number) => {\n _lastBaseUrlsUpdate = timestamp;\n void driver.setItem(SDK_STORAGE_KEYS.LAST_BASE_URLS_UPDATE, timestamp);\n },\n\n // -- Routstr21 models (kv) --\n\n getRoutstr21Models: () => _routstr21Models,\n\n setRoutstr21Models: (models: string[]) => {\n _routstr21Models = models;\n void driver.setItem(SDK_STORAGE_KEYS.ROUTSTR21_MODELS, models);\n },\n\n getRoutstr21ModelsLastUpdate: () => _lastRoutstr21ModelsUpdate,\n\n setRoutstr21ModelsLastUpdate: (timestamp: number) => {\n _lastRoutstr21ModelsUpdate = timestamp;\n void driver.setItem(\n SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE,\n timestamp,\n );\n },\n };\n};\n\nexport const createProviderRegistryFromDiscoveryAdapter = (\n adapter: DiscoveryAdapter,\n logger?: SdkLogger,\n): ProviderRegistry => {\n const log = (logger ?? consoleLogger).child(\"ProviderRegistry\");\n\n return {\n getModelsForProvider: (baseUrl: string): Model[] => {\n const normalized = normalizeBaseUrl(baseUrl);\n return adapter.getCachedModels()[normalized] || [];\n },\n\n getDisabledProviders: (): string[] => adapter.getDisabledProviders(),\n\n getProviderMints: (baseUrl: string): string[] => {\n const normalized = normalizeBaseUrl(baseUrl);\n return adapter.getCachedMints()[normalized] || [];\n },\n\n getProviderInfo: async (baseUrl: string): Promise<ProviderInfo | null> => {\n const normalized = normalizeBaseUrl(baseUrl);\n const cached = adapter.getCachedProviderInfo()[normalized];\n if (cached) return cached;\n\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 adapter.setCachedProviderInfo({\n ...adapter.getCachedProviderInfo(),\n [normalized]: info,\n });\n return info;\n } catch (error) {\n log.warn(`Failed to fetch provider info from ${normalized}:`, error);\n return null;\n }\n },\n\n getAllProvidersModels: (): Record<string, Model[]> =>\n adapter.getCachedModels(),\n };\n};\n","import { localStorageDriver } from \"./drivers/localStorage\";\nimport { createMemoryDriver } from \"./drivers/memory\";\nimport {\n createSqliteDriver,\n createBunSqliteDriver,\n} from \"./drivers/sqlite\";\nimport { createIndexedDBDriver } from \"./drivers/indexedDB\";\nimport {\n createIndexedDBUsageTrackingDriver,\n createMemoryUsageTrackingDriver,\n createSqliteUsageTrackingDriver,\n createBunSqliteUsageTrackingDriver,\n type UsageTrackingDriver,\n} from \"./usageTracking\";\nimport type { StorageDriver } from \"./types\";\nimport {\n createSdkStore,\n createStorageAdapterFromStore,\n type SdkStore,\n} from \"./store\";\nimport type { DiscoveryAdapter } from \"../discovery/interfaces\";\n\nexport type { StorageDriver } from \"./types\";\nexport type { SdkStore } from \"./store\";\nexport type { DiscoveryAdapter } from \"../discovery/interfaces\";\nexport type { StorageAdapter, ProviderRegistry, XCashuTokenEntry } from \"../wallet/interfaces\";\nexport type {\n UsageTrackingDriver,\n UsageTrackingEntry,\n ListUsageTrackingOptions,\n} from \"./usageTracking\";\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 createBunSqliteDriver,\n createIndexedDBDriver,\n};\nexport {\n createIndexedDBUsageTrackingDriver,\n createMemoryUsageTrackingDriver,\n createSqliteUsageTrackingDriver,\n createBunSqliteUsageTrackingDriver,\n} from \"./usageTracking\";\nimport {\n createProviderRegistryFromDiscoveryAdapter,\n createShardedDiscoveryAdapter,\n} from \"./shardedDiscoveryAdapter\";\nexport {\n createProviderRegistryFromDiscoveryAdapter,\n createShardedDiscoveryAdapter,\n} from \"./shardedDiscoveryAdapter\";\nexport type {\n ShardedDiscoveryAdapterOptions,\n} from \"./shardedDiscoveryAdapter\";\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 defaultStore: ReturnType<typeof createSdkStore> | null = null;\nlet defaultUsageTrackingDriver: UsageTrackingDriver | null = null;\n\nexport const getDefaultSdkStore = (): Promise<SdkStore> => {\n if (!defaultStore) {\n defaultStore = createSdkStore({ driver: getDefaultSdkDriver() });\n }\n return defaultStore.hydrate.then(() => defaultStore!.store);\n};\n\nexport const getDefaultUsageTrackingDriver = (): UsageTrackingDriver => {\n if (defaultUsageTrackingDriver) return defaultUsageTrackingDriver;\n\n const storageDriver = getDefaultSdkDriver();\n\n if (isBrowser()) {\n defaultUsageTrackingDriver = createIndexedDBUsageTrackingDriver({\n legacyStorageDriver: storageDriver,\n });\n return defaultUsageTrackingDriver;\n }\n\n if (isBun()) {\n defaultUsageTrackingDriver = createBunSqliteUsageTrackingDriver();\n return defaultUsageTrackingDriver;\n }\n\n if (isNode()) {\n defaultUsageTrackingDriver = createSqliteUsageTrackingDriver({\n legacyStorageDriver: storageDriver,\n });\n return defaultUsageTrackingDriver;\n }\n\n defaultUsageTrackingDriver = createMemoryUsageTrackingDriver();\n return defaultUsageTrackingDriver;\n};\n\n/**\n * Allow setting a custom usage tracking driver (useful for routstrd to use proper DB path)\n */\nexport const setDefaultUsageTrackingDriver = (driver: UsageTrackingDriver): void => {\n defaultUsageTrackingDriver = driver;\n};\n\nlet defaultDiscoveryAdapter: DiscoveryAdapter | null = null;\n\nexport const getDefaultDiscoveryAdapter = async (): Promise<DiscoveryAdapter> => {\n if (defaultDiscoveryAdapter) return defaultDiscoveryAdapter;\n\n const driver = getDefaultSdkDriver();\n defaultDiscoveryAdapter = await createShardedDiscoveryAdapter({ driver });\n return defaultDiscoveryAdapter;\n};\n\nexport const getDefaultStorageAdapter = async () =>\n createStorageAdapterFromStore(await getDefaultSdkStore());\n\nexport const getDefaultProviderRegistry = async () =>\n createProviderRegistryFromDiscoveryAdapter(await getDefaultDiscoveryAdapter());\n"]}
|
|
1
|
+
{"version":3,"sources":["../../storage/drivers/localStorage.ts","../../storage/drivers/memory.ts","../../storage/drivers/indexedDB.ts","../../storage/keys.ts","../../storage/usageTracking/aggregate.ts","../../storage/usageTracking/indexedDB.ts","../../storage/usageTracking/memory.ts","../../core/types.ts","../../storage/store.ts","../../storage/shardedDiscoveryAdapter.ts","../../storage/index.ts"],"names":["isBrowser","openDatabase","options","normalizeBaseUrl","matchesFilters","MIGRATION_MARKER_KEY"],"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\nexport interface IndexedDBDriverOptions {\n dbName?: string;\n storeName?: string;\n}\n\nconst isBrowser = typeof indexedDB !== \"undefined\";\n\nconst openDatabase = (\n dbName: string,\n storeName: string\n): Promise<IDBDatabase> => {\n if (!isBrowser) {\n return Promise.reject(new Error(\"IndexedDB is not available\"));\n }\n return new Promise((resolve, reject) => {\n // Version 2 — both sdk_storage and usage_tracking stores need to coexist.\n // Each driver creates its own store AND the other driver's store during\n // the upgrade to avoid a race where the second driver never gets onupgradeneeded.\n const request = indexedDB.open(dbName, 2);\n\n request.onupgradeneeded = () => {\n const db = request.result;\n // Create our own store\n if (!db.objectStoreNames.contains(storeName)) {\n db.createObjectStore(storeName);\n }\n // Also create usage_tracking if it doesn't exist (cross-driver init)\n if (storeName !== \"usage_tracking\" && !db.objectStoreNames.contains(\"usage_tracking\")) {\n const utStore = db.createObjectStore(\"usage_tracking\", { keyPath: \"id\" });\n utStore.createIndex(\"timestamp\", \"timestamp\", { unique: false });\n utStore.createIndex(\"modelId\", \"modelId\", { unique: false });\n utStore.createIndex(\"baseUrl\", \"baseUrl\", { unique: false });\n utStore.createIndex(\"sessionId\", \"sessionId\", { unique: false });\n utStore.createIndex(\"client\", \"client\", { unique: false });\n }\n // Also create sdk_storage if it doesn't exist (cross-driver init)\n if (storeName !== \"sdk_storage\" && !db.objectStoreNames.contains(\"sdk_storage\")) {\n db.createObjectStore(\"sdk_storage\");\n }\n };\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n request.onblocked = () => {\n console.warn(\n `[IndexedDB driver] open blocked for \"${dbName}\" (store: \"${storeName}\") — close other tabs using this DB`\n );\n reject(new Error(`IndexedDB \"${dbName}\" blocked by another connection`));\n };\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 API_KEYS: \"api_keys\",\n CHILD_KEYS: \"child_keys\",\n XCASHU_TOKENS: \"xcashu_tokens\",\n ROUTSTR21_MODELS: \"routstr21Models\",\n LAST_ROUTSTR21_MODELS_UPDATE: \"lastRoutstr21ModelsUpdate\",\n CACHED_RECEIVE_TOKENS: \"cached_receive_tokens\",\n USAGE_TRACKING: \"usage_tracking\",\n CLIENT_IDS: \"client_ids\",\n FAILED_PROVIDERS: \"failed_providers\",\n LAST_FAILED: \"last_failed\",\n PROVIDERS_ON_COOLDOWN: \"providers_on_cooldown\",\n} as const;\n\nexport type SdkStorageKey =\n (typeof SDK_STORAGE_KEYS)[keyof typeof SDK_STORAGE_KEYS];\n","import type {\n AggregateUsageOptions,\n UsageAggregateRow,\n UsageGroupBy,\n} from \"./interfaces\";\nimport type { UsageTrackingEntry } from \"./types\";\n\n// Shared, platform-agnostic aggregation helpers used by every usage tracking\n// driver. SQL drivers (bunSqlite/sqlite) push the work down to SQLite via\n// buildAggregateSql/mapAggregateRow; in-memory drivers (memory/indexedDB)\n// reduce in JS via reduceAggregate. Both paths must produce identical group\n// keys and ordering so callers get the same result regardless of backend.\n\nconst pad2 = (n: number): string => String(n).padStart(2, \"0\");\n\nconst aggregateColumns =\n \"COUNT(*) AS requests, \" +\n \"COALESCE(SUM(prompt_tokens), 0) AS promptTokens, \" +\n \"COALESCE(SUM(completion_tokens), 0) AS completionTokens, \" +\n \"COALESCE(SUM(total_tokens), 0) AS totalTokens, \" +\n \"COALESCE(SUM(cost), 0) AS cost, \" +\n \"COALESCE(SUM(sats_cost), 0) AS satsCost, \" +\n \"COALESCE(SUM(base_msats), 0) AS baseMsats, \" +\n \"COALESCE(SUM(input_msats), 0) AS inputMsats, \" +\n \"COALESCE(SUM(output_msats), 0) AS outputMsats, \" +\n \"COALESCE(SUM(total_msats), 0) AS totalMsats, \" +\n \"COALESCE(SUM(total_usd), 0) AS totalUsd, \" +\n \"COALESCE(SUM(cache_read_input_tokens), 0) AS cacheReadInputTokens, \" +\n \"COALESCE(SUM(cache_creation_input_tokens), 0) AS cacheCreationInputTokens, \" +\n \"COALESCE(SUM(cache_read_msats), 0) AS cacheReadMsats, \" +\n \"COALESCE(SUM(cache_creation_msats), 0) AS cacheCreationMsats\";\n\n/**\n * SQL expression producing the group key. `day`/`hour` shift the (millisecond)\n * timestamp by the timezone offset before bucketing so buckets land on the\n * caller's local-day/hour boundaries rather than UTC.\n */\nconst sqlGroupExpr = (\n groupBy: UsageGroupBy,\n): { expr: string; usesTz: boolean } => {\n switch (groupBy) {\n case \"modelId\":\n return { expr: \"model_id\", usesTz: false };\n case \"baseUrl\":\n return { expr: \"base_url\", usesTz: false };\n case \"client\":\n return { expr: \"client\", usesTz: false };\n case \"sessionId\":\n return { expr: \"session_id\", usesTz: false };\n case \"provider\":\n return { expr: \"provider\", usesTz: false };\n case \"day\":\n return {\n expr: \"strftime('%Y-%m-%d', (timestamp - ? * 60000) / 1000, 'unixepoch')\",\n usesTz: true,\n };\n case \"hour\":\n return {\n expr: \"strftime('%H', (timestamp - ? * 60000) / 1000, 'unixepoch')\",\n usesTz: true,\n };\n }\n};\n\n/**\n * Build an aggregation query from a driver-supplied WHERE clause. When\n * `groupBy` is omitted a single grand-total row is returned. Timezone params\n * (day/hour grouping) bind before the WHERE params because the group\n * expression appears earlier in the statement (the SELECT list).\n */\nexport const buildAggregateSql = (\n tableName: string,\n where: { sql: string; params: unknown[] },\n options: AggregateUsageOptions = {},\n): { sql: string; params: unknown[] } => {\n if (!options.groupBy) {\n return {\n sql: `SELECT NULL AS grp, ${aggregateColumns} FROM ${tableName} ${where.sql}`,\n params: where.params,\n };\n }\n\n const { expr, usesTz } = sqlGroupExpr(options.groupBy);\n const tzParams = usesTz ? [options.tzOffsetMinutes ?? 0] : [];\n const orderBy =\n options.groupBy === \"day\" || options.groupBy === \"hour\"\n ? \"ORDER BY grp ASC\"\n : \"ORDER BY satsCost DESC\";\n\n return {\n sql: `SELECT ${expr} AS grp, ${aggregateColumns} FROM ${tableName} ${where.sql} GROUP BY grp ${orderBy}`,\n params: [...tzParams, ...where.params],\n };\n};\n\n/** Map a raw SQL aggregate row into a `UsageAggregateRow`. */\nexport const mapAggregateRow = (row: Record<string, unknown>): UsageAggregateRow => ({\n group: row.grp == null ? null : String(row.grp),\n requests: Number(row.requests ?? 0),\n promptTokens: Number(row.promptTokens ?? 0),\n completionTokens: Number(row.completionTokens ?? 0),\n totalTokens: Number(row.totalTokens ?? 0),\n cost: Number(row.cost ?? 0),\n satsCost: Number(row.satsCost ?? 0),\n baseMsats: Number(row.baseMsats ?? 0),\n inputMsats: Number(row.inputMsats ?? 0),\n outputMsats: Number(row.outputMsats ?? 0),\n totalMsats: Number(row.totalMsats ?? 0),\n totalUsd: Number(row.totalUsd ?? 0),\n cacheReadInputTokens: Number(row.cacheReadInputTokens ?? 0),\n cacheCreationInputTokens: Number(row.cacheCreationInputTokens ?? 0),\n cacheReadMsats: Number(row.cacheReadMsats ?? 0),\n cacheCreationMsats: Number(row.cacheCreationMsats ?? 0),\n});\n\nconst jsGroupKey = (\n entry: UsageTrackingEntry,\n groupBy: UsageGroupBy,\n tzOffsetMinutes: number,\n): string | null => {\n switch (groupBy) {\n case \"modelId\":\n return entry.modelId ?? null;\n case \"baseUrl\":\n return entry.baseUrl ?? null;\n case \"client\":\n return entry.client ?? null;\n case \"sessionId\":\n return entry.sessionId ?? null;\n case \"provider\":\n return entry.provider ?? null;\n case \"day\": {\n const d = new Date(entry.timestamp - tzOffsetMinutes * 60000);\n return `${d.getUTCFullYear()}-${pad2(d.getUTCMonth() + 1)}-${pad2(d.getUTCDate())}`;\n }\n case \"hour\": {\n const d = new Date(entry.timestamp - tzOffsetMinutes * 60000);\n return pad2(d.getUTCHours());\n }\n }\n};\n\n/**\n * Reduce already-filtered entries into aggregate rows, mirroring the SQL\n * drivers' grouping and ordering. With no `groupBy`, returns a single\n * grand-total row (even for an empty input).\n */\nexport const reduceAggregate = (\n entries: UsageTrackingEntry[],\n options: AggregateUsageOptions = {},\n): UsageAggregateRow[] => {\n const emptyRow = (group: string | null): UsageAggregateRow => ({\n group,\n requests: 0,\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n cost: 0,\n satsCost: 0,\n baseMsats: 0,\n inputMsats: 0,\n outputMsats: 0,\n totalMsats: 0,\n totalUsd: 0,\n cacheReadInputTokens: 0,\n cacheCreationInputTokens: 0,\n cacheReadMsats: 0,\n cacheCreationMsats: 0,\n });\n\n const accumulate = (row: UsageAggregateRow, entry: UsageTrackingEntry): void => {\n row.requests += 1;\n row.promptTokens += entry.promptTokens;\n row.completionTokens += entry.completionTokens;\n row.totalTokens += entry.totalTokens;\n row.cost += entry.cost;\n row.satsCost += entry.satsCost;\n row.baseMsats += entry.baseMsats ?? 0;\n row.inputMsats += entry.inputMsats ?? 0;\n row.outputMsats += entry.outputMsats ?? 0;\n row.totalMsats += entry.totalMsats ?? 0;\n row.totalUsd += entry.totalUsd ?? 0;\n row.cacheReadInputTokens += entry.cacheReadInputTokens ?? 0;\n row.cacheCreationInputTokens += entry.cacheCreationInputTokens ?? 0;\n row.cacheReadMsats += entry.cacheReadMsats ?? 0;\n row.cacheCreationMsats += entry.cacheCreationMsats ?? 0;\n };\n\n if (!options.groupBy) {\n const total = emptyRow(null);\n for (const entry of entries) accumulate(total, entry);\n return [total];\n }\n\n const tz = options.tzOffsetMinutes ?? 0;\n const groups = new Map<string | null, UsageAggregateRow>();\n for (const entry of entries) {\n const key = jsGroupKey(entry, options.groupBy, tz);\n let row = groups.get(key);\n if (!row) {\n row = emptyRow(key);\n groups.set(key, row);\n }\n accumulate(row, entry);\n }\n\n const rows = [...groups.values()];\n if (options.groupBy === \"day\" || options.groupBy === \"hour\") {\n rows.sort((a, b) => (a.group ?? \"\").localeCompare(b.group ?? \"\"));\n } else {\n rows.sort((a, b) => b.satsCost - a.satsCost);\n }\n return rows;\n};\n","import { SDK_STORAGE_KEYS } from \"../keys\";\nimport type { StorageDriver } from \"../types\";\nimport type {\n AggregateUsageOptions,\n ListUsageTrackingOptions,\n UsageAggregateRow,\n UsageTrackingDriver,\n} from \"./interfaces\";\nimport type { UsageTrackingEntry } from \"./types\";\nimport { reduceAggregate } from \"./aggregate\";\n\nexport interface IndexedDBUsageTrackingDriverOptions {\n dbName?: string;\n storeName?: string;\n legacyStorageDriver?: StorageDriver;\n}\n\nconst DEFAULT_DB_NAME = \"routstr-sdk\";\nconst DEFAULT_STORE_NAME = \"usage_tracking\";\nconst MIGRATION_MARKER_KEY = \"usage_tracking_migration_v1\";\n\nconst isBrowser = typeof indexedDB !== \"undefined\";\n\nconst normalizeBaseUrl = (baseUrl: string): string =>\n baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n\nconst openDatabase = (\n dbName: string,\n storeName: string\n): Promise<IDBDatabase> => {\n if (!isBrowser) {\n return Promise.reject(new Error(\"IndexedDB is not available\"));\n }\n\n return new Promise((resolve, reject) => {\n // Version 3 — adds a `provider` index on the usage_tracking store.\n const request = indexedDB.open(dbName, 3);\n\n request.onupgradeneeded = () => {\n const db = request.result;\n const tx = request.transaction;\n // Create our own store\n if (!db.objectStoreNames.contains(storeName)) {\n const store = db.createObjectStore(storeName, { keyPath: \"id\" });\n store.createIndex(\"timestamp\", \"timestamp\", { unique: false });\n store.createIndex(\"modelId\", \"modelId\", { unique: false });\n store.createIndex(\"baseUrl\", \"baseUrl\", { unique: false });\n store.createIndex(\"sessionId\", \"sessionId\", { unique: false });\n store.createIndex(\"client\", \"client\", { unique: false });\n store.createIndex(\"provider\", \"provider\", { unique: false });\n } else if (tx) {\n // Existing store from an older version — add the new index in place.\n const store = tx.objectStore(storeName);\n if (!store.indexNames.contains(\"provider\")) {\n store.createIndex(\"provider\", \"provider\", { unique: false });\n }\n }\n // Also create sdk_storage if it doesn't exist (cross-driver init)\n if (storeName !== \"sdk_storage\" && !db.objectStoreNames.contains(\"sdk_storage\")) {\n db.createObjectStore(\"sdk_storage\");\n }\n };\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n request.onblocked = () => {\n console.warn(\n `[usageTracking IndexedDB] open blocked for \"${dbName}\" — close other tabs using this DB`\n );\n reject(new Error(`IndexedDB \"${dbName}\" blocked by another connection`));\n };\n });\n};\n\nconst matchesFilters = (\n entry: UsageTrackingEntry,\n options: Omit<ListUsageTrackingOptions, \"limit\"> = {}\n): boolean => {\n if (typeof options.before === \"number\" && entry.timestamp >= options.before) {\n return false;\n }\n if (typeof options.after === \"number\" && entry.timestamp <= options.after) {\n return false;\n }\n if (options.modelId && entry.modelId !== options.modelId) {\n return false;\n }\n if (options.baseUrl && normalizeBaseUrl(entry.baseUrl) !== normalizeBaseUrl(options.baseUrl)) {\n return false;\n }\n if (options.sessionId && entry.sessionId !== options.sessionId) {\n return false;\n }\n if (options.client && entry.client !== options.client) {\n return false;\n }\n if (\n options.clients &&\n options.clients.length > 0 &&\n (entry.client == null || !options.clients.includes(entry.client))\n ) {\n return false;\n }\n if (options.provider && entry.provider !== options.provider) {\n return false;\n }\n return true;\n};\n\nexport const createIndexedDBUsageTrackingDriver = (\n options: IndexedDBUsageTrackingDriverOptions = {}\n): UsageTrackingDriver => {\n const dbName = options.dbName || DEFAULT_DB_NAME;\n const storeName = options.storeName || DEFAULT_STORE_NAME;\n const legacyStorageDriver = options.legacyStorageDriver;\n\n let dbPromise: Promise<IDBDatabase> | null = null;\n let migrationPromise: Promise<void> | null = null;\n\n const getDb = (): Promise<IDBDatabase> => {\n if (!dbPromise) {\n dbPromise = openDatabase(dbName, storeName);\n }\n return dbPromise;\n };\n\n const putMany = async (entries: UsageTrackingEntry[]): Promise<void> => {\n if (entries.length === 0) return;\n const db = await getDb();\n await new Promise<void>((resolve, reject) => {\n const tx = db.transaction(storeName, \"readwrite\");\n const store = tx.objectStore(storeName);\n for (const entry of entries) {\n store.put({ ...entry, baseUrl: normalizeBaseUrl(entry.baseUrl) });\n }\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n };\n\n const ensureMigrated = async (): Promise<void> => {\n if (!legacyStorageDriver) return;\n if (!migrationPromise) {\n migrationPromise = (async () => {\n const migrated = await legacyStorageDriver.getItem<boolean>(\n MIGRATION_MARKER_KEY,\n false\n );\n if (migrated) return;\n\n const legacyEntries = await legacyStorageDriver.getItem<UsageTrackingEntry[]>(\n SDK_STORAGE_KEYS.USAGE_TRACKING,\n []\n );\n\n if (legacyEntries.length > 0) {\n await putMany(legacyEntries);\n await legacyStorageDriver.removeItem(SDK_STORAGE_KEYS.USAGE_TRACKING);\n }\n\n await legacyStorageDriver.setItem(MIGRATION_MARKER_KEY, true);\n })();\n }\n await migrationPromise;\n };\n\n return {\n async migrate(): Promise<void> {\n await ensureMigrated();\n },\n\n async append(entry: UsageTrackingEntry): Promise<void> {\n await ensureMigrated();\n await putMany([entry]);\n },\n\n async appendMany(entries: UsageTrackingEntry[]): Promise<void> {\n await ensureMigrated();\n await putMany(entries);\n },\n\n async list(options: ListUsageTrackingOptions = {}): Promise<UsageTrackingEntry[]> {\n await ensureMigrated();\n const db = await getDb();\n return new Promise<UsageTrackingEntry[]>((resolve, reject) => {\n const tx = db.transaction(storeName, \"readonly\");\n const store = tx.objectStore(storeName);\n const index = store.index(\"timestamp\");\n const direction: IDBCursorDirection = \"prev\";\n const request = index.openCursor(null, direction);\n const results: UsageTrackingEntry[] = [];\n const limit = options.limit;\n\n request.onsuccess = () => {\n const cursor = request.result;\n if (!cursor) {\n resolve(results);\n return;\n }\n\n const value = cursor.value as UsageTrackingEntry;\n if (matchesFilters(value, options)) {\n results.push(value);\n if (typeof limit === \"number\" && results.length >= limit) {\n resolve(results);\n return;\n }\n }\n cursor.continue();\n };\n\n request.onerror = () => reject(request.error);\n });\n },\n\n async count(options: Omit<ListUsageTrackingOptions, \"limit\"> = {}): Promise<number> {\n const results = await this.list(options);\n return results.length;\n },\n\n async aggregate(options: AggregateUsageOptions = {}): Promise<UsageAggregateRow[]> {\n const entries = await this.list(options);\n return reduceAggregate(entries, options);\n },\n\n async deleteOlderThan(timestamp: number): Promise<number> {\n await ensureMigrated();\n const db = await getDb();\n return new Promise<number>((resolve, reject) => {\n const tx = db.transaction(storeName, \"readwrite\");\n const store = tx.objectStore(storeName);\n const index = store.index(\"timestamp\");\n const range = IDBKeyRange.upperBound(timestamp, true);\n const request = index.openCursor(range);\n let deleted = 0;\n\n request.onsuccess = () => {\n const cursor = request.result;\n if (!cursor) {\n resolve(deleted);\n return;\n }\n deleted += 1;\n cursor.delete();\n cursor.continue();\n };\n\n request.onerror = () => reject(request.error);\n });\n },\n\n async clear(): Promise<void> {\n await ensureMigrated();\n const db = await getDb();\n await new Promise<void>((resolve, reject) => {\n const tx = db.transaction(storeName, \"readwrite\");\n tx.objectStore(storeName).clear();\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n },\n };\n};\n","import type {\n AggregateUsageOptions,\n ListUsageTrackingOptions,\n UsageAggregateRow,\n UsageTrackingDriver,\n} from \"./interfaces\";\nimport type { UsageTrackingEntry } from \"./types\";\nimport { reduceAggregate } from \"./aggregate\";\n\nconst normalizeBaseUrl = (baseUrl: string): string =>\n baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n\nconst matchesFilters = (\n entry: UsageTrackingEntry,\n options: Omit<ListUsageTrackingOptions, \"limit\"> = {}\n): boolean => {\n if (typeof options.before === \"number\" && entry.timestamp >= options.before) {\n return false;\n }\n if (typeof options.after === \"number\" && entry.timestamp <= options.after) {\n return false;\n }\n if (options.modelId && entry.modelId !== options.modelId) {\n return false;\n }\n if (options.baseUrl && normalizeBaseUrl(entry.baseUrl) !== normalizeBaseUrl(options.baseUrl)) {\n return false;\n }\n if (options.sessionId && entry.sessionId !== options.sessionId) {\n return false;\n }\n if (options.client && entry.client !== options.client) {\n return false;\n }\n if (\n options.clients &&\n options.clients.length > 0 &&\n (entry.client == null || !options.clients.includes(entry.client))\n ) {\n return false;\n }\n if (options.provider && entry.provider !== options.provider) {\n return false;\n }\n return true;\n};\n\nexport const createMemoryUsageTrackingDriver = (\n seed: UsageTrackingEntry[] = []\n): UsageTrackingDriver => {\n const store = new Map<string, UsageTrackingEntry>();\n\n for (const entry of seed) {\n store.set(entry.id, { ...entry, baseUrl: normalizeBaseUrl(entry.baseUrl) });\n }\n\n return {\n async migrate(): Promise<void> {\n return;\n },\n\n async append(entry: UsageTrackingEntry): Promise<void> {\n store.set(entry.id, { ...entry, baseUrl: normalizeBaseUrl(entry.baseUrl) });\n },\n\n async appendMany(entries: UsageTrackingEntry[]): Promise<void> {\n for (const entry of entries) {\n store.set(entry.id, { ...entry, baseUrl: normalizeBaseUrl(entry.baseUrl) });\n }\n },\n\n async list(options: ListUsageTrackingOptions = {}): Promise<UsageTrackingEntry[]> {\n const entries = [...store.values()]\n .filter((entry) => matchesFilters(entry, options))\n .sort((a, b) => b.timestamp - a.timestamp);\n if (typeof options.limit === \"number\") {\n return entries.slice(0, options.limit);\n }\n return entries;\n },\n\n async count(options: Omit<ListUsageTrackingOptions, \"limit\"> = {}): Promise<number> {\n return (await this.list(options)).length;\n },\n\n async aggregate(options: AggregateUsageOptions = {}): Promise<UsageAggregateRow[]> {\n const entries = [...store.values()].filter((entry) => matchesFilters(entry, options));\n return reduceAggregate(entries, options);\n },\n\n async deleteOlderThan(timestamp: number): Promise<number> {\n let deleted = 0;\n for (const [id, entry] of store.entries()) {\n if (entry.timestamp < timestamp) {\n store.delete(id);\n deleted += 1;\n }\n }\n return deleted;\n },\n\n async clear(): Promise<void> {\n store.clear();\n },\n };\n};\n","/**\n * Core types for the Routstr SDK\n * These types are shared across wallet and client modules\n */\n\nexport interface SdkLogger {\n log(...args: unknown[]): void;\n warn(...args: unknown[]): void;\n error(...args: unknown[]): void;\n debug(...args: unknown[]): void;\n child(prefix: string): SdkLogger;\n}\n\nfunction makeConsoleLogger(prefix?: string): SdkLogger {\n const fmt = (args: unknown[]) => (prefix ? [prefix, ...args] : args);\n return {\n log: (...args) => console.log(...fmt(args)),\n warn: (...args) => console.warn(...fmt(args)),\n error: (...args) => console.error(...fmt(args)),\n debug: (...args) => console.log(...fmt(args)),\n child: (p) => makeConsoleLogger(prefix ? `${prefix}:${p}` : p),\n };\n}\n\nexport const consoleLogger: SdkLogger = makeConsoleLogger();\n\nexport const noopLogger: SdkLogger = {\n log: () => {},\n warn: () => {},\n error: () => {},\n debug: () => {},\n child: () => noopLogger,\n};\n\nexport interface MessageContentType {\n type: \"text\" | \"image_url\" | \"file\";\n text?: string;\n image_url?: {\n url: string;\n storageId?: string;\n };\n file?: {\n url: string;\n name?: string;\n mimeType?: string;\n size?: number;\n };\n hidden?: boolean;\n thinking?: string;\n citations?: string[];\n}\n\nexport interface Message {\n role: string;\n content: string | MessageContentType[];\n _eventId?: string;\n _prevId?: string;\n _createdAt?: number;\n _modelId?: string;\n satsSpent?: number;\n}\n\nexport interface TransactionHistory {\n type: \"spent\" | \"mint\" | \"send\" | \"import\" | \"refund\";\n amount: number;\n timestamp: number;\n status: \"success\" | \"failed\";\n model?: string;\n message?: string;\n balance?: number;\n}\n\nexport interface ModelPricing {\n prompt: number;\n completion: number;\n request: number;\n image: number;\n web_search: number;\n internal_reasoning: number;\n}\n\nexport interface ModelSatsPricing extends ModelPricing {\n max_completion_cost: number;\n max_prompt_cost: number;\n max_cost: number;\n}\n\nexport interface ModelArchitecture {\n modality: string;\n input_modalities: readonly string[];\n output_modalities: readonly string[];\n tokenizer: string;\n instruct_type: string | null;\n}\n\nexport interface PerRequestLimits {\n readonly prompt_tokens?: number;\n readonly completion_tokens?: number;\n readonly requests_per_minute?: number;\n readonly images_per_minute?: number;\n readonly web_searches_per_minute?: number;\n readonly [key: string]: number | undefined;\n}\n\nexport interface Model {\n id: string;\n name: string;\n created?: number;\n description?: string;\n context_length?: number;\n architecture?: ModelArchitecture;\n pricing?: ModelPricing;\n sats_pricing: ModelSatsPricing;\n per_request_limits?: PerRequestLimits;\n}\n\n/**\n * Result from spending cashu tokens\n */\nexport interface SpendResult {\n token: string | null;\n status: \"success\" | \"failed\";\n balance: number;\n unit?: \"sat\" | \"msat\";\n error?: string;\n errorDetails?: {\n required: number;\n available: number;\n maxMintBalance: number;\n maxMintUrl: string;\n };\n}\n\n/**\n * Result from refund operations\n */\nexport interface RefundResult {\n success: boolean;\n refundedAmount?: number;\n message?: string;\n requestId?: string;\n}\n\n/**\n * Result from top up operations\n */\nexport interface TopUpResult {\n success: boolean;\n toppedUpAmount?: number;\n message?: string;\n requestId?: string;\n recoveredToken?: boolean;\n}\n\n/**\n * API error verdict for retry logic\n */\nexport interface APIErrorVerdict {\n retry: boolean;\n reason: string;\n newBaseUrl?: string; // New provider to retry with (for 50X errors)\n}\n\n/**\n * Image data from API response\n */\nexport interface ImageData {\n type: \"image_url\";\n image_url: {\n url: string;\n };\n index?: number;\n}\n\n/**\n * Annotation data from API response\n */\nexport interface AnnotationData {\n type: \"url_citation\";\n start_index: number;\n end_index: number;\n url: string;\n title: string;\n}\n\n/**\n * Usage statistics from API response\n */\nexport interface UsageStats {\n total_tokens?: number;\n prompt_tokens?: number;\n completion_tokens?: number;\n cost?: number;\n sats_cost?: number;\n}\n\n/**\n * Result from streaming response processing\n */\nexport interface StreamingResult {\n content: string;\n thinking?: string;\n images?: ImageData[];\n usage?: UsageStats;\n model?: string;\n responseId?: string;\n finish_reason?: string;\n citations?: string[];\n annotations?: AnnotationData[];\n}\n\n/**\n * Parameters for fetching AI response\n */\nexport interface FetchAIResponseParams {\n messageHistory: Message[];\n selectedModel: Model;\n baseUrl: string;\n mintUrl: string;\n balance: number;\n transactionHistory: TransactionHistory[];\n}\n\n/**\n * Candidate provider for failover\n */\nexport interface CandidateProvider {\n baseUrl: string;\n model: Model;\n cost: number;\n}\n\n/**\n * Mint selection result\n */\nexport interface MintSelection {\n selectedMintUrl: string | null;\n selectedMintBalance: number;\n}\n\n/**\n * Pending token entry\n */\nexport interface PendingTokenEntry {\n baseUrl: string;\n amount: number;\n}\n\n/**\n * Provider information from /v1/info endpoint\n */\nexport interface ProviderInfo {\n mints?: string[];\n [key: string]: any;\n}\n\n/**\n * Model discovery result\n */\nexport interface ModelDiscoveryResult {\n models: Model[];\n bestById: Map<string, { model: Model; base: string }>;\n totalProcessed: number;\n}\n\n/**\n * Mint discovery result\n */\nexport interface MintDiscoveryResult {\n mintsFromProviders: Record<string, string[]>;\n infoFromProviders: Record<string, ProviderInfo>;\n}\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, SdkLogger } from \"../core\";\nimport { consoleLogger } from \"../core/types\";\nimport { SDK_STORAGE_KEYS } from \"./keys\";\nimport type { StorageDriver, SdkStorageState } from \"./types\";\n\nconst normalizeBaseUrl = (baseUrl: string): string =>\n baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\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 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 setXcashuTokens: (\n value: Record<\n string,\n Array<{\n baseUrl: string;\n token: string;\n createdAt?: number;\n tryCount?: number;\n }>\n >\n ) => void;\n updateXcashuTokenTryCount: (token: string, tryCount: number) => 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 setClientIds: (\n value:\n | Array<{\n clientId: string;\n name: string;\n apiKey: string;\n createdAt?: number;\n lastUsed?: number | null;\n }>\n | ((\n current: SdkStorageStore[\"clientIds\"]\n ) => SdkStorageStore[\"clientIds\"])\n ) => void;\n // ========== Failure Tracking ==========\n setFailedProviders: (value: string[]) => void;\n addFailedProvider: (baseUrl: string) => void;\n removeFailedProvider: (baseUrl: string) => void;\n setLastFailed: (value: Record<string, number>) => void;\n setLastFailedTimestamp: (baseUrl: string, timestamp: number) => void;\n setProvidersOnCooldown: (\n value: Array<{ baseUrl: string; timestamp: number }>\n ) => void;\n addProviderOnCooldown: (baseUrl: string, timestamp: number) => void;\n removeProviderFromCooldown: (baseUrl: string) => void;\n clearProvidersOnCooldown: () => void;\n}\n\n/** Store type returned after async initialization */\nexport type SdkStore = StoreApi<SdkStorageStore>;\n\nconst createEmptyStore = (driver: StorageDriver): SdkStore =>\n createStore<SdkStorageStore>((set, get) => ({\n modelsFromAllProviders: {},\n lastUsedModel: null,\n baseUrlsList: [],\n lastBaseUrlsUpdate: null,\n disabledProviders: [],\n mintsFromAllProviders: {},\n infoFromAllProviders: {},\n lastModelsUpdate: {},\n apiKeys: [],\n childKeys: [],\n xcashuTokens: {},\n routstr21Models: [],\n lastRoutstr21ModelsUpdate: null,\n cachedReceiveTokens: [],\n clientIds: [],\n failedProviders: [],\n lastFailed: {},\n providersOnCooldown: [],\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 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 setXcashuTokens: (value) => {\n const normalized: Record<\n string,\n Array<{\n baseUrl: string;\n token: string;\n createdAt: number;\n tryCount: number;\n }>\n > = {};\n for (const [baseUrl, tokens] of Object.entries(value)) {\n normalized[normalizeBaseUrl(baseUrl)] = tokens.map((entry) => ({\n ...entry,\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n createdAt: entry.createdAt ?? Date.now(),\n tryCount: entry.tryCount ?? 0,\n }));\n }\n void driver.setItem(SDK_STORAGE_KEYS.XCASHU_TOKENS, normalized);\n set({ xcashuTokens: normalized });\n },\n updateXcashuTokenTryCount: (token, tryCount) => {\n const currentTokens = get().xcashuTokens;\n const updatedTokens: Record<\n string,\n Array<{\n baseUrl: string;\n token: string;\n createdAt: number;\n tryCount: number;\n }>\n > = {};\n\n for (const [baseUrl, tokens] of Object.entries(currentTokens)) {\n updatedTokens[baseUrl] = tokens.map((entry) =>\n entry.token === token ? { ...entry, tryCount } : entry\n );\n }\n\n void driver.setItem(SDK_STORAGE_KEYS.XCASHU_TOKENS, updatedTokens);\n set({ xcashuTokens: updatedTokens });\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 setClientIds: (value) => {\n set((state) => {\n const updates =\n typeof value === \"function\" ? value(state.clientIds) : value;\n const normalized = updates.map((entry) => ({\n ...entry,\n createdAt: entry.createdAt ?? Date.now(),\n lastUsed: entry.lastUsed ?? null,\n }));\n void driver.setItem(SDK_STORAGE_KEYS.CLIENT_IDS, normalized);\n return { clientIds: normalized };\n });\n },\n // ========== Failure Tracking ==========\n setFailedProviders: (value) => {\n const normalized = value.map((url) => normalizeBaseUrl(url));\n void driver.setItem(SDK_STORAGE_KEYS.FAILED_PROVIDERS, normalized);\n set({ failedProviders: normalized });\n },\n addFailedProvider: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const current = get().failedProviders;\n if (!current.includes(normalized)) {\n const updated = [...current, normalized];\n void driver.setItem(SDK_STORAGE_KEYS.FAILED_PROVIDERS, updated);\n set({ failedProviders: updated });\n }\n },\n removeFailedProvider: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const current = get().failedProviders;\n const updated = current.filter((url) => url !== normalized);\n void driver.setItem(SDK_STORAGE_KEYS.FAILED_PROVIDERS, updated);\n set({ failedProviders: updated });\n },\n setLastFailed: (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_FAILED, normalized);\n set({ lastFailed: normalized });\n },\n setLastFailedTimestamp: (baseUrl, timestamp) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const current = get().lastFailed;\n const updated = { ...current, [normalized]: timestamp };\n void driver.setItem(SDK_STORAGE_KEYS.LAST_FAILED, updated);\n set({ lastFailed: updated });\n },\n setProvidersOnCooldown: (value) => {\n const normalized = value.map((entry) => ({\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n timestamp: entry.timestamp,\n }));\n void driver.setItem(SDK_STORAGE_KEYS.PROVIDERS_ON_COOLDOWN, normalized);\n set({ providersOnCooldown: normalized });\n },\n addProviderOnCooldown: (baseUrl, timestamp) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const current = get().providersOnCooldown;\n if (!current.some((entry) => entry.baseUrl === normalized)) {\n const updated = [...current, { baseUrl: normalized, timestamp }];\n void driver.setItem(SDK_STORAGE_KEYS.PROVIDERS_ON_COOLDOWN, updated);\n set({ providersOnCooldown: updated });\n }\n },\n removeProviderFromCooldown: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const current = get().providersOnCooldown;\n const updated = current.filter((entry) => entry.baseUrl !== normalized);\n void driver.setItem(SDK_STORAGE_KEYS.PROVIDERS_ON_COOLDOWN, updated);\n set({ providersOnCooldown: updated });\n },\n clearProvidersOnCooldown: () => {\n void driver.setItem(SDK_STORAGE_KEYS.PROVIDERS_ON_COOLDOWN, []);\n set({ providersOnCooldown: [] });\n },\n }));\n\nconst hydrateStoreFromDriver = async (\n store: SdkStore,\n driver: StorageDriver\n): Promise<void> => {\n const [\n rawModels,\n lastUsedModel,\n rawBaseUrls,\n lastBaseUrlsUpdate,\n rawDisabledProviders,\n rawMints,\n rawInfo,\n rawLastModelsUpdate,\n rawApiKeys,\n rawChildKeys,\n rawXcashuTokens,\n rawRoutstr21Models,\n rawLastRoutstr21ModelsUpdate,\n rawCachedReceiveTokens,\n rawClientIds,\n rawFailedProviders,\n rawLastFailed,\n rawProvidersOnCooldown,\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 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<\n Record<\n string,\n Array<{\n baseUrl: string;\n token: string;\n createdAt?: number;\n tryCount?: number;\n }>\n >\n >(SDK_STORAGE_KEYS.XCASHU_TOKENS, {}),\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 clientId: string;\n name: string;\n apiKey: string;\n createdAt?: number;\n lastUsed?: number | null;\n }>\n >(SDK_STORAGE_KEYS.CLIENT_IDS, []),\n driver.getItem<string[]>(SDK_STORAGE_KEYS.FAILED_PROVIDERS, []),\n driver.getItem<Record<string, number>>(SDK_STORAGE_KEYS.LAST_FAILED, {}),\n driver.getItem<Array<{ baseUrl: string; timestamp: number }>>(\n SDK_STORAGE_KEYS.PROVIDERS_ON_COOLDOWN,\n []\n ),\n ]);\n\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 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 xcashuTokens = Object.fromEntries(\n Object.entries(rawXcashuTokens).map(([baseUrl, tokens]) => [\n normalizeBaseUrl(baseUrl),\n tokens.map((entry) => ({\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n token: entry.token,\n createdAt: entry.createdAt ?? Date.now(),\n tryCount: entry.tryCount ?? 0,\n })),\n ])\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 clientIds = rawClientIds.map((entry) => ({\n ...entry,\n createdAt: entry.createdAt ?? Date.now(),\n lastUsed: entry.lastUsed ?? null,\n }));\n\n const failedProviders = rawFailedProviders.map((url) =>\n normalizeBaseUrl(url)\n );\n const lastFailed = Object.fromEntries(\n Object.entries(rawLastFailed).map(([baseUrl, timestamp]) => [\n normalizeBaseUrl(baseUrl),\n timestamp,\n ])\n );\n const providersOnCooldown = rawProvidersOnCooldown.map((entry) => ({\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n timestamp: entry.timestamp,\n }));\n\n store.setState({\n modelsFromAllProviders,\n lastUsedModel,\n baseUrlsList,\n lastBaseUrlsUpdate,\n disabledProviders,\n mintsFromAllProviders,\n infoFromAllProviders,\n lastModelsUpdate,\n apiKeys,\n childKeys,\n xcashuTokens,\n routstr21Models,\n lastRoutstr21ModelsUpdate,\n cachedReceiveTokens,\n clientIds,\n failedProviders,\n lastFailed,\n providersOnCooldown,\n });\n};\n\nexport const createSdkStore = ({\n driver,\n}: SdkStoreOptions): { store: SdkStore; hydrate: Promise<void> } => {\n const store = createEmptyStore(driver);\n return {\n store,\n hydrate: hydrateStoreFromDriver(store, driver),\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 setDisabledProviders: (urls) => store.getState().setDisabledProviders(urls),\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 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 distributionMap[entry.baseUrl] =\n (distributionMap[entry.baseUrl] || 0) + sum;\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 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\n ? { ...entry, balance, lastUsed: Date.now() }\n : 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 // ========== XCashu Tokens (multiple tokens per baseUrl) ==========\n\n getXcashuTokens: () => {\n return store.getState().xcashuTokens;\n },\n\n getXcashuTokensForBaseUrl: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n return store.getState().xcashuTokens[normalized] || [];\n },\n\n addXcashuToken: (baseUrl, token) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const tokens = store.getState().xcashuTokens;\n const existing = tokens[normalized] || [];\n const next = { ...tokens };\n next[normalized] = [\n ...existing,\n { baseUrl: normalized, token, createdAt: Date.now(), tryCount: 0 },\n ];\n store.getState().setXcashuTokens(next);\n },\n\n removeXcashuToken: (baseUrl, token) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const tokens = store.getState().xcashuTokens;\n const existing = tokens[normalized] || [];\n const next = { ...tokens };\n next[normalized] = existing.filter((entry) => entry.token !== token);\n if (next[normalized].length === 0) {\n delete next[normalized];\n }\n store.getState().setXcashuTokens(next);\n },\n\n clearXcashuTokensForBaseUrl: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const tokens = store.getState().xcashuTokens;\n const next = { ...tokens };\n delete next[normalized];\n store.getState().setXcashuTokens(next);\n },\n\n updateXcashuTokenTryCount: (token, tryCount) => {\n store.getState().updateXcashuTokenTryCount(token, tryCount);\n },\n});\n\nexport const createProviderRegistryFromStore = (\n store: SdkStore,\n logger?: SdkLogger\n): ProviderRegistry => {\n const log = (logger ?? consoleLogger).child(\"ProviderRegistry\");\n return {\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 log.warn(`Failed to fetch provider info from ${normalized}:`, error);\n return null;\n }\n },\n getAllProvidersModels: () => store.getState().modelsFromAllProviders,\n };\n};\n","/**\n * Sharded DiscoveryAdapter\n *\n * Replaces the SQLite/IndexedDB ModelsDatabase layer with provider-scoped\n * sharding over the existing key-value StorageDriver.\n *\n * Instead of one giant blob:\n * modelsFromAllProviders → Record<string, Model[]>\n * lastModelsUpdate → Record<string, number>\n *\n * We use provider-scoped keys:\n * models:provider:<encodedBaseUrl> → Model[]\n * models:provider_timestamp:<encodedBaseUrl> → number\n *\n * All model data is hydrated into memory at creation time so the\n * synchronous DiscoveryAdapter contract is satisfied. Writes are\n * fire-and-forget via void driver.setItem(...).\n */\n\nimport type { DiscoveryAdapter } from \"../discovery/interfaces\";\nimport type { ProviderRegistry } from \"../wallet/interfaces\";\nimport type { Model, ProviderInfo, SdkLogger } from \"../core/types\";\nimport { consoleLogger } from \"../core/types\";\nimport type { StorageDriver } from \"./types\";\nimport { SDK_STORAGE_KEYS } from \"./keys\";\n\n// ---------------------------------------------------------------------------\n// Key helpers\n// ---------------------------------------------------------------------------\n\nconst MODEL_KEY_PREFIX = \"models:provider:\";\nconst MODEL_TS_KEY_PREFIX = \"models:provider_timestamp:\";\nconst PROVIDER_INDEX_KEY = \"models:provider_index\";\nconst MIGRATION_MARKER_KEY = \"models_sharded_migration_v1\";\n\nconst encodeBaseUrl = (baseUrl: string): string =>\n encodeURIComponent(baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`);\n\nconst modelKey = (baseUrl: string): string =>\n `${MODEL_KEY_PREFIX}${encodeBaseUrl(baseUrl)}`;\n\nconst modelTsKey = (baseUrl: string): string =>\n `${MODEL_TS_KEY_PREFIX}${encodeBaseUrl(baseUrl)}`;\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst normalizeBaseUrl = (baseUrl: string): string =>\n baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface ShardedDiscoveryAdapterOptions {\n /** Key-value StorageDriver */\n driver: StorageDriver;\n}\n\n// ---------------------------------------------------------------------------\n// Async factory — returns a fully-hydrated synchronous adapter\n// ---------------------------------------------------------------------------\n\nexport const createShardedDiscoveryAdapter = async (\n options: ShardedDiscoveryAdapterOptions,\n): Promise<DiscoveryAdapter> => {\n const { driver } = options;\n\n // ---- Migration from legacy key-value blob ----\n\n const legacyModels = await driver.getItem<\n Record<string, Model[]>\n >(SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS, {});\n\n const legacyTimestamps = await driver.getItem<\n Record<string, number>\n >(SDK_STORAGE_KEYS.LAST_MODELS_UPDATE, {});\n\n if (Object.keys(legacyModels).length > 0) {\n // Write each provider's models to a sharded key\n const migratedProviders: string[] = [];\n for (const [baseUrl, models] of Object.entries(legacyModels)) {\n const normalized = normalizeBaseUrl(baseUrl);\n await driver.setItem(modelKey(normalized), models);\n const ts = legacyTimestamps[normalized] ?? Date.now();\n await driver.setItem(modelTsKey(normalized), ts);\n migratedProviders.push(normalized);\n }\n\n // Update the index with migrated providers\n const existingIndex = await driver.getItem<string[]>(\n PROVIDER_INDEX_KEY,\n [],\n );\n const merged = [...new Set([...existingIndex, ...migratedProviders])];\n await driver.setItem(PROVIDER_INDEX_KEY, merged);\n\n // Clear legacy keys\n await driver.removeItem(SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS);\n await driver.removeItem(SDK_STORAGE_KEYS.LAST_MODELS_UPDATE);\n }\n\n await driver.setItem(MIGRATION_MARKER_KEY, true);\n\n // ---- Hydrate non-model fields once ----\n\n const [\n rawMints,\n rawInfo,\n lastUsedModel,\n rawDisabled,\n rawBaseUrls,\n lastBaseUrlsUpdate,\n rawRoutstr21Models,\n lastRoutstr21ModelsUpdate,\n ] = await Promise.all([\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<string | null>(SDK_STORAGE_KEYS.LAST_USED_MODEL, null),\n driver.getItem<string[]>(SDK_STORAGE_KEYS.DISABLED_PROVIDERS, []),\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.ROUTSTR21_MODELS, []),\n driver.getItem<number | null>(\n SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE,\n null,\n ),\n ]);\n\n // ---- Hydrate model data from sharded keys ----\n\n const modelsByBaseUrl = new Map<string, Model[]>();\n const timestampsByBaseUrl = new Map<string, number>();\n\n // Read the provider index to know which sharded keys exist.\n // We also include providers from info/mints/baseUrls/disabled lists\n // and the legacy blob (just migrated) in case a provider has been\n // configured but hasn't had models cached yet, or the index is\n // missing during migration.\n const providerIndex = new Set<string>();\n const knownProviders = new Set<string>();\n for (const baseUrl of Object.keys(rawInfo)) {\n knownProviders.add(normalizeBaseUrl(baseUrl));\n }\n for (const baseUrl of Object.keys(rawMints)) {\n knownProviders.add(normalizeBaseUrl(baseUrl));\n }\n for (const baseUrl of rawBaseUrls) {\n knownProviders.add(normalizeBaseUrl(baseUrl));\n }\n for (const baseUrl of rawDisabled) {\n knownProviders.add(normalizeBaseUrl(baseUrl));\n }\n for (const baseUrl of Object.keys(legacyModels)) {\n knownProviders.add(normalizeBaseUrl(baseUrl));\n }\n const indexProviders = await driver.getItem<string[]>(\n PROVIDER_INDEX_KEY,\n [],\n );\n for (const baseUrl of indexProviders) {\n const normalized = normalizeBaseUrl(baseUrl);\n providerIndex.add(normalized);\n knownProviders.add(normalized);\n }\n\n // Read sharded model data for each known provider\n for (const baseUrl of knownProviders) {\n const normalized = normalizeBaseUrl(baseUrl);\n const models = await driver.getItem<Model[] | null>(\n modelKey(normalized),\n null,\n );\n const ts = await driver.getItem<number | null>(\n modelTsKey(normalized),\n null,\n );\n\n if (models !== null) {\n modelsByBaseUrl.set(normalized, models);\n }\n if (ts !== null) {\n timestampsByBaseUrl.set(normalized, ts);\n }\n if (models !== null || ts !== null) {\n providerIndex.add(normalized);\n }\n }\n\n // ---- Mutable state for non-model fields (kept in sync with kv) ----\n\n let mints: Record<string, string[]> = Object.fromEntries(\n Object.entries(rawMints).map(([baseUrl, mintList]) => [\n normalizeBaseUrl(baseUrl),\n mintList.map((mint) => (mint.endsWith(\"/\") ? mint.slice(0, -1) : mint)),\n ]),\n );\n\n let info: Record<string, ProviderInfo> = Object.fromEntries(\n Object.entries(rawInfo).map(([baseUrl, entry]) => [\n normalizeBaseUrl(baseUrl),\n entry,\n ]),\n );\n\n let _lastUsedModel: string | null = lastUsedModel;\n let _disabledProviders: string[] = rawDisabled.map(normalizeBaseUrl);\n let _baseUrlsList: string[] = rawBaseUrls.map(normalizeBaseUrl);\n let _lastBaseUrlsUpdate: number | null = lastBaseUrlsUpdate;\n let _routstr21Models: string[] = rawRoutstr21Models;\n let _lastRoutstr21ModelsUpdate: number | null = lastRoutstr21ModelsUpdate;\n\n const persistProviderIndex = (): void => {\n void driver.setItem(PROVIDER_INDEX_KEY, [...providerIndex]);\n };\n\n // ---- Build the adapter ----\n\n return {\n // -- Models (sharded kv) --\n\n getCachedModels: (): Record<string, Model[]> => {\n const result: Record<string, Model[]> = {};\n for (const [baseUrl, models] of modelsByBaseUrl.entries()) {\n result[baseUrl] = models;\n }\n return result;\n },\n\n setCachedModels: (models: Record<string, Model[]>): void => {\n const nextKeys = new Set(\n Object.keys(models).map((baseUrl) => normalizeBaseUrl(baseUrl)),\n );\n\n // Remove providers with cached models that are no longer present.\n // Providers that only have timestamps are left alone so failed-fetch\n // backoff timestamps survive later model-cache writes.\n for (const baseUrl of [...modelsByBaseUrl.keys()]) {\n if (!nextKeys.has(normalizeBaseUrl(baseUrl))) {\n providerIndex.delete(baseUrl);\n modelsByBaseUrl.delete(baseUrl);\n timestampsByBaseUrl.delete(baseUrl);\n void driver.removeItem(modelKey(baseUrl));\n void driver.removeItem(modelTsKey(baseUrl));\n }\n }\n\n // Write new/updated providers\n for (const [baseUrl, modelList] of Object.entries(models)) {\n const normalized = normalizeBaseUrl(baseUrl);\n providerIndex.add(normalized);\n modelsByBaseUrl.set(normalized, modelList);\n const ts = timestampsByBaseUrl.get(normalized) ?? Date.now();\n timestampsByBaseUrl.set(normalized, ts);\n void driver.setItem(modelKey(normalized), modelList);\n void driver.setItem(modelTsKey(normalized), ts);\n }\n\n persistProviderIndex();\n },\n\n getProviderLastUpdate: (baseUrl: string): number | null => {\n return timestampsByBaseUrl.get(normalizeBaseUrl(baseUrl)) ?? null;\n },\n\n setProviderLastUpdate: (baseUrl: string, timestamp: number): void => {\n const normalized = normalizeBaseUrl(baseUrl);\n providerIndex.add(normalized);\n timestampsByBaseUrl.set(normalized, timestamp);\n void driver.setItem(modelTsKey(normalized), timestamp);\n persistProviderIndex();\n },\n\n // -- Mints (kv) --\n\n getCachedMints: () => mints,\n\n setCachedMints: (value: Record<string, string[]>) => {\n const normalized: Record<string, string[]> = {};\n for (const [baseUrl, mintList] of Object.entries(value)) {\n normalized[normalizeBaseUrl(baseUrl)] = mintList.map((mint) =>\n mint.endsWith(\"/\") ? mint.slice(0, -1) : mint,\n );\n }\n mints = normalized;\n void driver.setItem(SDK_STORAGE_KEYS.MINTS_FROM_ALL_PROVIDERS, normalized);\n },\n\n // -- Provider info (kv) --\n\n getCachedProviderInfo: () => info,\n\n setCachedProviderInfo: (value: Record<string, ProviderInfo>) => {\n const normalized: Record<string, ProviderInfo> = {};\n for (const [baseUrl, entry] of Object.entries(value)) {\n normalized[normalizeBaseUrl(baseUrl)] = entry;\n }\n info = normalized;\n void driver.setItem(SDK_STORAGE_KEYS.INFO_FROM_ALL_PROVIDERS, normalized);\n },\n\n // -- Last used model (kv) --\n\n getLastUsedModel: () => _lastUsedModel,\n setLastUsedModel: (modelId: string) => {\n _lastUsedModel = modelId;\n void driver.setItem(SDK_STORAGE_KEYS.LAST_USED_MODEL, modelId);\n },\n\n // -- Disabled providers (kv) --\n\n getDisabledProviders: () => _disabledProviders,\n\n setDisabledProviders: (urls: string[]) => {\n const normalized = urls.map(normalizeBaseUrl);\n _disabledProviders = normalized;\n void driver.setItem(SDK_STORAGE_KEYS.DISABLED_PROVIDERS, normalized);\n },\n\n // -- Base URLs (kv) --\n\n getBaseUrlsList: () => _baseUrlsList,\n getBaseUrlsLastUpdate: () => _lastBaseUrlsUpdate,\n\n setBaseUrlsList: (urls: string[]) => {\n const normalized = urls.map(normalizeBaseUrl);\n _baseUrlsList = normalized;\n void driver.setItem(SDK_STORAGE_KEYS.BASE_URLS_LIST, normalized);\n },\n\n setBaseUrlsLastUpdate: (timestamp: number) => {\n _lastBaseUrlsUpdate = timestamp;\n void driver.setItem(SDK_STORAGE_KEYS.LAST_BASE_URLS_UPDATE, timestamp);\n },\n\n // -- Routstr21 models (kv) --\n\n getRoutstr21Models: () => _routstr21Models,\n\n setRoutstr21Models: (models: string[]) => {\n _routstr21Models = models;\n void driver.setItem(SDK_STORAGE_KEYS.ROUTSTR21_MODELS, models);\n },\n\n getRoutstr21ModelsLastUpdate: () => _lastRoutstr21ModelsUpdate,\n\n setRoutstr21ModelsLastUpdate: (timestamp: number) => {\n _lastRoutstr21ModelsUpdate = timestamp;\n void driver.setItem(\n SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE,\n timestamp,\n );\n },\n };\n};\n\nexport const createProviderRegistryFromDiscoveryAdapter = (\n adapter: DiscoveryAdapter,\n logger?: SdkLogger,\n): ProviderRegistry => {\n const log = (logger ?? consoleLogger).child(\"ProviderRegistry\");\n\n return {\n getModelsForProvider: (baseUrl: string): Model[] => {\n const normalized = normalizeBaseUrl(baseUrl);\n return adapter.getCachedModels()[normalized] || [];\n },\n\n getDisabledProviders: (): string[] => adapter.getDisabledProviders(),\n\n getProviderMints: (baseUrl: string): string[] => {\n const normalized = normalizeBaseUrl(baseUrl);\n return adapter.getCachedMints()[normalized] || [];\n },\n\n getProviderInfo: async (baseUrl: string): Promise<ProviderInfo | null> => {\n const normalized = normalizeBaseUrl(baseUrl);\n const cached = adapter.getCachedProviderInfo()[normalized];\n if (cached) return cached;\n\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 adapter.setCachedProviderInfo({\n ...adapter.getCachedProviderInfo(),\n [normalized]: info,\n });\n return info;\n } catch (error) {\n log.warn(`Failed to fetch provider info from ${normalized}:`, error);\n return null;\n }\n },\n\n getAllProvidersModels: (): Record<string, Model[]> =>\n adapter.getCachedModels(),\n };\n};\n","import { localStorageDriver } from \"./drivers/localStorage\";\nimport { createMemoryDriver } from \"./drivers/memory\";\nimport { createIndexedDBDriver } from \"./drivers/indexedDB\";\nimport {\n createIndexedDBUsageTrackingDriver,\n createMemoryUsageTrackingDriver,\n type UsageTrackingDriver,\n} from \"./usageTracking\";\nimport type { StorageDriver } from \"./types\";\nimport {\n createSdkStore,\n createStorageAdapterFromStore,\n type SdkStore,\n} from \"./store\";\nimport type { DiscoveryAdapter } from \"../discovery/interfaces\";\n\nexport type { StorageDriver } from \"./types\";\nexport type { SdkStore } from \"./store\";\nexport type { DiscoveryAdapter } from \"../discovery/interfaces\";\nexport type { StorageAdapter, ProviderRegistry, XCashuTokenEntry } from \"../wallet/interfaces\";\nexport type {\n AggregateUsageOptions,\n ListUsageTrackingOptions,\n UsageAggregateRow,\n UsageGroupBy,\n UsageTrackingDriver,\n UsageTrackingEntry,\n} from \"./usageTracking\";\nexport { SDK_STORAGE_KEYS } from \"./keys\";\nexport {\n createSdkStore,\n createDiscoveryAdapterFromStore,\n createProviderRegistryFromStore,\n createStorageAdapterFromStore,\n} from \"./store\";\nexport {\n localStorageDriver,\n createMemoryDriver,\n createIndexedDBDriver,\n};\nexport {\n createIndexedDBUsageTrackingDriver,\n createMemoryUsageTrackingDriver,\n} from \"./usageTracking\";\nimport {\n createProviderRegistryFromDiscoveryAdapter,\n createShardedDiscoveryAdapter,\n} from \"./shardedDiscoveryAdapter\";\nexport {\n createProviderRegistryFromDiscoveryAdapter,\n createShardedDiscoveryAdapter,\n} from \"./shardedDiscoveryAdapter\";\nexport type {\n ShardedDiscoveryAdapterOptions,\n} from \"./shardedDiscoveryAdapter\";\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\nlet defaultDriver: StorageDriver | null = null;\n\nexport const getDefaultSdkDriver = (): StorageDriver => {\n if (defaultDriver) return defaultDriver;\n if (isBrowser()) {\n defaultDriver = localStorageDriver;\n return defaultDriver;\n }\n defaultDriver = createMemoryDriver();\n return defaultDriver;\n};\n\nlet defaultStore: ReturnType<typeof createSdkStore> | null = null;\nlet defaultUsageTrackingDriver: UsageTrackingDriver | null = null;\n\nexport const getDefaultSdkStore = (): Promise<SdkStore> => {\n if (!defaultStore) {\n defaultStore = createSdkStore({ driver: getDefaultSdkDriver() });\n }\n return defaultStore.hydrate.then(() => defaultStore!.store);\n};\n\nexport const getDefaultUsageTrackingDriver = (): UsageTrackingDriver => {\n if (defaultUsageTrackingDriver) return defaultUsageTrackingDriver;\n\n const storageDriver = getDefaultSdkDriver();\n\n if (isBrowser()) {\n defaultUsageTrackingDriver = createIndexedDBUsageTrackingDriver({\n legacyStorageDriver: storageDriver,\n });\n return defaultUsageTrackingDriver;\n }\n\n defaultUsageTrackingDriver = createMemoryUsageTrackingDriver();\n return defaultUsageTrackingDriver;\n};\n\n/**\n * Allow setting a custom usage tracking driver (useful for routstrd to use proper DB path)\n */\nexport const setDefaultUsageTrackingDriver = (driver: UsageTrackingDriver): void => {\n defaultUsageTrackingDriver = driver;\n};\n\nlet defaultDiscoveryAdapter: DiscoveryAdapter | null = null;\n\nexport const getDefaultDiscoveryAdapter = async (): Promise<DiscoveryAdapter> => {\n if (defaultDiscoveryAdapter) return defaultDiscoveryAdapter;\n\n const driver = getDefaultSdkDriver();\n defaultDiscoveryAdapter = await createShardedDiscoveryAdapter({ driver });\n return defaultDiscoveryAdapter;\n};\n\nexport const getDefaultStorageAdapter = async () =>\n createStorageAdapterFromStore(await getDefaultSdkStore());\n\nexport const getDefaultProviderRegistry = async () =>\n createProviderRegistryFromDiscoveryAdapter(await getDefaultDiscoveryAdapter());\n"]}
|