@seedprotocol/sdk 0.7.3-next.613.g79a8dfd → 0.7.3-next.654.g52217f6

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.
Files changed (164) hide show
  1. package/dist/{BasePathResolver-BdxCSIzn.js → BasePathResolver-CfSfMW5_.js} +7 -10
  2. package/dist/BasePathResolver-CfSfMW5_.js.map +1 -0
  3. package/dist/{ClientManager-DDA9956Y.js → ClientManager-C-QXqUK9.js} +438 -153
  4. package/dist/ClientManager-C-QXqUK9.js.map +1 -0
  5. package/dist/{Item-D4FigtYS.js → Item-C7sUUu2B.js} +291 -105
  6. package/dist/Item-C7sUUu2B.js.map +1 -0
  7. package/dist/{ModelProperty-BDt6AU2h.js → ModelProperty-DJxeOOrc.js} +28 -27
  8. package/dist/ModelProperty-DJxeOOrc.js.map +1 -0
  9. package/dist/{Schema-B8xqLWkL.js → Schema-fXtvd-yL.js} +30 -30
  10. package/dist/{Schema-B8xqLWkL.js.map → Schema-fXtvd-yL.js.map} +1 -1
  11. package/dist/{SchemaValidationService-BPxkfDLU.js → SchemaValidationService-CvRS2HSO.js} +10 -9
  12. package/dist/{SchemaValidationService-BPxkfDLU.js.map → SchemaValidationService-CvRS2HSO.js.map} +1 -1
  13. package/dist/{backfillMetadataPropertyIds-DuTPcv8t.js → backfillMetadataPropertyIds-SXW-8C64.js} +4 -4
  14. package/dist/{backfillMetadataPropertyIds-DuTPcv8t.js.map → backfillMetadataPropertyIds-SXW-8C64.js.map} +1 -1
  15. package/dist/cjs/{ModelProperty-B-cZm1yU.js → ModelProperty-DXZ39Wyv.js} +24 -23
  16. package/dist/cjs/{ModelProperty-B-cZm1yU.js.map → ModelProperty-DXZ39Wyv.js.map} +1 -1
  17. package/dist/cjs/{Schema-STP972Xw.js → Schema-DdP109QD.js} +26 -25
  18. package/dist/cjs/{Schema-STP972Xw.js.map → Schema-DdP109QD.js.map} +1 -1
  19. package/dist/cjs/{SchemaValidationService-CKNW1bKg.js → SchemaValidationService-CSXxx7sQ.js} +5 -4
  20. package/dist/cjs/{SchemaValidationService-CKNW1bKg.js.map → SchemaValidationService-CSXxx7sQ.js.map} +1 -1
  21. package/dist/cjs/{backfillMetadataPropertyIds-CP3y1skt.js → backfillMetadataPropertyIds-CPYoaMl4.js} +6 -5
  22. package/dist/cjs/{backfillMetadataPropertyIds-CP3y1skt.js.map → backfillMetadataPropertyIds-CPYoaMl4.js.map} +1 -1
  23. package/dist/cjs/{eas-CAnUC4wd.js → eas-B2YDQssV.js} +6 -5
  24. package/dist/cjs/{eas-CAnUC4wd.js.map → eas-B2YDQssV.js.map} +1 -1
  25. package/dist/cjs/{getItem-CWgb3e9G.js → getItem-DgnaQzbE.js} +5 -4
  26. package/dist/cjs/{getItem-CWgb3e9G.js.map → getItem-DgnaQzbE.js.map} +1 -1
  27. package/dist/cjs/{getPublishPayload-BsZWiJ03.js → getPublishPayload-CqlqRdot.js} +12 -11
  28. package/dist/cjs/{getPublishPayload-BsZWiJ03.js.map → getPublishPayload-CqlqRdot.js.map} +1 -1
  29. package/dist/cjs/getPublishUploads-DsXY9S4U.js +872 -0
  30. package/dist/cjs/getPublishUploads-DsXY9S4U.js.map +1 -0
  31. package/dist/cjs/{index-nA5PxBSs.js → index-BHaWOwNF.js} +6 -5
  32. package/dist/cjs/index-BHaWOwNF.js.map +1 -0
  33. package/dist/cjs/{index-usKaANAq.js → index-C4XlgCJ4.js} +1156 -526
  34. package/dist/cjs/index-C4XlgCJ4.js.map +1 -0
  35. package/dist/cjs/{property-xMwPhQ5N.js → property-fa0iju0J.js} +8 -7
  36. package/dist/cjs/{property-xMwPhQ5N.js.map → property-fa0iju0J.js.map} +1 -1
  37. package/dist/cjs/{publishDraftGraph-BRWlR1KO.js → publishDraftGraph-3ASwAlD7.js} +4 -4
  38. package/dist/cjs/{publishDraftGraph-BRWlR1KO.js.map → publishDraftGraph-3ASwAlD7.js.map} +1 -1
  39. package/dist/cjs/{resetAmbiguousLegacyItemData-8nfkj9rz.js → resetAmbiguousLegacyItemData-Bu_MBBYt.js} +5 -4
  40. package/dist/cjs/{resetAmbiguousLegacyItemData-8nfkj9rz.js.map → resetAmbiguousLegacyItemData-Bu_MBBYt.js.map} +1 -1
  41. package/dist/cjs/{resolveModelForSyncedSeed-kYRuDWYw.js → resolveModelForSyncedSeed-BANIiuFU.js} +2 -2
  42. package/dist/cjs/{resolveModelForSyncedSeed-kYRuDWYw.js.map → resolveModelForSyncedSeed-BANIiuFU.js.map} +1 -1
  43. package/dist/cjs/{syncDbWithEas-DqRhV8o2.js → syncDbWithEas-CrmxxmUW.js} +10 -9
  44. package/dist/cjs/{syncDbWithEas-DqRhV8o2.js.map → syncDbWithEas-CrmxxmUW.js.map} +1 -1
  45. package/dist/{configurePlatform-YcOiDQBZ.js → configurePlatform-BRw2j0ZN.js} +7 -4
  46. package/dist/{configurePlatform-YcOiDQBZ.js.map → configurePlatform-BRw2j0ZN.js.map} +1 -1
  47. package/dist/{db-CQt-gcAl.js → db-D9K_f5cF.js} +14 -14
  48. package/dist/{db-CQt-gcAl.js.map → db-D9K_f5cF.js.map} +1 -1
  49. package/dist/{eas-CpOD74Ke.js → eas-DHxfswCt.js} +8 -5
  50. package/dist/eas-DHxfswCt.js.map +1 -0
  51. package/dist/{getItem-B_OoFkd7.js → getItem-d6N_aM6S.js} +8 -5
  52. package/dist/{getItem-B_OoFkd7.js.map → getItem-d6N_aM6S.js.map} +1 -1
  53. package/dist/{getPublishPayload-Xl3sRkR-.js → getPublishPayload-BHrxVtzY.js} +16 -16
  54. package/dist/{getPublishPayload-Xl3sRkR-.js.map → getPublishPayload-BHrxVtzY.js.map} +1 -1
  55. package/dist/getPublishUploads-BEqRiKIS.js +657 -0
  56. package/dist/getPublishUploads-BEqRiKIS.js.map +1 -0
  57. package/dist/{index-BGt4_oPO.js → index-CiMEoGu3.js} +12 -11
  58. package/dist/index-CiMEoGu3.js.map +1 -0
  59. package/dist/{index-CSOQFAOn.js → index-DglvthOk.js} +2 -2
  60. package/dist/index-DglvthOk.js.map +1 -0
  61. package/dist/{index-Xl1_4Lmb.js → index-s15q14rm.js} +29 -29
  62. package/dist/{index-Xl1_4Lmb.js.map → index-s15q14rm.js.map} +1 -1
  63. package/dist/{index.browser-CjTe0vt1.js → index.browser-Cm06tP4X.js} +553 -165
  64. package/dist/index.browser-Cm06tP4X.js.map +1 -0
  65. package/dist/{index.node-Cfa7npS6.js → index.node-C30dmFgn.js} +5 -5
  66. package/dist/{index.node-Cfa7npS6.js.map → index.node-C30dmFgn.js.map} +1 -1
  67. package/dist/main.cjs +4 -3
  68. package/dist/main.cjs.map +1 -1
  69. package/dist/main.js +32 -44
  70. package/dist/main.js.map +1 -1
  71. package/dist/mimeTypes-DHAHC4eZ.js +204 -0
  72. package/dist/mimeTypes-DHAHC4eZ.js.map +1 -0
  73. package/dist/node.js +13 -12
  74. package/dist/node.js.map +1 -1
  75. package/dist/platform.browser.js +9 -7
  76. package/dist/platform.browser.js.map +1 -1
  77. package/dist/platform.node.js +3 -3
  78. package/dist/{property-BrXkY1Rg.js → property-DhmmYAvQ.js} +12 -9
  79. package/dist/property-DhmmYAvQ.js.map +1 -0
  80. package/dist/{publishDraftGraph-X0Wr9txE.js → publishDraftGraph-yYP74WRt.js} +8 -8
  81. package/dist/{publishDraftGraph-X0Wr9txE.js.map → publishDraftGraph-yYP74WRt.js.map} +1 -1
  82. package/dist/{resetAmbiguousLegacyItemData-Ci6PM_vC.js → resetAmbiguousLegacyItemData-Bk0QyDW8.js} +2 -2
  83. package/dist/{resetAmbiguousLegacyItemData-Ci6PM_vC.js.map → resetAmbiguousLegacyItemData-Bk0QyDW8.js.map} +1 -1
  84. package/dist/{resolveModelForSyncedSeed-DFVdnYq8.js → resolveModelForSyncedSeed-8cAzvUFd.js} +2 -2
  85. package/dist/{resolveModelForSyncedSeed-DFVdnYq8.js.map → resolveModelForSyncedSeed-8cAzvUFd.js.map} +1 -1
  86. package/dist/src/Item/Item.d.ts +1 -1
  87. package/dist/src/Item/Item.d.ts.map +1 -1
  88. package/dist/src/ItemProperty/service/actors/saveValueToDb/saveItemStorage.d.ts.map +1 -1
  89. package/dist/src/browser/helpers/FileManager.d.ts +4 -1
  90. package/dist/src/browser/helpers/FileManager.d.ts.map +1 -1
  91. package/dist/src/browser/helpers/tolerantWebAccess.d.ts +79 -4
  92. package/dist/src/browser/helpers/tolerantWebAccess.d.ts.map +1 -1
  93. package/dist/src/browser/workers/FileDownloader.d.ts +19 -4
  94. package/dist/src/browser/workers/FileDownloader.d.ts.map +1 -1
  95. package/dist/src/browser/workers/filesDownload.d.ts.map +1 -1
  96. package/dist/src/client/clientManagerMachine.d.ts.map +1 -1
  97. package/dist/src/db/migrateLegacyItemStorageRows.d.ts +57 -0
  98. package/dist/src/db/migrateLegacyItemStorageRows.d.ts.map +1 -0
  99. package/dist/src/db/read/getCompositeChildPaths.d.ts +13 -0
  100. package/dist/src/db/read/getCompositeChildPaths.d.ts.map +1 -0
  101. package/dist/src/db/read/getItems.d.ts.map +1 -1
  102. package/dist/src/db/read/getPublishUploads.d.ts +32 -3
  103. package/dist/src/db/read/getPublishUploads.d.ts.map +1 -1
  104. package/dist/src/db/read/summarizePublishWork.d.ts.map +1 -1
  105. package/dist/src/db/write/convertVerbatimItemStorageRow.d.ts +44 -0
  106. package/dist/src/db/write/convertVerbatimItemStorageRow.d.ts.map +1 -0
  107. package/dist/src/db/write/createNewItem.d.ts.map +1 -1
  108. package/dist/src/events/files/download.d.ts.map +1 -1
  109. package/dist/src/helpers/FileManager/BaseFileManager.d.ts +3 -3
  110. package/dist/src/helpers/FileManager/BaseFileManager.d.ts.map +1 -1
  111. package/dist/src/helpers/FileManager/IFileManager.d.ts +25 -1
  112. package/dist/src/helpers/FileManager/IFileManager.d.ts.map +1 -1
  113. package/dist/src/helpers/arweaveContentTags.d.ts +33 -0
  114. package/dist/src/helpers/arweaveContentTags.d.ts.map +1 -0
  115. package/dist/src/helpers/compositeUpload.d.ts +28 -0
  116. package/dist/src/helpers/compositeUpload.d.ts.map +1 -0
  117. package/dist/src/helpers/itemStorageFile.d.ts +57 -0
  118. package/dist/src/helpers/itemStorageFile.d.ts.map +1 -0
  119. package/dist/src/helpers/mapWithConcurrency.d.ts +7 -0
  120. package/dist/src/helpers/mapWithConcurrency.d.ts.map +1 -0
  121. package/dist/src/helpers/mimeTypes.d.ts +43 -0
  122. package/dist/src/helpers/mimeTypes.d.ts.map +1 -0
  123. package/dist/src/helpers/ownership.d.ts +19 -3
  124. package/dist/src/helpers/ownership.d.ts.map +1 -1
  125. package/dist/src/helpers/storageDir.d.ts +16 -0
  126. package/dist/src/helpers/storageDir.d.ts.map +1 -0
  127. package/dist/src/helpers/tabCoordinator.d.ts +5 -1
  128. package/dist/src/helpers/tabCoordinator.d.ts.map +1 -1
  129. package/dist/src/helpers/tabEvents.d.ts +23 -2
  130. package/dist/src/helpers/tabEvents.d.ts.map +1 -1
  131. package/dist/src/index.d.ts +6 -4
  132. package/dist/src/index.d.ts.map +1 -1
  133. package/dist/src/types/fileManager.d.ts +3 -14
  134. package/dist/src/types/fileManager.d.ts.map +1 -1
  135. package/dist/src/types/publish.d.ts +14 -0
  136. package/dist/src/types/publish.d.ts.map +1 -1
  137. package/dist/{syncDbWithEas-BU-jZ5bJ.js → syncDbWithEas--HUA9WNb.js} +15 -14
  138. package/dist/syncDbWithEas--HUA9WNb.js.map +1 -0
  139. package/dist/{tabEvents-BZJMY5uK.js → tabEvents-DguZpCCv.js} +294 -58
  140. package/dist/tabEvents-DguZpCCv.js.map +1 -0
  141. package/dist/tolerantWebAccess-BZYWt09Y.js +551 -0
  142. package/dist/tolerantWebAccess-BZYWt09Y.js.map +1 -0
  143. package/dist/{updateSeedRevokedAt-iLpzae1i.js → updateSeedRevokedAt-D_EG-q3b.js} +3 -3
  144. package/dist/{updateSeedRevokedAt-iLpzae1i.js.map → updateSeedRevokedAt-D_EG-q3b.js.map} +1 -1
  145. package/package.json +5 -5
  146. package/dist/BasePathResolver-BdxCSIzn.js.map +0 -1
  147. package/dist/ClientManager-DDA9956Y.js.map +0 -1
  148. package/dist/Item-D4FigtYS.js.map +0 -1
  149. package/dist/ModelProperty-BDt6AU2h.js.map +0 -1
  150. package/dist/cjs/getPublishUploads-BQr8aMVP.js +0 -495
  151. package/dist/cjs/getPublishUploads-BQr8aMVP.js.map +0 -1
  152. package/dist/cjs/index-nA5PxBSs.js.map +0 -1
  153. package/dist/cjs/index-usKaANAq.js.map +0 -1
  154. package/dist/eas-CpOD74Ke.js.map +0 -1
  155. package/dist/getPublishUploads-DHP01KgU.js +0 -484
  156. package/dist/getPublishUploads-DHP01KgU.js.map +0 -1
  157. package/dist/index-BGt4_oPO.js.map +0 -1
  158. package/dist/index-CSOQFAOn.js.map +0 -1
  159. package/dist/index.browser-CjTe0vt1.js.map +0 -1
  160. package/dist/property-BrXkY1Rg.js.map +0 -1
  161. package/dist/syncDbWithEas-BU-jZ5bJ.js.map +0 -1
  162. package/dist/tabEvents-BZJMY5uK.js.map +0 -1
  163. package/dist/tolerantWebAccess-BZ2RA_mb.js +0 -160
  164. package/dist/tolerantWebAccess-BZ2RA_mb.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"syncDbWithEas-DqRhV8o2.js","sources":["../../../src/db/read/getModelSchemas.ts","../../../src/db/write/createSeeds.ts","../../../src/db/write/updateSeedRevokedAt.ts","../../../src/events/item/syncDbWithEas.ts"],"sourcesContent":["// Dynamic import to break circular dependency: Model -> BaseItem -> ... -> getModelSchemas -> Model\n// import { Model } from '@/Model/Model'\nimport { BaseDb } from '@/db/Db/BaseDb'\nimport { models as modelsTable, modelUids } from '@/seedSchema'\nimport { eq } from 'drizzle-orm'\nimport pluralize from 'pluralize'\nimport { toSnakeCase } from '@/helpers'\n\ntype ModelRecord = {\n id: number\n name: string\n uid: string | null\n tableName?: string\n}\n\nconst schemaStringToModelRecord = new Map<string, ModelRecord>()\n\ntype GetModelSchemasReturn = {\n schemaStringToModelRecord: Map<string, ModelRecord>\n modelRecords: ModelRecord[]\n}\n\ntype GetModelSchemas = () => Promise<GetModelSchemasReturn>\n\nexport const getModelSchemas: GetModelSchemas = async () => {\n // Dynamic import to break circular dependency\n const modelMod = await import('../../Model/Model')\n const { Model } = modelMod\n const allModels = await Model.all()\n const modelRecords: ModelRecord[] = []\n\n const appDb = BaseDb.getAppDb()\n\n for (const model of allModels) {\n const modelName = model.modelName\n if (!modelName) continue\n const foundModelQuery = await appDb\n .select({\n id: modelsTable.id,\n name: modelsTable.name,\n uid: modelUids.uid,\n })\n .from(modelsTable)\n .leftJoin(modelUids, eq(modelsTable.id, modelUids.modelId))\n // Model names are only unique per schema: use this model's own row\n .where(model.id ? eq(modelsTable.schemaFileId, model.id) : eq(modelsTable.name, modelName))\n .limit(1)\n\n if (!foundModelQuery[0]) {\n console.error(\n `[item/events] [syncDbWithEas] model ${modelName} not found in SDK DB`,\n )\n continue\n }\n\n const foundModel: ModelRecord = {\n id: foundModelQuery[0].id,\n name: foundModelQuery[0].name,\n uid: foundModelQuery[0].uid,\n tableName: pluralize(foundModelQuery[0].name).toLowerCase(),\n }\n\n modelRecords.push(foundModel)\n\n if (modelName === 'Seed') {\n continue\n }\n\n const schemaString = `bytes32 ${toSnakeCase(modelName)}`\n\n schemaStringToModelRecord.set(schemaString, foundModel)\n }\n\n return {\n schemaStringToModelRecord,\n modelRecords,\n }\n}\n","import { seeds, SeedType } from '@/seedSchema'\nimport { BaseDb } from '@/db/Db/BaseDb'\nimport { normalizePublisher } from '@/helpers/addresses'\nimport { chunkValues, rowsPerInsert } from '@/db/sqlParamBatches'\n\ntype CreateSeeds = (newSeeds: Partial<SeedType>[]) => Promise<void>\n\nexport const createSeeds: CreateSeeds = async (\n newSeeds: Partial<SeedType>[],\n) => {\n const appDb = BaseDb.getAppDb()\n\n const values = newSeeds.map((row) => {\n const publisher = normalizePublisher(row.publisher)\n return {\n ...row,\n ...(publisher ? { publisher } : {}),\n }\n })\n\n // Sync can create thousands of seeds at once: keep each INSERT under SQLite's parameter limit.\n for (const chunk of chunkValues(values, rowsPerInsert(seeds))) {\n await appDb.insert(seeds).values(chunk)\n }\n}\n","import { BaseDb } from '@/db/Db/BaseDb'\nimport { metadata, seeds, versions } from '@/seedSchema'\nimport { and, eq, inArray, isNull, or } from 'drizzle-orm'\nimport { writeInBatches } from '@/db/sqlParamBatches'\n\ntype UpdateSeedRevokedAtProps = {\n seedLocalId: string\n /** Unix seconds. */\n revokedAt: number\n /**\n * Property attestation UIDs revoked along with the seed. Their metadata rows get the same\n * `revoked_at` (unless they already have one), so they read as revoked before the next sync.\n * Rows sync derived from them (ItemStorage rows whose `derived_from_uid` is one of these) are\n * stamped the same way.\n */\n metadataUids?: string[]\n /** Version attestation UIDs revoked along with the seed; their rows are stamped the same way. */\n versionUids?: string[]\n}\n\n/**\n * Sets revokedAt timestamp on a seed record after attestations have been revoked on EAS.\n */\nexport const updateSeedRevokedAt = async ({\n seedLocalId,\n revokedAt,\n metadataUids,\n versionUids,\n}: UpdateSeedRevokedAtProps): Promise<void> => {\n if (!seedLocalId) {\n return\n }\n\n const appDb = BaseDb.getAppDb()\n\n await appDb\n .update(seeds)\n .set({\n revokedAt,\n updatedAt: Date.now(),\n })\n .where(eq(seeds.localId, seedLocalId))\n\n // An item can have many property attestations; each list binds once per uid (twice for metadata).\n await writeInBatches(metadataUids ?? [], (chunk) =>\n appDb\n .update(metadata)\n .set({ revokedAt, updatedAt: Date.now() })\n .where(\n and(\n or(inArray(metadata.uid, chunk), inArray(metadata.derivedFromUid, chunk)),\n isNull(metadata.revokedAt),\n ),\n ),\n )\n\n await writeInBatches(versionUids ?? [], (chunk) =>\n appDb\n .update(versions)\n .set({ revokedAt, updatedAt: Date.now() })\n .where(and(inArray(versions.uid, chunk), isNull(versions.revokedAt))),\n )\n}\n","import { resolveItemModelFileId } from '@/db/read/resolveModelRecord'\nimport { resolveModelForSyncedSeed, skipSeedOnAmbiguousModel } from '@/db/read/resolveModelForSyncedSeed'\nimport { camelCase } from 'lodash-es'\nimport { Attestation, SchemaWhereInput } from '@seedprotocol/eas'\nimport {\n parseEasPropertyMetadata,\n parseEasRelationPropertyName,\n} from '@seedprotocol/query'\nimport {\n metadata,\n MetadataType,\n modelUids,\n seeds,\n SeedType,\n versions,\n VersionsType,\n} from '@/seedSchema'\nimport { and, eq, inArray, isNotNull, isNull, ne, or } from 'drizzle-orm'\nimport {\n generateId,\n} from '@/helpers'\nimport { modelPropertiesToObject } from '@/helpers/model'\nimport { GET_SEEDS } from '@seedprotocol/eas'\nimport {\n getAllAddressesFromDb,\n getItemStoragePropertiesForModel,\n getPropertyIdForModelAndName,\n} from '@/helpers/db'\n// Dynamic import to break circular dependency: Model -> BaseItem -> ... -> syncDbWithEas -> Model\n// import { Model } from '@/Model/Model'\nimport { BaseDb } from '@/db/Db/BaseDb'\nimport { getModelSchemas } from '@/db/read/getModelSchemas'\nimport { ModelSchema } from '@/types'\nimport { createSeeds } from '@/db/write/createSeeds'\nimport { rowsPerInsert, selectInBatches, writeInBatches } from '@/db/sqlParamBatches'\nimport { normalizeHexAddress } from '@/helpers/addresses'\nimport { updateSeedRevokedAt } from '@/db/write/updateSeedRevokedAt'\nimport { setSchemaUidForSchemaDefinition } from '@/stores/eas'\nimport { BaseEasClient } from '@/helpers/EasClient/BaseEasClient'\nimport {\n getItemPropertiesFromEas,\n getItemVersionsFromEas,\n getModelSchemasFromEas,\n getSeedsFromSchemaUids,\n} from '@/eas'\nimport { pickLatestPropertyAttestationsByRefAndSchema } from '@/helpers/easPropertyCanonical'\nimport { getGetAdditionalSyncAddresses } from '@/helpers/publishConfig'\nimport { scheduleBulkFilesDownloadFromEasSync } from '@/events/files/download'\nimport { assertLocalDbChain, waitForEasReadChain } from '@/helpers/localDbChain'\nimport { EAS_SEED_DATA_SYNCED_TO_DB_EVENT } from '@/helpers/constants'\nimport { emitAcrossTabs } from '@/helpers/tabEvents'\n\n/**\n * Sync stores the newest non-revoked attestation per (version, property schema). When every\n * attestation of a property is revoked (e.g. after `item.unpublish()`), keep the newest one so a\n * revoked item synced to a new device still has its last values next to its seed's `revokedAt`.\n */\nconst SYNC_CANONICAL_OPTIONS = { ifAllRevoked: 'newestRevoked' } as const\n\n/**\n * When an attestation was revoked, in Unix seconds: EAS `revocationTime` is a block timestamp in\n * seconds, the same unit local unpublish writes to `seeds.revoked_at`. `undefined` when not revoked.\n * A revoked attestation without a revocation time (0 or not selected) falls back to now.\n */\nconst revokedAtSeconds = (\n attestation: Pick<Attestation, 'revoked'> & { revocationTime?: number | null },\n): number | undefined => {\n if (!attestation.revoked) return undefined\n return attestation.revocationTime != null && attestation.revocationTime > 0\n ? attestation.revocationTime\n : Math.floor(Date.now() / 1000)\n}\n\n/**\n * `revoked_at` to store for an attestation that already has a row (seed, version or metadata), given the\n * stored value. EAS's `revocationTime` wins once EAS reports one. A stored stamp is otherwise kept:\n * local unpublish writes one only after its revoke transactions are mined, and revocation can't be\n * undone, so EAS reporting the attestation as live then just means its index hasn't caught up yet.\n */\nconst syncedRevokedAt = (\n attestation: Pick<Attestation, 'revoked'> & { revocationTime?: number | null },\n stored: number | null | undefined,\n): number | null => {\n if (attestation.revoked && attestation.revocationTime != null && attestation.revocationTime > 0) {\n return attestation.revocationTime\n }\n return stored ?? revokedAtSeconds(attestation) ?? null\n}\n\nconst relationValuesToExclude = [\n '0x0000000000000000000000000000000000000000000000000000000000000020',\n]\n\n\n/**\n * Lookups one `runSyncFromEas` run builds up as it stores seeds and versions, and the relation\n * targets its properties point at. Created per run and passed down, so a run never sees another\n * run's seeds or re-fetches its related seeds, even when runs overlap.\n */\ntype SyncRunState = {\n seedUidToLocalId: Map<string, string>\n seedUidToModelType: Map<string, string>\n versionUidToLocalId: Map<string, string>\n versionUidToSeedUid: Map<string, string>\n relatedSeedUids: Set<string>\n}\n\nconst createSyncRunState = (): SyncRunState => ({\n seedUidToLocalId: new Map(),\n seedUidToModelType: new Map(),\n versionUidToLocalId: new Map(),\n versionUidToSeedUid: new Map(),\n relatedSeedUids: new Set(),\n})\n\nconst isRelationPropertyName = (propertyNameSnake: string): boolean =>\n (propertyNameSnake.endsWith('_id') || propertyNameSnake.endsWith('_ids')) &&\n propertyNameSnake !== 'storage_transaction_id' &&\n propertyNameSnake !== 'storage_provider_transaction_id'\n\n/**\n * Seed UIDs that relation properties point at. Collected from every property the run fetched, not\n * only newly stored ones, so related seeds are refreshed (new versions, revocations) on each sync.\n */\nconst collectRelatedSeedUids = (properties: Attestation[], into: Set<string>): void => {\n for (const property of properties) {\n const parsed = parseEasPropertyMetadata(property.decodedDataJson)\n if (!parsed.ok) continue\n const { name, value } = parsed.metadata\n if (!name || !isRelationPropertyName(name)) continue\n const values = Array.isArray(value) ? value : [value]\n for (const v of values) {\n if (typeof v === 'string' && v && !relationValuesToExclude.includes(v)) into.add(v)\n }\n }\n}\n\n/**\n * Earlier syncs SQL-escaped a seed's attestation JSON (`'` -> `''`) and then bound it as a\n * parameter, so stored `seeds.attestation_raw` had every quote doubled. Doubled JSON still parses,\n * so a legacy row is recognized by comparing with the attestation EAS returns now: it is legacy\n * when it equals that attestation with quotes doubled, ignoring the revocation fields (EAS may have\n * revoked it since). A row whose data legitimately contains `''` equals the fresh JSON itself and is\n * left alone.\n */\nexport const isSqlEscapedAttestationRaw = (stored: string, fresh: Attestation): boolean => {\n if (!stored.includes(\"''\")) return false\n const freshJson = JSON.stringify(fresh)\n if (stored === freshJson || !freshJson.includes(\"'\")) return false\n let parsed: unknown\n try {\n parsed = JSON.parse(stored)\n } catch {\n return false\n }\n if (!parsed || typeof parsed !== 'object') return false\n const stored_ = parsed as Record<string, unknown>\n const withStoredRevocation = {\n ...fresh,\n ...('revoked' in stored_ && { revoked: stored_.revoked }),\n ...('revocationTime' in stored_ && { revocationTime: stored_.revocationTime }),\n }\n return stored === JSON.stringify(withStoredRevocation).replace(/'/g, \"''\")\n}\n\ntype SaveEasSeedsToDbProps = {\n itemSeeds: Attestation[]\n state: SyncRunState\n}\n\ntype SaveEasSeedsToDbReturn = {\n /** UIDs of every seed passed in (already stored or newly inserted). */\n seedUids: string[]\n}\n\ntype SaveEasSeedsToDb = (\n props: SaveEasSeedsToDbProps,\n) => Promise<SaveEasSeedsToDbReturn>\n\nconst saveEasSeedsToDb: SaveEasSeedsToDb = async ({ itemSeeds, state }) => {\n const { seedUidToLocalId, seedUidToModelType } = state\n const appDb = BaseDb.getAppDb()\n\n const seedUids = itemSeeds.map((seed) => seed.id)\n\n const existingSeedRecordsRows: SeedType[] = await selectInBatches(seedUids, (chunk) =>\n appDb.select().from(seeds).where(inArray(seeds.uid, chunk)),\n )\n\n const existingSeedUids = new Set<string>()\n\n if (existingSeedRecordsRows && existingSeedRecordsRows.length > 0) {\n for (const row of existingSeedRecordsRows) {\n if (row.uid) {\n existingSeedUids.add(row.uid)\n if (row.localId) {\n seedUidToLocalId.set(row.uid, row.localId)\n }\n if (row.type) {\n seedUidToModelType.set(row.uid, row.type)\n }\n }\n }\n }\n\n const newSeeds = itemSeeds.filter((seed) => !existingSeedUids.has(seed.id))\n\n // Update existing seeds when attestations are revoked on EAS, and replace a local unpublish stamp\n // with EAS's revocationTime once EAS reports one (see `syncedRevokedAt`).\n const seedByUid = new Map(itemSeeds.map((s) => [s.id, s]))\n for (const row of existingSeedRecordsRows) {\n if (!row.uid || !row.localId) continue\n const attestation = seedByUid.get(row.uid)\n if (!attestation) continue\n const revokedAt = syncedRevokedAt(attestation, row.revokedAt)\n if (revokedAt == null || revokedAt === row.revokedAt) continue\n await updateSeedRevokedAt({ seedLocalId: row.localId, revokedAt })\n }\n\n // Repair seed rows an earlier sync stored with SQL-escaped (doubled) quotes.\n for (const row of existingSeedRecordsRows) {\n if (!row.uid || !row.attestationRaw) continue\n const attestation = seedByUid.get(row.uid)\n if (!attestation || !isSqlEscapedAttestationRaw(row.attestationRaw, attestation)) continue\n await appDb\n .update(seeds)\n .set({ attestationRaw: JSON.stringify(attestation) })\n .where(eq(seeds.uid, row.uid))\n }\n\n if (newSeeds.length === 0) {\n return { seedUids }\n }\n\n const newSeedsData: Partial<SeedType>[] = []\n\n for (let i = 0; i < newSeeds.length; i++) {\n const seed = newSeeds[i]\n seedUidToModelType.set(seed.id, seed.schema.schemaNames[0].name)\n const seedLocalId = generateId()\n seedUidToLocalId.set(seed.id, seedLocalId)\n\n // createSeeds binds parameters: store the JSON as is.\n const attestationRaw = JSON.stringify(seed)\n const revokedAt = revokedAtSeconds(seed)\n\n // EAS only knows the model by name; the seam may match it to a local model (not built yet).\n const modelFileId = await resolveModelForSyncedSeed({\n seedUid: seed.id,\n seedLocalId,\n modelType: seed.schema.schemaNames[0].name,\n schemaUid: seed.schemaId,\n })\n\n newSeedsData.push({\n localId: seedLocalId,\n uid: seed.id,\n schemaUid: seed.schemaId,\n type: seed.schema.schemaNames[0].name,\n ...(modelFileId && { modelFileId }),\n publisher: seed.attester ? normalizeHexAddress(seed.attester) : seed.attester,\n createdAt: Date.now(),\n attestationCreatedAt: seed.timeCreated * 1000,\n attestationRaw,\n ...(revokedAt !== undefined && { revokedAt }),\n })\n }\n\n await createSeeds(newSeedsData)\n\n // All fetched seeds, not only the new ones: existing seeds can have new versions on EAS.\n return { seedUids }\n}\n\ntype SaveEasVersionsToDbParams = {\n itemVersions: Attestation[]\n state: SyncRunState\n}\n\ntype SaveEasVersionsToDb = (\n props: SaveEasVersionsToDbParams,\n) => Promise<SaveEasVersionsToDbReturn>\n\ntype SaveEasVersionsToDbReturn = {\n versionUids: string[]\n}\n\n/**\n * Rows per versions INSERT. A row binds at most one parameter per `versions` column (12 today, 10\n * set by sync), so a batch binds at most 600: under SQLite's old default limit of 999 host\n * parameters (sqlite-wasm and libsql allow more). saveEasVersionsBatches.test.ts checks this.\n */\nexport const VERSION_INSERT_BATCH = 50\n\nconst saveEasVersionsToDb: SaveEasVersionsToDb = async ({ itemVersions, state }) => {\n const { seedUidToLocalId, seedUidToModelType, versionUidToLocalId, versionUidToSeedUid } = state\n const versionUids = itemVersions.map((version) => version.id)\n\n const appDb = BaseDb.getAppDb()\n\n const existingVersionRecordsRows: VersionsType[] = await selectInBatches(versionUids, (chunk) =>\n appDb.select().from(versions).where(inArray(versions.uid, chunk)),\n )\n\n const existingVersionUids = new Set<string>()\n const versionByUid = new Map(itemVersions.map((version) => [version.id, version]))\n\n if (existingVersionRecordsRows && existingVersionRecordsRows.length > 0) {\n for (const row of existingVersionRecordsRows) {\n if (row.uid) {\n existingVersionUids.add(row.uid)\n if (row.localId) {\n versionUidToLocalId.set(row.uid, row.localId)\n }\n if (row.seedUid) {\n versionUidToSeedUid.set(row.uid, row.seedUid)\n }\n // Already-stored versions pick up revocations (and EAS's revocation time) too.\n const attestation = versionByUid.get(row.uid)\n const revokedAt = attestation ? syncedRevokedAt(attestation, row.revokedAt) : null\n if (attestation && revokedAt !== (row.revokedAt ?? null)) {\n await appDb\n .update(versions)\n .set({ revokedAt, updatedAt: Date.now() })\n .where(eq(versions.uid, row.uid))\n }\n }\n }\n }\n\n const newVersions = itemVersions.filter(\n (version) => !existingVersionUids.has(version.id),\n )\n\n const rows: (typeof versions.$inferInsert)[] = []\n const storedVersionUids = new Set(existingVersionUids)\n for (const version of newVersions) {\n const seedUid = version.refUID\n const seedLocalId = seedUidToLocalId.get(seedUid)\n if (!seedLocalId) {\n // Storing it anyway would orphan the version (and its properties) from any local seed.\n console.warn(\n '[item/events] [syncDbWithEas] skipping version whose seed has no local id: ',\n version.id,\n seedUid,\n )\n continue\n }\n const versionLocalId = generateId()\n versionUidToSeedUid.set(version.id, seedUid)\n versionUidToLocalId.set(version.id, versionLocalId)\n storedVersionUids.add(version.id)\n rows.push({\n localId: versionLocalId,\n uid: version.id,\n seedUid,\n seedLocalId,\n seedType: seedUidToModelType.get(seedUid) ?? null,\n createdAt: Date.now(),\n attestationCreatedAt: version.timeCreated * 1000,\n attestationRaw: JSON.stringify(version),\n publisher: version.attester ? normalizeHexAddress(version.attester) : '',\n revokedAt: revokedAtSeconds(version) ?? null,\n })\n }\n\n // Bound parameters: keep each statement well under SQLite's host-parameter limit.\n for (let i = 0; i < rows.length; i += VERSION_INSERT_BATCH) {\n await appDb.insert(versions).values(rows.slice(i, i + VERSION_INSERT_BATCH))\n }\n\n // Only versions that are stored locally: properties of a skipped version would have no version row.\n return { versionUids: versionUids.filter((uid) => storedVersionUids.has(uid)) }\n}\n\nconst createMetadataRecordsForStorageTransactionId = async (\n storageTransactionIdProperty: Attestation,\n modelSchema: ModelSchema | undefined,\n state: SyncRunState,\n) => {\n const { seedUidToLocalId, seedUidToModelType, versionUidToLocalId, versionUidToSeedUid } = state\n\n // Validate and parse decodedDataJson\n const parsed = parseEasPropertyMetadata(\n storageTransactionIdProperty.decodedDataJson,\n )\n if (!parsed.ok) {\n if (parsed.reason === 'empty') {\n console.warn(\n '[item/events] [syncDbWithEas] empty decodedDataJson for storageTransactionIdProperty: ',\n storageTransactionIdProperty.id,\n )\n } else if (parsed.reason === 'parse') {\n console.warn(\n '[item/events] [syncDbWithEas] failed to parse decodedDataJson for storageTransactionIdProperty: ',\n storageTransactionIdProperty.id,\n parsed.error,\n )\n } else {\n console.warn(\n '[item/events] [syncDbWithEas] invalid decodedDataJson structure for storageTransactionIdProperty: ',\n storageTransactionIdProperty.id,\n )\n }\n return\n }\n\n const attestationData = parsed.metadata\n const propertyName = camelCase(attestationData.name)\n const propertyValue =\n typeof attestationData.value === 'string'\n ? attestationData.value\n : JSON.stringify(attestationData.value)\n\n const seedUid = versionUidToSeedUid.get(storageTransactionIdProperty.refUID) as string\n const seedLocalId = seedUidToLocalId.get(seedUid)\n const versionUid = storageTransactionIdProperty.refUID\n const versionLocalId = versionUidToLocalId.get(versionUid)\n const modelType = seedUidToModelType.get(seedUid)\n\n // Storage settings come from the `properties` table. The model's property instances (modelSchema)\n // are only a fallback: whether they have loaded, and with storage settings, depends on timing.\n const itemStorageProperties = new Map<\n string,\n { id?: number; localStorageDir?: string | null; filenameSuffix?: string | null }\n >()\n if (modelType != null) {\n const stored =\n (await skipSeedOnAmbiguousModel({ seedLocalId, seedUid }, 'easSync.storageTransactionId', async () =>\n getItemStoragePropertiesForModel(modelType, {\n modelFileId: await resolveItemModelFileId({ seedLocalId, seedUid }),\n }),\n )) ?? []\n for (const property of stored) itemStorageProperties.set(property.name, property)\n }\n if (itemStorageProperties.size === 0 && modelSchema) {\n for (const [_propertyName, propertyDef] of Object.entries(modelSchema)) {\n if (propertyDef?.storageType === 'ItemStorage') {\n itemStorageProperties.set(_propertyName, {\n localStorageDir: propertyDef.localStorageDir,\n filenameSuffix: propertyDef.filenameSuffix,\n })\n }\n }\n }\n\n if (itemStorageProperties.size === 0) {\n return\n }\n\n const appDb = BaseDb.getAppDb()\n\n for (const [_propertyName, propertyDef] of itemStorageProperties.entries()) {\n const existingMetadataRecordRows = await appDb\n .select({ localId: metadata.localId })\n .from(metadata)\n .where(\n and(\n isNotNull(metadata.derivedFromUid),\n eq(metadata.propertyName, _propertyName),\n eq(metadata.propertyValue, propertyValue),\n eq(metadata.versionUid, storageTransactionIdProperty.refUID),\n ),\n )\n\n // Already derived from another attestation carrying this transaction id: syncDerivedStorageRows\n // points that row at the canonical attestation.\n if (existingMetadataRecordRows && existingMetadataRecordRows.length > 0) {\n continue\n }\n\n const propertyId =\n propertyDef.id ??\n (modelType != null\n ? ((await skipSeedOnAmbiguousModel({ seedLocalId, seedUid }, 'easSync.storageTransactionId', async () =>\n getPropertyIdForModelAndName(modelType, _propertyName, {\n modelFileId: await resolveItemModelFileId({ seedLocalId, seedUid }),\n }),\n )) ?? null)\n : null)\n\n const propertyLocalId = generateId()\n await appDb.insert(metadata).values({\n localId: propertyLocalId,\n propertyId: propertyId ?? undefined,\n propertyName: _propertyName,\n propertyValue,\n localStorageDir: propertyDef.localStorageDir ?? undefined,\n seedLocalId,\n seedUid,\n versionLocalId,\n versionUid,\n refValueType: 'file',\n refResolvedValue: `${propertyValue}${propertyDef.filenameSuffix ?? ''}`,\n modelType: seedUidToModelType.get(seedUid),\n derivedFromUid: storageTransactionIdProperty.id,\n // Ranked like a synced row, at its attestation's time: a local edit made after that\n // publish wins over it, a newer publish wins over an older edit.\n attestationCreatedAt: storageTransactionIdProperty.timeCreated * 1000,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n })\n }\n}\n\ntype SaveEasPropertiesToDbParams = {\n /** Every property attestation fetched for a set of versions, revoked ones included. */\n fetchedProperties: Attestation[]\n itemSeeds: Attestation[]\n state: SyncRunState\n}\n\ntype SaveEasPropertiesToDbReturn = {\n propertyUids: string[]\n}\n\ntype SaveEasPropertiesToDb = (\n props: SaveEasPropertiesToDbParams,\n) => Promise<SaveEasPropertiesToDbReturn>\n\n/** Serialize property saves: concurrent `runSyncFromEas` used to hit `isSavingToDb` and return `{}` with no insert. */\nlet saveEasPropertiesDbChain: Promise<unknown> = Promise.resolve()\n\n/**\n * Make local metadata match EAS for every fetched (version, property schema): exactly one synced\n * row, for the canonical attestation (ADR 0006), with `revoked_at` set when that attestation is\n * revoked (which, with `SYNC_CANONICAL_OPTIONS`, means all of the property's attestations on that\n * version are).\n *\n * - Canonical attestation not stored yet: insert it. This also covers an older live attestation\n * taking over from a revoked newer one, and a newer attestation superseding the stored one.\n * - Stored row for a fetched attestation that isn't canonical (revoked, or superseded): delete it,\n * so readers, which take the newest row per property, can't pick it.\n * - Stored canonical row: bring `revoked_at` up to date.\n *\n * Rows without an attestation UID (local edits) and rows for attestations EAS didn't return are\n * left alone.\n */\nconst saveEasPropertiesToDbBody = async ({\n fetchedProperties,\n itemSeeds,\n state,\n}: SaveEasPropertiesToDbParams): Promise<SaveEasPropertiesToDbReturn> => {\n const itemProperties = pickLatestPropertyAttestationsByRefAndSchema(\n fetchedProperties,\n SYNC_CANONICAL_OPTIONS,\n )\n const propertyUids = itemProperties.map((property) => property.id)\n\n collectRelatedSeedUids(itemProperties, state.relatedSeedUids)\n\n const appDb = BaseDb.getAppDb()\n\n const storedRows: Pick<MetadataType, 'uid' | 'revokedAt'>[] = await selectInBatches(\n fetchedProperties.map((property) => property.id),\n (chunk) =>\n appDb\n .select({ uid: metadata.uid, revokedAt: metadata.revokedAt })\n .from(metadata)\n .where(inArray(metadata.uid, chunk)),\n )\n\n const canonicalByUid = new Map(itemProperties.map((property) => [property.id, property]))\n const existingPropertyRecordsUids = new Set<string>()\n const staleUids = new Set<string>()\n const revokedAtUpdates = new Map<string, number | null>()\n\n for (const row of storedRows) {\n if (!row.uid) continue\n const canonical = canonicalByUid.get(row.uid)\n if (!canonical) {\n staleUids.add(row.uid)\n continue\n }\n existingPropertyRecordsUids.add(row.uid)\n // Same policy as seeds and versions: a local unpublish stamp stays until EAS reports a\n // revocationTime, even while EAS (its index lagging) still reports the attestation live.\n const revokedAt = syncedRevokedAt(canonical, row.revokedAt)\n if ((row.revokedAt ?? null) !== revokedAt) {\n revokedAtUpdates.set(row.uid, revokedAt)\n }\n }\n\n const newProperties = itemProperties.filter(\n (property) => !existingPropertyRecordsUids.has(property.id),\n )\n\n // Insert before deleting, so a property never goes without a row in between.\n if (newProperties.length > 0) {\n await insertSyncedProperties({ newProperties, itemSeeds, state })\n }\n\n if (staleUids.size > 0) {\n await writeInBatches([...staleUids], (chunk) =>\n appDb.delete(metadata).where(inArray(metadata.uid, chunk)),\n )\n }\n\n for (const [uid, revokedAt] of revokedAtUpdates) {\n await appDb\n .update(metadata)\n .set({ revokedAt, updatedAt: Date.now() })\n .where(eq(metadata.uid, uid))\n }\n\n await syncDerivedStorageRows({ fetchedProperties, canonicalProperties: itemProperties })\n\n return { propertyUids }\n}\n\n/** The transaction id a `storage_transaction_id` attestation carries; undefined for other properties. */\nconst storageTransactionIdOf = (property: Attestation): string | undefined => {\n const parsed = parseEasPropertyMetadata(property.decodedDataJson)\n if (!parsed.ok || parsed.metadata.name !== 'storage_transaction_id') return undefined\n const { value } = parsed.metadata\n // Same serialization as the derived rows' property_value.\n return typeof value === 'string' ? value : JSON.stringify(value)\n}\n\n/**\n * Make derived ItemStorage rows follow their `storage_transaction_id` attestation the way synced\n * rows follow theirs. Derived rows are identified by `derived_from_uid`, the attestation they were\n * derived from:\n * - A row derived from another fetched attestation with the canonical one's transaction id (on the\n * same version) is pointed at the canonical one; creation makes one row per transaction id.\n * - Rows derived from a fetched attestation that isn't canonical are deleted.\n * - Rows derived from the canonical one take its `revoked_at` once it has one (a stamp is never\n * cleared, see `syncedRevokedAt`).\n * Local drafts (no uid, no `derived_from_uid`) are never touched.\n */\nconst syncDerivedStorageRows = async ({\n fetchedProperties,\n canonicalProperties,\n}: {\n fetchedProperties: Attestation[]\n canonicalProperties: Attestation[]\n}): Promise<void> => {\n const canonical = canonicalProperties\n .map((property) => ({ property, transactionId: storageTransactionIdOf(property) }))\n .filter((c): c is { property: Attestation; transactionId: string } => !!c.transactionId)\n const canonicalUids = new Set(canonicalProperties.map((property) => property.id))\n\n const appDb = BaseDb.getAppDb()\n\n for (const { property, transactionId } of canonical) {\n const sameTransaction = fetchedProperties\n .filter(\n (other) =>\n other.id !== property.id &&\n other.refUID === property.refUID &&\n storageTransactionIdOf(other) === transactionId,\n )\n .map((other) => other.id)\n if (sameTransaction.length === 0) continue\n // A stamp belongs to the attestation it came from; the new source's is applied below.\n await writeInBatches(sameTransaction, (chunk) =>\n appDb\n .update(metadata)\n .set({\n derivedFromUid: property.id,\n revokedAt: null,\n attestationCreatedAt: property.timeCreated * 1000,\n updatedAt: Date.now(),\n })\n .where(inArray(metadata.derivedFromUid, chunk)),\n )\n }\n\n const staleSourceUids = fetchedProperties\n .filter((property) => !canonicalUids.has(property.id) && storageTransactionIdOf(property))\n .map((property) => property.id)\n if (staleSourceUids.length > 0) {\n await writeInBatches(staleSourceUids, (chunk) =>\n appDb.delete(metadata).where(inArray(metadata.derivedFromUid, chunk)),\n )\n }\n\n if (canonical.length === 0) return\n\n // The canonical rows' revoked_at as just stored (the saves above already applied EAS's state).\n const sourceRows: Pick<MetadataType, 'uid' | 'revokedAt'>[] = await selectInBatches(\n canonical.map((c) => c.property.id),\n (chunk) =>\n appDb\n .select({ uid: metadata.uid, revokedAt: metadata.revokedAt })\n .from(metadata)\n .where(inArray(metadata.uid, chunk)),\n )\n const revokedAtByUid = new Map(sourceRows.map((row) => [row.uid, row.revokedAt ?? null]))\n\n for (const { property } of canonical) {\n const revokedAt = revokedAtByUid.get(property.id) ?? null\n // The source's revoked_at already follows `syncedRevokedAt`. A live source leaves a derived\n // row's stamp alone: like a stamped synced row, it is only replaced by a revocation time.\n if (revokedAt == null) continue\n await appDb\n .update(metadata)\n .set({ revokedAt, updatedAt: Date.now() })\n .where(\n and(\n eq(metadata.derivedFromUid, property.id),\n or(isNull(metadata.revokedAt), ne(metadata.revokedAt, revokedAt)),\n ),\n )\n }\n}\n\n/**\n * The cached Model of a synced seed: its own model (seeds.model_file_id) when it has one, else by\n * EAS schema name, the snake_case model name (`sync_storage_post` → SyncStoragePost; a\n * `startCase` lookup never matched multi-word names). Throws AmbiguousModelError when several\n * schemas define a model with that name; callers skip the seed (skipSeedOnAmbiguousModel).\n */\nconst resolveSyncedSeedModel = async (\n Model: typeof import('../../Model/Model').Model,\n modelType: string,\n seed: { seedLocalId?: string | null; seedUid?: string | null },\n) => {\n const modelFileId = await resolveItemModelFileId(seed)\n return (modelFileId ? Model.getById(modelFileId) : undefined) ?? Model.findByModelType(modelType)\n}\n\nconst insertSyncedProperties = async ({\n newProperties,\n itemSeeds,\n state,\n}: {\n newProperties: Attestation[]\n itemSeeds: Attestation[]\n state: SyncRunState\n}): Promise<void> => {\n const { seedUidToLocalId, seedUidToModelType, versionUidToLocalId, versionUidToSeedUid } = state\n\n // Dynamic import to break circular dependency\n const modelMod = await import('../../Model/Model')\n const { Model } = modelMod\n // Loads every model into Model's cache, where resolveSyncedSeedModel looks them up.\n await Model.all()\n\n const appDb = BaseDb.getAppDb()\n\n // Bound as parameters, in batches of rowsPerInsert(metadata) rows, so no statement exceeds\n // SQLite's parameter or statement-length limits however many properties a sync stores.\n const rows: (typeof metadata.$inferInsert)[] = []\n\n for (const property of newProperties) {\n const propertyLocalId = generateId()\n \n // Validate and parse decodedDataJson\n const parsed = parseEasPropertyMetadata(property.decodedDataJson)\n if (!parsed.ok) {\n if (parsed.reason === 'empty') {\n console.warn(\n '[item/events] [syncDbWithEas] empty decodedDataJson for property: ',\n property.id,\n )\n } else if (parsed.reason === 'parse') {\n console.warn(\n '[item/events] [syncDbWithEas] failed to parse decodedDataJson for property: ',\n property.id,\n parsed.error,\n )\n } else {\n console.warn(\n '[item/events] [syncDbWithEas] invalid decodedDataJson structure for property: ',\n property.id,\n )\n }\n continue\n }\n\n const propertyMetadata = parsed.metadata\n\n let propertyNameSnake = propertyMetadata.name\n\n if (!propertyNameSnake) {\n console.warn(\n '[item/events] [syncDbWithEas] no propertyName found for property: ',\n property,\n )\n continue\n }\n\n let isRelation = false\n let refValueType\n let refSeedType\n let refSchemaUid\n let isList = false\n const schemaUid = property.schemaId\n\n setSchemaUidForSchemaDefinition({\n text: propertyNameSnake,\n schemaUid,\n })\n\n if (isRelationPropertyName(propertyNameSnake)) {\n isRelation = true\n\n if (Array.isArray(propertyMetadata.value)) {\n isList = true\n refValueType = 'list'\n\n const result = parseEasRelationPropertyName(propertyNameSnake)\n\n if (result) {\n propertyNameSnake = result.propertyName\n refSeedType = result.modelName\n }\n\n }\n\n if (!isList) {\n if (relationValuesToExclude.includes(propertyMetadata.value as string)) {\n continue\n }\n }\n }\n\n let propertyValue = propertyMetadata.value\n\n if (typeof propertyValue !== 'string') {\n propertyValue = JSON.stringify(propertyValue)\n }\n\n if (isRelation && !isList) {\n const relatedSeed = itemSeeds.find(\n (seed: Attestation) => seed.id === propertyMetadata.value,\n )\n if (relatedSeed && relatedSeed.schema && relatedSeed.schema.schemaNames) {\n refSeedType = relatedSeed.schema.schemaNames[0].name\n refSchemaUid = relatedSeed.schemaId\n }\n }\n\n if (isRelation && isList) {\n const relatedSeeds = itemSeeds.filter((seed: Attestation) =>\n (propertyMetadata.value as string[]).includes(seed.id),\n )\n if (relatedSeeds && relatedSeeds.length > 0) {\n refSeedType = relatedSeeds[0].schema.schemaNames[0].name\n refSchemaUid = relatedSeeds[0].schemaId\n }\n }\n\n const propertyName = camelCase(propertyNameSnake)\n const easDataType = propertyMetadata.type\n const versionUid = property.refUID\n const versionLocalId = versionUidToLocalId.get(versionUid)\n const attestationCreatedAt = property.timeCreated * 1000\n const seedUid = versionUidToSeedUid.get(versionUid)\n const seedLocalId = seedUidToLocalId.get(seedUid!)\n const modelType = seedUidToModelType.get(seedUid!)\n\n const model =\n modelType != null\n ? await skipSeedOnAmbiguousModel({ seedLocalId, seedUid }, 'easSync.metadata', async () =>\n resolveSyncedSeedModel(Model, modelType, { seedLocalId, seedUid }),\n )\n : undefined\n const modelSchema = model?.properties ? modelPropertiesToObject(model.properties) : undefined\n\n if (propertyNameSnake === 'storage_transaction_id') {\n await createMetadataRecordsForStorageTransactionId(property, modelSchema, state)\n }\n\n const propertyId =\n modelType != null\n ? ((await skipSeedOnAmbiguousModel({ seedLocalId, seedUid }, 'easSync.metadata', async () =>\n getPropertyIdForModelAndName(modelType, propertyName, {\n // EAS identifies models by name only; a locally-created seed still knows its model.\n modelFileId: await resolveItemModelFileId({ seedLocalId, seedUid }),\n }),\n )) ?? null)\n : null\n rows.push({\n localId: propertyLocalId,\n uid: property.id,\n schemaUid: property.schemaId,\n propertyId,\n propertyName,\n propertyValue,\n easDataType,\n versionUid,\n versionLocalId: versionLocalId ?? null,\n seedUid: seedUid ?? null,\n seedLocalId: seedLocalId ?? null,\n modelType: modelType ?? null,\n refValueType: refValueType || null,\n refSeedType: refSeedType || null,\n refModelUid: refSchemaUid || null,\n createdAt: Date.now(),\n attestationCreatedAt,\n attestationRaw: JSON.stringify(property),\n publisher: property.attester ? normalizeHexAddress(property.attester) : '',\n revokedAt: revokedAtSeconds(property) ?? null,\n })\n }\n\n // No conflict clause, as before: every row has a fresh local_id, and callers pass only\n // attestations with no stored row.\n const batchSize = rowsPerInsert(metadata)\n for (let i = 0; i < rows.length; i += batchSize) {\n await appDb.insert(metadata).values(rows.slice(i, i + batchSize))\n }\n}\n\nconst saveEasPropertiesToDb: SaveEasPropertiesToDb = (params) => {\n const next = saveEasPropertiesDbChain.then(() => saveEasPropertiesToDbBody(params))\n saveEasPropertiesDbChain = next.then(\n () => undefined,\n () => undefined,\n )\n return next\n}\n\n/**\n * Fetch every version of `seedUids` and every property attestation of those versions, and store\n * them. The main sync and the related-seed fetch both go through here, so they treat revocation\n * the same way: revoked attestations are fetched on purpose (`excludeRevoked: false`), revoked\n * seeds record `revokedAt` (in `saveEasSeedsToDb`), and properties go through the canonical pick\n * (newest non-revoked per version and property schema, see ADR 0006).\n */\nconst syncVersionsAndPropertiesForSeeds = async ({\n seedUids,\n itemSeeds,\n state,\n}: {\n seedUids: string[]\n itemSeeds: Attestation[]\n state: SyncRunState\n}): Promise<void> => {\n if (seedUids.length === 0) return\n\n const itemVersions = await getItemVersionsFromEas({\n seedUids,\n excludeRevoked: false,\n })\n\n const { versionUids } = await saveEasVersionsToDb({\n itemVersions,\n state,\n })\n if (versionUids.length === 0) return\n\n const fetchedProperties = await getItemPropertiesFromEas({\n versionUids,\n excludeRevoked: false,\n })\n\n // The save makes the canonical pick; it also needs the other attestations to clean up after them.\n await saveEasPropertiesToDb({\n fetchedProperties,\n itemSeeds,\n state,\n })\n}\n\n/**\n * Relation targets of synced properties, fetched by id from any attester (one level deep).\n *\n * This deliberately matches the main sync instead of filtering out revoked attestations: a\n * relation to an unpublished seed should still resolve locally, to the seed's last values next to\n * its `revokedAt`, exactly as if that seed had been synced in its own right. Filtering at the query\n * would also break the canonical pick, which needs the revoked attestations to skip them (or to\n * keep the newest one when all are revoked), and would leave `seeds.revoked_at` unset.\n */\nconst getRelatedSeedsAndVersions = async (state: SyncRunState) => {\n // Snapshot: relations found on the related seeds themselves aren't followed (one level deep).\n const uids = Array.from(state.relatedSeedUids)\n if (uids.length === 0) return\n\n const easClient = BaseEasClient.getEasClient()\n\n // No `revoked` filter, like `getSeedsFromSchemaUids({ excludeRevoked: false })` in the main sync.\n const { itemSeeds } = await easClient.request(GET_SEEDS, {\n where: {\n id: {\n in: uids,\n },\n },\n })\n\n const { seedUids } = await saveEasSeedsToDb({ itemSeeds, state })\n\n // Only seeds EAS returned: a version of an unknown seed would be stored without its seed.\n await syncVersionsAndPropertiesForSeeds({ seedUids, itemSeeds, state })\n}\n\nexport type SyncFromEasOptions = {\n /** Override addresses to sync. Default: owned + watched from DB. */\n addresses?: string[]\n}\n\n/**\n * Core sync logic: fetches item attestations from EAS for configured models and given addresses,\n * then saves seeds, versions, and properties to the local DB.\n * Uses owned + watched addresses from DB when addresses are not provided.\n */\nexport const runSyncFromEas = async (options?: SyncFromEasOptions): Promise<void> => {\n let addresses = options?.addresses ?? (await getAllAddressesFromDb())\n const additionalGetter = getGetAdditionalSyncAddresses()\n if (additionalGetter) {\n const additional = await additionalGetter()\n if (additional?.length) {\n const seen = new Set(addresses.map((a) => a.toLowerCase()))\n for (const addr of additional) {\n if (addr && !seen.has(addr.toLowerCase())) {\n seen.add(addr.toLowerCase())\n addresses = [...addresses, addr]\n }\n }\n }\n }\n if (!addresses || addresses.length === 0) {\n return\n }\n\n // Don't read the default chain while publish is about to configure another one.\n await waitForEasReadChain()\n // Never mix attestations from two chains in one local DB.\n await assertLocalDbChain()\n\n const appDb = BaseDb.getAppDb()\n\n const { schemaStringToModelRecord } = await getModelSchemas()\n\n const modelSchemas = await getModelSchemasFromEas()\n\n const schemaUids: string[] = []\n\n for (const modelSchema of modelSchemas) {\n const foundModel = schemaStringToModelRecord.get(modelSchema.schema)\n\n if (!foundModel) {\n // Skip schemas that don't have a corresponding model in the user's config\n // This can happen with \"bytes32 image\" if there's no Image model defined\n console.warn(\n `[item/events] [syncDbWithEas] Model not found for schema ${modelSchema.schema}, skipping`\n )\n continue\n }\n\n try {\n await appDb\n .insert(modelUids)\n .values({\n modelId: foundModel.id,\n uid: modelSchema.id,\n })\n .onConflictDoNothing()\n } catch (err: unknown) {\n // Model may have been deleted by test teardown or another process; skip to avoid unhandled rejection\n const e = err as { code?: string; rawCode?: number; cause?: { code?: string; rawCode?: number } }\n const code = e?.code ?? e?.rawCode ?? e?.cause?.code ?? e?.cause?.rawCode\n if (code === 'SQLITE_CONSTRAINT_FOREIGNKEY' || code === 787) {\n continue\n }\n throw err\n }\n\n schemaUids.push(modelSchema.id)\n }\n\n // If no schemas were found, skip the rest of the sync process\n // This can happen when models exist but don't have schemas registered in EAS yet\n if (schemaUids.length === 0) {\n return\n }\n\n const itemSeeds = await getSeedsFromSchemaUids({\n schemaUids,\n addresses,\n excludeRevoked: false,\n })\n\n const state = createSyncRunState()\n\n const { seedUids } = await saveEasSeedsToDb({\n itemSeeds,\n state,\n })\n\n await syncVersionsAndPropertiesForSeeds({ seedUids, itemSeeds, state })\n\n await getRelatedSeedsAndVersions(state)\n scheduleBulkFilesDownloadFromEasSync(addresses)\n\n try {\n const itemMod = await import('../../Item/Item')\n await itemMod.Item.rehydrateCachedItemsFromDbAfterEasSync()\n } catch (err) {\n console.warn('[item/events] [syncDbWithEas] rehydrateCachedItemsFromDbAfterEasSync:', err)\n }\n // Other tabs reload their cached Items too (docs/MULTI_TAB.md).\n emitAcrossTabs(EAS_SEED_DATA_SYNCED_TO_DB_EVENT)\n}\n\n"],"names":["BaseDb","modelsTable","modelUids","eq","toSnakeCase","normalizePublisher","chunkValues","rowsPerInsert","seeds","writeInBatches","metadata","and","or","inArray","isNull","versions","parseEasPropertyMetadata","selectInBatches","generateId","resolveModelForSyncedSeed","normalizeHexAddress","camelCase","skipSeedOnAmbiguousModel","getItemStoragePropertiesForModel","resolveItemModelFileId","isNotNull","getPropertyIdForModelAndName","pickLatestPropertyAttestationsByRefAndSchema","ne","setSchemaUidForSchemaDefinition","parseEasRelationPropertyName","modelPropertiesToObject","getItemVersionsFromEas","getItemPropertiesFromEas","BaseEasClient","GET_SEEDS","getAllAddressesFromDb","getGetAdditionalSyncAddresses","waitForEasReadChain","assertLocalDbChain","getModelSchemasFromEas","getSeedsFromSchemaUids","scheduleBulkFilesDownloadFromEasSync","emitAcrossTabs","EAS_SEED_DATA_SYNCED_TO_DB_EVENT"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AAcA,MAAM,yBAAyB,GAAG,IAAI,GAAG,EAAuB;AASzD,MAAM,eAAe,GAAoB,YAAW;;AAEzD,IAAA,MAAM,QAAQ,GAAG,MAAM,oDAAO,qBAAmB,8CAAC;AAClD,IAAA,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ;AAC1B,IAAA,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;IACnC,MAAM,YAAY,GAAkB,EAAE;AAEtC,IAAA,MAAM,KAAK,GAAGA,eAAM,CAAC,QAAQ,EAAE;AAE/B,IAAA,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE;AAC7B,QAAA,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS;AACjC,QAAA,IAAI,CAAC,SAAS;YAAE;QAChB,MAAM,eAAe,GAAG,MAAM;AAC3B,aAAA,MAAM,CAAC;YACN,EAAE,EAAEC,eAAW,CAAC,EAAE;YAClB,IAAI,EAAEA,eAAW,CAAC,IAAI;YACtB,GAAG,EAAEC,kBAAS,CAAC,GAAG;SACnB;aACA,IAAI,CAACD,eAAW;AAChB,aAAA,QAAQ,CAACC,kBAAS,EAAEC,aAAE,CAACF,eAAW,CAAC,EAAE,EAAEC,kBAAS,CAAC,OAAO,CAAC;;AAEzD,aAAA,KAAK,CAAC,KAAK,CAAC,EAAE,GAAGC,aAAE,CAACF,eAAW,CAAC,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,GAAGE,aAAE,CAACF,eAAW,CAAC,IAAI,EAAE,SAAS,CAAC;aACzF,KAAK,CAAC,CAAC,CAAC;AAEX,QAAA,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE;AACvB,YAAA,OAAO,CAAC,KAAK,CACX,uCAAuC,SAAS,CAAA,oBAAA,CAAsB,CACvE;YACD;QACF;AAEA,QAAA,MAAM,UAAU,GAAgB;AAC9B,YAAA,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE;AACzB,YAAA,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI;AAC7B,YAAA,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,GAAG;AAC3B,YAAA,SAAS,EAAE,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE;SAC5D;AAED,QAAA,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;AAE7B,QAAA,IAAI,SAAS,KAAK,MAAM,EAAE;YACxB;QACF;QAEA,MAAM,YAAY,GAAG,CAAA,QAAA,EAAWG,oBAAW,CAAC,SAAS,CAAC,EAAE;AAExD,QAAA,yBAAyB,CAAC,GAAG,CAAC,YAAY,EAAE,UAAU,CAAC;IACzD;IAEA,OAAO;QACL,yBAAyB;QACzB,YAAY;KACb;AACH,CAAC;;ACtEM,MAAM,WAAW,GAAgB,OACtC,QAA6B,KAC3B;AACF,IAAA,MAAM,KAAK,GAAGJ,eAAM,CAAC,QAAQ,EAAE;IAE/B,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,KAAI;QAClC,MAAM,SAAS,GAAGK,2BAAkB,CAAC,GAAG,CAAC,SAAS,CAAC;QACnD,OAAO;AACL,YAAA,GAAG,GAAG;AACN,YAAA,IAAI,SAAS,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;SACpC;AACH,IAAA,CAAC,CAAC;;AAGF,IAAA,KAAK,MAAM,KAAK,IAAIC,oBAAW,CAAC,MAAM,EAAEC,sBAAa,CAACC,cAAK,CAAC,CAAC,EAAE;QAC7D,MAAM,KAAK,CAAC,MAAM,CAACA,cAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;IACzC;AACF,CAAC;;ACJD;;AAEG;AACI,MAAM,mBAAmB,GAAG,OAAO,EACxC,WAAW,EACX,SAAS,EACT,YAAY,EACZ,WAAW,GACc,KAAmB;IAC5C,IAAI,CAAC,WAAW,EAAE;QAChB;IACF;AAEA,IAAA,MAAM,KAAK,GAAGR,eAAM,CAAC,QAAQ,EAAE;AAE/B,IAAA,MAAM;SACH,MAAM,CAACQ,cAAK;AACZ,SAAA,GAAG,CAAC;QACH,SAAS;AACT,QAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB;SACA,KAAK,CAACL,aAAE,CAACK,cAAK,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;;IAGxC,MAAMC,uBAAc,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC,KAAK,KAC7C;SACG,MAAM,CAACC,iBAAQ;SACf,GAAG,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;AACxC,SAAA,KAAK,CACJC,cAAG,CACDC,aAAE,CAACC,kBAAO,CAACH,iBAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,EAAEG,kBAAO,CAACH,iBAAQ,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,EACzEI,iBAAM,CAACJ,iBAAQ,CAAC,SAAS,CAAC,CAC3B,CACF,CACJ;IAED,MAAMD,uBAAc,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC,KAAK,KAC5C;SACG,MAAM,CAACM,iBAAQ;SACf,GAAG,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;SACxC,KAAK,CAACJ,cAAG,CAACE,kBAAO,CAACE,iBAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,EAAED,iBAAM,CAACC,iBAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CACxE;AACH,CAAC;;ACVD;;;;AAIG;AACH,MAAM,sBAAsB,GAAG,EAAE,YAAY,EAAE,eAAe,EAAW;AAEzE;;;;AAIG;AACH,MAAM,gBAAgB,GAAG,CACvB,WAA8E,KACxD;IACtB,IAAI,CAAC,WAAW,CAAC,OAAO;AAAE,QAAA,OAAO,SAAS;IAC1C,OAAO,WAAW,CAAC,cAAc,IAAI,IAAI,IAAI,WAAW,CAAC,cAAc,GAAG;UACtE,WAAW,CAAC;AACd,UAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AACnC,CAAC;AAED;;;;;AAKG;AACH,MAAM,eAAe,GAAG,CACtB,WAA8E,EAC9E,MAAiC,KAChB;AACjB,IAAA,IAAI,WAAW,CAAC,OAAO,IAAI,WAAW,CAAC,cAAc,IAAI,IAAI,IAAI,WAAW,CAAC,cAAc,GAAG,CAAC,EAAE;QAC/F,OAAO,WAAW,CAAC,cAAc;IACnC;IACA,OAAO,MAAM,IAAI,gBAAgB,CAAC,WAAW,CAAC,IAAI,IAAI;AACxD,CAAC;AAED,MAAM,uBAAuB,GAAG;IAC9B,oEAAoE;CACrE;AAgBD,MAAM,kBAAkB,GAAG,OAAqB;IAC9C,gBAAgB,EAAE,IAAI,GAAG,EAAE;IAC3B,kBAAkB,EAAE,IAAI,GAAG,EAAE;IAC7B,mBAAmB,EAAE,IAAI,GAAG,EAAE;IAC9B,mBAAmB,EAAE,IAAI,GAAG,EAAE;IAC9B,eAAe,EAAE,IAAI,GAAG,EAAE;AAC3B,CAAA,CAAC;AAEF,MAAM,sBAAsB,GAAG,CAAC,iBAAyB,KACvD,CAAC,iBAAiB,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC;AACxE,IAAA,iBAAiB,KAAK,wBAAwB;IAC9C,iBAAiB,KAAK,iCAAiC;AAEzD;;;AAGG;AACH,MAAM,sBAAsB,GAAG,CAAC,UAAyB,EAAE,IAAiB,KAAU;AACpF,IAAA,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE;QACjC,MAAM,MAAM,GAAGC,8BAAwB,CAAC,QAAQ,CAAC,eAAe,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE;QAChB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,QAAQ;AACvC,QAAA,IAAI,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC;YAAE;AAC5C,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,CAAC;AACrD,QAAA,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE;AACtB,YAAA,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC,CAAC;AAAE,gBAAA,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACrF;IACF;AACF,CAAC;AAED;;;;;;;AAOG;MACU,0BAA0B,GAAG,CAAC,MAAc,EAAE,KAAkB,KAAa;AACxF,IAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;AAAE,QAAA,OAAO,KAAK;IACxC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;IACvC,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC;AAAE,QAAA,OAAO,KAAK;AAClE,IAAA,IAAI,MAAe;AACnB,IAAA,IAAI;AACF,QAAA,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC7B;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,KAAK;IACd;AACA,IAAA,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;AAAE,QAAA,OAAO,KAAK;IACvD,MAAM,OAAO,GAAG,MAAiC;AACjD,IAAA,MAAM,oBAAoB,GAAG;AAC3B,QAAA,GAAG,KAAK;AACR,QAAA,IAAI,SAAS,IAAI,OAAO,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;AACzD,QAAA,IAAI,gBAAgB,IAAI,OAAO,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;KAC/E;AACD,IAAA,OAAO,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC;AAC5E;AAgBA,MAAM,gBAAgB,GAAqB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAI;AACxE,IAAA,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,GAAG,KAAK;AACtD,IAAA,MAAM,KAAK,GAAGhB,eAAM,CAAC,QAAQ,EAAE;AAE/B,IAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;AAEjD,IAAA,MAAM,uBAAuB,GAAe,MAAMiB,wBAAe,CAAC,QAAQ,EAAE,CAAC,KAAK,KAChF,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAACT,cAAK,CAAC,CAAC,KAAK,CAACK,kBAAO,CAACL,cAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAC5D;AAED,IAAA,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU;IAE1C,IAAI,uBAAuB,IAAI,uBAAuB,CAAC,MAAM,GAAG,CAAC,EAAE;AACjE,QAAA,KAAK,MAAM,GAAG,IAAI,uBAAuB,EAAE;AACzC,YAAA,IAAI,GAAG,CAAC,GAAG,EAAE;AACX,gBAAA,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AAC7B,gBAAA,IAAI,GAAG,CAAC,OAAO,EAAE;oBACf,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC;gBAC5C;AACA,gBAAA,IAAI,GAAG,CAAC,IAAI,EAAE;oBACZ,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC;gBAC3C;YACF;QACF;IACF;IAEA,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;;;IAI3E,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1D,IAAA,KAAK,MAAM,GAAG,IAAI,uBAAuB,EAAE;QACzC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO;YAAE;QAC9B,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AAC1C,QAAA,IAAI,CAAC,WAAW;YAAE;QAClB,MAAM,SAAS,GAAG,eAAe,CAAC,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC;QAC7D,IAAI,SAAS,IAAI,IAAI,IAAI,SAAS,KAAK,GAAG,CAAC,SAAS;YAAE;AACtD,QAAA,MAAM,mBAAmB,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;IACpE;;AAGA,IAAA,KAAK,MAAM,GAAG,IAAI,uBAAuB,EAAE;QACzC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc;YAAE;QACrC,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;QAC1C,IAAI,CAAC,WAAW,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,cAAc,EAAE,WAAW,CAAC;YAAE;AAClF,QAAA,MAAM;aACH,MAAM,CAACA,cAAK;aACZ,GAAG,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE;AACnD,aAAA,KAAK,CAACL,aAAE,CAACK,cAAK,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IAClC;AAEA,IAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;QACzB,OAAO,EAAE,QAAQ,EAAE;IACrB;IAEA,MAAM,YAAY,GAAwB,EAAE;AAE5C,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACxC,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC;AACxB,QAAA,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAChE,QAAA,MAAM,WAAW,GAAGU,mBAAU,EAAE;QAChC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC;;QAG1C,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AAC3C,QAAA,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC;;AAGxC,QAAA,MAAM,WAAW,GAAG,MAAMC,mDAAyB,CAAC;YAClD,OAAO,EAAE,IAAI,CAAC,EAAE;YAEhB,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI;YAC1C,SAAS,EAAE,IAAI,CAAC,QAAQ;AACzB,SAAA,CAAC;QAEF,YAAY,CAAC,IAAI,CAAC;AAChB,YAAA,OAAO,EAAE,WAAW;YACpB,GAAG,EAAE,IAAI,CAAC,EAAE;YACZ,SAAS,EAAE,IAAI,CAAC,QAAQ;YACxB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI;AACrC,YAAA,IAAI,WAAW,IAAI,EAAE,WAAW,EAAE,CAAC;AACnC,YAAA,SAAS,EAAE,IAAI,CAAC,QAAQ,GAAGC,4BAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,QAAQ;AAC7E,YAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;AACrB,YAAA,oBAAoB,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI;YAC7C,cAAc;YACd,IAAI,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,CAAC;AAC9C,SAAA,CAAC;IACJ;AAEA,IAAA,MAAM,WAAW,CAAC,YAAY,CAAC;;IAG/B,OAAO,EAAE,QAAQ,EAAE;AACrB,CAAC;AAeD;;;;AAIG;AACI,MAAM,oBAAoB,GAAG;AAEpC,MAAM,mBAAmB,GAAwB,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,KAAI;IACjF,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,GAAG,KAAK;AAChG,IAAA,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,EAAE,CAAC;AAE7D,IAAA,MAAM,KAAK,GAAGpB,eAAM,CAAC,QAAQ,EAAE;AAE/B,IAAA,MAAM,0BAA0B,GAAmB,MAAMiB,wBAAe,CAAC,WAAW,EAAE,CAAC,KAAK,KAC1F,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAACF,iBAAQ,CAAC,CAAC,KAAK,CAACF,kBAAO,CAACE,iBAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAClE;AAED,IAAA,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAU;IAC7C,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,OAAO,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IAElF,IAAI,0BAA0B,IAAI,0BAA0B,CAAC,MAAM,GAAG,CAAC,EAAE;AACvE,QAAA,KAAK,MAAM,GAAG,IAAI,0BAA0B,EAAE;AAC5C,YAAA,IAAI,GAAG,CAAC,GAAG,EAAE;AACX,gBAAA,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AAChC,gBAAA,IAAI,GAAG,CAAC,OAAO,EAAE;oBACf,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC;gBAC/C;AACA,gBAAA,IAAI,GAAG,CAAC,OAAO,EAAE;oBACf,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC;gBAC/C;;gBAEA,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AAC7C,gBAAA,MAAM,SAAS,GAAG,WAAW,GAAG,eAAe,CAAC,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC,GAAG,IAAI;AAClF,gBAAA,IAAI,WAAW,IAAI,SAAS,MAAM,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,EAAE;AACxD,oBAAA,MAAM;yBACH,MAAM,CAACA,iBAAQ;yBACf,GAAG,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;AACxC,yBAAA,KAAK,CAACZ,aAAE,CAACY,iBAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;gBACrC;YACF;QACF;IACF;IAEA,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CACrC,CAAC,OAAO,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAClD;IAED,MAAM,IAAI,GAAqC,EAAE;AACjD,IAAA,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,mBAAmB,CAAC;AACtD,IAAA,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE;AACjC,QAAA,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM;QAC9B,MAAM,WAAW,GAAG,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC;QACjD,IAAI,CAAC,WAAW,EAAE;;YAEhB,OAAO,CAAC,IAAI,CACV,6EAA6E,EAC7E,OAAO,CAAC,EAAE,EACV,OAAO,CACR;YACD;QACF;AACA,QAAA,MAAM,cAAc,GAAGG,mBAAU,EAAE;QACnC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC;QAC5C,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,cAAc,CAAC;AACnD,QAAA,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC;AACR,YAAA,OAAO,EAAE,cAAc;YACvB,GAAG,EAAE,OAAO,CAAC,EAAE;YACf,OAAO;YACP,WAAW;YACX,QAAQ,EAAE,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI;AACjD,YAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;AACrB,YAAA,oBAAoB,EAAE,OAAO,CAAC,WAAW,GAAG,IAAI;AAChD,YAAA,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;AACvC,YAAA,SAAS,EAAE,OAAO,CAAC,QAAQ,GAAGE,4BAAmB,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE;AACxE,YAAA,SAAS,EAAE,gBAAgB,CAAC,OAAO,CAAC,IAAI,IAAI;AAC7C,SAAA,CAAC;IACJ;;AAGA,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,oBAAoB,EAAE;QAC1D,MAAM,KAAK,CAAC,MAAM,CAACL,iBAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,oBAAoB,CAAC,CAAC;IAC9E;;IAGA,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE;AACjF,CAAC;AAED,MAAM,4CAA4C,GAAG,OACnD,4BAAyC,EACzC,WAAoC,EACpC,KAAmB,KACjB;IACF,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,GAAG,KAAK;;IAGhG,MAAM,MAAM,GAAGC,8BAAwB,CACrC,4BAA4B,CAAC,eAAe,CAC7C;AACD,IAAA,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE;AACd,QAAA,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE;YAC7B,OAAO,CAAC,IAAI,CACV,wFAAwF,EACxF,4BAA4B,CAAC,EAAE,CAChC;QACH;AAAO,aAAA,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE;AACpC,YAAA,OAAO,CAAC,IAAI,CACV,kGAAkG,EAClG,4BAA4B,CAAC,EAAE,EAC/B,MAAM,CAAC,KAAK,CACb;QACH;aAAO;YACL,OAAO,CAAC,IAAI,CACV,oGAAoG,EACpG,4BAA4B,CAAC,EAAE,CAChC;QACH;QACA;IACF;AAEA,IAAA,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ;IAClBK,kBAAS,CAAC,eAAe,CAAC,IAAI;AACnD,IAAA,MAAM,aAAa,GACjB,OAAO,eAAe,CAAC,KAAK,KAAK;UAC7B,eAAe,CAAC;UAChB,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,KAAK,CAAC;IAE3C,MAAM,OAAO,GAAG,mBAAmB,CAAC,GAAG,CAAC,4BAA4B,CAAC,MAAM,CAAW;IACtF,MAAM,WAAW,GAAG,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC;AACjD,IAAA,MAAM,UAAU,GAAG,4BAA4B,CAAC,MAAM;IACtD,MAAM,cAAc,GAAG,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC;IAC1D,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC;;;AAIjD,IAAA,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAGlC;AACH,IAAA,IAAI,SAAS,IAAI,IAAI,EAAE;QACrB,MAAM,MAAM,GACV,CAAC,MAAMC,kDAAwB,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,8BAA8B,EAAE,YACxFC,yCAAgC,CAAC,SAAS,EAAE;YAC1C,WAAW,EAAE,MAAMC,+BAAsB,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;AACpE,SAAA,CAAC,CACH,KAAK,EAAE;QACV,KAAK,MAAM,QAAQ,IAAI,MAAM;YAAE,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACnF;IACA,IAAI,qBAAqB,CAAC,IAAI,KAAK,CAAC,IAAI,WAAW,EAAE;AACnD,QAAA,KAAK,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;AACtE,YAAA,IAAI,WAAW,EAAE,WAAW,KAAK,aAAa,EAAE;AAC9C,gBAAA,qBAAqB,CAAC,GAAG,CAAC,aAAa,EAAE;oBACvC,eAAe,EAAE,WAAW,CAAC,eAAe;oBAC5C,cAAc,EAAE,WAAW,CAAC,cAAc;AAC3C,iBAAA,CAAC;YACJ;QACF;IACF;AAEA,IAAA,IAAI,qBAAqB,CAAC,IAAI,KAAK,CAAC,EAAE;QACpC;IACF;AAEA,IAAA,MAAM,KAAK,GAAGxB,eAAM,CAAC,QAAQ,EAAE;AAE/B,IAAA,KAAK,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC,IAAI,qBAAqB,CAAC,OAAO,EAAE,EAAE;QAC1E,MAAM,0BAA0B,GAAG,MAAM;aACtC,MAAM,CAAC,EAAE,OAAO,EAAEU,iBAAQ,CAAC,OAAO,EAAE;aACpC,IAAI,CAACA,iBAAQ;AACb,aAAA,KAAK,CACJC,cAAG,CACDc,oBAAS,CAACf,iBAAQ,CAAC,cAAc,CAAC,EAClCP,aAAE,CAACO,iBAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,EACxCP,aAAE,CAACO,iBAAQ,CAAC,aAAa,EAAE,aAAa,CAAC,EACzCP,aAAE,CAACO,iBAAQ,CAAC,UAAU,EAAE,4BAA4B,CAAC,MAAM,CAAC,CAC7D,CACF;;;QAIH,IAAI,0BAA0B,IAAI,0BAA0B,CAAC,MAAM,GAAG,CAAC,EAAE;YACvE;QACF;AAEA,QAAA,MAAM,UAAU,GACd,WAAW,CAAC,EAAE;aACb,SAAS,IAAI;mBACT,CAAC,MAAMY,kDAAwB,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,8BAA8B,EAAE,YACzFI,qCAA4B,CAAC,SAAS,EAAE,aAAa,EAAE;oBACrD,WAAW,EAAE,MAAMF,+BAAsB,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;AACpE,iBAAA,CAAC,CACH,KAAK,IAAI;kBACV,IAAI,CAAC;AAEX,QAAA,MAAM,eAAe,GAAGN,mBAAU,EAAE;QACpC,MAAM,KAAK,CAAC,MAAM,CAACR,iBAAQ,CAAC,CAAC,MAAM,CAAC;AAClC,YAAA,OAAO,EAAE,eAAe;YACxB,UAAU,EAAE,UAAU,IAAI,SAAS;AACnC,YAAA,YAAY,EAAE,aAAa;YAC3B,aAAa;AACb,YAAA,eAAe,EAAE,WAAW,CAAC,eAAe,IAAI,SAAS;YACzD,WAAW;YACX,OAAO;YACP,cAAc;YACd,UAAU;AACV,YAAA,YAAY,EAAE,MAAM;YACpB,gBAAgB,EAAE,GAAG,aAAa,CAAA,EAAG,WAAW,CAAC,cAAc,IAAI,EAAE,CAAA,CAAE;AACvE,YAAA,SAAS,EAAE,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC;YAC1C,cAAc,EAAE,4BAA4B,CAAC,EAAE;;;AAG/C,YAAA,oBAAoB,EAAE,4BAA4B,CAAC,WAAW,GAAG,IAAI;AACrE,YAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;AACrB,YAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;AACtB,SAAA,CAAC;IACJ;AACF,CAAC;AAiBD;AACA,IAAI,wBAAwB,GAAqB,OAAO,CAAC,OAAO,EAAE;AAElE;;;;;;;;;;;;;;AAcG;AACH,MAAM,yBAAyB,GAAG,OAAO,EACvC,iBAAiB,EACjB,SAAS,EACT,KAAK,GACuB,KAA0C;IACtE,MAAM,cAAc,GAAGiB,kDAA4C,CACjE,iBAAiB,EACjB,sBAAsB,CACvB;AACD,IAAA,MAAM,YAAY,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAAE,CAAC;AAElE,IAAA,sBAAsB,CAAC,cAAc,EAAE,KAAK,CAAC,eAAe,CAAC;AAE7D,IAAA,MAAM,KAAK,GAAG3B,eAAM,CAAC,QAAQ,EAAE;IAE/B,MAAM,UAAU,GAA8C,MAAMiB,wBAAe,CACjF,iBAAiB,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAAE,CAAC,EAChD,CAAC,KAAK,KACJ;AACG,SAAA,MAAM,CAAC,EAAE,GAAG,EAAEP,iBAAQ,CAAC,GAAG,EAAE,SAAS,EAAEA,iBAAQ,CAAC,SAAS,EAAE;SAC3D,IAAI,CAACA,iBAAQ;SACb,KAAK,CAACG,kBAAO,CAACH,iBAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CACzC;IAED,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;AACzF,IAAA,MAAM,2BAA2B,GAAG,IAAI,GAAG,EAAU;AACrD,IAAA,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU;AACnC,IAAA,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAyB;AAEzD,IAAA,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE;QAC5B,IAAI,CAAC,GAAG,CAAC,GAAG;YAAE;QACd,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;QAC7C,IAAI,CAAC,SAAS,EAAE;AACd,YAAA,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;YACtB;QACF;AACA,QAAA,2BAA2B,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;;;QAGxC,MAAM,SAAS,GAAG,eAAe,CAAC,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC;QAC3D,IAAI,CAAC,GAAG,CAAC,SAAS,IAAI,IAAI,MAAM,SAAS,EAAE;YACzC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC;QAC1C;IACF;IAEA,MAAM,aAAa,GAAG,cAAc,CAAC,MAAM,CACzC,CAAC,QAAQ,KAAK,CAAC,2BAA2B,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAC5D;;AAGD,IAAA,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;QAC5B,MAAM,sBAAsB,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACnE;AAEA,IAAA,IAAI,SAAS,CAAC,IAAI,GAAG,CAAC,EAAE;AACtB,QAAA,MAAMD,uBAAc,CAAC,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC,KAAK,KACzC,KAAK,CAAC,MAAM,CAACC,iBAAQ,CAAC,CAAC,KAAK,CAACG,kBAAO,CAACH,iBAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAC3D;IACH;IAEA,KAAK,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,gBAAgB,EAAE;AAC/C,QAAA,MAAM;aACH,MAAM,CAACA,iBAAQ;aACf,GAAG,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;aACxC,KAAK,CAACP,aAAE,CAACO,iBAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACjC;IAEA,MAAM,sBAAsB,CAAC,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,cAAc,EAAE,CAAC;IAExF,OAAO,EAAE,YAAY,EAAE;AACzB,CAAC;AAED;AACA,MAAM,sBAAsB,GAAG,CAAC,QAAqB,KAAwB;IAC3E,MAAM,MAAM,GAAGM,8BAAwB,CAAC,QAAQ,CAAC,eAAe,CAAC;IACjE,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,wBAAwB;AAAE,QAAA,OAAO,SAAS;AACrF,IAAA,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,QAAQ;;AAEjC,IAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AAClE,CAAC;AAED;;;;;;;;;;AAUG;AACH,MAAM,sBAAsB,GAAG,OAAO,EACpC,iBAAiB,EACjB,mBAAmB,GAIpB,KAAmB;IAClB,MAAM,SAAS,GAAG;AACf,SAAA,GAAG,CAAC,CAAC,QAAQ,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,sBAAsB,CAAC,QAAQ,CAAC,EAAE,CAAC;AACjF,SAAA,MAAM,CAAC,CAAC,CAAC,KAA4D,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;AAC1F,IAAA,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAAE,CAAC,CAAC;AAEjF,IAAA,MAAM,KAAK,GAAGhB,eAAM,CAAC,QAAQ,EAAE;IAE/B,KAAK,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,SAAS,EAAE;QACnD,MAAM,eAAe,GAAG;AACrB,aAAA,MAAM,CACL,CAAC,KAAK,KACJ,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE;AACxB,YAAA,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;AAChC,YAAA,sBAAsB,CAAC,KAAK,CAAC,KAAK,aAAa;aAElD,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE,CAAC;AAC3B,QAAA,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;YAAE;;QAElC,MAAMS,uBAAc,CAAC,eAAe,EAAE,CAAC,KAAK,KAC1C;aACG,MAAM,CAACC,iBAAQ;AACf,aAAA,GAAG,CAAC;YACH,cAAc,EAAE,QAAQ,CAAC,EAAE;AAC3B,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,oBAAoB,EAAE,QAAQ,CAAC,WAAW,GAAG,IAAI;AACjD,YAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB;aACA,KAAK,CAACG,kBAAO,CAACH,iBAAQ,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,CAClD;IACH;IAEA,MAAM,eAAe,GAAG;SACrB,MAAM,CAAC,CAAC,QAAQ,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,sBAAsB,CAAC,QAAQ,CAAC;SACxF,GAAG,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAAE,CAAC;AACjC,IAAA,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE;AAC9B,QAAA,MAAMD,uBAAc,CAAC,eAAe,EAAE,CAAC,KAAK,KAC1C,KAAK,CAAC,MAAM,CAACC,iBAAQ,CAAC,CAAC,KAAK,CAACG,kBAAO,CAACH,iBAAQ,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,CACtE;IACH;AAEA,IAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE;;IAG5B,MAAM,UAAU,GAA8C,MAAMO,wBAAe,CACjF,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EACnC,CAAC,KAAK,KACJ;AACG,SAAA,MAAM,CAAC,EAAE,GAAG,EAAEP,iBAAQ,CAAC,GAAG,EAAE,SAAS,EAAEA,iBAAQ,CAAC,SAAS,EAAE;SAC3D,IAAI,CAACA,iBAAQ;SACb,KAAK,CAACG,kBAAO,CAACH,iBAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CACzC;IACD,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC;AAEzF,IAAA,KAAK,MAAM,EAAE,QAAQ,EAAE,IAAI,SAAS,EAAE;AACpC,QAAA,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI;;;QAGzD,IAAI,SAAS,IAAI,IAAI;YAAE;AACvB,QAAA,MAAM;aACH,MAAM,CAACA,iBAAQ;aACf,GAAG,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;AACxC,aAAA,KAAK,CACJC,cAAG,CACDR,aAAE,CAACO,iBAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,EAAE,CAAC,EACxCE,aAAE,CAACE,iBAAM,CAACJ,iBAAQ,CAAC,SAAS,CAAC,EAAEkB,aAAE,CAAClB,iBAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAClE,CACF;IACL;AACF,CAAC;AAED;;;;;AAKG;AACH,MAAM,sBAAsB,GAAG,OAC7B,KAA+C,EAC/C,SAAiB,EACjB,IAA8D,KAC5D;AACF,IAAA,MAAM,WAAW,GAAG,MAAMc,+BAAsB,CAAC,IAAI,CAAC;IACtD,OAAO,CAAC,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,SAAS,KAAK,KAAK,CAAC,eAAe,CAAC,SAAS,CAAC;AACnG,CAAC;AAED,MAAM,sBAAsB,GAAG,OAAO,EACpC,aAAa,EACb,SAAS,EACT,KAAK,GAKN,KAAmB;IAClB,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,GAAG,KAAK;;AAGhG,IAAA,MAAM,QAAQ,GAAG,MAAM,oDAAO,qBAAmB,8CAAC;AAClD,IAAA,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ;;AAE1B,IAAA,MAAM,KAAK,CAAC,GAAG,EAAE;AAEjB,IAAA,MAAM,KAAK,GAAGxB,eAAM,CAAC,QAAQ,EAAE;;;IAI/B,MAAM,IAAI,GAAqC,EAAE;AAEjD,IAAA,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE;AACpC,QAAA,MAAM,eAAe,GAAGkB,mBAAU,EAAE;;QAGpC,MAAM,MAAM,GAAGF,8BAAwB,CAAC,QAAQ,CAAC,eAAe,CAAC;AACjE,QAAA,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE;AACd,YAAA,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE;gBAC7B,OAAO,CAAC,IAAI,CACV,oEAAoE,EACpE,QAAQ,CAAC,EAAE,CACZ;YACH;AAAO,iBAAA,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE;AACpC,gBAAA,OAAO,CAAC,IAAI,CACV,8EAA8E,EAC9E,QAAQ,CAAC,EAAE,EACX,MAAM,CAAC,KAAK,CACb;YACH;iBAAO;gBACL,OAAO,CAAC,IAAI,CACV,gFAAgF,EAChF,QAAQ,CAAC,EAAE,CACZ;YACH;YACA;QACF;AAEA,QAAA,MAAM,gBAAgB,GAAG,MAAM,CAAC,QAAQ;AAExC,QAAA,IAAI,iBAAiB,GAAG,gBAAgB,CAAC,IAAI;QAE7C,IAAI,CAAC,iBAAiB,EAAE;AACtB,YAAA,OAAO,CAAC,IAAI,CACV,oEAAoE,EACpE,QAAQ,CACT;YACD;QACF;QAEA,IAAI,UAAU,GAAG,KAAK;AACtB,QAAA,IAAI,YAAY;AAChB,QAAA,IAAI,WAAW;AACf,QAAA,IAAI,YAAY;QAChB,IAAI,MAAM,GAAG,KAAK;AAClB,QAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ;AAEnC,QAAAa,qCAA+B,CAAC;AAC9B,YAAA,IAAI,EAAE,iBAAiB;YACvB,SAAS;AACV,SAAA,CAAC;AAEF,QAAA,IAAI,sBAAsB,CAAC,iBAAiB,CAAC,EAAE;YAC7C,UAAU,GAAG,IAAI;YAEjB,IAAI,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE;gBACzC,MAAM,GAAG,IAAI;gBACb,YAAY,GAAG,MAAM;AAErB,gBAAA,MAAM,MAAM,GAAGC,kCAA4B,CAAC,iBAAiB,CAAC;gBAE9D,IAAI,MAAM,EAAE;AACV,oBAAA,iBAAiB,GAAG,MAAM,CAAC,YAAY;AACvC,oBAAA,WAAW,GAAG,MAAM,CAAC,SAAS;gBAChC;YAEF;YAEA,IAAI,CAAC,MAAM,EAAE;gBACX,IAAI,uBAAuB,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAe,CAAC,EAAE;oBACtE;gBACF;YACF;QACF;AAEA,QAAA,IAAI,aAAa,GAAG,gBAAgB,CAAC,KAAK;AAE1C,QAAA,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE;AACrC,YAAA,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC;QAC/C;AAEA,QAAA,IAAI,UAAU,IAAI,CAAC,MAAM,EAAE;AACzB,YAAA,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAChC,CAAC,IAAiB,KAAK,IAAI,CAAC,EAAE,KAAK,gBAAgB,CAAC,KAAK,CAC1D;AACD,YAAA,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC,WAAW,EAAE;gBACvE,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI;AACpD,gBAAA,YAAY,GAAG,WAAW,CAAC,QAAQ;YACrC;QACF;AAEA,QAAA,IAAI,UAAU,IAAI,MAAM,EAAE;YACxB,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,IAAiB,KACrD,gBAAgB,CAAC,KAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CACvD;YACD,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;AAC3C,gBAAA,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI;AACxD,gBAAA,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,QAAQ;YACzC;QACF;AAEA,QAAA,MAAM,YAAY,GAAGT,kBAAS,CAAC,iBAAiB,CAAC;AACjD,QAAA,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI;AACzC,QAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM;QAClC,MAAM,cAAc,GAAG,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC;AAC1D,QAAA,MAAM,oBAAoB,GAAG,QAAQ,CAAC,WAAW,GAAG,IAAI;QACxD,MAAM,OAAO,GAAG,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC;QACnD,MAAM,WAAW,GAAG,gBAAgB,CAAC,GAAG,CAAC,OAAQ,CAAC;QAClD,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAQ,CAAC;AAElD,QAAA,MAAM,KAAK,GACT,SAAS,IAAI;AACX,cAAE,MAAMC,kDAAwB,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAAE,YAC3E,sBAAsB,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;cAEpE,SAAS;AACf,QAAA,MAAM,WAAW,GAAG,KAAK,EAAE,UAAU,GAAGS,gCAAuB,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,SAAS;AAE7F,QAAA,IAAI,iBAAiB,KAAK,wBAAwB,EAAE;YAClD,MAAM,4CAA4C,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,CAAC;QAClF;AAEA,QAAA,MAAM,UAAU,GACd,SAAS,IAAI;eACR,CAAC,MAAMT,kDAAwB,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAAE,YAC7EI,qCAA4B,CAAC,SAAS,EAAE,YAAY,EAAE;;gBAEpD,WAAW,EAAE,MAAMF,+BAAsB,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;AACpE,aAAA,CAAC,CACH,KAAK,IAAI;cACV,IAAI;QACV,IAAI,CAAC,IAAI,CAAC;AACR,YAAA,OAAO,EAAE,eAAe;YACxB,GAAG,EAAE,QAAQ,CAAC,EAAE;YAChB,SAAS,EAAE,QAAQ,CAAC,QAAQ;YAC5B,UAAU;YACV,YAAY;YACZ,aAAa;YACb,WAAW;YACX,UAAU;YACV,cAAc,EAAE,cAAc,IAAI,IAAI;YACtC,OAAO,EAAE,OAAO,IAAI,IAAI;YACxB,WAAW,EAAE,WAAW,IAAI,IAAI;YAChC,SAAS,EAAE,SAAS,IAAI,IAAI;YAC5B,YAAY,EAAE,YAAY,IAAI,IAAI;YAClC,WAAW,EAAE,WAAW,IAAI,IAAI;YAChC,WAAW,EAAE,YAAY,IAAI,IAAI;AACjC,YAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,oBAAoB;AACpB,YAAA,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;AACxC,YAAA,SAAS,EAAE,QAAQ,CAAC,QAAQ,GAAGJ,4BAAmB,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE;AAC1E,YAAA,SAAS,EAAE,gBAAgB,CAAC,QAAQ,CAAC,IAAI,IAAI;AAC9C,SAAA,CAAC;IACJ;;;AAIA,IAAA,MAAM,SAAS,GAAGb,sBAAa,CAACG,iBAAQ,CAAC;AACzC,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE;QAC/C,MAAM,KAAK,CAAC,MAAM,CAACA,iBAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;IACnE;AACF,CAAC;AAED,MAAM,qBAAqB,GAA0B,CAAC,MAAM,KAAI;AAC9D,IAAA,MAAM,IAAI,GAAG,wBAAwB,CAAC,IAAI,CAAC,MAAM,yBAAyB,CAAC,MAAM,CAAC,CAAC;AACnF,IAAA,wBAAwB,GAAG,IAAI,CAAC,IAAI,CAClC,MAAM,SAAS,EACf,MAAM,SAAS,CAChB;AACD,IAAA,OAAO,IAAI;AACb,CAAC;AAED;;;;;;AAMG;AACH,MAAM,iCAAiC,GAAG,OAAO,EAC/C,QAAQ,EACR,SAAS,EACT,KAAK,GAKN,KAAmB;AAClB,IAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE;AAE3B,IAAA,MAAM,YAAY,GAAG,MAAMsB,4BAAsB,CAAC;QAChD,QAAQ;AACR,QAAA,cAAc,EAAE,KAAK;AACtB,KAAA,CAAC;AAEF,IAAA,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,mBAAmB,CAAC;QAChD,YAAY;QACZ,KAAK;AACN,KAAA,CAAC;AACF,IAAA,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE;AAE9B,IAAA,MAAM,iBAAiB,GAAG,MAAMC,8BAAwB,CAAC;QACvD,WAAW;AACX,QAAA,cAAc,EAAE,KAAK;AACtB,KAAA,CAAC;;AAGF,IAAA,MAAM,qBAAqB,CAAC;QAC1B,iBAAiB;QACjB,SAAS;QACT,KAAK;AACN,KAAA,CAAC;AACJ,CAAC;AAED;;;;;;;;AAQG;AACH,MAAM,0BAA0B,GAAG,OAAO,KAAmB,KAAI;;IAE/D,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC;AAC9C,IAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE;AAEvB,IAAA,MAAM,SAAS,GAAGC,mBAAa,CAAC,YAAY,EAAE;;IAG9C,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,SAAS,CAAC,OAAO,CAACC,eAAS,EAAE;AACvD,QAAA,KAAK,EAAE;AACL,YAAA,EAAE,EAAE;AACF,gBAAA,EAAE,EAAE,IAAI;AACT,aAAA;AACF,SAAA;AACF,KAAA,CAAC;AAEF,IAAA,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,gBAAgB,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;;IAGjE,MAAM,iCAAiC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACzE,CAAC;AAOD;;;;AAIG;MACU,cAAc,GAAG,OAAO,OAA4B,KAAmB;IAClF,IAAI,SAAS,GAAG,OAAO,EAAE,SAAS,KAAK,MAAMC,8BAAqB,EAAE,CAAC;AACrE,IAAA,MAAM,gBAAgB,GAAGC,sCAA6B,EAAE;IACxD,IAAI,gBAAgB,EAAE;AACpB,QAAA,MAAM,UAAU,GAAG,MAAM,gBAAgB,EAAE;AAC3C,QAAA,IAAI,UAAU,EAAE,MAAM,EAAE;YACtB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AAC3D,YAAA,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE;AAC7B,gBAAA,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE;oBACzC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AAC5B,oBAAA,SAAS,GAAG,CAAC,GAAG,SAAS,EAAE,IAAI,CAAC;gBAClC;YACF;QACF;IACF;IACA,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;QACxC;IACF;;IAGA,MAAMC,4BAAmB,EAAE;;IAE3B,MAAMC,2BAAkB,EAAE;AAE1B,IAAA,MAAM,KAAK,GAAGvC,eAAM,CAAC,QAAQ,EAAE;AAE/B,IAAA,MAAM,EAAE,yBAAyB,EAAE,GAAG,MAAM,eAAe,EAAE;AAE7D,IAAA,MAAM,YAAY,GAAG,MAAMwC,0BAAsB,EAAE;IAEnD,MAAM,UAAU,GAAa,EAAE;AAE/B,IAAA,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE;QACtC,MAAM,UAAU,GAAG,yBAAyB,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC;QAEpE,IAAI,CAAC,UAAU,EAAE;;;YAGf,OAAO,CAAC,IAAI,CACV,CAAA,yDAAA,EAA4D,WAAW,CAAC,MAAM,CAAA,UAAA,CAAY,CAC3F;YACD;QACF;AAEA,QAAA,IAAI;AACF,YAAA,MAAM;iBACH,MAAM,CAACtC,kBAAS;AAChB,iBAAA,MAAM,CAAC;gBACN,OAAO,EAAE,UAAU,CAAC,EAAE;gBACtB,GAAG,EAAE,WAAW,CAAC,EAAE;aACpB;AACA,iBAAA,mBAAmB,EAAE;QAC1B;QAAE,OAAO,GAAY,EAAE;;YAErB,MAAM,CAAC,GAAG,GAAuF;YACjG,MAAM,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO;YACzE,IAAI,IAAI,KAAK,8BAA8B,IAAI,IAAI,KAAK,GAAG,EAAE;gBAC3D;YACF;AACA,YAAA,MAAM,GAAG;QACX;AAEA,QAAA,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;IACjC;;;AAIA,IAAA,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;QAC3B;IACF;AAEA,IAAA,MAAM,SAAS,GAAG,MAAMuC,4BAAsB,CAAC;QAC7C,UAAU;QACV,SAAS;AACT,QAAA,cAAc,EAAE,KAAK;AACtB,KAAA,CAAC;AAEF,IAAA,MAAM,KAAK,GAAG,kBAAkB,EAAE;AAElC,IAAA,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,gBAAgB,CAAC;QAC1C,SAAS;QACT,KAAK;AACN,KAAA,CAAC;IAEF,MAAM,iCAAiC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAEvE,IAAA,MAAM,0BAA0B,CAAC,KAAK,CAAC;IACvCC,6CAAoC,CAAC,SAAS,CAAC;AAE/C,IAAA,IAAI;AACF,QAAA,MAAM,OAAO,GAAG,MAAM,oDAAO,qBAAiB,6CAAC;AAC/C,QAAA,MAAM,OAAO,CAAC,IAAI,CAAC,sCAAsC,EAAE;IAC7D;IAAE,OAAO,GAAG,EAAE;AACZ,QAAA,OAAO,CAAC,IAAI,CAAC,uEAAuE,EAAE,GAAG,CAAC;IAC5F;;IAEAC,uBAAc,CAACC,yCAAgC,CAAC;AAClD;;;;"}
1
+ {"version":3,"file":"syncDbWithEas-CrmxxmUW.js","sources":["../../../src/db/read/getModelSchemas.ts","../../../src/db/write/createSeeds.ts","../../../src/db/write/updateSeedRevokedAt.ts","../../../src/events/item/syncDbWithEas.ts"],"sourcesContent":["// Dynamic import to break circular dependency: Model -> BaseItem -> ... -> getModelSchemas -> Model\n// import { Model } from '@/Model/Model'\nimport { BaseDb } from '@/db/Db/BaseDb'\nimport { models as modelsTable, modelUids } from '@/seedSchema'\nimport { eq } from 'drizzle-orm'\nimport pluralize from 'pluralize'\nimport { toSnakeCase } from '@/helpers'\n\ntype ModelRecord = {\n id: number\n name: string\n uid: string | null\n tableName?: string\n}\n\nconst schemaStringToModelRecord = new Map<string, ModelRecord>()\n\ntype GetModelSchemasReturn = {\n schemaStringToModelRecord: Map<string, ModelRecord>\n modelRecords: ModelRecord[]\n}\n\ntype GetModelSchemas = () => Promise<GetModelSchemasReturn>\n\nexport const getModelSchemas: GetModelSchemas = async () => {\n // Dynamic import to break circular dependency\n const modelMod = await import('../../Model/Model')\n const { Model } = modelMod\n const allModels = await Model.all()\n const modelRecords: ModelRecord[] = []\n\n const appDb = BaseDb.getAppDb()\n\n for (const model of allModels) {\n const modelName = model.modelName\n if (!modelName) continue\n const foundModelQuery = await appDb\n .select({\n id: modelsTable.id,\n name: modelsTable.name,\n uid: modelUids.uid,\n })\n .from(modelsTable)\n .leftJoin(modelUids, eq(modelsTable.id, modelUids.modelId))\n // Model names are only unique per schema: use this model's own row\n .where(model.id ? eq(modelsTable.schemaFileId, model.id) : eq(modelsTable.name, modelName))\n .limit(1)\n\n if (!foundModelQuery[0]) {\n console.error(\n `[item/events] [syncDbWithEas] model ${modelName} not found in SDK DB`,\n )\n continue\n }\n\n const foundModel: ModelRecord = {\n id: foundModelQuery[0].id,\n name: foundModelQuery[0].name,\n uid: foundModelQuery[0].uid,\n tableName: pluralize(foundModelQuery[0].name).toLowerCase(),\n }\n\n modelRecords.push(foundModel)\n\n if (modelName === 'Seed') {\n continue\n }\n\n const schemaString = `bytes32 ${toSnakeCase(modelName)}`\n\n schemaStringToModelRecord.set(schemaString, foundModel)\n }\n\n return {\n schemaStringToModelRecord,\n modelRecords,\n }\n}\n","import { seeds, SeedType } from '@/seedSchema'\nimport { BaseDb } from '@/db/Db/BaseDb'\nimport { normalizePublisher } from '@/helpers/addresses'\nimport { chunkValues, rowsPerInsert } from '@/db/sqlParamBatches'\n\ntype CreateSeeds = (newSeeds: Partial<SeedType>[]) => Promise<void>\n\nexport const createSeeds: CreateSeeds = async (\n newSeeds: Partial<SeedType>[],\n) => {\n const appDb = BaseDb.getAppDb()\n\n const values = newSeeds.map((row) => {\n const publisher = normalizePublisher(row.publisher)\n return {\n ...row,\n ...(publisher ? { publisher } : {}),\n }\n })\n\n // Sync can create thousands of seeds at once: keep each INSERT under SQLite's parameter limit.\n for (const chunk of chunkValues(values, rowsPerInsert(seeds))) {\n await appDb.insert(seeds).values(chunk)\n }\n}\n","import { BaseDb } from '@/db/Db/BaseDb'\nimport { metadata, seeds, versions } from '@/seedSchema'\nimport { and, eq, inArray, isNull, or } from 'drizzle-orm'\nimport { writeInBatches } from '@/db/sqlParamBatches'\n\ntype UpdateSeedRevokedAtProps = {\n seedLocalId: string\n /** Unix seconds. */\n revokedAt: number\n /**\n * Property attestation UIDs revoked along with the seed. Their metadata rows get the same\n * `revoked_at` (unless they already have one), so they read as revoked before the next sync.\n * Rows sync derived from them (ItemStorage rows whose `derived_from_uid` is one of these) are\n * stamped the same way.\n */\n metadataUids?: string[]\n /** Version attestation UIDs revoked along with the seed; their rows are stamped the same way. */\n versionUids?: string[]\n}\n\n/**\n * Sets revokedAt timestamp on a seed record after attestations have been revoked on EAS.\n */\nexport const updateSeedRevokedAt = async ({\n seedLocalId,\n revokedAt,\n metadataUids,\n versionUids,\n}: UpdateSeedRevokedAtProps): Promise<void> => {\n if (!seedLocalId) {\n return\n }\n\n const appDb = BaseDb.getAppDb()\n\n await appDb\n .update(seeds)\n .set({\n revokedAt,\n updatedAt: Date.now(),\n })\n .where(eq(seeds.localId, seedLocalId))\n\n // An item can have many property attestations; each list binds once per uid (twice for metadata).\n await writeInBatches(metadataUids ?? [], (chunk) =>\n appDb\n .update(metadata)\n .set({ revokedAt, updatedAt: Date.now() })\n .where(\n and(\n or(inArray(metadata.uid, chunk), inArray(metadata.derivedFromUid, chunk)),\n isNull(metadata.revokedAt),\n ),\n ),\n )\n\n await writeInBatches(versionUids ?? [], (chunk) =>\n appDb\n .update(versions)\n .set({ revokedAt, updatedAt: Date.now() })\n .where(and(inArray(versions.uid, chunk), isNull(versions.revokedAt))),\n )\n}\n","import { resolveItemModelFileId } from '@/db/read/resolveModelRecord'\nimport { resolveModelForSyncedSeed, skipSeedOnAmbiguousModel } from '@/db/read/resolveModelForSyncedSeed'\nimport { camelCase } from 'lodash-es'\nimport { Attestation, SchemaWhereInput } from '@seedprotocol/eas'\nimport {\n parseEasPropertyMetadata,\n parseEasRelationPropertyName,\n} from '@seedprotocol/query'\nimport {\n metadata,\n MetadataType,\n modelUids,\n seeds,\n SeedType,\n versions,\n VersionsType,\n} from '@/seedSchema'\nimport { and, eq, inArray, isNotNull, isNull, ne, or } from 'drizzle-orm'\nimport {\n generateId,\n} from '@/helpers'\nimport { modelPropertiesToObject } from '@/helpers/model'\nimport { GET_SEEDS } from '@seedprotocol/eas'\nimport {\n getAllAddressesFromDb,\n getItemStoragePropertiesForModel,\n getPropertyIdForModelAndName,\n} from '@/helpers/db'\n// Dynamic import to break circular dependency: Model -> BaseItem -> ... -> syncDbWithEas -> Model\n// import { Model } from '@/Model/Model'\nimport { BaseDb } from '@/db/Db/BaseDb'\nimport { getModelSchemas } from '@/db/read/getModelSchemas'\nimport { ModelSchema } from '@/types'\nimport { createSeeds } from '@/db/write/createSeeds'\nimport { rowsPerInsert, selectInBatches, writeInBatches } from '@/db/sqlParamBatches'\nimport { normalizeHexAddress } from '@/helpers/addresses'\nimport { updateSeedRevokedAt } from '@/db/write/updateSeedRevokedAt'\nimport { setSchemaUidForSchemaDefinition } from '@/stores/eas'\nimport { BaseEasClient } from '@/helpers/EasClient/BaseEasClient'\nimport {\n getItemPropertiesFromEas,\n getItemVersionsFromEas,\n getModelSchemasFromEas,\n getSeedsFromSchemaUids,\n} from '@/eas'\nimport { pickLatestPropertyAttestationsByRefAndSchema } from '@/helpers/easPropertyCanonical'\nimport { getGetAdditionalSyncAddresses } from '@/helpers/publishConfig'\nimport { scheduleBulkFilesDownloadFromEasSync } from '@/events/files/download'\nimport { assertLocalDbChain, waitForEasReadChain } from '@/helpers/localDbChain'\nimport { EAS_SEED_DATA_SYNCED_TO_DB_EVENT } from '@/helpers/constants'\nimport { emitAcrossTabs } from '@/helpers/tabEvents'\n\n/**\n * Sync stores the newest non-revoked attestation per (version, property schema). When every\n * attestation of a property is revoked (e.g. after `item.unpublish()`), keep the newest one so a\n * revoked item synced to a new device still has its last values next to its seed's `revokedAt`.\n */\nconst SYNC_CANONICAL_OPTIONS = { ifAllRevoked: 'newestRevoked' } as const\n\n/**\n * When an attestation was revoked, in Unix seconds: EAS `revocationTime` is a block timestamp in\n * seconds, the same unit local unpublish writes to `seeds.revoked_at`. `undefined` when not revoked.\n * A revoked attestation without a revocation time (0 or not selected) falls back to now.\n */\nconst revokedAtSeconds = (\n attestation: Pick<Attestation, 'revoked'> & { revocationTime?: number | null },\n): number | undefined => {\n if (!attestation.revoked) return undefined\n return attestation.revocationTime != null && attestation.revocationTime > 0\n ? attestation.revocationTime\n : Math.floor(Date.now() / 1000)\n}\n\n/**\n * `revoked_at` to store for an attestation that already has a row (seed, version or metadata), given the\n * stored value. EAS's `revocationTime` wins once EAS reports one. A stored stamp is otherwise kept:\n * local unpublish writes one only after its revoke transactions are mined, and revocation can't be\n * undone, so EAS reporting the attestation as live then just means its index hasn't caught up yet.\n */\nconst syncedRevokedAt = (\n attestation: Pick<Attestation, 'revoked'> & { revocationTime?: number | null },\n stored: number | null | undefined,\n): number | null => {\n if (attestation.revoked && attestation.revocationTime != null && attestation.revocationTime > 0) {\n return attestation.revocationTime\n }\n return stored ?? revokedAtSeconds(attestation) ?? null\n}\n\nconst relationValuesToExclude = [\n '0x0000000000000000000000000000000000000000000000000000000000000020',\n]\n\n\n/**\n * Lookups one `runSyncFromEas` run builds up as it stores seeds and versions, and the relation\n * targets its properties point at. Created per run and passed down, so a run never sees another\n * run's seeds or re-fetches its related seeds, even when runs overlap.\n */\ntype SyncRunState = {\n seedUidToLocalId: Map<string, string>\n seedUidToModelType: Map<string, string>\n versionUidToLocalId: Map<string, string>\n versionUidToSeedUid: Map<string, string>\n relatedSeedUids: Set<string>\n}\n\nconst createSyncRunState = (): SyncRunState => ({\n seedUidToLocalId: new Map(),\n seedUidToModelType: new Map(),\n versionUidToLocalId: new Map(),\n versionUidToSeedUid: new Map(),\n relatedSeedUids: new Set(),\n})\n\nconst isRelationPropertyName = (propertyNameSnake: string): boolean =>\n (propertyNameSnake.endsWith('_id') || propertyNameSnake.endsWith('_ids')) &&\n propertyNameSnake !== 'storage_transaction_id' &&\n propertyNameSnake !== 'storage_provider_transaction_id'\n\n/**\n * Seed UIDs that relation properties point at. Collected from every property the run fetched, not\n * only newly stored ones, so related seeds are refreshed (new versions, revocations) on each sync.\n */\nconst collectRelatedSeedUids = (properties: Attestation[], into: Set<string>): void => {\n for (const property of properties) {\n const parsed = parseEasPropertyMetadata(property.decodedDataJson)\n if (!parsed.ok) continue\n const { name, value } = parsed.metadata\n if (!name || !isRelationPropertyName(name)) continue\n const values = Array.isArray(value) ? value : [value]\n for (const v of values) {\n if (typeof v === 'string' && v && !relationValuesToExclude.includes(v)) into.add(v)\n }\n }\n}\n\n/**\n * Earlier syncs SQL-escaped a seed's attestation JSON (`'` -> `''`) and then bound it as a\n * parameter, so stored `seeds.attestation_raw` had every quote doubled. Doubled JSON still parses,\n * so a legacy row is recognized by comparing with the attestation EAS returns now: it is legacy\n * when it equals that attestation with quotes doubled, ignoring the revocation fields (EAS may have\n * revoked it since). A row whose data legitimately contains `''` equals the fresh JSON itself and is\n * left alone.\n */\nexport const isSqlEscapedAttestationRaw = (stored: string, fresh: Attestation): boolean => {\n if (!stored.includes(\"''\")) return false\n const freshJson = JSON.stringify(fresh)\n if (stored === freshJson || !freshJson.includes(\"'\")) return false\n let parsed: unknown\n try {\n parsed = JSON.parse(stored)\n } catch {\n return false\n }\n if (!parsed || typeof parsed !== 'object') return false\n const stored_ = parsed as Record<string, unknown>\n const withStoredRevocation = {\n ...fresh,\n ...('revoked' in stored_ && { revoked: stored_.revoked }),\n ...('revocationTime' in stored_ && { revocationTime: stored_.revocationTime }),\n }\n return stored === JSON.stringify(withStoredRevocation).replace(/'/g, \"''\")\n}\n\ntype SaveEasSeedsToDbProps = {\n itemSeeds: Attestation[]\n state: SyncRunState\n}\n\ntype SaveEasSeedsToDbReturn = {\n /** UIDs of every seed passed in (already stored or newly inserted). */\n seedUids: string[]\n}\n\ntype SaveEasSeedsToDb = (\n props: SaveEasSeedsToDbProps,\n) => Promise<SaveEasSeedsToDbReturn>\n\nconst saveEasSeedsToDb: SaveEasSeedsToDb = async ({ itemSeeds, state }) => {\n const { seedUidToLocalId, seedUidToModelType } = state\n const appDb = BaseDb.getAppDb()\n\n const seedUids = itemSeeds.map((seed) => seed.id)\n\n const existingSeedRecordsRows: SeedType[] = await selectInBatches(seedUids, (chunk) =>\n appDb.select().from(seeds).where(inArray(seeds.uid, chunk)),\n )\n\n const existingSeedUids = new Set<string>()\n\n if (existingSeedRecordsRows && existingSeedRecordsRows.length > 0) {\n for (const row of existingSeedRecordsRows) {\n if (row.uid) {\n existingSeedUids.add(row.uid)\n if (row.localId) {\n seedUidToLocalId.set(row.uid, row.localId)\n }\n if (row.type) {\n seedUidToModelType.set(row.uid, row.type)\n }\n }\n }\n }\n\n const newSeeds = itemSeeds.filter((seed) => !existingSeedUids.has(seed.id))\n\n // Update existing seeds when attestations are revoked on EAS, and replace a local unpublish stamp\n // with EAS's revocationTime once EAS reports one (see `syncedRevokedAt`).\n const seedByUid = new Map(itemSeeds.map((s) => [s.id, s]))\n for (const row of existingSeedRecordsRows) {\n if (!row.uid || !row.localId) continue\n const attestation = seedByUid.get(row.uid)\n if (!attestation) continue\n const revokedAt = syncedRevokedAt(attestation, row.revokedAt)\n if (revokedAt == null || revokedAt === row.revokedAt) continue\n await updateSeedRevokedAt({ seedLocalId: row.localId, revokedAt })\n }\n\n // Repair seed rows an earlier sync stored with SQL-escaped (doubled) quotes.\n for (const row of existingSeedRecordsRows) {\n if (!row.uid || !row.attestationRaw) continue\n const attestation = seedByUid.get(row.uid)\n if (!attestation || !isSqlEscapedAttestationRaw(row.attestationRaw, attestation)) continue\n await appDb\n .update(seeds)\n .set({ attestationRaw: JSON.stringify(attestation) })\n .where(eq(seeds.uid, row.uid))\n }\n\n if (newSeeds.length === 0) {\n return { seedUids }\n }\n\n const newSeedsData: Partial<SeedType>[] = []\n\n for (let i = 0; i < newSeeds.length; i++) {\n const seed = newSeeds[i]\n seedUidToModelType.set(seed.id, seed.schema.schemaNames[0].name)\n const seedLocalId = generateId()\n seedUidToLocalId.set(seed.id, seedLocalId)\n\n // createSeeds binds parameters: store the JSON as is.\n const attestationRaw = JSON.stringify(seed)\n const revokedAt = revokedAtSeconds(seed)\n\n // EAS only knows the model by name; the seam may match it to a local model (not built yet).\n const modelFileId = await resolveModelForSyncedSeed({\n seedUid: seed.id,\n seedLocalId,\n modelType: seed.schema.schemaNames[0].name,\n schemaUid: seed.schemaId,\n })\n\n newSeedsData.push({\n localId: seedLocalId,\n uid: seed.id,\n schemaUid: seed.schemaId,\n type: seed.schema.schemaNames[0].name,\n ...(modelFileId && { modelFileId }),\n publisher: seed.attester ? normalizeHexAddress(seed.attester) : seed.attester,\n createdAt: Date.now(),\n attestationCreatedAt: seed.timeCreated * 1000,\n attestationRaw,\n ...(revokedAt !== undefined && { revokedAt }),\n })\n }\n\n await createSeeds(newSeedsData)\n\n // All fetched seeds, not only the new ones: existing seeds can have new versions on EAS.\n return { seedUids }\n}\n\ntype SaveEasVersionsToDbParams = {\n itemVersions: Attestation[]\n state: SyncRunState\n}\n\ntype SaveEasVersionsToDb = (\n props: SaveEasVersionsToDbParams,\n) => Promise<SaveEasVersionsToDbReturn>\n\ntype SaveEasVersionsToDbReturn = {\n versionUids: string[]\n}\n\n/**\n * Rows per versions INSERT. A row binds at most one parameter per `versions` column (12 today, 10\n * set by sync), so a batch binds at most 600: under SQLite's old default limit of 999 host\n * parameters (sqlite-wasm and libsql allow more). saveEasVersionsBatches.test.ts checks this.\n */\nexport const VERSION_INSERT_BATCH = 50\n\nconst saveEasVersionsToDb: SaveEasVersionsToDb = async ({ itemVersions, state }) => {\n const { seedUidToLocalId, seedUidToModelType, versionUidToLocalId, versionUidToSeedUid } = state\n const versionUids = itemVersions.map((version) => version.id)\n\n const appDb = BaseDb.getAppDb()\n\n const existingVersionRecordsRows: VersionsType[] = await selectInBatches(versionUids, (chunk) =>\n appDb.select().from(versions).where(inArray(versions.uid, chunk)),\n )\n\n const existingVersionUids = new Set<string>()\n const versionByUid = new Map(itemVersions.map((version) => [version.id, version]))\n\n if (existingVersionRecordsRows && existingVersionRecordsRows.length > 0) {\n for (const row of existingVersionRecordsRows) {\n if (row.uid) {\n existingVersionUids.add(row.uid)\n if (row.localId) {\n versionUidToLocalId.set(row.uid, row.localId)\n }\n if (row.seedUid) {\n versionUidToSeedUid.set(row.uid, row.seedUid)\n }\n // Already-stored versions pick up revocations (and EAS's revocation time) too.\n const attestation = versionByUid.get(row.uid)\n const revokedAt = attestation ? syncedRevokedAt(attestation, row.revokedAt) : null\n if (attestation && revokedAt !== (row.revokedAt ?? null)) {\n await appDb\n .update(versions)\n .set({ revokedAt, updatedAt: Date.now() })\n .where(eq(versions.uid, row.uid))\n }\n }\n }\n }\n\n const newVersions = itemVersions.filter(\n (version) => !existingVersionUids.has(version.id),\n )\n\n const rows: (typeof versions.$inferInsert)[] = []\n const storedVersionUids = new Set(existingVersionUids)\n for (const version of newVersions) {\n const seedUid = version.refUID\n const seedLocalId = seedUidToLocalId.get(seedUid)\n if (!seedLocalId) {\n // Storing it anyway would orphan the version (and its properties) from any local seed.\n console.warn(\n '[item/events] [syncDbWithEas] skipping version whose seed has no local id: ',\n version.id,\n seedUid,\n )\n continue\n }\n const versionLocalId = generateId()\n versionUidToSeedUid.set(version.id, seedUid)\n versionUidToLocalId.set(version.id, versionLocalId)\n storedVersionUids.add(version.id)\n rows.push({\n localId: versionLocalId,\n uid: version.id,\n seedUid,\n seedLocalId,\n seedType: seedUidToModelType.get(seedUid) ?? null,\n createdAt: Date.now(),\n attestationCreatedAt: version.timeCreated * 1000,\n attestationRaw: JSON.stringify(version),\n publisher: version.attester ? normalizeHexAddress(version.attester) : '',\n revokedAt: revokedAtSeconds(version) ?? null,\n })\n }\n\n // Bound parameters: keep each statement well under SQLite's host-parameter limit.\n for (let i = 0; i < rows.length; i += VERSION_INSERT_BATCH) {\n await appDb.insert(versions).values(rows.slice(i, i + VERSION_INSERT_BATCH))\n }\n\n // Only versions that are stored locally: properties of a skipped version would have no version row.\n return { versionUids: versionUids.filter((uid) => storedVersionUids.has(uid)) }\n}\n\nconst createMetadataRecordsForStorageTransactionId = async (\n storageTransactionIdProperty: Attestation,\n modelSchema: ModelSchema | undefined,\n state: SyncRunState,\n) => {\n const { seedUidToLocalId, seedUidToModelType, versionUidToLocalId, versionUidToSeedUid } = state\n\n // Validate and parse decodedDataJson\n const parsed = parseEasPropertyMetadata(\n storageTransactionIdProperty.decodedDataJson,\n )\n if (!parsed.ok) {\n if (parsed.reason === 'empty') {\n console.warn(\n '[item/events] [syncDbWithEas] empty decodedDataJson for storageTransactionIdProperty: ',\n storageTransactionIdProperty.id,\n )\n } else if (parsed.reason === 'parse') {\n console.warn(\n '[item/events] [syncDbWithEas] failed to parse decodedDataJson for storageTransactionIdProperty: ',\n storageTransactionIdProperty.id,\n parsed.error,\n )\n } else {\n console.warn(\n '[item/events] [syncDbWithEas] invalid decodedDataJson structure for storageTransactionIdProperty: ',\n storageTransactionIdProperty.id,\n )\n }\n return\n }\n\n const attestationData = parsed.metadata\n const propertyName = camelCase(attestationData.name)\n const propertyValue =\n typeof attestationData.value === 'string'\n ? attestationData.value\n : JSON.stringify(attestationData.value)\n\n const seedUid = versionUidToSeedUid.get(storageTransactionIdProperty.refUID) as string\n const seedLocalId = seedUidToLocalId.get(seedUid)\n const versionUid = storageTransactionIdProperty.refUID\n const versionLocalId = versionUidToLocalId.get(versionUid)\n const modelType = seedUidToModelType.get(seedUid)\n\n // Storage settings come from the `properties` table. The model's property instances (modelSchema)\n // are only a fallback: whether they have loaded, and with storage settings, depends on timing.\n const itemStorageProperties = new Map<\n string,\n { id?: number; localStorageDir?: string | null; filenameSuffix?: string | null }\n >()\n if (modelType != null) {\n const stored =\n (await skipSeedOnAmbiguousModel({ seedLocalId, seedUid }, 'easSync.storageTransactionId', async () =>\n getItemStoragePropertiesForModel(modelType, {\n modelFileId: await resolveItemModelFileId({ seedLocalId, seedUid }),\n }),\n )) ?? []\n for (const property of stored) itemStorageProperties.set(property.name, property)\n }\n if (itemStorageProperties.size === 0 && modelSchema) {\n for (const [_propertyName, propertyDef] of Object.entries(modelSchema)) {\n if (propertyDef?.storageType === 'ItemStorage') {\n itemStorageProperties.set(_propertyName, {\n localStorageDir: propertyDef.localStorageDir,\n filenameSuffix: propertyDef.filenameSuffix,\n })\n }\n }\n }\n\n if (itemStorageProperties.size === 0) {\n return\n }\n\n const appDb = BaseDb.getAppDb()\n\n for (const [_propertyName, propertyDef] of itemStorageProperties.entries()) {\n const existingMetadataRecordRows = await appDb\n .select({ localId: metadata.localId })\n .from(metadata)\n .where(\n and(\n isNotNull(metadata.derivedFromUid),\n eq(metadata.propertyName, _propertyName),\n eq(metadata.propertyValue, propertyValue),\n eq(metadata.versionUid, storageTransactionIdProperty.refUID),\n ),\n )\n\n // Already derived from another attestation carrying this transaction id: syncDerivedStorageRows\n // points that row at the canonical attestation.\n if (existingMetadataRecordRows && existingMetadataRecordRows.length > 0) {\n continue\n }\n\n const propertyId =\n propertyDef.id ??\n (modelType != null\n ? ((await skipSeedOnAmbiguousModel({ seedLocalId, seedUid }, 'easSync.storageTransactionId', async () =>\n getPropertyIdForModelAndName(modelType, _propertyName, {\n modelFileId: await resolveItemModelFileId({ seedLocalId, seedUid }),\n }),\n )) ?? null)\n : null)\n\n const propertyLocalId = generateId()\n await appDb.insert(metadata).values({\n localId: propertyLocalId,\n propertyId: propertyId ?? undefined,\n propertyName: _propertyName,\n propertyValue,\n localStorageDir: propertyDef.localStorageDir ?? undefined,\n seedLocalId,\n seedUid,\n versionLocalId,\n versionUid,\n refValueType: 'file',\n refResolvedValue: `${propertyValue}${propertyDef.filenameSuffix ?? ''}`,\n modelType: seedUidToModelType.get(seedUid),\n derivedFromUid: storageTransactionIdProperty.id,\n // Ranked like a synced row, at its attestation's time: a local edit made after that\n // publish wins over it, a newer publish wins over an older edit.\n attestationCreatedAt: storageTransactionIdProperty.timeCreated * 1000,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n })\n }\n}\n\ntype SaveEasPropertiesToDbParams = {\n /** Every property attestation fetched for a set of versions, revoked ones included. */\n fetchedProperties: Attestation[]\n itemSeeds: Attestation[]\n state: SyncRunState\n}\n\ntype SaveEasPropertiesToDbReturn = {\n propertyUids: string[]\n}\n\ntype SaveEasPropertiesToDb = (\n props: SaveEasPropertiesToDbParams,\n) => Promise<SaveEasPropertiesToDbReturn>\n\n/** Serialize property saves: concurrent `runSyncFromEas` used to hit `isSavingToDb` and return `{}` with no insert. */\nlet saveEasPropertiesDbChain: Promise<unknown> = Promise.resolve()\n\n/**\n * Make local metadata match EAS for every fetched (version, property schema): exactly one synced\n * row, for the canonical attestation (ADR 0006), with `revoked_at` set when that attestation is\n * revoked (which, with `SYNC_CANONICAL_OPTIONS`, means all of the property's attestations on that\n * version are).\n *\n * - Canonical attestation not stored yet: insert it. This also covers an older live attestation\n * taking over from a revoked newer one, and a newer attestation superseding the stored one.\n * - Stored row for a fetched attestation that isn't canonical (revoked, or superseded): delete it,\n * so readers, which take the newest row per property, can't pick it.\n * - Stored canonical row: bring `revoked_at` up to date.\n *\n * Rows without an attestation UID (local edits) and rows for attestations EAS didn't return are\n * left alone.\n */\nconst saveEasPropertiesToDbBody = async ({\n fetchedProperties,\n itemSeeds,\n state,\n}: SaveEasPropertiesToDbParams): Promise<SaveEasPropertiesToDbReturn> => {\n const itemProperties = pickLatestPropertyAttestationsByRefAndSchema(\n fetchedProperties,\n SYNC_CANONICAL_OPTIONS,\n )\n const propertyUids = itemProperties.map((property) => property.id)\n\n collectRelatedSeedUids(itemProperties, state.relatedSeedUids)\n\n const appDb = BaseDb.getAppDb()\n\n const storedRows: Pick<MetadataType, 'uid' | 'revokedAt'>[] = await selectInBatches(\n fetchedProperties.map((property) => property.id),\n (chunk) =>\n appDb\n .select({ uid: metadata.uid, revokedAt: metadata.revokedAt })\n .from(metadata)\n .where(inArray(metadata.uid, chunk)),\n )\n\n const canonicalByUid = new Map(itemProperties.map((property) => [property.id, property]))\n const existingPropertyRecordsUids = new Set<string>()\n const staleUids = new Set<string>()\n const revokedAtUpdates = new Map<string, number | null>()\n\n for (const row of storedRows) {\n if (!row.uid) continue\n const canonical = canonicalByUid.get(row.uid)\n if (!canonical) {\n staleUids.add(row.uid)\n continue\n }\n existingPropertyRecordsUids.add(row.uid)\n // Same policy as seeds and versions: a local unpublish stamp stays until EAS reports a\n // revocationTime, even while EAS (its index lagging) still reports the attestation live.\n const revokedAt = syncedRevokedAt(canonical, row.revokedAt)\n if ((row.revokedAt ?? null) !== revokedAt) {\n revokedAtUpdates.set(row.uid, revokedAt)\n }\n }\n\n const newProperties = itemProperties.filter(\n (property) => !existingPropertyRecordsUids.has(property.id),\n )\n\n // Insert before deleting, so a property never goes without a row in between.\n if (newProperties.length > 0) {\n await insertSyncedProperties({ newProperties, itemSeeds, state })\n }\n\n if (staleUids.size > 0) {\n await writeInBatches([...staleUids], (chunk) =>\n appDb.delete(metadata).where(inArray(metadata.uid, chunk)),\n )\n }\n\n for (const [uid, revokedAt] of revokedAtUpdates) {\n await appDb\n .update(metadata)\n .set({ revokedAt, updatedAt: Date.now() })\n .where(eq(metadata.uid, uid))\n }\n\n await syncDerivedStorageRows({ fetchedProperties, canonicalProperties: itemProperties })\n\n return { propertyUids }\n}\n\n/** The transaction id a `storage_transaction_id` attestation carries; undefined for other properties. */\nconst storageTransactionIdOf = (property: Attestation): string | undefined => {\n const parsed = parseEasPropertyMetadata(property.decodedDataJson)\n if (!parsed.ok || parsed.metadata.name !== 'storage_transaction_id') return undefined\n const { value } = parsed.metadata\n // Same serialization as the derived rows' property_value.\n return typeof value === 'string' ? value : JSON.stringify(value)\n}\n\n/**\n * Make derived ItemStorage rows follow their `storage_transaction_id` attestation the way synced\n * rows follow theirs. Derived rows are identified by `derived_from_uid`, the attestation they were\n * derived from:\n * - A row derived from another fetched attestation with the canonical one's transaction id (on the\n * same version) is pointed at the canonical one; creation makes one row per transaction id.\n * - Rows derived from a fetched attestation that isn't canonical are deleted.\n * - Rows derived from the canonical one take its `revoked_at` once it has one (a stamp is never\n * cleared, see `syncedRevokedAt`).\n * Local drafts (no uid, no `derived_from_uid`) are never touched.\n */\nconst syncDerivedStorageRows = async ({\n fetchedProperties,\n canonicalProperties,\n}: {\n fetchedProperties: Attestation[]\n canonicalProperties: Attestation[]\n}): Promise<void> => {\n const canonical = canonicalProperties\n .map((property) => ({ property, transactionId: storageTransactionIdOf(property) }))\n .filter((c): c is { property: Attestation; transactionId: string } => !!c.transactionId)\n const canonicalUids = new Set(canonicalProperties.map((property) => property.id))\n\n const appDb = BaseDb.getAppDb()\n\n for (const { property, transactionId } of canonical) {\n const sameTransaction = fetchedProperties\n .filter(\n (other) =>\n other.id !== property.id &&\n other.refUID === property.refUID &&\n storageTransactionIdOf(other) === transactionId,\n )\n .map((other) => other.id)\n if (sameTransaction.length === 0) continue\n // A stamp belongs to the attestation it came from; the new source's is applied below.\n await writeInBatches(sameTransaction, (chunk) =>\n appDb\n .update(metadata)\n .set({\n derivedFromUid: property.id,\n revokedAt: null,\n attestationCreatedAt: property.timeCreated * 1000,\n updatedAt: Date.now(),\n })\n .where(inArray(metadata.derivedFromUid, chunk)),\n )\n }\n\n const staleSourceUids = fetchedProperties\n .filter((property) => !canonicalUids.has(property.id) && storageTransactionIdOf(property))\n .map((property) => property.id)\n if (staleSourceUids.length > 0) {\n await writeInBatches(staleSourceUids, (chunk) =>\n appDb.delete(metadata).where(inArray(metadata.derivedFromUid, chunk)),\n )\n }\n\n if (canonical.length === 0) return\n\n // The canonical rows' revoked_at as just stored (the saves above already applied EAS's state).\n const sourceRows: Pick<MetadataType, 'uid' | 'revokedAt'>[] = await selectInBatches(\n canonical.map((c) => c.property.id),\n (chunk) =>\n appDb\n .select({ uid: metadata.uid, revokedAt: metadata.revokedAt })\n .from(metadata)\n .where(inArray(metadata.uid, chunk)),\n )\n const revokedAtByUid = new Map(sourceRows.map((row) => [row.uid, row.revokedAt ?? null]))\n\n for (const { property } of canonical) {\n const revokedAt = revokedAtByUid.get(property.id) ?? null\n // The source's revoked_at already follows `syncedRevokedAt`. A live source leaves a derived\n // row's stamp alone: like a stamped synced row, it is only replaced by a revocation time.\n if (revokedAt == null) continue\n await appDb\n .update(metadata)\n .set({ revokedAt, updatedAt: Date.now() })\n .where(\n and(\n eq(metadata.derivedFromUid, property.id),\n or(isNull(metadata.revokedAt), ne(metadata.revokedAt, revokedAt)),\n ),\n )\n }\n}\n\n/**\n * The cached Model of a synced seed: its own model (seeds.model_file_id) when it has one, else by\n * EAS schema name, the snake_case model name (`sync_storage_post` → SyncStoragePost; a\n * `startCase` lookup never matched multi-word names). Throws AmbiguousModelError when several\n * schemas define a model with that name; callers skip the seed (skipSeedOnAmbiguousModel).\n */\nconst resolveSyncedSeedModel = async (\n Model: typeof import('../../Model/Model').Model,\n modelType: string,\n seed: { seedLocalId?: string | null; seedUid?: string | null },\n) => {\n const modelFileId = await resolveItemModelFileId(seed)\n return (modelFileId ? Model.getById(modelFileId) : undefined) ?? Model.findByModelType(modelType)\n}\n\nconst insertSyncedProperties = async ({\n newProperties,\n itemSeeds,\n state,\n}: {\n newProperties: Attestation[]\n itemSeeds: Attestation[]\n state: SyncRunState\n}): Promise<void> => {\n const { seedUidToLocalId, seedUidToModelType, versionUidToLocalId, versionUidToSeedUid } = state\n\n // Dynamic import to break circular dependency\n const modelMod = await import('../../Model/Model')\n const { Model } = modelMod\n // Loads every model into Model's cache, where resolveSyncedSeedModel looks them up.\n await Model.all()\n\n const appDb = BaseDb.getAppDb()\n\n // Bound as parameters, in batches of rowsPerInsert(metadata) rows, so no statement exceeds\n // SQLite's parameter or statement-length limits however many properties a sync stores.\n const rows: (typeof metadata.$inferInsert)[] = []\n\n for (const property of newProperties) {\n const propertyLocalId = generateId()\n \n // Validate and parse decodedDataJson\n const parsed = parseEasPropertyMetadata(property.decodedDataJson)\n if (!parsed.ok) {\n if (parsed.reason === 'empty') {\n console.warn(\n '[item/events] [syncDbWithEas] empty decodedDataJson for property: ',\n property.id,\n )\n } else if (parsed.reason === 'parse') {\n console.warn(\n '[item/events] [syncDbWithEas] failed to parse decodedDataJson for property: ',\n property.id,\n parsed.error,\n )\n } else {\n console.warn(\n '[item/events] [syncDbWithEas] invalid decodedDataJson structure for property: ',\n property.id,\n )\n }\n continue\n }\n\n const propertyMetadata = parsed.metadata\n\n let propertyNameSnake = propertyMetadata.name\n\n if (!propertyNameSnake) {\n console.warn(\n '[item/events] [syncDbWithEas] no propertyName found for property: ',\n property,\n )\n continue\n }\n\n let isRelation = false\n let refValueType\n let refSeedType\n let refSchemaUid\n let isList = false\n const schemaUid = property.schemaId\n\n setSchemaUidForSchemaDefinition({\n text: propertyNameSnake,\n schemaUid,\n })\n\n if (isRelationPropertyName(propertyNameSnake)) {\n isRelation = true\n\n if (Array.isArray(propertyMetadata.value)) {\n isList = true\n refValueType = 'list'\n\n const result = parseEasRelationPropertyName(propertyNameSnake)\n\n if (result) {\n propertyNameSnake = result.propertyName\n refSeedType = result.modelName\n }\n\n }\n\n if (!isList) {\n if (relationValuesToExclude.includes(propertyMetadata.value as string)) {\n continue\n }\n }\n }\n\n let propertyValue = propertyMetadata.value\n\n if (typeof propertyValue !== 'string') {\n propertyValue = JSON.stringify(propertyValue)\n }\n\n if (isRelation && !isList) {\n const relatedSeed = itemSeeds.find(\n (seed: Attestation) => seed.id === propertyMetadata.value,\n )\n if (relatedSeed && relatedSeed.schema && relatedSeed.schema.schemaNames) {\n refSeedType = relatedSeed.schema.schemaNames[0].name\n refSchemaUid = relatedSeed.schemaId\n }\n }\n\n if (isRelation && isList) {\n const relatedSeeds = itemSeeds.filter((seed: Attestation) =>\n (propertyMetadata.value as string[]).includes(seed.id),\n )\n if (relatedSeeds && relatedSeeds.length > 0) {\n refSeedType = relatedSeeds[0].schema.schemaNames[0].name\n refSchemaUid = relatedSeeds[0].schemaId\n }\n }\n\n const propertyName = camelCase(propertyNameSnake)\n const easDataType = propertyMetadata.type\n const versionUid = property.refUID\n const versionLocalId = versionUidToLocalId.get(versionUid)\n const attestationCreatedAt = property.timeCreated * 1000\n const seedUid = versionUidToSeedUid.get(versionUid)\n const seedLocalId = seedUidToLocalId.get(seedUid!)\n const modelType = seedUidToModelType.get(seedUid!)\n\n const model =\n modelType != null\n ? await skipSeedOnAmbiguousModel({ seedLocalId, seedUid }, 'easSync.metadata', async () =>\n resolveSyncedSeedModel(Model, modelType, { seedLocalId, seedUid }),\n )\n : undefined\n const modelSchema = model?.properties ? modelPropertiesToObject(model.properties) : undefined\n\n if (propertyNameSnake === 'storage_transaction_id') {\n await createMetadataRecordsForStorageTransactionId(property, modelSchema, state)\n }\n\n const propertyId =\n modelType != null\n ? ((await skipSeedOnAmbiguousModel({ seedLocalId, seedUid }, 'easSync.metadata', async () =>\n getPropertyIdForModelAndName(modelType, propertyName, {\n // EAS identifies models by name only; a locally-created seed still knows its model.\n modelFileId: await resolveItemModelFileId({ seedLocalId, seedUid }),\n }),\n )) ?? null)\n : null\n rows.push({\n localId: propertyLocalId,\n uid: property.id,\n schemaUid: property.schemaId,\n propertyId,\n propertyName,\n propertyValue,\n easDataType,\n versionUid,\n versionLocalId: versionLocalId ?? null,\n seedUid: seedUid ?? null,\n seedLocalId: seedLocalId ?? null,\n modelType: modelType ?? null,\n refValueType: refValueType || null,\n refSeedType: refSeedType || null,\n refModelUid: refSchemaUid || null,\n createdAt: Date.now(),\n attestationCreatedAt,\n attestationRaw: JSON.stringify(property),\n publisher: property.attester ? normalizeHexAddress(property.attester) : '',\n revokedAt: revokedAtSeconds(property) ?? null,\n })\n }\n\n // No conflict clause, as before: every row has a fresh local_id, and callers pass only\n // attestations with no stored row.\n const batchSize = rowsPerInsert(metadata)\n for (let i = 0; i < rows.length; i += batchSize) {\n await appDb.insert(metadata).values(rows.slice(i, i + batchSize))\n }\n}\n\nconst saveEasPropertiesToDb: SaveEasPropertiesToDb = (params) => {\n const next = saveEasPropertiesDbChain.then(() => saveEasPropertiesToDbBody(params))\n saveEasPropertiesDbChain = next.then(\n () => undefined,\n () => undefined,\n )\n return next\n}\n\n/**\n * Fetch every version of `seedUids` and every property attestation of those versions, and store\n * them. The main sync and the related-seed fetch both go through here, so they treat revocation\n * the same way: revoked attestations are fetched on purpose (`excludeRevoked: false`), revoked\n * seeds record `revokedAt` (in `saveEasSeedsToDb`), and properties go through the canonical pick\n * (newest non-revoked per version and property schema, see ADR 0006).\n */\nconst syncVersionsAndPropertiesForSeeds = async ({\n seedUids,\n itemSeeds,\n state,\n}: {\n seedUids: string[]\n itemSeeds: Attestation[]\n state: SyncRunState\n}): Promise<void> => {\n if (seedUids.length === 0) return\n\n const itemVersions = await getItemVersionsFromEas({\n seedUids,\n excludeRevoked: false,\n })\n\n const { versionUids } = await saveEasVersionsToDb({\n itemVersions,\n state,\n })\n if (versionUids.length === 0) return\n\n const fetchedProperties = await getItemPropertiesFromEas({\n versionUids,\n excludeRevoked: false,\n })\n\n // The save makes the canonical pick; it also needs the other attestations to clean up after them.\n await saveEasPropertiesToDb({\n fetchedProperties,\n itemSeeds,\n state,\n })\n}\n\n/**\n * Relation targets of synced properties, fetched by id from any attester (one level deep).\n *\n * This deliberately matches the main sync instead of filtering out revoked attestations: a\n * relation to an unpublished seed should still resolve locally, to the seed's last values next to\n * its `revokedAt`, exactly as if that seed had been synced in its own right. Filtering at the query\n * would also break the canonical pick, which needs the revoked attestations to skip them (or to\n * keep the newest one when all are revoked), and would leave `seeds.revoked_at` unset.\n */\nconst getRelatedSeedsAndVersions = async (state: SyncRunState) => {\n // Snapshot: relations found on the related seeds themselves aren't followed (one level deep).\n const uids = Array.from(state.relatedSeedUids)\n if (uids.length === 0) return\n\n const easClient = BaseEasClient.getEasClient()\n\n // No `revoked` filter, like `getSeedsFromSchemaUids({ excludeRevoked: false })` in the main sync.\n const { itemSeeds } = await easClient.request(GET_SEEDS, {\n where: {\n id: {\n in: uids,\n },\n },\n })\n\n const { seedUids } = await saveEasSeedsToDb({ itemSeeds, state })\n\n // Only seeds EAS returned: a version of an unknown seed would be stored without its seed.\n await syncVersionsAndPropertiesForSeeds({ seedUids, itemSeeds, state })\n}\n\nexport type SyncFromEasOptions = {\n /** Override addresses to sync. Default: owned + watched from DB. */\n addresses?: string[]\n}\n\n/**\n * Core sync logic: fetches item attestations from EAS for configured models and given addresses,\n * then saves seeds, versions, and properties to the local DB.\n * Uses owned + watched addresses from DB when addresses are not provided.\n */\nexport const runSyncFromEas = async (options?: SyncFromEasOptions): Promise<void> => {\n let addresses = options?.addresses ?? (await getAllAddressesFromDb())\n const additionalGetter = getGetAdditionalSyncAddresses()\n if (additionalGetter) {\n const additional = await additionalGetter()\n if (additional?.length) {\n const seen = new Set(addresses.map((a) => a.toLowerCase()))\n for (const addr of additional) {\n if (addr && !seen.has(addr.toLowerCase())) {\n seen.add(addr.toLowerCase())\n addresses = [...addresses, addr]\n }\n }\n }\n }\n if (!addresses || addresses.length === 0) {\n return\n }\n\n // Don't read the default chain while publish is about to configure another one.\n await waitForEasReadChain()\n // Never mix attestations from two chains in one local DB.\n await assertLocalDbChain()\n\n const appDb = BaseDb.getAppDb()\n\n const { schemaStringToModelRecord } = await getModelSchemas()\n\n const modelSchemas = await getModelSchemasFromEas()\n\n const schemaUids: string[] = []\n\n for (const modelSchema of modelSchemas) {\n const foundModel = schemaStringToModelRecord.get(modelSchema.schema)\n\n if (!foundModel) {\n // Skip schemas that don't have a corresponding model in the user's config\n // This can happen with \"bytes32 image\" if there's no Image model defined\n console.warn(\n `[item/events] [syncDbWithEas] Model not found for schema ${modelSchema.schema}, skipping`\n )\n continue\n }\n\n try {\n await appDb\n .insert(modelUids)\n .values({\n modelId: foundModel.id,\n uid: modelSchema.id,\n })\n .onConflictDoNothing()\n } catch (err: unknown) {\n // Model may have been deleted by test teardown or another process; skip to avoid unhandled rejection\n const e = err as { code?: string; rawCode?: number; cause?: { code?: string; rawCode?: number } }\n const code = e?.code ?? e?.rawCode ?? e?.cause?.code ?? e?.cause?.rawCode\n if (code === 'SQLITE_CONSTRAINT_FOREIGNKEY' || code === 787) {\n continue\n }\n throw err\n }\n\n schemaUids.push(modelSchema.id)\n }\n\n // If no schemas were found, skip the rest of the sync process\n // This can happen when models exist but don't have schemas registered in EAS yet\n if (schemaUids.length === 0) {\n return\n }\n\n const itemSeeds = await getSeedsFromSchemaUids({\n schemaUids,\n addresses,\n excludeRevoked: false,\n })\n\n const state = createSyncRunState()\n\n const { seedUids } = await saveEasSeedsToDb({\n itemSeeds,\n state,\n })\n\n await syncVersionsAndPropertiesForSeeds({ seedUids, itemSeeds, state })\n\n await getRelatedSeedsAndVersions(state)\n scheduleBulkFilesDownloadFromEasSync(addresses)\n\n try {\n const itemMod = await import('../../Item/Item')\n await itemMod.Item.rehydrateCachedItemsFromDbAfterEasSync()\n } catch (err) {\n console.warn('[item/events] [syncDbWithEas] rehydrateCachedItemsFromDbAfterEasSync:', err)\n }\n // Other tabs reload their cached Items too (docs/MULTI_TAB.md).\n emitAcrossTabs(EAS_SEED_DATA_SYNCED_TO_DB_EVENT)\n}\n\n"],"names":["BaseDb","modelsTable","modelUids","eq","toSnakeCase","normalizePublisher","chunkValues","rowsPerInsert","seeds","writeInBatches","metadata","and","or","inArray","isNull","versions","parseEasPropertyMetadata","selectInBatches","generateId","resolveModelForSyncedSeed","normalizeHexAddress","camelCase","skipSeedOnAmbiguousModel","getItemStoragePropertiesForModel","resolveItemModelFileId","isNotNull","getPropertyIdForModelAndName","pickLatestPropertyAttestationsByRefAndSchema","ne","setSchemaUidForSchemaDefinition","parseEasRelationPropertyName","modelPropertiesToObject","getItemVersionsFromEas","getItemPropertiesFromEas","BaseEasClient","GET_SEEDS","getAllAddressesFromDb","getGetAdditionalSyncAddresses","waitForEasReadChain","assertLocalDbChain","getModelSchemasFromEas","getSeedsFromSchemaUids","scheduleBulkFilesDownloadFromEasSync","emitAcrossTabs","EAS_SEED_DATA_SYNCED_TO_DB_EVENT"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { t as BasePathResolver, B as BaseFileManager, a as BaseDb } from './BasePathResolver-BdxCSIzn.js';
2
- import './tabEvents-BZJMY5uK.js';
1
+ import { r as BasePathResolver, t as BaseFileManager, B as BaseDb } from './BasePathResolver-CfSfMW5_.js';
2
+ import './tabEvents-DguZpCCv.js';
3
3
  import { BaseEasClient, BaseQueryClient } from '@seedprotocol/eas';
4
4
  import { BaseArweaveClient } from '@seedprotocol/arweave';
5
5
  import 'drizzle-orm/sqlite-core';
@@ -7,13 +7,16 @@ import 'drizzle-orm';
7
7
  import 'debug';
8
8
  import 'xstate';
9
9
  import 'pluralize';
10
- import './db-CQt-gcAl.js';
10
+ import './db-D9K_f5cF.js';
11
11
  import 'drizzle-orm/casing';
12
12
  import 'lodash-es';
13
13
  import '@sinclair/typebox';
14
14
  import 'nanoid';
15
15
  import 'nanoid-dictionary';
16
16
  import '@seedprotocol/query';
17
+ import '@noble/hashes/sha256';
18
+ import '@noble/hashes/sha3';
19
+ import '@noble/hashes/utils';
17
20
 
18
21
  /**
19
22
  * Wire all platform facades to the given service instances.
@@ -28,4 +31,4 @@ function configurePlatform(services) {
28
31
  }
29
32
 
30
33
  export { configurePlatform };
31
- //# sourceMappingURL=configurePlatform-YcOiDQBZ.js.map
34
+ //# sourceMappingURL=configurePlatform-BRw2j0ZN.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"configurePlatform-YcOiDQBZ.js","sources":["../../src/platform/configurePlatform.ts"],"sourcesContent":["import { BasePathResolver } from '@/helpers/PathResolver/BasePathResolver'\nimport { BaseFileManager } from '@/helpers/FileManager/BaseFileManager'\nimport { BaseDb } from '@/db/Db/BaseDb'\nimport { BaseArweaveClient } from '@/helpers'\nimport { BaseEasClient } from '@/helpers/EasClient/BaseEasClient'\nimport { BaseQueryClient } from '@/helpers/QueryClient/BaseQueryClient'\nimport type { PlatformServices } from './types'\n\n/**\n * Wire all platform facades to the given service instances.\n */\nexport function configurePlatform(services: PlatformServices): void {\n BasePathResolver.configure(services.pathResolver)\n BaseFileManager.configure(services.fileManager)\n BaseDb.configure(services.db)\n BaseArweaveClient.configure(services.arweaveClient)\n BaseEasClient.configure(services.easClient)\n BaseQueryClient.configure(services.queryClient)\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAQA;;AAEG;AACG,SAAU,iBAAiB,CAAC,QAA0B,EAAA;AAC1D,IAAA,gBAAgB,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC;AACjD,IAAA,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC;AAC/C,IAAA,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;AAC7B,IAAA,iBAAiB,CAAC,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC;AACnD,IAAA,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC;AAC3C,IAAA,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC;AACjD;;"}
1
+ {"version":3,"file":"configurePlatform-BRw2j0ZN.js","sources":["../../src/platform/configurePlatform.ts"],"sourcesContent":["import { BasePathResolver } from '@/helpers/PathResolver/BasePathResolver'\nimport { BaseFileManager } from '@/helpers/FileManager/BaseFileManager'\nimport { BaseDb } from '@/db/Db/BaseDb'\nimport { BaseArweaveClient } from '@/helpers'\nimport { BaseEasClient } from '@/helpers/EasClient/BaseEasClient'\nimport { BaseQueryClient } from '@/helpers/QueryClient/BaseQueryClient'\nimport type { PlatformServices } from './types'\n\n/**\n * Wire all platform facades to the given service instances.\n */\nexport function configurePlatform(services: PlatformServices): void {\n BasePathResolver.configure(services.pathResolver)\n BaseFileManager.configure(services.fileManager)\n BaseDb.configure(services.db)\n BaseArweaveClient.configure(services.arweaveClient)\n BaseEasClient.configure(services.easClient)\n BaseQueryClient.configure(services.queryClient)\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAQA;;AAEG;AACG,SAAU,iBAAiB,CAAC,QAA0B,EAAA;AAC1D,IAAA,gBAAgB,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC;AACjD,IAAA,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC;AAC/C,IAAA,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;AAC7B,IAAA,iBAAiB,CAAC,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC;AACnD,IAAA,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC;AAC3C,IAAA,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC;AACjD;;"}
@@ -1,4 +1,4 @@
1
- import { j as models, g as modelSchemas, s as schemas, a as BaseDb, r as seeds, p as properties, b as appState, m as metadata } from './BasePathResolver-BdxCSIzn.js';
1
+ import { i as models, f as modelSchemas, s as schemas, B as BaseDb, q as seeds, p as properties, a as appState, m as metadata } from './BasePathResolver-CfSfMW5_.js';
2
2
  import { toSnakeCase } from 'drizzle-orm/casing';
3
3
  import { eq, and, inArray, desc, isNull } from 'drizzle-orm';
4
4
  import debug from 'debug';
@@ -1286,7 +1286,7 @@ const renameModelInDb = async (oldName, newName, schemaNameOrId) => {
1286
1286
  if (!db) {
1287
1287
  throw new Error('Database not found');
1288
1288
  }
1289
- const _mod_0 = await import('./BasePathResolver-BdxCSIzn.js');
1289
+ const _mod_0 = await import('./BasePathResolver-CfSfMW5_.js');
1290
1290
  const _ns_0 = _mod_0.Q;
1291
1291
  const { schemas: schemasTable } = _ns_0;
1292
1292
  // Find the model by old name, optionally scoped by schema
@@ -1603,8 +1603,8 @@ const addModelsToDb = async (models$1, schema, modelRenames, schemaFileData) =>
1603
1603
  // If no propertyFileId from map, generate a random ID
1604
1604
  // IDs should be generated in the import process before calling addModelsToDb
1605
1605
  if (!propertyFileId) {
1606
- const _mod_1 = await import('./tabEvents-BZJMY5uK.js');
1607
- const _ns_1 = _mod_1.P;
1606
+ const _mod_1 = await import('./tabEvents-DguZpCCv.js');
1607
+ const _ns_1 = _mod_1.Z;
1608
1608
  const { generateId } = _ns_1;
1609
1609
  propertyFileId = generateId();
1610
1610
  logger(`Generated propertyFileId "${propertyFileId}" for property "${modelName}:${propertyName}" (not found in propertyFileIds map)`);
@@ -2292,7 +2292,7 @@ async function writeModelToDb(modelFileId, data) {
2292
2292
  throw new Error(`Model with id ${modelId} does not exist in database. Cannot create join record.`);
2293
2293
  }
2294
2294
  // Verify schemaId exists and get name/fileId for invalidation broadcast
2295
- const _mod_2 = await import('./BasePathResolver-BdxCSIzn.js');
2295
+ const _mod_2 = await import('./BasePathResolver-CfSfMW5_.js');
2296
2296
  const _ns_2 = _mod_2.Q;
2297
2297
  const schemaSchemaMod = _ns_2;
2298
2298
  const { schemas: schemasTable } = schemaSchemaMod;
@@ -2358,8 +2358,8 @@ async function writeModelToDb(modelFileId, data) {
2358
2358
  else {
2359
2359
  // Generate random propertyFileId
2360
2360
  // IDs should be generated in the import process before calling writeModelToDb
2361
- const _mod_3 = await import('./tabEvents-BZJMY5uK.js');
2362
- const _ns_3 = _mod_3.P;
2361
+ const _mod_3 = await import('./tabEvents-DguZpCCv.js');
2362
+ const _ns_3 = _mod_3.Z;
2363
2363
  const { generateId } = _ns_3;
2364
2364
  propertyFileId = generateId();
2365
2365
  logger(`Generated propertyFileId "${propertyFileId}" for property "${data.modelName}:${propName}"`);
@@ -2507,7 +2507,7 @@ async function getSchemaId(schemaNameOrFileId) {
2507
2507
  if (!db) {
2508
2508
  throw new Error('Database not available');
2509
2509
  }
2510
- const _mod_4 = await import('./BasePathResolver-BdxCSIzn.js');
2510
+ const _mod_4 = await import('./BasePathResolver-CfSfMW5_.js');
2511
2511
  const _ns_4 = _mod_4.Q;
2512
2512
  const schemaSchemaMod = _ns_4;
2513
2513
  const { schemas: schemasTable } = schemaSchemaMod;
@@ -2545,7 +2545,7 @@ async function getSchemaIdByFileId(schemaFileId) {
2545
2545
  if (!db) {
2546
2546
  throw new Error('Database not available');
2547
2547
  }
2548
- const _mod_5 = await import('./BasePathResolver-BdxCSIzn.js');
2548
+ const _mod_5 = await import('./BasePathResolver-CfSfMW5_.js');
2549
2549
  const _ns_5 = _mod_5.Q;
2550
2550
  const schemaSchemaMod = _ns_5;
2551
2551
  const { schemas: schemasTable } = schemaSchemaMod;
@@ -2574,7 +2574,7 @@ async function getModelId(modelNameOrFileId, schemaNameOrId) {
2574
2574
  if (!db) {
2575
2575
  throw new Error('Database not available');
2576
2576
  }
2577
- const _mod_6 = await import('./BasePathResolver-BdxCSIzn.js');
2577
+ const _mod_6 = await import('./BasePathResolver-CfSfMW5_.js');
2578
2578
  const _ns_6 = _mod_6.N;
2579
2579
  const modelSchemaMod = _ns_6;
2580
2580
  const { models: modelsTable } = modelSchemaMod;
@@ -2591,11 +2591,11 @@ async function getModelId(modelNameOrFileId, schemaNameOrId) {
2591
2591
  [eq(modelsTable.name, modelNameOrFileId)];
2592
2592
  // If schema is provided, narrow the search
2593
2593
  if (schemaNameOrId !== undefined) {
2594
- const _mod_7 = await import('./BasePathResolver-BdxCSIzn.js');
2594
+ const _mod_7 = await import('./BasePathResolver-CfSfMW5_.js');
2595
2595
  const _ns_7 = _mod_7.R;
2596
2596
  const modelSchemaSchemaMod = _ns_7;
2597
2597
  const { modelSchemas } = modelSchemaSchemaMod;
2598
- const _mod_8 = await import('./BasePathResolver-BdxCSIzn.js');
2598
+ const _mod_8 = await import('./BasePathResolver-CfSfMW5_.js');
2599
2599
  const _ns_8 = _mod_8.Q;
2600
2600
  const schemaSchemaMod = _ns_8;
2601
2601
  const { schemas: schemasTable } = schemaSchemaMod;
@@ -2642,7 +2642,7 @@ async function getModelIdByFileId(modelFileId) {
2642
2642
  if (!db) {
2643
2643
  throw new Error('Database not available');
2644
2644
  }
2645
- const _mod_9 = await import('./BasePathResolver-BdxCSIzn.js');
2645
+ const _mod_9 = await import('./BasePathResolver-CfSfMW5_.js');
2646
2646
  const _ns_9 = _mod_9.N;
2647
2647
  const modelSchemaMod = _ns_9;
2648
2648
  const { models: modelsTable } = modelSchemaMod;
@@ -2691,4 +2691,4 @@ var db = /*#__PURE__*/Object.freeze({
2691
2691
  });
2692
2692
 
2693
2693
  export { AmbiguousModelError as A, Boolean as B, normalizeAddressConfig as C, DEFAULT_TEXT_MAX_LENGTH as D, normalizeAddressList as E, File as F, writeModelToDb as G, Html as H, Image as I, Json as J, writePropertyToDb as K, List as L, ModelPropertyDataTypes as M, Number$1 as N, addSchemaToDb as O, Property as P, renameModelInDb as Q, Relation as R, loadModelsFromDbForSchema as S, THtmlEmbeddedDataUriPolicy as T, linkModelToSchema as U, getWatchedAddressesFromDb as V, getOwnedAddressesFromDb as W, getPropertyIdForSchemaFileId as X, resolveModelRecord$1 as Y, db as Z, Date$1 as a, PropertyConstructor as b, PropertyMetadataKey as c, TProperty as d, TPropertyConstructor as e, TPropertyDataType as f, TPropertyDefs as g, TStorageType as h, TValidationRules as i, Text as j, isDataType as k, normalizePropertyRecordSchema as l, eventEmitter as m, normalizeDataType as n, getPropertyIdForModelAndName as o, resolveModelRecord as p, getItemModelScope as q, resolveItemModelFileId as r, normalizePublisher as s, getAllAddressesFromDb as t, normalizeHexAddress as u, getItemStoragePropertiesForModel as v, addModelsToDb as w, getModelIdByFileId as x, getModelId as y, getAddressesForItemsFilter as z };
2694
- //# sourceMappingURL=db-CQt-gcAl.js.map
2694
+ //# sourceMappingURL=db-D9K_f5cF.js.map