@fairfox/polly 0.65.0 → 0.66.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.
- package/dist/src/mesh.js +44 -7
- package/dist/src/mesh.js.map +3 -3
- package/dist/src/shared/lib/mesh-client.d.ts +76 -0
- package/package.json +1 -1
package/dist/src/mesh.js
CHANGED
|
@@ -3261,14 +3261,49 @@ async function resolveIceServers(rtc) {
|
|
|
3261
3261
|
}
|
|
3262
3262
|
return rtc?.iceServers;
|
|
3263
3263
|
}
|
|
3264
|
-
function buildHandleEntry(state, wire) {
|
|
3264
|
+
function buildHandleEntry(state, wire, syncStateView) {
|
|
3265
3265
|
return {
|
|
3266
3266
|
state,
|
|
3267
3267
|
announcedToPeer: wire?.lastSyncMessageOutAt !== undefined,
|
|
3268
3268
|
lastSyncMessageOutAt: wire?.lastSyncMessageOutAt,
|
|
3269
3269
|
lastSyncMessageInAt: wire?.lastSyncMessageInAt,
|
|
3270
3270
|
lastSyncMessageOutSize: wire?.lastSyncMessageOutSize,
|
|
3271
|
-
lastSyncMessageOutType: wire?.lastSyncMessageOutType
|
|
3271
|
+
lastSyncMessageOutType: wire?.lastSyncMessageOutType,
|
|
3272
|
+
docSynchronizerExists: syncStateView.docSynchronizerExists,
|
|
3273
|
+
docSynchronizerKnowsPeer: syncStateView.docSynchronizerKnowsPeer,
|
|
3274
|
+
peerDocumentStatus: syncStateView.peerDocumentStatus
|
|
3275
|
+
};
|
|
3276
|
+
}
|
|
3277
|
+
var EMPTY_SYNC_VIEW = {
|
|
3278
|
+
docSynchronizerExists: false,
|
|
3279
|
+
docSynchronizerKnowsPeer: undefined,
|
|
3280
|
+
peerDocumentStatus: undefined
|
|
3281
|
+
};
|
|
3282
|
+
function getCollectionSynchronizer(repo) {
|
|
3283
|
+
const sync = repo.synchronizer;
|
|
3284
|
+
return sync && typeof sync === "object" ? sync : undefined;
|
|
3285
|
+
}
|
|
3286
|
+
function buildSyncView(synchronizer, docId, peerId) {
|
|
3287
|
+
const docSync = synchronizer?.docSynchronizers?.[docId];
|
|
3288
|
+
if (!docSync)
|
|
3289
|
+
return EMPTY_SYNC_VIEW;
|
|
3290
|
+
let knowsPeer;
|
|
3291
|
+
try {
|
|
3292
|
+
knowsPeer = typeof docSync.hasPeer === "function" ? docSync.hasPeer(peerId) : undefined;
|
|
3293
|
+
} catch {
|
|
3294
|
+
knowsPeer = undefined;
|
|
3295
|
+
}
|
|
3296
|
+
let status;
|
|
3297
|
+
try {
|
|
3298
|
+
const states = docSync.peerStates;
|
|
3299
|
+
status = states && typeof states === "object" ? states[peerId] : undefined;
|
|
3300
|
+
} catch {
|
|
3301
|
+
status = undefined;
|
|
3302
|
+
}
|
|
3303
|
+
return {
|
|
3304
|
+
docSynchronizerExists: true,
|
|
3305
|
+
docSynchronizerKnowsPeer: knowsPeer,
|
|
3306
|
+
peerDocumentStatus: status
|
|
3272
3307
|
};
|
|
3273
3308
|
}
|
|
3274
3309
|
function stringifyHandleState(handle) {
|
|
@@ -3276,18 +3311,19 @@ function stringifyHandleState(handle) {
|
|
|
3276
3311
|
return "unknown";
|
|
3277
3312
|
return typeof handle.state === "string" ? handle.state : String(handle.state ?? "unknown");
|
|
3278
3313
|
}
|
|
3279
|
-
function enrichPeerSlot(peer, knownHandleIds, repoHandles) {
|
|
3314
|
+
function enrichPeerSlot(peer, knownHandleIds, repoHandles, synchronizer) {
|
|
3280
3315
|
if (!peer.slot) {
|
|
3281
3316
|
return { ...peer, slot: undefined };
|
|
3282
3317
|
}
|
|
3318
|
+
const peerIdString = peer.peerId;
|
|
3283
3319
|
const enriched = {};
|
|
3284
3320
|
for (const docId of knownHandleIds) {
|
|
3285
|
-
enriched[docId] = buildHandleEntry(stringifyHandleState(repoHandles[docId]), peer.slot.handles[docId]);
|
|
3321
|
+
enriched[docId] = buildHandleEntry(stringifyHandleState(repoHandles[docId]), peer.slot.handles[docId], buildSyncView(synchronizer, docId, peerIdString));
|
|
3286
3322
|
}
|
|
3287
3323
|
for (const docId of Object.keys(peer.slot.handles)) {
|
|
3288
3324
|
if (enriched[docId])
|
|
3289
3325
|
continue;
|
|
3290
|
-
enriched[docId] = buildHandleEntry("unknown", peer.slot.handles[docId]);
|
|
3326
|
+
enriched[docId] = buildHandleEntry("unknown", peer.slot.handles[docId], buildSyncView(synchronizer, docId, peerIdString));
|
|
3291
3327
|
}
|
|
3292
3328
|
return { ...peer, slot: { ...peer.slot, handles: enriched } };
|
|
3293
3329
|
}
|
|
@@ -3449,7 +3485,8 @@ async function createMeshClient(options) {
|
|
|
3449
3485
|
const base = webrtcAdapter.getPeerStateSnapshot();
|
|
3450
3486
|
const repoHandles = repo.handles;
|
|
3451
3487
|
const knownHandleIds = Object.keys(repoHandles);
|
|
3452
|
-
const
|
|
3488
|
+
const synchronizer = getCollectionSynchronizer(repo);
|
|
3489
|
+
const enrichedPeers = base.peers.map((peer) => enrichPeerSlot(peer, knownHandleIds, repoHandles, synchronizer));
|
|
3453
3490
|
const out = {
|
|
3454
3491
|
localPeerId: base.localPeerId,
|
|
3455
3492
|
knownPeerIds: base.knownPeerIds,
|
|
@@ -3903,4 +3940,4 @@ export {
|
|
|
3903
3940
|
$meshCounter
|
|
3904
3941
|
};
|
|
3905
3942
|
|
|
3906
|
-
//# debugId=
|
|
3943
|
+
//# debugId=E998FF56BA12701D64756E2164756E21
|
package/dist/src/mesh.js.map
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"/**\n * blob-store-impl — peer-to-peer blob store backed by WebRTC data channels.\n *\n * The store piggybacks on an existing MeshWebRTCAdapter. Blob messages ride\n * on the same data channel as Automerge sync traffic, distinguished by a\n * \"blob-\" prefix on the message type field.\n *\n * Lifecycle:\n * - put: hash-verify → cache plaintext locally → announce blob-have\n * - get: check cache → if miss, send blob-request(s) → receive chunks\n * → decrypt each chunk as it arrives → reassemble plaintext\n * → hash-verify → cache\n *\n * Encryption model: chunk-then-encrypt. The sender chunks the plaintext\n * into 64 KiB pieces, encrypts each chunk independently under the configured\n * key (with a fresh random nonce per chunk), and sends the sealed envelope.\n * The receiver decrypts each chunk on arrival. Peak sender memory is ~1\n * chunk of ciphertext at a time rather than the entire ciphertext blob.\n *\n * Per-op keys: callers can override the store's default encryption key per\n * put/get via BlobTransferOptions.key. This supports per-document keys\n * without requiring the store to track document ownership.\n *\n * Multi-source fetch: the get() flow requests from a single peer initially,\n * but the re-request timer rotates through peers that have announced\n * availability of the blob, so a transfer that stalls on one peer recovers\n * against another.\n */\n\nimport { MemoryBlobCache } from \"./blob-cache\";\nimport { computeBlobHash } from \"./blob-ref\";\nimport type { BlobCache, BlobProgressCallback, BlobStore, BlobStoreOptions } from \"./blob-store\";\nimport {\n type BlobChunkHeader,\n type BlobHaveHeader,\n type BlobMessageHeader,\n type BlobRequestHeader,\n chunkBlob,\n missingChunkIndices,\n reassembleChunks,\n serialiseBlobMessage,\n} from \"./blob-transfer\";\nimport type { MeshWebRTCAdapter } from \"./mesh-webrtc-adapter\";\n\nconst DEFAULT_MAX_BLOB_SIZE = 100 * 1024 * 1024; // 100 MiB\nconst DOWNLOAD_TIMEOUT_MS = 60_000;\nconst RE_REQUEST_DELAY_MS = 5_000;\n\n/** State for an in-progress blob download. */\ninterface DownloadState {\n total: number;\n /** Decrypted plaintext chunks, keyed by index. */\n chunks: Map<number, Uint8Array>;\n resolve: (bytes: Uint8Array) => void;\n reject: (error: Error) => void;\n onProgress?: BlobProgressCallback;\n timeoutId?: ReturnType<typeof setTimeout>;\n reRequestId?: ReturnType<typeof setTimeout>;\n /** Encryption key for this download, if any. */\n key?: Uint8Array;\n /** Peers we've asked, rotated on re-request for multi-source fetch. */\n peersAttempted: string[];\n /** Index into peersAttempted for the next re-request. */\n peerRotationIndex: number;\n}\n\n/** Create a blob store that transfers blobs peer-to-peer over a\n * MeshWebRTCAdapter's data channels. */\nexport function createBlobStore(adapter: MeshWebRTCAdapter, options?: BlobStoreOptions): BlobStore {\n const maxBlobSize = options?.maxBlobSize ?? DEFAULT_MAX_BLOB_SIZE;\n const defaultKey = options?.encrypt?.key;\n const cache: BlobCache = options?.cache ?? new MemoryBlobCache();\n\n // Per-hash key used at put time. Retained so that blob-request handlers\n // can encrypt chunks with the same key they were put under.\n const keysByHash = new Map<string, Uint8Array>();\n // Track which peers have which blobs (hash → set of peer IDs).\n const peerBlobs = new Map<string, Set<string>>();\n // Track in-progress downloads (hash → download state).\n const downloads = new Map<string, DownloadState>();\n // Hashes we have locally (for announcing to new peers).\n const localHashes = new Set<string>();\n // Object URL cache (hash → object URL string).\n const urlCache = new Map<string, string>();\n let disposed = false;\n\n // Wire up the adapter's blob message callback.\n adapter.onBlobMessage = (peerId, header, data) => {\n if (disposed) return;\n const type = header[\"type\"] as unknown as string;\n switch (type) {\n case \"blob-chunk\":\n void handleChunk(peerId, header as unknown as BlobChunkHeader, data);\n break;\n case \"blob-request\":\n void handleRequest(peerId, header as unknown as BlobRequestHeader);\n break;\n case \"blob-have\":\n handleHave(peerId, header as unknown as BlobHaveHeader);\n break;\n }\n };\n\n // Announce local blobs to new peers when they connect.\n const peerCandidateHandler = (event: { peerId: unknown }) => {\n if (disposed) return;\n const newPeerId = event.peerId as unknown as string;\n for (const hash of localHashes) {\n const msg = serialiseBlobMessage({ type: \"blob-have\", hash } as unknown as BlobMessageHeader);\n adapter.sendBlobMessage(newPeerId, msg);\n }\n };\n adapter.on(\"peer-candidate\", peerCandidateHandler);\n\n // Crypto helpers\n\n async function encryptChunk(plaintext: Uint8Array, key: Uint8Array): Promise<Uint8Array> {\n const { encrypt } = await import(\"./encryption\");\n return encrypt(plaintext, key);\n }\n\n async function decryptChunk(\n sealed: Uint8Array,\n key: Uint8Array\n ): Promise<Uint8Array | undefined> {\n const { decrypt } = await import(\"./encryption\");\n return decrypt(sealed, key);\n }\n\n // Incoming message handlers\n\n async function handleChunk(\n peerId: string,\n header: BlobChunkHeader,\n data: Uint8Array\n ): Promise<void> {\n const download = downloads.get(header.hash);\n if (!download) return;\n download.total = header.total;\n\n // Track this peer as a source of chunks for this blob.\n if (!download.peersAttempted.includes(peerId)) {\n download.peersAttempted.push(peerId);\n }\n\n // Decrypt if a key is configured.\n let chunkBytes: Uint8Array;\n if (download.key) {\n const plaintext = await decryptChunk(data, download.key);\n if (!plaintext) {\n // Skip this chunk — bad key or corrupted. Let re-request retry.\n return;\n }\n chunkBytes = plaintext;\n } else {\n chunkBytes = data.slice();\n }\n\n download.chunks.set(header.index, chunkBytes);\n\n reportChunkProgress(download);\n resetReRequestTimer(download);\n\n if (download.chunks.size >= header.total) {\n finishDownload(header.hash, download);\n } else {\n scheduleReRequest(header.hash, download);\n }\n }\n\n function reportChunkProgress(download: DownloadState): void {\n if (!download.onProgress || download.total <= 0) return;\n let loaded = 0;\n for (const chunk of download.chunks.values()) {\n loaded += chunk.length;\n }\n download.onProgress({ loaded, total: undefined, phase: \"downloading\" });\n }\n\n function resetReRequestTimer(download: DownloadState): void {\n if (download.reRequestId) {\n clearTimeout(download.reRequestId);\n download.reRequestId = undefined;\n }\n }\n\n function finishDownload(hash: string, download: DownloadState): void {\n clearDownloadTimers(download);\n try {\n const assembled = reassembleChunks(download.chunks, download.total);\n downloads.delete(hash);\n download.resolve(assembled);\n } catch (err) {\n downloads.delete(hash);\n download.reject(err instanceof Error ? err : new Error(String(err)));\n }\n }\n\n async function handleRequest(peerId: string, header: BlobRequestHeader): Promise<void> {\n const plaintext = await cache.get(header.hash);\n if (!plaintext) return;\n\n const plaintextChunks = chunkBlob(plaintext);\n const requested = header.missing ?? plaintextChunks.map((_, i) => i);\n const chunkKey = keysByHash.get(header.hash);\n\n for (const index of requested) {\n await sendChunkAtIndex(peerId, header.hash, plaintextChunks, index, chunkKey);\n }\n }\n\n async function sendChunkAtIndex(\n peerId: string,\n hash: string,\n plaintextChunks: Uint8Array[],\n index: number,\n chunkKey: Uint8Array | undefined\n ): Promise<void> {\n if (index < 0 || index >= plaintextChunks.length) return;\n const plainChunk = plaintextChunks[index];\n if (!plainChunk) return;\n\n const payload = chunkKey ? await encryptChunk(plainChunk, chunkKey) : plainChunk;\n const chunkHeader: BlobChunkHeader = {\n type: \"blob-chunk\",\n hash,\n index,\n total: plaintextChunks.length,\n };\n const msg = serialiseBlobMessage(chunkHeader as unknown as BlobMessageHeader, payload);\n\n if (!adapter.sendBlobMessage(peerId, msg)) {\n await waitForBufferDrain();\n adapter.sendBlobMessage(peerId, msg);\n }\n }\n\n function handleHave(peerId: string, header: BlobHaveHeader): void {\n let peers = peerBlobs.get(header.hash);\n if (!peers) {\n peers = new Set();\n peerBlobs.set(header.hash, peers);\n }\n peers.add(peerId);\n }\n\n // Helpers\n\n function announceHave(hash: string): void {\n const msg = serialiseBlobMessage({ type: \"blob-have\", hash } as unknown as BlobMessageHeader);\n for (const peerId of adapter.connectedPeerIds) {\n adapter.sendBlobMessage(peerId, msg);\n }\n }\n\n function clearDownloadTimers(download: DownloadState): void {\n if (download.timeoutId) clearTimeout(download.timeoutId);\n if (download.reRequestId) clearTimeout(download.reRequestId);\n }\n\n function scheduleReRequest(hash: string, download: DownloadState): void {\n download.reRequestId = setTimeout(() => fireReRequest(hash, download), RE_REQUEST_DELAY_MS);\n }\n\n function fireReRequest(hash: string, download: DownloadState): void {\n if (!downloads.has(hash)) return;\n const missing = missingChunkIndices(download.chunks, download.total);\n if (missing.length === 0) return;\n\n // Multi-source fetch: rotate through known peers so a stalled\n // transfer recovers against a different source.\n const peers = peerBlobs.get(hash);\n const pool = peers && peers.size > 0 ? Array.from(peers) : Array.from(adapter.connectedPeerIds);\n if (pool.length === 0) return;\n const target = pool[download.peerRotationIndex % pool.length];\n download.peerRotationIndex++;\n if (!target) return;\n\n const reqHeader: BlobRequestHeader = { type: \"blob-request\", hash, missing };\n const msg = serialiseBlobMessage(reqHeader as unknown as BlobMessageHeader);\n adapter.sendBlobMessage(target, msg);\n\n // Re-arm timer in case this peer also stalls.\n scheduleReRequest(hash, download);\n }\n\n function waitForBufferDrain(): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, 50));\n }\n\n // BlobStore implementation\n\n const store: BlobStore = {\n async put(ref, bytes, options?): Promise<void> {\n if (disposed) throw new Error(\"BlobStore is disposed\");\n options?.signal?.throwIfAborted();\n\n if (bytes.length > maxBlobSize) {\n throw new Error(`Blob exceeds maximum size (${bytes.length} > ${maxBlobSize})`);\n }\n\n // Verify hash.\n const hash = await computeBlobHash(bytes);\n if (hash !== ref.hash) {\n throw new Error(`Hash mismatch: expected ${ref.hash}, got ${hash}`);\n }\n\n options?.signal?.throwIfAborted();\n\n // Resolve the encryption key: per-op override > store default > no\n // encryption. Record the key so incoming blob-requests encrypt with\n // the same one.\n const key = options?.key ?? defaultKey;\n if (key) {\n keysByHash.set(ref.hash, key);\n }\n\n options?.onProgress?.({ loaded: bytes.length, total: bytes.length, phase: \"uploading\" });\n\n // Store plaintext in cache. Chunking + encryption is deferred to\n // handleRequest for streaming behavior.\n await cache.put(ref.hash, bytes);\n localHashes.add(ref.hash);\n\n announceHave(ref.hash);\n },\n\n async get(hash, options?): Promise<Uint8Array | undefined> {\n if (disposed) throw new Error(\"BlobStore is disposed\");\n options?.signal?.throwIfAborted();\n\n // Check local cache first.\n const cached = await cache.get(hash);\n if (cached) return cached;\n\n // Resolve the decryption key: per-op override > store default > no\n // decryption (plaintext chunks).\n const key = options?.key ?? defaultKey;\n\n // Find peers that have this blob.\n const peers = peerBlobs.get(hash);\n const candidates =\n peers && peers.size > 0 ? Array.from(peers) : Array.from(adapter.connectedPeerIds);\n const targetPeer = candidates[0];\n if (!targetPeer) return undefined;\n\n const requestHeader: BlobRequestHeader = { type: \"blob-request\", hash };\n const msg = serialiseBlobMessage(requestHeader as unknown as BlobMessageHeader);\n adapter.sendBlobMessage(targetPeer, msg);\n\n // Wait for chunks to arrive.\n const plaintext = await new Promise<Uint8Array>((resolve, reject) => {\n const download: DownloadState = {\n total: 0,\n chunks: new Map(),\n resolve,\n reject,\n onProgress: options?.onProgress,\n key,\n peersAttempted: [targetPeer],\n peerRotationIndex: 1,\n };\n downloads.set(hash, download);\n\n options?.signal?.addEventListener(\n \"abort\",\n () => {\n if (downloads.has(hash)) {\n clearDownloadTimers(download);\n downloads.delete(hash);\n reject(new Error(\"Blob download aborted\"));\n }\n },\n { once: true }\n );\n\n download.timeoutId = setTimeout(() => {\n if (downloads.has(hash)) {\n clearDownloadTimers(download);\n downloads.delete(hash);\n reject(new Error(\"Blob download timed out\"));\n }\n }, DOWNLOAD_TIMEOUT_MS);\n });\n\n // Verify hash against the plaintext.\n const actualHash = await computeBlobHash(plaintext);\n if (actualHash !== hash) {\n throw new Error(`Blob hash mismatch after download: expected ${hash}, got ${actualHash}`);\n }\n\n // Cache locally. Record the key so future blob-requests from peers\n // use the same one.\n await cache.put(hash, plaintext);\n if (key) keysByHash.set(hash, key);\n localHashes.add(hash);\n\n return plaintext;\n },\n\n async url(hash): Promise<string | undefined> {\n if (disposed) return undefined;\n const cached = urlCache.get(hash);\n if (cached) return cached;\n const bytes = await cache.get(hash);\n if (!bytes) return undefined;\n const buffer = new ArrayBuffer(bytes.byteLength);\n new Uint8Array(buffer).set(bytes);\n const objectUrl = URL.createObjectURL(new Blob([buffer]));\n urlCache.set(hash, objectUrl);\n return objectUrl;\n },\n\n async pin(hash): Promise<void> {\n await cache.pin(hash);\n },\n\n async unpin(hash): Promise<void> {\n await cache.unpin(hash);\n },\n\n async size(): Promise<number> {\n return cache.size();\n },\n\n async evict(maxBytes): Promise<number> {\n return cache.evict(maxBytes);\n },\n\n dispose(): void {\n disposed = true;\n adapter.onBlobMessage = undefined;\n adapter.off(\"peer-candidate\", peerCandidateHandler);\n for (const [hash, download] of downloads) {\n clearDownloadTimers(download);\n download.reject(new Error(\"BlobStore disposed\"));\n downloads.delete(hash);\n }\n for (const objectUrl of urlCache.values()) {\n URL.revokeObjectURL(objectUrl);\n }\n urlCache.clear();\n keysByHash.clear();\n cache.dispose();\n },\n };\n\n return store;\n}\n",
|
|
12
12
|
"/**\n * @fairfox/polly/mesh — mesh-networked CRDT state with end-to-end encryption.\n *\n * Wraps the peer-first primitives with WebRTC mesh transport and\n * sign-then-encrypt envelopes. This subpath export isolates the\n * @automerge/* and tweetnacl dependency trees so consumers who only\n * use $sharedState / $syncedState / $resource never pull them in.\n *\n * @example\n * ```typescript\n * import { $meshState, configureMeshState } from \"@fairfox/polly/mesh\";\n * ```\n */\n\n// Eagerly initialise Automerge's WASM runtime. Must come before anything\n// that touches @automerge/automerge-repo/slim.\nimport \"./shared/lib/wasm-init\";\n\nexport { IndexedDBBlobCache, MemoryBlobCache } from \"./shared/lib/blob-cache\";\nexport type { BlobRef, CreateBlobRefArgs } from \"./shared/lib/blob-ref\";\nexport { computeBlobHash, createBlobRef, isBlobRef } from \"./shared/lib/blob-ref\";\n// Blob store\nexport type {\n BlobCache,\n BlobProgressCallback,\n BlobProgressEvent,\n BlobStore,\n BlobStoreOptions,\n BlobTransferOptions,\n} from \"./shared/lib/blob-store\";\nexport { createBlobStore } from \"./shared/lib/blob-store-impl\";\nexport type {\n EncryptedEnvelope,\n SealedBytes,\n} from \"./shared/lib/encryption\";\nexport {\n decrypt,\n decryptOrThrow,\n EncryptionError,\n encrypt,\n generateDocumentKey,\n KEY_BYTES as ENCRYPTION_KEY_BYTES,\n NONCE_BYTES as ENCRYPTION_NONCE_BYTES,\n TAG_BYTES as ENCRYPTION_TAG_BYTES,\n} from \"./shared/lib/encryption\";\n// Keyring storage (runtime-agnostic)\nexport type { KeyringStorage } from \"./shared/lib/keyring-storage\";\nexport {\n deserialiseKeyring,\n memoryKeyringStorage,\n serialiseKeyring,\n} from \"./shared/lib/keyring-storage\";\n// Mesh client factory\nexport type {\n CreateMeshClientOptions,\n MeshClient,\n MeshClientHandleSnapshot,\n MeshClientPeerStateSnapshot,\n MeshStateLazyWrapperDocIdDuplicate,\n MeshStateModuleDiagnostics,\n} from \"./shared/lib/mesh-client\";\nexport { createMeshClient } from \"./shared/lib/mesh-client\";\n// Mesh network adapter (sign-then-encrypt envelopes over any base adapter)\nexport type {\n MeshKeyring,\n MeshNetworkAdapterOptions,\n} from \"./shared/lib/mesh-network-adapter\";\nexport {\n DEFAULT_MESH_KEY_ID,\n MeshNetworkAdapter,\n} from \"./shared/lib/mesh-network-adapter\";\n// Mesh signaling client\nexport type {\n MeshSignalingClientOptions,\n SignalingMessage as MeshSignalingMessage,\n} from \"./shared/lib/mesh-signaling-client\";\nexport { MeshSignalingClient } from \"./shared/lib/mesh-signaling-client\";\nexport type {\n DocIdResolver,\n LazyWrapperExitReason,\n MeshStateLazyWrapperRecord,\n MeshStateLoadedRejectionBreadcrumb,\n MeshStateOptions,\n MeshStateStorageOpenError,\n} from \"./shared/lib/mesh-state\";\n// Mesh state wrappers\nexport {\n $meshCounter,\n $meshList,\n $meshState,\n $meshText,\n configureMeshState,\n deriveDocumentId,\n getDocIdResolver,\n getLastConfiguredRepoPeerId,\n getLastLoadedRejection,\n getLazyInvocations,\n getLazyReachedRepo,\n getLazyWrappers,\n getMeshStateModuleId,\n getRedirectDetector,\n getStorageOpenError,\n isMeshStateConfigured,\n MESH_STATE_MODULE_ID,\n registerDocIdResolver,\n registerRedirectDetector,\n resetMeshState,\n resolveDocumentId,\n wasMeshStateResolved,\n} from \"./shared/lib/mesh-state\";\n// Mesh WebRTC adapter\nexport type {\n HandleSyncSnapshot,\n InFlightSyncSnapshot,\n MeshWebRTCAdapterOptions,\n SlotInitiationDecision,\n SlotInitiationRejectionReason,\n SweepSnapshot,\n SyncHandshakeAttemptSnapshot,\n SyncProgressEvent,\n TransportSnapshot,\n} from \"./shared/lib/mesh-webrtc-adapter\";\nexport { DEFAULT_ICE_SERVERS, MeshWebRTCAdapter } from \"./shared/lib/mesh-webrtc-adapter\";\n// Pairing and revocation (depend on signing/encryption)\nexport type {\n CreatePairingTokenOptions,\n PairingToken,\n} from \"./shared/lib/pairing\";\nexport {\n applyPairingToken,\n createPairingToken,\n createPairingTokenWithFreshIdentity,\n DEFAULT_PAIRING_TTL_MS,\n decodePairingToken,\n encodePairingToken,\n isPairingTokenExpired,\n PAIRING_NONCE_BYTES,\n PAIRING_TOKEN_VERSION,\n PairingError,\n parsePairingToken,\n serialisePairingToken,\n} from \"./shared/lib/pairing\";\nexport type {\n CreateRevocationOptions,\n RevocationRecord,\n} from \"./shared/lib/revocation\";\nexport {\n applyRevocation,\n createRevocation,\n decodeRevocation,\n encodeRevocation,\n REVOCATION_MAGIC,\n REVOCATION_RECORD_VERSION,\n RevocationError,\n revokePeerLocally,\n} from \"./shared/lib/revocation\";\n// Cryptographic primitives (signing + encryption)\nexport type { SignedEnvelope, SigningKeyPair } from \"./shared/lib/signing\";\nexport {\n generateSigningKeyPair,\n PUBLIC_KEY_BYTES as SIGNING_PUBLIC_KEY_BYTES,\n SECRET_KEY_BYTES as SIGNING_SECRET_KEY_BYTES,\n SIGNATURE_BYTES as SIGNING_SIGNATURE_BYTES,\n SigningError,\n sign,\n signingKeyPairFromSecret,\n verify,\n} from \"./shared/lib/signing\";\n",
|
|
13
13
|
"/**\n * keyring-storage — persistence abstraction for {@link MeshKeyring}.\n *\n * The keyring itself is a plain structural object of `Map`s, `Set`s, and a\n * signing keypair; it is deliberately not coupled to any persistence layer.\n * This module defines a storage interface that applications implement once\n * for their runtime (IndexedDB, the filesystem, a keychain, a secret\n * manager, whatever) and wire into {@link createMeshClient} via its\n * `keyring.storage` option.\n *\n * A canonical JSON-with-base64 serialisation is provided by\n * {@link serialiseKeyring} and {@link deserialiseKeyring}. It is inspectable\n * by humans, survives manual edits, and round-trips every field of the\n * keyring. Storage implementations that write plain strings (files,\n * localStorage, `kv` stores) can lean on these helpers; storage\n * implementations that persist structured data (IndexedDB, a keychain API)\n * can serialise differently if they prefer.\n */\n\nimport type { MeshKeyring } from \"./mesh-network-adapter\";\nimport type { SigningKeyPair } from \"./signing\";\n\n/**\n * A load/save pair for a single {@link MeshKeyring}. Implementations are\n * free to choose where and how the keyring is stored; the factory only\n * cares that `load()` returns the previously-saved keyring or `null`, and\n * that `save(keyring)` durably persists it.\n */\nexport interface KeyringStorage {\n /** Load the previously-saved keyring, or return `null` if none exists.\n * Implementations may throw for truly exceptional conditions (disk\n * errors, permission failures); a missing keyring is not exceptional. */\n load(): Promise<MeshKeyring | null>;\n /** Durably persist the keyring. Implementations should atomically replace\n * any existing stored value; partial writes must not leave the store in\n * an inconsistent state. */\n save(keyring: MeshKeyring): Promise<void>;\n}\n\n/**\n * In-memory storage. Useful for tests, ephemeral tools, and the first-run\n * bootstrap path where the keyring only lives for the duration of the\n * process. Calling `save` holds the keyring in a closed-over variable;\n * `load` returns it on subsequent calls within the same process.\n */\nexport function memoryKeyringStorage(): KeyringStorage {\n let stored: MeshKeyring | null = null;\n return {\n load: async () => stored,\n save: async (keyring) => {\n stored = keyring;\n },\n };\n}\n\n// Canonical JSON+base64 serialisation\n\ninterface SerialisedKeyring {\n version: 1;\n identity: { publicKey: string; secretKey: string };\n knownPeers: Record<string, string>;\n documentKeys: Record<string, string>;\n revokedPeers: string[];\n revocationAuthority?: string[];\n}\n\n/**\n * Encode a {@link MeshKeyring} to a canonical JSON string. Every\n * `Uint8Array` field (identity keys, public keys, document keys) is\n * base64-encoded; `Map`s and `Set`s become plain objects and arrays. The\n * output is pretty-printed so a human operator can eyeball or hand-edit\n * the file on disk.\n */\nexport function serialiseKeyring(keyring: MeshKeyring): string {\n const payload: SerialisedKeyring = {\n version: 1,\n identity: {\n publicKey: bytesToBase64(keyring.identity.publicKey),\n secretKey: bytesToBase64(keyring.identity.secretKey),\n },\n knownPeers: mapToBase64Record(keyring.knownPeers),\n documentKeys: mapToBase64Record(keyring.documentKeys),\n revokedPeers: [...keyring.revokedPeers],\n };\n if (keyring.revocationAuthority && keyring.revocationAuthority.size > 0) {\n payload.revocationAuthority = [...keyring.revocationAuthority];\n }\n return JSON.stringify(payload, null, 2);\n}\n\n/**\n * Decode a keyring from the format produced by {@link serialiseKeyring}.\n * Throws with a descriptive message when the input is malformed, so\n * corrupt storage surfaces as an actionable error rather than a silent\n * downgrade.\n */\nexport function deserialiseKeyring(text: string): MeshKeyring {\n let raw: unknown;\n try {\n raw = JSON.parse(text);\n } catch (err) {\n throw new Error(`KeyringStorage: keyring payload is not valid JSON: ${(err as Error).message}`);\n }\n if (!raw || typeof raw !== \"object\") {\n throw new Error(\"KeyringStorage: keyring payload is not an object\");\n }\n const r = raw as unknown as Partial<SerialisedKeyring>;\n if (r.version !== 1) {\n throw new Error(`KeyringStorage: unsupported keyring version: ${String(r.version)}`);\n }\n if (!r.identity || typeof r.identity !== \"object\") {\n throw new Error(\"KeyringStorage: keyring payload is missing identity\");\n }\n const identity: SigningKeyPair = {\n publicKey: base64ToBytes(r.identity.publicKey),\n secretKey: base64ToBytes(r.identity.secretKey),\n };\n const keyring: MeshKeyring = {\n identity,\n knownPeers: base64RecordToMap(r.knownPeers ?? {}),\n documentKeys: base64RecordToMap(r.documentKeys ?? {}),\n revokedPeers: new Set(r.revokedPeers ?? []),\n };\n if (r.revocationAuthority && r.revocationAuthority.length > 0) {\n keyring.revocationAuthority = new Set(r.revocationAuthority);\n }\n return keyring;\n}\n\nfunction mapToBase64Record(map: Map<string, Uint8Array>): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [key, value] of map) {\n out[key] = bytesToBase64(value);\n }\n return out;\n}\n\nfunction base64RecordToMap(record: Record<string, string>): Map<string, Uint8Array> {\n const out = new Map<string, Uint8Array>();\n for (const [key, value] of Object.entries(record)) {\n out.set(key, base64ToBytes(value));\n }\n return out;\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n // btoa is available in browsers, Node 16+, and Bun.\n let binary = \"\";\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n return btoa(binary);\n}\n\nfunction base64ToBytes(b64: string): Uint8Array {\n const binary = atob(b64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n",
|
|
14
|
-
"/**\n * mesh-client — first-class factory for constructing a Polly mesh client.\n *\n * The mesh transport stack has five pieces that have to be wired together:\n * a {@link MeshSignalingClient} talking to the relay server, a\n * {@link MeshWebRTCAdapter} that owns the per-peer RTCPeerConnections, a\n * {@link MeshNetworkAdapter} that signs and encrypts every message on the\n * way through, an Automerge `Repo` that drives sync, and a `MeshKeyring`\n * that holds the crypto material. Prior to this module, every consuming\n * application had to assemble the five pieces by hand — and in Node or\n * Bun had to monkey-patch `globalThis.WebSocket` / `globalThis.RTCPeerConnection`\n * because the lower-level primitives reached for those globals.\n *\n * `createMeshClient` takes options, hands back a `MeshClient`, and also\n * calls `configureMeshState(client.repo)` so `$meshState` works without\n * a second setup step. The WebSocket and RTCPeerConnection implementations\n * are injectable; defaults read from `globalThis` for browser ergonomics.\n * The companion `@fairfox/polly/mesh/node` subpath provides a CLI bootstrap\n * helper that wires werift (or `@roamhq/wrtc` if the consumer prefers) and\n * a file-backed keyring store.\n */\n\nimport { type PeerId, Repo, type StorageAdapterInterface } from \"@automerge/automerge-repo/slim\";\nimport type { KeyringStorage } from \"./keyring-storage\";\nimport { DEFAULT_MESH_KEY_ID, type MeshKeyring, MeshNetworkAdapter } from \"./mesh-network-adapter\";\nimport { MeshSignalingClient, type MeshSignalingClientOptions } from \"./mesh-signaling-client\";\nimport {\n configureMeshState,\n getLastConfiguredRepoPeerId,\n getLastLoadedRejection,\n getLazyInvocations,\n getLazyReachedRepo,\n getLazyWrappers,\n getMeshStateModuleId,\n getStorageOpenError,\n isMeshStateConfigured,\n type MeshStateLazyWrapperRecord,\n type MeshStateLoadedRejectionBreadcrumb,\n type MeshStateStorageOpenError,\n wasMeshStateResolved,\n} from \"./mesh-state\";\nimport { MeshWebRTCAdapter, type MeshWebRTCAdapterOptions } from \"./mesh-webrtc-adapter\";\n\n/** Options for {@link createMeshClient}. */\nexport interface CreateMeshClientOptions {\n /** Signalling-server configuration. `peerId` must be the same identity\n * this client's keyring was paired with on other peers. */\n signaling: {\n url: string;\n peerId: string;\n /** Optional WebSocket ctor override (e.g. `ws` on old Node). Defaults\n * to `globalThis.WebSocket`. */\n WebSocket?: MeshSignalingClientOptions[\"WebSocket\"];\n /** Forwarded error callback for diagnostic UI. */\n onError?: MeshSignalingClientOptions[\"onError\"];\n /** Forwarded hook for custom signalling frames. See\n * {@link MeshSignalingClientOptions.onCustomFrame} — consumers who\n * layer application protocols on the signalling socket receive\n * frames of unknown types here. */\n onCustomFrame?: MeshSignalingClientOptions[\"onCustomFrame\"];\n };\n /** WebRTC configuration. On browsers the defaults are fine; in Node or\n * Bun pass the `RTCPeerConnection` ctor from `werift` or `@roamhq/wrtc`. */\n rtc?: {\n RTCPeerConnection?: MeshWebRTCAdapterOptions[\"RTCPeerConnection\"];\n iceServers?: RTCIceServer[];\n /**\n * Async resolver for ICE servers, called once at connect time. Wins\n * over `iceServers` if both are set. The realistic pattern is a\n * consumer fetching short-lived TURN credentials from its own\n * backend before each session — for production WebRTC apps that\n * care about coverage, TURN is the only way two peers behind\n * symmetric NATs (cellular CGNAT, some corporate firewalls) can\n * exchange bytes at all.\n *\n * Common provider shapes:\n *\n * - **Self-hosted coturn**: fetch a HMAC-derived ephemeral\n * `username` / `credential` pair from your backend and return\n * `[{ urls: \"turn:turn.example.com\", username, credential }]`.\n * - **Cloudflare Calls**: hit `/v1/turn/keys/<id>/credentials/generate`\n * from a server route and pass the returned `iceServers` array\n * straight through.\n * - **Twilio NTS**: call the network-traversal-service endpoint\n * server-side and forward `data.iceServers`.\n * - **metered.ca / Xirsys / etc.**: same pattern — credentials live\n * server-side, the resolver is the integration point.\n *\n * Resolution happens once. ICE restart with refreshed credentials\n * is a separate concern that this hook does not yet cover; if your\n * deployment needs it, tear down and rebuild the mesh client when\n * the credential window closes.\n */\n iceCredentialResolver?: () => Promise<RTCIceServer[]>;\n /** Forward of {@link MeshWebRTCAdapterOptions.iceTransportPolicy}.\n * Set to `\"relay\"` to force every candidate pair through TURN; the\n * default leaves the underlying {@link RTCPeerConnection}\n * implementation's default in place. The\n * `examples/mesh-large-initial-sync-turn` harness uses `\"relay\"` to\n * exercise the polly#105 real-transport contract. */\n iceTransportPolicy?: MeshWebRTCAdapterOptions[\"iceTransportPolicy\"];\n /** Forward of {@link MeshWebRTCAdapterOptions.iceRelayEnforcement}.\n * Defaults to `true`. Set to `false` to bypass the polly#105\n * relay-only enforcement layer; the\n * `examples/mesh-large-initial-sync-turn` falsification path\n * (`POLLY_105_DISABLE_TURN_FIX=1`) does this to reproduce the\n * pre-#105 candidate-leak shape. Production callers should leave\n * this at the default. */\n iceRelayEnforcement?: MeshWebRTCAdapterOptions[\"iceRelayEnforcement\"];\n dataChannelLabel?: string;\n /** How often the mesh client re-evaluates whether to dial peers\n * already present in the signalling roster against the live\n * keyring. The sweep is what makes\n * `applyPairingToken(token, keyring)` calls performed *after* the\n * mesh client is up take effect on the WebRTC layer without\n * requiring the consumer to call\n * {@link MeshClient.refreshKnownPeers} by hand — see polly issue\n * #103 for the failure mode this closes. Defaults to 2000ms; set\n * to 0 to disable (the captured-set-only behaviour, kept for\n * migrations and for the pre-fix demonstration shape in\n * `examples/mesh-recovery-pair`). Forwarded straight to\n * {@link MeshWebRTCAdapterOptions.knownPeersRefreshIntervalMs}. */\n knownPeersRefreshIntervalMs?: MeshWebRTCAdapterOptions[\"knownPeersRefreshIntervalMs\"];\n /** Forward of {@link MeshWebRTCAdapterOptions.syncYieldEnabled}.\n * Defaults to `true`. The `examples/mesh-large-initial-sync`\n * example flips this to `false` when `POLLY_104_DISABLE_FIX=1` is\n * set, to demonstrate the pre-#104 tight-loop behaviour against\n * post-fix polly. Production callers should leave this at the\n * default. */\n syncYieldEnabled?: MeshWebRTCAdapterOptions[\"syncYieldEnabled\"];\n /** Forward of\n * {@link MeshWebRTCAdapterOptions.syncFragmentChunkSizeOverride}.\n * Production callers should leave this undefined. The\n * `examples/mesh-large-initial-sync` example passes 64 KiB when\n * `POLLY_104_DISABLE_FIX=1` to recreate the pre-#104\n * fragmentation bug. */\n syncFragmentChunkSizeOverride?: MeshWebRTCAdapterOptions[\"syncFragmentChunkSizeOverride\"];\n };\n /** The local peer's keyring — one of three shapes:\n *\n * - A {@link MeshKeyring} instance. The same object is used for the\n * lifetime of the mesh client; in-place mutations to its `knownPeers`\n * and `documentKeys` maps are visible to the next send and receive\n * (`MeshNetworkAdapter` re-reads the keyring on every message, so\n * `applyPairingToken` and friends take effect without a restart).\n *\n * - `{ storage }`: load the keyring once via the persistence adapter.\n * When `storage.load()` resolves to `null`, the factory throws with\n * a message pointing at the bootstrap helper in\n * `@fairfox/polly/mesh/node`; we deliberately do not generate an\n * identity silently.\n *\n * - `{ source }`: a synchronous function returning the current keyring.\n * Called by `MeshNetworkAdapter` on every send and every receive.\n * This is the shape that lets a long-lived mesh client recover from\n * keyring updates written by a *different* process — wire the\n * `source` to a cached object that a file watcher (or `readFileSync`\n * on each call) refreshes from disk, and a freshly-paired peer\n * becomes visible to the running adapter without any explicit\n * notification path. See polly issue #100. */\n keyring: MeshKeyring | { storage: KeyringStorage } | { source: () => MeshKeyring };\n /** Optional Automerge-Repo storage adapter. Applications that want\n * durable local state pass an IndexedDB adapter in browsers or a\n * filesystem adapter in Node; omitting it keeps the Repo in-memory. */\n repoStorage?: StorageAdapterInterface;\n /** When `false`, signs but does not encrypt. Defaults to `true` — the\n * full $meshState posture where the server is off the data path. */\n encryptionEnabled?: boolean;\n}\n\n/**\n * Resolve the ICE server list a mesh client will use. The resolver wins\n * over a static `iceServers` list because the realistic deployment shape\n * is a consumer fetching short-lived TURN credentials per session — the\n * resolver is the integration point and a static list alongside it would\n * silently mask a broken credential flow. Exported for unit tests; the\n * production call site is inside {@link createMeshClient}.\n */\nexport async function resolveIceServers(\n rtc: CreateMeshClientOptions[\"rtc\"]\n): Promise<RTCIceServer[] | undefined> {\n if (rtc?.iceCredentialResolver) {\n return rtc.iceCredentialResolver();\n }\n return rtc?.iceServers;\n}\n\n/** Build the per-handle entry the polly#107 snapshot enrichment emits.\n * Combines the Repo-side `state` (the canonical lifecycle) with the\n * adapter-side wire timestamps. Extracted from the snapshot mapper to\n * keep the per-peer iteration under the cognitive-complexity ceiling. */\nfunction buildHandleEntry(\n state: string,\n wire:\n | {\n lastSyncMessageOutAt: number | undefined;\n lastSyncMessageInAt: number | undefined;\n lastSyncMessageOutSize: number | undefined;\n lastSyncMessageOutType: string | undefined;\n }\n | undefined\n): MeshClientHandleSnapshot {\n return {\n state,\n announcedToPeer: wire?.lastSyncMessageOutAt !== undefined,\n lastSyncMessageOutAt: wire?.lastSyncMessageOutAt,\n lastSyncMessageInAt: wire?.lastSyncMessageInAt,\n lastSyncMessageOutSize: wire?.lastSyncMessageOutSize,\n lastSyncMessageOutType: wire?.lastSyncMessageOutType,\n };\n}\n\n/** Stringify a Repo handle's `state` value for the enriched snapshot.\n * Handles whose machine snapshot returns an object collapse to a\n * coerced string; in practice polly's $meshState always lands on a\n * leaf string. Returns `\"unknown\"` when the handle entry itself is\n * undefined. */\nfunction stringifyHandleState(handle: { state: unknown } | undefined): string {\n if (handle === undefined) return \"unknown\";\n return typeof handle.state === \"string\" ? handle.state : String(handle.state ?? \"unknown\");\n}\n\n/** Enrich one peer's slot view with the per-handle Repo×adapter merge\n * polly#107 item 7 specifies. Pulled out of the snapshot factory so the\n * outer factory stays under the cognitive-complexity ceiling and so\n * the per-iteration code is testable in isolation. */\nfunction enrichPeerSlot(\n peer: ReturnType<MeshWebRTCAdapter[\"getPeerStateSnapshot\"]>[\"peers\"][number],\n knownHandleIds: string[],\n repoHandles: Record<string, { state: unknown } | undefined>\n): MeshClientPeerStateSnapshot[\"peers\"][number] {\n if (!peer.slot) {\n return { ...peer, slot: undefined } as MeshClientPeerStateSnapshot[\"peers\"][number];\n }\n const enriched: Record<string, MeshClientHandleSnapshot> = {};\n for (const docId of knownHandleIds) {\n enriched[docId] = buildHandleEntry(\n stringifyHandleState(repoHandles[docId]),\n peer.slot.handles[docId]\n );\n }\n for (const docId of Object.keys(peer.slot.handles)) {\n if (enriched[docId]) continue;\n enriched[docId] = buildHandleEntry(\"unknown\", peer.slot.handles[docId]);\n }\n return { ...peer, slot: { ...peer.slot, handles: enriched } };\n}\n\n/** Lift the synchronizer's `reevaluateDocumentShare` method off a Repo\n * through a narrowed structural accessor.\n * `synchronizer.reevaluateDocumentShare` is `@hidden` on the Automerge\n * type, so we reach for it tolerantly — the worst case is the\n * polly#107 fix silently degrades to the pre-fix shape, which the\n * observability layer still surfaces clearly. */\nfunction getReevaluateDocumentShare(repo: Repo): (() => Promise<void>) | undefined {\n const sync = (\n repo as unknown as {\n synchronizer?: { reevaluateDocumentShare?: () => Promise<void> };\n }\n ).synchronizer;\n const fn = sync?.reevaluateDocumentShare;\n if (typeof fn !== \"function\" || sync === undefined) return undefined;\n return () => fn.call(sync);\n}\n\n/** Build the {@link MeshStateModuleDiagnostics} block surfaced on\n * every {@link MeshClient.getPeerStateSnapshot}. Reads the module\n * state in one place so both snapshot construction sites (the\n * pre-adapter early-out and the main path) stay identical. */\nfunction buildMeshStateModuleDiagnostics(): MeshStateModuleDiagnostics {\n const lazyWrappers = getLazyWrappers();\n return {\n moduleId: getMeshStateModuleId(),\n configured: isMeshStateConfigured(),\n lastConfiguredRepoPeerId: getLastConfiguredRepoPeerId(),\n wasResolved: wasMeshStateResolved(),\n lazyInvocations: getLazyInvocations(),\n lazyReachedRepo: getLazyReachedRepo(),\n lastLoadedRejection: getLastLoadedRejection(),\n storageOpenError: getStorageOpenError(),\n lazyWrappers,\n lazyWrapperDuplicateDocIds: findLazyWrapperDocIdDuplicates(lazyWrappers),\n };\n}\n\n/** Polly#107 post-v0.60 instrumentation. Walks the lazy-wrapper log\n * and groups records by `docId`; emits one entry per `docId` that\n * appears in more than one record. Surfaces the \"17 wrappers / 16\n * `repo.handles`\" off-by-one shape that the v0.60.0 single-tab\n * fingerprint flagged — typically two distinct `$mesh*` consumer\n * call sites whose logical keys hash to the same Automerge\n * `DocumentId`, or the same logical key invoked from two consumers\n * during pre-warm before either factory's `repo.import` committed\n * the handle. The snapshot can paste this verbatim; an empty array\n * means the wrapper-to-handle accounting is one-to-one. */\nexport interface MeshStateLazyWrapperDocIdDuplicate {\n /** The `DocumentId` that more than one factory invocation\n * resolved to. */\n docId: string;\n /** Distinct logical keys that derived to this same `DocumentId`.\n * Length 1 means the same key was registered twice; length > 1\n * means two different keys hashed to the same id (a SHA-512-prefix\n * collision in {@link deriveDocumentId}, vanishingly unlikely but\n * detected for completeness). */\n keys: string[];\n /** Total number of records in the lazy-wrapper log that resolved\n * to this `DocumentId`. Typically 2 for a same-key double-call. */\n recordCount: number;\n}\n\nfunction findLazyWrapperDocIdDuplicates(\n records: readonly MeshStateLazyWrapperRecord[]\n): MeshStateLazyWrapperDocIdDuplicate[] {\n const byDocId = new Map<string, { keys: Set<string>; count: number }>();\n for (const record of records) {\n let entry = byDocId.get(record.docId);\n if (!entry) {\n entry = { keys: new Set(), count: 0 };\n byDocId.set(record.docId, entry);\n }\n entry.keys.add(record.key);\n entry.count++;\n }\n const duplicates: MeshStateLazyWrapperDocIdDuplicate[] = [];\n for (const [docId, entry] of byDocId) {\n if (entry.count > 1) {\n duplicates.push({ docId, keys: [...entry.keys], recordCount: entry.count });\n }\n }\n return duplicates;\n}\n\n/** Install the polly#107 peer-candidate hook on a freshly-constructed\n * mesh stack. Hides the falsification-gate branch behind a single call\n * so the outer factory's complexity score stays under the ceiling. */\nfunction installPolly107SyncReevaluation(networkAdapter: MeshNetworkAdapter, repo: Repo): void {\n const disable = typeof process !== \"undefined\" && process.env?.[\"POLLY_107_DISABLE_FIX\"] === \"1\";\n if (disable) return;\n const reevaluate = getReevaluateDocumentShare(repo);\n if (!reevaluate) return;\n networkAdapter.on(\"peer-candidate\", () => {\n void reevaluate().catch(() => {\n // Synchronizer errors are observable through\n // getPeerStateSnapshot; suppressing here keeps a single bad doc\n // from taking down the whole peer-candidate path.\n });\n });\n}\n\n/** Per-peer per-handle enrichment polly#107 adds on top of the\n * {@link MeshWebRTCAdapter} snapshot. `state` and `announcedToPeer`\n * come from the Repo side (which the adapter cannot see); the wire\n * timestamps come from the adapter's per-slot bookkeeping. */\nexport interface MeshClientHandleSnapshot {\n /** The local handle's lifecycle state — `\"ready\"`, `\"loading\"`,\n * `\"unavailable\"`, etc. — as reported by the Repo. `\"unknown\"` is\n * stamped when the wire has seen a sync message for a documentId\n * the local repo hasn't constructed a handle for yet (a remote peer\n * announcing a doc we haven't touched). */\n state: string;\n /** True iff polly's network adapter has dispatched at least one\n * outbound sync message for this document to this peer. Equivalent\n * to `lastSyncMessageOutAt !== undefined` but named for the\n * diagnostic question polly#107 asks the snapshot to answer:\n * \"has Automerge's NetworkSubsystem told this peer about this\n * handle?\". The failing-shape this ticket reports is precisely\n * the case where every entry has `state: \"ready\"` and\n * `announcedToPeer: false`. */\n announcedToPeer: boolean;\n /** `performance.now()` of the most recent outbound sync message for\n * this document to this peer. `undefined` until first send. */\n lastSyncMessageOutAt: number | undefined;\n /** `performance.now()` of the most recent inbound message dispatched\n * upward for this document from this peer. `undefined` until first\n * receive. */\n lastSyncMessageInAt: number | undefined;\n /** Byte length of the most recent outbound message. */\n lastSyncMessageOutSize: number | undefined;\n /** Type field of the most recent outbound message — typically\n * `\"sync\"` after handshake, `\"request\"` while the local side is\n * asking. */\n lastSyncMessageOutType: string | undefined;\n}\n\n/** Polly#107 H5 diagnostics: surfaces the `mesh-state` module\n * instance identity so a single snapshot read tells the operator\n * whether the consumer's `$meshState` wrappers are resolving against\n * the same module instance `createMeshClient` configured. A mismatch\n * here IS the bundle-time module duplication bug. */\nexport interface MeshStateModuleDiagnostics {\n /** The id stamped at import time on the `mesh-state` module\n * instance THIS mesh client was constructed against. Compare to\n * the id seen at the `$meshState` call site (also importable as\n * `MESH_STATE_MODULE_ID` from `@fairfox/polly/mesh`). Two different\n * ids means the consumer is reaching a duplicated copy of\n * `mesh-state.ts` — wrappers register handles against a Repo this\n * mesh client never saw. */\n moduleId: string;\n /** `true` iff THIS module instance has a configured `defaultRepo`.\n * In the H5 scenario, this is `true` for the mesh-client-side\n * snapshot (because `createMeshClient` always calls\n * `configureMeshState` on the module it imports), but the same\n * field read from the consumer's `$meshState` call site would\n * be `false`. */\n configured: boolean;\n /** `peerId` of the most recent Repo wired through\n * `configureMeshState` against THIS module instance. Compared to\n * `client.repo.peerId` and the consumer's wrappers' resolved Repo\n * tells the full story. */\n lastConfiguredRepoPeerId: string | undefined;\n /** `true` if any `$meshState`-family wrapper has been called\n * against THIS module instance at any point. The polly#107 H5\n * fingerprint pair: `configured: true, wasResolved: false` on\n * the mesh-client-side snapshot (the wrappers never reached us);\n * the consumer's wrapper code reading the same field from THEIR\n * `$meshState` import would see `configured: false, wasResolved:\n * true` (they're using a module instance no mesh client ever\n * configured). */\n wasResolved: boolean;\n /** Polly#107 post-H5 instrumentation. Count of `$meshState`-family\n * lazy factory invocations since module load. Once the consumer's\n * pre-warm pass completes, this equals the number of distinct\n * `$mesh*` wrappers whose handles the loader actually tried to\n * resolve. Compared to {@link lazyReachedRepo}: gap = throws\n * before any Repo work. */\n lazyInvocations: number;\n /** Polly#107 post-H5 instrumentation. Count of factory invocations\n * that reached the Repo subsystem (`repo.handles[...]`, `repo.find`\n * or `repo.import`) before returning or throwing. If\n * {@link lazyInvocations} is N and this is N, every wrapper\n * touched the Repo — any missing handles are downstream of Repo\n * registration. If this is < N, the gap is the call site to\n * instrument next. */\n lazyReachedRepo: number;\n /** Polly#107 post-H5 instrumentation. Breadcrumb for the most\n * recent rejection from a `$meshState`-family `loaded` promise\n * (or its factory). Captured even when the consumer's wrapper\n * never awaits `loaded` and the rejection would otherwise vanish\n * silently. `undefined` means no rejection has escaped any\n * wrapper on THIS module instance since module load. */\n lastLoadedRejection: MeshStateLoadedRejectionBreadcrumb | undefined;\n /** Polly#107 post-v0.60 instrumentation. Populated when a storage\n * read inside `buildHandleFactory` exceeds the internal 5s\n * timeout — i.e. `cached.whenReady(...)` or\n * `repo.storageSubsystem.loadDoc(...)` hung. Names the operation,\n * the document id under attempt, the elapsed time, and a\n * pre-formatted message ready to paste into a ticket. The v0.60.0\n * fingerprint diagnosed \"factories hung mid-await, not throwing\"\n * indirectly; this field surfaces the same shape within seconds\n * and in one read. `undefined` means no storage timeout has\n * occurred since module load. */\n storageOpenError: MeshStateStorageOpenError | undefined;\n /** Polly#107 post-v0.59 instrumentation. Per-factory-invocation\n * structured log — one record per `$mesh*` wrapper's lazy handle\n * factory call, ring-buffered at 64 entries. Each row names the\n * exit path (`returned-cached`, `loaded-from-storage`,\n * `seeded-and-imported`, `threw`) and the synchronous peek at\n * `repo.handles[docId]` taken in the factory's `finally`. The\n * v0.59.0 fingerprint had `lazyInvocations === lazyReachedRepo`\n * and no `lastLoadedRejection`; this field disambiguates which\n * exit path each \"successful\" invocation actually took and\n * whether the Repo registered the handle in spite of the lack of\n * a thrown error. The smoking gun for H-Q1 is rows with\n * `exitReason: \"seeded-and-imported\"` and\n * `handleRegistered: false`. */\n lazyWrappers: MeshStateLazyWrapperRecord[];\n /** Polly#107 post-v0.60 instrumentation. One entry per\n * `DocumentId` that appears in more than one\n * {@link lazyWrappers} record — the shape behind the v0.60.0\n * single-tab fingerprint's \"17 wrappers / 16 `repo.handles`\"\n * off-by-one. Empty when wrapper-to-handle accounting is\n * one-to-one, populated when two factory invocations resolved to\n * the same `DocumentId` (most commonly the same logical key\n * registered from two consumer call sites during pre-warm). */\n lazyWrapperDuplicateDocIds: MeshStateLazyWrapperDocIdDuplicate[];\n}\n\n/** The mesh client's enriched per-peer state snapshot. Mirrors the\n * underlying {@link MeshWebRTCAdapter.getPeerStateSnapshot} shape but\n * replaces the slot's `handles` map with the Repo-enriched view\n * polly#107 adds. */\nexport interface MeshClientPeerStateSnapshot {\n localPeerId: string;\n knownPeerIds: string[];\n presentPeerIds: string[];\n sweep: ReturnType<MeshWebRTCAdapter[\"getPeerStateSnapshot\"]>[\"sweep\"];\n peers: Array<\n Omit<ReturnType<MeshWebRTCAdapter[\"getPeerStateSnapshot\"]>[\"peers\"][number], \"slot\"> & {\n slot:\n | undefined\n | (Omit<\n NonNullable<\n ReturnType<MeshWebRTCAdapter[\"getPeerStateSnapshot\"]>[\"peers\"][number][\"slot\"]\n >,\n \"handles\"\n > & {\n handles: Record<string, MeshClientHandleSnapshot>;\n });\n }\n >;\n /** polly#107 H5 diagnostics. See {@link MeshStateModuleDiagnostics}. */\n meshStateModule: MeshStateModuleDiagnostics;\n /** Count of handles known to the Repo this client owns. Compared\n * to the count the consumer's `$meshState` wrappers should have\n * registered: a mismatch (e.g. consumer pre-warmed 14 wrappers,\n * snapshot reports 1) confirms the H5 module-duplication\n * fingerprint without needing a separate read. */\n repoHandleCount: number;\n /** All handle ids the Repo this client owns currently caches.\n * Together with `repoHandleCount` and `meshStateModule.moduleId`,\n * this answers \"did the consumer's wrappers land their handles in\n * THIS Repo?\" in one read. */\n repoHandleIds: string[];\n}\n\n/** Handle returned by {@link createMeshClient}. */\nexport interface MeshClient {\n /** The Automerge Repo. `$meshState` has already been configured against\n * this repo, so primitives just work — but the repo is exposed in case\n * the application needs it directly (server-side cron, bulk exports,\n * migration tools). */\n repo: Repo;\n /** The current keyring. Reads through the same live source the network\n * adapter uses, so the value always reflects the latest snapshot —\n * including changes introduced after construction via in-place mutation\n * or a `{ source }` callback. Applications can inspect or mutate the\n * returned object (add authorised peers, apply revocations) and the\n * next mesh message sees the change. */\n readonly keyring: MeshKeyring;\n /** The signalling client. Exposed for applications that need to hook\n * lifecycle events or send custom signalling payloads. */\n signaling: MeshSignalingClient;\n /** The WebRTC network adapter. Exposed for advanced use (blob store\n * wiring, peer-connection introspection). */\n networkAdapter: MeshNetworkAdapter;\n /** The underlying WebRTC adapter wrapped by {@link networkAdapter}. */\n webrtcAdapter: MeshWebRTCAdapter;\n /** Re-evaluate every peer currently in the signalling roster and\n * dial the ones the keyring now authorises that this client has not\n * already dialled. Equivalent to\n * {@link MeshWebRTCAdapter.refreshKnownPeers}; the periodic sweep\n * inside the WebRTC adapter calls the same code path, so consumers\n * only need this helper when they want to skip the wait between\n * sweeps after applying a pair token. Polly issue #103 — the path\n * the sweep was added to close — is the canonical use case. */\n refreshKnownPeers(): void;\n /** Snapshot of the mesh client's per-peer state — keyring\n * membership, signalling presence, per-slot SDP / ICE /\n * connectionState / data-channel state, queued-send / queued-ICE\n * depth, and per-peer per-handle sync state (state, announcedToPeer,\n * last sync message in/out). Plain data, safe to log or render.\n * Exists so a consumer harness can answer \"is the mesh layer in a\n * known good state, AND has Automerge actually announced every\n * local handle to every connected peer\" without instrumenting polly\n * internals. Polly issue #103 item 7; polly#107 item 7 added the\n * per-handle enrichment that this method overlays on top of the\n * underlying {@link MeshWebRTCAdapter} snapshot. */\n getPeerStateSnapshot(): MeshClientPeerStateSnapshot;\n /** Refresh every active peer slot's transport-level summary —\n * selected ICE candidate pair, SCTP retransmission counters, last\n * data-channel error — and populate it into the next\n * {@link getPeerStateSnapshot}. Walks {@link RTCPeerConnection.getStats}\n * once per peer, so it isn't free; consumers that want continuous\n * visibility should call this on a polling cadence the cost can\n * absorb. Polly issue #105 item 7. */\n refreshTransportStats(): Promise<void>;\n /** Force the Automerge synchronizer to re-evaluate every (handle ×\n * peer) pair and `beginSync` for any pair that should be syncing\n * but isn't. Called automatically on `peer-candidate` post-#107;\n * exposed for explicit invocation by harnesses that need to assert\n * the fix is engaged or that want a deterministic checkpoint after\n * post-construction handle additions.\n *\n * Resolves once the synchronizer's internal `Promise.allSettled`\n * over per-doc reevaluations resolves. Idempotent: if every pair is\n * already syncing this is a no-op. Polly issue #107 item 7. */\n reevaluateAllSync(): Promise<void>;\n /** Close the signalling WebSocket, tear down every RTCPeerConnection,\n * and shut the Repo cleanly. Idempotent. */\n close(): Promise<void>;\n}\n\n/**\n * Construct a fully-wired mesh client. Resolves once the signalling\n * connection is open and the Repo is ready to mutate documents; WebRTC\n * peer connections negotiate asynchronously in the background.\n */\nexport async function createMeshClient(options: CreateMeshClientOptions): Promise<MeshClient> {\n const keyringSource = await resolveKeyringSource(options.keyring);\n const keyring = keyringSource();\n const encryptionEnabled = options.encryptionEnabled ?? true;\n\n // A mesh keyring must carry the per-Repo document key used by\n // MeshNetworkAdapter's encryption layer. We fail loud rather than\n // silently disable encryption when encryptionEnabled is true.\n if (encryptionEnabled && !keyring.documentKeys.has(DEFAULT_MESH_KEY_ID)) {\n throw new Error(\n `createMeshClient: encryption is enabled but the keyring has no document key for \"${DEFAULT_MESH_KEY_ID}\". Bootstrap or apply a pairing token that carries the document key before connecting.`\n );\n }\n\n // Seed the WebRTC adapter with the keyring's current `knownPeers`\n // snapshot AND wire it to the same live keyring source the crypto\n // layer uses. The snapshot is kept for the legacy captured-set path\n // (consumers wiring MeshWebRTCAdapter directly without a source) and\n // as a \"first sweep\" hint; the live source is what closes polly\n // issue #103, where a long-lived daemon's keyring gains entries\n // through `applyPairingToken` after the adapter is already up and\n // the captured Set would otherwise never learn about them. The\n // crypto layer (MeshNetworkAdapter) reads the same source on every\n // send/receive — see mesh-network-adapter.ts for the matching\n // contract.\n const knownPeerIds = [...keyring.knownPeers.keys()].filter(\n (id) => id !== options.signaling.peerId\n );\n\n // The resolver wins when both are set. Failure here surfaces as a\n // create-time rejection rather than a silent fall-through to STUN-only,\n // which would mask broken credential plumbing until a real symmetric\n // NAT user reported \"can't connect\".\n const resolvedIceServers = await resolveIceServers(options.rtc);\n\n const webrtcAdapterOptions: MeshWebRTCAdapterOptions = {\n signaling: undefined as unknown as MeshSignalingClient, // wired after signaling construction\n peerId: options.signaling.peerId,\n knownPeerIds,\n keyringSource,\n ...(resolvedIceServers !== undefined && { iceServers: resolvedIceServers }),\n ...(options.rtc?.iceTransportPolicy !== undefined && {\n iceTransportPolicy: options.rtc.iceTransportPolicy,\n }),\n ...(options.rtc?.iceRelayEnforcement !== undefined && {\n iceRelayEnforcement: options.rtc.iceRelayEnforcement,\n }),\n ...(options.rtc?.dataChannelLabel !== undefined && {\n dataChannelLabel: options.rtc.dataChannelLabel,\n }),\n ...(options.rtc?.RTCPeerConnection !== undefined && {\n RTCPeerConnection: options.rtc.RTCPeerConnection,\n }),\n ...(options.rtc?.knownPeersRefreshIntervalMs !== undefined && {\n knownPeersRefreshIntervalMs: options.rtc.knownPeersRefreshIntervalMs,\n }),\n ...(options.rtc?.syncYieldEnabled !== undefined && {\n syncYieldEnabled: options.rtc.syncYieldEnabled,\n }),\n ...(options.rtc?.syncFragmentChunkSizeOverride !== undefined && {\n syncFragmentChunkSizeOverride: options.rtc.syncFragmentChunkSizeOverride,\n }),\n };\n\n // The signalling client needs a handleSignal callback, but that callback\n // lives on the WebRTC adapter — which itself wants a reference to the\n // signalling client for sending answers. Break the cycle by letting the\n // signalling client's callbacks reach the adapter through a closure\n // over `webrtcAdapter`, which is assigned immediately below. The same\n // closure pattern wires the peer-discovery callbacks\n // (onPeersPresent / onPeerJoined / onPeerLeft) through to the adapter's\n // dispatch methods.\n let webrtcAdapter: MeshWebRTCAdapter | undefined;\n const signaling = new MeshSignalingClient({\n url: options.signaling.url,\n peerId: options.signaling.peerId,\n ...(options.signaling.WebSocket !== undefined && { WebSocket: options.signaling.WebSocket }),\n ...(options.signaling.onError !== undefined && { onError: options.signaling.onError }),\n ...(options.signaling.onCustomFrame !== undefined && {\n onCustomFrame: options.signaling.onCustomFrame,\n }),\n onSignal: (fromPeerId, payload) => {\n webrtcAdapter?.handleSignal(fromPeerId, payload);\n },\n onPeersPresent: (peerIds) => {\n webrtcAdapter?.handlePeersPresent(peerIds);\n },\n onPeerJoined: (peerId) => {\n webrtcAdapter?.handlePeerJoined(peerId);\n },\n onPeerLeft: (peerId) => {\n webrtcAdapter?.handlePeerLeft(peerId);\n },\n });\n\n webrtcAdapterOptions.signaling = signaling;\n webrtcAdapter = new MeshWebRTCAdapter(webrtcAdapterOptions);\n\n const networkAdapter = new MeshNetworkAdapter({\n base: webrtcAdapter,\n keyringSource,\n encryptionEnabled,\n });\n\n // The Repo's peerId MUST match the mesh peer id we signed the keyring\n // against. Automerge would otherwise auto-generate a random \"peer-xxxxx\"\n // identifier, and `MeshNetworkAdapter`'s outgoing envelope would carry\n // that auto-id as its `senderId` — a value the remote keyring has never\n // seen and cannot look up in `knownPeers`. Every message would then fail\n // signature verification silently, and no `$meshState` sync would ever\n // apply.\n const repo = new Repo({\n network: [networkAdapter],\n peerId: options.signaling.peerId as unknown as PeerId,\n ...(options.repoStorage !== undefined && { storage: options.repoStorage }),\n });\n\n configureMeshState(repo);\n\n // polly#107 — on peer-candidate, force the synchronizer to\n // re-evaluate every (handle × peer) pair so any handle whose\n // `addDocument`/`addPeer` ordering race left it un-synced for this\n // peer gets `beginSync` invoked synchronously after the peer is\n // registered. The default Automerge flow IS supposed to handle this\n // through the `addPeer`-iterates-docSynchronizers and\n // `addDocument`-iterates-#peers cross-paths, but the polly#107\n // failing-shape evidence (fourteen pre-warmed handles, peer-candidate\n // fires, firstOutboundSendAt stays `(none)`) shows that path leaves\n // a gap in the realistic case. `reevaluateDocumentShare` walks every\n // docSynchronizer and starts a `beginSync` for every peer that\n // should be syncing but isn't — idempotent for handles that already\n // started, load-bearing for handles that didn't.\n //\n // Falsification gate (POLLY_107_DISABLE_FIX=1): skip the\n // re-evaluation so the pre-fix shape is preserved. The polly#107\n // example asserts that pre-fix-emulated runs produce the named\n // failure \"Automerge never invoked NetworkAdapter.send despite N\n // handles in repo and inbound messages received\", which is exactly\n // the production shape the ticket reports.\n installPolly107SyncReevaluation(networkAdapter, repo);\n\n await signaling.connect();\n\n return {\n repo,\n get keyring(): MeshKeyring {\n return keyringSource();\n },\n signaling,\n networkAdapter,\n webrtcAdapter,\n refreshKnownPeers: () => {\n webrtcAdapter?.refreshKnownPeers();\n },\n getPeerStateSnapshot: () => {\n // The closure-captured `webrtcAdapter` is assigned synchronously\n // before this object is returned, so the optional chain is\n // belt-and-braces against future construction reorderings.\n if (!webrtcAdapter) {\n return {\n localPeerId: options.signaling.peerId,\n knownPeerIds: [],\n presentPeerIds: [],\n sweep: {\n enabled: false,\n intervalMs: 0,\n runCount: 0,\n lastRunAt: undefined,\n },\n peers: [],\n meshStateModule: buildMeshStateModuleDiagnostics(),\n repoHandleCount: Object.keys(repo.handles).length,\n repoHandleIds: Object.keys(repo.handles),\n };\n }\n const base = webrtcAdapter.getPeerStateSnapshot() as ReturnType<\n MeshWebRTCAdapter[\"getPeerStateSnapshot\"]\n >;\n // Enrich the adapter view with Repo-side handle state so the\n // polly#107 item 7 contract is observable in one place. The\n // adapter sees only the wire path; the Repo's `handles` map\n // owns the `state` (ready / loading / unavailable) and is the\n // canonical answer to \"what handles does the local replica\n // hold?\". Combining them produces \"for each handle this replica\n // holds, has Automerge announced it to this peer yet?\". The\n // failure shape polly#107 reports is precisely the case where\n // every entry in `repo.handles` is `ready` and every\n // corresponding `slot.handles[docId].lastSyncMessageOutAt` is\n // `undefined`.\n const repoHandles = repo.handles as unknown as Record<string, { state: unknown } | undefined>;\n const knownHandleIds = Object.keys(repoHandles);\n const enrichedPeers: MeshClientPeerStateSnapshot[\"peers\"] = base.peers.map((peer) =>\n enrichPeerSlot(peer, knownHandleIds, repoHandles)\n );\n const out: MeshClientPeerStateSnapshot = {\n localPeerId: base.localPeerId,\n knownPeerIds: base.knownPeerIds,\n presentPeerIds: base.presentPeerIds,\n sweep: base.sweep,\n peers: enrichedPeers,\n meshStateModule: buildMeshStateModuleDiagnostics(),\n repoHandleCount: knownHandleIds.length,\n repoHandleIds: knownHandleIds,\n };\n return out;\n },\n reevaluateAllSync: async () => {\n const reevaluate = getReevaluateDocumentShare(repo);\n if (!reevaluate) return;\n await reevaluate();\n },\n refreshTransportStats: async () => {\n if (!webrtcAdapter) return;\n await webrtcAdapter.refreshAllTransportStats();\n },\n close: async () => {\n signaling.close();\n webrtcAdapter?.disconnect();\n await repo.shutdown();\n },\n };\n}\n\nasync function resolveKeyringSource(\n source: MeshKeyring | { storage: KeyringStorage } | { source: () => MeshKeyring }\n): Promise<() => MeshKeyring> {\n if (typeof source === \"object\" && source !== null && \"source\" in source) {\n return source.source;\n }\n if (\"storage\" in source) {\n const loaded = await source.storage.load();\n if (loaded === null) {\n throw new Error(\n \"createMeshClient: keyring storage returned null (no saved keyring). In a Node CLI, bootstrap with `bootstrapCliKeyring` from `@fairfox/polly/mesh/node`; in a browser, run your pairing flow first and save the keyring through the storage adapter before constructing the client.\"\n );\n }\n return () => loaded;\n }\n return () => source;\n}\n",
|
|
14
|
+
"/**\n * mesh-client — first-class factory for constructing a Polly mesh client.\n *\n * The mesh transport stack has five pieces that have to be wired together:\n * a {@link MeshSignalingClient} talking to the relay server, a\n * {@link MeshWebRTCAdapter} that owns the per-peer RTCPeerConnections, a\n * {@link MeshNetworkAdapter} that signs and encrypts every message on the\n * way through, an Automerge `Repo` that drives sync, and a `MeshKeyring`\n * that holds the crypto material. Prior to this module, every consuming\n * application had to assemble the five pieces by hand — and in Node or\n * Bun had to monkey-patch `globalThis.WebSocket` / `globalThis.RTCPeerConnection`\n * because the lower-level primitives reached for those globals.\n *\n * `createMeshClient` takes options, hands back a `MeshClient`, and also\n * calls `configureMeshState(client.repo)` so `$meshState` works without\n * a second setup step. The WebSocket and RTCPeerConnection implementations\n * are injectable; defaults read from `globalThis` for browser ergonomics.\n * The companion `@fairfox/polly/mesh/node` subpath provides a CLI bootstrap\n * helper that wires werift (or `@roamhq/wrtc` if the consumer prefers) and\n * a file-backed keyring store.\n */\n\nimport { type PeerId, Repo, type StorageAdapterInterface } from \"@automerge/automerge-repo/slim\";\nimport type { KeyringStorage } from \"./keyring-storage\";\nimport { DEFAULT_MESH_KEY_ID, type MeshKeyring, MeshNetworkAdapter } from \"./mesh-network-adapter\";\nimport { MeshSignalingClient, type MeshSignalingClientOptions } from \"./mesh-signaling-client\";\nimport {\n configureMeshState,\n getLastConfiguredRepoPeerId,\n getLastLoadedRejection,\n getLazyInvocations,\n getLazyReachedRepo,\n getLazyWrappers,\n getMeshStateModuleId,\n getStorageOpenError,\n isMeshStateConfigured,\n type MeshStateLazyWrapperRecord,\n type MeshStateLoadedRejectionBreadcrumb,\n type MeshStateStorageOpenError,\n wasMeshStateResolved,\n} from \"./mesh-state\";\nimport { MeshWebRTCAdapter, type MeshWebRTCAdapterOptions } from \"./mesh-webrtc-adapter\";\n\n/** Options for {@link createMeshClient}. */\nexport interface CreateMeshClientOptions {\n /** Signalling-server configuration. `peerId` must be the same identity\n * this client's keyring was paired with on other peers. */\n signaling: {\n url: string;\n peerId: string;\n /** Optional WebSocket ctor override (e.g. `ws` on old Node). Defaults\n * to `globalThis.WebSocket`. */\n WebSocket?: MeshSignalingClientOptions[\"WebSocket\"];\n /** Forwarded error callback for diagnostic UI. */\n onError?: MeshSignalingClientOptions[\"onError\"];\n /** Forwarded hook for custom signalling frames. See\n * {@link MeshSignalingClientOptions.onCustomFrame} — consumers who\n * layer application protocols on the signalling socket receive\n * frames of unknown types here. */\n onCustomFrame?: MeshSignalingClientOptions[\"onCustomFrame\"];\n };\n /** WebRTC configuration. On browsers the defaults are fine; in Node or\n * Bun pass the `RTCPeerConnection` ctor from `werift` or `@roamhq/wrtc`. */\n rtc?: {\n RTCPeerConnection?: MeshWebRTCAdapterOptions[\"RTCPeerConnection\"];\n iceServers?: RTCIceServer[];\n /**\n * Async resolver for ICE servers, called once at connect time. Wins\n * over `iceServers` if both are set. The realistic pattern is a\n * consumer fetching short-lived TURN credentials from its own\n * backend before each session — for production WebRTC apps that\n * care about coverage, TURN is the only way two peers behind\n * symmetric NATs (cellular CGNAT, some corporate firewalls) can\n * exchange bytes at all.\n *\n * Common provider shapes:\n *\n * - **Self-hosted coturn**: fetch a HMAC-derived ephemeral\n * `username` / `credential` pair from your backend and return\n * `[{ urls: \"turn:turn.example.com\", username, credential }]`.\n * - **Cloudflare Calls**: hit `/v1/turn/keys/<id>/credentials/generate`\n * from a server route and pass the returned `iceServers` array\n * straight through.\n * - **Twilio NTS**: call the network-traversal-service endpoint\n * server-side and forward `data.iceServers`.\n * - **metered.ca / Xirsys / etc.**: same pattern — credentials live\n * server-side, the resolver is the integration point.\n *\n * Resolution happens once. ICE restart with refreshed credentials\n * is a separate concern that this hook does not yet cover; if your\n * deployment needs it, tear down and rebuild the mesh client when\n * the credential window closes.\n */\n iceCredentialResolver?: () => Promise<RTCIceServer[]>;\n /** Forward of {@link MeshWebRTCAdapterOptions.iceTransportPolicy}.\n * Set to `\"relay\"` to force every candidate pair through TURN; the\n * default leaves the underlying {@link RTCPeerConnection}\n * implementation's default in place. The\n * `examples/mesh-large-initial-sync-turn` harness uses `\"relay\"` to\n * exercise the polly#105 real-transport contract. */\n iceTransportPolicy?: MeshWebRTCAdapterOptions[\"iceTransportPolicy\"];\n /** Forward of {@link MeshWebRTCAdapterOptions.iceRelayEnforcement}.\n * Defaults to `true`. Set to `false` to bypass the polly#105\n * relay-only enforcement layer; the\n * `examples/mesh-large-initial-sync-turn` falsification path\n * (`POLLY_105_DISABLE_TURN_FIX=1`) does this to reproduce the\n * pre-#105 candidate-leak shape. Production callers should leave\n * this at the default. */\n iceRelayEnforcement?: MeshWebRTCAdapterOptions[\"iceRelayEnforcement\"];\n dataChannelLabel?: string;\n /** How often the mesh client re-evaluates whether to dial peers\n * already present in the signalling roster against the live\n * keyring. The sweep is what makes\n * `applyPairingToken(token, keyring)` calls performed *after* the\n * mesh client is up take effect on the WebRTC layer without\n * requiring the consumer to call\n * {@link MeshClient.refreshKnownPeers} by hand — see polly issue\n * #103 for the failure mode this closes. Defaults to 2000ms; set\n * to 0 to disable (the captured-set-only behaviour, kept for\n * migrations and for the pre-fix demonstration shape in\n * `examples/mesh-recovery-pair`). Forwarded straight to\n * {@link MeshWebRTCAdapterOptions.knownPeersRefreshIntervalMs}. */\n knownPeersRefreshIntervalMs?: MeshWebRTCAdapterOptions[\"knownPeersRefreshIntervalMs\"];\n /** Forward of {@link MeshWebRTCAdapterOptions.syncYieldEnabled}.\n * Defaults to `true`. The `examples/mesh-large-initial-sync`\n * example flips this to `false` when `POLLY_104_DISABLE_FIX=1` is\n * set, to demonstrate the pre-#104 tight-loop behaviour against\n * post-fix polly. Production callers should leave this at the\n * default. */\n syncYieldEnabled?: MeshWebRTCAdapterOptions[\"syncYieldEnabled\"];\n /** Forward of\n * {@link MeshWebRTCAdapterOptions.syncFragmentChunkSizeOverride}.\n * Production callers should leave this undefined. The\n * `examples/mesh-large-initial-sync` example passes 64 KiB when\n * `POLLY_104_DISABLE_FIX=1` to recreate the pre-#104\n * fragmentation bug. */\n syncFragmentChunkSizeOverride?: MeshWebRTCAdapterOptions[\"syncFragmentChunkSizeOverride\"];\n };\n /** The local peer's keyring — one of three shapes:\n *\n * - A {@link MeshKeyring} instance. The same object is used for the\n * lifetime of the mesh client; in-place mutations to its `knownPeers`\n * and `documentKeys` maps are visible to the next send and receive\n * (`MeshNetworkAdapter` re-reads the keyring on every message, so\n * `applyPairingToken` and friends take effect without a restart).\n *\n * - `{ storage }`: load the keyring once via the persistence adapter.\n * When `storage.load()` resolves to `null`, the factory throws with\n * a message pointing at the bootstrap helper in\n * `@fairfox/polly/mesh/node`; we deliberately do not generate an\n * identity silently.\n *\n * - `{ source }`: a synchronous function returning the current keyring.\n * Called by `MeshNetworkAdapter` on every send and every receive.\n * This is the shape that lets a long-lived mesh client recover from\n * keyring updates written by a *different* process — wire the\n * `source` to a cached object that a file watcher (or `readFileSync`\n * on each call) refreshes from disk, and a freshly-paired peer\n * becomes visible to the running adapter without any explicit\n * notification path. See polly issue #100. */\n keyring: MeshKeyring | { storage: KeyringStorage } | { source: () => MeshKeyring };\n /** Optional Automerge-Repo storage adapter. Applications that want\n * durable local state pass an IndexedDB adapter in browsers or a\n * filesystem adapter in Node; omitting it keeps the Repo in-memory. */\n repoStorage?: StorageAdapterInterface;\n /** When `false`, signs but does not encrypt. Defaults to `true` — the\n * full $meshState posture where the server is off the data path. */\n encryptionEnabled?: boolean;\n}\n\n/**\n * Resolve the ICE server list a mesh client will use. The resolver wins\n * over a static `iceServers` list because the realistic deployment shape\n * is a consumer fetching short-lived TURN credentials per session — the\n * resolver is the integration point and a static list alongside it would\n * silently mask a broken credential flow. Exported for unit tests; the\n * production call site is inside {@link createMeshClient}.\n */\nexport async function resolveIceServers(\n rtc: CreateMeshClientOptions[\"rtc\"]\n): Promise<RTCIceServer[] | undefined> {\n if (rtc?.iceCredentialResolver) {\n return rtc.iceCredentialResolver();\n }\n return rtc?.iceServers;\n}\n\n/** Build the per-handle entry the polly#107 snapshot enrichment emits.\n * Combines the Repo-side `state` (the canonical lifecycle) with the\n * adapter-side wire timestamps. Extracted from the snapshot mapper to\n * keep the per-peer iteration under the cognitive-complexity ceiling. */\nfunction buildHandleEntry(\n state: string,\n wire:\n | {\n lastSyncMessageOutAt: number | undefined;\n lastSyncMessageInAt: number | undefined;\n lastSyncMessageOutSize: number | undefined;\n lastSyncMessageOutType: string | undefined;\n }\n | undefined,\n syncStateView: PerPeerDocSyncView\n): MeshClientHandleSnapshot {\n return {\n state,\n announcedToPeer: wire?.lastSyncMessageOutAt !== undefined,\n lastSyncMessageOutAt: wire?.lastSyncMessageOutAt,\n lastSyncMessageInAt: wire?.lastSyncMessageInAt,\n lastSyncMessageOutSize: wire?.lastSyncMessageOutSize,\n lastSyncMessageOutType: wire?.lastSyncMessageOutType,\n docSynchronizerExists: syncStateView.docSynchronizerExists,\n docSynchronizerKnowsPeer: syncStateView.docSynchronizerKnowsPeer,\n peerDocumentStatus: syncStateView.peerDocumentStatus,\n };\n}\n\n/** Per-(docId, peerId) view into Automerge's `CollectionSynchronizer`.\n * Built once per snapshot read and consulted from {@link buildHandleEntry}.\n * Structured this way so the docSynchronizer lookup is paid once per\n * docId, not once per (docId × peer). */\ninterface PerPeerDocSyncView {\n /** `true` iff Automerge's `CollectionSynchronizer.docSynchronizers`\n * has an entry for this documentId. A handle that exists in\n * `repo.handles` but has no corresponding `docSynchronizer` is the\n * `addDocument`-was-never-called fingerprint — Automerge's\n * NetworkSubsystem can never invoke `send` for it because no\n * synchronizer is wired up. */\n docSynchronizerExists: boolean;\n /** `true` iff the docSynchronizer for this documentId has registered\n * this peer in its internal peer list (`#peers`). `false` with\n * `docSynchronizerExists: true` is the symmetric polly#107 gap: the\n * synchronizer exists (`addDocument` ran) but `addPeer` was never\n * called for this peer on this doc — typically because the handle\n * was created AFTER `peer-candidate` fired and Automerge's\n * `addDocument`-iterates-known-peers path missed it. `undefined`\n * when no docSynchronizer exists. */\n docSynchronizerKnowsPeer: boolean | undefined;\n /** Automerge's `DocSynchronizer.peerStates[peerId]` — one of\n * `\"unknown\"`, `\"has\"`, `\"unavailable\"`, `\"wants\"`. `\"unknown\"`\n * with `lastSyncMessageOutAt` set means the local side sent its\n * opening handshake but never advanced past it; this is the\n * wedged-pair fingerprint #112 names. `undefined` when no\n * docSynchronizer exists OR when the synchronizer exists but\n * doesn't track this peer. */\n peerDocumentStatus: string | undefined;\n}\n\n/** Minimal structural shape we lift off Automerge's hidden\n * `Repo.synchronizer` / `CollectionSynchronizer` types. Kept narrow\n * so a future Automerge bump that renames a private rip doesn't\n * topple the snapshot path. */\ninterface SynchronizerStructural {\n docSynchronizers?: Record<\n string,\n {\n hasPeer?: (peerId: string) => boolean;\n peerStates?: Record<string, string>;\n }\n >;\n}\n\nconst EMPTY_SYNC_VIEW: PerPeerDocSyncView = {\n docSynchronizerExists: false,\n docSynchronizerKnowsPeer: undefined,\n peerDocumentStatus: undefined,\n};\n\n/** Internal — exported for direct unit-test coverage of the #112\n * structural reader and snapshot wiring. Not part of the public API. */\nexport const __test__ = {\n buildSyncView: (\n synchronizer: SynchronizerStructural | undefined,\n docId: string,\n peerId: string\n ): PerPeerDocSyncView => buildSyncView(synchronizer, docId, peerId),\n EMPTY_SYNC_VIEW,\n getCollectionSynchronizer: (repo: Repo): SynchronizerStructural | undefined =>\n getCollectionSynchronizer(repo),\n enrichPeerSlot: (\n peer: ReturnType<MeshWebRTCAdapter[\"getPeerStateSnapshot\"]>[\"peers\"][number],\n knownHandleIds: string[],\n repoHandles: Record<string, { state: unknown } | undefined>,\n synchronizer: SynchronizerStructural | undefined\n ): MeshClientPeerStateSnapshot[\"peers\"][number] =>\n enrichPeerSlot(peer, knownHandleIds, repoHandles, synchronizer),\n};\n\nfunction getCollectionSynchronizer(repo: Repo): SynchronizerStructural | undefined {\n const sync = (repo as unknown as { synchronizer?: SynchronizerStructural }).synchronizer;\n return sync && typeof sync === \"object\" ? sync : undefined;\n}\n\n/** Build the per-(docId, peerId) docSynchronizer view for one peer. */\nfunction buildSyncView(\n synchronizer: SynchronizerStructural | undefined,\n docId: string,\n peerId: string\n): PerPeerDocSyncView {\n const docSync = synchronizer?.docSynchronizers?.[docId];\n if (!docSync) return EMPTY_SYNC_VIEW;\n let knowsPeer: boolean | undefined;\n try {\n knowsPeer = typeof docSync.hasPeer === \"function\" ? docSync.hasPeer(peerId) : undefined;\n } catch {\n knowsPeer = undefined;\n }\n let status: string | undefined;\n try {\n const states = docSync.peerStates;\n status = states && typeof states === \"object\" ? states[peerId] : undefined;\n } catch {\n status = undefined;\n }\n return {\n docSynchronizerExists: true,\n docSynchronizerKnowsPeer: knowsPeer,\n peerDocumentStatus: status,\n };\n}\n\n/** Stringify a Repo handle's `state` value for the enriched snapshot.\n * Handles whose machine snapshot returns an object collapse to a\n * coerced string; in practice polly's $meshState always lands on a\n * leaf string. Returns `\"unknown\"` when the handle entry itself is\n * undefined. */\nfunction stringifyHandleState(handle: { state: unknown } | undefined): string {\n if (handle === undefined) return \"unknown\";\n return typeof handle.state === \"string\" ? handle.state : String(handle.state ?? \"unknown\");\n}\n\n/** Enrich one peer's slot view with the per-handle Repo×adapter merge\n * polly#107 item 7 specifies. Pulled out of the snapshot factory so the\n * outer factory stays under the cognitive-complexity ceiling and so\n * the per-iteration code is testable in isolation. */\nfunction enrichPeerSlot(\n peer: ReturnType<MeshWebRTCAdapter[\"getPeerStateSnapshot\"]>[\"peers\"][number],\n knownHandleIds: string[],\n repoHandles: Record<string, { state: unknown } | undefined>,\n synchronizer: SynchronizerStructural | undefined\n): MeshClientPeerStateSnapshot[\"peers\"][number] {\n if (!peer.slot) {\n return { ...peer, slot: undefined } as MeshClientPeerStateSnapshot[\"peers\"][number];\n }\n const peerIdString = peer.peerId as unknown as string;\n const enriched: Record<string, MeshClientHandleSnapshot> = {};\n for (const docId of knownHandleIds) {\n enriched[docId] = buildHandleEntry(\n stringifyHandleState(repoHandles[docId]),\n peer.slot.handles[docId],\n buildSyncView(synchronizer, docId, peerIdString)\n );\n }\n for (const docId of Object.keys(peer.slot.handles)) {\n if (enriched[docId]) continue;\n enriched[docId] = buildHandleEntry(\n \"unknown\",\n peer.slot.handles[docId],\n buildSyncView(synchronizer, docId, peerIdString)\n );\n }\n return { ...peer, slot: { ...peer.slot, handles: enriched } };\n}\n\n/** Lift the synchronizer's `reevaluateDocumentShare` method off a Repo\n * through a narrowed structural accessor.\n * `synchronizer.reevaluateDocumentShare` is `@hidden` on the Automerge\n * type, so we reach for it tolerantly — the worst case is the\n * polly#107 fix silently degrades to the pre-fix shape, which the\n * observability layer still surfaces clearly. */\nfunction getReevaluateDocumentShare(repo: Repo): (() => Promise<void>) | undefined {\n const sync = (\n repo as unknown as {\n synchronizer?: { reevaluateDocumentShare?: () => Promise<void> };\n }\n ).synchronizer;\n const fn = sync?.reevaluateDocumentShare;\n if (typeof fn !== \"function\" || sync === undefined) return undefined;\n return () => fn.call(sync);\n}\n\n/** Build the {@link MeshStateModuleDiagnostics} block surfaced on\n * every {@link MeshClient.getPeerStateSnapshot}. Reads the module\n * state in one place so both snapshot construction sites (the\n * pre-adapter early-out and the main path) stay identical. */\nfunction buildMeshStateModuleDiagnostics(): MeshStateModuleDiagnostics {\n const lazyWrappers = getLazyWrappers();\n return {\n moduleId: getMeshStateModuleId(),\n configured: isMeshStateConfigured(),\n lastConfiguredRepoPeerId: getLastConfiguredRepoPeerId(),\n wasResolved: wasMeshStateResolved(),\n lazyInvocations: getLazyInvocations(),\n lazyReachedRepo: getLazyReachedRepo(),\n lastLoadedRejection: getLastLoadedRejection(),\n storageOpenError: getStorageOpenError(),\n lazyWrappers,\n lazyWrapperDuplicateDocIds: findLazyWrapperDocIdDuplicates(lazyWrappers),\n };\n}\n\n/** Polly#107 post-v0.60 instrumentation. Walks the lazy-wrapper log\n * and groups records by `docId`; emits one entry per `docId` that\n * appears in more than one record. Surfaces the \"17 wrappers / 16\n * `repo.handles`\" off-by-one shape that the v0.60.0 single-tab\n * fingerprint flagged — typically two distinct `$mesh*` consumer\n * call sites whose logical keys hash to the same Automerge\n * `DocumentId`, or the same logical key invoked from two consumers\n * during pre-warm before either factory's `repo.import` committed\n * the handle. The snapshot can paste this verbatim; an empty array\n * means the wrapper-to-handle accounting is one-to-one. */\nexport interface MeshStateLazyWrapperDocIdDuplicate {\n /** The `DocumentId` that more than one factory invocation\n * resolved to. */\n docId: string;\n /** Distinct logical keys that derived to this same `DocumentId`.\n * Length 1 means the same key was registered twice; length > 1\n * means two different keys hashed to the same id (a SHA-512-prefix\n * collision in {@link deriveDocumentId}, vanishingly unlikely but\n * detected for completeness). */\n keys: string[];\n /** Total number of records in the lazy-wrapper log that resolved\n * to this `DocumentId`. Typically 2 for a same-key double-call. */\n recordCount: number;\n}\n\nfunction findLazyWrapperDocIdDuplicates(\n records: readonly MeshStateLazyWrapperRecord[]\n): MeshStateLazyWrapperDocIdDuplicate[] {\n const byDocId = new Map<string, { keys: Set<string>; count: number }>();\n for (const record of records) {\n let entry = byDocId.get(record.docId);\n if (!entry) {\n entry = { keys: new Set(), count: 0 };\n byDocId.set(record.docId, entry);\n }\n entry.keys.add(record.key);\n entry.count++;\n }\n const duplicates: MeshStateLazyWrapperDocIdDuplicate[] = [];\n for (const [docId, entry] of byDocId) {\n if (entry.count > 1) {\n duplicates.push({ docId, keys: [...entry.keys], recordCount: entry.count });\n }\n }\n return duplicates;\n}\n\n/** Install the polly#107 peer-candidate hook on a freshly-constructed\n * mesh stack. Hides the falsification-gate branch behind a single call\n * so the outer factory's complexity score stays under the ceiling. */\nfunction installPolly107SyncReevaluation(networkAdapter: MeshNetworkAdapter, repo: Repo): void {\n const disable = typeof process !== \"undefined\" && process.env?.[\"POLLY_107_DISABLE_FIX\"] === \"1\";\n if (disable) return;\n const reevaluate = getReevaluateDocumentShare(repo);\n if (!reevaluate) return;\n networkAdapter.on(\"peer-candidate\", () => {\n void reevaluate().catch(() => {\n // Synchronizer errors are observable through\n // getPeerStateSnapshot; suppressing here keeps a single bad doc\n // from taking down the whole peer-candidate path.\n });\n });\n}\n\n/** Per-peer per-handle enrichment polly#107 adds on top of the\n * {@link MeshWebRTCAdapter} snapshot. `state` and `announcedToPeer`\n * come from the Repo side (which the adapter cannot see); the wire\n * timestamps come from the adapter's per-slot bookkeeping. */\nexport interface MeshClientHandleSnapshot {\n /** The local handle's lifecycle state — `\"ready\"`, `\"loading\"`,\n * `\"unavailable\"`, etc. — as reported by the Repo. `\"unknown\"` is\n * stamped when the wire has seen a sync message for a documentId\n * the local repo hasn't constructed a handle for yet (a remote peer\n * announcing a doc we haven't touched). */\n state: string;\n /** True iff polly's network adapter has dispatched at least one\n * outbound sync message for this document to this peer. Equivalent\n * to `lastSyncMessageOutAt !== undefined` but named for the\n * diagnostic question polly#107 asks the snapshot to answer:\n * \"has Automerge's NetworkSubsystem told this peer about this\n * handle?\". The failing-shape this ticket reports is precisely\n * the case where every entry has `state: \"ready\"` and\n * `announcedToPeer: false`. */\n announcedToPeer: boolean;\n /** `performance.now()` of the most recent outbound sync message for\n * this document to this peer. `undefined` until first send. */\n lastSyncMessageOutAt: number | undefined;\n /** `performance.now()` of the most recent inbound message dispatched\n * upward for this document from this peer. `undefined` until first\n * receive. */\n lastSyncMessageInAt: number | undefined;\n /** Byte length of the most recent outbound message. */\n lastSyncMessageOutSize: number | undefined;\n /** Type field of the most recent outbound message — typically\n * `\"sync\"` after handshake, `\"request\"` while the local side is\n * asking. */\n lastSyncMessageOutType: string | undefined;\n /** #112 diagnostic. `true` iff Automerge's `CollectionSynchronizer`\n * has a `docSynchronizer` entry for this document. A handle in\n * `repo.handles` with no docSynchronizer is the\n * `addDocument`-never-ran fingerprint: Automerge's NetworkSubsystem\n * can never call `send` for it because no synchronizer is wired up. */\n docSynchronizerExists: boolean;\n /** #112 diagnostic. `true` iff the docSynchronizer for this document\n * has this peer in its internal peer list. `false` with\n * `docSynchronizerExists: true` is the symmetric polly#107 gap —\n * the synchronizer exists but `addPeer` was never invoked on it for\n * this peer, typically because the handle was created AFTER\n * `peer-candidate` fired and Automerge's\n * `addDocument`-iterates-peers path missed it. `undefined` when no\n * docSynchronizer exists. */\n docSynchronizerKnowsPeer: boolean | undefined;\n /** #112 diagnostic. Automerge's\n * `DocSynchronizer.peerStates[peerId]` — one of `\"unknown\"`,\n * `\"has\"`, `\"unavailable\"`, `\"wants\"`. `\"unknown\"` together with a\n * set `lastSyncMessageOutAt` is the wedged-pair fingerprint this\n * ticket names: the opening handshake left the wire but the\n * synchronizer never learned whether the remote has the doc, so\n * `generateSyncMessage` quiesces. `undefined` when no\n * docSynchronizer exists OR when the synchronizer does not track\n * this peer. */\n peerDocumentStatus: string | undefined;\n}\n\n/** Polly#107 H5 diagnostics: surfaces the `mesh-state` module\n * instance identity so a single snapshot read tells the operator\n * whether the consumer's `$meshState` wrappers are resolving against\n * the same module instance `createMeshClient` configured. A mismatch\n * here IS the bundle-time module duplication bug. */\nexport interface MeshStateModuleDiagnostics {\n /** The id stamped at import time on the `mesh-state` module\n * instance THIS mesh client was constructed against. Compare to\n * the id seen at the `$meshState` call site (also importable as\n * `MESH_STATE_MODULE_ID` from `@fairfox/polly/mesh`). Two different\n * ids means the consumer is reaching a duplicated copy of\n * `mesh-state.ts` — wrappers register handles against a Repo this\n * mesh client never saw. */\n moduleId: string;\n /** `true` iff THIS module instance has a configured `defaultRepo`.\n * In the H5 scenario, this is `true` for the mesh-client-side\n * snapshot (because `createMeshClient` always calls\n * `configureMeshState` on the module it imports), but the same\n * field read from the consumer's `$meshState` call site would\n * be `false`. */\n configured: boolean;\n /** `peerId` of the most recent Repo wired through\n * `configureMeshState` against THIS module instance. Compared to\n * `client.repo.peerId` and the consumer's wrappers' resolved Repo\n * tells the full story. */\n lastConfiguredRepoPeerId: string | undefined;\n /** `true` if any `$meshState`-family wrapper has been called\n * against THIS module instance at any point. The polly#107 H5\n * fingerprint pair: `configured: true, wasResolved: false` on\n * the mesh-client-side snapshot (the wrappers never reached us);\n * the consumer's wrapper code reading the same field from THEIR\n * `$meshState` import would see `configured: false, wasResolved:\n * true` (they're using a module instance no mesh client ever\n * configured). */\n wasResolved: boolean;\n /** Polly#107 post-H5 instrumentation. Count of `$meshState`-family\n * lazy factory invocations since module load. Once the consumer's\n * pre-warm pass completes, this equals the number of distinct\n * `$mesh*` wrappers whose handles the loader actually tried to\n * resolve. Compared to {@link lazyReachedRepo}: gap = throws\n * before any Repo work. */\n lazyInvocations: number;\n /** Polly#107 post-H5 instrumentation. Count of factory invocations\n * that reached the Repo subsystem (`repo.handles[...]`, `repo.find`\n * or `repo.import`) before returning or throwing. If\n * {@link lazyInvocations} is N and this is N, every wrapper\n * touched the Repo — any missing handles are downstream of Repo\n * registration. If this is < N, the gap is the call site to\n * instrument next. */\n lazyReachedRepo: number;\n /** Polly#107 post-H5 instrumentation. Breadcrumb for the most\n * recent rejection from a `$meshState`-family `loaded` promise\n * (or its factory). Captured even when the consumer's wrapper\n * never awaits `loaded` and the rejection would otherwise vanish\n * silently. `undefined` means no rejection has escaped any\n * wrapper on THIS module instance since module load. */\n lastLoadedRejection: MeshStateLoadedRejectionBreadcrumb | undefined;\n /** Polly#107 post-v0.60 instrumentation. Populated when a storage\n * read inside `buildHandleFactory` exceeds the internal 5s\n * timeout — i.e. `cached.whenReady(...)` or\n * `repo.storageSubsystem.loadDoc(...)` hung. Names the operation,\n * the document id under attempt, the elapsed time, and a\n * pre-formatted message ready to paste into a ticket. The v0.60.0\n * fingerprint diagnosed \"factories hung mid-await, not throwing\"\n * indirectly; this field surfaces the same shape within seconds\n * and in one read. `undefined` means no storage timeout has\n * occurred since module load. */\n storageOpenError: MeshStateStorageOpenError | undefined;\n /** Polly#107 post-v0.59 instrumentation. Per-factory-invocation\n * structured log — one record per `$mesh*` wrapper's lazy handle\n * factory call, ring-buffered at 64 entries. Each row names the\n * exit path (`returned-cached`, `loaded-from-storage`,\n * `seeded-and-imported`, `threw`) and the synchronous peek at\n * `repo.handles[docId]` taken in the factory's `finally`. The\n * v0.59.0 fingerprint had `lazyInvocations === lazyReachedRepo`\n * and no `lastLoadedRejection`; this field disambiguates which\n * exit path each \"successful\" invocation actually took and\n * whether the Repo registered the handle in spite of the lack of\n * a thrown error. The smoking gun for H-Q1 is rows with\n * `exitReason: \"seeded-and-imported\"` and\n * `handleRegistered: false`. */\n lazyWrappers: MeshStateLazyWrapperRecord[];\n /** Polly#107 post-v0.60 instrumentation. One entry per\n * `DocumentId` that appears in more than one\n * {@link lazyWrappers} record — the shape behind the v0.60.0\n * single-tab fingerprint's \"17 wrappers / 16 `repo.handles`\"\n * off-by-one. Empty when wrapper-to-handle accounting is\n * one-to-one, populated when two factory invocations resolved to\n * the same `DocumentId` (most commonly the same logical key\n * registered from two consumer call sites during pre-warm). */\n lazyWrapperDuplicateDocIds: MeshStateLazyWrapperDocIdDuplicate[];\n}\n\n/** The mesh client's enriched per-peer state snapshot. Mirrors the\n * underlying {@link MeshWebRTCAdapter.getPeerStateSnapshot} shape but\n * replaces the slot's `handles` map with the Repo-enriched view\n * polly#107 adds. */\nexport interface MeshClientPeerStateSnapshot {\n localPeerId: string;\n knownPeerIds: string[];\n presentPeerIds: string[];\n sweep: ReturnType<MeshWebRTCAdapter[\"getPeerStateSnapshot\"]>[\"sweep\"];\n peers: Array<\n Omit<ReturnType<MeshWebRTCAdapter[\"getPeerStateSnapshot\"]>[\"peers\"][number], \"slot\"> & {\n slot:\n | undefined\n | (Omit<\n NonNullable<\n ReturnType<MeshWebRTCAdapter[\"getPeerStateSnapshot\"]>[\"peers\"][number][\"slot\"]\n >,\n \"handles\"\n > & {\n handles: Record<string, MeshClientHandleSnapshot>;\n });\n }\n >;\n /** polly#107 H5 diagnostics. See {@link MeshStateModuleDiagnostics}. */\n meshStateModule: MeshStateModuleDiagnostics;\n /** Count of handles known to the Repo this client owns. Compared\n * to the count the consumer's `$meshState` wrappers should have\n * registered: a mismatch (e.g. consumer pre-warmed 14 wrappers,\n * snapshot reports 1) confirms the H5 module-duplication\n * fingerprint without needing a separate read. */\n repoHandleCount: number;\n /** All handle ids the Repo this client owns currently caches.\n * Together with `repoHandleCount` and `meshStateModule.moduleId`,\n * this answers \"did the consumer's wrappers land their handles in\n * THIS Repo?\" in one read. */\n repoHandleIds: string[];\n}\n\n/** Handle returned by {@link createMeshClient}. */\nexport interface MeshClient {\n /** The Automerge Repo. `$meshState` has already been configured against\n * this repo, so primitives just work — but the repo is exposed in case\n * the application needs it directly (server-side cron, bulk exports,\n * migration tools). */\n repo: Repo;\n /** The current keyring. Reads through the same live source the network\n * adapter uses, so the value always reflects the latest snapshot —\n * including changes introduced after construction via in-place mutation\n * or a `{ source }` callback. Applications can inspect or mutate the\n * returned object (add authorised peers, apply revocations) and the\n * next mesh message sees the change. */\n readonly keyring: MeshKeyring;\n /** The signalling client. Exposed for applications that need to hook\n * lifecycle events or send custom signalling payloads. */\n signaling: MeshSignalingClient;\n /** The WebRTC network adapter. Exposed for advanced use (blob store\n * wiring, peer-connection introspection). */\n networkAdapter: MeshNetworkAdapter;\n /** The underlying WebRTC adapter wrapped by {@link networkAdapter}. */\n webrtcAdapter: MeshWebRTCAdapter;\n /** Re-evaluate every peer currently in the signalling roster and\n * dial the ones the keyring now authorises that this client has not\n * already dialled. Equivalent to\n * {@link MeshWebRTCAdapter.refreshKnownPeers}; the periodic sweep\n * inside the WebRTC adapter calls the same code path, so consumers\n * only need this helper when they want to skip the wait between\n * sweeps after applying a pair token. Polly issue #103 — the path\n * the sweep was added to close — is the canonical use case. */\n refreshKnownPeers(): void;\n /** Snapshot of the mesh client's per-peer state — keyring\n * membership, signalling presence, per-slot SDP / ICE /\n * connectionState / data-channel state, queued-send / queued-ICE\n * depth, and per-peer per-handle sync state (state, announcedToPeer,\n * last sync message in/out). Plain data, safe to log or render.\n * Exists so a consumer harness can answer \"is the mesh layer in a\n * known good state, AND has Automerge actually announced every\n * local handle to every connected peer\" without instrumenting polly\n * internals. Polly issue #103 item 7; polly#107 item 7 added the\n * per-handle enrichment that this method overlays on top of the\n * underlying {@link MeshWebRTCAdapter} snapshot. */\n getPeerStateSnapshot(): MeshClientPeerStateSnapshot;\n /** Refresh every active peer slot's transport-level summary —\n * selected ICE candidate pair, SCTP retransmission counters, last\n * data-channel error — and populate it into the next\n * {@link getPeerStateSnapshot}. Walks {@link RTCPeerConnection.getStats}\n * once per peer, so it isn't free; consumers that want continuous\n * visibility should call this on a polling cadence the cost can\n * absorb. Polly issue #105 item 7. */\n refreshTransportStats(): Promise<void>;\n /** Force the Automerge synchronizer to re-evaluate every (handle ×\n * peer) pair and `beginSync` for any pair that should be syncing\n * but isn't. Called automatically on `peer-candidate` post-#107;\n * exposed for explicit invocation by harnesses that need to assert\n * the fix is engaged or that want a deterministic checkpoint after\n * post-construction handle additions.\n *\n * Resolves once the synchronizer's internal `Promise.allSettled`\n * over per-doc reevaluations resolves. Idempotent: if every pair is\n * already syncing this is a no-op. Polly issue #107 item 7. */\n reevaluateAllSync(): Promise<void>;\n /** Close the signalling WebSocket, tear down every RTCPeerConnection,\n * and shut the Repo cleanly. Idempotent. */\n close(): Promise<void>;\n}\n\n/**\n * Construct a fully-wired mesh client. Resolves once the signalling\n * connection is open and the Repo is ready to mutate documents; WebRTC\n * peer connections negotiate asynchronously in the background.\n */\nexport async function createMeshClient(options: CreateMeshClientOptions): Promise<MeshClient> {\n const keyringSource = await resolveKeyringSource(options.keyring);\n const keyring = keyringSource();\n const encryptionEnabled = options.encryptionEnabled ?? true;\n\n // A mesh keyring must carry the per-Repo document key used by\n // MeshNetworkAdapter's encryption layer. We fail loud rather than\n // silently disable encryption when encryptionEnabled is true.\n if (encryptionEnabled && !keyring.documentKeys.has(DEFAULT_MESH_KEY_ID)) {\n throw new Error(\n `createMeshClient: encryption is enabled but the keyring has no document key for \"${DEFAULT_MESH_KEY_ID}\". Bootstrap or apply a pairing token that carries the document key before connecting.`\n );\n }\n\n // Seed the WebRTC adapter with the keyring's current `knownPeers`\n // snapshot AND wire it to the same live keyring source the crypto\n // layer uses. The snapshot is kept for the legacy captured-set path\n // (consumers wiring MeshWebRTCAdapter directly without a source) and\n // as a \"first sweep\" hint; the live source is what closes polly\n // issue #103, where a long-lived daemon's keyring gains entries\n // through `applyPairingToken` after the adapter is already up and\n // the captured Set would otherwise never learn about them. The\n // crypto layer (MeshNetworkAdapter) reads the same source on every\n // send/receive — see mesh-network-adapter.ts for the matching\n // contract.\n const knownPeerIds = [...keyring.knownPeers.keys()].filter(\n (id) => id !== options.signaling.peerId\n );\n\n // The resolver wins when both are set. Failure here surfaces as a\n // create-time rejection rather than a silent fall-through to STUN-only,\n // which would mask broken credential plumbing until a real symmetric\n // NAT user reported \"can't connect\".\n const resolvedIceServers = await resolveIceServers(options.rtc);\n\n const webrtcAdapterOptions: MeshWebRTCAdapterOptions = {\n signaling: undefined as unknown as MeshSignalingClient, // wired after signaling construction\n peerId: options.signaling.peerId,\n knownPeerIds,\n keyringSource,\n ...(resolvedIceServers !== undefined && { iceServers: resolvedIceServers }),\n ...(options.rtc?.iceTransportPolicy !== undefined && {\n iceTransportPolicy: options.rtc.iceTransportPolicy,\n }),\n ...(options.rtc?.iceRelayEnforcement !== undefined && {\n iceRelayEnforcement: options.rtc.iceRelayEnforcement,\n }),\n ...(options.rtc?.dataChannelLabel !== undefined && {\n dataChannelLabel: options.rtc.dataChannelLabel,\n }),\n ...(options.rtc?.RTCPeerConnection !== undefined && {\n RTCPeerConnection: options.rtc.RTCPeerConnection,\n }),\n ...(options.rtc?.knownPeersRefreshIntervalMs !== undefined && {\n knownPeersRefreshIntervalMs: options.rtc.knownPeersRefreshIntervalMs,\n }),\n ...(options.rtc?.syncYieldEnabled !== undefined && {\n syncYieldEnabled: options.rtc.syncYieldEnabled,\n }),\n ...(options.rtc?.syncFragmentChunkSizeOverride !== undefined && {\n syncFragmentChunkSizeOverride: options.rtc.syncFragmentChunkSizeOverride,\n }),\n };\n\n // The signalling client needs a handleSignal callback, but that callback\n // lives on the WebRTC adapter — which itself wants a reference to the\n // signalling client for sending answers. Break the cycle by letting the\n // signalling client's callbacks reach the adapter through a closure\n // over `webrtcAdapter`, which is assigned immediately below. The same\n // closure pattern wires the peer-discovery callbacks\n // (onPeersPresent / onPeerJoined / onPeerLeft) through to the adapter's\n // dispatch methods.\n let webrtcAdapter: MeshWebRTCAdapter | undefined;\n const signaling = new MeshSignalingClient({\n url: options.signaling.url,\n peerId: options.signaling.peerId,\n ...(options.signaling.WebSocket !== undefined && { WebSocket: options.signaling.WebSocket }),\n ...(options.signaling.onError !== undefined && { onError: options.signaling.onError }),\n ...(options.signaling.onCustomFrame !== undefined && {\n onCustomFrame: options.signaling.onCustomFrame,\n }),\n onSignal: (fromPeerId, payload) => {\n webrtcAdapter?.handleSignal(fromPeerId, payload);\n },\n onPeersPresent: (peerIds) => {\n webrtcAdapter?.handlePeersPresent(peerIds);\n },\n onPeerJoined: (peerId) => {\n webrtcAdapter?.handlePeerJoined(peerId);\n },\n onPeerLeft: (peerId) => {\n webrtcAdapter?.handlePeerLeft(peerId);\n },\n });\n\n webrtcAdapterOptions.signaling = signaling;\n webrtcAdapter = new MeshWebRTCAdapter(webrtcAdapterOptions);\n\n const networkAdapter = new MeshNetworkAdapter({\n base: webrtcAdapter,\n keyringSource,\n encryptionEnabled,\n });\n\n // The Repo's peerId MUST match the mesh peer id we signed the keyring\n // against. Automerge would otherwise auto-generate a random \"peer-xxxxx\"\n // identifier, and `MeshNetworkAdapter`'s outgoing envelope would carry\n // that auto-id as its `senderId` — a value the remote keyring has never\n // seen and cannot look up in `knownPeers`. Every message would then fail\n // signature verification silently, and no `$meshState` sync would ever\n // apply.\n const repo = new Repo({\n network: [networkAdapter],\n peerId: options.signaling.peerId as unknown as PeerId,\n ...(options.repoStorage !== undefined && { storage: options.repoStorage }),\n });\n\n configureMeshState(repo);\n\n // polly#107 — on peer-candidate, force the synchronizer to\n // re-evaluate every (handle × peer) pair so any handle whose\n // `addDocument`/`addPeer` ordering race left it un-synced for this\n // peer gets `beginSync` invoked synchronously after the peer is\n // registered. The default Automerge flow IS supposed to handle this\n // through the `addPeer`-iterates-docSynchronizers and\n // `addDocument`-iterates-#peers cross-paths, but the polly#107\n // failing-shape evidence (fourteen pre-warmed handles, peer-candidate\n // fires, firstOutboundSendAt stays `(none)`) shows that path leaves\n // a gap in the realistic case. `reevaluateDocumentShare` walks every\n // docSynchronizer and starts a `beginSync` for every peer that\n // should be syncing but isn't — idempotent for handles that already\n // started, load-bearing for handles that didn't.\n //\n // Falsification gate (POLLY_107_DISABLE_FIX=1): skip the\n // re-evaluation so the pre-fix shape is preserved. The polly#107\n // example asserts that pre-fix-emulated runs produce the named\n // failure \"Automerge never invoked NetworkAdapter.send despite N\n // handles in repo and inbound messages received\", which is exactly\n // the production shape the ticket reports.\n installPolly107SyncReevaluation(networkAdapter, repo);\n\n await signaling.connect();\n\n return {\n repo,\n get keyring(): MeshKeyring {\n return keyringSource();\n },\n signaling,\n networkAdapter,\n webrtcAdapter,\n refreshKnownPeers: () => {\n webrtcAdapter?.refreshKnownPeers();\n },\n getPeerStateSnapshot: () => {\n // The closure-captured `webrtcAdapter` is assigned synchronously\n // before this object is returned, so the optional chain is\n // belt-and-braces against future construction reorderings.\n if (!webrtcAdapter) {\n return {\n localPeerId: options.signaling.peerId,\n knownPeerIds: [],\n presentPeerIds: [],\n sweep: {\n enabled: false,\n intervalMs: 0,\n runCount: 0,\n lastRunAt: undefined,\n },\n peers: [],\n meshStateModule: buildMeshStateModuleDiagnostics(),\n repoHandleCount: Object.keys(repo.handles).length,\n repoHandleIds: Object.keys(repo.handles),\n };\n }\n const base = webrtcAdapter.getPeerStateSnapshot() as ReturnType<\n MeshWebRTCAdapter[\"getPeerStateSnapshot\"]\n >;\n // Enrich the adapter view with Repo-side handle state so the\n // polly#107 item 7 contract is observable in one place. The\n // adapter sees only the wire path; the Repo's `handles` map\n // owns the `state` (ready / loading / unavailable) and is the\n // canonical answer to \"what handles does the local replica\n // hold?\". Combining them produces \"for each handle this replica\n // holds, has Automerge announced it to this peer yet?\". The\n // failure shape polly#107 reports is precisely the case where\n // every entry in `repo.handles` is `ready` and every\n // corresponding `slot.handles[docId].lastSyncMessageOutAt` is\n // `undefined`.\n const repoHandles = repo.handles as unknown as Record<string, { state: unknown } | undefined>;\n const knownHandleIds = Object.keys(repoHandles);\n const synchronizer = getCollectionSynchronizer(repo);\n const enrichedPeers: MeshClientPeerStateSnapshot[\"peers\"] = base.peers.map((peer) =>\n enrichPeerSlot(peer, knownHandleIds, repoHandles, synchronizer)\n );\n const out: MeshClientPeerStateSnapshot = {\n localPeerId: base.localPeerId,\n knownPeerIds: base.knownPeerIds,\n presentPeerIds: base.presentPeerIds,\n sweep: base.sweep,\n peers: enrichedPeers,\n meshStateModule: buildMeshStateModuleDiagnostics(),\n repoHandleCount: knownHandleIds.length,\n repoHandleIds: knownHandleIds,\n };\n return out;\n },\n reevaluateAllSync: async () => {\n const reevaluate = getReevaluateDocumentShare(repo);\n if (!reevaluate) return;\n await reevaluate();\n },\n refreshTransportStats: async () => {\n if (!webrtcAdapter) return;\n await webrtcAdapter.refreshAllTransportStats();\n },\n close: async () => {\n signaling.close();\n webrtcAdapter?.disconnect();\n await repo.shutdown();\n },\n };\n}\n\nasync function resolveKeyringSource(\n source: MeshKeyring | { storage: KeyringStorage } | { source: () => MeshKeyring }\n): Promise<() => MeshKeyring> {\n if (typeof source === \"object\" && source !== null && \"source\" in source) {\n return source.source;\n }\n if (\"storage\" in source) {\n const loaded = await source.storage.load();\n if (loaded === null) {\n throw new Error(\n \"createMeshClient: keyring storage returned null (no saved keyring). In a Node CLI, bootstrap with `bootstrapCliKeyring` from `@fairfox/polly/mesh/node`; in a browser, run your pairing flow first and save the keyring through the storage adapter before constructing the client.\"\n );\n }\n return () => loaded;\n }\n return () => source;\n}\n",
|
|
15
15
|
"/**\n * mesh-network-adapter — Phase 2 wrapping NetworkAdapter that adds Polly's\n * mesh-transport semantics on top of any underlying Automerge NetworkAdapter.\n *\n * The mesh transport's job is to make every message between peers signed\n * and encrypted before it reaches the wire. Rather than reimplementing the\n * Automerge sync protocol, this adapter takes a base adapter (in production\n * a real WebRTC or WebSocket adapter; in tests an in-memory loopback) and\n * applies the crypto envelope to every message that flows through.\n *\n * Outgoing path (Repo → wire):\n * 1. The Repo's NetworkSubsystem calls send(message) on this adapter.\n * 2. We serialise the message to bytes, encrypt them under the local\n * keyring's document key, sign the resulting blob with the local\n * identity's secret key, and pack the pair into a MeshFrame.\n * 3. We hand the MeshFrame off to the base adapter, which puts it on\n * whatever wire it owns.\n *\n * Incoming path (wire → Repo):\n * 1. The base adapter emits a 'message' event with bytes from the wire.\n * 2. We unpack the MeshFrame, look up the sender's public key in the\n * keyring, verify the signature, look up the document key, decrypt\n * the payload, and deserialise it back to the original message.\n * 3. We re-emit the 'message' event upward to the Repo's NetworkSubsystem\n * with the decrypted message.\n *\n * The keyring is an injected dependency. In production it's backed by\n * persistent storage and populated through the pairing flow. For tests it\n * is just a Map of publicly-known fixtures that both sides share.\n *\n * Caveat for the Phase 2 first cut: Automerge sync messages don't have a\n * stable \"what document does this belong to\" field at the wire level (the\n * documentId is part of the message contents). The mesh adapter therefore\n * uses a single per-Repo encryption key for now rather than per-document\n * keys, and stores the key once in the keyring under the well-known id\n * \"polly-mesh-default\". The plan describes per-document keys as the right\n * end state; that requires either parsing the message to extract the\n * documentId before encrypting (peeking inside the binary protocol) or\n * threading the document context through the network subsystem (which\n * needs upstream support). A follow-up will address this.\n */\n\nimport {\n type Message,\n NetworkAdapter,\n type PeerId,\n type PeerMetadata,\n} from \"@automerge/automerge-repo/slim\";\nimport {\n decodeEncryptedEnvelope,\n encodeEncryptedEnvelope,\n openEnvelope as openEncryptedEnvelope,\n sealEnvelope as sealEncryptedEnvelope,\n} from \"./encryption\";\nimport {\n decodeSignedEnvelope,\n encodeSignedEnvelope,\n openEnvelope as openSignedEnvelope,\n type SigningKeyPair,\n signEnvelope,\n} from \"./signing\";\n\n/** The well-known document id used for the Phase 2 first-cut single-key\n * encryption mode. See the file-level comment for the per-document key\n * follow-up. */\nexport const DEFAULT_MESH_KEY_ID = \"polly-mesh-default\";\n\n/**\n * A mesh keyring holds the local peer's signing identity, the public keys\n * of every peer the local node will accept messages from, the symmetric\n * encryption keys for documents the local node has access to, and the set\n * of peers whose keys have been revoked.\n */\nexport interface MeshKeyring {\n /** The local peer's signing keypair. The secret never leaves this\n * keyring; the public key is gossiped through the access set. */\n identity: SigningKeyPair;\n /** Map from peer id (string) to that peer's signing public key. The\n * mesh adapter rejects messages from peers not present in this map. */\n knownPeers: Map<string, Uint8Array>;\n /** Map from document key id (typically the documentId, or the well-known\n * default for the single-key first cut) to the symmetric encryption key. */\n documentKeys: Map<string, Uint8Array>;\n /** Set of peer ids whose keys have been revoked. The mesh adapter drops\n * incoming messages from any peer in this set, even if the peer is still\n * present in {@link knownPeers}. Revocation is applied via the revocation\n * module; the set is kept separate from knownPeers so that an application\n * can audit who was once authorised without losing the revocation record. */\n revokedPeers: Set<string>;\n /** Optional set of peer ids authorised to issue revocations. When present\n * and non-empty, `decodeRevocation` accepts a signed record only if the\n * issuer is in this set. When undefined or empty, any signed revocation\n * from a known peer is accepted (the Phase 2 first-cut default). This\n * field layers a \"who can revoke whom\" check on top of the signature\n * layer without breaking existing callers. */\n revocationAuthority?: Set<string>;\n}\n\n/**\n * Constructor options for {@link MeshNetworkAdapter}.\n */\nexport interface MeshNetworkAdapterOptions {\n /** The underlying NetworkAdapter that puts crypto-wrapped bytes on the\n * wire. In production this is a WebRTC or WebSocket adapter; in tests\n * it's an in-memory loopback. */\n base: NetworkAdapter;\n /** A synchronous function that returns the keyring to use for the next\n * send or receive. The adapter never caches the value across calls —\n * every {@link MeshNetworkAdapter#send | send} and every incoming\n * message asks the source for the current keyring, so callers that\n * mutate the in-memory keyring (e.g. `applyPairingToken`) or re-issue\n * it entirely (e.g. a long-lived CLI watching a disk-backed keyring\n * file that another process can rewrite) see their updates take effect\n * on the very next message without restarting the adapter.\n *\n * The function must be synchronous because Automerge's\n * `NetworkAdapter.send` is synchronous. Implementations that need to\n * read from disk should maintain a cached object — refreshed by a\n * file watcher, a manual reload, or `readFileSync` per call — and\n * return that cached object from the source. */\n keyringSource: () => MeshKeyring;\n /** When false, the adapter signs but does not encrypt. Outgoing messages\n * carry a signature envelope but the payload is plaintext; incoming\n * messages are verified against the sender's public key without a\n * decryption step. This mode is used by $peerState's `sign: true`\n * option, where the server must still be able to parse Automerge sync\n * messages. Defaults to true (encrypt + sign, the full $meshState\n * posture). */\n encryptionEnabled?: boolean;\n}\n\n/**\n * NetworkAdapter that wraps another adapter with Polly's mesh-transport\n * crypto envelope. Every outgoing message is encrypted then signed; every\n * incoming message is verified then decrypted before being forwarded to\n * the Repo's network subsystem.\n *\n * The adapter delegates lifecycle (connect, disconnect, isReady, peer\n * discovery) to the base adapter unchanged. Only the message body is\n * intercepted.\n */\nexport class MeshNetworkAdapter extends NetworkAdapter {\n readonly base: NetworkAdapter;\n readonly keyringSource: () => MeshKeyring;\n readonly encryptionEnabled: boolean;\n\n /** Read-only view of the current keyring. Each access calls\n * {@link MeshNetworkAdapterOptions.keyringSource}, so the value\n * reflects whatever mutations or swaps the caller has applied since\n * the last access — the same contract the send and receive paths\n * follow internally. */\n get keyring(): MeshKeyring {\n return this.keyringSource();\n }\n\n constructor(options: MeshNetworkAdapterOptions) {\n super();\n this.base = options.base;\n this.keyringSource = options.keyringSource;\n this.encryptionEnabled = options.encryptionEnabled ?? true;\n\n // Forward lifecycle and peer events from the base adapter.\n this.base.on(\"close\", () => this.emit(\"close\"));\n this.base.on(\"peer-candidate\", (payload) => this.emit(\"peer-candidate\", payload));\n this.base.on(\"peer-disconnected\", (payload) => this.emit(\"peer-disconnected\", payload));\n\n // Intercept incoming messages: the base adapter will surface them as\n // 'message' events with crypto-wrapped payloads. We unwrap and re-emit.\n this.base.on(\"message\", (rawMessage) => {\n const unwrapped = this.tryUnwrap(rawMessage);\n if (unwrapped) {\n this.emit(\"message\", unwrapped);\n }\n // Silently drop messages that fail verification or decryption. A\n // production adapter would surface this through a diagnostic channel\n // so the application could prompt the user; the Phase 2 first cut\n // logs through the standard \"drop unknown\" semantics of the network\n // subsystem.\n });\n }\n\n isReady(): boolean {\n return this.base.isReady();\n }\n\n whenReady(): Promise<void> {\n return this.base.whenReady();\n }\n\n connect(peerId: PeerId, peerMetadata?: PeerMetadata): void {\n this.peerId = peerId;\n if (peerMetadata !== undefined) {\n this.peerMetadata = peerMetadata;\n }\n this.base.connect(peerId, peerMetadata);\n }\n\n disconnect(): void {\n this.base.disconnect();\n }\n\n send(message: Message): void {\n const wrapped = this.wrap(message);\n this.base.send(wrapped);\n }\n\n /**\n * Wrap an outgoing Automerge message in an encrypt-then-sign envelope.\n * The wrapped payload is returned as a Message with the original sender\n * and target ids and the crypto blob in the `data` field.\n */\n private wrap(message: Message): Message {\n const keyring = this.keyringSource();\n const serialised = serialiseMessage(message);\n\n let payloadToSign: Uint8Array;\n if (this.encryptionEnabled) {\n const docKey = keyring.documentKeys.get(DEFAULT_MESH_KEY_ID);\n if (!docKey) {\n throw new Error(\n `MeshNetworkAdapter: missing document encryption key under id \"${DEFAULT_MESH_KEY_ID}\". Provision the key in the keyring before sending.`\n );\n }\n const encrypted = sealEncryptedEnvelope(serialised, DEFAULT_MESH_KEY_ID, docKey);\n payloadToSign = encodeEncryptedEnvelope(encrypted);\n } else {\n payloadToSign = serialised;\n }\n\n const signed = signEnvelope(payloadToSign, message.senderId, keyring.identity.secretKey);\n const signedBytes = encodeSignedEnvelope(signed);\n\n // Preserve `documentId` on the outer envelope so the base adapter\n // (MeshWebRTCAdapter) can stamp per-handle wire-level bookkeeping\n // without parsing the encrypted payload. The inner serialised\n // message also carries documentId, which the receiver uses after\n // crypto-unwrap; this outer copy is purely for the sender-side\n // observability path that polly#107 item 7 specifies. The signed\n // envelope still binds the inner copy, so the outer copy cannot\n // forge routing — a peer that mismatches the two is observable as\n // a divergent receive shape, not a routing exploit.\n const outer: Record<string, unknown> = {\n type: message.type,\n senderId: message.senderId,\n targetId: message.targetId,\n data: signedBytes,\n };\n if (\"documentId\" in message && (message as { documentId?: unknown }).documentId !== undefined) {\n outer[\"documentId\"] = (message as { documentId: unknown }).documentId;\n }\n return outer as unknown as Message;\n }\n\n /**\n * Try to unwrap an incoming crypto-wrapped message. Returns the original\n * Message on success, undefined on verification or decryption failure.\n */\n private tryUnwrap(message: Message): Message | undefined {\n if (!message.data) return undefined;\n\n let signed: ReturnType<typeof decodeSignedEnvelope>;\n try {\n signed = decodeSignedEnvelope(message.data);\n } catch {\n return undefined;\n }\n\n // Re-read the keyring on every incoming message. This is what makes a\n // post-construction peer addition take effect — if the caller has\n // mutated the keyring's `knownPeers` map (or swapped the keyring\n // object outright via a file watcher), the new entry is visible here\n // without any restart or explicit notification path. See issue #100.\n const keyring = this.keyringSource();\n\n // Drop messages from peers whose keys have been revoked, even if the\n // public key is still present in knownPeers. The revocation set is the\n // authoritative \"this peer is no longer trusted\" marker.\n if (keyring.revokedPeers.has(signed.senderId)) {\n return undefined;\n }\n\n const senderKey = keyring.knownPeers.get(signed.senderId);\n if (!senderKey) {\n return undefined;\n }\n\n let verifiedPayload: Uint8Array;\n try {\n verifiedPayload = openSignedEnvelope(signed, senderKey);\n } catch {\n return undefined;\n }\n\n if (!this.encryptionEnabled) {\n // Sign-only mode: the verified payload IS the serialised message.\n return deserialiseMessage(verifiedPayload);\n }\n\n // Full encrypt+sign mode: unwrap the encryption envelope.\n let encrypted: ReturnType<typeof decodeEncryptedEnvelope>;\n try {\n encrypted = decodeEncryptedEnvelope(verifiedPayload);\n } catch {\n return undefined;\n }\n\n const docKey = keyring.documentKeys.get(encrypted.documentId);\n if (!docKey) {\n return undefined;\n }\n\n let plaintext: Uint8Array;\n try {\n plaintext = openEncryptedEnvelope(encrypted, docKey);\n } catch {\n return undefined;\n }\n\n return deserialiseMessage(plaintext);\n }\n}\n\n// message serialisation\n\n/**\n * Serialise an Automerge sync message to a binary blob suitable for\n * encryption. The format is a length-prefixed JSON header (carrying the\n * non-binary fields) followed by the raw `data` bytes (which Automerge's\n * sync messages carry as Uint8Array). This avoids round-tripping the\n * binary payload through JSON, which would balloon its size.\n */\nfunction serialiseMessage(message: Message): Uint8Array {\n const headerObj: Record<string, unknown> = {\n type: message.type,\n senderId: message.senderId,\n targetId: message.targetId,\n };\n if (\"documentId\" in message && message.documentId !== undefined) {\n headerObj[\"documentId\"] = message.documentId;\n }\n if (\"count\" in message && message.count !== undefined) {\n headerObj[\"count\"] = message.count;\n }\n if (\"sessionId\" in message && message.sessionId !== undefined) {\n headerObj[\"sessionId\"] = message.sessionId;\n }\n const headerBytes = new TextEncoder().encode(JSON.stringify(headerObj));\n const dataBytes: Uint8Array =\n \"data\" in message && message.data instanceof Uint8Array ? message.data : new Uint8Array(0);\n\n const out = new Uint8Array(4 + headerBytes.length + dataBytes.length);\n const view = new DataView(out.buffer);\n view.setUint32(0, headerBytes.length, false);\n out.set(headerBytes, 4);\n out.set(dataBytes, 4 + headerBytes.length);\n return out;\n}\n\n/**\n * Inverse of {@link serialiseMessage}.\n */\nfunction deserialiseMessage(bytes: Uint8Array): Message {\n if (bytes.length < 4) {\n throw new Error(\"MeshNetworkAdapter: message too short to deserialise.\");\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const headerLen = view.getUint32(0, false);\n if (bytes.length < 4 + headerLen) {\n throw new Error(\"MeshNetworkAdapter: message header truncated.\");\n }\n const header = JSON.parse(new TextDecoder().decode(bytes.subarray(4, 4 + headerLen)));\n const data = bytes.slice(4 + headerLen);\n return { ...header, data } as unknown as Message;\n}\n",
|
|
16
16
|
"/**\n * signing — Ed25519 signing and verification for Polly's $meshState\n * primitive (Phase 2). Wraps tweetnacl with a small Polly-flavoured API\n * so the rest of the codebase never imports tweetnacl directly.\n *\n * Every operation that flows through a $meshState transport is signed by\n * the originating peer's private key before transmission and verified by\n * every receiving peer against a known public-key set before being applied.\n * This is the Byzantine-tolerance mechanism: a peer whose private key is\n * compromised can be revoked through a further signed operation, after\n * which honest peers reject anything signed by the revoked key.\n *\n * tweetnacl uses the Ed25519 curve. Public keys and signatures are 32 and\n * 64 bytes respectively, which keeps the per-op overhead small enough that\n * signing every Automerge sync message is feasible even on mobile.\n *\n * The shape of the wrapper:\n *\n * - {@link generateSigningKeyPair} produces a new Ed25519 keypair. The\n * private key never leaves the device that generated it; the public\n * key is gossiped through the access set.\n *\n * - {@link sign} produces a 64-byte detached signature over a payload.\n *\n * - {@link verify} checks a payload against a signature and a public\n * key. Returns boolean rather than throwing so call sites can handle\n * verification failure as a normal control-flow case.\n *\n * - {@link signEnvelope} and {@link openEnvelope} package payload + sender\n * id + signature into a single binary envelope, which is what the mesh\n * network adapter actually puts on the wire.\n */\n\nimport nacl from \"tweetnacl\";\n\n/** Length in bytes of an Ed25519 public key. */\nexport const PUBLIC_KEY_BYTES = 32;\n/** Length in bytes of an Ed25519 secret (private) key. */\nexport const SECRET_KEY_BYTES = 64;\n/** Length in bytes of an Ed25519 detached signature. */\nexport const SIGNATURE_BYTES = 64;\n\n/**\n * An Ed25519 keypair. The {@link publicKey} is safe to share with peers;\n * the {@link secretKey} must never leave the device.\n */\nexport interface SigningKeyPair {\n publicKey: Uint8Array;\n secretKey: Uint8Array;\n}\n\n/**\n * A signed envelope. The wire format is the concatenation of the sender id\n * length, the sender id bytes, the signature, and the payload. Callers\n * shouldn't rely on the exact layout — use {@link signEnvelope} and\n * {@link openEnvelope} to round-trip.\n */\nexport interface SignedEnvelope {\n /** Stable sender peer identifier (UTF-8 string). The receiving side uses\n * this to look up the sender's public key in the document's access set. */\n senderId: string;\n /** The original payload bytes, untouched. */\n payload: Uint8Array;\n /** 64-byte Ed25519 signature over the payload. */\n signature: Uint8Array;\n}\n\n/** Errors thrown by the signing subsystem. */\nexport class SigningError extends Error {\n readonly code:\n | \"invalid-secret-key\"\n | \"invalid-public-key\"\n | \"invalid-signature-length\"\n | \"envelope-malformed\";\n\n constructor(message: string, code: SigningError[\"code\"]) {\n super(message);\n this.name = \"SigningError\";\n this.code = code;\n }\n}\n\n/**\n * Generate a fresh Ed25519 keypair. Calls into tweetnacl's CSPRNG.\n */\nexport function generateSigningKeyPair(): SigningKeyPair {\n const pair = nacl.sign.keyPair();\n return {\n publicKey: pair.publicKey,\n secretKey: pair.secretKey,\n };\n}\n\n/**\n * Reconstruct a keypair from an existing 64-byte secret key. Useful for\n * loading keys from persistent storage. Throws if the key is the wrong size.\n */\nexport function signingKeyPairFromSecret(secretKey: Uint8Array): SigningKeyPair {\n if (secretKey.length !== SECRET_KEY_BYTES) {\n throw new SigningError(\n `Ed25519 secret key must be ${SECRET_KEY_BYTES} bytes, got ${secretKey.length}.`,\n \"invalid-secret-key\"\n );\n }\n const pair = nacl.sign.keyPair.fromSecretKey(secretKey);\n return {\n publicKey: pair.publicKey,\n secretKey: pair.secretKey,\n };\n}\n\n/**\n * Produce a 64-byte detached signature over the given payload using the\n * supplied secret key.\n */\nexport function sign(payload: Uint8Array, secretKey: Uint8Array): Uint8Array {\n if (secretKey.length !== SECRET_KEY_BYTES) {\n throw new SigningError(\n `Ed25519 secret key must be ${SECRET_KEY_BYTES} bytes, got ${secretKey.length}.`,\n \"invalid-secret-key\"\n );\n }\n return nacl.sign.detached(payload, secretKey);\n}\n\n/**\n * Verify a detached signature against a payload and a public key. Returns\n * true if the signature is valid, false otherwise. Wrong-length keys or\n * signatures throw {@link SigningError} so callers can distinguish a bad\n * signature from a misshapen input.\n */\nexport function verify(payload: Uint8Array, signature: Uint8Array, publicKey: Uint8Array): boolean {\n if (publicKey.length !== PUBLIC_KEY_BYTES) {\n throw new SigningError(\n `Ed25519 public key must be ${PUBLIC_KEY_BYTES} bytes, got ${publicKey.length}.`,\n \"invalid-public-key\"\n );\n }\n if (signature.length !== SIGNATURE_BYTES) {\n throw new SigningError(\n `Ed25519 signature must be ${SIGNATURE_BYTES} bytes, got ${signature.length}.`,\n \"invalid-signature-length\"\n );\n }\n return nacl.sign.detached.verify(payload, signature, publicKey);\n}\n\n/**\n * Sign a payload and pack it into a {@link SignedEnvelope} along with the\n * sender id. The mesh network adapter calls this on every outgoing message\n * before handing it to the transport.\n */\nexport function signEnvelope(\n payload: Uint8Array,\n senderId: string,\n secretKey: Uint8Array\n): SignedEnvelope {\n const signature = sign(payload, secretKey);\n return { senderId, payload, signature };\n}\n\n/**\n * Verify a {@link SignedEnvelope} against the sender's known public key.\n * Returns the inner payload on success, throws on failure. The mesh\n * network adapter calls this on every incoming message before forwarding\n * the payload to the underlying Automerge sync subsystem.\n */\nexport function openEnvelope(envelope: SignedEnvelope, publicKey: Uint8Array): Uint8Array {\n const ok = verify(envelope.payload, envelope.signature, publicKey);\n if (!ok) {\n throw new SigningError(\n `Signature verification failed for envelope from ${envelope.senderId}.`,\n \"envelope-malformed\"\n );\n }\n return envelope.payload;\n}\n\n/**\n * Serialise a {@link SignedEnvelope} to a single binary blob suitable for\n * transmission over a network adapter. Wire format:\n *\n * [4 bytes BE: senderId byte length]\n * [N bytes: senderId UTF-8]\n * [64 bytes: signature]\n * [remaining: payload]\n *\n * Callers should not depend on the exact bytes — they should round-trip\n * through {@link encodeSignedEnvelope} / {@link decodeSignedEnvelope}.\n */\nexport function encodeSignedEnvelope(envelope: SignedEnvelope): Uint8Array {\n const senderBytes = new TextEncoder().encode(envelope.senderId);\n const total = 4 + senderBytes.length + SIGNATURE_BYTES + envelope.payload.length;\n const out = new Uint8Array(total);\n const view = new DataView(out.buffer);\n view.setUint32(0, senderBytes.length, false);\n out.set(senderBytes, 4);\n out.set(envelope.signature, 4 + senderBytes.length);\n out.set(envelope.payload, 4 + senderBytes.length + SIGNATURE_BYTES);\n return out;\n}\n\n/**\n * Deserialise a binary envelope produced by {@link encodeSignedEnvelope}.\n * Throws on malformed input.\n */\nexport function decodeSignedEnvelope(bytes: Uint8Array): SignedEnvelope {\n if (bytes.length < 4 + SIGNATURE_BYTES) {\n throw new SigningError(\n `Envelope too short: ${bytes.length} bytes, need at least ${4 + SIGNATURE_BYTES}.`,\n \"envelope-malformed\"\n );\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const senderLen = view.getUint32(0, false);\n if (bytes.length < 4 + senderLen + SIGNATURE_BYTES) {\n throw new SigningError(\n `Envelope truncated: declared sender length ${senderLen}, total ${bytes.length}.`,\n \"envelope-malformed\"\n );\n }\n const senderId = new TextDecoder().decode(bytes.subarray(4, 4 + senderLen));\n const signature = bytes.slice(4 + senderLen, 4 + senderLen + SIGNATURE_BYTES);\n const payload = bytes.slice(4 + senderLen + SIGNATURE_BYTES);\n return { senderId, payload, signature };\n}\n",
|
|
17
17
|
"/**\n * mesh-signaling-client — browser-side client for Polly's signalingServer\n * Elysia plugin. Connects to the signalling WebSocket, registers a peer\n * id, and relays SDP/ICE messages between local WebRTC connections and\n * remote peers.\n *\n * This module is the companion to {@link signalingServer} from the Elysia\n * plugin family. The server accepts \"join\" and \"signal\" messages; this\n * client produces them. The protocol matches: opening the connection,\n * sending a \"join\" with the local peer id, and then using sendSignal()\n * to forward SDP and ICE messages to specific target peers.\n *\n * Because this client is browser-only in its first incarnation — it\n * assumes the global `WebSocket` is available — it cannot be exercised\n * under bun:test the way the server-side plugin is. The first validation\n * of this code path is either a Playwright harness or a human running\n * the browser-side example that consumes it.\n */\n\n/** A signal message either sent to or received from the signalling server.\n * Matches the wire format produced by the Elysia signalingServer plugin. */\nexport interface SignalingMessage {\n type: \"join\" | \"signal\" | \"error\" | \"peers-present\" | \"peer-joined\" | \"peer-left\";\n peerId?: string;\n peerIds?: string[];\n targetPeerId?: string;\n payload?: unknown;\n reason?: \"unknown-target\" | \"not-joined\" | \"malformed\";\n}\n\n/** A frame whose `type` is outside the built-in {@link SignalingMessage}\n * vocabulary. Consumers who want to layer application protocols on the\n * signalling socket — pairing return tokens, presence pings, anything\n * else that benefits from sharing the existing connection and its\n * reconnect state — receive these through {@link MeshSignalingClientOptions.onCustomFrame}\n * and produce them through {@link MeshSignalingClient.sendCustom}. Polly\n * does not interpret the body; the signalling server routes it per its\n * own conventions. The field `type` is always present; everything else\n * is application-defined. */\nexport interface CustomSignalingFrame {\n type: string;\n [key: string]: unknown;\n}\n\n/** Options for constructing a {@link MeshSignalingClient}. */\nexport interface MeshSignalingClientOptions {\n /** The signalling server URL — unencrypted scheme for local dev, TLS-terminated for production. */\n url: string;\n /** The local peer id that this client will register with on join. */\n peerId: string;\n /** Callback invoked whenever a signal message from another peer arrives.\n * The receiver dispatches to the right PeerConnection based on the\n * `fromPeerId`. */\n onSignal: (fromPeerId: string, payload: unknown) => void;\n /** Optional callback invoked when the server returns an error (for\n * diagnostic UI or reconnection logic). */\n onError?: (reason: string, targetPeerId?: string) => void;\n /** Optional callback for the open and close lifecycle events. */\n onOpen?: () => void;\n onClose?: () => void;\n /** Optional callback invoked once, immediately after the server's\n * response to our `join`, listing every peer already joined at that\n * moment. Empty list when the lobby is otherwise empty. */\n onPeersPresent?: (peerIds: string[]) => void;\n /** Optional callback invoked each time a new peer joins the signalling\n * server after we have already joined. */\n onPeerJoined?: (peerId: string) => void;\n /** Optional callback invoked each time a joined peer's socket closes\n * (including graceful disconnect and abrupt drops detected by the\n * server). Fires at most once per departure. */\n onPeerLeft?: (peerId: string) => void;\n /** Optional callback invoked for any frame whose `type` is outside the\n * built-in {@link SignalingMessage} vocabulary. Consumers use this to\n * layer their own protocol on top of the signalling socket — pairing\n * return tokens, presence pings, anything else that benefits from\n * sharing the existing connection and its reconnect state. A frame\n * that arrives before the join handshake completes or that fails to\n * parse as JSON is dropped silently, as with the built-in types. */\n onCustomFrame?: (frame: CustomSignalingFrame) => void;\n /** WebSocket constructor. Defaults to `globalThis.WebSocket`. Inject a\n * different implementation (e.g. `ws` package's `WebSocket`) when running\n * in an environment without a native WebSocket global, or to use a custom\n * subclass for tests or instrumentation. */\n WebSocket?: typeof WebSocket;\n}\n\n/**\n * Thin wrapper around a WebSocket connection to a Polly signalling server.\n * Handles the join handshake, routes incoming signals to the supplied\n * callback, and exposes a {@link sendSignal} method for outgoing signals.\n *\n * This class is deliberately small. It has no opinion on the signal\n * payload shape (the wire carries it as `unknown`), so it can carry SDP\n * offers, SDP answers, ICE candidates, or any other message the\n * WebRTC adapter wants to exchange with peers.\n */\n/** Base delay (ms) between reconnect attempts. Doubles per attempt up\n * to {@link RECONNECT_MAX_DELAY_MS}. */\nconst RECONNECT_BASE_DELAY_MS = 250;\n/** Ceiling for the exponential backoff so a long outage does not leave\n * the client silent for minutes between probes. */\nconst RECONNECT_MAX_DELAY_MS = 30_000;\n\n/** Parse a raw frame from the socket into a record with a string `type`,\n * or `undefined` if the frame is unparseable or malformed. Extracted so\n * {@link MeshSignalingClient.dispatchFrame} stays below the linter's\n * cognitive-complexity ceiling. */\nfunction parseFrame(raw: unknown): Record<string, unknown> | undefined {\n let parsed: unknown;\n try {\n parsed = typeof raw === \"string\" ? JSON.parse(raw) : raw;\n } catch {\n return undefined;\n }\n if (typeof parsed !== \"object\" || parsed === null) {\n return undefined;\n }\n const record = parsed as unknown as Record<string, unknown>;\n if (typeof record[\"type\"] !== \"string\") {\n return undefined;\n }\n return record;\n}\n\nexport class MeshSignalingClient {\n readonly url: string;\n readonly peerId: string;\n private readonly onSignal: (fromPeerId: string, payload: unknown) => void;\n private readonly onError?: (reason: string, targetPeerId?: string) => void;\n private readonly onOpen?: () => void;\n private readonly onClose?: () => void;\n private readonly onPeersPresent?: (peerIds: string[]) => void;\n private readonly onPeerJoined?: (peerId: string) => void;\n private readonly onPeerLeft?: (peerId: string) => void;\n private readonly onCustomFrame?: (frame: CustomSignalingFrame) => void;\n private socket: WebSocket | undefined;\n private joined = false;\n private stopping = false;\n private reconnectTimer: ReturnType<typeof setTimeout> | undefined;\n private readonly WebSocketCtor: typeof WebSocket;\n\n constructor(options: MeshSignalingClientOptions) {\n this.url = options.url;\n this.peerId = options.peerId;\n this.onSignal = options.onSignal;\n if (options.onError !== undefined) this.onError = options.onError;\n if (options.onOpen !== undefined) this.onOpen = options.onOpen;\n if (options.onClose !== undefined) this.onClose = options.onClose;\n if (options.onPeersPresent !== undefined) this.onPeersPresent = options.onPeersPresent;\n if (options.onPeerJoined !== undefined) this.onPeerJoined = options.onPeerJoined;\n if (options.onPeerLeft !== undefined) this.onPeerLeft = options.onPeerLeft;\n if (options.onCustomFrame !== undefined) this.onCustomFrame = options.onCustomFrame;\n const WS = options.WebSocket ?? globalThis.WebSocket;\n if (typeof WS !== \"function\") {\n throw new Error(\n \"MeshSignalingClient: no WebSocket implementation found. Pass one via options.WebSocket, or run in an environment where `globalThis.WebSocket` exists (Node 21+, Bun, browsers).\"\n );\n }\n this.WebSocketCtor = WS;\n }\n\n /**\n * Open the WebSocket and send the join message. Resolves once the\n * connection is open; callers should not send signals before this\n * promise resolves.\n */\n async connect(): Promise<void> {\n this.stopping = false;\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = undefined;\n }\n return new Promise((resolve, reject) => {\n const ws = new this.WebSocketCtor(this.url);\n this.socket = ws;\n let settled = false;\n\n ws.addEventListener(\"open\", () => {\n // Send the join message as the first frame. The server registers\n // the peer id and uses it as the authenticated sender for all\n // subsequent signals on this connection.\n ws.send(JSON.stringify({ type: \"join\", peerId: this.peerId } satisfies SignalingMessage));\n this.joined = true;\n this.onOpen?.();\n if (!settled) {\n settled = true;\n resolve();\n }\n });\n\n ws.addEventListener(\"message\", (event) => {\n this.dispatchFrame(event.data);\n });\n\n ws.addEventListener(\"error\", (err) => {\n // Only the initial connect rejects here. Post-open errors route\n // through the close handler's reconnect path.\n if (!settled) {\n settled = true;\n reject(err);\n }\n });\n\n ws.addEventListener(\"close\", () => {\n const wasOpen = this.joined;\n this.joined = false;\n this.onClose?.();\n // If the caller asked to stop, respect it. Otherwise a close on\n // an established connection — or a close that preempted `open`\n // — kicks off the reconnect loop.\n if (!this.stopping && wasOpen) {\n this.scheduleReconnect(0);\n }\n });\n });\n }\n\n /** Schedule the next reconnect attempt with exponential backoff. */\n private scheduleReconnect(attempt: number): void {\n if (this.stopping) return;\n const delay = Math.min(RECONNECT_MAX_DELAY_MS, RECONNECT_BASE_DELAY_MS * 2 ** attempt);\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = undefined;\n if (this.stopping) return;\n void this.connect().catch(() => {\n this.scheduleReconnect(attempt + 1);\n });\n }, delay);\n }\n\n /**\n * Parse and route an incoming frame. Extracted from the open/message\n * closure in {@link connect} so the discriminated-union switch stays\n * below the linter's cognitive-complexity ceiling.\n */\n private dispatchFrame(raw: unknown): void {\n const record = parseFrame(raw);\n if (record === undefined) {\n return;\n }\n const handler = this.builtInHandler(record[\"type\"]);\n if (handler !== undefined) {\n handler(record);\n return;\n }\n // Unknown types route to the custom-frame handler, which consumers\n // use to layer application protocols on the shared socket. Without\n // a handler the frame is silently dropped, preserving the old\n // behaviour byte-for-byte.\n this.onCustomFrame?.(record as unknown as CustomSignalingFrame);\n }\n\n private builtInHandler(type: unknown): ((record: Record<string, unknown>) => void) | undefined {\n if (type === \"signal\") {\n return (record) => {\n if (typeof record[\"peerId\"] === \"string\") {\n this.onSignal(record[\"peerId\"], record[\"payload\"]);\n }\n };\n }\n if (type === \"peers-present\") {\n return (record) => {\n if (Array.isArray(record[\"peerIds\"])) {\n this.onPeersPresent?.(record[\"peerIds\"] as unknown as string[]);\n }\n };\n }\n if (type === \"peer-joined\") {\n return (record) => {\n if (typeof record[\"peerId\"] === \"string\") {\n this.onPeerJoined?.(record[\"peerId\"]);\n }\n };\n }\n if (type === \"peer-left\") {\n return (record) => {\n if (typeof record[\"peerId\"] === \"string\") {\n this.onPeerLeft?.(record[\"peerId\"]);\n }\n };\n }\n if (type === \"error\") {\n return (record) => {\n if (typeof record[\"reason\"] !== \"string\") {\n return;\n }\n const targetPeerId =\n typeof record[\"targetPeerId\"] === \"string\" ? record[\"targetPeerId\"] : undefined;\n this.onError?.(record[\"reason\"], targetPeerId);\n };\n }\n return undefined;\n }\n\n /**\n * Send a signal to another peer via the signalling server. The server\n * validates the sender (replacing the claimed peerId with the\n * authenticated join id) and routes to the target. Returns true if\n * the message was sent, false if the connection is not open.\n */\n sendSignal(targetPeerId: string, payload: unknown): boolean {\n if (!this.socket || this.socket.readyState !== this.WebSocketCtor.OPEN || !this.joined) {\n return false;\n }\n const msg: SignalingMessage = {\n type: \"signal\",\n peerId: this.peerId,\n targetPeerId,\n payload,\n };\n this.socket.send(JSON.stringify(msg));\n return true;\n }\n\n /**\n * Send a custom frame over the signalling socket. The frame is serialised\n * as `{ type, ...payload }`. The server must be configured to route this\n * frame type (polly does not interpret it). Returns true if the message\n * was sent, false if the connection is not open.\n *\n * Intended for application-level protocols that want to share the\n * existing signalling connection — for example, a pairing flow that\n * delivers a reciprocal token from the scanner back to the issuer.\n */\n sendCustom(type: string, payload: Record<string, unknown> = {}): boolean {\n if (!this.socket || this.socket.readyState !== this.WebSocketCtor.OPEN || !this.joined) {\n return false;\n }\n this.socket.send(JSON.stringify({ ...payload, type }));\n return true;\n }\n\n /**\n * Close the underlying WebSocket connection. The server's close handler\n * will evict this peer from its routing table. Also cancels any\n * pending reconnect attempt so the client stays closed until the\n * caller reopens it with another {@link connect} call.\n */\n close(): void {\n this.stopping = true;\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = undefined;\n }\n this.socket?.close();\n this.socket = undefined;\n this.joined = false;\n }\n\n /** True if the signalling connection is open and joined. */\n get isConnected(): boolean {\n return this.joined && this.socket?.readyState === this.WebSocketCtor.OPEN;\n }\n}\n",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"/**\n * pairing — Phase 2 first-cut pairing flow for $meshState.\n *\n * Two devices that want to share a $meshState document must exchange three\n * things before sync can begin: the issuer's Ed25519 signing public key\n * (so the receiver can verify ops authored by the issuer), the symmetric\n * document encryption key (so both sides can encrypt and decrypt the\n * shared document), and the issuer's stable peer id (so the receiver\n * knows which entry in its keyring the public key belongs to). This\n * module packs all three into a {@link PairingToken}, serialises it to a\n * compact binary format suitable for QR codes or copy-paste, and provides\n * the matching parse-and-apply flow on the receiving side.\n *\n * Threat model: pairing tokens are transmitted over an out-of-band channel\n * that the user can authenticate visually — typically a QR code on the\n * issuer's device, scanned by the receiver. Because anyone with the token\n * can decrypt and impersonate, the OOB channel is the only authentication.\n * The token includes a TTL (default 10 minutes) so that a token displayed\n * briefly and then dismissed cannot be replayed by an attacker who later\n * gains access to a screenshot. A production deployment would layer a\n * Short Authentication String (SAS) on top — both devices display a code\n * derived from the shared state, and the user verifies they match — but\n * that is a follow-up.\n *\n * The pairing flow is one-way in the Phase 2 first cut. The issuer\n * generates a token and displays it; the receiver applies it and picks\n * up the issuer's keys. The receiver's own keys reach the issuer through\n * the access set: when the receiver sends its first signed op, the issuer\n * records the receiver's public key alongside its peer id and adds it to\n * the keyring. A bidirectional pairing flow that exchanges both sides'\n * keys in a single QR exchange is straightforward to add later but adds\n * UX surface area that is not needed for the mesh transport to work.\n */\n\nimport { KEY_BYTES as ENCRYPTION_KEY_BYTES, generateDocumentKey } from \"./encryption\";\nimport type { MeshKeyring } from \"./mesh-network-adapter\";\nimport {\n generateSigningKeyPair,\n PUBLIC_KEY_BYTES as SIGNING_PUBLIC_KEY_BYTES,\n type SigningKeyPair,\n} from \"./signing\";\n\n/** Current pairing-token format version. Bumped if the wire format changes. */\nexport const PAIRING_TOKEN_VERSION = 1;\n\n/** Magic header bytes for sanity-checking parsed tokens. ASCII \"PPT1\". */\nexport const PAIRING_TOKEN_MAGIC = new Uint8Array([0x50, 0x50, 0x54, 0x31]);\n\n/** Length of the random nonce embedded in every token. */\nexport const PAIRING_NONCE_BYTES = 16;\n\n/** Default TTL applied when {@link createPairingToken} is called without an\n * explicit `ttlMs` option. */\nexport const DEFAULT_PAIRING_TTL_MS = 10 * 60 * 1000; // 10 minutes\n\n/**\n * The contents of a pairing token. Both sides operate on this shape; the\n * binary serialisation is purely for transport.\n */\nexport interface PairingToken {\n /** Format version. {@link PAIRING_TOKEN_VERSION} at the time of writing. */\n version: number;\n /** Stable peer id of the issuing device. The receiver records this as\n * the lookup key for the issuer's public key in its keyring. */\n issuerPeerId: string;\n /** Issuer's Ed25519 signing public key (32 bytes). */\n issuerPublicKey: Uint8Array;\n /** Shared document encryption key (32 bytes). The receiver stores this\n * under {@link documentKeyId} in its keyring. */\n documentKey: Uint8Array;\n /** Identifier under which the receiver stores the document key. For the\n * Phase 2 first cut this is typically the well-known DEFAULT_MESH_KEY_ID\n * from mesh-network-adapter; per-document keys (one entry per Automerge\n * document) are a follow-up. */\n documentKeyId: string;\n /** Unix timestamp (milliseconds) after which the token is considered\n * expired and {@link applyPairingToken} refuses to use it. */\n expiresAt: number;\n /** 16-byte random nonce. Carried through serialisation so two tokens\n * with otherwise-identical contents are still distinguishable. */\n nonce: Uint8Array;\n}\n\n/** Errors thrown by the pairing subsystem. */\nexport class PairingError extends Error {\n readonly code:\n | \"expired\"\n | \"wrong-magic\"\n | \"unknown-version\"\n | \"truncated\"\n | \"invalid-public-key\"\n | \"invalid-document-key\"\n | \"invalid-nonce\";\n\n constructor(message: string, code: PairingError[\"code\"]) {\n super(message);\n this.name = \"PairingError\";\n this.code = code;\n }\n}\n\n/**\n * Options for {@link createPairingToken}. The signing identity and the\n * document key are required; everything else is optional with sensible\n * defaults.\n */\nexport interface CreatePairingTokenOptions {\n /** The issuing device's signing keypair. Only the public key ends up in\n * the token; the secret never leaves the issuer. */\n identity: SigningKeyPair;\n /** Stable peer id for the issuing device. */\n issuerPeerId: string;\n /** The symmetric document key the receiver should adopt. If omitted, a\n * fresh key is generated and the caller is responsible for using the\n * same key on the issuing side too. */\n documentKey?: Uint8Array;\n /** Identifier under which the receiver stores the document key. */\n documentKeyId: string;\n /** Time-to-live in milliseconds. Defaults to {@link DEFAULT_PAIRING_TTL_MS}. */\n ttlMs?: number;\n /** Override the current time. Intended for tests; production code should\n * not pass this. */\n now?: () => number;\n}\n\n/**\n * Generate a fresh {@link PairingToken}. The token is ready to be\n * serialised and displayed to the receiver via an OOB channel.\n */\nexport function createPairingToken(options: CreatePairingTokenOptions): PairingToken {\n const now = options.now ? options.now() : Date.now();\n const ttlMs = options.ttlMs ?? DEFAULT_PAIRING_TTL_MS;\n const documentKey = options.documentKey ?? generateDocumentKey();\n const nonce = randomBytes(PAIRING_NONCE_BYTES);\n\n return {\n version: PAIRING_TOKEN_VERSION,\n issuerPeerId: options.issuerPeerId,\n issuerPublicKey: options.identity.publicKey,\n documentKey,\n documentKeyId: options.documentKeyId,\n expiresAt: now + ttlMs,\n nonce,\n };\n}\n\n/**\n * Generate a fresh pairing token *and* a fresh signing keypair in one call.\n * Convenience for first-time setup where the device has no existing\n * identity yet. Returns both so the caller can persist the keypair and\n * then display the token.\n */\nexport function createPairingTokenWithFreshIdentity(args: {\n issuerPeerId: string;\n documentKeyId: string;\n ttlMs?: number;\n now?: () => number;\n}): { identity: SigningKeyPair; token: PairingToken } {\n const identity = generateSigningKeyPair();\n const token = createPairingToken({\n identity,\n issuerPeerId: args.issuerPeerId,\n documentKeyId: args.documentKeyId,\n ttlMs: args.ttlMs,\n now: args.now,\n });\n return { identity, token };\n}\n\n/**\n * Check whether a token has expired against the current wall-clock time\n * (or an injected `now`).\n */\nexport function isPairingTokenExpired(token: PairingToken, now?: () => number): boolean {\n const t = now ? now() : Date.now();\n return t >= token.expiresAt;\n}\n\n/**\n * Apply a parsed and validated token to a {@link MeshKeyring}. Mutates the\n * keyring in place: adds the issuer's public key to {@link MeshKeyring.knownPeers}\n * and the document key to {@link MeshKeyring.documentKeys}.\n *\n * Throws {@link PairingError} with code \"expired\" if the token's TTL has\n * elapsed. The receiver is expected to apply the token promptly after\n * scanning; rejecting expired tokens prevents replay of long-lived\n * captures.\n */\nexport function applyPairingToken(\n token: PairingToken,\n keyring: MeshKeyring,\n options: { now?: () => number } = {}\n): void {\n if (isPairingTokenExpired(token, options.now)) {\n throw new PairingError(\n `Pairing token from ${token.issuerPeerId} expired at ${new Date(token.expiresAt).toISOString()}.`,\n \"expired\"\n );\n }\n keyring.knownPeers.set(token.issuerPeerId, token.issuerPublicKey);\n keyring.documentKeys.set(token.documentKeyId, token.documentKey);\n}\n\n// binary serialisation\n\n/**\n * Serialise a token to a binary blob. The wire format is:\n *\n * [4 bytes: magic \"PPT1\"]\n * [1 byte: version]\n * [4 bytes BE: issuer id byte length]\n * [N bytes: issuer id UTF-8]\n * [32 bytes: issuer public key]\n * [32 bytes: document key]\n * [4 bytes BE: document key id byte length]\n * [M bytes: document key id UTF-8]\n * [8 bytes BE: expiresAt (uint64 milliseconds)]\n * [16 bytes: nonce]\n *\n * Use {@link encodePairingToken} to round-trip through a base64 string.\n */\nexport function serialisePairingToken(token: PairingToken): Uint8Array {\n validateForSerialisation(token);\n const issuerBytes = new TextEncoder().encode(token.issuerPeerId);\n const keyIdBytes = new TextEncoder().encode(token.documentKeyId);\n\n const total =\n PAIRING_TOKEN_MAGIC.length +\n 1 + // version\n 4 + // issuer id length\n issuerBytes.length +\n SIGNING_PUBLIC_KEY_BYTES +\n ENCRYPTION_KEY_BYTES +\n 4 + // doc key id length\n keyIdBytes.length +\n 8 + // expiresAt\n PAIRING_NONCE_BYTES;\n\n const out = new Uint8Array(total);\n let offset = 0;\n\n out.set(PAIRING_TOKEN_MAGIC, offset);\n offset += PAIRING_TOKEN_MAGIC.length;\n\n out[offset] = token.version;\n offset += 1;\n\n const view = new DataView(out.buffer);\n view.setUint32(offset, issuerBytes.length, false);\n offset += 4;\n out.set(issuerBytes, offset);\n offset += issuerBytes.length;\n\n out.set(token.issuerPublicKey, offset);\n offset += SIGNING_PUBLIC_KEY_BYTES;\n\n out.set(token.documentKey, offset);\n offset += ENCRYPTION_KEY_BYTES;\n\n view.setUint32(offset, keyIdBytes.length, false);\n offset += 4;\n out.set(keyIdBytes, offset);\n offset += keyIdBytes.length;\n\n // Write expiresAt as uint64 BE. JavaScript numbers are float64 but the\n // value is an integer count of milliseconds, well within 53-bit safe\n // range for any practical timestamp.\n view.setBigUint64(offset, BigInt(token.expiresAt), false);\n offset += 8;\n\n out.set(token.nonce, offset);\n offset += PAIRING_NONCE_BYTES;\n\n return out;\n}\n\n/**\n * Inverse of {@link serialisePairingToken}. Throws {@link PairingError} on\n * malformed input.\n */\nexport function parsePairingToken(bytes: Uint8Array): PairingToken {\n let offset = 0;\n\n // Magic\n if (bytes.length < PAIRING_TOKEN_MAGIC.length) {\n throw new PairingError(`Pairing token too short: ${bytes.length} bytes.`, \"truncated\");\n }\n for (let i = 0; i < PAIRING_TOKEN_MAGIC.length; i++) {\n if (bytes[offset + i] !== PAIRING_TOKEN_MAGIC[i]) {\n throw new PairingError(\n `Pairing token magic mismatch: not a Polly pairing token.`,\n \"wrong-magic\"\n );\n }\n }\n offset += PAIRING_TOKEN_MAGIC.length;\n\n // Version\n if (bytes.length < offset + 1) {\n throw new PairingError(\"Pairing token truncated at version.\", \"truncated\");\n }\n const version = bytes[offset] as unknown as number;\n offset += 1;\n if (version !== PAIRING_TOKEN_VERSION) {\n throw new PairingError(\n `Unknown pairing token version: ${version}. This Polly build supports version ${PAIRING_TOKEN_VERSION}.`,\n \"unknown-version\"\n );\n }\n\n // Issuer id\n if (bytes.length < offset + 4) {\n throw new PairingError(\"Pairing token truncated at issuer id length.\", \"truncated\");\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const issuerLen = view.getUint32(offset, false);\n offset += 4;\n if (bytes.length < offset + issuerLen) {\n throw new PairingError(\"Pairing token truncated at issuer id.\", \"truncated\");\n }\n const issuerPeerId = new TextDecoder().decode(bytes.subarray(offset, offset + issuerLen));\n offset += issuerLen;\n\n // Issuer public key\n if (bytes.length < offset + SIGNING_PUBLIC_KEY_BYTES) {\n throw new PairingError(\"Pairing token truncated at public key.\", \"truncated\");\n }\n const issuerPublicKey = bytes.slice(offset, offset + SIGNING_PUBLIC_KEY_BYTES);\n offset += SIGNING_PUBLIC_KEY_BYTES;\n\n // Document key\n if (bytes.length < offset + ENCRYPTION_KEY_BYTES) {\n throw new PairingError(\"Pairing token truncated at document key.\", \"truncated\");\n }\n const documentKey = bytes.slice(offset, offset + ENCRYPTION_KEY_BYTES);\n offset += ENCRYPTION_KEY_BYTES;\n\n // Document key id\n if (bytes.length < offset + 4) {\n throw new PairingError(\"Pairing token truncated at document key id length.\", \"truncated\");\n }\n const keyIdLen = view.getUint32(offset, false);\n offset += 4;\n if (bytes.length < offset + keyIdLen) {\n throw new PairingError(\"Pairing token truncated at document key id.\", \"truncated\");\n }\n const documentKeyId = new TextDecoder().decode(bytes.subarray(offset, offset + keyIdLen));\n offset += keyIdLen;\n\n // Expires at\n if (bytes.length < offset + 8) {\n throw new PairingError(\"Pairing token truncated at expiry.\", \"truncated\");\n }\n const expiresAtBig = view.getBigUint64(offset, false);\n offset += 8;\n const expiresAt = Number(expiresAtBig);\n\n // Nonce\n if (bytes.length < offset + PAIRING_NONCE_BYTES) {\n throw new PairingError(\"Pairing token truncated at nonce.\", \"truncated\");\n }\n const nonce = bytes.slice(offset, offset + PAIRING_NONCE_BYTES);\n offset += PAIRING_NONCE_BYTES;\n\n return {\n version,\n issuerPeerId,\n issuerPublicKey,\n documentKey,\n documentKeyId,\n expiresAt,\n nonce,\n };\n}\n\n/**\n * Serialise a token and base64-encode it for QR-code or copy-paste display.\n * The encoding uses the standard base64 alphabet (not URL-safe) because\n * QR codes encode bytes directly and do not care about URL safety.\n */\nexport function encodePairingToken(token: PairingToken): string {\n const bytes = serialisePairingToken(token);\n // btoa expects a binary string. Convert via String.fromCharCode per byte;\n // safe for the ~150-byte token size and avoids the spread-into-fromCharCode\n // pattern that runs into argument-count limits on large arrays.\n let binary = \"\";\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n return btoa(binary);\n}\n\n/**\n * Decode a base64-encoded pairing token produced by {@link encodePairingToken}.\n * Throws {@link PairingError} on malformed input.\n */\nexport function decodePairingToken(encoded: string): PairingToken {\n let binary: string;\n try {\n binary = atob(encoded);\n } catch {\n throw new PairingError(\"Pairing token is not valid base64.\", \"wrong-magic\");\n }\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return parsePairingToken(bytes);\n}\n\n// helpers\n\nfunction validateForSerialisation(token: PairingToken): void {\n if (token.issuerPublicKey.length !== SIGNING_PUBLIC_KEY_BYTES) {\n throw new PairingError(\n `Issuer public key must be ${SIGNING_PUBLIC_KEY_BYTES} bytes, got ${token.issuerPublicKey.length}.`,\n \"invalid-public-key\"\n );\n }\n if (token.documentKey.length !== ENCRYPTION_KEY_BYTES) {\n throw new PairingError(\n `Document key must be ${ENCRYPTION_KEY_BYTES} bytes, got ${token.documentKey.length}.`,\n \"invalid-document-key\"\n );\n }\n if (token.nonce.length !== PAIRING_NONCE_BYTES) {\n throw new PairingError(\n `Nonce must be ${PAIRING_NONCE_BYTES} bytes, got ${token.nonce.length}.`,\n \"invalid-nonce\"\n );\n }\n}\n\nfunction randomBytes(n: number): Uint8Array {\n const out = new Uint8Array(n);\n crypto.getRandomValues(out);\n return out;\n}\n",
|
|
27
27
|
"/**\n * revocation — Phase 2 key-revocation flow for $meshState.\n *\n * A $meshState deployment is only as secure as the keys it trusts. When a\n * device is lost, stolen, or compromised, its public key needs to be\n * removed from every other peer's trust set so that any operations signed\n * by that key are refused. This module provides the primitive pieces for\n * that flow: a signed revocation record that names the revoked peer id,\n * carries the issuer's identity, and travels between peers through the\n * same channels as any other signed message.\n *\n * A RevocationRecord is produced by a peer that has decided to revoke\n * another peer (typically because the user told their device to do so).\n * It is then serialised to a binary envelope, broadcast to other peers\n * through whatever transport is available, and applied to each receiving\n * keyring via {@link applyRevocation}. Applying a revocation adds the\n * target peer id to the keyring's {@link MeshKeyring.revokedPeers} set;\n * the MeshNetworkAdapter then drops all further messages from that peer,\n * even though the public key is still present in the knownPeers map.\n *\n * Signature layer: every revocation is signed by the *issuer's* key. The\n * receiver verifies the signature against the issuer's public key before\n * applying. This prevents a peer with no authority from forging a\n * revocation, at least in the signature-level threat model — a compromised\n * peer could still forge revocations naming any other peer, which is why\n * production deployments layer an access-set check on top (\"who is\n * authorised to revoke whom\"). That layer is a follow-up; the first cut\n * is signature-only, and any signed revocation from a known peer is\n * accepted.\n *\n * Why revocations are signed but not encrypted: revocations are public\n * in the sense that they name \"peer X is no longer trusted.\" There is no\n * confidentiality requirement — anyone seeing a revocation learns only\n * that someone has been kicked out, which is already observable from\n * the absence of their operations. Encrypting them would add cost without\n * adding security, so the wire format is signed-only.\n */\n\nimport type { MeshKeyring } from \"./mesh-network-adapter\";\nimport {\n decodeSignedEnvelope,\n encodeSignedEnvelope,\n openEnvelope as openSignedEnvelope,\n type SigningKeyPair,\n signEnvelope,\n} from \"./signing\";\n\n/** Current revocation-record format version. */\nexport const REVOCATION_RECORD_VERSION = 1;\n\n/** Magic header bytes for sanity-checking parsed revocations. ASCII \"PRV1\". */\nexport const REVOCATION_MAGIC = new Uint8Array([0x50, 0x52, 0x56, 0x31]);\n\n/**\n * The payload carried inside a signed revocation envelope.\n */\nexport interface RevocationRecord {\n /** Format version. */\n version: number;\n /** The peer id doing the revoking. Becomes the `senderId` of the signed\n * envelope when the record is serialised. */\n issuerPeerId: string;\n /** The peer id being revoked. After a receiver applies this record, its\n * MeshNetworkAdapter will drop all further messages from this peer. */\n revokedPeerId: string;\n /** Unix timestamp (milliseconds) when the revocation was issued. Carried\n * for audit and for tie-breaking in case an issuer issues multiple\n * revocations targeting the same peer. */\n issuedAt: number;\n /** Optional human-readable reason. Not used by the enforcement layer;\n * applications can surface it in audit logs. */\n reason?: string;\n}\n\n/** Errors thrown by the revocation subsystem. */\nexport class RevocationError extends Error {\n readonly code:\n | \"unknown-issuer\"\n | \"unauthorised-issuer\"\n | \"signature-invalid\"\n | \"truncated\"\n | \"wrong-magic\"\n | \"unknown-version\"\n | \"not-signed-by-issuer\";\n\n constructor(message: string, code: RevocationError[\"code\"]) {\n super(message);\n this.name = \"RevocationError\";\n this.code = code;\n }\n}\n\n/** Options for {@link createRevocation}. */\nexport interface CreateRevocationOptions {\n /** Signing keypair of the issuer. The private key signs the record; the\n * public key is looked up by the receiver via `issuerPeerId`. */\n issuer: SigningKeyPair;\n /** Stable peer id of the issuer. */\n issuerPeerId: string;\n /** Peer id to revoke. */\n revokedPeerId: string;\n /** Optional human-readable reason. */\n reason?: string;\n /** Override the current time. Intended for tests. */\n now?: () => number;\n}\n\n/**\n * Build a fresh {@link RevocationRecord}. The returned record is plain\n * data; use {@link encodeRevocation} to wrap it in a signed envelope\n * suitable for transport.\n */\nexport function createRevocation(options: CreateRevocationOptions): RevocationRecord {\n const now = options.now ? options.now() : Date.now();\n return {\n version: REVOCATION_RECORD_VERSION,\n issuerPeerId: options.issuerPeerId,\n revokedPeerId: options.revokedPeerId,\n issuedAt: now,\n ...(options.reason === undefined ? {} : { reason: options.reason }),\n };\n}\n\n/**\n * Apply a verified revocation to a keyring. Mutates the keyring in place:\n * adds the target peer id to {@link MeshKeyring.revokedPeers}. The caller\n * must verify the revocation (via {@link decodeRevocation}) before\n * applying; this function does not revalidate the signature.\n */\nexport function applyRevocation(record: RevocationRecord, keyring: MeshKeyring): void {\n keyring.revokedPeers.add(record.revokedPeerId);\n}\n\n/**\n * Revoke a peer locally without producing a transportable record. Useful\n * for the common case where an application decides to drop a peer on this\n * device without propagating the decision elsewhere (tests, single-device\n * setups). Peers that want the revocation to spread to other devices\n * should use {@link createRevocation} + {@link encodeRevocation}.\n */\nexport function revokePeerLocally(peerId: string, keyring: MeshKeyring): void {\n keyring.revokedPeers.add(peerId);\n}\n\n// binary serialisation\n\n/**\n * Serialise a {@link RevocationRecord} to a binary payload ready for\n * signing. The layout is:\n *\n * [4 bytes: magic \"PRV1\"]\n * [1 byte: version]\n * [4 bytes BE: issuer id byte length]\n * [N bytes: issuer id UTF-8]\n * [4 bytes BE: revoked peer id byte length]\n * [M bytes: revoked peer id UTF-8]\n * [8 bytes BE: issuedAt (uint64 milliseconds)]\n * [4 bytes BE: reason byte length]\n * [R bytes: reason UTF-8]\n */\nexport function serialiseRevocationPayload(record: RevocationRecord): Uint8Array {\n const issuerBytes = new TextEncoder().encode(record.issuerPeerId);\n const revokedBytes = new TextEncoder().encode(record.revokedPeerId);\n const reasonBytes = new TextEncoder().encode(record.reason ?? \"\");\n\n const total =\n REVOCATION_MAGIC.length +\n 1 + // version\n 4 +\n issuerBytes.length +\n 4 +\n revokedBytes.length +\n 8 + // issuedAt\n 4 +\n reasonBytes.length;\n\n const out = new Uint8Array(total);\n let offset = 0;\n\n out.set(REVOCATION_MAGIC, offset);\n offset += REVOCATION_MAGIC.length;\n\n out[offset] = record.version;\n offset += 1;\n\n const view = new DataView(out.buffer);\n view.setUint32(offset, issuerBytes.length, false);\n offset += 4;\n out.set(issuerBytes, offset);\n offset += issuerBytes.length;\n\n view.setUint32(offset, revokedBytes.length, false);\n offset += 4;\n out.set(revokedBytes, offset);\n offset += revokedBytes.length;\n\n view.setBigUint64(offset, BigInt(record.issuedAt), false);\n offset += 8;\n\n view.setUint32(offset, reasonBytes.length, false);\n offset += 4;\n out.set(reasonBytes, offset);\n\n return out;\n}\n\n/** Inverse of {@link serialiseRevocationPayload}. */\nfunction parseRevocationPayload(bytes: Uint8Array): RevocationRecord {\n let offset = 0;\n\n if (bytes.length < REVOCATION_MAGIC.length) {\n throw new RevocationError(\"Revocation record too short for magic.\", \"truncated\");\n }\n for (let i = 0; i < REVOCATION_MAGIC.length; i++) {\n if (bytes[offset + i] !== REVOCATION_MAGIC[i]) {\n throw new RevocationError(\"Revocation record magic mismatch.\", \"wrong-magic\");\n }\n }\n offset += REVOCATION_MAGIC.length;\n\n if (bytes.length < offset + 1) {\n throw new RevocationError(\"Revocation record truncated at version.\", \"truncated\");\n }\n const version = bytes[offset] as unknown as number;\n offset += 1;\n if (version !== REVOCATION_RECORD_VERSION) {\n throw new RevocationError(`Unknown revocation record version: ${version}.`, \"unknown-version\");\n }\n\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n\n if (bytes.length < offset + 4) {\n throw new RevocationError(\"Revocation record truncated at issuer length.\", \"truncated\");\n }\n const issuerLen = view.getUint32(offset, false);\n offset += 4;\n if (bytes.length < offset + issuerLen) {\n throw new RevocationError(\"Revocation record truncated at issuer id.\", \"truncated\");\n }\n const issuerPeerId = new TextDecoder().decode(bytes.subarray(offset, offset + issuerLen));\n offset += issuerLen;\n\n if (bytes.length < offset + 4) {\n throw new RevocationError(\"Revocation record truncated at revoked id length.\", \"truncated\");\n }\n const revokedLen = view.getUint32(offset, false);\n offset += 4;\n if (bytes.length < offset + revokedLen) {\n throw new RevocationError(\"Revocation record truncated at revoked id.\", \"truncated\");\n }\n const revokedPeerId = new TextDecoder().decode(bytes.subarray(offset, offset + revokedLen));\n offset += revokedLen;\n\n if (bytes.length < offset + 8) {\n throw new RevocationError(\"Revocation record truncated at issuedAt.\", \"truncated\");\n }\n const issuedAt = Number(view.getBigUint64(offset, false));\n offset += 8;\n\n if (bytes.length < offset + 4) {\n throw new RevocationError(\"Revocation record truncated at reason length.\", \"truncated\");\n }\n const reasonLen = view.getUint32(offset, false);\n offset += 4;\n if (bytes.length < offset + reasonLen) {\n throw new RevocationError(\"Revocation record truncated at reason.\", \"truncated\");\n }\n const reason = new TextDecoder().decode(bytes.subarray(offset, offset + reasonLen));\n offset += reasonLen;\n\n return {\n version,\n issuerPeerId,\n revokedPeerId,\n issuedAt,\n ...(reason ? { reason } : {}),\n };\n}\n\n/**\n * Produce a signed, transportable binary blob from a revocation record.\n * Wraps the serialised payload in a {@link SignedEnvelope} signed by the\n * issuer's keypair, then encodes the envelope to bytes.\n */\nexport function encodeRevocation(record: RevocationRecord, issuer: SigningKeyPair): Uint8Array {\n const payload = serialiseRevocationPayload(record);\n const envelope = signEnvelope(payload, record.issuerPeerId, issuer.secretKey);\n return encodeSignedEnvelope(envelope);\n}\n\n/**\n * Parse and verify a signed revocation blob. Returns the decoded record\n * on success; throws {@link RevocationError} on any failure.\n *\n * Verification requires the keyring to already know the issuer's public\n * key (because Polly does not have a global PKI). If the issuer is\n * unknown, the caller receives `unknown-issuer` and can decide whether\n * to cache the revocation for later verification or drop it outright.\n *\n * Authorisation: when the keyring has a non-empty\n * {@link MeshKeyring.revocationAuthority} set, only issuers inside that\n * set can have their revocations accepted. An issuer outside the set\n * produces `unauthorised-issuer`. When the authority set is undefined\n * or empty, any signed revocation from a known peer is accepted — that\n * is the Phase 2 first-cut default, preserved for backward compatibility.\n */\nexport function decodeRevocation(bytes: Uint8Array, keyring: MeshKeyring): RevocationRecord {\n const envelope = decodeSignedEnvelope(bytes);\n const issuerKey = keyring.knownPeers.get(envelope.senderId);\n if (!issuerKey) {\n throw new RevocationError(\n `Revocation issuer ${envelope.senderId} is not in the local keyring.`,\n \"unknown-issuer\"\n );\n }\n if (\n keyring.revocationAuthority !== undefined &&\n keyring.revocationAuthority.size > 0 &&\n !keyring.revocationAuthority.has(envelope.senderId)\n ) {\n throw new RevocationError(\n `Revocation issuer ${envelope.senderId} is not in the keyring's revocation authority set.`,\n \"unauthorised-issuer\"\n );\n }\n let payloadBytes: Uint8Array;\n try {\n payloadBytes = openSignedEnvelope(envelope, issuerKey);\n } catch {\n throw new RevocationError(\n `Revocation signature failed verification for issuer ${envelope.senderId}.`,\n \"signature-invalid\"\n );\n }\n\n const record = parseRevocationPayload(payloadBytes);\n // Paranoid cross-check: the payload's claimed issuer must match the\n // envelope's authenticated sender. Mismatch means a forged payload.\n if (record.issuerPeerId !== envelope.senderId) {\n throw new RevocationError(\n `Revocation payload claims issuer ${record.issuerPeerId} but the envelope was signed by ${envelope.senderId}.`,\n \"not-signed-by-issuer\"\n );\n }\n return record;\n}\n"
|
|
28
28
|
],
|
|
29
|
-
"mappings": "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",
|
|
30
|
-
"debugId": "
|
|
29
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4DO,SAAS,OAAO,CACrB,SACA,SAAoB,eACE;AAAA,EACtB,OAAO,IAAI,QAAqB,CAAC,SAAS,WAAW;AAAA,IACnD,MAAM,QAAQ,KAAK,IAAI;AAAA,IACvB,MAAM,UAAU,OAAO,QAAQ,MAAM,QAAQ,OAAO;AAAA,IACpD,IAAI,UAAU;AAAA,IACd,MAAM,UAAU,MAAM,KAAK,IAAI,IAAI;AAAA,IACnC,MAAM,aAAa,CAAC,QAA8B,UAAoB;AAAA,MACpE,IAAI;AAAA,QAAS;AAAA,MACb,UAAU;AAAA,MACV,aAAa,KAAK;AAAA,MAClB,OAAO,IAAI,aAAa,QAAQ,QAAQ,MAAM,QAAQ,GAAG,KAAK,CAAC;AAAA;AAAA,IAEjE,MAAM,QAAQ,WAAW,MAAM,WAAW,SAAS,GAAG,mBAAmB;AAAA,IAEzE,QAAQ,UAAU,MAAM,WAAW,SAAS,QAAQ,KAAK;AAAA,IACzD,QAAQ,YAAY,MAAM,WAAW,SAAS;AAAA,IAC9C,QAAQ,YAAY,MAAM;AAAA,MACxB,IAAI;AAAA,QAAS;AAAA,MACb,UAAU;AAAA,MACV,aAAa,KAAK;AAAA,MAClB,QAAQ,QAAQ,MAAM;AAAA;AAAA,IAExB,QAAQ,kBAAkB,CAAC,UAAU;AAAA,MACnC,MAAM,KAAM,MAAM,OAAuC;AAAA,MACzD,QAAQ,QAAQ,IAAI,KAAK;AAAA;AAAA,GAE5B;AAAA;AAOI,SAAS,UAAU,CACxB,KACA,SACA,QACsB;AAAA,EACtB,IAAI,IAAI;AAAA,IAAS,OAAO,IAAI;AAAA,EAC5B,MAAM,UAAU,QAAQ,SAAS,MAAM;AAAA,EACvC,QAAQ,MAAM,MAAM;AAAA,IAClB,IAAI,IAAI,YAAY;AAAA,MAAS,IAAI,UAAU;AAAA,GAC5C;AAAA,EACD,IAAI,UAAU;AAAA,EACd,OAAO;AAAA;AAIF,SAAS,UAAa,CAAC,SAAoC;AAAA,EAChE,OAAO,IAAI,QAAW,CAAC,SAAS,WAAW;AAAA,IACzC,QAAQ,YAAY,MAAM,QAAQ,QAAQ,MAAM;AAAA,IAChD,QAAQ,UAAU,MAAM,OAAO,QAAQ,KAAK;AAAA,GAC7C;AAAA;AAMI,SAAS,KAAK,CACnB,IACA,WACA,MACA,IACe;AAAA,EACf,OAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAAA,IAC5C,MAAM,KAAK,GAAG,YAAY,WAAW,IAAI;AAAA,IACzC,MAAM,QAAQ,GAAG,YAAY,SAAS;AAAA,IACtC,GAAG,aAAa,MAAM,QAAQ;AAAA,IAC9B,GAAG,UAAU,MAAM,OAAO,GAAG,KAAK;AAAA,IAClC,GAAG,UAAU,MAAM,OAAO,GAAG,KAAK;AAAA,IAClC,IAAI;AAAA,MACF,GAAG,KAAK;AAAA,MACR,OAAO,KAAK;AAAA,MACZ,IAAI;AAAA,QACF,GAAG,MAAM;AAAA,QACT,MAAM;AAAA,MAGR,OAAO,GAAG;AAAA;AAAA,GAEb;AAAA;AAII,SAAS,aAAgB,CAC9B,IACA,WACA,OACe;AAAA,EACf,OAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAAA,IAC5C,MAAM,KAAK,GAAG,YAAY,WAAW,UAAU;AAAA,IAC/C,MAAM,QAAQ,GAAG,YAAY,SAAS;AAAA,IACtC,MAAM,UAAU,MAAM,WAAW;AAAA,IACjC,QAAQ,YAAY,MAAM;AAAA,MACxB,MAAM,SAAS,QAAQ;AAAA,MACvB,IAAI,CAAC;AAAA,QAAQ,OAAO,QAAQ;AAAA,MAC5B,MAAM,OAAO,KAAK,OAAO,KAAU;AAAA,MACnC,OAAO,SAAS;AAAA;AAAA,IAElB,QAAQ,UAAU,MAAM,OAAO,QAAQ,KAAK;AAAA,GAC7C;AAAA;AAAA,IApJU,sBAAsB,MAWtB,cA+BP,gBAA2B,CAAC,MAAM,YAAY,UAAU,KAAK,MAAM,OAAO;AAAA;AAAA,EA/BnE,eAAN,MAAM,qBAAqB,MAAM;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IAET,WAAW,CAAC,QAA8B,QAAgB,WAAmB,OAAiB;AAAA,MAC5F,MACE,4BAA4B,WAAW,gBAAgB,eACvD,UAAU,YAAY,YAAY,EAAE,MAAM,CAC5C;AAAA,MACA,KAAK,OAAO;AAAA,MACZ,KAAK,SAAS;AAAA,MACd,KAAK,SAAS;AAAA,MACd,KAAK,YAAY;AAAA;AAAA,EAErB;AAAA;;;;;;;;;;;;;;;;;;ACNA;AA+BO,SAAS,mBAAmB,GAAe;AAAA,EAChD,OAAO,KAAK,YAAY,SAAS;AAAA;AAQ5B,SAAS,OAAO,CAAC,SAAqB,KAA8B;AAAA,EACzE,IAAI,IAAI,WAAW,WAAW;AAAA,IAC5B,MAAM,IAAI,gBACR,yBAAyB,wBAAwB,IAAI,WACrD,oBACF;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,KAAK,YAAY,WAAW;AAAA,EAC1C,MAAM,aAAa,KAAK,UAAU,SAAS,OAAO,GAAG;AAAA,EACrD,MAAM,MAAM,IAAI,WAAW,cAAc,WAAW,MAAM;AAAA,EAC1D,IAAI,IAAI,OAAO,CAAC;AAAA,EAChB,IAAI,IAAI,YAAY,WAAW;AAAA,EAC/B,OAAO;AAAA;AAcF,SAAS,OAAO,CAAC,QAAqB,KAAyC;AAAA,EACpF,IAAI,IAAI,WAAW,WAAW;AAAA,IAC5B,MAAM,IAAI,gBACR,yBAAyB,wBAAwB,IAAI,WACrD,oBACF;AAAA,EACF;AAAA,EACA,IAAI,OAAO,SAAS,cAAc,WAAW;AAAA,IAC3C;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,OAAO,SAAS,GAAG,WAAW;AAAA,EAC5C,MAAM,aAAa,OAAO,SAAS,WAAW;AAAA,EAC9C,MAAM,SAAS,KAAK,UAAU,KAAK,YAAY,OAAO,GAAG;AAAA,EACzD,OAAO,UAAU;AAAA;AAOZ,SAAS,cAAc,CAAC,QAAqB,KAA6B;AAAA,EAC/E,MAAM,SAAS,QAAQ,QAAQ,GAAG;AAAA,EAClC,IAAI,CAAC,QAAQ;AAAA,IACX,MAAM,IAAI,gBACR,sFACA,gBACF;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAoBF,SAAS,YAAY,CAC1B,SACA,YACA,KACmB;AAAA,EACnB,OAAO;AAAA,IACL;AAAA,IACA,QAAQ,QAAQ,SAAS,GAAG;AAAA,EAC9B;AAAA;AAOK,SAAS,YAAY,CAAC,UAA6B,KAA6B;AAAA,EACrF,OAAO,eAAe,SAAS,QAAQ,GAAG;AAAA;AAYrC,SAAS,uBAAuB,CAAC,UAAyC;AAAA,EAC/E,MAAM,UAAU,IAAI,YAAY,EAAE,OAAO,SAAS,UAAU;AAAA,EAC5D,MAAM,MAAM,IAAI,WAAW,IAAI,QAAQ,SAAS,SAAS,OAAO,MAAM;AAAA,EACtE,MAAM,OAAO,IAAI,SAAS,IAAI,MAAM;AAAA,EACpC,KAAK,UAAU,GAAG,QAAQ,QAAQ,KAAK;AAAA,EACvC,IAAI,IAAI,SAAS,CAAC;AAAA,EAClB,IAAI,IAAI,SAAS,QAAQ,IAAI,QAAQ,MAAM;AAAA,EAC3C,OAAO;AAAA;AAOF,SAAS,uBAAuB,CAAC,OAAsC;AAAA,EAC5E,IAAI,MAAM,SAAS,GAAG;AAAA,IACpB,MAAM,IAAI,gBACR,iCAAiC,MAAM,iBACvC,oBACF;AAAA,EACF;AAAA,EACA,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,EAC1E,MAAM,QAAQ,KAAK,UAAU,GAAG,KAAK;AAAA,EACrC,IAAI,MAAM,SAAS,IAAI,OAAO;AAAA,IAC5B,MAAM,IAAI,gBACR,oDAAoD,gBAAgB,MAAM,WAC1E,oBACF;AAAA,EACF;AAAA,EACA,MAAM,aAAa,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC;AAAA,EACxE,MAAM,SAAS,MAAM,MAAM,IAAI,KAAK;AAAA,EACpC,OAAO,EAAE,YAAY,OAAO;AAAA;AAAA,IA1KjB,YAAY,IAEZ,cAAc,IAEd,YAAY,IAWZ;AAAA;AAAA,oBAAN,MAAM,wBAAwB,MAAM;AAAA,IAChC;AAAA,IACT,WAAW,CAAC,SAAiB,MAA+B;AAAA,MAC1D,MAAM,OAAO;AAAA,MACb,KAAK,OAAO;AAAA,MACZ,KAAK,OAAO;AAAA;AAAA,EAEhB;AAAA;;;AC3CA;AACA;AAKA,IAAM,UAAU,IAAI,IAAI,UAAU,YAAY,GAAG,EAAE;AAEnD,MAAM,eAAe,OAAO;;;ACP5B;AAAA;AAWO,MAAM,gBAAqC;AAAA,EAC/B,QAAQ,IAAI;AAAA,EACZ,SAAS,IAAI;AAAA,EACb,OAAO,IAAI;AAAA,OAEtB,IAAG,CAAC,MAA+C;AAAA,IACvD,MAAM,QAAQ,KAAK,MAAM,IAAI,IAAI;AAAA,IACjC,IAAI,CAAC;AAAA,MAAO;AAAA,IACZ,MAAM,aAAa,KAAK,IAAI;AAAA,IAC5B,OAAO,MAAM;AAAA;AAAA,OAGT,IAAG,CAAC,MAAc,OAAkC;AAAA,IACxD,KAAK,MAAM,IAAI,MAAM,EAAE,OAAO,YAAY,KAAK,IAAI,EAAE,CAAC;AAAA;AAAA,OAGlD,IAAG,CAAC,MAAgC;AAAA,IACxC,OAAO,KAAK,MAAM,IAAI,IAAI;AAAA;AAAA,OAGtB,OAAM,CAAC,MAA6B;AAAA,IACxC,KAAK,MAAM,OAAO,IAAI;AAAA,IACtB,KAAK,OAAO,OAAO,IAAI;AAAA,IACvB,MAAM,MAAM,KAAK,KAAK,IAAI,IAAI;AAAA,IAC9B,IAAI,KAAK;AAAA,MACP,IAAI,gBAAgB,GAAG;AAAA,MACvB,KAAK,KAAK,OAAO,IAAI;AAAA,IACvB;AAAA;AAAA,OAGI,IAAG,CAAC,MAA6B;AAAA,IACrC,KAAK,OAAO,IAAI,IAAI;AAAA;AAAA,OAGhB,MAAK,CAAC,MAA6B;AAAA,IACvC,KAAK,OAAO,OAAO,IAAI;AAAA;AAAA,OAGnB,KAAI,GAAoB;AAAA,IAC5B,IAAI,QAAQ;AAAA,IACZ,WAAW,SAAS,KAAK,MAAM,OAAO,GAAG;AAAA,MACvC,SAAS,MAAM,MAAM;AAAA,IACvB;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,MAAK,CAAC,UAAmC;AAAA,IAC7C,IAAI,cAAc,MAAM,KAAK,KAAK;AAAA,IAClC,IAAI,eAAe;AAAA,MAAU,OAAO;AAAA,IACpC,MAAM,QAAQ;AAAA,IAEd,MAAM,aAAwE,CAAC;AAAA,IAC/E,YAAY,MAAM,UAAU,KAAK,OAAO;AAAA,MACtC,IAAI,CAAC,KAAK,OAAO,IAAI,IAAI,GAAG;AAAA,QAC1B,WAAW,KAAK,EAAE,MAAM,YAAY,MAAM,YAAY,MAAM,MAAM,MAAM,WAAW,CAAC;AAAA,MACtF;AAAA,IACF;AAAA,IACA,WAAW,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU;AAAA,IAErD,WAAW,KAAK,YAAY;AAAA,MAC1B,IAAI,eAAe;AAAA,QAAU;AAAA,MAC7B,MAAM,KAAK,OAAO,EAAE,IAAI;AAAA,MACxB,eAAe,EAAE;AAAA,IACnB;AAAA,IACA,OAAO,QAAQ;AAAA;AAAA,OAKX,IAAG,CAAC,MAA2C;AAAA,IACnD,MAAM,SAAS,KAAK,KAAK,IAAI,IAAI;AAAA,IACjC,IAAI;AAAA,MAAQ,OAAO;AAAA,IACnB,MAAM,QAAQ,KAAK,MAAM,IAAI,IAAI;AAAA,IACjC,IAAI,CAAC;AAAA,MAAO;AAAA,IACZ,MAAM,SAAS,IAAI,YAAY,MAAM,MAAM,UAAU;AAAA,IACrD,IAAI,WAAW,MAAM,EAAE,IAAI,MAAM,KAAK;AAAA,IACtC,MAAM,YAAY,IAAI,gBAAgB,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;AAAA,IACxD,KAAK,KAAK,IAAI,MAAM,SAAS;AAAA,IAC7B,OAAO;AAAA;AAAA,EAGT,OAAO,GAAS;AAAA,IACd,WAAW,aAAa,KAAK,KAAK,OAAO,GAAG;AAAA,MAC1C,IAAI,gBAAgB,SAAS;AAAA,IAC/B;AAAA,IACA,KAAK,KAAK,MAAM;AAAA,IAChB,KAAK,MAAM,MAAM;AAAA,IACjB,KAAK,OAAO,MAAM;AAAA;AAEtB;AAAA;AAaO,MAAM,mBAAwC;AAAA,SAC3B,UAAU;AAAA,SACV,aAAa;AAAA,SACb,aAAa;AAAA,EAEpB,QAAkD,EAAE,SAAS,KAAK;AAAA,EAClE,OAAO,IAAI;AAAA,EAEpB,MAAM,GAAyB;AAAA,IACrC,OAAO,WAAW,KAAK,OAAO;AAAA,MAC5B,MAAM,mBAAmB;AAAA,MACzB,SAAS,mBAAmB;AAAA,MAC5B,SAAS,CAAC,OAAO;AAAA,QACf,IAAI,CAAC,GAAG,iBAAiB,SAAS,mBAAmB,UAAU,GAAG;AAAA,UAChE,GAAG,kBAAkB,mBAAmB,UAAU;AAAA,QACpD;AAAA;AAAA,IAEJ,CAAC;AAAA;AAAA,OAGW,UAAS,CAAC,MAA8C;AAAA,IACpE,MAAM,KAAK,MAAM,KAAK,OAAO;AAAA,IAC7B,MAAM,KAAK,GAAG,YAAY,mBAAmB,YAAY,UAAU;AAAA,IACnE,OAAO,WAAW,GAAG,YAAY,mBAAmB,UAAU,EAAE,IAAI,IAAI,CAAC;AAAA;AAAA,OAK7D,UAAS,CAAC,MAAc,QAAkC;AAAA,IACtE,MAAM,KAAK,MAAM,KAAK,OAAO;AAAA,IAC7B,MAAM,MAAM,IAAI,mBAAmB,YAAY,aAAa,CAAC,UAAU;AAAA,MACrE,MAAM,IAAI,QAAQ,IAAI;AAAA,KACvB;AAAA;AAAA,OAGG,IAAG,CAAC,MAA+C;AAAA,IACvD,MAAM,SAAS,MAAM,KAAK,UAAU,IAAI;AAAA,IACxC,IAAI,CAAC;AAAA,MAAQ;AAAA,IAGR,KAAK,UAAU,MAAM,KAAK,QAAQ,YAAY,KAAK,IAAI,EAAE,CAAC;AAAA,IAC/D,OAAO,OAAO;AAAA;AAAA,OAGV,IAAG,CAAC,MAAc,OAAkC;AAAA,IACxD,MAAM,WAAW,MAAM,KAAK,UAAU,IAAI;AAAA,IAC1C,MAAM,KAAK,UAAU,MAAM;AAAA,MACzB;AAAA,MACA,MAAM,MAAM;AAAA,MACZ,YAAY,KAAK,IAAI;AAAA,MACrB,QAAQ,UAAU,UAAU;AAAA,IAC9B,CAAC;AAAA;AAAA,OAGG,IAAG,CAAC,MAAgC;AAAA,IACxC,MAAM,KAAK,MAAM,KAAK,OAAO;AAAA,IAC7B,MAAM,KAAK,GAAG,YAAY,mBAAmB,YAAY,UAAU;AAAA,IACnE,MAAM,QAAQ,MAAM,WAAW,GAAG,YAAY,mBAAmB,UAAU,EAAE,MAAM,IAAI,CAAC;AAAA,IACxF,OAAO,QAAQ;AAAA;AAAA,OAGX,OAAM,CAAC,MAA6B;AAAA,IACxC,MAAM,MAAM,KAAK,KAAK,IAAI,IAAI;AAAA,IAC9B,IAAI,KAAK;AAAA,MACP,IAAI,gBAAgB,GAAG;AAAA,MACvB,KAAK,KAAK,OAAO,IAAI;AAAA,IACvB;AAAA,IACA,MAAM,KAAK,MAAM,KAAK,OAAO;AAAA,IAC7B,MAAM,MAAM,IAAI,mBAAmB,YAAY,aAAa,CAAC,UAAU;AAAA,MACrE,MAAM,OAAO,IAAI;AAAA,KAClB;AAAA;AAAA,OAGG,IAAG,CAAC,MAA6B;AAAA,IACrC,MAAM,SAAS,MAAM,KAAK,UAAU,IAAI;AAAA,IACxC,IAAI,CAAC;AAAA,MAAQ;AAAA,IACb,MAAM,KAAK,UAAU,MAAM,KAAK,QAAQ,QAAQ,KAAK,CAAC;AAAA;AAAA,OAGlD,MAAK,CAAC,MAA6B;AAAA,IACvC,MAAM,SAAS,MAAM,KAAK,UAAU,IAAI;AAAA,IACxC,IAAI,CAAC;AAAA,MAAQ;AAAA,IACb,MAAM,KAAK,UAAU,MAAM,KAAK,QAAQ,QAAQ,MAAM,CAAC;AAAA;AAAA,OAGnD,KAAI,GAAoB;AAAA,IAC5B,MAAM,KAAK,MAAM,KAAK,OAAO;AAAA,IAC7B,IAAI,QAAQ;AAAA,IACZ,MAAM,cAAyB,IAAI,mBAAmB,YAAY,CAAC,MAAM,UAAU;AAAA,MACjF,SAAS,MAAM;AAAA,KAChB;AAAA,IACD,OAAO;AAAA;AAAA,OAGH,MAAK,CAAC,UAAmC;AAAA,IAC7C,MAAM,KAAK,MAAM,KAAK,OAAO;AAAA,IAC7B,MAAM,aAAwE,CAAC;AAAA,IAC/E,IAAI,YAAY;AAAA,IAEhB,MAAM,cAAyB,IAAI,mBAAmB,YAAY,CAAC,KAAK,UAAU;AAAA,MAChF,aAAa,MAAM;AAAA,MACnB,IAAI,CAAC,MAAM,QAAQ;AAAA,QACjB,WAAW,KAAK;AAAA,UACd,MAAM;AAAA,UACN,YAAY,MAAM;AAAA,UAClB,MAAM,MAAM;AAAA,QACd,CAAC;AAAA,MACH;AAAA,KACD;AAAA,IAED,IAAI,aAAa;AAAA,MAAU,OAAO;AAAA,IAClC,WAAW,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU;AAAA,IAErD,IAAI,QAAQ;AAAA,IACZ,WAAW,KAAK,YAAY;AAAA,MAC1B,IAAI,aAAa;AAAA,QAAU;AAAA,MAC3B,MAAM,KAAK,OAAO,EAAE,IAAI;AAAA,MACxB,aAAa,EAAE;AAAA,MACf,SAAS,EAAE;AAAA,IACb;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,IAAG,CAAC,MAA2C;AAAA,IACnD,MAAM,SAAS,KAAK,KAAK,IAAI,IAAI;AAAA,IACjC,IAAI;AAAA,MAAQ,OAAO;AAAA,IACnB,MAAM,QAAQ,MAAM,KAAK,IAAI,IAAI;AAAA,IACjC,IAAI,CAAC;AAAA,MAAO;AAAA,IACZ,MAAM,SAAS,IAAI,YAAY,MAAM,UAAU;AAAA,IAC/C,IAAI,WAAW,MAAM,EAAE,IAAI,KAAK;AAAA,IAChC,MAAM,YAAY,IAAI,gBAAgB,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;AAAA,IACxD,KAAK,KAAK,IAAI,MAAM,SAAS;AAAA,IAC7B,OAAO;AAAA;AAAA,EAGT,OAAO,GAAS;AAAA,IACd,WAAW,aAAa,KAAK,KAAK,OAAO,GAAG;AAAA,MAC1C,IAAI,gBAAgB,SAAS;AAAA,IAC/B;AAAA,IACA,KAAK,KAAK,MAAM;AAAA;AAEpB;;ACzNO,SAAS,SAAS,CAAC,OAAkC;AAAA,EAC1D,IAAI,OAAO,UAAU,YAAY,UAAU;AAAA,IAAM,OAAO;AAAA,EACxD,MAAM,IAAI;AAAA,EACV,OACE,OAAO,EAAE,YAAY,YACrB,iBAAiB,KAAK,EAAE,OAAO,KAC/B,OAAO,EAAE,YAAY,YACrB,OAAO,UAAU,EAAE,OAAO,KAC1B,EAAE,WAAW,KACb,OAAO,EAAE,gBAAgB,YACzB,OAAO,EAAE,gBAAgB;AAAA;AAO7B,eAAsB,eAAe,CAAC,OAAoC;AAAA,EAIxE,MAAM,SAAS,IAAI,YAAY,MAAM,UAAU;AAAA,EAC/C,MAAM,OAAO,IAAI,WAAW,MAAM;AAAA,EAClC,KAAK,IAAI,KAAK;AAAA,EACd,MAAM,SAAS,MAAM,OAAO,OAAO,OAAO,WAAW,MAAM;AAAA,EAC3D,MAAM,OAAO,IAAI,WAAW,MAAM;AAAA,EAClC,IAAI,MAAM;AAAA,EACV,WAAW,QAAQ,MAAM;AAAA,IACvB,OAAO,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAAA,EAC1C;AAAA,EACA,OAAO;AAAA;AAiBT,eAAsB,aAAa;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,GACsC;AAAA,EACtC,MAAM,OAAO,MAAM,gBAAgB,KAAK;AAAA,EACxC,OAAO;AAAA,IACL;AAAA,IACA,MAAM,MAAM;AAAA,IACZ;AAAA,IACA;AAAA,EACF;AAAA;;AC7FK,IAAM,kBAAkB;AAIxB,IAAM,yBAAyB,MAAM;AA4BrC,SAAS,SAAS,CAAC,OAAmB,YAAoB,iBAA+B;AAAA,EAC9F,MAAM,SAAuB,CAAC;AAAA,EAC9B,SAAS,SAAS,EAAG,SAAS,MAAM,QAAQ,UAAU,WAAW;AAAA,IAC/D,OAAO,KAAK,MAAM,SAAS,QAAQ,KAAK,IAAI,SAAS,WAAW,MAAM,MAAM,CAAC,CAAC;AAAA,EAChF;AAAA,EAGA,IAAI,OAAO,WAAW,GAAG;AAAA,IACvB,OAAO,KAAK,IAAI,WAAW,CAAC,CAAC;AAAA,EAC/B;AAAA,EACA,OAAO;AAAA;AAKF,SAAS,gBAAgB,CAAC,QAAiC,OAA2B;AAAA,EAC3F,IAAI,aAAa;AAAA,EACjB,SAAS,IAAI,EAAG,IAAI,OAAO,KAAK;AAAA,IAC9B,MAAM,QAAQ,OAAO,IAAI,CAAC;AAAA,IAC1B,IAAI,CAAC,OAAO;AAAA,MACV,MAAM,IAAI,MAAM,mCAAmC,QAAQ,OAAO;AAAA,IACpE;AAAA,IACA,cAAc,MAAM;AAAA,EACtB;AAAA,EACA,MAAM,MAAM,IAAI,WAAW,UAAU;AAAA,EACrC,IAAI,SAAS;AAAA,EACb,SAAS,IAAI,EAAG,IAAI,OAAO,KAAK;AAAA,IAC9B,MAAM,QAAQ,OAAO,IAAI,CAAC;AAAA,IAC1B,IAAI,IAAI,OAAO,MAAM;AAAA,IACrB,UAAU,MAAM;AAAA,EAClB;AAAA,EACA,OAAO;AAAA;AAIF,SAAS,mBAAmB,CAAC,QAAiC,OAAyB;AAAA,EAC5F,MAAM,UAAoB,CAAC;AAAA,EAC3B,SAAS,IAAI,EAAG,IAAI,OAAO,KAAK;AAAA,IAC9B,IAAI,CAAC,OAAO,IAAI,CAAC,GAAG;AAAA,MAClB,QAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAQF,SAAS,oBAAoB,CAClC,QACA,OAAmB,IAAI,WAAW,CAAC,GACV;AAAA,EACzB,MAAM,cAAc,IAAI,YAAY,EAAE,OAAO,KAAK,UAAU,MAAM,CAAC;AAAA,EACnE,MAAM,OAAO,IAAI,YAAY,SAAS,KAAK;AAAA,EAC3C,MAAM,SAAS,IAAI,YAAY,IAAI;AAAA,EACnC,MAAM,MAAM,IAAI,WAAW,MAAM;AAAA,EACjC,MAAM,OAAO,IAAI,SAAS,MAAM;AAAA,EAChC,KAAK,UAAU,GAAG,YAAY,QAAQ,KAAK;AAAA,EAC3C,IAAI,IAAI,aAAa,CAAC;AAAA,EACtB,IAAI,IAAI,MAAM,IAAI,YAAY,MAAM;AAAA,EACpC,OAAO;AAAA;AAyBF,SAAS,iBAAiB,CAAC,OAA4B;AAAA,EAC5D,IAAI,MAAM,SAAS;AAAA,IAAG,OAAO;AAAA,EAC7B,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,EAC1E,MAAM,YAAY,KAAK,UAAU,GAAG,KAAK;AAAA,EACzC,IAAI,MAAM,SAAS,IAAI;AAAA,IAAW,OAAO;AAAA,EAGzC,MAAM,cAAc,MAAM,SAAS,GAAG,IAAI,SAAS;AAAA,EAEnD,MAAM,SAAS,IAAI,YAAY,EAAE,OAAO,eAAe;AAAA,EACvD,OAAO,aAAa,aAAa,MAAM,MAAM;AAAA;AAI/C,SAAS,YAAY,CAAC,UAAsB,QAA4B;AAAA,EACtE,IAAI,OAAO,WAAW;AAAA,IAAG,OAAO;AAAA,EAChC;AAAA,IAAO,SAAS,IAAI,EAAG,KAAK,SAAS,SAAS,OAAO,QAAQ,KAAK;AAAA,MAChE,SAAS,IAAI,EAAG,IAAI,OAAO,QAAQ,KAAK;AAAA,QACtC,IAAI,SAAS,IAAI,OAAO,OAAO;AAAA,UAAI;AAAA,MACrC;AAAA,MACA,OAAO;AAAA,IACT;AAAA,EACA,OAAO;AAAA;;;ACrHT,IAAM,wBAAwB,MAAM,OAAO;AAC3C,IAAM,sBAAsB;AAC5B,IAAM,sBAAsB;AAsBrB,SAAS,eAAe,CAAC,SAA4B,SAAuC;AAAA,EACjG,MAAM,cAAc,SAAS,eAAe;AAAA,EAC5C,MAAM,aAAa,SAAS,SAAS;AAAA,EACrC,MAAM,QAAmB,SAAS,SAAS,IAAI;AAAA,EAI/C,MAAM,aAAa,IAAI;AAAA,EAEvB,MAAM,YAAY,IAAI;AAAA,EAEtB,MAAM,YAAY,IAAI;AAAA,EAEtB,MAAM,cAAc,IAAI;AAAA,EAExB,MAAM,WAAW,IAAI;AAAA,EACrB,IAAI,WAAW;AAAA,EAGf,QAAQ,gBAAgB,CAAC,QAAQ,QAAQ,SAAS;AAAA,IAChD,IAAI;AAAA,MAAU;AAAA,IACd,MAAM,OAAO,OAAO;AAAA,IACpB,QAAQ;AAAA,WACD;AAAA,QACE,YAAY,QAAQ,QAAsC,IAAI;AAAA,QACnE;AAAA,WACG;AAAA,QACE,cAAc,QAAQ,MAAsC;AAAA,QACjE;AAAA,WACG;AAAA,QACH,WAAW,QAAQ,MAAmC;AAAA,QACtD;AAAA;AAAA;AAAA,EAKN,MAAM,uBAAuB,CAAC,UAA+B;AAAA,IAC3D,IAAI;AAAA,MAAU;AAAA,IACd,MAAM,YAAY,MAAM;AAAA,IACxB,WAAW,QAAQ,aAAa;AAAA,MAC9B,MAAM,MAAM,qBAAqB,EAAE,MAAM,aAAa,KAAK,CAAiC;AAAA,MAC5F,QAAQ,gBAAgB,WAAW,GAAG;AAAA,IACxC;AAAA;AAAA,EAEF,QAAQ,GAAG,kBAAkB,oBAAoB;AAAA,EAIjD,eAAe,YAAY,CAAC,WAAuB,KAAsC;AAAA,IACvF,QAAQ,sBAAY;AAAA,IACpB,OAAO,SAAQ,WAAW,GAAG;AAAA;AAAA,EAG/B,eAAe,YAAY,CACzB,QACA,KACiC;AAAA,IACjC,QAAQ,sBAAY;AAAA,IACpB,OAAO,SAAQ,QAAQ,GAAG;AAAA;AAAA,EAK5B,eAAe,WAAW,CACxB,QACA,QACA,MACe;AAAA,IACf,MAAM,WAAW,UAAU,IAAI,OAAO,IAAI;AAAA,IAC1C,IAAI,CAAC;AAAA,MAAU;AAAA,IACf,SAAS,QAAQ,OAAO;AAAA,IAGxB,IAAI,CAAC,SAAS,eAAe,SAAS,MAAM,GAAG;AAAA,MAC7C,SAAS,eAAe,KAAK,MAAM;AAAA,IACrC;AAAA,IAGA,IAAI;AAAA,IACJ,IAAI,SAAS,KAAK;AAAA,MAChB,MAAM,YAAY,MAAM,aAAa,MAAM,SAAS,GAAG;AAAA,MACvD,IAAI,CAAC,WAAW;AAAA,QAEd;AAAA,MACF;AAAA,MACA,aAAa;AAAA,IACf,EAAO;AAAA,MACL,aAAa,KAAK,MAAM;AAAA;AAAA,IAG1B,SAAS,OAAO,IAAI,OAAO,OAAO,UAAU;AAAA,IAE5C,oBAAoB,QAAQ;AAAA,IAC5B,oBAAoB,QAAQ;AAAA,IAE5B,IAAI,SAAS,OAAO,QAAQ,OAAO,OAAO;AAAA,MACxC,eAAe,OAAO,MAAM,QAAQ;AAAA,IACtC,EAAO;AAAA,MACL,kBAAkB,OAAO,MAAM,QAAQ;AAAA;AAAA;AAAA,EAI3C,SAAS,mBAAmB,CAAC,UAA+B;AAAA,IAC1D,IAAI,CAAC,SAAS,cAAc,SAAS,SAAS;AAAA,MAAG;AAAA,IACjD,IAAI,SAAS;AAAA,IACb,WAAW,SAAS,SAAS,OAAO,OAAO,GAAG;AAAA,MAC5C,UAAU,MAAM;AAAA,IAClB;AAAA,IACA,SAAS,WAAW,EAAE,QAAQ,OAAO,WAAW,OAAO,cAAc,CAAC;AAAA;AAAA,EAGxE,SAAS,mBAAmB,CAAC,UAA+B;AAAA,IAC1D,IAAI,SAAS,aAAa;AAAA,MACxB,aAAa,SAAS,WAAW;AAAA,MACjC,SAAS,cAAc;AAAA,IACzB;AAAA;AAAA,EAGF,SAAS,cAAc,CAAC,MAAc,UAA+B;AAAA,IACnE,oBAAoB,QAAQ;AAAA,IAC5B,IAAI;AAAA,MACF,MAAM,YAAY,iBAAiB,SAAS,QAAQ,SAAS,KAAK;AAAA,MAClE,UAAU,OAAO,IAAI;AAAA,MACrB,SAAS,QAAQ,SAAS;AAAA,MAC1B,OAAO,KAAK;AAAA,MACZ,UAAU,OAAO,IAAI;AAAA,MACrB,SAAS,OAAO,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC,CAAC;AAAA;AAAA;AAAA,EAIvE,eAAe,aAAa,CAAC,QAAgB,QAA0C;AAAA,IACrF,MAAM,YAAY,MAAM,MAAM,IAAI,OAAO,IAAI;AAAA,IAC7C,IAAI,CAAC;AAAA,MAAW;AAAA,IAEhB,MAAM,kBAAkB,UAAU,SAAS;AAAA,IAC3C,MAAM,YAAY,OAAO,WAAW,gBAAgB,IAAI,CAAC,GAAG,MAAM,CAAC;AAAA,IACnE,MAAM,WAAW,WAAW,IAAI,OAAO,IAAI;AAAA,IAE3C,WAAW,SAAS,WAAW;AAAA,MAC7B,MAAM,iBAAiB,QAAQ,OAAO,MAAM,iBAAiB,OAAO,QAAQ;AAAA,IAC9E;AAAA;AAAA,EAGF,eAAe,gBAAgB,CAC7B,QACA,MACA,iBACA,OACA,UACe;AAAA,IACf,IAAI,QAAQ,KAAK,SAAS,gBAAgB;AAAA,MAAQ;AAAA,IAClD,MAAM,aAAa,gBAAgB;AAAA,IACnC,IAAI,CAAC;AAAA,MAAY;AAAA,IAEjB,MAAM,UAAU,WAAW,MAAM,aAAa,YAAY,QAAQ,IAAI;AAAA,IACtE,MAAM,cAA+B;AAAA,MACnC,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,OAAO,gBAAgB;AAAA,IACzB;AAAA,IACA,MAAM,MAAM,qBAAqB,aAA6C,OAAO;AAAA,IAErF,IAAI,CAAC,QAAQ,gBAAgB,QAAQ,GAAG,GAAG;AAAA,MACzC,MAAM,mBAAmB;AAAA,MACzB,QAAQ,gBAAgB,QAAQ,GAAG;AAAA,IACrC;AAAA;AAAA,EAGF,SAAS,UAAU,CAAC,QAAgB,QAA8B;AAAA,IAChE,IAAI,QAAQ,UAAU,IAAI,OAAO,IAAI;AAAA,IACrC,IAAI,CAAC,OAAO;AAAA,MACV,QAAQ,IAAI;AAAA,MACZ,UAAU,IAAI,OAAO,MAAM,KAAK;AAAA,IAClC;AAAA,IACA,MAAM,IAAI,MAAM;AAAA;AAAA,EAKlB,SAAS,YAAY,CAAC,MAAoB;AAAA,IACxC,MAAM,MAAM,qBAAqB,EAAE,MAAM,aAAa,KAAK,CAAiC;AAAA,IAC5F,WAAW,UAAU,QAAQ,kBAAkB;AAAA,MAC7C,QAAQ,gBAAgB,QAAQ,GAAG;AAAA,IACrC;AAAA;AAAA,EAGF,SAAS,mBAAmB,CAAC,UAA+B;AAAA,IAC1D,IAAI,SAAS;AAAA,MAAW,aAAa,SAAS,SAAS;AAAA,IACvD,IAAI,SAAS;AAAA,MAAa,aAAa,SAAS,WAAW;AAAA;AAAA,EAG7D,SAAS,iBAAiB,CAAC,MAAc,UAA+B;AAAA,IACtE,SAAS,cAAc,WAAW,MAAM,cAAc,MAAM,QAAQ,GAAG,mBAAmB;AAAA;AAAA,EAG5F,SAAS,aAAa,CAAC,MAAc,UAA+B;AAAA,IAClE,IAAI,CAAC,UAAU,IAAI,IAAI;AAAA,MAAG;AAAA,IAC1B,MAAM,UAAU,oBAAoB,SAAS,QAAQ,SAAS,KAAK;AAAA,IACnE,IAAI,QAAQ,WAAW;AAAA,MAAG;AAAA,IAI1B,MAAM,QAAQ,UAAU,IAAI,IAAI;AAAA,IAChC,MAAM,OAAO,SAAS,MAAM,OAAO,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,QAAQ,gBAAgB;AAAA,IAC9F,IAAI,KAAK,WAAW;AAAA,MAAG;AAAA,IACvB,MAAM,SAAS,KAAK,SAAS,oBAAoB,KAAK;AAAA,IACtD,SAAS;AAAA,IACT,IAAI,CAAC;AAAA,MAAQ;AAAA,IAEb,MAAM,YAA+B,EAAE,MAAM,gBAAgB,MAAM,QAAQ;AAAA,IAC3E,MAAM,MAAM,qBAAqB,SAAyC;AAAA,IAC1E,QAAQ,gBAAgB,QAAQ,GAAG;AAAA,IAGnC,kBAAkB,MAAM,QAAQ;AAAA;AAAA,EAGlC,SAAS,kBAAkB,GAAkB;AAAA,IAC3C,OAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AAAA;AAAA,EAKzD,MAAM,QAAmB;AAAA,SACjB,IAAG,CAAC,KAAK,OAAO,UAAyB;AAAA,MAC7C,IAAI;AAAA,QAAU,MAAM,IAAI,MAAM,uBAAuB;AAAA,MACrD,UAAS,QAAQ,eAAe;AAAA,MAEhC,IAAI,MAAM,SAAS,aAAa;AAAA,QAC9B,MAAM,IAAI,MAAM,8BAA8B,MAAM,YAAY,cAAc;AAAA,MAChF;AAAA,MAGA,MAAM,OAAO,MAAM,gBAAgB,KAAK;AAAA,MACxC,IAAI,SAAS,IAAI,MAAM;AAAA,QACrB,MAAM,IAAI,MAAM,2BAA2B,IAAI,aAAa,MAAM;AAAA,MACpE;AAAA,MAEA,UAAS,QAAQ,eAAe;AAAA,MAKhC,MAAM,MAAM,UAAS,OAAO;AAAA,MAC5B,IAAI,KAAK;AAAA,QACP,WAAW,IAAI,IAAI,MAAM,GAAG;AAAA,MAC9B;AAAA,MAEA,UAAS,aAAa,EAAE,QAAQ,MAAM,QAAQ,OAAO,MAAM,QAAQ,OAAO,YAAY,CAAC;AAAA,MAIvF,MAAM,MAAM,IAAI,IAAI,MAAM,KAAK;AAAA,MAC/B,YAAY,IAAI,IAAI,IAAI;AAAA,MAExB,aAAa,IAAI,IAAI;AAAA;AAAA,SAGjB,IAAG,CAAC,MAAM,UAA2C;AAAA,MACzD,IAAI;AAAA,QAAU,MAAM,IAAI,MAAM,uBAAuB;AAAA,MACrD,UAAS,QAAQ,eAAe;AAAA,MAGhC,MAAM,SAAS,MAAM,MAAM,IAAI,IAAI;AAAA,MACnC,IAAI;AAAA,QAAQ,OAAO;AAAA,MAInB,MAAM,MAAM,UAAS,OAAO;AAAA,MAG5B,MAAM,QAAQ,UAAU,IAAI,IAAI;AAAA,MAChC,MAAM,aACJ,SAAS,MAAM,OAAO,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,QAAQ,gBAAgB;AAAA,MACnF,MAAM,aAAa,WAAW;AAAA,MAC9B,IAAI,CAAC;AAAA,QAAY;AAAA,MAEjB,MAAM,gBAAmC,EAAE,MAAM,gBAAgB,KAAK;AAAA,MACtE,MAAM,MAAM,qBAAqB,aAA6C;AAAA,MAC9E,QAAQ,gBAAgB,YAAY,GAAG;AAAA,MAGvC,MAAM,YAAY,MAAM,IAAI,QAAoB,CAAC,SAAS,WAAW;AAAA,QACnE,MAAM,WAA0B;AAAA,UAC9B,OAAO;AAAA,UACP,QAAQ,IAAI;AAAA,UACZ;AAAA,UACA;AAAA,UACA,YAAY,UAAS;AAAA,UACrB;AAAA,UACA,gBAAgB,CAAC,UAAU;AAAA,UAC3B,mBAAmB;AAAA,QACrB;AAAA,QACA,UAAU,IAAI,MAAM,QAAQ;AAAA,QAE5B,UAAS,QAAQ,iBACf,SACA,MAAM;AAAA,UACJ,IAAI,UAAU,IAAI,IAAI,GAAG;AAAA,YACvB,oBAAoB,QAAQ;AAAA,YAC5B,UAAU,OAAO,IAAI;AAAA,YACrB,OAAO,IAAI,MAAM,uBAAuB,CAAC;AAAA,UAC3C;AAAA,WAEF,EAAE,MAAM,KAAK,CACf;AAAA,QAEA,SAAS,YAAY,WAAW,MAAM;AAAA,UACpC,IAAI,UAAU,IAAI,IAAI,GAAG;AAAA,YACvB,oBAAoB,QAAQ;AAAA,YAC5B,UAAU,OAAO,IAAI;AAAA,YACrB,OAAO,IAAI,MAAM,yBAAyB,CAAC;AAAA,UAC7C;AAAA,WACC,mBAAmB;AAAA,OACvB;AAAA,MAGD,MAAM,aAAa,MAAM,gBAAgB,SAAS;AAAA,MAClD,IAAI,eAAe,MAAM;AAAA,QACvB,MAAM,IAAI,MAAM,+CAA+C,aAAa,YAAY;AAAA,MAC1F;AAAA,MAIA,MAAM,MAAM,IAAI,MAAM,SAAS;AAAA,MAC/B,IAAI;AAAA,QAAK,WAAW,IAAI,MAAM,GAAG;AAAA,MACjC,YAAY,IAAI,IAAI;AAAA,MAEpB,OAAO;AAAA;AAAA,SAGH,IAAG,CAAC,MAAmC;AAAA,MAC3C,IAAI;AAAA,QAAU;AAAA,MACd,MAAM,SAAS,SAAS,IAAI,IAAI;AAAA,MAChC,IAAI;AAAA,QAAQ,OAAO;AAAA,MACnB,MAAM,QAAQ,MAAM,MAAM,IAAI,IAAI;AAAA,MAClC,IAAI,CAAC;AAAA,QAAO;AAAA,MACZ,MAAM,SAAS,IAAI,YAAY,MAAM,UAAU;AAAA,MAC/C,IAAI,WAAW,MAAM,EAAE,IAAI,KAAK;AAAA,MAChC,MAAM,YAAY,IAAI,gBAAgB,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;AAAA,MACxD,SAAS,IAAI,MAAM,SAAS;AAAA,MAC5B,OAAO;AAAA;AAAA,SAGH,IAAG,CAAC,MAAqB;AAAA,MAC7B,MAAM,MAAM,IAAI,IAAI;AAAA;AAAA,SAGhB,MAAK,CAAC,MAAqB;AAAA,MAC/B,MAAM,MAAM,MAAM,IAAI;AAAA;AAAA,SAGlB,KAAI,GAAoB;AAAA,MAC5B,OAAO,MAAM,KAAK;AAAA;AAAA,SAGd,MAAK,CAAC,UAA2B;AAAA,MACrC,OAAO,MAAM,MAAM,QAAQ;AAAA;AAAA,IAG7B,OAAO,GAAS;AAAA,MACd,WAAW;AAAA,MACX,QAAQ,gBAAgB;AAAA,MACxB,QAAQ,IAAI,kBAAkB,oBAAoB;AAAA,MAClD,YAAY,MAAM,aAAa,WAAW;AAAA,QACxC,oBAAoB,QAAQ;AAAA,QAC5B,SAAS,OAAO,IAAI,MAAM,oBAAoB,CAAC;AAAA,QAC/C,UAAU,OAAO,IAAI;AAAA,MACvB;AAAA,MACA,WAAW,aAAa,SAAS,OAAO,GAAG;AAAA,QACzC,IAAI,gBAAgB,SAAS;AAAA,MAC/B;AAAA,MACA,SAAS,MAAM;AAAA,MACf,WAAW,MAAM;AAAA,MACjB,MAAM,QAAQ;AAAA;AAAA,EAElB;AAAA,EAEA,OAAO;AAAA;;;AC5ZT;;;ACUO,SAAS,oBAAoB,GAAmB;AAAA,EACrD,IAAI,SAA6B;AAAA,EACjC,OAAO;AAAA,IACL,MAAM,YAAY;AAAA,IAClB,MAAM,OAAO,YAAY;AAAA,MACvB,SAAS;AAAA;AAAA,EAEb;AAAA;AAqBK,SAAS,gBAAgB,CAAC,SAA8B;AAAA,EAC7D,MAAM,UAA6B;AAAA,IACjC,SAAS;AAAA,IACT,UAAU;AAAA,MACR,WAAW,cAAc,QAAQ,SAAS,SAAS;AAAA,MACnD,WAAW,cAAc,QAAQ,SAAS,SAAS;AAAA,IACrD;AAAA,IACA,YAAY,kBAAkB,QAAQ,UAAU;AAAA,IAChD,cAAc,kBAAkB,QAAQ,YAAY;AAAA,IACpD,cAAc,CAAC,GAAG,QAAQ,YAAY;AAAA,EACxC;AAAA,EACA,IAAI,QAAQ,uBAAuB,QAAQ,oBAAoB,OAAO,GAAG;AAAA,IACvE,QAAQ,sBAAsB,CAAC,GAAG,QAAQ,mBAAmB;AAAA,EAC/D;AAAA,EACA,OAAO,KAAK,UAAU,SAAS,MAAM,CAAC;AAAA;AASjC,SAAS,kBAAkB,CAAC,MAA2B;AAAA,EAC5D,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,MAAM,KAAK,MAAM,IAAI;AAAA,IACrB,OAAO,KAAK;AAAA,IACZ,MAAM,IAAI,MAAM,sDAAuD,IAAc,SAAS;AAAA;AAAA,EAEhG,IAAI,CAAC,OAAO,OAAO,QAAQ,UAAU;AAAA,IACnC,MAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AAAA,EACA,MAAM,IAAI;AAAA,EACV,IAAI,EAAE,YAAY,GAAG;AAAA,IACnB,MAAM,IAAI,MAAM,gDAAgD,OAAO,EAAE,OAAO,GAAG;AAAA,EACrF;AAAA,EACA,IAAI,CAAC,EAAE,YAAY,OAAO,EAAE,aAAa,UAAU;AAAA,IACjD,MAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AAAA,EACA,MAAM,WAA2B;AAAA,IAC/B,WAAW,cAAc,EAAE,SAAS,SAAS;AAAA,IAC7C,WAAW,cAAc,EAAE,SAAS,SAAS;AAAA,EAC/C;AAAA,EACA,MAAM,UAAuB;AAAA,IAC3B;AAAA,IACA,YAAY,kBAAkB,EAAE,cAAc,CAAC,CAAC;AAAA,IAChD,cAAc,kBAAkB,EAAE,gBAAgB,CAAC,CAAC;AAAA,IACpD,cAAc,IAAI,IAAI,EAAE,gBAAgB,CAAC,CAAC;AAAA,EAC5C;AAAA,EACA,IAAI,EAAE,uBAAuB,EAAE,oBAAoB,SAAS,GAAG;AAAA,IAC7D,QAAQ,sBAAsB,IAAI,IAAI,EAAE,mBAAmB;AAAA,EAC7D;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,iBAAiB,CAAC,KAAsD;AAAA,EAC/E,MAAM,MAA8B,CAAC;AAAA,EACrC,YAAY,KAAK,UAAU,KAAK;AAAA,IAC9B,IAAI,OAAO,cAAc,KAAK;AAAA,EAChC;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,iBAAiB,CAAC,QAAyD;AAAA,EAClF,MAAM,MAAM,IAAI;AAAA,EAChB,YAAY,KAAK,UAAU,OAAO,QAAQ,MAAM,GAAG;AAAA,IACjD,IAAI,IAAI,KAAK,cAAc,KAAK,CAAC;AAAA,EACnC;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,aAAa,CAAC,OAA2B;AAAA,EAEhD,IAAI,SAAS;AAAA,EACb,WAAW,QAAQ,OAAO;AAAA,IACxB,UAAU,OAAO,aAAa,IAAI;AAAA,EACpC;AAAA,EACA,OAAO,KAAK,MAAM;AAAA;AAGpB,SAAS,aAAa,CAAC,KAAyB;AAAA,EAC9C,MAAM,SAAS,KAAK,GAAG;AAAA,EACvB,MAAM,QAAQ,IAAI,WAAW,OAAO,MAAM;AAAA,EAC1C,SAAS,IAAI,EAAG,IAAI,OAAO,QAAQ,KAAK;AAAA,IACtC,MAAM,KAAK,OAAO,WAAW,CAAC;AAAA,EAChC;AAAA,EACA,OAAO;AAAA;;AC1IT;;;AC0BA;AANA;AAAA;AAAA;;;ACTA;AAGO,IAAM,mBAAmB;AAEzB,IAAM,mBAAmB;AAEzB,IAAM,kBAAkB;AAAA;AA4BxB,MAAM,qBAAqB,MAAM;AAAA,EAC7B;AAAA,EAMT,WAAW,CAAC,SAAiB,MAA4B;AAAA,IACvD,MAAM,OAAO;AAAA,IACb,KAAK,OAAO;AAAA,IACZ,KAAK,OAAO;AAAA;AAEhB;AAKO,SAAS,sBAAsB,GAAmB;AAAA,EACvD,MAAM,OAAO,MAAK,KAAK,QAAQ;AAAA,EAC/B,OAAO;AAAA,IACL,WAAW,KAAK;AAAA,IAChB,WAAW,KAAK;AAAA,EAClB;AAAA;AAOK,SAAS,wBAAwB,CAAC,WAAuC;AAAA,EAC9E,IAAI,UAAU,WAAW,kBAAkB;AAAA,IACzC,MAAM,IAAI,aACR,8BAA8B,+BAA+B,UAAU,WACvE,oBACF;AAAA,EACF;AAAA,EACA,MAAM,OAAO,MAAK,KAAK,QAAQ,cAAc,SAAS;AAAA,EACtD,OAAO;AAAA,IACL,WAAW,KAAK;AAAA,IAChB,WAAW,KAAK;AAAA,EAClB;AAAA;AAOK,SAAS,IAAI,CAAC,SAAqB,WAAmC;AAAA,EAC3E,IAAI,UAAU,WAAW,kBAAkB;AAAA,IACzC,MAAM,IAAI,aACR,8BAA8B,+BAA+B,UAAU,WACvE,oBACF;AAAA,EACF;AAAA,EACA,OAAO,MAAK,KAAK,SAAS,SAAS,SAAS;AAAA;AASvC,SAAS,MAAM,CAAC,SAAqB,WAAuB,WAAgC;AAAA,EACjG,IAAI,UAAU,WAAW,kBAAkB;AAAA,IACzC,MAAM,IAAI,aACR,8BAA8B,+BAA+B,UAAU,WACvE,oBACF;AAAA,EACF;AAAA,EACA,IAAI,UAAU,WAAW,iBAAiB;AAAA,IACxC,MAAM,IAAI,aACR,6BAA6B,8BAA8B,UAAU,WACrE,0BACF;AAAA,EACF;AAAA,EACA,OAAO,MAAK,KAAK,SAAS,OAAO,SAAS,WAAW,SAAS;AAAA;AAQzD,SAAS,YAAY,CAC1B,SACA,UACA,WACgB;AAAA,EAChB,MAAM,YAAY,KAAK,SAAS,SAAS;AAAA,EACzC,OAAO,EAAE,UAAU,SAAS,UAAU;AAAA;AASjC,SAAS,aAAY,CAAC,UAA0B,WAAmC;AAAA,EACxF,MAAM,KAAK,OAAO,SAAS,SAAS,SAAS,WAAW,SAAS;AAAA,EACjE,IAAI,CAAC,IAAI;AAAA,IACP,MAAM,IAAI,aACR,mDAAmD,SAAS,aAC5D,oBACF;AAAA,EACF;AAAA,EACA,OAAO,SAAS;AAAA;AAeX,SAAS,oBAAoB,CAAC,UAAsC;AAAA,EACzE,MAAM,cAAc,IAAI,YAAY,EAAE,OAAO,SAAS,QAAQ;AAAA,EAC9D,MAAM,QAAQ,IAAI,YAAY,SAAS,kBAAkB,SAAS,QAAQ;AAAA,EAC1E,MAAM,MAAM,IAAI,WAAW,KAAK;AAAA,EAChC,MAAM,OAAO,IAAI,SAAS,IAAI,MAAM;AAAA,EACpC,KAAK,UAAU,GAAG,YAAY,QAAQ,KAAK;AAAA,EAC3C,IAAI,IAAI,aAAa,CAAC;AAAA,EACtB,IAAI,IAAI,SAAS,WAAW,IAAI,YAAY,MAAM;AAAA,EAClD,IAAI,IAAI,SAAS,SAAS,IAAI,YAAY,SAAS,eAAe;AAAA,EAClE,OAAO;AAAA;AAOF,SAAS,oBAAoB,CAAC,OAAmC;AAAA,EACtE,IAAI,MAAM,SAAS,IAAI,iBAAiB;AAAA,IACtC,MAAM,IAAI,aACR,uBAAuB,MAAM,+BAA+B,IAAI,oBAChE,oBACF;AAAA,EACF;AAAA,EACA,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,EAC1E,MAAM,YAAY,KAAK,UAAU,GAAG,KAAK;AAAA,EACzC,IAAI,MAAM,SAAS,IAAI,YAAY,iBAAiB;AAAA,IAClD,MAAM,IAAI,aACR,8CAA8C,oBAAoB,MAAM,WACxE,oBACF;AAAA,EACF;AAAA,EACA,MAAM,WAAW,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC;AAAA,EAC1E,MAAM,YAAY,MAAM,MAAM,IAAI,WAAW,IAAI,YAAY,eAAe;AAAA,EAC5E,MAAM,UAAU,MAAM,MAAM,IAAI,YAAY,eAAe;AAAA,EAC3D,OAAO,EAAE,UAAU,SAAS,UAAU;AAAA;;;AD/JjC,IAAM,sBAAsB;AAAA;AA4E5B,MAAM,2BAA2B,eAAe;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,MAOL,OAAO,GAAgB;AAAA,IACzB,OAAO,KAAK,cAAc;AAAA;AAAA,EAG5B,WAAW,CAAC,SAAoC;AAAA,IAC9C,MAAM;AAAA,IACN,KAAK,OAAO,QAAQ;AAAA,IACpB,KAAK,gBAAgB,QAAQ;AAAA,IAC7B,KAAK,oBAAoB,QAAQ,qBAAqB;AAAA,IAGtD,KAAK,KAAK,GAAG,SAAS,MAAM,KAAK,KAAK,OAAO,CAAC;AAAA,IAC9C,KAAK,KAAK,GAAG,kBAAkB,CAAC,YAAY,KAAK,KAAK,kBAAkB,OAAO,CAAC;AAAA,IAChF,KAAK,KAAK,GAAG,qBAAqB,CAAC,YAAY,KAAK,KAAK,qBAAqB,OAAO,CAAC;AAAA,IAItF,KAAK,KAAK,GAAG,WAAW,CAAC,eAAe;AAAA,MACtC,MAAM,YAAY,KAAK,UAAU,UAAU;AAAA,MAC3C,IAAI,WAAW;AAAA,QACb,KAAK,KAAK,WAAW,SAAS;AAAA,MAChC;AAAA,KAMD;AAAA;AAAA,EAGH,OAAO,GAAY;AAAA,IACjB,OAAO,KAAK,KAAK,QAAQ;AAAA;AAAA,EAG3B,SAAS,GAAkB;AAAA,IACzB,OAAO,KAAK,KAAK,UAAU;AAAA;AAAA,EAG7B,OAAO,CAAC,QAAgB,cAAmC;AAAA,IACzD,KAAK,SAAS;AAAA,IACd,IAAI,iBAAiB,WAAW;AAAA,MAC9B,KAAK,eAAe;AAAA,IACtB;AAAA,IACA,KAAK,KAAK,QAAQ,QAAQ,YAAY;AAAA;AAAA,EAGxC,UAAU,GAAS;AAAA,IACjB,KAAK,KAAK,WAAW;AAAA;AAAA,EAGvB,IAAI,CAAC,SAAwB;AAAA,IAC3B,MAAM,UAAU,KAAK,KAAK,OAAO;AAAA,IACjC,KAAK,KAAK,KAAK,OAAO;AAAA;AAAA,EAQhB,IAAI,CAAC,SAA2B;AAAA,IACtC,MAAM,UAAU,KAAK,cAAc;AAAA,IACnC,MAAM,aAAa,iBAAiB,OAAO;AAAA,IAE3C,IAAI;AAAA,IACJ,IAAI,KAAK,mBAAmB;AAAA,MAC1B,MAAM,SAAS,QAAQ,aAAa,IAAI,mBAAmB;AAAA,MAC3D,IAAI,CAAC,QAAQ;AAAA,QACX,MAAM,IAAI,MACR,iEAAiE,wEACnE;AAAA,MACF;AAAA,MACA,MAAM,YAAY,aAAsB,YAAY,qBAAqB,MAAM;AAAA,MAC/E,gBAAgB,wBAAwB,SAAS;AAAA,IACnD,EAAO;AAAA,MACL,gBAAgB;AAAA;AAAA,IAGlB,MAAM,SAAS,aAAa,eAAe,QAAQ,UAAU,QAAQ,SAAS,SAAS;AAAA,IACvF,MAAM,cAAc,qBAAqB,MAAM;AAAA,IAW/C,MAAM,QAAiC;AAAA,MACrC,MAAM,QAAQ;AAAA,MACd,UAAU,QAAQ;AAAA,MAClB,UAAU,QAAQ;AAAA,MAClB,MAAM;AAAA,IACR;AAAA,IACA,IAAI,gBAAgB,WAAY,QAAqC,eAAe,WAAW;AAAA,MAC7F,MAAM,gBAAiB,QAAoC;AAAA,IAC7D;AAAA,IACA,OAAO;AAAA;AAAA,EAOD,SAAS,CAAC,SAAuC;AAAA,IACvD,IAAI,CAAC,QAAQ;AAAA,MAAM;AAAA,IAEnB,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,SAAS,qBAAqB,QAAQ,IAAI;AAAA,MAC1C,MAAM;AAAA,MACN;AAAA;AAAA,IAQF,MAAM,UAAU,KAAK,cAAc;AAAA,IAKnC,IAAI,QAAQ,aAAa,IAAI,OAAO,QAAQ,GAAG;AAAA,MAC7C;AAAA,IACF;AAAA,IAEA,MAAM,YAAY,QAAQ,WAAW,IAAI,OAAO,QAAQ;AAAA,IACxD,IAAI,CAAC,WAAW;AAAA,MACd;AAAA,IACF;AAAA,IAEA,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,kBAAkB,cAAmB,QAAQ,SAAS;AAAA,MACtD,MAAM;AAAA,MACN;AAAA;AAAA,IAGF,IAAI,CAAC,KAAK,mBAAmB;AAAA,MAE3B,OAAO,mBAAmB,eAAe;AAAA,IAC3C;AAAA,IAGA,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,YAAY,wBAAwB,eAAe;AAAA,MACnD,MAAM;AAAA,MACN;AAAA;AAAA,IAGF,MAAM,SAAS,QAAQ,aAAa,IAAI,UAAU,UAAU;AAAA,IAC5D,IAAI,CAAC,QAAQ;AAAA,MACX;AAAA,IACF;AAAA,IAEA,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,YAAY,aAAsB,WAAW,MAAM;AAAA,MACnD,MAAM;AAAA,MACN;AAAA;AAAA,IAGF,OAAO,mBAAmB,SAAS;AAAA;AAEvC;AAWA,SAAS,gBAAgB,CAAC,SAA8B;AAAA,EACtD,MAAM,YAAqC;AAAA,IACzC,MAAM,QAAQ;AAAA,IACd,UAAU,QAAQ;AAAA,IAClB,UAAU,QAAQ;AAAA,EACpB;AAAA,EACA,IAAI,gBAAgB,WAAW,QAAQ,eAAe,WAAW;AAAA,IAC/D,UAAU,gBAAgB,QAAQ;AAAA,EACpC;AAAA,EACA,IAAI,WAAW,WAAW,QAAQ,UAAU,WAAW;AAAA,IACrD,UAAU,WAAW,QAAQ;AAAA,EAC/B;AAAA,EACA,IAAI,eAAe,WAAW,QAAQ,cAAc,WAAW;AAAA,IAC7D,UAAU,eAAe,QAAQ;AAAA,EACnC;AAAA,EACA,MAAM,cAAc,IAAI,YAAY,EAAE,OAAO,KAAK,UAAU,SAAS,CAAC;AAAA,EACtE,MAAM,YACJ,UAAU,WAAW,QAAQ,gBAAgB,aAAa,QAAQ,OAAO,IAAI,WAAW,CAAC;AAAA,EAE3F,MAAM,MAAM,IAAI,WAAW,IAAI,YAAY,SAAS,UAAU,MAAM;AAAA,EACpE,MAAM,OAAO,IAAI,SAAS,IAAI,MAAM;AAAA,EACpC,KAAK,UAAU,GAAG,YAAY,QAAQ,KAAK;AAAA,EAC3C,IAAI,IAAI,aAAa,CAAC;AAAA,EACtB,IAAI,IAAI,WAAW,IAAI,YAAY,MAAM;AAAA,EACzC,OAAO;AAAA;AAMT,SAAS,kBAAkB,CAAC,OAA4B;AAAA,EACtD,IAAI,MAAM,SAAS,GAAG;AAAA,IACpB,MAAM,IAAI,MAAM,uDAAuD;AAAA,EACzE;AAAA,EACA,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,EAC1E,MAAM,YAAY,KAAK,UAAU,GAAG,KAAK;AAAA,EACzC,IAAI,MAAM,SAAS,IAAI,WAAW;AAAA,IAChC,MAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AAAA,EACA,MAAM,SAAS,KAAK,MAAM,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,CAAC;AAAA,EACpF,MAAM,OAAO,MAAM,MAAM,IAAI,SAAS;AAAA,EACtC,OAAO,KAAK,QAAQ,KAAK;AAAA;;;AElR3B,IAAM,0BAA0B;AAGhC,IAAM,yBAAyB;AAM/B,SAAS,UAAU,CAAC,KAAmD;AAAA,EACrE,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,SAAS,OAAO,QAAQ,WAAW,KAAK,MAAM,GAAG,IAAI;AAAA,IACrD,MAAM;AAAA,IACN;AAAA;AAAA,EAEF,IAAI,OAAO,WAAW,YAAY,WAAW,MAAM;AAAA,IACjD;AAAA,EACF;AAAA,EACA,MAAM,SAAS;AAAA,EACf,IAAI,OAAO,OAAO,YAAY,UAAU;AAAA,IACtC;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAAA;AAGF,MAAM,oBAAoB;AAAA,EACtB;AAAA,EACA;AAAA,EACQ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT;AAAA,EACA,SAAS;AAAA,EACT,WAAW;AAAA,EACX;AAAA,EACS;AAAA,EAEjB,WAAW,CAAC,SAAqC;AAAA,IAC/C,KAAK,MAAM,QAAQ;AAAA,IACnB,KAAK,SAAS,QAAQ;AAAA,IACtB,KAAK,WAAW,QAAQ;AAAA,IACxB,IAAI,QAAQ,YAAY;AAAA,MAAW,KAAK,UAAU,QAAQ;AAAA,IAC1D,IAAI,QAAQ,WAAW;AAAA,MAAW,KAAK,SAAS,QAAQ;AAAA,IACxD,IAAI,QAAQ,YAAY;AAAA,MAAW,KAAK,UAAU,QAAQ;AAAA,IAC1D,IAAI,QAAQ,mBAAmB;AAAA,MAAW,KAAK,iBAAiB,QAAQ;AAAA,IACxE,IAAI,QAAQ,iBAAiB;AAAA,MAAW,KAAK,eAAe,QAAQ;AAAA,IACpE,IAAI,QAAQ,eAAe;AAAA,MAAW,KAAK,aAAa,QAAQ;AAAA,IAChE,IAAI,QAAQ,kBAAkB;AAAA,MAAW,KAAK,gBAAgB,QAAQ;AAAA,IACtE,MAAM,KAAK,QAAQ,aAAa,WAAW;AAAA,IAC3C,IAAI,OAAO,OAAO,YAAY;AAAA,MAC5B,MAAM,IAAI,MACR,iLACF;AAAA,IACF;AAAA,IACA,KAAK,gBAAgB;AAAA;AAAA,OAQjB,QAAO,GAAkB;AAAA,IAC7B,KAAK,WAAW;AAAA,IAChB,IAAI,KAAK,gBAAgB;AAAA,MACvB,aAAa,KAAK,cAAc;AAAA,MAChC,KAAK,iBAAiB;AAAA,IACxB;AAAA,IACA,OAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAAA,MACtC,MAAM,KAAK,IAAI,KAAK,cAAc,KAAK,GAAG;AAAA,MAC1C,KAAK,SAAS;AAAA,MACd,IAAI,UAAU;AAAA,MAEd,GAAG,iBAAiB,QAAQ,MAAM;AAAA,QAIhC,GAAG,KAAK,KAAK,UAAU,EAAE,MAAM,QAAQ,QAAQ,KAAK,OAAO,CAA4B,CAAC;AAAA,QACxF,KAAK,SAAS;AAAA,QACd,KAAK,SAAS;AAAA,QACd,IAAI,CAAC,SAAS;AAAA,UACZ,UAAU;AAAA,UACV,QAAQ;AAAA,QACV;AAAA,OACD;AAAA,MAED,GAAG,iBAAiB,WAAW,CAAC,UAAU;AAAA,QACxC,KAAK,cAAc,MAAM,IAAI;AAAA,OAC9B;AAAA,MAED,GAAG,iBAAiB,SAAS,CAAC,QAAQ;AAAA,QAGpC,IAAI,CAAC,SAAS;AAAA,UACZ,UAAU;AAAA,UACV,OAAO,GAAG;AAAA,QACZ;AAAA,OACD;AAAA,MAED,GAAG,iBAAiB,SAAS,MAAM;AAAA,QACjC,MAAM,UAAU,KAAK;AAAA,QACrB,KAAK,SAAS;AAAA,QACd,KAAK,UAAU;AAAA,QAIf,IAAI,CAAC,KAAK,YAAY,SAAS;AAAA,UAC7B,KAAK,kBAAkB,CAAC;AAAA,QAC1B;AAAA,OACD;AAAA,KACF;AAAA;AAAA,EAIK,iBAAiB,CAAC,SAAuB;AAAA,IAC/C,IAAI,KAAK;AAAA,MAAU;AAAA,IACnB,MAAM,QAAQ,KAAK,IAAI,wBAAwB,0BAA0B,KAAK,OAAO;AAAA,IACrF,KAAK,iBAAiB,WAAW,MAAM;AAAA,MACrC,KAAK,iBAAiB;AAAA,MACtB,IAAI,KAAK;AAAA,QAAU;AAAA,MACd,KAAK,QAAQ,EAAE,MAAM,MAAM;AAAA,QAC9B,KAAK,kBAAkB,UAAU,CAAC;AAAA,OACnC;AAAA,OACA,KAAK;AAAA;AAAA,EAQF,aAAa,CAAC,KAAoB;AAAA,IACxC,MAAM,SAAS,WAAW,GAAG;AAAA,IAC7B,IAAI,WAAW,WAAW;AAAA,MACxB;AAAA,IACF;AAAA,IACA,MAAM,UAAU,KAAK,eAAe,OAAO,OAAO;AAAA,IAClD,IAAI,YAAY,WAAW;AAAA,MACzB,QAAQ,MAAM;AAAA,MACd;AAAA,IACF;AAAA,IAKA,KAAK,gBAAgB,MAAyC;AAAA;AAAA,EAGxD,cAAc,CAAC,MAAwE;AAAA,IAC7F,IAAI,SAAS,UAAU;AAAA,MACrB,OAAO,CAAC,WAAW;AAAA,QACjB,IAAI,OAAO,OAAO,cAAc,UAAU;AAAA,UACxC,KAAK,SAAS,OAAO,WAAW,OAAO,UAAU;AAAA,QACnD;AAAA;AAAA,IAEJ;AAAA,IACA,IAAI,SAAS,iBAAiB;AAAA,MAC5B,OAAO,CAAC,WAAW;AAAA,QACjB,IAAI,MAAM,QAAQ,OAAO,UAAU,GAAG;AAAA,UACpC,KAAK,iBAAiB,OAAO,UAAiC;AAAA,QAChE;AAAA;AAAA,IAEJ;AAAA,IACA,IAAI,SAAS,eAAe;AAAA,MAC1B,OAAO,CAAC,WAAW;AAAA,QACjB,IAAI,OAAO,OAAO,cAAc,UAAU;AAAA,UACxC,KAAK,eAAe,OAAO,SAAS;AAAA,QACtC;AAAA;AAAA,IAEJ;AAAA,IACA,IAAI,SAAS,aAAa;AAAA,MACxB,OAAO,CAAC,WAAW;AAAA,QACjB,IAAI,OAAO,OAAO,cAAc,UAAU;AAAA,UACxC,KAAK,aAAa,OAAO,SAAS;AAAA,QACpC;AAAA;AAAA,IAEJ;AAAA,IACA,IAAI,SAAS,SAAS;AAAA,MACpB,OAAO,CAAC,WAAW;AAAA,QACjB,IAAI,OAAO,OAAO,cAAc,UAAU;AAAA,UACxC;AAAA,QACF;AAAA,QACA,MAAM,eACJ,OAAO,OAAO,oBAAoB,WAAW,OAAO,kBAAkB;AAAA,QACxE,KAAK,UAAU,OAAO,WAAW,YAAY;AAAA;AAAA,IAEjD;AAAA,IACA;AAAA;AAAA,EASF,UAAU,CAAC,cAAsB,SAA2B;AAAA,IAC1D,IAAI,CAAC,KAAK,UAAU,KAAK,OAAO,eAAe,KAAK,cAAc,QAAQ,CAAC,KAAK,QAAQ;AAAA,MACtF,OAAO;AAAA,IACT;AAAA,IACA,MAAM,MAAwB;AAAA,MAC5B,MAAM;AAAA,MACN,QAAQ,KAAK;AAAA,MACb;AAAA,MACA;AAAA,IACF;AAAA,IACA,KAAK,OAAO,KAAK,KAAK,UAAU,GAAG,CAAC;AAAA,IACpC,OAAO;AAAA;AAAA,EAaT,UAAU,CAAC,MAAc,UAAmC,CAAC,GAAY;AAAA,IACvE,IAAI,CAAC,KAAK,UAAU,KAAK,OAAO,eAAe,KAAK,cAAc,QAAQ,CAAC,KAAK,QAAQ;AAAA,MACtF,OAAO;AAAA,IACT;AAAA,IACA,KAAK,OAAO,KAAK,KAAK,UAAU,KAAK,SAAS,KAAK,CAAC,CAAC;AAAA,IACrD,OAAO;AAAA;AAAA,EAST,KAAK,GAAS;AAAA,IACZ,KAAK,WAAW;AAAA,IAChB,IAAI,KAAK,gBAAgB;AAAA,MACvB,aAAa,KAAK,cAAc;AAAA,MAChC,KAAK,iBAAiB;AAAA,IACxB;AAAA,IACA,KAAK,QAAQ,MAAM;AAAA,IACnB,KAAK,SAAS;AAAA,IACd,KAAK,SAAS;AAAA;AAAA,MAIZ,WAAW,GAAY;AAAA,IACzB,OAAO,KAAK,UAAU,KAAK,QAAQ,eAAe,KAAK,cAAc;AAAA;AAEzE;;;ACzTA;AAAA;AAAA;AAAA;AAQA;;;ACZA;AACA;;;ACqBO,MAAM,uBAAuB,MAAM;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EAET,WAAW,CACT,SACA,MACA,KACA,WACA;AAAA,IACA,MAAM,OAAO;AAAA,IACb,KAAK,OAAO;AAAA,IACZ,KAAK,OAAO;AAAA,IACZ,KAAK,MAAM;AAAA,IACX,KAAK,YAAY;AAAA;AAErB;AAAA;AAOO,MAAM,kBAAkB;AAAA,EACZ,QAAQ,IAAI;AAAA,EAErB,QAAQ,CAAC,KAAa,WAAkC;AAAA,IAC9D,OAAO,GAAG,aAAa;AAAA;AAAA,EAIzB,IAAI,CAAC,KAAa,WAAgC;AAAA,IAChD,KAAK,MAAM,IAAI,KAAK,SAAS,KAAK,SAAS,CAAC;AAAA;AAAA,EAI9C,QAAQ,CAAC,KAAa,WAAmC;AAAA,IACvD,OAAO,KAAK,MAAM,IAAI,KAAK,SAAS,KAAK,SAAS,CAAC;AAAA;AAAA,EAIrD,KAAK,GAAS;AAAA,IACZ,KAAK,MAAM,MAAM;AAAA;AAAA,MAIf,IAAI,GAAW;AAAA,IACjB,OAAO,KAAK,MAAM;AAAA;AAEtB;AAMO,IAAM,oBAAoB,IAAI;AAkBrC,eAAsB,gBAAqC,CACzD,QACA,aACA,WACe;AAAA,EACf,IAAK,WAAmC,aAAoC;AAAA,IAC1E,MAAM,IAAI,eACR,0CAA0C,OAAO,cAAc,OAAO,cACtE,2BACA,OAAO,KACP,OAAO,SACT;AAAA,EACF;AAAA,EACA,IAAI,kBAAkB,SAAS,OAAO,KAAK,OAAO,SAAS,GAAG;AAAA,IAC5D,MAAM,IAAI,eACR,2BAA2B,OAAO,eAAe,OAAO,6EACxD,oBACA,OAAO,KACP,OAAO,SACT;AAAA,EACF;AAAA,EACA,MAAM,OAAO;AAAA,EACb,MAAM,YAAY;AAAA,EAClB,MAAM,cAAc,UAAU,OAAO,KAAK;AAAA,EAC1C,YAAY,QAAQ;AAAA,EACpB,kBAAkB,KAAK,OAAO,KAAK,OAAO,SAAS;AAAA;;;AC9G9C,MAAM,gCAAgC,MAAM;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,WAAW,CACT,KACA,gBACA,eACA,iBACA,gBACA;AAAA,IACA,MAAM,gBAAgB,gBAAgB,QAAQ,mBAAmB;AAAA,IACjE,MAAM,iBAAiB,iBAAiB,QAAQ,oBAAoB;AAAA,IACpE,MACE,mCAAmC,mCACjC,IAAI,iBAAiB,iDACrB,OAAO,kBAAkB,6CACzB,wCACJ;AAAA,IACA,KAAK,OAAO;AAAA,IACZ,KAAK,MAAM;AAAA,IACX,KAAK,iBAAiB;AAAA,IACtB,KAAK,gBAAgB;AAAA,IACrB,KAAK,kBAAkB;AAAA,IACvB,KAAK,iBAAiB;AAAA;AAE1B;AAAA;AAaO,MAAM,kBAAkB;AAAA,EACZ,UAAU,IAAI;AAAA,EAU/B,QAAQ,CAAC,KAAa,WAA0B,UAAyB;AAAA,IACvE,MAAM,WAAW,KAAK,QAAQ,IAAI,GAAG;AAAA,IACrC,IAAI,YAAY,SAAS,cAAc,WAAW;AAAA,MAChD,MAAM,IAAI,wBACR,KACA,SAAS,WACT,SAAS,UACT,WACA,QACF;AAAA,IACF;AAAA,IACA,IAAI,CAAC,UAAU;AAAA,MACb,KAAK,QAAQ,IAAI,KAAK,EAAE,WAAW,SAAS,CAAC;AAAA,IAC/C;AAAA;AAAA,EAMF,GAAG,CAAC,KAAsB;AAAA,IACxB,OAAO,KAAK,QAAQ,IAAI,GAAG;AAAA;AAAA,EAO7B,MAAM,CAAC,KAAwC;AAAA,IAC7C,OAAO,KAAK,QAAQ,IAAI,GAAG,GAAG;AAAA;AAAA,EAOhC,KAAK,GAAS;AAAA,IACZ,KAAK,QAAQ,MAAM;AAAA;AAAA,MAMjB,IAAI,GAAW;AAAA,IACjB,OAAO,KAAK,QAAQ;AAAA;AAExB;AAMO,IAAM,oBAAoB,IAAI;;;ACxH9B,IAAM,uBAAuB;AAAA;AA2C7B,MAAM,2BAA2B,MAAM;AAAA,EACnC;AAAA,EAKA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,WAAW,CACT,SACA,MACA,UAKI,CAAC,GACL;AAAA,IACA,MAAM,OAAO;AAAA,IACb,KAAK,OAAO;AAAA,IACZ,KAAK,OAAO;AAAA,IACZ,IAAI,QAAQ,eAAe;AAAA,MAAW,KAAK,aAAa,QAAQ;AAAA,IAChE,IAAI,QAAQ,kBAAkB;AAAA,MAAW,KAAK,gBAAgB,QAAQ;AAAA,IACtE,IAAI,QAAQ,cAAc;AAAA,MAAW,KAAK,YAAY,QAAQ;AAAA,IAC9D,IAAI,QAAQ,mBAAmB;AAAA,MAAW,KAAK,iBAAiB,QAAQ;AAAA;AAE5E;AAQO,SAAS,aAAa,CAAC,KAAsB;AAAA,EAClD,IAAI,OAAO,QAAQ,YAAY,QAAQ;AAAA,IAAM,OAAO;AAAA,EACpD,MAAM,SAAS;AAAA,EACf,MAAM,QAAQ,OAAO;AAAA,EACrB,OAAO,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK,KAAK,SAAS,IAAI,QAAQ;AAAA;AAO/E,SAAS,aAAa,CAAC,KAA8B,SAAuB;AAAA,EACjF,IAAI,wBAAwB;AAAA;AAWvB,SAAS,aAAa,CAC3B,KACA,eACA,YACM;AAAA,EACN,MAAM,UAAU,cAAc,GAAG;AAAA,EACjC,IAAI,UAAU,eAAe;AAAA,IAC3B,MAAM,IAAI,mBACR,iCAAiC,uCAAuC,uDACxE,oBACA,EAAE,YAAY,SAAS,cAAc,CACvC;AAAA,EACF;AAAA,EACA,SAAS,IAAI,UAAU,EAAG,KAAK,eAAe,KAAK;AAAA,IACjD,MAAM,YAAY,WAAW;AAAA,IAC7B,IAAI,CAAC,WAAW;AAAA,MACd,MAAM,IAAI,mBACR,wCAAwC,yCAAyC,UAAU,aAAa,kBACxG,qBACA,EAAE,YAAY,SAAS,eAAe,gBAAgB,EAAE,CAC1D;AAAA,IACF;AAAA,IACA,UAAU,GAAG;AAAA,IACb,cAAc,KAAK,CAAC;AAAA,EACtB;AAAA;AAuBK,SAAS,cAAc,CAAC,WAAmB,YAAoC;AAAA,EACpF,IAAI,YAAY,YAAY;AAAA,IAC1B,OAAO,EAAE,YAAY,OAAO,QAAQ,qBAAqB,WAAW,WAAW;AAAA,EACjF;AAAA,EACA,IAAI,YAAY,YAAY;AAAA,IAC1B,OAAO,EAAE,YAAY,OAAO,QAAQ,qBAAqB,WAAW,WAAW;AAAA,EACjF;AAAA,EACA,OAAO,EAAE,YAAY,KAAK;AAAA;AAQrB,SAAS,eAAe,CAAC,WAAmB,YAA0B;AAAA,EAC3E,MAAM,SAAS,eAAe,WAAW,UAAU;AAAA,EACnD,IAAI,OAAO;AAAA,IAAY;AAAA,EACvB,MAAM,UACJ,OAAO,WAAW,sBACd,8CAA8C,4CAA4C,8CAC1F,8CAA8C,4CAA4C;AAAA,EAChG,MAAM,IAAI,mBAAmB,SAAS,OAAO,QAAQ,EAAE,WAAW,WAAW,CAAC;AAAA;;;AH1HhF,SAAS,0BAAqD,CAC5D,QACyB;AAAA,EACzB,IAAI,kBAAkB,SAAS,OAAO,KAAK,OAAO,SAAS,GAAG;AAAA,IAC5D,MAAM,IAAI,eACR,qBAAqB,OAAO,cAAc,OAAO,+GACjD,oBACA,OAAO,KACP,OAAO,SACT;AAAA,EACF;AAAA,EACA,kBAAkB,SAAS,OAAO,KAAK,OAAO,WAAW,OAAO,QAAQ;AAAA,EAExE,MAAM,QAAQ,OAAU,OAAO,YAAY;AAAA,EAC3C,IAAI,WAAW;AAAA,EACf,IAAI;AAAA,EAEJ,MAAM,UAAU,YAAY;AAAA,IAC1B,MAAM,SAAS,MAAM,OAAO,UAAU;AAAA,IACtC,MAAM,OAAO,UAAU;AAAA,IACvB,gBAAgB;AAAA,IAEhB,IAAI,OAAO,kBAAkB,WAAW;AAAA,MACtC,MAAM,gBAAgB,OAAO;AAAA,MAC7B,MAAM,aAAa,OAAO,cAAc,CAAC;AAAA,MACzC,OAAO,OAAO,CAAC,QAAQ;AAAA,QACrB,cAAc,KAA2C,eAAe,UAAU;AAAA,QAClF,cAAc,KAA2C,aAAa;AAAA,OACvE;AAAA,IACH;AAAA,IAEA,WAAW;AAAA,IACX,IAAI;AAAA,MACF,MAAM,QAAQ,OAAO,aAAa,OAAO,IAAI,CAAC;AAAA,cAC9C;AAAA,MACA,WAAW;AAAA;AAAA,IAGb,OAAO,GAAG,UAAU,CAAC,YAAY;AAAA,MAC/B,IAAI;AAAA,QAAU;AAAA,MACd,WAAW;AAAA,MACX,IAAI;AAAA,QACF,MAAM,QAAQ,OAAO,aAAa,QAAQ,GAAG;AAAA,gBAC7C;AAAA,QACA,WAAW;AAAA;AAAA,KAEd;AAAA,IAED,OAAO,MAAM;AAAA,MACX,MAAM,QAAQ,MAAM;AAAA,MACpB,IAAI;AAAA,QAAU;AAAA,MACd,IAAI,CAAC;AAAA,QAAe;AAAA,MACpB,WAAW;AAAA,MACX,IAAI;AAAA,QACF,cAAc,OAAO,CAAC,QAAQ;AAAA,UAC5B,OAAO,WAAW,KAAK,KAAK;AAAA,SAC7B;AAAA,gBACD;AAAA,QACA,WAAW;AAAA;AAAA,KAEd;AAAA,KACA;AAAA,EAEH,OAAO;AAAA,IACL,KAAK,OAAO;AAAA,IACZ,WAAW,OAAO;AAAA,QACd,KAAK,GAAG;AAAA,MACV,OAAO,MAAM;AAAA;AAAA,QAEX,KAAK,CAAC,MAAS;AAAA,MACjB,MAAM,QAAQ;AAAA;AAAA,IAEhB;AAAA,QACI,MAAM,GAAG;AAAA,MACX,OAAO;AAAA;AAAA,EAEX;AAAA;AA2BK,SAAS,SAAS,CACvB,KACA,cACA,SAC8B;AAAA,EAC9B,OAAO,2BAA4C;AAAA,IACjD;AAAA,IACA,WAAW,QAAQ,aAAa;AAAA,IAChC;AAAA,IACA,WAAW,QAAQ;AAAA,IACnB,cAAc,CAAC,QAAQ,IAAI,QAAQ;AAAA,IACnC,YAAY,CAAC,KAAK,UAAU;AAAA,MAC1B,IAAI,IAAI,SAAS,WAAW;AAAA,QAEzB,IAA2B,OAAO;AAAA,MACrC,EAAO;AAAA,QACL,WAAW,KAAK,CAAC,MAAM,GAAG,KAAK;AAAA;AAAA;AAAA,IAGnC,eAAe,QAAQ;AAAA,IACvB,YAAY,QAAQ;AAAA,IACpB,QAAQ,QAAQ;AAAA,IAChB,UAAU,QAAQ;AAAA,EACpB,CAAC;AAAA;AA8BI,SAAS,YAAY,CAC1B,KACA,cACA,SAC8B;AAAA,EAC9B,OAAO,2BAA+C;AAAA,IACpD;AAAA,IACA,WAAW,QAAQ,aAAa;AAAA,IAChC;AAAA,IACA,WAAW,QAAQ;AAAA,IACnB,cAAc,CAAC,QAAQ;AAAA,MACrB,MAAM,IAAI,IAAI;AAAA,MACd,IAAI,MAAM;AAAA,QAAW,OAAO;AAAA,MAC5B,OAAO,EAAE;AAAA;AAAA,IAEX,YAAY,CAAC,KAAK,UAAU;AAAA,MAC1B,MAAM,WAAW,IAAI;AAAA,MACrB,IAAI,aAAa,WAAW;AAAA,QACzB,IAA8B,QAAQ,IAAI,QAAQ,KAAK;AAAA,MAC1D,EAAO;AAAA,QACL,MAAM,QAAQ,QAAQ,SAAS;AAAA,QAC/B,IAAI,UAAU,GAAG;AAAA,UACf,SAAS,UAAU,KAAK;AAAA,QAC1B;AAAA;AAAA;AAAA,IAGJ,eAAe,QAAQ;AAAA,IACvB,YAAY,QAAQ;AAAA,IACpB,QAAQ,QAAQ;AAAA,IAChB,UAAU,QAAQ;AAAA,EACpB,CAAC;AAAA;AA8BI,SAAS,SAAY,CAC1B,KACA,cACA,SAC2B;AAAA,EAC3B,OAAO,2BAA4C;AAAA,IACjD;AAAA,IACA,WAAW,QAAQ,aAAa;AAAA,IAChC;AAAA,IACA,WAAW,QAAQ;AAAA,IACnB,cAAc,CAAC,QAAS,IAAI,QAAQ,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC;AAAA,IACtD,YAAY,CAAC,KAAK,UAAU;AAAA,MAGzB,IAA8B,QAAQ,CAAC,GAAG,KAAK;AAAA;AAAA,IAElD,eAAe,QAAQ;AAAA,IACvB,YAAY,QAAQ;AAAA,IACpB,QAAQ,QAAQ;AAAA,IAChB,UAAU,QAAQ;AAAA,EACpB,CAAC;AAAA;;;AInSH,mBAAS,mBAAQ;AAoFV,SAAS,UAAkC,CAAC,SAAgD;AAAA,EACjG,IAAI,kBAAkB,SAAS,QAAQ,KAAK,QAAQ,SAAS,GAAG;AAAA,IAC9D,MAAM,IAAI,eACR,qBAAqB,QAAQ,cAAc,QAAQ,+GACnD,oBACA,QAAQ,KACR,QAAQ,SACV;AAAA,EACF;AAAA,EACA,kBAAkB,SAAS,QAAQ,KAAK,QAAQ,WAAW,QAAQ,QAAQ;AAAA,EAE3E,MAAM,QAAQ,QAAU,QAAQ,YAAY;AAAA,EAC5C,IAAI,WAAW;AAAA,EACf,IAAI;AAAA,EAKJ,IAAI;AAAA,EAKJ,IAAI,WAAW;AAAA,EAEf,SAAS,oBAAoB,CAAC,QAA4B;AAAA,IACxD,MAAM,WAAW,CAAC,YAA8B;AAAA,MAC9C,IAAI;AAAA,QAAU;AAAA,MACd,WAAW;AAAA,MACX,IAAI;AAAA,QACF,MAAM,QAAQ,SAAS,QAAQ,GAAG;AAAA,gBAClC;AAAA,QACA,WAAW;AAAA;AAAA,MAMb,IAAI,QAAQ,mBAAmB,CAAC,UAAU;AAAA,QACnC,YAAY,QAAQ,QAAQ,GAAG;AAAA,MACtC;AAAA;AAAA,IAEF,OAAO,GAAG,UAAU,QAAQ;AAAA,IAC5B,uBAAuB,MAAM;AAAA,MAC3B,OAAO,IAAI,UAAU,QAAQ;AAAA;AAAA;AAAA,EAIjC,eAAe,WAAW,CAAC,YAA0B,KAAuB;AAAA,IAC1E,IAAI,CAAC,QAAQ;AAAA,MAAiB;AAAA,IAC9B,IAAI;AAAA,MAAU;AAAA,IACd,WAAW;AAAA,IACX,IAAI;AAAA,MACF,MAAM,OAAO,MAAM,QAAQ,gBAAgB,YAAY,GAAG;AAAA,MAC1D,IAAI,CAAC;AAAA,QAAM;AAAA,MACX,IAAI,SAAS;AAAA,QAAe;AAAA,MAC5B,IAAI,KAAK,eAAe,WAAW;AAAA,QAAY;AAAA,MAE/C,uBAAuB;AAAA,MACvB,uBAAuB;AAAA,MACvB,gBAAgB;AAAA,MAChB,qBAAqB,IAAI;AAAA,MACzB,WAAW;AAAA,MACX,IAAI;AAAA,QACF,MAAM,QAAQ,SAAS,KAAK,IAAI,CAAC;AAAA,gBACjC;AAAA,QACA,WAAW;AAAA;AAAA,cAEb;AAAA,MACA,WAAW;AAAA;AAAA;AAAA,EAIf,eAAe,sBAAsB,CAAC,OAA4C;AAAA,IAChF,IAAI,CAAC,QAAQ;AAAA,MAAiB,OAAO;AAAA,IACrC,IAAI,SAAS;AAAA,IACb,MAAM,OAAO,IAAI,IAAY,CAAC,OAAO,UAA+B,CAAC;AAAA,IACrE,UAAS;AAAA,MACP,MAAM,MAAM,OAAO,IAAI;AAAA,MACvB,IAAI,CAAC;AAAA,QAAK;AAAA,MACV,MAAM,OAAO,MAAM,QAAQ,gBAAgB,QAAQ,GAAG;AAAA,MACtD,IAAI,CAAC,QAAQ,SAAS;AAAA,QAAQ;AAAA,MAC9B,MAAM,eAAe,KAAK;AAAA,MAC1B,IAAI,KAAK,IAAI,YAAY;AAAA,QAAG;AAAA,MAC5B,KAAK,IAAI,YAAY;AAAA,MACrB,SAAS;AAAA,MACT,MAAM,OAAO,UAAU;AAAA,IACzB;AAAA,IACA,OAAO;AAAA;AAAA,EAGT,SAAS,sBAAsB,CAAC,QAA4B;AAAA,IAC1D,IAAI,QAAQ,kBAAkB;AAAA,MAAW;AAAA,IACzC,MAAM,gBAAgB,QAAQ;AAAA,IAC9B,MAAM,aAAa,QAAQ,cAAc,CAAC;AAAA,IAC1C,OAAO,OAAO,CAAC,QAAQ;AAAA,MACrB,cAAc,KAA2C,eAAe,UAAU;AAAA,MAGlF,cAAc,KAA2C,aAAa;AAAA,KACvE;AAAA;AAAA,EAGH,SAAS,kBAAkB,GAAS;AAAA,IAClC,QAAO,MAAM;AAAA,MACX,MAAM,QAAQ,MAAM;AAAA,MACpB,IAAI;AAAA,QAAU;AAAA,MACd,IAAI,CAAC;AAAA,QAAe;AAAA,MACpB,WAAW;AAAA,MACX,IAAI;AAAA,QACF,cAAc,OAAO,CAAC,QAAQ;AAAA,UAC5B,cAAc,KAA2C,KAAK;AAAA,SAC/D;AAAA,gBACD;AAAA,QACA,WAAW;AAAA;AAAA,KAEd;AAAA;AAAA,EAGH,MAAM,UAAU,YAAY;AAAA,IAC1B,MAAM,gBAAgB,MAAM,QAAQ,UAAU;AAAA,IAC9C,MAAM,cAAc,UAAU;AAAA,IAM9B,MAAM,SAAS,MAAM,uBAAuB,aAAa;AAAA,IACzD,gBAAgB;AAAA,IAIhB,uBAAuB,MAAM;AAAA,IAI7B,WAAW;AAAA,IACX,IAAI;AAAA,MACF,MAAM,QAAQ,SAAS,OAAO,IAAI,CAAC;AAAA,cACnC;AAAA,MACA,WAAW;AAAA;AAAA,IAMb,qBAAqB,MAAM;AAAA,IAM3B,mBAAmB;AAAA,KAClB;AAAA,EAEH,OAAO;AAAA,IACL,KAAK,QAAQ;AAAA,IACb,WAAW,QAAQ;AAAA,QACf,KAAK,GAAG;AAAA,MACV,OAAO,MAAM;AAAA;AAAA,QAEX,KAAK,CAAC,MAAS;AAAA,MACjB,MAAM,QAAQ;AAAA;AAAA,IAEhB;AAAA,QACI,MAAM,GAAG;AAAA,MACX,OAAO;AAAA;AAAA,EAEX;AAAA;AAQF,SAAS,QAAW,CAAC,KAAW;AAAA,EAC9B,OAAO,KAAK,MAAM,KAAK,UAAU,GAAG,CAAC;AAAA;AA6BvC,SAAS,aAAqC,CAAC,KAA8B,OAAgB;AAAA,EAC3F,MAAM,SAAS;AAAA,EACf,WAAW,OAAO,OAAO,KAAK,KAAK,GAAG;AAAA,IACpC,IAAI,QAAQ;AAAA,MAAsB;AAAA,IAClC,MAAM,WAAW,OAAO;AAAA,IACxB,IAAI,YAAY,IAAI,MAAM,QAAQ;AAAA,MAAG;AAAA,IACrC,IAAI,OAAO;AAAA,EACb;AAAA;AAQF,SAAS,WAAW,CAAC,GAAY,GAAqB;AAAA,EACpD,IAAI,MAAM;AAAA,IAAG,OAAO;AAAA,EACpB,IAAI;AAAA,IACF,OAAO,KAAK,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC;AAAA,IAC7C,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;;;ALnQX,IAAI;AA2BG,IAAM,uBAA+B,cAC1C,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,aAC1D,OAAO,WAAW,IAClB,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,SAAS,EAAE;AAK3D,SAAS,oBAAoB,GAAW;AAAA,EAC7C,OAAO;AAAA;AAST,IAAI;AAOG,SAAS,2BAA2B,GAAuB;AAAA,EAChE,OAAO;AAAA;AASF,SAAS,kBAAkB,CAAC,MAAkB;AAAA,EACnD,cAAc;AAAA,EACd,2BAA2B,KAAK;AAAA;AAO3B,SAAS,cAAc,GAAS;AAAA,EACrC,cAAc;AAAA,EACd,2BAA2B;AAAA,EAC3B,wBAAwB;AAAA,EACxB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,eAAe,CAAC;AAAA,EAChB,gBAAgB;AAAA;AAQX,SAAS,qBAAqB,GAAY;AAAA,EAC/C,OAAO,gBAAgB;AAAA;AAUzB,IAAI,wBAAwB;AAKrB,SAAS,oBAAoB,GAAY;AAAA,EAC9C,OAAO;AAAA;AAgBT,IAAI,kBAAkB;AAIf,SAAS,kBAAkB,GAAW;AAAA,EAC3C,OAAO;AAAA;AAWT,IAAI,kBAAkB;AAKf,SAAS,kBAAkB,GAAW;AAAA,EAC3C,OAAO;AAAA;AAoBT,IAAI;AAIG,SAAS,sBAAsB,GAAmD;AAAA,EACvF,OAAO;AAAA;AAGT,SAAS,qBAAqB,CAAC,QAAuB;AAAA,EACpD,MAAM,MACJ,kBAAkB,QACd,SACA,IAAI,MAAM,OAAO,WAAW,WAAW,SAAS,OAAO,MAAM,CAAC;AAAA,EACpE,sBAAsB;AAAA,IACpB,MAAM,IAAI;AAAA,IACV,SAAS,IAAI;AAAA,IACb,OAAO,IAAI;AAAA,IACX,IAAI,KAAK,IAAI;AAAA,EACf;AAAA;AAiBF,IAAM,wBAAwB;AAoC9B,IAAI;AAKG,SAAS,mBAAmB,GAA0C;AAAA,EAC3E,OAAO;AAAA;AAGT,SAAS,sBAAsB,CAAC,OAAwC;AAAA,EACtE,uBAAuB;AAAA;AASzB,eAAe,kBAAqB,CAClC,WACA,YACA,SACA,YAAoB,uBACR;AAAA,EACZ,MAAM,QAAQ,KAAK,IAAI;AAAA,EACvB,IAAI;AAAA,EACJ,IAAI,WAAW;AAAA,EACf,IAAI;AAAA,IACF,OAAO,MAAM,IAAI,QAAW,CAAC,SAAS,WAAW;AAAA,MAC/C,QAAQ,WAAW,MAAM;AAAA,QACvB,WAAW;AAAA,QACX,MAAM,YAAY,KAAK,IAAI,IAAI;AAAA,QAC/B,MAAM,UAAU,wCAAwC,2BAA2B,+BAA+B;AAAA,QAClH,uBAAuB;AAAA,UACrB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,IAAI,KAAK,IAAI;AAAA,QACf,CAAC;AAAA,QACD,OAAO,IAAI,MAAM,OAAO,CAAC;AAAA,SACxB,SAAS;AAAA,MACZ,QAAQ,KACN,CAAC,UAAU;AAAA,QACT,IAAI,CAAC;AAAA,UAAU,QAAQ,KAAK;AAAA,SAE9B,CAAC,QAAQ;AAAA,QACP,IAAI,CAAC;AAAA,UAAU,OAAO,GAAG;AAAA,OAE7B;AAAA,KACD;AAAA,YACD;AAAA,IACA,IAAI,UAAU;AAAA,MAAW,aAAa,KAAK;AAAA;AAAA;AA8F/C,IAAM,uBAAuB;AAC7B,IAAI,eAA6C,CAAC;AAI3C,SAAS,eAAe,GAAiC;AAAA,EAC9D,OAAO,aAAa,MAAM;AAAA;AAG5B,SAAS,iBAAiB,CAAC,QAA0C;AAAA,EACnE,aAAa,KAAK,MAAM;AAAA,EACxB,IAAI,aAAa,SAAS,sBAAsB;AAAA,IAC9C,eAAe,aAAa,MAAM,CAAC,oBAAoB;AAAA,EACzD;AAAA;AAGF,SAAS,eAAe,CAAC,MAAY,YAA4C;AAAA,EAC/E,MAAM,SAAU,KAAK,QACnB;AAAA,EAEF,IAAI,CAAC;AAAA,IAAQ;AAAA,EACb,OAAO,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ,OAAO,OAAO,SAAS,SAAS;AAAA;AAG3F,SAAS,WAAW,CAAC,QAAgC;AAAA,EACnD,wBAAwB;AAAA,EACxB,MAAM,OAAO,UAAU;AAAA,EACvB,IAAI,CAAC,MAAM;AAAA,IAMT,IAAI,OAAO,YAAY,eAAe,OAAO,QAAQ,SAAS,YAAY;AAAA,MACxE,QAAQ,KACN,2EAA2E,sKAC7E;AAAA,IACF;AAAA,IACA,MAAM,IAAI,MACR,yDAAyD,2QAC3D;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAWT,IAAM,gBAAgB;AACtB,IAAM,aAAa,IAAI;AAShB,SAAS,gBAAgB,CAAC,KAAyB;AAAA,EACxD,MAAM,SAAS,MAAK,KAAK,WAAW,OAAO,GAAG,iBAAiB,KAAK,CAAC;AAAA,EACrE,MAAM,QAAQ,OAAO,MAAM,GAAG,EAAE;AAAA,EAChC,OAAO,sBAAsB,KAAoC;AAAA;AA8BnE,IAAI;AAEG,SAAS,qBAAqB,CAAC,UAA2C;AAAA,EAC/E,gBAAgB;AAAA;AAGX,SAAS,gBAAgB,GAA8B;AAAA,EAC5D,OAAO;AAAA;AAQF,SAAS,iBAAiB,CAAC,KAAyB;AAAA,EACzD,OAAO,gBAAgB,GAAG,KAAK,iBAAiB,GAAG;AAAA;AA8BrD,IAAI;AAEG,SAAS,wBAAwB,CAAC,UAA8C;AAAA,EACrF,mBAAmB;AAAA;AAGd,SAAS,mBAAmB,GAAiC;AAAA,EAClE,OAAO;AAAA;AAoBT,SAAS,kBAAqB,CAC5B,MACA,KACA,YAC6B;AAAA,EAK7B,MAAM,aAAa,kBAAkB,GAAG;AAAA,EACxC,OAAO,YAAY;AAAA,IAGjB;AAAA,IACA,IAAI,aAAoC;AAAA,IACxC,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,MAAM,SAAS,KAAK,QAAQ;AAAA,MAI5B;AAAA,MACA,MAAM,cAAc;AAAA,MACpB,IAAI;AAAA,MACJ,IAAI,QAAQ;AAAA,QAMV,MAAM,mBACJ,aACA,aACA,OAAO,UAAU,CAAC,SAAS,aAAa,CAAC,CAC3C;AAAA,QACA,IAAI,OAAO,UAAU,SAAS;AAAA,UAC5B,aAAa;AAAA,UACb,SAAS;AAAA,QACX,EAAO;AAAA,UAEL,SAAS,MAAM,WAAc,MAAM,YAAY,YAAY,aAAa,CAAC,MAAM;AAAA,YAC7E,aAAa;AAAA,WACd;AAAA;AAAA,MAEL,EAAO;AAAA,QACL,SAAS,MAAM,WAAc,MAAM,YAAY,YAAY,aAAa,CAAC,MAAM;AAAA,UAC7E,aAAa;AAAA,SACd;AAAA;AAAA,MAQH,OAAO;AAAA,MACP,OAAO,KAAK;AAAA,MAIZ,eAAe,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MAC9D,sBAAsB,GAAG;AAAA,MACzB,MAAM;AAAA,cACN;AAAA,MAQA,MAAM,cAAc,gBAAgB,MAAM,UAAU;AAAA,MACpD,kBAAkB;AAAA,QAChB;AAAA,QACA,OAAO;AAAA,QACP,IAAI,KAAK,IAAI;AAAA,QACb;AAAA,QACA,kBAAkB,gBAAgB;AAAA,QAClC;AAAA,QACA;AAAA,MACF,CAAC;AAAA;AAAA;AAAA;AAOP,eAAe,UAAa,CAC1B,MACA,YACA,YACA,aACA,eACuB;AAAA,EACvB,MAAM,cAAc,KAAK,kBAAkB,QAAW,UAAU;AAAA,EAChE,MAAM,SAAS,cACX,MAAM,mBAAmB,WAAW,aAAa,WAAW,IAC5D;AAAA,EACJ,IAAI,QAAQ;AAAA,IACV,cAAc,qBAAqB;AAAA,IACnC,OAAO,KAAK,KAAQ,YAAY,EAAE,iBAAiB,CAAC,OAAO,EAAE,CAAC;AAAA,EAChE;AAAA,EACA,MAAM,SAAS,UAAU,KAAK,UAAU,KAAK,UAAgD,CAAC;AAAA,EAC9F,MAAM,SAAS,KAAK,OAAU,QAAQ,EAAE,OAAO,WAAW,CAAC;AAAA,EAC3D,OAAO,YAAY;AAAA,EACnB,cAAc,qBAAqB;AAAA,EACnC,OAAO;AAAA;AAmET,SAAS,yBAAiE,CAAC,WAAiB;AAAA,EAC1F,UAAU,OAAO,MAAM,CAAC,QAAQ;AAAA,IAC9B,sBAAsB,GAAG;AAAA,GAC1B;AAAA,EACD,OAAO;AAAA;AAgBF,SAAS,UAAkC,CAChD,KACA,cACA,UAA4B,CAAC,GACX;AAAA,EAClB,MAAM,OAAO,YAAY,QAAQ,IAAI;AAAA,EACrC,OAAO,0BACL,WAAc;AAAA,IACZ;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,WAAW,mBAAsB,MAAM,KAAK,YAAY;AAAA,IACxD,iBAAiB,sBAAyB,IAAI;AAAA,IAC9C,eAAe,QAAQ;AAAA,IACvB,YAAY,QAAQ;AAAA,IACpB,QAAQ,QAAQ;AAAA,EAClB,CAAC,CACH;AAAA;AAaF,SAAS,qBAAwB,CAC/B,MACmF;AAAA,EACnF,IAAI,CAAC,kBAAkB,CAGvB;AAAA,EACA,OAAO,OAAO,SAAS,QAAQ;AAAA,IAC7B,MAAM,WAAW;AAAA,IACjB,IAAI,CAAC;AAAA,MAAU;AAAA,IACf,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,SAAS,SAAS,GAAG;AAAA,MACrB,MAAM;AAAA,MACN;AAAA;AAAA,IAEF,IAAI,CAAC;AAAA,MAAQ;AAAA,IACb,IAAI;AAAA,MACF,OAAO,MAAM,KAAK,KAAQ,QAAQ;AAAA,QAChC,iBAAiB,CAAC,SAAS,aAAa;AAAA,MAC1C,CAAC;AAAA,MACD,MAAM;AAAA,MACN;AAAA;AAAA;AAAA;AAaC,SAAS,SAAS,CACvB,KACA,cACA,UAA4B,CAAC,GACC;AAAA,EAC9B,MAAM,OAAO,YAAY,QAAQ,IAAI;AAAA,EACrC,OAAO,0BACL,UAAU,KAAK,cAAc;AAAA,IAC3B,WAAW;AAAA,IACX,WAAW,mBAA4B,MAAM,KAAK,EAAE,MAAM,aAAa,CAAC;AAAA,IACxE,eAAe,QAAQ;AAAA,IACvB,YAAY,QAAQ;AAAA,IACpB,QAAQ,QAAQ;AAAA,EAClB,CAAC,CACH;AAAA;AAUK,SAAS,YAAY,CAC1B,KACA,cACA,UAA4B,CAAC,GACC;AAAA,EAC9B,MAAM,OAAO,YAAY,QAAQ,IAAI;AAAA,EACrC,OAAO,0BACL,aAAa,KAAK,cAAc;AAAA,IAC9B,WAAW;AAAA,IACX,WAAW,mBAA+B,MAAM,KAAK,CAAC,CAAC;AAAA,IACvD,eAAe,QAAQ;AAAA,IACvB,YAAY,QAAQ;AAAA,IACpB,QAAQ,QAAQ;AAAA,EAClB,CAAC,CACH;AAAA;AAWK,SAAS,SAAY,CAC1B,KACA,cACA,UAA4B,CAAC,GACF;AAAA,EAC3B,MAAM,OAAO,YAAY,QAAQ,IAAI;AAAA,EACrC,OAAO,0BACL,UAAa,KAAK,cAAc;AAAA,IAC9B,WAAW;AAAA,IACX,WAAW,mBAA+B,MAAM,KAAK,EAAE,OAAO,aAAa,CAAC;AAAA,IAC5E,eAAe,QAAQ;AAAA,IACvB,YAAY,QAAQ;AAAA,IACpB,QAAQ,QAAQ;AAAA,EAClB,CAAC,CACH;AAAA;;;AMt4BF;AAAA,oBAEE;AAAA;;;ACnBK,IAAM,0BAA0B,KAAK;AAQrC,IAAM,2BAA2B,KAAK;AAetC,SAAS,qBAAqB,CACnC,QACA,MACyB;AAAA,EACzB,MAAM,cAAc,IAAI,YAAY,EAAE,OAAO,KAAK,UAAU,MAAM,CAAC;AAAA,EACnE,MAAM,OAAO,IAAI,YAAY,SAAS,KAAK;AAAA,EAC3C,MAAM,SAAS,IAAI,YAAY,IAAI;AAAA,EACnC,MAAM,MAAM,IAAI,WAAW,MAAM;AAAA,EACjC,MAAM,OAAO,IAAI,SAAS,MAAM;AAAA,EAChC,KAAK,UAAU,GAAG,YAAY,QAAQ,KAAK;AAAA,EAC3C,IAAI,IAAI,aAAa,CAAC;AAAA,EACtB,IAAI,IAAI,MAAM,IAAI,YAAY,MAAM;AAAA,EACpC,OAAO;AAAA;AAMF,SAAS,iBAAiB,CAC/B,OAC8D;AAAA,EAC9D,IAAI,MAAM,SAAS;AAAA,IAAG;AAAA,EACtB,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,EAC1E,MAAM,YAAY,KAAK,UAAU,GAAG,KAAK;AAAA,EACzC,IAAI,MAAM,SAAS,IAAI;AAAA,IAAW;AAAA,EAClC,IAAI;AAAA,IACF,MAAM,SAAS,KAAK,MAClB,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,CAC3D;AAAA,IACA,IAAI,OAAO,SAAS;AAAA,MAAiB;AAAA,IACrC,MAAM,OAAO,MAAM,SAAS,IAAI,SAAS;AAAA,IACzC,OAAO,EAAE,QAAQ,KAAK;AAAA,IACtB,MAAM;AAAA,IACN;AAAA;AAAA;AAOG,SAAS,kBAAkB,CAAC,OAA4B;AAAA,EAC7D,IAAI,MAAM,SAAS;AAAA,IAAG,OAAO;AAAA,EAC7B,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,EAC1E,MAAM,YAAY,KAAK,UAAU,GAAG,KAAK;AAAA,EACzC,IAAI,MAAM,SAAS,IAAI;AAAA,IAAW,OAAO;AAAA,EACzC,MAAM,cAAc,MAAM,SAAS,GAAG,IAAI,SAAS;AAAA,EACnD,MAAM,SAAS,IAAI,YAAY,EAAE,OAAO,wBAAwB;AAAA,EAChE,OAAO,cAAa,aAAa,MAAM,MAAM;AAAA;AASxC,SAAS,gBAAgB,CAC9B,OACA,IACA,YAAoB,0BACO;AAAA,EAC3B,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,KAAK,MAAM,SAAS,SAAS,CAAC;AAAA,EAC7D,MAAM,YAAuC,CAAC;AAAA,EAC9C,SAAS,QAAQ,EAAG,QAAQ,OAAO,SAAS;AAAA,IAC1C,MAAM,QAAQ,QAAQ;AAAA,IACtB,MAAM,MAAM,KAAK,IAAI,QAAQ,WAAW,MAAM,MAAM;AAAA,IACpD,UAAU,KACR,sBAAsB,EAAE,MAAM,iBAAiB,IAAI,OAAO,MAAM,GAAG,MAAM,SAAS,OAAO,GAAG,CAAC,CAC/F;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAKF,SAAS,uBAAuB,CACrC,QACA,OACY;AAAA,EACZ,IAAI,aAAa;AAAA,EACjB,SAAS,IAAI,EAAG,IAAI,OAAO,KAAK;AAAA,IAC9B,MAAM,QAAQ,OAAO,IAAI,CAAC;AAAA,IAC1B,IAAI,CAAC,OAAO;AAAA,MACV,MAAM,IAAI,MAAM,6CAA6C,QAAQ,OAAO;AAAA,IAC9E;AAAA,IACA,cAAc,MAAM;AAAA,EACtB;AAAA,EACA,MAAM,MAAM,IAAI,WAAW,UAAU;AAAA,EACrC,IAAI,SAAS;AAAA,EACb,SAAS,IAAI,EAAG,IAAI,OAAO,KAAK;AAAA,IAC9B,MAAM,QAAQ,OAAO,IAAI,CAAC;AAAA,IAC1B,IAAI,IAAI,OAAO,MAAM;AAAA,IACrB,UAAU,MAAM;AAAA,EAClB;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,aAAY,CAAC,UAAsB,QAA4B;AAAA,EACtE,IAAI,OAAO,WAAW;AAAA,IAAG,OAAO;AAAA,EAChC;AAAA,IAAO,SAAS,IAAI,EAAG,KAAK,SAAS,SAAS,OAAO,QAAQ,KAAK;AAAA,MAChE,SAAS,IAAI,EAAG,IAAI,OAAO,QAAQ,KAAK;AAAA,QACtC,IAAI,SAAS,IAAI,OAAO,OAAO;AAAA,UAAI;AAAA,MACrC;AAAA,MACA,OAAO;AAAA,IACT;AAAA,EACA,OAAO;AAAA;;;ADjFT,eAAe,wBAAwB,CACrC,YACA,sBAC4B;AAAA,EAC5B,MAAM,KAAK,YAAY,IAAI;AAAA,EAC3B,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,SAAS,MAAM,WAAW,SAAS;AAAA,IACnC,MAAM;AAAA,IACN,OAAO,uBAAuB,sBAAsB,EAAE;AAAA;AAAA,EAExD,MAAM,SAAS,eAAe,MAAM;AAAA,EACpC,MAAM,eAAe,iBAAiB,MAAM;AAAA,EAC5C,MAAM,wBAAwB,eAC1B,uBAAuB,cAAc,OAAO,YAAY,OAAO,WAAW,IAC1E;AAAA,EACJ,OAAO;AAAA,IACL;AAAA,IACA,0BAA0B,OAAO;AAAA,IACjC,wBAAwB,OAAO;AAAA,IAC/B;AAAA,IACA;AAAA,EACF;AAAA;AAYF,SAAS,sBAAsB,CAC7B,sBACA,IACmB;AAAA,EACnB,OAAO;AAAA,IACL,uBAAuB;AAAA,IACvB,0BAA0B;AAAA,IAC1B,wBAAwB;AAAA,IACxB;AAAA,IACA;AAAA,EACF;AAAA;AAGF,SAAS,cAAc,CAAC,QAAqC;AAAA,EAC3D,MAAM,MAAmB;AAAA,IACvB,YAAY,IAAI;AAAA,IAChB,aAAa,IAAI;AAAA,IACjB,OAAO,IAAI;AAAA,IACX,gBAAgB;AAAA,IAChB,0BAA0B;AAAA,IAC1B,wBAAwB;AAAA,EAC1B;AAAA,EACA,MAAM,OAAQ,OAAgD,SAAS,KAAK,CAAC;AAAA,EAC7E,WAAW,OAAO,MAAM;AAAA,IACtB,IAAI,CAAC,OAAO,OAAO,QAAQ;AAAA,MAAU;AAAA,IACrC,MAAM,OAAO;AAAA,IACb,WAAW,MAAM,GAAG;AAAA,EACtB;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,UAAU,CAAC,MAA+B,KAAwB;AAAA,EACzE,MAAM,KAAK,OAAO,KAAK,KAAK;AAAA,EAC5B,QAAQ,KAAK;AAAA,SACN;AAAA,MACH,IAAI,WAAW,IAAI,IAAI,IAAI;AAAA,MAC3B;AAAA,SACG;AAAA,MACH,IAAI,YAAY,IAAI,IAAI,IAAI;AAAA,MAC5B;AAAA,SACG;AAAA,MACH,IAAI,MAAM,IAAI,IAAI,IAAI;AAAA,MACtB;AAAA,SACG;AAAA,MACH,gBAAgB,MAAM,GAAG;AAAA,MACzB;AAAA,SACG;AAAA,MACH,kBAAkB,MAAM,GAAG;AAAA,MAC3B;AAAA;AAAA;AAIN,SAAS,eAAe,CAAC,MAA+B,KAAwB;AAAA,EAC9E,MAAM,aAAa,KAAK;AAAA,EACxB,IAAI,OAAO,eAAe;AAAA,IAAU,IAAI,iBAAiB;AAAA,EACzD,MAAM,KAAK,KAAK;AAAA,EAChB,MAAM,KAAK,KAAK;AAAA,EAChB,IAAI,OAAO,OAAO;AAAA,IAAU,IAAI,2BAA2B;AAAA,EAC3D,IAAI,OAAO,OAAO;AAAA,IAAU,IAAI,yBAAyB;AAAA;AAG3D,SAAS,iBAAiB,CAAC,MAA+B,KAAwB;AAAA,EAIhF,MAAM,KAAK,KAAK;AAAA,EAChB,MAAM,KAAK,KAAK;AAAA,EAChB,IAAI,IAAI,6BAA6B,aAAa,OAAO,OAAO,UAAU;AAAA,IACxE,IAAI,2BAA2B;AAAA,EACjC;AAAA,EACA,IAAI,IAAI,2BAA2B,aAAa,OAAO,OAAO,UAAU;AAAA,IACtE,IAAI,yBAAyB;AAAA,EAC/B;AAAA;AAGF,SAAS,gBAAgB,CAAC,QAA0D;AAAA,EAClF,IAAI,OAAO,gBAAgB;AAAA,IACzB,MAAM,QAAQ,OAAO,MAAM,IAAI,OAAO,cAAc;AAAA,IACpD,IAAI;AAAA,MAAO,OAAO;AAAA,EACpB;AAAA,EACA,WAAW,QAAQ,OAAO,MAAM,OAAO,GAAG;AAAA,IACxC,IAAI,KAAK;AAAA,MAAc,OAAO;AAAA,EAChC;AAAA,EACA;AAAA;AAQF,SAAS,iBAAiB,CAAC,MAazB;AAAA,EACA,MAAM,UAA8C,CAAC;AAAA,EACrD,YAAY,OAAO,aAAa,KAAK,SAAS;AAAA,IAC5C,QAAQ,SAAS,KAAK,SAAS;AAAA,EACjC;AAAA,EACA,OAAO;AAAA,IACL,gBAAgB,KAAK,WAAW;AAAA,IAChC,oBAAoB,KAAK,WAAW;AAAA,IACpC,iBAAiB,KAAK,WAAW;AAAA,IACjC,kBAAkB,KAAK,SAAS,cAAc;AAAA,IAC9C,kBAAkB,KAAK,aAAa;AAAA,IACpC,uBAAuB,KAAK,iBAAiB;AAAA,IAC7C,cAAc,KAAK,eAAe,KAAK,KAAK,aAAa,IAAI;AAAA,IAC7D,WAAW,KAAK,YACZ;AAAA,SACK,KAAK;AAAA,MACR,uBAAuB,KAAK,UAAU,wBAClC,KAAK,KAAK,UAAU,sBAAsB,IAC1C;AAAA,IACN,IACA;AAAA,IACJ,0BAA0B,KAAK,KAAK,yBAAyB;AAAA,IAC7D;AAAA,IACA,WAAW,KAAK;AAAA,IAChB,eAAe,KAAK;AAAA,EACtB;AAAA;AAOF,SAAS,yBAAyB,GAAiC;AAAA,EACjE,OAAO;AAAA,IACL,qBAAqB;AAAA,IACrB,wBAAwB;AAAA,IACxB,qBAAqB;AAAA,IACrB,uBAAuB;AAAA,EACzB;AAAA;AAGF,SAAS,sBAAsB,CAC7B,MACA,YACA,aACyD;AAAA,EACzD,MAAM,QAAQ,WAAW,IAAI,OAAO,KAAK,mBAAmB,CAAC;AAAA,EAC7D,MAAM,SAAS,YAAY,IAAI,OAAO,KAAK,oBAAoB,CAAC;AAAA,EAChE,OAAO;AAAA,IACL,oBAAoB,OAAO,QAAQ,oBAAoB,GAAG;AAAA,IAC1D,qBAAqB,OAAO,SAAS,oBAAoB,GAAG;AAAA,IAC5D,OAAO,OAAO,KAAK,YAAY,EAAE;AAAA,IACjC,WAAW,QAAQ,KAAK,YAAY;AAAA,IACpC,WAAW,OAAO,KAAK,gBAAgB,CAAC;AAAA,IACxC,eAAe,OAAO,KAAK,oBAAoB,CAAC;AAAA,EAClD;AAAA;AAMK,IAAM,sBAAsC;AAAA,EACjD,EAAE,MAAM,+BAA+B;AAAA,EACvC,EAAE,MAAM,gCAAgC;AAC1C;AAQO,IAAM,kCAAkC;AAYxC,IAAM,uBAAuB;AAO7B,IAAM,4BAA4B;AA+YzC,SAAS,uBAAuB,GAAuB;AAAA,EACrD,OAAO;AAAA,IACL,sBAAsB;AAAA,IACtB,qBAAqB;AAAA,IACrB,wBAAwB;AAAA,IACxB,wBAAwB;AAAA,EAC1B;AAAA;AAAA;AAkEK,MAAM,0BAA0B,gBAAe;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACQ;AAAA,EACR;AAAA,EASQ;AAAA,EAIA;AAAA,EAIT;AAAA,EAIS;AAAA,EAOA;AAAA,EAIA;AAAA,EAKA,eAAe,IAAI;AAAA,EAOnB;AAAA,EACA;AAAA,EACA,QAAQ,IAAI;AAAA,EACrB,QAAQ;AAAA,EACR;AAAA,EAMS,8BAA8B,IAAI;AAAA,EAK3C,gBAAgB;AAAA,EAIhB;AAAA,EAKA;AAAA,EACS;AAAA,EACA;AAAA,EACA;AAAA,MAQb,YAAY,GAAa;AAAA,IAC3B,IAAI,KAAK,kBAAkB,WAAW;AAAA,MACpC,OAAO,CAAC,GAAG,KAAK,cAAc,EAAE,WAAW,KAAK,CAAC,EAAE,OAAO,CAAC,OAAO,OAAO,KAAK,WAAW;AAAA,IAC3F;AAAA,IACA,OAAO,CAAC,GAAG,KAAK,UAAU;AAAA;AAAA,EAQpB,YAAY,CAAC,cAA+B;AAAA,IAClD,IAAI,KAAK,kBAAkB,WAAW;AAAA,MACpC,OAAO,KAAK,cAAc,EAAE,WAAW,IAAI,YAAY;AAAA,IACzD;AAAA,IACA,OAAO,KAAK,WAAW,IAAI,YAAY;AAAA;AAAA,EAMzC;AAAA,EAEA,WAAW,CAAC,SAAmC;AAAA,IAC7C,MAAM;AAAA,IACN,KAAK,YAAY,QAAQ;AAAA,IACzB,KAAK,aAAa,QAAQ,cAAc;AAAA,IACxC,KAAK,qBAAqB,QAAQ;AAAA,IAClC,KAAK,sBAAsB,QAAQ,uBAAuB;AAAA,IAC1D,KAAK,mBAAmB,QAAQ,oBAAoB;AAAA,IACpD,KAAK,aAAa,IAAI,IAAI,QAAQ,gBAAgB,CAAC,CAAC;AAAA,IACpD,KAAK,gBAAgB,QAAQ;AAAA,IAC7B,KAAK,8BAA8B,QAAQ,+BAA+B;AAAA,IAC1E,KAAK,mBAAmB,QAAQ,oBAAoB;AAAA,IACpD,KAAK,wBAAwB,QAAQ,iCAAiC;AAAA,IACtE,KAAK,8BACH,QAAQ,+BAA+B;AAAA,IACzC,KAAK,oBAAoB,QAAQ,qBAAqB;AAAA,IACtD,KAAK,yBAAyB,QAAQ,0BAA0B;AAAA,IAChE,KAAK,cAAc,QAAQ;AAAA,IAC3B,MAAM,KAAK,QAAQ,qBAAqB,WAAW;AAAA,IACnD,IAAI,OAAO,OAAO,YAAY;AAAA,MAC5B,MAAM,IAAI,MACR,+MACF;AAAA,IACF;AAAA,IACA,KAAK,wBAAwB;AAAA;AAAA,EAG/B,OAAO,GAAY;AAAA,IACjB,OAAO,KAAK;AAAA;AAAA,EAOd,aAAa,GAAW;AAAA,IACtB,OAAO,KAAK,MAAM;AAAA;AAAA,EAsBpB,oBAAoB,GA4BlB;AAAA,IACA,MAAM,eAAe,KAAK;AAAA,IAC1B,MAAM,iBAAiB,CAAC,GAAG,KAAK,YAAY;AAAA,IAC5C,MAAM,eAAe,IAAI,IAAI,YAAY;AAAA,IACzC,MAAM,WAAW,IAAI;AAAA,IACrB,WAAW,MAAM;AAAA,MAAc,SAAS,IAAI,EAAE;AAAA,IAC9C,WAAW,MAAM;AAAA,MAAgB,SAAS,IAAI,EAAE;AAAA,IAChD,WAAW,MAAM,KAAK,MAAM,KAAK;AAAA,MAAG,SAAS,IAAI,EAAE;AAAA,IACnD,MAAM,QAAwE,CAAC;AAAA,IAC/E,WAAW,UAAU,UAAU;AAAA,MAC7B,MAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAAA,MAClC,MAAM,WAAW,KAAK,2BAA2B,MAAM;AAAA,MACvD,MAAM,KAAK;AAAA,QACT;AAAA,QACA,gBAAgB,aAAa,IAAI,MAAM;AAAA,QACvC,qBAAqB,KAAK,aAAa,IAAI,MAAM;AAAA,QAKjD,+BAA+B,SAAS;AAAA,QACxC,wBAAwB;AAAA,QACxB,MAAM,OAAO,kBAAkB,IAAI,IAAI;AAAA,MACzC,CAAC;AAAA,IACH;AAAA,IACA,OAAO;AAAA,MACL,aAAa,KAAK;AAAA,MAClB;AAAA,MACA;AAAA,MACA,OAAO;AAAA,QACL,SAAS,KAAK,2BAA2B;AAAA,QACzC,YAAY,KAAK;AAAA,QACjB,UAAU,KAAK;AAAA,QACf,WAAW,KAAK;AAAA,MAClB;AAAA,MACA;AAAA,IACF;AAAA;AAAA,EAWF,gBAAgB,CAAC,cAA4B;AAAA,IAC3C,KAAK,aAAa,IAAI,YAAY;AAAA,IAClC,IAAI,CAAC,KAAK,iBAAiB,YAAY;AAAA,MAAG;AAAA,IAC1C,KAAK,wBAAwB,YAAY;AAAA;AAAA,EAO3C,kBAAkB,CAAC,SAAyB;AAAA,IAC1C,WAAW,gBAAgB,SAAS;AAAA,MAClC,KAAK,aAAa,IAAI,YAAY;AAAA,MAClC,IAAI,CAAC,KAAK,iBAAiB,YAAY;AAAA,QAAG;AAAA,MAC1C,KAAK,wBAAwB,YAAY;AAAA,IAC3C;AAAA;AAAA,EAaM,uBAAuB,CAAC,cAA4B;AAAA,IAC1D,IAAI;AAAA,MACF,KAAK,qBAAqB,YAAY;AAAA,MACtC,OAAO,KAAK;AAAA,MACZ,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MAC/D,KAAK,4BAA4B,IAAI,cAAc;AAAA,QACjD,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,IAAI,YAAY,IAAI;AAAA,MACtB,CAAC;AAAA;AAAA;AAAA,EAUL,cAAc,CAAC,cAA4B;AAAA,IACzC,KAAK,aAAa,OAAO,YAAY;AAAA,IACrC,MAAM,OAAO,KAAK,MAAM,IAAI,YAAY;AAAA,IACxC,IAAI,CAAC;AAAA,MAAM;AAAA,IACX,KAAK,SAAS,MAAM;AAAA,IACpB,KAAK,WAAW,MAAM;AAAA,IACtB,KAAK,MAAM,OAAO,YAAY;AAAA;AAAA,EAmBhC,YAAY,CAAC,cAA4B;AAAA,IACvC,IAAI,iBAAiB,KAAK;AAAA,MAAa;AAAA,IACvC,IAAI,KAAK,kBAAkB,WAAW;AAAA,MAIpC,IAAI,KAAK,WAAW,IAAI,YAAY;AAAA,QAAG;AAAA,MACvC,KAAK,WAAW,IAAI,YAAY;AAAA,IAClC;AAAA,IACA,IAAI,CAAC,KAAK,aAAa,IAAI,YAAY;AAAA,MAAG;AAAA,IAC1C,IAAI,CAAC,KAAK,iBAAiB,YAAY;AAAA,MAAG;AAAA,IAC1C,KAAK,wBAAwB,YAAY;AAAA;AAAA,EAmB3C,iBAAiB,GAAS;AAAA,IACxB,WAAW,gBAAgB,KAAK,cAAc;AAAA,MAC5C,IAAI,CAAC,KAAK,iBAAiB,YAAY;AAAA,QAAG;AAAA,MAC1C,KAAK,wBAAwB,YAAY;AAAA,IAC3C;AAAA;AAAA,EAGM,gBAAgB,CAAC,cAA+B;AAAA,IACtD,MAAM,SAAS,KAAK,mBAAmB,YAAY;AAAA,IACnD,KAAK,4BAA4B,IAAI,cAAc;AAAA,MACjD,UAAU,WAAW,YAAY,aAAa;AAAA,MAC9C;AAAA,MACA,OAAO;AAAA,MACP,IAAI,YAAY,IAAI;AAAA,IACtB,CAAC;AAAA,IACD,OAAO,WAAW;AAAA;AAAA,EAiBZ,kBAAkB,CAAC,cAAiE;AAAA,IAC1F,IAAI,iBAAiB,KAAK;AAAA,MAAa,OAAO;AAAA,IAC9C,IAAI,CAAC,KAAK,aAAa,YAAY;AAAA,MAAG,OAAO;AAAA,IAC7C,IAAI,CAAC,KAAK,aAAa,IAAI,YAAY;AAAA,MAAG,OAAO;AAAA,IACjD,IAAI,KAAK,MAAM,IAAI,YAAY;AAAA,MAAG,OAAO;AAAA,IAKzC,IAAI,KAAK,eAAe;AAAA,MAAc,OAAO;AAAA,IAC7C;AAAA;AAAA,EAQM,0BAA0B,CAAC,cAA8C;AAAA,IAC/E,MAAM,SAAS,KAAK,4BAA4B,IAAI,YAAY;AAAA,IAChE,IAAI,QAAQ,WAAW;AAAA,MAAe,OAAO;AAAA,IAC7C,MAAM,SAAS,KAAK,mBAAmB,YAAY;AAAA,IACnD,OAAO;AAAA,MACL,UAAU,WAAW,YAAY,aAAa;AAAA,MAC9C;AAAA,MACA,OAAO;AAAA,MACP,IAAI,YAAY,IAAI;AAAA,IACtB;AAAA;AAAA,EAGF,SAAS,GAAkB;AAAA,IACzB,IAAI,KAAK;AAAA,MAAO,OAAO,QAAQ,QAAQ;AAAA,IACvC,OAAO,IAAI,QAAQ,CAAC,YAAY;AAAA,MAC9B,KAAK,gBAAgB;AAAA,KACtB;AAAA;AAAA,EAeH,OAAO,CAAC,QAAgB,cAAmC;AAAA,IACzD,KAAK,SAAS;AAAA,IACd,IAAI,iBAAiB,WAAW;AAAA,MAC9B,KAAK,eAAe;AAAA,IACtB;AAAA,IACA,KAAK,QAAQ;AAAA,IACb,KAAK,gBAAgB;AAAA,IACrB,KAAK,qBAAqB;AAAA,IAC1B,KAAK,kBAAkB;AAAA;AAAA,EAGzB,UAAU,GAAS;AAAA,IACjB,KAAK,oBAAoB;AAAA,IACzB,KAAK,iBAAiB;AAAA,IACtB,WAAW,QAAQ,KAAK,MAAM,OAAO,GAAG;AAAA,MACtC,KAAK,SAAS,MAAM;AAAA,MACpB,KAAK,WAAW,MAAM;AAAA,IACxB;AAAA,IACA,KAAK,MAAM,MAAM;AAAA,IACjB,KAAK,UAAU,MAAM;AAAA,IACrB,KAAK,QAAQ;AAAA,IACb,KAAK,KAAK,OAAO;AAAA;AAAA,EAgBX,oBAAoB,GAAS;AAAA,IACnC,IAAI,KAAK,kBAAkB;AAAA,MAAW;AAAA,IACtC,IAAI,KAAK,+BAA+B;AAAA,MAAG;AAAA,IAC3C,IAAI,KAAK,2BAA2B;AAAA,MAAW;AAAA,IAC/C,KAAK,yBAAyB,YAAY,MAAM;AAAA,MAC9C,KAAK,iBAAiB;AAAA,MACtB,KAAK,cAAc,YAAY,IAAI;AAAA,MACnC,IAAI;AAAA,QACF,KAAK,kBAAkB;AAAA,QACvB,MAAM;AAAA,OAMP,KAAK,2BAA2B;AAAA;AAAA,EAG7B,mBAAmB,GAAS;AAAA,IAClC,IAAI,KAAK,2BAA2B;AAAA,MAAW;AAAA,IAC/C,cAAc,KAAK,sBAAsB;AAAA,IACzC,KAAK,yBAAyB;AAAA;AAAA,EAQxB,kBAAkB,CAAC,QAAsB;AAAA,IAC/C,MAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAAA,IAClC,IAAI,CAAC;AAAA,MAAM;AAAA,IAQX,KAAK,MAAM,OAAO,MAAM;AAAA,IACxB,IAAI;AAAA,MACF,KAAK,SAAS,MAAM;AAAA,MACpB,MAAM;AAAA,IAKR,IAAI;AAAA,MACF,KAAK,WAAW,MAAM;AAAA,MACtB,MAAM;AAAA,IAGR,KAAK,KAAK,qBAAqB,EAAE,OAAoC,CAAC;AAAA;AAAA,EAuBhE,iBAAiB,GAAS;AAAA,IAChC,IAAI,KAAK,0BAA0B;AAAA,MAAG;AAAA,IACtC,IAAI,KAAK,sBAAsB;AAAA,MAAW;AAAA,IAC1C,KAAK,oBAAoB,YAAY,MAAM;AAAA,MACzC,IAAI;AAAA,QACF,KAAK,iBAAiB;AAAA,QACtB,MAAM;AAAA,OAKP,KAAK,sBAAsB;AAAA;AAAA,EAGxB,gBAAgB,GAAS;AAAA,IAC/B,IAAI,KAAK,sBAAsB;AAAA,MAAW;AAAA,IAC1C,cAAc,KAAK,iBAAiB;AAAA,IACpC,KAAK,oBAAoB;AAAA;AAAA,EAGnB,gBAAgB,GAAS;AAAA,IAC/B,MAAM,MAAM,YAAY,IAAI;AAAA,IAC5B,MAAM,UAAU,CAAC,GAAG,KAAK,MAAM,KAAK,CAAC;AAAA,IACrC,WAAW,UAAU,SAAS;AAAA,MAC5B,MAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAAA,MAClC,IAAI,CAAC;AAAA,QAAM;AAAA,MACX,MAAM,SAAS,KAAK,mBAAmB,MAAM,GAAG;AAAA,MAChD,IAAI,CAAC;AAAA,QAAQ;AAAA,MACb,KAAK,4BAA4B,IAAI,QAAQ;AAAA,QAC3C,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,IAAI;AAAA,MACN,CAAC;AAAA,MACD,KAAK,mBAAmB,MAAM;AAAA,IAChC;AAAA;AAAA,EAQM,kBAAkB,CAAC,MAAgB,KAAiC;AAAA,IAC1E,MAAM,QAAQ,KAAK,WAAW;AAAA,IAC9B,MAAM,QAAQ,MAAM,KAAK;AAAA,IACzB,IACE,KAAK,8BAA8B,MAClC,UAAU,SAAS,UAAU,iBAC9B,QAAQ,KAAK,6BACb;AAAA,MACA,OAAO,uCAAuC,gBAAgB,KAAK,MAAM,KAAK;AAAA,IAChF;AAAA,IACA,IACE,KAAK,oBAAoB,KACzB,UAAU,eACV,KAAK,SAAS,eAAe,QAC7B;AAAA,MACA,MAAM,cAAc,KAAK,iBAAiB,KAAK;AAAA,MAC/C,MAAM,SAAS,MAAM;AAAA,MACrB,IAAI,SAAS,KAAK,mBAAmB;AAAA,QACnC,OAAO,mCAAmC,KAAK,MAAM,MAAM;AAAA,MAC7D;AAAA,IACF;AAAA,IACA;AAAA;AAAA,EASF,IAAI,CAAC,SAAwB;AAAA,IAC3B,MAAM,WAAW,QAAQ;AAAA,IACzB,MAAM,QAAQ,KAAK,iBAAiB,OAAO;AAAA,IAC3C,IAAI,OAAO,KAAK,MAAM,IAAI,QAAQ;AAAA,IAClC,IAAI,CAAC,MAAM;AAAA,MACT,OAAO,KAAK,qBAAqB,QAAQ;AAAA,IAC3C;AAAA,IACA,IAAI,KAAK,yBAAyB,wBAAwB,WAAW;AAAA,MACnE,KAAK,yBAAyB,sBAAsB,YAAY,IAAI;AAAA,IACtE;AAAA,IASA,MAAM,aAAc,QAA+C;AAAA,IACnE,IAAI,OAAO,eAAe,UAAU;AAAA,MAClC,IAAI,cAAc,KAAK,QAAQ,IAAI,UAAU;AAAA,MAC7C,IAAI,CAAC,aAAa;AAAA,QAChB,cAAc,wBAAwB;AAAA,QACtC,KAAK,QAAQ,IAAI,YAAY,WAAW;AAAA,MAC1C;AAAA,MACA,YAAY,uBAAuB,YAAY,IAAI;AAAA,MACnD,YAAY,yBAAyB,MAAM;AAAA,MAC3C,YAAY,yBACV,OAAO,QAAQ,SAAS,WAAW,QAAQ,OAAO;AAAA,IACtD;AAAA,IACA,IAAI,KAAK,WAAW,KAAK,QAAQ,eAAe,QAAQ;AAAA,MACjD,KAAK,yBAAyB,KAAK,SAAS,KAAK;AAAA,IACxD,EAAO;AAAA,MACL,KAAK,aAAa,KAAK,KAAK;AAAA;AAAA;AAAA,SAWR,+BAA+B;AAAA,OAkBzC,yBAAwB,CACpC,SACA,OACe;AAAA,IACf,IAAI,MAAM,UAAU,yBAAyB;AAAA,MAC3C,QAAQ,KAAK,KAAK;AAAA,MAClB;AAAA,IACF;AAAA,IACA,MAAM,KAAK,OAAO,WAAW;AAAA,IAC7B,MAAM,YAAY,iBAAiB,OAAO,IAAI,KAAK,qBAAqB;AAAA,IACxE,IAAI,CAAC,KAAK,kBAAkB;AAAA,MAC1B,WAAW,YAAY,WAAW;AAAA,QAChC,QAAQ,KAAK,QAAQ;AAAA,MACvB;AAAA,MACA;AAAA,IACF;AAAA,IACA,IAAI,IAAI;AAAA,IACR,WAAW,YAAY,WAAW;AAAA,MAChC,QAAQ,KAAK,QAAQ;AAAA,MACrB,KAAK;AAAA,MACL,IAAI,IAAI,kBAAkB,iCAAiC,KAAK,IAAI,UAAU,QAAQ;AAAA,QACpF,MAAM,IAAI,QAAc,CAAC,YAAY;AAAA,UACnC,WAAW,SAAS,CAAC;AAAA,SACtB;AAAA,MACH;AAAA,IACF;AAAA;AAAA,EAWF,YAAY,CAAC,YAAoB,YAA2B;AAAA,IAC1D,MAAM,UAAU;AAAA,IAChB,IAAI,CAAC,WAAW,OAAO,YAAY,YAAY,EAAE,UAAU,UAAU;AAAA,MACnE;AAAA,IACF;AAAA,IACA,QAAQ,QAAQ;AAAA,WACT;AAAA,QACE,KAAK,YAAY,YAAY,QAAQ,GAAG;AAAA,QAC7C;AAAA,WACG;AAAA,QACE,KAAK,aAAa,YAAY,QAAQ,GAAG;AAAA,QAC9C;AAAA,WACG;AAAA,QACE,KAAK,mBAAmB,YAAY,QAAQ,SAAS;AAAA,QAC1D;AAAA;AAAA;AAAA,EAOE,qBAAqB,GAAqB;AAAA,IAChD,MAAM,SAA2B,EAAE,YAAY,KAAK,WAAW;AAAA,IAC/D,IAAI,KAAK,uBAAuB,WAAW;AAAA,MACzC,OAAO,qBAAqB,KAAK;AAAA,IACnC;AAAA,IACA,OAAO;AAAA;AAAA,EAkBD,oBAAoB,CAAC,MAAoC;AAAA,IAC/D,MAAM,eAAe,KAAK,aAAa;AAAA,IACvC,MAAM,IAAI,aAAa,MAAM,gBAAgB;AAAA,IAC7C,OAAO,IAAI,IAAI,YAAY,MAAM;AAAA;AAAA,EAG3B,mBAAmB,CAAC,WAAqC;AAAA,IAC/D,IAAI,CAAC,KAAK;AAAA,MAAqB,OAAO;AAAA,IACtC,IAAI,KAAK,uBAAuB;AAAA,MAAS,OAAO;AAAA,IAChD,MAAM,QAAS,UAA2C;AAAA,IAC1D,MAAM,QAAQ,UAAU,UAAU,MAAM,gBAAgB;AAAA,IACxD,MAAM,iBAAiB,SAAS,QAAQ,MAAM,IAAI,YAAY;AAAA,IAC9D,OAAO,kBAAkB;AAAA;AAAA,EAWnB,2BAA2B,CAAC,KAA6C;AAAA,IAC/E,IAAI,CAAC,KAAK;AAAA,MAAqB,OAAO;AAAA,IACtC,IAAI,KAAK,uBAAuB;AAAA,MAAS,OAAO;AAAA,IAChD,IAAI,CAAC;AAAA,MAAK,OAAO;AAAA,IACjB,MAAM,QAAQ,IAAI,MAAM,OAAO;AAAA,IAC/B,MAAM,WAAqB,CAAC;AAAA,IAC5B,WAAW,QAAQ,OAAO;AAAA,MACxB,IAAI,CAAC,KAAK,WAAW,cAAc,GAAG;AAAA,QACpC,SAAS,KAAK,IAAI;AAAA,QAClB;AAAA,MACF;AAAA,MACA,MAAM,IAAI,KAAK,MAAM,gBAAgB;AAAA,MACrC,IAAI,IAAI,IAAI,YAAY,MAAM;AAAA,QAAS,SAAS,KAAK,IAAI;AAAA,IAC3D;AAAA,IACA,OAAO,SAAS,KAAK;AAAA,CAAM;AAAA;AAAA,EAUrB,oBAAoB,CAAC,aAAmE;AAAA,IAC9F,IAAI,CAAC,KAAK;AAAA,MAAqB,OAAO;AAAA,IACtC,IAAI,KAAK,uBAAuB;AAAA,MAAS,OAAO;AAAA,IAChD,MAAM,WAAW,KAAK,4BAA4B,YAAY,GAAG;AAAA,IACjE,IAAI,aAAa,YAAY;AAAA,MAAK,OAAO;AAAA,IACzC,OAAO,KAAK,aAAa,KAAK,SAAS;AAAA;AAAA,EAGjC,oBAAoB,CAAC,UAA4B;AAAA,IACvD,MAAM,aAAa,IAAI,KAAK,sBAAsB,KAAK,sBAAsB,CAAC;AAAA,IAC9E,MAAM,UAAU,WAAW,kBAAkB,KAAK,kBAAkB,EAAE,SAAS,KAAK,CAAC;AAAA,IACrF,MAAM,OAAiB;AAAA,MACrB;AAAA,MACA;AAAA,MACA,cAAc,CAAC;AAAA,MACf,kBAAkB,IAAI;AAAA,MACtB,kBAAkB,CAAC;AAAA,MACnB,cAAc;AAAA,MACd,WAAW;AAAA,MACX,sBAAsB;AAAA,MACtB,0BAA0B,0BAA0B;AAAA,MACpD,SAAS,IAAI;AAAA,MACb,WAAW,YAAY,IAAI;AAAA,MAC3B,eAAe;AAAA,IACjB;AAAA,IACA,KAAK,MAAM,IAAI,UAAU,IAAI;AAAA,IAC7B,KAAK,eAAe,UAAU,UAAU;AAAA,IACxC,KAAK,gBAAgB,UAAU,OAAO;AAAA,IAOtC,KAAK,cAAc,UAAU,UAAU,EAAE,MAAM,CAAC,QAAQ;AAAA,MACtD,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MAC/D,KAAK,4BAA4B,IAAI,UAAU;AAAA,QAC7C,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,IAAI,YAAY,IAAI;AAAA,MACtB,CAAC;AAAA,MACD,KAAK,mBAAmB,QAAQ;AAAA,KACjC;AAAA,IACD,OAAO;AAAA;AAAA,OAGK,cAAa,CAAC,UAAkB,YAA8C;AAAA,IAC1F,MAAM,QAAQ,MAAM,WAAW,YAAY;AAAA,IAC3C,MAAM,WAAW,oBAAoB,KAAK;AAAA,IAC1C,MAAM,aAAa,WAAW,oBAAoB;AAAA,IAClD,MAAM,YAAY,KAAK,qBAAqB;AAAA,MAC1C,MAAM,WAAW;AAAA,MACjB,KAAK,WAAW,OAAO,MAAM;AAAA,IAC/B,CAAC;AAAA,IACD,KAAK,UAAU,WAAW,UAAU;AAAA,MAClC,MAAM;AAAA,MACN,KAAK;AAAA,IACP,CAA4B;AAAA;AAAA,OAGhB,YAAW,CAAC,YAAoB,KAA+C;AAAA,IAC3F,MAAM,WAAW,KAAK,MAAM,IAAI,UAAU;AAAA,IAC1C,IAAI,UAAU;AAAA,MAKZ,MAAM,UAAU,KAAK;AAAA,MACrB,IAAI,UAAU,YAAY;AAAA,QACxB;AAAA,MACF;AAAA,MACA,SAAS,SAAS,MAAM;AAAA,MACxB,SAAS,WAAW,MAAM;AAAA,MAC1B,KAAK,MAAM,OAAO,UAAU;AAAA,IAC9B;AAAA,IAEA,MAAM,aAAa,IAAI,KAAK,sBAAsB,KAAK,sBAAsB,CAAC;AAAA,IAC9E,MAAM,OAAiB;AAAA,MACrB;AAAA,MACA,SAAS;AAAA,MACT,cAAc,CAAC;AAAA,MACf,kBAAkB,IAAI;AAAA,MACtB,kBAAkB,CAAC;AAAA,MACnB,cAAc;AAAA,MACd,WAAW;AAAA,MACX,sBAAsB;AAAA,MACtB,0BAA0B,0BAA0B;AAAA,MACpD,SAAS,IAAI;AAAA,MACb,WAAW,YAAY,IAAI;AAAA,MAC3B,eAAe;AAAA,IACjB;AAAA,IACA,KAAK,MAAM,IAAI,YAAY,IAAI;AAAA,IAC/B,KAAK,eAAe,YAAY,UAAU;AAAA,IAC1C,WAAW,gBAAgB,CAAC,UAAU;AAAA,MACpC,KAAK,UAAU,MAAM;AAAA,MACrB,KAAK,gBAAgB,YAAY,MAAM,OAAO;AAAA;AAAA,IAEhD,MAAM,WAAW,qBAAqB,KAAK,qBAAqB,GAAG,CAAC;AAAA,IACpE,MAAM,KAAK,sBAAsB,IAAI;AAAA,IACrC,MAAM,SAAS,MAAM,WAAW,aAAa;AAAA,IAC7C,MAAM,WAAW,oBAAoB,MAAM;AAAA,IAC3C,MAAM,cAAc,WAAW,oBAAoB;AAAA,IACnD,MAAM,YAAY,KAAK,qBAAqB;AAAA,MAC1C,MAAM,YAAY;AAAA,MAClB,KAAK,YAAY,OAAO,OAAO;AAAA,IACjC,CAAC;AAAA,IACD,KAAK,UAAU,WAAW,YAAY;AAAA,MACpC,MAAM;AAAA,MACN,KAAK;AAAA,IACP,CAA4B;AAAA;AAAA,OAGhB,aAAY,CAAC,YAAoB,KAA+C;AAAA,IAC5F,MAAM,OAAO,KAAK,MAAM,IAAI,UAAU;AAAA,IACtC,IAAI,CAAC;AAAA,MAAM;AAAA,IAOX,IAAI,KAAK,WAAW,mBAAmB;AAAA,MAAoB;AAAA,IAC3D,MAAM,KAAK,WAAW,qBAAqB,KAAK,qBAAqB,GAAG,CAAC;AAAA,IACzE,MAAM,KAAK,sBAAsB,IAAI;AAAA;AAAA,OAGzB,mBAAkB,CAC9B,YACA,WACe;AAAA,IACf,MAAM,OAAO,KAAK,MAAM,IAAI,UAAU;AAAA,IACtC,IAAI,CAAC;AAAA,MAAM;AAAA,IAMX,IACE,KAAK,uBACL,KAAK,uBAAuB,WAC5B,CAAC,KAAK,qBAAqB,SAAS;AAAA,MAEpC;AAAA,IAOF,IAAI,KAAK,WAAW,sBAAsB,MAAM;AAAA,MAC9C,KAAK,iBAAiB,KAAK,SAAS;AAAA,MACpC;AAAA,IACF;AAAA,IACA,IAAI;AAAA,MACF,MAAM,KAAK,WAAW,gBAAgB,SAAS;AAAA,MAC/C,MAAM;AAAA;AAAA,OAUI,sBAAqB,CAAC,MAA+B;AAAA,IACjE,IAAI,KAAK,iBAAiB,WAAW;AAAA,MAAG;AAAA,IACxC,MAAM,SAAS,KAAK;AAAA,IACpB,KAAK,mBAAmB,CAAC;AAAA,IACzB,WAAW,aAAa,QAAQ;AAAA,MAC9B,IAAI;AAAA,QACF,MAAM,KAAK,WAAW,gBAAgB,SAAS;AAAA,QAC/C,MAAM;AAAA,IAGV;AAAA;AAAA,EAGM,cAAc,CAAC,QAAgB,YAAqC;AAAA,IAC1E,WAAW,iBAAiB,CAAC,UAAU;AAAA,MACrC,IAAI,CAAC,MAAM;AAAA,QAAW;AAAA,MACtB,IAAI,CAAC,KAAK,oBAAoB,MAAM,SAAS;AAAA,QAAG;AAAA,MAChD,KAAK,UAAU,WAAW,QAAQ;AAAA,QAChC,MAAM;AAAA,QACN,WAAW,MAAM,UAAU,OAAO;AAAA,MACpC,CAA4B;AAAA;AAAA,IAE9B,WAAW,0BAA0B,MAAM;AAAA,MACzC,MAAM,QAAQ,WAAW;AAAA,MACzB,IAAI,UAAU,aAAa;AAAA,QACzB,KAAK,sBAAsB,MAAM;AAAA,MACnC,EAAO,SAAI,UAAU,kBAAkB,UAAU,YAAY,UAAU,UAAU;AAAA,QAM/E,IAAI,CAAC,KAAK,MAAM,IAAI,MAAM;AAAA,UAAG;AAAA,QAC7B,KAAK,MAAM,OAAO,MAAM;AAAA,QACxB,KAAK,KAAK,qBAAqB,EAAE,OAAoC,CAAC;AAAA,MACxE;AAAA;AAAA;AAAA,EAgBI,qBAAqB,CAAC,QAAsB;AAAA,IAClD,MAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAAA,IAClC,IAAI,CAAC;AAAA,MAAM;AAAA,IACX,IAAI,KAAK,yBAAyB,2BAA2B;AAAA,MAAW;AAAA,IACxE,KAAK,yBAAyB,yBAAyB,YAAY,IAAI;AAAA,IACvE,KAAK,KAAK,kBAAkB;AAAA,MAC1B;AAAA,MACA,cAAc,CAAC;AAAA,IACjB,CAAC;AAAA;AAAA,EAGK,eAAe,CAAC,QAAgB,SAA+B;AAAA,IACrE,QAAQ,SAAS,MAAM;AAAA,MACrB,MAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAAA,MAClC,IAAI,CAAC;AAAA,QAAM;AAAA,MACX,KAAK,yBAAyB,sBAAsB,YAAY,IAAI;AAAA,MAQpE,KAAK,sBAAsB,MAAM;AAAA,MAIjC,WAAW,SAAS,KAAK,cAAc;AAAA,QAChC,KAAK,yBAAyB,SAAS,KAAK;AAAA,MACnD;AAAA,MACA,KAAK,eAAe,CAAC;AAAA;AAAA,IAEvB,QAAQ,YAAY,CAAC,UAAU;AAAA,MAS7B,MAAM,WAAW,KAAK,MAAM,IAAI,MAAM;AAAA,MACtC,IAAI;AAAA,QAAU,SAAS,gBAAgB,YAAY,IAAI;AAAA,MACvD,MAAM,OAAO,MAAM;AAAA,MACnB,IAAI,gBAAgB,aAAa;AAAA,QAC/B,KAAK,gBAAgB,QAAQ,IAAI,WAAW,IAAI,CAAC;AAAA,MACnD,EAAO,SAAI,gBAAgB,YAAY;AAAA,QACrC,KAAK,gBAAgB,QAAQ,IAAI;AAAA,MACnC;AAAA;AAAA,IAIF,QAAQ,UAAU,MAAM;AAAA,MACtB,MAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAAA,MAClC,IAAI,MAAM,YAAY,SAAS;AAAA,QAC7B,KAAK,UAAU;AAAA,MACjB;AAAA;AAAA,IAOF,QAAQ,UAAU,CAAC,UAAU;AAAA,MAC3B,MAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAAA,MAClC,IAAI,CAAC;AAAA,QAAM;AAAA,MACX,MAAM,KAAK;AAAA,MACX,MAAM,UACJ,OAAO,GAAG,OAAO,YAAY,WACzB,GAAG,MAAM,UACT,OAAO,GAAG,YAAY,WACpB,GAAG,UACH;AAAA,MACR,KAAK,uBAAuB;AAAA;AAAA;AAAA,OAa1B,sBAAqB,CAAC,QAAwD;AAAA,IAClF,MAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAAA,IAClC,IAAI,CAAC;AAAA,MAAM;AAAA,IACX,MAAM,WAAW,MAAM,yBAAyB,KAAK,YAAY,KAAK,oBAAoB;AAAA,IAC1F,KAAK,YAAY;AAAA,IACjB,OAAO;AAAA;AAAA,OAOH,yBAAwB,GAA4C;AAAA,IACxE,MAAM,MAAM,IAAI;AAAA,IAChB,MAAM,UAAU,CAAC,GAAG,KAAK,MAAM,KAAK,CAAC;AAAA,IACrC,MAAM,UAAU,MAAM,QAAQ,IAAI,QAAQ,IAAI,CAAC,OAAO,KAAK,sBAAsB,EAAE,CAAC,CAAC;AAAA,IACrF,SAAS,IAAI,EAAG,IAAI,QAAQ,QAAQ,KAAK,GAAG;AAAA,MAC1C,MAAM,IAAI,QAAQ;AAAA,MAClB,MAAM,KAAK,QAAQ;AAAA,MACnB,IAAI,KAAK,OAAO;AAAA,QAAW,IAAI,IAAI,IAAI,CAAC;AAAA,IAC1C;AAAA,IACA,OAAO;AAAA;AAAA,EAGD,eAAe,CAAC,YAAoB,OAAyB;AAAA,IACnE,IAAI;AAAA,MAMF,IAAI,mBAAmB,KAAK,GAAG;AAAA,QAC7B,KAAK,mBAAmB,YAAY,KAAK;AAAA,QACzC;AAAA,MACF;AAAA,MAIA,IAAI,KAAK,iBAAiB,kBAAkB,KAAK,GAAG;AAAA,QAClD,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,QAC1E,MAAM,YAAY,KAAK,UAAU,GAAG,KAAK;AAAA,QACzC,MAAM,SAAS,KAAK,MAClB,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,CAC3D;AAAA,QACA,MAAM,OAAO,MAAM,SAAS,IAAI,SAAS;AAAA,QACzC,KAAK,cAAc,YAAY,QAAQ,IAAI;AAAA,QAC3C;AAAA,MACF;AAAA,MACA,MAAM,UAAU,KAAK,mBAAmB,KAAK;AAAA,MAC7C,KAAK,oBAAoB,YAAY,SAAS,KAAK;AAAA,MACnD,MAAM;AAAA;AAAA,EAqBF,mBAAmB,CACzB,YACA,SACA,iBACM;AAAA,IACN,KAAK,yBAAyB,UAAU;AAAA,IACxC,KAAK,mBAAmB,YAAY,OAAO;AAAA,IAC3C,IAAI,CAAC,KAAK,kBAAkB;AAAA,MAC1B,KAAK,KAAK,WAAW,OAAO;AAAA,MAC5B,IAAI,iBAAiB;AAAA,QACnB,KAAK,wBAAwB,UAAU;AAAA,MACzC;AAAA,MACA;AAAA,IACF;AAAA,IACA,IAAI,iBAAiB;AAAA,MACnB,MAAM,OAAO,KAAK,MAAM,IAAI,UAAU;AAAA,MACtC,IAAI,MAAM,cAAc;AAAA,QACtB,KAAK,aAAa,gBAAgB;AAAA,MACpC;AAAA,IACF;AAAA,IACA,WAAW,MAAM;AAAA,MACf,IAAI;AAAA,QACF,KAAK,KAAK,WAAW,OAAO;AAAA,gBAC5B;AAAA,QACA,IAAI,iBAAiB;AAAA,UACnB,KAAK,wBAAwB,UAAU;AAAA,QACzC;AAAA;AAAA,OAED,CAAC;AAAA;AAAA,EAOE,wBAAwB,CAAC,YAA0B;AAAA,IACzD,MAAM,OAAO,KAAK,MAAM,IAAI,UAAU;AAAA,IACtC,IAAI,CAAC;AAAA,MAAM;AAAA,IACX,IAAI,KAAK,yBAAyB,0BAA0B;AAAA,MAAW;AAAA,IACvE,KAAK,yBAAyB,wBAAwB,YAAY,IAAI;AAAA;AAAA,EAMhE,kBAAkB,CAAC,YAAoB,SAAwB;AAAA,IACrE,MAAM,aAAc,QAA+C;AAAA,IACnE,IAAI,OAAO,eAAe;AAAA,MAAU;AAAA,IACpC,MAAM,OAAO,KAAK,MAAM,IAAI,UAAU;AAAA,IACtC,IAAI,CAAC;AAAA,MAAM;AAAA,IACX,IAAI,QAAQ,KAAK,QAAQ,IAAI,UAAU;AAAA,IACvC,IAAI,CAAC,OAAO;AAAA,MACV,QAAQ,wBAAwB;AAAA,MAChC,KAAK,QAAQ,IAAI,YAAY,KAAK;AAAA,IACpC;AAAA,IACA,MAAM,sBAAsB,YAAY,IAAI;AAAA;AAAA,EAGtC,uBAAuB,CAAC,YAA0B;AAAA,IACxD,MAAM,OAAO,KAAK,MAAM,IAAI,UAAU;AAAA,IACtC,IAAI,CAAC,MAAM;AAAA,MAAc;AAAA,IACzB,KAAK,aAAa,eAAe,KAAK,IAAI,GAAG,KAAK,aAAa,eAAe,CAAC;AAAA,IAC/E,KAAK,iBAAiB,YAAY,oBAAoB,CAAC;AAAA,IACvD,IAAI,KAAK,aAAa,iBAAiB,KAAK,KAAK,iBAAiB,SAAS,GAAG;AAAA,MAC5E,KAAK,eAAe;AAAA,IACtB;AAAA;AAAA,EAGM,gBAAgB,CACtB,YACA,MACA,YACM;AAAA,IACN,MAAM,OAAO,KAAK,MAAM,IAAI,UAAU;AAAA,IACtC,MAAM,eAAe,MAAM;AAAA,IAMzB,KAGA,KAAK,iBAAiB;AAAA,MACtB,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA,gBAAgB,cAAc,kBAAkB;AAAA,MAChD,eAAe,cAAc,iBAAiB;AAAA,MAC9C,cAAc,cAAc,gBAAgB;AAAA,MAC5C,IAAI,YAAY,IAAI;AAAA,IACtB,CAAC;AAAA;AAAA,EAGK,kBAAkB,CAAC,YAAoB,OAAyB;AAAA,IACtE,MAAM,SAAS,kBAAkB,KAAK;AAAA,IACtC,IAAI,CAAC;AAAA,MAAQ;AAAA,IACb,MAAM,OAAO,KAAK,MAAM,IAAI,UAAU;AAAA,IACtC,IAAI,CAAC;AAAA,MAAM;AAAA,IACX,QAAQ,QAAQ,SAAS;AAAA,IACzB,IAAI,QAAQ,KAAK,iBAAiB,IAAI,OAAO,EAAE;AAAA,IAC/C,IAAI,CAAC,OAAO;AAAA,MACV,QAAQ,EAAE,QAAQ,IAAI,KAAO,OAAO,OAAO,MAAM;AAAA,MACjD,KAAK,iBAAiB,IAAI,OAAO,IAAI,KAAK;AAAA,IAC5C;AAAA,IAIA,MAAM,OAAO,IAAI,OAAO,OAAO,KAAK,MAAM,CAAC;AAAA,IAC3C,IAAI,CAAC,KAAK,cAAc;AAAA,MACtB,KAAK,eAAe;AAAA,QAClB,gBAAgB;AAAA,QAChB,eAAe;AAAA,QACf,aAAa,YAAY,IAAI;AAAA,QAC7B,cAAc;AAAA,MAChB;AAAA,IACF;AAAA,IACA,KAAK,aAAa,kBAAkB;AAAA,IACpC,KAAK,aAAa,iBAAiB,KAAK;AAAA,IACxC,KAAK,aAAa,cAAc,YAAY,IAAI;AAAA,IAChD,KAAK,iBAAiB,YAAY,qBAAqB,KAAK,UAAU;AAAA,IACtE,IAAI,MAAM,OAAO,OAAO,MAAM;AAAA,MAAO;AAAA,IACrC,KAAK,iBAAiB,OAAO,OAAO,EAAE;AAAA,IACtC,MAAM,cAAc,wBAAwB,MAAM,QAAQ,MAAM,KAAK;AAAA,IACrE,IAAI,CAAC,KAAK,kBAAkB;AAAA,MAC1B,KAAK,oBAAoB,YAAY,WAAW;AAAA,MAChD;AAAA,IACF;AAAA,IACA,WAAW,MAAM;AAAA,MACf,KAAK,oBAAoB,YAAY,WAAW;AAAA,OAC/C,CAAC;AAAA;AAAA,EASE,mBAAmB,CAAC,YAAoB,OAAyB;AAAA,IACvE,IAAI;AAAA,MACF,IAAI,KAAK,iBAAiB,kBAAkB,KAAK,GAAG;AAAA,QAClD,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,QAC1E,MAAM,YAAY,KAAK,UAAU,GAAG,KAAK;AAAA,QACzC,MAAM,SAAS,KAAK,MAClB,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,CAC3D;AAAA,QACA,MAAM,OAAO,MAAM,SAAS,IAAI,SAAS;AAAA,QACzC,KAAK,cAAc,YAAY,QAAQ,IAAI;AAAA,QAC3C,KAAK,wBAAwB,UAAU;AAAA,QACvC;AAAA,MACF;AAAA,MACA,MAAM,UAAU,KAAK,mBAAmB,KAAK;AAAA,MAC7C,KAAK,oBAAoB,YAAY,SAAS,IAAI;AAAA,MAClD,MAAM;AAAA,MAGN,KAAK,wBAAwB,UAAU;AAAA;AAAA;AAAA,MAKvC,gBAAgB,GAAa;AAAA,IAC/B,MAAM,MAAgB,CAAC;AAAA,IACvB,YAAY,QAAQ,SAAS,KAAK,OAAO;AAAA,MACvC,IAAI,KAAK,WAAW,KAAK,QAAQ,eAAe,QAAQ;AAAA,QACtD,IAAI,KAAK,MAAM;AAAA,MACjB;AAAA,IACF;AAAA,IACA,OAAO;AAAA;AAAA,EAMT,eAAe,CAAC,QAAgB,OAAyC;AAAA,IACvE,MAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAAA,IAClC,IAAI,CAAC,MAAM,WAAW,KAAK,QAAQ,eAAe;AAAA,MAAQ,OAAO;AAAA,IACjE,OAAO,KAAK,iBAAiB,KAAK,SAAS,KAAK;AAAA;AAAA,EAK1C,gBAAgB,CAAC,SAAyB,OAAyC;AAAA,IAEzF,IAAI,QAAQ,iBAAiB,MAAM;AAAA,MAAM,OAAO;AAAA,IAChD,QAAQ,KAAK,KAAK;AAAA,IAClB,OAAO;AAAA;AAAA,EASD,gBAAgB,CAAC,SAA2C;AAAA,IAClE,MAAM,YAAqC;AAAA,MACzC,MAAM,QAAQ;AAAA,MACd,UAAU,QAAQ;AAAA,MAClB,UAAU,QAAQ;AAAA,IACpB;AAAA,IACA,IAAI,gBAAgB,WAAW,QAAQ,eAAe,WAAW;AAAA,MAC/D,UAAU,gBAAgB,QAAQ;AAAA,IACpC;AAAA,IACA,MAAM,cAAc,IAAI,YAAY,EAAE,OAAO,KAAK,UAAU,SAAS,CAAC;AAAA,IACtE,MAAM,YACJ,UAAU,WAAW,QAAQ,gBAAgB,aAAa,QAAQ,OAAO,IAAI,WAAW,CAAC;AAAA,IAC3F,MAAM,OAAO,IAAI,YAAY,SAAS,UAAU;AAAA,IAChD,MAAM,SAAS,IAAI,YAAY,IAAI;AAAA,IACnC,MAAM,MAAM,IAAI,WAAW,MAAM;AAAA,IACjC,MAAM,OAAO,IAAI,SAAS,MAAM;AAAA,IAChC,KAAK,UAAU,GAAG,YAAY,QAAQ,KAAK;AAAA,IAC3C,IAAI,IAAI,aAAa,CAAC;AAAA,IACtB,IAAI,IAAI,WAAW,IAAI,YAAY,MAAM;AAAA,IACzC,OAAO;AAAA;AAAA,EAID,kBAAkB,CAAC,OAA4B;AAAA,IACrD,IAAI,MAAM,SAAS,GAAG;AAAA,MACpB,MAAM,IAAI,MAAM,sDAAsD;AAAA,IACxE;AAAA,IACA,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,IAC1E,MAAM,YAAY,KAAK,UAAU,GAAG,KAAK;AAAA,IACzC,IAAI,MAAM,SAAS,IAAI,WAAW;AAAA,MAChC,MAAM,IAAI,MAAM,8CAA8C;AAAA,IAChE;AAAA,IACA,MAAM,SAAS,KAAK,MAAM,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,CAAC;AAAA,IACpF,MAAM,OAAO,MAAM,MAAM,IAAI,SAAS;AAAA,IACtC,OAAO,KAAK,QAAQ,KAAK;AAAA;AAE7B;;;AVn9DA,eAAsB,iBAAiB,CACrC,KACqC;AAAA,EACrC,IAAI,KAAK,uBAAuB;AAAA,IAC9B,OAAO,IAAI,sBAAsB;AAAA,EACnC;AAAA,EACA,OAAO,KAAK;AAAA;AAOd,SAAS,gBAAgB,CACvB,OACA,MAQA,eAC0B;AAAA,EAC1B,OAAO;AAAA,IACL;AAAA,IACA,iBAAiB,MAAM,yBAAyB;AAAA,IAChD,sBAAsB,MAAM;AAAA,IAC5B,qBAAqB,MAAM;AAAA,IAC3B,wBAAwB,MAAM;AAAA,IAC9B,wBAAwB,MAAM;AAAA,IAC9B,uBAAuB,cAAc;AAAA,IACrC,0BAA0B,cAAc;AAAA,IACxC,oBAAoB,cAAc;AAAA,EACpC;AAAA;AAgDF,IAAM,kBAAsC;AAAA,EAC1C,uBAAuB;AAAA,EACvB,0BAA0B;AAAA,EAC1B,oBAAoB;AACtB;AAsBA,SAAS,yBAAyB,CAAC,MAAgD;AAAA,EACjF,MAAM,OAAQ,KAA8D;AAAA,EAC5E,OAAO,QAAQ,OAAO,SAAS,WAAW,OAAO;AAAA;AAInD,SAAS,aAAa,CACpB,cACA,OACA,QACoB;AAAA,EACpB,MAAM,UAAU,cAAc,mBAAmB;AAAA,EACjD,IAAI,CAAC;AAAA,IAAS,OAAO;AAAA,EACrB,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,YAAY,OAAO,QAAQ,YAAY,aAAa,QAAQ,QAAQ,MAAM,IAAI;AAAA,IAC9E,MAAM;AAAA,IACN,YAAY;AAAA;AAAA,EAEd,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,MAAM,SAAS,QAAQ;AAAA,IACvB,SAAS,UAAU,OAAO,WAAW,WAAW,OAAO,UAAU;AAAA,IACjE,MAAM;AAAA,IACN,SAAS;AAAA;AAAA,EAEX,OAAO;AAAA,IACL,uBAAuB;AAAA,IACvB,0BAA0B;AAAA,IAC1B,oBAAoB;AAAA,EACtB;AAAA;AAQF,SAAS,oBAAoB,CAAC,QAAgD;AAAA,EAC5E,IAAI,WAAW;AAAA,IAAW,OAAO;AAAA,EACjC,OAAO,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ,OAAO,OAAO,SAAS,SAAS;AAAA;AAO3F,SAAS,cAAc,CACrB,MACA,gBACA,aACA,cAC8C;AAAA,EAC9C,IAAI,CAAC,KAAK,MAAM;AAAA,IACd,OAAO,KAAK,MAAM,MAAM,UAAU;AAAA,EACpC;AAAA,EACA,MAAM,eAAe,KAAK;AAAA,EAC1B,MAAM,WAAqD,CAAC;AAAA,EAC5D,WAAW,SAAS,gBAAgB;AAAA,IAClC,SAAS,SAAS,iBAChB,qBAAqB,YAAY,MAAM,GACvC,KAAK,KAAK,QAAQ,QAClB,cAAc,cAAc,OAAO,YAAY,CACjD;AAAA,EACF;AAAA,EACA,WAAW,SAAS,OAAO,KAAK,KAAK,KAAK,OAAO,GAAG;AAAA,IAClD,IAAI,SAAS;AAAA,MAAQ;AAAA,IACrB,SAAS,SAAS,iBAChB,WACA,KAAK,KAAK,QAAQ,QAClB,cAAc,cAAc,OAAO,YAAY,CACjD;AAAA,EACF;AAAA,EACA,OAAO,KAAK,MAAM,MAAM,KAAK,KAAK,MAAM,SAAS,SAAS,EAAE;AAAA;AAS9D,SAAS,0BAA0B,CAAC,MAA+C;AAAA,EACjF,MAAM,OACJ,KAGA;AAAA,EACF,MAAM,KAAK,MAAM;AAAA,EACjB,IAAI,OAAO,OAAO,cAAc,SAAS;AAAA,IAAW;AAAA,EACpD,OAAO,MAAM,GAAG,KAAK,IAAI;AAAA;AAO3B,SAAS,+BAA+B,GAA+B;AAAA,EACrE,MAAM,gBAAe,gBAAgB;AAAA,EACrC,OAAO;AAAA,IACL,UAAU,qBAAqB;AAAA,IAC/B,YAAY,sBAAsB;AAAA,IAClC,0BAA0B,4BAA4B;AAAA,IACtD,aAAa,qBAAqB;AAAA,IAClC,iBAAiB,mBAAmB;AAAA,IACpC,iBAAiB,mBAAmB;AAAA,IACpC,qBAAqB,uBAAuB;AAAA,IAC5C,kBAAkB,oBAAoB;AAAA,IACtC;AAAA,IACA,4BAA4B,+BAA+B,aAAY;AAAA,EACzE;AAAA;AA4BF,SAAS,8BAA8B,CACrC,SACsC;AAAA,EACtC,MAAM,UAAU,IAAI;AAAA,EACpB,WAAW,UAAU,SAAS;AAAA,IAC5B,IAAI,QAAQ,QAAQ,IAAI,OAAO,KAAK;AAAA,IACpC,IAAI,CAAC,OAAO;AAAA,MACV,QAAQ,EAAE,MAAM,IAAI,KAAO,OAAO,EAAE;AAAA,MACpC,QAAQ,IAAI,OAAO,OAAO,KAAK;AAAA,IACjC;AAAA,IACA,MAAM,KAAK,IAAI,OAAO,GAAG;AAAA,IACzB,MAAM;AAAA,EACR;AAAA,EACA,MAAM,aAAmD,CAAC;AAAA,EAC1D,YAAY,OAAO,UAAU,SAAS;AAAA,IACpC,IAAI,MAAM,QAAQ,GAAG;AAAA,MACnB,WAAW,KAAK,EAAE,OAAO,MAAM,CAAC,GAAG,MAAM,IAAI,GAAG,aAAa,MAAM,MAAM,CAAC;AAAA,IAC5E;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAMT,SAAS,+BAA+B,CAAC,gBAAoC,MAAkB;AAAA,EAC7F,MAAM,UAAU,OAAO,YAAY,eAAe,QAAQ,MAAM,6BAA6B;AAAA,EAC7F,IAAI;AAAA,IAAS;AAAA,EACb,MAAM,aAAa,2BAA2B,IAAI;AAAA,EAClD,IAAI,CAAC;AAAA,IAAY;AAAA,EACjB,eAAe,GAAG,kBAAkB,MAAM;AAAA,IACnC,WAAW,EAAE,MAAM,MAAM,EAI7B;AAAA,GACF;AAAA;AA0QH,eAAsB,gBAAgB,CAAC,SAAuD;AAAA,EAC5F,MAAM,gBAAgB,MAAM,qBAAqB,QAAQ,OAAO;AAAA,EAChE,MAAM,UAAU,cAAc;AAAA,EAC9B,MAAM,oBAAoB,QAAQ,qBAAqB;AAAA,EAKvD,IAAI,qBAAqB,CAAC,QAAQ,aAAa,IAAI,mBAAmB,GAAG;AAAA,IACvE,MAAM,IAAI,MACR,oFAAoF,2GACtF;AAAA,EACF;AAAA,EAaA,MAAM,eAAe,CAAC,GAAG,QAAQ,WAAW,KAAK,CAAC,EAAE,OAClD,CAAC,OAAO,OAAO,QAAQ,UAAU,MACnC;AAAA,EAMA,MAAM,qBAAqB,MAAM,kBAAkB,QAAQ,GAAG;AAAA,EAE9D,MAAM,uBAAiD;AAAA,IACrD,WAAW;AAAA,IACX,QAAQ,QAAQ,UAAU;AAAA,IAC1B;AAAA,IACA;AAAA,OACI,uBAAuB,aAAa,EAAE,YAAY,mBAAmB;AAAA,OACrE,QAAQ,KAAK,uBAAuB,aAAa;AAAA,MACnD,oBAAoB,QAAQ,IAAI;AAAA,IAClC;AAAA,OACI,QAAQ,KAAK,wBAAwB,aAAa;AAAA,MACpD,qBAAqB,QAAQ,IAAI;AAAA,IACnC;AAAA,OACI,QAAQ,KAAK,qBAAqB,aAAa;AAAA,MACjD,kBAAkB,QAAQ,IAAI;AAAA,IAChC;AAAA,OACI,QAAQ,KAAK,sBAAsB,aAAa;AAAA,MAClD,mBAAmB,QAAQ,IAAI;AAAA,IACjC;AAAA,OACI,QAAQ,KAAK,gCAAgC,aAAa;AAAA,MAC5D,6BAA6B,QAAQ,IAAI;AAAA,IAC3C;AAAA,OACI,QAAQ,KAAK,qBAAqB,aAAa;AAAA,MACjD,kBAAkB,QAAQ,IAAI;AAAA,IAChC;AAAA,OACI,QAAQ,KAAK,kCAAkC,aAAa;AAAA,MAC9D,+BAA+B,QAAQ,IAAI;AAAA,IAC7C;AAAA,EACF;AAAA,EAUA,IAAI;AAAA,EACJ,MAAM,YAAY,IAAI,oBAAoB;AAAA,IACxC,KAAK,QAAQ,UAAU;AAAA,IACvB,QAAQ,QAAQ,UAAU;AAAA,OACtB,QAAQ,UAAU,cAAc,aAAa,EAAE,WAAW,QAAQ,UAAU,UAAU;AAAA,OACtF,QAAQ,UAAU,YAAY,aAAa,EAAE,SAAS,QAAQ,UAAU,QAAQ;AAAA,OAChF,QAAQ,UAAU,kBAAkB,aAAa;AAAA,MACnD,eAAe,QAAQ,UAAU;AAAA,IACnC;AAAA,IACA,UAAU,CAAC,YAAY,YAAY;AAAA,MACjC,eAAe,aAAa,YAAY,OAAO;AAAA;AAAA,IAEjD,gBAAgB,CAAC,YAAY;AAAA,MAC3B,eAAe,mBAAmB,OAAO;AAAA;AAAA,IAE3C,cAAc,CAAC,WAAW;AAAA,MACxB,eAAe,iBAAiB,MAAM;AAAA;AAAA,IAExC,YAAY,CAAC,WAAW;AAAA,MACtB,eAAe,eAAe,MAAM;AAAA;AAAA,EAExC,CAAC;AAAA,EAED,qBAAqB,YAAY;AAAA,EACjC,gBAAgB,IAAI,kBAAkB,oBAAoB;AAAA,EAE1D,MAAM,iBAAiB,IAAI,mBAAmB;AAAA,IAC5C,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF,CAAC;AAAA,EASD,MAAM,OAAO,IAAI,KAAK;AAAA,IACpB,SAAS,CAAC,cAAc;AAAA,IACxB,QAAQ,QAAQ,UAAU;AAAA,OACtB,QAAQ,gBAAgB,aAAa,EAAE,SAAS,QAAQ,YAAY;AAAA,EAC1E,CAAC;AAAA,EAED,mBAAmB,IAAI;AAAA,EAsBvB,gCAAgC,gBAAgB,IAAI;AAAA,EAEpD,MAAM,UAAU,QAAQ;AAAA,EAExB,OAAO;AAAA,IACL;AAAA,QACI,OAAO,GAAgB;AAAA,MACzB,OAAO,cAAc;AAAA;AAAA,IAEvB;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAmB,MAAM;AAAA,MACvB,eAAe,kBAAkB;AAAA;AAAA,IAEnC,sBAAsB,MAAM;AAAA,MAI1B,IAAI,CAAC,eAAe;AAAA,QAClB,OAAO;AAAA,UACL,aAAa,QAAQ,UAAU;AAAA,UAC/B,cAAc,CAAC;AAAA,UACf,gBAAgB,CAAC;AAAA,UACjB,OAAO;AAAA,YACL,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,UAAU;AAAA,YACV,WAAW;AAAA,UACb;AAAA,UACA,OAAO,CAAC;AAAA,UACR,iBAAiB,gCAAgC;AAAA,UACjD,iBAAiB,OAAO,KAAK,KAAK,OAAO,EAAE;AAAA,UAC3C,eAAe,OAAO,KAAK,KAAK,OAAO;AAAA,QACzC;AAAA,MACF;AAAA,MACA,MAAM,OAAO,cAAc,qBAAqB;AAAA,MAchD,MAAM,cAAc,KAAK;AAAA,MACzB,MAAM,iBAAiB,OAAO,KAAK,WAAW;AAAA,MAC9C,MAAM,eAAe,0BAA0B,IAAI;AAAA,MACnD,MAAM,gBAAsD,KAAK,MAAM,IAAI,CAAC,SAC1E,eAAe,MAAM,gBAAgB,aAAa,YAAY,CAChE;AAAA,MACA,MAAM,MAAmC;AAAA,QACvC,aAAa,KAAK;AAAA,QAClB,cAAc,KAAK;AAAA,QACnB,gBAAgB,KAAK;AAAA,QACrB,OAAO,KAAK;AAAA,QACZ,OAAO;AAAA,QACP,iBAAiB,gCAAgC;AAAA,QACjD,iBAAiB,eAAe;AAAA,QAChC,eAAe;AAAA,MACjB;AAAA,MACA,OAAO;AAAA;AAAA,IAET,mBAAmB,YAAY;AAAA,MAC7B,MAAM,aAAa,2BAA2B,IAAI;AAAA,MAClD,IAAI,CAAC;AAAA,QAAY;AAAA,MACjB,MAAM,WAAW;AAAA;AAAA,IAEnB,uBAAuB,YAAY;AAAA,MACjC,IAAI,CAAC;AAAA,QAAe;AAAA,MACpB,MAAM,cAAc,yBAAyB;AAAA;AAAA,IAE/C,OAAO,YAAY;AAAA,MACjB,UAAU,MAAM;AAAA,MAChB,eAAe,WAAW;AAAA,MAC1B,MAAM,KAAK,SAAS;AAAA;AAAA,EAExB;AAAA;AAGF,eAAe,oBAAoB,CACjC,QAC4B;AAAA,EAC5B,IAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,YAAY,QAAQ;AAAA,IACvE,OAAO,OAAO;AAAA,EAChB;AAAA,EACA,IAAI,aAAa,QAAQ;AAAA,IACvB,MAAM,SAAS,MAAM,OAAO,QAAQ,KAAK;AAAA,IACzC,IAAI,WAAW,MAAM;AAAA,MACnB,MAAM,IAAI,MACR,qRACF;AAAA,IACF;AAAA,IACA,OAAO,MAAM;AAAA,EACf;AAAA,EACA,OAAO,MAAM;AAAA;;AYp6Bf;AASO,IAAM,wBAAwB;AAG9B,IAAM,sBAAsB,IAAI,WAAW,CAAC,IAAM,IAAM,IAAM,EAAI,CAAC;AAGnE,IAAM,sBAAsB;AAI5B,IAAM,yBAAyB,KAAK,KAAK;AAAA;AA+BzC,MAAM,qBAAqB,MAAM;AAAA,EAC7B;AAAA,EAST,WAAW,CAAC,SAAiB,MAA4B;AAAA,IACvD,MAAM,OAAO;AAAA,IACb,KAAK,OAAO;AAAA,IACZ,KAAK,OAAO;AAAA;AAEhB;AA8BO,SAAS,kBAAkB,CAAC,SAAkD;AAAA,EACnF,MAAM,MAAM,QAAQ,MAAM,QAAQ,IAAI,IAAI,KAAK,IAAI;AAAA,EACnD,MAAM,QAAQ,QAAQ,SAAS;AAAA,EAC/B,MAAM,cAAc,QAAQ,eAAe,oBAAoB;AAAA,EAC/D,MAAM,QAAQ,YAAY,mBAAmB;AAAA,EAE7C,OAAO;AAAA,IACL,SAAS;AAAA,IACT,cAAc,QAAQ;AAAA,IACtB,iBAAiB,QAAQ,SAAS;AAAA,IAClC;AAAA,IACA,eAAe,QAAQ;AAAA,IACvB,WAAW,MAAM;AAAA,IACjB;AAAA,EACF;AAAA;AASK,SAAS,mCAAmC,CAAC,MAKE;AAAA,EACpD,MAAM,WAAW,uBAAuB;AAAA,EACxC,MAAM,QAAQ,mBAAmB;AAAA,IAC/B;AAAA,IACA,cAAc,KAAK;AAAA,IACnB,eAAe,KAAK;AAAA,IACpB,OAAO,KAAK;AAAA,IACZ,KAAK,KAAK;AAAA,EACZ,CAAC;AAAA,EACD,OAAO,EAAE,UAAU,MAAM;AAAA;AAOpB,SAAS,qBAAqB,CAAC,OAAqB,KAA6B;AAAA,EACtF,MAAM,IAAI,MAAM,IAAI,IAAI,KAAK,IAAI;AAAA,EACjC,OAAO,KAAK,MAAM;AAAA;AAab,SAAS,iBAAiB,CAC/B,OACA,SACA,UAAkC,CAAC,GAC7B;AAAA,EACN,IAAI,sBAAsB,OAAO,QAAQ,GAAG,GAAG;AAAA,IAC7C,MAAM,IAAI,aACR,sBAAsB,MAAM,2BAA2B,IAAI,KAAK,MAAM,SAAS,EAAE,YAAY,MAC7F,SACF;AAAA,EACF;AAAA,EACA,QAAQ,WAAW,IAAI,MAAM,cAAc,MAAM,eAAe;AAAA,EAChE,QAAQ,aAAa,IAAI,MAAM,eAAe,MAAM,WAAW;AAAA;AAqB1D,SAAS,qBAAqB,CAAC,OAAiC;AAAA,EACrE,yBAAyB,KAAK;AAAA,EAC9B,MAAM,cAAc,IAAI,YAAY,EAAE,OAAO,MAAM,YAAY;AAAA,EAC/D,MAAM,aAAa,IAAI,YAAY,EAAE,OAAO,MAAM,aAAa;AAAA,EAE/D,MAAM,QACJ,oBAAoB,SACpB,IACA,IACA,YAAY,SACZ,mBACA,YACA,IACA,WAAW,SACX,IACA;AAAA,EAEF,MAAM,MAAM,IAAI,WAAW,KAAK;AAAA,EAChC,IAAI,SAAS;AAAA,EAEb,IAAI,IAAI,qBAAqB,MAAM;AAAA,EACnC,UAAU,oBAAoB;AAAA,EAE9B,IAAI,UAAU,MAAM;AAAA,EACpB,UAAU;AAAA,EAEV,MAAM,OAAO,IAAI,SAAS,IAAI,MAAM;AAAA,EACpC,KAAK,UAAU,QAAQ,YAAY,QAAQ,KAAK;AAAA,EAChD,UAAU;AAAA,EACV,IAAI,IAAI,aAAa,MAAM;AAAA,EAC3B,UAAU,YAAY;AAAA,EAEtB,IAAI,IAAI,MAAM,iBAAiB,MAAM;AAAA,EACrC,UAAU;AAAA,EAEV,IAAI,IAAI,MAAM,aAAa,MAAM;AAAA,EACjC,UAAU;AAAA,EAEV,KAAK,UAAU,QAAQ,WAAW,QAAQ,KAAK;AAAA,EAC/C,UAAU;AAAA,EACV,IAAI,IAAI,YAAY,MAAM;AAAA,EAC1B,UAAU,WAAW;AAAA,EAKrB,KAAK,aAAa,QAAQ,OAAO,MAAM,SAAS,GAAG,KAAK;AAAA,EACxD,UAAU;AAAA,EAEV,IAAI,IAAI,MAAM,OAAO,MAAM;AAAA,EAC3B,UAAU;AAAA,EAEV,OAAO;AAAA;AAOF,SAAS,iBAAiB,CAAC,OAAiC;AAAA,EACjE,IAAI,SAAS;AAAA,EAGb,IAAI,MAAM,SAAS,oBAAoB,QAAQ;AAAA,IAC7C,MAAM,IAAI,aAAa,4BAA4B,MAAM,iBAAiB,WAAW;AAAA,EACvF;AAAA,EACA,SAAS,IAAI,EAAG,IAAI,oBAAoB,QAAQ,KAAK;AAAA,IACnD,IAAI,MAAM,SAAS,OAAO,oBAAoB,IAAI;AAAA,MAChD,MAAM,IAAI,aACR,4DACA,aACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,UAAU,oBAAoB;AAAA,EAG9B,IAAI,MAAM,SAAS,SAAS,GAAG;AAAA,IAC7B,MAAM,IAAI,aAAa,uCAAuC,WAAW;AAAA,EAC3E;AAAA,EACA,MAAM,UAAU,MAAM;AAAA,EACtB,UAAU;AAAA,EACV,IAAI,YAAY,uBAAuB;AAAA,IACrC,MAAM,IAAI,aACR,kCAAkC,8CAA8C,0BAChF,iBACF;AAAA,EACF;AAAA,EAGA,IAAI,MAAM,SAAS,SAAS,GAAG;AAAA,IAC7B,MAAM,IAAI,aAAa,gDAAgD,WAAW;AAAA,EACpF;AAAA,EACA,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,EAC1E,MAAM,YAAY,KAAK,UAAU,QAAQ,KAAK;AAAA,EAC9C,UAAU;AAAA,EACV,IAAI,MAAM,SAAS,SAAS,WAAW;AAAA,IACrC,MAAM,IAAI,aAAa,yCAAyC,WAAW;AAAA,EAC7E;AAAA,EACA,MAAM,eAAe,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,QAAQ,SAAS,SAAS,CAAC;AAAA,EACxF,UAAU;AAAA,EAGV,IAAI,MAAM,SAAS,SAAS,kBAA0B;AAAA,IACpD,MAAM,IAAI,aAAa,0CAA0C,WAAW;AAAA,EAC9E;AAAA,EACA,MAAM,kBAAkB,MAAM,MAAM,QAAQ,SAAS,gBAAwB;AAAA,EAC7E,UAAU;AAAA,EAGV,IAAI,MAAM,SAAS,SAAS,WAAsB;AAAA,IAChD,MAAM,IAAI,aAAa,4CAA4C,WAAW;AAAA,EAChF;AAAA,EACA,MAAM,cAAc,MAAM,MAAM,QAAQ,SAAS,SAAoB;AAAA,EACrE,UAAU;AAAA,EAGV,IAAI,MAAM,SAAS,SAAS,GAAG;AAAA,IAC7B,MAAM,IAAI,aAAa,sDAAsD,WAAW;AAAA,EAC1F;AAAA,EACA,MAAM,WAAW,KAAK,UAAU,QAAQ,KAAK;AAAA,EAC7C,UAAU;AAAA,EACV,IAAI,MAAM,SAAS,SAAS,UAAU;AAAA,IACpC,MAAM,IAAI,aAAa,+CAA+C,WAAW;AAAA,EACnF;AAAA,EACA,MAAM,gBAAgB,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,QAAQ,SAAS,QAAQ,CAAC;AAAA,EACxF,UAAU;AAAA,EAGV,IAAI,MAAM,SAAS,SAAS,GAAG;AAAA,IAC7B,MAAM,IAAI,aAAa,sCAAsC,WAAW;AAAA,EAC1E;AAAA,EACA,MAAM,eAAe,KAAK,aAAa,QAAQ,KAAK;AAAA,EACpD,UAAU;AAAA,EACV,MAAM,YAAY,OAAO,YAAY;AAAA,EAGrC,IAAI,MAAM,SAAS,SAAS,qBAAqB;AAAA,IAC/C,MAAM,IAAI,aAAa,qCAAqC,WAAW;AAAA,EACzE;AAAA,EACA,MAAM,QAAQ,MAAM,MAAM,QAAQ,SAAS,mBAAmB;AAAA,EAC9D,UAAU;AAAA,EAEV,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA;AAQK,SAAS,kBAAkB,CAAC,OAA6B;AAAA,EAC9D,MAAM,QAAQ,sBAAsB,KAAK;AAAA,EAIzC,IAAI,SAAS;AAAA,EACb,WAAW,QAAQ,OAAO;AAAA,IACxB,UAAU,OAAO,aAAa,IAAI;AAAA,EACpC;AAAA,EACA,OAAO,KAAK,MAAM;AAAA;AAOb,SAAS,kBAAkB,CAAC,SAA+B;AAAA,EAChE,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,SAAS,KAAK,OAAO;AAAA,IACrB,MAAM;AAAA,IACN,MAAM,IAAI,aAAa,sCAAsC,aAAa;AAAA;AAAA,EAE5E,MAAM,QAAQ,IAAI,WAAW,OAAO,MAAM;AAAA,EAC1C,SAAS,IAAI,EAAG,IAAI,OAAO,QAAQ,KAAK;AAAA,IACtC,MAAM,KAAK,OAAO,WAAW,CAAC;AAAA,EAChC;AAAA,EACA,OAAO,kBAAkB,KAAK;AAAA;AAKhC,SAAS,wBAAwB,CAAC,OAA2B;AAAA,EAC3D,IAAI,MAAM,gBAAgB,WAAW,kBAA0B;AAAA,IAC7D,MAAM,IAAI,aACR,6BAA6B,+BAAuC,MAAM,gBAAgB,WAC1F,oBACF;AAAA,EACF;AAAA,EACA,IAAI,MAAM,YAAY,WAAW,WAAsB;AAAA,IACrD,MAAM,IAAI,aACR,wBAAwB,wBAAmC,MAAM,YAAY,WAC7E,sBACF;AAAA,EACF;AAAA,EACA,IAAI,MAAM,MAAM,WAAW,qBAAqB;AAAA,IAC9C,MAAM,IAAI,aACR,iBAAiB,kCAAkC,MAAM,MAAM,WAC/D,eACF;AAAA,EACF;AAAA;AAGF,SAAS,WAAW,CAAC,GAAuB;AAAA,EAC1C,MAAM,MAAM,IAAI,WAAW,CAAC;AAAA,EAC5B,OAAO,gBAAgB,GAAG;AAAA,EAC1B,OAAO;AAAA;;ACpYF,IAAM,4BAA4B;AAGlC,IAAM,mBAAmB,IAAI,WAAW,CAAC,IAAM,IAAM,IAAM,EAAI,CAAC;AAAA;AAwBhE,MAAM,wBAAwB,MAAM;AAAA,EAChC;AAAA,EAST,WAAW,CAAC,SAAiB,MAA+B;AAAA,IAC1D,MAAM,OAAO;AAAA,IACb,KAAK,OAAO;AAAA,IACZ,KAAK,OAAO;AAAA;AAEhB;AAsBO,SAAS,gBAAgB,CAAC,SAAoD;AAAA,EACnF,MAAM,MAAM,QAAQ,MAAM,QAAQ,IAAI,IAAI,KAAK,IAAI;AAAA,EACnD,OAAO;AAAA,IACL,SAAS;AAAA,IACT,cAAc,QAAQ;AAAA,IACtB,eAAe,QAAQ;AAAA,IACvB,UAAU;AAAA,OACN,QAAQ,WAAW,YAAY,CAAC,IAAI,EAAE,QAAQ,QAAQ,OAAO;AAAA,EACnE;AAAA;AASK,SAAS,eAAe,CAAC,QAA0B,SAA4B;AAAA,EACpF,QAAQ,aAAa,IAAI,OAAO,aAAa;AAAA;AAUxC,SAAS,iBAAiB,CAAC,QAAgB,SAA4B;AAAA,EAC5E,QAAQ,aAAa,IAAI,MAAM;AAAA;AAmB1B,SAAS,0BAA0B,CAAC,QAAsC;AAAA,EAC/E,MAAM,cAAc,IAAI,YAAY,EAAE,OAAO,OAAO,YAAY;AAAA,EAChE,MAAM,eAAe,IAAI,YAAY,EAAE,OAAO,OAAO,aAAa;AAAA,EAClE,MAAM,cAAc,IAAI,YAAY,EAAE,OAAO,OAAO,UAAU,EAAE;AAAA,EAEhE,MAAM,QACJ,iBAAiB,SACjB,IACA,IACA,YAAY,SACZ,IACA,aAAa,SACb,IACA,IACA,YAAY;AAAA,EAEd,MAAM,MAAM,IAAI,WAAW,KAAK;AAAA,EAChC,IAAI,SAAS;AAAA,EAEb,IAAI,IAAI,kBAAkB,MAAM;AAAA,EAChC,UAAU,iBAAiB;AAAA,EAE3B,IAAI,UAAU,OAAO;AAAA,EACrB,UAAU;AAAA,EAEV,MAAM,OAAO,IAAI,SAAS,IAAI,MAAM;AAAA,EACpC,KAAK,UAAU,QAAQ,YAAY,QAAQ,KAAK;AAAA,EAChD,UAAU;AAAA,EACV,IAAI,IAAI,aAAa,MAAM;AAAA,EAC3B,UAAU,YAAY;AAAA,EAEtB,KAAK,UAAU,QAAQ,aAAa,QAAQ,KAAK;AAAA,EACjD,UAAU;AAAA,EACV,IAAI,IAAI,cAAc,MAAM;AAAA,EAC5B,UAAU,aAAa;AAAA,EAEvB,KAAK,aAAa,QAAQ,OAAO,OAAO,QAAQ,GAAG,KAAK;AAAA,EACxD,UAAU;AAAA,EAEV,KAAK,UAAU,QAAQ,YAAY,QAAQ,KAAK;AAAA,EAChD,UAAU;AAAA,EACV,IAAI,IAAI,aAAa,MAAM;AAAA,EAE3B,OAAO;AAAA;AAIT,SAAS,sBAAsB,CAAC,OAAqC;AAAA,EACnE,IAAI,SAAS;AAAA,EAEb,IAAI,MAAM,SAAS,iBAAiB,QAAQ;AAAA,IAC1C,MAAM,IAAI,gBAAgB,0CAA0C,WAAW;AAAA,EACjF;AAAA,EACA,SAAS,IAAI,EAAG,IAAI,iBAAiB,QAAQ,KAAK;AAAA,IAChD,IAAI,MAAM,SAAS,OAAO,iBAAiB,IAAI;AAAA,MAC7C,MAAM,IAAI,gBAAgB,qCAAqC,aAAa;AAAA,IAC9E;AAAA,EACF;AAAA,EACA,UAAU,iBAAiB;AAAA,EAE3B,IAAI,MAAM,SAAS,SAAS,GAAG;AAAA,IAC7B,MAAM,IAAI,gBAAgB,2CAA2C,WAAW;AAAA,EAClF;AAAA,EACA,MAAM,UAAU,MAAM;AAAA,EACtB,UAAU;AAAA,EACV,IAAI,YAAY,2BAA2B;AAAA,IACzC,MAAM,IAAI,gBAAgB,sCAAsC,YAAY,iBAAiB;AAAA,EAC/F;AAAA,EAEA,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,EAE1E,IAAI,MAAM,SAAS,SAAS,GAAG;AAAA,IAC7B,MAAM,IAAI,gBAAgB,iDAAiD,WAAW;AAAA,EACxF;AAAA,EACA,MAAM,YAAY,KAAK,UAAU,QAAQ,KAAK;AAAA,EAC9C,UAAU;AAAA,EACV,IAAI,MAAM,SAAS,SAAS,WAAW;AAAA,IACrC,MAAM,IAAI,gBAAgB,6CAA6C,WAAW;AAAA,EACpF;AAAA,EACA,MAAM,eAAe,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,QAAQ,SAAS,SAAS,CAAC;AAAA,EACxF,UAAU;AAAA,EAEV,IAAI,MAAM,SAAS,SAAS,GAAG;AAAA,IAC7B,MAAM,IAAI,gBAAgB,qDAAqD,WAAW;AAAA,EAC5F;AAAA,EACA,MAAM,aAAa,KAAK,UAAU,QAAQ,KAAK;AAAA,EAC/C,UAAU;AAAA,EACV,IAAI,MAAM,SAAS,SAAS,YAAY;AAAA,IACtC,MAAM,IAAI,gBAAgB,8CAA8C,WAAW;AAAA,EACrF;AAAA,EACA,MAAM,gBAAgB,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,QAAQ,SAAS,UAAU,CAAC;AAAA,EAC1F,UAAU;AAAA,EAEV,IAAI,MAAM,SAAS,SAAS,GAAG;AAAA,IAC7B,MAAM,IAAI,gBAAgB,4CAA4C,WAAW;AAAA,EACnF;AAAA,EACA,MAAM,WAAW,OAAO,KAAK,aAAa,QAAQ,KAAK,CAAC;AAAA,EACxD,UAAU;AAAA,EAEV,IAAI,MAAM,SAAS,SAAS,GAAG;AAAA,IAC7B,MAAM,IAAI,gBAAgB,iDAAiD,WAAW;AAAA,EACxF;AAAA,EACA,MAAM,YAAY,KAAK,UAAU,QAAQ,KAAK;AAAA,EAC9C,UAAU;AAAA,EACV,IAAI,MAAM,SAAS,SAAS,WAAW;AAAA,IACrC,MAAM,IAAI,gBAAgB,0CAA0C,WAAW;AAAA,EACjF;AAAA,EACA,MAAM,SAAS,IAAI,YAAY,EAAE,OAAO,MAAM,SAAS,QAAQ,SAAS,SAAS,CAAC;AAAA,EAClF,UAAU;AAAA,EAEV,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,OACI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,EAC7B;AAAA;AAQK,SAAS,gBAAgB,CAAC,QAA0B,QAAoC;AAAA,EAC7F,MAAM,UAAU,2BAA2B,MAAM;AAAA,EACjD,MAAM,WAAW,aAAa,SAAS,OAAO,cAAc,OAAO,SAAS;AAAA,EAC5E,OAAO,qBAAqB,QAAQ;AAAA;AAmB/B,SAAS,gBAAgB,CAAC,OAAmB,SAAwC;AAAA,EAC1F,MAAM,WAAW,qBAAqB,KAAK;AAAA,EAC3C,MAAM,YAAY,QAAQ,WAAW,IAAI,SAAS,QAAQ;AAAA,EAC1D,IAAI,CAAC,WAAW;AAAA,IACd,MAAM,IAAI,gBACR,qBAAqB,SAAS,yCAC9B,gBACF;AAAA,EACF;AAAA,EACA,IACE,QAAQ,wBAAwB,aAChC,QAAQ,oBAAoB,OAAO,KACnC,CAAC,QAAQ,oBAAoB,IAAI,SAAS,QAAQ,GAClD;AAAA,IACA,MAAM,IAAI,gBACR,qBAAqB,SAAS,8DAC9B,qBACF;AAAA,EACF;AAAA,EACA,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,eAAe,cAAmB,UAAU,SAAS;AAAA,IACrD,MAAM;AAAA,IACN,MAAM,IAAI,gBACR,uDAAuD,SAAS,aAChE,mBACF;AAAA;AAAA,EAGF,MAAM,SAAS,uBAAuB,YAAY;AAAA,EAGlD,IAAI,OAAO,iBAAiB,SAAS,UAAU;AAAA,IAC7C,MAAM,IAAI,gBACR,oCAAoC,OAAO,+CAA+C,SAAS,aACnG,sBACF;AAAA,EACF;AAAA,EACA,OAAO;AAAA;",
|
|
30
|
+
"debugId": "E998FF56BA12701D64756E2164756E21",
|
|
31
31
|
"names": []
|
|
32
32
|
}
|
|
@@ -164,6 +164,56 @@ export interface CreateMeshClientOptions {
|
|
|
164
164
|
* production call site is inside {@link createMeshClient}.
|
|
165
165
|
*/
|
|
166
166
|
export declare function resolveIceServers(rtc: CreateMeshClientOptions["rtc"]): Promise<RTCIceServer[] | undefined>;
|
|
167
|
+
/** Per-(docId, peerId) view into Automerge's `CollectionSynchronizer`.
|
|
168
|
+
* Built once per snapshot read and consulted from {@link buildHandleEntry}.
|
|
169
|
+
* Structured this way so the docSynchronizer lookup is paid once per
|
|
170
|
+
* docId, not once per (docId × peer). */
|
|
171
|
+
interface PerPeerDocSyncView {
|
|
172
|
+
/** `true` iff Automerge's `CollectionSynchronizer.docSynchronizers`
|
|
173
|
+
* has an entry for this documentId. A handle that exists in
|
|
174
|
+
* `repo.handles` but has no corresponding `docSynchronizer` is the
|
|
175
|
+
* `addDocument`-was-never-called fingerprint — Automerge's
|
|
176
|
+
* NetworkSubsystem can never invoke `send` for it because no
|
|
177
|
+
* synchronizer is wired up. */
|
|
178
|
+
docSynchronizerExists: boolean;
|
|
179
|
+
/** `true` iff the docSynchronizer for this documentId has registered
|
|
180
|
+
* this peer in its internal peer list (`#peers`). `false` with
|
|
181
|
+
* `docSynchronizerExists: true` is the symmetric polly#107 gap: the
|
|
182
|
+
* synchronizer exists (`addDocument` ran) but `addPeer` was never
|
|
183
|
+
* called for this peer on this doc — typically because the handle
|
|
184
|
+
* was created AFTER `peer-candidate` fired and Automerge's
|
|
185
|
+
* `addDocument`-iterates-known-peers path missed it. `undefined`
|
|
186
|
+
* when no docSynchronizer exists. */
|
|
187
|
+
docSynchronizerKnowsPeer: boolean | undefined;
|
|
188
|
+
/** Automerge's `DocSynchronizer.peerStates[peerId]` — one of
|
|
189
|
+
* `"unknown"`, `"has"`, `"unavailable"`, `"wants"`. `"unknown"`
|
|
190
|
+
* with `lastSyncMessageOutAt` set means the local side sent its
|
|
191
|
+
* opening handshake but never advanced past it; this is the
|
|
192
|
+
* wedged-pair fingerprint #112 names. `undefined` when no
|
|
193
|
+
* docSynchronizer exists OR when the synchronizer exists but
|
|
194
|
+
* doesn't track this peer. */
|
|
195
|
+
peerDocumentStatus: string | undefined;
|
|
196
|
+
}
|
|
197
|
+
/** Minimal structural shape we lift off Automerge's hidden
|
|
198
|
+
* `Repo.synchronizer` / `CollectionSynchronizer` types. Kept narrow
|
|
199
|
+
* so a future Automerge bump that renames a private rip doesn't
|
|
200
|
+
* topple the snapshot path. */
|
|
201
|
+
interface SynchronizerStructural {
|
|
202
|
+
docSynchronizers?: Record<string, {
|
|
203
|
+
hasPeer?: (peerId: string) => boolean;
|
|
204
|
+
peerStates?: Record<string, string>;
|
|
205
|
+
}>;
|
|
206
|
+
}
|
|
207
|
+
/** Internal — exported for direct unit-test coverage of the #112
|
|
208
|
+
* structural reader and snapshot wiring. Not part of the public API. */
|
|
209
|
+
export declare const __test__: {
|
|
210
|
+
buildSyncView: (synchronizer: SynchronizerStructural | undefined, docId: string, peerId: string) => PerPeerDocSyncView;
|
|
211
|
+
EMPTY_SYNC_VIEW: PerPeerDocSyncView;
|
|
212
|
+
getCollectionSynchronizer: (repo: Repo) => SynchronizerStructural | undefined;
|
|
213
|
+
enrichPeerSlot: (peer: ReturnType<MeshWebRTCAdapter["getPeerStateSnapshot"]>["peers"][number], knownHandleIds: string[], repoHandles: Record<string, {
|
|
214
|
+
state: unknown;
|
|
215
|
+
} | undefined>, synchronizer: SynchronizerStructural | undefined) => MeshClientPeerStateSnapshot["peers"][number];
|
|
216
|
+
};
|
|
167
217
|
/** Polly#107 post-v0.60 instrumentation. Walks the lazy-wrapper log
|
|
168
218
|
* and groups records by `docId`; emits one entry per `docId` that
|
|
169
219
|
* appears in more than one record. Surfaces the "17 wrappers / 16
|
|
@@ -221,6 +271,31 @@ export interface MeshClientHandleSnapshot {
|
|
|
221
271
|
* `"sync"` after handshake, `"request"` while the local side is
|
|
222
272
|
* asking. */
|
|
223
273
|
lastSyncMessageOutType: string | undefined;
|
|
274
|
+
/** #112 diagnostic. `true` iff Automerge's `CollectionSynchronizer`
|
|
275
|
+
* has a `docSynchronizer` entry for this document. A handle in
|
|
276
|
+
* `repo.handles` with no docSynchronizer is the
|
|
277
|
+
* `addDocument`-never-ran fingerprint: Automerge's NetworkSubsystem
|
|
278
|
+
* can never call `send` for it because no synchronizer is wired up. */
|
|
279
|
+
docSynchronizerExists: boolean;
|
|
280
|
+
/** #112 diagnostic. `true` iff the docSynchronizer for this document
|
|
281
|
+
* has this peer in its internal peer list. `false` with
|
|
282
|
+
* `docSynchronizerExists: true` is the symmetric polly#107 gap —
|
|
283
|
+
* the synchronizer exists but `addPeer` was never invoked on it for
|
|
284
|
+
* this peer, typically because the handle was created AFTER
|
|
285
|
+
* `peer-candidate` fired and Automerge's
|
|
286
|
+
* `addDocument`-iterates-peers path missed it. `undefined` when no
|
|
287
|
+
* docSynchronizer exists. */
|
|
288
|
+
docSynchronizerKnowsPeer: boolean | undefined;
|
|
289
|
+
/** #112 diagnostic. Automerge's
|
|
290
|
+
* `DocSynchronizer.peerStates[peerId]` — one of `"unknown"`,
|
|
291
|
+
* `"has"`, `"unavailable"`, `"wants"`. `"unknown"` together with a
|
|
292
|
+
* set `lastSyncMessageOutAt` is the wedged-pair fingerprint this
|
|
293
|
+
* ticket names: the opening handshake left the wire but the
|
|
294
|
+
* synchronizer never learned whether the remote has the doc, so
|
|
295
|
+
* `generateSyncMessage` quiesces. `undefined` when no
|
|
296
|
+
* docSynchronizer exists OR when the synchronizer does not track
|
|
297
|
+
* this peer. */
|
|
298
|
+
peerDocumentStatus: string | undefined;
|
|
224
299
|
}
|
|
225
300
|
/** Polly#107 H5 diagnostics: surfaces the `mesh-state` module
|
|
226
301
|
* instance identity so a single snapshot read tells the operator
|
|
@@ -414,3 +489,4 @@ export interface MeshClient {
|
|
|
414
489
|
* peer connections negotiate asynchronously in the background.
|
|
415
490
|
*/
|
|
416
491
|
export declare function createMeshClient(options: CreateMeshClientOptions): Promise<MeshClient>;
|
|
492
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fairfox/polly",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.66.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Multi-execution-context framework with reactive state and cross-context messaging for Chrome extensions, PWAs, and worker-based applications",
|