yaml-flow 5.4.2 → 7.0.0

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 (252) hide show
  1. package/board-live-cards-cli.js +6 -6
  2. package/browser/asset-integrity.json +10 -0
  3. package/browser/board-livecards-client.js +2 -0
  4. package/browser/board-livecards-client.js.map +1 -0
  5. package/browser/board-livecards-localstorage.js +10 -0
  6. package/browser/board-livecards-localstorage.js.map +1 -0
  7. package/browser/board-livegraph-engine.js +2 -1676
  8. package/browser/board-livegraph-engine.js.map +1 -1
  9. package/browser/card-compute.js +28 -28
  10. package/browser/compute-jsonata.js +5 -0
  11. package/browser/compute-jsonata.js.map +1 -0
  12. package/browser/live-cards.js +561 -129
  13. package/browser/live-cards.schema.json +418 -132
  14. package/card-store.js +37 -0
  15. package/dist/batch/index.cjs +1 -108
  16. package/dist/batch/index.cjs.map +1 -1
  17. package/dist/batch/index.js +1 -106
  18. package/dist/batch/index.js.map +1 -1
  19. package/dist/board-live-cards-lib-Bg6EvCo5.d.cts +136 -0
  20. package/dist/board-live-cards-lib-jM2uYG1v.d.ts +136 -0
  21. package/dist/board-live-cards-public-CW5074xr.d.cts +318 -0
  22. package/dist/board-live-cards-public-hnZo0mAf.d.ts +318 -0
  23. package/dist/board-livegraph-runtime/index.cjs +2 -1671
  24. package/dist/board-livegraph-runtime/index.cjs.map +1 -1
  25. package/dist/board-livegraph-runtime/index.d.cts +12 -11
  26. package/dist/board-livegraph-runtime/index.d.ts +12 -11
  27. package/dist/board-livegraph-runtime/index.js +2 -1662
  28. package/dist/board-livegraph-runtime/index.js.map +1 -1
  29. package/dist/board-livegraph-runtime/jsonata-sync.cjs +7623 -0
  30. package/dist/card-compute/index.cjs +9 -7159
  31. package/dist/card-compute/index.cjs.map +1 -1
  32. package/dist/card-compute/index.d.cts +27 -1
  33. package/dist/card-compute/index.d.ts +27 -1
  34. package/dist/card-compute/index.js +9 -7145
  35. package/dist/card-compute/index.js.map +1 -1
  36. package/dist/card-compute/jsonata-sync.cjs +7623 -0
  37. package/dist/cli/browser-api/board-live-cards-browser-adapter.cjs +3 -0
  38. package/dist/cli/browser-api/board-live-cards-browser-adapter.cjs.map +1 -0
  39. package/dist/cli/browser-api/board-live-cards-browser-adapter.d.cts +37 -0
  40. package/dist/cli/browser-api/board-live-cards-browser-adapter.d.ts +37 -0
  41. package/dist/cli/browser-api/board-live-cards-browser-adapter.js +3 -0
  42. package/dist/cli/browser-api/board-live-cards-browser-adapter.js.map +1 -0
  43. package/dist/cli/browser-api/card-store-browser-api.cjs +2 -0
  44. package/dist/cli/browser-api/card-store-browser-api.cjs.map +1 -0
  45. package/dist/cli/browser-api/card-store-browser-api.d.cts +26 -0
  46. package/dist/cli/browser-api/card-store-browser-api.d.ts +26 -0
  47. package/dist/cli/browser-api/card-store-browser-api.js +2 -0
  48. package/dist/cli/browser-api/card-store-browser-api.js.map +1 -0
  49. package/dist/cli/browser-api/jsonata-sync.cjs +7623 -0
  50. package/dist/cli/node/artifacts-store-cli.cjs +11 -0
  51. package/dist/cli/node/artifacts-store-cli.cjs.map +1 -0
  52. package/dist/cli/node/artifacts-store-cli.d.cts +8 -0
  53. package/dist/cli/node/artifacts-store-cli.d.ts +8 -0
  54. package/dist/cli/node/artifacts-store-cli.js +11 -0
  55. package/dist/cli/node/artifacts-store-cli.js.map +1 -0
  56. package/dist/cli/node/board-live-cards-cli.cjs +15 -0
  57. package/dist/cli/node/board-live-cards-cli.cjs.map +1 -0
  58. package/dist/cli/node/board-live-cards-cli.d.cts +20 -0
  59. package/dist/cli/node/board-live-cards-cli.d.ts +20 -0
  60. package/dist/cli/node/board-live-cards-cli.js +15 -0
  61. package/dist/cli/node/board-live-cards-cli.js.map +1 -0
  62. package/dist/cli/node/card-store-cli.cjs +8 -0
  63. package/dist/cli/node/card-store-cli.cjs.map +1 -0
  64. package/dist/cli/node/card-store-cli.d.cts +15 -0
  65. package/dist/cli/node/card-store-cli.d.ts +15 -0
  66. package/dist/cli/node/card-store-cli.js +8 -0
  67. package/dist/cli/node/card-store-cli.js.map +1 -0
  68. package/dist/cli/node/execution-adapter.cjs +3 -0
  69. package/dist/cli/node/execution-adapter.cjs.map +1 -0
  70. package/dist/cli/node/execution-adapter.d.cts +174 -0
  71. package/dist/cli/node/execution-adapter.d.ts +174 -0
  72. package/dist/cli/node/execution-adapter.js +3 -0
  73. package/dist/cli/node/execution-adapter.js.map +1 -0
  74. package/dist/cli/node/fs-board-adapter.cjs +14 -0
  75. package/dist/cli/node/fs-board-adapter.cjs.map +1 -0
  76. package/dist/cli/node/fs-board-adapter.d.cts +204 -0
  77. package/dist/cli/node/fs-board-adapter.d.ts +204 -0
  78. package/dist/cli/node/fs-board-adapter.js +14 -0
  79. package/dist/cli/node/fs-board-adapter.js.map +1 -0
  80. package/dist/cli/node/jsonata-sync.cjs +7623 -0
  81. package/dist/cli/node/source-cli-task-executor.cjs +11 -0
  82. package/dist/cli/node/source-cli-task-executor.cjs.map +1 -0
  83. package/dist/cli/node/source-cli-task-executor.d.cts +1 -0
  84. package/dist/cli/node/source-cli-task-executor.d.ts +1 -0
  85. package/dist/cli/node/source-cli-task-executor.js +11 -0
  86. package/dist/cli/node/source-cli-task-executor.js.map +1 -0
  87. package/dist/config/index.cjs +1 -79
  88. package/dist/config/index.cjs.map +1 -1
  89. package/dist/config/index.js +1 -76
  90. package/dist/config/index.js.map +1 -1
  91. package/dist/continuous-event-graph/index.cjs +2 -2129
  92. package/dist/continuous-event-graph/index.cjs.map +1 -1
  93. package/dist/continuous-event-graph/index.d.cts +81 -5
  94. package/dist/continuous-event-graph/index.d.ts +81 -5
  95. package/dist/continuous-event-graph/index.js +2 -2088
  96. package/dist/continuous-event-graph/index.js.map +1 -1
  97. package/dist/continuous-event-graph/jsonata-sync.cjs +7623 -0
  98. package/dist/event-graph/index.cjs +22 -8292
  99. package/dist/event-graph/index.cjs.map +1 -1
  100. package/dist/event-graph/index.js +22 -8237
  101. package/dist/event-graph/index.js.map +1 -1
  102. package/dist/execution-refs.cjs +3 -0
  103. package/dist/execution-refs.cjs.map +1 -0
  104. package/dist/execution-refs.d.cts +260 -0
  105. package/dist/execution-refs.d.ts +260 -0
  106. package/dist/execution-refs.js +3 -0
  107. package/dist/execution-refs.js.map +1 -0
  108. package/dist/index.cjs +29 -13221
  109. package/dist/index.cjs.map +1 -1
  110. package/dist/index.d.cts +2 -4
  111. package/dist/index.d.ts +2 -4
  112. package/dist/index.js +29 -13112
  113. package/dist/index.js.map +1 -1
  114. package/dist/inference/index.cjs +5 -617
  115. package/dist/inference/index.cjs.map +1 -1
  116. package/dist/inference/index.js +5 -610
  117. package/dist/inference/index.js.map +1 -1
  118. package/dist/jsonata-sync.cjs +7623 -0
  119. package/dist/{live-cards-bridge-x5XREkXm.d.cts → live-cards-bridge-BXbVTsna.d.cts} +27 -4
  120. package/dist/{live-cards-bridge-EQjytzI_.d.ts → live-cards-bridge-Ds28XR15.d.ts} +27 -4
  121. package/dist/server-runtime/index.cjs +9 -0
  122. package/dist/server-runtime/index.cjs.map +1 -0
  123. package/dist/server-runtime/index.d.cts +31 -0
  124. package/dist/server-runtime/index.d.ts +31 -0
  125. package/dist/server-runtime/index.js +9 -0
  126. package/dist/server-runtime/index.js.map +1 -0
  127. package/dist/server-runtime/jsonata-sync.cjs +7623 -0
  128. package/dist/step-machine/index.cjs +11 -7129
  129. package/dist/step-machine/index.cjs.map +1 -1
  130. package/dist/step-machine/index.js +11 -7113
  131. package/dist/step-machine/index.js.map +1 -1
  132. package/dist/step-machine-public/index.cjs +2 -0
  133. package/dist/step-machine-public/index.cjs.map +1 -0
  134. package/dist/step-machine-public/index.d.cts +159 -0
  135. package/dist/step-machine-public/index.d.ts +159 -0
  136. package/dist/step-machine-public/index.js +2 -0
  137. package/dist/step-machine-public/index.js.map +1 -0
  138. package/dist/step-machine-public/jsonata-sync.cjs +7623 -0
  139. package/dist/storage-refs.cjs +10 -0
  140. package/dist/storage-refs.cjs.map +1 -0
  141. package/dist/storage-refs.d.cts +93 -0
  142. package/dist/storage-refs.d.ts +93 -0
  143. package/dist/storage-refs.js +10 -0
  144. package/dist/storage-refs.js.map +1 -0
  145. package/dist/stores/file.cjs +1 -114
  146. package/dist/stores/file.cjs.map +1 -1
  147. package/dist/stores/file.js +1 -112
  148. package/dist/stores/file.js.map +1 -1
  149. package/dist/stores/index.cjs +1 -231
  150. package/dist/stores/index.cjs.map +1 -1
  151. package/dist/stores/index.js +1 -227
  152. package/dist/stores/index.js.map +1 -1
  153. package/dist/stores/localStorage.cjs +1 -76
  154. package/dist/stores/localStorage.cjs.map +1 -1
  155. package/dist/stores/localStorage.js +1 -74
  156. package/dist/stores/localStorage.js.map +1 -1
  157. package/dist/stores/memory.cjs +1 -47
  158. package/dist/stores/memory.cjs.map +1 -1
  159. package/dist/stores/memory.js +1 -45
  160. package/dist/stores/memory.js.map +1 -1
  161. package/dist/types-B1ZRa4aI.d.ts +147 -0
  162. package/dist/types-BxEFcVK9.d.cts +147 -0
  163. package/examples/browser/boards/portfolio-tracker/portfolio-t4.js +291 -0
  164. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-fetch-prices.js +218 -0
  165. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-fetch-prices.py +201 -0
  166. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-http-test.js +357 -0
  167. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-inference-adapter.js +25 -16
  168. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-public.js +552 -0
  169. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-server.js +300 -0
  170. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-server.py +617 -0
  171. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-sse-worker.js +48 -0
  172. package/examples/browser/boards/portfolio-tracker/portfolio-tracker.py +366 -0
  173. package/examples/cli/step-machine-cli/portfolio-tracker/--base-ref/.runtime-out +1 -0
  174. package/examples/cli/step-machine-cli/portfolio-tracker/--base-ref/board-graph.json +32 -0
  175. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/_board-cli.js +70 -3
  176. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/add-cards-cli.js +16 -11
  177. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/init-board-cli.js +9 -8
  178. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/poll-status-cli.js +49 -0
  179. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/reset-board-dir-cli.js +2 -6
  180. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/retrigger-cli.js +4 -8
  181. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/status-cli.js +3 -7
  182. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/update-holdings-cli.js +9 -8
  183. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/wait-completed-cli.js +12 -17
  184. package/examples/cli/step-machine-cli/portfolio-tracker/handlers/write-prices-cli.js +2 -6
  185. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/_board_pycli.py +107 -0
  186. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/add-cards.py +51 -0
  187. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/init-board.py +45 -0
  188. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/poll-status.py +71 -0
  189. package/examples/cli/step-machine-cli/portfolio-tracker/handlers-py/reset-board-dir.py +36 -0
  190. package/examples/cli/step-machine-cli/portfolio-tracker/inline-python-demo.flow.yaml +26 -0
  191. package/examples/cli/step-machine-cli/portfolio-tracker/inline-python-handlers.py +39 -0
  192. package/examples/cli/step-machine-cli/portfolio-tracker/portfolio-tracker-pycli.flow.yaml +80 -0
  193. package/examples/cli/step-machine-cli/portfolio-tracker/portfolio-tracker.flow.yaml +36 -187
  194. package/examples/cli/step-machine-cli/portfolio-tracker/portfolio-tracker.input.json +40 -34
  195. package/examples/cli/step-machine-cli/portfolio-tracker/run-inline-python-demo-pycli.py +43 -0
  196. package/examples/cli/step-machine-cli/portfolio-tracker/run-portfolio-tracker-pycli.py +77 -0
  197. package/examples/cli/step-machine-cli/portfolio-tracker/run-portfolio-tracker.bat +1 -2
  198. package/examples/cli/step-machine-demo/jsonata-init-board-cli.js +8 -13
  199. package/examples/cli/step-machine-demo/jsonata-init-board.flow.yaml +33 -9
  200. package/examples/cli/step-machine-demo/one-step-cli-only.flow.yaml +3 -1
  201. package/examples/cli/step-machine-demo/step2-double-cli.js +6 -12
  202. package/examples/cli/step-machine-demo/two-step-math.flow.yaml +66 -4
  203. package/examples/cli/step-machine-demo/two-step-mixed.flow.yaml +13 -5
  204. package/examples/example-board/agent-instructions.md +11 -5
  205. package/examples/example-board/cards/_index.json +47 -0
  206. package/examples/example-board/cards/card-market-prices.json +33 -9
  207. package/examples/example-board/cards/card-my-identity.json +30 -6
  208. package/examples/example-board/cards/card-portfolio-action.json +24 -6
  209. package/examples/example-board/cards/card-portfolio-intelligence.json +97 -0
  210. package/examples/example-board/cards/card-portfolio-risks.json +24 -6
  211. package/examples/example-board/cards/card-portfolio-value.json +38 -10
  212. package/examples/example-board/cards/card-portfolio.json +57 -13
  213. package/examples/example-board/cards/card-rebalance-impact.json +22 -6
  214. package/examples/example-board/cards/card-rebalance-sim.json +66 -15
  215. package/examples/example-board/demo-chat-handler.js +14 -4
  216. package/examples/example-board/demo-server-config.json +1 -0
  217. package/examples/example-board/demo-server.js +366 -68
  218. package/examples/example-board/demo-shell-localstorage.html +774 -0
  219. package/examples/example-board/demo-shell-with-server.html +20 -37
  220. package/examples/example-board/demo-shell.html +5 -4
  221. package/examples/example-board/demo-task-executor.js +273 -275
  222. package/examples/index.html +0 -14
  223. package/examples/step-machine-cli/portfolio-tracker/handlers/_board-cli.js +0 -1
  224. package/examples/step-machine-cli/portfolio-tracker/run-portfolio-tracker.bat +1 -2
  225. package/package.json +46 -8
  226. package/schema/live-cards.schema.json +418 -132
  227. package/step-machine-cli.js +43 -310
  228. package/board-livecards-server-runtime.js +0 -1574
  229. package/browser/board-livecards-runtime-client.js +0 -263
  230. package/dist/cli/board-live-cards-cli.cjs +0 -10650
  231. package/dist/cli/board-live-cards-cli.cjs.map +0 -1
  232. package/dist/cli/board-live-cards-cli.d.cts +0 -179
  233. package/dist/cli/board-live-cards-cli.d.ts +0 -179
  234. package/dist/cli/board-live-cards-cli.js +0 -10598
  235. package/dist/cli/board-live-cards-cli.js.map +0 -1
  236. package/dist/journal-9HEgs7dU.d.ts +0 -28
  237. package/dist/journal-B-JCfQnh.d.cts +0 -28
  238. package/dist/schedule-Cszq9LYY.d.ts +0 -21
  239. package/dist/schedule-qWNL0RQh.d.cts +0 -21
  240. package/examples/browser/boards/portfolio-tracker/cards/holdings-table.json +0 -22
  241. package/examples/browser/boards/portfolio-tracker/cards/portfolio-form.json +0 -16
  242. package/examples/browser/boards/portfolio-tracker/cards/portfolio-risk-assessment.json +0 -28
  243. package/examples/browser/boards/portfolio-tracker/cards/portfolio-value.json +0 -15
  244. package/examples/browser/boards/portfolio-tracker/cards/price-fetch.json +0 -15
  245. package/examples/browser/boards/portfolio-tracker/cards/rebalancing-strategy.json +0 -28
  246. package/examples/browser/boards/portfolio-tracker/fetch-prices.js +0 -43
  247. package/examples/browser/boards/portfolio-tracker/portfolio-tracker-task-executor.cjs +0 -96
  248. package/examples/browser/boards/portfolio-tracker/portfolio-tracker.bat +0 -7
  249. package/examples/browser/boards/portfolio-tracker/portfolio-tracker.js +0 -351
  250. package/examples/cli/step-machine-demo/two-step-math-handlers.js +0 -32
  251. package/examples/cli/step-machine-demo/two-step-mixed-handlers.js +0 -24
  252. package/examples/example-board/demo-shell-browser.html +0 -674
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/common/storage-interface.ts","../../src/event-graph/constants.ts","../../src/event-graph/graph-helpers.ts","../../src/event-graph/task-transitions.ts","../../src/continuous-event-graph/core.ts","../../src/continuous-event-graph/schedule.ts","../../src/continuous-event-graph/journal.ts","../../src/continuous-event-graph/reactive.ts","../../src/cli/common/execution-interface.ts","../../src/card-compute/schema-validator.ts","../../src/card-compute/index.ts","../../src/cli/common/board-live-cards-lib.ts","../../src/cli/common/board-live-cards-public.ts","../../src/cli/common/card-store-lib-public.ts","../../src/cli/common/artifacts-store-lib.ts","../../src/server-runtime/index.ts"],"names":["REF_PREFIX","toBase64Url","raw","utf8","buf","base64","binary","byte","fromBase64Url","input","bytes","i","serializeRef","ref","parseRef","s","parsed","candidate","withRelayLock","lock","work","continuation","release","TASK_STATUS","getProvides","task","getRequires","getAllTasks","graph","isNonActiveTask","taskState","getRefreshStrategy","taskConfig","graphSettings","getMaxExecutions","computeAvailableOutputs","taskStates","outputs","taskName","output","groupTasksByProvides","candidateTaskNames","tasks","outputGroups","applyTaskStart","state","existingTask","createDefaultGraphEngineStore","startConsumedHashes","requires","token","otherName","otherConfig","otherState","updatedTask","applyTaskCompletion","result","dataHash","data","outputTokens","lastConsumedHashes","newOutputs","applyTaskFailure","error","retryCount","breakTokens","applyTaskProgress","message","progress","applyTaskRestart","createLiveGraph","config","executionId","id","applyEvent","live","event","applyAgentAction","addNode","removeNode","addRequires","removeRequires","addProvides","removeProvides","applyEvents","events","current","name","exists","_removedConfig","remainingTasks","_removedState","remainingStates","nodeName","tokens","toAdd","t","remaining","snapshot","restore","snap","action","now","schedule","graphTasks","producerMap","buildProducerMap","computedOutputs","availableOutputs","eligible","pending","unresolved","blocked","strategy","rerunnable","maxExec","shouldSkip","req","consumed","interval","completedAt","missingTokens","pendingTokens","failedTokenInfo","producers","p","f","conflicts","outputKey","groupTasks","map","MemoryJournal","computeDataHash","json","stableStringify","fnv1a64Hex","value","obj","k","hash","prime","mod","base64UrlEncode","b","base64UrlDecode","padded","encodeCallbackToken","payload","decodeCallbackToken","createReactiveGraph","configOrLive","options","initialHandlers","onDrain","inputQueue","disposed","pendingHandlers","handlers","internalJournal","draining","drainQueued","drain","drainOnce","internalEvents","inputEvents","dispatchTask","update","callbackToken","runPipeline","resolveUpstreamState","tokenToTask","cfg","producerTask","handlerNames","upstreamState","handlerName","handler","errors","decoded","fn","taskNames","serializeExecutionRef","parseExecutionRef","_require","createRequire","jsonata","jsonataSync","deepGet","path","parts","cur","deepSet","run","node","_requires","ctx","step","val","err","runSync","_requires2","msg","evalExpr","expr","vars","resolve","VALID_ELEMENT_KINDS","ALLOWED_KEYS","validateNode","key","meta","bindTos","outputFiles","src","view","elem","enrichSources","source_defs","context","evalCtx","_projections","enrichSourcesSync","CardCompute","createCardStore","adapter","onWarn","loadIndex","applyJsonPath","jsonPath","segments","out","target","next","entry","cards","card","snapshotChecksumIndex","localIndex","changed","cardKey","index","existingById","existingByKey","e","resolvedKey","checksum","createFetchedSourcesStore","blob","resolveRef","cardId","outputFile","trimmed","deliveryToken","content","stagedKey","createJournalStore","entriesAfterCursor","cursor","all","idx","entries","createExecutionRequestStore","kv","onDispatchFailed","journalId","existing","processorFn","SNAPSHOT_SCHEMA_VERSION_V1","BOARD_GRAPH_KEY","BOARD_LAST_JOURNAL_PROCESSED_ID_KEY","cardRuntimeKey","createCardRuntimeStore","applyStateSnapshotCommitEnvelope","envelope","createStateSnapshotStore","scopeId","nextValues","createBoardConfigStore","readKey","v","createPublishedOutputsStore","values","m","status","isSourceInFlight","decideSourceAction","queueRequestedAt","nextEntryAfterFetchDelivery","fetchedAt","nextEntryAfterFetchFailure","reason","buildBoardStatusObject","boardPath","cardNames","sched","statusCounts","waitingByCard","u","dependentsByToken","dependents","provides","runtimeKeys","requiresSatisfied","requiresMissing","blockedBy","unblocks","dependent","lastFailureAt","fanOut","c","a","maxFanOut","allRequires","r","orphanCards","requiresNone","feedsAny","d","nowHighRes","createCardHandlerFn","baseRef","adapters","taskCompletedFn","_taskFailedFn","writeComputedValuesFn","writeDataObjectsFn","pendingRequests","cardState","allSources","requiredSources","dirty","flush","getSourceEntry","setSourceEntry","currentExecutionCount","lastExecCount","incomingRqt","sourcesData","taskData","unwrapped","computeNode","enrichedCard","enrichedSources","dir","runQueuedAt","undeliveredRequired","qrt","stampedAny","dispatchRqt","queuedAt","providesBindings","bindTo","EMPTY_CONFIG","boardEnvelopeToSnapshotEntries","snapshotEntriesToBoardEnvelope","lastDrainedJournalId","liveCardToTaskConfig","ok","fail","str","binStr","encodeSourceToken","decodeSourceToken","nowIso","createBoardLiveCardsPublic","warn","flushBoardChangeNotifications","notifications","makeCardAdapter","storeRef","configStore","snapshotAdapterImpl","_scopeId","keys","deletedKeys","snapshotStore","journalStore","cardStore","outputStore","boardExists","loadEnvelope","commitEnvelope","expectedVersion","appendJournalEvent","drainCycle","executionRequestStore","realCardRuntimeStore","realFetchedSourcesStore","RX","overlayCardRuntimeStore","SX","sxCache","overlayFetchedSourcesStore","cardHandlerAdapters","undrained","newCursor","TX","CX","DX","NX","taskFailedFn","rg","ev","finalLive","currentVersion","statusObj","batch","executorRef","sourceDefs","sourceToken","ran","init","outputsStoreRef","body","_input","removeCard","retrigger","processAccumulatedEvents","upsertCard","restart","ids","taskConfigHash","upsertKv","taskConfigChanged","blobRef","taskFailed","taskProgress","sourceDataFetched","cbk","cid","cs","rqt","fetchedSourcesStore","cbkDecoded","sourceDataFetchFailure","getCardStoreRef","getOutputsStoreRef","getConfig","getOutputsDataObject","getAllOutputsDataObjects","getOutputsComputedValues","getAllOutputsComputedValues","createCardStorePublic","store","oops","bodyIds","paramId","INDEX_KEY","utf8ByteLength","text","saveIndex","statToInfo","stat","updateIndex","info","parseLeadingSerial","fileName","normalizeDisplayFileName","slash","normalizeStem","rawStem","normalizeExt","rawExt","extBody","splitBaseExt","base","dot","basenameFromKey","createArtifactsStore","head","fromStat","contentType","prefix","infoByKey","createChatArtifactsStore","opts","indexFileName","indexKey","cardPrefix","row","records","nextSerial","maxSeen","serial","appendIndexRecord","record","readRecords","clear","readSignal","count","latestMtimeMs","processing","mtimeMs","createFileArtifactsStore","seedNames","names","buildStoredName","displayName","maxLen","stem","ext","safeExt","safeStem","keepExt","stemBudget","outStem","allocateStoredName","createCardFileMetadataStore","normalizeIncoming","payloadFiles","defaultUploadedAt","read","cardData","merge","incoming","known","file","expectedStoredName","files","DEFAULT_CORS_HEADERS","MAX_STORED_FILE_NAME_LEN","makeNotificationState","appendNotification","n","createSingleBoardServerRuntime","apiBasePath","corsHeaders","boardId","logger","invocationAdapter","notificationTransport","serverUrl","executionExtra","sseClients","buildContext","board","artAdapter","_filesArtifacts","_chatsArtifacts","boardContexts","cardOwnerIndex","ownerIndex","artifactsStores","chatArtifactsForCard","stores","fileArtifactsForCard","cardFileMetadataStoreInstance","safeCardId","ensureNotificationConsumer","teardown","broadcastNotificationBatchToSseClients","initContext","params","initResult","desc","publishPersistedStateSnapshot","statusResult","dataResult","cvResult","upsertCardsFromSource","ctxIndex","initBoardAndSetup","bootstrapBoard","cardContextForCard","readCardFromStore","readCardDefinitions","fromCtx","readStatusSnapshot","statuses","persisted","mergedCards","summaryKeys","totals","first","readCardRuntimeArtifacts","process","readDataObjectsByToken","merged","readChatSignal","sid","chatStore","buildPublishedRuntimePayload","cardDefinitions","rawArtifacts","dataObjectsByToken","cardRuntimeById","cardDef","chatSignal","mutateCard","updateFn","syncBoard","nextCard","setResult","upsertResult","updateCard","updateCardLocalOnly","patchCard","patch","dottedPath","writeTo","lastSlash","clearChatRecords","nextChatStoredName","role","safeRole","writeChatRecord","outName","artifactKey","lines","fileList","display","stored","readChatRecords","readCardStoredFileNames","metadata","persistUploadedFile","requestedName","buffer","fileStore","storedName","invokeChatHandler","chatsKeyPrefix","lastChatFile","cfgResult","handlerRef","processingMarkerKey","args","applyCardAction","actionType","persistCard","chatHandlerResult","fo","recPath","lastSeg","buttonId","res","byteLen","readJsonBody","chunks","concatUint8Arrays","readRawBody","arrays","totalLen","acc","offset","sseEventId","buildSseFrame","jsonStr","frame","client","handleSse","keepAlive","handleRuntimeApi","parsedUrl","method","url","cardMatch","escapeRegExp","cardActionMatch","cardChatsMatch","cardFileMatch","inChat","encodedName","rawName","cardFileDownloadMatch","resolved","fileRecord","fileKey","filename","mimeType","statusCode","createMultiBoardServerRuntime","serverMetaStore","boardRuntimeFactory","boardServiceCache","boardsRegistryKey","readBoardsConfig","writeBoardsConfig","safeBoardId","sanitized","getBoardService","service","handleBoardsRegistryApi","label","handleBoardApi","boardSegMatch","handleApi","requireBoardService"],"mappings":"uDAqFA,IAAMA,EAAAA,CAAa,OAEnB,SAASC,EAAAA,CAAYC,EAAqB,CACxC,IAAMC,CAAAA,CAAO,IAAI,WAAA,EAAY,CAAE,OAAOD,CAAG,CAAA,CACnCE,CAAAA,CAAO,UAAA,CAA0F,MAAA,CACnGC,CAAAA,CACJ,GAAID,CAAAA,CACFC,CAAAA,CAASD,CAAAA,CAAI,IAAA,CAAKD,CAAI,CAAA,CAAE,SAAS,QAAQ,CAAA,CAAA,KAAA,GAChC,OAAO,IAAA,EAAS,UAAA,CAAY,CACrC,IAAIG,CAAAA,CAAS,EAAA,CACb,IAAA,IAAWC,CAAAA,IAAQJ,CAAAA,CAAMG,CAAAA,EAAU,OAAO,YAAA,CAAaC,CAAI,CAAA,CAC3DF,CAAAA,CAAS,IAAA,CAAKC,CAAM,EACtB,CAAA,KACE,MAAM,IAAI,KAAA,CAAM,6CAA6C,CAAA,CAE/D,OAAOD,CAAAA,CAAO,OAAA,CAAQ,MAAO,GAAG,CAAA,CAAE,QAAQ,KAAA,CAAO,GAAG,CAAA,CAAE,OAAA,CAAQ,MAAA,CAAQ,EAAE,CAC1E,CAEA,SAASG,EAAAA,CAAcC,CAAAA,CAAuB,CAC5C,IAAMJ,EAASI,CAAAA,CAAM,OAAA,CAAQ,IAAA,CAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,KAAM,GAAG,CAAA,CACrD,GAAA,CAAI,MAAA,CAAA,CAAQ,CAAA,CAAKA,CAAAA,CAAM,OAAS,CAAA,EAAM,CAAC,CAAA,CACrCL,CAAAA,CAAO,UAAA,CAAmG,MAAA,CAChH,GAAIA,CAAAA,CAAK,OAAOA,CAAAA,CAAI,IAAA,CAAKC,CAAAA,CAAQ,QAAQ,EAAE,QAAA,CAAS,MAAM,CAAA,CAC1D,GAAI,OAAO,IAAA,EAAS,WAAY,CAC9B,IAAMC,EAAS,IAAA,CAAKD,CAAM,EACpBK,CAAAA,CAAQ,IAAI,UAAA,CAAWJ,CAAAA,CAAO,MAAM,CAAA,CAC1C,QAASK,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIL,CAAAA,CAAO,MAAA,CAAQK,CAAAA,EAAK,EAAGD,CAAAA,CAAMC,CAAC,CAAA,CAAIL,CAAAA,CAAO,UAAA,CAAWK,CAAC,EACzE,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAOD,CAAK,CACvC,CACA,MAAM,IAAI,KAAA,CAAM,6CAA6C,CAC/D,CAGO,SAASE,EAAAA,CAAaC,CAAAA,CAA2B,CACtD,OAAO,CAAA,EAAGb,EAAU,CAAA,EAAGC,EAAAA,CAAY,IAAA,CAAK,SAAA,CAAUY,CAAG,CAAC,CAAC,CAAA,CACzD,CAIO,SAASC,EAAAA,CAASC,CAAAA,CAAyB,CAEhD,GAAIA,CAAAA,CAAE,UAAA,CAAW,aAAa,CAAA,CAC5B,OAAO,CAAE,KAAM,SAAA,CAAW,KAAA,CAAOA,CAAAA,CAAE,KAAA,CAAM,EAAoB,CAAE,EAEjE,GAAI,CAACA,CAAAA,CAAE,UAAA,CAAWf,EAAU,CAAA,CAAG,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgCA,EAAU,CAAA,oBAAA,EAAuBe,CAAC,EAAE,CAAA,CACnH,IAAIC,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAS,KAAK,KAAA,CAAMR,EAAAA,CAAcO,CAAAA,CAAE,KAAA,CAAMf,EAAAA,CAAW,MAAM,CAAC,CAAC,EAC/D,CAAA,KAAQ,CACN,MAAM,IAAI,MAAM,CAAA,+CAAA,EAAkDe,CAAC,EAAE,CACvE,CACA,GAAI,CAACC,CAAAA,EAAU,OAAOA,CAAAA,EAAW,QAAA,CAC/B,MAAM,IAAI,KAAA,CAAM,CAAA,8CAAA,EAAiDD,CAAC,CAAA,CAAE,CAAA,CAEtE,IAAME,EAAYD,CAAAA,CAClB,GAAI,OAAOC,CAAAA,CAAU,IAAA,EAAS,QAAA,EAAY,OAAOA,CAAAA,CAAU,KAAA,EAAU,QAAA,CACnE,MAAM,IAAI,KAAA,CAAM,gEAAgEF,CAAC,CAAA,CAAE,CAAA,CAErF,OAAO,CAAE,IAAA,CAAME,EAAU,IAAA,CAAM,KAAA,CAAOA,CAAAA,CAAU,KAAM,CACxD,CA6KA,eAAsBC,EAAAA,CACpBC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACkB,CAClB,IAAMC,EAAUH,CAAAA,CAAK,UAAA,EAAW,CAChC,GAAI,CAACG,CAAAA,CAAS,OAAO,MAAA,CACrB,GAAI,CACF,MAAMF,CAAAA,GACR,QAAE,CACAE,CAAAA,GACF,CACA,OAAAD,CAAAA,KACO,IACT,CCrUO,IAAME,EAAAA,CAA0C,CAErD,OAAA,CAAS,SAAA,CACT,SAAA,CAAW,WAAA,CACX,MAAA,CAAQ,QAAA,CACR,YAAa,aACf,CAAA,CCEO,SAASC,EAAAA,CAAYC,CAAAA,CAAwC,CAClE,OAAKA,CAAAA,CACD,KAAA,CAAM,OAAA,CAAQA,CAAAA,CAAK,QAAQ,CAAA,CAAUA,EAAK,QAAA,CACvC,EAAC,CAFU,EAGpB,CAEO,SAASC,EAAAA,CAAYD,CAAAA,CAAwC,CAClE,OAAKA,CAAAA,CACD,MAAM,OAAA,CAAQA,CAAAA,CAAK,QAAQ,CAAA,CAAUA,CAAAA,CAAK,QAAA,CACvC,EAAC,CAFU,EAGpB,CAEO,SAASE,EAAAA,CAAYC,EAAgD,CAC1E,OAAOA,CAAAA,CAAM,KAAA,EAAS,EACxB,CAcO,SAASC,EAAAA,CAAgBC,CAAAA,CAAkD,CAChF,OAAKA,CAAAA,CACEA,EAAU,MAAA,GAAWP,EAAAA,CAAY,MAAA,EAAUO,CAAAA,CAAU,MAAA,GAAWP,EAAAA,CAAY,YAD5D,KAEzB,CAUO,SAASQ,EAAAA,CAAmBC,CAAAA,CAAwBC,CAAAA,CAAwE,CACjI,OAAOD,CAAAA,CAAW,eAAA,EAAmBC,CAAAA,EAAe,eAAA,EAAmB,cACzE,CAMO,SAASC,EAAAA,CAAiBF,CAAAA,CAA4C,CAC3E,OAAOA,CAAAA,CAAW,aACpB,CAWO,SAASG,EAAAA,CACdP,CAAAA,CACAQ,CAAAA,CACU,CACV,IAAMC,CAAAA,CAAuB,IAAI,GAAA,CAEjC,IAAA,GAAW,CAACC,CAAAA,CAAUR,CAAS,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQM,CAAU,CAAA,CAC3D,GAAIN,EAAU,MAAA,GAAWP,EAAAA,CAAY,SAAA,CAAW,CAC9C,IAAMS,CAAAA,CAAaJ,EAAM,KAAA,CAAMU,CAAQ,CAAA,CACnCN,CAAAA,EACeR,EAAAA,CAAYQ,CAAU,EAC9B,OAAA,CAAQO,CAAAA,EAAUF,CAAAA,CAAQ,GAAA,CAAIE,CAAM,CAAC,EAElD,CAGF,OAAO,KAAA,CAAM,IAAA,CAAKF,CAAO,CAC3B,CAUO,SAASG,EAAAA,CACdC,EACAC,CAAAA,CAC0B,CAC1B,IAAMC,CAAAA,CAAyC,EAAC,CAEhD,OAAAF,CAAAA,CAAmB,OAAA,CAAQH,GAAY,CACrC,IAAMb,CAAAA,CAAOiB,CAAAA,CAAMJ,CAAQ,CAAA,CAC3B,GAAI,CAACb,CAAAA,CAAM,OACMD,EAAAA,CAAYC,CAAI,CAAA,CACxB,QAAQc,CAAAA,EAAU,CACpBI,CAAAA,CAAaJ,CAAM,CAAA,GACtBI,CAAAA,CAAaJ,CAAM,CAAA,CAAI,EAAC,CAAA,CAE1BI,CAAAA,CAAaJ,CAAM,CAAA,CAAE,KAAKD,CAAQ,EACpC,CAAC,EACH,CAAC,CAAA,CAEMK,CACT,CC7GO,SAASC,EAAAA,CAAeC,CAAAA,CAAuBP,CAAAA,CAAkBV,CAAAA,CAAqC,CAC3G,IAAMkB,CAAAA,CAAeD,EAAM,KAAA,CAAMP,CAAQ,GAAKS,EAAAA,EAA8B,CAKtEC,CAAAA,CAA8C,EAAC,CACrD,GAAIpB,EAAO,CACT,IAAMI,CAAAA,CAAaJ,CAAAA,CAAM,KAAA,CAAMU,CAAQ,EACjCW,CAAAA,CAAWvB,EAAAA,CAAYM,CAAU,CAAA,CACvC,IAAA,IAAWkB,CAAAA,IAASD,EAClB,IAAA,GAAW,CAACE,CAAAA,CAAWC,CAAW,CAAA,GAAK,MAAA,CAAO,QAAQxB,CAAAA,CAAM,KAAK,CAAA,CAC/D,GAAIJ,EAAAA,CAAY4B,CAAW,EAAE,QAAA,CAASF,CAAK,CAAA,CAAG,CAC5C,IAAMG,CAAAA,CAAaR,EAAM,KAAA,CAAMM,CAAS,CAAA,CACpCE,CAAAA,EAAY,YAAA,GAAcL,CAAAA,CAAoBE,CAAK,CAAA,CAAIG,CAAAA,CAAW,cACtE,KACF,CAGN,CAEA,IAAMC,CAAAA,CAAgC,CACpC,GAAGR,CAAAA,CACH,MAAA,CAAQ,UACR,SAAA,CAAW,IAAI,IAAA,EAAK,CAAE,WAAA,EAAY,CAClC,YAAa,IAAI,IAAA,EAAK,CAAE,WAAA,EAAY,CACpC,QAAA,CAAU,EACV,KAAA,CAAO,MAAA,CACP,mBAAA,CAAAE,CACF,CAAA,CAEA,OAAO,CACL,GAAGH,CAAAA,CACH,KAAA,CAAO,CAAE,GAAGA,CAAAA,CAAM,MAAO,CAACP,CAAQ,EAAGgB,CAAY,CAAA,CACjD,WAAA,CAAa,IAAI,IAAA,EAAK,CAAE,WAAA,EAC1B,CACF,CAOO,SAASC,EAAAA,CACdV,CAAAA,CACAjB,CAAAA,CACAU,CAAAA,CACAkB,CAAAA,CACAC,CAAAA,CACAC,EACgB,CAChB,IAAMZ,CAAAA,CAAeD,CAAAA,CAAM,KAAA,CAAMP,CAAQ,GAAKS,EAAAA,EAA8B,CACtEf,CAAAA,CAAaJ,CAAAA,CAAM,KAAA,CAAMU,CAAQ,EACvC,GAAI,CAACN,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,SAASM,CAAQ,CAAA,oBAAA,CAAsB,CAAA,CAIzD,IAAIqB,CAAAA,CACAH,CAAAA,EAAUxB,EAAW,EAAA,EAAMA,CAAAA,CAAW,EAAA,CAAGwB,CAAM,CAAA,CAEjDG,CAAAA,CAAe3B,EAAW,EAAA,CAAGwB,CAAM,CAAA,CAGnCG,CAAAA,CAAenC,EAAAA,CAAYQ,CAAU,EAUvC,IAAM4B,CAAAA,CAA6Cd,CAAAA,CAAa,mBAAA,CAC5D,CAAE,GAAGA,EAAa,mBAAoB,CAAA,CACtC,CAAE,GAAGA,CAAAA,CAAa,kBAAmB,CAAA,CAEzC,GAAI,CAACA,CAAAA,CAAa,mBAAA,CAAqB,CAErC,IAAMG,CAAAA,CAAWjB,CAAAA,CAAW,QAAA,EAAY,EAAC,CACzC,IAAA,IAAWkB,KAASD,CAAAA,CAClB,IAAA,GAAW,CAACE,CAAAA,CAAWC,CAAW,CAAA,GAAK,OAAO,OAAA,CAAQxB,CAAAA,CAAM,KAAK,CAAA,CAC/D,GAAIJ,EAAAA,CAAY4B,CAAW,CAAA,CAAE,QAAA,CAASF,CAAK,CAAA,CAAG,CAC5C,IAAMG,EAAaR,CAAAA,CAAM,KAAA,CAAMM,CAAS,CAAA,CACpCE,CAAAA,EAAY,YAAA,GACdO,EAAmBV,CAAK,CAAA,CAAIG,CAAAA,CAAW,YAAA,CAAA,CAEzC,KACF,CAGN,CAEA,IAAMC,CAAAA,CAAgC,CACpC,GAAGR,CAAAA,CACH,MAAA,CAAQ,YACR,WAAA,CAAa,IAAI,IAAA,EAAK,CAAE,WAAA,EAAY,CACpC,YAAa,IAAI,IAAA,EAAK,CAAE,WAAA,EAAY,CACpC,cAAA,CAAgBA,EAAa,cAAA,CAAiB,CAAA,CAC9C,SAAA,CAAWA,CAAAA,CAAa,cAAA,CAAiB,CAAA,CACzC,aAAcW,CAAAA,CACd,IAAA,CAAAC,CAAAA,CACA,kBAAA,CAAAE,CAAAA,CACA,KAAA,CAAO,MACT,CAAA,CAGMC,CAAAA,CAAa,CAAC,GAAG,IAAI,GAAA,CAAI,CAAC,GAAGhB,CAAAA,CAAM,gBAAA,CAAkB,GAAGc,CAAY,CAAC,CAAC,CAAA,CAE5E,OAAO,CACL,GAAGd,CAAAA,CACH,KAAA,CAAO,CAAE,GAAGA,CAAAA,CAAM,MAAO,CAACP,CAAQ,EAAGgB,CAAY,CAAA,CACjD,gBAAA,CAAkBO,CAAAA,CAClB,WAAA,CAAa,IAAI,MAAK,CAAE,WAAA,EAC1B,CACF,CAOO,SAASC,GACdjB,CAAAA,CACAjB,CAAAA,CACAU,CAAAA,CACAyB,CAAAA,CACgB,CAChB,IAAMjB,EAAeD,CAAAA,CAAM,KAAA,CAAMP,CAAQ,CAAA,EAAKS,EAAAA,EAA8B,CACtEf,EAAaJ,CAAAA,CAAM,KAAA,CAAMU,CAAQ,CAAA,CAGvC,GAAIN,CAAAA,EAAY,MAAO,CACrB,IAAMgC,CAAAA,CAAalB,CAAAA,CAAa,UAAA,CAAa,CAAA,CAC7C,GAAIkB,CAAAA,EAAchC,CAAAA,CAAW,KAAA,CAAM,YAAA,CAAc,CAE/C,IAAMsB,EAAgC,CACpC,GAAGR,CAAAA,CACH,MAAA,CAAQ,aAAA,CACR,UAAA,CAAAkB,EACA,WAAA,CAAa,IAAI,IAAA,EAAK,CAAE,WAAA,EAAY,CACpC,MAAAD,CACF,CAAA,CACA,OAAO,CACL,GAAGlB,CAAAA,CACH,MAAO,CAAE,GAAGA,CAAAA,CAAM,KAAA,CAAO,CAACP,CAAQ,EAAGgB,CAAY,CAAA,CACjD,WAAA,CAAa,IAAI,IAAA,EAAK,CAAE,aAC1B,CACF,CACF,CAGA,IAAMA,CAAAA,CAAgC,CACpC,GAAGR,CAAAA,CACH,MAAA,CAAQ,QAAA,CACR,QAAA,CAAU,IAAI,MAAK,CAAE,WAAA,EAAY,CACjC,WAAA,CAAa,IAAI,IAAA,GAAO,WAAA,EAAY,CACpC,MAAAiB,CAAAA,CACA,cAAA,CAAgBjB,EAAa,cAAA,CAAiB,CAChD,CAAA,CAGIe,CAAAA,CAAahB,CAAAA,CAAM,gBAAA,CAMvB,GALIb,CAAAA,EAAY,UAAA,EAAcA,CAAAA,CAAW,UAAA,CAAW,MAAA,CAAS,CAAA,GAC3D6B,EAAa,CAAC,GAAG,IAAI,GAAA,CAAI,CAAC,GAAGhB,EAAM,gBAAA,CAAkB,GAAGb,CAAAA,CAAW,UAAU,CAAC,CAAC,GAI7EA,CAAAA,EAAY,eAAA,EAAmBsB,CAAAA,CAAY,cAAA,EAAkBtB,CAAAA,CAAW,eAAA,CAAgB,eAAgB,CAC1G,IAAMiC,CAAAA,CAAcjC,CAAAA,CAAW,eAAA,CAAgB,QAAA,CAC/C6B,EAAa,CAAC,GAAG,IAAI,GAAA,CAAI,CAAC,GAAGA,EAAY,GAAGI,CAAW,CAAC,CAAC,EAC3D,CAEA,OAAO,CACL,GAAGpB,CAAAA,CACH,KAAA,CAAO,CAAE,GAAGA,CAAAA,CAAM,KAAA,CAAO,CAACP,CAAQ,EAAGgB,CAAY,EACjD,gBAAA,CAAkBO,CAAAA,CAClB,WAAA,CAAa,IAAI,IAAA,EAAK,CAAE,aAC1B,CACF,CAKO,SAASK,EAAAA,CACdrB,CAAAA,CACAP,EACA6B,CAAAA,CACAC,CAAAA,CACgB,CAChB,IAAMtB,CAAAA,CAAeD,CAAAA,CAAM,MAAMP,CAAQ,CAAA,EAAKS,EAAAA,EAA8B,CAEtEO,CAAAA,CAAgC,CACpC,GAAGR,CAAAA,CACH,QAAA,CAAU,OAAOsB,CAAAA,EAAa,QAAA,CAAWA,CAAAA,CAAWtB,EAAa,QAAA,CACjE,QAAA,CAAU,CACR,GAAIA,CAAAA,CAAa,UAAY,EAAC,CAC9B,GAAIqB,CAAAA,CAAU,CAAC,CAAE,QAAAA,CAAAA,CAAS,SAAA,CAAW,IAAI,IAAA,EAAK,CAAE,WAAA,GAAe,MAAA,CAAQrB,CAAAA,CAAa,MAAO,CAAC,CAAA,CAAI,EAClG,CAAA,CACA,WAAA,CAAa,IAAI,IAAA,EAAK,CAAE,WAAA,EAC1B,CAAA,CAEA,OAAO,CACL,GAAGD,CAAAA,CACH,KAAA,CAAO,CAAE,GAAGA,CAAAA,CAAM,KAAA,CAAO,CAACP,CAAQ,EAAGgB,CAAY,CAAA,CACjD,WAAA,CAAa,IAAI,IAAA,EAAK,CAAE,WAAA,EAC1B,CACF,CASO,SAASe,EAAAA,CACdxB,CAAAA,CACAP,CAAAA,CACgB,CAChB,IAAMQ,CAAAA,CAAeD,CAAAA,CAAM,KAAA,CAAMP,CAAQ,CAAA,CACzC,GAAI,CAACQ,CAAAA,CAAc,OAAOD,CAAAA,CAE1B,IAAMS,CAAAA,CAAgC,CACpC,GAAGR,CAAAA,CACH,MAAA,CAAQ,aAAA,CACR,SAAA,CAAW,MAAA,CACX,YAAa,MAAA,CACb,QAAA,CAAU,MAAA,CACV,KAAA,CAAO,MAAA,CACP,IAAA,CAAM,OACN,QAAA,CAAU,IAAA,CACV,WAAA,CAAa,IAAI,IAAA,EAAK,CAAE,aAC1B,CAAA,CAEA,OAAO,CACL,GAAGD,CAAAA,CACH,MAAO,CAAE,GAAGA,CAAAA,CAAM,KAAA,CAAO,CAACP,CAAQ,EAAGgB,CAAY,CAAA,CACjD,YAAa,IAAI,IAAA,GAAO,WAAA,EAC1B,CACF,CAEA,SAASP,EAAAA,EAAkD,CACzD,OAAO,CACL,MAAA,CAAQ,aAAA,CACR,cAAA,CAAgB,CAAA,CAChB,WAAY,CAAA,CACZ,SAAA,CAAW,CAAA,CACX,QAAA,CAAU,EAAC,CACX,SAAU,IACZ,CACF,CC3OO,SAASuB,EAAAA,CAAgBC,CAAAA,CAAqBC,EAAiC,CACpF,IAAMC,CAAAA,CAAoB,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,CAAA,CACtC/B,CAAAA,CAA0C,EAAC,CAEjD,IAAA,IAAWJ,KAAY,MAAA,CAAO,IAAA,CAAKiC,CAAAA,CAAO,KAAK,CAAA,CAC7C7B,CAAAA,CAAMJ,CAAQ,CAAA,CAAIS,EAAAA,EAA8B,CAGlD,IAAMF,CAAAA,CAAwB,CAC5B,OAAQ,SAAA,CACR,KAAA,CAAAH,CAAAA,CACA,gBAAA,CAAkB,EAAC,CACnB,eAAgB,CAAE,QAAA,CAAU,KAAA,CAAO,iBAAA,CAAmB,IAAA,CAAM,oBAAA,CAAsB,EAAC,CAAG,aAAA,CAAe,EAAG,CAAA,CACxG,WAAA,CAAa,IAAI,IAAA,EAAK,CAAE,WAAA,EAAY,CACpC,WAAA,CAAa+B,CAAAA,CACb,gBAAiB,CACf,aAAA,CAAeF,CAAAA,CAAO,QAAA,CAAS,cAAA,EAAkB,kBAAA,CACjD,iBAAkBA,CAAAA,CAAO,QAAA,CAAS,iBAAA,EAAqB,cAAA,CACvD,kBAAA,CAAoBA,CAAAA,CAAO,SAAS,UACtC,CACF,CAAA,CAEA,OAAO,CAAE,MAAA,CAAAA,EAAQ,KAAA,CAAA1B,CAAM,CACzB,CAcO,SAAS6B,GAAWC,CAAAA,CAAiBC,CAAAA,CAA8B,CACxE,GAAM,CAAE,MAAA,CAAAL,EAAQ,KAAA,CAAA1B,CAAM,CAAA,CAAI8B,CAAAA,CAG1B,GAAI,aAAA,GAAiBC,GAASA,CAAAA,CAAM,WAAA,EAAeA,CAAAA,CAAM,WAAA,GAAgB/B,CAAAA,CAAM,WAAA,CAC7E,OAAO8B,CAAAA,CAGT,OAAQC,CAAAA,CAAM,IAAA,EAGZ,KAAK,eACH,OAAO,CAAE,MAAA,CAAAL,CAAAA,CAAQ,KAAA,CAAO3B,EAAAA,CAAeC,EAAO+B,CAAAA,CAAM,QAAA,CAAUL,CAAM,CAAE,CAAA,CAExE,KAAK,iBACH,OAAO,CAAE,MAAA,CAAAA,CAAAA,CAAQ,KAAA,CAAOhB,EAAAA,CAAoBV,EAAO0B,CAAAA,CAAQK,CAAAA,CAAM,QAAA,CAAUA,CAAAA,CAAM,MAAA,CAAQA,CAAAA,CAAM,SAAUA,CAAAA,CAAM,IAAI,CAAE,CAAA,CAEvH,KAAK,aAAA,CACH,OAAO,CAAE,MAAA,CAAAL,CAAAA,CAAQ,KAAA,CAAOT,EAAAA,CAAiBjB,CAAAA,CAAO0B,EAAQK,CAAAA,CAAM,QAAA,CAAUA,CAAAA,CAAM,KAAK,CAAE,CAAA,CAEvF,KAAK,eAAA,CACH,OAAO,CAAE,MAAA,CAAAL,CAAAA,CAAQ,KAAA,CAAOL,GAAkBrB,CAAAA,CAAO+B,CAAAA,CAAM,QAAA,CAAUA,CAAAA,CAAM,OAAA,CAASA,CAAAA,CAAM,QAAQ,CAAE,CAAA,CAElG,KAAK,cAAA,CACH,OAAO,CAAE,OAAAL,CAAAA,CAAQ,KAAA,CAAOF,EAAAA,CAAiBxB,CAAAA,CAAO+B,CAAAA,CAAM,QAAQ,CAAE,CAAA,CAElE,KAAK,gBACH,OAAO,CACL,OAAAL,CAAAA,CACA,KAAA,CAAO,CACL,GAAG1B,CAAAA,CACH,gBAAA,CAAkB,CAAC,GAAG,IAAI,GAAA,CAAI,CAAC,GAAGA,CAAAA,CAAM,iBAAkB,GAAG+B,CAAAA,CAAM,MAAM,CAAC,CAAC,CAAA,CAC3E,YAAa,IAAI,IAAA,EAAK,CAAE,WAAA,EAC1B,CACF,EAEF,KAAK,cAAA,CACH,OAAO,CAAE,MAAA,CAAAL,CAAAA,CAAQ,MAAOM,EAAAA,CAAiBhC,CAAAA,CAAO+B,CAAAA,CAAM,MAAM,CAAE,CAAA,CAIhE,KAAK,aAAA,CACH,OAAOE,EAAAA,CAAQH,CAAAA,CAAMC,CAAAA,CAAM,QAAA,CAAUA,EAAM,UAAU,CAAA,CAEvD,KAAK,cAAA,CACH,OAAOG,GAAWJ,CAAAA,CAAMC,CAAAA,CAAM,QAAQ,CAAA,CAExC,KAAK,mBAAA,CACH,OAAOI,EAAAA,CAAYL,CAAAA,CAAMC,CAAAA,CAAM,QAAA,CAAUA,CAAAA,CAAM,MAAM,EAEvD,KAAK,sBAAA,CACH,OAAOK,EAAAA,CAAeN,CAAAA,CAAMC,CAAAA,CAAM,SAAUA,CAAAA,CAAM,MAAM,CAAA,CAE1D,KAAK,mBAAA,CACH,OAAOM,GAAYP,CAAAA,CAAMC,CAAAA,CAAM,QAAA,CAAUA,CAAAA,CAAM,MAAM,CAAA,CAEvD,KAAK,sBAAA,CACH,OAAOO,EAAAA,CAAeR,CAAAA,CAAMC,CAAAA,CAAM,QAAA,CAAUA,EAAM,MAAM,CAAA,CAE1D,QACE,OAAOD,CACX,CACF,CAOO,SAASS,EAAAA,CAAYT,EAAiBU,CAAAA,CAAiC,CAC5E,OAAOA,CAAAA,CAAO,MAAA,CAAO,CAACC,CAAAA,CAASV,CAAAA,GAAUF,EAAAA,CAAWY,EAASV,CAAK,CAAA,CAAGD,CAAI,CAC3E,CAWO,SAASG,GAAQH,CAAAA,CAAiBY,CAAAA,CAAcvD,CAAAA,CAAmC,CACxF,IAAMwD,CAAAA,CAAS,CAAC,CAACb,CAAAA,CAAK,MAAA,CAAO,KAAA,CAAMY,CAAI,CAAA,CACvC,OAAO,CACL,MAAA,CAAQ,CACN,GAAGZ,CAAAA,CAAK,MAAA,CACR,MAAO,CAAE,GAAGA,CAAAA,CAAK,MAAA,CAAO,KAAA,CAAO,CAACY,CAAI,EAAGvD,CAAW,CACpD,CAAA,CACA,KAAA,CAAO,CACL,GAAG2C,CAAAA,CAAK,KAAA,CACR,KAAA,CAAO,CACL,GAAGA,CAAAA,CAAK,MAAM,KAAA,CACd,CAACY,CAAI,EAAGC,CAAAA,CAASb,CAAAA,CAAK,MAAM,KAAA,CAAMY,CAAI,CAAA,CAAIxC,EAAAA,EAC5C,CAAA,CACA,YAAa,IAAI,IAAA,EAAK,CAAE,WAAA,EAC1B,CACF,CACF,CAQO,SAASgC,EAAAA,CAAWJ,CAAAA,CAAiBY,CAAAA,CAAyB,CACnE,GAAI,CAACZ,CAAAA,CAAK,MAAA,CAAO,KAAA,CAAMY,CAAI,CAAA,CAAG,OAAOZ,CAAAA,CAErC,GAAM,CAAE,CAACY,CAAI,EAAGE,EAAgB,GAAGC,CAAe,CAAA,CAAIf,CAAAA,CAAK,MAAA,CAAO,KAAA,CAC5D,CAAE,CAACY,CAAI,EAAGI,CAAAA,CAAe,GAAGC,CAAgB,CAAA,CAAIjB,CAAAA,CAAK,KAAA,CAAM,KAAA,CAEjE,OAAO,CACL,OAAQ,CACN,GAAGA,CAAAA,CAAK,MAAA,CACR,KAAA,CAAOe,CACT,EACA,KAAA,CAAO,CACL,GAAGf,CAAAA,CAAK,KAAA,CACR,KAAA,CAAOiB,EACP,WAAA,CAAa,IAAI,IAAA,EAAK,CAAE,WAAA,EAC1B,CACF,CACF,CAUO,SAASZ,EAAAA,CAAYL,CAAAA,CAAiBkB,CAAAA,CAAkBC,EAA6B,CAC1F,IAAMrE,CAAAA,CAAOkD,CAAAA,CAAK,MAAA,CAAO,KAAA,CAAMkB,CAAQ,CAAA,CACvC,GAAI,CAACpE,CAAAA,CAAM,OAAOkD,CAAAA,CAElB,IAAMW,CAAAA,CAAU5D,EAAAA,CAAYD,CAAI,CAAA,CAC1BsE,CAAAA,CAAQD,CAAAA,CAAO,OAAOE,CAAAA,EAAK,CAACV,CAAAA,CAAQ,QAAA,CAASU,CAAC,CAAC,EACrD,OAAID,CAAAA,CAAM,MAAA,GAAW,CAAA,CAAUpB,CAAAA,CAExB,CACL,OAAQ,CACN,GAAGA,CAAAA,CAAK,MAAA,CACR,KAAA,CAAO,CACL,GAAGA,CAAAA,CAAK,MAAA,CAAO,KAAA,CACf,CAACkB,CAAQ,EAAG,CAAE,GAAGpE,CAAAA,CAAM,QAAA,CAAU,CAAC,GAAG6D,CAAAA,CAAS,GAAGS,CAAK,CAAE,CAC1D,CACF,CAAA,CACA,KAAA,CAAOpB,EAAK,KACd,CACF,CAKO,SAASM,EAAAA,CAAeN,CAAAA,CAAiBkB,EAAkBC,CAAAA,CAA6B,CAC7F,IAAMrE,CAAAA,CAAOkD,CAAAA,CAAK,OAAO,KAAA,CAAMkB,CAAQ,CAAA,CACvC,GAAI,CAACpE,CAAAA,CAAM,OAAOkD,CAAAA,CAElB,IAAMW,CAAAA,CAAU5D,EAAAA,CAAYD,CAAI,CAAA,CAC1BwE,EAAYX,CAAAA,CAAQ,MAAA,CAAOU,CAAAA,EAAK,CAACF,CAAAA,CAAO,QAAA,CAASE,CAAC,CAAC,CAAA,CACzD,OAAIC,CAAAA,CAAU,MAAA,GAAWX,CAAAA,CAAQ,OAAeX,CAAAA,CAEzC,CACL,MAAA,CAAQ,CACN,GAAGA,CAAAA,CAAK,OACR,KAAA,CAAO,CACL,GAAGA,CAAAA,CAAK,MAAA,CAAO,KAAA,CACf,CAACkB,CAAQ,EAAG,CAAE,GAAGpE,CAAAA,CAAM,QAAA,CAAUwE,CAAU,CAC7C,CACF,CAAA,CACA,KAAA,CAAOtB,CAAAA,CAAK,KACd,CACF,CAMO,SAASO,EAAAA,CAAYP,CAAAA,CAAiBkB,CAAAA,CAAkBC,CAAAA,CAA6B,CAC1F,IAAMrE,CAAAA,CAAOkD,CAAAA,CAAK,MAAA,CAAO,KAAA,CAAMkB,CAAQ,EACvC,GAAI,CAACpE,CAAAA,CAAM,OAAOkD,CAAAA,CAElB,IAAMW,EAAU9D,EAAAA,CAAYC,CAAI,CAAA,CAC1BsE,CAAAA,CAAQD,CAAAA,CAAO,MAAA,CAAOE,GAAK,CAACV,CAAAA,CAAQ,QAAA,CAASU,CAAC,CAAC,CAAA,CACrD,OAAID,CAAAA,CAAM,MAAA,GAAW,CAAA,CAAUpB,CAAAA,CAExB,CACL,MAAA,CAAQ,CACN,GAAGA,CAAAA,CAAK,MAAA,CACR,KAAA,CAAO,CACL,GAAGA,EAAK,MAAA,CAAO,KAAA,CACf,CAACkB,CAAQ,EAAG,CAAE,GAAGpE,CAAAA,CAAM,QAAA,CAAU,CAAC,GAAG6D,CAAAA,CAAS,GAAGS,CAAK,CAAE,CAC1D,CACF,CAAA,CACA,KAAA,CAAOpB,EAAK,KACd,CACF,CAKO,SAASQ,EAAAA,CAAeR,CAAAA,CAAiBkB,EAAkBC,CAAAA,CAA6B,CAC7F,IAAMrE,CAAAA,CAAOkD,CAAAA,CAAK,MAAA,CAAO,MAAMkB,CAAQ,CAAA,CACvC,GAAI,CAACpE,CAAAA,CAAM,OAAOkD,EAElB,IAAMW,CAAAA,CAAU9D,EAAAA,CAAYC,CAAI,CAAA,CAC1BwE,CAAAA,CAAYX,EAAQ,MAAA,CAAOU,CAAAA,EAAK,CAACF,CAAAA,CAAO,QAAA,CAASE,CAAC,CAAC,CAAA,CACzD,OAAIC,EAAU,MAAA,GAAWX,CAAAA,CAAQ,OAAeX,CAAAA,CAEzC,CACL,MAAA,CAAQ,CACN,GAAGA,CAAAA,CAAK,OACR,KAAA,CAAO,CACL,GAAGA,CAAAA,CAAK,MAAA,CAAO,KAAA,CACf,CAACkB,CAAQ,EAAG,CAAE,GAAGpE,CAAAA,CAAM,QAAA,CAAUwE,CAAU,CAC7C,CACF,CAAA,CACA,KAAA,CAAOtB,CAAAA,CAAK,KACd,CACF,CAmIO,SAASuB,EAAAA,CAASvB,CAAAA,CAAoC,CAC3D,OAAO,CACL,OAAA,CAAS,CAAA,CACT,MAAA,CAAQA,CAAAA,CAAK,MAAA,CACb,KAAA,CAAOA,EAAK,KAAA,CACZ,UAAA,CAAY,IAAI,IAAA,EAAK,CAAE,WAAA,EACzB,CACF,CAMO,SAASwB,EAAAA,CAAQzC,CAAAA,CAA0B,CAChD,GAAI,CAACA,CAAAA,EAAQ,OAAOA,CAAAA,EAAS,QAAA,CAC3B,MAAM,IAAI,KAAA,CAAM,sCAAsC,CAAA,CAGxD,IAAM0C,CAAAA,CAAO1C,EAEb,GAAI,CAAC0C,CAAAA,CAAK,MAAA,EAAU,OAAOA,CAAAA,CAAK,QAAW,QAAA,CACzC,MAAM,IAAI,KAAA,CAAM,+CAA+C,CAAA,CAEjE,GAAI,CAACA,CAAAA,CAAK,KAAA,EAAS,OAAOA,CAAAA,CAAK,KAAA,EAAU,SACvC,MAAM,IAAI,KAAA,CAAM,8CAA8C,CAAA,CAGhE,IAAM7B,EAAS6B,CAAAA,CAAK,MAAA,CACdvD,CAAAA,CAAQuD,CAAAA,CAAK,KAAA,CAEnB,GAAI,CAAC7B,CAAAA,CAAO,QAAA,EAAY,OAAOA,CAAAA,CAAO,QAAA,EAAa,QAAA,CACjD,MAAM,IAAI,KAAA,CAAM,2CAA2C,CAAA,CAE7D,GAAI,CAACA,EAAO,KAAA,EAAS,OAAOA,CAAAA,CAAO,KAAA,EAAU,QAAA,CAC3C,MAAM,IAAI,KAAA,CAAM,wCAAwC,CAAA,CAE1D,GAAI,CAAC1B,CAAAA,CAAM,OAAS,OAAOA,CAAAA,CAAM,KAAA,EAAU,QAAA,CACzC,MAAM,IAAI,MAAM,uCAAuC,CAAA,CAEzD,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQA,EAAM,gBAAgB,CAAA,CACvC,MAAM,IAAI,KAAA,CAAM,2DAA2D,EAG7E,OAAO,CAAE,MAAA,CAAA0B,CAAAA,CAAQ,KAAA,CAAA1B,CAAM,CACzB,CAMA,SAASE,IAAkD,CACzD,OAAO,CACL,MAAA,CAAQ,aAAA,CACR,cAAA,CAAgB,CAAA,CAChB,UAAA,CAAY,CAAA,CACZ,UAAW,CAAA,CACX,QAAA,CAAU,EAAC,CACX,QAAA,CAAU,IACZ,CACF,CAEA,SAAS8B,EAAAA,CACPhC,CAAAA,CACAwD,CAAAA,CACgB,CAChB,IAAMC,CAAAA,CAAM,IAAI,IAAA,EAAK,CAAE,WAAA,EAAY,CACnC,OAAQD,CAAAA,EACN,KAAK,MAAA,CACH,OAAO,CAAE,GAAGxD,CAAAA,CAAO,MAAA,CAAQ,SAAA,CAAW,WAAA,CAAayD,CAAI,CAAA,CACzD,KAAK,OAAA,CACH,OAAO,CAAE,GAAGzD,CAAAA,CAAO,MAAA,CAAQ,SAAU,WAAA,CAAayD,CAAI,CAAA,CACxD,KAAK,QAAA,CACH,OAAO,CAAE,GAAGzD,CAAAA,CAAO,MAAA,CAAQ,SAAA,CAAW,WAAA,CAAayD,CAAI,EACzD,QACE,OAAOzD,CACX,CACF,CC3dO,SAAS0D,GAAS5B,CAAAA,CAAiC,CACxD,GAAM,CAAE,MAAA,CAAAJ,CAAAA,CAAQ,MAAA1B,CAAM,CAAA,CAAI8B,CAAAA,CACpB6B,CAAAA,CAAa7E,EAAAA,CAAY4C,CAAM,EAGrC,GAFkB,MAAA,CAAO,IAAA,CAAKiC,CAAU,CAAA,CAE1B,MAAA,GAAW,EACvB,OAAO,CAAE,QAAA,CAAU,EAAC,CAAG,OAAA,CAAS,EAAC,CAAG,UAAA,CAAY,EAAC,CAAG,OAAA,CAAS,GAAI,SAAA,CAAW,EAAG,CAAA,CAIjF,IAAMC,EAAcC,EAAAA,CAAiBF,CAAU,CAAA,CAGzCG,CAAAA,CAAkBxE,EAAAA,CAAwBoC,CAAAA,CAAQ1B,EAAM,KAAK,CAAA,CAC7D+D,CAAAA,CAAmB,IAAI,GAAA,CAAI,CAAC,GAAGD,CAAAA,CAAiB,GAAG9D,CAAAA,CAAM,gBAAgB,CAAC,CAAA,CAE1EgE,EAAqB,EAAC,CACtBC,CAAAA,CAAyB,EAAC,CAC1BC,CAAAA,CAAqC,EAAC,CACtCC,CAAAA,CAAyB,EAAC,CAEhC,IAAA,GAAW,CAAC1E,EAAUN,CAAU,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQwE,CAAU,CAAA,CAAG,CAC/D,IAAM1E,CAAAA,CAAYe,CAAAA,CAAM,KAAA,CAAMP,CAAQ,CAAA,CAChC2E,EAAWlF,EAAAA,CAAmBC,CAAAA,CAAYuC,CAAAA,CAAO,QAAQ,CAAA,CACzD2C,CAAAA,CAAaD,IAAa,MAAA,CAGhC,GAAInF,CAAAA,EAAW,MAAA,GAAWP,EAAAA,CAAY,OAAA,EAAWM,GAAgBC,CAAS,CAAA,CACxE,SAIF,IAAMqF,CAAAA,CAAUjF,EAAAA,CAAiBF,CAAU,CAAA,CAY3C,GAXImF,CAAAA,GAAY,MAAA,EAAarF,CAAAA,EAAaA,CAAAA,CAAU,gBAAkBqF,CAAAA,EAKlEnF,CAAAA,CAAW,eAAA,EAAmBF,CAAAA,EAC9BA,CAAAA,CAAU,cAAA,EAAkBE,EAAW,eAAA,CAAgB,cAAA,EAKvD,CAACkF,CAAAA,EAAcpF,CAAAA,EAAW,MAAA,GAAWP,GAAY,SAAA,CACnD,SAIF,GAAI2F,CAAAA,EAAcpF,CAAAA,EAAW,MAAA,GAAWP,GAAY,SAAA,CAAW,CAC7D,IAAM0B,CAAAA,CAAWvB,EAAAA,CAAYM,CAAU,EAEnCoF,CAAAA,CAAa,KAAA,CACjB,OAAQH,CAAAA,EACN,KAAK,cAAA,CAAgB,CACfhE,CAAAA,CAAS,MAAA,CAAS,CAAA,EACGA,CAAAA,CAAS,KAAKoE,CAAAA,EAAO,CAC1C,IAAA,GAAW,CAAClE,CAAAA,CAAWC,CAAW,IAAK,MAAA,CAAO,OAAA,CAAQoD,CAAU,CAAA,CAC9D,GAAIhF,EAAAA,CAAY4B,CAAW,CAAA,CAAE,QAAA,CAASiE,CAAG,CAAA,CAAG,CAC1C,IAAMhE,EAAaR,CAAAA,CAAM,KAAA,CAAMM,CAAS,CAAA,CACxC,GAAI,CAACE,EAAY,SACjB,IAAMiE,EAAAA,CAAWxF,CAAAA,CAAU,kBAAA,GAAqBuF,CAAG,EACnD,OAAIhE,CAAAA,CAAW,YAAA,EAAgB,IAAA,CACtBA,CAAAA,CAAW,cAAA,CAAiBvB,EAAU,SAAA,CAExCuB,CAAAA,CAAW,eAAiBiE,EACrC,CAEF,OAAO,MACT,CAAC,CAAA,GACoBF,CAAAA,CAAa,IAAA,CAAA,CAIpC,KACF,CACA,KAAK,eAAA,CAAiB,CAChBnE,CAAAA,CAAS,MAAA,CAAS,CAAA,EACCA,EAAS,IAAA,CAAKoE,CAAAA,EAAO,CACxC,IAAA,GAAW,CAAClE,CAAAA,CAAWC,CAAW,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQoD,CAAU,CAAA,CAC9D,GAAIhF,GAAY4B,CAAW,CAAA,CAAE,QAAA,CAASiE,CAAG,CAAA,CAAG,CAC1C,IAAMhE,CAAAA,CAAaR,CAAAA,CAAM,KAAA,CAAMM,CAAS,CAAA,CACxC,GAAIE,GAAcA,CAAAA,CAAW,cAAA,CAAiBvB,CAAAA,CAAU,SAAA,CAAW,OAAO,KAC5E,CAEF,OAAO,MACT,CAAC,CAAA,GACkBsF,CAAAA,CAAa,MAIlC,KACF,CACA,KAAK,YAAA,CAAc,CACjB,IAAMG,EAAWvF,CAAAA,CAAW,eAAA,EAAmB,CAAA,CAC/C,GAAIuF,CAAAA,EAAY,CAAA,CAAG,CAAEH,CAAAA,CAAa,IAAA,CAAM,KAAO,CAC/C,IAAMI,CAAAA,CAAc1F,EAAU,WAAA,CAC9B,GAAI,CAAC0F,CAAAA,CAAa,CAAEJ,CAAAA,CAAa,KAAM,KAAO,CAAA,CAC1B,IAAA,CAAK,GAAA,EAAI,CAAI,IAAA,CAAK,MAAMI,CAAW,CAAA,EAAK,GAAA,CAC3CD,CAAAA,GAAUH,CAAAA,CAAa,IAAA,CAAA,CACxC,KACF,CACA,KAAK,QAAA,CACHA,CAAAA,CAAa,IAAA,CACb,KACJ,CACA,GAAIA,CAAAA,CAAY,QAClB,CAEA,IAAMnE,CAAAA,CAAWvB,GAAYM,CAAU,CAAA,CAGvC,GAAIiB,CAAAA,CAAS,MAAA,GAAW,CAAA,CAAG,CACzB4D,CAAAA,CAAS,IAAA,CAAKvE,CAAQ,CAAA,CACtB,QACF,CAGA,IAAMmF,CAAAA,CAA0B,EAAC,CAC3BC,CAAAA,CAA0B,EAAC,CAC3BC,EAA+D,EAAC,CAEtE,IAAA,IAAWzE,CAAAA,IAASD,CAAAA,CAAU,CAC5B,GAAI2D,CAAAA,CAAiB,GAAA,CAAI1D,CAAK,CAAA,CAAG,SAEjC,IAAM0E,EAAYnB,CAAAA,CAAYvD,CAAK,CAAA,EAAK,EAAC,CAErC0E,CAAAA,CAAU,SAAW,CAAA,CAEvBH,CAAAA,CAAc,IAAA,CAAKvE,CAAK,CAAA,CAGN0E,CAAAA,CAAU,MAAMC,CAAAA,EAAKhG,EAAAA,CAAgBgB,EAAM,KAAA,CAAMgF,CAAC,CAAC,CAAC,CAAA,CAEpEF,CAAAA,CAAgB,IAAA,CAAK,CAAE,KAAA,CAAAzE,EAAO,cAAA,CAAgB0E,CAAAA,CAAU,CAAC,CAAE,CAAC,CAAA,CAG5DF,EAAc,IAAA,CAAKxE,CAAK,EAG9B,CAEIuE,CAAAA,CAAc,MAAA,CAAS,EACzBV,CAAAA,CAAW,IAAA,CAAK,CAAE,QAAA,CAAAzE,CAAAA,CAAU,aAAA,CAAAmF,CAAc,CAAC,CAAA,CAClCE,CAAAA,CAAgB,MAAA,CAAS,CAAA,CAClCX,CAAAA,CAAQ,KAAK,CACX,QAAA,CAAA1E,CAAAA,CACA,YAAA,CAAcqF,CAAAA,CAAgB,GAAA,CAAIG,GAAKA,CAAAA,CAAE,KAAK,CAAA,CAC9C,eAAA,CAAiB,CAAC,GAAG,IAAI,GAAA,CAAIH,CAAAA,CAAgB,GAAA,CAAIG,CAAAA,EAAKA,CAAAA,CAAE,cAAc,CAAC,CAAC,CAC1E,CAAC,CAAA,CACQJ,CAAAA,CAAc,MAAA,CAAS,EAChCZ,CAAAA,CAAQ,IAAA,CAAK,CAAE,QAAA,CAAAxE,CAAAA,CAAU,SAAA,CAAWoF,CAAc,CAAC,CAAA,CAGnDb,CAAAA,CAAS,IAAA,CAAKvE,CAAQ,EAE1B,CAGA,IAAMyF,CAAAA,CAAsC,EAAC,CAC7C,GAAIlB,CAAAA,CAAS,OAAS,CAAA,CAAG,CACvB,IAAMlE,CAAAA,CAAeH,EAAAA,CAAqBqE,CAAAA,CAAUL,CAAU,CAAA,CAC9D,IAAA,GAAW,CAACwB,CAAAA,CAAWC,CAAU,CAAA,GAAK,OAAO,OAAA,CAAQtF,CAAY,CAAA,CAC3DsF,CAAAA,CAAW,MAAA,CAAS,CAAA,GACtBF,EAAUC,CAAS,CAAA,CAAIC,GAG7B,CAEA,OAAO,CAAE,QAAA,CAAApB,CAAAA,CAAU,OAAA,CAAAC,CAAAA,CAAS,UAAA,CAAAC,CAAAA,CAAY,QAAAC,CAAAA,CAAS,SAAA,CAAAe,CAAU,CAC7D,CASA,SAASrB,GAAiBhE,CAAAA,CAA+F,CACvH,IAAMwF,CAAAA,CAAgC,EAAC,CAEvC,OAAW,CAAC3C,CAAAA,CAAMhB,CAAM,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQ7B,CAAK,CAAA,CAAG,CAClD,IAAA,IAAWQ,CAAAA,IAAS1B,EAAAA,CAAY+C,CAAM,EAC/B2D,CAAAA,CAAIhF,CAAK,CAAA,GAAGgF,CAAAA,CAAIhF,CAAK,CAAA,CAAI,EAAC,CAAA,CAC/BgF,CAAAA,CAAIhF,CAAK,CAAA,CAAE,IAAA,CAAKqC,CAAI,EAEtB,GAAIhB,CAAAA,CAAO,EAAA,CACT,IAAA,IAAWuB,CAAAA,IAAU,MAAA,CAAO,OAAOvB,CAAAA,CAAO,EAAE,CAAA,CAC1C,IAAA,IAAWrB,CAAAA,IAAS4C,CAAAA,CACboC,EAAIhF,CAAK,CAAA,GAAGgF,CAAAA,CAAIhF,CAAK,CAAA,CAAI,IACzBgF,CAAAA,CAAIhF,CAAK,CAAA,CAAE,QAAA,CAASqC,CAAI,CAAA,EAAG2C,EAAIhF,CAAK,CAAA,CAAE,IAAA,CAAKqC,CAAI,CAAA,CAI1D,GAAIhB,EAAO,UAAA,CACT,IAAA,IAAWrB,CAAAA,IAASqB,CAAAA,CAAO,UAAA,CACpB2D,CAAAA,CAAIhF,CAAK,CAAA,GAAGgF,CAAAA,CAAIhF,CAAK,CAAA,CAAI,EAAC,CAAA,CAC1BgF,EAAIhF,CAAK,CAAA,CAAE,QAAA,CAASqC,CAAI,CAAA,EAAG2C,CAAAA,CAAIhF,CAAK,CAAA,CAAE,IAAA,CAAKqC,CAAI,EAG1D,CAEA,OAAO2C,CACT,CCnMO,IAAMC,EAAAA,CAAN,KAAuC,CACpC,OAAuB,EAAC,CAEhC,MAAA,CAAOvD,CAAAA,CAAyB,CAC9B,IAAA,CAAK,OAAO,IAAA,CAAKA,CAAK,EACxB,CAEA,KAAA,EAAsB,CACpB,IAAMS,CAAAA,CAAS,IAAA,CAAK,MAAA,CACpB,OAAA,IAAA,CAAK,MAAA,CAAS,GACPA,CACT,CAEA,IAAI,IAAA,EAAe,CACjB,OAAO,KAAK,MAAA,CAAO,MACrB,CACF,CAAA,CCZO,SAAS+C,EAAAA,CAAgB1E,EAAuC,CACrE,IAAM2E,CAAAA,CAAOC,EAAAA,CAAgB5E,CAAI,CAAA,CACjC,OAAO6E,EAAAA,CAAWF,CAAI,CACxB,CAGA,SAASC,GAAgBE,CAAAA,CAAwB,CAC/C,GAAIA,CAAAA,EAAU,IAAA,EAA+B,OAAOA,GAAU,QAAA,CAC5D,OAAO,IAAA,CAAK,SAAA,CAAUA,CAAK,CAAA,CAE7B,GAAI,KAAA,CAAM,OAAA,CAAQA,CAAK,CAAA,CACrB,OAAO,GAAA,CAAMA,EAAM,GAAA,CAAIF,EAAe,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,CAAI,IAEtD,IAAMG,CAAAA,CAAMD,CAAAA,CAEZ,OAAO,GAAA,CADM,MAAA,CAAO,KAAKC,CAAG,CAAA,CAAE,IAAA,EAAK,CACjB,GAAA,CAAIC,CAAAA,EAAK,KAAK,SAAA,CAAUA,CAAC,CAAA,CAAI,GAAA,CAAMJ,EAAAA,CAAgBG,CAAAA,CAAIC,CAAC,CAAC,CAAC,EAAE,IAAA,CAAK,GAAG,EAAI,GAC5F,CAMA,SAASH,EAAAA,CAAW9H,CAAAA,CAAuB,CACzC,IAAIkI,CAAAA,CAAO,mBAAA,CACLC,CAAAA,CAAQ,cAAA,CACRC,CAAAA,CAAM,mBAAA,CACZ,QAASlI,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIF,CAAAA,CAAM,MAAA,CAAQE,CAAAA,EAAAA,CAChCgI,GAAQ,MAAA,CAAOlI,CAAAA,CAAM,UAAA,CAAWE,CAAC,CAAC,CAAA,CAClCgI,EAAQA,CAAAA,CAAOC,CAAAA,CAASC,CAAAA,CAE1B,OAAOF,CAAAA,CAAK,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,EAAA,CAAI,GAAG,CAC3C,CAEA,SAASG,EAAAA,CAAgBrI,CAAAA,CAAuB,CAC9C,GAAI,OAAO,MAAA,CAAW,IACpB,OAAO,MAAA,CAAO,IAAA,CAAKA,CAAAA,CAAO,MAAM,CAAA,CAAE,SAAS,WAAW,CAAA,CAExD,GAAI,OAAO,IAAA,EAAS,UAAA,CAAY,CAC9B,IAAMC,CAAAA,CAAQ,IAAI,WAAA,EAAY,CAAE,MAAA,CAAOD,CAAK,CAAA,CACxCH,CAAAA,CAAS,EAAA,CACb,IAAA,IAAWyI,CAAAA,IAAKrI,CAAAA,CAAOJ,GAAU,MAAA,CAAO,YAAA,CAAayI,CAAC,CAAA,CACtD,OAAO,IAAA,CAAKzI,CAAM,CAAA,CAAE,OAAA,CAAQ,KAAA,CAAO,GAAG,CAAA,CAAE,OAAA,CAAQ,MAAO,GAAG,CAAA,CAAE,OAAA,CAAQ,MAAA,CAAQ,EAAE,CAChF,CACA,MAAM,IAAI,KAAA,CAAM,6CAA6C,CAC/D,CAEA,SAAS0I,EAAAA,CAAgBvI,CAAAA,CAAuB,CAC9C,GAAI,OAAO,OAAW,GAAA,CACpB,OAAO,MAAA,CAAO,IAAA,CAAKA,CAAAA,CAAO,WAAW,EAAE,QAAA,CAAS,MAAM,CAAA,CAExD,GAAI,OAAO,IAAA,EAAS,WAAY,CAC9B,IAAMJ,CAAAA,CAASI,CAAAA,CAAM,OAAA,CAAQ,IAAA,CAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAM,GAAG,CAAA,CACnDwI,CAAAA,CAAS5I,EAAS,GAAA,CAAI,MAAA,CAAA,CAAQ,CAAA,CAAKA,CAAAA,CAAO,MAAA,CAAS,CAAA,EAAM,CAAC,CAAA,CAC1DC,CAAAA,CAAS,IAAA,CAAK2I,CAAM,CAAA,CACpBvI,CAAAA,CAAQ,IAAI,UAAA,CAAWJ,CAAAA,CAAO,MAAM,CAAA,CAC1C,IAAA,IAASK,CAAAA,CAAI,EAAGA,CAAAA,CAAIL,CAAAA,CAAO,MAAA,CAAQK,CAAAA,EAAAA,CAAKD,CAAAA,CAAMC,CAAC,EAAIL,CAAAA,CAAO,UAAA,CAAWK,CAAC,CAAA,CACtE,OAAO,IAAI,aAAY,CAAE,MAAA,CAAOD,CAAK,CACvC,CACA,MAAM,IAAI,KAAA,CAAM,6CAA6C,CAC/D,CAMA,SAASwI,EAAAA,CAAoB5G,EAA0B,CACrD,IAAM6G,CAAAA,CAAU,IAAA,CAAK,SAAA,CAAU,CAAE7G,EAAa,CAAA,CAAG,IAAA,CAAK,GAAA,EAAI,CAAE,QAAA,CAAS,EAAE,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,MAAM,CAAA,CAAG,CAAC,CAAE,CAAC,CAAA,CACnH,OAAOwG,GAAgBK,CAAO,CAChC,CAKA,SAASC,EAAAA,CAAoBlG,EAA4C,CACvE,GAAI,CACF,IAAMiG,CAAAA,CAAU,IAAA,CAAK,MAAMH,EAAAA,CAAgB9F,CAAK,CAAC,CAAA,CACjD,OAAI,OAAOiG,GAAS,CAAA,EAAM,QAAA,CAAiB,CAAE,QAAA,CAAUA,CAAAA,CAAQ,CAAE,EAC1D,IACT,CAAA,KAAQ,CAAE,OAAO,IAAM,CACzB,CA2JO,SAASE,EAAAA,CACdC,CAAAA,CACAC,CAAAA,CACA/E,CAAAA,CACe,CACf,GAAM,CACJ,QAAA,CAAUgF,CAAAA,CACV,OAAA,CAAAC,CACF,CAAA,CAAIF,EAKEG,CAAAA,CAAa,IAAIvB,EAAAA,CAEnBxD,CAAAA,CAAO,OAAA,GAAW2E,CAAAA,EAAgB,WAAYA,CAAAA,CAC9CA,CAAAA,CACAhF,EAAAA,CAAgBgF,CAAwC,CAAA,CACxDK,EAAW,KAAA,CAGTC,CAAAA,CAAkB,IAAI,GAAA,CAGtBC,CAAAA,CAAW,IAAI,IAA2B,MAAA,CAAO,OAAA,CAAQL,CAAe,CAAC,CAAA,CAIzEM,CAAAA,CAAkB,IAAI3B,EAAAA,CAGxB4B,CAAAA,CAAW,KAAA,CACXC,CAAAA,CAAc,KAAA,CAMlB,SAASC,GAAc,CACrB,GAAI,CAAAN,CAAAA,CACJ,CAAA,GAAII,CAAAA,CAAU,CACZC,CAAAA,CAAc,IAAA,CACd,MACF,CAEAD,CAAAA,CAAW,IAAA,CACX,GAAI,CACF,GACEC,CAAAA,CAAc,CAAA,CAAA,CACdE,CAAAA,EAAU,CAAA,MACHF,EACX,CAAA,OAAE,CACAD,CAAAA,CAAW,MACb,CAAA,CACF,CAEA,SAASG,CAAAA,EAAkB,CAIzB,IAAMC,CAAAA,CAAiBL,CAAAA,CAAgB,OAAM,CACvCM,CAAAA,CAAcV,CAAAA,CAAW,KAAA,EAAM,CAC/BrE,CAAAA,CAAS,CAAC,GAAG8E,CAAAA,CAAgB,GAAGC,CAAW,CAAA,CAG7C/E,CAAAA,CAAO,OAAS,CAAA,GAClBV,CAAAA,CAAOS,EAAAA,CAAYT,CAAAA,CAAMU,CAAM,CAAA,CAAA,CAIjC,IAAM7B,CAAAA,CAAS+C,EAAAA,CAAS5B,CAAI,CAAA,CAGxBU,CAAAA,CAAO,MAAA,CAAS,GAClBoE,CAAAA,GAAUpE,CAAAA,CAAQV,CAAAA,CAAMnB,CAAM,CAAA,CAIhC,IAAA,IAAWlB,KAAYkB,CAAAA,CAAO,QAAA,CAC5B6G,CAAAA,CAAa/H,CAAQ,CAAA,CAMvB,IAAA,IAAWsC,KAASS,CAAAA,CAClB,GAAIT,CAAAA,CAAM,IAAA,GAAS,eAAA,CAAiB,CAClC,GAAM,CAAE,QAAA,CAAAtC,EAAU,MAAA,CAAAgI,CAAO,EAAI1F,CAAAA,CAE7B,GAAI,CADeD,CAAAA,CAAK,MAAA,CAAO,KAAA,CAAMrC,CAAQ,CAAA,CAC5B,SACjB,IAAMR,CAAAA,CAAY6C,CAAAA,CAAK,KAAA,CAAM,MAAMrC,CAAQ,CAAA,CAC3C,GAAI,CAACR,CAAAA,EAAaA,CAAAA,CAAU,SAAW,SAAA,CAAW,SAClD,IAAMyI,CAAAA,CAAgBrB,EAAAA,CAAoB5G,CAAQ,EAC5CuF,CAAAA,CAAI2C,CAAAA,CAAYlI,CAAAA,CAAUiI,CAAAA,CAAeD,CAAM,CAAA,CAAE,MAAOvG,CAAAA,EAAiB,CACzE4F,CAAAA,GACJG,CAAAA,CAAgB,MAAA,CAAO,CACrB,KAAM,aAAA,CACN,QAAA,CAAAxH,CAAAA,CACA,KAAA,CAAOyB,CAAAA,CAAM,OAAA,EAAW,OAAOA,CAAK,CAAA,CACpC,UAAW,IAAI,IAAA,GAAO,WAAA,EACxB,CAAC,CAAA,CACDkG,CAAAA,EAAM,EACR,CAAC,CAAA,CAAE,OAAA,CAAQ,IAAM,CAAEL,CAAAA,CAAgB,MAAA,CAAO/B,CAAC,EAAG,CAAC,CAAA,CAC/C+B,CAAAA,CAAgB,GAAA,CAAI/B,CAAC,EACvB,CAEJ,CAMA,SAAS4C,CAAAA,CAAqBnI,CAAAA,CAAuE,CAEnG,IAAMW,CAAAA,CADa0B,CAAAA,CAAK,MAAA,CAAO,KAAA,CAAMrC,CAAQ,CAAA,CACjB,UAAY,EAAC,CAEnCoI,CAAAA,CAAc,IAAI,GAAA,CACxB,IAAA,GAAW,CAACnF,CAAAA,CAAMoF,CAAG,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQhG,CAAAA,CAAK,OAAO,KAAK,CAAA,CACxD,IAAA,IAAWzB,CAAAA,IAASyH,CAAAA,CAAI,QAAA,EAAY,EAAC,CACnCD,CAAAA,CAAY,GAAA,CAAIxH,CAAAA,CAAOqC,CAAI,CAAA,CAI/B,IAAM1C,CAAAA,CAA6D,EAAC,CACpE,IAAA,IAAWK,CAAAA,IAASD,CAAAA,CAAU,CAC5B,IAAM2H,CAAAA,CAAeF,CAAAA,CAAY,GAAA,CAAIxH,CAAK,CAAA,CACtC0H,EACF/H,CAAAA,CAAMK,CAAK,CAAA,CAAIyB,CAAAA,CAAK,KAAA,CAAM,KAAA,CAAMiG,CAAY,CAAA,EAAG,IAAA,CAE/C/H,CAAAA,CAAMK,CAAK,CAAA,CAAI,OAEnB,CACA,OAAOL,CACT,CAMA,eAAe2H,CAAAA,CAAYlI,CAAAA,CAAkBiI,EAAuBD,CAAAA,CAAiD,CACnH,IAAMtI,CAAAA,CAAa2C,CAAAA,CAAK,MAAA,CAAO,MAAMrC,CAAQ,CAAA,CACvCuI,EAAe7I,CAAAA,CAAW,YAAA,EAAgB,EAAC,CAC3C8I,CAAAA,CAAgBL,CAAAA,CAAqBnI,CAAQ,CAAA,CAEnD,IAAA,IAAWyI,KAAeF,CAAAA,CAAc,CACtC,IAAMG,CAAAA,CAAUnB,CAAAA,CAAS,GAAA,CAAIkB,CAAW,CAAA,CACxC,GAAI,CAACC,CAAAA,CACH,MAAM,IAAI,MAAM,CAAA,SAAA,EAAYD,CAAW,CAAA,+BAAA,EAAkCzI,CAAQ,CAAA,EAAA,CAAI,CAAA,CAGvF,IAAM7B,CAAAA,CAA0B,CAC9B,MAAA,CAAQ6B,CAAAA,CACR,KAAA,CAAOwI,CAAAA,CACP,UAAWnG,CAAAA,CAAK,KAAA,CAAM,KAAA,CAAMrC,CAAQ,CAAA,CACpC,MAAA,CAAQN,EACR,aAAA,CAAAuI,CAAAA,CACA,MAAA,CAAAD,CACF,CAAA,CAIA,GAFe,MAAMU,CAAAA,CAAQvK,CAAK,CAAA,GAEnB,uBAAA,CACb,MAAM,IAAI,MAAM,CAAA,SAAA,EAAYsK,CAAW,CAAA,wCAAA,EAA2CzI,CAAQ,CAAA,EAAA,CAAI,CAElG,CACF,CAMA,SAAS+H,CAAAA,CAAa/H,CAAAA,CAAwB,CAE5C,IAAMuI,EADalG,CAAAA,CAAK,MAAA,CAAO,KAAA,CAAMrC,CAAQ,CAAA,EACZ,YAAA,CAEjC,GAAI,CAACuI,CAAAA,EAAgBA,CAAAA,CAAa,MAAA,GAAW,CAAA,CAE3C,OAIFf,EAAgB,MAAA,CAAO,CACrB,IAAA,CAAM,cAAA,CACN,QAAA,CAAAxH,CAAAA,CACA,UAAW,IAAI,IAAA,EAAK,CAAE,WAAA,EACxB,CAAC,EAID2H,CAAAA,EAAM,CAEN,IAAMM,CAAAA,CAAgBrB,EAAAA,CAAoB5G,CAAQ,EAG5CuF,CAAAA,CAAI2C,CAAAA,CAAYlI,EAAUiI,CAAa,CAAA,CAAE,MAAOxG,CAAAA,EAAiB,CACjE4F,CAAAA,GACJG,CAAAA,CAAgB,MAAA,CAAO,CACrB,KAAM,aAAA,CACN,QAAA,CAAAxH,CAAAA,CACA,KAAA,CAAOyB,CAAAA,CAAM,OAAA,EAAW,OAAOA,CAAK,CAAA,CACpC,SAAA,CAAW,IAAI,IAAA,EAAK,CAAE,aACxB,CAAC,CAAA,CACDkG,CAAAA,EAAM,EACR,CAAC,EAAE,OAAA,CAAQ,IAAM,CAAEL,CAAAA,CAAgB,MAAA,CAAO/B,CAAC,EAAG,CAAC,CAAA,CAC/C+B,CAAAA,CAAgB,GAAA,CAAI/B,CAAC,EACvB,CAMA,OAAO,CACL,IAAA,CAAKjD,CAAAA,CAAyB,CACxB+E,CAAAA,GACA/E,EAAM,IAAA,GAAS,gBAAA,EAAoBA,CAAAA,CAAM,IAAA,EAAQ,CAACA,CAAAA,CAAM,WAC1DA,CAAAA,CAAQ,CAAE,GAAGA,CAAAA,CAAO,QAAA,CAAUwD,EAAAA,CAAgBxD,EAAM,IAAI,CAAE,CAAA,CAAA,CAE5D8E,CAAAA,CAAW,MAAA,CAAO9E,CAAK,EACvBqF,CAAAA,EAAM,EACR,CAAA,CAEA,OAAA,CAAQ5E,CAAAA,CAA4B,CAClC,GAAI,CAAAsE,CAAAA,CACJ,CAAA,IAAA,IAAW/E,CAAAA,IAASS,CAAAA,CACdT,CAAAA,CAAM,OAAS,gBAAA,EAAoBA,CAAAA,CAAM,IAAA,EAAQ,CAACA,CAAAA,CAAM,QAAA,CAC1D8E,EAAW,MAAA,CAAO,CAAE,GAAG9E,CAAAA,CAAO,QAAA,CAAUwD,EAAAA,CAAgBxD,EAAM,IAAI,CAAE,CAAC,CAAA,CAErE8E,CAAAA,CAAW,MAAA,CAAO9E,CAAK,CAAA,CAG3BqF,CAAAA,IACF,CAAA,CAEA,eAAA,CAAgBM,EAAuB7G,CAAAA,CAA+BuH,CAAAA,CAAyB,CAC7F,GAAItB,CAAAA,CAAU,OAEd,IAAMuB,CAAAA,CAAU9B,EAAAA,CAAoBmB,CAAa,CAAA,CACjD,GAAI,CAACW,EAAS,OAEd,GAAM,CAAE,QAAA,CAAA5I,CAAS,CAAA,CAAI4I,EACrB,GAAKvG,CAAAA,CAAK,MAAA,CAAO,KAAA,CAAMrC,CAAQ,CAAA,CAE/B,IAAI2I,CAAAA,EAAUA,CAAAA,CAAO,MAAA,CAAS,CAAA,CAC5BvB,CAAAA,CAAW,MAAA,CAAO,CAChB,IAAA,CAAM,aAAA,CACN,QAAA,CAAApH,CAAAA,CACA,KAAA,CAAO2I,CAAAA,CAAO,KAAK,IAAI,CAAA,CACvB,SAAA,CAAW,IAAI,IAAA,EAAK,CAAE,aACxB,CAAC,OACI,CACL,IAAMxH,EAAWC,CAAAA,EAAQ,MAAA,CAAO,IAAA,CAAKA,CAAI,CAAA,CAAE,MAAA,CAAS,EAAI0E,EAAAA,CAAgB1E,CAAI,CAAA,CAAI,MAAA,CAChFgG,CAAAA,CAAW,MAAA,CAAO,CAChB,IAAA,CAAM,gBAAA,CACN,QAAA,CAAApH,CAAAA,CACA,IAAA,CAAAoB,CAAAA,CACA,SAAAD,CAAAA,CACA,SAAA,CAAW,IAAI,IAAA,EAAK,CAAE,WAAA,EACxB,CAAC,EACH,CACAwG,CAAAA,GAAM,CACR,CAAA,CAEA,QAAQ1E,CAAAA,CAAcvD,CAAAA,CAA8B,CAC9C2H,CAAAA,GACJD,CAAAA,CAAW,MAAA,CAAO,CAAE,IAAA,CAAM,aAAA,CAAe,QAAA,CAAUnE,CAAAA,CAAM,UAAA,CAAAvD,CAAAA,CAAY,UAAW,IAAI,IAAA,GAAO,WAAA,EAAc,CAAC,CAAA,CAC1GiI,CAAAA,EAAM,EACR,CAAA,CAEA,UAAA,CAAW1E,CAAAA,CAAoB,CACzBoE,CAAAA,GACJD,CAAAA,CAAW,MAAA,CAAO,CAAE,IAAA,CAAM,cAAA,CAAgB,SAAUnE,CAAAA,CAAM,SAAA,CAAW,IAAI,IAAA,EAAK,CAAE,WAAA,EAAc,CAAC,CAAA,CAC/F0E,CAAAA,EAAM,EACR,CAAA,CAEA,WAAA,CAAYpE,EAAkBC,CAAAA,CAAwB,CAChD6D,CAAAA,GACJD,CAAAA,CAAW,MAAA,CAAO,CAAE,KAAM,mBAAA,CAAqB,QAAA,CAAA7D,CAAAA,CAAU,MAAA,CAAAC,CAAAA,CAAQ,SAAA,CAAW,IAAI,IAAA,EAAK,CAAE,WAAA,EAAc,CAAC,CAAA,CACtGmE,GAAM,EACR,CAAA,CAEA,cAAA,CAAepE,CAAAA,CAAkBC,CAAAA,CAAwB,CACnD6D,IACJD,CAAAA,CAAW,MAAA,CAAO,CAAE,IAAA,CAAM,sBAAA,CAAwB,QAAA,CAAA7D,EAAU,MAAA,CAAAC,CAAAA,CAAQ,SAAA,CAAW,IAAI,IAAA,EAAK,CAAE,aAAc,CAAC,CAAA,CACzGmE,CAAAA,EAAM,EACR,CAAA,CAEA,YAAYpE,CAAAA,CAAkBC,CAAAA,CAAwB,CAChD6D,CAAAA,GACJD,CAAAA,CAAW,MAAA,CAAO,CAAE,IAAA,CAAM,mBAAA,CAAqB,QAAA,CAAA7D,CAAAA,CAAU,MAAA,CAAAC,CAAAA,CAAQ,UAAW,IAAI,IAAA,EAAK,CAAE,WAAA,EAAc,CAAC,EACtGmE,CAAAA,EAAM,EACR,CAAA,CAEA,cAAA,CAAepE,CAAAA,CAAkBC,CAAAA,CAAwB,CACnD6D,CAAAA,GACJD,CAAAA,CAAW,OAAO,CAAE,IAAA,CAAM,uBAAwB,QAAA,CAAA7D,CAAAA,CAAU,MAAA,CAAAC,CAAAA,CAAQ,SAAA,CAAW,IAAI,MAAK,CAAE,WAAA,EAAc,CAAC,CAAA,CACzGmE,CAAAA,IACF,CAAA,CAEA,eAAA,CAAgB1E,CAAAA,CAAc4F,CAAAA,CAAyB,CACrDtB,CAAAA,CAAS,IAAItE,CAAAA,CAAM4F,CAAE,EACvB,CAAA,CAEA,iBAAA,CAAkB5F,CAAAA,CAAoB,CACpCsE,CAAAA,CAAS,MAAA,CAAOtE,CAAI,EACtB,CAAA,CAEA,SAAA,CAAUjD,EAAwB,CAC5BqH,CAAAA,EACChF,CAAAA,CAAK,MAAA,CAAO,KAAA,CAAMrC,CAAQ,IAC/BoH,CAAAA,CAAW,MAAA,CAAO,CAChB,IAAA,CAAM,cAAA,CACN,QAAA,CAAApH,EACA,SAAA,CAAW,IAAI,IAAA,EAAK,CAAE,WAAA,EACxB,CAAC,CAAA,CACD2H,CAAAA,EAAM,EACR,CAAA,CAEA,YAAA,CAAamB,CAAAA,CAA2B,CACtC,GAAI,CAAAzB,CAAAA,CACJ,CAAA,IAAA,IAAWpE,CAAAA,IAAQ6F,CAAAA,CACZzG,EAAK,MAAA,CAAO,KAAA,CAAMY,CAAI,CAAA,EAC3BmE,CAAAA,CAAW,MAAA,CAAO,CAChB,IAAA,CAAM,cAAA,CACN,QAAA,CAAUnE,CAAAA,CACV,SAAA,CAAW,IAAI,MAAK,CAAE,WAAA,EACxB,CAAC,CAAA,CAEH0E,CAAAA,IACF,CAAA,CAEA,QAAA,EAA8B,CAC5B,OAAO/D,EAAAA,CAASvB,CAAI,CACtB,CAAA,CAEA,QAAA,EAAsB,CACpB,OAAOA,CACT,CAAA,CAEA,aAA8B,CAC5B,OAAO4B,GAAS5B,CAAI,CACtB,EAEA,MAAM,eAAA,EAAiC,CACjCiF,CAAAA,CAAgB,IAAA,CAAO,CAAA,EACzB,MAAM,OAAA,CAAQ,UAAA,CAAW,CAAC,GAAGA,CAAe,CAAC,EAEjD,CAAA,CAEA,MAAM,OAAA,CAAQL,CAAAA,CAA6C,CACrDA,CAAAA,EAAS,MAAQK,CAAAA,CAAgB,IAAA,CAAO,CAAA,EAC1C,MAAM,OAAA,CAAQ,UAAA,CAAW,CAAC,GAAGA,CAAe,CAAC,CAAA,CAE/CD,CAAAA,CAAW,KACb,CACF,CACF,CCzTO,SAAS0B,EAAAA,CAAsBxK,CAAAA,CAA2B,CAC/D,OAAO,IAAA,CAAK,SAAA,CAAUA,CAAG,CAC3B,CAMO,SAASyK,GAAkBvK,CAAAA,CAAyB,CACzD,IAAIC,CAAAA,CACJ,GAAI,CACFA,EAAS,IAAA,CAAK,KAAA,CAAMD,CAAC,EACvB,CAAA,KAAQ,CACN,MAAM,IAAI,KAAA,CAAM,CAAA,uCAAA,EAAqCA,CAAC,CAAA,CAAE,CAC1D,CACA,GACE,OAAOC,CAAAA,EAAW,QAAA,EAClBA,CAAAA,GAAW,IAAA,EACX,OAAQA,CAAAA,CAAmC,QAAA,EAAa,QAAA,EACxD,OAAQA,CAAAA,CAAmC,SAAA,EAAc,SAEzD,MAAM,IAAI,KAAA,CAAM,CAAA,qEAAA,EAAmED,CAAC,CAAA,CAAE,EAExF,OAAOC,CACT,CCzTA,IAAMuK,EAAAA,CAAWC,cAAc,MAAA,CAAA,IAAA,CAAY,GAAG,EAC8BD,EAAAA,CAAS,oBAAoB,ECOzG,IAAMA,EAAAA,CAAWC,cAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA,CACxCC,EAAAA,CAAsEF,EAAAA,CAAS,oBAAoB,EACnGG,EAAAA,CAAcD,EAAAA,CAiDpB,SAASE,EAAAA,CAAQlD,CAAAA,CAAcmD,CAAAA,CAAuB,CACpD,GAAI,CAACA,CAAAA,EAAQ,CAACnD,CAAAA,CAAK,OACnB,IAAMoD,CAAAA,CAAQD,CAAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CACxBE,CAAAA,CAAerD,EACnB,IAAA,IAAS9H,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIkL,CAAAA,CAAM,MAAA,CAAQlL,IAAK,CACrC,GAAImL,CAAAA,EAAO,IAAA,CAAM,OACjBA,CAAAA,CAAOA,EAAgCD,CAAAA,CAAMlL,CAAC,CAAC,EACjD,CACA,OAAOmL,CACT,CAEA,SAASC,EAAAA,CAAQtD,CAAAA,CAA8BmD,CAAAA,CAAcpD,EAAsB,CACjF,IAAMqD,CAAAA,CAAQD,CAAAA,CAAK,KAAA,CAAM,GAAG,EACxBE,CAAAA,CAA+BrD,CAAAA,CACnC,IAAA,IAAS9H,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIkL,EAAM,MAAA,CAAS,CAAA,CAAGlL,CAAAA,EAAAA,CAAAA,CAChCmL,CAAAA,CAAID,CAAAA,CAAMlL,CAAC,CAAC,CAAA,EAAK,IAAA,EAAQ,OAAOmL,CAAAA,CAAID,CAAAA,CAAMlL,CAAC,CAAC,CAAA,EAAM,QAAA,IAAUmL,CAAAA,CAAID,CAAAA,CAAMlL,CAAC,CAAC,EAAI,EAAC,CAAA,CACjFmL,CAAAA,CAAMA,CAAAA,CAAID,CAAAA,CAAMlL,CAAC,CAAC,CAAA,CAEpBmL,CAAAA,CAAID,EAAMA,CAAAA,CAAM,MAAA,CAAS,CAAC,CAAC,CAAA,CAAIrD,EACjC,CAgBA,eAAewD,EAAAA,CAAIC,EAAmB1C,CAAAA,CAA4C,CAChF,GAAI,CAAC0C,CAAAA,EAAM,OAAA,EAAS,OAAQ,OAAOA,CAAAA,CAC9BA,CAAAA,CAAK,SAAA,GAAWA,CAAAA,CAAK,SAAA,CAAY,EAAC,CAAA,CACvCA,CAAAA,CAAK,eAAA,CAAkB,EAAC,CACxBA,CAAAA,CAAK,aAAe1C,CAAAA,EAAS,WAAA,EAAe,EAAC,CAG7C,IAAM2C,CAAAA,CAAYD,EAAK,QAAA,EAAY,EAAC,CAC9BE,CAAAA,CAA+B,CACnC,SAAA,CAAWF,EAAK,SAAA,CAChB,QAAA,CAAUC,CAAAA,CACV,YAAA,CAAcA,CAAAA,CACd,eAAA,CAAiBD,EAAK,YAAA,CACtB,IAAA,CAAMA,CAAAA,CAAK,eAAA,CACX,eAAA,CAAiBA,CAAAA,CAAK,eACxB,CAAA,CAEA,IAAA,IAAWG,CAAAA,IAAQH,CAAAA,CAAK,OAAA,CACtB,GAAI,CACF,IAAMI,CAAAA,CAAM,MAAMZ,EAAAA,CAAQW,CAAAA,CAAK,IAAI,EAAE,QAAA,CAASD,CAAG,CAAA,CACjDJ,EAAAA,CAAQE,CAAAA,CAAK,eAAA,CAAiBG,EAAK,MAAA,CAAQC,CAAG,CAAA,CAC9CF,CAAAA,CAAI,eAAA,CAAkBF,CAAAA,CAAK,gBAE7B,CAAA,MAASK,CAAAA,CAAK,CACZ,OAAA,CAAQ,KAAA,CAAM,CAAA,0BAAA,EAA6BL,EAAK,EAAA,EAAM,GAAG,CAAA,CAAA,EAAIG,CAAAA,CAAK,MAAM,CAAA,EAAA,CAAA,CAAME,CAAG,EACnF,CAGF,OAAOL,CACT,CAcA,SAASM,GACPN,CAAAA,CACA1C,CAAAA,CACuF,CACvF,GAAI,CAAC0C,GAAM,OAAA,EAAS,MAAA,CAAQ,OAAO,CAAE,EAAA,CAAI,IAAA,CAAM,KAAAA,CAAK,CAAA,CAC/CA,CAAAA,CAAK,SAAA,GAAWA,CAAAA,CAAK,SAAA,CAAY,EAAC,CAAA,CACvCA,CAAAA,CAAK,eAAA,CAAkB,EAAC,CACxBA,CAAAA,CAAK,aAAe1C,CAAAA,EAAS,WAAA,EAAe,EAAC,CAE7C,IAAMiD,CAAAA,CAAaP,EAAK,QAAA,EAAY,EAAC,CAC/BE,CAAAA,CAA+B,CACnC,SAAA,CAAWF,EAAK,SAAA,CAChB,QAAA,CAAUO,CAAAA,CACV,YAAA,CAAcA,CAAAA,CACd,eAAA,CAAiBP,EAAK,YAAA,CACtB,IAAA,CAAMA,CAAAA,CAAK,eAAA,CACX,eAAA,CAAiBA,CAAAA,CAAK,eACxB,CAAA,CAEMhB,CAAAA,CAAmD,EAAC,CAC1D,IAAA,IAAWmB,CAAAA,IAAQH,EAAK,OAAA,CACtB,GAAI,CACF,IAAMI,CAAAA,CAAMX,EAAAA,CAAYU,EAAK,IAAI,CAAA,CAAE,QAAA,CAASD,CAAG,CAAA,CAC/CJ,EAAAA,CAAQE,EAAK,eAAA,CAAiBG,CAAAA,CAAK,MAAA,CAAQC,CAAG,CAAA,CAC9CF,CAAAA,CAAI,gBAAkBF,CAAAA,CAAK,gBAE7B,CAAA,MAASK,CAAAA,CAAK,CACZ,IAAMG,EAAMH,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAI,OAAA,CAAU,MAAA,CAAOA,CAAG,EAC3DrB,CAAAA,CAAO,IAAA,CAAK,CAAE,MAAA,CAAQmB,CAAAA,CAAK,MAAA,CAAQ,MAAOK,CAAI,CAAC,CAAA,CAC/C,OAAA,CAAQ,KAAA,CAAM,CAAA,8BAAA,EAAiCR,EAAK,EAAA,EAAM,GAAG,IAAIG,CAAAA,CAAK,MAAM,KAAME,CAAG,EACvF,CAGF,OAAOrB,CAAAA,CAAO,MAAA,CAAS,EAAI,CAAE,EAAA,CAAI,IAAA,CAAM,IAAA,CAAAgB,CAAAA,CAAM,MAAA,CAAAhB,CAAO,CAAA,CAAI,CAAE,EAAA,CAAI,IAAA,CAAM,IAAA,CAAAgB,CAAK,CAC3E,CAMA,eAAeS,EAAAA,CACbC,CAAAA,CACAV,CAAAA,CACAW,CAAAA,CACkB,CAClB,IAAMT,CAAAA,CAA+B,CACnC,GAAIS,CAAAA,EAAQ,GACZ,SAAA,CAAWX,CAAAA,CAAK,SAAA,EAAa,EAAC,CAC9B,QAAA,CAAUA,EAAK,QAAA,EAAY,EAAC,CAC5B,eAAA,CAAiBA,CAAAA,CAAK,YAAA,EAAgB,EAAC,CACvC,eAAA,CAAiBA,CAAAA,CAAK,eAAA,EAAmB,EAC3C,EACA,OAAOR,EAAAA,CAAQkB,CAAI,CAAA,CAAE,QAAA,CAASR,CAAG,CACnC,CAMA,SAASU,EAAAA,CAAQZ,CAAAA,CAAmBL,CAAAA,CAAuB,CACzD,OAAIA,CAAAA,CAAK,UAAA,CAAW,kBAAkB,CAAA,CAC7BD,EAAAA,CAAQM,CAAAA,CAAK,cAAgB,EAAC,CAAGL,CAAAA,CAAK,KAAA,CAAM,EAAyB,CAAC,EAGxED,EAAAA,CAAQM,CAAAA,CAAML,CAAI,CAC3B,CAYA,IAAMkB,GAAsB,IAAI,GAAA,CAAI,CAClC,QAAA,CAAU,OAAA,CAAS,gBAAA,CAAkB,QAAS,MAAA,CAAQ,QAAA,CAAU,MAAA,CAChE,OAAA,CAAS,MAAA,CAAQ,OAAA,CAAS,YAAa,OAAA,CAAS,MAAA,CAChD,WAAY,KAAA,CAAO,QAAA,CAAU,SAC/B,CAAC,CAAA,CAEKC,EAAAA,CAAe,IAAI,GAAA,CAAI,CAAC,KAAM,MAAA,CAAQ,UAAA,CAAY,UAAA,CAAY,MAAA,CAAQ,WAAA,CAAa,SAAA,CAAW,aAAa,CAAC,CAAA,CAElH,SAASC,EAAAA,CAAaf,CAAAA,CAAiC,CACrD,IAAMhB,CAAAA,CAAmB,EAAC,CAE1B,GAAI,CAACgB,CAAAA,EAAQ,OAAOA,CAAAA,EAAS,QAAA,EAAY,KAAA,CAAM,OAAA,CAAQA,CAAI,CAAA,CACzD,OAAO,CAAE,EAAA,CAAI,KAAA,CAAO,MAAA,CAAQ,CAAC,gCAAgC,CAAE,CAAA,CAGjE,IAAM,CAAA,CAAIA,CAAAA,CAAAA,CAEN,OAAO,CAAA,CAAE,IAAO,QAAA,EAAY,CAAC,EAAE,EAAA,GAAIhB,CAAAA,CAAO,KAAK,0CAA0C,CAAA,CAE7F,IAAA,IAAWgC,CAAAA,IAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,CACxBF,EAAAA,CAAa,GAAA,CAAIE,CAAG,CAAA,EAAGhC,CAAAA,CAAO,KAAK,CAAA,wBAAA,EAA2BgC,CAAG,CAAA,CAAA,CAAG,CAAA,CAO3E,GAAA,CAJI,CAAA,CAAE,WAAa,IAAA,EAAQ,OAAO,CAAA,CAAE,SAAA,EAAc,QAAA,EAAY,KAAA,CAAM,QAAQ,CAAA,CAAE,SAAS,CAAA,GACrFhC,CAAAA,CAAO,IAAA,CAAK,wCAAwC,EAGlD,CAAA,CAAE,IAAA,EAAQ,IAAA,CACZ,GAAI,OAAO,CAAA,CAAE,MAAS,QAAA,EAAY,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA,CACpDA,EAAO,IAAA,CAAK,yBAAyB,OAChC,CACL,IAAMiC,EAAO,CAAA,CAAE,IAAA,CACXA,CAAAA,CAAK,KAAA,EAAS,IAAA,EAAQ,OAAOA,EAAK,KAAA,EAAU,QAAA,EAAUjC,CAAAA,CAAO,IAAA,CAAK,8BAA8B,CAAA,CAChGiC,EAAK,IAAA,EAAQ,IAAA,EAAQ,CAAC,KAAA,CAAM,OAAA,CAAQA,CAAAA,CAAK,IAAI,CAAA,EAAGjC,CAAAA,CAAO,IAAA,CAAK,6BAA6B,EAC/F,CAsCF,GAnCI,CAAA,CAAE,QAAA,EAAY,IAAA,EAAQ,CAAC,KAAA,CAAM,OAAA,CAAQ,EAAE,QAAQ,CAAA,EAAGA,CAAAA,CAAO,IAAA,CAAK,uCAAuC,CAAA,CAErG,EAAE,QAAA,EAAY,IAAA,GACX,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,QAAQ,EAG1B,CAAA,CAAE,QAAA,CAAuB,OAAA,CAAQ,CAACpD,CAAAA,CAAGlH,CAAAA,GAAM,CAC1C,GAAI,CAACkH,CAAAA,EAAK,OAAOA,CAAAA,EAAM,QAAA,EAAY,MAAM,OAAA,CAAQA,CAAC,CAAA,CAChDoD,CAAAA,CAAO,IAAA,CAAK,CAAA,SAAA,EAAYtK,CAAC,CAAA,wCAAA,CAA0C,CAAA,CAAA,KAC9D,CACL,IAAMoI,CAAAA,CAAIlB,CAAAA,CAAAA,CACN,OAAOkB,CAAAA,CAAE,MAAA,EAAW,QAAA,EAAY,CAACA,CAAAA,CAAE,MAAA,GAAQkC,EAAO,IAAA,CAAK,CAAA,SAAA,EAAYtK,CAAC,CAAA,mCAAA,CAAqC,CAAA,CAAA,CACzG,OAAOoI,EAAE,GAAA,EAAQ,QAAA,EAAY,CAACA,CAAAA,CAAE,GAAA,GAAKkC,CAAAA,CAAO,KAAK,CAAA,SAAA,EAAYtK,CAAC,CAAA,gCAAA,CAAkC,EACtG,CACF,CAAC,EAVDsK,CAAAA,CAAO,IAAA,CAAK,wDAAwD,CAAA,CAAA,CAepE,CAAA,CAAE,SAAW,IAAA,GACV,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,CAAA,CAGzB,EAAE,OAAA,CAAsB,OAAA,CAAQ,CAACmB,CAAAA,CAAMzL,CAAAA,GAAM,CAC5C,GAAI,CAACyL,CAAAA,EAAQ,OAAOA,CAAAA,EAAS,QAAA,EAAY,KAAA,CAAM,QAAQA,CAAI,CAAA,CACzDnB,CAAAA,CAAO,IAAA,CAAK,CAAA,QAAA,EAAWtK,CAAC,kCAAkC,CAAA,CAAA,KACrD,CACL,IAAM,CAAA,CAAIyL,CAAAA,CAAAA,CACN,OAAO,EAAE,MAAA,EAAW,QAAA,EAAY,CAAC,CAAA,CAAE,MAAA,GAAQnB,CAAAA,CAAO,KAAK,CAAA,QAAA,EAAWtK,CAAC,CAAA,qCAAA,CAAuC,CAAA,CAAA,CAC1G,OAAO,CAAA,CAAE,MAAS,QAAA,EAAY,CAAC,CAAA,CAAE,IAAA,GAAMsK,CAAAA,CAAO,IAAA,CAAK,WAAWtK,CAAC,CAAA,sDAAA,CAAwD,EAC7H,CACF,CAAC,CAAA,CAVDsK,EAAO,IAAA,CAAK,4CAA4C,CAAA,CAAA,CAcxD,CAAA,CAAE,WAAA,EAAe,IAAA,CACnB,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,WAAW,CAAA,CAC9BA,EAAO,IAAA,CAAK,+BAA+B,CAAA,CAAA,KACtC,CACL,IAAMkC,CAAAA,CAAU,IAAI,GAAA,CACdC,CAAAA,CAAc,IAAI,GAAA,CACvB,CAAA,CAAE,WAAA,CAA0B,QAAQ,CAACC,CAAAA,CAAK,CAAA,GAAM,CAC/C,GAAI,CAACA,GAAO,OAAOA,CAAAA,EAAQ,QAAA,EAAY,KAAA,CAAM,OAAA,CAAQA,CAAG,EACtDpC,CAAAA,CAAO,IAAA,CAAK,eAAe,CAAC,CAAA,oBAAA,CAAsB,OAC7C,CACL,IAAMlK,CAAAA,CAAIsM,CAAAA,CACN,OAAOtM,CAAAA,CAAE,QAAW,QAAA,EAAY,CAACA,CAAAA,CAAE,MAAA,CACrCkK,CAAAA,CAAO,IAAA,CAAK,eAAe,CAAC,CAAA,qCAAA,CAAuC,CAAA,EAE/DkC,CAAAA,CAAQ,GAAA,CAAIpM,CAAAA,CAAE,MAAM,CAAA,EACtBkK,CAAAA,CAAO,IAAA,CAAK,CAAA,YAAA,EAAe,CAAC,CAAA,WAAA,EAAclK,EAAE,MAAM,CAAA,kCAAA,CAAoC,CAAA,CAExFoM,CAAAA,CAAQ,GAAA,CAAIpM,CAAAA,CAAE,MAAM,CAAA,CAAA,CAElB,OAAOA,CAAAA,CAAE,UAAA,EAAe,QAAA,EAAY,CAACA,EAAE,UAAA,CACzCkK,CAAAA,CAAO,IAAA,CAAK,CAAA,YAAA,EAAe,CAAC,CAAA,yCAAA,CAA2C,GAEnEmC,CAAAA,CAAY,GAAA,CAAIrM,CAAAA,CAAE,UAAU,CAAA,EAC9BkK,CAAAA,CAAO,KAAK,CAAA,YAAA,EAAe,CAAC,CAAA,eAAA,EAAkBlK,CAAAA,CAAE,UAAU,CAAA,kCAAA,CAAoC,EAEhGqM,CAAAA,CAAY,GAAA,CAAIrM,CAAAA,CAAE,UAAU,CAAA,CAAA,CAE1BA,CAAAA,CAAE,6BAA+B,IAAA,EAAQ,OAAOA,CAAAA,CAAE,2BAAA,EAAgC,SAAA,EACpFkK,CAAAA,CAAO,KAAK,CAAA,YAAA,EAAe,CAAC,CAAA,gDAAA,CAAkD,EAElF,CACF,CAAC,EACH,CAGF,GAAI,CAAA,CAAE,IAAA,EAAQ,IAAA,CACZ,GAAI,OAAO,CAAA,CAAE,IAAA,EAAS,QAAA,EAAY,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA,CACpDA,CAAAA,CAAO,IAAA,CAAK,yBAAyB,CAAA,CAAA,KAChC,CACL,IAAMqC,CAAAA,CAAO,CAAA,CAAE,KACX,CAAC,KAAA,CAAM,QAAQA,CAAAA,CAAK,QAAQ,CAAA,EAAKA,CAAAA,CAAK,QAAA,CAAS,MAAA,GAAW,EAC5DrC,CAAAA,CAAO,IAAA,CAAK,oDAAoD,CAAA,CAE/DqC,CAAAA,CAAK,QAAA,CAAuC,QAAQ,CAACC,CAAAA,CAAM5M,CAAAA,GAAM,CAChE,GAAI,CAAC4M,GAAQ,OAAOA,CAAAA,EAAS,QAAA,CAAU,CAAEtC,CAAAA,CAAO,IAAA,CAAK,iBAAiBtK,CAAC,CAAA,oBAAA,CAAsB,CAAA,CAAG,MAAQ,CACpG,CAAC4M,EAAK,IAAA,EAAQ,OAAOA,CAAAA,CAAK,IAAA,EAAS,QAAA,CACrCtC,CAAAA,CAAO,KAAK,CAAA,cAAA,EAAiBtK,CAAC,CAAA,kCAAA,CAAoC,CAAA,CACxDmM,EAAAA,CAAoB,GAAA,CAAIS,EAAK,IAAc,CAAA,EACrDtC,EAAO,IAAA,CAAK,CAAA,cAAA,EAAiBtK,CAAC,CAAA,sBAAA,EAAyB4M,CAAAA,CAAK,IAAI,CAAA,UAAA,EAAa,CAAC,GAAGT,EAAmB,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA,CAEhHS,EAAK,IAAA,EAAQ,IAAA,GAAS,OAAOA,CAAAA,CAAK,IAAA,EAAS,QAAA,EAAY,MAAM,OAAA,CAAQA,CAAAA,CAAK,IAAI,CAAA,CAAA,EAChFtC,CAAAA,CAAO,IAAA,CAAK,iBAAiBtK,CAAC,CAAA,yBAAA,CAA2B,EAE7D,CAAC,CAAA,CAEC2M,CAAAA,CAAK,QAAU,IAAA,GAAS,OAAOA,CAAAA,CAAK,MAAA,EAAW,QAAA,EAAY,KAAA,CAAM,QAAQA,CAAAA,CAAK,MAAM,CAAA,CAAA,EAAIrC,CAAAA,CAAO,IAAA,CAAK,gCAAgC,EACpIqC,CAAAA,CAAK,QAAA,EAAY,OAAS,OAAOA,CAAAA,CAAK,UAAa,QAAA,EAAY,KAAA,CAAM,OAAA,CAAQA,CAAAA,CAAK,QAAQ,CAAA,CAAA,EAAIrC,EAAO,IAAA,CAAK,kCAAkC,EAClJ,CAGF,OAAO,CAAE,GAAIA,CAAAA,CAAO,MAAA,GAAW,CAAA,CAAG,MAAA,CAAAA,CAAO,CAC3C,CAWA,eAAeuC,EAAAA,CACbC,CAAAA,CACAC,CAAAA,CAMgB,CAChB,GAAI,CAACD,CAAAA,EAAeA,CAAAA,CAAY,MAAA,GAAW,CAAA,CAAG,OAAO,GAErD,IAAME,CAAAA,CAAU,CACd,SAAA,CAAWD,CAAAA,CAAQ,SAAA,EAAa,EAAC,CACjC,QAAA,CAAUA,CAAAA,CAAQ,QAAA,EAAY,EAChC,EAEA,OAAO,OAAA,CAAQ,GAAA,CACbD,CAAAA,CAAY,GAAA,CAAI,MAAOJ,GAAa,CAClC,IAAMO,CAAAA,CAAwC,EAAC,CAC/C,GAAIP,EAAI,WAAA,EAAe,OAAOA,CAAAA,CAAI,WAAA,EAAgB,QAAA,EAAY,CAAC,MAAM,OAAA,CAAQA,CAAAA,CAAI,WAAW,CAAA,CAAA,CAC1F,IAAA,GAAW,CAACJ,EAAKN,CAAI,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQU,CAAAA,CAAI,WAAqC,EAChF,GAAI,OAAOV,CAAAA,EAAS,QAAA,EAAYA,CAAAA,CAAK,IAAA,GAAO,MAAA,CAAS,CAAA,CACnD,GAAI,CACFiB,CAAAA,CAAaX,CAAG,EAAI,MAAMxB,EAAAA,CAAQkB,CAAI,CAAA,CAAE,QAAA,CAASgB,CAAO,EAC1D,CAAA,KAAQ,CACNC,EAAaX,CAAG,CAAA,CAAI,OACtB,CAAA,CAIN,OAAO,CAAE,GAAGI,CAAAA,CAAK,YAAA,CAAAO,CAAa,CAChC,CAAC,CACH,CACF,CAEA,SAASC,GACPJ,CAAAA,CACAC,CAAAA,CAIO,CACP,GAAI,CAACD,CAAAA,EAAeA,EAAY,MAAA,GAAW,CAAA,CAAG,OAAO,EAAC,CAEtD,IAAME,EAAU,CACd,SAAA,CAAWD,CAAAA,CAAQ,SAAA,EAAa,EAAC,CACjC,SAAUA,CAAAA,CAAQ,QAAA,EAAY,EAChC,CAAA,CAEA,OAAOD,EAAY,GAAA,CAAKJ,CAAAA,EAAa,CACnC,IAAMO,CAAAA,CAAwC,GAC9C,GAAIP,CAAAA,CAAI,WAAA,EAAe,OAAOA,CAAAA,CAAI,WAAA,EAAgB,UAAY,CAAC,KAAA,CAAM,OAAA,CAAQA,CAAAA,CAAI,WAAW,CAAA,CAAA,CAC1F,OAAW,CAACJ,CAAAA,CAAKN,CAAI,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQU,EAAI,WAAqC,CAAA,CAChF,GAAI,OAAOV,CAAAA,EAAS,QAAA,EAAYA,EAAK,IAAA,EAAK,CAAE,MAAA,CAAS,CAAA,CACnD,GAAI,CACFiB,EAAaX,CAAG,CAAA,CAAIvB,EAAAA,CAAYiB,CAAI,CAAA,CAAE,QAAA,CAASgB,CAAO,EACxD,CAAA,KAAQ,CACNC,CAAAA,CAAaX,CAAG,CAAA,CAAI,OACtB,CAAA,CAIN,OAAO,CAAE,GAAGI,CAAAA,CAAK,YAAA,CAAAO,CAAa,CAChC,CAAC,CACH,CAEO,IAAME,GAAc,CACzB,GAAA,CAAA9B,EAAAA,CACA,OAAA,CAAAO,EAAAA,CACA,IAAA,CAAMG,GACN,OAAA,CAAAG,EAAAA,CACA,QAAA,CAAUG,EAAAA,CACV,aAAA,CAAAQ,EAAAA,CACA,kBAAAK,EACF,CAAA,CChVO,SAASE,EAAAA,CAAgBC,CAAAA,CAA6BC,CAAAA,CAAgD,CAC3G,SAASC,CAAAA,EAAuB,CAC9B,OAAOF,CAAAA,CAAQ,SAAA,IAAe,EAChC,CAEA,SAASG,CAAAA,CAAc1F,CAAAA,CAA8B2F,EAAkB5F,CAAAA,CAAyC,CAC9G,IAAM6F,CAAAA,CAAW,MAAA,CAAOD,CAAAA,EAAY,EAAE,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,OAAO,EACjE,GAAIC,CAAAA,CAAS,MAAA,GAAW,CAAA,CACtB,OAAQ7F,CAAAA,EAAS,OAAOA,CAAAA,EAAU,QAAA,EAAY,CAAC,KAAA,CAAM,OAAA,CAAQA,CAAK,EAC9DA,CAAAA,CACA,CAAE,KAAA,CAAAA,CAAM,CAAA,CAGd,IAAM8F,EAA+B,CAAE,GAAG7F,CAAI,CAAA,CAC1C8F,CAAAA,CAAkCD,CAAAA,CACtC,QAAS3N,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAI0N,CAAAA,CAAS,MAAA,CAAS,CAAA,CAAG1N,IAAK,CAC5C,IAAMsM,CAAAA,CAAMoB,CAAAA,CAAS1N,CAAC,CAAA,CAChBmL,EAAMyC,CAAAA,CAAOtB,CAAG,CAAA,CAChBuB,CAAAA,CAAQ1C,CAAAA,EAAO,OAAOA,GAAQ,QAAA,EAAY,CAAC,KAAA,CAAM,OAAA,CAAQA,CAAG,CAAA,CAC9D,CAAE,GAAIA,CAAgC,EACtC,EAAC,CACLyC,EAAOtB,CAAG,CAAA,CAAIuB,CAAAA,CACdD,CAAAA,CAASC,EACX,CACA,OAAAD,CAAAA,CAAOF,CAAAA,CAASA,CAAAA,CAAS,MAAA,CAAS,CAAC,CAAC,EAAI7F,CAAAA,CACjC8F,CACT,CAEA,OAAO,CACL,QAAA,CAAS7J,EAA6B,CACpC,IAAMgK,CAAAA,CAAQP,CAAAA,EAAU,CAAEzJ,CAAE,EAC5B,OAAI,CAACgK,CAAAA,EAAS,CAACT,CAAAA,CAAQ,UAAA,CAAWS,EAAM,GAAG,CAAA,CAAU,IAAA,CAC9CT,CAAAA,CAAQ,QAAA,CAASS,CAAAA,CAAM,GAAG,CACnC,CAAA,CAEA,WAAA,CAAYhK,CAAAA,CAA2B,CACrC,OAAOyJ,GAAU,CAAEzJ,CAAE,GAAG,GAAA,EAAO,IACjC,EAEA,YAAA,EAA2B,CACzB,IAAMiK,CAAAA,CAAoB,EAAC,CAC3B,OAAW,CAACjK,CAAAA,CAAIgK,CAAK,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQP,GAAW,CAAA,CAAG,CACrD,GAAI,CAACF,CAAAA,CAAQ,WAAWS,CAAAA,CAAM,GAAG,CAAA,CAAG,SACpC,IAAME,CAAAA,CAAOX,EAAQ,QAAA,CAASS,CAAAA,CAAM,GAAG,CAAA,CACnCE,CAAAA,CAAMD,CAAAA,CAAM,KAAKC,CAAI,CAAA,CACpBV,CAAAA,GAAS,CAAA,kCAAA,EAAqCxJ,CAAE,CAAA,UAAA,EAAagK,EAAM,GAAG,CAAA,CAAA,CAAG,EAChF,CACA,OAAOC,CACT,EAEA,iBAAA,EAAuC,CACrC,IAAMlL,CAAAA,CAA4B,GAClC,IAAA,GAAW,CAACiB,CAAAA,CAAIgK,CAAK,CAAA,GAAK,MAAA,CAAO,QAAQP,CAAAA,EAAW,CAAA,CAAG1K,CAAAA,CAAOiB,CAAE,CAAA,CAAIgK,EAAM,QAAA,CAC1E,OAAOjL,CACT,CAAA,CAEA,YAAA,CAAaoL,CAAAA,CAAoD,CAC/D,IAAMC,CAAAA,CAAaX,CAAAA,EAAU,CACvBY,CAAAA,CAAoB,GAC1B,IAAA,GAAW,CAACrK,CAAAA,CAAIgK,CAAK,CAAA,GAAK,MAAA,CAAO,QAAQI,CAAU,CAAA,CAC7CD,CAAAA,CAAsBnK,CAAE,CAAA,GAAMgK,CAAAA,CAAM,UAAUK,CAAAA,CAAQ,IAAA,CAAKrK,CAAE,CAAA,CAEnE,IAAA,IAAWA,CAAAA,IAAM,OAAO,IAAA,CAAKmK,CAAqB,CAAA,CAC3CC,CAAAA,CAAWpK,CAAE,CAAA,EAAGqK,EAAQ,IAAA,CAAKrK,CAAE,CAAA,CAEtC,OAAOqK,CACT,CAAA,CAEA,eAAerK,CAAAA,CAAYsK,CAAAA,CAAuC,CAChE,IAAMC,CAAAA,CAAQd,CAAAA,GACRe,CAAAA,CAAeD,CAAAA,CAAMvK,CAAE,CAAA,CACvByK,CAAAA,CAAgB,MAAA,CAAO,QAAQF,CAAK,CAAA,CAAE,IAAA,CAAK,CAAC,EAAGG,CAAC,CAAA,GAAMA,CAAAA,CAAE,GAAA,GAAQJ,CAAO,CAAA,CAC7E,OAAIE,GAAgBA,CAAAA,CAAa,GAAA,GAAQF,CAAAA,CAChC,CAAE,EAAA,CAAI,KAAA,CAAO,MAAO,CAAA,SAAA,EAAYtK,CAAE,CAAA,4BAAA,EAA+BwK,CAAAA,CAAa,GAAG,CAAA,oBAAA,EAAuBF,CAAO,CAAA,CAAA,CAAI,CAAA,CACxHG,GAAiBA,CAAAA,CAAc,CAAC,IAAMzK,CAAAA,CACjC,CAAE,EAAA,CAAI,KAAA,CAAO,KAAA,CAAO,CAAA,KAAA,EAAQsK,CAAO,CAAA,gCAAA,EAAmCG,CAAAA,CAAc,CAAC,CAAC,CAAA,oBAAA,EAAuBzK,CAAE,GAAI,CAAA,CACrH,CAAE,EAAA,CAAI,IAAK,CACpB,CAAA,CAEA,UAAUA,CAAAA,CAAYkK,CAAAA,CAAgBI,CAAAA,CAAwB,CAC5D,IAAMC,CAAAA,CAAQd,GAAU,CAClBkB,CAAAA,CAAcL,CAAAA,EAAWC,CAAAA,CAAMvK,CAAE,CAAA,EAAG,KAAOuJ,CAAAA,CAAQ,cAAA,CAAevJ,CAAE,CAAA,CACpE4K,CAAAA,CAAWrB,CAAAA,CAAQ,UAAUoB,CAAAA,CAAaT,CAAI,CAAA,CACpDK,CAAAA,CAAMvK,CAAE,CAAA,CAAI,CAAE,GAAA,CAAK2K,CAAAA,CAAa,QAAA,CAAAC,CAAAA,CAAU,SAAA,CAAW,IAAI,MAAK,CAAE,WAAA,EAAc,CAAA,CAC9ErB,CAAAA,CAAQ,UAAA,CAAWgB,CAAK,EAC1B,CAAA,CAEA,SAAA,CAAUvK,CAAAA,CAAY2J,CAAAA,CAAkB5F,CAAAA,CAAsB,CAC5D,IAAMwG,CAAAA,CAAQd,CAAAA,EAAU,CAClBO,CAAAA,CAAQO,CAAAA,CAAMvK,CAAE,CAAA,CACtB,GAAI,CAACgK,CAAAA,EAAS,CAACT,CAAAA,CAAQ,WAAWS,CAAAA,CAAM,GAAG,CAAA,CACzC,MAAM,IAAI,KAAA,CAAM,SAAShK,CAAE,CAAA,WAAA,CAAa,CAAA,CAE1C,IAAMa,CAAAA,CAAU0I,CAAAA,CAAQ,SAASS,CAAAA,CAAM,GAAG,CAAA,CAC1C,GAAI,CAACnJ,CAAAA,EAAW,OAAOA,CAAAA,EAAY,QAAA,EAAY,MAAM,OAAA,CAAQA,CAAO,EAClE,MAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAASb,CAAE,CAAA,kBAAA,CAAoB,EAEjD,IAAM+J,CAAAA,CAAOL,CAAAA,CAAc7I,CAAAA,CAAoC8I,CAAAA,CAAU5F,CAAK,EACxE6G,CAAAA,CAAWrB,CAAAA,CAAQ,SAAA,CAAUS,CAAAA,CAAM,GAAA,CAAKD,CAAI,EAClDQ,CAAAA,CAAMvK,CAAE,CAAA,CAAI,CAAE,GAAA,CAAKgK,CAAAA,CAAM,IAAK,QAAA,CAAAY,CAAAA,CAAU,SAAA,CAAW,IAAI,IAAA,EAAK,CAAE,aAAc,CAAA,CAC5ErB,CAAAA,CAAQ,UAAA,CAAWgB,CAAK,EAC1B,EAEA,UAAA,CAAWvK,CAAAA,CAAkB,CAC3B,IAAMuK,CAAAA,CAAQd,CAAAA,GACTc,CAAAA,CAAMvK,CAAE,CAAA,GACb,OAAOuK,CAAAA,CAAMvK,CAAE,EACfuJ,CAAAA,CAAQ,UAAA,CAAWgB,CAAK,CAAA,EAC1B,CAAA,CAEA,SAAA,EAAuB,CACrB,OAAOd,CAAAA,EACT,CACF,CACF,CAiBO,SAASoB,EAAAA,CACdC,CAAAA,CACAC,CAAAA,CACqB,CACrB,OAAO,CACL,eAAeC,CAAAA,CAAQC,CAAAA,CAAqB,CAC1C,IAAMxP,CAAAA,CAAMqP,CAAAA,CAAK,KAAK,CAAA,EAAGE,CAAM,CAAA,CAAA,EAAIC,CAAU,CAAA,CAAE,CAAA,CAC/C,GAAIxP,CAAAA,EAAO,IAAA,CAAM,OAAO,IAAA,CACxB,IAAMyP,CAAAA,CAAUzP,EAAI,IAAA,EAAK,CACzB,GAAI,CAACyP,CAAAA,CAAS,OAAO,KACrB,GAAI,CAAE,OAAO,IAAA,CAAK,KAAA,CAAMA,CAAO,CAAG,CAAA,KAAQ,CAAE,OAAOA,CAAS,CAC9D,EACA,sBAAA,CAAuBF,CAAAA,CAAQC,CAAAA,CAAY7O,CAAAA,CAAK+O,CAAAA,CAAqB,CACnE,IAAMC,CAAAA,CAAUL,CAAAA,CAAW3O,CAAG,CAAA,CAC9B0O,CAAAA,CAAK,KAAA,CAAM,GAAGE,CAAM,CAAA,SAAA,EAAYG,CAAa,CAAA,CAAA,EAAIF,CAAU,CAAA,CAAA,CAAIG,CAAO,EACxE,CAAA,CACA,gBAAA,CAAiBJ,CAAAA,CAAQC,CAAAA,CAAYE,CAAAA,CAAwB,CAC3D,IAAME,CAAAA,CAAY,CAAA,EAAGL,CAAM,CAAA,SAAA,EAAYG,CAAa,IAAIF,CAAU,CAAA,CAAA,CAC5DG,CAAAA,CAAUN,CAAAA,CAAK,IAAA,CAAKO,CAAS,EACnC,OAAID,CAAAA,EAAW,KAAa,KAAA,EAC5BN,CAAAA,CAAK,MAAM,CAAA,EAAGE,CAAM,CAAA,CAAA,EAAIC,CAAU,CAAA,CAAA,CAAIG,CAAO,EAC7CN,CAAAA,CAAK,MAAA,CAAOO,CAAS,CAAA,CACd,IAAA,CACT,CAAA,CACA,UAAUL,CAAAA,CAAQC,CAAAA,CAAqB,CACrC,OAAOH,CAAAA,CAAK,MAAA,CAAO,GAAGE,CAAM,CAAA,CAAA,EAAIC,CAAU,CAAA,CAAE,CAC9C,CACF,CACF,CA0BO,SAASK,EAAAA,CAAmB/B,CAAAA,CAAmD,CACpF,SAASgC,EAAmBC,CAAAA,CAAgC,CAC1D,IAAMC,CAAAA,CAAMlC,CAAAA,CAAQ,cAAA,GACpB,GAAI,CAACiC,CAAAA,CAAQ,OAAOC,CAAAA,CACpB,IAAMC,EAAMD,CAAAA,CAAI,SAAA,CAAUf,GAAKA,CAAAA,CAAE,EAAA,GAAOc,CAAM,CAAA,CAC9C,OAAOE,CAAAA,GAAQ,EAAA,CAAKD,CAAAA,CAAMA,CAAAA,CAAI,MAAMC,CAAAA,CAAM,CAAC,CAC7C,CAEA,OAAO,CACL,uBAAuBF,CAAAA,CAA6D,CAClF,IAAMG,CAAAA,CAAUJ,CAAAA,CAAmBC,CAAM,EACzC,OAAIG,CAAAA,CAAQ,MAAA,GAAW,CAAA,CAAU,CAAE,MAAA,CAAQ,EAAC,CAAG,SAAA,CAAWH,CAAO,CAAA,CAC1D,CAAE,MAAA,CAAQG,EAAQ,GAAA,CAAIjB,CAAAA,EAAKA,CAAAA,CAAE,KAAK,CAAA,CAAG,SAAA,CAAWiB,EAAQA,CAAAA,CAAQ,MAAA,CAAS,CAAC,CAAA,CAAE,EAAG,CACxF,EAEA,YAAA,CAAaH,CAAAA,CAAwB,CACnC,OAAOD,CAAAA,CAAmBC,CAAM,EAAE,MACpC,CAAA,CAEA,WAAA,CAAYrL,CAAAA,CAAyB,CACnCoJ,CAAAA,CAAQ,YAAY,CAAE,EAAA,CAAIA,CAAAA,CAAQ,UAAA,EAAW,CAAG,KAAA,CAAApJ,CAAM,CAAC,EACzD,CACF,CACF,CAgBO,SAASyL,GACdC,CAAAA,CACAC,CAAAA,CACuB,CACvB,OAAO,CACL,aAAA,CAAcC,EAAmBJ,CAAAA,CAAwC,CACvE,GAAI,CAACI,CAAAA,EAAaJ,CAAAA,CAAQ,SAAW,CAAA,CAAG,OACxC,IAAMK,CAAAA,CAAYH,CAAAA,CAAG,IAAA,CAAKE,CAAS,CAAA,EAAwC,EAAC,CAC5EF,CAAAA,CAAG,KAAA,CAAME,CAAAA,CAAW,CAAC,GAAGC,CAAAA,CAAU,GAAGL,CAAO,CAAC,EAC/C,CAAA,CAEA,2BAAA,CAA4BI,CAAAA,CAAmBE,CAAAA,CAA2D,CACxG,GAAI,CAACF,CAAAA,CAAW,OAChB,IAAMJ,CAAAA,CAAUE,CAAAA,CAAG,IAAA,CAAKE,CAAS,CAAA,CACjC,GAAI,EAAA,CAACJ,CAAAA,EAAWA,CAAAA,CAAQ,MAAA,GAAW,GACnC,CAAA,IAAA,IAAW3B,CAAAA,IAAS2B,CAAAA,CAClB,GAAI,CAAEM,CAAAA,CAAYjC,CAAK,EAAG,CAAA,MAASnC,CAAAA,CAAK,CACtC,IAAMG,CAAAA,CAAMH,aAAe,KAAA,CAAQA,CAAAA,CAAI,OAAA,CAAU,MAAA,CAAOA,CAAG,CAAA,CAC3D,GAAI,CAAEiE,CAAAA,CAAiB9B,CAAAA,CAAOhC,CAAG,EAAG,CAAA,KAAQ,CAA+C,CAC7F,CAEF6D,CAAAA,CAAG,MAAA,CAAOE,CAAS,EAAA,CACrB,CACF,CACF,CAMO,IAAMG,EAAAA,CAA6B,IAAA,CAE7BC,EAAAA,CAAkB,cAClBC,EAAAA,CAAsC,8BAAA,CAE5C,SAASC,EAAAA,CAAerB,CAAAA,CAAwB,CACrD,OAAO,CAAA,MAAA,EAASA,CAAM,CAAA,QAAA,CACxB,CAgBO,SAASsB,EAAAA,CAAuBT,EAAiC,CACtE,OAAO,CACL,WAAA,CAAYb,CAAAA,CAAQ,CAClB,OAAQa,CAAAA,CAAG,IAAA,CAAKQ,EAAAA,CAAerB,CAAM,CAAC,CAAA,EAAoC,CAAE,QAAA,CAAU,EAAG,CAC3F,CAAA,CACA,YAAA,CAAaA,EAAQ5M,CAAAA,CAAO,CAC1ByN,CAAAA,CAAG,KAAA,CAAMQ,EAAAA,CAAerB,CAAM,EAAG5M,CAAK,EACxC,CACF,CACF,CAkDO,SAASmO,EAAAA,CACd1L,CAAAA,CACA2L,CAAAA,CACyB,CACzB,IAAMzC,CAAAA,CAAgC,CAAE,GAAGlJ,CAAQ,CAAA,CACnD,IAAA,IAAW2H,CAAAA,IAAOgE,CAAAA,CAAS,WACzB,OAAOzC,CAAAA,CAAKvB,CAAG,CAAA,CAEjB,OAAO,CAAE,GAAGuB,CAAAA,CAAM,GAAGyC,CAAAA,CAAS,YAAa,CAC7C,CAEO,SAASC,EAAAA,CAAyBlD,CAAAA,CAA0D,CACjG,OAAO,CACL,YAAA,CAAamD,EAAwC,CACnD,OAAOnD,CAAAA,CAAQ,UAAA,CAAWmD,CAAO,CACnC,EAEA,cAAA,CAAeA,CAAAA,CAAiBF,CAAAA,CAAkE,CAChG,GAAIA,CAAAA,CAAS,gBAAkBN,EAAAA,CAC7B,MAAM,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAwCM,CAAAA,CAAS,aAAa,CAAA,CAAE,CAAA,CAElF,IAAM3L,CAAAA,CAAU0I,CAAAA,CAAQ,UAAA,CAAWmD,CAAO,CAAA,CAC1C,GAAI7L,CAAAA,CAAQ,OAAA,GAAY2L,CAAAA,CAAS,eAAA,CAC/B,OAAO,CAAE,EAAA,CAAI,KAAA,CAAO,MAAA,CAAQ,kBAAA,CAAoB,cAAA,CAAgB3L,EAAQ,OAAQ,CAAA,CAElF,IAAM8L,CAAAA,CAAaJ,EAAAA,CAAiC1L,CAAAA,CAAQ,OAAQ2L,CAAQ,CAAA,CAE5E,OAAO,CAAE,EAAA,CAAI,IAAA,CAAM,WADAjD,CAAAA,CAAQ,WAAA,CAAYmD,CAAAA,CAASC,CAAAA,CAAYH,CAAAA,CAAS,UAAU,CACjD,CAChC,CACF,CACF,CAqBO,SAASI,EAAAA,CAAuBf,EAAiC,CACtE,SAASgB,EAAQrE,CAAAA,CAA4B,CAC3C,IAAMsE,CAAAA,CAAIjB,CAAAA,CAAG,IAAA,CAAKrD,CAAG,CAAA,CACrB,OAAIsE,GAAK,IAAA,CAAa,IAAA,CACf,OAAOA,CAAAA,EAAM,QAAA,CAAWA,CAAAA,CAAI,KAAK,SAAA,CAAUA,CAAC,CACrD,CAEA,OAAO,CACL,qBAAgD,CAC9C,IAAMrR,CAAAA,CAAMoR,CAAAA,CAAQ,eAAe,CAAA,CACnC,GAAKpR,CAAAA,EAAK,IAAA,EAAK,CACf,OAAOoL,EAAAA,CAAkBpL,CAAAA,CAAI,MAAM,CACrC,CAAA,CAEA,oBAAA,CAAqBW,CAAAA,CAAyB,CAC5CyP,EAAG,KAAA,CAAM,eAAA,CAAiBjF,EAAAA,CAAsBxK,CAAG,CAAC,EACtD,EAEA,kBAAA,EAA+C,CAC7C,IAAMX,CAAAA,CAAMoR,CAAAA,CAAQ,cAAc,CAAA,CAClC,GAAKpR,CAAAA,EAAK,IAAA,EAAK,CACf,OAAOoL,GAAkBpL,CAAAA,CAAI,IAAA,EAAM,CACrC,CAAA,CAEA,mBAAA,CAAoBW,EAAyB,CAC3CyP,CAAAA,CAAG,KAAA,CAAM,cAAA,CAAgBjF,EAAAA,CAAsBxK,CAAG,CAAC,EACrD,CAAA,CAEA,gBAAA,EAAkC,CAChC,OAAOyQ,CAAAA,CAAQ,gBAAgB,CACjC,CAAA,CAEA,iBAAA,CAAkBzQ,CAAAA,CAAmB,CACnCyP,CAAAA,CAAG,MAAM,gBAAA,CAAkBzP,CAAG,EAChC,CAAA,CAEA,mBAAA,EAAqC,CACnC,OAAOyQ,CAAAA,CAAQ,mBAAmB,CACpC,CAAA,CAEA,oBAAA,CAAqBzQ,CAAAA,CAAmB,CACtCyP,CAAAA,CAAG,KAAA,CAAM,oBAAqBzP,CAAG,EACnC,EAEA,eAAA,EAAsC,CACpC,OAAOyQ,CAAAA,CAAQ,cAAc,CAAA,EAAG,MAAK,EAAK,MAC5C,CAAA,CAEA,gBAAA,CAAiB9I,CAAAA,CAAqB,CACpC8H,EAAG,KAAA,CAAM,cAAA,CAAgB9H,CAAK,EAChC,CACF,CACF,CAsBO,SAASgJ,EAAAA,CAA4BlB,CAAAA,CAAsC,CAChF,OAAO,CACL,oBAAoBb,CAAAA,CAAQgC,CAAAA,CAAQ,CAClCnB,CAAAA,CAAG,KAAA,CAAM,CAAA,MAAA,EAASb,CAAM,CAAA,gBAAA,CAAA,CAAoBgC,CAAM,EACpD,CAAA,CACA,kBAAA,CAAmBhC,CAAAA,CAAQ,CAAE,OAAOa,CAAAA,CAAG,IAAA,CAAK,CAAA,MAAA,EAASb,CAAM,CAAA,gBAAA,CAAkB,CAAG,CAAA,CAChF,qBAAA,EAAwB,CACtB,IAAMnB,CAAAA,CAA+B,GACrC,IAAA,IAAWrB,CAAAA,IAAOqD,CAAAA,CAAG,QAAA,CAAS,QAAQ,CAAA,CAAG,CACvC,IAAMoB,CAAAA,CAAIzE,CAAAA,CAAI,KAAA,CAAM,mCAAmC,CAAA,CACnDyE,IAAGpD,CAAAA,CAAIoD,CAAAA,CAAE,CAAC,CAAC,CAAA,CAAIpB,CAAAA,CAAG,KAAKrD,CAAG,CAAA,EAChC,CACA,OAAOqB,CACT,CAAA,CACA,iBAAiB5K,CAAAA,CAAM,CACrB,IAAA,GAAW,CAACR,CAAAA,CAAOiG,CAAO,IAAK,MAAA,CAAO,OAAA,CAAQzF,CAAI,CAAA,CAC3CR,CAAAA,EACLoN,CAAAA,CAAG,MAAM,CAAA,aAAA,EAAgBpN,CAAK,CAAA,CAAA,CAAIiG,CAAO,EAE7C,CAAA,CACA,eAAe8D,CAAAA,CAAK,CAAE,OAAOqD,CAAAA,CAAG,IAAA,CAAK,gBAAgBrD,CAAG,CAAA,CAAE,CAAG,CAAA,CAC7D,kBAAA,EAAqB,CACnB,IAAMqB,CAAAA,CAA+B,EAAC,CACtC,IAAA,IAAWrB,CAAAA,IAAOqD,CAAAA,CAAG,SAAS,eAAe,CAAA,CAC3ChC,CAAAA,CAAIrB,CAAAA,CAAI,KAAA,CAAM,EAAsB,CAAC,CAAA,CAAIqD,CAAAA,CAAG,IAAA,CAAKrD,CAAG,CAAA,CAEtD,OAAOqB,CACT,CAAA,CACA,mBAAA,CAAoBqD,CAAAA,CAAQ,CAC1BrB,CAAAA,CAAG,KAAA,CAAM,SAAUqB,CAAM,EAC3B,CAAA,CACA,kBAAA,EAAqB,CAAE,OAAOrB,EAAG,IAAA,CAAK,QAAQ,CAAG,CACnD,CACF,CAuCO,SAASsB,EAAAA,CAAiBnD,CAAAA,CAA+C,CAC9E,OAAKA,CAAAA,EAAO,eAAA,CACL,CAACA,CAAAA,CAAM,aAAA,EAAiBA,CAAAA,CAAM,aAAA,CAAgBA,CAAAA,CAAM,eAAA,CADvB,KAEtC,CAEO,SAASoD,EAAAA,CACdpD,CAAAA,CACAqD,CAAAA,CACmC,CACnC,OAAKrD,CAAAA,EAAO,eAAA,CACKmD,EAAAA,CAAiBnD,CAAK,CAAA,CAClB,WAAA,CACjB,CAACA,CAAAA,CAAM,aAAA,EACPA,CAAAA,CAAM,aAAA,CAAgBqD,CAAAA,CAAyB,UAAA,CAC5C,OAL6B,UAMtC,CAEO,SAASC,EAAAA,CACdtD,CAAAA,CACAuD,CAAAA,CACG,CACH,IAAMxD,CAAAA,CAAO,CAAE,GAAGC,CAAAA,CAAO,aAAA,CAAeuD,CAAU,CAAA,CAClD,OAAA,OAAQxD,CAAAA,CAA2B,SAAA,CAC5BA,CACT,CAEO,SAASyD,EAAAA,CACdxD,CAAAA,CACAyD,EACG,CACH,IAAM1D,EAAO,CAAE,GAAGC,CAAAA,CAAO,SAAA,CAAWyD,CAAO,CAAA,CAC3C,cAAQ1D,CAAAA,CAA2B,aAAA,CAC5BA,CACT,CA+FO,SAAS2D,EAAAA,CAAuBC,EAAmBzN,CAAAA,CAAoC,CAC5F,IAAM7C,CAAAA,CAAY6C,CAAAA,CAAK,KAAA,CAAM,MACvB3C,CAAAA,CAAa2C,CAAAA,CAAK,MAAA,CAAO,KAAA,CACzB0N,CAAAA,CAAY,MAAA,CAAO,KAAKvQ,CAAS,CAAA,CACjCwQ,CAAAA,CAAQ/L,EAAAA,CAAS5B,CAAI,CAAA,CAErB4N,EAAe,CACnB,SAAA,CAAW,CAAA,CACX,MAAA,CAAQ,CAAA,CACR,WAAA,CAAa,EACb,OAAA,CAAS,CAAA,CACT,OAAA,CAAS,CAAA,CACT,UAAA,CAAY,CACd,EAEMC,CAAAA,CAAgB,IAAI,GAAA,CAC1B,IAAA,IAAW3K,CAAAA,IAAKyK,CAAAA,CAAM,QAASE,CAAAA,CAAc,GAAA,CAAI3K,CAAAA,CAAE,QAAA,CAAUA,CAAAA,CAAE,SAAS,EACxE,IAAA,IAAW4K,CAAAA,IAAKH,CAAAA,CAAM,UAAA,CAAYE,CAAAA,CAAc,GAAA,CAAIC,EAAE,QAAA,CAAUA,CAAAA,CAAE,aAAa,CAAA,CAC/E,IAAA,IAAW1J,CAAAA,IAAKuJ,EAAM,OAAA,CAASE,CAAAA,CAAc,GAAA,CAAIzJ,CAAAA,CAAE,QAAA,CAAUA,CAAAA,CAAE,YAAY,CAAA,CAE3E,IAAM2J,CAAAA,CAAoB,IAAI,GAAA,CAC9B,IAAA,GAAW,CAACnN,CAAAA,CAAMoF,CAAG,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQ3I,CAAU,EACjD,IAAA,IAAWkB,CAAAA,IAASyH,CAAAA,CAAI,QAAA,EAAY,EAAC,CAAG,CACtC,IAAMgI,CAAAA,CAAaD,EAAkB,GAAA,CAAIxP,CAAK,GAAK,EAAC,CACpDyP,CAAAA,CAAW,IAAA,CAAKpN,CAAI,CAAA,CACpBmN,EAAkB,GAAA,CAAIxP,CAAAA,CAAOyP,CAAU,EACzC,CAGF,IAAMjE,EAA2B2D,CAAAA,CAAU,IAAA,EAAK,CAAE,GAAA,CAAK9M,CAAAA,EAAS,CAC9D,IAAM1C,CAAAA,CAAQf,CAAAA,CAAUyD,CAAI,CAAA,CAWtBoF,CAAAA,CAAM3I,CAAAA,CAAWuD,CAAI,CAAA,EAAK,CAAE,QAAA,CAAU,EAAC,CAAG,QAAA,CAAU,EAAG,CAAA,CAEzD1C,CAAAA,CAAM,MAAA,GAAW,WAAA,CAAa0P,CAAAA,CAAa,WAAa,CAAA,CACnD1P,CAAAA,CAAM,MAAA,GAAW,QAAA,CAAU0P,CAAAA,CAAa,MAAA,EAAU,EAClD1P,CAAAA,CAAM,MAAA,GAAW,gBAAe0P,CAAAA,CAAa,WAAA,EAAe,GAErE,IAAMtP,CAAAA,CAAW0H,CAAAA,CAAI,QAAA,EAAY,EAAC,CAC5BiI,EAAWjI,CAAAA,CAAI,QAAA,EAAY,EAAC,CAC5BkI,CAAAA,CAAc,MAAA,CAAO,KAAKhQ,CAAAA,CAAM,IAAA,EAAQ,EAAE,CAAA,CAAE,IAAA,GAC5CiQ,CAAAA,CAAoB7P,CAAAA,CAAS,MAAA,CAAOC,CAAAA,EAASyB,CAAAA,CAAK,KAAA,CAAM,iBAAiB,QAAA,CAASzB,CAAK,CAAC,CAAA,CACxF6P,CAAAA,CAAkB9P,CAAAA,CAAS,OAAOC,CAAAA,EAAS,CAACyB,CAAAA,CAAK,KAAA,CAAM,gBAAA,CAAiB,QAAA,CAASzB,CAAK,CAAC,CAAA,CACvF8P,CAAAA,CAAYR,CAAAA,CAAc,GAAA,CAAIjN,CAAI,GAAKwN,CAAAA,CAEvCE,CAAAA,CAAW,IAAI,GAAA,CACrB,IAAA,IAAW/P,KAAS0P,CAAAA,CAClB,IAAA,IAAWM,CAAAA,IAAaR,CAAAA,CAAkB,GAAA,CAAIxP,CAAK,GAAK,EAAC,CACnDgQ,CAAAA,GAAc3N,CAAAA,EAAM0N,CAAAA,CAAS,GAAA,CAAIC,CAAS,CAAA,CAIlD,IAAMC,CAAAA,CAAgBtQ,CAAAA,CAAM,QAAA,CACtBkB,CAAAA,CAAQlB,EAAM,KAAA,CAChB,CACE,OAAA,CAASA,CAAAA,CAAM,KAAA,CACf,IAAA,CAAM,cACN,EAAA,CAAIsQ,CAAAA,CACJ,MAAA,CAAQ,cACV,CAAA,CACA,MAAA,CAEJ,OAAO,CACL,IAAA,CAAA5N,CAAAA,CACA,MAAA,CAAQ1C,CAAAA,CAAM,MAAA,CACd,MAAAkB,CAAAA,CACA,QAAA,CAAAd,CAAAA,CACA,kBAAA,CAAoB6P,CAAAA,CACpB,gBAAA,CAAkBC,EAClB,iBAAA,CAAmBH,CAAAA,CACnB,gBAAA,CAAkBC,CAAAA,CAClB,UAAA,CAAYG,CAAAA,CACZ,SAAU,KAAA,CAAM,IAAA,CAAKC,CAAQ,CAAA,CAAE,IAAA,EAAK,CACpC,QAAS,CACP,aAAA,CAAepQ,CAAAA,CAAM,cAAA,EAAkB,CAAA,CACvC,aAAA,CAAeA,EAAM,UAAA,EAAc,CAAA,CACnC,iBAAA,CAAmBA,CAAAA,CAAM,MAAA,GAAW,aAAA,CAAiBA,EAAM,SAAA,EAAa,IAAA,CAAQ,IAAA,CAChF,kBAAA,CAAoBA,CAAAA,CAAM,WAAA,EAAe,KACzC,iBAAA,CAAmBA,CAAAA,CAAM,WAAA,EAAe,IAAA,CACxC,iBAAA,CAAmBA,CAAAA,CAAM,WAAa,IAAA,CAEtC,aAAA,CAAeA,CAAAA,CAAM,WAAA,CAAc,CAAA,CAAI,IACzC,CACF,CACF,CAAC,CAAA,CAED0P,CAAAA,CAAa,OAAA,CAAUD,CAAAA,CAAM,QAAQ,MAAA,CACrCC,CAAAA,CAAa,QAAUD,CAAAA,CAAM,OAAA,CAAQ,OACrCC,CAAAA,CAAa,UAAA,CAAaD,CAAAA,CAAM,UAAA,CAAW,MAAA,CAE3C,IAAMc,EAAS1E,CAAAA,CACZ,GAAA,CAAI2E,CAAAA,GAAM,CAAE,IAAA,CAAMA,CAAAA,CAAE,KAAM,MAAA,CAAQA,CAAAA,CAAE,QAAA,CAAS,MAAO,CAAA,CAAE,CAAA,CACtD,KAAK,CAACC,CAAAA,CAAGvK,CAAAA,GAAMA,CAAAA,CAAE,MAAA,CAASuK,CAAAA,CAAE,QAAUA,CAAAA,CAAE,IAAA,CAAK,aAAA,CAAcvK,CAAAA,CAAE,IAAI,CAAC,EAC/DwK,CAAAA,CAAYH,CAAAA,CAAO,MAAA,CAAS,CAAA,CAAIA,CAAAA,CAAO,CAAC,EAAI,CAAE,IAAA,CAAM,IAAA,CAAM,MAAA,CAAQ,CAAE,CAAA,CAEpEI,EAAc,IAAI,GAAA,CACxB,IAAA,IAAW7I,CAAAA,IAAO,MAAA,CAAO,MAAA,CAAO3I,CAAU,CAAA,CACxC,IAAA,IAAWyR,CAAAA,IAAK9I,CAAAA,CAAI,QAAA,EAAY,GAAI6I,CAAAA,CAAY,GAAA,CAAIC,CAAC,CAAA,CAEvD,IAAIC,CAAAA,CAAc,EAClB,IAAA,GAAW,CAACnO,CAAAA,CAAMoF,CAAG,CAAA,GAAK,MAAA,CAAO,QAAQ3I,CAAU,CAAA,CAAG,CACpD,IAAM2R,CAAAA,CAAAA,CAAgBhJ,CAAAA,CAAI,UAAY,EAAC,EAAG,MAAA,GAAW,CAAA,CAE/CiJ,CAAAA,CAAAA,CADejJ,CAAAA,CAAI,UAAY,EAAC,EACR,IAAA,CAAK9C,CAAAA,EAAAA,CAAM6K,CAAAA,CAAkB,GAAA,CAAI7K,CAAC,CAAA,EAAK,EAAC,EAAG,IAAA,CAAKgM,CAAAA,EAAKA,CAAAA,GAAMtO,CAAI,CAAC,CAAA,CAC1FoO,GAAgB,CAACC,CAAAA,GAAUF,GAAe,CAAA,EAChD,CAEA,OAAO,CACL,cAAA,CAAgB,IAAA,CAChB,KAAM,CAAE,KAAA,CAAO,CAAE,IAAA,CAAMtB,CAAU,CAAE,EACnC,OAAA,CAAS,CACP,UAAA,CAAYC,CAAAA,CAAU,MAAA,CACtB,SAAA,CAAWE,EAAa,SAAA,CACxB,QAAA,CAAUD,CAAAA,CAAM,QAAA,CAAS,MAAA,CACzB,OAAA,CAASC,EAAa,OAAA,CACtB,OAAA,CAASA,CAAAA,CAAa,OAAA,CACtB,UAAA,CAAYA,CAAAA,CAAa,WACzB,MAAA,CAAQA,CAAAA,CAAa,MAAA,CACrB,WAAA,CAAaA,CAAAA,CAAa,WAAA,CAC1B,aAAcmB,CAAAA,CACd,QAAA,CAAU,CACR,UAAA,CAAY,KAAA,CAAM,IAAA,CAAKF,CAAW,CAAA,CAAE,MAAA,CACpC,gBAAA,CAAkBD,CAAAA,CAAU,IAAA,CAC5B,WAAA,CAAaA,EAAU,MACzB,CACF,CAAA,CACA,KAAA,CAAA7E,CACF,CACF,CAMA,SAASoF,EAAAA,EAAqB,CAC5B,OAAO,IAAI,IAAA,GAAO,WAAA,EACpB,CAEO,SAASC,EAAAA,CACdC,CAAAA,CACAxD,EACAyD,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACe,CACf,OAAO,MAAO5T,CAAAA,EAAU,CAClB,IAAM6T,CAAAA,CAA2C,GAC3C3F,CAAAA,CAAOsF,CAAAA,CAAS,SAAA,CAAU,QAAA,CAASxT,CAAAA,CAAM,MAAM,EACrD,GAAI,CAACkO,CAAAA,CAAM,OAAO,uBAAA,CAElB,IAAMc,EAASd,CAAAA,CAAK,EAAA,CACd4F,EAAa5F,CAAAA,CAAK,SAAA,EAAa,EAAC,CAChC6F,CAAAA,CAA+B7F,CAAAA,CAAK,WAAA,EAAe,EAAC,CACpD8F,EAAkBD,CAAAA,CAAW,MAAA,CAAOzT,CAAAA,EAAKA,CAAAA,CAAE,2BAAA,GAAgC,IAAI,EAEjF8B,CAAAA,CAA6BoR,CAAAA,CAAS,gBAAA,CAAiB,WAAA,CAAYxE,CAAM,CAAA,CACzEiF,EAAQ,KAAA,CAENC,CAAAA,CAAQ,IAAY,CACnBD,CAAAA,GACLT,CAAAA,CAAS,iBAAiB,YAAA,CAAaxE,CAAAA,CAAQ5M,CAAK,CAAA,CACpD6R,CAAAA,CAAQ,KAAA,EACV,EAEME,CAAAA,CAAkBlF,CAAAA,GACrB,CAAE,GAAI7M,CAAAA,CAAM,QAAA,CAAS6M,CAAU,CAAA,EAAK,EAAI,CAAA,CAAA,CACrCmF,CAAAA,CAAiB,CAACnF,EAAoBjB,CAAAA,GAAoC,CAC9E5L,EAAM,QAAA,CAAS6M,CAAU,EAAIjB,CAAAA,CAAOiG,CAAAA,CAAQ,KAC9C,CAAA,CAEMI,CAAAA,CAAwBrU,CAAAA,CAAM,WAAW,cAAA,EAAkB,CAAA,CAC3DsU,CAAAA,CAAgBlS,CAAAA,CAAM,mBAAA,CAS5B,GARI,OAAOkS,CAAAA,EAAkB,QAAA,EAAYA,CAAAA,GAAkBD,CAAAA,GACzDjS,CAAAA,CAAM,QAAA,CAAW,EAAC,CAAG6R,CAAAA,CAAQ,IAAA,CAAA,CAE3BK,CAAAA,GAAkBD,CAAAA,GACpBjS,CAAAA,CAAM,oBAAsBiS,CAAAA,CAAuBJ,CAAAA,CAAQ,IAAA,CAAA,CAIzDjU,CAAAA,CAAM,MAAA,CAAQ,CAChB,IAAMgS,CAAAA,CAAIhS,CAAAA,CAAM,MAAA,CACViP,CAAAA,CAAa+C,CAAAA,CAAE,UAAA,CACrB,GAAI/C,CAAAA,CAAY,CACd,IAAMjB,CAAAA,CAAQmG,CAAAA,CAAelF,CAAU,EACvC,GAAI+C,CAAAA,CAAE,QACJoC,CAAAA,CAAenF,CAAAA,CAAYuC,GAA2BxD,CAAAA,CAAQgE,CAAAA,CAAE,MAAA,EAAiC,SAAS,CAAC,CAAA,CAAA,KACtG,CACL,IAAMuC,CAAAA,CAAcvC,CAAAA,CAAE,GAAA,CACtB,GAAI,CAAChE,EAAM,aAAA,EAAiBuG,CAAAA,CAAcvG,CAAAA,CAAM,aAAA,CAAe,CAC7D,IAAMmB,EAAgB,OAAO6C,CAAAA,CAAE,aAAA,EAAkB,QAAA,CAAWA,CAAAA,CAAE,aAAA,CAAgB,OAC1E7C,CAAAA,EACFqE,CAAAA,CAAS,mBAAA,CAAoB,gBAAA,CAAiBxE,CAAAA,CAAQC,CAAAA,CAAYE,CAAa,CAAA,CAEjFiF,CAAAA,CAAenF,CAAAA,CAAYqC,EAAAA,CAA4BtD,CAAAA,CAAOuG,CAAW,CAAC,EAC5E,CACF,CACAL,CAAAA,GACF,CACF,CAEA,IAAMM,CAAAA,CAAuC,EAAC,CAC9C,IAAA,IAAW5H,CAAAA,IAAOmH,EAChB,GAAInH,CAAAA,CAAI,UAAA,CAAY,CAClB,IAAMwC,CAAAA,CAAUoE,EAAS,mBAAA,CAAoB,cAAA,CAAexE,CAAAA,CAAQpC,CAAAA,CAAI,UAAoB,CAAA,CACxFwC,IAAY,IAAA,GACdoF,CAAAA,CAAY5H,CAAAA,CAAI,MAAM,CAAA,CAAIwC,CAAAA,EAE9B,CAGF,IAAM5M,CAAAA,CAAoC,EAAC,CAC3C,IAAA,GAAW,CAACC,EAAOgS,CAAQ,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQzU,CAAAA,CAAM,KAAA,EAAS,EAAE,CAAA,CAC9D,GAAIyU,CAAAA,GAAa,IAAA,EAAQ,OAAOA,GAAa,QAAA,EAAY,CAAC,KAAA,CAAM,OAAA,CAAQA,CAAQ,CAAA,CAAG,CACjF,IAAMC,CAAAA,CAAaD,EAAqChS,CAAK,CAAA,CAC7DD,EAASC,CAAK,CAAA,CAAIiS,CAAAA,GAAc,MAAA,CAAYA,CAAAA,CAAYD,EAC1D,MACEjS,CAAAA,CAASC,CAAK,CAAA,CAAIgS,CAAAA,CAItB,IAAME,CAAAA,CAA2B,CAC/B,EAAA,CAAI3F,CAAAA,CACJ,SAAA,CAAW,CAAE,GAAG8E,CAAU,EAC1B,QAAA,CAAAtR,CAAAA,CACA,WAAA,CAAauR,CAAAA,CACb,OAAA,CAAS7F,CAAAA,CAAK,OAChB,CAAA,CACAyG,CAAAA,CAAY,YAAA,CAAeH,CAAAA,CACvBtG,CAAAA,CAAK,OAAA,EACPb,GAAY,OAAA,CAAQsH,CAAAA,CAAa,CAAE,WAAA,CAAAH,CAAY,CAAC,GAGjDb,CAAAA,EAAyBH,CAAAA,CAAS,WAAA,CAAY,mBAAA,CAAoB,IAAA,CAAKA,CAAAA,CAAS,WAAW,CAAA,EAAGxE,CAAAA,CAAQ2F,CAAAA,CAAY,eAAA,EAAmB,EAAE,EAExI,IAAMC,CAAAA,CAAe,CAAE,GAAG1G,CAAK,CAAA,CACzB2G,EAAkBxH,EAAAA,CAAY,iBAAA,CAClC,KAAA,CAAM,OAAA,CAAQa,CAAAA,CAAK,WAAW,EAAIA,CAAAA,CAAK,WAAA,CAAc,MAAA,CACrD,CACE,SAAA,CAAWA,CAAAA,CAAK,UAChB,QAAA,CAAA1L,CACF,CACF,CAAA,CAEMsS,CAAAA,CAAMvB,CAAAA,CAAQ,MACpBqB,CAAAA,CAAa,WAAA,CAAc,KAAA,CAAM,OAAA,CAAQC,CAAe,CAAA,CACpDA,EAAgB,GAAA,CAAIjI,CAAAA,GAAQ,CAC1B,GAAGA,CAAAA,CACH,QAAA,CAAU,OAAOA,CAAAA,CAAI,QAAA,EAAa,QAAA,EAAYA,CAAAA,CAAI,QAAA,CAAWA,CAAAA,CAAI,SAAWkI,CAC9E,CAAA,CAAE,EACFD,CAAAA,CAEJ,IAAMhP,EAAMwN,EAAAA,EAAW,CACjB0B,CAAAA,CAAc/U,CAAAA,CAAM,MAAA,CAAS,MAAA,CAAY6F,EAEzCmP,CAAAA,CAAsBhB,CAAAA,CAAgB,MAAA,CAAO1T,CAAAA,EAAK,CACtD,IAAM2O,EAAa3O,CAAAA,CAAE,UAAA,CACrB,GAAI,OAAO2O,CAAAA,EAAe,QAAA,EAAY,CAACA,CAAAA,CAAY,OAAO,KAAA,CAC1D,IAAIjB,CAAAA,CAAQmG,CAAAA,CAAelF,CAAU,CAAA,CACjC8F,CAAAA,GACF/G,CAAAA,CAAQ,CAAE,GAAGA,CAAAA,CAAO,iBAAkB+G,CAAY,CAAA,CAClDX,CAAAA,CAAenF,CAAAA,CAAYjB,CAAK,CAAA,CAAA,CAElC,IAAMiH,CAAAA,CAAMjH,CAAAA,CAAM,gBAAA,EAAoBA,CAAAA,CAAM,eAAA,EAAmBnI,CAAAA,CACzDD,EAASwL,EAAAA,CAAmBpD,CAAAA,CAAOiH,CAAG,CAAA,CAC5C,OAAIrP,CAAAA,GAAW,YAAoB,KAAA,CAC5BA,CAAAA,GAAW,UACpB,CAAC,CAAA,CAID,GAFAsO,GAAM,CAEFc,CAAAA,CAAoB,MAAA,CAAS,CAAA,CAAG,CAClC,IAAIE,EAAa,KAAA,CACbC,CAAAA,CAActP,CAAAA,CAClB,IAAA,IAAW+G,CAAAA,IAAOoI,CAAAA,CAAqB,CACrC,IAAM/F,CAAAA,CAAarC,CAAAA,CAAI,UAAA,CACvB,GAAI,OAAOqC,GAAe,QAAA,EAAY,CAACA,CAAAA,CAAY,SACnD,IAAMjB,CAAAA,CAAQmG,EAAelF,CAAU,CAAA,CACjCmG,CAAAA,CAAWpH,CAAAA,CAAM,gBAAA,EAAoBnI,CAAAA,CAC3CuO,EAAenF,CAAAA,CAAY,CAAE,GAAGjB,CAAAA,CAAO,eAAA,CAAiBoH,CAAS,CAAC,CAAA,CAClED,CAAAA,CAAcC,EACdF,CAAAA,CAAa,KACf,CAEA,OADIA,CAAAA,EAAYhB,CAAAA,EAAM,CACjBgB,CAAAA,GAELrB,CAAAA,CAAgB,KAAK,CAAE,QAAA,CAAU,cAAA,CAAgB,OAAA,CAAS,CAAE,QAAA,CAAU1T,GAAaoT,CAAO,CAAA,CAAG,YAAA,CAAcqB,CAAAA,CAAyC,aAAA,CAAe5U,CAAAA,CAAM,cAAe,GAAA,CAAKmV,CAAY,CAAE,CAAC,CAAA,CAC5M3B,CAAAA,CAAS,sBAAsB,aAAA,CAAczD,CAAAA,CAAW8D,CAAe,CAAA,CAAA,CAChE,gBACT,CAEA,IAAMwB,EAAAA,CAAoBnH,CAAAA,CAAK,QAAA,EAAY,EAAC,CACtCjL,EAAAA,CAAgC,EAAC,CACvC,IAAA,GAAW,CAAE,MAAA,CAAAqS,CAAAA,CAAQ,GAAA,CAAAlV,CAAI,CAAA,GAAKiV,EAAAA,CAC5BpS,GAAKqS,CAAM,CAAA,CAAIjI,GAAY,OAAA,CAAQsH,CAAAA,CAAavU,CAAG,CAAA,CAGrD,OAAA,CAACwT,CAAAA,EAAsBJ,EAAS,WAAA,CAAY,gBAAA,CAAiB,IAAA,CAAKA,CAAAA,CAAS,WAAW,CAAA,EAAGvQ,EAAI,CAAA,CAEjE8Q,CAAAA,CAAW,MAAA,CAAOzT,CAAAA,EAAK,CACjD,GAAIA,EAAE,2BAAA,GAAgC,IAAA,CAAM,OAAO,MAAA,CACnD,IAAM0N,CAAAA,CAAQmG,EAAe7T,CAAAA,CAAE,UAAoB,CAAA,CAEnD,OADI,CAAC0N,CAAAA,CAAM,iBACP,CAACA,CAAAA,CAAM,aAAA,CAAsB,IAAA,CAC1BA,CAAAA,CAAM,aAAA,EAAiBA,EAAM,eACtC,CAAC,CAAA,CACuB,MAAA,CAAS,CAAA,EAC/B6F,CAAAA,CAAgB,KAAK,CAAE,QAAA,CAAU,eAAgB,OAAA,CAAS,CAAE,SAAU1T,EAAAA,CAAaoT,CAAO,CAAA,CAAG,YAAA,CAAcqB,CAAAA,CAAyC,aAAA,CAAe5U,EAAM,aAAA,CAAe,GAAA,CAAK6F,CAAI,CAAE,CAAC,CAAA,CAGtM4N,EAAgBzT,CAAAA,CAAM,MAAA,CAAQiD,EAAI,CAAA,CAC9B4Q,CAAAA,CAAgB,MAAA,CAAS,GAAGL,CAAAA,CAAS,qBAAA,CAAsB,aAAA,CAAczD,CAAAA,CAAW8D,CAAe,CAAA,CAChG,gBACb,CACF,CAMO,IAAM0B,EAAAA,CAA4B,CAAE,QAAA,CAAU,CAAE,UAAA,CAAY,QAAA,CAAU,eAAA,CAAiB,cAAe,CAAA,CAAG,KAAA,CAAO,EAAG,CAAA,CAQnH,SAASC,EAAAA,CAA+BhF,CAAAA,CAAkD,CAC/F,OAAO,CACL,CAACL,EAAe,EAAGK,CAAAA,CAAS,KAAA,CAC5B,CAACJ,EAAmC,EAAGI,CAAAA,CAAS,oBAClD,CACF,CAEO,SAASiF,EAAAA,CAA+B9F,CAAAA,CAAiD,CAC9F,IAAMxO,CAAAA,CAAQwO,CAAAA,CAAQQ,EAAe,CAAA,CAC/BuF,CAAAA,CAAuB/F,CAAAA,CAAQS,EAAmC,CAAA,CACxE,GAAI,CAACjP,CAAAA,EAAS,OAAOA,CAAAA,EAAU,QAAA,CAC7B,MAAM,IAAI,MAAM,CAAA,wCAAA,EAA2CgP,EAAe,CAAA,CAAE,CAAA,CAE9E,OAAO,CACL,MAAAhP,CAAAA,CACA,oBAAA,CAAsB,OAAOuU,CAAAA,EAAyB,QAAA,CAAWA,CAAAA,CAAuB,EAC1F,CACF,CAiBO,SAASC,EAAAA,CAAqBzH,CAAAA,CAA4B,CAC/D,IAAM1L,CAAAA,CAAW0L,CAAAA,CAAK,SAChBiE,CAAAA,CAAYjE,CAAAA,CAAK,UAAoD,GAAA,CAAI9G,CAAAA,EAAKA,CAAAA,CAAE,MAAM,CAAA,EAAK,GAEjG,OAAO,CACL,QAAA,CAAU5E,CAAAA,EAAYA,CAAAA,CAAS,MAAA,CAAS,EAAIA,CAAAA,CAAW,MAAA,CACvD,QAAA,CAAA2P,CAAAA,CACA,YAAA,CAAc,CAAC,cAAc,CAAA,CAC7B,WAAA,CAAcjE,CAAAA,CAAK,IAAA,EAAyC,KAAA,EAASA,CAAAA,CAAK,EAC5E,CACF,CCzhCA,SAAS0H,EAAAA,CAAM3S,CAAAA,CAA4B,CACzC,OAAQA,CAAAA,GAAS,MAAA,CACb,CAAE,MAAA,CAAQ,SAAA,CAAW,IAAA,CAAAA,CAAK,CAAA,CAC1B,CAAE,MAAA,CAAQ,SAAU,CAC1B,CACA,SAAS4S,CAAAA,CAAKvS,CAAAA,CAA8B,CAAE,OAAO,CAAE,MAAA,CAAQ,OAAQ,KAAA,CAAAA,CAAM,CAAG,CAChF,SAASuI,EAAAA,CAAI6C,EAA2B,CAAE,OAAO,CAAE,MAAA,CAAQ,OAAA,CAAS,KAAA,CAAOA,aAAa,KAAA,CAAQA,CAAAA,CAAE,OAAA,CAAU,MAAA,CAAOA,CAAC,CAAE,CAAG,CAuKzH,SAASlP,EAAAA,CAAYsW,CAAAA,CAAqB,CACxC,IAAM7V,EAAQ,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO6V,CAAG,CAAA,CACpCC,EAAS,KAAA,CAAM,IAAA,CAAK9V,CAAAA,CAAOqI,CAAAA,EAAK,MAAA,CAAO,YAAA,CAAaA,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,CACrE,OAAO,KAAKyN,CAAM,CAAA,CAAE,QAAQ,KAAA,CAAO,GAAG,EAAE,OAAA,CAAQ,KAAA,CAAO,GAAG,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAM,EAAE,CAC9E,CAEA,SAAShW,EAAAA,CAAc+V,CAAAA,CAAqB,CAC1C,IAAMlW,CAAAA,CAASkW,CAAAA,CAAI,OAAA,CAAQ,IAAA,CAAM,GAAG,CAAA,CAAE,QAAQ,IAAA,CAAM,GAAG,CAAA,CACjDtN,CAAAA,CAAS5I,CAAAA,CAAS,GAAA,CAAI,QAAQ,CAAA,CAAIA,CAAAA,CAAO,MAAA,CAAS,CAAA,EAAK,CAAC,CAAA,CACxDmW,EAAS,IAAA,CAAKvN,CAAM,CAAA,CACpBvI,CAAAA,CAAQ,UAAA,CAAW,IAAA,CAAK8V,EAAQnD,CAAAA,EAAKA,CAAAA,CAAE,UAAA,CAAW,CAAC,CAAC,CAAA,CAC1D,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO3S,CAAK,CACvC,CAEA,SAAS0I,EAAAA,CAAoBlG,CAAAA,CAA4C,CACvE,GAAI,CACF,IAAM2E,CAAAA,CAAI,IAAA,CAAK,KAAA,CAAMrH,EAAAA,CAAc0C,CAAK,CAAC,EACzC,OAAO,OAAO2E,CAAAA,EAAG,CAAA,EAAM,QAAA,CAAW,CAAE,SAAUA,CAAAA,CAAE,CAAE,CAAA,CAAI,IACxD,CAAA,KAAQ,CAAE,OAAO,IAAM,CACzB,CAEA,SAAS4O,EAAAA,CAAkBtN,CAAAA,CAAqC,CAC9D,OAAOlJ,EAAAA,CAAY,IAAA,CAAK,SAAA,CAAUkJ,CAAO,CAAC,CAC5C,CAEA,SAASuN,EAAAA,CAAkBxT,CAAAA,CAA0C,CACnE,GAAI,CACF,IAAM2E,CAAAA,CAAI,KAAK,KAAA,CAAMrH,EAAAA,CAAc0C,CAAK,CAAC,CAAA,CACzC,OAAI,OAAO2E,CAAAA,EAAG,GAAA,EAAQ,UAAY,OAAOA,CAAAA,EAAG,GAAA,EAAQ,QAAA,EAChD,OAAOA,CAAAA,EAAG,GAAM,QAAA,EAAY,OAAOA,CAAAA,EAAG,CAAA,EAAM,QAAA,CAAiBA,CAAAA,CAC1D,IACT,CAAA,KAAQ,CAAE,OAAO,IAAM,CACzB,CAEA,SAAS8O,EAAAA,EAAiB,CAAE,OAAO,IAAI,IAAA,EAAK,CAAE,aAAe,CAMtD,SAASC,EAAAA,CACd5C,CAAAA,CACAhG,CAAAA,CACsB,CACtB,IAAM6I,CAAAA,CAAO7I,CAAAA,CAAQ,MAAA,GAAW,IAAM,CAAc,GAC9CoE,CAAAA,CAAYxR,EAAAA,CAAaoT,CAAO,CAAA,CAEtC,SAAS8C,EAA8BC,CAAAA,CAAgD,CACrF,GAAIA,CAAAA,CAAc,MAAA,GAAW,CAAA,CAC7B,GAAI,CACF,IAAMlP,CAAAA,CAAImG,CAAAA,CAAQ,+BAAA,GAAkC+I,CAAa,EAC7DlP,CAAAA,EAAK,OAAQA,CAAAA,CAAoB,KAAA,EAAU,UAAA,EACvCA,CAAAA,CAAoB,MAAOsH,CAAAA,EAC/B0H,CAAAA,CAAK,CAAA,kEAAA,EAAqE1H,CAAAA,YAAa,KAAA,CAAQA,CAAAA,CAAE,QAAU,MAAA,CAAOA,CAAC,CAAC,CAAA,CAAE,CACxH,EAEJ,OAASA,CAAAA,CAAG,CACV0H,CAAAA,CAAK,CAAA,kEAAA,EAAqE1H,CAAAA,YAAa,KAAA,CAAQA,EAAE,OAAA,CAAU,MAAA,CAAOA,CAAC,CAAC,CAAA,CAAE,EACxH,CACF,CAQA,SAAS6H,GAAsC,CAC7C,IAAMC,EAAWC,CAAAA,EAAY,CAAE,gBAAA,EAAiB,CAChD,GAAI,CAACD,EAAU,MAAM,IAAI,KAAA,CAAM,CAAA,SAAA,EAAYjD,CAAAA,CAAQ,KAAK,iFAAiF,CAAA,CACzI,IAAM1D,CAAAA,CAAKtC,CAAAA,CAAQ,eAAA,CAAgBiJ,CAAQ,EAC3C,OAAO,CACL,SAAA,EAA8B,CAAE,OAAO3G,CAAAA,CAAG,KAAK,QAAQ,CAAuB,CAAA,CAC9E,UAAA,CAAWtB,CAAAA,CAAwB,CAAEsB,EAAG,KAAA,CAAM,QAAA,CAAUtB,CAAK,EAAG,CAAA,CAChE,QAAA,CAASvK,EAA6B,CAAE,OAAO6L,CAAAA,CAAG,IAAA,CAAK7L,CAAE,CAAsB,EAC/E,SAAA,CAAUA,CAAAA,CAAYkK,CAAAA,CAAwB,CAAE,OAAA2B,CAAAA,CAAG,MAAM7L,CAAAA,CAAIkK,CAAI,CAAA,CAAUX,CAAAA,CAAQ,MAAA,CAAOW,CAAI,CAAG,CAAA,CACjG,UAAA,CAAWlK,CAAAA,CAAqB,CAAE,OAAO6L,CAAAA,CAAG,KAAK7L,CAAE,CAAA,GAAM,IAAM,CAAA,CAC/D,cAAA,CAAegL,CAAAA,CAAwB,CAAE,OAAOA,CAAQ,CAC1D,CACF,CAIA,IAAM0H,EAAmD,CACvD,UAAA,CAAWC,CAAAA,CAAyC,CAClD,IAAM9G,CAAAA,CAAKtC,EAAQ,SAAA,CAAU,gBAAgB,CAAA,CACvCqJ,CAAAA,CAAO/G,CAAAA,CAAG,QAAA,GAAW,IAAA,EAAK,CAChC,GAAI+G,CAAAA,CAAK,MAAA,GAAW,CAAA,CAAG,OAAO,CAAE,OAAA,CAAS,KAAM,MAAA,CAAQ,EAAG,CAAA,CAC1D,IAAM5F,CAAAA,CAAkC,EAAC,CACzC,IAAA,IAAWxE,KAAOoK,CAAAA,CAAM5F,CAAAA,CAAOxE,CAAG,CAAA,CAAIqD,CAAAA,CAAG,IAAA,CAAKrD,CAAG,CAAA,CACjD,OAAO,CAAE,OAAA,CAASe,CAAAA,CAAQ,MAAA,CAAOyD,CAAM,CAAA,CAAG,MAAA,CAAAA,CAAO,CACnD,CAAA,CACA,WAAA,CAAY2F,EAAkBhG,CAAAA,CAAqCkG,CAAAA,CAA+B,CAChG,IAAMhH,CAAAA,CAAKtC,CAAAA,CAAQ,UAAU,gBAAgB,CAAA,CAC7C,IAAA,IAAWf,CAAAA,IAAOqK,CAAAA,CAAahH,CAAAA,CAAG,OAAOrD,CAAG,CAAA,CAC5C,IAAA,GAAW,CAACA,CAAAA,CAAKzE,CAAK,IAAK,MAAA,CAAO,OAAA,CAAQ4I,CAAU,CAAA,CAAGd,CAAAA,CAAG,KAAA,CAAMrD,EAAKzE,CAAK,CAAA,CAC1E,OAAOwF,CAAAA,CAAQ,MAAA,CAAOoD,CAAU,CAClC,CACF,CAAA,CAGM8F,CAAAA,CAAc,IAAM7F,EAAAA,CAAuBrD,CAAAA,CAAQ,UAAU,QAAQ,CAAC,CAAA,CACtEuJ,CAAAA,CAAgB,IAAMrG,EAAAA,CAAyBiG,CAAmB,CAAA,CAClEK,CAAAA,CAAe,IAAMzH,EAAAA,CAAmB/B,CAAAA,CAAQ,cAAA,EAAgB,CAAA,CAChEyJ,CAAAA,CAAY,IAAM1J,EAAAA,CAAgBiJ,CAAAA,EAAgB,CAAGH,CAAI,CAAA,CACzDa,CAAAA,CAAc,IAAM,CACxB,IAAM7W,CAAAA,CAAMqW,GAAY,CAAE,mBAAA,EAAoB,CAC9C,GAAI,CAACrW,CAAAA,CAAK,MAAM,IAAI,KAAA,CAAM,YAAYmT,CAAAA,CAAQ,KAAK,2EAA2E,CAAA,CAC9H,OAAOxC,EAAAA,CAA4BxD,CAAAA,CAAQ,eAAA,CAAgBnN,CAAG,CAAC,CACjE,CAAA,CAEA,SAAS8W,CAAAA,EAAuB,CAC9B,OAAO,CAAC,CAACJ,CAAAA,EAAc,CAAE,YAAA,CAAavD,CAAAA,CAAQ,KAAK,EAAE,MAAA,CAAOpD,EAAe,CAC7E,CAEA,SAASgH,CAAAA,EAA8B,CACrC,IAAMxR,CAAAA,CAAOmR,CAAAA,EAAc,CAAE,YAAA,CAAavD,CAAAA,CAAQ,KAAK,CAAA,CACvD,GAAI,CAAC5N,CAAAA,CAAK,MAAA,CAAOwK,EAAe,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4BoD,CAAAA,CAAQ,KAAK,EAAE,CAAA,CAC9F,OAAOkC,EAAAA,CAA+B9P,CAAAA,CAAK,MAAM,CACnD,CAEA,SAASyR,CAAAA,CAAe5G,CAAAA,CAAyB6G,CAAAA,CAAsC,CACrF,IAAMtU,EAAS+T,CAAAA,EAAc,CAAE,cAAA,CAAevD,CAAAA,CAAQ,KAAA,CAAO,CAC3D,cAAerD,EAAAA,CACf,eAAA,CAAAmH,CAAAA,CACA,QAAA,CAAU9J,CAAAA,CAAQ,KAAA,GAClB,WAAA,CAAa2I,EAAAA,EAAO,CACpB,UAAA,CAAY,EAAC,CACb,aAAcV,EAAAA,CAA+BhF,CAAQ,CACvD,CAAC,CAAA,CACD,GAAI,CAACzN,CAAAA,CAAO,EAAA,CACV,MAAM,IAAI,KAAA,CACR,CAAA,oDAAA,EAAuDsU,GAAmB,MAAM,CAAA,SAAA,EAAYtU,CAAAA,CAAO,cAAA,EAAkB,MAAM,CAAA,CAC7H,CAEJ,CAEA,SAASuU,EAAmBnT,CAAAA,CAAyB,CAAE4S,GAAa,CAAE,WAAA,CAAY5S,CAAK,EAAG,CAI1F,eAAeoT,GAA4B,CACzC,IAAMzH,CAAAA,CAAmB,CAAC9B,CAAAA,CAA8B1K,CAAAA,GAAwB,CAC9E,IAAM8D,CAAAA,CAAI4G,CAAAA,CAAM,OAAA,CAEVnM,CAAAA,CAAAA,CADYuF,CAAAA,EAAG,cAAgB,EAAC,EACX,EAAA,EAAMA,CAAAA,EAAG,MAAA,EAAU,SAAA,CAC9CkQ,EAAmB,CAAE,IAAA,CAAM,aAAA,CAAe,QAAA,CAAAzV,CAAAA,CAAU,KAAA,CAAAyB,EAAO,SAAA,CAAW4S,EAAAA,EAAS,CAAC,EAClF,CAAA,CAEMsB,EAAwB5H,EAAAA,CAC5BrC,CAAAA,CAAQ,SAAA,CAAU,oBAAoB,CAAA,CACtCuC,CACF,EAEM2H,CAAAA,CAAuBnH,EAAAA,CAAuB/C,EAAQ,SAAA,CAAU,cAAc,CAAC,CAAA,CAC/EmK,CAAAA,CAA0B7I,EAAAA,CAC9BtB,CAAAA,CAAQ,WAAA,CAAY,SAAS,EAC5BnN,CAAAA,EAAQmN,CAAAA,CAAQ,WAAA,CAAYnN,CAAG,CAClC,CAAA,CAGMuX,EAAK,IAAI,GAAA,CACTC,CAAAA,CAA4C,CAChD,WAAA,CAAY5I,CAAAA,CAAQ,CAClB,OAAO2I,CAAAA,CAAG,GAAA,CAAI3I,CAAM,CAAA,EAAKyI,CAAAA,CAAqB,YAAYzI,CAAM,CAClE,CAAA,CACA,YAAA,CAAaA,CAAAA,CAAQ5M,CAAAA,CAAO,CAC1BuV,CAAAA,CAAG,GAAA,CAAI3I,CAAAA,CAAQ5M,CAAK,EACtB,CACF,EAGMyV,EAAAA,CAAsE,EAAC,CACvEC,EAAAA,CAAU,IAAI,GAAA,CACdC,GAAkD,CACtD,cAAA,CAAe/I,EAAQC,CAAAA,CAAY,CACjC,IAAMzC,CAAAA,CAAM,CAAA,EAAGwC,CAAM,CAAA,CAAA,EAAIC,CAAU,CAAA,CAAA,CACnC,OAAI6I,EAAAA,CAAQ,GAAA,CAAItL,CAAG,CAAA,CAAUsL,EAAAA,CAAQ,GAAA,CAAItL,CAAG,CAAA,CACrCkL,CAAAA,CAAwB,cAAA,CAAe1I,CAAAA,CAAQC,CAAU,CAClE,EACA,sBAAA,CAAuBD,CAAAA,CAAQC,CAAAA,CAAY7O,CAAAA,CAAK+O,CAAAA,CAAe,CAC7DuI,EAAwB,sBAAA,CAAuB1I,CAAAA,CAAQC,CAAAA,CAAY7O,CAAAA,CAAK+O,CAAa,EACvF,EACA,gBAAA,CAAiBH,CAAAA,CAAQC,CAAAA,CAAYE,CAAAA,CAAe,CAElD,IAAME,EAAY,CAAA,EAAGL,CAAM,CAAA,SAAA,EAAYG,CAAa,CAAA,CAAA,EAAIF,CAAU,GAE5DG,CAAAA,CADO7B,CAAAA,CAAQ,WAAA,CAAY,SAAS,CAAA,CACrB,IAAA,CAAK8B,CAAS,CAAA,CACnC,GAAID,CAAAA,EAAW,IAAA,CAAM,OAAO,MAAA,CAC5B,IAAM5C,EAAAA,CAAM,CAAA,EAAGwC,CAAM,CAAA,CAAA,EAAIC,CAAU,CAAA,CAAA,CAC7BC,EAAUE,CAAAA,CAAQ,IAAA,EAAK,CAC7B,GAAI,CAAE0I,EAAAA,CAAQ,IAAItL,EAAAA,CAAK,IAAA,CAAK,KAAA,CAAM0C,CAAO,CAAC,EAAG,MAAQ,CAAE4I,EAAAA,CAAQ,GAAA,CAAItL,EAAAA,CAAK0C,CAAO,EAAG,CAClF,OAAA2I,EAAAA,CAAG,IAAA,CAAK,CAAE,MAAA,CAAA7I,CAAAA,CAAQ,WAAAC,CAAAA,CAAY,aAAA,CAAAE,CAAc,CAAC,CAAA,CACtC,IACT,EACA,SAAA,CAAUH,CAAAA,CAAQC,EAAY,CAC5B,IAAMzC,EAAM,CAAA,EAAGwC,CAAM,CAAA,CAAA,EAAIC,CAAU,CAAA,CAAA,CACnC,OAAI6I,GAAQ,GAAA,CAAItL,CAAG,CAAA,CAAU,IAAA,CACtBkL,CAAAA,CAAwB,SAAA,CAAU1I,EAAQC,CAAU,CAC7D,CACF,CAAA,CAEM+I,EAAAA,CAAsB,CAC1B,UAAWhB,CAAAA,EAAU,CACrB,gBAAA,CAAkBY,CAAAA,CAClB,mBAAA,CAAqBG,EAAAA,CACrB,YAAad,CAAAA,EAAY,CACzB,qBAAA,CAAAO,CACF,CAAA,CAEMhH,EAAAA,CAAW2G,GAAa,CACxBjT,EAAAA,CAAOwB,EAAAA,CAAQ8K,EAAAA,CAAS,KAAK,CAAA,CAC7B,CAAE,MAAA,CAAQyH,CAAAA,CAAW,SAAA,CAAAC,EAAU,CAAA,CAAInB,CAAAA,GAAe,sBAAA,CAAuBvG,EAAAA,CAAS,oBAAoB,CAAA,CAExG2H,EAAAA,CAAmB,GACjBC,EAAAA,CAA4D,EAAC,CAC7DC,EAAAA,CAAgC,EAAC,CAEjCC,GAAK,IAAI,GAAA,CAET7E,EAAAA,CAAkB,CAAC5R,CAAAA,CAAkBoB,CAAAA,GAAwC,CACjFkV,EAAAA,CAAG,IAAA,CAAK,CAAE,IAAA,CAAM,gBAAA,CAAkB,QAAA,CAAAtW,EAAU,IAAA,CAAAoB,CAAAA,CAAM,SAAA,CAAWiT,EAAAA,EAAS,CAAe,EACvF,CAAA,CACMqC,EAAAA,CAAe,CAAC1W,CAAAA,CAAkByB,CAAAA,GACtCgU,CAAAA,CAAmB,CAAE,IAAA,CAAM,aAAA,CAAe,QAAA,CAAAzV,CAAAA,CAAU,KAAA,CAAAyB,CAAAA,CAAO,UAAW4S,EAAAA,EAAS,CAAC,CAAA,CAU5EsC,CAAAA,CAAK5P,EAAAA,CAAoB1E,GAAM,CACnC,QAAA,CAAU,CACR,cAAA,CAAgBoP,EAAAA,CAAoBC,EAAS2E,EAAAA,CAAWF,EAAAA,CAAqBvE,EAAAA,CAAiB8E,EAAAA,CAXpE,CAACvJ,CAAAA,CAAgBgC,IAA0C,CACvFoH,EAAAA,CAAG,IAAA,CAAK,CAAE,MAAA,CAAApJ,CAAAA,CAAQ,OAAAgC,CAAO,CAAC,EAC5B,CAAA,CAC4B/N,CAAAA,EAAwC,CAClEoV,GAAG,IAAA,CAAKpV,CAAI,EACd,CAMyJ,CACvJ,CACF,CAAC,CAAA,CAGD,IADAkV,EAAAA,CAAKF,CAAAA,CACEE,EAAAA,CAAG,MAAA,CAAS,GAAG,CACpB,IAAM9R,CAAAA,CAAU8R,EAAAA,CAChBA,EAAAA,CAAK,GAEL,IAAA,IAAWM,CAAAA,IAAMpS,CAAAA,CACf,GAAIoS,CAAAA,CAAG,IAAA,GAAS,eAAgB,CAC9B,IAAMvK,CAAAA,CAAO8J,EAAAA,CAAoB,SAAA,CAAU,QAAA,CAASS,EAAG,QAAkB,CAAA,CACrEvK,CAAAA,EAAMoK,EAAAA,CAAG,GAAA,CAAIG,CAAAA,CAAG,SAAoBvK,CAAgB,EAC1D,CAEFsK,CAAAA,CAAG,OAAA,CAAQnS,CAAO,EAClB,MAAMmS,CAAAA,CAAG,eAAA,GACX,CAEA,IAAME,EAAYF,CAAAA,CAAG,QAAA,EAAS,CAC9B,MAAMA,CAAAA,CAAG,OAAA,CAAQ,CAAE,IAAA,CAAM,IAAK,CAAC,CAAA,CAE/B,IAAMG,CAAAA,CAAiB7B,GAAc,CAAE,YAAA,CAAavD,CAAAA,CAAQ,KAAK,CAAA,CAAE,OAAA,CACnE6D,EAAe,CAAE,oBAAA,CAAsBc,EAAAA,CAAW,KAAA,CAAOzS,EAAAA,CAASiT,CAAS,CAAE,CAAA,CAAGC,CAAc,EAG9F,IAAA,GAAW,CAAE,OAAA3J,CAAAA,CAAQ,MAAA,CAAAgC,CAAO,CAAA,GAAKoH,EAAAA,CAAIJ,EAAAA,CAAoB,YAAY,mBAAA,CAAoBhJ,CAAAA,CAAQgC,CAAM,CAAA,CACvG,IAAA,IAAW/N,CAAAA,IAAQoV,GAAIL,EAAAA,CAAoB,WAAA,CAAY,gBAAA,CAAiB/U,CAAI,CAAA,CAG5E,IAAA,GAAW,CAAC+L,CAAAA,CAAQ5M,CAAK,CAAA,GAAKuV,CAAAA,CAAIF,CAAAA,CAAqB,YAAA,CAAazI,EAAQ5M,CAAK,CAAA,CAGjF,IAAA,GAAW,CAAE,MAAA,CAAA4M,CAAAA,CAAQ,WAAAC,CAAAA,CAAY,aAAA,CAAAE,CAAc,CAAA,GAAK0I,EAAAA,CAAIH,CAAAA,CAAwB,iBAAiB1I,CAAAA,CAAQC,CAAAA,CAAYE,CAAa,CAAA,CAElI,IAAIyJ,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAYlH,GAAuBC,CAAAA,CAAW+G,CAAS,EACvDV,EAAAA,CAAoB,WAAA,CAAY,mBAAA,CAAoBY,CAAS,EAC/D,CAAA,MAASlK,EAAG,CACV0H,CAAAA,CAAK,CAAA,iDAAA,EAAoD1H,CAAAA,YAAa,KAAA,CAAQA,CAAAA,CAAE,QAAU,MAAA,CAAOA,CAAC,CAAC,CAAA,CAAE,EACvG,CAGA,IAAMmK,CAAAA,CAAmC,EAAC,CAC1C,IAAA,GAAW,CAAE,MAAA,CAAA7J,EAAQ,MAAA,CAAAgC,CAAO,CAAA,GAAKoH,EAAAA,CAAIS,CAAAA,CAAM,IAAA,CAAK,CAAE,IAAA,CAAM,iBAAA,CAAmB,MAAA,CAAA7J,CAAAA,CAAQ,MAAA,CAAAgC,CAAO,CAAC,CAAA,CAC3F,IAAA,IAAW/N,CAAAA,IAAQoV,EAAAA,CACjB,IAAA,GAAW,CAAC7L,EAAK9D,CAAO,CAAA,GAAK,OAAO,OAAA,CAAQzF,CAAI,EAC1CuJ,CAAAA,EAAKqM,CAAAA,CAAM,IAAA,CAAK,CAAE,IAAA,CAAM,aAAA,CAAe,IAAArM,CAAAA,CAAK,OAAA,CAAA9D,CAAQ,CAAC,CAAA,CAG7D,IAAA,GAAW,CAACsG,CAAAA,CAAQd,CAAI,CAAA,GAAKoK,EAAAA,CAAIO,CAAAA,CAAM,IAAA,CAAK,CAAE,IAAA,CAAM,gBAAA,CAAkB,MAAA,CAAA7J,CAAAA,CAAQ,IAAA,CAAAd,CAAK,CAAC,CAAA,CAChF0K,CAAAA,GAAc,MAAA,EAAWC,CAAAA,CAAM,IAAA,CAAK,CAAE,KAAM,QAAA,CAAU,MAAA,CAAQD,CAAU,CAAC,CAAA,CAC7EvC,CAAAA,CAA8BwC,CAAK,CAAA,CAEnC,IAAMC,CAAAA,CAAcrC,CAAAA,EAAY,CAAE,mBAAA,IAC7B,CAAE,QAAA,CAAU,UAAA,CAAqB,SAAA,CAAWtW,EAAAA,CAAa,CAAE,KAAM,UAAA,CAAY,KAAA,CAAO,0BAA2B,CAAC,CAAE,CAAA,CAEvHqX,EAAsB,2BAAA,CAA4BU,EAAAA,CAAYlK,CAAAA,EAAU,CACtE,GAAIA,CAAAA,CAAM,WAAa,cAAA,CAAgB,CACrCoI,CAAAA,CAAK,CAAA,+CAAA,EAAkDpI,CAAAA,CAAM,QAAQ,mBAAc,CAAA,CACnF,MACF,CACA,IAAM5G,CAAAA,CAAI4G,CAAAA,CAAM,QACVgB,CAAAA,CAAU5H,CAAAA,CAAE,YAAA,EAAc,EAAA,EAA6B,SAAA,CACvD2R,CAAAA,CAAc3R,EAAE,YAAA,EAAc,WAAA,EAAe,EAAC,CAEpD,IAAA,IAAWwF,CAAAA,IAAOmM,EAAY,CAC5B,GAAI,CAACnM,CAAAA,CAAI,UAAA,CAAY,CAAEwJ,EAAK,CAAA,mBAAA,EAAsBxJ,CAAAA,CAAI,MAAM,CAAA,mCAAA,CAAgC,CAAA,CAAG,QAAU,CACzG,IAAMoM,CAAAA,CAAchD,EAAAA,CAAkB,CACpC,GAAA,CAAK5O,EAAE,aAAA,CAAe,EAAA,CAAImM,CAAAA,CAAQ,KAAA,CAAO,EAAA,CAAIpT,EAAAA,CAAaoT,CAAO,CAAA,CACjE,GAAA,CAAKvE,CAAAA,CAAQ,CAAA,CAAGpC,CAAAA,CAAI,MAAA,CAAQ,EAAGA,CAAAA,CAAI,UAAA,CAAY,EAAA,CAAI,MAAA,CAAW,GAAA,CAAKxF,CAAAA,CAAE,GACvE,CAAC,CAAA,CACDmG,CAAAA,CAAQ,iBAAA,CAAkBuL,CAAAA,CAAa,CACrC,WAAYlM,CAAAA,CAAK,QAAA,CAAUzM,EAAAA,CAAaoT,CAAO,CAAA,CAC/C,QAAA,CAAU,CAAE,KAAA,CAAOyF,CAAAA,CAAa,GAAA,CAAKzL,CAAAA,CAAQ,OAAQ,CACvD,CAAC,CAAA,CAAE,KAAA,CAAOmB,EAAAA,EAAe6J,EAAAA,CAAavJ,CAAAA,CAAQN,EAAAA,YAAa,MAAQA,EAAAA,CAAE,OAAA,CAAU,MAAA,CAAOA,EAAC,CAAC,CAAC,EAC3F,CACF,CAAC,EACH,CAKA,eAAelF,CAAAA,EAAgC,CAC7C,GAAI,CAMF,IAAM5I,CAAAA,CAAe,IAAM,CACzB,IAAM4P,CAAAA,CAAW2G,CAAAA,EAAa,CACxB,CAAE,MAAA,CAAAvS,CAAO,EAAImS,CAAAA,EAAa,CAAE,sBAAA,CAAuBvG,CAAAA,CAAS,oBAAoB,CAAA,CAClF5L,EAAO,MAAA,EAAU,CAAA,GAGhB4E,CAAAA,EAAM,CAEX+D,CAAAA,CAAQ,yBAAA,MACV,CAAA,CACM0L,CAAAA,CAAM,MAAMxY,EAAAA,CAAc8M,CAAAA,CAAQ,IAAA,CAAMgK,EAAY3W,CAAY,CAAA,CACtE,OAAOgV,EAAAA,CAAG,CAAE,IAAKqD,CAAAA,GAAQ,CAAA,CAAM,CAAC,CAClC,CAAA,MAASvK,CAAAA,CAAG,CAAE,OAAO7C,EAAAA,CAAI6C,CAAC,CAAG,CAC/B,CAEA,SAASwK,CAAAA,CAAKlZ,CAAAA,CAAoC,CAChD,GAAI,CAEF,IAAMwW,EAAWxW,CAAAA,CAAM,MAAA,EAAS,YAAA,CAChC,GAAI,CAACwW,CAAAA,CAAU,OAAOX,CAAAA,CAAK,wGAAmG,CAAA,CAC9H,GAAI,CAACqB,CAAAA,GAAe,CAClB,IAAMhT,CAAAA,CAAOL,EAAAA,CAAgB0R,EAAY,CAAA,CACzC6B,EAAe,CAAE,oBAAA,CAAsB,EAAA,CAAI,KAAA,CAAO3R,EAAAA,CAASvB,CAAI,CAAE,CAAA,CAAG,IAAI,EAC1E,CACA,IAAMiV,CAAAA,CAAkBnZ,EAAM,MAAA,EAAS,eAAA,CACvC,GAAI,CAACmZ,CAAAA,CAAiB,OAAOtD,EAAK,6EAAwE,CAAA,CAC1G,IAAM3L,CAAAA,CAAMuM,CAAAA,EAAY,CACxBvM,EAAI,iBAAA,CAAkBsM,CAAQ,CAAA,CAC9BtM,CAAAA,CAAI,oBAAA,CAAqBiP,CAAe,EACxC,IAAMC,CAAAA,CAAQpZ,CAAAA,CAAM,IAAA,EAAQ,EAAC,CACzBoZ,EAAK,mBAAmB,CAAA,EAAGlP,CAAAA,CAAI,oBAAA,CAAqBkP,CAAAA,CAAK,mBAAmB,CAAiB,CAAA,CAC7FA,CAAAA,CAAK,kBAAkB,CAAA,EAAIlP,CAAAA,CAAI,mBAAA,CAAoBkP,EAAK,kBAAkB,CAAiB,CAAA,CAC/F,GAAI,CAAEnC,CAAAA,GAAc,mBAAA,CAAoBvF,EAAAA,CAAuBC,EAAWjM,EAAAA,CAAQyR,CAAAA,GAAe,KAAK,CAAC,CAAC,EAAG,CAAA,KAAQ,CAAoB,CACvI,OAAOvB,EAAAA,EACT,CAAA,MAASlH,CAAAA,CAAG,CAAE,OAAO7C,EAAAA,CAAI6C,CAAC,CAAG,CAC/B,CAEA,SAASwC,EAAOmI,CAAAA,CAAwD,CACtE,GAAI,CACF,IAAI/Y,CAAAA,CAAI2W,GAAY,CAAE,kBAAA,EAAmB,CACzC,GAAI,CAAC3W,CAAAA,CAAG,CACNA,CAAAA,CAAIoR,EAAAA,CAAuBC,CAAAA,CAAWjM,EAAAA,CAAQyR,CAAAA,EAAa,CAAE,KAAK,CAAC,CAAA,CACnE,GAAI,CAAEF,CAAAA,EAAY,CAAE,oBAAoB3W,CAAC,EAAG,MAAQ,CAAoB,CAC1E,CACA,OAAOsV,EAAAA,CAAGtV,CAAC,CACb,CAAA,MAASoO,CAAAA,CAAG,CAAE,OAAO7C,EAAAA,CAAI6C,CAAC,CAAuC,CACnE,CAEA,SAAS4K,CAAAA,CAAWtZ,CAAAA,CAAoC,CACtD,GAAI,CACF,IAAMgE,EAAKhE,CAAAA,CAAM,MAAA,EAAS,EAAA,CAC1B,OAAKgE,CAAAA,EACLsT,CAAAA,CAAmB,CAAE,IAAA,CAAM,cAAA,CAAgB,QAAA,CAAUtT,CAAAA,CAAI,SAAA,CAAWkS,EAAAA,EAAS,CAAC,CAAA,CACzE1M,CAAAA,EAAM,CACJoM,EAAAA,EAAG,EAHMC,EAAK,+BAA+B,CAItD,CAAA,MAASnH,CAAAA,CAAG,CAAE,OAAO7C,GAAI6C,CAAC,CAAG,CAC/B,CAEA,SAAS6K,EAAUvZ,CAAAA,CAAoC,CACrD,GAAI,CACF,IAAMgE,CAAAA,CAAKhE,EAAM,MAAA,EAAS,EAAA,CAC1B,OAAKgE,CAAAA,EACLsT,CAAAA,CAAmB,CAAE,KAAM,cAAA,CAAgB,QAAA,CAAUtT,CAAAA,CAAI,SAAA,CAAWkS,EAAAA,EAAS,CAAC,CAAA,CACzE1M,CAAAA,EAAM,CACJoM,EAAAA,EAAG,EAHMC,CAAAA,CAAK,8BAA8B,CAIrD,CAAA,MAASnH,CAAAA,CAAG,CAAE,OAAO7C,EAAAA,CAAI6C,CAAC,CAAG,CAC/B,CAEA,eAAe8K,CAAAA,CAAyBH,CAAAA,CAA8C,CACpF,OAAO7P,CAAAA,EACT,CAEA,SAASiQ,CAAAA,CAAWzZ,EAAoC,CACtD,GAAI,CACF,IAAMgP,CAAAA,CAAUhP,CAAAA,CAAM,QAAS,MAAA,CACzByP,CAAAA,CAAUzP,CAAAA,CAAM,MAAA,EAAS,GAAA,CACzB0Z,CAAAA,CAAU,CAAC,CAAC1Z,CAAAA,CAAM,MAAA,EAAS,OAAA,CACjC,GAAI,CAACgP,GAAU,CAACS,CAAAA,CAAK,OAAOoG,CAAAA,CAAK,6CAA6C,CAAA,CAE9E,IAAM8D,CAAAA,CAAMlK,CAAAA,CAAMuH,CAAAA,EAAU,CAAE,YAAA,EAAa,CAAE,IAAIpE,CAAAA,EAAKA,CAAAA,CAAE,EAAE,CAAA,CAAI,CAAC5D,CAAgB,EAG/E,IAAA,IAAWhL,CAAAA,IAAM2V,CAAAA,CACf,GAAI,CAAC3C,CAAAA,GAAY,QAAA,CAAShT,CAAE,CAAA,CAAG,OAAO6R,CAAAA,CAAK,CAAA,MAAA,EAAS7R,CAAE,CAAA,wBAAA,EAA2BuP,CAAAA,CAAQ,KAAK,CAAA,CAAE,CAAA,CAGlG,QAAWvP,CAAAA,IAAM2V,CAAAA,CAAK,CACpB,IAAMzL,EAAAA,CAAO8I,CAAAA,GAAY,QAAA,CAAShT,CAAE,CAAA,CAC9BzC,EAAAA,CAAaoU,EAAAA,CAAqBzH,EAAI,EACtC0L,EAAAA,CAAiBrM,CAAAA,CAAQ,MAAA,CAAOhM,EAAU,CAAA,CAC1CsY,EAAAA,CAAWtM,EAAQ,SAAA,CAAU,aAAa,CAAA,CAC1CyC,EAAAA,CAAW6J,EAAAA,CAAS,IAAA,CAAK7V,CAAE,CAAA,CAC3B8V,EAAAA,CAAoB9J,EAAAA,EAAU,cAAA,GAAmB4J,EAAAA,CAEvD,GAAI,GAACE,EAAAA,EAAqB,CAACJ,CAAAA,CAAAA,CAE3B,CAAA,GAAII,EAAAA,CAAmB,CACrB,IAAMC,CAAAA,CAAU/J,EAAAA,EAAU,OAAA,EAAWgH,CAAAA,EAAU,CAAE,WAAA,CAAYhT,CAAE,CAAA,EAAKA,CAAAA,CACpEsT,CAAAA,CAAmB,CAAE,IAAA,CAAM,aAAA,CAAe,SAAUtT,CAAAA,CAAI,UAAA,CAAAzC,EAAAA,CAAY,SAAA,CAAW2U,EAAAA,EAAS,CAAC,CAAA,CACzF2D,EAAAA,CAAS,KAAA,CAAM7V,CAAAA,CAAI,CAAE,OAAA,CAAA+V,EAAS,cAAA,CAAAH,EAAAA,CAAgB,SAAA,CAAW1D,EAAAA,EAAS,CAAgC,EACpG,CACIwD,CAAAA,EAASpC,CAAAA,CAAmB,CAAE,IAAA,CAAM,cAAA,CAAgB,SAAUtT,CAAAA,CAAI,SAAA,CAAWkS,EAAAA,EAAS,CAAC,EAAA,CAC7F,CAEA,OAAK1M,CAAAA,EAAM,CACJoM,EAAAA,EACT,CAAA,MAASlH,EAAG,CAAE,OAAO7C,EAAAA,CAAI6C,CAAC,CAAG,CAC/B,CAEA,SAASsL,CAAAA,CAAWha,EAAoC,CACtD,GAAI,CACF,IAAMyC,CAAAA,CAAQzC,CAAAA,CAAM,MAAA,EAAS,KAAA,CAC7B,GAAI,CAACyC,CAAAA,CAAO,OAAOoT,CAAAA,CAAK,kCAAkC,CAAA,CAC1D,IAAMvS,EAAStD,CAAAA,CAAM,MAAA,EAAS,KAAA,EAAmC,eAAA,CAC3DyK,CAAAA,CAAU9B,EAAAA,CAAoBlG,CAAK,CAAA,CACzC,OAAKgI,CAAAA,EACL6M,CAAAA,CAAmB,CAAE,IAAA,CAAM,cAAe,QAAA,CAAU7M,CAAAA,CAAQ,QAAA,CAAU,KAAA,CAAAnH,CAAAA,CAAO,SAAA,CAAW4S,IAAS,CAAC,CAAA,CAC7F1M,CAAAA,EAAM,CACJoM,EAAAA,IAHcC,CAAAA,CAAK,wBAAwB,CAIpD,CAAA,MAASnH,CAAAA,CAAG,CAAE,OAAO7C,EAAAA,CAAI6C,CAAC,CAAG,CAC/B,CAEA,SAASuL,EAAaja,CAAAA,CAAoC,CACxD,GAAI,CACF,IAAMyC,CAAAA,CAAQzC,EAAM,MAAA,EAAS,KAAA,CAC7B,GAAI,CAACyC,CAAAA,CAAO,OAAOoT,EAAK,oCAAoC,CAAA,CAE5D,IAAMhM,CAAAA,CAAAA,CADK7J,CAAAA,CAAM,IAAA,EAAQ,EAAC,EACR,MAAA,EAAa,EAAC,CAC1ByK,CAAAA,CAAU9B,EAAAA,CAAoBlG,CAAK,CAAA,CACzC,OAAKgI,CAAAA,EACL6M,CAAAA,CAAmB,CAAE,IAAA,CAAM,gBAAiB,QAAA,CAAU7M,CAAAA,CAAQ,QAAA,CAAU,MAAA,CAAAZ,CAAAA,CAAQ,SAAA,CAAWqM,IAAS,CAAC,CAAA,CAChG1M,CAAAA,EAAM,CACJoM,EAAAA,IAHcC,CAAAA,CAAK,wBAAwB,CAIpD,CAAA,MAASnH,CAAAA,CAAG,CAAE,OAAO7C,EAAAA,CAAI6C,CAAC,CAAG,CAC/B,CAEA,SAASwL,CAAAA,CAAkBla,CAAAA,CAAoC,CAC7D,GAAI,CACF,IAAMyC,EAAQzC,CAAAA,CAAM,MAAA,EAAS,KAAA,CACvBI,CAAAA,CAAQJ,CAAAA,CAAM,MAAA,EAAS,IAC7B,GAAI,CAACyC,CAAAA,CAAO,OAAOoT,CAAAA,CAAK,yCAAyC,EACjE,GAAI,CAACzV,CAAAA,CAAO,OAAOyV,CAAAA,CAAK,uCAAuC,EAC/D,IAAMnN,CAAAA,CAAUuN,EAAAA,CAAkBxT,CAAK,CAAA,CACvC,GAAI,CAACiG,CAAAA,CAAS,OAAOmN,CAAAA,CAAK,sBAAsB,CAAA,CAChD,GAAM,CAAE,GAAA,CAAAsE,CAAAA,CAAK,IAAAC,CAAAA,CAAK,CAAA,CAAA9R,GAAG,CAAA,CAAA8K,EAAAA,CAAG,EAAA,CAAAiH,EAAAA,CAAI,GAAA,CAAAC,EAAI,EAAI5R,CAAAA,CAE9B6R,EAAAA,CAAsB1L,EAAAA,CAC1BtB,CAAAA,CAAQ,WAAA,CAAY,SAAS,EAC5BnN,EAAAA,EAAQmN,CAAAA,CAAQ,WAAA,CAAYnN,EAAG,CAClC,CAAA,CAEM+O,GAAgB5B,CAAAA,CAAQ,KAAA,EAAM,CACpCgN,EAAAA,CAAoB,sBAAA,CAAuBH,CAAAA,CAAKhH,GAAG/S,EAAAA,CAASD,CAAG,CAAA,CAAG+O,EAAa,CAAA,CAE/E,IAAMqL,EAAa7R,EAAAA,CAAoBwR,CAAG,CAAA,CAC1C,GAAI,CAACK,CAAAA,CAAY,OAAO3E,CAAAA,CAAK,iDAAiD,CAAA,CAE9E,IAAMtE,EAAAA,CAAY2E,EAAAA,GAClB,OAAAoB,CAAAA,CAAmB,CACjB,IAAA,CAAM,eAAA,CACN,SAAUkD,CAAAA,CAAW,QAAA,CACrB,MAAA,CAAQ,CAAE,MAAA,CAAQlS,EAAAA,CAAG,WAAY8K,EAAAA,CAAG,SAAA,CAAA7B,EAAAA,CAAW,aAAA,CAAApC,EAAAA,CAAe,cAAA,CAAgBkL,GAAI,GAAA,CAAAC,EAAI,CAAA,CACtF,SAAA,CAAW/I,EACb,CAAC,EACI/H,CAAAA,EAAM,CACJoM,EAAAA,EACT,CAAA,MAASlH,CAAAA,CAAG,CAAE,OAAO7C,EAAAA,CAAI6C,CAAC,CAAG,CAC/B,CAEA,SAAS+L,CAAAA,CAAuBza,CAAAA,CAAoC,CAClE,GAAI,CACF,IAAMyC,EAASzC,CAAAA,CAAM,MAAA,EAAS,KAAA,CACxByR,CAAAA,CAAUzR,CAAAA,CAAM,MAAA,EAAS,QAAoC,SAAA,CACnE,GAAI,CAACyC,CAAAA,CAAO,OAAOoT,CAAAA,CAAK,8CAA8C,CAAA,CACtE,IAAMnN,CAAAA,CAAUuN,EAAAA,CAAkBxT,CAAK,CAAA,CACvC,GAAI,CAACiG,CAAAA,CAAS,OAAOmN,CAAAA,CAAK,sBAAsB,CAAA,CAChD,GAAM,CAAE,GAAA,CAAAsE,CAAAA,CAAK,CAAA,CAAA7R,CAAAA,CAAG,CAAA,CAAA8K,GAAG,EAAA,CAAAiH,EAAG,CAAA,CAAI3R,CAAAA,CAEpB8R,EAAAA,CAAa7R,EAAAA,CAAoBwR,CAAG,CAAA,CAC1C,OAAKK,EAAAA,EAELlD,CAAAA,CAAmB,CACjB,IAAA,CAAM,gBACN,QAAA,CAAUkD,EAAAA,CAAW,QAAA,CACrB,MAAA,CAAQ,CAAE,MAAA,CAAQlS,EAAG,UAAA,CAAY8K,EAAAA,CAAG,OAAA,CAAS,CAAA,CAAA,CAAM,MAAA,CAAA3B,CAAAA,CAAQ,eAAgB4I,EAAG,CAAA,CAC9E,UAAWnE,EAAAA,EACb,CAAC,CAAA,CACI1M,CAAAA,EAAM,CACJoM,EAAAA,EAAG,EATcC,CAAAA,CAAK,iDAAiD,CAUhF,CAAA,MAASnH,CAAAA,CAAG,CAAE,OAAO7C,EAAAA,CAAI6C,CAAC,CAAG,CAC/B,CAEA,SAASgM,CAAAA,CAAgBrB,CAAAA,CAA2D,CAClF,GAAI,CACF,IAAM7C,CAAAA,CAAWC,CAAAA,EAAY,CAAE,kBAAiB,CAChD,OAAKD,CAAAA,CACEZ,EAAAA,CAAG,CAAE,QAAA,CAAAY,CAAS,CAAC,CAAA,CADAX,CAAAA,CAAK,CAAA,SAAA,EAAYtC,CAAAA,CAAQ,KAAK,+BAA+B,CAErF,CAAA,MAAS7E,CAAAA,CAAG,CAAE,OAAO7C,EAAAA,CAAI6C,CAAC,CAA0C,CACtE,CAEA,SAASiM,CAAAA,CAAmBtB,CAAAA,CAA2D,CACrF,GAAI,CACF,IAAM7C,CAAAA,CAAWC,CAAAA,EAAY,CAAE,qBAAoB,CACnD,OAAKD,CAAAA,CACEZ,EAAAA,CAAG,CAAE,QAAA,CAAAY,CAAS,CAAC,CAAA,CADAX,CAAAA,CAAK,CAAA,SAAA,EAAYtC,CAAAA,CAAQ,KAAK,kCAAkC,CAExF,CAAA,MAAS7E,CAAAA,CAAG,CAAE,OAAO7C,EAAAA,CAAI6C,CAAC,CAA0C,CACtE,CAEA,SAASkM,EAAAA,CAAU5a,CAAAA,CAAwD,CACzE,GAAI,CACF,IAAMwM,CAAAA,CAAMxM,CAAAA,CAAM,MAAA,EAAS,IAC3B,GAAI,CAACwM,CAAAA,CAAK,OAAOqJ,CAAAA,CAAK,+BAA+B,EACrD,IAAM3L,CAAAA,CAAMuM,GAAY,CACpB1O,CAAAA,CACJ,OAAQyE,CAAAA,EACN,KAAK,eAAA,CAAqBzE,CAAAA,CAAQmC,CAAAA,CAAI,qBAAoB,EAAK,IAAA,CAAM,MACrE,KAAK,cAAA,CAAqBnC,CAAAA,CAAQmC,EAAI,kBAAA,EAAmB,EAAM,IAAA,CAAM,MACrE,KAAK,gBAAA,CAAqBnC,EAAQmC,CAAAA,CAAI,gBAAA,EAAiB,CAAG,MAC1D,KAAK,mBAAA,CAAqBnC,EAAQmC,CAAAA,CAAI,mBAAA,EAAoB,CAAG,MAC7D,QAAS,OAAO2L,EAAK,CAAA,wBAAA,EAA2BrJ,CAAG,CAAA,CAAA,CAAG,CACxD,CACA,OAAOoJ,GAAG,CAAE,KAAA,CAAA7N,CAAM,CAAC,CACrB,CAAA,MAAS2G,EAAG,CAAE,OAAO7C,EAAAA,CAAI6C,CAAC,CAAwC,CACpE,CAEA,SAASmM,EAAAA,CAAqB7a,CAAAA,CAAoC,CAChE,GAAI,CACF,IAAMwM,CAAAA,CAAMxM,CAAAA,CAAM,MAAA,EAAS,GAAA,CAC3B,GAAI,CAACwM,EAAK,OAAOqJ,CAAAA,CAAK,0CAA0C,CAAA,CAChE,IAAM9N,CAAAA,CAAQkP,GAAY,CAAE,cAAA,CAAezK,CAAG,CAAA,CAC9C,OAAOoJ,EAAAA,CAAG7N,CAAK,CACjB,CAAA,MAAS2G,CAAAA,CAAG,CAAE,OAAO7C,EAAAA,CAAI6C,CAAC,CAAG,CAC/B,CAEA,SAASoM,EAAAA,CAAyBzB,CAAAA,CAA8D,CAC9F,GAAI,CACF,OAAOzD,EAAAA,CAAGqB,CAAAA,EAAY,CAAE,oBAAoB,CAC9C,OAASvI,CAAAA,CAAG,CAAE,OAAO7C,EAAAA,CAAI6C,CAAC,CAA6C,CACzE,CAEA,SAASqM,EAAyB/a,CAAAA,CAAoC,CACpE,GAAI,CACF,IAAMwM,CAAAA,CAAMxM,EAAM,MAAA,EAAS,GAAA,CAC3B,GAAI,CAACwM,CAAAA,CAAK,OAAOqJ,EAAK,8CAA8C,CAAA,CACpE,IAAM9N,CAAAA,CAAQkP,CAAAA,EAAY,CAAE,mBAAmBzK,CAAG,CAAA,CAClD,OAAOoJ,EAAAA,CAAG7N,CAAK,CACjB,OAAS2G,CAAAA,CAAG,CAAE,OAAO7C,EAAAA,CAAI6C,CAAC,CAAG,CAC/B,CAEA,SAASsM,CAAAA,CAA4B3B,CAAAA,CAA8D,CACjG,GAAI,CACF,OAAOzD,EAAAA,CAAGqB,GAAY,CAAE,qBAAA,EAAuB,CACjD,CAAA,MAASvI,CAAAA,CAAG,CAAE,OAAO7C,EAAAA,CAAI6C,CAAC,CAA6C,CACzE,CAEA,OAAO,CACL,IAAA,CAAAwK,EAAM,MAAA,CAAAhI,CAAAA,CAAQ,eAAA,CAAAwJ,CAAAA,CAAiB,kBAAA,CAAAC,CAAAA,CAAoB,UAAAC,EAAAA,CACnD,oBAAA,CAAAC,EAAAA,CAAsB,wBAAA,CAAAC,EAAAA,CACtB,wBAAA,CAAAC,EAA0B,2BAAA,CAAAC,CAAAA,CAC1B,UAAA,CAAA1B,CAAAA,CAAY,SAAA,CAAAC,CAAAA,CAAW,yBAAAC,CAAAA,CACvB,UAAA,CAAAC,CAAAA,CACA,UAAA,CAAAO,CAAAA,CAAY,YAAA,CAAAC,EACZ,iBAAA,CAAAC,CAAAA,CAAmB,sBAAA,CAAAO,CACrB,CACF,CC/yBO,SAASQ,EAAAA,CAAsBC,CAAAA,CAAwC,CAE5E,SAAStF,CAAAA,CAAM3S,EAA2B,CACxC,OAAO,CAAE,MAAA,CAAQ,SAAA,CAAW,IAAA,CAAAA,CAAK,CACnC,CACA,SAAS4S,CAAAA,CAAQvS,CAAAA,CAAiC,CAChD,OAAO,CAAE,MAAA,CAAQ,MAAA,CAAQ,KAAA,CAAAA,CAAM,CACjC,CACA,SAAS6X,CAAAA,CAAQzM,CAAAA,CAA8B,CAC7C,OAAO,CAAE,OAAQ,OAAA,CAAS,KAAA,CAAOA,CAAAA,YAAa,KAAA,CAAQA,CAAAA,CAAE,OAAA,CAAU,OAAOA,CAAC,CAAE,CAC9E,CAEA,OAAO,CACL,IAAI1O,CAAAA,CAA2D,CAC7D,GAAI,CACF,IAAMgE,CAAAA,CAAKhE,EAAM,MAAA,EAAS,EAAA,CAC1B,GAAIgE,CAAAA,CAAI,CACN,IAAMkK,EAAOgN,CAAAA,CAAM,QAAA,CAASlX,CAAE,CAAA,CAC9B,OAAKkK,CAAAA,CACE0H,EAAG,CAAE,KAAA,CAAO,CAAC1H,CAAI,CAAE,CAAC,EADT2H,CAAAA,CAAK,CAAA,MAAA,EAAS7R,CAAE,CAAA,WAAA,CAAa,CAEjD,CACA,OAAO4R,CAAAA,CAAG,CAAE,KAAA,CAAOsF,CAAAA,CAAM,YAAA,EAAe,CAAC,CAC3C,CAAA,MAASxM,CAAAA,CAAG,CAAE,OAAOyM,CAAAA,CAAKzM,CAAC,CAAG,CAChC,CAAA,CAEA,GAAA,CAAI1O,CAAAA,CAAuD,CACzD,GAAI,CACF,IAAMoZ,CAAAA,CAAOpZ,CAAAA,CAAM,IAAA,CACnB,GAAIoZ,GAAQ,IAAA,CAAM,OAAOvD,EAAK,qDAAqD,CAAA,CACnF,IAAM5H,CAAAA,CAAoB,KAAA,CAAM,OAAA,CAAQmL,CAAI,CAAA,CAAIA,CAAAA,CAAqB,CAACA,CAAgB,CAAA,CACtF,IAAA,IAAWlL,CAAAA,IAAQD,CAAAA,CAAO,CACxB,GAAI,OAAOC,CAAAA,CAAK,EAAA,EAAO,QAAA,CACrB,OAAO2H,CAAAA,CAAK,yCAAyC,CAAA,CAEvDqF,CAAAA,CAAM,SAAA,CAAUhN,CAAAA,CAAK,EAAA,CAAIA,CAAI,EAC/B,CACA,OAAO0H,CAAAA,CAAG,CAAE,KAAA,CAAO3H,CAAAA,CAAM,MAAO,CAAC,CACnC,CAAA,MAASS,CAAAA,CAAG,CAAE,OAAOyM,EAAKzM,CAAC,CAAG,CAChC,CAAA,CAEA,GAAA,CAAI1O,CAAAA,CAAuD,CACzD,GAAI,CACF,IAAMob,CAAAA,CAAWpb,CAAAA,CAAM,IAAA,EAAyC,KAAO,EAAC,CAClEqb,CAAAA,CAAUrb,CAAAA,CAAM,MAAA,EAAS,EAAA,CACzB2Z,EAAM0B,CAAAA,CAAU,CAAC,GAAGD,CAAAA,CAASC,CAAO,CAAA,CAAID,EAC9C,GAAIzB,CAAAA,CAAI,MAAA,GAAW,CAAA,CAAG,OAAO9D,CAAAA,CAAK,+CAA+C,CAAA,CACjF,IAAA,IAAW7R,CAAAA,IAAM2V,CAAAA,CAAKuB,CAAAA,CAAM,UAAA,CAAWlX,CAAE,CAAA,CACzC,OAAO4R,CAAAA,CAAG,CAAE,KAAA,CAAO+D,CAAAA,CAAI,MAAO,CAAC,CACjC,CAAA,MAASjL,CAAAA,CAAG,CAAE,OAAOyM,EAAKzM,CAAC,CAAG,CAChC,CAAA,CAEA,KAAA,CAAM1O,CAAAA,CAAuD,CAC3D,GAAI,CACF,IAAMgE,CAAAA,CAAKhE,CAAAA,CAAM,QAAS,EAAA,CACpB2N,CAAAA,CAAW3N,CAAAA,CAAM,MAAA,EAAS,IAAA,CAChC,GAAI,CAACgE,CAAAA,CAAI,OAAO6R,CAAAA,CAAK,0BAA0B,CAAA,CAC/C,GAAI,CAAClI,CAAAA,CAAU,OAAOkI,CAAAA,CAAK,4BAA4B,CAAA,CAEvD,IAAMuD,EAAOpZ,CAAAA,CAAM,IAAA,CACb+H,CAAAA,CAAQqR,CAAAA,EAAQ,MAAA,CAAO,SAAA,CAAU,eAAe,IAAA,CAAKA,CAAAA,CAAM,OAAO,CAAA,CACpEA,CAAAA,CAAK,KAAA,CACLpZ,EAAM,IAAA,CAEV,OAAAkb,CAAAA,CAAM,SAAA,CAAUlX,CAAAA,CAAI2J,CAAAA,CAAU5F,CAAK,CAAA,CAC5B6N,CAAAA,CAAG,CAAE,KAAA,CAAO,CAAE,CAAC,CACxB,CAAA,MAASlH,CAAAA,CAAG,CAAE,OAAOyM,CAAAA,CAAKzM,CAAC,CAAG,CAChC,CACF,CACF,CC9CA,IAAM4M,EAAAA,CAAY,wBAalB,SAASpF,EAAAA,EAAiB,CACxB,OAAO,IAAI,IAAA,GAAO,WAAA,EACpB,CAEA,SAASqF,EAAAA,CAAeC,CAAAA,CAAsB,CAC5C,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAOA,CAAI,EAAE,UACxC,CAEA,SAAS/N,EAAAA,CAAUqB,CAAAA,CAAkC,CACnD,IAAMrP,CAAAA,CAAMqP,CAAAA,CAAK,IAAA,CAAKwM,EAAS,CAAA,CAC/B,GAAI,CAAC7b,CAAAA,CAAK,OAAO,CAAE,OAAA,CAAS,EAAG,EAC/B,GAAI,CACF,IAAMc,CAAAA,CAAS,IAAA,CAAK,MAAMd,CAAG,CAAA,CAC7B,GAAIc,CAAAA,EAAUA,CAAAA,CAAO,OAAA,EAAW,OAAOA,CAAAA,CAAO,OAAA,EAAY,QAAA,CAAU,OAAOA,CAC7E,CAAA,KAAQ,CAER,CACA,OAAO,CAAE,OAAA,CAAS,EAAG,CACvB,CAEA,SAASkb,EAAAA,CAAU3M,CAAAA,CAAmBP,CAAAA,CAA4B,CAChEO,EAAK,KAAA,CAAMwM,EAAAA,CAAW,IAAA,CAAK,SAAA,CAAU/M,CAAAA,CAAO,IAAA,CAAM,CAAC,CAAC,EACtD,CAEA,SAASmN,EAAAA,CAAWC,CAAAA,CAA4C,CAC9D,OAAKA,CAAAA,CACE,CACL,GAAA,CAAKA,CAAAA,CAAK,GAAA,CACV,KAAMA,CAAAA,CAAK,IAAA,CACX,UAAWA,CAAAA,CAAK,SAAA,CAChB,YAAaA,CAAAA,CAAK,WACpB,CAAA,CANkB,IAOpB,CAEA,SAASC,GAAYrN,CAAAA,CAAsB/B,CAAAA,CAAaqP,CAAAA,CAA0B,CAChFtN,CAAAA,CAAM,OAAA,CAAQ/B,CAAG,CAAA,CAAI,CACnB,GAAA,CAAAA,CAAAA,CACA,IAAA,CAAMqP,CAAAA,CAAK,KACX,SAAA,CAAWA,CAAAA,CAAK,SAAA,CAChB,WAAA,CAAaA,CAAAA,CAAK,WACpB,EACF,CAEA,SAASC,EAAAA,CAAmBC,CAAAA,CAA0B,CACpD,IAAM9K,EAAI,MAAA,CAAO8K,CAAAA,EAAY,EAAE,CAAA,CAAE,KAAA,CAAM,YAAY,EACnD,OAAO9K,CAAAA,CAAI,QAAA,CAASA,CAAAA,CAAE,CAAC,CAAA,CAAG,EAAE,CAAA,CAAI,CAClC,CAEA,SAAS+K,EAAAA,CAAyBlX,EAAsB,CACtD,IAAM9E,CAAAA,CAAQ,MAAA,CAAO8E,CAAAA,EAAQ,EAAE,EAAE,IAAA,EAAK,CACtC,GAAI,CAAC9E,CAAAA,CAAO,OAAO,aACnB,IAAMic,CAAAA,CAAQ,IAAA,CAAK,GAAA,CAAIjc,CAAAA,CAAM,WAAA,CAAY,GAAG,CAAA,CAAGA,CAAAA,CAAM,WAAA,CAAY,IAAI,CAAC,CAAA,CAEtE,QADaic,CAAAA,EAAS,CAAA,CAAIjc,CAAAA,CAAM,KAAA,CAAMic,CAAAA,CAAQ,CAAC,EAAIjc,CAAAA,GACpC,YACjB,CAEA,SAASkc,EAAAA,CAAcC,CAAAA,CAAyB,CAO9C,OANmB,MAAA,CAAOA,CAAAA,EAAW,EAAE,CAAA,CACpC,WAAA,GACA,OAAA,CAAQ,MAAA,CAAQ,GAAG,CAAA,CACnB,OAAA,CAAQ,cAAA,CAAgB,GAAG,CAAA,CAC3B,OAAA,CAAQ,KAAA,CAAO,GAAG,CAAA,CAClB,OAAA,CAAQ,WAAY,EAAE,CAAA,EACJ,MACvB,CAEA,SAASC,EAAAA,CAAaC,EAAwB,CAC5C,GAAI,CAACA,CAAAA,EAAUA,CAAAA,GAAW,GAAA,CAAK,OAAO,EAAA,CACtC,IAAMC,CAAAA,CAAU,MAAA,CAAOD,CAAM,CAAA,CAAE,QAAQ,KAAA,CAAO,EAAE,CAAA,CAAE,WAAA,EAAY,CAAE,OAAA,CAAQ,aAAc,EAAE,CAAA,CACxF,OAAOC,CAAAA,CAAU,CAAA,CAAA,EAAIA,CAAO,GAAK,EACnC,CAEA,SAASC,EAAAA,CAAazX,CAAAA,CAA6C,CACjE,IAAM0X,CAAAA,CAAOR,EAAAA,CAAyBlX,CAAI,CAAA,CACpC2X,CAAAA,CAAMD,EAAK,WAAA,CAAY,GAAG,CAAA,CAChC,OAAIC,CAAAA,EAAO,CAAA,EAAKA,IAAQD,CAAAA,CAAK,MAAA,CAAS,CAAA,CAAU,CAAE,IAAA,CAAMA,CAAAA,CAAM,IAAK,EAAG,CAAA,CAC/D,CAAE,IAAA,CAAMA,CAAAA,CAAK,KAAA,CAAM,EAAGC,CAAG,CAAA,CAAG,GAAA,CAAKD,CAAAA,CAAK,KAAA,CAAMC,CAAG,CAAE,CAC1D,CAEA,SAASC,EAAAA,CAAgBlQ,CAAAA,CAAqB,CAC5C,IAAMyP,CAAAA,CAAQzP,CAAAA,CAAI,WAAA,CAAY,GAAG,CAAA,CACjC,OAAOyP,GAAS,CAAA,CAAIzP,CAAAA,CAAI,KAAA,CAAMyP,CAAAA,CAAQ,CAAC,CAAA,CAAIzP,CAC7C,CAEO,SAASmQ,EAAAA,CAAqB7N,CAAAA,CAAmC,CACtE,SAAS8N,EAAKpQ,CAAAA,CAAkC,CAC9C,IAAMqQ,CAAAA,CAAW/N,CAAAA,CAAK,IAAA,CAAO4M,GAAW5M,CAAAA,CAAK,IAAA,CAAKtC,CAAG,CAAC,CAAA,CAAI,IAAA,CAC1D,GAAIqQ,CAAAA,CAAU,OAAOA,CAAAA,CAGrB,IAAM7O,CAAAA,CADQP,EAAAA,CAAUqB,CAAI,CAAA,CACR,OAAA,CAAQtC,CAAG,CAAA,CAC/B,GAAIwB,CAAAA,CAAO,OAAO,CAAE,GAAGA,CAAM,CAAA,CAE7B,GAAI,CAACc,EAAK,MAAA,CAAOtC,CAAG,CAAA,CAAG,OAAO,IAAA,CAC9B,IAAM4C,EAAUN,CAAAA,CAAK,IAAA,CAAKtC,CAAG,CAAA,CAC7B,OAAI4C,CAAAA,GAAY,KAAa,CAAE,GAAA,CAAA5C,CAAI,CAAA,CAC5B,CACL,IAAAA,CAAAA,CACA,IAAA,CAAM+O,EAAAA,CAAenM,CAAO,CAC9B,CACF,CAEA,OAAO,CACL,MAAA,CAAO5C,CAAAA,CAAsB,CAC3B,OAAOsC,EAAK,MAAA,CAAOtC,CAAG,CACxB,CAAA,CAEA,OAAA,CAAQA,CAAAA,CAAa4C,EAAiB0N,CAAAA,CAAc,2BAAA,CAA2C,CAC7FhO,CAAAA,CAAK,KAAA,CAAMtC,CAAAA,CAAK4C,CAAO,CAAA,CACvB,IAAMyM,CAAAA,CAAOe,CAAAA,CAAKpQ,CAAG,CAAA,EAAK,CAAE,GAAA,CAAAA,CAAI,CAAA,CAChCqP,CAAAA,CAAK,WAAA,CAAciB,CAAAA,CACnBjB,EAAK,SAAA,CAAYA,CAAAA,CAAK,SAAA,EAAa3F,EAAAA,EAAO,CAC1C2F,CAAAA,CAAK,KAAOA,CAAAA,CAAK,IAAA,EAAQN,EAAAA,CAAenM,CAAO,CAAA,CAC/C,IAAMb,EAAQd,EAAAA,CAAUqB,CAAI,CAAA,CAC5B,OAAA8M,EAAAA,CAAYrN,CAAAA,CAAO/B,EAAKqP,CAAI,CAAA,CAC5BJ,EAAAA,CAAU3M,CAAAA,CAAMP,CAAK,CAAA,CACdsN,CACT,CAAA,CAEA,QAAA,CAASrP,CAAAA,CAAa4C,CAAAA,CAAqB0N,CAAAA,CAAc,0BAAA,CAA0C,CACjG,GAAIhO,CAAAA,CAAK,UAAA,CACPA,CAAAA,CAAK,UAAA,CAAWtC,CAAAA,CAAK4C,CAAO,CAAA,CAAA,KACvB,CAEL,IAAMoB,CAAAA,CAAW,IAAA,CAAK,SAAA,CAAU,CAAE,MAAA,CAAQ,aAAA,CAAe,IAAA,CAAM,CAAC,GAAGpB,CAAO,CAAE,CAAC,CAAA,CAC7EN,CAAAA,CAAK,KAAA,CAAMtC,CAAAA,CAAKgE,CAAQ,EAC1B,CACA,IAAMqL,EAAOe,CAAAA,CAAKpQ,CAAG,GAAK,CAAE,GAAA,CAAAA,CAAI,CAAA,CAChCqP,CAAAA,CAAK,WAAA,CAAciB,EACnBjB,CAAAA,CAAK,SAAA,CAAYA,CAAAA,CAAK,SAAA,EAAa3F,EAAAA,EAAO,CAC1C2F,EAAK,IAAA,CAAOA,CAAAA,CAAK,IAAA,EAAQzM,CAAAA,CAAQ,UAAA,CACjC,IAAMb,EAAQd,EAAAA,CAAUqB,CAAI,CAAA,CAC5B,OAAA8M,EAAAA,CAAYrN,CAAAA,CAAO/B,EAAKqP,CAAI,CAAA,CAC5BJ,EAAAA,CAAU3M,CAAAA,CAAMP,CAAK,CAAA,CACdsN,CACT,CAAA,CAEA,OAAA,CAAQrP,CAAAA,CAA4B,CAClC,IAAM/M,CAAAA,CAAMqP,EAAK,IAAA,CAAKtC,CAAG,CAAA,CACzB,GAAI/M,CAAAA,GAAQ,IAAA,CAAM,CAChB,GAAI,CAACqP,EAAK,SAAA,CAAW,OAAO,KAC5B,IAAM7O,CAAAA,CAAQ6O,CAAAA,CAAK,SAAA,CAAUtC,CAAG,CAAA,CAChC,OAAIvM,CAAAA,GAAU,IAAA,CAAa,IAAA,CACpB,MAAA,CAAO,IAAA,CAAKA,CAAK,EAAE,QAAA,CAAS,OAAO,CAC5C,CACA,GAAI,CACF,IAAMM,CAAAA,CAAS,IAAA,CAAK,KAAA,CAAMd,CAAG,CAAA,CAC7B,GAAIc,GAAUA,CAAAA,CAAO,MAAA,GAAW,aAAA,EAAiB,KAAA,CAAM,OAAA,CAAQA,CAAAA,CAAO,IAAI,CAAA,CACxE,OAAO,IAAI,WAAA,CAAY,OAAO,CAAA,CAAE,OAAO,IAAI,UAAA,CAAWA,CAAAA,CAAO,IAAI,CAAC,CAEtE,MAAQ,CAER,CACA,OAAOd,CACT,CAAA,CAEA,SAAS+M,CAAAA,CAAgC,CACvC,GAAIsC,CAAAA,CAAK,SAAA,CAAW,CAClB,IAAM7O,CAAAA,CAAQ6O,CAAAA,CAAK,SAAA,CAAUtC,CAAG,CAAA,CAChC,GAAIvM,IAAU,IAAA,CAAM,OAAOA,CAC7B,CACA,IAAMR,CAAAA,CAAMqP,EAAK,IAAA,CAAKtC,CAAG,CAAA,CACzB,GAAI/M,CAAAA,GAAQ,IAAA,CAAM,OAAO,IAAA,CACzB,GAAI,CACF,IAAMc,CAAAA,CAAS,IAAA,CAAK,MAAMd,CAAG,CAAA,CAC7B,GAAIc,CAAAA,EAAUA,CAAAA,CAAO,MAAA,GAAW,eAAiB,KAAA,CAAM,OAAA,CAAQA,CAAAA,CAAO,IAAI,CAAA,CACxE,OAAO,IAAI,UAAA,CAAWA,CAAAA,CAAO,IAAI,CAErC,CAAA,KAAQ,CAER,CACA,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAOd,CAAG,CACrC,CAAA,CAEA,IAAA,CAAAmd,CAAAA,CAEA,IAAA,CAAKG,CAAAA,CAAS,EAAA,CAAoB,CAChC,IAAMC,CAAAA,CAAY,IAAI,GAAA,CAEtB,GAAIlO,CAAAA,CAAK,SACP,IAAA,IAAWtC,CAAAA,IAAOsC,CAAAA,CAAK,QAAA,CAASiO,CAAM,CAAA,CAAG,CACvC,GAAIvQ,CAAAA,GAAQ8O,EAAAA,CAAW,SACvB,IAAMO,CAAAA,CAAOe,EAAKpQ,CAAG,CAAA,EAAK,CAAE,GAAA,CAAAA,CAAI,CAAA,CAChCwQ,EAAU,GAAA,CAAIxQ,CAAAA,CAAKqP,CAAI,EACzB,CAGF,IAAMtN,EAAQd,EAAAA,CAAUqB,CAAI,EAC5B,IAAA,GAAW,CAACtC,EAAKwB,CAAK,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQO,CAAAA,CAAM,OAAO,EACjD/B,CAAAA,GAAQ8O,EAAAA,EAAcyB,CAAAA,EAAU,CAACvQ,CAAAA,CAAI,UAAA,CAAWuQ,CAAM,CAAA,EACrDC,CAAAA,CAAU,GAAA,CAAIxQ,CAAG,CAAA,EAAGwQ,CAAAA,CAAU,IAAIxQ,CAAAA,CAAK,CAAE,GAAGwB,CAAM,CAAC,CAAA,CAG1D,OAAO,CAAC,GAAGgP,CAAAA,CAAU,MAAA,EAAQ,CAAA,CAAE,KAAK,CAACnK,CAAAA,CAAGvK,CAAAA,GAAMuK,CAAAA,CAAE,GAAA,CAAI,aAAA,CAAcvK,EAAE,GAAG,CAAC,CAC1E,CAAA,CAEA,MAAA,CAAOkE,CAAAA,CAAmB,CACxBsC,CAAAA,CAAK,MAAA,CAAOtC,CAAG,CAAA,CACf,IAAM+B,CAAAA,CAAQd,GAAUqB,CAAI,CAAA,CAC5B,OAAOP,CAAAA,CAAM,OAAA,CAAQ/B,CAAG,EACxBiP,EAAAA,CAAU3M,CAAAA,CAAMP,CAAK,EACvB,CACF,CACF,CAEO,SAAS0O,EAAAA,CACd/B,CAAAA,CACAgC,CAAAA,CACoB,CACpB,IAAMC,EAAgBD,CAAAA,EAAM,aAAiB,CAE7C,SAASE,CAAAA,CAASC,CAAAA,CAA4B,CAC5C,OAAO,CAAA,EAAGA,CAAU,CAAA,CAAA,EAAIF,CAAa,CAAA,CACvC,CAEA,SAAS1P,CAAAA,CAAU4P,CAAAA,CAAuC,CACxD,IAAM5d,CAAAA,CAAMyb,EAAM,OAAA,CAAQkC,CAAAA,CAASC,CAAU,CAAC,CAAA,CAC9C,GAAI,CAAC5d,CAAAA,CAAK,OAAO,EAAC,CAClB,GAAI,CACF,IAAMc,CAAAA,CAAS,IAAA,CAAK,KAAA,CAAMd,CAAG,CAAA,CAC7B,OAAK,KAAA,CAAM,OAAA,CAAQc,CAAM,CAAA,CAClBA,CAAAA,CACJ,MAAA,CAAQ+c,GAAQA,CAAAA,EAAO,OAAOA,CAAAA,CAAI,WAAA,EAAgB,QAAQ,CAAA,CAC1D,IAAKA,CAAAA,GAAS,CACb,MAAA,CAAQ,MAAA,CAAOA,CAAAA,CAAI,MAAA,EAAUxB,GAAmB,MAAA,CAAOwB,CAAAA,CAAI,WAAW,CAAC,CAAA,EAAK,CAAC,EAC7E,IAAA,CAAM,MAAA,CAAOA,CAAAA,CAAI,IAAA,EAAQ,QAAQ,CAAA,CAAE,aAAY,CAC/C,WAAA,CAAa,MAAA,CAAOA,CAAAA,CAAI,WAAW,CAAA,CACnC,KAAM,OAAOA,CAAAA,CAAI,IAAA,EAAS,QAAA,CAAWA,CAAAA,CAAI,IAAA,CAAO,GAAGD,CAAU,CAAA,OAAA,EAAU,MAAA,CAAOC,CAAAA,CAAI,WAAW,CAAC,GAC9F,UAAA,CAAY,OAAOA,CAAAA,CAAI,UAAA,EAAe,QAAA,CAAWA,CAAAA,CAAI,WAAa,IACpE,CAAA,CAAE,CAAA,CAT+B,EAUrC,CAAA,KAAQ,CACN,OAAO,EACT,CACF,CAEA,SAAS7B,EAAU4B,CAAAA,CAAoBE,CAAAA,CAAkC,CACvErC,CAAAA,CAAM,OAAA,CAAQkC,CAAAA,CAASC,CAAU,CAAA,CAAG,IAAA,CAAK,SAAA,CAAUE,CAAAA,CAAS,IAAA,CAAM,CAAC,EAAG,iCAAiC,EACzG,CAEA,SAASC,CAAAA,CAAWH,CAAAA,CAA4B,CAC9C,IAAM9O,CAAAA,CAAQd,EAAU4P,CAAU,CAAA,CAC9BI,EAAU,CAAA,CACd,IAAA,IAAWH,CAAAA,IAAO/O,CAAAA,CAAO,CACvB,IAAMmP,EAAS,MAAA,CAAOJ,CAAAA,CAAI,MAAA,EAAU,CAAC,CAAA,CACjC,MAAA,CAAO,SAASI,CAAM,CAAA,EAAKA,CAAAA,CAASD,CAAAA,GAASA,CAAAA,CAAUC,CAAAA,EAC7D,CACA,OAAOD,CAAAA,CAAU,CACnB,CAEA,SAASE,CAAAA,CAAkBN,EAAoBO,CAAAA,CAA+B,CAC5E,IAAMrP,CAAAA,CAAQd,CAAAA,CAAU4P,CAAU,EAClC9O,CAAAA,CAAM,IAAA,CAAKqP,CAAM,CAAA,CACjBnC,CAAAA,CAAU4B,CAAAA,CAAY9O,CAAK,EAC7B,CAEA,SAASsP,CAAAA,CAAYR,CAAAA,CAAkC,CACrD,IAAM9O,CAAAA,CAAQd,CAAAA,CAAU4P,CAAU,CAAA,CAC5BxP,CAAAA,CAAoB,EAAC,CAC3B,IAAA,IAAWyP,CAAAA,IAAO/O,CAAAA,CAAO,CACvB,IAAM/B,EAAM,CAAA,EAAG6Q,CAAU,CAAA,CAAA,EAAIC,CAAAA,CAAI,WAAW,CAAA,CAAA,CACtC9B,EAAON,CAAAA,CAAM,OAAA,CAAQ1O,CAAG,CAAA,CAC1BgP,CAAAA,GAAS,IAAA,EACb3N,EAAI,IAAA,CAAK,CACP,MAAA,CAAQ,MAAA,CAAOyP,CAAAA,CAAI,MAAA,EAAUxB,GAAmBwB,CAAAA,CAAI,WAAW,CAAA,EAAK,CAAC,CAAA,CACrE,IAAA,CAAM,OAAOA,CAAAA,CAAI,IAAA,EAAQ,QAAQ,CAAA,CAAE,WAAA,EAAY,CAC/C,KAAA9B,CAAAA,CACA,IAAA,CAAM,OAAO8B,CAAAA,CAAI,IAAA,EAAS,QAAA,CAAWA,EAAI,IAAA,CAAO,CAAA,EAAGD,CAAU,CAAA,OAAA,EAAUC,CAAAA,CAAI,WAAW,CAAA,CAAA,CACtF,WAAA,CAAaA,CAAAA,CAAI,WAAA,CACjB,UAAA,CAAYA,CAAAA,CAAI,YAAc,IAChC,CAAC,EACH,CACA,OAAAzP,CAAAA,CAAI,KAAK,CAACgF,CAAAA,CAAGvK,CAAAA,GAAMuK,CAAAA,CAAE,MAAA,CAASvK,CAAAA,CAAE,QAAUuK,CAAAA,CAAE,WAAA,CAAY,aAAA,CAAcvK,CAAAA,CAAE,WAAW,CAAC,EAC7EuF,CACT,CAEA,SAASiQ,CAAAA,CAAMT,CAAAA,CAA0B,CACvC,IAAMN,CAAAA,CAAS,CAAA,EAAGM,CAAU,CAAA,CAAA,CAAA,CAC5B,IAAA,IAAWrP,CAAAA,IAASkN,EAAM,IAAA,CAAK6B,CAAM,CAAA,CAAG7B,CAAAA,CAAM,MAAA,CAAOlN,CAAAA,CAAM,GAAG,EAChE,CAEA,SAAS+P,CAAAA,CAAWV,CAAAA,CAAgC,CAClD,IAAMN,CAAAA,CAAS,CAAA,EAAGM,CAAU,CAAA,CAAA,CAAA,CACtB1N,CAAAA,CAAUuL,CAAAA,CAAM,KAAK6B,CAAM,CAAA,CAC7BiB,CAAAA,CAAQ,CAAA,CACRC,CAAAA,CAAgB,CAAA,CAChBC,EAAa,KAAA,CACjB,IAAA,IAAWlQ,CAAAA,IAAS2B,CAAAA,CAAS,CAC3B,IAAM7K,EAAOkJ,CAAAA,CAAM,GAAA,CAAI,KAAA,CAAM+O,CAAAA,CAAO,MAAM,CAAA,CAC1C,GAAIjY,CAAAA,GAAS,aAAA,CAAe,CAC1BoZ,CAAAA,CAAa,IAAA,CACb,QACF,CACA,GAAI,CAAC,gCAAA,CAAiC,IAAA,CAAKpZ,CAAI,CAAA,CAAG,SAClDkZ,CAAAA,EAAS,CAAA,CACT,IAAMG,CAAAA,CAAUnQ,CAAAA,CAAM,SAAA,CAAY,OAAO,IAAI,IAAA,CAAKA,EAAM,SAAS,CAAA,CAAE,SAAQ,EAAK,CAAC,CAAA,CAAI,CAAA,CACjFmQ,CAAAA,CAAUF,CAAAA,GAAeA,EAAgBE,CAAAA,EAC/C,CACA,OAAO,CAAE,KAAA,CAAAH,CAAAA,CAAO,gBAAiBC,CAAAA,CAAe,UAAA,CAAAC,CAAW,CAC7D,CAEA,OAAO,CACL,QAAA,CAAAd,CAAAA,CACA,SAAA,CAAA3P,CAAAA,CACA,SAAA,CAAAgO,CAAAA,CACA,WAAA+B,CAAAA,CACA,iBAAA,CAAAG,CAAAA,CACA,WAAA,CAAAE,CAAAA,CACA,KAAA,CAAAC,EACA,UAAA,CAAAC,CACF,CACF,CAEO,SAASK,EAAAA,CAAyBlD,EAA2C,CAClF,SAASsC,CAAAA,CAAWH,CAAAA,CAAoBgB,CAAAA,CAA8B,CACpE,IAAIZ,CAAAA,CAAU,CAAA,CACRa,CAAAA,CAAkB,EAAC,CACrB,KAAA,CAAM,QAAQD,CAAS,CAAA,EAAGC,CAAAA,CAAM,IAAA,CAAK,GAAGD,CAAS,EACrD,IAAA,IAAWrQ,CAAAA,IAASkN,CAAAA,CAAM,IAAA,CAAK,CAAA,EAAGmC,CAAU,GAAG,CAAA,CAC7CiB,CAAAA,CAAM,IAAA,CAAK5B,EAAAA,CAAgB1O,CAAAA,CAAM,GAAG,CAAC,CAAA,CAEvC,IAAA,IAAWlJ,CAAAA,IAAQwZ,CAAAA,CAAO,CACxB,IAAMZ,EAAS5B,EAAAA,CAAmBhX,CAAI,CAAA,CAClC,MAAA,CAAO,QAAA,CAAS4Y,CAAM,GAAKA,CAAAA,CAASD,CAAAA,GAASA,CAAAA,CAAUC,CAAAA,EAC7D,CACA,OAAOD,EAAU,CACnB,CAEA,SAASc,CAAAA,CAAgBC,CAAAA,CAAqBd,CAAAA,CAAgBR,EAAoC,CAChG,IAAMuB,EAAS,MAAA,CAAOvB,CAAAA,EAAM,QAAU,EAAE,CAAA,CAClC,CAAE,IAAA,CAAAwB,CAAAA,CAAM,GAAA,CAAAC,CAAI,CAAA,CAAIpC,EAAAA,CAAaiC,CAAW,CAAA,CACxCI,CAAAA,CAAUxC,EAAAA,CAAauC,CAAG,CAAA,CAC1BE,CAAAA,CAAW3C,EAAAA,CAAcwC,CAAI,CAAA,CAC7B3B,CAAAA,CAAS,GAAG,MAAA,CAAOW,CAAM,CAAA,CAAE,QAAA,CAAS,CAAA,CAAG,GAAG,CAAC,CAAA,CAAA,CAAA,CAE7CoB,CAAAA,CAAUF,CAAAA,CACVG,CAAAA,CAAaN,CAAAA,CAAS1B,CAAAA,CAAO,OAAS+B,CAAAA,CAAQ,MAAA,CAC9CC,CAAAA,CAAa,CAAA,GACfD,CAAAA,CAAU,EAAA,CACVC,EAAaN,CAAAA,CAAS1B,CAAAA,CAAO,MAAA,CAAA,CAG/B,IAAMiC,CAAAA,CAAUH,CAAAA,CAAS,MAAM,CAAA,CAAG,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGE,CAAU,CAAC,EACrDlR,CAAAA,CAAM,CAAA,EAAGkP,CAAM,CAAA,EAAGiC,CAAO,CAAA,EAAGF,CAAO,CAAA,CAAA,CACvC,OAAIjR,CAAAA,CAAI,MAAA,CAAS4Q,CAAAA,GAAQ5Q,CAAAA,CAAMA,EAAI,KAAA,CAAM,CAAA,CAAG4Q,CAAM,CAAA,CAAE,OAAA,CAAQ,KAAA,CAAO,EAAE,CAAA,CAAA,CAC9D5Q,CACT,CAEA,SAASoR,CAAAA,CAAmB5B,CAAAA,CAAoBmB,EAAqBtB,CAAAA,CAA0D,CAC7H,IAAIQ,CAAAA,CAASF,CAAAA,CAAWH,CAAAA,CAAYH,GAAM,SAAS,CAAA,CAC/CrP,CAAAA,CAAM0Q,CAAAA,CAAgBC,CAAAA,CAAad,CAAAA,CAAQ,CAAE,MAAA,CAAQR,CAAAA,EAAM,MAAO,CAAC,CAAA,CACvE,KAAOhC,EAAM,MAAA,CAAO,CAAA,EAAGmC,CAAU,CAAA,CAAA,EAAIxP,CAAG,EAAE,CAAA,EACxC6P,CAAAA,EAAU,CAAA,CACV7P,CAAAA,CAAM0Q,CAAAA,CAAgBC,CAAAA,CAAad,EAAQ,CAAE,MAAA,CAAQR,CAAAA,EAAM,MAAO,CAAC,CAAA,CAErE,OAAOrP,CACT,CAEA,OAAO,CACL,UAAA,CAAA2P,CAAAA,CACA,gBAAAe,CAAAA,CACA,kBAAA,CAAAU,CACF,CACF,CAEO,SAASC,IAAqD,CACnE,SAASC,CAAAA,CAAkBC,CAAAA,CAAuBC,CAAAA,CAAgD,CAChG,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQD,CAAY,CAAA,CAAG,OAAO,EAAC,CAC1C,IAAMvR,CAAAA,CAA0B,EAAC,CACjC,IAAA,IAAWpO,KAAO2f,CAAAA,CAAc,CAC9B,GAAI,CAAC3f,CAAAA,EAAO,OAAOA,CAAAA,EAAQ,QAAA,CAAU,SACrC,IAAM6d,CAAAA,CAAM7d,CAAAA,CACR,OAAO6d,CAAAA,CAAI,WAAA,EAAgB,QAAA,EAC/BzP,CAAAA,CAAI,IAAA,CAAK,CACP,KAAM,OAAOyP,CAAAA,CAAI,IAAA,EAAS,QAAA,CAAWA,CAAAA,CAAI,IAAA,CAAOA,EAAI,WAAA,CACpD,WAAA,CAAaA,CAAAA,CAAI,WAAA,CACjB,IAAA,CAAM,OAAOA,EAAI,IAAA,EAAS,QAAA,EAAY,MAAA,CAAO,QAAA,CAASA,CAAAA,CAAI,IAAI,EAAIA,CAAAA,CAAI,IAAA,CAAO,IAAA,CAC7E,SAAA,CAAW,OAAOA,CAAAA,CAAI,WAAc,QAAA,CAAWA,CAAAA,CAAI,SAAA,CAAY,IAAA,CAC/D,IAAA,CAAM,OAAOA,EAAI,IAAA,EAAS,QAAA,CAAWA,EAAI,IAAA,CAAO,IAAA,CAChD,YAAa,OAAOA,CAAAA,CAAI,WAAA,EAAgB,QAAA,CAAWA,CAAAA,CAAI,WAAA,CAAe+B,GAAqB,IAC7F,CAAC,EACH,CACA,OAAOxR,CACT,CAEA,SAASyR,CAAAA,CAAKC,CAAAA,CAAuC,CACnD,OAAI,CAACA,GAAY,OAAOA,CAAAA,EAAa,QAAA,CAAiB,EAAC,CAEhDJ,CAAAA,CADKI,EACiB,KAAA,CAAO,MAAS,CAC/C,CAEA,SAASC,CAAAA,CAAMD,EAAmCE,CAAAA,CAAkD,CAClG,IAAMzP,CAAAA,CAAWsP,CAAAA,CAAKC,CAAQ,EAC9B,GAAIE,CAAAA,CAAS,MAAA,GAAW,CAAA,CACtB,OAAAF,CAAAA,CAAS,MAAQvP,CAAAA,CACVA,CAAAA,CAET,IAAM0P,CAAAA,CAAQ,IAAI,GAAA,CAAI1P,EAAS,GAAA,CAAK,CAAA,EAAM,CAAA,CAAE,WAAW,CAAC,CAAA,CACxD,QAAW2P,CAAAA,IAAQF,CAAAA,CACbC,CAAAA,CAAM,GAAA,CAAIC,CAAAA,CAAK,WAAW,IAC9B3P,CAAAA,CAAS,IAAA,CAAK2P,CAAI,CAAA,CAClBD,CAAAA,CAAM,GAAA,CAAIC,EAAK,WAAW,CAAA,CAAA,CAE5B,OAAAJ,CAAAA,CAAS,KAAA,CAAQvP,CAAAA,CACVA,CACT,CAEA,SAAS5D,CAAAA,CAAQmT,CAAAA,CAAmBhR,CAAAA,CAAeqR,CAAAA,CAA0D,CAC3G,IAAMC,CAAAA,CAAQP,CAAAA,CAAKC,CAAQ,CAAA,CAC3B,GAAI,CAAC,MAAA,CAAO,SAAA,CAAUhR,CAAK,CAAA,EAAKA,CAAAA,CAAQ,CAAA,EAAKA,GAASsR,CAAAA,CAAM,MAAA,CAC1D,OAAO,CAAE,EAAA,CAAI,MAAO,MAAA,CAAQ,oBAAqB,CAAA,CAEnD,IAAMF,CAAAA,CAAOE,CAAAA,CAAMtR,CAAK,CAAA,CACxB,OAAI,CAACoR,CAAAA,EAAQ,CAACA,CAAAA,CAAK,YAAoB,CAAE,EAAA,CAAI,KAAA,CAAO,MAAA,CAAQ,qBAAsB,CAAA,CAC9EC,GAAsBA,CAAAA,GAAuBD,CAAAA,CAAK,WAAA,CAC7C,CAAE,EAAA,CAAI,KAAA,CAAO,OAAQ,iBAAkB,CAAA,CAEzC,CAAE,EAAA,CAAI,IAAA,CAAM,IAAA,CAAAA,CAAK,CAC1B,CAEA,OAAO,CACL,IAAA,CAAAL,CAAAA,CACA,kBAAAH,CAAAA,CACA,KAAA,CAAAK,CAAAA,CACA,OAAA,CAAApT,CACF,CACF,CCzcA,IAAM0T,EAAAA,CAA+C,CACnD,6BAAA,CAA+B,GAAA,CAC/B,8BAAA,CAAgC,2BAChC,8BAAA,CAAgC,wBAClC,CAAA,CAEMC,EAAAA,CAA2B,EAAA,CAoCjC,SAASC,IAA2C,CAClD,OAAO,CAAE,MAAA,CAAQ,IAAA,CAAM,cAAA,CAAgB,EAAC,CAAG,WAAA,CAAa,EAAC,CAAG,KAAA,CAAO,EAAG,CACxE,CAEA,SAASC,EAAAA,CAAmB7d,CAAAA,CAA0B+B,CAAAA,CAAsB,CAC1E,GAAI,CAACA,CAAAA,EAAS,OAAOA,CAAAA,EAAU,QAAA,CAAU,OACzC,IAAMuK,CAAAA,CAAIvK,CAAAA,CAEV,GAAIuK,CAAAA,CAAE,IAAA,GAAS,sBAAwB,KAAA,CAAM,OAAA,CAAQA,CAAAA,CAAE,aAAa,CAAA,CAAG,CACrE,QAAWwR,CAAAA,IAAKxR,CAAAA,CAAE,cAAeuR,EAAAA,CAAmB7d,CAAAA,CAAO8d,CAAC,CAAA,CAC5D,MACF,CACIxR,CAAAA,CAAE,IAAA,GAAS,QAAA,GAAUtM,EAAM,MAAA,CAASsM,CAAAA,CAAE,MAAA,CAAA,CACtCA,CAAAA,CAAE,IAAA,GAAS,iBAAA,EAAqBA,EAAE,MAAA,GAAQtM,CAAAA,CAAM,cAAA,CAAesM,CAAAA,CAAE,MAAgB,CAAA,CAAIA,EAAE,MAAA,CAAA,CACvFA,CAAAA,CAAE,IAAA,GAAS,aAAA,EAAiBA,CAAAA,CAAE,GAAA,GAAKtM,EAAM,WAAA,CAAYsM,CAAAA,CAAE,GAAa,CAAA,CAAIA,CAAAA,CAAE,OAAA,CAAA,CAC1EA,EAAE,IAAA,GAAS,gBAAA,EAAoBA,CAAAA,CAAE,MAAA,GAAQtM,CAAAA,CAAM,KAAA,CAAMsM,EAAE,MAAgB,CAAA,CAAIA,CAAAA,CAAE,IAAA,EACnF,CAMO,SAASyR,GAA+BrX,CAAAA,CAAwD,CACrG,IAAMsX,CAAAA,CAAc,MAAA,CAAOtX,CAAAA,CAAQ,aAAe,YAAY,CAAA,CAAE,OAAA,CAAQ,KAAA,CAAO,EAAE,CAAA,CAC3EuX,EAAc,CAAE,GAAGP,EAAAA,CAAsB,GAAIhX,CAAAA,CAAQ,WAAA,EAAe,EAAI,CAAA,CACxEwX,CAAAA,CAAUxX,CAAAA,CAAQ,OAAA,EAAW,EAAA,CAC7ByX,EAAwBzX,CAAAA,CAAQ,MAAA,EAAU,CAAE,IAAA,CAAM,OAAA,CAAQ,GAAA,CAAK,KAAM,OAAA,CAAQ,IAAA,CAAM,KAAA,CAAO,OAAA,CAAQ,KAAM,CAAA,CACxG0X,EAAoB1X,CAAAA,CAAQ,iBAAA,CAC5B2X,CAAAA,CAAwB3X,CAAAA,CAAQ,qBAAA,EAAyB,IAAA,CACzD4X,EAAY5X,CAAAA,CAAQ,SAAA,EAAa,IAAA,CACjC6X,CAAAA,CAAiB7X,CAAAA,CAAQ,cAAA,EAAkB,EAAC,CAE5C8X,CAAAA,CAAa,IAAI,GAAA,CAIvB,SAASC,EAAa3W,CAAAA,CAAuC,CAC3D,IAAM4W,CAAAA,CAAQ3K,EAAAA,CAA2BjM,CAAAA,CAAI,QAASA,CAAAA,CAAI,YAAY,CAAA,CAChE2F,CAAAA,CAAK3F,CAAAA,CAAI,YAAA,CAAa,gBAAgBA,CAAAA,CAAI,YAAY,CAAA,CAStD8M,CAAAA,CAAYiE,EAAAA,CAAsB3N,EAAAA,CARjB,CACrB,SAAA,CAAW,IAAMuC,CAAAA,CAAG,IAAA,CAAK,QAAQ,CAAA,CACjC,WAAaH,CAAAA,EAAiBG,CAAAA,CAAG,KAAA,CAAM,QAAA,CAAUH,CAAG,CAAA,CACpD,SAAW1L,CAAAA,EAAe6L,CAAAA,CAAG,IAAA,CAAK7L,CAAE,CAAA,CACpC,SAAA,CAAW,CAACA,CAAAA,CAAYkK,CAAAA,IAAoB2B,CAAAA,CAAG,KAAA,CAAM7L,CAAAA,CAAIkK,CAAI,EAAUlK,CAAAA,CAAAA,CACvE,UAAA,CAAaA,GAAe6L,CAAAA,CAAG,IAAA,CAAK7L,CAAE,CAAA,GAAM,IAAA,CAC5C,cAAA,CAAiBA,CAAAA,EAAeA,CAClC,CAAA,CAC+Euc,EAAO,IAAI,CAAC,CAAA,CACrFQ,CAAAA,CAAa7W,CAAAA,CAAI,gBAAA,EAAoBA,EAAI,YAAA,CAI3C8W,CAAAA,CAAkE,IAAA,CAClEC,CAAAA,CAAkE,IAAA,CAEtE,OAAO,CACL,KAAA,CAAO/W,CAAAA,CAAI,KAAA,CACX,KAAA,CAAA4W,CAAAA,CACA,SAAA,CAAA9J,EACA,IAAI,cAAA,EAAiB,CAAE,OAAOgK,CAAAA,GAAoBrE,EAAAA,CAAqBoE,EAAW,WAAA,CAAY,OAAO,CAAC,CAAG,CAAA,CACzG,IAAI,gBAAiB,CAAE,OAAOE,CAAAA,GAAoBtE,EAAAA,CAAqBoE,CAAAA,CAAW,WAAA,CAAY,OAAO,CAAC,CAAG,EACzG,YAAA,CAAc7W,CAAAA,CAAI,aAClB,YAAA,CAAcA,CAAAA,CAAI,YAAA,CAClB,eAAA,CAAiBA,CAAAA,CAAI,eAAA,CACrB,UAAWA,CAAAA,CAAI,SAAA,CACf,eAAA,CAAiBA,CAAAA,CAAI,eAAA,CACrB,cAAA,CAAgBA,EAAI,cAAA,CACpB,mBAAA,CAAqBA,CAAAA,CAAI,mBAAA,CACzB,YAAA,CAAc8V,EAAAA,GACd,oBAAA,CAAsB,IAAA,CACtB,WAAA,CAAa,KAAA,CACb,iBAAA,CAAmB,KACrB,CACF,CAEA,IAAMkB,CAAAA,CAAgCpY,CAAAA,CAAQ,MAAA,CAAO,GAAA,CAAI+X,CAAY,CAAA,CAC/DM,CAAAA,CAAiB,IAAI,GAAA,CAE3B,SAASC,CAAAA,CAAWpS,EAAwB,CAAE,OAAOmS,CAAAA,CAAe,GAAA,CAAInS,CAAM,CAAA,EAAK,CAAG,CAItF,SAASqS,CAAAA,CAAgBrS,CAAAA,CAAgB,CACvC,IAAMtD,EAAMwV,CAAAA,CAAcE,CAAAA,CAAWpS,CAAM,CAAC,CAAA,CAC5C,OAAO,CACL,KAAA,CAAOtD,CAAAA,CAAMA,CAAAA,CAAI,cAAA,CAAiB,IAAA,CAClC,KAAA,CAAOA,EAAMA,CAAAA,CAAI,cAAA,CAAiB,IACpC,CACF,CAEA,SAAS4V,EAAqBtS,CAAAA,CAAgB,CAC5C,IAAMuS,CAAAA,CAASF,CAAAA,CAAgBrS,CAAM,EACrC,OAAKuS,CAAAA,CAAO,KAAA,CACLtE,EAAAA,CAAyBsE,CAAAA,CAAO,KAAA,CAAO,CAAE,aAAA,CAAe,aAAc,CAAC,CAAA,CADpD,IAE5B,CAEA,SAASC,CAAAA,CAAqBxS,CAAAA,CAAgB,CAC5C,IAAMuS,CAAAA,CAASF,CAAAA,CAAgBrS,CAAM,CAAA,CACrC,OAAKuS,EAAO,KAAA,CACLnD,EAAAA,CAAyBmD,EAAO,KAAK,CAAA,CADlB,IAE5B,CAEA,SAASE,CAAAA,EAAgC,CACvC,OAAOvC,EAAAA,EACT,CAIA,SAASwC,CAAAA,CAAW1S,EAAwB,CAC1C,OAAO,MAAA,CAAOA,CAAAA,EAAU,EAAE,CAAA,CAAE,QAAQ,iBAAA,CAAmB,GAAG,CAAA,EAAK,cACjE,CAIA,eAAe2S,EAA2BjW,CAAAA,CAAkC,CAE1E,GADI,CAACA,CAAAA,EAAOA,CAAAA,CAAI,sBACZ,CAAC+U,CAAAA,EAAyB,CAAC/U,CAAAA,CAAI,SAAA,CAAW,OAC9C,IAAMkW,CAAAA,CAAW,MAAMnB,CAAAA,CAAsB,SAAA,CAAU/U,CAAAA,CAAI,SAAA,CAAYvH,GAAU,CAC/E8b,EAAAA,CAAmBvU,CAAAA,CAAI,YAAA,CAAcvH,CAAK,CAAA,CAG1C,IAAMmS,CAAAA,CAAiBnS,CAAAA,CAAkC,IAAA,GAAS,oBAAA,CAC7DA,CAAAA,CAAoC,aAAA,CACrC,CAACA,CAAK,CAAA,CACV0d,EAAAA,CAAuCvL,CAAa,EACtD,CAAC,EACD5K,CAAAA,CAAI,oBAAA,CAAuBkW,EAC7B,CAIA,eAAeE,CAAAA,CAAYpW,EAAkC,CAE3D,GADI,CAACA,CAAAA,EACDA,CAAAA,CAAI,WAAA,CAAa,OAErB,IAAMqW,CAAAA,CAAS,CACb,YAAA,CAAcrW,CAAAA,CAAI,YAAA,CAClB,gBAAiBA,CAAAA,CAAI,eACvB,CAAA,CACM0N,CAAAA,CAAgC,EAAC,CACnC1N,EAAI,eAAA,GAAiB0N,CAAAA,CAAK,mBAAmB,CAAA,CAAI1N,CAAAA,CAAI,eAAA,CAAA,CACrDA,EAAI,cAAA,GAAgB0N,CAAAA,CAAK,kBAAkB,CAAA,CAAI1N,CAAAA,CAAI,gBACnDA,CAAAA,CAAI,mBAAA,GAAqB0N,CAAAA,CAAK,uBAAuB,CAAA,CAAI1N,CAAAA,CAAI,qBAEjE,IAAMsW,CAAAA,CAAatW,CAAAA,CAAI,KAAA,CAAM,IAAA,CAAK,CAAE,OAAAqW,CAAAA,CAAQ,IAAA,CAAA3I,CAAK,CAAC,CAAA,CAClD,GAAI4I,EAAW,MAAA,GAAW,SAAA,CACxB,MAAM,MAAA,CAAO,MAAA,CACX,IAAI,MAAOA,CAAAA,CAAmB,KAAA,EAAS,CAAA,gBAAA,EAAmBtW,CAAAA,CAAI,KAAK,CAAA,CAAE,EACrE,CAAE,UAAA,CAAY,GAAI,CACpB,CAAA,CAMF,GAHA,MAAMiW,CAAAA,CAA2BjW,CAAG,CAAA,CAGhCA,CAAAA,CAAI,cAAA,EAAkB8U,CAAAA,CAAkB,SAC1C,GAAI,CACF,IAAMyB,CAAAA,CAAO,MAAMzB,CAAAA,CAAkB,SAAS9U,CAAAA,CAAI,cAAc,CAAA,CAC5DuW,CAAAA,EAAQA,CAAAA,CAAK,IAAA,GAAS,eACxB1B,CAAAA,CAAO,IAAA,CAAK,CAAA,4CAAA,EAA+C0B,CAAAA,CAAK,IAAI,CAAA,+BAAA,EAAkCvW,EAAI,KAAK,CAAA,CAAE,CAAA,CACxGuW,CAAAA,EACT1B,CAAAA,CAAO,IAAA,CAAK,kCAAkC0B,CAAAA,CAAK,IAAI,CAAA,WAAA,EAAcA,CAAAA,CAAK,eAAe,CAAA,MAAA,EAASvW,EAAI,KAAK,CAAA,CAAE,EAEjH,CAAA,MAASG,CAAAA,CAAc,CACrB0U,EAAO,IAAA,CAAK,CAAA,wCAAA,EAA2C7U,CAAAA,CAAI,KAAK,CAAA,EAAA,EAAMG,CAAAA,EAAe,SAAW,MAAA,CAAOA,CAAG,CAAC,CAAA,CAAE,EAC/G,CAGFH,EAAI,WAAA,CAAc,KACpB,CAEA,SAASwW,CAAAA,CAA8BxW,EAAyB,CAC9D,GAAI,CAACA,CAAAA,CAAI,YAAA,CAAa,+BAAA,CAAiC,OACvD,IAAM4K,CAAAA,CAA+D,EAAC,CAEhE6L,CAAAA,CAAezW,CAAAA,CAAI,MAAM,MAAA,CAAO,EAAE,CAAA,CACpCyW,CAAAA,CAAa,MAAA,GAAW,WAAaA,CAAAA,CAAa,IAAA,EAAQ,IAAA,EAC5D7L,CAAAA,CAAc,IAAA,CAAK,CAAE,KAAM,QAAA,CAAU,MAAA,CAAQ6L,CAAAA,CAAa,IAAK,CAAC,CAAA,CAGlE,IAAMC,CAAAA,CAAa1W,CAAAA,CAAI,KAAA,CAAM,wBAAA,CAAyB,EAAE,EACxD,GAAI0W,CAAAA,CAAW,MAAA,GAAW,SAAA,EAAaA,CAAAA,CAAW,IAAA,EAAQ,KACxD,IAAA,GAAW,CAAC3f,EAAOiG,CAAO,CAAA,GAAK,OAAO,OAAA,CAAQ0Z,CAAAA,CAAW,IAA+B,CAAA,CAClF3f,CAAAA,EAAO6T,CAAAA,CAAc,KAAK,CAAE,IAAA,CAAM,aAAA,CAAe,GAAA,CAAK7T,CAAAA,CAAO,OAAA,CAAAiG,CAAQ,CAAC,CAAA,CAI9E,IAAM2Z,CAAAA,CAAW3W,CAAAA,CAAI,KAAA,CAAM,4BAA4B,EAAE,CAAA,CACzD,GAAI2W,CAAAA,CAAS,MAAA,GAAW,WAAaA,CAAAA,CAAS,IAAA,EAAQ,IAAA,CACpD,IAAA,GAAW,CAACrT,CAAAA,CAAQgC,CAAM,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQqR,CAAAA,CAAS,IAA+B,CAAA,CAChFrT,GAAQsH,CAAAA,CAAc,IAAA,CAAK,CAAE,IAAA,CAAM,iBAAA,CAAmB,MAAA,CAAAtH,EAAQ,MAAA,CAAAgC,CAAO,CAAC,CAAA,CAG1EsF,CAAAA,CAAc,OAAS,CAAA,EACzB5K,CAAAA,CAAI,YAAA,CAAa,+BAAA,CAAgC4K,CAA6F,EAElJ,CAEA,SAASgM,CAAAA,CAAsB5W,CAAAA,CAAmB6W,CAAAA,CAAwB,CAExE,GADI,CAAC7W,CAAAA,EACDA,CAAAA,CAAI,iBAAA,CAAmB,OAC3B,IAAM3I,CAAAA,CAAS2I,EAAI,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA,CAC7BuC,CAAAA,CAAyClL,EAAO,MAAA,GAAW,SAAA,EAAa,KAAA,CAAM,OAAA,CAASA,CAAAA,CAAe,IAAA,EAAM,KAAK,CAAA,CAClHA,CAAAA,CAAe,IAAA,CAAK,KAAA,CACrB,EAAC,CACL,QAAWmL,CAAAA,IAAQD,CAAAA,CACb,OAAOC,CAAAA,CAAK,EAAA,EAAO,QAAA,GACvBiT,EAAe,GAAA,CAAIjT,CAAAA,CAAK,EAAA,CAAcqU,CAAQ,CAAA,CAC9C7W,CAAAA,CAAI,MAAM,UAAA,CAAW,CAAE,MAAA,CAAQ,CAAE,MAAA,CAAQwC,CAAAA,CAAK,EAAa,CAAE,CAAC,CAAA,CAAA,CAEhExC,CAAAA,CAAI,iBAAA,CAAoB,KAC1B,CAEA,eAAe8W,CAAAA,EAAmC,CAChD,IAAA,IAAW9W,CAAAA,IAAOwV,CAAAA,CAChB,MAAMY,CAAAA,CAAYpW,CAAG,EAEzB,CAEA,eAAe+W,CAAAA,EAAgC,CAC7C,MAAMD,CAAAA,EAAkB,CACxB,IAAA,IAAStiB,CAAAA,CAAI,CAAA,CAAGA,EAAIghB,CAAAA,CAAc,MAAA,CAAQhhB,CAAAA,EAAAA,CAGxCgiB,CAAAA,CAA8BhB,CAAAA,CAAchhB,CAAC,CAAC,CAAA,CAC9CoiB,CAAAA,CAAsBpB,CAAAA,CAAchhB,CAAC,CAAA,CAAGA,CAAC,EAE7C,CAIA,SAASwiB,EAAmB1T,CAAAA,CAAqC,CAC/D,OAAOkS,CAAAA,CAAcE,CAAAA,CAAWpS,CAAM,CAAC,CAAA,EAAK,IAC9C,CAEA,SAAS2T,CAAAA,CAAkB3T,CAAAA,CAAgD,CACzE,IAAMtD,CAAAA,CAAMgX,EAAmB1T,CAAM,CAAA,CACrC,GAAI,CAACtD,CAAAA,CAAK,OAAO,KACjB,IAAM3I,CAAAA,CAAS2I,CAAAA,CAAI,SAAA,CAAU,GAAA,CAAI,CAAE,OAAQ,CAAE,EAAA,CAAIsD,CAAO,CAAE,CAAC,CAAA,CAC3D,GAAIjM,CAAAA,CAAO,MAAA,GAAW,SAAA,CAAW,OAAO,IAAA,CACxC,IAAMkL,EAAQ,KAAA,CAAM,OAAA,CAASlL,CAAAA,CAAe,IAAA,EAAM,KAAK,CAAA,CAAKA,EAAe,IAAA,CAAK,KAAA,CAAQ,EAAC,CACzF,OAAOkL,CAAAA,CAAM,OAAS,CAAA,CAAIA,CAAAA,CAAM,CAAC,CAAA,CAAI,IACvC,CAEA,SAAS2U,CAAAA,EAAsD,CAC7D,IAAMC,CAAAA,CAAWnX,CAAAA,EAA6D,CAC5E,GAAI,CAACA,CAAAA,EAAO,CAACA,CAAAA,CAAI,SAAA,CAAW,OAAO,EAAC,CACpC,IAAM3I,CAAAA,CAAS2I,CAAAA,CAAI,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA,CACnC,OAAI3I,CAAAA,CAAO,MAAA,GAAW,SAAA,EAAa,CAAC,KAAA,CAAM,OAAA,CAASA,CAAAA,CAAe,IAAA,EAAM,KAAK,CAAA,CACpE,EAAC,CAEFA,CAAAA,CAAe,IAAA,CAAK,KAC9B,CAAA,CACM0M,CAAAA,CAAsC,EAAC,CAC7C,IAAA,IAAW/D,KAAOwV,CAAAA,CAChBzR,CAAAA,CAAI,KAAK,GAAGoT,CAAAA,CAAQnX,CAAG,CAAC,CAAA,CAE1B,OAAO+D,CACT,CAIA,SAASqT,CAAAA,EAA8B,CACrC,IAAMC,CAAAA,CAAW7B,EAAc,GAAA,CAAKxV,CAAAA,EAAQ,CAC1C,GAAI,CAEF,IAAMsX,EADKtX,CAAAA,CAAI,YAAA,CAAa,eAAA,CAAgBA,CAAAA,CAAI,eAAe,CAAA,CAC1C,KAAK,QAAQ,CAAA,CAClC,GAAIsX,CAAAA,EAAc,IAAA,CAAiC,OAAOA,CAC5D,CAAA,KAAQ,CAER,CACA,OAAOtX,CAAAA,CAAI,YAAA,CAAa,MAC1B,CAAC,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CACjB,GAAIqX,EAAS,MAAA,GAAW,CAAA,CAAG,OAAO,IAAA,CAClC,GAAIA,CAAAA,CAAS,SAAW,CAAA,CAAG,OAAOA,CAAAA,CAAS,CAAC,CAAA,CAG5C,IAAME,EAAyB,EAAC,CAC1BC,CAAAA,CAAc,CAAC,WAAA,CAAa,UAAA,CAAY,UAAW,SAAA,CAAW,YAAA,CAAc,QAAA,CAAU,aAAA,CAAe,cAAc,CAAA,CACnHC,EAAiC,EAAC,CACxC,IAAA,IAAWlb,CAAAA,IAAKib,CAAAA,CAAaC,CAAAA,CAAOlb,CAAC,CAAA,CAAI,CAAA,CAEzC,IAAA,IAAWiJ,CAAAA,IAAU6R,CAAAA,CAAU,CAC7B,IAAM/a,CAAAA,CAAMkJ,CAAAA,CACNjD,CAAAA,CAAQ,KAAA,CAAM,OAAA,CAAQjG,CAAAA,CAAI,KAAK,CAAA,CAAIA,CAAAA,CAAI,KAAA,CAAQ,EAAC,CACtDib,CAAAA,CAAY,KAAK,GAAGhV,CAAK,EACzB,IAAA,IAAWhG,CAAAA,IAAKib,EACdC,CAAAA,CAAOlb,CAAC,CAAA,EAAK,MAAA,CAAQD,CAAAA,EAAa,OAAA,GAAUC,CAAC,CAAA,EAAK,CAAC,EAEvD,CAEA,IAAMmb,CAAAA,CAAQL,EAAS,CAAC,CAAA,CACxB,OAAO,CACL,GAAGK,CAAAA,CACH,MAAOH,CAAAA,CACP,OAAA,CAAS,CACP,GAAKG,CAAAA,CAAM,OAAA,EAAW,EAAC,CACvB,UAAA,CAAYH,CAAAA,CAAY,MAAA,CACxB,GAAGE,CACL,CACF,CACF,CAEA,SAASE,CAAAA,EAAoD,CAC3D,IAAMxV,EAA+B,EAAC,CAChCyV,CAAAA,CAAW5X,CAAAA,EAAsB,CACrC,IAAA,GAAW,CAACsD,CAAAA,CAAQgC,CAAM,IAAK,MAAA,CAAO,OAAA,CAAQtF,EAAI,YAAA,CAAa,cAAc,CAAA,CAAG,CAC9E,IAAMwC,CAAAA,CAAOxC,EAAI,YAAA,CAAa,KAAA,CAAMsD,CAAM,CAAA,CAC1CnB,CAAAA,CAAImB,CAAM,EAAI,CACZ,cAAA,CAAgB,IAAA,CAChB,OAAA,CAASA,CAAAA,CACT,SAAA,CAAWd,GAAM,SAAA,EAAa,EAAC,CAC/B,eAAA,CAAiB8C,CAAAA,EAAU,EAC7B,EACF,CACF,CAAA,CACA,IAAA,IAAWtF,CAAAA,IAAOwV,CAAAA,CAAeoC,EAAQ5X,CAAG,CAAA,CAC5C,OAAOmC,CACT,CAEA,SAAS0V,IAAkD,CACzD,IAAMC,CAAAA,CAAkC,EAAC,CACzC,IAAA,IAAW9X,KAAOwV,CAAAA,CAChB,MAAA,CAAO,OAAOsC,CAAAA,CAAQ9X,CAAAA,CAAI,aAAa,WAAA,EAAe,EAAE,CAAA,CAE1D,OAAO8X,CACT,CAEA,SAASC,EAAAA,CAAezU,CAAAA,CAAiF,CACvG,IAAM0U,CAAAA,CAAMhC,EAAW1S,CAAM,CAAA,CACvB2U,CAAAA,CAAYrC,CAAAA,CAAqBtS,CAAM,CAAA,CAC7C,OAAK2U,CAAAA,CACEA,CAAAA,CAAU,UAAA,CAAWD,CAAG,CAAA,CADR,CAAE,MAAO,CAAA,CAAG,eAAA,CAAiB,CAAA,CAAG,UAAA,CAAY,KAAM,CAE3E,CAEA,SAASE,EAAAA,EAAwC,CAC/C,IAAMC,CAAAA,CAAkBjB,CAAAA,GAClBkB,CAAAA,CAAeT,CAAAA,EAAyB,CACxCU,CAAAA,CAAqBR,EAAAA,EAAuB,CAC5CS,EAA2C,EAAC,CAElD,IAAA,IAAWC,CAAAA,IAAWJ,CAAAA,CAAiB,CACrC,GAAI,CAACI,CAAAA,EAAS,EAAA,CAAI,SAClB,IAAMjgB,CAAAA,CAAKigB,EAAQ,EAAA,CACbxkB,CAAAA,CAAOqkB,CAAAA,CAAa9f,CAAE,CAAA,EAAK,GAC3BkgB,CAAAA,CAAaT,EAAAA,CAAezf,CAAE,CAAA,CAC9Bub,CAAAA,CAAoC,CACxC,GAAK9f,CAAAA,CAAI,SAAA,EAAa,OAAOA,CAAAA,CAAI,SAAA,EAAc,QAAA,CAAWA,EAAI,SAAA,CAC1DwkB,CAAAA,CAAQ,SAAA,EAAa,OAAOA,CAAAA,CAAQ,SAAA,EAAc,SAAWA,CAAAA,CAAQ,SAAA,CACnE,EAAC,CACP,aAAA,CAAeC,CACjB,EACAF,CAAAA,CAAgBhgB,CAAE,CAAA,CAAI,CACpB,cAAA,CAAgBvE,CAAAA,CAAI,gBAAkB,IAAA,CACtC,OAAA,CAASA,EAAI,OAAA,EAAWuE,CAAAA,CACxB,UAAWub,CAAAA,CACX,eAAA,CAAiB9f,CAAAA,CAAI,eAAA,EAAmB,OAAOA,CAAAA,CAAI,iBAAoB,QAAA,CAAWA,CAAAA,CAAI,eAAA,CAAkB,EAC1G,EACF,CAEA,OAAO,CACL,OAAA,CAAA6gB,CAAAA,CACA,eAAA,CAAAuD,CAAAA,CACA,eAAgBf,CAAAA,EAAmB,CACnC,kBAAA,CAAAiB,CAAAA,CACA,eAAA,CAAAC,CACF,CACF,CAIA,SAASG,CAAAA,CAAWnV,CAAAA,CAAgBoV,CAAAA,CAA6ElH,CAAAA,CAAsC,CACrJ,IAAMmH,CAAAA,CAAYnH,CAAAA,EAAM,SAAA,GAAc,KAAA,CAChCxR,CAAAA,CAAMgX,EAAmB1T,CAAM,CAAA,CACrC,GAAI,CAACtD,CAAAA,CAAK,MAAM,OAAO,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmBsD,CAAM,CAAA,CAAE,EAAG,CAAE,UAAA,CAAY,GAAI,CAAC,CAAA,CAEzF,IAAMd,EAAOyU,CAAAA,CAAkB3T,CAAM,CAAA,CACrC,GAAI,CAACd,CAAAA,CAAM,MAAM,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmBc,CAAM,EAAE,CAAA,CAAG,CAAE,UAAA,CAAY,GAAI,CAAC,CAAA,CAE1F,IAAMsV,CAAAA,CAAWF,CAAAA,CAASlW,CAAI,CAAA,EAAKA,CAAAA,CAC7BqW,CAAAA,CAAY7Y,EAAI,SAAA,CAAU,GAAA,CAAI,CAAE,IAAA,CAAM4Y,CAAS,CAAC,EACtD,GAAIC,CAAAA,CAAU,MAAA,GAAW,SAAA,CACvB,MAAM,MAAA,CAAO,OAAO,IAAI,KAAA,CAAOA,EAAkB,KAAA,EAAS,CAAA,wBAAA,EAA2BvV,CAAM,CAAA,CAAE,CAAA,CAAG,CAAE,UAAA,CAAY,GAAI,CAAC,EAGrH,GAAIqV,CAAAA,CAAW,CACb,IAAMG,CAAAA,CAAe9Y,CAAAA,CAAI,MAAM,UAAA,CAAW,CAAE,MAAA,CAAQ,CAAE,MAAA,CAAAsD,CAAAA,CAAQ,QAAS,IAAK,CAAE,CAAC,CAAA,CAC/E,GAAIwV,CAAAA,CAAa,SAAW,SAAA,CAC1B,MAAM,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,CAAOA,EAAqB,KAAA,EAAS,CAAA,uBAAA,EAA0BxV,CAAM,CAAA,CAAE,CAAA,CAAG,CAAE,WAAY,GAAI,CAAC,CAEzH,CACF,CAEA,SAASyV,EAAWzV,CAAAA,CAAgBoV,CAAAA,CAAmF,CACrHD,CAAAA,CAAWnV,CAAAA,CAAQoV,CAAAA,CAAU,CAAE,SAAA,CAAW,IAAK,CAAC,EAClD,CAEA,SAASM,EAAoB1V,CAAAA,CAAgBoV,CAAAA,CAAmF,CAC9HD,CAAAA,CAAWnV,CAAAA,CAAQoV,CAAAA,CAAU,CAAE,SAAA,CAAW,KAAM,CAAC,EACnD,CAEA,SAASO,EAAU3V,CAAAA,CAAgB4V,CAAAA,CAAsC,CACvEH,CAAAA,CAAWzV,CAAAA,CAASd,CAAAA,EAAS,CAC3B,GAAI,CAAC0W,CAAAA,EAAS,OAAOA,CAAAA,EAAU,QAAA,EAAY,OAAO,IAAA,CAAKA,CAAK,CAAA,CAAE,MAAA,GAAW,CAAA,CAAG,OAAO1W,EAEnF,SAAS5C,CAAAA,CAAQtD,CAAAA,CAA8B6c,CAAAA,CAAoB9c,CAAAA,CAAsB,CACvF,IAAMqD,CAAAA,CAAQ,MAAA,CAAOyZ,GAAc,EAAE,CAAA,CAAE,MAAM,GAAG,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAChE,GAAI,CAACzZ,CAAAA,CAAM,MAAA,CAAQ,OACnB,IAAI0C,CAAAA,CAAS9F,CAAAA,CACb,QAAS9H,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIkL,CAAAA,CAAM,MAAA,CAAS,CAAA,CAAGlL,IAAK,CACzC,IAAMsM,CAAAA,CAAMpB,CAAAA,CAAMlL,CAAC,CAAA,CAAA,CACf,CAAC4N,CAAAA,CAAOtB,CAAG,CAAA,EAAK,OAAOsB,CAAAA,CAAOtB,CAAG,GAAM,QAAA,IAAUsB,CAAAA,CAAOtB,CAAG,CAAA,CAAI,EAAC,CAAA,CACpEsB,EAASA,CAAAA,CAAOtB,CAAG,EACrB,CACAsB,CAAAA,CAAO1C,CAAAA,CAAMA,EAAM,MAAA,CAAS,CAAC,CAAC,CAAA,CAAIrD,EACpC,CAEA,GAAI6c,CAAAA,CAAM,WAAA,EAAe,OAAOA,CAAAA,CAAM,WAAA,EAAgB,SAAU,CAC9D,IAAIE,CAAAA,CAAyB,IAAA,CACvBjY,CAAAA,CAAOqB,CAAAA,CAAK,KAClB,GAAIrB,CAAAA,EAAQ,KAAA,CAAM,OAAA,CAAQA,CAAAA,CAAK,QAAQ,GACrC,IAAA,IAAWC,CAAAA,IAAQD,CAAAA,CAAK,QAAA,CACtB,GAAIC,CAAAA,EAAM,MAASA,CAAAA,CAAa,IAAA,CAAK,OAAA,CAAS,CAAEgY,CAAAA,CAAWhY,CAAAA,CAAa,KAAK,OAAA,CAAS,KAAO,CAAA,CAG7FgY,CAAAA,CACFxZ,CAAAA,CAAQ4C,CAAAA,CAAM4W,EAASF,CAAAA,CAAM,WAAW,CAAA,CAExC1W,CAAAA,CAAK,SAAA,CAAY,CAAE,GAAKA,CAAAA,CAAK,SAAA,EAAa,EAAC,CAAgC,GAAI0W,EAAM,WAAwC,EAEjI,CAAA,KAAO,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQA,EAAM,YAAY,CAAA,EAAMA,CAAAA,CAAM,YAAA,CAA2B,MAAA,CAAS,CAAA,CACzF,OAAO1W,CAAAA,CAEP,IAAA,GAAW,CAAC1B,CAAAA,CAAKzE,CAAK,CAAA,GAAK,OAAO,OAAA,CAAQ6c,CAAK,CAAA,CACzCpY,CAAAA,GAAQ,cAAA,GACRzE,CAAAA,GAAU,MAAQ,OAAOA,CAAAA,EAAU,QAAA,EAAY,CAAC,KAAA,CAAM,OAAA,CAAQA,CAAK,CAAA,EACnEmG,CAAAA,CAAK1B,CAAG,CAAA,GAAM,IAAA,EAAQ,OAAO0B,EAAK1B,CAAG,CAAA,EAAM,QAAA,EAAY,CAAC,KAAA,CAAM,OAAA,CAAQ0B,EAAK1B,CAAG,CAAC,CAAA,CACjF0B,CAAAA,CAAK1B,CAAG,CAAA,CAAI,CAAE,GAAI0B,CAAAA,CAAK1B,CAAG,CAAA,CAA+B,GAAIzE,CAAkC,EAE/FmG,CAAAA,CAAK1B,CAAG,CAAA,CAAIzE,CAAAA,EAAAA,CAIlB,OAAOmG,CACT,CAAC,EACH,CAIA,SAAS4N,CAAAA,CAAmBC,CAAAA,CAA0B,CACpD,IAAM9K,CAAAA,CAAI,MAAA,CAAO8K,CAAAA,EAAY,EAAE,CAAA,CAAE,KAAA,CAAM,YAAY,CAAA,CACnD,OAAO9K,CAAAA,CAAI,QAAA,CAASA,CAAAA,CAAE,CAAC,EAAG,EAAE,CAAA,CAAI,CAClC,CAEA,SAAS+K,CAAAA,CAAyBlX,EAAsB,CACtD,IAAM9E,CAAAA,CAAQ,MAAA,CAAO8E,CAAAA,EAAQ,EAAE,EAAE,IAAA,EAAK,CACtC,GAAI,CAAC9E,CAAAA,CAAO,OAAO,YAAA,CAEnB,IAAM+kB,CAAAA,CAAY,IAAA,CAAK,GAAA,CAAI/kB,CAAAA,CAAM,YAAY,GAAG,CAAA,CAAGA,CAAAA,CAAM,WAAA,CAAY,IAAI,CAAC,EAE1E,OAAA,CADa+kB,CAAAA,EAAa,CAAA,CAAI/kB,CAAAA,CAAM,KAAA,CAAM+kB,CAAAA,CAAY,CAAC,CAAA,CAAI/kB,CAAAA,GAC5C,YACjB,CAEA,SAASglB,CAAAA,CAAiBhW,EAAsB,CAC9C,IAAM0U,CAAAA,CAAMhC,CAAAA,CAAW1S,CAAM,CAAA,CACvB2U,EAAYrC,CAAAA,CAAqBtS,CAAM,CAAA,CACxC2U,CAAAA,EACLA,CAAAA,CAAU,KAAA,CAAMD,CAAG,EACrB,CAEA,SAASuB,CAAAA,CAAmBjW,CAAAA,CAAgBkW,CAAAA,CAAsB,CAChE,IAAMxB,CAAAA,CAAMhC,CAAAA,CAAW1S,CAAM,CAAA,CACvB2U,CAAAA,CAAYrC,EAAqBtS,CAAM,CAAA,CACvC0O,CAAAA,CAASiG,CAAAA,CAAYA,CAAAA,CAAU,UAAA,CAAWD,CAAG,CAAA,CAAI,CAAA,CACjDyB,CAAAA,CAAW,MAAA,CAAOD,CAAAA,EAAQ,QAAQ,EAAE,WAAA,EAAY,CAAE,OAAA,CAAQ,cAAA,CAAgB,GAAG,CAAA,EAAK,SACxF,OAAO,CAAA,EAAG,MAAA,CAAOxH,CAAM,CAAA,CAAE,QAAA,CAAS,EAAG,GAAG,CAAC,CAAA,CAAA,EAAIyH,CAAQ,CAAA,IAAA,CACvD,CAEA,SAASC,EAAAA,CAAgBpW,CAAAA,CAAgBkW,CAAAA,CAAc1J,CAAAA,CAAcqE,CAAAA,CAAgE,CACnI,IAAMha,CAAAA,CAAM,IAAI,IAAA,EAAK,CAAE,WAAA,EAAY,CAC7B6d,EAAMhC,CAAAA,CAAW1S,CAAM,EACvBuS,CAAAA,CAASF,CAAAA,CAAgBrS,CAAM,CAAA,CAC/BqW,CAAAA,CAAUJ,CAAAA,CAAmBjW,CAAAA,CAAQkW,CAAAA,EAAQ,QAAQ,EACrDI,CAAAA,CAAc,CAAA,EAAG5B,CAAG,CAAA,CAAA,EAAI2B,CAAO,CAAA,CAAA,CAE/BE,EAAkB,EAAC,CACnBvZ,CAAAA,CAAM,OAAOwP,CAAAA,EAAS,QAAA,CAAWA,EAAK,IAAA,EAAK,CAAI,EAAA,CACjDxP,CAAAA,EAAKuZ,CAAAA,CAAM,IAAA,CAAKvZ,CAAG,CAAA,CAEvB,IAAMwZ,CAAAA,CAAW,KAAA,CAAM,OAAA,CAAQ3F,CAAK,EAAIA,CAAAA,CAAQ,EAAC,CACjD,GAAI2F,CAAAA,CAAS,MAAA,CAAQ,CACfD,CAAAA,CAAM,MAAA,EAAQA,CAAAA,CAAM,IAAA,CAAK,EAAE,CAAA,CAC/BA,EAAM,IAAA,CAAK,QAAQ,CAAA,CACnB,IAAA,IAAW5F,CAAAA,IAAQ6F,CAAAA,CAAU,CAC3B,GAAI,CAAC7F,CAAAA,EAAQ,OAAOA,CAAAA,EAAS,QAAA,CAAU,SACvC,IAAM8F,EAAAA,CAAU,OAAO9F,CAAAA,CAAK,IAAA,EAAS,QAAA,CAAWA,EAAK,IAAA,CAAO,MAAA,CACtD+F,EAAAA,CAAS,OAAO/F,CAAAA,CAAK,WAAA,EAAgB,SAAWA,CAAAA,CAAK,WAAA,CAAc,EAAA,CACzE4F,CAAAA,CAAM,IAAA,CAAKG,EAAAA,CAAS,KAAKD,EAAO,CAAA,IAAA,EAAOC,EAAM,CAAA,CAAA,CAAK,CAAA,EAAA,EAAKD,EAAO,EAAE,EAClE,CACF,CAEIlE,CAAAA,CAAO,KAAA,EAAOA,CAAAA,CAAO,MAAM,OAAA,CAAQ+D,CAAAA,CAAa,CAAA,EAAGC,CAAAA,CAAM,IAAA,CAAK;AAAA,CAAI,CAAC;AAAA,CAAI,CAAA,CAC3E,IAAM7H,CAAAA,CAAS5B,CAAAA,CAAmBuJ,CAAO,CAAA,CACnC1B,EAAAA,CAAYrC,CAAAA,CAAqBtS,CAAM,CAAA,CAC7C,OAAI2U,IACFA,EAAAA,CAAU,iBAAA,CAAkBD,EAAK,CAC/B,MAAA,CAAAhG,EACA,IAAA,CAAMwH,CAAAA,EAAQ,QAAA,CACd,WAAA,CAAaG,CAAAA,CACb,IAAA,CAAM,GAAGrW,CAAM,CAAA,OAAA,EAAUqW,CAAO,CAAA,CAAA,CAChC,UAAA,CAAYxf,CACd,CAAC,CAAA,CAEI,CAAE,EAAA,CAAIA,CAAAA,CAAK,IAAA,CAAMqf,GAAQ,QAAA,CAAU,IAAA,CAAMlZ,EAAK,KAAA,CAAOwZ,CAAAA,CAAU,KAAM,CAAA,EAAGxW,CAAM,CAAA,OAAA,EAAUqW,CAAO,CAAA,CAAG,CAC3G,CAEA,SAASM,EAAAA,CAAgB3W,EAAgD,CACvE,IAAM0U,EAAMhC,CAAAA,CAAW1S,CAAM,CAAA,CACvB2U,CAAAA,CAAYrC,CAAAA,CAAqBtS,CAAM,EAC7C,OAAK2U,CAAAA,CACEA,EAAU,WAAA,CAAYD,CAAG,EAAE,GAAA,CAAKpG,CAAAA,GAAS,CAC9C,GAAGA,CAAAA,CACH,IAAA,CAAM,GAAGtO,CAAM,CAAA,OAAA,EAAUsO,EAAI,WAAW,CAAA,CAC1C,EAAE,CAAA,CAJqB,EAKzB,CAEA,SAASsI,EAAAA,CAAwB5W,EAA0B,CACzD,IAAMsP,CAAAA,CAAkB,EAAC,CACzB,GAAI,CACF,IAAMpQ,CAAAA,CAAOyU,CAAAA,CAAkB3T,CAAM,CAAA,CACrC,GAAI,CAACd,CAAAA,CAAM,OAAOoQ,EAClB,IAAMuH,CAAAA,CAAWpE,GAA8B,CAAE,IAAA,CAAKvT,CAAAA,CAAK,SAAA,EAAa,OAAOA,CAAAA,CAAK,WAAc,QAAA,CAAWA,CAAAA,CAAK,UAAY,IAAI,CAAA,CAClI,QAAWF,CAAAA,IAAS6X,CAAAA,CAAUvH,CAAAA,CAAM,IAAA,CAAMtQ,CAAAA,CAAc,WAAW,EACrE,CAAA,KAAQ,CAAe,CACvB,OAAOsQ,CACT,CAEA,SAASwH,EAAAA,CAAoB9W,CAAAA,CAAgB+W,CAAAA,CAAuBjJ,CAAAA,CAAqBkJ,CAAAA,CAA6C,CACpI,IAAMtC,CAAAA,CAAMhC,CAAAA,CAAW1S,CAAM,CAAA,CACvBuS,CAAAA,CAASF,EAAgBrS,CAAM,CAAA,CAC/BwP,CAAAA,CAAcxC,CAAAA,CAAyB+J,CAAa,CAAA,CACpDE,EAAYzE,CAAAA,CAAqBxS,CAAM,EACvCkX,CAAAA,CAAaD,CAAAA,CACfA,EAAU,kBAAA,CAAmBvC,CAAAA,CAAKlF,CAAAA,CAAa,CAC/C,SAAA,CAAWoH,EAAAA,CAAwB5W,CAAM,CAAA,CACzC,MAAA,CAAQ+Q,EACV,CAAC,CAAA,CACC,GAAG,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,CAAC,CAAA,CAAA,EAAIvB,CAAW,CAAA,CAAA,CAExC,OAAI+C,EAAO,KAAA,EACTA,CAAAA,CAAO,MAAM,QAAA,CAAS,CAAA,EAAGmC,CAAG,CAAA,CAAA,EAAIwC,CAAU,CAAA,CAAA,CAAI,IAAI,UAAA,CAAWF,CAAM,CAAA,CAAGlJ,CAAAA,EAAe,0BAA0B,CAAA,CAG1G,CACL,IAAA,CAAM0B,CAAAA,CACN,WAAA,CAAa0H,CAAAA,CACb,IAAA,CAAMF,CAAAA,CAAO,OACb,SAAA,CAAWlJ,CAAAA,EAAe,2BAC1B,IAAA,CAAM,CAAA,EAAG9N,CAAM,CAAA,OAAA,EAAUkX,CAAU,CAAA,CAAA,CACnC,WAAA,CAAa,IAAI,IAAA,GAAO,WAAA,EAC1B,CACF,CAIA,SAASC,GAAkBnX,CAAAA,CAAgBoX,CAAAA,CAAwBC,CAAAA,CAA4B,CAC7F,IAAM3a,CAAAA,CAAMgX,EAAmB1T,CAAM,CAAA,CACrC,GAAI,CAACtD,CAAAA,CAAK,OAEV,IAAM4a,CAAAA,CAAY5a,CAAAA,CAAI,KAAA,CAAM,SAAA,CAAU,CAAE,OAAQ,CAAE,GAAA,CAAK,cAAe,CAAE,CAAC,CAAA,CACzE,GAAI4a,CAAAA,CAAU,MAAA,GAAW,SAAA,CAAW,OACpC,IAAMC,CAAAA,CAAcD,EAAkB,IAAA,EAAM,KAAA,CAC5C,GAAI,CAACC,CAAAA,EAAc,OAAOA,CAAAA,EAAe,QAAA,CAAU,OAEnD,IAAM7C,CAAAA,CAAMhC,CAAAA,CAAW1S,CAAM,CAAA,CACvBuS,CAAAA,CAASF,EAAgBrS,CAAM,CAAA,CAC/BwX,EAAsB,CAAA,EAAG9C,CAAG,CAAA,YAAA,CAAA,CAClC,GAAI,CAAEnC,CAAAA,CAAO,OAAO,OAAA,CAAQiF,CAAAA,CAAqB,GAAI,2BAA2B,EAAG,MAAQ,CAAC,CAE5F,IAAMC,CAAAA,CAAgC,CACpC,OAAA,CAAAnG,EACA,MAAA,CAAQ,MAAA,CAAOtR,CAAM,CAAA,CACrB,cAAA,CAAAoX,CAAAA,CACA,wBAAyBI,CAAAA,CACzB,YAAA,CAAAH,CAAAA,CACA,GAAG1F,CAAAA,CACH,GAAID,EAAY,CAAE,SAAA,CAAAA,CAAU,CAAA,CAAI,EAClC,CAAA,CAEAF,CAAAA,CAAkB,MAAA,CAAO+F,CAAAA,CAAYE,CAAI,CAAA,CAAE,KACxC1jB,CAAAA,EAAW,CACV,GAAIA,CAAAA,CAAO,UAAA,CACTwd,EAAO,IAAA,CAAK,CAAA,iCAAA,EAAoCvR,CAAM,CAAA,aAAA,EAAgBsR,CAAO,CAAA,EAAA,CAAI,OAC5E,CACL,GAAI,CAAEiB,CAAAA,CAAO,KAAA,EAAO,OAAOiF,CAAmB,EAAG,CAAA,KAAQ,CAAC,CAC1DjG,CAAAA,CAAO,KAAK,CAAA,yCAAA,EAA4CvR,CAAM,CAAA,GAAA,EAAMjM,CAAAA,CAAO,KAAA,EAAS,SAAS,EAAE,EACjG,CACF,CAAA,CACC8I,CAAAA,EAAQ,CACP,GAAI,CAAE0V,CAAAA,CAAO,KAAA,EAAO,OAAOiF,CAAmB,EAAG,MAAQ,CAAC,CAC1DjG,CAAAA,CAAO,IAAA,CAAK,CAAA,uCAAA,EAA0CvR,CAAM,MAAMnD,CAAAA,EAAK,OAAA,EAAW,OAAOA,CAAG,CAAC,EAAE,EACjG,CACF,EACF,CAIA,SAAS6a,EAAAA,CAAgB1X,EAAgB2X,CAAAA,CAAoBje,CAAAA,CAA+C,CAC1G,IAAMke,CAAAA,CAAcD,IAAe,WAAA,CAAcjC,CAAAA,CAAsBD,CAAAA,CACnEoC,CAAAA,CAEJD,CAAAA,CAAY5X,CAAAA,CAASd,GAAS,CAC5B,IAAMrI,CAAAA,CAAM,IAAI,IAAA,EAAK,CAAE,aAAY,CAC7B0Z,CAAAA,CAAWrR,CAAAA,CAAK,SAAA,EAAa,OAAOA,CAAAA,CAAK,WAAc,QAAA,CAAWA,CAAAA,CAAK,UAAuC,EAAC,CAGrH,GAFAA,CAAAA,CAAK,SAAA,CAAYqR,CAAAA,CAEboH,CAAAA,GAAe,WAAA,CAAa,CAC9B,IAAMnL,CAAAA,CAAO9S,CAAAA,EAAW,OAAOA,CAAAA,CAAQ,IAAA,EAAS,SAAWA,CAAAA,CAAQ,IAAA,CAAK,IAAA,EAAK,CAAI,EAAA,CAC3EmX,CAAAA,CAAwC,EAAC,CAC/C,GAAI,MAAM,OAAA,CAAQnX,CAAAA,EAAS,KAAK,CAAA,CAAA,CAC9B,IAAA,IAAWrB,CAAAA,IAAKqB,CAAAA,CAAQ,KAAA,CACtB,GAAKrB,EACL,CAAA,GAAI,OAAOA,CAAAA,EAAM,QAAA,CAAU,CAAEwY,CAAAA,CAAM,KAAK,CAAE,IAAA,CAAMxY,CAAE,CAAC,CAAA,CAAG,QAAU,CAChE,GAAI,OAAOA,GAAM,QAAA,CAAU,CACzB,IAAMyf,CAAAA,CAAKzf,CAAAA,CACP,OAAOyf,CAAAA,CAAG,IAAA,EAAS,QAAA,EAAUjH,EAAM,IAAA,CAAK,CAAE,KAAMiH,CAAAA,CAAG,IAAA,CAAM,KAAMA,CAAAA,CAAG,IAAA,CAAM,SAAA,CAAWA,CAAAA,CAAG,SAAA,CAAW,IAAA,CAAMA,EAAG,IAAA,CAAM,WAAA,CAAaA,EAAG,WAAA,CAAa,WAAA,CAAaA,EAAG,WAAY,CAAC,EAChL,CAAA,CAAA,CAIJ,GAAItL,CAAAA,EAAQqE,EAAM,MAAA,CAAS,CAAA,CAAG,CAC5B,IAAM6D,CAAAA,CAAMhC,CAAAA,CAAW1S,CAAM,CAAA,CAEvB+X,CAAAA,CADa3B,EAAAA,CAAgBpW,CAAAA,CAAQ,MAAA,CAAQwM,CAAAA,CAAMqE,CAAK,CAAA,CACnC,IAAA,CACrBmH,GAAUD,CAAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,CAAIA,CAAAA,CAAQ,KAAA,CAAMA,CAAAA,CAAQ,WAAA,CAAY,GAAG,EAAI,CAAC,CAAA,CAAIA,EACtFF,CAAAA,CAAoB,CAAE,eAAgB,CAAA,EAAGnD,CAAG,CAAA,MAAA,CAAA,CAAU,YAAA,CAAcsD,EAAQ,CAAA,CAC5E,QAAWrH,CAAAA,IAAQE,CAAAA,CAAO,CACxB,GAAI,CAACF,GAAQ,OAAOA,CAAAA,EAAS,QAAA,CAAU,SACvC,IAAM8F,EAAAA,CAAU,OAAO9F,CAAAA,CAAK,IAAA,EAAS,QAAA,CAAWA,CAAAA,CAAK,IAAA,CAAO,MAAA,CACtD+F,GAAS,OAAO/F,CAAAA,CAAK,WAAA,EAAgB,QAAA,CAAWA,CAAAA,CAAK,WAAA,CAAc,KACpE+F,EAAAA,EACLN,EAAAA,CAAgBpW,EAAQ,QAAA,CAAU,CAAA,KAAA,EAAQyW,EAAO,CAAA,aAAA,EAAgBC,EAAM,CAAA,CAAA,CAAA,CAAK,EAAE,EAChF,CACF,CACA,OAAOxX,CACT,CAEA,GAAIyY,IAAe,aAAA,CAAe,CAChC,IAAM9G,CAAAA,CAAQ4B,CAAAA,EAA8B,CAAE,kBAAkB/Y,CAAAA,EAAS,KAAA,CAAO7C,CAAG,CAAA,CACnF,OAAIga,EAAM,MAAA,CAAS,CAAA,EAAG4B,CAAAA,EAA8B,CAAE,KAAA,CAAMlC,CAAAA,CAAUM,CAAK,CAAA,CACpE3R,CACT,CAEA,GAAIyY,CAAAA,GAAe,QAAA,CAAU,CAC3B,IAAMM,CAAAA,CAAWve,CAAAA,EAAW,OAAOA,CAAAA,CAAQ,QAAA,EAAa,SAAWA,CAAAA,CAAQ,QAAA,CAAW,GACtF,GAAI,CAACue,EAAU,OAAO/Y,CAAAA,CACtBqR,CAAAA,CAAS,UAAA,CAAa,CAAE,QAAA,CAAA0H,EAAU,EAAA,CAAIphB,CAAI,EAC1C0Z,CAAAA,CAAS,cAAA,CAAiB,GAAG0H,CAAQ,CAAA,GAAA,EAAMphB,CAAG,CAAA,EAChD,CAEA,OAAOqI,CACT,CAAC,CAAA,CAEG2Y,GACFV,EAAAA,CAAkBnX,CAAAA,CAAQ6X,EAAkB,cAAA,CAAgBA,CAAAA,CAAkB,YAAY,EAE9F,CAIA,SAASjf,EAAKsf,CAAAA,CAAsBhW,CAAAA,CAAgBxI,CAAAA,CAAwB,CAC1E,IAAM0Q,CAAAA,CAAO,KAAK,SAAA,CAAU1Q,CAAO,CAAA,CAC7Bye,CAAAA,CAAU,OAAO,MAAA,CAAW,IAAc,MAAA,CAAO,UAAA,CAAW/N,CAAI,CAAA,CAAI,IAAI,aAAY,CAAE,MAAA,CAAOA,CAAI,CAAA,CAAE,MAAA,CACzG8N,CAAAA,CAAI,UAAUhW,CAAAA,CAAQ,CACpB,GAAGmP,CAAAA,CACH,cAAA,CAAgB,kCAChB,gBAAA,CAAkB8G,CACpB,CAAC,CAAA,CACDD,CAAAA,CAAI,GAAA,CAAI9N,CAAI,EACd,CAEA,eAAegO,EAAAA,CAAaxgB,CAAAA,CAAuD,CACjF,IAAMygB,CAAAA,CAAqC,EAAC,CAC5C,UAAA,IAAiBzU,CAAAA,IAAKhM,EAAKygB,CAAAA,CAAO,IAAA,CAAKzU,CAAC,CAAA,CACxC,IAAMnT,CAAAA,CAAM,OAAO,MAAA,CAAW,GAAA,CAC1B,MAAA,CAAO,MAAA,CAAO4nB,CAAkB,CAAA,CAAE,SAAS,OAAO,CAAA,CAAE,MAAK,CACzD,IAAI,aAAY,CAAE,MAAA,CAAOC,EAAAA,CAAkBD,CAAsB,CAAC,CAAA,CAAE,MAAK,CAC7E,OAAK5nB,EACE,IAAA,CAAK,KAAA,CAAMA,CAAG,CAAA,CADJ,EAEnB,CAEA,eAAe8nB,EAAAA,CAAY3gB,EAA0C,CACnE,IAAMygB,EAAqC,EAAC,CAC5C,cAAiBzU,CAAAA,IAAKhM,CAAAA,CAAKygB,CAAAA,CAAO,IAAA,CAAKzU,CAAC,CAAA,CACxC,OAAI,OAAO,MAAA,CAAW,GAAA,CAAoB,MAAA,CAAO,MAAA,CAAOyU,CAAkB,EACnEC,EAAAA,CAAkBD,CAAsB,CACjD,CAEA,SAASC,EAAAA,CAAkBE,EAAkC,CAC3D,IAAMC,EAAWD,CAAAA,CAAO,MAAA,CAAO,CAACE,CAAAA,CAAK7U,CAAAA,GAAM6U,CAAAA,CAAM7U,CAAAA,CAAE,MAAA,CAAQ,CAAC,EACtD9P,CAAAA,CAAS,IAAI,WAAW0kB,CAAQ,CAAA,CAClCE,EAAS,CAAA,CACb,IAAA,IAAW9U,CAAAA,IAAK2U,CAAAA,CAAUzkB,CAAAA,CAAO,GAAA,CAAI8P,EAAG8U,CAAM,CAAA,CAAGA,GAAU9U,CAAAA,CAAE,MAAA,CAC7D,OAAO9P,CACT,CAIA,IAAI6kB,EAAAA,CAAa,CAAA,CAEjB,SAASC,GAAcnf,CAAAA,CAA0B,CAC/C,IAAMof,CAAAA,CAAU,IAAA,CAAK,SAAA,CAAUpf,CAAO,CAAA,CACtC,OAAAkf,EAAAA,EAAAA,CACO,CAAA,IAAA,EAAOA,EAAU;AAAA,MAAA,EAAWE,CAAO;;AAAA,CAC5C,CAEA,SAASjG,EAAAA,CAAuCvL,CAAAA,CAAgC,CAC9E,GAAI,CAACA,CAAAA,EAAiBA,CAAAA,CAAc,MAAA,GAAW,EAAG,OAClD,IAAMyR,EAAQF,EAAAA,CAAc,CAAE,KAAM,oBAAA,CAAsB,aAAA,CAAAvR,CAAc,CAAC,EACzE,IAAA,IAAW0R,CAAAA,IAAUpH,EACnB,GAAI,CAAEoH,EAAO,KAAA,CAAMD,CAAK,EAAG,CAAA,KAAQ,CAAEnH,CAAAA,CAAW,MAAA,CAAOoH,CAAM,EAAG,CAEpE,CAEA,SAASC,EAAAA,CAAUrhB,CAAAA,CAAqBsgB,CAAAA,CAA4B,CAClEA,CAAAA,CAAI,SAAA,CAAU,GAAA,CAAK,CACjB,GAAG7G,CAAAA,CACH,cAAA,CAAgB,mBAAA,CAChB,eAAA,CAAiB,WACjB,UAAA,CAAc,YAChB,CAAC,CAAA,CACDO,CAAAA,CAAW,IAAIsG,CAAG,CAAA,CAIlB,IAAMxe,CAAAA,CAAUkb,IAA6B,CACvCmE,CAAAA,CAAQF,GAAcnf,CAAO,CAAA,CACnCwe,EAAI,KAAA,CAAMa,CAAK,CAAA,CAEf,IAAMG,EAAY,WAAA,CAAY,IAAM,CAClC,GAAI,CAAEhB,EAAI,KAAA,CAAM,CAAA;;AAAA,CAAiB,EAAG,CAAA,KAAQ,CAAe,CAC7D,CAAA,CAAG,IAAM,CAAA,CACTtgB,CAAAA,CAAI,EAAA,CAAG,OAAA,CAAS,IAAM,CACpB,aAAA,CAAcshB,CAAS,CAAA,CACvBtH,EAAW,MAAA,CAAOsG,CAAG,CAAA,CACrBA,CAAAA,CAAI,MACN,CAAC,EACH,CAIA,eAAeiB,EAAAA,CAAiBvhB,CAAAA,CAAqBsgB,CAAAA,CAAsBkB,CAAAA,CAAkC,CAC3G,IAAMC,CAAAA,CAASzhB,EAAI,MAAA,EAAU,KAAA,CACvB0hB,EAAMF,CAAAA,CACNhhB,CAAAA,CAAIkhB,CAAAA,CAAI,QAAA,CAEd,GAAI,CACF,GAAID,CAAAA,GAAW,KAAA,EAASjhB,IAAM,CAAA,EAAGgZ,CAAW,CAAA,WAAA,CAAA,CAC1C,OAAA,MAAMoC,GAAkB,CACxB5a,CAAAA,CAAKsf,EAAK,GAAA,CAAKtD,EAAAA,EAA8B,CAAA,CACtC,CAAA,CAAA,CAGT,GAAIyE,CAAAA,GAAW,OAASjhB,CAAAA,GAAM,CAAA,EAAGgZ,CAAW,CAAA,IAAA,CAAA,CAC1C,aAAMqC,CAAAA,EAAe,CACrBwF,EAAAA,CAAUrhB,CAAAA,CAAKsgB,CAAG,CAAA,CACX,CAAA,CAAA,CAGT,GAAImB,CAAAA,GAAW,KAAA,EAASjhB,IAAM,CAAA,EAAGgZ,CAAW,CAAA,aAAA,CAAA,CAC1C,OAAAxY,EAAKsf,CAAAA,CAAK,GAAA,CAAKtD,EAAAA,EAA8B,EACtC,CAAA,CAAA,CAGT,IAAM2E,CAAAA,CAAYnhB,CAAAA,CAAE,MAAM,IAAI,MAAA,CAAO,IAAIohB,EAAAA,CAAapI,CAAW,CAAC,CAAA,eAAA,CAAiB,CAAC,CAAA,CACpF,GAAIiI,IAAW,OAAA,EAAWE,CAAAA,CAAW,CACnC,MAAM9F,GAAe,CACrB,IAAMzT,CAAAA,CAAS,kBAAA,CAAmBuZ,EAAU,CAAC,CAAC,EACxCnP,CAAAA,CAAO,MAAMgO,GAAaxgB,CAAG,CAAA,CACnC,OAAA+d,CAAAA,CAAU3V,EAAQoK,CAAI,CAAA,CAGtBxR,CAAAA,CAAKsf,CAAAA,CAAK,IAAK,CAAE,EAAA,CAAI,CAAA,CAAK,CAAC,EACpB,CAAA,CACT,CAEA,IAAMuB,CAAAA,CAAkBrhB,CAAAA,CAAE,MAAM,IAAI,MAAA,CAAO,CAAA,CAAA,EAAIohB,EAAAA,CAAapI,CAAW,CAAC,CAAA,uBAAA,CAAyB,CAAC,CAAA,CAClG,GAAIiI,CAAAA,GAAW,MAAA,EAAUI,CAAAA,CAAiB,CACxC,MAAMhG,CAAAA,EAAe,CACrB,IAAMzT,CAAAA,CAAS,kBAAA,CAAmByZ,EAAgB,CAAC,CAAC,CAAA,CAC9CrP,CAAAA,CAAO,MAAMgO,EAAAA,CAAaxgB,CAAG,CAAA,CACnC,OAAA8f,GAAgB1X,CAAAA,CAAQoK,CAAAA,EAAM,UAAA,CAAsBA,CAAAA,EAAM,OAAyC,CAAA,CACnGxR,CAAAA,CAAKsf,CAAAA,CAAK,GAAA,CAAK,CAAE,EAAA,CAAI,CAAA,CAAK,CAAC,CAAA,CACpB,EACT,CAEA,IAAMwB,CAAAA,CAAiBthB,CAAAA,CAAE,MAAM,IAAI,MAAA,CAAO,CAAA,CAAA,EAAIohB,EAAAA,CAAapI,CAAW,CAAC,CAAA,qBAAA,CAAuB,CAAC,CAAA,CAC/F,GAAIiI,IAAW,KAAA,EAASK,CAAAA,CAAgB,CACtC,MAAMjG,GAAe,CACrB,IAAMzT,CAAAA,CAAS,kBAAA,CAAmB0Z,EAAe,CAAC,CAAC,CAAA,CACnD,OAAA9gB,EAAKsf,CAAAA,CAAK,GAAA,CAAK,CAAE,EAAA,CAAI,CAAA,CAAA,CAAM,SAAUvB,EAAAA,CAAgB3W,CAAM,CAAE,CAAC,EACvD,CAAA,CACT,CAEA,IAAM2Z,CAAAA,CAAgBvhB,EAAE,KAAA,CAAM,IAAI,MAAA,CAAO,CAAA,CAAA,EAAIohB,GAAapI,CAAW,CAAC,uBAAuB,CAAC,CAAA,CAC9F,GAAIiI,CAAAA,GAAW,MAAA,EAAUM,CAAAA,CAAe,CACtC,MAAMlG,CAAAA,EAAe,CACrB,IAAMzT,CAAAA,CAAS,mBAAmB2Z,CAAAA,CAAc,CAAC,CAAC,CAAA,CAC5CC,EAAS,MAAA,CAAON,CAAAA,CAAI,aAAa,GAAA,CAAI,QAAQ,GAAK,EAAE,CAAA,CAAE,WAAA,EAAY,GAAM,OACxEO,EAAAA,CAAcjiB,CAAAA,CAAI,OAAA,CAAQ,aAAa,EACvCkW,CAAAA,CAAc,MAAA,CAAOlW,CAAAA,CAAI,OAAA,CAAQ,cAAc,CAAA,EAAK,0BAA0B,EAC9EkiB,EAAAA,CAAU,KAAA,CAAM,QAAQD,EAAW,CAAA,CAAIA,EAAAA,CAAY,CAAC,EAAIA,EAAAA,CACxD9C,EAAAA,CAAgB+C,EAAAA,CAAU,kBAAA,CAAmB,OAAOA,EAAO,CAAC,CAAA,CAAI,YAAA,CAChE1P,GAAO,MAAMmO,EAAAA,CAAY3gB,CAAG,CAAA,CAClC,GAAI,CAACwS,EAAAA,CAAK,MAAA,CAAU,OAAAxR,CAAAA,CAAKsf,EAAK,GAAA,CAAK,CAAE,KAAA,CAAO,mBAAoB,CAAC,CAAA,CAAU,CAAA,CAAA,CAE3E,IAAMvH,EAAAA,CAAOmG,GAAoB9W,CAAAA,CAAQ+W,EAAAA,CAAejJ,EAAa1D,EAAI,CAAA,CACzE,OAAIwP,CAAAA,GACFlE,CAAAA,CAAoB1V,CAAAA,CAASd,EAAAA,EAAS,CACpC,IAAMrI,EAAAA,CAAM,IAAI,IAAA,GAAO,WAAA,EAAY,CAC7B0Z,EAAAA,CAAWrR,EAAAA,CAAK,WAAa,OAAOA,EAAAA,CAAK,SAAA,EAAc,QAAA,CAAWA,GAAK,SAAA,CAAuC,EAAC,CACrHA,EAAAA,CAAK,UAAYqR,EAAAA,CACjB,IAAME,EAAAA,CAAWgC,CAAAA,GAAgC,iBAAA,CAAkB,CAAC,CAClE,IAAA,CAAM9B,GAAK,IAAA,CAAM,WAAA,CAAaA,GAAK,WAAA,CAAa,IAAA,CAAMA,GAAK,IAAA,CAC3D,SAAA,CAAWA,EAAAA,CAAK,SAAA,CAAW,KAAMA,EAAAA,CAAK,IAAA,CAAM,WAAA,CAAaA,EAAAA,CAAK,aAAe9Z,EAC/E,CAAC,CAAA,CAAGA,EAAG,EACP,OAAA4b,CAAAA,GAAgC,KAAA,CAAMlC,EAAAA,CAAUE,EAAQ,CAAA,CACjDvR,EACT,CAAC,CAAA,CACDkX,GAAgBpW,CAAAA,CAAQ,QAAA,CAAU,CAAA,eAAA,EAAkB2Q,EAAAA,CAAK,IAAI,CAAA,IAAA,EAAOA,EAAAA,CAAK,WAAW,CAAA,CAAA,CAAI,EAAE,CAAA,CAAA,CAE5F/X,EAAKsf,CAAAA,CAAK,GAAA,CAAK,CAAE,EAAA,CAAI,CAAA,CAAA,CAAM,IAAA,CAAAvH,EAAK,CAAC,CAAA,CAC1B,CAAA,CACT,CAEA,IAAMoJ,EAAwB3hB,CAAAA,CAAE,KAAA,CAAM,IAAI,MAAA,CAAO,IAAIohB,EAAAA,CAAapI,CAAW,CAAC,CAAA,4BAAA,CAA8B,CAAC,EAC7G,GAAIiI,CAAAA,GAAW,KAAA,EAASU,CAAAA,CAAuB,CAC7C,IAAM/Z,CAAAA,CAAS,kBAAA,CAAmB+Z,CAAAA,CAAsB,CAAC,CAAC,CAAA,CACpDrZ,CAAAA,CAAM,QAAA,CAASqZ,EAAsB,CAAC,CAAA,CAAG,EAAE,CAAA,CAC3CnJ,EAAAA,CAAqB0I,EAAI,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA,CAC9Cpa,EAAOyU,CAAAA,CAAkB3T,CAAM,CAAA,CACrC,GAAI,CAACd,CAAAA,CAAQ,OAAAtG,CAAAA,CAAKsf,CAAAA,CAAK,IAAK,CAAE,KAAA,CAAO,gBAAiB,CAAC,CAAA,CAAU,GAEjE,IAAM8B,EAAAA,CAAWvH,CAAAA,EAA8B,CAAE,QAAQvT,CAAAA,CAAK,SAAA,CAAWwB,CAAAA,CAAKkQ,EAAkB,EAChG,GAAI,CAACoJ,EAAAA,CAAS,EAAA,EAAOA,GAAiB,MAAA,GAAW,iBAAA,CAC/C,OAAAphB,CAAAA,CAAKsf,CAAAA,CAAK,IAAK,CAAE,KAAA,CAAO,iDAAkD,CAAC,EACpE,CAAA,CAAA,CAET,GAAI,CAAC8B,EAAAA,CAAS,GAAM,OAAAphB,CAAAA,CAAKsf,CAAAA,CAAK,GAAA,CAAK,CAAE,KAAA,CAAO,gBAAiB,CAAC,CAAA,CAAU,GAExE,IAAM+B,EAAAA,CAAcD,EAAAA,CAAiB,IAAA,CAC/BtF,GAAMhC,CAAAA,CAAW1S,CAAM,CAAA,CACvBuS,EAAAA,CAASF,EAAgBrS,CAAM,CAAA,CAC/Bka,EAAAA,CAAU,CAAA,EAAGxF,EAAG,CAAA,CAAA,EAAIuF,EAAAA,CAAW,WAAW,CAAA,CAAA,CAC1ChpB,EAAAA,CAAQshB,GAAO,KAAA,CAAQA,EAAAA,CAAO,KAAA,CAAM,QAAA,CAAS2H,EAAO,CAAA,CAAI,IAAA,CAC9D,GAAI,CAACjpB,GAAS,OAAA2H,CAAAA,CAAKsf,CAAAA,CAAK,GAAA,CAAK,CAAE,KAAA,CAAO,gBAAiB,CAAC,CAAA,CAAU,CAAA,CAAA,CAElE,IAAMiC,EAAAA,CAAWF,EAAAA,CAAW,IAAA,EAAQA,EAAAA,CAAW,YACzCG,EAAAA,CAAWH,EAAAA,CAAW,SAAA,EAAa,0BAAA,CACzC,OAAA/B,CAAAA,CAAI,SAAA,CAAU,GAAA,CAAK,CACjB,eAAgBkC,EAAAA,CAChB,qBAAA,CAAuB,yBAAyBD,EAAQ,CAAA,CAAA,CAAA,CACxD,iBAAkBlpB,EAAAA,CAAM,MAC1B,CAAC,CAAA,CACDinB,EAAI,GAAA,CAAIjnB,EAA0B,CAAA,CAC3B,CAAA,CACT,CAEA,OAAO,CAAA,CACT,CAAA,MAAS4L,CAAAA,CAAc,CACrB,IAAMwd,CAAAA,CAAcxd,GAAa,UAAA,EAAc,GAAA,CAC/C,OAAAjE,CAAAA,CAAKsf,CAAAA,CAAKmC,CAAAA,CAAY,CAAE,MAAO,MAAA,CAAQxd,CAAAA,EAAe,OAAA,EAAWA,CAAG,CAAE,CAAC,CAAA,CAChE,IACT,CACF,CAEA,OAAO,CACL,IAAI,WAAA,EAAc,CAAE,OAAOuU,CAAa,CAAA,CACxC,IAAI,WAAA,EAAc,CAAE,OAAOC,CAAa,CAAA,CACxC,gBAAA,CAAA8H,GACA,4BAAA,CAAAvE,EAAAA,CACA,gBAAA,CAAAoB,CAAAA,CACA,oBAAoBviB,CAAAA,CAAerC,CAAAA,CAAa,CAC9C,IAAMsL,CAAAA,CAAMwV,EAAc,CAAC,CAAA,CAC3B,OAAKxV,CAAAA,CACEA,EAAI,KAAA,CAAM,iBAAA,CAAkB,CAAE,MAAA,CAAQ,CAAE,KAAA,CAAAjJ,CAAAA,CAAO,GAAA,CAAArC,CAAI,CAAE,CAAC,CAAA,CAD5C,CAAE,MAAA,CAAQ,MAAA,CAAQ,MAAO,kBAAmB,CAE/D,CAAA,CACA,wBAAA,CAAyBqC,EAAegP,CAAAA,CAAgB,CACtD,IAAM/F,CAAAA,CAAMwV,EAAc,CAAC,CAAA,CAC3B,OAAKxV,CAAAA,CACEA,EAAI,KAAA,CAAM,sBAAA,CAAuB,CAAE,MAAA,CAAQ,CAAE,KAAA,CAAAjJ,CAAAA,CAAO,MAAA,CAAAgP,CAAO,CAAE,CAAC,CAAA,CADpD,CAAE,MAAA,CAAQ,OAAQ,KAAA,CAAO,kBAAmB,CAE/D,CAAA,CACA,IAAI,SAAA,EAAY,CAAE,OAAOyP,CAAAA,CAAc,CAAC,GAAG,SAAA,EAAa,CAAE,GAAA,EAAM,CAAE,OAAO,CAAE,MAAA,CAAQ,MAAA,CAAQ,KAAA,CAAO,kBAAmB,CAAG,CAAE,CAAG,CAC/H,CACF,CAMO,SAASoI,GAA8BxgB,CAAAA,CAAsD,CAClG,IAAMsX,CAAAA,CAAc,MAAA,CAAOtX,CAAAA,CAAQ,WAAA,EAAe,aAAa,CAAA,CAAE,OAAA,CAAQ,KAAA,CAAO,EAAE,EAC5EuX,CAAAA,CAAc,CAAE,GAAGP,EAAAA,CAAsB,GAAIhX,CAAAA,CAAQ,WAAA,EAAe,EAAI,CAAA,CACxEygB,EAAkBzgB,CAAAA,CAAQ,eAAA,CAC1B0gB,CAAAA,CAAsB1gB,CAAAA,CAAQ,oBAC9B2gB,CAAAA,CAAoB,IAAI,GAAA,CAExBC,CAAAA,CAAoB,qBAE1B,SAASC,CAAAA,EAA+D,CACtE,IAAMlqB,EAAM8pB,CAAAA,CAAgB,OAAA,CAAQG,CAAiB,CAAA,CACrD,GAAI,CAACjqB,CAAAA,CAAK,OAAO,CAAE,MAAA,CAAQ,CAAC,CAAE,EAAA,CAAI,SAAA,CAAW,KAAA,CAAO,eAAgB,CAAC,CAAE,CAAA,CACvE,GAAI,CAAE,OAAO,IAAA,CAAK,MAAMA,CAAG,CAAG,MAAQ,CAAE,OAAO,CAAE,MAAA,CAAQ,CAAC,CAAE,EAAA,CAAI,SAAA,CAAW,KAAA,CAAO,eAAgB,CAAC,CAAE,CAAG,CAC1G,CAEA,SAASmqB,CAAAA,CAAkB9lB,EAAuB,CAChDylB,CAAAA,CAAgB,QAAQG,CAAAA,CAAmB,IAAA,CAAK,SAAA,CAAU5lB,CAAAA,CAAQ,KAAM,CAAC,CAAC,EAC5E,CAEA,SAAS+lB,CAAAA,CAAYpqB,CAAAA,CAA6B,CAChD,IAAMqqB,EAAY,MAAA,CAAOrqB,CAAAA,EAAO,EAAE,CAAA,CAAE,OAAA,CAAQ,kBAAmB,GAAG,CAAA,CAAE,OAAA,CAAQ,UAAA,CAAY,EAAE,CAAA,CAC1F,OAAOqqB,CAAAA,CAAU,MAAA,CAAS,GAAKA,CAAAA,CAAU,MAAA,EAAU,EAAA,CAAKA,CAAAA,CAAY,IACtE,CAEA,SAASC,CAAAA,CAAgBzJ,CAAAA,CAAqC,CAC5D,GAAImJ,CAAAA,CAAkB,GAAA,CAAInJ,CAAO,EAAG,OAAOmJ,CAAAA,CAAkB,GAAA,CAAInJ,CAAO,EAExE,IAAMtS,CAAAA,CADS2b,CAAAA,EAAiB,CACX,OAAO,IAAA,CAAMrhB,CAAAA,EAAMA,EAAE,EAAA,GAAOgY,CAAO,GAAK,EAAC,CACxD0J,CAAAA,CAAUR,CAAAA,CAAoBlJ,EAAStS,CAAK,CAAA,CAClD,OAAAyb,CAAAA,CAAkB,IAAInJ,CAAAA,CAAS0J,CAAO,CAAA,CAC/BA,CACT,CAEA,SAASpiB,CAAAA,CAAKsf,EAAsBhW,CAAAA,CAAgBxI,CAAAA,CAAwB,CAC1E,IAAM0Q,CAAAA,CAAO,IAAA,CAAK,SAAA,CAAU1Q,CAAO,CAAA,CAC7Bye,CAAAA,CAAU,OAAO,MAAA,CAAW,IAAc,MAAA,CAAO,UAAA,CAAW/N,CAAI,CAAA,CAAI,IAAI,WAAA,EAAY,CAAE,OAAOA,CAAI,CAAA,CAAE,OACzG8N,CAAAA,CAAI,SAAA,CAAUhW,CAAAA,CAAQ,CACpB,GAAGmP,CAAAA,CACH,cAAA,CAAgB,iCAAA,CAChB,gBAAA,CAAkB8G,CACpB,CAAC,CAAA,CACDD,CAAAA,CAAI,GAAA,CAAI9N,CAAI,EACd,CAEA,eAAe6Q,CAAAA,CAAwBrjB,CAAAA,CAAqBsgB,EAAsBkB,CAAAA,CAAkC,CAClH,IAAMC,CAAAA,CAASzhB,EAAI,MAAA,EAAU,KAAA,CACvBQ,CAAAA,CAAIghB,CAAAA,CAAU,SAEpB,GAAIC,CAAAA,GAAW,KAAA,EAASjhB,CAAAA,GAAMgZ,EAC5B,OAAAxY,CAAAA,CAAKsf,EAAK,GAAA,CAAK,CAAE,GAAI,IAAA,CAAM,MAAA,CAAQyC,CAAAA,EAAiB,CAAE,MAAO,CAAC,CAAA,CACvD,IAAA,CAGT,GAAItB,IAAW,MAAA,EAAUjhB,CAAAA,GAAMgZ,CAAAA,CAAa,CAC1C,IAAMiH,CAAAA,CAAqC,GAC3C,UAAA,IAAiBzU,CAAAA,IAAKhM,EAAKygB,CAAAA,CAAO,IAAA,CAAKzU,CAAC,CAAA,CACxC,IAAMnT,CAAAA,CAAM,OAAO,MAAA,CAAW,GAAA,CAC1B,OAAO,MAAA,CAAO4nB,CAAkB,CAAA,CAAE,QAAA,CAAS,OAAO,CAAA,CAAE,IAAA,GACpD,IAAI,WAAA,GAAc,MAAA,CAAOC,EAAAA,CAAkBD,CAAsB,CAAC,EAAE,IAAA,EAAK,CACzEjO,CAAAA,CAAgC,GACpC,GAAI,CAAEA,CAAAA,CAAO3Z,CAAAA,CAAM,KAAK,KAAA,CAAMA,CAAG,CAAA,CAAI,GAAI,CAAA,KAAQ,CAAE2Z,CAAAA,CAAO,GAAI,CAE9D,IAAMpV,CAAAA,CAAK6lB,CAAAA,CAAYzQ,EAAK,EAAE,CAAA,CAC9B,GAAI,CAACpV,EAAM,OAAA4D,CAAAA,CAAKsf,EAAK,GAAA,CAAK,CAAE,MAAO,+DAAgE,CAAC,CAAA,CAAU,IAAA,CAE9G,IAAMpjB,CAAAA,CAAS6lB,CAAAA,EAAiB,CAChC,GAAI7lB,EAAO,MAAA,CAAO,IAAA,CAAMwE,CAAAA,EAAMA,CAAAA,CAAE,KAAOtE,CAAE,CAAA,CAAK,OAAA4D,CAAAA,CAAKsf,CAAAA,CAAK,IAAK,CAAE,KAAA,CAAO,CAAA,OAAA,EAAUljB,CAAE,yBAA0B,CAAC,CAAA,CAAU,IAAA,CAEvH,IAAMkmB,EAAQ,OAAO9Q,CAAAA,CAAK,KAAA,EAAU,QAAA,EAAYA,EAAK,KAAA,CAAM,IAAA,GAASA,CAAAA,CAAK,KAAA,CAAM,MAAK,CAAIpV,CAAAA,CAClFgK,CAAAA,CAAiC,CAAE,GAAAhK,CAAAA,CAAI,KAAA,CAAAkmB,CAAM,CAAA,CACnD,OAAW,CAAC1d,CAAAA,CAAKZ,CAAG,CAAA,GAAK,OAAO,OAAA,CAAQwN,CAAI,EACtC5M,CAAAA,GAAQ,IAAA,EAAQA,IAAQ,OAAA,EACHZ,CAAAA,EAAQ,IAAA,GAAMoC,CAAAA,CAAMxB,CAAG,CAAA,CAAIZ,CAAAA,CAAAA,CAEtD,OAAA9H,CAAAA,CAAO,OAAO,IAAA,CAAKkK,CAAK,CAAA,CACxB4b,CAAAA,CAAkB9lB,CAAM,CAAA,CACxB8D,CAAAA,CAAKsf,EAAK,GAAA,CAAK,CAAE,GAAI,IAAA,CAAM,KAAA,CAAOlZ,CAAM,CAAC,EAClC,IACT,CAEA,OAAO,MACT,CAEA,eAAemc,CAAAA,CAAevjB,CAAAA,CAAqBsgB,CAAAA,CAAsBkB,EAAkC,CAEzG,IAAMgC,EADIhC,CAAAA,CAAU,QAAA,CACI,MAAM,IAAI,MAAA,CAAO,CAAA,CAAA,EAAII,EAAAA,CAAapI,CAAW,CAAC,CAAA,aAAA,CAAe,CAAC,CAAA,CACtF,GAAI,CAACgK,CAAAA,CAAe,OAAO,MAAA,CAE3B,IAAM9J,CAAAA,CAAUuJ,CAAAA,CAAY,mBAAmBO,CAAAA,CAAc,CAAC,CAAC,CAAC,CAAA,CAChE,OAAK9J,CAAAA,CAEUqJ,GAAiB,CACpB,MAAA,CAAO,IAAA,CAAMrhB,CAAAA,EAAMA,EAAE,EAAA,GAAOgY,CAAO,CAAA,CAM3C,CAAA,CAAA,MADYyJ,EAAgBzJ,CAAO,CAAA,CACrB,iBAAiB1Z,CAAAA,CAAKsgB,CAAAA,CAAKkB,CAAS,CAAA,EALpDxgB,CAAAA,CAAKsf,CAAAA,CAAK,GAAA,CAAK,CAAE,KAAA,CAAO,CAAA,OAAA,EAAU5G,CAAO,CAAA,uBAAA,EAA0BF,CAAW,CAAA,gCAAA,CAAmC,CAAC,CAAA,CAC3G,IAAA,CAAA,EALOxY,EAAKsf,CAAAA,CAAK,GAAA,CAAK,CAAE,KAAA,CAAO,kBAAmB,CAAC,CAAA,CAAU,IAAA,CAWxE,CAEA,eAAemD,EAAUzjB,CAAAA,CAAqBsgB,CAAAA,CAAsBkB,CAAAA,CAAkC,CAEpG,OADI,CAAA,EAAA,MAAM6B,CAAAA,CAAwBrjB,CAAAA,CAAKsgB,CAAAA,CAAKkB,CAAS,CAAA,EACjD,MAAM+B,EAAevjB,CAAAA,CAAKsgB,CAAAA,CAAKkB,CAAS,CAAA,CAE9C,CAEA,SAASkC,CAAAA,CAAoBhK,EAAkD,CAE7E,GAAI,CADWqJ,CAAAA,GACH,MAAA,CAAO,IAAA,CAAMrhB,CAAAA,EAAMA,CAAAA,CAAE,KAAOgY,CAAO,CAAA,CAC7C,MAAM,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,OAAA,EAAUA,CAAO,CAAA,gBAAA,CAAkB,EAAG,CAAE,UAAA,CAAY,GAAI,CAAC,EAEzF,OAAO,CAAE,OAAA,CAASyJ,CAAAA,CAAgBzJ,CAAO,CAAE,CAC7C,CAEA,OAAO,CACL,IAAI,WAAA,EAAc,CAAE,OAAOF,CAAa,EACxC,IAAI,WAAA,EAAc,CAAE,OAAOC,CAAa,CAAA,CACxC,SAAA,CAAAgK,CAAAA,CACA,mBAAA,CAAAC,CACF,CACF,CAMA,SAAS9B,EAAAA,CAAa1S,CAAAA,CAAqB,CACzC,OAAOA,CAAAA,CAAI,OAAA,CAAQ,qBAAA,CAAuB,MAAM,CAClD,CAEA,SAASwR,EAAAA,CAAkBE,EAAkC,CAC3D,IAAMC,CAAAA,CAAWD,CAAAA,CAAO,OAAO,CAACE,CAAAA,CAAK7U,IAAM6U,CAAAA,CAAM7U,CAAAA,CAAE,OAAQ,CAAC,CAAA,CACtD9P,CAAAA,CAAS,IAAI,WAAW0kB,CAAQ,CAAA,CAClCE,CAAAA,CAAS,CAAA,CACb,QAAW9U,CAAAA,IAAK2U,CAAAA,CAAUzkB,CAAAA,CAAO,GAAA,CAAI8P,EAAG8U,CAAM,CAAA,CAAGA,GAAU9U,CAAAA,CAAE,MAAA,CAC7D,OAAO9P,CACT","file":"index.js","sourcesContent":["/**\n * storage-interface.ts\n *\n * Three minimal storage primitives that together cover all persistence needs\n * of the board-live-cards system. Any backend (Node fs, CosmosDB, Azure Blob,\n * browser localStorage, in-memory test double) implements these three interfaces.\n *\n * The pure-logic stores in board-live-cards-all-stores.ts depend only on these\n * interfaces — never on Node built-ins.\n *\n * Blob — raw string content at a logical, backend-neutral key\n * Journal — append-only log with cursor-based reads\n * KV — key-value store with list/delete\n *\n * Mapping to existing storage adapters:\n *\n * CardStorageAdapter\n * inventory (cardId → { blobRef, checksum, fileMetadata? }) → KV\n * card JSON files → Blob\n * source output files → Blob\n *\n * JournalStorageAdapter → Journal (board-journal.jsonl)\n *\n * ExecutionRequestStore → KV (keyed by journalId, via createFsKvStorage)\n *\n * StateSnapshotStorageAdapter\n * board-graph.json (packed single JSON, written atomically) → Blob\n * per-card sidecars (cards/<id>/runtime, fetched-sources-manifest) → KV\n */\n\n// ============================================================================\n// Blob — raw content at an opaque key\n//\n// The key is backend-specific (file path, blob name, storage key).\n// Text helpers are always available. Binary helpers are optional so existing\n// backends can adopt incrementally.\n// ============================================================================\n\nexport interface BlobStat {\n key: string;\n size: number;\n updatedAt?: string;\n contentType?: string;\n}\n\nexport interface BlobStorage {\n /** Returns raw content string, or null if the blob does not exist. */\n read(key: string): string | null;\n\n /** Write content at key. Implementations should be atomic (write-rename). */\n write(key: string, content: string): void;\n\n /** Returns true if a blob exists at key. */\n exists(key: string): boolean;\n\n /** Delete the blob at key. No-op if it does not exist. */\n remove(key: string): void;\n\n /** Optional binary read for file-like artifacts. */\n readBytes?(key: string): Uint8Array | null;\n\n /** Optional binary write for file-like artifacts. */\n writeBytes?(key: string, content: Uint8Array): void;\n\n /** Optional key listing by prefix. */\n listKeys?(prefix?: string): string[];\n\n /** Optional metadata lookup. */\n stat?(key: string): BlobStat | null;\n}\n\n// ============================================================================\n// KindValueRef — backend-neutral typed reference\n//\n// A ref describes WHERE content lives without carrying the bytes.\n// Serialized on the CLI wire as: b64:<base64url({\"kind\":\"...\",\"value\":\"...\"})>\n// kind = 'fs-path': value is an absolute file path\n// Additional kinds (e.g. 'cosmos') are added in public-storage-adapter.ts as new backends are supported.\n// ============================================================================\n\nexport interface KindValueRef {\n readonly kind: string;\n readonly value: string;\n}\n\nconst REF_PREFIX = 'b64:';\n\nfunction toBase64Url(raw: string): string {\n const utf8 = new TextEncoder().encode(raw);\n const buf = (globalThis as { Buffer?: { from(data: Uint8Array): { toString(enc: string): string } } }).Buffer;\n let base64: string;\n if (buf) {\n base64 = buf.from(utf8).toString('base64');\n } else if (typeof btoa === 'function') {\n let binary = '';\n for (const byte of utf8) binary += String.fromCharCode(byte);\n base64 = btoa(binary);\n } else {\n throw new Error('No base64 encoder available in this runtime');\n }\n return base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '');\n}\n\nfunction fromBase64Url(input: string): string {\n const base64 = input.replace(/-/g, '+').replace(/_/g, '/')\n + '='.repeat((4 - (input.length % 4)) % 4);\n const buf = (globalThis as { Buffer?: { from(data: string, enc: string): { toString(enc: string): string } } }).Buffer;\n if (buf) return buf.from(base64, 'base64').toString('utf8');\n if (typeof atob === 'function') {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i += 1) bytes[i] = binary.charCodeAt(i);\n return new TextDecoder().decode(bytes);\n }\n throw new Error('No base64 decoder available in this runtime');\n}\n\n/** Serialize a KindValueRef to the wire format: b64:<base64url(json)> */\nexport function serializeRef(ref: KindValueRef): string {\n return `${REF_PREFIX}${toBase64Url(JSON.stringify(ref))}`;\n}\n\n/** Parse a wire-format ref string (b64:<base64url(json)>) into a KindValueRef.\n * Also accepts the legacy ::fs-path::<path> format for backward compatibility. */\nexport function parseRef(s: string): KindValueRef {\n // Legacy format: ::fs-path::<path>\n if (s.startsWith('::fs-path::')) {\n return { kind: 'fs-path', value: s.slice('::fs-path::'.length) };\n }\n if (!s.startsWith(REF_PREFIX)) throw new Error(`Invalid ref format (expected ${REF_PREFIX}<base64url(json)>): ${s}`);\n let parsed: unknown;\n try {\n parsed = JSON.parse(fromBase64Url(s.slice(REF_PREFIX.length)));\n } catch {\n throw new Error(`Invalid ref format (malformed base64url/json): ${s}`);\n }\n if (!parsed || typeof parsed !== 'object') {\n throw new Error(`Invalid ref format (expected object payload): ${s}`);\n }\n const candidate = parsed as { kind?: unknown; value?: unknown };\n if (typeof candidate.kind !== 'string' || typeof candidate.value !== 'string') {\n throw new Error(`Invalid ref format (payload must contain string kind/value): ${s}`);\n }\n return { kind: candidate.kind, value: candidate.value };\n}\n\n// ============================================================================\n// Journal — append-only log, cursor-based reads\n//\n// Each entry has a string id (UUID or monotonic token) and an opaque payload.\n// Cursors are entry ids — readAfter returns entries strictly after that id.\n// A null/empty cursor means \"read from the beginning\".\n// ============================================================================\n\nexport interface JournalEntry {\n id: string;\n payload: unknown;\n}\n\nexport interface JournalReadResult {\n entries: JournalEntry[];\n /** The id of the last entry returned, suitable for use as the next cursor. */\n newCursor: string | null;\n}\n\nexport interface JournalStorage {\n /** Append an entry. The storage layer assigns the id. */\n append(payload: unknown): JournalEntry;\n\n /** Read ALL entries (for index rebuilds, full replay). */\n readAll(): JournalEntry[];\n\n /**\n * Read entries appended after the given cursor id.\n * If cursor is null/empty, returns all entries from the beginning.\n */\n readAfter(cursor: string | null): JournalReadResult;\n}\n\n// ============================================================================\n// KV — key-value store with list and delete\n//\n// Values are opaque unknown — callers own serialisation.\n// Keys are scoped by the adapter factory (e.g. a boardDir prefix is closed\n// over in the adapter, not passed per-call).\n// ============================================================================\n\nexport interface KVStorage {\n /** Returns the stored value, or null if the key does not exist. */\n read(key: string): unknown | null;\n\n /** Write value at key. Overwrites any existing value. */\n write(key: string, value: unknown): void;\n\n /** Delete the key. No-op if it does not exist. */\n delete(key: string): void;\n\n /**\n * List all keys, optionally filtered to those starting with prefix.\n * Order is implementation-defined.\n */\n listKeys(prefix?: string): string[];\n}\n\n// ============================================================================\n// JSONStorage — KV store with JSON-aware merge operations\n//\n// Backed by KVStorage under the hood. Adds deepMerge and shallowMerge so\n// callers never need to read-modify-write manually for partial updates.\n// ============================================================================\n\nexport interface JSONStorage {\n /** Returns the stored JSON value, or null if the key does not exist. */\n read(key: string): unknown | null;\n\n /**\n * Read a nested value inside the stored object using a dot-notation path.\n * e.g. get('myKey', 'a.b.c') returns the value at { a: { b: { c: ... } } }.\n * Returns null if the key does not exist or the path cannot be traversed.\n */\n get(key: string, jsonPath: string): unknown | null;\n\n /** Write value at key. Overwrites any existing value. */\n write(key: string, value: unknown): void;\n\n /** Delete the key. No-op if it does not exist. */\n delete(key: string): void;\n\n /** List all keys, optionally filtered by prefix. */\n listKeys(prefix?: string): string[];\n\n /**\n * Shallow-merge patch into the existing object at key.\n * Equivalent to: write(key, { ...read(key), ...patch })\n * Creates the key if it does not exist.\n */\n shallowMerge(key: string, patch: Record<string, unknown>): void;\n\n /**\n * Deep-merge patch into the existing object at key.\n * Recursively merges nested plain objects; arrays and primitives are replaced.\n * Creates the key if it does not exist.\n */\n deepMerge(key: string, patch: Record<string, unknown>): void;\n\n /**\n * Set a nested value inside the stored object using a dot-notation path.\n * e.g. patch('myKey', 'a.b.c', 42) sets { a: { b: { c: 42 } } } into the stored object.\n * Intermediate objects are created if absent. Arrays are not traversed — use integer\n * segments to index into them (e.g. 'items.0.name').\n * Creates the top-level key if it does not exist.\n */\n patch(key: string, jsonPath: string, value: unknown): void;\n}\n\n// ============================================================================\n// StorageProvider — aggregate of all three primitives\n//\n// Adapter factories receive a StorageProvider and close over any scope (e.g.\n// boardDir) themselves. This is the single injection point for swapping\n// backends (Node fs → CosmosDB, browser localStorage, test doubles, etc.).\n// ============================================================================\n\nexport interface StorageProvider {\n blob: BlobStorage;\n journal: JournalStorage;\n kv: KVStorage;\n}\n\n// ============================================================================\n// AtomicRelayLock — non-blocking try-acquire lock with relay-on-busy semantics\n//\n// This interface serves TWO tightly coupled purposes which are intentionally\n// unified into a single primitive:\n//\n// 1. ATOMICITY — ensures that a read-mutate-save cycle is executed by at\n// most one actor at a time, preventing concurrent actors from racing on\n// stale state and writing conflicting snapshots.\n//\n// 2. RELAY SIGNAL — when tryAcquire() returns null, the caller knows the\n// cycle is already in progress. Because the holder always reads fresh\n// state upon entry, it will pick up every change appended by the skipping\n// caller before the lock was attempted. The caller can therefore safely\n// exit — its work will be completed by the holder. This is the\n// \"relay baton\" pattern: the lock being held IS the in-progress signal.\n//\n// These two purposes are not an accidental overload — they are the same\n// invariant expressed at different scopes. Any backend implementation\n// (FS lockfile, Cosmos document lease, Azure entity lock, in-memory flag)\n// that satisfies \"at most one holder at a time\" automatically satisfies both.\n//\n// Contract:\n// - tryAcquire() is non-blocking. It never waits.\n// - Returns a release function on success, or null if already held.\n// - The release function must be called exactly once (use try/finally).\n// - Behaviour after calling release() more than once is undefined.\n// ============================================================================\n\nexport interface AtomicRelayLock {\n /**\n * Attempt to acquire the lock without blocking.\n * Returns a `release` function if successful, or `null` if the lock is\n * already held by another actor (relay: that actor will complete the work).\n */\n tryAcquire(): (() => void) | null;\n}\n\n/**\n * Execute `work` under an `AtomicRelayLock`.\n *\n * - If the lock is busy, returns false immediately (relay: the holder will\n * complete the work on behalf of this caller).\n * - If acquired, runs `work` exclusively, releases the lock, then calls\n * `continuation` if provided — allowing the caller to schedule the next\n * cycle (e.g. spawn a detached process) after the lock is free.\n * - Returns true if work ran.\n */\nexport async function withRelayLock(\n lock: AtomicRelayLock,\n work: () => Promise<void>,\n continuation?: () => void,\n): Promise<boolean> {\n const release = lock.tryAcquire();\n if (!release) return false; // relay: holder is already doing the work\n try {\n await work();\n } finally {\n release(); // release before continuation so it can immediately re-acquire\n }\n continuation?.();\n return true;\n}\n","/**\n * Event Graph — Constants\n */\n\nimport type { CompletionStrategy, ConflictStrategy, ExecutionMode, ExecutionStatus, TaskStatus } from './types.js';\n\nexport const TASK_STATUS: Record<string, TaskStatus> = {\n NOT_STARTED: 'not-started',\n RUNNING: 'running',\n COMPLETED: 'completed',\n FAILED: 'failed',\n INACTIVATED: 'inactivated',\n} as const;\n\nexport const EXECUTION_STATUS: Record<string, ExecutionStatus> = {\n CREATED: 'created',\n RUNNING: 'running',\n PAUSED: 'paused',\n STOPPED: 'stopped',\n COMPLETED: 'completed',\n FAILED: 'failed',\n} as const;\n\nexport const COMPLETION_STRATEGIES: Record<string, CompletionStrategy> = {\n ALL_TASKS_DONE: 'all-tasks-done',\n ALL_OUTPUTS_DONE: 'all-outputs-done',\n ONLY_RESOLVED: 'only-resolved',\n GOAL_REACHED: 'goal-reached',\n MANUAL: 'manual',\n} as const;\n\nexport const EXECUTION_MODES: Record<string, ExecutionMode> = {\n DEPENDENCY_MODE: 'dependency-mode',\n ELIGIBILITY_MODE: 'eligibility-mode',\n} as const;\n\nexport const CONFLICT_STRATEGIES: Record<string, ConflictStrategy> = {\n ALPHABETICAL: 'alphabetical',\n PRIORITY_FIRST: 'priority-first',\n DURATION_FIRST: 'duration-first',\n COST_OPTIMIZED: 'cost-optimized',\n RESOURCE_AWARE: 'resource-aware',\n RANDOM_SELECT: 'random-select',\n USER_CHOICE: 'user-choice',\n PARALLEL_ALL: 'parallel-all',\n SKIP_CONFLICTS: 'skip-conflicts',\n ROUND_ROBIN: 'round-robin',\n} as const;\n\nexport const DEFAULTS = {\n EXECUTION_MODE: 'eligibility-mode' as ExecutionMode,\n CONFLICT_STRATEGY: 'alphabetical' as ConflictStrategy,\n COMPLETION_STRATEGY: 'all-outputs-done' as CompletionStrategy,\n MAX_ITERATIONS: 1000,\n} as const;\n","/**\n * Event Graph — Graph Helpers\n *\n * Pure functions for manipulating the requires/provides task dependency graph.\n * No I/O, no side effects.\n */\n\nimport type { GraphConfig, TaskConfig, GraphEngineStore, ExecutionState, RefreshStrategy } from './types.js';\nimport { TASK_STATUS } from './constants.js';\n\n// ============================================================================\n// Accessors — normalize requires/provides to always be arrays\n// ============================================================================\n\nexport function getProvides(task: TaskConfig | undefined): string[] {\n if (!task) return [];\n if (Array.isArray(task.provides)) return task.provides;\n return [];\n}\n\nexport function getRequires(task: TaskConfig | undefined): string[] {\n if (!task) return [];\n if (Array.isArray(task.requires)) return task.requires;\n return [];\n}\n\nexport function getAllTasks(graph: GraphConfig): Record<string, TaskConfig> {\n return graph.tasks ?? {};\n}\n\nexport function getTask(graph: GraphConfig, taskName: string): TaskConfig | undefined {\n return graph.tasks[taskName];\n}\n\nexport function hasTask(graph: GraphConfig, taskName: string): boolean {\n return taskName in graph.tasks;\n}\n\n// ============================================================================\n// Task State Predicates\n// ============================================================================\n\nexport function isNonActiveTask(taskState: GraphEngineStore | undefined): boolean {\n if (!taskState) return false;\n return taskState.status === TASK_STATUS.FAILED || taskState.status === TASK_STATUS.INACTIVATED;\n}\n\nexport function isTaskCompleted(taskState: GraphEngineStore | undefined): boolean {\n return taskState?.status === TASK_STATUS.COMPLETED;\n}\n\nexport function isTaskRunning(taskState: GraphEngineStore | undefined): boolean {\n return taskState?.status === TASK_STATUS.RUNNING;\n}\n\nexport function getRefreshStrategy(taskConfig: TaskConfig, graphSettings?: { refreshStrategy?: RefreshStrategy }): RefreshStrategy {\n return taskConfig.refreshStrategy ?? graphSettings?.refreshStrategy ?? 'data-changed';\n}\n\nexport function isRerunnable(taskConfig: TaskConfig, graphSettings?: { refreshStrategy?: RefreshStrategy }): boolean {\n return getRefreshStrategy(taskConfig, graphSettings) !== 'once';\n}\n\nexport function getMaxExecutions(taskConfig: TaskConfig): number | undefined {\n return taskConfig.maxExecutions;\n}\n\n// ============================================================================\n// Available Outputs Computation\n// ============================================================================\n\n/**\n * Dynamically compute available outputs from all completed tasks.\n * Tasks with strategies other than 'once' may have completed and reset.\n * Pure function.\n */\nexport function computeAvailableOutputs(\n graph: GraphConfig,\n taskStates: Record<string, GraphEngineStore>\n): string[] {\n const outputs: Set<string> = new Set();\n\n for (const [taskName, taskState] of Object.entries(taskStates)) {\n if (taskState.status === TASK_STATUS.COMPLETED) {\n const taskConfig = graph.tasks[taskName];\n if (taskConfig) {\n const provides = getProvides(taskConfig);\n provides.forEach(output => outputs.add(output));\n }\n }\n }\n\n return Array.from(outputs);\n}\n\n// ============================================================================\n// Conflict Detection\n// ============================================================================\n\n/**\n * Group candidate tasks by the outputs they provide.\n * Used to detect conflicts (multiple tasks providing the same output).\n */\nexport function groupTasksByProvides(\n candidateTaskNames: string[],\n tasks: Record<string, TaskConfig>\n): Record<string, string[]> {\n const outputGroups: Record<string, string[]> = {};\n\n candidateTaskNames.forEach(taskName => {\n const task = tasks[taskName];\n if (!task) return;\n const provides = getProvides(task);\n provides.forEach(output => {\n if (!outputGroups[output]) {\n outputGroups[output] = [];\n }\n outputGroups[output].push(taskName);\n });\n });\n\n return outputGroups;\n}\n\n/**\n * Check if a task's outputs conflict with other candidates.\n */\nexport function hasOutputConflict(\n taskName: string,\n taskProvides: string[],\n candidates: string[],\n tasks: Record<string, TaskConfig>\n): boolean {\n for (const otherName of candidates) {\n if (otherName === taskName) continue;\n const otherProvides = getProvides(tasks[otherName]);\n const overlapping = taskProvides.some(output => otherProvides.includes(output));\n if (overlapping) return true;\n }\n return false;\n}\n\n// ============================================================================\n// Immutable Graph Mutation\n// ============================================================================\n\nexport function addKeyToProvides(task: TaskConfig, key: string): TaskConfig {\n const current = getProvides(task);\n if (current.includes(key)) return task;\n return { ...task, provides: [...current, key] };\n}\n\nexport function removeKeyFromProvides(task: TaskConfig, key: string): TaskConfig {\n const current = getProvides(task);\n return { ...task, provides: current.filter(p => p !== key) };\n}\n\nexport function addKeyToRequires(task: TaskConfig, key: string): TaskConfig {\n const current = getRequires(task);\n if (current.includes(key)) return task;\n return { ...task, requires: [...current, key] };\n}\n\nexport function removeKeyFromRequires(task: TaskConfig, key: string): TaskConfig {\n const current = getRequires(task);\n return { ...task, requires: current.filter(r => r !== key) };\n}\n\n// ============================================================================\n// Dynamic Task Management\n// ============================================================================\n\n/**\n * Add a new task to a graph config. Returns a new GraphConfig (immutable).\n */\nexport function addDynamicTask(\n graph: GraphConfig,\n taskName: string,\n taskConfig: TaskConfig\n): GraphConfig {\n return {\n ...graph,\n tasks: {\n ...graph.tasks,\n [taskName]: taskConfig,\n },\n };\n}\n\n/**\n * Create default task state for a new task.\n */\nexport function createDefaultGraphEngineStore(): GraphEngineStore {\n return {\n status: 'not-started',\n executionCount: 0,\n retryCount: 0,\n lastEpoch: 0,\n messages: [],\n progress: null,\n };\n}\n\n/**\n * Create the initial execution state for a graph.\n */\nexport function createInitialExecutionState(\n graph: GraphConfig,\n executionId: string\n): ExecutionState {\n const tasks: Record<string, GraphEngineStore> = {};\n for (const taskName of Object.keys(graph.tasks)) {\n tasks[taskName] = createDefaultGraphEngineStore();\n }\n\n return {\n status: 'running',\n tasks,\n availableOutputs: [],\n stuckDetection: { is_stuck: false, stuck_description: null, outputs_unresolvable: [], tasks_blocked: [] },\n lastUpdated: new Date().toISOString(),\n executionId,\n executionConfig: {\n executionMode: graph.settings.execution_mode ?? 'eligibility-mode',\n conflictStrategy: graph.settings.conflict_strategy ?? 'alphabetical',\n completionStrategy: graph.settings.completion,\n },\n };\n}\n","/**\n * Event Graph — Task State Transitions\n *\n * Pure functions for applying task lifecycle events to execution state.\n * Each function: f(state, ...) → newState\n */\n\nimport type { ExecutionState, GraphEngineStore, GraphConfig } from './types.js';\nimport { getProvides, getRequires } from './graph-helpers.js';\n\n/**\n * Apply task start to execution state. Pure function.\n */\nexport function applyTaskStart(state: ExecutionState, taskName: string, graph?: GraphConfig): ExecutionState {\n const existingTask = state.tasks[taskName] ?? createDefaultGraphEngineStore();\n\n // Snapshot upstream hashes at start time so that if an upstream task\n // completes while this task is running, applyTaskCompletion can detect\n // the mid-flight change and not absorb it into lastConsumedHashes.\n const startConsumedHashes: Record<string, string> = {};\n if (graph) {\n const taskConfig = graph.tasks[taskName];\n const requires = getRequires(taskConfig);\n for (const token of requires) {\n for (const [otherName, otherConfig] of Object.entries(graph.tasks)) {\n if (getProvides(otherConfig).includes(token)) {\n const otherState = state.tasks[otherName];\n if (otherState?.lastDataHash) startConsumedHashes[token] = otherState.lastDataHash;\n break;\n }\n }\n }\n }\n\n const updatedTask: GraphEngineStore = {\n ...existingTask,\n status: 'running',\n startedAt: new Date().toISOString(),\n lastUpdated: new Date().toISOString(),\n progress: 0,\n error: undefined,\n startConsumedHashes,\n };\n\n return {\n ...state,\n tasks: { ...state.tasks, [taskName]: updatedTask },\n lastUpdated: new Date().toISOString(),\n };\n}\n\n/**\n * Apply task completion to execution state.\n * Handles: default provides, conditional provides (on), refresh strategy, data hash tracking.\n * Pure function.\n */\nexport function applyTaskCompletion(\n state: ExecutionState,\n graph: GraphConfig,\n taskName: string,\n result?: string,\n dataHash?: string,\n data?: Record<string, unknown>\n): ExecutionState {\n const existingTask = state.tasks[taskName] ?? createDefaultGraphEngineStore();\n const taskConfig = graph.tasks[taskName];\n if (!taskConfig) {\n throw new Error(`Task \"${taskName}\" not found in graph`);\n }\n\n // Determine which outputs to produce\n let outputTokens: string[];\n if (result && taskConfig.on && taskConfig.on[result]) {\n // Conditional routing — use the on[result] provides\n outputTokens = taskConfig.on[result];\n } else {\n // Default provides\n outputTokens = getProvides(taskConfig);\n }\n\n // Use hashes snapshotted at task-start time as lastConsumedHashes.\n // This ensures that if an upstream task completed while this task was\n // running (mid-flight change), the old hash is preserved in\n // lastConsumedHashes → data-changed detects the difference on the\n // next schedule pass and re-runs this task.\n // Fall back to reading current upstream state only when startConsumedHashes\n // is absent (e.g. restored from an older snapshot without the field).\n const lastConsumedHashes: Record<string, string> = existingTask.startConsumedHashes\n ? { ...existingTask.startConsumedHashes }\n : { ...existingTask.lastConsumedHashes };\n\n if (!existingTask.startConsumedHashes) {\n // Legacy fallback: populate from current upstream state\n const requires = taskConfig.requires ?? [];\n for (const token of requires) {\n for (const [otherName, otherConfig] of Object.entries(graph.tasks)) {\n if (getProvides(otherConfig).includes(token)) {\n const otherState = state.tasks[otherName];\n if (otherState?.lastDataHash) {\n lastConsumedHashes[token] = otherState.lastDataHash;\n }\n break;\n }\n }\n }\n }\n\n const updatedTask: GraphEngineStore = {\n ...existingTask,\n status: 'completed',\n completedAt: new Date().toISOString(),\n lastUpdated: new Date().toISOString(),\n executionCount: existingTask.executionCount + 1,\n lastEpoch: existingTask.executionCount + 1,\n lastDataHash: dataHash,\n data,\n lastConsumedHashes,\n error: undefined,\n };\n\n // Merge new outputs with existing available outputs\n const newOutputs = [...new Set([...state.availableOutputs, ...outputTokens])];\n\n return {\n ...state,\n tasks: { ...state.tasks, [taskName]: updatedTask },\n availableOutputs: newOutputs,\n lastUpdated: new Date().toISOString(),\n };\n}\n\n/**\n * Apply task failure to execution state.\n * Handles: retry logic, on_failure token injection, circuit breaker.\n * Pure function.\n */\nexport function applyTaskFailure(\n state: ExecutionState,\n graph: GraphConfig,\n taskName: string,\n error: string\n): ExecutionState {\n const existingTask = state.tasks[taskName] ?? createDefaultGraphEngineStore();\n const taskConfig = graph.tasks[taskName];\n\n // Check retry\n if (taskConfig?.retry) {\n const retryCount = existingTask.retryCount + 1;\n if (retryCount <= taskConfig.retry.max_attempts) {\n // Retry — set back to not-started with incremented retry count\n const updatedTask: GraphEngineStore = {\n ...existingTask,\n status: 'not-started',\n retryCount,\n lastUpdated: new Date().toISOString(),\n error,\n };\n return {\n ...state,\n tasks: { ...state.tasks, [taskName]: updatedTask },\n lastUpdated: new Date().toISOString(),\n };\n }\n }\n\n // No more retries — mark as failed\n const updatedTask: GraphEngineStore = {\n ...existingTask,\n status: 'failed',\n failedAt: new Date().toISOString(),\n lastUpdated: new Date().toISOString(),\n error,\n executionCount: existingTask.executionCount + 1,\n };\n\n // Inject failure tokens if configured\n let newOutputs = state.availableOutputs;\n if (taskConfig?.on_failure && taskConfig.on_failure.length > 0) {\n newOutputs = [...new Set([...state.availableOutputs, ...taskConfig.on_failure])];\n }\n\n // Check circuit breaker\n if (taskConfig?.circuit_breaker && updatedTask.executionCount >= taskConfig.circuit_breaker.max_executions) {\n const breakTokens = taskConfig.circuit_breaker.on_break;\n newOutputs = [...new Set([...newOutputs, ...breakTokens])];\n }\n\n return {\n ...state,\n tasks: { ...state.tasks, [taskName]: updatedTask },\n availableOutputs: newOutputs,\n lastUpdated: new Date().toISOString(),\n };\n}\n\n/**\n * Apply task progress update. Pure function.\n */\nexport function applyTaskProgress(\n state: ExecutionState,\n taskName: string,\n message?: string,\n progress?: number\n): ExecutionState {\n const existingTask = state.tasks[taskName] ?? createDefaultGraphEngineStore();\n\n const updatedTask: GraphEngineStore = {\n ...existingTask,\n progress: typeof progress === 'number' ? progress : existingTask.progress,\n messages: [\n ...(existingTask.messages ?? []),\n ...(message ? [{ message, timestamp: new Date().toISOString(), status: existingTask.status }] : []),\n ],\n lastUpdated: new Date().toISOString(),\n };\n\n return {\n ...state,\n tasks: { ...state.tasks, [taskName]: updatedTask },\n lastUpdated: new Date().toISOString(),\n };\n}\n\n/**\n * Apply task restart to execution state.\n * Resets the task to not-started, preserving executionCount and lastEpoch\n * (history). Clears data, error, progress. The task becomes eligible for\n * scheduling again on the next drain cycle.\n * Pure function.\n */\nexport function applyTaskRestart(\n state: ExecutionState,\n taskName: string,\n): ExecutionState {\n const existingTask = state.tasks[taskName];\n if (!existingTask) return state;\n\n const updatedTask: GraphEngineStore = {\n ...existingTask,\n status: 'not-started',\n startedAt: undefined,\n completedAt: undefined,\n failedAt: undefined,\n error: undefined,\n data: undefined,\n progress: null,\n lastUpdated: new Date().toISOString(),\n };\n\n return {\n ...state,\n tasks: { ...state.tasks, [taskName]: updatedTask },\n lastUpdated: new Date().toISOString(),\n };\n}\n\nfunction createDefaultGraphEngineStore(): GraphEngineStore {\n return {\n status: 'not-started',\n executionCount: 0,\n retryCount: 0,\n lastEpoch: 0,\n messages: [],\n progress: null,\n };\n}\n","/**\n * Continuous Event Graph — Core\n *\n * All functions are pure: f(LiveGraph, input) → LiveGraph\n *\n * - createLiveGraph: bootstrap from a GraphConfig\n * - applyEvent: reduce an event (task-started, task-completed, etc.)\n * - addNode / removeNode: structural graph mutations\n * - addRequires / removeRequires / addProvides / removeProvides: wiring mutations\n */\n\nimport type { GraphConfig, TaskConfig, GraphEvent, LiveGraph, NodeInfo, LiveGraphSnapshot } from './types.js';\nimport type { ExecutionState, GraphEngineStore } from '../event-graph/types.js';\nimport { getProvides, getRequires } from '../event-graph/graph-helpers.js';\nimport {\n applyTaskStart,\n applyTaskCompletion,\n applyTaskFailure,\n applyTaskProgress,\n applyTaskRestart,\n} from '../event-graph/task-transitions.js';\n\n// ============================================================================\n// Create\n// ============================================================================\n\n/**\n * Create a LiveGraph from a GraphConfig.\n * Initialises execution state for all tasks in the config.\n */\nexport function createLiveGraph(config: GraphConfig, executionId?: string): LiveGraph {\n const id = executionId ?? `live-${Date.now()}`;\n const tasks: Record<string, GraphEngineStore> = {};\n\n for (const taskName of Object.keys(config.tasks)) {\n tasks[taskName] = createDefaultGraphEngineStore();\n }\n\n const state: ExecutionState = {\n status: 'running',\n tasks,\n availableOutputs: [],\n stuckDetection: { is_stuck: false, stuck_description: null, outputs_unresolvable: [], tasks_blocked: [] },\n lastUpdated: new Date().toISOString(),\n executionId: id,\n executionConfig: {\n executionMode: config.settings.execution_mode ?? 'eligibility-mode',\n conflictStrategy: config.settings.conflict_strategy ?? 'alphabetical',\n completionStrategy: config.settings.completion,\n },\n };\n\n return { config, state };\n}\n\n// ============================================================================\n// Event Reducer\n// ============================================================================\n\n/**\n * Apply an event to the LiveGraph, producing a new LiveGraph.\n * Events are the shared vocabulary — both execution state transitions\n * (task-started, task-completed, etc.) and structural mutations\n * (task-upsert, task-removal, node-requires-add, etc.).\n *\n * Pure function: f(LiveGraph, GraphEvent) → LiveGraph\n */\nexport function applyEvent(live: LiveGraph, event: GraphEvent): LiveGraph {\n const { config, state } = live;\n\n // Ghost event filtering\n if ('executionId' in event && event.executionId && event.executionId !== state.executionId) {\n return live;\n }\n\n switch (event.type) {\n // --- Execution state transitions ---\n\n case 'task-started':\n return { config, state: applyTaskStart(state, event.taskName, config) };\n\n case 'task-completed':\n return { config, state: applyTaskCompletion(state, config, event.taskName, event.result, event.dataHash, event.data) };\n\n case 'task-failed':\n return { config, state: applyTaskFailure(state, config, event.taskName, event.error) };\n\n case 'task-progress':\n return { config, state: applyTaskProgress(state, event.taskName, event.message, event.progress) };\n\n case 'task-restart':\n return { config, state: applyTaskRestart(state, event.taskName) };\n\n case 'inject-tokens':\n return {\n config,\n state: {\n ...state,\n availableOutputs: [...new Set([...state.availableOutputs, ...event.tokens])],\n lastUpdated: new Date().toISOString(),\n },\n };\n\n case 'agent-action':\n return { config, state: applyAgentAction(state, event.action) };\n\n // --- Structural mutations ---\n\n case 'task-upsert':\n return addNode(live, event.taskName, event.taskConfig);\n\n case 'task-removal':\n return removeNode(live, event.taskName);\n\n case 'node-requires-add':\n return addRequires(live, event.nodeName, event.tokens);\n\n case 'node-requires-remove':\n return removeRequires(live, event.nodeName, event.tokens);\n\n case 'node-provides-add':\n return addProvides(live, event.nodeName, event.tokens);\n\n case 'node-provides-remove':\n return removeProvides(live, event.nodeName, event.tokens);\n\n default:\n return live;\n }\n}\n\n/**\n * Apply multiple events atomically to a LiveGraph.\n * Events are reduced sequentially, but the caller only sees the final state.\n * Use this for batch processing (e.g. draining a journal of pending events).\n */\nexport function applyEvents(live: LiveGraph, events: GraphEvent[]): LiveGraph {\n return events.reduce((current, event) => applyEvent(current, event), live);\n}\n\n// ============================================================================\n// Graph Mutations — node-level\n// ============================================================================\n\n/**\n * Upsert a node (task) in the live graph. Updates both config and state atomically.\n * If the node already exists, replaces its config but preserves its state.\n * If new, creates fresh default state.\n */\nexport function addNode(live: LiveGraph, name: string, taskConfig: TaskConfig): LiveGraph {\n const exists = !!live.config.tasks[name];\n return {\n config: {\n ...live.config,\n tasks: { ...live.config.tasks, [name]: taskConfig },\n },\n state: {\n ...live.state,\n tasks: {\n ...live.state.tasks,\n [name]: exists ? live.state.tasks[name] : createDefaultGraphEngineStore(),\n },\n lastUpdated: new Date().toISOString(),\n },\n };\n}\n\n/**\n * Remove a node (task) from the live graph. Updates both config and state atomically.\n * If the node doesn't exist, returns the graph unchanged.\n * NOTE: Does not clean up references — other nodes' requires/provides are left intact.\n * The caller can use removeRequires() to clean up if needed.\n */\nexport function removeNode(live: LiveGraph, name: string): LiveGraph {\n if (!live.config.tasks[name]) return live;\n\n const { [name]: _removedConfig, ...remainingTasks } = live.config.tasks;\n const { [name]: _removedState, ...remainingStates } = live.state.tasks;\n\n return {\n config: {\n ...live.config,\n tasks: remainingTasks,\n },\n state: {\n ...live.state,\n tasks: remainingStates,\n lastUpdated: new Date().toISOString(),\n },\n };\n}\n\n// ============================================================================\n// Graph Mutations — wiring\n// ============================================================================\n\n/**\n * Add requires tokens to a node. If the node doesn't exist, returns unchanged.\n * Deduplicates — won't add tokens already in requires.\n */\nexport function addRequires(live: LiveGraph, nodeName: string, tokens: string[]): LiveGraph {\n const task = live.config.tasks[nodeName];\n if (!task) return live;\n\n const current = getRequires(task);\n const toAdd = tokens.filter(t => !current.includes(t));\n if (toAdd.length === 0) return live;\n\n return {\n config: {\n ...live.config,\n tasks: {\n ...live.config.tasks,\n [nodeName]: { ...task, requires: [...current, ...toAdd] },\n },\n },\n state: live.state,\n };\n}\n\n/**\n * Remove requires tokens from a node. If the node doesn't exist, returns unchanged.\n */\nexport function removeRequires(live: LiveGraph, nodeName: string, tokens: string[]): LiveGraph {\n const task = live.config.tasks[nodeName];\n if (!task) return live;\n\n const current = getRequires(task);\n const remaining = current.filter(t => !tokens.includes(t));\n if (remaining.length === current.length) return live;\n\n return {\n config: {\n ...live.config,\n tasks: {\n ...live.config.tasks,\n [nodeName]: { ...task, requires: remaining },\n },\n },\n state: live.state,\n };\n}\n\n/**\n * Add provides tokens to a node. If the node doesn't exist, returns unchanged.\n * Deduplicates — won't add tokens already in provides.\n */\nexport function addProvides(live: LiveGraph, nodeName: string, tokens: string[]): LiveGraph {\n const task = live.config.tasks[nodeName];\n if (!task) return live;\n\n const current = getProvides(task);\n const toAdd = tokens.filter(t => !current.includes(t));\n if (toAdd.length === 0) return live;\n\n return {\n config: {\n ...live.config,\n tasks: {\n ...live.config.tasks,\n [nodeName]: { ...task, provides: [...current, ...toAdd] },\n },\n },\n state: live.state,\n };\n}\n\n/**\n * Remove provides tokens from a node. If the node doesn't exist, returns unchanged.\n */\nexport function removeProvides(live: LiveGraph, nodeName: string, tokens: string[]): LiveGraph {\n const task = live.config.tasks[nodeName];\n if (!task) return live;\n\n const current = getProvides(task);\n const remaining = current.filter(t => !tokens.includes(t));\n if (remaining.length === current.length) return live;\n\n return {\n config: {\n ...live.config,\n tasks: {\n ...live.config.tasks,\n [nodeName]: { ...task, provides: remaining },\n },\n },\n state: live.state,\n };\n}\n\n// ============================================================================\n// Convenience — inject tokens via mutation (sugar over applyEvent)\n// ============================================================================\n\n/**\n * Inject tokens into the live graph's available outputs.\n * Equivalent to applyEvent(live, { type: 'inject-tokens', tokens, timestamp }).\n */\nexport function injectTokens(live: LiveGraph, tokens: string[]): LiveGraph {\n return applyEvent(live, {\n type: 'inject-tokens',\n tokens,\n timestamp: new Date().toISOString(),\n });\n}\n\n/**\n * Drain (remove) tokens from the live graph's available outputs.\n * Inverse of injectTokens — useful for expiring stale data or revoking signals.\n * Tokens that aren't currently available are silently ignored.\n * Pure function.\n */\nexport function drainTokens(live: LiveGraph, tokens: string[]): LiveGraph {\n const toRemove = new Set(tokens);\n const remaining = live.state.availableOutputs.filter(t => !toRemove.has(t));\n\n if (remaining.length === live.state.availableOutputs.length) return live;\n\n return {\n config: live.config,\n state: {\n ...live.state,\n availableOutputs: remaining,\n lastUpdated: new Date().toISOString(),\n },\n };\n}\n\n// ============================================================================\n// Node lifecycle\n// ============================================================================\n\n/**\n * Reset a node's state back to not-started, clearing error, retry count, progress.\n * Config is untouched. Useful when a failed task should be retried later.\n * If the node doesn't exist, returns unchanged.\n */\nexport function resetNode(live: LiveGraph, name: string): LiveGraph {\n if (!live.config.tasks[name] || !live.state.tasks[name]) return live;\n\n return {\n config: live.config,\n state: {\n ...live.state,\n tasks: {\n ...live.state.tasks,\n [name]: createDefaultGraphEngineStore(),\n },\n lastUpdated: new Date().toISOString(),\n },\n };\n}\n\n/**\n * Disable a node — sets its status to 'inactivated'.\n * The scheduler will skip inactivated tasks. Config is untouched.\n * If the node doesn't exist or is already inactivated, returns unchanged.\n */\nexport function disableNode(live: LiveGraph, name: string): LiveGraph {\n const taskState = live.state.tasks[name];\n if (!taskState || taskState.status === 'inactivated') return live;\n\n return {\n config: live.config,\n state: {\n ...live.state,\n tasks: {\n ...live.state.tasks,\n [name]: { ...taskState, status: 'inactivated', lastUpdated: new Date().toISOString() },\n },\n lastUpdated: new Date().toISOString(),\n },\n };\n}\n\n/**\n * Enable a previously-disabled node — sets its status back to 'not-started'.\n * Only acts on 'inactivated' nodes. If the node isn't inactivated, returns unchanged.\n */\nexport function enableNode(live: LiveGraph, name: string): LiveGraph {\n const taskState = live.state.tasks[name];\n if (!taskState || taskState.status !== 'inactivated') return live;\n\n return {\n config: live.config,\n state: {\n ...live.state,\n tasks: {\n ...live.state.tasks,\n [name]: { ...taskState, status: 'not-started', lastUpdated: new Date().toISOString() },\n },\n lastUpdated: new Date().toISOString(),\n },\n };\n}\n\n// ============================================================================\n// Read: getNode\n// ============================================================================\n\n/**\n * Get the config and state for a single node.\n * Returns undefined if the node doesn't exist.\n */\nexport function getNode(live: LiveGraph, name: string): NodeInfo | undefined {\n const config = live.config.tasks[name];\n if (!config) return undefined;\n const state = live.state.tasks[name] ?? createDefaultGraphEngineStore();\n return { name, config, state };\n}\n\n// ============================================================================\n// Persistence: snapshot / restore\n// ============================================================================\n\n/**\n * Serialize a LiveGraph to a plain JSON-safe object.\n * Can be persisted to disk, database, etc.\n */\nexport function snapshot(live: LiveGraph): LiveGraphSnapshot {\n return {\n version: 1,\n config: live.config,\n state: live.state,\n snapshotAt: new Date().toISOString(),\n };\n}\n\n/**\n * Restore a LiveGraph from a snapshot. Validates the shape.\n * Throws if the snapshot is invalid.\n */\nexport function restore(data: unknown): LiveGraph {\n if (!data || typeof data !== 'object') {\n throw new Error('Invalid snapshot: expected an object');\n }\n\n const snap = data as Record<string, unknown>;\n\n if (!snap.config || typeof snap.config !== 'object') {\n throw new Error('Invalid snapshot: missing or invalid \"config\"');\n }\n if (!snap.state || typeof snap.state !== 'object') {\n throw new Error('Invalid snapshot: missing or invalid \"state\"');\n }\n\n const config = snap.config as GraphConfig;\n const state = snap.state as ExecutionState;\n\n if (!config.settings || typeof config.settings !== 'object') {\n throw new Error('Invalid snapshot: config.settings missing');\n }\n if (!config.tasks || typeof config.tasks !== 'object') {\n throw new Error('Invalid snapshot: config.tasks missing');\n }\n if (!state.tasks || typeof state.tasks !== 'object') {\n throw new Error('Invalid snapshot: state.tasks missing');\n }\n if (!Array.isArray(state.availableOutputs)) {\n throw new Error('Invalid snapshot: state.availableOutputs must be an array');\n }\n\n return { config, state };\n}\n\n// ============================================================================\n// Internals\n// ============================================================================\n\nfunction createDefaultGraphEngineStore(): GraphEngineStore {\n return {\n status: 'not-started',\n executionCount: 0,\n retryCount: 0,\n lastEpoch: 0,\n messages: [],\n progress: null,\n };\n}\n\nfunction applyAgentAction(\n state: ExecutionState,\n action: 'start' | 'stop' | 'pause' | 'resume',\n): ExecutionState {\n const now = new Date().toISOString();\n switch (action) {\n case 'stop':\n return { ...state, status: 'stopped', lastUpdated: now };\n case 'pause':\n return { ...state, status: 'paused', lastUpdated: now };\n case 'resume':\n return { ...state, status: 'running', lastUpdated: now };\n default:\n return state;\n }\n}\n","/**\n * Continuous Event Graph — Schedule\n *\n * Pure read-only projection: LiveGraph → ScheduleResult\n *\n * Classifies every non-terminal task into one of:\n * - eligible: all requires satisfied, ready to dispatch\n * - pending: requires not yet met, but a viable producer exists (normal waiting)\n * - unresolved: requires not met, NO task in the graph can produce them (caller's problem)\n * - blocked: requires not met because the producing task FAILED (caller's problem)\n */\n\nimport type { LiveGraph, ScheduleResult, PendingTask, UnresolvedDependency, BlockedTask } from './types.js';\nimport { getProvides, getRequires, getAllTasks, isNonActiveTask, computeAvailableOutputs, getMaxExecutions, getRefreshStrategy, groupTasksByProvides } from '../event-graph/graph-helpers.js';\nimport { TASK_STATUS } from '../event-graph/constants.js';\n\n/**\n * Compute the scheduling status of every task in the live graph.\n * Pure function — no side effects.\n */\nexport function schedule(live: LiveGraph): ScheduleResult {\n const { config, state } = live;\n const graphTasks = getAllTasks(config);\n const taskNames = Object.keys(graphTasks);\n\n if (taskNames.length === 0) {\n return { eligible: [], pending: [], unresolved: [], blocked: [], conflicts: {} };\n }\n\n // Build producer map: token → tasks that produce it (includes on/on_failure)\n const producerMap = buildProducerMap(graphTasks);\n\n // Available outputs: from completed tasks + injected tokens\n const computedOutputs = computeAvailableOutputs(config, state.tasks);\n const availableOutputs = new Set([...computedOutputs, ...state.availableOutputs]);\n\n const eligible: string[] = [];\n const pending: PendingTask[] = [];\n const unresolved: UnresolvedDependency[] = [];\n const blocked: BlockedTask[] = [];\n\n for (const [taskName, taskConfig] of Object.entries(graphTasks)) {\n const taskState = state.tasks[taskName];\n const strategy = getRefreshStrategy(taskConfig, config.settings);\n const rerunnable = strategy !== 'once';\n\n // Always skip running or inactive (failed/inactivated) tasks\n if (taskState?.status === TASK_STATUS.RUNNING || isNonActiveTask(taskState)) {\n continue;\n }\n\n // Max executions cap\n const maxExec = getMaxExecutions(taskConfig);\n if (maxExec !== undefined && taskState && taskState.executionCount >= maxExec) {\n continue;\n }\n\n // Circuit breaker\n if (taskConfig.circuit_breaker && taskState &&\n taskState.executionCount >= taskConfig.circuit_breaker.max_executions) {\n continue;\n }\n\n // For once-only tasks: skip if completed\n if (!rerunnable && taskState?.status === TASK_STATUS.COMPLETED) {\n continue;\n }\n\n // For re-runnable tasks that already completed: check strategy\n if (rerunnable && taskState?.status === TASK_STATUS.COMPLETED) {\n const requires = getRequires(taskConfig);\n\n let shouldSkip = false;\n switch (strategy) {\n case 'data-changed': {\n if (requires.length > 0) {\n const hasChangedData = requires.some(req => {\n for (const [otherName, otherConfig] of Object.entries(graphTasks)) {\n if (getProvides(otherConfig).includes(req)) {\n const otherState = state.tasks[otherName];\n if (!otherState) continue;\n const consumed = taskState.lastConsumedHashes?.[req];\n if (otherState.lastDataHash == null) {\n return otherState.executionCount > taskState.lastEpoch;\n }\n return otherState.lastDataHash !== consumed;\n }\n }\n return false;\n });\n if (!hasChangedData) shouldSkip = true;\n } else {\n shouldSkip = true;\n }\n break;\n }\n case 'epoch-changed': {\n if (requires.length > 0) {\n const hasRefreshed = requires.some(req => {\n for (const [otherName, otherConfig] of Object.entries(graphTasks)) {\n if (getProvides(otherConfig).includes(req)) {\n const otherState = state.tasks[otherName];\n if (otherState && otherState.executionCount > taskState.lastEpoch) return true;\n }\n }\n return false;\n });\n if (!hasRefreshed) shouldSkip = true;\n } else {\n shouldSkip = true;\n }\n break;\n }\n case 'time-based': {\n const interval = taskConfig.refreshInterval ?? 0;\n if (interval <= 0) { shouldSkip = true; break; }\n const completedAt = taskState.completedAt;\n if (!completedAt) { shouldSkip = true; break; }\n const elapsedSec = (Date.now() - Date.parse(completedAt)) / 1000;\n if (elapsedSec < interval) shouldSkip = true;\n break;\n }\n case 'manual':\n shouldSkip = true;\n break;\n }\n if (shouldSkip) continue;\n }\n\n const requires = getRequires(taskConfig);\n\n // No requires → eligible (entry point)\n if (requires.length === 0) {\n eligible.push(taskName);\n continue;\n }\n\n // Check each required token\n const missingTokens: string[] = [];\n const pendingTokens: string[] = [];\n const failedTokenInfo: { token: string; failedProducer: string }[] = [];\n\n for (const token of requires) {\n if (availableOutputs.has(token)) continue;\n\n const producers = producerMap[token] || [];\n\n if (producers.length === 0) {\n // No task produces this token → unresolved\n missingTokens.push(token);\n } else {\n // Check if all producers have failed\n const allFailed = producers.every(p => isNonActiveTask(state.tasks[p]));\n if (allFailed) {\n failedTokenInfo.push({ token, failedProducer: producers[0] });\n } else {\n // At least one producer is viable → pending (normal wait)\n pendingTokens.push(token);\n }\n }\n }\n\n if (missingTokens.length > 0) {\n unresolved.push({ taskName, missingTokens });\n } else if (failedTokenInfo.length > 0) {\n blocked.push({\n taskName,\n failedTokens: failedTokenInfo.map(f => f.token),\n failedProducers: [...new Set(failedTokenInfo.map(f => f.failedProducer))],\n });\n } else if (pendingTokens.length > 0) {\n pending.push({ taskName, waitingOn: pendingTokens });\n } else {\n // All requires satisfied\n eligible.push(taskName);\n }\n }\n\n // Detect conflicts among eligible tasks\n const conflicts: Record<string, string[]> = {};\n if (eligible.length > 1) {\n const outputGroups = groupTasksByProvides(eligible, graphTasks);\n for (const [outputKey, groupTasks] of Object.entries(outputGroups)) {\n if (groupTasks.length > 1) {\n conflicts[outputKey] = groupTasks;\n }\n }\n }\n\n return { eligible, pending, unresolved, blocked, conflicts };\n}\n\n// ============================================================================\n// Internal helpers\n// ============================================================================\n\n/**\n * Build a map: token → tasks that produce it (via provides, on, on_failure).\n */\nfunction buildProducerMap(tasks: Record<string, import('../event-graph/types.js').TaskConfig>): Record<string, string[]> {\n const map: Record<string, string[]> = {};\n\n for (const [name, config] of Object.entries(tasks)) {\n for (const token of getProvides(config)) {\n if (!map[token]) map[token] = [];\n map[token].push(name);\n }\n if (config.on) {\n for (const tokens of Object.values(config.on)) {\n for (const token of tokens) {\n if (!map[token]) map[token] = [];\n if (!map[token].includes(name)) map[token].push(name);\n }\n }\n }\n if (config.on_failure) {\n for (const token of config.on_failure) {\n if (!map[token]) map[token] = [];\n if (!map[token].includes(name)) map[token].push(name);\n }\n }\n }\n\n return map;\n}\n","/**\n * Continuous Event Graph — Journal\n *\n * Append-only event log for the reactive layer.\n * Handlers append events here; drain() reads and clears atomically.\n *\n * Adapter:\n * - MemoryJournal: in-process array (default)\n */\n\nimport type { GraphEvent } from '../event-graph/types.js';\n\n// ============================================================================\n// Interface\n// ============================================================================\n\nexport interface Journal {\n /** Append an event to the journal. Safe to call from concurrent callbacks. */\n append(event: GraphEvent): void;\n /** Read all pending events and clear the journal atomically. */\n drain(): GraphEvent[];\n /** Number of pending events (for observability). */\n readonly size: number;\n}\n\n// ============================================================================\n// MemoryJournal — in-process, zero dependencies\n// ============================================================================\n\nexport class MemoryJournal implements Journal {\n private buffer: GraphEvent[] = [];\n\n append(event: GraphEvent): void {\n this.buffer.push(event);\n }\n\n drain(): GraphEvent[] {\n const events = this.buffer;\n this.buffer = [];\n return events;\n }\n\n get size(): number {\n return this.buffer.length;\n }\n}\n","/**\n * Continuous Event Graph — Reactive Layer\n *\n * Push-based, self-sustaining execution wrapper.\n *\n * Pattern:\n * 1. Register handlers for tasks\n * 2. Push an event (or inject tokens)\n * 3. The graph drives itself: drain journal → applyEvents → schedule → dispatch → repeat\n *\n * No daemon, no polling. Each handler callback appends to the journal,\n * which triggers a drain cycle that may dispatch the next wave.\n *\n * Dispatch failures, retries, and timeouts are managed internally\n * without touching the core engine types.\n */\n\nimport type { GraphConfig, TaskConfig, GraphEvent, GraphEngineStore } from '../event-graph/types.js';\nimport type { LiveGraph, LiveGraphSnapshot, ScheduleResult } from './types.js';\nimport { createLiveGraph, applyEvents, snapshot } from './core.js';\nimport { schedule } from './schedule.js';\nimport { MemoryJournal } from './journal.js';\n\n// ============================================================================\n// Internal helpers\n// ============================================================================\n\n/**\n * Deterministic hash of a data payload.\n * Recursively-sorted JSON → stable 64-bit hex.\n * Used to auto-compute dataHash when the handler doesn't provide one.\n * Exported so handler authors can pre-compute or test hashes.\n */\nexport function computeDataHash(data: Record<string, unknown>): string {\n const json = stableStringify(data);\n return fnv1a64Hex(json);\n}\n\n/** Recursively produce a JSON string with sorted keys at every level. */\nfunction stableStringify(value: unknown): string {\n if (value === null || value === undefined || typeof value !== 'object') {\n return JSON.stringify(value);\n }\n if (Array.isArray(value)) {\n return '[' + value.map(stableStringify).join(',') + ']';\n }\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj).sort();\n return '{' + keys.map(k => JSON.stringify(k) + ':' + stableStringify(obj[k])).join(',') + '}';\n}\n\n/**\n * Stable 64-bit FNV-1a hash as 16-char hex.\n * Fast, deterministic, and browser/Node portable.\n */\nfunction fnv1a64Hex(input: string): string {\n let hash = 0xcbf29ce484222325n;\n const prime = 0x100000001b3n;\n const mod = 0xffffffffffffffffn;\n for (let i = 0; i < input.length; i++) {\n hash ^= BigInt(input.charCodeAt(i));\n hash = (hash * prime) & mod;\n }\n return hash.toString(16).padStart(16, '0');\n}\n\nfunction base64UrlEncode(input: string): string {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(input, 'utf8').toString('base64url');\n }\n if (typeof btoa === 'function') {\n const bytes = new TextEncoder().encode(input);\n let binary = '';\n for (const b of bytes) binary += String.fromCharCode(b);\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '');\n }\n throw new Error('No base64 encoder available in this runtime');\n}\n\nfunction base64UrlDecode(input: string): string {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(input, 'base64url').toString('utf8');\n }\n if (typeof atob === 'function') {\n const base64 = input.replace(/-/g, '+').replace(/_/g, '/');\n const padded = base64 + '='.repeat((4 - (base64.length % 4)) % 4);\n const binary = atob(padded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return new TextDecoder().decode(bytes);\n }\n throw new Error('No base64 decoder available in this runtime');\n}\n\n/**\n * Encode a callback token for a task.\n * Opaque base64url string — can be sent to external systems.\n */\nfunction encodeCallbackToken(taskName: string): string {\n const payload = JSON.stringify({ t: taskName, n: Date.now().toString(36) + Math.random().toString(36).slice(2, 6) });\n return base64UrlEncode(payload);\n}\n\n/**\n * Decode a callback token → { taskName } or null if malformed.\n */\nfunction decodeCallbackToken(token: string): { taskName: string } | null {\n try {\n const payload = JSON.parse(base64UrlDecode(token));\n if (typeof payload?.t === 'string') return { taskName: payload.t };\n return null;\n } catch { return null; }\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Input passed to a task handler function.\n *\n * The reactive layer resolves upstream data from `requires` into `state`,\n * and provides this task's own engine store as `taskState`.\n * Handlers push output data back via `graph.resolveCallback(callbackToken, data)`.\n */\nexport interface TaskHandlerInput {\n /** This task's node ID (task name) */\n nodeId: string;\n /**\n * Upstream dependency data, keyed by require token name.\n * Only tokens from this task's `requires` are present.\n * Value is the producing task's `data` field (or undefined if not yet available).\n */\n state: Readonly<Record<string, Record<string, unknown> | undefined>>;\n /**\n * This task's own GraphEngineStore — includes status, data, executionCount, etc.\n */\n taskState: Readonly<GraphEngineStore>;\n /** This task's config */\n config: Readonly<TaskConfig>;\n /**\n * Opaque callback token encoding this task's identity.\n * Pass this to `graph.resolveCallback(callbackToken, data)` to complete the task.\n * Can be serialized and sent to external systems (webhooks, other scripts,\n * message queues) — any process with this token can push data back.\n */\n callbackToken: string;\n /**\n * Present only on task-progress re-invocations (source delivery / failure).\n * Contains the update payload from the task-progress event.\n * e.g. { bindTo: 'prices', fetchedAt: '...', dest: 'prices.json' }\n * or { bindTo: 'prices', failure: true, reason: 'timeout' }\n */\n update?: Record<string, unknown>;\n}\n\n/**\n * Handler return value — initiation status only.\n * - `'task-initiated'` — async work started successfully; data will arrive via resolveCallback\n * - `'task-initiate-failure'` — failed to start (bad config, connection refused, etc.)\n */\nexport type TaskHandlerReturn = 'task-initiated' | 'task-initiate-failure';\n\n/**\n * A named task handler function.\n * Registered in the handler registry, referenced by name in `taskConfig.taskHandlers`.\n *\n * The handler's job is to **initiate** async work, not await it.\n *\n * Flow:\n * 1. Handler receives `callbackToken` + upstream `state`\n * 2. Handler kicks off background work (internal, external script, webhook, etc.)\n * — passes `callbackToken` to the background work\n * 3. Handler returns `'task-initiated'` immediately\n * 4. Background work runs independently — when done, it calls\n * `graph.resolveCallback(callbackToken, data)` for success, or\n * `graph.resolveCallback(callbackToken, {}, ['error msg'])` for failure\n * 5. resolveCallback completes the task → data-changed cascade fires\n *\n * The callbackToken is opaque — pass it to the background work so it can\n * call back. Works across processes, scripts, webhooks, message queues.\n *\n * @example\n * ```ts\n * const fetchYahoo: TaskHandlerFn = async ({ state, callbackToken }) => {\n * const symbols = state['portfolio-form']?.holdings?.map(h => h.symbol) ?? [];\n * // Kick off background work — do NOT await\n * fetch(`https://api.yahoo.com/prices?s=${symbols.join(',')}`)\n * .then(res => res.json())\n * .then(prices => graph.resolveCallback(callbackToken, { prices }))\n * .catch(err => graph.resolveCallback(callbackToken, {}, [err.message]));\n * // Return immediately — background work will resolveCallback when done\n * return 'task-initiated';\n * };\n * ```\n */\nexport type TaskHandlerFn = (input: TaskHandlerInput) => Promise<TaskHandlerReturn>;\n\nexport interface ReactiveGraphOptions {\n /** Named handler registry — handler name → handler function */\n handlers: Record<string, TaskHandlerFn>;\n /** Called after each drain cycle — for observability */\n onDrain?: (events: GraphEvent[], live: LiveGraph, scheduleResult: ScheduleResult) => void;\n}\n\nexport interface ReactiveGraph {\n /** Push an event into the graph via journal. Triggers drain → schedule → dispatch. */\n push(event: GraphEvent): void;\n /** Push multiple events via journal. Single drain cycle after all are journaled. */\n pushAll(events: GraphEvent[]): void;\n /**\n * Resolve a callback token — complete (or fail) a task after initiation.\n * Journals task-completed or task-failed, then drains.\n * Gracefully ignores invalid tokens or tokens for tasks no longer in the graph.\n */\n resolveCallback(callbackToken: string, data: Record<string, unknown>, errors?: string[]): void;\n /** Add a node to the graph. Journals a task-upsert event, then drains. */\n addNode(name: string, taskConfig: TaskConfig): void;\n /** Remove a node from the graph. Journals a task-removal event, then drains. */\n removeNode(name: string): void;\n /** Add required tokens to an existing node. Journals event, then drains. */\n addRequires(nodeName: string, tokens: string[]): void;\n /** Remove required tokens from an existing node. Journals event, then drains. */\n removeRequires(nodeName: string, tokens: string[]): void;\n /** Add provided tokens to an existing node. Journals event, then drains. */\n addProvides(nodeName: string, tokens: string[]): void;\n /** Remove provided tokens from an existing node. Journals event, then drains. */\n removeProvides(nodeName: string, tokens: string[]): void;\n /** Register a named handler in the registry. */\n registerHandler(name: string, fn: TaskHandlerFn): void;\n /** Unregister a named handler from the registry. */\n unregisterHandler(name: string): void;\n /**\n * Re-trigger a task: journals a task-restart event, then drains.\n * data-changed cascade handles downstream automatically.\n */\n retrigger(taskName: string): void;\n /** Re-trigger multiple tasks via journal. */\n retriggerAll(taskNames: string[]): void;\n /**\n * Serialize current state to a JSON-safe snapshot.\n * Caller is responsible for writing to disk/DB/etc.\n * Restore via: `createReactiveGraph(restore(snapshotData), options)`\n */\n snapshot(): LiveGraphSnapshot;\n /** Read-only snapshot of current LiveGraph state. */\n getState(): LiveGraph;\n /** Current schedule projection. */\n getSchedule(): ScheduleResult;\n /**\n * Await all in-flight handler promises without disposing the graph.\n * Use this when you need to wait for async handlers to finish so you\n * can inspect side-effects (e.g. a TX accumulator) and then push more\n * events into the same graph instance.\n */\n waitForHandlers(): Promise<void>;\n /**\n * Stop accepting events.\n * @param options.wait — if true, await all in-flight handler promises before marking disposed.\n */\n dispose(options?: { wait?: boolean }): Promise<void>;\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\nexport function createReactiveGraph(\n configOrLive: GraphConfig | LiveGraph,\n options: ReactiveGraphOptions,\n executionId?: string,\n): ReactiveGraph {\n const {\n handlers: initialHandlers,\n onDrain,\n } = options;\n\n // Private input queue — caller pushes external events here via push()/pushAll().\n // The engine never reads from a caller-supplied journal; all external events must be\n // explicitly pushed in so that state mutations are always caller-controlled.\n const inputQueue = new MemoryJournal();\n\n let live = 'state' in configOrLive && 'config' in configOrLive\n ? configOrLive as LiveGraph\n : createLiveGraph(configOrLive as GraphConfig, executionId);\n let disposed = false;\n\n // Track in-flight handler promises so callers can await them before dispose.\n const pendingHandlers = new Set<Promise<void>>();\n\n // Handler registry — mutable, keyed by handler name\n const handlers = new Map<string, TaskHandlerFn>(Object.entries(initialHandlers));\n\n // Private journal for internal state transitions (task-started, task-failed from engine).\n // Never exposed outside; keeps internal events off the caller-supplied journal.\n const internalJournal = new MemoryJournal();\n\n // Drain lock — prevents re-entrant drain cycles\n let draining = false;\n let drainQueued = false;\n\n // --------------------------------------------------------------------------\n // Core drain cycle\n // --------------------------------------------------------------------------\n\n function drain(): void {\n if (disposed) return;\n if (draining) {\n drainQueued = true;\n return;\n }\n\n draining = true;\n try {\n do {\n drainQueued = false;\n drainOnce();\n } while (drainQueued);\n } finally {\n draining = false;\n }\n }\n\n function drainOnce(): void {\n // 1. Read all pending events — internal lifecycle transitions first (task-started, task-failed),\n // then caller-pushed external events (task-upsert, task-completed, etc.).\n // Internal must precede external so engine lifecycle always applies before caller completions.\n const internalEvents = internalJournal.drain();\n const inputEvents = inputQueue.drain();\n const events = [...internalEvents, ...inputEvents];\n\n // 2. Apply events atomically (if any)\n if (events.length > 0) {\n live = applyEvents(live, events);\n }\n\n // 3. Schedule — what can run?\n const result = schedule(live);\n\n // 4. Observability callback (only when there were events)\n if (events.length > 0) {\n onDrain?.(events, live, result);\n }\n\n // 5. Dispatch eligible tasks\n for (const taskName of result.eligible) {\n dispatchTask(taskName);\n }\n\n // 6. Re-invoke handlers for in-progress tasks that received a task-progress event.\n // task-progress events don't change task status (they're not applied by the engine),\n // so we route them here directly to their taskHandlers.\n for (const event of events) {\n if (event.type === 'task-progress') {\n const { taskName, update } = event;\n const taskConfig = live.config.tasks[taskName];\n if (!taskConfig) continue;\n const taskState = live.state.tasks[taskName];\n if (!taskState || taskState.status !== 'running') continue;\n const callbackToken = encodeCallbackToken(taskName);\n const p = runPipeline(taskName, callbackToken, update).catch((error: Error) => {\n if (disposed) return;\n internalJournal.append({\n type: 'task-failed',\n taskName,\n error: error.message ?? String(error),\n timestamp: new Date().toISOString(),\n });\n drain();\n }).finally(() => { pendingHandlers.delete(p); });\n pendingHandlers.add(p);\n }\n }\n }\n\n // --------------------------------------------------------------------------\n // Resolve upstream state for a task's requires\n // --------------------------------------------------------------------------\n\n function resolveUpstreamState(taskName: string): Record<string, Record<string, unknown> | undefined> {\n const taskConfig = live.config.tasks[taskName];\n const requires = taskConfig.requires ?? [];\n\n const tokenToTask = new Map<string, string>();\n for (const [name, cfg] of Object.entries(live.config.tasks)) {\n for (const token of cfg.provides ?? []) {\n tokenToTask.set(token, name);\n }\n }\n\n const state: Record<string, Record<string, unknown> | undefined> = {};\n for (const token of requires) {\n const producerTask = tokenToTask.get(token);\n if (producerTask) {\n state[token] = live.state.tasks[producerTask]?.data;\n } else {\n state[token] = undefined;\n }\n }\n return state;\n }\n\n // --------------------------------------------------------------------------\n // Run the handler pipeline for a task\n // --------------------------------------------------------------------------\n\n async function runPipeline(taskName: string, callbackToken: string, update?: Record<string, unknown>): Promise<void> {\n const taskConfig = live.config.tasks[taskName];\n const handlerNames = taskConfig.taskHandlers ?? [];\n const upstreamState = resolveUpstreamState(taskName);\n\n for (const handlerName of handlerNames) {\n const handler = handlers.get(handlerName);\n if (!handler) {\n throw new Error(`Handler '${handlerName}' not found in registry (task '${taskName}')`);\n }\n\n const input: TaskHandlerInput = {\n nodeId: taskName,\n state: upstreamState,\n taskState: live.state.tasks[taskName],\n config: taskConfig,\n callbackToken,\n update,\n };\n\n const status = await handler(input);\n\n if (status === 'task-initiate-failure') {\n throw new Error(`Handler '${handlerName}' returned task-initiate-failure (task '${taskName}')`);\n }\n }\n }\n\n // --------------------------------------------------------------------------\n // Dispatch a single task\n // --------------------------------------------------------------------------\n\n function dispatchTask(taskName: string): void {\n const taskConfig = live.config.tasks[taskName];\n const handlerNames = taskConfig?.taskHandlers;\n\n if (!handlerNames || handlerNames.length === 0) {\n // No taskHandlers — externally driven.\n return;\n }\n\n // Write task-started to internal journal only — not to the caller-supplied journal\n internalJournal.append({\n type: 'task-started',\n taskName,\n timestamp: new Date().toISOString(),\n });\n // Re-trigger drain so task-started is applied to graph state before caller saves.\n // Since we're called from within drainOnce(), draining=true here, so this sets\n // drainQueued=true — the do...while loop picks it up in the next pass.\n drain();\n\n const callbackToken = encodeCallbackToken(taskName);\n\n // Fire-and-forget: run the handler pipeline\n const p = runPipeline(taskName, callbackToken).catch((error: Error) => {\n if (disposed) return;\n internalJournal.append({\n type: 'task-failed',\n taskName,\n error: error.message ?? String(error),\n timestamp: new Date().toISOString(),\n });\n drain();\n }).finally(() => { pendingHandlers.delete(p); });\n pendingHandlers.add(p);\n }\n\n // --------------------------------------------------------------------------\n // Public API — every mutation goes through journal\n // --------------------------------------------------------------------------\n\n return {\n push(event: GraphEvent): void {\n if (disposed) return;\n if (event.type === 'task-completed' && event.data && !event.dataHash) {\n event = { ...event, dataHash: computeDataHash(event.data) };\n }\n inputQueue.append(event);\n drain();\n },\n\n pushAll(events: GraphEvent[]): void {\n if (disposed) return;\n for (const event of events) {\n if (event.type === 'task-completed' && event.data && !event.dataHash) {\n inputQueue.append({ ...event, dataHash: computeDataHash(event.data) });\n } else {\n inputQueue.append(event);\n }\n }\n drain();\n },\n\n resolveCallback(callbackToken: string, data: Record<string, unknown>, errors?: string[]): void {\n if (disposed) return;\n\n const decoded = decodeCallbackToken(callbackToken);\n if (!decoded) return;\n\n const { taskName } = decoded;\n if (!live.config.tasks[taskName]) return;\n\n if (errors && errors.length > 0) {\n inputQueue.append({\n type: 'task-failed',\n taskName,\n error: errors.join('; '),\n timestamp: new Date().toISOString(),\n });\n } else {\n const dataHash = data && Object.keys(data).length > 0 ? computeDataHash(data) : undefined;\n inputQueue.append({\n type: 'task-completed',\n taskName,\n data,\n dataHash,\n timestamp: new Date().toISOString(),\n });\n }\n drain();\n },\n\n addNode(name: string, taskConfig: TaskConfig): void {\n if (disposed) return;\n inputQueue.append({ type: 'task-upsert', taskName: name, taskConfig, timestamp: new Date().toISOString() });\n drain();\n },\n\n removeNode(name: string): void {\n if (disposed) return;\n inputQueue.append({ type: 'task-removal', taskName: name, timestamp: new Date().toISOString() });\n drain();\n },\n\n addRequires(nodeName: string, tokens: string[]): void {\n if (disposed) return;\n inputQueue.append({ type: 'node-requires-add', nodeName, tokens, timestamp: new Date().toISOString() });\n drain();\n },\n\n removeRequires(nodeName: string, tokens: string[]): void {\n if (disposed) return;\n inputQueue.append({ type: 'node-requires-remove', nodeName, tokens, timestamp: new Date().toISOString() });\n drain();\n },\n\n addProvides(nodeName: string, tokens: string[]): void {\n if (disposed) return;\n inputQueue.append({ type: 'node-provides-add', nodeName, tokens, timestamp: new Date().toISOString() });\n drain();\n },\n\n removeProvides(nodeName: string, tokens: string[]): void {\n if (disposed) return;\n inputQueue.append({ type: 'node-provides-remove', nodeName, tokens, timestamp: new Date().toISOString() });\n drain();\n },\n\n registerHandler(name: string, fn: TaskHandlerFn): void {\n handlers.set(name, fn);\n },\n\n unregisterHandler(name: string): void {\n handlers.delete(name);\n },\n\n retrigger(taskName: string): void {\n if (disposed) return;\n if (!live.config.tasks[taskName]) return;\n inputQueue.append({\n type: 'task-restart',\n taskName,\n timestamp: new Date().toISOString(),\n });\n drain();\n },\n\n retriggerAll(taskNames: string[]): void {\n if (disposed) return;\n for (const name of taskNames) {\n if (!live.config.tasks[name]) continue;\n inputQueue.append({\n type: 'task-restart',\n taskName: name,\n timestamp: new Date().toISOString(),\n });\n }\n drain();\n },\n\n snapshot(): LiveGraphSnapshot {\n return snapshot(live);\n },\n\n getState(): LiveGraph {\n return live;\n },\n\n getSchedule(): ScheduleResult {\n return schedule(live);\n },\n\n async waitForHandlers(): Promise<void> {\n if (pendingHandlers.size > 0) {\n await Promise.allSettled([...pendingHandlers]);\n }\n },\n\n async dispose(options?: { wait?: boolean }): Promise<void> {\n if (options?.wait && pendingHandlers.size > 0) {\n await Promise.allSettled([...pendingHandlers]);\n }\n disposed = true;\n },\n };\n}\n","/**\n * execution-interface.ts\n *\n * Pure module — no Node/platform imports. Safe for any runtime.\n *\n * Defines the portable descriptor types for invoking any executable target,\n * regardless of transport (local process, HTTP endpoint, cloud function, etc.).\n *\n * Parallel to storage-interface.ts (which describes WHERE data lives), this\n * module describes HOW to invoke a piece of logic.\n *\n * ────────────────────────────────────────────────────────────────────────────\n * CORE CONCEPTS\n * ────────────────────────────────────────────────────────────────────────────\n *\n * ExecutionRef — self-contained, serializable JSON descriptor for one invocation target.\n * • howToRun — transport / runtime kind (discriminator)\n * • whatToRun — address of the artifact (KindValueRef wire form: b64:<base64url(json)>)\n * • argsMassaging — optional JSONata expressions that map logical args → physical call shape\n * • meta — optional human-readable label (e.g. 'task-executor', 'chat-handler')\n *\n * ExecutionResult — standardized envelope returned by any invocation.\n * • status: 'success' | 'fail' | 'error'\n * • data — KindValueRef wire form pointing to output blob (on success)\n * • error — human-readable message (on fail/error)\n *\n * ────────────────────────────────────────────────────────────────────────────\n * howToRun VALUES\n * ────────────────────────────────────────────────────────────────────────────\n *\n * 'local-node' node <whatToRun> [argv...]\n * 'local-python' python <whatToRun> [argv...]\n * 'local-process' execute <whatToRun> directly (shebang / pre-resolved binary)\n * 'http:post' HTTP POST to <whatToRun>\n * 'http:get' HTTP GET to <whatToRun>\n * 'built-in' resolved by the adapter to a well-known internal implementation\n *\n * ────────────────────────────────────────────────────────────────────────────\n * argsMassaging\n * ────────────────────────────────────────────────────────────────────────────\n *\n * Each field is a JSONata expression evaluated against the caller's logical args object.\n * If argsMassaging is omitted, the adapter uses its default mapping for the howToRun kind.\n *\n * cmdTemplate — array of JSONata exprs, each producing one argv string (local transports)\n * urlTemplate — JSONata expr producing the final URL string (http transports)\n * bodyTemplate — JSONata expr producing the request body object (http transports)\n *\n * ────────────────────────────────────────────────────────────────────────────\n * SERIALIZATION\n * ────────────────────────────────────────────────────────────────────────────\n *\n * ExecutionRef is a plain JSON object — store it as-is on disk, in Cosmos, or any DB.\n * No special encoding needed. parseExecutionRef / serializeExecutionRef are thin\n * JSON wrappers provided for symmetry with storage-interface.\n *\n * ────────────────────────────────────────────────────────────────────────────\n * USAGE EXAMPLES\n * ────────────────────────────────────────────────────────────────────────────\n *\n * // Built-in source-cli task executor (resolved by adapter from cliDir):\n * const builtIn: ExecutionRef = {\n * meta: 'task-executor',\n * howToRun: 'built-in',\n * whatToRun: 'b64:<base64url({\"kind\":\"built-in\",\"value\":\"source-cli-task-executor\"})>',\n * };\n *\n * // External local-node task executor with default protocol args:\n * const local: ExecutionRef = {\n * meta: 'task-executor',\n * howToRun: 'local-node',\n * whatToRun: 'b64:<base64url({\"kind\":\"fs-path\",\"value\":\"/path/to/my-executor.js\"})>',\n * };\n *\n * // Azure Function task executor with custom arg mapping:\n * const azureFn: ExecutionRef = {\n * meta: 'task-executor',\n * howToRun: 'http:post',\n * whatToRun: 'b64:<base64url({\"kind\":\"http-url\",\"value\":\"https://myfn.azurewebsites.net/api/task-executor\"})>',\n * argsMassaging: {\n * urlTemplate: \"whatToRun & '?op=' & subcommand\",\n * bodyTemplate: \"{ 'inRef': inRef, 'outRef': outRef, 'token': token }\",\n * },\n * };\n *\n * // Chat handler over HTTP with a different logical args shape:\n * const chatHandler: ExecutionRef = {\n * meta: 'chat-handler',\n * howToRun: 'http:post',\n * whatToRun: 'b64:<base64url({\"kind\":\"http-url\",\"value\":\"https://myfn.azurewebsites.net/api/chat\"})>',\n * argsMassaging: {\n * bodyTemplate: \"{ 'message': message, 'context': context, 'sessionId': sessionId }\",\n * },\n * };\n */\n\n// ============================================================================\n// OutputTransforms\n// ============================================================================\n\nimport { serializeRef } from './storage-interface.js';\n\n/**\n * Optional JSONata-based transforms applied to the raw invoke result.\n * Context for all expressions: `{ output: { result, data, error? } }`.\n * All fields are optional.\n */\nexport interface OutputTransforms {\n /**\n * JSONata expression that produces the transition name string.\n * @example \"output.code = 200 ? 'success' : 'failure'\"\n */\n resultExpr?: string;\n\n /**\n * JSONata expression that produces the data object.\n * @example \"{ 'value': output.body.value }\"\n */\n dataTemplate?: string;\n\n /**\n * JSONata expression that produces the error string, or $undefined() to clear it.\n * @example \"output.code != 200 ? output.error_message : $undefined()\"\n */\n errorExpr?: string;\n}\n\n// ============================================================================\n// ArgsMassaging\n// ============================================================================\n\n/**\n * Optional JSONata-based mapping from logical args → physical invocation shape.\n *\n * Each field is a JSONata expression string evaluated against the caller's\n * logical args object (e.g. `{ inRef, outRef, errRef }` for a task-executor).\n *\n * If argsMassaging is omitted entirely, the execution adapter uses its default\n * mapping for the given howToRun kind.\n */\nexport interface ArgsMassaging {\n /**\n * For local transports ('local-node', 'local-python', 'local-process').\n * Array of JSONata expressions — each evaluates to one argv string.\n * The resolved strings are appended after the base command.\n *\n * @example\n * // Standard task-executor protocol:\n * cmdTemplate: [\n * \"'run-source-fetch'\",\n * \"'--in-ref'\", \"inRef\",\n * \"'--out-ref'\", \"outRef\",\n * \"'--err-ref'\", \"errRef\",\n * ]\n */\n cmdTemplate?: string[];\n\n /**\n * For http transports ('http:post', 'http:get').\n * JSONata expression that produces the final URL string.\n * The input context includes 'whatToRun' (the base URL from the ref)\n * plus all logical args.\n *\n * @example\n * urlTemplate: \"whatToRun & '?op=' & subcommand\"\n */\n urlTemplate?: string;\n\n /**\n * For http transports.\n * JSONata expression that produces the request body object.\n * Evaluated against the logical args object.\n *\n * @example\n * bodyTemplate: \"{ 'inRef': inRef, 'outRef': outRef, 'token': token }\"\n */\n bodyTemplate?: string;\n}\n\n// ============================================================================\n// ExecutionRef\n// ============================================================================\n\n/**\n * Self-contained, serializable descriptor for invoking a target.\n *\n * Stores everything needed to make the physical call — transport kind,\n * artifact address, and optional arg-mapping expressions.\n * Serialize as plain JSON; no special wire encoding required.\n */\nexport interface ExecutionRef {\n /**\n * Optional human-readable label identifying the role of this invocation.\n * Not used for dispatch — purely for logging and diagnostics.\n * @example 'task-executor', 'chat-handler', 'board-live-cards'\n */\n meta?: string;\n\n /**\n * Transport and runtime kind — determines how whatToRun is invoked.\n * @see module JSDoc for the full list of supported values.\n */\n howToRun: 'local-node' | 'local-python' | 'local-process' | 'http:post' | 'http:get' | 'built-in' | 'in-browser';\n\n /**\n * Address of the artifact to run, in KindValueRef wire form (b64:<base64url(json)>).\n * @example 'b64:<base64url({\"kind\":\"fs-path\",\"value\":\"/dist/cli/source-cli-task-executor.js\"})>'\n * @example 'b64:<base64url({\"kind\":\"http-url\",\"value\":\"https://fn.example.com/api/executor\"})>'\n * @example 'b64:<base64url({\"kind\":\"built-in\",\"value\":\"source-cli-task-executor\"})>'\n */\n whatToRun: string;\n\n /**\n * Optional JSONata-based mapping from logical args → physical call shape.\n * When omitted, the adapter applies its default protocol for the howToRun kind.\n */\n argsMassaging?: ArgsMassaging;\n\n /**\n * Optional JSONata-based transforms applied to the raw invoke result\n * before it reaches the step-machine engine.\n *\n * Context for all expressions: `{ output: { result, data, error? } }`\n * where `output` is the raw { result, data, error? } returned by invokeRefSync.\n *\n * All fields are optional — only defined ones override the raw value.\n *\n * @example\n * outputTransforms:\n * resultExpr: \"output.code = 200 ? 'success' : 'failure'\"\n * dataTemplate: \"{ 'value': output.body.value }\"\n * errorExpr: \"output.code != 200 ? output.error_message : $undefined()\"\n */\n outputTransforms?: OutputTransforms;\n\n /**\n * Opaque executor-specific configuration.\n * For local transports, base64-encoded and passed as --extra <base64-json> in the argv.\n * For HTTP transports, available in argsMassaging.bodyTemplate as the `extra` binding.\n * Stored with the ref so it travels as a single unit with the invocation descriptor.\n */\n extra?: Record<string, unknown>;\n}\n\n// ============================================================================\n// ExecutionResult\n// ============================================================================\n\n/**\n * Standardized result envelope returned by any execution.\n *\n * Replaces the implicit \"file-exists = success, absent = failure\" protocol\n * with an explicit status field. The data ref points to the output blob.\n */\nexport interface ExecutionResult {\n /** Outcome of the execution. */\n status: 'success' | 'fail' | 'error';\n\n /**\n * KindValueRef wire form pointing to the output blob.\n * Present only when status === 'success'.\n */\n data?: string;\n\n /**\n * Human-readable error or failure message.\n * Present when status === 'fail' or 'error'.\n */\n error?: string;\n}\n\n// ============================================================================\n// ExecutionRef factory helpers\n// ============================================================================\n\n/**\n * Create an ExecutionRef from a script path string (e.g. from a --task-executor CLI arg).\n * File extension determines howToRun:\n * .js / .mjs → 'local-node'\n * .py → 'local-python'\n * other → 'local-process'\n *\n * @param scriptPath Absolute or relative path to the script / binary.\n * @param extra Optional opaque executor config stored on the ref.\n */\nexport function executionRefFromScriptPath(\n scriptPath: string,\n extra?: Record<string, unknown>,\n): ExecutionRef {\n let howToRun: ExecutionRef['howToRun'];\n if (/\\.m?js$/i.test(scriptPath)) howToRun = 'local-node';\n else if (/\\.py$/i.test(scriptPath)) howToRun = 'local-python';\n else howToRun = 'local-process';\n return {\n meta: 'task-executor',\n howToRun,\n whatToRun: serializeRef({ kind: 'fs-path', value: scriptPath }),\n ...(extra ? { extra } : {}),\n };\n}\n\n// ============================================================================\n// Serialization helpers\n// ============================================================================\n\n/**\n * Serialize an ExecutionRef to a JSON string for storage.\n * Plain JSON.stringify — no special encoding.\n */\nexport function serializeExecutionRef(ref: ExecutionRef): string {\n return JSON.stringify(ref);\n}\n\n/**\n * Parse a JSON string back into an ExecutionRef.\n * Throws if the string is not valid JSON or is missing required fields.\n */\nexport function parseExecutionRef(s: string): ExecutionRef {\n let parsed: unknown;\n try {\n parsed = JSON.parse(s);\n } catch {\n throw new Error(`parseExecutionRef: invalid JSON — ${s}`);\n }\n if (\n typeof parsed !== 'object' ||\n parsed === null ||\n typeof (parsed as Record<string, unknown>).howToRun !== 'string' ||\n typeof (parsed as Record<string, unknown>).whatToRun !== 'string'\n ) {\n throw new Error(`parseExecutionRef: missing required fields howToRun/whatToRun — ${s}`);\n }\n return parsed as ExecutionRef;\n}\n","/**\n * schema-validator — Full JSON Schema validation for LiveCards nodes.\n *\n * Uses AJV to validate against the published live-cards.schema.json.\n * For a lightweight sync check without AJV, use `CardCompute.validate()` instead.\n *\n * @example\n * ```typescript\n * import { validateLiveCardSchema } from 'yaml-flow/card-compute';\n *\n * const result = validateLiveCardSchema(node);\n * if (!result.ok) console.error(result.errors);\n * ```\n */\n\nimport type { ValidationResult } from './index.js';\nimport liveCardsSchema from '../../schema/live-cards.schema.json';\nimport Ajv from 'ajv';\nimport addFormats from 'ajv-formats';\nimport { createRequire } from 'module';\nconst _require = createRequire(import.meta.url);\nconst jsonata: (expr: string) => { evaluate: (data: unknown) => unknown } = _require('./jsonata-sync.cjs');\n\ntype AjvValidateFunction = {\n (data: unknown): boolean;\n errors?: Array<{ instancePath?: string; message?: string }> | null;\n};\n\nlet _compiled: AjvValidateFunction | null = null;\n\nconst KNOWN_NAMESPACES = [\n 'card_data',\n 'requires',\n 'fetched_sources',\n 'computed_values',\n 'source_defs',\n] as const;\n\ntype KnownNamespace = typeof KNOWN_NAMESPACES[number];\n\nconst NAMESPACE_REFERENCE_RE = /\\b(card_data|requires|fetched_sources|computed_values|source_defs)\\b/g;\nconst ROOT_PATH_NAMESPACE_RE = /^\\s*(card_data|requires|fetched_sources|computed_values|source_defs)(\\.|$)/;\n\nfunction referencedNamespaces(expression: string): Set<KnownNamespace> {\n const namespaces = new Set<KnownNamespace>();\n let match: RegExpExecArray | null;\n NAMESPACE_REFERENCE_RE.lastIndex = 0;\n while ((match = NAMESPACE_REFERENCE_RE.exec(expression)) !== null) {\n namespaces.add(match[1] as KnownNamespace);\n }\n return namespaces;\n}\n\nfunction parseRootPathNamespace(pathValue: string): KnownNamespace | null {\n const match = ROOT_PATH_NAMESPACE_RE.exec(pathValue);\n return match ? (match[1] as KnownNamespace) : null;\n}\n\nfunction validateJsonataExprWithNamespaces(\n expr: string,\n path: string,\n allowedNamespaces: Set<KnownNamespace>,\n errors: string[],\n): void {\n try {\n jsonata(expr);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n errors.push(`${path}: invalid JSONata expression (${message})`);\n return;\n }\n\n const usedNamespaces = referencedNamespaces(expr);\n for (const namespace of usedNamespaces) {\n if (!allowedNamespaces.has(namespace)) {\n errors.push(`${path}: disallowed namespace \"${namespace}\" in expression`);\n }\n }\n}\n\nfunction walkViewPathReferences(\n value: unknown,\n path: string,\n errors: string[],\n): void {\n if (Array.isArray(value)) {\n value.forEach((entry, index) => {\n walkViewPathReferences(entry, `${path}/${index}`, errors);\n });\n return;\n }\n\n if (typeof value === 'string') {\n const rootNamespace = parseRootPathNamespace(value);\n if (!rootNamespace) return;\n if (!new Set<KnownNamespace>(['card_data', 'requires', 'computed_values']).has(rootNamespace)) {\n errors.push(`${path}: disallowed namespace \"${rootNamespace}\" in view reference`);\n }\n return;\n }\n\n if (!value || typeof value !== 'object') return;\n\n const record = value as Record<string, unknown>;\n for (const [key, next] of Object.entries(record)) {\n walkViewPathReferences(next, `${path}/${key}`, errors);\n }\n}\n\nfunction getValidator(): AjvValidateFunction {\n if (_compiled) return _compiled;\n const ajv = new Ajv({ allErrors: true });\n addFormats(ajv);\n _compiled = ajv.compile(liveCardsSchema);\n return _compiled;\n}\n\n/**\n * Validate a node against the full LiveCards JSON Schema (draft-07).\n *\n * Requires `ajv` and `ajv-formats` to be installed.\n * Returns the same `ValidationResult` shape as `CardCompute.validate()`.\n */\nexport function validateLiveCardSchema(\n node: unknown,\n): ValidationResult {\n const validate = getValidator();\n const valid = validate(node);\n\n const errors = (validate.errors ?? []).map(e => {\n const path = e.instancePath || '/';\n return `${path}: ${e.message ?? 'unknown error'}`;\n });\n\n // JSON Schema draft-07 cannot enforce per-property uniqueness across array items.\n // Check bindTo and outputFile uniqueness here after the AJV structural pass.\n if (node && typeof node === 'object' && !Array.isArray(node)) {\n const source_defs = (node as Record<string, unknown>).source_defs;\n if (Array.isArray(source_defs)) {\n const bindTos = new Set<string>();\n const outputFiles = new Set<string>();\n source_defs.forEach((src, i) => {\n if (!src || typeof src !== 'object' || Array.isArray(src)) return;\n const s = src as Record<string, unknown>;\n if (typeof s.bindTo === 'string' && s.bindTo) {\n if (bindTos.has(s.bindTo)) {\n errors.push(`/source_defs/${i}/bindTo: bindTo \"${s.bindTo}\" must be unique across all source_defs`);\n }\n bindTos.add(s.bindTo);\n }\n if (typeof s.outputFile === 'string' && s.outputFile) {\n if (outputFiles.has(s.outputFile)) {\n errors.push(`/source_defs/${i}/outputFile: outputFile \"${s.outputFile}\" must be unique across all source_defs`);\n }\n outputFiles.add(s.outputFile);\n }\n });\n }\n }\n\n if (!valid || errors.length > 0) return { ok: false, errors };\n return { ok: true, errors: [] };\n}\n\n/**\n * Validate JSONata expressions in compute[] by compiling with the same parser used at runtime.\n */\nexport function validateLiveCardRuntimeExpressions(\n node: unknown,\n): ValidationResult {\n const errors: string[] = [];\n\n if (!node || typeof node !== 'object' || Array.isArray(node)) {\n return { ok: true, errors: [] };\n }\n\n const asRecord = node as Record<string, unknown>;\n\n const compute = asRecord.compute;\n if (Array.isArray(compute)) {\n compute.forEach((step, i) => {\n if (!step || typeof step !== 'object' || Array.isArray(step)) return;\n const expr = (step as Record<string, unknown>).expr;\n if (typeof expr !== 'string' || expr.trim().length === 0) return;\n validateJsonataExprWithNamespaces(\n expr,\n `/compute/${i}/expr`,\n new Set<KnownNamespace>(['card_data', 'requires', 'fetched_sources', 'computed_values']),\n errors,\n );\n });\n }\n\n // Validate provides[].ref paths use a valid root namespace.\n const VALID_PROVIDES_SRC_NAMESPACES = new Set<KnownNamespace>([\n 'card_data', 'requires', 'fetched_sources', 'computed_values',\n ]);\n const provides = asRecord.provides;\n if (Array.isArray(provides)) {\n provides.forEach((entry, i) => {\n if (!entry || typeof entry !== 'object' || Array.isArray(entry)) return;\n const ref = (entry as Record<string, unknown>).ref;\n if (typeof ref !== 'string' || ref.trim().length === 0) return;\n const rootNamespace = parseRootPathNamespace(ref);\n if (rootNamespace === null) {\n errors.push(`/provides/${i}/ref: path \"${ref}\" must start with a valid namespace (${[...VALID_PROVIDES_SRC_NAMESPACES].join(', ')})`);\n } else if (!VALID_PROVIDES_SRC_NAMESPACES.has(rootNamespace)) {\n errors.push(`/provides/${i}/ref: disallowed namespace \"${rootNamespace}\" in path \"${ref}\" (valid: ${[...VALID_PROVIDES_SRC_NAMESPACES].join(', ')})`);\n }\n });\n }\n\n const view = asRecord.view;\n if (view && typeof view === 'object' && !Array.isArray(view)) {\n walkViewPathReferences(view, '/view', errors);\n }\n\n // Validate source_defs[i].projections values: each must be a JSONata expression rooted at\n // card_data or requires only. fetched_sources/computed_values/source_defs are not\n // valid here because sources run before those namespaces exist.\n const VALID_PROJECTION_NAMESPACES = new Set<KnownNamespace>(['card_data', 'requires']);\n const source_defs = asRecord.source_defs;\n if (Array.isArray(source_defs)) {\n source_defs.forEach((srcDef, i) => {\n if (!srcDef || typeof srcDef !== 'object' || Array.isArray(srcDef)) return;\n const projections = (srcDef as Record<string, unknown>).projections;\n if (!projections || typeof projections !== 'object' || Array.isArray(projections)) return;\n for (const [key, exprVal] of Object.entries(projections as Record<string, unknown>)) {\n if (typeof exprVal !== 'string' || exprVal.trim().length === 0) continue;\n validateJsonataExprWithNamespaces(\n exprVal,\n `/source_defs/${i}/projections/${key}`,\n VALID_PROJECTION_NAMESPACES,\n errors,\n );\n }\n });\n }\n\n return { ok: errors.length === 0, errors };\n}\n\nexport function validateLiveCard(\n node: unknown,\n): ValidationResult {\n return validateLiveCardDefinition(node);\n}\n\n/**\n * Full validation for live card definitions:\n * 1) JSON Schema structure/contract checks\n * 2) Runtime JSONata parser compatibility checks for compute expressions\n */\nexport function validateLiveCardDefinition(\n node: unknown,\n): ValidationResult {\n const schema = validateLiveCardSchema(node);\n if (!schema.ok) return schema;\n\n const runtime = validateLiveCardRuntimeExpressions(node);\n if (!runtime.ok) return { ok: false, errors: runtime.errors };\n\n return { ok: true, errors: [] };\n}\n","/**\n * card-compute — JSONata-powered compute engine for LiveCards nodes.\n *\n * Isomorphic: works in browser, Node.js, and bundlers.\n * No DOM dependency. Compute expressions are JSONata strings.\n *\n * @example\n * ```typescript\n * import { CardCompute } from 'yaml-flow/card-compute';\n *\n * const node = {\n * id: 'sales',\n * card_data: { data: [{ revenue: 100 }, { revenue: 200 }] },\n * compute: [\n * { bindTo: 'total', expr: '$sum(card_data.data.revenue)' },\n * { bindTo: 'avg', expr: '$average(card_data.data.revenue)' },\n * ],\n * };\n * await CardCompute.run(node);\n * // node.computed_values.total === 300\n * // node.computed_values.avg === 150\n * ```\n *\n * Expressions are evaluated against { card_data, requires, fetched_sources, computed_values }.\n * computed_values is ephemeral — never persisted to disk.\n */\n\nimport { createRequire } from 'module';\nconst _require = createRequire(import.meta.url);\nconst jsonata: (expr: string) => { evaluate: (data: unknown) => unknown } = _require('./jsonata-sync.cjs');\nconst jsonataSync = jsonata;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A source definition: cli writes to outputFile; bindTo names the fetched_sources.* key in compute context. Both bindTo and outputFile must be unique across source_defs in a card. */\nexport interface ComputeSource {\n bindTo: string;\n outputFile: string;\n cli?: string;\n // Deprecated alias retained for compatibility with older cards.\n script?: string;\n optionalForCompletionGating?: boolean;\n /** Named data projections: each key maps to a JSONata expression rooted at card_data or requires.\n * The engine evaluates these before spawning the executor and passes results as _projections. */\n projections?: Record<string, string>;\n [key: string]: unknown;\n}\n\n/** Options for CardCompute.run() */\nexport interface RunOptions {\n /** Pre-loaded source results map (keyed by bindTo). Use in browser or when caller loads files. */\n sourcesData?: Record<string, unknown>;\n}\n\n/** A single compute step: bindTo names the computed_values key; expr is a JSONata expression. */\nexport interface ComputeStep {\n bindTo: string;\n expr: string;\n}\n\n/** Minimal node shape expected by CardCompute. */\nexport interface ComputeNode {\n id?: string;\n card_data?: Record<string, unknown>;\n requires?: Record<string, unknown>;\n source_defs?: ComputeSource[];\n compute?: ComputeStep[];\n computed_values?: Record<string, unknown>;\n /** Ephemeral: populated by run() from sourcesData option. Never persisted. */\n _sourcesData?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\n// ---------------------------------------------------------------------------\n// Deep path utilities\n// ---------------------------------------------------------------------------\n\nfunction deepGet(obj: unknown, path: string): unknown {\n if (!path || !obj) return undefined;\n const parts = path.split('.');\n let cur: unknown = obj;\n for (let i = 0; i < parts.length; i++) {\n if (cur == null) return undefined;\n cur = (cur as Record<string, unknown>)[parts[i]];\n }\n return cur;\n}\n\nfunction deepSet(obj: Record<string, unknown>, path: string, value: unknown): void {\n const parts = path.split('.');\n let cur: Record<string, unknown> = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n if (cur[parts[i]] == null || typeof cur[parts[i]] !== 'object') cur[parts[i]] = {};\n cur = cur[parts[i]] as Record<string, unknown>;\n }\n cur[parts[parts.length - 1]] = value;\n}\n\n// ---------------------------------------------------------------------------\n// Engine — JSONata-based async evaluation\n// ---------------------------------------------------------------------------\n\n/**\n * Run all compute steps on a node.\n * Each step's expr is evaluated against { card_data, requires, fetched_sources, computed_values }.\n * Results are written to node.computed_values[bindTo].\n * computed_values and _sourcesData are reset on each call — ephemeral, never persisted.\n *\n * @param options.sourcesData Pre-loaded map of { [bindTo]: data } for fetched_sources namespace.\n * In Node/CLI: loaded from outputFiles by the caller (card-handler).\n * In browser: passed in by the caller (e.g. from fetch results).\n */\nasync function run(node: ComputeNode, options?: RunOptions): Promise<ComputeNode> {\n if (!node?.compute?.length) return node;\n if (!node.card_data) node.card_data = {};\n node.computed_values = {};\n node._sourcesData = options?.sourcesData ?? {};\n\n // Context passed to JSONata. Structural keys take precedence over any user data.\n const _requires = node.requires ?? {};\n const ctx: Record<string, unknown> = {\n card_data: node.card_data,\n requires: _requires,\n expects_data: _requires, // alias: same reference as requires\n fetched_sources: node._sourcesData,\n data: node.computed_values, // alias: same reference as computed_values\n computed_values: node.computed_values,\n };\n\n for (const step of node.compute) {\n try {\n const val = await jsonata(step.expr).evaluate(ctx);\n deepSet(node.computed_values, step.bindTo, val);\n ctx.computed_values = node.computed_values; // subsequent steps see earlier results\n // ctx.data is the same reference as node.computed_values — already in sync\n } catch (err) {\n console.error(`CardCompute.run error on \"${node.id ?? '?'}.${step.bindTo}\":`, err);\n }\n }\n\n return node;\n}\n\n/**\n * Synchronous version of run() — uses a vendored sync JSONata build\n * (async/await stripped from jsonata.js since all built-in functions\n * are CPU-only).\n *\n * Same semantics as `run()`: evaluates all compute steps, populates\n * `node.computed_values`, returns the mutated node.\n *\n * @returns `{ ok: true, node }` when all steps evaluated successfully.\n * `{ ok: false, node }` is currently never returned but reserved\n * for future use if an expression requires true async evaluation.\n */\nfunction runSync(\n node: ComputeNode,\n options?: RunOptions,\n): { ok: boolean; node: ComputeNode; errors?: Array<{ bindTo: string; error: string }> } {\n if (!node?.compute?.length) return { ok: true, node };\n if (!node.card_data) node.card_data = {};\n node.computed_values = {};\n node._sourcesData = options?.sourcesData ?? {};\n\n const _requires2 = node.requires ?? {};\n const ctx: Record<string, unknown> = {\n card_data: node.card_data,\n requires: _requires2,\n expects_data: _requires2, // alias: same reference as requires\n fetched_sources: node._sourcesData,\n data: node.computed_values, // alias: same reference as computed_values\n computed_values: node.computed_values,\n };\n\n const errors: Array<{ bindTo: string; error: string }> = [];\n for (const step of node.compute) {\n try {\n const val = jsonataSync(step.expr).evaluate(ctx);\n deepSet(node.computed_values, step.bindTo, val);\n ctx.computed_values = node.computed_values;\n // ctx.data is the same reference as node.computed_values — already in sync\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n errors.push({ bindTo: step.bindTo, error: msg });\n console.error(`CardCompute.runSync error on \"${node.id ?? '?'}.${step.bindTo}\":`, err);\n }\n }\n\n return errors.length > 0 ? { ok: true, node, errors } : { ok: true, node };\n}\n\n/**\n * Evaluate a single JSONata expression against a node's context.\n * Context is { card_data, requires, fetched_sources, computed_values }.\n */\nasync function evalExpr(\n expr: string,\n node: ComputeNode,\n vars?: Record<string, unknown>,\n): Promise<unknown> {\n const ctx: Record<string, unknown> = {\n ...(vars ?? {}),\n card_data: node.card_data ?? {},\n requires: node.requires ?? {},\n fetched_sources: node._sourcesData ?? {},\n computed_values: node.computed_values ?? {},\n };\n return jsonata(expr).evaluate(ctx);\n}\n\n// ---------------------------------------------------------------------------\n// resolve — synchronous deep-get from node\n// ---------------------------------------------------------------------------\n\nfunction resolve(node: ComputeNode, path: string): unknown {\n if (path.startsWith('fetched_sources.')) {\n return deepGet(node._sourcesData ?? {}, path.slice('fetched_sources.'.length));\n }\n\n return deepGet(node, path);\n}\n\n// ---------------------------------------------------------------------------\n// Validation\n// ---------------------------------------------------------------------------\n\n/** Result of validateNode — ok: true means valid, ok: false has errors[]. */\nexport interface ValidationResult {\n ok: boolean;\n errors: string[];\n}\n\nconst VALID_ELEMENT_KINDS = new Set([\n 'metric', 'table', 'editable-table', 'chart', 'form', 'filter', 'list',\n 'notes', 'todo', 'alert', 'narrative', 'badge', 'text',\n 'markdown', 'ref', 'custom', 'actions',\n]);\n\nconst ALLOWED_KEYS = new Set(['id', 'meta', 'requires', 'provides', 'view', 'card_data', 'compute', 'source_defs']);\n\nfunction validateNode(node: unknown): ValidationResult {\n const errors: string[] = [];\n\n if (!node || typeof node !== 'object' || Array.isArray(node)) {\n return { ok: false, errors: ['Node must be a non-null object'] };\n }\n\n const n = node as Record<string, unknown>;\n\n if (typeof n.id !== 'string' || !n.id) errors.push('id: required, must be a non-empty string');\n\n for (const key of Object.keys(n)) {\n if (!ALLOWED_KEYS.has(key)) errors.push(`Unknown top-level key: \"${key}\"`);\n }\n\n if (n.card_data == null || typeof n.card_data !== 'object' || Array.isArray(n.card_data)) {\n errors.push('card_data: required, must be an object');\n }\n\n if (n.meta != null) {\n if (typeof n.meta !== 'object' || Array.isArray(n.meta)) {\n errors.push('meta: must be an object');\n } else {\n const meta = n.meta as Record<string, unknown>;\n if (meta.title != null && typeof meta.title !== 'string') errors.push('meta.title: must be a string');\n if (meta.tags != null && !Array.isArray(meta.tags)) errors.push('meta.tags: must be an array');\n }\n }\n\n if (n.requires != null && !Array.isArray(n.requires)) errors.push('requires: must be an array of strings');\n\n if (n.provides != null) {\n if (!Array.isArray(n.provides)) {\n errors.push('provides: must be an array of { bindTo, ref } bindings');\n } else {\n (n.provides as unknown[]).forEach((p, i) => {\n if (!p || typeof p !== 'object' || Array.isArray(p)) {\n errors.push(`provides[${i}]: must be an object with bindTo and ref`);\n } else {\n const b = p as Record<string, unknown>;\n if (typeof b.bindTo !== 'string' || !b.bindTo) errors.push(`provides[${i}]: missing required \"bindTo\" string`);\n if (typeof b.ref !== 'string' || !b.ref) errors.push(`provides[${i}]: missing required \"ref\" string`);\n }\n });\n }\n }\n\n // compute — ordered array of { bindTo, expr } steps\n if (n.compute != null) {\n if (!Array.isArray(n.compute)) {\n errors.push('compute: must be an array of compute steps');\n } else {\n (n.compute as unknown[]).forEach((step, i) => {\n if (!step || typeof step !== 'object' || Array.isArray(step)) {\n errors.push(`compute[${i}]: must be a compute step object`);\n } else {\n const s = step as Record<string, unknown>;\n if (typeof s.bindTo !== 'string' || !s.bindTo) errors.push(`compute[${i}]: missing required \"bindTo\" property`);\n if (typeof s.expr !== 'string' || !s.expr) errors.push(`compute[${i}]: missing required \"expr\" string (JSONata expression)`);\n }\n });\n }\n }\n\n if (n.source_defs != null) {\n if (!Array.isArray(n.source_defs)) {\n errors.push('source_defs: must be an array');\n } else {\n const bindTos = new Set<string>();\n const outputFiles = new Set<string>();\n (n.source_defs as unknown[]).forEach((src, i) => {\n if (!src || typeof src !== 'object' || Array.isArray(src)) {\n errors.push(`source_defs[${i}]: must be an object`);\n } else {\n const s = src as Record<string, unknown>;\n if (typeof s.bindTo !== 'string' || !s.bindTo) {\n errors.push(`source_defs[${i}]: missing required \"bindTo\" property`);\n } else {\n if (bindTos.has(s.bindTo)) {\n errors.push(`source_defs[${i}]: bindTo \"${s.bindTo}\" is not unique across source_defs`);\n }\n bindTos.add(s.bindTo);\n }\n if (typeof s.outputFile !== 'string' || !s.outputFile) {\n errors.push(`source_defs[${i}]: missing required \"outputFile\" property`);\n } else {\n if (outputFiles.has(s.outputFile)) {\n errors.push(`source_defs[${i}]: outputFile \"${s.outputFile}\" is not unique across source_defs`);\n }\n outputFiles.add(s.outputFile);\n }\n if (s.optionalForCompletionGating != null && typeof s.optionalForCompletionGating !== 'boolean') {\n errors.push(`source_defs[${i}]: optionalForCompletionGating must be a boolean`);\n }\n }\n });\n }\n }\n\n if (n.view != null) {\n if (typeof n.view !== 'object' || Array.isArray(n.view)) {\n errors.push('view: must be an object');\n } else {\n const view = n.view as Record<string, unknown>;\n if (!Array.isArray(view.elements) || view.elements.length === 0) {\n errors.push('view.elements: required, must be a non-empty array');\n } else {\n (view.elements as Record<string, unknown>[]).forEach((elem, i) => {\n if (!elem || typeof elem !== 'object') { errors.push(`view.elements[${i}]: must be an object`); return; }\n if (!elem.kind || typeof elem.kind !== 'string') {\n errors.push(`view.elements[${i}].kind: required, must be a string`);\n } else if (!VALID_ELEMENT_KINDS.has(elem.kind as string)) {\n errors.push(`view.elements[${i}].kind: unknown kind \"${elem.kind}\". Valid: ${[...VALID_ELEMENT_KINDS].join(', ')}`);\n }\n if (elem.data != null && (typeof elem.data !== 'object' || Array.isArray(elem.data))) {\n errors.push(`view.elements[${i}].data: must be an object`);\n }\n });\n }\n if (view.layout != null && (typeof view.layout !== 'object' || Array.isArray(view.layout))) errors.push('view.layout: must be an object');\n if (view.features != null && (typeof view.features !== 'object' || Array.isArray(view.features))) errors.push('view.features: must be an object');\n }\n }\n\n return { ok: errors.length === 0, errors };\n}\n\n/**\n * Enrich source_defs with execution context for template interpolation and prompt rendering.\n * Pure function: no side effects, returns new enriched source_defs array.\n * \n * @param source_defs - Array of source definitions\n * @param context - Execution context containing requires, sourcesData, computed_values\n * @returns Promise resolving to a new array of source_defs with _projections attached.\n * Each _projections entry is the evaluated result of the corresponding projections expression.\n */\nasync function enrichSources(\n source_defs: any[] | undefined,\n context: {\n card_data?: Record<string, any>;\n requires?: Record<string, any>;\n sourcesData?: Record<string, any>; // unused post-projections, kept for call-site compat\n computed_values?: Record<string, any>; // unused post-projections, kept for call-site compat\n }\n): Promise<any[]> {\n if (!source_defs || source_defs.length === 0) return [];\n\n const evalCtx = {\n card_data: context.card_data ?? {},\n requires: context.requires ?? {},\n };\n\n return Promise.all(\n source_defs.map(async (src: any) => {\n const _projections: Record<string, unknown> = {};\n if (src.projections && typeof src.projections === 'object' && !Array.isArray(src.projections)) {\n for (const [key, expr] of Object.entries(src.projections as Record<string, string>)) {\n if (typeof expr === 'string' && expr.trim().length > 0) {\n try {\n _projections[key] = await jsonata(expr).evaluate(evalCtx);\n } catch {\n _projections[key] = undefined;\n }\n }\n }\n }\n return { ...src, _projections };\n })\n );\n}\n\nfunction enrichSourcesSync(\n source_defs: any[] | undefined,\n context: {\n card_data?: Record<string, any>;\n requires?: Record<string, any>;\n }\n): any[] {\n if (!source_defs || source_defs.length === 0) return [];\n\n const evalCtx = {\n card_data: context.card_data ?? {},\n requires: context.requires ?? {},\n };\n\n return source_defs.map((src: any) => {\n const _projections: Record<string, unknown> = {};\n if (src.projections && typeof src.projections === 'object' && !Array.isArray(src.projections)) {\n for (const [key, expr] of Object.entries(src.projections as Record<string, string>)) {\n if (typeof expr === 'string' && expr.trim().length > 0) {\n try {\n _projections[key] = jsonataSync(expr).evaluate(evalCtx);\n } catch {\n _projections[key] = undefined;\n }\n }\n }\n }\n return { ...src, _projections };\n });\n}\n\nexport const CardCompute = {\n run,\n runSync,\n eval: evalExpr,\n resolve,\n validate: validateNode,\n enrichSources,\n enrichSourcesSync,\n};\n\nexport {\n validateLiveCard,\n validateLiveCardSchema,\n validateLiveCardRuntimeExpressions,\n validateLiveCardDefinition,\n} from './schema-validator.js';\n\nexport default CardCompute;\n\n","/**\n * board-live-cards-lib — Pure logic library for the board-live-cards CLI.\n *\n * Merged from:\n * board-live-cards-all-stores.ts\n * board-live-cards-lib-types.ts\n * board-live-cards-lib-board-status.ts\n * board-live-cards-lib-card-handler.ts\n * board-live-cards-cli-board-commands.ts\n * board-live-cards-cli-card-commands.ts\n * board-live-cards-cli-callbacks.ts\n *\n * Zero platform imports. All storage is injected via adapter interfaces.\n * Safe for Node, browser, and neutral (V8/PyMiniRacer) bundles.\n */\n\nimport type { KVStorage, BlobStorage, KindValueRef } from './storage-interface.js';\nimport { serializeRef } from './storage-interface.js';\nimport { parseExecutionRef, serializeExecutionRef } from './execution-interface.js';\nimport type { ExecutionRef } from './execution-interface.js';\nimport type { GraphEvent, TaskConfig, GraphConfig } from '../../event-graph/types.js';\nimport type { LiveGraph, LiveGraphSnapshot } from '../../continuous-event-graph/types.js';\nimport { schedule } from '../../continuous-event-graph/schedule.js';\nimport type { TaskHandlerFn } from '../../continuous-event-graph/reactive.js';\nimport { CardCompute } from '../../card-compute/index.js';\nimport type { ComputeNode, ComputeStep, ComputeSource } from '../../card-compute/index.js';\nexport type { DispatchResult, InvocationAdapter } from './process-interface.js';\n\n// ============================================================================\n// ---- from board-live-cards-all-stores.ts ----\n// ============================================================================\n\n// ============================================================================\n// Card store — types\n// ============================================================================\n\nexport interface LiveCard {\n id: string;\n [key: string]: unknown;\n}\n\nexport interface CardIndexEntry {\n /** Storage-specific address (file path, Cosmos doc id, localStorage key). */\n key: string;\n /** Checksum of card content — computed by the adapter at write time. */\n checksum: string;\n updatedAt: string;\n}\n\nexport type CardIndex = Record<string, CardIndexEntry>;\nexport type CardChecksumIndex = Record<string, string>;\n\n/**\n * Per-card entry stored in the card-upsert KV cache (one key per cardId).\n * Lives alongside the board journal — NOT inside the board snapshot.\n * Purpose: dedup gate to avoid redundant task-upsert journal entries.\n *\n * Write order: journal.append() THEN kv.write() — so a crash between the two\n * leaves the journal entry intact (board is correct) and the KV stale (next\n * upsert will see \"changed\" and re-append; addNode is idempotent in the board).\n */\nexport interface CardUpsertIndexEntry {\n /** Logical reference to the card blob — absolute path for fs, blob name for cloud. */\n blobRef: string;\n /** SHA-256 of stable-JSON-serialised taskConfig. Dedup key. */\n taskConfigHash: string;\n updatedAt: string;\n}\n\n// ============================================================================\n// CardStorageAdapter — injected by the caller\n// ============================================================================\n\nexport interface CardStorageAdapter {\n readIndex(): CardIndex | null;\n writeIndex(index: CardIndex): void;\n readCard(key: string): LiveCard | null;\n /** Write card content; returns checksum of what was written. */\n writeCard(key: string, card: LiveCard): string;\n cardExists(key: string): boolean;\n defaultCardKey(cardId: string): string;\n}\n\n// ============================================================================\n// CardStore — board one-cycle (read-only)\n// ============================================================================\n\nexport interface CardStore {\n readCard(id: string): LiveCard | null;\n readCardKey(id: string): string | null;\n readAllCards(): LiveCard[];\n readChecksumIndex(): CardChecksumIndex;\n changedSince(snapshotChecksumIndex: CardChecksumIndex): string[];\n}\n\n// ============================================================================\n// CardAdminStore — CLI write interface\n// ============================================================================\n\nexport interface CardUpsertValidation {\n ok: boolean;\n error?: string;\n}\n\nexport interface CardAdminStore extends CardStore {\n validateUpsert(id: string, cardKey: string): CardUpsertValidation;\n writeCard(id: string, card: LiveCard, cardKey?: string): void;\n patchCard(id: string, jsonPath: string, value: unknown): void;\n removeCard(id: string): void;\n readIndex(): CardIndex;\n}\n\n// ============================================================================\n// createCardStore — pure logic factory\n// ============================================================================\n\nexport function createCardStore(adapter: CardStorageAdapter, onWarn?: (msg: string) => void): CardAdminStore {\n function loadIndex(): CardIndex {\n return adapter.readIndex() ?? {};\n }\n\n function applyJsonPath(obj: Record<string, unknown>, jsonPath: string, value: unknown): Record<string, unknown> {\n const segments = String(jsonPath || '').split('.').filter(Boolean);\n if (segments.length === 0) {\n return (value && typeof value === 'object' && !Array.isArray(value))\n ? value as Record<string, unknown>\n : { value };\n }\n\n const out: Record<string, unknown> = { ...obj };\n let target: Record<string, unknown> = out;\n for (let i = 0; i < segments.length - 1; i++) {\n const key = segments[i];\n const cur = target[key];\n const next = (cur && typeof cur === 'object' && !Array.isArray(cur))\n ? { ...(cur as Record<string, unknown>) }\n : {};\n target[key] = next;\n target = next;\n }\n target[segments[segments.length - 1]] = value;\n return out;\n }\n\n return {\n readCard(id: string): LiveCard | null {\n const entry = loadIndex()[id];\n if (!entry || !adapter.cardExists(entry.key)) return null;\n return adapter.readCard(entry.key);\n },\n\n readCardKey(id: string): string | null {\n return loadIndex()[id]?.key ?? null;\n },\n\n readAllCards(): LiveCard[] {\n const cards: LiveCard[] = [];\n for (const [id, entry] of Object.entries(loadIndex())) {\n if (!adapter.cardExists(entry.key)) continue;\n const card = adapter.readCard(entry.key);\n if (card) cards.push(card);\n else onWarn?.(`[card-store] could not read card \"${id}\" at key \"${entry.key}\"`);\n }\n return cards;\n },\n\n readChecksumIndex(): CardChecksumIndex {\n const result: CardChecksumIndex = {};\n for (const [id, entry] of Object.entries(loadIndex())) result[id] = entry.checksum;\n return result;\n },\n\n changedSince(snapshotChecksumIndex: CardChecksumIndex): string[] {\n const localIndex = loadIndex();\n const changed: string[] = [];\n for (const [id, entry] of Object.entries(localIndex)) {\n if (snapshotChecksumIndex[id] !== entry.checksum) changed.push(id);\n }\n for (const id of Object.keys(snapshotChecksumIndex)) {\n if (!localIndex[id]) changed.push(id);\n }\n return changed;\n },\n\n validateUpsert(id: string, cardKey: string): CardUpsertValidation {\n const index = loadIndex();\n const existingById = index[id];\n const existingByKey = Object.entries(index).find(([, e]) => e.key === cardKey);\n if (existingById && existingById.key !== cardKey)\n return { ok: false, error: `Card id \"${id}\" is already mapped to key \"${existingById.key}\", cannot remap to \"${cardKey}\"` };\n if (existingByKey && existingByKey[0] !== id)\n return { ok: false, error: `Key \"${cardKey}\" is already mapped to card id \"${existingByKey[0]}\", cannot remap to \"${id}\"` };\n return { ok: true };\n },\n\n writeCard(id: string, card: LiveCard, cardKey?: string): void {\n const index = loadIndex();\n const resolvedKey = cardKey ?? index[id]?.key ?? adapter.defaultCardKey(id);\n const checksum = adapter.writeCard(resolvedKey, card);\n index[id] = { key: resolvedKey, checksum, updatedAt: new Date().toISOString() };\n adapter.writeIndex(index);\n },\n\n patchCard(id: string, jsonPath: string, value: unknown): void {\n const index = loadIndex();\n const entry = index[id];\n if (!entry || !adapter.cardExists(entry.key)) {\n throw new Error(`card \"${id}\" not found`);\n }\n const current = adapter.readCard(entry.key);\n if (!current || typeof current !== 'object' || Array.isArray(current)) {\n throw new Error(`card \"${id}\" is not patchable`);\n }\n const next = applyJsonPath(current as Record<string, unknown>, jsonPath, value) as LiveCard;\n const checksum = adapter.writeCard(entry.key, next);\n index[id] = { key: entry.key, checksum, updatedAt: new Date().toISOString() };\n adapter.writeIndex(index);\n },\n\n removeCard(id: string): void {\n const index = loadIndex();\n if (!index[id]) return;\n delete index[id];\n adapter.writeIndex(index);\n },\n\n readIndex(): CardIndex {\n return loadIndex();\n },\n };\n}\n\n// ============================================================================\n// FetchedSourcesStore\n// ============================================================================\n\nexport interface FetchedSourcesStore {\n /** Read committed source content. Returns parsed JSON or raw string; null if not yet committed. */\n readSourceData(cardId: string, outputFile: string): unknown;\n /** Stage incoming source data under deliveryToken. resolveRef converts the ref to content bytes. */\n ingestSourceDataStaged(cardId: string, outputFile: string, ref: KindValueRef, deliveryToken: string): void;\n /** Move staged data to live position. Returns false if staged entry is absent (stale delivery). */\n commitSourceData(cardId: string, outputFile: string, deliveryToken: string): boolean;\n /** True if live (committed) source data exists for this outputFile. */\n hasSource(cardId: string, outputFile: string): boolean;\n}\n\nexport function createFetchedSourcesStore(\n blob: BlobStorage,\n resolveRef: (ref: KindValueRef) => string,\n): FetchedSourcesStore {\n return {\n readSourceData(cardId, outputFile): unknown {\n const raw = blob.read(`${cardId}/${outputFile}`);\n if (raw == null) return null;\n const trimmed = raw.trim();\n if (!trimmed) return null;\n try { return JSON.parse(trimmed); } catch { return trimmed; }\n },\n ingestSourceDataStaged(cardId, outputFile, ref, deliveryToken): void {\n const content = resolveRef(ref);\n blob.write(`${cardId}/.staged/${deliveryToken}/${outputFile}`, content);\n },\n commitSourceData(cardId, outputFile, deliveryToken): boolean {\n const stagedKey = `${cardId}/.staged/${deliveryToken}/${outputFile}`;\n const content = blob.read(stagedKey);\n if (content == null) return false;\n blob.write(`${cardId}/${outputFile}`, content);\n blob.remove(stagedKey);\n return true;\n },\n hasSource(cardId, outputFile): boolean {\n return blob.exists(`${cardId}/${outputFile}`);\n },\n };\n}\n\n// ============================================================================\n// Journal store — types\n// ============================================================================\n\nexport interface JournalEntry {\n id: string;\n event: GraphEvent;\n}\n\nexport interface JournalStorageAdapter {\n readAllEntries(): JournalEntry[];\n appendEntry(entry: JournalEntry): void;\n generateId(): string;\n}\n\nexport interface JournalStore {\n readEntriesAfterCursor(cursor: string): { events: GraphEvent[]; newCursor: string };\n pendingCount(cursor: string): number;\n}\n\nexport interface JournalAdminStore extends JournalStore {\n appendEvent(event: GraphEvent): void;\n}\n\nexport function createJournalStore(adapter: JournalStorageAdapter): JournalAdminStore {\n function entriesAfterCursor(cursor: string): JournalEntry[] {\n const all = adapter.readAllEntries();\n if (!cursor) return all;\n const idx = all.findIndex(e => e.id === cursor);\n return idx === -1 ? all : all.slice(idx + 1);\n }\n\n return {\n readEntriesAfterCursor(cursor: string): { events: GraphEvent[]; newCursor: string } {\n const entries = entriesAfterCursor(cursor);\n if (entries.length === 0) return { events: [], newCursor: cursor };\n return { events: entries.map(e => e.event), newCursor: entries[entries.length - 1].id };\n },\n\n pendingCount(cursor: string): number {\n return entriesAfterCursor(cursor).length;\n },\n\n appendEvent(event: GraphEvent): void {\n adapter.appendEntry({ id: adapter.generateId(), event });\n },\n };\n}\n\n// ============================================================================\n// ExecutionRequest store\n// ============================================================================\n\nexport interface ExecutionRequestEntry {\n taskKind: string;\n payload: unknown;\n}\n\nexport interface ExecutionRequestStore {\n appendEntries(journalId: string, entries: ExecutionRequestEntry[]): void;\n dispatchEntriesForJournalId(journalId: string, processorFn: (entry: ExecutionRequestEntry) => void): void;\n}\n\nexport function createExecutionRequestStore(\n kv: KVStorage,\n onDispatchFailed: (entry: ExecutionRequestEntry, error: string) => void,\n): ExecutionRequestStore {\n return {\n appendEntries(journalId: string, entries: ExecutionRequestEntry[]): void {\n if (!journalId || entries.length === 0) return;\n const existing = (kv.read(journalId) as ExecutionRequestEntry[] | null) ?? [];\n kv.write(journalId, [...existing, ...entries]);\n },\n\n dispatchEntriesForJournalId(journalId: string, processorFn: (entry: ExecutionRequestEntry) => void): void {\n if (!journalId) return;\n const entries = kv.read(journalId) as ExecutionRequestEntry[] | null;\n if (!entries || entries.length === 0) return;\n for (const entry of entries) {\n try { processorFn(entry); } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n try { onDispatchFailed(entry, msg); } catch { /* guard against failure in error handler */ }\n }\n }\n kv.delete(journalId);\n },\n };\n}\n\n// ============================================================================\n// StateSnapshot store\n// ============================================================================\n\nexport const SNAPSHOT_SCHEMA_VERSION_V1 = 'v1';\n\nexport const BOARD_GRAPH_KEY = 'board/graph';\nexport const BOARD_LAST_JOURNAL_PROCESSED_ID_KEY = 'board/lastJournalProcessedId';\n\nexport function cardRuntimeKey(cardId: string): string {\n return `cards/${cardId}/runtime`;\n}\n\nexport function cardFetchedSourcesManifestKey(cardId: string): string {\n return `cards/${cardId}/fetched-sources-manifest`;\n}\n\nexport interface CardRuntimeSnapshot {\n _sources: Record<string, { lastRequestedAt?: string; lastFetchedAt?: string; queueRequestedAt?: string }>;\n _lastExecutionCount?: number;\n}\n\nexport interface CardRuntimeStore {\n readRuntime(cardId: string): CardRuntimeSnapshot;\n writeRuntime(cardId: string, state: CardRuntimeSnapshot): void;\n}\n\nexport function createCardRuntimeStore(kv: KVStorage): CardRuntimeStore {\n return {\n readRuntime(cardId) {\n return (kv.read(cardRuntimeKey(cardId)) as CardRuntimeSnapshot | null) ?? { _sources: {} };\n },\n writeRuntime(cardId, state) {\n kv.write(cardRuntimeKey(cardId), state);\n },\n };\n}\n\nexport interface FetchedSourceManifestEntry {\n outputFile: string;\n blobRef: string;\n fetchedAt: string;\n sourceChecksum?: string;\n contentType?: string;\n sizeBytes?: number;\n}\n\nexport interface StateSnapshotReadView {\n version: string | null;\n values: Record<string, unknown>;\n}\n\nexport interface StateSnapshotCommitEnvelope {\n schemaVersion: typeof SNAPSHOT_SCHEMA_VERSION_V1;\n expectedVersion: string | null;\n commitId: string;\n committedAt: string;\n deleteKeys: string[];\n shallowMerge: Record<string, unknown>;\n}\n\nexport interface StateSnapshotCommitSuccess {\n ok: true;\n newVersion: string;\n}\n\nexport interface StateSnapshotCommitVersionMismatch {\n ok: false;\n reason: 'version-mismatch';\n currentVersion: string | null;\n}\n\nexport type StateSnapshotCommitResult =\n | StateSnapshotCommitSuccess\n | StateSnapshotCommitVersionMismatch;\n\nexport interface StateSnapshotStorageAdapter {\n readValues(scopeId: string): StateSnapshotReadView;\n writeValues(scopeId: string, nextValues: Record<string, unknown>, deletedKeys: string[]): string;\n}\n\nexport interface StateSnapshotStore {\n readSnapshot(scopeId: string): StateSnapshotReadView;\n commitSnapshot(scopeId: string, envelope: StateSnapshotCommitEnvelope): StateSnapshotCommitResult;\n}\n\nexport function applyStateSnapshotCommitEnvelope(\n current: Record<string, unknown>,\n envelope: Pick<StateSnapshotCommitEnvelope, 'deleteKeys' | 'shallowMerge'>,\n): Record<string, unknown> {\n const next: Record<string, unknown> = { ...current };\n for (const key of envelope.deleteKeys) {\n delete next[key];\n }\n return { ...next, ...envelope.shallowMerge };\n}\n\nexport function createStateSnapshotStore(adapter: StateSnapshotStorageAdapter): StateSnapshotStore {\n return {\n readSnapshot(scopeId: string): StateSnapshotReadView {\n return adapter.readValues(scopeId);\n },\n\n commitSnapshot(scopeId: string, envelope: StateSnapshotCommitEnvelope): StateSnapshotCommitResult {\n if (envelope.schemaVersion !== SNAPSHOT_SCHEMA_VERSION_V1) {\n throw new Error(`Unsupported snapshot schema version: ${envelope.schemaVersion}`);\n }\n const current = adapter.readValues(scopeId);\n if (current.version !== envelope.expectedVersion) {\n return { ok: false, reason: 'version-mismatch', currentVersion: current.version };\n }\n const nextValues = applyStateSnapshotCommitEnvelope(current.values, envelope);\n const newVersion = adapter.writeValues(scopeId, nextValues, envelope.deleteKeys);\n return { ok: true, newVersion };\n },\n };\n}\n\n// ============================================================================\n// BoardConfigStore\n// ============================================================================\n\nexport interface BoardConfigStore {\n readTaskExecutorRef(): ExecutionRef | undefined;\n writeTaskExecutorRef(ref: ExecutionRef): void;\n readChatHandlerRef(): ExecutionRef | undefined;\n writeChatHandlerRef(ref: ExecutionRef): void;\n readCardStoreRef(): string | null;\n writeCardStoreRef(ref: string): void;\n readOutputsStoreRef(): string | null;\n writeOutputsStoreRef(ref: string): void;\n /** @deprecated use readChatHandlerRef */\n readChatHandler(): string | undefined;\n /** @deprecated use writeChatHandlerRef */\n writeChatHandler(value: string): void;\n}\n\nexport function createBoardConfigStore(kv: KVStorage): BoardConfigStore {\n function readKey(key: string): string | null {\n const v = kv.read(key);\n if (v == null) return null;\n return typeof v === 'string' ? v : JSON.stringify(v);\n }\n\n return {\n readTaskExecutorRef(): ExecutionRef | undefined {\n const raw = readKey('task-executor');\n if (!raw?.trim()) return undefined;\n return parseExecutionRef(raw.trim());\n },\n\n writeTaskExecutorRef(ref: ExecutionRef): void {\n kv.write('task-executor', serializeExecutionRef(ref));\n },\n\n readChatHandlerRef(): ExecutionRef | undefined {\n const raw = readKey('chat-handler');\n if (!raw?.trim()) return undefined;\n return parseExecutionRef(raw.trim());\n },\n\n writeChatHandlerRef(ref: ExecutionRef): void {\n kv.write('chat-handler', serializeExecutionRef(ref));\n },\n\n readCardStoreRef(): string | null {\n return readKey('card-store-ref');\n },\n\n writeCardStoreRef(ref: string): void {\n kv.write('card-store-ref', ref);\n },\n\n readOutputsStoreRef(): string | null {\n return readKey('outputs-store-ref');\n },\n\n writeOutputsStoreRef(ref: string): void {\n kv.write('outputs-store-ref', ref);\n },\n\n readChatHandler(): string | undefined {\n return readKey('chat-handler')?.trim() || undefined;\n },\n\n writeChatHandler(value: string): void {\n kv.write('chat-handler', value);\n },\n };\n}\n\n// ============================================================================\n// PublishedOutputsStore\n// ============================================================================\n\nexport type OutputStoreEvent =\n | { kind: 'computed_values'; cardId: string; values: Record<string, unknown> }\n | { kind: 'data_object'; key: string; payload: unknown }\n | { kind: 'status'; status: unknown };\n\nexport interface PublishedOutputsStore {\n writeComputedValues(cardId: string, values: Record<string, unknown>): void;\n readComputedValues(cardId: string): unknown | null;\n readAllComputedValues(): Record<string, unknown>;\n writeDataObjects(data: Record<string, unknown>): void;\n readDataObject(key: string): unknown | null;\n readAllDataObjects(): Record<string, unknown>;\n writeStatusSnapshot(status: unknown): void;\n readStatusSnapshot(): unknown | null;\n}\n\nexport function createPublishedOutputsStore(kv: KVStorage): PublishedOutputsStore {\n return {\n writeComputedValues(cardId, values) {\n kv.write(`cards/${cardId}/computed_values`, values);\n },\n readComputedValues(cardId) { return kv.read(`cards/${cardId}/computed_values`); },\n readAllComputedValues() {\n const out: Record<string, unknown> = {};\n for (const key of kv.listKeys('cards/')) {\n const m = key.match(/^cards\\/([^/]+)\\/computed_values$/);\n if (m) out[m[1]] = kv.read(key);\n }\n return out;\n },\n writeDataObjects(data) {\n for (const [token, payload] of Object.entries(data)) {\n if (!token) continue;\n kv.write(`data-objects/${token}`, payload);\n }\n },\n readDataObject(key) { return kv.read(`data-objects/${key}`); },\n readAllDataObjects() {\n const out: Record<string, unknown> = {};\n for (const key of kv.listKeys('data-objects/')) {\n out[key.slice('data-objects/'.length)] = kv.read(key);\n }\n return out;\n },\n writeStatusSnapshot(status) {\n kv.write('status', status);\n },\n readStatusSnapshot() { return kv.read('status'); },\n };\n}\n\n// ============================================================================\n// Future-facing blob and read-model cache interfaces\n// ============================================================================\n\nexport interface FetchedSourcesBlobStore {\n readBlob(blobRef: string): Promise<unknown | null>;\n}\n\nexport interface PublishedBoardStatusCache {\n writeStatusBestEffort(scopeId: string, statusPayload: unknown): Promise<void>;\n readStatus(scopeId: string): Promise<unknown | null>;\n}\n\n// ============================================================================\n// ---- from board-live-cards-lib-types.ts ----\n// ============================================================================\n\nexport interface SourceRuntimeEntry {\n lastRequestedAt?: string;\n lastFetchedAt?: string;\n lastError?: string;\n queueRequestedAt?: string;\n}\n\nexport type FetchRuntimeEntry = SourceRuntimeEntry;\n\nexport interface SourceTokenPayload {\n cbk: string;\n rg: string;\n br: string;\n cid: string;\n b: string;\n d: string;\n cs?: string;\n rqt: string;\n}\n\nexport function isSourceInFlight(entry: FetchRuntimeEntry | undefined): boolean {\n if (!entry?.lastRequestedAt) return false;\n return !entry.lastFetchedAt || entry.lastFetchedAt < entry.lastRequestedAt;\n}\n\nexport function decideSourceAction(\n entry: FetchRuntimeEntry | undefined,\n queueRequestedAt: string,\n): 'dispatch' | 'in-flight' | 'idle' {\n if (!entry?.lastRequestedAt) return 'dispatch';\n const inFlight = isSourceInFlight(entry);\n if (inFlight) return 'in-flight';\n if (!entry.lastFetchedAt) return 'dispatch';\n if (entry.lastFetchedAt < queueRequestedAt) return 'dispatch';\n return 'idle';\n}\n\nexport function nextEntryAfterFetchDelivery<T extends FetchRuntimeEntry>(\n entry: T,\n fetchedAt: string,\n): T {\n const next = { ...entry, lastFetchedAt: fetchedAt };\n delete (next as FetchRuntimeEntry).lastError;\n return next as T;\n}\n\nexport function nextEntryAfterFetchFailure<T extends FetchRuntimeEntry>(\n entry: T,\n reason: string,\n): T {\n const next = { ...entry, lastError: reason };\n delete (next as FetchRuntimeEntry).lastFetchedAt;\n return next as T;\n}\n\nexport interface CardHandlerAdapters {\n cardStore: CardStore;\n cardRuntimeStore: CardRuntimeStore;\n fetchedSourcesStore: FetchedSourcesStore;\n outputStore: PublishedOutputsStore;\n executionRequestStore: ExecutionRequestStore;\n}\n\nexport interface CommandResponse<T extends Record<string, unknown> = Record<string, unknown>> {\n status: 'success' | 'error';\n data: T;\n error?: string;\n}\n\nexport const Resp = {\n success<T extends Record<string, unknown>>(data: T): CommandResponse<T> {\n return { status: 'success', data };\n },\n\n error(error: string, data: Record<string, unknown> = {}): CommandResponse {\n return { status: 'error', data, error };\n },\n\n getStatus(r: CommandResponse): 'success' | 'error' {\n return r.status;\n },\n\n getData<T extends Record<string, unknown>>(r: CommandResponse<T>): T {\n return r.data;\n },\n\n isSuccess(r: CommandResponse): boolean {\n return r.status === 'success';\n },\n} as const;\n\n// ============================================================================\n// ---- from board-live-cards-lib-board-status.ts ----\n// ============================================================================\n\nexport interface BoardStatusCard {\n name: string;\n status: string;\n error?: {\n message: string;\n code?: string;\n at?: string;\n source?: 'task-runtime' | 'source-fetch' | 'timeout' | 'unknown';\n };\n requires: string[];\n requires_satisfied: string[];\n requires_missing: string[];\n provides_declared: string[];\n provides_runtime: string[];\n blocked_by: string[];\n unblocks: string[];\n runtime: {\n attempt_count: number;\n restart_count: number;\n in_progress_since: string | null;\n last_transition_at: string | null;\n last_completed_at: string | null;\n last_restarted_at: string | null;\n status_age_ms: number | null;\n };\n}\n\nexport interface BoardStatusObject {\n schema_version: 'v1';\n meta: {\n board: {\n path: string;\n };\n };\n summary: {\n card_count: number;\n completed: number;\n eligible: number;\n pending: number;\n blocked: number;\n unresolved: number;\n failed?: number;\n in_progress?: number;\n orphan_cards?: number;\n topology?: {\n edge_count: number;\n max_fan_out_card: string | null;\n max_fan_out: number;\n };\n };\n cards: BoardStatusCard[];\n}\n\nexport function buildBoardStatusObject(boardPath: string, live: LiveGraph): BoardStatusObject {\n const taskState = live.state.tasks;\n const taskConfig = live.config.tasks;\n const cardNames = Object.keys(taskState);\n const sched = schedule(live);\n\n const statusCounts = {\n completed: 0,\n failed: 0,\n in_progress: 0,\n pending: 0,\n blocked: 0,\n unresolved: 0,\n };\n\n const waitingByCard = new Map<string, string[]>();\n for (const p of sched.pending) waitingByCard.set(p.taskName, p.waitingOn);\n for (const u of sched.unresolved) waitingByCard.set(u.taskName, u.missingTokens);\n for (const b of sched.blocked) waitingByCard.set(b.taskName, b.failedTokens);\n\n const dependentsByToken = new Map<string, string[]>();\n for (const [name, cfg] of Object.entries(taskConfig)) {\n for (const token of cfg.requires ?? []) {\n const dependents = dependentsByToken.get(token) ?? [];\n dependents.push(name);\n dependentsByToken.set(token, dependents);\n }\n }\n\n const cards: BoardStatusCard[] = cardNames.sort().map((name) => {\n const state = taskState[name] as {\n status: string;\n data?: Record<string, unknown>;\n error?: string;\n startedAt?: string;\n completedAt?: string;\n failedAt?: string;\n lastUpdated?: string;\n executionCount?: number;\n retryCount?: number;\n };\n const cfg = taskConfig[name] ?? { requires: [], provides: [] };\n\n if (state.status === 'completed') statusCounts.completed += 1;\n else if (state.status === 'failed') statusCounts.failed += 1;\n else if (state.status === 'in-progress') statusCounts.in_progress += 1;\n\n const requires = cfg.requires ?? [];\n const provides = cfg.provides ?? [];\n const runtimeKeys = Object.keys(state.data ?? {}).sort();\n const requiresSatisfied = requires.filter(token => live.state.availableOutputs.includes(token));\n const requiresMissing = requires.filter(token => !live.state.availableOutputs.includes(token));\n const blockedBy = waitingByCard.get(name) ?? requiresMissing;\n\n const unblocks = new Set<string>();\n for (const token of provides) {\n for (const dependent of dependentsByToken.get(token) ?? []) {\n if (dependent !== name) unblocks.add(dependent);\n }\n }\n\n const lastFailureAt = state.failedAt;\n const error = state.error\n ? {\n message: state.error,\n code: 'TASK_FAILED',\n at: lastFailureAt,\n source: 'task-runtime' as const,\n }\n : undefined;\n\n return {\n name,\n status: state.status,\n error,\n requires,\n requires_satisfied: requiresSatisfied,\n requires_missing: requiresMissing,\n provides_declared: provides,\n provides_runtime: runtimeKeys,\n blocked_by: blockedBy,\n unblocks: Array.from(unblocks).sort(),\n runtime: {\n attempt_count: state.executionCount ?? 0,\n restart_count: state.retryCount ?? 0,\n in_progress_since: state.status === 'in-progress' ? (state.startedAt ?? null) : null,\n last_transition_at: state.lastUpdated ?? null,\n last_completed_at: state.completedAt ?? null,\n last_restarted_at: state.startedAt ?? null,\n // Keep status snapshots immutable across reads: this field must not depend on wall-clock pull time.\n status_age_ms: state.lastUpdated ? 0 : null,\n },\n };\n });\n\n statusCounts.pending = sched.pending.length;\n statusCounts.blocked = sched.blocked.length;\n statusCounts.unresolved = sched.unresolved.length;\n\n const fanOut = cards\n .map(c => ({ name: c.name, fanOut: c.unblocks.length }))\n .sort((a, b) => b.fanOut - a.fanOut || a.name.localeCompare(b.name));\n const maxFanOut = fanOut.length > 0 ? fanOut[0] : { name: null, fanOut: 0 };\n\n const allRequires = new Set<string>();\n for (const cfg of Object.values(taskConfig)) {\n for (const r of cfg.requires ?? []) allRequires.add(r);\n }\n let orphanCards = 0;\n for (const [name, cfg] of Object.entries(taskConfig)) {\n const requiresNone = (cfg.requires ?? []).length === 0;\n const providesList = cfg.provides ?? [];\n const feedsAny = providesList.some(p => (dependentsByToken.get(p) ?? []).some(d => d !== name));\n if (requiresNone && !feedsAny) orphanCards += 1;\n }\n\n return {\n schema_version: 'v1',\n meta: { board: { path: boardPath } },\n summary: {\n card_count: cardNames.length,\n completed: statusCounts.completed,\n eligible: sched.eligible.length,\n pending: statusCounts.pending,\n blocked: statusCounts.blocked,\n unresolved: statusCounts.unresolved,\n failed: statusCounts.failed,\n in_progress: statusCounts.in_progress,\n orphan_cards: orphanCards,\n topology: {\n edge_count: Array.from(allRequires).length,\n max_fan_out_card: maxFanOut.name,\n max_fan_out: maxFanOut.fanOut,\n },\n },\n cards,\n };\n}\n\n// ============================================================================\n// ---- from board-live-cards-lib-card-handler.ts ----\n// ============================================================================\n\nfunction nowHighRes(): string {\n return new Date().toISOString();\n}\n\nexport function createCardHandlerFn(\n baseRef: KindValueRef,\n journalId: string,\n adapters: CardHandlerAdapters,\n taskCompletedFn: (taskName: string, data: Record<string, unknown>) => void,\n _taskFailedFn: (taskName: string, error: string) => void,\n writeComputedValuesFn?: (cardId: string, values: Record<string, unknown>) => void,\n writeDataObjectsFn?: (data: Record<string, unknown>) => void,\n): TaskHandlerFn {\n return async (input) => {\n const pendingRequests: ExecutionRequestEntry[] = [];\n const card = adapters.cardStore.readCard(input.nodeId);\n if (!card) return 'task-initiate-failure';\n\n const cardId = card.id as string;\n const cardState = (card.card_data ?? {}) as Record<string, unknown>;\n const allSources: ComputeSource[] = (card.source_defs ?? []) as ComputeSource[];\n const requiredSources = allSources.filter(s => s.optionalForCompletionGating !== true);\n\n let state: CardRuntimeSnapshot = adapters.cardRuntimeStore.readRuntime(cardId);\n let dirty = false;\n\n const flush = (): void => {\n if (!dirty) return;\n adapters.cardRuntimeStore.writeRuntime(cardId, state);\n dirty = false;\n };\n\n const getSourceEntry = (outputFile: string): SourceRuntimeEntry =>\n ({ ...(state._sources[outputFile] ?? {}) });\n const setSourceEntry = (outputFile: string, entry: SourceRuntimeEntry): void => {\n state._sources[outputFile] = entry; dirty = true;\n };\n\n const currentExecutionCount = input.taskState?.executionCount ?? 0;\n const lastExecCount = state._lastExecutionCount;\n if (typeof lastExecCount === 'number' && lastExecCount !== currentExecutionCount) {\n state._sources = {}; dirty = true;\n }\n if (lastExecCount !== currentExecutionCount) {\n state._lastExecutionCount = currentExecutionCount; dirty = true;\n }\n\n\n if (input.update) {\n const u = input.update;\n const outputFile = u.outputFile as string;\n if (outputFile) {\n const entry = getSourceEntry(outputFile);\n if (u.failure) {\n setSourceEntry(outputFile, nextEntryAfterFetchFailure(entry, (u.reason as string | undefined) ?? 'unknown'));\n } else {\n const incomingRqt = u.rqt as string;\n if (!entry.lastFetchedAt || incomingRqt > entry.lastFetchedAt) {\n const deliveryToken = typeof u.deliveryToken === 'string' ? u.deliveryToken : undefined;\n if (deliveryToken) {\n adapters.fetchedSourcesStore.commitSourceData(cardId, outputFile, deliveryToken);\n }\n setSourceEntry(outputFile, nextEntryAfterFetchDelivery(entry, incomingRqt));\n }\n }\n flush();\n }\n }\n\n const sourcesData: Record<string, unknown> = {};\n for (const src of allSources) {\n if (src.outputFile) {\n const content = adapters.fetchedSourcesStore.readSourceData(cardId, src.outputFile as string);\n if (content !== null) {\n sourcesData[src.bindTo] = content;\n }\n }\n }\n\n const requires: Record<string, unknown> = {};\n for (const [token, taskData] of Object.entries(input.state ?? {})) {\n if (taskData !== null && typeof taskData === 'object' && !Array.isArray(taskData)) {\n const unwrapped = (taskData as Record<string, unknown>)[token];\n requires[token] = unwrapped !== undefined ? unwrapped : taskData;\n } else {\n requires[token] = taskData;\n }\n }\n\n const computeNode: ComputeNode = {\n id: cardId,\n card_data: { ...cardState },\n requires,\n source_defs: allSources,\n compute: card.compute as ComputeStep[] | undefined,\n };\n computeNode._sourcesData = sourcesData;\n if (card.compute) {\n CardCompute.runSync(computeNode, { sourcesData });\n }\n\n (writeComputedValuesFn ?? adapters.outputStore.writeComputedValues.bind(adapters.outputStore))(cardId, computeNode.computed_values ?? {});\n\n const enrichedCard = { ...card };\n const enrichedSources = CardCompute.enrichSourcesSync(\n Array.isArray(card.source_defs) ? card.source_defs : undefined,\n {\n card_data: card.card_data as Record<string, unknown>,\n requires,\n },\n );\n\n const dir = baseRef.value;\n enrichedCard.source_defs = Array.isArray(enrichedSources)\n ? enrichedSources.map(src => ({\n ...src,\n boardDir: typeof src.boardDir === 'string' && src.boardDir ? src.boardDir : dir,\n }))\n : enrichedSources;\n\n const now = nowHighRes();\n const runQueuedAt = input.update ? undefined : now;\n\n const undeliveredRequired = requiredSources.filter(s => {\n const outputFile = s.outputFile;\n if (typeof outputFile !== 'string' || !outputFile) return true;\n let entry = getSourceEntry(outputFile);\n if (runQueuedAt) {\n entry = { ...entry, queueRequestedAt: runQueuedAt };\n setSourceEntry(outputFile, entry);\n }\n const qrt = entry.queueRequestedAt ?? entry.lastRequestedAt ?? now;\n const action = decideSourceAction(entry, qrt);\n if (action === 'in-flight') return false;\n return action === 'dispatch';\n });\n\n flush();\n\n if (undeliveredRequired.length > 0) {\n let stampedAny = false;\n let dispatchRqt = now;\n for (const src of undeliveredRequired) {\n const outputFile = src.outputFile;\n if (typeof outputFile !== 'string' || !outputFile) continue;\n const entry = getSourceEntry(outputFile);\n const queuedAt = entry.queueRequestedAt ?? now;\n setSourceEntry(outputFile, { ...entry, lastRequestedAt: queuedAt });\n dispatchRqt = queuedAt;\n stampedAny = true;\n }\n if (stampedAny) flush();\n if (!stampedAny) return 'task-initiated';\n\n pendingRequests.push({ taskKind: 'source-fetch', payload: { boardRef: serializeRef(baseRef), enrichedCard: enrichedCard as Record<string, unknown>, callbackToken: input.callbackToken, rqt: dispatchRqt } });\n adapters.executionRequestStore.appendEntries(journalId, pendingRequests);\n return 'task-initiated';\n }\n\n const providesBindings = (card.provides ?? []) as { bindTo: string; ref: string }[];\n const data: Record<string, unknown> = {};\n for (const { bindTo, ref } of providesBindings) {\n data[bindTo] = CardCompute.resolve(computeNode, ref);\n }\n\n (writeDataObjectsFn ?? adapters.outputStore.writeDataObjects.bind(adapters.outputStore))(data);\n\n const undeliveredOptional = allSources.filter(s => {\n if (s.optionalForCompletionGating !== true) return false;\n const entry = getSourceEntry(s.outputFile as string);\n if (!entry.lastRequestedAt) return true;\n if (!entry.lastFetchedAt) return true;\n return entry.lastFetchedAt <= entry.lastRequestedAt;\n });\n if (undeliveredOptional.length > 0) {\n pendingRequests.push({ taskKind: 'source-fetch', payload: { boardRef: serializeRef(baseRef), enrichedCard: enrichedCard as Record<string, unknown>, callbackToken: input.callbackToken, rqt: now } });\n }\n\n taskCompletedFn(input.nodeId, data);\n if (pendingRequests.length > 0) adapters.executionRequestStore.appendEntries(journalId, pendingRequests);\n return 'task-initiated';\n };\n}\n\n// ============================================================================\n// ---- pure constants / codecs lifted from board-live-cards-cli.ts ----\n// ============================================================================\n\nexport const EMPTY_CONFIG: GraphConfig = { settings: { completion: 'manual', refreshStrategy: 'data-changed' }, tasks: {} } as GraphConfig;\n\n/** Envelope stored in the snapshot store — wraps the LiveGraph snapshot with journal pointer. */\nexport interface BoardEnvelope {\n lastDrainedJournalId: string;\n graph: LiveGraphSnapshot;\n}\n\nexport function boardEnvelopeToSnapshotEntries(envelope: BoardEnvelope): Record<string, unknown> {\n return {\n [BOARD_GRAPH_KEY]: envelope.graph,\n [BOARD_LAST_JOURNAL_PROCESSED_ID_KEY]: envelope.lastDrainedJournalId,\n };\n}\n\nexport function snapshotEntriesToBoardEnvelope(entries: Record<string, unknown>): BoardEnvelope {\n const graph = entries[BOARD_GRAPH_KEY] as LiveGraphSnapshot | undefined;\n const lastDrainedJournalId = entries[BOARD_LAST_JOURNAL_PROCESSED_ID_KEY] as string | undefined;\n if (!graph || typeof graph !== 'object') {\n throw new Error(`State snapshot is missing required key: ${BOARD_GRAPH_KEY}`);\n }\n return {\n graph,\n lastDrainedJournalId: typeof lastDrainedJournalId === 'string' ? lastDrainedJournalId : '',\n };\n}\n\nexport interface CardInventoryEntry {\n cardId: string;\n cardFilePath: string;\n addedAt: string;\n}\n\nexport interface CardInventoryIndex {\n byCardId: Map<string, CardInventoryEntry>;\n byCardPath: Map<string, CardInventoryEntry>;\n}\n\n/**\n * Transform a LiveCard into a TaskConfig for the reactive graph.\n * Every card gets handler: 'card-handler'.\n */\nexport function liveCardToTaskConfig(card: LiveCard): TaskConfig {\n const requires = card.requires as string[] | undefined;\n const provides = (card.provides as Array<{ bindTo: string }> | undefined)?.map(p => p.bindTo) ?? [];\n\n return {\n requires: requires && requires.length > 0 ? requires : undefined,\n provides,\n taskHandlers: ['card-handler'],\n description: (card.meta as { title?: string } | undefined)?.title ?? card.id,\n };\n}\n","/**\n * board-live-cards-public.ts\n *\n * Platform-free public API layer for the board-live-cards system.\n *\n * ─────────────────────────────────────────────────────────────────────────────\n * LAYER DIAGRAM\n * ─────────────────────────────────────────────────────────────────────────────\n *\n * board-live-cards-cli.ts (THIN — arg parse → call public → print JSON)\n * ↓ calls\n * board-live-cards-public.ts (THIS FILE — facade, all logic, no platform code)\n * ↓ depends on injected\n * board-live-cards-lib.ts (pure domain — stores, graph, codecs)\n *\n * ─────────────────────────────────────────────────────────────────────────────\n * PLATFORM ADAPTERS (injected into BoardPlatformAdapter)\n * ─────────────────────────────────────────────────────────────────────────────\n *\n * Node/FS createFsBoardPlatformAdapter(baseRef, cliDir)\n * Azure Functions createAzureBoardPlatformAdapter(baseRef, containerClient, …)\n * Firebase Fn createFirebaseBoardPlatformAdapter(baseRef, firestoreDb, …)\n * In-memory/test createInMemoryBoardPlatformAdapter(baseRef)\n *\n * ─────────────────────────────────────────────────────────────────────────────\n * USAGE\n * ─────────────────────────────────────────────────────────────────────────────\n *\n * const board = createBoardLiveCardsPublic(baseRef, adapter);\n * const result = await board.processAccumulatedEvents();\n * const status = board.status();\n */\n\nimport type { KVStorage, BlobStorage, KindValueRef, AtomicRelayLock } from './storage-interface.js';\nimport { withRelayLock, serializeRef, parseRef } from './storage-interface.js';\nimport type { ExecutionRef } from './execution-interface.js';\nimport { restore, createLiveGraph, snapshot } from '../../continuous-event-graph/core.js';\nimport { createReactiveGraph } from '../../continuous-event-graph/reactive.js';\nimport type { GraphEvent } from '../../event-graph/types.js';\nimport {\n createCardStore,\n createJournalStore,\n createExecutionRequestStore,\n createCardRuntimeStore,\n createFetchedSourcesStore,\n createPublishedOutputsStore,\n createBoardConfigStore,\n createStateSnapshotStore,\n buildBoardStatusObject,\n createCardHandlerFn,\n EMPTY_CONFIG,\n BOARD_GRAPH_KEY,\n SNAPSHOT_SCHEMA_VERSION_V1,\n boardEnvelopeToSnapshotEntries,\n snapshotEntriesToBoardEnvelope,\n liveCardToTaskConfig,\n} from './board-live-cards-lib.js';\nimport type {\n JournalStorageAdapter,\n StateSnapshotStorageAdapter,\n CardStorageAdapter,\n StateSnapshotReadView,\n CardUpsertIndexEntry,\n ExecutionRequestEntry,\n BoardEnvelope,\n SourceTokenPayload,\n BoardStatusObject,\n LiveCard,\n CardIndex,\n CardRuntimeStore,\n CardRuntimeSnapshot,\n FetchedSourcesStore,\n OutputStoreEvent,\n} from './board-live-cards-lib.js';\n\n// Re-export constants so platform adapter files can import them without going through lib directly.\nexport { BOARD_GRAPH_KEY, SNAPSHOT_SCHEMA_VERSION_V1, EMPTY_CONFIG } from './board-live-cards-lib.js';\n\n// ============================================================================\n// CommandInput — uniform request envelope\n//\n// params — scalar routing/identity args (cardId, token, restart, etc.)\n// body — structured payload that arrives via stdin / HTTP body / in-process\n// (card JSON, source-def object, task data, mock-projections, ...)\n//\n// Transport adapters (CLI, Azure Fn, in-process) are responsible for reading\n// the transport channel and building this shape before calling any method.\n// The public layer never knows how data arrived.\n// ============================================================================\n\nexport type CommandInput = {\n params?: Record<string, string | number | boolean>;\n body?: unknown;\n};\n\n// ============================================================================\n// CommandResult — uniform return envelope (success / fail / error)\n//\n// success — operation completed normally\n// fail — operation rejected due to caller input (card not found, bad token)\n// error — unexpected internal error (exception caught)\n// ============================================================================\n\nexport type CommandResult<T = undefined> =\n | (T extends undefined ? { status: 'success' } : { status: 'success'; data: T })\n | { status: 'fail'; error: string }\n | { status: 'error'; error: string };\n\n// Internal helpers for building CommandResult values.\nfunction ok(): CommandResult;\nfunction ok<T>(data: T): CommandResult<T>;\nfunction ok<T>(data?: T): CommandResult<T> {\n return (data !== undefined\n ? { status: 'success', data }\n : { status: 'success' }) as CommandResult<T>;\n}\nfunction fail(error: string): CommandResult { return { status: 'fail', error }; }\nfunction err(e: unknown): CommandResult { return { status: 'error', error: e instanceof Error ? e.message : String(e) }; }\n\n// ============================================================================\n// BoardPlatformAdapter — the single injection point\n// ============================================================================\n\nexport interface BoardPlatformAdapter {\n /**\n * KV storage factory — scoped by namespace.\n * Namespaces used by the public layer:\n * 'state-snapshot' — board graph snapshot (StateSnapshotStorageAdapter, built internally)\n * 'config' — board configuration (.task-executor, .chat-handler, .card-store-ref)\n * 'card-upsert' — card upsert dedup index\n * 'execution-requests' — queued execution requests (keyed by journalId)\n * 'card-runtime' — card runtime state snapshots\n * 'output' — published board status + card computed outputs\n */\n kvStorage(namespace: string): KVStorage;\n\n /**\n * Build a KVStorage rooted at the given ref.\n * Used by the public layer for both card store and outputs store routing.\n * FS: createFsKvStorage(parseRef(ref).value)\n * localStorage: createLocalStorageKvStorage(parseRef(ref).value)\n */\n kvStorageForRef(ref: string): KVStorage;\n\n /**\n * Blob storage factory — scoped by namespace.\n * Namespaces used by the public layer:\n * 'sources' — fetched source data files (keyed by cardId/outputFile)\n * '' — root-scoped blob access (for resolving arbitrary KindValueRef blobs)\n */\n blobStorage(namespace: string): BlobStorage;\n\n /**\n * Journal storage adapter (append-only log).\n * Uses the lib's JournalStorageAdapter interface.\n * One journal per board — no namespace parameter needed.\n */\n journalAdapter(): JournalStorageAdapter;\n\n /**\n * AtomicRelayLock — non-blocking try-acquire with relay-on-busy semantics.\n * Guards processAccumulatedEvents drain cycle.\n * FS: proper-lockfile (createFsAtomicRelayLock)\n * Azure: blob lease\n * Firestore: Firestore transaction + sentinel document\n */\n lock: AtomicRelayLock;\n\n /**\n * Self-identity ExecutionRef — how to invoke THIS board instance.\n * Embedded in source callback tokens so executors know where to report back.\n * Node/FS: { howToRun: 'local-node', whatToRun: 'b64:<base64url({\"kind\":\"fs-path\",\"value\":\"/path/to/cli.js\"})>' }\n * Azure Fn: { howToRun: 'http:post', whatToRun: 'b64:<base64url({\"kind\":\"http-url\",\"value\":\"https://…/api/board\"})>' }\n */\n selfRef: ExecutionRef;\n\n /**\n * Generic execution dispatch — platform adapts ExecutionRef → actual transport.\n * Public layer constructs fully-formed semantic args (source def, base_ref,\n * callback token with selfRef baked in). Platform handles transport:\n * Node: writes args to temp file, spawns detached process\n * Azure: HTTP POST args as JSON body\n * Firebase: publishes args as pubsub message\n */\n dispatchExecution(ref: ExecutionRef, args: Record<string, unknown>): Promise<{ dispatched: boolean; error?: string }>;\n\n /**\n * Resolve a blob ref to its string contents.\n * The adapter handles the platform-specific lookup (e.g. absolute FS path vs board-relative key).\n * Throws if the blob does not exist.\n */\n resolveBlob(ref: KindValueRef): string;\n\n /**\n * Compute a stable, deterministic content hash for any JSON-serializable value.\n * Used for dedup indexes and snapshot versioning.\n * Node/FS: computeStableJsonHash (storage-fs-adapters)\n * Browser: Web Crypto subtle.digest or equivalent\n */\n hashFn(value: unknown): string;\n\n /**\n * Generate a random short ID (32 hex chars).\n * Used for commit IDs and delivery tokens.\n * Node/FS: getHash(`${Date.now()}-${Math.random()}`).slice(0, 32)\n * Browser: crypto.randomUUID().replace(/-/g, '')\n */\n genId(): string;\n\n /**\n * Request an additional drain pass asynchronously (e.g. spawn a background process).\n * Called as the relay continuation after each drain cycle so that events written\n * during the cycle (e.g. task-completed appended by the card handler) are eventually\n * processed even when the current process exits immediately after returning.\n * Optional — if absent, no continuation is scheduled.\n */\n requestProcessAccumulated?(): void;\n\n /**\n * Optional cross-process board change notification publisher (named pipe, webhook, pubsub, etc.).\n * Called once per drain cycle with the complete batch of notifications produced in that cycle.\n */\n publishBoardChangeNotifications?(notifications: BoardChangeNotification[]): void | Promise<void>;\n\n /** Optional warn sink — defaults to no-op. */\n onWarn?(msg: string): void;\n}\n\n// ============================================================================\n// BoardLiveCardsPublic — the public API surface\n//\n// All methods are scoped to the baseRef provided at construction time.\n// ============================================================================\n\nexport interface BoardLiveCardsPublic {\n // Board management\n // params: taskExecutor?, chatHandler?\n init(input: CommandInput): CommandResult;\n // no params needed\n status(input: CommandInput): CommandResult<BoardStatusObject>;\n // no params needed\n getCardStoreRef(input: CommandInput): CommandResult<{ storeRef: string }>;\n getOutputsStoreRef(input: CommandInput): CommandResult<{ storeRef: string }>;\n // params: key — one of: 'task-executor', 'chat-handler', 'card-store-ref', 'outputs-store-ref'\n getConfig(input: CommandInput): CommandResult<{ value: unknown }>;\n // params: key\n getOutputsDataObject(input: CommandInput): CommandResult;\n // no params needed\n getAllOutputsDataObjects(input: CommandInput): CommandResult<Record<string, unknown>>;\n // params: key\n getOutputsComputedValues(input: CommandInput): CommandResult;\n // no params needed\n getAllOutputsComputedValues(input: CommandInput): CommandResult<Record<string, unknown>>;\n // params: id\n removeCard(input: CommandInput): CommandResult;\n // params: id\n retrigger(input: CommandInput): CommandResult;\n // no params needed\n processAccumulatedEvents(input: CommandInput): Promise<CommandResult>;\n\n // Card management — params: cardId, restart?\n upsertCard(input: CommandInput): CommandResult;\n\n // Task callbacks — params.token encodes baseRef; body = task data payload\n // params: token, error?\n taskFailed(input: CommandInput): CommandResult;\n // params: token; body = update payload\n taskProgress(input: CommandInput): CommandResult;\n\n // Source callbacks — params: token, ref | token, reason?\n sourceDataFetched(input: CommandInput): CommandResult;\n sourceDataFetchFailure(input: CommandInput): CommandResult;\n}\n\nexport type BoardChangeNotification =\n | OutputStoreEvent\n | { kind: 'card_refreshed'; cardId: string; card: LiveCard };\n\n// ============================================================================\n// Internal pure helpers — no platform deps\n// ============================================================================\n\n// Pure JS base64url encode/decode — no Node/Buffer dependency.\n// TextEncoder/TextDecoder and btoa/atob are globally available in browsers and Node 16+.\nfunction toBase64Url(str: string): string {\n const bytes = new TextEncoder().encode(str);\n const binStr = Array.from(bytes, b => String.fromCharCode(b)).join('');\n return btoa(binStr).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n\nfunction fromBase64Url(str: string): string {\n const base64 = str.replace(/-/g, '+').replace(/_/g, '/');\n const padded = base64 + '='.repeat((4 - base64.length % 4) % 4);\n const binStr = atob(padded);\n const bytes = Uint8Array.from(binStr, c => c.charCodeAt(0));\n return new TextDecoder().decode(bytes);\n}\n\nfunction decodeCallbackToken(token: string): { taskName: string } | null {\n try {\n const p = JSON.parse(fromBase64Url(token));\n return typeof p?.t === 'string' ? { taskName: p.t } : null;\n } catch { return null; }\n}\n\nfunction encodeSourceToken(payload: SourceTokenPayload): string {\n return toBase64Url(JSON.stringify(payload));\n}\n\nfunction decodeSourceToken(token: string): SourceTokenPayload | null {\n try {\n const p = JSON.parse(fromBase64Url(token));\n if (typeof p?.cbk === 'string' && typeof p?.cid === 'string' &&\n typeof p?.b === 'string' && typeof p?.d === 'string') return p as SourceTokenPayload;\n return null;\n } catch { return null; }\n}\n\nfunction nowIso(): string { return new Date().toISOString(); }\n\n// ============================================================================\n// createBoardLiveCardsPublic — factory\n// ============================================================================\n\nexport function createBoardLiveCardsPublic(\n baseRef: KindValueRef,\n adapter: BoardPlatformAdapter,\n): BoardLiveCardsPublic {\n const warn = adapter.onWarn ?? (() => { /* no-op */ });\n const boardPath = serializeRef(baseRef);\n\n function flushBoardChangeNotifications(notifications: BoardChangeNotification[]): void {\n if (notifications.length === 0) return;\n try {\n const p = adapter.publishBoardChangeNotifications?.(notifications);\n if (p && typeof (p as Promise<void>).catch === 'function') {\n void (p as Promise<void>).catch((e: unknown) =>\n warn(`[board-live-cards-public] publishBoardChangeNotifications failed: ${e instanceof Error ? e.message : String(e)}`),\n );\n }\n } catch (e) {\n warn(`[board-live-cards-public] publishBoardChangeNotifications failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n\n // ── Inline storage adapters built from the three primitives ─────────────────\n //\n // Both CardStorageAdapter and StateSnapshotStorageAdapter are pure KV\n // compositions — no platform-specific atomicity needed at this layer.\n // The public layer builds them here so BoardPlatformAdapter stays minimal.\n\n function makeCardAdapter(): CardStorageAdapter {\n const storeRef = configStore().readCardStoreRef();\n if (!storeRef) throw new Error(`Board at ${baseRef.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);\n const kv = adapter.kvStorageForRef(storeRef);\n return {\n readIndex(): CardIndex | null { return kv.read('_index') as CardIndex | null; },\n writeIndex(index: CardIndex): void { kv.write('_index', index); },\n readCard(id: string): LiveCard | null { return kv.read(id) as LiveCard | null; },\n writeCard(id: string, card: LiveCard): string { kv.write(id, card); return adapter.hashFn(card); },\n cardExists(id: string): boolean { return kv.read(id) !== null; },\n defaultCardKey(cardId: string): string { return cardId; },\n };\n }\n\n // scopeId is intentionally ignored — the adapter is already board-scoped via\n // adapter.kvStorage('state-snapshot'), which closes over baseRef's directory.\n const snapshotAdapterImpl: StateSnapshotStorageAdapter = {\n readValues(_scopeId: string): StateSnapshotReadView {\n const kv = adapter.kvStorage('state-snapshot');\n const keys = kv.listKeys().sort();\n if (keys.length === 0) return { version: null, values: {} };\n const values: Record<string, unknown> = {};\n for (const key of keys) values[key] = kv.read(key);\n return { version: adapter.hashFn(values), values };\n },\n writeValues(_scopeId: string, nextValues: Record<string, unknown>, deletedKeys: string[]): string {\n const kv = adapter.kvStorage('state-snapshot');\n for (const key of deletedKeys) kv.delete(key);\n for (const [key, value] of Object.entries(nextValues)) kv.write(key, value);\n return adapter.hashFn(nextValues);\n },\n };\n\n // Store factory helpers — no long-lived singletons, created per call\n const configStore = () => createBoardConfigStore(adapter.kvStorage('config'));\n const snapshotStore = () => createStateSnapshotStore(snapshotAdapterImpl);\n const journalStore = () => createJournalStore(adapter.journalAdapter());\n const cardStore = () => createCardStore(makeCardAdapter(), warn);\n const outputStore = () => {\n const ref = configStore().readOutputsStoreRef();\n if (!ref) throw new Error(`Board at ${baseRef.value} has no outputs store configured. Run: init --outputs-store-ref <b64-ref>`);\n return createPublishedOutputsStore(adapter.kvStorageForRef(ref));\n };\n\n function boardExists(): boolean {\n return !!snapshotStore().readSnapshot(baseRef.value).values[BOARD_GRAPH_KEY];\n }\n\n function loadEnvelope(): BoardEnvelope {\n const snap = snapshotStore().readSnapshot(baseRef.value);\n if (!snap.values[BOARD_GRAPH_KEY]) throw new Error(`Board not initialized at ${baseRef.value}`);\n return snapshotEntriesToBoardEnvelope(snap.values);\n }\n\n function commitEnvelope(envelope: BoardEnvelope, expectedVersion: string | null): void {\n const result = snapshotStore().commitSnapshot(baseRef.value, {\n schemaVersion: SNAPSHOT_SCHEMA_VERSION_V1,\n expectedVersion,\n commitId: adapter.genId(),\n committedAt: nowIso(),\n deleteKeys: [],\n shallowMerge: boardEnvelopeToSnapshotEntries(envelope),\n });\n if (!result.ok) {\n throw new Error(\n `Snapshot commit failed (version mismatch): expected=${expectedVersion ?? 'null'} current=${result.currentVersion ?? 'null'}`,\n );\n }\n }\n\n function appendJournalEvent(event: GraphEvent): void { journalStore().appendEvent(event); }\n\n // ── Drain cycle ─────────────────────────────────────────────────────────────\n\n async function drainCycle(): Promise<void> {\n const onDispatchFailed = (entry: ExecutionRequestEntry, error: string): void => {\n const p = entry.payload as Record<string, unknown>;\n const enriched = (p?.enrichedCard ?? {}) as Record<string, unknown>;\n const taskName = (enriched.id ?? p?.cardId ?? 'unknown') as string;\n appendJournalEvent({ type: 'task-failed', taskName, error, timestamp: nowIso() });\n };\n\n const executionRequestStore = createExecutionRequestStore(\n adapter.kvStorage('execution-requests'),\n onDispatchFailed,\n );\n\n const realCardRuntimeStore = createCardRuntimeStore(adapter.kvStorage('card-runtime'));\n const realFetchedSourcesStore = createFetchedSourcesStore(\n adapter.blobStorage('sources'),\n (ref) => adapter.resolveBlob(ref),\n );\n\n // RX: in-memory overlay for card runtime writes — reads check overlay first\n const RX = new Map<string, CardRuntimeSnapshot>();\n const overlayCardRuntimeStore: CardRuntimeStore = {\n readRuntime(cardId) {\n return RX.get(cardId) ?? realCardRuntimeStore.readRuntime(cardId);\n },\n writeRuntime(cardId, state) {\n RX.set(cardId, state);\n },\n };\n\n // SX: in-memory overlay for source commits — reads check overlay first\n const SX: { cardId: string; outputFile: string; deliveryToken: string }[] = [];\n const sxCache = new Map<string, unknown>();\n const overlayFetchedSourcesStore: FetchedSourcesStore = {\n readSourceData(cardId, outputFile) {\n const key = `${cardId}/${outputFile}`;\n if (sxCache.has(key)) return sxCache.get(key)!;\n return realFetchedSourcesStore.readSourceData(cardId, outputFile);\n },\n ingestSourceDataStaged(cardId, outputFile, ref, deliveryToken) {\n realFetchedSourcesStore.ingestSourceDataStaged(cardId, outputFile, ref, deliveryToken);\n },\n commitSourceData(cardId, outputFile, deliveryToken) {\n // Read staged content into overlay so readSourceData sees it immediately\n const stagedKey = `${cardId}/.staged/${deliveryToken}/${outputFile}`;\n const blob = adapter.blobStorage('sources');\n const content = blob.read(stagedKey);\n if (content == null) return false;\n const key = `${cardId}/${outputFile}`;\n const trimmed = content.trim();\n try { sxCache.set(key, JSON.parse(trimmed)); } catch { sxCache.set(key, trimmed); }\n SX.push({ cardId, outputFile, deliveryToken });\n return true;\n },\n hasSource(cardId, outputFile) {\n const key = `${cardId}/${outputFile}`;\n if (sxCache.has(key)) return true;\n return realFetchedSourcesStore.hasSource(cardId, outputFile);\n },\n };\n\n const cardHandlerAdapters = {\n cardStore: cardStore(),\n cardRuntimeStore: overlayCardRuntimeStore,\n fetchedSourcesStore: overlayFetchedSourcesStore,\n outputStore: outputStore(),\n executionRequestStore,\n };\n\n const envelope = loadEnvelope();\n const live = restore(envelope.graph);\n const { events: undrained, newCursor } = journalStore().readEntriesAfterCursor(envelope.lastDrainedJournalId);\n\n let TX: GraphEvent[] = [];\n const CX: { cardId: string; values: Record<string, unknown> }[] = [];\n const DX: Record<string, unknown>[] = [];\n // NX: card refreshes — Map so last write per cardId wins, deduplicating rapid updates.\n const NX = new Map<string, LiveCard>();\n\n const taskCompletedFn = (taskName: string, data: Record<string, unknown>): void => {\n TX.push({ type: 'task-completed', taskName, data, timestamp: nowIso() } as GraphEvent);\n };\n const taskFailedFn = (taskName: string, error: string): void =>\n appendJournalEvent({ type: 'task-failed', taskName, error, timestamp: nowIso() });\n const writeComputedValuesFn = (cardId: string, values: Record<string, unknown>): void => {\n CX.push({ cardId, values });\n };\n const writeDataObjectsFn = (data: Record<string, unknown>): void => {\n DX.push(data);\n };\n // Wire output-store notifications for this drain cycle.\n // (notifications are batched and flushed at the end of the drain cycle)\n\n const rg = createReactiveGraph(live, {\n handlers: {\n 'card-handler': createCardHandlerFn(baseRef, newCursor, cardHandlerAdapters, taskCompletedFn, taskFailedFn, writeComputedValuesFn, writeDataObjectsFn),\n },\n });\n\n TX = undrained;\n while (TX.length > 0) {\n const pending = TX;\n TX = [];\n // Populate NX for task-restart events before pushing to the reactive graph.\n for (const ev of pending) {\n if (ev.type === 'task-restart') {\n const card = cardHandlerAdapters.cardStore.readCard(ev.taskName as string);\n if (card) NX.set(ev.taskName as string, card as LiveCard);\n }\n }\n rg.pushAll(pending);\n await rg.waitForHandlers();\n }\n\n const finalLive = rg.getState();\n await rg.dispose({ wait: true });\n\n const currentVersion = snapshotStore().readSnapshot(baseRef.value).version;\n commitEnvelope({ lastDrainedJournalId: newCursor, graph: snapshot(finalLive) }, currentVersion);\n\n // Flush deferred output writes after board state is saved\n for (const { cardId, values } of CX) cardHandlerAdapters.outputStore.writeComputedValues(cardId, values);\n for (const data of DX) cardHandlerAdapters.outputStore.writeDataObjects(data);\n\n // Flush RX: card runtime overlay → real store\n for (const [cardId, state] of RX) realCardRuntimeStore.writeRuntime(cardId, state);\n\n // Flush SX: deferred source commits → real store\n for (const { cardId, outputFile, deliveryToken } of SX) realFetchedSourcesStore.commitSourceData(cardId, outputFile, deliveryToken);\n\n let statusObj: unknown;\n try {\n statusObj = buildBoardStatusObject(boardPath, finalLive);\n cardHandlerAdapters.outputStore.writeStatusSnapshot(statusObj);\n } catch (e) {\n warn(`[board-live-cards-public] status publish failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n\n // Batch all drain-cycle notifications and flush them atomically in one write\n const batch: BoardChangeNotification[] = [];\n for (const { cardId, values } of CX) batch.push({ kind: 'computed_values', cardId, values });\n for (const data of DX) {\n for (const [key, payload] of Object.entries(data)) {\n if (key) batch.push({ kind: 'data_object', key, payload });\n }\n }\n for (const [cardId, card] of NX) batch.push({ kind: 'card_refreshed', cardId, card });\n if (statusObj !== undefined) batch.push({ kind: 'status', status: statusObj });\n flushBoardChangeNotifications(batch);\n\n const executorRef = configStore().readTaskExecutorRef()\n ?? { howToRun: 'built-in' as const, whatToRun: serializeRef({ kind: 'built-in', value: 'source-cli-task-executor' }) };\n\n executionRequestStore.dispatchEntriesForJournalId(newCursor, (entry) => {\n if (entry.taskKind !== 'source-fetch') {\n warn(`[process-accumulated-events] unknown taskKind \"${entry.taskKind}\" — skipping`);\n return;\n }\n const p = entry.payload as { boardRef: string; enrichedCard: Record<string, unknown>; callbackToken: string; rqt: string };\n const cardId = (p.enrichedCard?.id as string | undefined) ?? 'unknown';\n const sourceDefs = (p.enrichedCard?.source_defs ?? []) as Array<{ bindTo: string; outputFile?: string; [k: string]: unknown }>;\n\n for (const src of sourceDefs) {\n if (!src.outputFile) { warn(`[dispatch] source \"${src.bindTo}\" has no outputFile — skipping`); continue; }\n const sourceToken = encodeSourceToken({\n cbk: p.callbackToken, rg: baseRef.value, br: serializeRef(baseRef),\n cid: cardId, b: src.bindTo, d: src.outputFile, cs: undefined, rqt: p.rqt,\n });\n adapter.dispatchExecution(executorRef, {\n source_def: src, base_ref: serializeRef(baseRef),\n callback: { token: sourceToken, via: adapter.selfRef },\n }).catch((e: unknown) => taskFailedFn(cardId, e instanceof Error ? e.message : String(e)));\n }\n });\n }\n\n // ── Public methods ──────────────────────────────────────────────────────────\n\n // Internal drain — called directly from within the factory (no CommandInput needed).\n async function drain(): Promise<CommandResult> {\n try {\n // After each drain cycle, check if new journal entries accumulated while we\n // held the lock (e.g. concurrent upsertCard calls). If so, run another cycle.\n // This is the in-process equivalent of requestProcessAccumulated (which spawns\n // a child process for the CLI case). The self-continuation runs after the lock\n // is released, so it re-acquires cleanly.\n const continuation = () => {\n const envelope = loadEnvelope();\n const { events } = journalStore().readEntriesAfterCursor(envelope.lastDrainedJournalId);\n if (events.length <= 0) {\n return;\n }\n void drain();\n // Also fire the platform continuation (e.g. detached process for source fetches)\n adapter.requestProcessAccumulated?.();\n };\n const ran = await withRelayLock(adapter.lock, drainCycle, continuation);\n return ok({ ran: ran !== false });\n } catch (e) { return err(e); }\n }\n\n function init(input: CommandInput): CommandResult {\n try {\n // cardStoreRef is required — create a card store with card-store-cli first\n const storeRef = input.params?.['cardStoreRef'] as string | undefined;\n if (!storeRef) return fail('init requires params.cardStoreRef — create a card store with card-store-cli and pass its ref here');\n if (!boardExists()) {\n const live = createLiveGraph(EMPTY_CONFIG);\n commitEnvelope({ lastDrainedJournalId: '', graph: snapshot(live) }, null);\n }\n const outputsStoreRef = input.params?.['outputsStoreRef'] as string | undefined;\n if (!outputsStoreRef) return fail('init requires params.outputsStoreRef — pass the outputs store ref here');\n const cfg = configStore();\n cfg.writeCardStoreRef(storeRef);\n cfg.writeOutputsStoreRef(outputsStoreRef);\n const body = (input.body ?? {}) as Record<string, unknown>;\n if (body['task-executor-ref']) cfg.writeTaskExecutorRef(body['task-executor-ref'] as ExecutionRef);\n if (body['chat-handler-ref']) cfg.writeChatHandlerRef(body['chat-handler-ref'] as ExecutionRef);\n try { outputStore().writeStatusSnapshot(buildBoardStatusObject(boardPath, restore(loadEnvelope().graph))); } catch { /* best-effort */ }\n return ok();\n } catch (e) { return err(e); }\n }\n\n function status(_input: CommandInput): CommandResult<BoardStatusObject> {\n try {\n let s = outputStore().readStatusSnapshot() as BoardStatusObject | null;\n if (!s) {\n s = buildBoardStatusObject(boardPath, restore(loadEnvelope().graph));\n try { outputStore().writeStatusSnapshot(s); } catch { /* best-effort */ }\n }\n return ok(s);\n } catch (e) { return err(e) as CommandResult<BoardStatusObject>; }\n }\n\n function removeCard(input: CommandInput): CommandResult {\n try {\n const id = input.params?.['id'] as string | undefined;\n if (!id) return fail('removeCard requires params.id');\n appendJournalEvent({ type: 'task-removal', taskName: id, timestamp: nowIso() });\n void drain();\n return ok();\n } catch (e) { return err(e); }\n }\n\n function retrigger(input: CommandInput): CommandResult {\n try {\n const id = input.params?.['id'] as string | undefined;\n if (!id) return fail('retrigger requires params.id');\n appendJournalEvent({ type: 'task-restart', taskName: id, timestamp: nowIso() });\n void drain();\n return ok();\n } catch (e) { return err(e); }\n }\n\n async function processAccumulatedEvents(_input: CommandInput): Promise<CommandResult> {\n return drain();\n }\n\n function upsertCard(input: CommandInput): CommandResult {\n try {\n const cardId = input.params?.['cardId'] as string | undefined;\n const all = input.params?.['all'];\n const restart = !!input.params?.['restart'];\n if (!cardId && !all) return fail('upsertCard requires --card-id <id> or --all');\n\n const ids = all ? cardStore().readAllCards().map(c => c.id) : [cardId as string];\n\n // Validate all cards exist before writing anything (atomicity)\n for (const id of ids) {\n if (!cardStore().readCard(id)) return fail(`Card \"${id}\" not found in board at ${baseRef.value}`);\n }\n\n for (const id of ids) {\n const card = cardStore().readCard(id)!;\n const taskConfig = liveCardToTaskConfig(card);\n const taskConfigHash = adapter.hashFn(taskConfig);\n const upsertKv = adapter.kvStorage('card-upsert');\n const existing = upsertKv.read(id) as CardUpsertIndexEntry | null;\n const taskConfigChanged = existing?.taskConfigHash !== taskConfigHash;\n\n if (!taskConfigChanged && !restart) continue;\n\n if (taskConfigChanged) {\n const blobRef = existing?.blobRef ?? cardStore().readCardKey(id) ?? id;\n appendJournalEvent({ type: 'task-upsert', taskName: id, taskConfig, timestamp: nowIso() });\n upsertKv.write(id, { blobRef, taskConfigHash, updatedAt: nowIso() } satisfies CardUpsertIndexEntry);\n }\n if (restart) appendJournalEvent({ type: 'task-restart', taskName: id, timestamp: nowIso() });\n }\n\n void drain();\n return ok();\n } catch (e) { return err(e); }\n }\n\n function taskFailed(input: CommandInput): CommandResult {\n try {\n const token = input.params?.['token'] as string | undefined;\n if (!token) return fail('taskFailed requires params.token');\n const error = (input.params?.['error'] as string | undefined) ?? 'unknown error';\n const decoded = decodeCallbackToken(token);\n if (!decoded) return fail('Invalid callback token');\n appendJournalEvent({ type: 'task-failed', taskName: decoded.taskName, error, timestamp: nowIso() });\n void drain();\n return ok();\n } catch (e) { return err(e); }\n }\n\n function taskProgress(input: CommandInput): CommandResult {\n try {\n const token = input.params?.['token'] as string | undefined;\n if (!token) return fail('taskProgress requires params.token');\n const b = (input.body ?? {}) as Record<string, unknown>;\n const update = (b['update'] ?? {}) as Record<string, unknown>;\n const decoded = decodeCallbackToken(token);\n if (!decoded) return fail('Invalid callback token');\n appendJournalEvent({ type: 'task-progress', taskName: decoded.taskName, update, timestamp: nowIso() });\n void drain();\n return ok();\n } catch (e) { return err(e); }\n }\n\n function sourceDataFetched(input: CommandInput): CommandResult {\n try {\n const token = input.params?.['token'] as string | undefined;\n const ref = input.params?.['ref'] as string | undefined;\n if (!token) return fail('sourceDataFetched requires params.token');\n if (!ref) return fail('sourceDataFetched requires params.ref');\n const payload = decodeSourceToken(token);\n if (!payload) return fail('Invalid source token');\n const { cbk, cid, b, d, cs, rqt } = payload;\n\n const fetchedSourcesStore = createFetchedSourcesStore(\n adapter.blobStorage('sources'),\n (ref) => adapter.resolveBlob(ref),\n );\n\n const deliveryToken = adapter.genId();\n fetchedSourcesStore.ingestSourceDataStaged(cid, d, parseRef(ref), deliveryToken);\n\n const cbkDecoded = decodeCallbackToken(cbk);\n if (!cbkDecoded) return fail('Invalid callback token embedded in source token');\n\n const fetchedAt = nowIso();\n appendJournalEvent({\n type: 'task-progress',\n taskName: cbkDecoded.taskName,\n update: { bindTo: b, outputFile: d, fetchedAt, deliveryToken, sourceChecksum: cs, rqt },\n timestamp: fetchedAt,\n });\n void drain();\n return ok();\n } catch (e) { return err(e); }\n }\n\n function sourceDataFetchFailure(input: CommandInput): CommandResult {\n try {\n const token = input.params?.['token'] as string | undefined;\n const reason = (input.params?.['reason'] as string | undefined) ?? 'unknown';\n if (!token) return fail('sourceDataFetchFailure requires params.token');\n const payload = decodeSourceToken(token);\n if (!payload) return fail('Invalid source token');\n const { cbk, b, d, cs } = payload;\n\n const cbkDecoded = decodeCallbackToken(cbk);\n if (!cbkDecoded) return fail('Invalid callback token embedded in source token');\n\n appendJournalEvent({\n type: 'task-progress',\n taskName: cbkDecoded.taskName,\n update: { bindTo: b, outputFile: d, failure: true, reason, sourceChecksum: cs },\n timestamp: nowIso(),\n });\n void drain();\n return ok();\n } catch (e) { return err(e); }\n }\n\n function getCardStoreRef(_input: CommandInput): CommandResult<{ storeRef: string }> {\n try {\n const storeRef = configStore().readCardStoreRef();\n if (!storeRef) return fail(`Board at ${baseRef.value} has no card store configured`) as CommandResult<{ storeRef: string }>;\n return ok({ storeRef });\n } catch (e) { return err(e) as CommandResult<{ storeRef: string }>; }\n }\n\n function getOutputsStoreRef(_input: CommandInput): CommandResult<{ storeRef: string }> {\n try {\n const storeRef = configStore().readOutputsStoreRef();\n if (!storeRef) return fail(`Board at ${baseRef.value} has no outputs store configured`) as CommandResult<{ storeRef: string }>;\n return ok({ storeRef });\n } catch (e) { return err(e) as CommandResult<{ storeRef: string }>; }\n }\n\n function getConfig(input: CommandInput): CommandResult<{ value: unknown }> {\n try {\n const key = input.params?.['key'] as string | undefined;\n if (!key) return fail('getConfig requires params.key') as CommandResult<{ value: unknown }>;\n const cfg = configStore();\n let value: unknown;\n switch (key) {\n case 'task-executor': value = cfg.readTaskExecutorRef() ?? null; break;\n case 'chat-handler': value = cfg.readChatHandlerRef() ?? null; break;\n case 'card-store-ref': value = cfg.readCardStoreRef(); break;\n case 'outputs-store-ref': value = cfg.readOutputsStoreRef(); break;\n default: return fail(`getConfig: unknown key \"${key}\"`) as CommandResult<{ value: unknown }>;\n }\n return ok({ value }) as CommandResult<{ value: unknown }>;\n } catch (e) { return err(e) as CommandResult<{ value: unknown }>; }\n }\n\n function getOutputsDataObject(input: CommandInput): CommandResult {\n try {\n const key = input.params?.['key'] as string | undefined;\n if (!key) return fail('getOutputsDataObject requires params.key');\n const value = outputStore().readDataObject(key);\n return ok(value);\n } catch (e) { return err(e); }\n }\n\n function getAllOutputsDataObjects(_input: CommandInput): CommandResult<Record<string, unknown>> {\n try {\n return ok(outputStore().readAllDataObjects()) as CommandResult<Record<string, unknown>>;\n } catch (e) { return err(e) as CommandResult<Record<string, unknown>>; }\n }\n\n function getOutputsComputedValues(input: CommandInput): CommandResult {\n try {\n const key = input.params?.['key'] as string | undefined;\n if (!key) return fail('getOutputsComputedValues requires params.key');\n const value = outputStore().readComputedValues(key);\n return ok(value);\n } catch (e) { return err(e); }\n }\n\n function getAllOutputsComputedValues(_input: CommandInput): CommandResult<Record<string, unknown>> {\n try {\n return ok(outputStore().readAllComputedValues()) as CommandResult<Record<string, unknown>>;\n } catch (e) { return err(e) as CommandResult<Record<string, unknown>>; }\n }\n\n return {\n init, status, getCardStoreRef, getOutputsStoreRef, getConfig,\n getOutputsDataObject, getAllOutputsDataObjects,\n getOutputsComputedValues, getAllOutputsComputedValues,\n removeCard, retrigger, processAccumulatedEvents,\n upsertCard,\n taskFailed, taskProgress,\n sourceDataFetched, sourceDataFetchFailure,\n };\n}\n\n// ============================================================================\n// BoardNonCorePlatformAdapter — extends the base adapter with synchronous\n// executor dispatch and schema validation.\n//\n// The 5 non-core commands all require blocking sub-process invocation which\n// is not available in fire-and-forget async dispatch contexts (Azure Fn, etc.)\n// so they live in a separate interface and factory.\n// ============================================================================\n\nexport interface BoardNonCorePlatformAdapter extends BoardPlatformAdapter {\n /**\n * Synchronously invoke a task executor subcommand and return stdout.\n * Throws on non-zero exit or timeout.\n */\n invokeExecutorSync(\n ref: ExecutionRef,\n subcommand: string,\n args: string[],\n opts?: { timeout?: number },\n ): string;\n\n /** Schema-only card validator (no executor invocation). */\n validateSchema(card: Record<string, unknown>): { ok: boolean; errors: string[] };\n\n /** Create a temp file path for I/O staging — absolute, board-scoped. */\n makeTempFilePath(label: string, ext?: string): string;\n\n /** Absolute-path blob I/O for temp files and card file references. */\n absoluteBlob: BlobStorage;\n}\n\n// ============================================================================\n// BoardLiveCardsNonCorePublic — 5 commands requiring synchronous dispatch\n// ============================================================================\n\nexport interface BoardLiveCardsNonCorePublic {\n /** params: cardId? or all?; returns array even for single card */\n validateCard(input: CommandInput): CommandResult<Array<{ cardId: string; isValid: boolean; issues: string[] }>>;\n\n /** body: { \"card-content\": <card> } — card JSON arrives via stdin */\n validateTmpCard(input: CommandInput): CommandResult<{ cardId: string; isValid: boolean; issues: string[] }>;\n\n /** params: cardId, sourceIdx, outRef?; body — mockProjections object */\n probeSource(input: CommandInput): CommandResult;\n\n /** body: { sourceDef, mockProjections }; params: outRef? */\n probeTmpSource(input: CommandInput): CommandResult;\n\n /** no params needed */\n describeTaskExecutorCapabilities(input: CommandInput): CommandResult;\n\n /**\n * Write/update cards in the configured card store.\n * body: { ops: Array<{ op: 'update', id: string, 'card-content': LiveCard }> }\n */\n updatesInCardStore(input: CommandInput): CommandResult;\n\n /**\n * Read cards from the configured card store by id.\n * body: { ids: string[] }\n */\n readFromCardStore(input: CommandInput): CommandResult<{ cards: Array<{ id: string; 'card-content': LiveCard | null }> }>;\n}\n\n// ============================================================================\n// createBoardLiveCardsNonCorePublic — factory\n// ============================================================================\n\nexport function createBoardLiveCardsNonCorePublic(\n baseRef: KindValueRef,\n adapter: BoardNonCorePlatformAdapter,\n): BoardLiveCardsNonCorePublic {\n // Mirror the same internal helpers as the core factory.\n const configStore = () => createBoardConfigStore(adapter.kvStorage('config'));\n function makeCardAdapterNC(): CardStorageAdapter {\n const storeRef = configStore().readCardStoreRef();\n if (!storeRef) throw new Error(`Board at ${baseRef.value} has no card store configured. Run: init --base-ref <ref> --store-ref <b64-ref>`);\n const kv = adapter.kvStorageForRef(storeRef);\n return {\n readIndex(): CardIndex | null { return kv.read('_index') as CardIndex | null; },\n writeIndex(index: CardIndex): void { kv.write('_index', index); },\n readCard(id: string): LiveCard | null { return kv.read(id) as LiveCard | null; },\n writeCard(id: string, card: LiveCard): string { kv.write(id, card); return adapter.hashFn(card); },\n cardExists(id: string): boolean { return kv.read(id) !== null; },\n defaultCardKey(cardId: string): string { return cardId; },\n };\n }\n const cardStore = () => createCardStore(makeCardAdapterNC(), adapter.onWarn ?? (() => { /* no-op */ }));\n\n // ── Shared validation helper ───────────────────────────────────────────────\n\n function validateCardObject(\n cardId: string,\n card: Record<string, unknown>,\n ): CommandResult<{ cardId: string; isValid: boolean; issues: string[] }> {\n const schemaResult = adapter.validateSchema(card);\n const sourceErrors: string[] = [];\n\n const teRef = configStore().readTaskExecutorRef();\n if (teRef && Array.isArray(card['source_defs'])) {\n for (const src of card['source_defs'] as Array<Record<string, unknown>>) {\n const bindTo = typeof src['bindTo'] === 'string' ? src['bindTo'] : '(unknown)';\n const tmpFile = adapter.makeTempFilePath(`validate-src-${bindTo}`);\n try {\n adapter.absoluteBlob.write(tmpFile, JSON.stringify(src));\n let stdout: string;\n try {\n stdout = adapter.invokeExecutorSync(teRef, 'validate-source-def', ['--in', tmpFile], { timeout: 10_000 });\n } catch (execErr: unknown) {\n const se = execErr as { stdout?: unknown };\n stdout = typeof se?.stdout === 'string' ? se.stdout : '';\n if (!stdout.trim()) {\n sourceErrors.push(`source \"${bindTo}\": executor validate-source-def failed — ${execErr instanceof Error ? execErr.message : String(execErr)}`);\n continue;\n }\n }\n const parsed = JSON.parse(stdout.trim()) as { ok?: boolean; errors?: string[] };\n if (!parsed.ok && Array.isArray(parsed.errors)) {\n for (const e of parsed.errors) sourceErrors.push(`source \"${bindTo}\": ${e}`);\n }\n } catch (e) {\n sourceErrors.push(`source \"${bindTo}\": executor validate-source-def failed — ${e instanceof Error ? e.message : String(e)}`);\n } finally {\n try { adapter.absoluteBlob.remove(tmpFile); } catch { /* best-effort */ }\n }\n }\n }\n\n const allErrors = [...schemaResult.errors, ...sourceErrors];\n return ok({ cardId, isValid: allErrors.length === 0, issues: allErrors }) as CommandResult<{ cardId: string; isValid: boolean; issues: string[] }>;\n }\n\n // ── Shared probe helper ────────────────────────────────────────────────────\n\n function runSourceProbe(\n src: Record<string, unknown>,\n mockProjections: Record<string, unknown>,\n outRef?: string,\n ): CommandResult {\n const teRef = configStore().readTaskExecutorRef();\n if (!teRef) return fail('No task-executor registered for this board');\n\n const bindTo = typeof src['bindTo'] === 'string' ? src['bindTo'] : 'source';\n const inFile = adapter.makeTempFilePath(`probe-in-${bindTo}`);\n const outFile = adapter.makeTempFilePath(`probe-out-${bindTo}`);\n const errFile = adapter.makeTempFilePath(`probe-err-${bindTo}`, '.txt');\n\n const inPayload: Record<string, unknown> = {\n ...src,\n boardDir: baseRef.value,\n _projections: mockProjections,\n };\n\n const inRefStr = serializeRef({ kind: 'fs-path', value: inFile });\n const outRefStr = serializeRef({ kind: 'fs-path', value: outFile });\n const errRefStr = serializeRef({ kind: 'fs-path', value: errFile });\n\n adapter.absoluteBlob.write(inFile, JSON.stringify(inPayload, null, 2));\n\n let result: string | null = null;\n try {\n adapter.invokeExecutorSync(teRef, 'run-source-fetch',\n ['--in-ref', inRefStr, '--out-ref', outRefStr, '--err-ref', errRefStr],\n { timeout: (src['timeout'] as number | undefined) ?? 30_000 },\n );\n result = adapter.absoluteBlob.read(outFile);\n if (result === null) return fail('Executor produced no output file');\n } catch (e) {\n const errMsg = adapter.absoluteBlob.read(errFile)?.trim()\n ?? (e instanceof Error ? e.message : String(e));\n return fail(`Probe failed: ${errMsg}`);\n } finally {\n try { adapter.absoluteBlob.remove(inFile); } catch { /* best-effort */ }\n try { adapter.absoluteBlob.remove(errFile); } catch { /* best-effort */ }\n }\n\n if (outRef) {\n const parsed = parseRef(outRef);\n adapter.absoluteBlob.write(parsed.value, result);\n } else {\n try { adapter.absoluteBlob.remove(outFile); } catch { /* best-effort */ }\n }\n\n return ok({ bindTo, resultSizeBytes: result.length });\n }\n\n // ── Public methods ─────────────────────────────────────────────────────────\n\n function validateCard(input: CommandInput): CommandResult<Array<{ cardId: string; isValid: boolean; issues: string[] }>> {\n try {\n const cardId = input.params?.['cardId'] as string | undefined;\n const all = input.params?.['all'];\n if (!cardId && !all) return fail('validateCard requires --card-id <id> or --all') as CommandResult<Array<{ cardId: string; isValid: boolean; issues: string[] }>>;\n const ids = all ? cardStore().readAllCards().map(c => c.id) : [cardId as string];\n const results: Array<{ cardId: string; isValid: boolean; issues: string[] }> = [];\n for (const id of ids) {\n const card = cardStore().readCard(id);\n if (!card) { results.push({ cardId: id, isValid: false, issues: [`Card \"${id}\" not found`] }); continue; }\n const r = validateCardObject(id, card as Record<string, unknown>);\n if (r.status !== 'success') return r as unknown as CommandResult<Array<{ cardId: string; isValid: boolean; issues: string[] }>>;\n results.push(r.data!);\n }\n return ok(results) as CommandResult<Array<{ cardId: string; isValid: boolean; issues: string[] }>>;\n } catch (e) { return err(e) as CommandResult<Array<{ cardId: string; isValid: boolean; issues: string[] }>>; }\n }\n\n function validateTmpCard(input: CommandInput): CommandResult<{ cardId: string; isValid: boolean; issues: string[] }> {\n try {\n if (!input.body || typeof input.body !== 'object' || Array.isArray(input.body)) {\n return fail('validateTmpCard requires card JSON object in body') as CommandResult<{ cardId: string; isValid: boolean; issues: string[] }>;\n }\n const body = input.body as Record<string, unknown>;\n const card = (body['card-content'] ?? body) as Record<string, unknown>;\n const cardId = typeof card['id'] === 'string' ? card['id'] : '(unknown)';\n return validateCardObject(cardId, card);\n } catch (e) { return err(e) as CommandResult<{ cardId: string; isValid: boolean; issues: string[] }>; }\n }\n\n function probeSource(input: CommandInput): CommandResult {\n try {\n const cardId = input.params?.['cardId'] as string | undefined;\n const sourceIdx = input.params?.['sourceIdx'] as number | undefined;\n const outRef = input.params?.['outRef'] as string | undefined;\n if (!cardId) return fail('probeSource requires params.cardId');\n if (sourceIdx === undefined) return fail('probeSource requires params.sourceIdx');\n const b = (input.body ?? {}) as Record<string, unknown>;\n const mockProjections = (b['mock-projections'] ?? {}) as Record<string, unknown>;\n\n const card = cardStore().readCard(cardId) as Record<string, unknown> | null;\n if (!card) return fail(`Card \"${cardId}\" not found`);\n const sourceDefs = (card['source_defs'] ?? []) as Array<Record<string, unknown>>;\n if (sourceIdx < 0 || sourceIdx >= sourceDefs.length) {\n return fail(`sourceIdx ${sourceIdx} out of range (card has ${sourceDefs.length} source(s))`);\n }\n return runSourceProbe(sourceDefs[sourceIdx], mockProjections, outRef);\n } catch (e) { return err(e); }\n }\n\n function probeTmpSource(input: CommandInput): CommandResult {\n try {\n const outRef = input.params?.['outRef'] as string | undefined;\n const b = input.body as Record<string, unknown> | undefined;\n if (!b) return fail('probeTmpSource requires body with \"source-def\" and \"mock-projections\"');\n const sourceDef = b['source-def'] as Record<string, unknown> | undefined;\n const mockProjections = (b['mock-projections'] ?? {}) as Record<string, unknown>;\n if (!sourceDef) return fail('probeTmpSource body requires \"source-def\"');\n return runSourceProbe(sourceDef, mockProjections, outRef);\n } catch (e) { return err(e); }\n }\n\n function describeTaskExecutorCapabilities(_input: CommandInput): CommandResult {\n try {\n const teRef = configStore().readTaskExecutorRef();\n if (!teRef) return fail('No task-executor registered for this board');\n const stdout = adapter.invokeExecutorSync(teRef, 'describe-capabilities', [], { timeout: 10_000 });\n return ok(JSON.parse(stdout.trim()) as Record<string, unknown>);\n } catch (e) { return err(e); }\n }\n\n function updatesInCardStore(input: CommandInput): CommandResult {\n try {\n const b = input.body as Record<string, unknown> | undefined;\n if (!b || !Array.isArray(b['ops'])) return fail('updatesInCardStore requires body.ops array');\n const ops = b['ops'] as Array<Record<string, unknown>>;\n const store = cardStore();\n for (const op of ops) {\n const opType = op['op'] as string | undefined;\n const id = op['id'] as string | undefined;\n if (!id) return fail('op is missing \"id\"');\n if (opType === 'update') {\n const cardContent = op['card-content'] as LiveCard | undefined;\n if (!cardContent) return fail(`update op for \"${id}\" is missing \"card-content\"`);\n store.writeCard(id, cardContent);\n } else {\n return fail(`Unknown op type: \"${opType ?? '(none)'}\"`);\n }\n }\n return ok();\n } catch (e) { return err(e); }\n }\n\n function readFromCardStore(input: CommandInput): CommandResult<{ cards: Array<{ id: string; 'card-content': LiveCard | null }> }> {\n try {\n const b = input.body as Record<string, unknown> | undefined;\n if (!b || !Array.isArray(b['ids'])) {\n return fail('readFromCardStore requires body.ids array') as CommandResult<{ cards: Array<{ id: string; 'card-content': LiveCard | null }> }>;\n }\n const ids = b['ids'] as string[];\n const store = cardStore();\n const cards = ids.map(id => ({ id, 'card-content': store.readCard(id) }));\n return ok({ cards }) as CommandResult<{ cards: Array<{ id: string; 'card-content': LiveCard | null }> }>;\n } catch (e) { return err(e) as CommandResult<{ cards: Array<{ id: string; 'card-content': LiveCard | null }> }>; }\n }\n\n return {\n validateCard, validateTmpCard,\n probeSource, probeTmpSource,\n describeTaskExecutorCapabilities,\n updatesInCardStore,\n readFromCardStore,\n };\n}\n","/**\n * card-store-lib-public.ts\n *\n * Platform-free public API for card store read/write operations.\n *\n * Follows the same CommandInput / CommandResult convention as\n * board-live-cards-public.ts. No platform code here — inject a\n * CardAdminStore built from your platform adapter.\n *\n * Usage:\n * import { createCardStorePublic } from './card-store-lib-public.js';\n * import { createCardStore } from './board-live-cards-lib.js';\n * import { createFsCardStorageAdapter } from '../node/storage-fs-adapters.js';\n *\n * const store = createCardStorePublic(\n * createCardStore(createFsCardStorageAdapter(dir))\n * );\n * const result = store.set({ body: card }); // write one card\n * const result = store.set({ body: [c1, c2] }); // write many\n * const result = store.get({ params: { id: 'x' } });\n * const result = store.del({ body: { ids: ['x', 'y'] } });\n */\n\nimport type { CommandInput, CommandResult } from './board-live-cards-public.js';\nimport type { CardAdminStore, LiveCard } from './board-live-cards-lib.js';\n\n// ============================================================================\n// CardStorePublic — public interface\n// ============================================================================\n\nexport interface CardStorePublic {\n /** Read one card (params.id) or all cards. */\n get(input: CommandInput): CommandResult<{ cards: LiveCard[] }>;\n\n /**\n * Write cards into the store.\n * body: single card object { id, ... } or an array of card objects.\n */\n set(input: CommandInput): CommandResult<{ count: number }>;\n\n /**\n * Delete cards by ID.\n * body.ids: string[] — delete several cards at once\n * params.id: string — delete a single card (alternative, can combine with body.ids)\n */\n del(input: CommandInput): CommandResult<{ count: number }>;\n\n /**\n * Patch one card using dot-path assignment.\n * params.id: string\n * params.path: dot path (e.g. \"card_data.form.name\")\n * body.value: value to assign (or body itself if value is omitted)\n */\n patch(input: CommandInput): CommandResult<{ count: number }>;\n}\n\n// ============================================================================\n// createCardStorePublic — factory\n// ============================================================================\n\nexport function createCardStorePublic(store: CardAdminStore): CardStorePublic {\n // Internal result builders mirroring the board-live-cards-public pattern.\n function ok<T>(data: T): CommandResult<T> {\n return { status: 'success', data } as CommandResult<T>;\n }\n function fail<T>(error: string): CommandResult<T> {\n return { status: 'fail', error } as CommandResult<T>;\n }\n function oops<T>(e: unknown): CommandResult<T> {\n return { status: 'error', error: e instanceof Error ? e.message : String(e) } as CommandResult<T>;\n }\n\n return {\n get(input: CommandInput): CommandResult<{ cards: LiveCard[] }> {\n try {\n const id = input.params?.['id'] as string | undefined;\n if (id) {\n const card = store.readCard(id);\n if (!card) return fail(`card \"${id}\" not found`);\n return ok({ cards: [card] });\n }\n return ok({ cards: store.readAllCards() });\n } catch (e) { return oops(e); }\n },\n\n set(input: CommandInput): CommandResult<{ count: number }> {\n try {\n const body = input.body;\n if (body == null) return fail('set requires a body (card object or array of cards)');\n const cards: LiveCard[] = Array.isArray(body) ? body as LiveCard[] : [body as LiveCard];\n for (const card of cards) {\n if (typeof card.id !== 'string') {\n return fail('each card must have a string `id` field');\n }\n store.writeCard(card.id, card);\n }\n return ok({ count: cards.length });\n } catch (e) { return oops(e); }\n },\n\n del(input: CommandInput): CommandResult<{ count: number }> {\n try {\n const bodyIds = (input.body as { ids?: string[] } | undefined)?.ids ?? [];\n const paramId = input.params?.['id'] as string | undefined;\n const ids = paramId ? [...bodyIds, paramId] : bodyIds;\n if (ids.length === 0) return fail('del requires body.ids (string[]) or params.id');\n for (const id of ids) store.removeCard(id);\n return ok({ count: ids.length });\n } catch (e) { return oops(e); }\n },\n\n patch(input: CommandInput): CommandResult<{ count: number }> {\n try {\n const id = input.params?.['id'] as string | undefined;\n const jsonPath = input.params?.['path'] as string | undefined;\n if (!id) return fail('patch requires params.id');\n if (!jsonPath) return fail('patch requires params.path');\n\n const body = input.body as { value?: unknown } | undefined;\n const value = body && Object.prototype.hasOwnProperty.call(body, 'value')\n ? body.value\n : input.body;\n\n store.patchCard(id, jsonPath, value);\n return ok({ count: 1 });\n } catch (e) { return oops(e); }\n },\n };\n}\n","/**\n * artifacts-store-lib.ts\n *\n * Backend-neutral artifact store built on BlobStorage.\n * Supports text + binary content, CRUD, listing, and lightweight metadata.\n */\n\nimport type { BlobStat, BlobStorage } from './storage-interface.js';\n\nexport interface ArtifactInfo {\n key: string;\n size?: number;\n updatedAt?: string;\n contentType?: string;\n}\n\nexport interface ArtifactsStore {\n exists(key: string): boolean;\n putText(key: string, content: string, contentType?: string): ArtifactInfo;\n putBytes(key: string, content: Uint8Array, contentType?: string): ArtifactInfo;\n getText(key: string): string | null;\n getBytes(key: string): Uint8Array | null;\n head(key: string): ArtifactInfo | null;\n list(prefix?: string): ArtifactInfo[];\n remove(key: string): void;\n}\n\nexport interface ChatIndexRecord {\n serial: number;\n role: string;\n stored_name: string;\n path: string;\n updated_at?: string | null;\n}\n\nexport interface ChatRecord extends ChatIndexRecord {\n text: string;\n}\n\nexport interface ChatSignal {\n count: number;\n latest_mtime_ms: number;\n processing: boolean;\n}\n\nexport interface ChatArtifactsStore {\n indexKey(cardPrefix: string): string;\n loadIndex(cardPrefix: string): ChatIndexRecord[];\n saveIndex(cardPrefix: string, records: ChatIndexRecord[]): void;\n nextSerial(cardPrefix: string): number;\n appendIndexRecord(cardPrefix: string, record: ChatIndexRecord): void;\n readRecords(cardPrefix: string): ChatRecord[];\n clear(cardPrefix: string): void;\n readSignal(cardPrefix: string): ChatSignal;\n}\n\nexport interface FileArtifactsStore {\n nextSerial(cardPrefix: string, seedNames?: string[]): number;\n buildStoredName(displayName: string, serial: number, opts?: { maxLen?: number }): string;\n allocateStoredName(cardPrefix: string, displayName: string, opts?: { seedNames?: string[]; maxLen?: number }): string;\n}\n\nexport interface CardFileMetadata {\n name: string;\n stored_name: string;\n size: number | null;\n mime_type: string | null;\n path: string | null;\n uploaded_at: string | null;\n}\n\nexport type CardFileLookupResult =\n | { ok: true; file: CardFileMetadata }\n | { ok: false; reason: 'index_out_of_range' | 'missing_stored_name' | 'stale_reference' };\n\nexport interface CardFileMetadataStore {\n read(cardData: unknown): CardFileMetadata[];\n normalizeIncoming(payloadFiles: unknown, defaultUploadedAt?: string): CardFileMetadata[];\n merge(cardData: Record<string, unknown>, incoming: CardFileMetadata[]): CardFileMetadata[];\n resolve(cardData: unknown, index: number, expectedStoredName?: string | null): CardFileLookupResult;\n}\n\nconst INDEX_KEY = '.artifacts-index.json';\n\ninterface ArtifactIndexEntry {\n key: string;\n size?: number;\n updatedAt?: string;\n contentType?: string;\n}\n\ninterface ArtifactIndex {\n entries: Record<string, ArtifactIndexEntry>;\n}\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nfunction utf8ByteLength(text: string): number {\n return new TextEncoder().encode(text).byteLength;\n}\n\nfunction loadIndex(blob: BlobStorage): ArtifactIndex {\n const raw = blob.read(INDEX_KEY);\n if (!raw) return { entries: {} };\n try {\n const parsed = JSON.parse(raw) as ArtifactIndex;\n if (parsed && parsed.entries && typeof parsed.entries === 'object') return parsed;\n } catch {\n // fall through\n }\n return { entries: {} };\n}\n\nfunction saveIndex(blob: BlobStorage, index: ArtifactIndex): void {\n blob.write(INDEX_KEY, JSON.stringify(index, null, 2));\n}\n\nfunction statToInfo(stat: BlobStat | null): ArtifactInfo | null {\n if (!stat) return null;\n return {\n key: stat.key,\n size: stat.size,\n updatedAt: stat.updatedAt,\n contentType: stat.contentType,\n };\n}\n\nfunction updateIndex(index: ArtifactIndex, key: string, info: ArtifactInfo): void {\n index.entries[key] = {\n key,\n size: info.size,\n updatedAt: info.updatedAt,\n contentType: info.contentType,\n };\n}\n\nfunction parseLeadingSerial(fileName: string): number {\n const m = String(fileName || '').match(/^(\\d+)[-_]/);\n return m ? parseInt(m[1], 10) : 0;\n}\n\nfunction normalizeDisplayFileName(name: string): string {\n const input = String(name || '').trim();\n if (!input) return 'upload.bin';\n const slash = Math.max(input.lastIndexOf('/'), input.lastIndexOf('\\\\'));\n const base = slash >= 0 ? input.slice(slash + 1) : input;\n return base || 'upload.bin';\n}\n\nfunction normalizeStem(rawStem: string): string {\n const normalized = String(rawStem || '')\n .toLowerCase()\n .replace(/\\s+/g, '_')\n .replace(/[^a-z0-9_-]/g, '_')\n .replace(/_+/g, '_')\n .replace(/^_+|_+$/g, '');\n return normalized || 'file';\n}\n\nfunction normalizeExt(rawExt: string): string {\n if (!rawExt || rawExt === '.') return '';\n const extBody = String(rawExt).replace(/^\\./, '').toLowerCase().replace(/[^a-z0-9]/g, '');\n return extBody ? `.${extBody}` : '';\n}\n\nfunction splitBaseExt(name: string): { stem: string; ext: string } {\n const base = normalizeDisplayFileName(name);\n const dot = base.lastIndexOf('.');\n if (dot <= 0 || dot === base.length - 1) return { stem: base, ext: '' };\n return { stem: base.slice(0, dot), ext: base.slice(dot) };\n}\n\nfunction basenameFromKey(key: string): string {\n const slash = key.lastIndexOf('/');\n return slash >= 0 ? key.slice(slash + 1) : key;\n}\n\nexport function createArtifactsStore(blob: BlobStorage): ArtifactsStore {\n function head(key: string): ArtifactInfo | null {\n const fromStat = blob.stat ? statToInfo(blob.stat(key)) : null;\n if (fromStat) return fromStat;\n\n const index = loadIndex(blob);\n const entry = index.entries[key];\n if (entry) return { ...entry };\n\n if (!blob.exists(key)) return null;\n const content = blob.read(key);\n if (content === null) return { key };\n return {\n key,\n size: utf8ByteLength(content),\n };\n }\n\n return {\n exists(key: string): boolean {\n return blob.exists(key);\n },\n\n putText(key: string, content: string, contentType = 'text/plain; charset=utf-8'): ArtifactInfo {\n blob.write(key, content);\n const info = head(key) ?? { key };\n info.contentType = contentType;\n info.updatedAt = info.updatedAt ?? nowIso();\n info.size = info.size ?? utf8ByteLength(content);\n const index = loadIndex(blob);\n updateIndex(index, key, info);\n saveIndex(blob, index);\n return info;\n },\n\n putBytes(key: string, content: Uint8Array, contentType = 'application/octet-stream'): ArtifactInfo {\n if (blob.writeBytes) {\n blob.writeBytes(key, content);\n } else {\n // Fallback for text-only backends.\n const envelope = JSON.stringify({ __kind: 'bytes-array', data: [...content] });\n blob.write(key, envelope);\n }\n const info = head(key) ?? { key };\n info.contentType = contentType;\n info.updatedAt = info.updatedAt ?? nowIso();\n info.size = info.size ?? content.byteLength;\n const index = loadIndex(blob);\n updateIndex(index, key, info);\n saveIndex(blob, index);\n return info;\n },\n\n getText(key: string): string | null {\n const raw = blob.read(key);\n if (raw === null) {\n if (!blob.readBytes) return null;\n const bytes = blob.readBytes(key);\n if (bytes === null) return null;\n return Buffer.from(bytes).toString('utf-8');\n }\n try {\n const parsed = JSON.parse(raw) as { __kind?: string; data?: number[] };\n if (parsed && parsed.__kind === 'bytes-array' && Array.isArray(parsed.data)) {\n return new TextDecoder('utf-8').decode(new Uint8Array(parsed.data));\n }\n } catch {\n // plain text path\n }\n return raw;\n },\n\n getBytes(key: string): Uint8Array | null {\n if (blob.readBytes) {\n const bytes = blob.readBytes(key);\n if (bytes !== null) return bytes;\n }\n const raw = blob.read(key);\n if (raw === null) return null;\n try {\n const parsed = JSON.parse(raw) as { __kind?: string; data?: number[] };\n if (parsed && parsed.__kind === 'bytes-array' && Array.isArray(parsed.data)) {\n return new Uint8Array(parsed.data);\n }\n } catch {\n // plain text path\n }\n return new TextEncoder().encode(raw);\n },\n\n head,\n\n list(prefix = ''): ArtifactInfo[] {\n const infoByKey = new Map<string, ArtifactInfo>();\n\n if (blob.listKeys) {\n for (const key of blob.listKeys(prefix)) {\n if (key === INDEX_KEY) continue;\n const info = head(key) ?? { key };\n infoByKey.set(key, info);\n }\n }\n\n const index = loadIndex(blob);\n for (const [key, entry] of Object.entries(index.entries)) {\n if (key === INDEX_KEY || (prefix && !key.startsWith(prefix))) continue;\n if (!infoByKey.has(key)) infoByKey.set(key, { ...entry });\n }\n\n return [...infoByKey.values()].sort((a, b) => a.key.localeCompare(b.key));\n },\n\n remove(key: string): void {\n blob.remove(key);\n const index = loadIndex(blob);\n delete index.entries[key];\n saveIndex(blob, index);\n },\n };\n}\n\nexport function createChatArtifactsStore(\n store: ArtifactsStore,\n opts?: { indexFileName?: string },\n): ChatArtifactsStore {\n const indexFileName = opts?.indexFileName || '.index.json';\n\n function indexKey(cardPrefix: string): string {\n return `${cardPrefix}/${indexFileName}`;\n }\n\n function loadIndex(cardPrefix: string): ChatIndexRecord[] {\n const raw = store.getText(indexKey(cardPrefix));\n if (!raw) return [];\n try {\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) return [];\n return parsed\n .filter((row) => row && typeof row.stored_name === 'string')\n .map((row) => ({\n serial: Number(row.serial || parseLeadingSerial(String(row.stored_name)) || 0),\n role: String(row.role || 'system').toLowerCase(),\n stored_name: String(row.stored_name),\n path: typeof row.path === 'string' ? row.path : `${cardPrefix}/chats/${String(row.stored_name)}`,\n updated_at: typeof row.updated_at === 'string' ? row.updated_at : null,\n }));\n } catch {\n return [];\n }\n }\n\n function saveIndex(cardPrefix: string, records: ChatIndexRecord[]): void {\n store.putText(indexKey(cardPrefix), JSON.stringify(records, null, 2), 'application/json; charset=utf-8');\n }\n\n function nextSerial(cardPrefix: string): number {\n const index = loadIndex(cardPrefix);\n let maxSeen = 0;\n for (const row of index) {\n const serial = Number(row.serial || 0);\n if (Number.isFinite(serial) && serial > maxSeen) maxSeen = serial;\n }\n return maxSeen + 1;\n }\n\n function appendIndexRecord(cardPrefix: string, record: ChatIndexRecord): void {\n const index = loadIndex(cardPrefix);\n index.push(record);\n saveIndex(cardPrefix, index);\n }\n\n function readRecords(cardPrefix: string): ChatRecord[] {\n const index = loadIndex(cardPrefix);\n const out: ChatRecord[] = [];\n for (const row of index) {\n const key = `${cardPrefix}/${row.stored_name}`;\n const text = store.getText(key);\n if (text === null) continue;\n out.push({\n serial: Number(row.serial || parseLeadingSerial(row.stored_name) || 0),\n role: String(row.role || 'system').toLowerCase(),\n text,\n path: typeof row.path === 'string' ? row.path : `${cardPrefix}/chats/${row.stored_name}`,\n stored_name: row.stored_name,\n updated_at: row.updated_at || null,\n });\n }\n out.sort((a, b) => a.serial - b.serial || a.stored_name.localeCompare(b.stored_name));\n return out;\n }\n\n function clear(cardPrefix: string): void {\n const prefix = `${cardPrefix}/`;\n for (const entry of store.list(prefix)) store.remove(entry.key);\n }\n\n function readSignal(cardPrefix: string): ChatSignal {\n const prefix = `${cardPrefix}/`;\n const entries = store.list(prefix);\n let count = 0;\n let latestMtimeMs = 0;\n let processing = false;\n for (const entry of entries) {\n const name = entry.key.slice(prefix.length);\n if (name === '.processing') {\n processing = true;\n continue;\n }\n if (!/^(\\d+)[-_]([a-z0-9_-]+)\\.txt$/i.test(name)) continue;\n count += 1;\n const mtimeMs = entry.updatedAt ? Number(new Date(entry.updatedAt).getTime() || 0) : 0;\n if (mtimeMs > latestMtimeMs) latestMtimeMs = mtimeMs;\n }\n return { count, latest_mtime_ms: latestMtimeMs, processing };\n }\n\n return {\n indexKey,\n loadIndex,\n saveIndex,\n nextSerial,\n appendIndexRecord,\n readRecords,\n clear,\n readSignal,\n };\n}\n\nexport function createFileArtifactsStore(store: ArtifactsStore): FileArtifactsStore {\n function nextSerial(cardPrefix: string, seedNames?: string[]): number {\n let maxSeen = 0;\n const names: string[] = [];\n if (Array.isArray(seedNames)) names.push(...seedNames);\n for (const entry of store.list(`${cardPrefix}/`)) {\n names.push(basenameFromKey(entry.key));\n }\n for (const name of names) {\n const serial = parseLeadingSerial(name);\n if (Number.isFinite(serial) && serial > maxSeen) maxSeen = serial;\n }\n return maxSeen + 1;\n }\n\n function buildStoredName(displayName: string, serial: number, opts?: { maxLen?: number }): string {\n const maxLen = Number(opts?.maxLen || 32);\n const { stem, ext } = splitBaseExt(displayName);\n const safeExt = normalizeExt(ext);\n const safeStem = normalizeStem(stem);\n const prefix = `${String(serial).padStart(3, '0')}-`;\n\n let keepExt = safeExt;\n let stemBudget = maxLen - prefix.length - keepExt.length;\n if (stemBudget < 1) {\n keepExt = '';\n stemBudget = maxLen - prefix.length;\n }\n\n const outStem = safeStem.slice(0, Math.max(1, stemBudget));\n let out = `${prefix}${outStem}${keepExt}`;\n if (out.length > maxLen) out = out.slice(0, maxLen).replace(/\\.$/, '');\n return out;\n }\n\n function allocateStoredName(cardPrefix: string, displayName: string, opts?: { seedNames?: string[]; maxLen?: number }): string {\n let serial = nextSerial(cardPrefix, opts?.seedNames);\n let out = buildStoredName(displayName, serial, { maxLen: opts?.maxLen });\n while (store.exists(`${cardPrefix}/${out}`)) {\n serial += 1;\n out = buildStoredName(displayName, serial, { maxLen: opts?.maxLen });\n }\n return out;\n }\n\n return {\n nextSerial,\n buildStoredName,\n allocateStoredName,\n };\n}\n\nexport function createCardFileMetadataStore(): CardFileMetadataStore {\n function normalizeIncoming(payloadFiles: unknown, defaultUploadedAt?: string): CardFileMetadata[] {\n if (!Array.isArray(payloadFiles)) return [];\n const out: CardFileMetadata[] = [];\n for (const raw of payloadFiles) {\n if (!raw || typeof raw !== 'object') continue;\n const row = raw as Record<string, unknown>;\n if (typeof row.stored_name !== 'string') continue;\n out.push({\n name: typeof row.name === 'string' ? row.name : row.stored_name,\n stored_name: row.stored_name,\n size: typeof row.size === 'number' && Number.isFinite(row.size) ? row.size : null,\n mime_type: typeof row.mime_type === 'string' ? row.mime_type : null,\n path: typeof row.path === 'string' ? row.path : null,\n uploaded_at: typeof row.uploaded_at === 'string' ? row.uploaded_at : (defaultUploadedAt || null),\n });\n }\n return out;\n }\n\n function read(cardData: unknown): CardFileMetadata[] {\n if (!cardData || typeof cardData !== 'object') return [];\n const row = cardData as Record<string, unknown>;\n return normalizeIncoming(row.files, undefined);\n }\n\n function merge(cardData: Record<string, unknown>, incoming: CardFileMetadata[]): CardFileMetadata[] {\n const existing = read(cardData);\n if (incoming.length === 0) {\n cardData.files = existing;\n return existing;\n }\n const known = new Set(existing.map((f) => f.stored_name));\n for (const file of incoming) {\n if (known.has(file.stored_name)) continue;\n existing.push(file);\n known.add(file.stored_name);\n }\n cardData.files = existing;\n return existing;\n }\n\n function resolve(cardData: unknown, index: number, expectedStoredName?: string | null): CardFileLookupResult {\n const files = read(cardData);\n if (!Number.isInteger(index) || index < 0 || index >= files.length) {\n return { ok: false, reason: 'index_out_of_range' };\n }\n const file = files[index];\n if (!file || !file.stored_name) return { ok: false, reason: 'missing_stored_name' };\n if (expectedStoredName && expectedStoredName !== file.stored_name) {\n return { ok: false, reason: 'stale_reference' };\n }\n return { ok: true, file };\n }\n\n return {\n read,\n normalizeIncoming,\n merge,\n resolve,\n };\n}\n","/**\n * server-runtime/index.ts\n *\n * Platform-free board server runtime.\n *\n * ─────────────────────────────────────────────────────────────────────────────\n * LAYER DIAGRAM\n * ─────────────────────────────────────────────────────────────────────────────\n *\n * HOST (demo-server / Azure Fn / Firebase Fn)\n * ↓ constructs adapters, calls createSingleBoardServerRuntime(options)\n * THIS FILE — routes, contexts, chat/file orchestration\n * ↓ delegates to\n * board-live-cards-public.ts — graph, journal, dispatch (already platform-free)\n *\n * No node:fs, node:net, node:child_process, node:os imports.\n * All platform access flows through injected adapters.\n * ─────────────────────────────────────────────────────────────────────────────\n */\n\nimport {\n createBoardLiveCardsPublic,\n} from '../cli/common/board-live-cards-public.js';\n\nimport { createCardStorePublic } from '../cli/common/card-store-lib-public.js';\nimport { createCardStore } from '../cli/common/board-live-cards-lib.js';\n\nimport {\n createArtifactsStore,\n createChatArtifactsStore,\n createFileArtifactsStore,\n createCardFileMetadataStore,\n} from '../cli/common/artifacts-store-lib.js';\n\nimport type {\n SingleBoardRuntimeOptions,\n MultiBoardRuntimeOptions,\n SingleBoardRuntime,\n MultiBoardRuntime,\n RuntimeRequest,\n RuntimeResponse,\n RuntimeLogger,\n BoardContextConfig,\n InvocationAdapter,\n NotificationTransport,\n} from './types.js';\n\nexport type {\n SingleBoardRuntimeOptions,\n MultiBoardRuntimeOptions,\n SingleBoardRuntime,\n MultiBoardRuntime,\n RuntimeRequest,\n RuntimeResponse,\n RuntimeLogger,\n BoardContextConfig,\n InvocationAdapter,\n NotificationTransport,\n};\n\n// Re-export types for hosts\nexport * from './types.js';\n\nconst DEFAULT_CORS_HEADERS: Record<string, string> = {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Headers': 'content-type,x-file-name',\n 'Access-Control-Allow-Methods': 'GET,POST,PATCH,OPTIONS',\n};\n\nconst MAX_STORED_FILE_NAME_LEN = 32;\n\n// ============================================================================\n// Internal types\n// ============================================================================\n\ninterface BoardContext {\n label: string;\n board: ReturnType<typeof createBoardLiveCardsPublic>;\n cardStore: ReturnType<typeof createCardStorePublic>;\n readonly filesArtifacts: ReturnType<typeof createArtifactsStore>;\n readonly chatsArtifacts: ReturnType<typeof createArtifactsStore>;\n boardAdapter: import('./types.js').BoardPlatformAdapter;\n cardStoreRef: string;\n outputsStoreRef: string;\n notifyRef?: import('./types.js').KindValueRef;\n taskExecutorRef?: import('./types.js').ExecutionRef;\n chatHandlerRef?: import('./types.js').ExecutionRef;\n inferenceAdapterRef?: import('./types.js').ExecutionRef;\n notification: NotificationState;\n notificationTeardown: (() => void) | null;\n initialized: boolean;\n cardsBootstrapped: boolean;\n}\n\ninterface NotificationState {\n status: unknown;\n computedValues: Record<string, unknown>;\n dataObjects: Record<string, unknown>;\n cards: Record<string, unknown>;\n}\n\n// ============================================================================\n// Notification helpers\n// ============================================================================\n\nfunction makeNotificationState(): NotificationState {\n return { status: null, computedValues: {}, dataObjects: {}, cards: {} };\n}\n\nfunction appendNotification(state: NotificationState, event: unknown): void {\n if (!event || typeof event !== 'object') return;\n const e = event as Record<string, unknown>;\n // Unpack notification-batch so individual items update ctx.notification.*\n if (e.kind === 'notification-batch' && Array.isArray(e.notifications)) {\n for (const n of e.notifications) appendNotification(state, n);\n return;\n }\n if (e.kind === 'status') state.status = e.status;\n if (e.kind === 'computed_values' && e.cardId) state.computedValues[e.cardId as string] = e.values;\n if (e.kind === 'data_object' && e.key) state.dataObjects[e.key as string] = e.payload;\n if (e.kind === 'card_refreshed' && e.cardId) state.cards[e.cardId as string] = e.card;\n}\n\n// ============================================================================\n// createSingleBoardServerRuntime\n// ============================================================================\n\nexport function createSingleBoardServerRuntime(options: SingleBoardRuntimeOptions): SingleBoardRuntime {\n const apiBasePath = String(options.apiBasePath || '/api/board').replace(/\\/$/, '');\n const corsHeaders = { ...DEFAULT_CORS_HEADERS, ...(options.corsHeaders || {}) };\n const boardId = options.boardId || '';\n const logger: RuntimeLogger = options.logger || { info: console.log, warn: console.warn, error: console.error };\n const invocationAdapter = options.invocationAdapter;\n const notificationTransport = options.notificationTransport || null;\n const serverUrl = options.serverUrl || null;\n const executionExtra = options.executionExtra || {};\n\n const sseClients = new Set<RuntimeResponse>();\n\n // ── Build board contexts from injected configs ───────────────────────────\n\n function buildContext(cfg: BoardContextConfig): BoardContext {\n const board = createBoardLiveCardsPublic(cfg.baseRef, cfg.boardAdapter);\n const kv = cfg.boardAdapter.kvStorageForRef(cfg.cardStoreRef);\n const cardAdapterObj = {\n readIndex: () => kv.read('_index'),\n writeIndex: (idx: unknown) => kv.write('_index', idx),\n readCard: (id: string) => kv.read(id),\n writeCard: (id: string, card: unknown) => { kv.write(id, card); return id; },\n cardExists: (id: string) => kv.read(id) !== null,\n defaultCardKey: (id: string) => id,\n };\n const cardStore = createCardStorePublic(createCardStore(cardAdapterObj as any, logger.warn));\n const artAdapter = cfg.artifactsAdapter || cfg.boardAdapter;\n\n // Lazy artifact stores — only created on first access (saves ~5KB in bundles\n // that never use chat/file features).\n let _filesArtifacts: ReturnType<typeof createArtifactsStore> | null = null;\n let _chatsArtifacts: ReturnType<typeof createArtifactsStore> | null = null;\n\n return {\n label: cfg.label,\n board,\n cardStore,\n get filesArtifacts() { return _filesArtifacts ??= createArtifactsStore(artAdapter.blobStorage('files')); },\n get chatsArtifacts() { return _chatsArtifacts ??= createArtifactsStore(artAdapter.blobStorage('chats')); },\n boardAdapter: cfg.boardAdapter,\n cardStoreRef: cfg.cardStoreRef,\n outputsStoreRef: cfg.outputsStoreRef,\n notifyRef: cfg.notifyRef,\n taskExecutorRef: cfg.taskExecutorRef,\n chatHandlerRef: cfg.chatHandlerRef,\n inferenceAdapterRef: cfg.inferenceAdapterRef,\n notification: makeNotificationState(),\n notificationTeardown: null,\n initialized: false,\n cardsBootstrapped: false,\n };\n }\n\n const boardContexts: BoardContext[] = options.boards.map(buildContext);\n const cardOwnerIndex = new Map<string, number>();\n\n function ownerIndex(cardId: string): number { return cardOwnerIndex.get(cardId) ?? 0; }\n\n // ── Artifacts stores ─────────────────────────────────────────────────────\n\n function artifactsStores(cardId: string) {\n const ctx = boardContexts[ownerIndex(cardId)];\n return {\n files: ctx ? ctx.filesArtifacts : null,\n chats: ctx ? ctx.chatsArtifacts : null,\n };\n }\n\n function chatArtifactsForCard(cardId: string) {\n const stores = artifactsStores(cardId);\n if (!stores.chats) return null;\n return createChatArtifactsStore(stores.chats, { indexFileName: '.index.json' });\n }\n\n function fileArtifactsForCard(cardId: string) {\n const stores = artifactsStores(cardId);\n if (!stores.files) return null;\n return createFileArtifactsStore(stores.files);\n }\n\n function cardFileMetadataStoreInstance() {\n return createCardFileMetadataStore();\n }\n\n // ── Card ID tracking ─────────────────────────────────────────────────────\n\n function safeCardId(cardId: string): string {\n return String(cardId || '').replace(/[^a-zA-Z0-9_-]/g, '_') || 'unknown-card';\n }\n\n // ── Notification transport ───────────────────────────────────────────────\n\n async function ensureNotificationConsumer(ctx: BoardContext): Promise<void> {\n if (!ctx || ctx.notificationTeardown) return;\n if (!notificationTransport || !ctx.notifyRef) return;\n const teardown = await notificationTransport.subscribe(ctx.notifyRef, (event) => {\n appendNotification(ctx.notification, event);\n // Broadcast incremental notifications to SSE clients so shells can use\n // applyNotification instead of re-deriving the full payload each time.\n const notifications = (event as Record<string, unknown>).kind === 'notification-batch'\n ? (event as Record<string, unknown[]>).notifications as unknown[]\n : [event];\n broadcastNotificationBatchToSseClients(notifications);\n });\n ctx.notificationTeardown = teardown;\n }\n\n // ── Init & bootstrap ─────────────────────────────────────────────────────\n\n async function initContext(ctx: BoardContext): Promise<void> {\n if (!ctx) return;\n if (ctx.initialized) return;\n\n const params = {\n cardStoreRef: ctx.cardStoreRef,\n outputsStoreRef: ctx.outputsStoreRef,\n };\n const body: Record<string, unknown> = {};\n if (ctx.taskExecutorRef) body['task-executor-ref'] = ctx.taskExecutorRef;\n if (ctx.chatHandlerRef) body['chat-handler-ref'] = ctx.chatHandlerRef;\n if (ctx.inferenceAdapterRef) body['inference-adapter-ref'] = ctx.inferenceAdapterRef;\n\n const initResult = ctx.board.init({ params, body });\n if (initResult.status !== 'success') {\n throw Object.assign(\n new Error((initResult as any).error || `init failed for ${ctx.label}`),\n { statusCode: 500 },\n );\n }\n\n await ensureNotificationConsumer(ctx);\n\n // Pre-init validation: describe chat-handler if adapter supports it\n if (ctx.chatHandlerRef && invocationAdapter.describe) {\n try {\n const desc = await invocationAdapter.describe(ctx.chatHandlerRef);\n if (desc && desc.kind !== 'chat-handler') {\n logger.warn(`[init] chat-handler describe returned kind=\"${desc.kind}\", expected \"chat-handler\" for ${ctx.label}`);\n } else if (desc) {\n logger.info(`[init] chat-handler validated: ${desc.name} (protocol ${desc.protocolVersion}) for ${ctx.label}`);\n }\n } catch (err: unknown) {\n logger.warn(`[init] chat-handler describe failed for ${ctx.label}: ${(err as Error)?.message || String(err)}`);\n }\n }\n\n ctx.initialized = true;\n }\n\n function publishPersistedStateSnapshot(ctx: BoardContext): void {\n if (!ctx.boardAdapter.publishBoardChangeNotifications) return;\n const notifications: Array<{ kind: string; [k: string]: unknown }> = [];\n // 1. Status\n const statusResult = ctx.board.status({});\n if (statusResult.status === 'success' && statusResult.data != null) {\n notifications.push({ kind: 'status', status: statusResult.data });\n }\n // 2. All data objects\n const dataResult = ctx.board.getAllOutputsDataObjects({});\n if (dataResult.status === 'success' && dataResult.data != null) {\n for (const [token, payload] of Object.entries(dataResult.data as Record<string, unknown>)) {\n if (token) notifications.push({ kind: 'data_object', key: token, payload });\n }\n }\n // 3. All computed values\n const cvResult = ctx.board.getAllOutputsComputedValues({});\n if (cvResult.status === 'success' && cvResult.data != null) {\n for (const [cardId, values] of Object.entries(cvResult.data as Record<string, unknown>)) {\n if (cardId) notifications.push({ kind: 'computed_values', cardId, values });\n }\n }\n if (notifications.length > 0) {\n ctx.boardAdapter.publishBoardChangeNotifications(notifications as import('../cli/common/board-live-cards-public.js').BoardChangeNotification[]);\n }\n }\n\n function upsertCardsFromSource(ctx: BoardContext, ctxIndex: number): void {\n if (!ctx) return;\n if (ctx.cardsBootstrapped) return;\n const result = ctx.cardStore.get({});\n const cards: Array<Record<string, unknown>> = (result.status === 'success' && Array.isArray((result as any).data?.cards))\n ? (result as any).data.cards\n : [];\n for (const card of cards) {\n if (typeof card.id !== 'string') continue;\n cardOwnerIndex.set(card.id as string, ctxIndex);\n ctx.board.upsertCard({ params: { cardId: card.id as string } });\n }\n ctx.cardsBootstrapped = true;\n }\n\n async function initBoardAndSetup(): Promise<void> {\n for (const ctx of boardContexts) {\n await initContext(ctx);\n }\n }\n\n async function bootstrapBoard(): Promise<void> {\n await initBoardAndSetup();\n for (let i = 0; i < boardContexts.length; i++) {\n // Publish persisted state snapshot first — gives clients the last-known\n // state immediately via SSE before any async drain completes.\n publishPersistedStateSnapshot(boardContexts[i]);\n upsertCardsFromSource(boardContexts[i], i);\n }\n }\n\n // ── Card reads ───────────────────────────────────────────────────────────\n\n function cardContextForCard(cardId: string): BoardContext | null {\n return boardContexts[ownerIndex(cardId)] ?? null;\n }\n\n function readCardFromStore(cardId: string): Record<string, unknown> | null {\n const ctx = cardContextForCard(cardId);\n if (!ctx) return null;\n const result = ctx.cardStore.get({ params: { id: cardId } });\n if (result.status !== 'success') return null;\n const cards = Array.isArray((result as any).data?.cards) ? (result as any).data.cards : [];\n return cards.length > 0 ? cards[0] : null;\n }\n\n function readCardDefinitions(): Array<Record<string, unknown>> {\n const fromCtx = (ctx: BoardContext | null): Array<Record<string, unknown>> => {\n if (!ctx || !ctx.cardStore) return [];\n const result = ctx.cardStore.get({});\n if (result.status !== 'success' || !Array.isArray((result as any).data?.cards)) {\n return [];\n }\n return (result as any).data.cards;\n };\n const all: Array<Record<string, unknown>> = [];\n for (const ctx of boardContexts) {\n all.push(...fromCtx(ctx));\n }\n return all;\n }\n\n // ── Status & runtime artifacts ───────────────────────────────────────────\n\n function readStatusSnapshot(): unknown {\n const statuses = boardContexts.map((ctx) => {\n try {\n const kv = ctx.boardAdapter.kvStorageForRef(ctx.outputsStoreRef);\n const persisted = kv.read('status');\n if (persisted !== null && persisted !== undefined) return persisted;\n } catch {\n // Fall back to notification memory if direct KV read fails.\n }\n return ctx.notification.status;\n }).filter(Boolean);\n if (statuses.length === 0) return null;\n if (statuses.length === 1) return statuses[0];\n\n // Merge multiple board statuses into a single snapshot\n const mergedCards: unknown[] = [];\n const summaryKeys = ['completed', 'eligible', 'pending', 'blocked', 'unresolved', 'failed', 'in_progress', 'orphan_cards'];\n const totals: Record<string, number> = {};\n for (const k of summaryKeys) totals[k] = 0;\n\n for (const status of statuses) {\n const obj = status as Record<string, unknown>;\n const cards = Array.isArray(obj.cards) ? obj.cards : [];\n mergedCards.push(...cards);\n for (const k of summaryKeys) {\n totals[k] += Number((obj as any)?.summary?.[k] || 0);\n }\n }\n\n const first = statuses[0] as Record<string, unknown>;\n return {\n ...first,\n cards: mergedCards,\n summary: {\n ...((first.summary || {}) as Record<string, unknown>),\n card_count: mergedCards.length,\n ...totals,\n },\n };\n }\n\n function readCardRuntimeArtifacts(): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n const process = (ctx: BoardContext) => {\n for (const [cardId, values] of Object.entries(ctx.notification.computedValues)) {\n const card = ctx.notification.cards[cardId] as Record<string, unknown> | undefined;\n out[cardId] = {\n schema_version: 'v1',\n card_id: cardId,\n card_data: card?.card_data ?? {},\n computed_values: values ?? {},\n };\n }\n };\n for (const ctx of boardContexts) process(ctx);\n return out;\n }\n\n function readDataObjectsByToken(): Record<string, unknown> {\n const merged: Record<string, unknown> = {};\n for (const ctx of boardContexts) {\n Object.assign(merged, ctx.notification.dataObjects || {});\n }\n return merged;\n }\n\n function readChatSignal(cardId: string): { count: number; latest_mtime_ms: number; processing: boolean } {\n const sid = safeCardId(cardId);\n const chatStore = chatArtifactsForCard(cardId);\n if (!chatStore) return { count: 0, latest_mtime_ms: 0, processing: false };\n return chatStore.readSignal(sid);\n }\n\n function buildPublishedRuntimePayload(): unknown {\n const cardDefinitions = readCardDefinitions();\n const rawArtifacts = readCardRuntimeArtifacts();\n const dataObjectsByToken = readDataObjectsByToken();\n const cardRuntimeById: Record<string, unknown> = {};\n\n for (const cardDef of cardDefinitions) {\n if (!cardDef?.id) continue;\n const id = cardDef.id as string;\n const raw = (rawArtifacts[id] || {}) as Record<string, unknown>;\n const chatSignal = readChatSignal(id);\n const cardData: Record<string, unknown> = {\n ...((raw.card_data && typeof raw.card_data === 'object' ? raw.card_data\n : cardDef.card_data && typeof cardDef.card_data === 'object' ? cardDef.card_data\n : {}) as Record<string, unknown>),\n __chat_signal: chatSignal,\n };\n cardRuntimeById[id] = {\n schema_version: raw.schema_version || 'v1',\n card_id: raw.card_id || id,\n card_data: cardData,\n computed_values: raw.computed_values && typeof raw.computed_values === 'object' ? raw.computed_values : {},\n };\n }\n\n return {\n boardId,\n cardDefinitions,\n statusSnapshot: readStatusSnapshot(),\n dataObjectsByToken,\n cardRuntimeById,\n };\n }\n\n // ── Card mutations ───────────────────────────────────────────────────────\n\n function mutateCard(cardId: string, updateFn: (card: Record<string, unknown>) => Record<string, unknown> | void, opts?: { syncBoard?: boolean }): void {\n const syncBoard = opts?.syncBoard !== false;\n const ctx = cardContextForCard(cardId);\n if (!ctx) throw Object.assign(new Error(`Card not found: ${cardId}`), { statusCode: 404 });\n\n const card = readCardFromStore(cardId);\n if (!card) throw Object.assign(new Error(`Card not found: ${cardId}`), { statusCode: 404 });\n\n const nextCard = updateFn(card) || card;\n const setResult = ctx.cardStore.set({ body: nextCard });\n if (setResult.status !== 'success') {\n throw Object.assign(new Error((setResult as any).error || `Failed to persist card: ${cardId}`), { statusCode: 500 });\n }\n\n if (syncBoard) {\n const upsertResult = ctx.board.upsertCard({ params: { cardId, restart: true } });\n if (upsertResult.status !== 'success') {\n throw Object.assign(new Error((upsertResult as any).error || `Failed to upsert card: ${cardId}`), { statusCode: 500 });\n }\n }\n }\n\n function updateCard(cardId: string, updateFn: (card: Record<string, unknown>) => Record<string, unknown> | void): void {\n mutateCard(cardId, updateFn, { syncBoard: true });\n }\n\n function updateCardLocalOnly(cardId: string, updateFn: (card: Record<string, unknown>) => Record<string, unknown> | void): void {\n mutateCard(cardId, updateFn, { syncBoard: false });\n }\n\n function patchCard(cardId: string, patch: Record<string, unknown>): void {\n updateCard(cardId, (card) => {\n if (!patch || typeof patch !== 'object' || Object.keys(patch).length === 0) return card;\n\n function deepSet(obj: Record<string, unknown>, dottedPath: string, value: unknown): void {\n const parts = String(dottedPath || '').split('.').filter(Boolean);\n if (!parts.length) return;\n let target = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n const key = parts[i];\n if (!target[key] || typeof target[key] !== 'object') target[key] = {};\n target = target[key] as Record<string, unknown>;\n }\n target[parts[parts.length - 1]] = value;\n }\n\n if (patch.fieldValues && typeof patch.fieldValues === 'object') {\n let writeTo: string | null = null;\n const view = card.view as Record<string, unknown> | undefined;\n if (view && Array.isArray(view.elements)) {\n for (const elem of view.elements) {\n if (elem?.data && (elem as any).data.writeTo) { writeTo = (elem as any).data.writeTo; break; }\n }\n }\n if (writeTo) {\n deepSet(card, writeTo, patch.fieldValues);\n } else {\n card.card_data = { ...((card.card_data || {}) as Record<string, unknown>), ...(patch.fieldValues as Record<string, unknown>) };\n }\n } else if (Array.isArray(patch._stagedFiles) && (patch._stagedFiles as unknown[]).length > 0) {\n return card;\n } else {\n for (const [key, value] of Object.entries(patch)) {\n if (key === '_stagedFiles') continue;\n if (value !== null && typeof value === 'object' && !Array.isArray(value) &&\n card[key] !== null && typeof card[key] === 'object' && !Array.isArray(card[key])) {\n card[key] = { ...(card[key] as Record<string, unknown>), ...(value as Record<string, unknown>) };\n } else {\n card[key] = value;\n }\n }\n }\n return card;\n });\n }\n\n // ── Chat & file operations ───────────────────────────────────────────────\n\n function parseLeadingSerial(fileName: string): number {\n const m = String(fileName || '').match(/^(\\d+)[-_]/);\n return m ? parseInt(m[1], 10) : 0;\n }\n\n function normalizeDisplayFileName(name: string): string {\n const input = String(name || '').trim();\n if (!input) return 'upload.bin';\n // Extract basename: take last segment after / or \\\n const lastSlash = Math.max(input.lastIndexOf('/'), input.lastIndexOf('\\\\'));\n const base = lastSlash >= 0 ? input.slice(lastSlash + 1) : input;\n return base || 'upload.bin';\n }\n\n function clearChatRecords(cardId: string): void {\n const sid = safeCardId(cardId);\n const chatStore = chatArtifactsForCard(cardId);\n if (!chatStore) return;\n chatStore.clear(sid);\n }\n\n function nextChatStoredName(cardId: string, role: string): string {\n const sid = safeCardId(cardId);\n const chatStore = chatArtifactsForCard(cardId);\n const serial = chatStore ? chatStore.nextSerial(sid) : 1;\n const safeRole = String(role || 'system').toLowerCase().replace(/[^a-z0-9_-]/g, '_') || 'system';\n return `${String(serial).padStart(3, '0')}_${safeRole}.txt`;\n }\n\n function writeChatRecord(cardId: string, role: string, text: string, files: Array<Record<string, unknown>>): Record<string, unknown> {\n const now = new Date().toISOString();\n const sid = safeCardId(cardId);\n const stores = artifactsStores(cardId);\n const outName = nextChatStoredName(cardId, role || 'system');\n const artifactKey = `${sid}/${outName}`;\n\n const lines: string[] = [];\n const msg = typeof text === 'string' ? text.trim() : '';\n if (msg) lines.push(msg);\n\n const fileList = Array.isArray(files) ? files : [];\n if (fileList.length) {\n if (lines.length) lines.push('');\n lines.push('files:');\n for (const file of fileList) {\n if (!file || typeof file !== 'object') continue;\n const display = typeof file.name === 'string' ? file.name : 'file';\n const stored = typeof file.stored_name === 'string' ? file.stored_name : '';\n lines.push(stored ? `- ${display} -> ${stored}` : `- ${display}`);\n }\n }\n\n if (stores.chats) stores.chats.putText(artifactKey, `${lines.join('\\n')}\\n`);\n const serial = parseLeadingSerial(outName);\n const chatStore = chatArtifactsForCard(cardId);\n if (chatStore) {\n chatStore.appendIndexRecord(sid, {\n serial,\n role: role || 'system',\n stored_name: outName,\n path: `${cardId}/chats/${outName}`,\n updated_at: now,\n });\n }\n return { at: now, role: role || 'system', text: msg, files: fileList, path: `${cardId}/chats/${outName}` };\n }\n\n function readChatRecords(cardId: string): Array<Record<string, unknown>> {\n const sid = safeCardId(cardId);\n const chatStore = chatArtifactsForCard(cardId);\n if (!chatStore) return [];\n return chatStore.readRecords(sid).map((row) => ({\n ...row,\n path: `${cardId}/chats/${row.stored_name}`,\n }));\n }\n\n function readCardStoredFileNames(cardId: string): string[] {\n const names: string[] = [];\n try {\n const card = readCardFromStore(cardId);\n if (!card) return names;\n const metadata = cardFileMetadataStoreInstance().read(card.card_data && typeof card.card_data === 'object' ? card.card_data : null);\n for (const entry of metadata) names.push((entry as any).stored_name);\n } catch { /* ignore */ }\n return names;\n }\n\n function persistUploadedFile(cardId: string, requestedName: string, contentType: string, buffer: Uint8Array): Record<string, unknown> {\n const sid = safeCardId(cardId);\n const stores = artifactsStores(cardId);\n const displayName = normalizeDisplayFileName(requestedName);\n const fileStore = fileArtifactsForCard(cardId);\n const storedName = fileStore\n ? fileStore.allocateStoredName(sid, displayName, {\n seedNames: readCardStoredFileNames(cardId),\n maxLen: MAX_STORED_FILE_NAME_LEN,\n })\n : `${String(Date.now())}-${displayName}`;\n\n if (stores.files) {\n stores.files.putBytes(`${sid}/${storedName}`, new Uint8Array(buffer), contentType || 'application/octet-stream');\n }\n\n return {\n name: displayName,\n stored_name: storedName,\n size: buffer.length,\n mime_type: contentType || 'application/octet-stream',\n path: `${cardId}/files/${storedName}`,\n uploaded_at: new Date().toISOString(),\n };\n }\n\n // ── Chat handler invocation ──────────────────────────────────────────────\n\n function invokeChatHandler(cardId: string, chatsKeyPrefix: string, lastChatFile: string): void {\n const ctx = cardContextForCard(cardId);\n if (!ctx) return;\n\n const cfgResult = ctx.board.getConfig({ params: { key: 'chat-handler' } });\n if (cfgResult.status !== 'success') return;\n const handlerRef = (cfgResult as any).data?.value;\n if (!handlerRef || typeof handlerRef !== 'object') return;\n\n const sid = safeCardId(cardId);\n const stores = artifactsStores(cardId);\n const processingMarkerKey = `${sid}/.processing`;\n try { stores.chats?.putText(processingMarkerKey, '', 'text/plain; charset=utf-8'); } catch {}\n\n const args: Record<string, unknown> = {\n boardId,\n cardId: String(cardId),\n chatsKeyPrefix,\n chatProcessingMarkerKey: processingMarkerKey,\n lastChatFile,\n ...executionExtra,\n ...(serverUrl ? { serverUrl } : {}),\n };\n\n invocationAdapter.invoke(handlerRef, args).then(\n (result) => {\n if (result.dispatched) {\n logger.info(`[chat-handler] invoked for card \"${cardId}\" (boardId: \"${boardId}\")`);\n } else {\n try { stores.chats?.remove(processingMarkerKey); } catch {}\n logger.warn(`[chat-handler] dispatch failed for card \"${cardId}\": ${result.error || 'unknown'}`);\n }\n },\n (err) => {\n try { stores.chats?.remove(processingMarkerKey); } catch {}\n logger.warn(`[chat-handler] invoke failed for card \"${cardId}\": ${err?.message || String(err)}`);\n },\n );\n }\n\n // ── Card actions ─────────────────────────────────────────────────────────\n\n function applyCardAction(cardId: string, actionType: string, payload: Record<string, unknown> | null): void {\n const persistCard = actionType === 'chat-send' ? updateCardLocalOnly : updateCard;\n let chatHandlerResult: { chatsKeyPrefix: string; lastChatFile: string } | undefined;\n\n persistCard(cardId, (card) => {\n const now = new Date().toISOString();\n const cardData = card.card_data && typeof card.card_data === 'object' ? card.card_data as Record<string, unknown> : {};\n card.card_data = cardData;\n\n if (actionType === 'chat-send') {\n const text = payload && typeof payload.text === 'string' ? payload.text.trim() : '';\n const files: Array<Record<string, unknown>> = [];\n if (Array.isArray(payload?.files)) {\n for (const f of payload.files as unknown[]) {\n if (!f) continue;\n if (typeof f === 'string') { files.push({ name: f }); continue; }\n if (typeof f === 'object') {\n const fo = f as Record<string, unknown>;\n if (typeof fo.name === 'string') files.push({ name: fo.name, size: fo.size, mime_type: fo.mime_type, path: fo.path, uploaded_at: fo.uploaded_at, stored_name: fo.stored_name });\n }\n }\n }\n\n if (text || files.length > 0) {\n const sid = safeCardId(cardId);\n const userRecord = writeChatRecord(cardId, 'user', text, files);\n const recPath = userRecord.path as string;\n const lastSeg = recPath.includes('/') ? recPath.slice(recPath.lastIndexOf('/') + 1) : recPath;\n chatHandlerResult = { chatsKeyPrefix: `${sid}/chats`, lastChatFile: lastSeg };\n for (const file of files) {\n if (!file || typeof file !== 'object') continue;\n const display = typeof file.name === 'string' ? file.name : 'file';\n const stored = typeof file.stored_name === 'string' ? file.stored_name : null;\n if (!stored) continue;\n writeChatRecord(cardId, 'system', `File ${display} uploaded as ${stored}.`, []);\n }\n }\n return card;\n }\n\n if (actionType === 'file-upload') {\n const files = cardFileMetadataStoreInstance().normalizeIncoming(payload?.files, now);\n if (files.length > 0) cardFileMetadataStoreInstance().merge(cardData, files);\n return card;\n }\n\n if (actionType === 'action') {\n const buttonId = payload && typeof payload.buttonId === 'string' ? payload.buttonId : '';\n if (!buttonId) return card;\n cardData.lastAction = { buttonId, at: now };\n cardData.lastActionText = `${buttonId} @ ${now}`;\n }\n\n return card;\n });\n\n if (chatHandlerResult) {\n invokeChatHandler(cardId, chatHandlerResult.chatsKeyPrefix, chatHandlerResult.lastChatFile);\n }\n }\n\n // ── HTTP helpers ─────────────────────────────────────────────────────────\n\n function json(res: RuntimeResponse, status: number, payload: unknown): void {\n const body = JSON.stringify(payload);\n const byteLen = typeof Buffer !== 'undefined' ? Buffer.byteLength(body) : new TextEncoder().encode(body).length;\n res.writeHead(status, {\n ...corsHeaders,\n 'Content-Type': 'application/json; charset=utf-8',\n 'Content-Length': byteLen,\n });\n res.end(body);\n }\n\n async function readJsonBody(req: RuntimeRequest): Promise<Record<string, unknown>> {\n const chunks: Array<Buffer | Uint8Array> = [];\n for await (const c of req) chunks.push(c);\n const raw = typeof Buffer !== 'undefined'\n ? Buffer.concat(chunks as Buffer[]).toString('utf-8').trim()\n : new TextDecoder().decode(concatUint8Arrays(chunks as Uint8Array[])).trim();\n if (!raw) return {};\n return JSON.parse(raw);\n }\n\n async function readRawBody(req: RuntimeRequest): Promise<Uint8Array> {\n const chunks: Array<Buffer | Uint8Array> = [];\n for await (const c of req) chunks.push(c);\n if (typeof Buffer !== 'undefined') return Buffer.concat(chunks as Buffer[]);\n return concatUint8Arrays(chunks as Uint8Array[]);\n }\n\n function concatUint8Arrays(arrays: Uint8Array[]): Uint8Array {\n const totalLen = arrays.reduce((acc, a) => acc + a.length, 0);\n const result = new Uint8Array(totalLen);\n let offset = 0;\n for (const a of arrays) { result.set(a, offset); offset += a.length; }\n return result;\n }\n\n // ── SSE ──────────────────────────────────────────────────────────────────\n\n let sseEventId = 0;\n\n function buildSseFrame(payload: unknown): string {\n const jsonStr = JSON.stringify(payload);\n sseEventId++;\n return `id: ${sseEventId}\\ndata: ${jsonStr}\\n\\n`;\n }\n\n function broadcastNotificationBatchToSseClients(notifications: unknown[]): void {\n if (!notifications || notifications.length === 0) return;\n const frame = buildSseFrame({ kind: 'notification-batch', notifications });\n for (const client of sseClients) {\n try { client.write(frame); } catch { sseClients.delete(client); }\n }\n }\n\n function handleSse(req: RuntimeRequest, res: RuntimeResponse): void {\n res.writeHead(200, {\n ...corsHeaders,\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n });\n sseClients.add(res);\n\n // On reconnect, Last-Event-ID tells us the client's last received id.\n // We always send the current full snapshot (replay = latest state).\n const payload = buildPublishedRuntimePayload();\n const frame = buildSseFrame(payload);\n res.write(frame);\n\n const keepAlive = setInterval(() => {\n try { res.write(': keepalive\\n\\n'); } catch { /* ignore */ }\n }, 15_000);\n req.on('close', () => {\n clearInterval(keepAlive);\n sseClients.delete(res);\n res.end();\n });\n }\n\n // ── Route handler ────────────────────────────────────────────────────────\n\n async function handleRuntimeApi(req: RuntimeRequest, res: RuntimeResponse, parsedUrl: URL): Promise<boolean> {\n const method = req.method || 'GET';\n const url = parsedUrl;\n const p = url.pathname;\n\n try {\n if (method === 'GET' && p === `${apiBasePath}/init-board`) {\n await initBoardAndSetup();\n json(res, 200, buildPublishedRuntimePayload());\n return true;\n }\n\n if (method === 'GET' && p === `${apiBasePath}/sse`) {\n await bootstrapBoard();\n handleSse(req, res);\n return true;\n }\n\n if (method === 'GET' && p === `${apiBasePath}/board-status`) {\n json(res, 200, buildPublishedRuntimePayload());\n return true;\n }\n\n const cardMatch = p.match(new RegExp(`^${escapeRegExp(apiBasePath)}/cards/([^/]+)$`));\n if (method === 'PATCH' && cardMatch) {\n await bootstrapBoard();\n const cardId = decodeURIComponent(cardMatch[1]);\n const body = await readJsonBody(req);\n patchCard(cardId, body);\n // No immediate broadcast — patchCard triggers an async drain that will\n // produce card_refreshed + other notifications via the transport subscription.\n json(res, 200, { ok: true });\n return true;\n }\n\n const cardActionMatch = p.match(new RegExp(`^${escapeRegExp(apiBasePath)}/cards/([^/]+)/actions$`));\n if (method === 'POST' && cardActionMatch) {\n await bootstrapBoard();\n const cardId = decodeURIComponent(cardActionMatch[1]);\n const body = await readJsonBody(req);\n applyCardAction(cardId, body?.actionType as string, body?.payload as Record<string, unknown> | null);\n json(res, 200, { ok: true });\n return true;\n }\n\n const cardChatsMatch = p.match(new RegExp(`^${escapeRegExp(apiBasePath)}/cards/([^/]+)/chats$`));\n if (method === 'GET' && cardChatsMatch) {\n await bootstrapBoard();\n const cardId = decodeURIComponent(cardChatsMatch[1]);\n json(res, 200, { ok: true, messages: readChatRecords(cardId) });\n return true;\n }\n\n const cardFileMatch = p.match(new RegExp(`^${escapeRegExp(apiBasePath)}/cards/([^/]+)/files$`));\n if (method === 'POST' && cardFileMatch) {\n await bootstrapBoard();\n const cardId = decodeURIComponent(cardFileMatch[1]);\n const inChat = String(url.searchParams.get('inChat') || '').toLowerCase() === 'true';\n const encodedName = req.headers['x-file-name'];\n const contentType = String(req.headers['content-type'] || 'application/octet-stream');\n const rawName = Array.isArray(encodedName) ? encodedName[0] : encodedName;\n const requestedName = rawName ? decodeURIComponent(String(rawName)) : 'upload.bin';\n const body = await readRawBody(req);\n if (!body.length) { json(res, 400, { error: 'Empty upload body' }); return true; }\n\n const file = persistUploadedFile(cardId, requestedName, contentType, body);\n if (inChat) {\n updateCardLocalOnly(cardId, (card) => {\n const now = new Date().toISOString();\n const cardData = card.card_data && typeof card.card_data === 'object' ? card.card_data as Record<string, unknown> : {};\n card.card_data = cardData;\n const incoming = cardFileMetadataStoreInstance().normalizeIncoming([{\n name: file.name, stored_name: file.stored_name, size: file.size,\n mime_type: file.mime_type, path: file.path, uploaded_at: file.uploaded_at || now,\n }], now);\n cardFileMetadataStoreInstance().merge(cardData, incoming);\n return card;\n });\n writeChatRecord(cardId, 'system', `file uploaded: ${file.name} as ${file.stored_name}`, []);\n }\n json(res, 200, { ok: true, file });\n return true;\n }\n\n const cardFileDownloadMatch = p.match(new RegExp(`^${escapeRegExp(apiBasePath)}/cards/([^/]+)/files/(\\\\d+)$`));\n if (method === 'GET' && cardFileDownloadMatch) {\n const cardId = decodeURIComponent(cardFileDownloadMatch[1]);\n const idx = parseInt(cardFileDownloadMatch[2], 10);\n const expectedStoredName = url.searchParams.get('sn');\n const card = readCardFromStore(cardId);\n if (!card) { json(res, 404, { error: 'Card not found' }); return true; }\n\n const resolved = cardFileMetadataStoreInstance().resolve(card.card_data, idx, expectedStoredName);\n if (!resolved.ok && (resolved as any).reason === 'stale_reference') {\n json(res, 409, { error: 'File reference is stale. Refresh and try again.' });\n return true;\n }\n if (!resolved.ok) { json(res, 404, { error: 'File not found' }); return true; }\n\n const fileRecord = (resolved as any).file;\n const sid = safeCardId(cardId);\n const stores = artifactsStores(cardId);\n const fileKey = `${sid}/${fileRecord.stored_name}`;\n const bytes = stores.files ? stores.files.getBytes(fileKey) : null;\n if (!bytes) { json(res, 404, { error: 'File not found' }); return true; }\n\n const filename = fileRecord.name || fileRecord.stored_name;\n const mimeType = fileRecord.mime_type || 'application/octet-stream';\n res.writeHead(200, {\n 'Content-Type': mimeType,\n 'Content-Disposition': `attachment; filename=\"${filename}\"`,\n 'Content-Length': bytes.length,\n });\n res.end(bytes as unknown as Buffer);\n return true;\n }\n\n return false;\n } catch (err: unknown) {\n const statusCode = (err as any)?.statusCode || 500;\n json(res, statusCode, { error: String((err as Error)?.message || err) });\n return true;\n }\n }\n\n return {\n get apiBasePath() { return apiBasePath; },\n get corsHeaders() { return corsHeaders; },\n handleRuntimeApi,\n buildPublishedRuntimePayload,\n clearChatRecords,\n reportSourceFetched(token: string, ref: string) {\n const ctx = boardContexts[0];\n if (!ctx) return { status: 'fail', error: 'no board context' };\n return ctx.board.sourceDataFetched({ params: { token, ref } });\n },\n reportSourceFetchFailure(token: string, reason: string) {\n const ctx = boardContexts[0];\n if (!ctx) return { status: 'fail', error: 'no board context' };\n return ctx.board.sourceDataFetchFailure({ params: { token, reason } });\n },\n get cardStore() { return boardContexts[0]?.cardStore ?? { set() { return { status: 'fail', error: 'no board context' }; } }; },\n };\n}\n\n// ============================================================================\n// createMultiBoardServerRuntime\n// ============================================================================\n\nexport function createMultiBoardServerRuntime(options: MultiBoardRuntimeOptions): MultiBoardRuntime {\n const apiBasePath = String(options.apiBasePath || '/api/boards').replace(/\\/$/, '');\n const corsHeaders = { ...DEFAULT_CORS_HEADERS, ...(options.corsHeaders || {}) };\n const serverMetaStore = options.serverMetaStore;\n const boardRuntimeFactory = options.boardRuntimeFactory;\n const boardServiceCache = new Map<string, SingleBoardRuntime>();\n\n const boardsRegistryKey = 'boards-config.json';\n\n function readBoardsConfig(): { boards: Array<Record<string, unknown>> } {\n const raw = serverMetaStore.getText(boardsRegistryKey);\n if (!raw) return { boards: [{ id: 'default', label: 'Default Board' }] };\n try { return JSON.parse(raw); } catch { return { boards: [{ id: 'default', label: 'Default Board' }] }; }\n }\n\n function writeBoardsConfig(config: unknown): void {\n serverMetaStore.putText(boardsRegistryKey, JSON.stringify(config, null, 2));\n }\n\n function safeBoardId(raw: unknown): string | null {\n const sanitized = String(raw || '').replace(/[^a-zA-Z0-9_-]/g, '_').replace(/^_+|_+$/g, '');\n return sanitized.length > 0 && sanitized.length <= 64 ? sanitized : null;\n }\n\n function getBoardService(boardId: string): SingleBoardRuntime {\n if (boardServiceCache.has(boardId)) return boardServiceCache.get(boardId)!;\n const config = readBoardsConfig();\n const entry = config.boards.find((b) => b.id === boardId) || {};\n const service = boardRuntimeFactory(boardId, entry);\n boardServiceCache.set(boardId, service);\n return service;\n }\n\n function json(res: RuntimeResponse, status: number, payload: unknown): void {\n const body = JSON.stringify(payload);\n const byteLen = typeof Buffer !== 'undefined' ? Buffer.byteLength(body) : new TextEncoder().encode(body).length;\n res.writeHead(status, {\n ...corsHeaders,\n 'Content-Type': 'application/json; charset=utf-8',\n 'Content-Length': byteLen,\n });\n res.end(body);\n }\n\n async function handleBoardsRegistryApi(req: RuntimeRequest, res: RuntimeResponse, parsedUrl: URL): Promise<boolean> {\n const method = req.method || 'GET';\n const p = parsedUrl.pathname;\n\n if (method === 'GET' && p === apiBasePath) {\n json(res, 200, { ok: true, boards: readBoardsConfig().boards });\n return true;\n }\n\n if (method === 'POST' && p === apiBasePath) {\n const chunks: Array<Buffer | Uint8Array> = [];\n for await (const c of req) chunks.push(c);\n const raw = typeof Buffer !== 'undefined'\n ? Buffer.concat(chunks as Buffer[]).toString('utf-8').trim()\n : new TextDecoder().decode(concatUint8Arrays(chunks as Uint8Array[])).trim();\n let body: Record<string, unknown> = {};\n try { body = raw ? JSON.parse(raw) : {}; } catch { body = {}; }\n\n const id = safeBoardId(body.id);\n if (!id) { json(res, 400, { error: 'board id must be 1-64 alphanumeric/dash/underscore characters' }); return true; }\n\n const config = readBoardsConfig();\n if (config.boards.some((b) => b.id === id)) { json(res, 409, { error: `Board \"${id}\" is already registered` }); return true; }\n\n const label = typeof body.label === 'string' && body.label.trim() ? body.label.trim() : id;\n const entry: Record<string, unknown> = { id, label };\n for (const [key, val] of Object.entries(body)) {\n if (key === 'id' || key === 'label') continue;\n if (val !== undefined && val !== null) entry[key] = val;\n }\n config.boards.push(entry);\n writeBoardsConfig(config);\n json(res, 200, { ok: true, board: entry });\n return true;\n }\n\n return false;\n }\n\n async function handleBoardApi(req: RuntimeRequest, res: RuntimeResponse, parsedUrl: URL): Promise<boolean> {\n const p = parsedUrl.pathname;\n const boardSegMatch = p.match(new RegExp(`^${escapeRegExp(apiBasePath)}/([^/]+)(/|$)`));\n if (!boardSegMatch) return false;\n\n const boardId = safeBoardId(decodeURIComponent(boardSegMatch[1]));\n if (!boardId) { json(res, 400, { error: 'Invalid board id' }); return true; }\n\n const config = readBoardsConfig();\n if (!config.boards.some((b) => b.id === boardId)) {\n json(res, 404, { error: `Board \"${boardId}\" not registered. POST ${apiBasePath} with {id} to register it first.` });\n return true;\n }\n\n const service = getBoardService(boardId);\n if (await service.handleRuntimeApi(req, res, parsedUrl)) return true;\n return false;\n }\n\n async function handleApi(req: RuntimeRequest, res: RuntimeResponse, parsedUrl: URL): Promise<boolean> {\n if (await handleBoardsRegistryApi(req, res, parsedUrl)) return true;\n if (await handleBoardApi(req, res, parsedUrl)) return true;\n return false;\n }\n\n function requireBoardService(boardId: string): { service: SingleBoardRuntime } {\n const config = readBoardsConfig();\n if (!config.boards.some((b) => b.id === boardId)) {\n throw Object.assign(new Error(`Board \"${boardId}\" not registered`), { statusCode: 404 });\n }\n return { service: getBoardService(boardId) };\n }\n\n return {\n get apiBasePath() { return apiBasePath; },\n get corsHeaders() { return corsHeaders; },\n handleApi,\n requireBoardService,\n };\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction escapeRegExp(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction concatUint8Arrays(arrays: Uint8Array[]): Uint8Array {\n const totalLen = arrays.reduce((acc, a) => acc + a.length, 0);\n const result = new Uint8Array(totalLen);\n let offset = 0;\n for (const a of arrays) { result.set(a, offset); offset += a.length; }\n return result;\n}\n"]}