@openclaw/crabline 0.1.16 → 0.1.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/README.md +8 -0
  2. package/dist/src/openclaw/bridges/whatsapp.js +21 -1
  3. package/dist/src/openclaw/bridges/whatsapp.js.map +1 -1
  4. package/dist/src/openclaw/private-file.js +87 -30
  5. package/dist/src/openclaw/private-file.js.map +1 -1
  6. package/dist/src/openclaw/shared.d.ts +9 -0
  7. package/dist/src/openclaw/shared.js +2 -1
  8. package/dist/src/openclaw/shared.js.map +1 -1
  9. package/dist/src/platform/process-owned-lock.d.ts +5 -2
  10. package/dist/src/platform/process-owned-lock.js +20 -10
  11. package/dist/src/platform/process-owned-lock.js.map +1 -1
  12. package/dist/src/servers/discord.js +25 -35
  13. package/dist/src/servers/discord.js.map +1 -1
  14. package/dist/src/servers/http.d.ts +3 -0
  15. package/dist/src/servers/http.js +15 -0
  16. package/dist/src/servers/http.js.map +1 -1
  17. package/dist/src/servers/matrix.js +8 -8
  18. package/dist/src/servers/matrix.js.map +1 -1
  19. package/dist/src/servers/mattermost.js +7 -10
  20. package/dist/src/servers/mattermost.js.map +1 -1
  21. package/dist/src/servers/recorder.d.ts +16 -6
  22. package/dist/src/servers/recorder.js +52 -12
  23. package/dist/src/servers/recorder.js.map +1 -1
  24. package/dist/src/servers/signal.js +8 -8
  25. package/dist/src/servers/signal.js.map +1 -1
  26. package/dist/src/servers/slack.js +8 -8
  27. package/dist/src/servers/slack.js.map +1 -1
  28. package/dist/src/servers/telegram.d.ts +2 -2
  29. package/dist/src/servers/telegram.js +8 -8
  30. package/dist/src/servers/telegram.js.map +1 -1
  31. package/dist/src/servers/whatsapp-baileys-websocket.d.ts +15 -0
  32. package/dist/src/servers/whatsapp-baileys-websocket.js +32 -2
  33. package/dist/src/servers/whatsapp-baileys-websocket.js.map +1 -1
  34. package/dist/src/servers/whatsapp.js +189 -29
  35. package/dist/src/servers/whatsapp.js.map +1 -1
  36. package/dist/src/servers/zalo.js +8 -7
  37. package/dist/src/servers/zalo.js.map +1 -1
  38. package/docs/channel-setup.md +65 -1
  39. package/package.json +12 -12
@@ -1 +1 @@
1
- {"version":3,"file":"recorder.js","sourceRoot":"","sources":["../../../src/servers/recorder.ts"],"names":[],"mappings":"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","sourcesContent":["import { constants as fsConstants } from \"node:fs\";\nimport { createHash } from \"node:crypto\";\nimport { chmod, lstat, mkdir, open, readlink, realpath, stat as statPath } from \"node:fs/promises\";\nimport { userInfo } from \"node:os\";\nimport path from \"node:path\";\nimport { lock } from \"proper-lockfile\";\nimport { createProcessOwnedLockFileSystem } from \"../platform/process-owned-lock.js\";\nimport {\n createOwnerOnlyWindowsDirectory,\n readWindowsDirectoryNamespaceSecuritySnapshot,\n readWindowsDirectorySecuritySnapshot,\n type WindowsDirectorySecuritySnapshot,\n} from \"../platform/windows-acl.js\";\nimport { isManagedRecorderDirectory } from \"../platform/recorder-directory.js\";\nimport {\n secureCachedWindowsLockRoot,\n type WindowsLockRootIdentity,\n} from \"../platform/windows-lock-root.js\";\nimport type { ServerRequestEvent } from \"./http.js\";\n\nexport type ServerEventObserver = (event: ServerRequestEvent) => void | Promise<void>;\n\nexport class ServerRecorderCommittedError extends AggregateError {\n readonly committed = true;\n readonly indeterminate: boolean;\n\n constructor(\n filePath: string,\n operationError: unknown,\n relatedErrors: unknown[] = [],\n indeterminate = false,\n ) {\n super(\n [operationError, ...relatedErrors],\n indeterminate\n ? `Server recorder append may have been published for \"${filePath}\", but completion is indeterminate.`\n : `Server recorder append committed for \"${filePath}\", but subsequent work failed.`,\n { cause: operationError },\n );\n this.name = \"ServerRecorderCommittedError\";\n this.indeterminate = indeterminate;\n }\n}\n\nclass ServerRecorderRotationError extends Error {}\n\nclass ServerRecorderDirectorySyncError extends AggregateError {\n constructor(\n readonly syncError: unknown,\n readonly closeError: unknown,\n ) {\n super(\n [syncError, closeError],\n \"Server recorder directory sync and handle cleanup both failed.\",\n { cause: syncError },\n );\n }\n}\n\ntype RecorderFileIdentity = {\n dev: bigint;\n ino: bigint;\n nlink: bigint;\n};\n\ntype ObserverTask = {\n markStarted: () => void;\n started: Promise<void>;\n};\n\ntype ObserverPlan = {\n dependencies: Set<ObserverTask>;\n task: ObserverTask;\n};\n\nconst pendingAppends = new Map<string, Promise<void>>();\nconst pendingAdmissions = new Map<string, Promise<void>>();\nconst pendingLogicalObservers = new Map<string, ObserverTask>();\nconst pendingPublicationObservers = new Map<string, ObserverTask>();\nconst securedWindowsLockRoots = new Map<string, Promise<WindowsLockRootIdentity>>();\nconst securedWindowsRecorderDirectories = new Map<string, Promise<WindowsLockRootIdentity>>();\nconst MAX_RECOVERY_VALIDATION_BYTES = 64 * 1024 * 1024;\nconst MAX_RECOVERY_SCAN_BYTES = MAX_RECOVERY_VALIDATION_BYTES + 1;\nconst RECORDER_LOCK_RETRY_MS = 100;\nconst RECORDER_LOCK_STALE_MS = 30_000;\nconst RECORDER_LOCK_UPDATE_MS = 10_000;\nconst RECORDER_LOCK_WAIT_MARGIN_MS = 5_000;\nconst RECORDER_LOCK_DIRECTORY_ENV = \"CRABLINE_RECORDER_LOCK_DIR\";\nconst RECORDER_PATH_ATTEMPTS = 3;\nconst RECORDER_ROTATION_ATTEMPTS = 3;\nconst TAIL_SCAN_CHUNK_BYTES = 64 * 1024;\n\nasync function readBufferAt(\n file: Awaited<ReturnType<typeof open>>,\n length: number,\n position: number,\n): Promise<Buffer> {\n const buffer = Buffer.alloc(length);\n let bytesRead = 0;\n while (bytesRead < length) {\n const result = await file.read(buffer, bytesRead, length - bytesRead, position + bytesRead);\n if (result.bytesRead === 0) {\n break;\n }\n bytesRead += result.bytesRead;\n }\n return buffer.subarray(0, bytesRead);\n}\n\nasync function appendRecorderText(\n file: Awaited<ReturnType<typeof open>>,\n contents: string,\n position: number,\n): Promise<void> {\n if (process.platform !== \"win32\") {\n await file.appendFile(contents, { encoding: \"utf8\" });\n return;\n }\n const buffer = Buffer.from(contents, \"utf8\");\n let written = 0;\n while (written < buffer.length) {\n const result = await file.write(buffer, written, buffer.length - written, position + written);\n if (result.bytesWritten === 0) {\n throw new Error(\"Server recorder append made no progress.\");\n }\n written += result.bytesWritten;\n }\n}\n\nasync function findIncompleteTailStart(\n file: Awaited<ReturnType<typeof open>>,\n fileSize: number,\n): Promise<number> {\n let position = fileSize;\n while (position > 0) {\n const scannedBytes = fileSize - position;\n const remainingScanBytes = MAX_RECOVERY_SCAN_BYTES - scannedBytes;\n if (remainingScanBytes <= 0) {\n throw recoveryValidationLimitError();\n }\n const chunkStart = Math.max(0, position - Math.min(TAIL_SCAN_CHUNK_BYTES, remainingScanBytes));\n const chunk = await readBufferAt(file, position - chunkStart, chunkStart);\n const lastNewline = chunk.lastIndexOf(0x0a);\n if (lastNewline >= 0) {\n return chunkStart + lastNewline + 1;\n }\n if (chunk.length === 0) {\n break;\n }\n position = chunkStart;\n }\n return 0;\n}\n\nfunction recoveryValidationLimitError(): Error {\n return new Error(\n \"Server recorder final record is too large to validate safely; refusing to modify it.\",\n );\n}\n\nfunction recorderFileSize(size: bigint | number): number {\n const normalized = typeof size === \"bigint\" ? Number(size) : size;\n if (!Number.isSafeInteger(normalized) || normalized < 0) {\n throw new Error(\"Server recorder file size exceeds the supported range.\");\n }\n return normalized;\n}\n\nasync function openRecorderFile(\n filePath: string,\n): Promise<{ created: boolean; file: Awaited<ReturnType<typeof open>> }> {\n try {\n return {\n created: true,\n file: await open(filePath, \"ax+\", 0o600),\n };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") {\n throw error;\n }\n return {\n created: false,\n file: await open(\n filePath,\n // Windows callers secure the publication directory before reaching this open.\n process.platform === \"win32\"\n ? \"r+\"\n : fsConstants.O_RDWR |\n fsConstants.O_APPEND |\n fsConstants.O_NONBLOCK |\n fsConstants.O_NOFOLLOW,\n 0o600,\n ),\n };\n }\n}\n\nasync function truncateRecorderFile(\n file: Awaited<ReturnType<typeof open>>,\n filePath: string,\n expectedIdentity: string,\n length: number,\n): Promise<boolean> {\n if (process.platform !== \"win32\") {\n await file.truncate(length);\n return true;\n }\n let repairFile: Awaited<ReturnType<typeof open>>;\n try {\n repairFile = await open(filePath, \"r+\");\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code === \"ENOENT\" || code === \"ENOTDIR\" || code === \"EISDIR\" || code === \"ELOOP\") {\n return false;\n }\n throw error;\n }\n let result = false;\n let operationFailed = false;\n let operationError: unknown;\n try {\n if (requireRecorderIdentity(await repairFile.stat({ bigint: true })) === expectedIdentity) {\n await repairFile.truncate(length);\n await repairFile.sync();\n result = true;\n }\n } catch (error) {\n operationFailed = true;\n operationError = error;\n }\n let closeFailed = false;\n let closeError: unknown;\n try {\n await repairFile.close();\n } catch (error) {\n closeFailed = true;\n closeError = error;\n }\n if (closeFailed) {\n if (operationFailed) {\n throw new AggregateError(\n [operationError, closeError],\n \"Server recorder tail repair and repair-handle close both failed.\",\n { cause: closeError },\n );\n }\n throw closeError;\n }\n if (operationFailed) {\n throw operationError;\n }\n return result;\n}\n\nasync function syncDirectory(directoryPath: string): Promise<void> {\n if (process.platform === \"win32\") {\n return;\n }\n const directory = await open(directoryPath, \"r\");\n let syncError: unknown;\n try {\n await directory.sync();\n } catch (error) {\n syncError = error;\n }\n let closeError: unknown;\n try {\n await directory.close();\n } catch (error) {\n closeError = error;\n }\n if (syncError !== undefined && closeError !== undefined) {\n throw new ServerRecorderDirectorySyncError(syncError, closeError);\n }\n if (syncError !== undefined) {\n throw syncError;\n }\n if (closeError !== undefined) {\n throw closeError;\n }\n}\n\nasync function syncRecorderPathAncestry(\n filePath: string,\n firstCreatedDirectory?: string,\n): Promise<void> {\n if (process.platform === \"win32\") {\n return;\n }\n const resolvedFilePath = path.resolve(filePath);\n let currentPath = resolvedFilePath;\n const syncThroughPath =\n firstCreatedDirectory === undefined ? undefined : path.resolve(firstCreatedDirectory);\n for (;;) {\n const directoryPath = path.dirname(currentPath);\n const mandatory = syncThroughPath !== undefined || currentPath === resolvedFilePath;\n try {\n await syncDirectory(directoryPath);\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (!mandatory && (code === \"EACCES\" || code === \"EPERM\")) {\n return;\n }\n throw error;\n }\n if (syncThroughPath === undefined) {\n return;\n }\n if (currentPath === syncThroughPath) {\n return;\n }\n if (path.dirname(directoryPath) === directoryPath) {\n return;\n }\n currentPath = directoryPath;\n }\n}\n\nfunction recorderIdentity(stats: { dev?: bigint; ino?: bigint }): string | undefined {\n if (stats.dev === undefined || stats.ino === undefined) {\n return undefined;\n }\n return `${stats.dev}:${stats.ino}`;\n}\n\nfunction requireRecorderFileIdentity(stats: {\n dev?: bigint;\n ino?: bigint;\n isFile?: () => boolean;\n nlink?: bigint;\n}): RecorderFileIdentity {\n if (stats.isFile?.() === false) {\n throw new Error(\"Server recorder path is not a regular file.\");\n }\n if (stats.dev === undefined || stats.ino === undefined) {\n throw new Error(\"Server recorder file identity is unavailable.\");\n }\n if (stats.nlink === undefined) {\n throw new Error(\"Server recorder file link count is unavailable.\");\n }\n return {\n dev: stats.dev,\n ino: stats.ino,\n nlink: stats.nlink,\n };\n}\n\nasync function recorderPathHasIdentity(\n filePath: string,\n expectedIdentity: string,\n): Promise<boolean> {\n try {\n const stats = await statPath(filePath, { bigint: true });\n if (stats.isFile?.() === false) {\n throw new Error(`Server recorder path is not a regular file: ${filePath}`);\n }\n return recorderIdentity(stats) === expectedIdentity;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n}\n\nasync function recorderWindowsPathIsRegular(filePath: string): Promise<boolean> {\n try {\n const stats = await lstat(filePath, { bigint: true });\n if (stats.isSymbolicLink() || !stats.isFile()) {\n throw new Error(`Server recorder path is not a regular file: ${filePath}`);\n }\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n}\n\nfunction requireRecorderIdentity(stats: { dev?: bigint; ino?: bigint }): string {\n const identity = recorderIdentity(stats);\n if (identity === undefined) {\n throw new Error(\"Server recorder file identity is unavailable.\");\n }\n return identity;\n}\n\nfunction recorderLockReleaseError(\n filePath: string,\n operationError: unknown,\n releaseError: unknown,\n): AggregateError | ServerRecorderCommittedError {\n if (operationError instanceof ServerRecorderCommittedError) {\n return new ServerRecorderCommittedError(\n filePath,\n operationError,\n [releaseError],\n operationError.indeterminate,\n );\n }\n return new AggregateError(\n [operationError, releaseError],\n `Server recorder append and lock release both failed for \"${filePath}\".`,\n { cause: operationError },\n );\n}\n\nfunction recorderLockAcquisitionReleaseError(\n filePath: string,\n acquisitionError: unknown,\n releaseError: unknown,\n): AggregateError {\n return new AggregateError(\n [acquisitionError, releaseError],\n `Server recorder shared lock acquisition and local lock release both failed for \"${filePath}\".`,\n { cause: acquisitionError },\n );\n}\n\nfunction recorderIdentityLockAcquisitionReleaseError(\n acquisitionError: unknown,\n releaseErrors: unknown[],\n): AggregateError {\n return new AggregateError(\n [acquisitionError, ...releaseErrors],\n \"Server recorder identity lock acquisition and cleanup both failed.\",\n { cause: acquisitionError },\n );\n}\n\nfunction isRecorderLockContention(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n (error as NodeJS.ErrnoException).code === \"ELOCKED\"\n );\n}\n\nasync function verifyPrivateServerRecorderDirectory(\n directory: string,\n currentUserId: number,\n requirePrivateMode: boolean,\n): Promise<void> {\n const handle = await open(\n directory,\n fsConstants.O_RDONLY | fsConstants.O_DIRECTORY | fsConstants.O_NOFOLLOW,\n );\n try {\n const identity = await handle.stat({ bigint: true });\n const current = await lstat(directory, { bigint: true });\n if (\n !identity.isDirectory() ||\n !current.isDirectory() ||\n current.isSymbolicLink() ||\n identity.dev !== current.dev ||\n identity.ino !== current.ino ||\n identity.uid !== BigInt(currentUserId) ||\n current.uid !== BigInt(currentUserId) ||\n (!requirePrivateMode && (identity.mode & 0o022n) !== 0n)\n ) {\n throw new Error(\"Server recorder lock directory is not privately owned.\");\n }\n if (requirePrivateMode && (identity.mode & 0o777n) !== 0o700n) {\n await handle.chmod(0o700);\n const secured = await handle.stat({ bigint: true });\n if ((secured.mode & 0o777n) !== 0o700n) {\n throw new Error(\"Server recorder lock directory permissions are not private.\");\n }\n }\n } finally {\n await handle.close();\n }\n}\n\nasync function securePrivateServerRecorderLockRoot(\n baseDirectory: string,\n components: string[],\n currentUserId: number,\n): Promise<string> {\n await verifyPrivateServerRecorderLockAncestry(baseDirectory, currentUserId);\n let currentPath = await realpath(baseDirectory);\n await verifyPrivateServerRecorderLockAncestry(currentPath, currentUserId);\n await verifyPrivateServerRecorderDirectory(currentPath, currentUserId, false);\n for (const component of components) {\n currentPath = path.join(currentPath, component);\n let created = false;\n try {\n await mkdir(currentPath, { mode: 0o700 });\n created = true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") {\n throw error;\n }\n }\n if (created) {\n await chmod(currentPath, 0o700);\n }\n await verifyPrivateServerRecorderDirectory(currentPath, currentUserId, true);\n }\n return currentPath;\n}\n\nasync function verifyPrivateServerRecorderLockAncestry(\n directory: string,\n currentUserId: number,\n): Promise<void> {\n let currentPath = path.resolve(directory);\n for (;;) {\n const current = await lstat(currentPath, { bigint: true });\n const ownerIsTrusted = current.uid === BigInt(currentUserId) || current.uid === 0n;\n if (current.isSymbolicLink()) {\n if (!ownerIsTrusted) {\n throw new Error(\"Server recorder lock directory parent namespace is not trusted.\");\n }\n } else {\n const peerWritable = (current.mode & 0o022n) !== 0n;\n const sticky = (current.mode & 0o1000n) !== 0n;\n if (!current.isDirectory() || !ownerIsTrusted || (peerWritable && !sticky)) {\n throw new Error(\"Server recorder lock directory parent namespace is not trusted.\");\n }\n }\n const parent = path.dirname(currentPath);\n if (parent === currentPath) {\n return;\n }\n currentPath = parent;\n }\n}\n\nasync function serverRecorderUnixLockRoot(currentUserId: number): Promise<string> {\n let homeDirectory: string;\n try {\n homeDirectory = userInfo().homedir;\n } catch (error) {\n throw new Error(\n `Server recorder identity locking requires an OS account home or ${RECORDER_LOCK_DIRECTORY_ENV}.`,\n { cause: error },\n );\n }\n await verifyPrivateServerRecorderLockAncestry(homeDirectory, currentUserId);\n const cacheDirectory = path.join(homeDirectory, \".cache\");\n let cacheCreated = false;\n try {\n await mkdir(cacheDirectory, { mode: 0o700 });\n cacheCreated = true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") {\n throw error;\n }\n }\n if (cacheCreated) {\n await chmod(cacheDirectory, 0o700);\n }\n return await securePrivateServerRecorderLockRoot(\n cacheDirectory,\n [\"crabline\", \"locks\", \"server-recorder\"],\n currentUserId,\n );\n}\n\ntype SecuredRecorderLockRoot = {\n assertIdentity(): Promise<void>;\n close(): Promise<void>;\n root: string;\n};\n\ntype SecuredRecorderLockArtifact = {\n assertIdentity(): Promise<void>;\n close(): Promise<void>;\n};\n\ntype RecorderLockArtifactIdentity = {\n dev: bigint;\n ino: bigint;\n};\n\nasync function secureRecorderLockArtifact(\n lockTarget: string,\n expectedIdentity: RecorderLockArtifactIdentity,\n): Promise<SecuredRecorderLockArtifact> {\n const lockDirectory = `${lockTarget}.lock`;\n let handle: Awaited<ReturnType<typeof open>>;\n try {\n handle = await open(\n lockDirectory,\n process.platform === \"win32\"\n ? \"r\"\n : fsConstants.O_RDONLY | fsConstants.O_DIRECTORY | fsConstants.O_NOFOLLOW,\n );\n } catch (error) {\n throw new Error(\"Server recorder shared lock artifact changed during acquisition.\", {\n cause: error,\n });\n }\n try {\n const identity = await handle.stat({ bigint: true });\n const current = await lstat(lockDirectory, { bigint: true });\n if (\n !identity.isDirectory() ||\n !current.isDirectory() ||\n current.isSymbolicLink() ||\n identity.dev !== expectedIdentity.dev ||\n identity.ino !== expectedIdentity.ino ||\n identity.dev !== current.dev ||\n identity.ino !== current.ino\n ) {\n throw new Error(\"Server recorder shared lock artifact changed during acquisition.\");\n }\n return {\n async assertIdentity() {\n const held = await handle.stat({ bigint: true });\n const candidate = await lstat(lockDirectory, { bigint: true });\n if (\n !held.isDirectory() ||\n !candidate.isDirectory() ||\n candidate.isSymbolicLink() ||\n held.dev !== identity.dev ||\n held.ino !== identity.ino ||\n candidate.dev !== identity.dev ||\n candidate.ino !== identity.ino\n ) {\n throw new Error(\"Server recorder shared lock artifact changed after acquisition.\");\n }\n },\n async close() {\n await handle.close();\n },\n };\n } catch (error) {\n try {\n await handle.close();\n } catch (closeError) {\n const aggregateError = new AggregateError(\n [error, closeError],\n \"Server recorder shared lock validation and handle cleanup both failed.\",\n );\n aggregateError.cause = closeError;\n throw aggregateError;\n }\n throw error;\n }\n}\n\nasync function secureRecorderLockRoot(root: string): Promise<SecuredRecorderLockRoot> {\n const configuredRoot = path.resolve(root);\n let windowsNamespace:\n | {\n path: string;\n snapshot: WindowsDirectorySecuritySnapshot;\n }\n | undefined;\n let currentUserId: number | undefined;\n if (process.platform === \"win32\") {\n const namespacePath = path.dirname(configuredRoot);\n // Writers may share the root ACL, but its parent namespace must not permit\n // an untrusted principal to replace that root.\n windowsNamespace = {\n path: namespacePath,\n snapshot: await readWindowsDirectoryNamespaceSecuritySnapshot(namespacePath),\n };\n } else {\n currentUserId = process.geteuid?.();\n if (currentUserId === undefined) {\n throw new Error(\"Server recorder identity locking requires a current user id.\");\n }\n await verifyPrivateServerRecorderLockAncestry(path.dirname(configuredRoot), currentUserId);\n }\n const canonicalRoot = await realpath(configuredRoot);\n if (path.relative(configuredRoot, canonicalRoot) !== \"\") {\n throw new Error(\n `${RECORDER_LOCK_DIRECTORY_ENV} must name a canonical directory without symlink components.`,\n );\n }\n if (currentUserId !== undefined) {\n await verifyPrivateServerRecorderLockAncestry(path.dirname(canonicalRoot), currentUserId);\n }\n const handle = await open(\n canonicalRoot,\n process.platform === \"win32\"\n ? \"r\"\n : fsConstants.O_RDONLY | fsConstants.O_DIRECTORY | fsConstants.O_NOFOLLOW,\n );\n try {\n const identity = await handle.stat({ bigint: true });\n const current = await lstat(canonicalRoot, { bigint: true });\n if (\n !identity.isDirectory() ||\n !current.isDirectory() ||\n current.isSymbolicLink() ||\n identity.dev !== current.dev ||\n identity.ino !== current.ino\n ) {\n throw new Error(\"Server recorder lock directory changed while opening it.\");\n }\n if (\n currentUserId !== undefined &&\n ((identity.mode & 0o002n) !== 0n || (current.mode & 0o002n) !== 0n)\n ) {\n throw new Error(\"Server recorder shared lock directory is writable by every local user.\");\n }\n if (windowsNamespace) {\n const currentNamespace = await readWindowsDirectoryNamespaceSecuritySnapshot(\n windowsNamespace.path,\n );\n if (\n currentNamespace.identity !== windowsNamespace.snapshot.identity ||\n currentNamespace.securityDescriptor !== windowsNamespace.snapshot.securityDescriptor\n ) {\n throw new Error(\"Server recorder shared lock directory changed while opening it.\");\n }\n }\n return {\n async assertIdentity() {\n if (currentUserId !== undefined) {\n await verifyPrivateServerRecorderLockAncestry(path.dirname(canonicalRoot), currentUserId);\n }\n const held = await handle.stat({ bigint: true });\n const candidate = await lstat(canonicalRoot, { bigint: true });\n if (\n !held.isDirectory() ||\n !candidate.isDirectory() ||\n candidate.isSymbolicLink() ||\n held.dev !== identity.dev ||\n held.ino !== identity.ino ||\n candidate.dev !== identity.dev ||\n candidate.ino !== identity.ino ||\n (currentUserId !== undefined &&\n ((held.mode & 0o002n) !== 0n || (candidate.mode & 0o002n) !== 0n))\n ) {\n throw new Error(\"Server recorder shared lock directory changed after validation.\");\n }\n if (windowsNamespace) {\n const currentNamespace = await readWindowsDirectoryNamespaceSecuritySnapshot(\n windowsNamespace.path,\n );\n if (\n currentNamespace.identity !== windowsNamespace.snapshot.identity ||\n currentNamespace.securityDescriptor !== windowsNamespace.snapshot.securityDescriptor\n ) {\n throw new Error(\"Server recorder shared lock directory changed after validation.\");\n }\n }\n },\n async close() {\n await handle.close();\n },\n root: canonicalRoot,\n };\n } catch (error) {\n try {\n await handle.close();\n } catch (closeError) {\n const aggregateError = new AggregateError(\n [error, closeError],\n \"Server recorder lock-root validation and handle cleanup both failed.\",\n );\n aggregateError.cause = closeError;\n throw aggregateError;\n }\n throw error;\n }\n}\n\nfunction recorderIdentityLockPath(root: string, identity: RecorderFileIdentity): string {\n return path.join(root, `recorder-${identity.dev}-${identity.ino}`);\n}\n\nfunction recorderSharedIdentityLockPath(root: string, identity: RecorderFileIdentity): string {\n // A shared inode can report different device numbers across mount namespaces.\n return path.join(root, `recorder-${identity.ino}`);\n}\n\ntype RecorderLockTarget = {\n namespaces: SecuredRecorderLockRoot[];\n path: string;\n};\n\nfunction deduplicateRecorderLockTargets(targets: RecorderLockTarget[]): RecorderLockTarget[] {\n const retained = new Map<string, RecorderLockTarget>();\n for (const target of targets) {\n const resolved = path.resolve(target.path);\n const key =\n process.platform === \"win32\" ? path.win32.normalize(resolved).toLowerCase() : resolved;\n const existing = retained.get(key);\n if (existing) {\n for (const namespace of target.namespaces) {\n if (!existing.namespaces.includes(namespace)) {\n existing.namespaces.push(namespace);\n }\n }\n continue;\n }\n retained.set(key, { namespaces: [...target.namespaces], path: target.path });\n }\n return [...retained.values()];\n}\n\nexport async function secureServerRecorderWindowsLockRoot(\n root: string,\n options: {\n createWindowsDirectory?: (directoryPath: string) => Promise<void>;\n readWindowsDirectorySecuritySnapshot?: (\n directoryPath: string,\n ) => Promise<WindowsDirectorySecuritySnapshot>;\n } = {},\n): Promise<string> {\n const cacheKey = path.win32.normalize(path.resolve(root)).toLowerCase();\n return secureCachedWindowsLockRoot({\n cache: securedWindowsLockRoots,\n cacheKey,\n createDirectory: () =>\n (options.createWindowsDirectory ?? createOwnerOnlyWindowsDirectory)(root),\n errorPrefix: \"Server recorder Windows lock root\",\n readSecuritySnapshot: () =>\n (options.readWindowsDirectorySecuritySnapshot ?? readWindowsDirectorySecuritySnapshot)(root),\n root,\n });\n}\n\nasync function secureServerRecorderWindowsDirectory(root: string): Promise<string> {\n const cacheKey = path.win32.normalize(path.resolve(root)).toLowerCase();\n return secureCachedWindowsLockRoot({\n cache: securedWindowsRecorderDirectories,\n cacheKey,\n createDirectory: async () => {\n try {\n const identity = await lstat(root);\n if (!identity.isDirectory() || identity.isSymbolicLink()) {\n throw new Error(\"Server recorder Windows directory is not a private directory.\");\n }\n if (isManagedRecorderDirectory(root)) {\n await createOwnerOnlyWindowsDirectory(root);\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n await createOwnerOnlyWindowsDirectory(root);\n }\n },\n errorPrefix: \"Server recorder Windows directory\",\n readSecuritySnapshot: () => readWindowsDirectoryNamespaceSecuritySnapshot(root),\n root,\n });\n}\n\nfunction serverRecorderWindowsLockRoot(): string {\n const configuredRoot = process.env.LOCALAPPDATA?.trim();\n const localAppData =\n configuredRoot && path.isAbsolute(configuredRoot)\n ? configuredRoot\n : path.join(userInfo().homedir, \"AppData\", \"Local\");\n return path.join(localAppData, \"Crabline\", \"locks\", \"server-recorder\");\n}\n\nexport function serverRecorderWindowsLockPath(root: string, filePath: string): string {\n const canonicalPath = path.win32.normalize(filePath).toLowerCase();\n const fingerprint = createHash(\"sha256\").update(canonicalPath).digest(\"hex\");\n return path.join(root, `recorder-${fingerprint}`);\n}\n\nasync function recorderProcessLockTarget(filePath: string): Promise<string> {\n if (process.platform !== \"win32\") {\n return filePath;\n }\n const root = await secureServerRecorderWindowsLockRoot(serverRecorderWindowsLockRoot());\n return serverRecorderWindowsLockPath(root, filePath);\n}\n\nasync function recorderLocalIdentityLockTarget(\n fileIdentity: RecorderFileIdentity,\n): Promise<string> {\n if (process.platform === \"win32\") {\n const root = await secureServerRecorderWindowsLockRoot(serverRecorderWindowsLockRoot());\n return recorderIdentityLockPath(root, fileIdentity);\n }\n const currentUserId = process.geteuid?.();\n if (currentUserId === undefined) {\n throw new Error(\"Server recorder identity locking requires a current user id.\");\n }\n return recorderIdentityLockPath(await serverRecorderUnixLockRoot(currentUserId), fileIdentity);\n}\n\nasync function recorderIdentityLockTargets(\n fileIdentity: RecorderFileIdentity,\n): Promise<RecorderLockTarget[]> {\n const configuredRoot = process.env[RECORDER_LOCK_DIRECTORY_ENV]?.trim();\n if (configuredRoot) {\n if (!path.isAbsolute(configuredRoot)) {\n throw new Error(`${RECORDER_LOCK_DIRECTORY_ENV} must be an absolute path.`);\n }\n const sharedRoot = await secureRecorderLockRoot(configuredRoot);\n try {\n // Lock every configured writer in the shared namespace before a first hardlink can appear.\n return deduplicateRecorderLockTargets([\n { namespaces: [], path: await recorderLocalIdentityLockTarget(fileIdentity) },\n {\n namespaces: [sharedRoot],\n path: recorderSharedIdentityLockPath(sharedRoot.root, fileIdentity),\n },\n ]);\n } catch (error) {\n await sharedRoot.close();\n throw error;\n }\n }\n if (fileIdentity.nlink > 1n) {\n throw new Error(\n `Server recorder hardlinks require ${RECORDER_LOCK_DIRECTORY_ENV} to name one shared writable lock directory for every writer.`,\n );\n }\n return deduplicateRecorderLockTargets([\n { namespaces: [], path: await recorderLocalIdentityLockTarget(fileIdentity) },\n ]);\n}\n\ntype AcquiredRecorderLock = {\n artifactIdentity: RecorderLockArtifactIdentity | undefined;\n release(): Promise<void>;\n};\n\nasync function acquireSingleRecorderLock(filePath: string): Promise<AcquiredRecorderLock> {\n const deadline = performance.now() + RECORDER_LOCK_STALE_MS + RECORDER_LOCK_WAIT_MARGIN_MS;\n const lockDirectory = path.resolve(`${filePath}.lock`);\n let artifactIdentity: RecorderLockArtifactIdentity | undefined;\n const lockFileSystem = createProcessOwnedLockFileSystem({\n onDirectoryOwned(directoryPath, identity) {\n if (path.resolve(directoryPath) === lockDirectory) {\n artifactIdentity = identity;\n }\n },\n });\n for (;;) {\n try {\n const release = await lock(filePath, {\n fs: lockFileSystem,\n realpath: false,\n retries: 0,\n stale: RECORDER_LOCK_STALE_MS,\n update: RECORDER_LOCK_UPDATE_MS,\n });\n return { artifactIdentity, release };\n } catch (error) {\n if (!isRecorderLockContention(error)) {\n throw error;\n }\n const remainingMs = deadline - performance.now();\n if (remainingMs <= 0) {\n throw error;\n }\n await new Promise((resolve) =>\n setTimeout(resolve, Math.min(RECORDER_LOCK_RETRY_MS, remainingMs)),\n );\n }\n }\n}\n\nasync function releaseRecorderLockSet(releases: Array<() => Promise<void>>): Promise<void> {\n const errors: unknown[] = [];\n for (const release of releases.reverse()) {\n try {\n await release();\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length === 1) {\n throw errors[0];\n }\n if (errors.length > 1) {\n throw new AggregateError(errors, \"Multiple server recorder locks failed to release.\");\n }\n}\n\nasync function acquireRecorderLock(\n filePath: string,\n useProcessLocalWindowsTarget = true,\n): Promise<AcquiredRecorderLock> {\n if (process.platform !== \"win32\" || !useProcessLocalWindowsTarget) {\n return await acquireSingleRecorderLock(filePath);\n }\n const localLock = await acquireSingleRecorderLock(await recorderProcessLockTarget(filePath));\n try {\n const sharedLock = await acquireSingleRecorderLock(filePath);\n return {\n artifactIdentity: sharedLock.artifactIdentity,\n async release() {\n await releaseRecorderLockSet([localLock.release, sharedLock.release]);\n },\n };\n } catch (error) {\n const [releaseResult] = await Promise.allSettled([localLock.release()]);\n if (releaseResult?.status === \"rejected\") {\n throw recorderLockAcquisitionReleaseError(filePath, error, releaseResult.reason);\n }\n throw error;\n }\n}\n\nasync function acquireRecorderIdentityLock(identity: RecorderFileIdentity): Promise<{\n assertNamespace(): Promise<void>;\n release(): Promise<void>;\n}> {\n const releases: Array<() => Promise<void>> = [];\n const artifacts = new Set<SecuredRecorderLockArtifact>();\n const namespaces = new Set<SecuredRecorderLockRoot>();\n const closeBindings = async (): Promise<unknown[]> => {\n const closeResults = await Promise.allSettled(\n [...artifacts, ...namespaces].map(async (binding) => binding.close()),\n );\n return closeResults\n .filter((result): result is PromiseRejectedResult => result.status === \"rejected\")\n .map((result) => result.reason);\n };\n const assertNamespaces = async (): Promise<void> => {\n for (const namespace of namespaces) {\n await namespace.assertIdentity();\n }\n for (const artifact of artifacts) {\n await artifact.assertIdentity();\n }\n };\n try {\n const targets = await recorderIdentityLockTargets(identity);\n for (const target of targets) {\n for (const namespace of target.namespaces) {\n namespaces.add(namespace);\n }\n }\n for (const target of targets) {\n for (const namespace of target.namespaces) {\n await namespace.assertIdentity();\n }\n const acquired = await acquireRecorderLock(target.path, false);\n try {\n if (target.namespaces.length > 0) {\n if (!acquired.artifactIdentity) {\n throw new Error(\n \"Server recorder shared lock identity is unavailable after acquisition.\",\n );\n }\n artifacts.add(await secureRecorderLockArtifact(target.path, acquired.artifactIdentity));\n }\n } catch (error) {\n try {\n await acquired.release();\n } catch (releaseError) {\n throw recorderLockAcquisitionReleaseError(target.path, error, releaseError);\n }\n throw error;\n }\n releases.push(acquired.release);\n for (const namespace of target.namespaces) {\n await namespace.assertIdentity();\n }\n }\n } catch (error) {\n const releaseResults = await Promise.allSettled(\n releases.reverse().map(async (release) => release()),\n );\n const releaseErrors = releaseResults\n .filter((result): result is PromiseRejectedResult => result.status === \"rejected\")\n .map((result) => result.reason);\n const cleanupErrors = [...releaseErrors, ...(await closeBindings())];\n if (cleanupErrors.length > 0) {\n throw recorderIdentityLockAcquisitionReleaseError(error, cleanupErrors);\n }\n throw error;\n }\n return {\n assertNamespace: assertNamespaces,\n async release() {\n let releaseError: unknown;\n try {\n await releaseRecorderLockSet(releases);\n } catch (error) {\n releaseError = error;\n }\n const closeErrors = await closeBindings();\n if (releaseError !== undefined) {\n if (closeErrors.length > 0) {\n throw new AggregateError(\n [releaseError, ...closeErrors],\n \"Server recorder identity lock and namespace cleanup both failed.\",\n { cause: releaseError },\n );\n }\n throw releaseError;\n }\n if (closeErrors.length === 1) {\n throw closeErrors[0];\n }\n if (closeErrors.length > 1) {\n throw new AggregateError(\n closeErrors,\n \"Multiple server recorder lock namespaces failed to close.\",\n );\n }\n },\n };\n}\n\nasync function withRecorderLock(\n lockPath: string,\n logicalPath: string,\n operation: () => Promise<boolean | undefined>,\n): Promise<boolean | undefined> {\n const { release } = await acquireRecorderLock(lockPath);\n let operationFailed = false;\n let operationError: unknown;\n let result: boolean | undefined;\n try {\n result = await operation();\n } catch (error) {\n operationFailed = true;\n operationError = error;\n }\n try {\n await release();\n } catch (releaseError) {\n if (operationFailed) {\n throw recorderLockReleaseError(logicalPath, operationError, releaseError);\n }\n if (result === true) {\n throw new ServerRecorderCommittedError(logicalPath, releaseError);\n }\n throw releaseError;\n }\n if (operationFailed) {\n throw operationError;\n }\n return result;\n}\n\nasync function closeRecorderAttempt(params: {\n committed: boolean;\n file: Awaited<ReturnType<typeof open>>;\n filePath: string;\n operationFailed: boolean;\n operationError: unknown;\n}): Promise<void> {\n let closeFailed = false;\n let closeError: unknown;\n try {\n await params.file.close();\n } catch (error) {\n closeFailed = true;\n closeError = error;\n }\n if (closeFailed) {\n if (params.operationFailed) {\n if (params.operationError instanceof ServerRecorderCommittedError) {\n throw new ServerRecorderCommittedError(\n params.filePath,\n params.operationError,\n [closeError],\n params.operationError.indeterminate,\n );\n }\n throw new AggregateError(\n [params.operationError, closeError],\n \"Server recorder operation and file close both failed.\",\n { cause: closeError },\n );\n }\n if (params.committed) {\n throw new ServerRecorderCommittedError(params.filePath, closeError);\n }\n throw closeError;\n }\n if (params.operationFailed) {\n throw params.operationError;\n }\n}\n\nasync function appendRecorderAttempt(params: {\n createdDirectory: string | undefined;\n logicalPath: string;\n line: string;\n publicationPath: string;\n}): Promise<\"committed\" | \"retargeted\" | \"retry\"> {\n const opened = await openRecorderFile(params.publicationPath);\n const { file } = opened;\n let committed = false;\n let operationFailed = false;\n let operationError: unknown;\n let identityLock:\n | {\n assertNamespace(): Promise<void>;\n release(): Promise<void>;\n }\n | undefined;\n let result: \"committed\" | \"retargeted\" | \"retry\" | undefined;\n try {\n const openedStats = await file.stat({ bigint: true });\n const lockedIdentity = requireRecorderFileIdentity(openedStats);\n let identity = `${lockedIdentity.dev}:${lockedIdentity.ino}`;\n if (opened.created) {\n await file.chmod(0o600);\n }\n if (\n process.platform === \"win32\" &&\n !(await recorderWindowsPathIsRegular(params.publicationPath))\n ) {\n result = \"retry\";\n } else if (!(await recorderPathHasIdentity(params.publicationPath, identity))) {\n result = \"retry\";\n } else {\n identityLock = await acquireRecorderIdentityLock(lockedIdentity);\n await identityLock.assertNamespace();\n // Lock acquisition may have blocked while another writer repaired or appended.\n let stats = await file.stat({ bigint: true });\n const currentIdentity = requireRecorderFileIdentity(stats);\n identity = requireRecorderIdentity(stats);\n if (\n currentIdentity.dev !== lockedIdentity.dev ||\n currentIdentity.ino !== lockedIdentity.ino ||\n currentIdentity.nlink !== lockedIdentity.nlink ||\n !(await recorderPathHasIdentity(params.publicationPath, identity))\n ) {\n result = \"retry\";\n } else if ((await resolveRecorderPath(params.logicalPath)) !== params.publicationPath) {\n result = \"retargeted\";\n }\n if (result === undefined) {\n const fileSize = recorderFileSize(stats.size);\n if (fileSize > 0) {\n const finalByte = await readBufferAt(file, 1, fileSize - 1);\n if (finalByte[0] !== 0x0a) {\n const tailStart = await findIncompleteTailStart(file, fileSize);\n const tailLength = fileSize - tailStart;\n if (tailLength > MAX_RECOVERY_VALIDATION_BYTES) {\n throw recoveryValidationLimitError();\n }\n const tail = await readBufferAt(file, tailLength, tailStart);\n if (tail.length !== tailLength) {\n throw new Error(\"Server recorder changed while repairing its final record.\");\n }\n try {\n JSON.parse(tail.toString(\"utf8\"));\n await identityLock.assertNamespace();\n await appendRecorderText(file, \"\\n\", fileSize);\n } catch (error) {\n if (!(error instanceof SyntaxError)) {\n throw error;\n }\n await identityLock.assertNamespace();\n if (\n !(await truncateRecorderFile(file, params.publicationPath, identity, tailStart))\n ) {\n result = \"retry\";\n }\n }\n }\n }\n if (result === undefined) {\n // Repair and truncation change EOF; refresh it before a positional Windows append.\n stats = await file.stat({ bigint: true });\n identity = requireRecorderIdentity(stats);\n }\n if (\n result === undefined &&\n !(await recorderPathHasIdentity(params.publicationPath, identity))\n ) {\n result = \"retry\";\n } else if (result === undefined) {\n try {\n await identityLock.assertNamespace();\n await appendRecorderText(file, params.line, recorderFileSize(stats.size));\n await file.sync();\n if (\n !(await recorderPathHasIdentity(params.publicationPath, identity)) ||\n (await resolveRecorderPath(params.logicalPath)) !== params.publicationPath\n ) {\n throw new ServerRecorderCommittedError(\n params.logicalPath,\n new ServerRecorderRotationError(\"Server recorder rotated during append.\"),\n );\n } else {\n const firstCreatedPath =\n params.createdDirectory ?? (opened.created ? params.publicationPath : undefined);\n await syncRecorderPathAncestry(params.publicationPath, firstCreatedPath);\n if (\n !(await recorderPathHasIdentity(params.publicationPath, identity)) ||\n (await resolveRecorderPath(params.logicalPath)) !== params.publicationPath\n ) {\n throw new ServerRecorderCommittedError(\n params.logicalPath,\n new ServerRecorderRotationError(\n \"Server recorder rotated while syncing path ancestry.\",\n ),\n );\n } else {\n committed = true;\n result = \"committed\";\n }\n }\n } catch (error) {\n if (error instanceof ServerRecorderCommittedError) {\n throw error;\n }\n if (error instanceof ServerRecorderDirectorySyncError) {\n throw new ServerRecorderCommittedError(\n params.logicalPath,\n error.syncError,\n [error.closeError],\n true,\n );\n }\n throw new ServerRecorderCommittedError(params.logicalPath, error, [], true);\n }\n }\n }\n }\n } catch (error) {\n operationFailed = true;\n operationError = error;\n }\n if (identityLock) {\n try {\n await identityLock.release();\n } catch (releaseError) {\n if (operationFailed) {\n operationError = recorderLockReleaseError(params.logicalPath, operationError, releaseError);\n } else {\n operationFailed = true;\n operationError = committed\n ? new ServerRecorderCommittedError(params.logicalPath, releaseError)\n : releaseError;\n }\n }\n }\n await closeRecorderAttempt({\n committed,\n file,\n filePath: params.logicalPath,\n operationError,\n operationFailed,\n });\n return result ?? \"retry\";\n}\n\nasync function resolveRecorderPath(filePath: string): Promise<string> {\n try {\n return await realpath(filePath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n try {\n if ((await lstat(filePath)).isSymbolicLink()) {\n const target = await readlink(filePath);\n return await resolveRecorderPath(path.resolve(path.dirname(filePath), target));\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n return path.join(await resolveRecorderPath(path.dirname(filePath)), path.basename(filePath));\n}\n\nfunction planObserver(params: {\n key: string;\n logicalPath: string;\n onEvent: ServerEventObserver | undefined;\n}): ObserverPlan | undefined {\n if (params.onEvent === undefined) {\n return undefined;\n }\n const dependencies = new Set<ObserverTask>();\n const previousLogical = pendingLogicalObservers.get(params.logicalPath);\n const previousPublication = pendingPublicationObservers.get(params.key);\n if (previousLogical !== undefined) {\n dependencies.add(previousLogical);\n }\n if (previousPublication !== undefined) {\n dependencies.add(previousPublication);\n }\n let markStarted!: () => void;\n const started = new Promise<void>((resolve) => {\n markStarted = resolve;\n });\n const task: ObserverTask = {\n markStarted,\n started,\n };\n return { dependencies, task };\n}\n\nfunction activateObserver(params: {\n event: ServerRequestEvent;\n key: string;\n logicalPath: string;\n onEvent: ServerEventObserver | undefined;\n plan: ObserverPlan | undefined;\n}): Promise<void> {\n if (params.onEvent === undefined || params.plan === undefined) {\n return Promise.resolve();\n }\n const { dependencies, task } = params.plan;\n const current = Promise.all(\n [...dependencies].map((dependency) => dependency.started.catch(() => {})),\n ).then(async () => {\n try {\n const observation = params.onEvent?.(params.event);\n task.markStarted();\n await observation;\n } catch (error) {\n task.markStarted();\n throw new ServerRecorderCommittedError(params.logicalPath, error);\n }\n });\n pendingLogicalObservers.set(params.logicalPath, task);\n pendingPublicationObservers.set(params.key, task);\n void current.then(\n () => {\n if (pendingLogicalObservers.get(params.logicalPath) === task) {\n pendingLogicalObservers.delete(params.logicalPath);\n }\n if (pendingPublicationObservers.get(params.key) === task) {\n pendingPublicationObservers.delete(params.key);\n }\n },\n () => {\n if (pendingLogicalObservers.get(params.logicalPath) === task) {\n pendingLogicalObservers.delete(params.logicalPath);\n }\n if (pendingPublicationObservers.get(params.key) === task) {\n pendingPublicationObservers.delete(params.key);\n }\n },\n );\n return current;\n}\n\ntype RecorderAppendResult = {\n observation: Promise<void>;\n};\n\nasync function appendResolvedJsonLine(params: {\n event: ServerRequestEvent;\n line: string;\n logicalPath: string;\n onEvent: ServerEventObserver | undefined;\n}): Promise<RecorderAppendResult | undefined> {\n const { logicalPath } = params;\n const key = await resolveRecorderPath(logicalPath);\n const previous = pendingAppends.get(key) ?? Promise.resolve();\n const current = previous\n .catch(() => {})\n .then(async () => {\n const observerPlan = planObserver({\n key,\n logicalPath,\n onEvent: params.onEvent,\n });\n let observerActivated = false;\n try {\n const directory = path.dirname(key);\n let createdDirectory: string | undefined;\n if (process.platform === \"win32\") {\n await secureServerRecorderWindowsDirectory(directory);\n } else {\n createdDirectory = await mkdir(directory, { mode: 0o700, recursive: true });\n if (createdDirectory !== undefined || isManagedRecorderDirectory(directory)) {\n await chmod(directory, 0o700);\n }\n }\n // Keep the cross-process lock through append verification.\n const committed = await withRecorderLock(key, logicalPath, async () => {\n if ((await resolveRecorderPath(logicalPath)) !== key) {\n return undefined;\n }\n for (let attempt = 0; attempt < RECORDER_ROTATION_ATTEMPTS; attempt++) {\n const result = await appendRecorderAttempt({\n createdDirectory,\n logicalPath,\n line: params.line,\n publicationPath: key,\n });\n if (result === \"committed\") {\n return true;\n }\n if (result === \"retargeted\") {\n return undefined;\n }\n }\n throw new ServerRecorderRotationError(\n `Server recorder rotation retries exhausted for \"${logicalPath}\".`,\n );\n });\n if (committed !== true) {\n return undefined;\n }\n observerActivated = true;\n return {\n observation: activateObserver({\n event: params.event,\n key,\n logicalPath,\n onEvent: params.onEvent,\n plan: observerPlan,\n }),\n };\n } finally {\n if (!observerActivated) {\n observerPlan?.task.markStarted();\n }\n }\n });\n const tail = current.then(\n () => undefined,\n () => undefined,\n );\n pendingAppends.set(key, tail);\n\n try {\n return await current;\n } finally {\n if (pendingAppends.get(key) === tail) {\n pendingAppends.delete(key);\n }\n }\n}\n\nasync function appendJsonLine(params: {\n event: ServerRequestEvent;\n line: string;\n onEvent: ServerEventObserver | undefined;\n recorderPath: string;\n}): Promise<void> {\n const logicalPath = path.resolve(params.recorderPath);\n const previous = pendingAdmissions.get(logicalPath) ?? Promise.resolve();\n const current = previous\n .catch(() => {})\n .then(async () => {\n for (let attempt = 0; attempt < RECORDER_PATH_ATTEMPTS; attempt++) {\n const result = await appendResolvedJsonLine({\n event: params.event,\n line: params.line,\n logicalPath,\n onEvent: params.onEvent,\n });\n if (result !== undefined) {\n return result;\n }\n }\n throw new ServerRecorderRotationError(\n `Server recorder path retries exhausted for \"${logicalPath}\".`,\n );\n });\n const tail = current.then(\n () => undefined,\n () => undefined,\n );\n pendingAdmissions.set(logicalPath, tail);\n\n let result: RecorderAppendResult;\n try {\n result = await current;\n } finally {\n if (pendingAdmissions.get(logicalPath) === tail) {\n pendingAdmissions.delete(logicalPath);\n }\n }\n await result.observation;\n}\n\nfunction snapshotServerEvent(event: ServerRequestEvent): {\n event: ServerRequestEvent;\n line: string;\n} {\n const serialized = JSON.stringify(event);\n if (serialized === undefined) {\n throw new TypeError(\"Server recorder event is not JSON-serializable.\");\n }\n return {\n event: JSON.parse(serialized) as ServerRequestEvent,\n line: `${serialized}\\n`,\n };\n}\n\nexport async function recordServerEvent(params: {\n event: ServerRequestEvent;\n onEvent: ServerEventObserver | undefined;\n recorderPath: string;\n}): Promise<void> {\n const snapshot = snapshotServerEvent(params.event);\n await appendJsonLine({\n ...snapshot,\n onEvent: params.onEvent,\n recorderPath: params.recorderPath,\n });\n}\n\nexport async function recordCommittedServerEvent(params: {\n event: ServerRequestEvent;\n onEvent: ServerEventObserver | undefined;\n recorderPath: string;\n}): Promise<void> {\n try {\n const snapshot = snapshotServerEvent(params.event);\n await appendJsonLine({\n ...snapshot,\n onEvent: params.onEvent,\n recorderPath: params.recorderPath,\n });\n } catch {\n // The provider mutation already committed, so telemetry failure cannot change its response.\n }\n}\n"]}
1
+ {"version":3,"file":"recorder.js","sourceRoot":"","sources":["../../../src/servers/recorder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,IAAI,WAAW,EAAiB,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACnG,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EACL,gCAAgC,EAChC,kCAAkC,GACnC,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,+BAA+B,EAC/B,6CAA6C,EAC7C,oCAAoC,GAErC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EACL,2BAA2B,GAE5B,MAAM,kCAAkC,CAAC;AAK1C,MAAM,OAAO,4BAA6B,SAAQ,cAAc;IACrD,SAAS,GAAG,IAAI,CAAC;IACjB,aAAa,CAAU;IAEhC,YACE,QAAgB,EAChB,cAAuB,EACvB,aAAa,GAAc,EAAE,EAC7B,aAAa,GAAG,KAAK;QAErB,KAAK,CACH,CAAC,cAAc,EAAE,GAAG,aAAa,CAAC,EAClC,aAAa;YACX,CAAC,CAAC,uDAAuD,QAAQ,qCAAqC;YACtG,CAAC,CAAC,yCAAyC,QAAQ,gCAAgC,EACrF,EAAE,KAAK,EAAE,cAAc,EAAE,CAC1B,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;QAC3C,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;CACF;AAED,MAAM,2BAA4B,SAAQ,KAAK;CAAG;AAElD,MAAM,gCAAiC,SAAQ,cAAc;IAEhD,SAAS;IACT,UAAU;IAFrB,YACW,SAAkB,EAClB,UAAmB;QAE5B,KAAK,CACH,CAAC,SAAS,EAAE,UAAU,CAAC,EACvB,gEAAgE,EAChE,EAAE,KAAK,EAAE,SAAS,EAAE,CACrB,CAAC;yBAPO,SAAS;0BACT,UAAU;IAOrB,CAAC;CACF;AAkBD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAyB,CAAC;AACxD,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAyB,CAAC;AAC3D,MAAM,uBAAuB,GAAG,IAAI,GAAG,EAAwB,CAAC;AAChE,MAAM,2BAA2B,GAAG,IAAI,GAAG,EAAwB,CAAC;AACpE,MAAM,uBAAuB,GAAG,IAAI,GAAG,EAA4C,CAAC;AACpF,MAAM,iCAAiC,GAAG,IAAI,GAAG,EAA4C,CAAC;AAC9F,MAAM,6BAA6B,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AACvD,MAAM,uBAAuB,GAAG,6BAA6B,GAAG,CAAC,CAAC;AAClE,MAAM,sBAAsB,GAAG,GAAG,CAAC;AACnC,MAAM,sBAAsB,GAAG,MAAM,CAAC;AACtC,MAAM,uBAAuB,GAAG,MAAM,CAAC;AACvC,MAAM,4BAA4B,GAAG,KAAK,CAAC;AAC3C,MAAM,2BAA2B,GAAG,4BAA4B,CAAC;AACjE,MAAM,sBAAsB,GAAG,CAAC,CAAC;AACjC,MAAM,0BAA0B,GAAG,CAAC,CAAC;AACrC,MAAM,qBAAqB,GAAG,EAAE,GAAG,IAAI,CAAC;AAExC,KAAK,UAAU,YAAY,CACzB,IAAsC,EACtC,MAAc,EACd,QAAgB;IAEhB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,OAAO,SAAS,GAAG,MAAM,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,GAAG,SAAS,CAAC,CAAC;QAC5F,IAAI,MAAM,CAAC,SAAS,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM;QACR,CAAC;QACD,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC;IAChC,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;AACvC,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,IAAsC,EACtC,QAAgB,EAChB,QAAgB;IAEhB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7C,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,OAAO,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,GAAG,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC;QAC9F,IAAI,MAAM,CAAC,YAAY,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,IAAI,MAAM,CAAC,YAAY,CAAC;IACjC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,uBAAuB,CACpC,IAAsC,EACtC,QAAgB;IAEhB,IAAI,QAAQ,GAAG,QAAQ,CAAC;IACxB,OAAO,QAAQ,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAC;QACzC,MAAM,kBAAkB,GAAG,uBAAuB,GAAG,YAAY,CAAC;QAClE,IAAI,kBAAkB,IAAI,CAAC,EAAE,CAAC;YAC5B,MAAM,4BAA4B,EAAE,CAAC;QACvC,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,kBAAkB,CAAC,CAAC,CAAC;QAC/F,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,UAAU,EAAE,UAAU,CAAC,CAAC;QAC1E,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;YACrB,OAAO,UAAU,GAAG,WAAW,GAAG,CAAC,CAAC;QACtC,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM;QACR,CAAC;QACD,QAAQ,GAAG,UAAU,CAAC;IACxB,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,4BAA4B;IACnC,OAAO,IAAI,KAAK,CACd,sFAAsF,CACvF,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAqB;IAC7C,MAAM,UAAU,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,QAAgB;IAEhB,IAAI,CAAC;QACH,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,MAAM,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC;SACzC,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,MAAM,KAAK,CAAC;QACd,CAAC;QACD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,MAAM,IAAI,CACd,QAAQ;YACR,8EAA8E;YAC9E,OAAO,CAAC,QAAQ,KAAK,OAAO;gBAC1B,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,WAAW,CAAC,MAAM;oBAChB,WAAW,CAAC,QAAQ;oBACpB,WAAW,CAAC,UAAU;oBACtB,WAAW,CAAC,UAAU,EAC5B,KAAK,CACN;SACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,IAAsC,EACtC,QAAgB,EAChB,gBAAwB,EACxB,MAAc;IAEd,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,UAA4C,CAAC;IACjD,IAAI,CAAC;QACH,UAAU,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GAAI,KAA+B,CAAC,IAAI,CAAC;QACnD,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrF,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,eAAe,GAAG,KAAK,CAAC;IAC5B,IAAI,cAAuB,CAAC;IAC5B,IAAI,CAAC;QACH,IAAI,uBAAuB,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,gBAAgB,EAAE,CAAC;YAC1F,MAAM,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;YACxB,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,eAAe,GAAG,IAAI,CAAC;QACvB,cAAc,GAAG,KAAK,CAAC;IACzB,CAAC;IACD,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,UAAmB,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,WAAW,GAAG,IAAI,CAAC;QACnB,UAAU,GAAG,KAAK,CAAC;IACrB,CAAC;IACD,IAAI,WAAW,EAAE,CAAC;QAChB,IAAI,eAAe,EAAE,CAAC;YACpB,MAAM,IAAI,cAAc,CACtB,CAAC,cAAc,EAAE,UAAU,CAAC,EAC5B,kEAAkE,EAClE,EAAE,KAAK,EAAE,UAAU,EAAE,CACtB,CAAC;QACJ,CAAC;QACD,MAAM,UAAU,CAAC;IACnB,CAAC;IACD,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,cAAc,CAAC;IACvB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,aAAqB;IAChD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO;IACT,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;IACjD,IAAI,SAAkB,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,SAAS,GAAG,KAAK,CAAC;IACpB,CAAC;IACD,IAAI,UAAmB,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,GAAG,KAAK,CAAC;IACrB,CAAC;IACD,IAAI,SAAS,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QACxD,MAAM,IAAI,gCAAgC,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,SAAS,CAAC;IAClB,CAAC;IACD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,UAAU,CAAC;IACnB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,wBAAwB,CACrC,QAAgB,EAChB,qBAA8B;IAE9B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO;IACT,CAAC;IACD,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChD,IAAI,WAAW,GAAG,gBAAgB,CAAC;IACnC,MAAM,eAAe,GACnB,qBAAqB,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACxF,SAAS,CAAC;QACR,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,eAAe,KAAK,SAAS,IAAI,WAAW,KAAK,gBAAgB,CAAC;QACpF,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,aAAa,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,GAAI,KAA+B,CAAC,IAAI,CAAC;YACnD,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,OAAO,CAAC,EAAE,CAAC;gBAC1D,OAAO;YACT,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QACD,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;YAClC,OAAO;QACT,CAAC;QACD,IAAI,WAAW,KAAK,eAAe,EAAE,CAAC;YACpC,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,aAAa,EAAE,CAAC;YAClD,OAAO;QACT,CAAC;QACD,WAAW,GAAG,aAAa,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAqC;IAC7D,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QACvD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;AACrC,CAAC;AAED,SAAS,2BAA2B,CAAC,KAKpC;IACC,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,KAAK,KAAK,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IACD,OAAO;QACL,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,KAAK,EAAE,KAAK,CAAC,KAAK;KACnB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,uBAAuB,CACpC,QAAgB,EAChB,gBAAwB;IAExB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,KAAK,KAAK,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,+CAA+C,QAAQ,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,gBAAgB,CAAC,KAAK,CAAC,KAAK,gBAAgB,CAAC;IACtD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,4BAA4B,CAAC,QAAgB;IAC1D,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,IAAI,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,+CAA+C,QAAQ,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAqC;IACpE,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,wBAAwB,CAC/B,QAAgB,EAChB,cAAuB,EACvB,YAAqB;IAErB,IAAI,cAAc,YAAY,4BAA4B,EAAE,CAAC;QAC3D,OAAO,IAAI,4BAA4B,CACrC,QAAQ,EACR,cAAc,EACd,CAAC,YAAY,CAAC,EACd,cAAc,CAAC,aAAa,CAC7B,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,cAAc,CACvB,CAAC,cAAc,EAAE,YAAY,CAAC,EAC9B,4DAA4D,QAAQ,IAAI,EACxE,EAAE,KAAK,EAAE,cAAc,EAAE,CAC1B,CAAC;AACJ,CAAC;AAED,SAAS,mCAAmC,CAC1C,QAAgB,EAChB,gBAAyB,EACzB,YAAqB;IAErB,OAAO,IAAI,cAAc,CACvB,CAAC,gBAAgB,EAAE,YAAY,CAAC,EAChC,mFAAmF,QAAQ,IAAI,EAC/F,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAC5B,CAAC;AACJ,CAAC;AAED,SAAS,2CAA2C,CAClD,gBAAyB,EACzB,aAAwB;IAExB,OAAO,IAAI,cAAc,CACvB,CAAC,gBAAgB,EAAE,GAAG,aAAa,CAAC,EACpC,oEAAoE,EACpE,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAC5B,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAc;IAC9C,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACb,KAA+B,CAAC,IAAI,KAAK,SAAS,CACpD,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,oCAAoC,CACjD,SAAiB,EACjB,aAAqB,EACrB,kBAA2B;IAE3B,MAAM,MAAM,GAAG,MAAM,IAAI,CACvB,SAAS,EACT,WAAW,CAAC,QAAQ,GAAG,WAAW,CAAC,WAAW,GAAG,WAAW,CAAC,UAAU,CACxE,CAAC;IACF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,IACE,CAAC,QAAQ,CAAC,WAAW,EAAE;YACvB,CAAC,OAAO,CAAC,WAAW,EAAE;YACtB,OAAO,CAAC,cAAc,EAAE;YACxB,QAAQ,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG;YAC5B,QAAQ,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG;YAC5B,QAAQ,CAAC,GAAG,KAAK,MAAM,CAAC,aAAa,CAAC;YACtC,OAAO,CAAC,GAAG,KAAK,MAAM,CAAC,aAAa,CAAC;YACrC,CAAC,CAAC,kBAAkB,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,GAAM,CAAC,KAAK,EAAE,CAAC,EACxD,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QACD,IAAI,kBAAkB,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAM,CAAC,KAAK,IAAM,EAAE,CAAC;YAC9D,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC1B,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YACpD,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAM,CAAC,KAAK,IAAM,EAAE,CAAC;gBACvC,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,mCAAmC,CAChD,aAAqB,EACrB,UAAoB,EACpB,aAAqB;IAErB,MAAM,uCAAuC,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IAC5E,IAAI,WAAW,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,CAAC;IAChD,MAAM,uCAAuC,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAC1E,MAAM,oCAAoC,CAAC,WAAW,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;IAC9E,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAChD,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1C,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QACD,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC;QACD,MAAM,oCAAoC,CAAC,WAAW,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,KAAK,UAAU,uCAAuC,CACpD,SAAiB,EACjB,aAAqB;IAErB,IAAI,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC1C,SAAS,CAAC;QACR,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,KAAK,MAAM,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,GAAG,KAAK,EAAE,CAAC;QACnF,IAAI,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;YAC7B,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;YACrF,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,YAAY,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,GAAM,CAAC,KAAK,EAAE,CAAC;YACpD,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,IAAO,CAAC,KAAK,EAAE,CAAC;YAC/C,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,cAAc,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3E,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;YACrF,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACzC,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;YAC3B,OAAO;QACT,CAAC;QACD,WAAW,GAAG,MAAM,CAAC;IACvB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,0BAA0B,CAAC,aAAqB;IAC7D,IAAI,aAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,aAAa,GAAG,QAAQ,EAAE,CAAC,OAAO,CAAC;IACrC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,mEAAmE,2BAA2B,GAAG,EACjG,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;IACJ,CAAC;IACD,MAAM,uCAAuC,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IAC5E,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IAC1D,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7C,YAAY,GAAG,IAAI,CAAC;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IACD,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,MAAM,mCAAmC,CAC9C,cAAc,EACd,CAAC,UAAU,EAAE,OAAO,EAAE,iBAAiB,CAAC,EACxC,aAAa,CACd,CAAC;AACJ,CAAC;AAkBD,KAAK,UAAU,0BAA0B,CACvC,UAAkB,EAClB,gBAA8C;IAE9C,MAAM,aAAa,GAAG,GAAG,UAAU,OAAO,CAAC;IAC3C,IAAI,MAAwC,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,IAAI,CACjB,aAAa,EACb,OAAO,CAAC,QAAQ,KAAK,OAAO;YAC1B,CAAC,CAAC,GAAG;YACL,CAAC,CAAC,WAAW,CAAC,QAAQ,GAAG,WAAW,CAAC,WAAW,GAAG,WAAW,CAAC,UAAU,CAC5E,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,kEAAkE,EAAE;YAClF,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,IACE,CAAC,QAAQ,CAAC,WAAW,EAAE;YACvB,CAAC,OAAO,CAAC,WAAW,EAAE;YACtB,OAAO,CAAC,cAAc,EAAE;YACxB,QAAQ,CAAC,GAAG,KAAK,gBAAgB,CAAC,GAAG;YACrC,QAAQ,CAAC,GAAG,KAAK,gBAAgB,CAAC,GAAG;YACrC,QAAQ,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG;YAC5B,QAAQ,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,EAC5B,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;QACtF,CAAC;QACD,OAAO;YACL,KAAK,CAAC,cAAc;gBAClB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBACjD,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC/D,IACE,CAAC,IAAI,CAAC,WAAW,EAAE;oBACnB,CAAC,SAAS,CAAC,WAAW,EAAE;oBACxB,SAAS,CAAC,cAAc,EAAE;oBAC1B,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG;oBACzB,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG;oBACzB,SAAS,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG;oBAC9B,SAAS,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG,EAC9B,CAAC;oBACD,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;gBACrF,CAAC;YACH,CAAC;YACD,KAAK,CAAC,KAAK;gBACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACvB,CAAC;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,UAAU,EAAE,CAAC;YACpB,MAAM,cAAc,GAAG,IAAI,cAAc,CACvC,CAAC,KAAK,EAAE,UAAU,CAAC,EACnB,wEAAwE,CACzE,CAAC;YACF,cAAc,CAAC,KAAK,GAAG,UAAU,CAAC;YAClC,MAAM,cAAc,CAAC;QACvB,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,IAAY;IAChD,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,gBAKS,CAAC;IACd,IAAI,aAAiC,CAAC;IACtC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACnD,2EAA2E;QAC3E,+CAA+C;QAC/C,gBAAgB,GAAG;YACjB,IAAI,EAAE,aAAa;YACnB,QAAQ,EAAE,MAAM,6CAA6C,CAAC,aAAa,CAAC;SAC7E,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,aAAa,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QACpC,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAClF,CAAC;QACD,MAAM,uCAAuC,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,aAAa,CAAC,CAAC;IAC7F,CAAC;IACD,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,CAAC;IACrD,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,aAAa,CAAC,KAAK,EAAE,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CACb,GAAG,2BAA2B,8DAA8D,CAC7F,CAAC;IACJ,CAAC;IACD,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,uCAAuC,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC,CAAC;IAC5F,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,IAAI,CACvB,aAAa,EACb,OAAO,CAAC,QAAQ,KAAK,OAAO;QAC1B,CAAC,CAAC,GAAG;QACL,CAAC,CAAC,WAAW,CAAC,QAAQ,GAAG,WAAW,CAAC,WAAW,GAAG,WAAW,CAAC,UAAU,CAC5E,CAAC;IACF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,IACE,CAAC,QAAQ,CAAC,WAAW,EAAE;YACvB,CAAC,OAAO,CAAC,WAAW,EAAE;YACtB,OAAO,CAAC,cAAc,EAAE;YACxB,QAAQ,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG;YAC5B,QAAQ,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,EAC5B,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC9E,CAAC;QACD,IACE,aAAa,KAAK,SAAS;YAC3B,CAAC,CAAC,QAAQ,CAAC,IAAI,GAAG,EAAM,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,EAAM,CAAC,KAAK,EAAE,CAAC,EACnE,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;QAC5F,CAAC;QACD,IAAI,gBAAgB,EAAE,CAAC;YACrB,MAAM,gBAAgB,GAAG,MAAM,6CAA6C,CAC1E,gBAAgB,CAAC,IAAI,CACtB,CAAC;YACF,IACE,gBAAgB,CAAC,QAAQ,KAAK,gBAAgB,CAAC,QAAQ,CAAC,QAAQ;gBAChE,gBAAgB,CAAC,kBAAkB,KAAK,gBAAgB,CAAC,QAAQ,CAAC,kBAAkB,EACpF,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;YACrF,CAAC;QACH,CAAC;QACD,OAAO;YACL,KAAK,CAAC,cAAc;gBAClB,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;oBAChC,MAAM,uCAAuC,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC,CAAC;gBAC5F,CAAC;gBACD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBACjD,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC/D,IACE,CAAC,IAAI,CAAC,WAAW,EAAE;oBACnB,CAAC,SAAS,CAAC,WAAW,EAAE;oBACxB,SAAS,CAAC,cAAc,EAAE;oBAC1B,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG;oBACzB,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG;oBACzB,SAAS,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG;oBAC9B,SAAS,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG;oBAC9B,CAAC,aAAa,KAAK,SAAS;wBAC1B,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,EAAM,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,GAAG,EAAM,CAAC,KAAK,EAAE,CAAC,CAAC,EACpE,CAAC;oBACD,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;gBACrF,CAAC;gBACD,IAAI,gBAAgB,EAAE,CAAC;oBACrB,MAAM,gBAAgB,GAAG,MAAM,6CAA6C,CAC1E,gBAAgB,CAAC,IAAI,CACtB,CAAC;oBACF,IACE,gBAAgB,CAAC,QAAQ,KAAK,gBAAgB,CAAC,QAAQ,CAAC,QAAQ;wBAChE,gBAAgB,CAAC,kBAAkB,KAAK,gBAAgB,CAAC,QAAQ,CAAC,kBAAkB,EACpF,CAAC;wBACD,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;oBACrF,CAAC;gBACH,CAAC;YACH,CAAC;YACD,KAAK,CAAC,KAAK;gBACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACvB,CAAC;YACD,IAAI,EAAE,aAAa;SACpB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,UAAU,EAAE,CAAC;YACpB,MAAM,cAAc,GAAG,IAAI,cAAc,CACvC,CAAC,KAAK,EAAE,UAAU,CAAC,EACnB,sEAAsE,CACvE,CAAC;YACF,cAAc,CAAC,KAAK,GAAG,UAAU,CAAC;YAClC,MAAM,cAAc,CAAC;QACvB,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,IAAY,EAAE,QAA8B;IAC5E,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,QAAQ,CAAC,GAAG,IAAI,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,8BAA8B,CAAC,IAAY,EAAE,QAA8B;IAClF,8EAA8E;IAC9E,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;AACrD,CAAC;AAOD,SAAS,8BAA8B,CAAC,OAA6B;IACnE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA8B,CAAC;IACvD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,GAAG,GACP,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;QACzF,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBAC1C,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC7C,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC;YACD,SAAS;QACX,CAAC;QACD,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mCAAmC,CACvD,IAAY,EACZ,OAAO,GAKH,EAAE;IAEN,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACxE,OAAO,2BAA2B,CAAC;QACjC,KAAK,EAAE,uBAAuB;QAC9B,QAAQ;QACR,eAAe,EAAE,GAAG,EAAE,CACpB,CAAC,OAAO,CAAC,sBAAsB,IAAI,+BAA+B,CAAC,CAAC,IAAI,CAAC;QAC3E,WAAW,EAAE,mCAAmC;QAChD,oBAAoB,EAAE,GAAG,EAAE,CACzB,CAAC,OAAO,CAAC,oCAAoC,IAAI,oCAAoC,CAAC,CAAC,IAAI,CAAC;QAC9F,IAAI;KACL,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,oCAAoC,CAAC,IAAY;IAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACxE,OAAO,2BAA2B,CAAC;QACjC,KAAK,EAAE,iCAAiC;QACxC,QAAQ;QACR,eAAe,EAAE,KAAK,IAAI,EAAE;YAC1B,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;gBACnC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC;oBACzD,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;gBACnF,CAAC;gBACD,IAAI,0BAA0B,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrC,MAAM,+BAA+B,CAAC,IAAI,CAAC,CAAC;gBAC9C,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACvD,MAAM,KAAK,CAAC;gBACd,CAAC;gBACD,MAAM,+BAA+B,CAAC,IAAI,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QACD,WAAW,EAAE,mCAAmC;QAChD,oBAAoB,EAAE,GAAG,EAAE,CAAC,6CAA6C,CAAC,IAAI,CAAC;QAC/E,IAAI;KACL,CAAC,CAAC;AACL,CAAC;AAED,SAAS,6BAA6B;IACpC,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;IACxD,MAAM,YAAY,GAChB,cAAc,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;QAC/C,CAAC,CAAC,cAAc;QAChB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IACxD,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,IAAY,EAAE,QAAgB;IAC1E,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACnE,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7E,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,WAAW,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,KAAK,UAAU,yBAAyB,CAAC,QAAgB;IACvD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,mCAAmC,CAAC,6BAA6B,EAAE,CAAC,CAAC;IACxF,OAAO,6BAA6B,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACvD,CAAC;AAED,KAAK,UAAU,+BAA+B,CAC5C,YAAkC;IAElC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,mCAAmC,CAAC,6BAA6B,EAAE,CAAC,CAAC;QACxF,OAAO,wBAAwB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACtD,CAAC;IACD,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;IAC1C,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,wBAAwB,CAAC,MAAM,0BAA0B,CAAC,aAAa,CAAC,EAAE,YAAY,CAAC,CAAC;AACjG,CAAC;AAED,KAAK,UAAU,2BAA2B,CACxC,YAAkC;IAElC,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,EAAE,IAAI,EAAE,CAAC;IACxE,IAAI,cAAc,EAAE,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,GAAG,2BAA2B,4BAA4B,CAAC,CAAC;QAC9E,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,sBAAsB,CAAC,cAAc,CAAC,CAAC;QAChE,IAAI,CAAC;YACH,2FAA2F;YAC3F,OAAO,8BAA8B,CAAC;gBACpC,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,+BAA+B,CAAC,YAAY,CAAC,EAAE;gBAC7E;oBACE,UAAU,EAAE,CAAC,UAAU,CAAC;oBACxB,IAAI,EAAE,8BAA8B,CAAC,UAAU,CAAC,IAAI,EAAE,YAAY,CAAC;iBACpE;aACF,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;YACzB,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IACD,IAAI,YAAY,CAAC,KAAK,GAAG,EAAE,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,qCAAqC,2BAA2B,+DAA+D,CAChI,CAAC;IACJ,CAAC;IACD,OAAO,8BAA8B,CAAC;QACpC,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,+BAA+B,CAAC,YAAY,CAAC,EAAE;KAC9E,CAAC,CAAC;AACL,CAAC;AAOD,KAAK,UAAU,yBAAyB,CAAC,QAAgB;IACvD,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,sBAAsB,GAAG,4BAA4B,CAAC;IAC3F,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,QAAQ,OAAO,CAAC,CAAC;IACvD,IAAI,gBAA0D,CAAC;IAC/D,MAAM,cAAc,GAAG,gCAAgC,CAAC;QACtD,gBAAgB,CAAC,aAAa,EAAE,QAAQ;YACtC,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,aAAa,EAAE,CAAC;gBAClD,gBAAgB,GAAG,QAAQ,CAAC;YAC9B,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IACH,iFAAiF;IACjF,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAA0B,CAAC;IACjF,MAAM,eAAe,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAClE,IAAI,cAAyC,CAAC;IAC9C,iBAAiB,CAAC,KAAK,GAAG,CAAC,CACzB,SAAmB,EACnB,QAAuD,EACvD,EAAE;QACF,cAAc,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAC7C,eAAe,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;gBACnC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAChB,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAgC,CAAC;IAClC,SAAS,CAAC;QACR,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE;gBACnC,EAAE,EAAE,iBAAiB;gBACrB,QAAQ,EAAE,KAAK;gBACf,OAAO,EAAE,CAAC;gBACV,KAAK,EAAE,sBAAsB;gBAC7B,MAAM,EAAE,uBAAuB;aAChC,CAAC,CAAC;YACH,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,cAAc,CAAC;YACrB,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrC,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YACjD,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;gBACrB,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAC5B,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,sBAAsB,EAAE,WAAW,CAAC,CAAC,CACnE,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,QAAoC;IACxE,MAAM,MAAM,GAAc,EAAE,CAAC;IAC7B,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,OAAO,EAAE,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,cAAc,CAAC,MAAM,EAAE,mDAAmD,CAAC,CAAC;IACxF,CAAC;AACH,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,QAAgB,EAChB,4BAA4B,GAAG,IAAI;IAEnC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,4BAA4B,EAAE,CAAC;QAClE,OAAO,MAAM,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,yBAAyB,CAAC,MAAM,yBAAyB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7F,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,yBAAyB,CAAC,QAAQ,CAAC,CAAC;QAC7D,OAAO;YACL,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;YAC7C,KAAK,CAAC,OAAO;gBACX,MAAM,sBAAsB,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;YACxE,CAAC;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,aAAa,CAAC,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACxE,IAAI,aAAa,EAAE,MAAM,KAAK,UAAU,EAAE,CAAC;YACzC,MAAM,mCAAmC,CAAC,QAAQ,EAAE,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QACnF,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,2BAA2B,CAAC,QAA8B;IAIvE,MAAM,QAAQ,GAA+B,EAAE,CAAC;IAChD,MAAM,SAAS,GAAG,IAAI,GAAG,EAA+B,CAAC;IACzD,MAAM,UAAU,GAAG,IAAI,GAAG,EAA2B,CAAC;IACtD,MAAM,aAAa,GAAG,KAAK,IAAwB,EAAE;QACnD,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,UAAU,CAC3C,CAAC,GAAG,SAAS,EAAE,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CACtE,CAAC;QACF,OAAO,YAAY;aAChB,MAAM,CAAC,CAAC,MAAM,EAAmC,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC;aACjF,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC,CAAC;IACF,MAAM,gBAAgB,GAAG,KAAK,IAAmB,EAAE;QACjD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,SAAS,CAAC,cAAc,EAAE,CAAC;QACnC,CAAC;QACD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,QAAQ,CAAC,cAAc,EAAE,CAAC;QAClC,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,2BAA2B,CAAC,QAAQ,CAAC,CAAC;QAC5D,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBAC1C,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBAC1C,MAAM,SAAS,CAAC,cAAc,EAAE,CAAC;YACnC,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC/D,IAAI,CAAC;gBACH,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACjC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC;wBAC/B,MAAM,IAAI,KAAK,CACb,wEAAwE,CACzE,CAAC;oBACJ,CAAC;oBACD,SAAS,CAAC,GAAG,CAAC,MAAM,0BAA0B,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC;gBAC1F,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC;oBACH,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;gBAC3B,CAAC;gBAAC,OAAO,YAAY,EAAE,CAAC;oBACtB,MAAM,mCAAmC,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;gBAC9E,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAChC,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBAC1C,MAAM,SAAS,CAAC,cAAc,EAAE,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,UAAU,CAC7C,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CACrD,CAAC;QACF,MAAM,aAAa,GAAG,cAAc;aACjC,MAAM,CAAC,CAAC,MAAM,EAAmC,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC;aACjF,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,aAAa,GAAG,CAAC,GAAG,aAAa,EAAE,GAAG,CAAC,MAAM,aAAa,EAAE,CAAC,CAAC,CAAC;QACrE,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,2CAA2C,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QAC1E,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,OAAO;QACL,eAAe,EAAE,gBAAgB;QACjC,KAAK,CAAC,OAAO;YACX,IAAI,YAAqB,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,sBAAsB,CAAC,QAAQ,CAAC,CAAC;YACzC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,YAAY,GAAG,KAAK,CAAC;YACvB,CAAC;YACD,MAAM,WAAW,GAAG,MAAM,aAAa,EAAE,CAAC;YAC1C,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;gBAC/B,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC3B,MAAM,IAAI,cAAc,CACtB,CAAC,YAAY,EAAE,GAAG,WAAW,CAAC,EAC9B,kEAAkE,EAClE,EAAE,KAAK,EAAE,YAAY,EAAE,CACxB,CAAC;gBACJ,CAAC;gBACD,MAAM,YAAY,CAAC;YACrB,CAAC;YACD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC7B,MAAM,WAAW,CAAC,CAAC,CAAC,CAAC;YACvB,CAAC;YACD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,MAAM,IAAI,cAAc,CACtB,WAAW,EACX,2DAA2D,CAC5D,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,QAAgB,EAChB,WAAmB,EACnB,SAA6C;IAE7C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACxD,IAAI,eAAe,GAAG,KAAK,CAAC;IAC5B,IAAI,cAAuB,CAAC;IAC5B,IAAI,MAA2B,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,eAAe,GAAG,IAAI,CAAC;QACvB,cAAc,GAAG,KAAK,CAAC;IACzB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,OAAO,EAAE,CAAC;IAClB,CAAC;IAAC,OAAO,YAAY,EAAE,CAAC;QACtB,IAAI,eAAe,EAAE,CAAC;YACpB,MAAM,wBAAwB,CAAC,WAAW,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC;QAC5E,CAAC;QACD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,MAAM,IAAI,4BAA4B,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QACpE,CAAC;QACD,MAAM,YAAY,CAAC;IACrB,CAAC;IACD,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,cAAc,CAAC;IACvB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,MAMnC;IACC,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,UAAmB,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,WAAW,GAAG,IAAI,CAAC;QACnB,UAAU,GAAG,KAAK,CAAC;IACrB,CAAC;IACD,IAAI,WAAW,EAAE,CAAC;QAChB,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YAC3B,IAAI,MAAM,CAAC,cAAc,YAAY,4BAA4B,EAAE,CAAC;gBAClE,MAAM,IAAI,4BAA4B,CACpC,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,cAAc,EACrB,CAAC,UAAU,CAAC,EACZ,MAAM,CAAC,cAAc,CAAC,aAAa,CACpC,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,cAAc,CACtB,CAAC,MAAM,CAAC,cAAc,EAAE,UAAU,CAAC,EACnC,uDAAuD,EACvD,EAAE,KAAK,EAAE,UAAU,EAAE,CACtB,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,MAAM,IAAI,4BAA4B,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACtE,CAAC;QACD,MAAM,UAAU,CAAC;IACnB,CAAC;IACD,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;QAC3B,MAAM,MAAM,CAAC,cAAc,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,MAKpC;IACC,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAC9D,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;IACxB,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,eAAe,GAAG,KAAK,CAAC;IAC5B,IAAI,cAAuB,CAAC;IAC5B,IAAI,YAKS,CAAC;IACd,IAAI,MAAwD,CAAC;IAC7D,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,MAAM,cAAc,GAAG,2BAA2B,CAAC,WAAW,CAAC,CAAC;QAChE,IAAI,QAAQ,GAAG,GAAG,cAAc,CAAC,GAAG,IAAI,cAAc,CAAC,GAAG,EAAE,CAAC;QAC7D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;QACD,IACE,OAAO,CAAC,QAAQ,KAAK,OAAO;YAC5B,CAAC,CAAC,MAAM,4BAA4B,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,EAC7D,CAAC;YACD,MAAM,GAAG,OAAO,CAAC;QACnB,CAAC;aAAM,IAAI,CAAC,CAAC,MAAM,uBAAuB,CAAC,MAAM,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;YAC9E,MAAM,GAAG,OAAO,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,YAAY,GAAG,MAAM,2BAA2B,CAAC,cAAc,CAAC,CAAC;YACjE,MAAM,YAAY,CAAC,eAAe,EAAE,CAAC;YACrC,+EAA+E;YAC/E,IAAI,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9C,MAAM,eAAe,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAC;YAC3D,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;YAC1C,IACE,eAAe,CAAC,GAAG,KAAK,cAAc,CAAC,GAAG;gBAC1C,eAAe,CAAC,GAAG,KAAK,cAAc,CAAC,GAAG;gBAC1C,eAAe,CAAC,KAAK,KAAK,cAAc,CAAC,KAAK;gBAC9C,CAAC,CAAC,MAAM,uBAAuB,CAAC,MAAM,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC,EAClE,CAAC;gBACD,MAAM,GAAG,OAAO,CAAC;YACnB,CAAC;iBAAM,IAAI,CAAC,MAAM,mBAAmB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,MAAM,CAAC,eAAe,EAAE,CAAC;gBACtF,MAAM,GAAG,YAAY,CAAC;YACxB,CAAC;YACD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC9C,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;oBACjB,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;oBAC5D,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;wBAC1B,MAAM,SAAS,GAAG,MAAM,uBAAuB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;wBAChE,MAAM,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;wBACxC,IAAI,UAAU,GAAG,6BAA6B,EAAE,CAAC;4BAC/C,MAAM,4BAA4B,EAAE,CAAC;wBACvC,CAAC;wBACD,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;wBAC7D,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;4BAC/B,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;wBAC/E,CAAC;wBACD,IAAI,CAAC;4BACH,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;4BAClC,MAAM,YAAY,CAAC,eAAe,EAAE,CAAC;4BACrC,MAAM,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;wBACjD,CAAC;wBAAC,OAAO,KAAK,EAAE,CAAC;4BACf,IAAI,CAAC,CAAC,KAAK,YAAY,WAAW,CAAC,EAAE,CAAC;gCACpC,MAAM,KAAK,CAAC;4BACd,CAAC;4BACD,MAAM,YAAY,CAAC,eAAe,EAAE,CAAC;4BACrC,IACE,CAAC,CAAC,MAAM,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,eAAe,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,EAChF,CAAC;gCACD,MAAM,GAAG,OAAO,CAAC;4BACnB,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,mFAAmF;oBACnF,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC1C,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;gBAC5C,CAAC;gBACD,IACE,MAAM,KAAK,SAAS;oBACpB,CAAC,CAAC,MAAM,uBAAuB,CAAC,MAAM,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC,EAClE,CAAC;oBACD,MAAM,GAAG,OAAO,CAAC;gBACnB,CAAC;qBAAM,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBAChC,IAAI,CAAC;wBACH,MAAM,YAAY,CAAC,eAAe,EAAE,CAAC;wBACrC,MAAM,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;wBAC1E,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;wBAClB,IACE,CAAC,CAAC,MAAM,uBAAuB,CAAC,MAAM,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;4BAClE,CAAC,MAAM,mBAAmB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,MAAM,CAAC,eAAe,EAC1E,CAAC;4BACD,MAAM,IAAI,4BAA4B,CACpC,MAAM,CAAC,WAAW,EAClB,IAAI,2BAA2B,CAAC,wCAAwC,CAAC,CAC1E,CAAC;wBACJ,CAAC;6BAAM,CAAC;4BACN,MAAM,gBAAgB,GACpB,MAAM,CAAC,gBAAgB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;4BACnF,MAAM,wBAAwB,CAAC,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC;4BACzE,IACE,CAAC,CAAC,MAAM,uBAAuB,CAAC,MAAM,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;gCAClE,CAAC,MAAM,mBAAmB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,MAAM,CAAC,eAAe,EAC1E,CAAC;gCACD,MAAM,IAAI,4BAA4B,CACpC,MAAM,CAAC,WAAW,EAClB,IAAI,2BAA2B,CAC7B,sDAAsD,CACvD,CACF,CAAC;4BACJ,CAAC;iCAAM,CAAC;gCACN,SAAS,GAAG,IAAI,CAAC;gCACjB,MAAM,GAAG,WAAW,CAAC;4BACvB,CAAC;wBACH,CAAC;oBACH,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,IAAI,KAAK,YAAY,4BAA4B,EAAE,CAAC;4BAClD,MAAM,KAAK,CAAC;wBACd,CAAC;wBACD,IAAI,KAAK,YAAY,gCAAgC,EAAE,CAAC;4BACtD,MAAM,IAAI,4BAA4B,CACpC,MAAM,CAAC,WAAW,EAClB,KAAK,CAAC,SAAS,EACf,CAAC,KAAK,CAAC,UAAU,CAAC,EAClB,IAAI,CACL,CAAC;wBACJ,CAAC;wBACD,MAAM,IAAI,4BAA4B,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;oBAC9E,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,eAAe,GAAG,IAAI,CAAC;QACvB,cAAc,GAAG,KAAK,CAAC;IACzB,CAAC;IACD,IAAI,YAAY,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,YAAY,CAAC,OAAO,EAAE,CAAC;QAC/B,CAAC;QAAC,OAAO,YAAY,EAAE,CAAC;YACtB,IAAI,eAAe,EAAE,CAAC;gBACpB,cAAc,GAAG,wBAAwB,CAAC,MAAM,CAAC,WAAW,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC;YAC9F,CAAC;iBAAM,CAAC;gBACN,eAAe,GAAG,IAAI,CAAC;gBACvB,cAAc,GAAG,SAAS;oBACxB,CAAC,CAAC,IAAI,4BAA4B,CAAC,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC;oBACpE,CAAC,CAAC,YAAY,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,oBAAoB,CAAC;QACzB,SAAS;QACT,IAAI;QACJ,QAAQ,EAAE,MAAM,CAAC,WAAW;QAC5B,cAAc;QACd,eAAe;KAChB,CAAC,CAAC;IACH,OAAO,MAAM,IAAI,OAAO,CAAC;AAC3B,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,QAAgB;IACjD,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IACD,IAAI,CAAC;QACH,IAAI,CAAC,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACxC,OAAO,MAAM,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC/F,CAAC;AAED,SAAS,YAAY,CAAC,MAIrB;IACC,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAgB,CAAC;IAC7C,MAAM,eAAe,GAAG,uBAAuB,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACxE,MAAM,mBAAmB,GAAG,2BAA2B,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACxE,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QAClC,YAAY,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,mBAAmB,KAAK,SAAS,EAAE,CAAC;QACtC,YAAY,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,WAAwB,CAAC;IAC7B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAC5C,WAAW,GAAG,OAAO,CAAC;IACxB,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,GAAiB;QACzB,WAAW;QACX,OAAO;KACR,CAAC;IACF,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,gBAAgB,CAAC,MAMzB;IACC,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9D,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IACD,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CACzB,CAAC,GAAG,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAC1E,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;QAChB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnD,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,MAAM,WAAW,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,MAAM,IAAI,4BAA4B,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACpE,CAAC;IACH,CAAC,CAAC,CAAC;IACH,uBAAuB,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IACtD,2BAA2B,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAClD,KAAK,OAAO,CAAC,IAAI,CACf,GAAG,EAAE;QACH,IAAI,uBAAuB,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE,CAAC;YAC7D,uBAAuB,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,2BAA2B,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;YACzD,2BAA2B,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,EACD,GAAG,EAAE;QACH,IAAI,uBAAuB,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE,CAAC;YAC7D,uBAAuB,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,2BAA2B,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;YACzD,2BAA2B,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CACF,CAAC;IACF,OAAO,OAAO,CAAC;AACjB,CAAC;AAMD,KAAK,UAAU,sBAAsB,CAAC,MAKrC;IACC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IAC/B,MAAM,GAAG,GAAG,MAAM,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAC9D,MAAM,OAAO,GAAG,QAAQ;SACrB,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;SACf,IAAI,CAAC,KAAK,IAAI,EAAE;QACf,MAAM,YAAY,GAAG,YAAY,CAAC;YAChC,GAAG;YACH,WAAW;YACX,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC,CAAC;QACH,IAAI,iBAAiB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACpC,IAAI,gBAAoC,CAAC;YACzC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;gBACjC,MAAM,oCAAoC,CAAC,SAAS,CAAC,CAAC;YACxD,CAAC;iBAAM,CAAC;gBACN,gBAAgB,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC5E,IAAI,gBAAgB,KAAK,SAAS,IAAI,0BAA0B,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC5E,MAAM,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC;YACD,2DAA2D;YAC3D,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,IAAI,EAAE;gBACpE,IAAI,CAAC,MAAM,mBAAmB,CAAC,WAAW,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;oBACrD,OAAO,SAAS,CAAC;gBACnB,CAAC;gBACD,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,0BAA0B,EAAE,OAAO,EAAE,EAAE,CAAC;oBACtE,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC;wBACzC,gBAAgB;wBAChB,WAAW;wBACX,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,eAAe,EAAE,GAAG;qBACrB,CAAC,CAAC;oBACH,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;wBAC3B,OAAO,IAAI,CAAC;oBACd,CAAC;oBACD,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;wBAC5B,OAAO,SAAS,CAAC;oBACnB,CAAC;gBACH,CAAC;gBACD,MAAM,IAAI,2BAA2B,CACnC,mDAAmD,WAAW,IAAI,CACnE,CAAC;YACJ,CAAC,CAAC,CAAC;YACH,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;gBACvB,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,iBAAiB,GAAG,IAAI,CAAC;YACzB,OAAO;gBACL,WAAW,EAAE,gBAAgB,CAAC;oBAC5B,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,GAAG;oBACH,WAAW;oBACX,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,IAAI,EAAE,YAAY;iBACnB,CAAC;aACH,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvB,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IACL,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CACvB,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;IACF,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAE9B,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC;IACvB,CAAC;YAAS,CAAC;QACT,IAAI,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;YACrC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,MAK7B;IACC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IACzE,MAAM,OAAO,GAAG,QAAQ;SACrB,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;SACf,IAAI,CAAC,KAAK,IAAI,EAAE;QACf,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,sBAAsB,EAAE,OAAO,EAAE,EAAE,CAAC;YAClE,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC;gBAC1C,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,WAAW;gBACX,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB,CAAC,CAAC;YACH,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QACD,MAAM,IAAI,2BAA2B,CACnC,+CAA+C,WAAW,IAAI,CAC/D,CAAC;IACJ,CAAC,CAAC,CAAC;IACL,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CACvB,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;IACF,iBAAiB,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAEzC,IAAI,MAA4B,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,OAAO,CAAC;IACzB,CAAC;YAAS,CAAC;QACT,IAAI,iBAAiB,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE,CAAC;YAChD,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAyB;IAIpD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,SAAS,CAAC,iDAAiD,CAAC,CAAC;IACzE,CAAC;IACD,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAuB;QACnD,IAAI,EAAE,GAAG,UAAU,IAAI;KACxB,CAAC;AACJ,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAA2B,EAC3B,OAA4C;IAE5C,MAAM,QAAQ,GAAG,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,cAAc,CAAC;QACjC,GAAG,QAAQ;QACX,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,YAAY,EAAE,MAAM,CAAC,YAAY;KAClC,CAAC,CAAC;IACH,OAAO,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;IAC1B,IAAI,MAA4B,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,WAAW,CAAC;IAC7B,CAAC;YAAS,CAAC;QACT,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;IACD,MAAM,MAAM,CAAC,WAAW,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,MAA2B,EAC3B,OAA4C;IAE5C,IAAI,CAAC;QACH,MAAM,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,4FAA4F;IAC9F,CAAC;AACH,CAAC;AAQD,MAAM,UAAU,oBAAoB,CAAC,MAGpC;IACC,kCAAkC,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAiC,CAAC;IACzD,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,MAAM,GAAG,KAAK,EAAE,KAAyB,EAAE,SAAkB,EAAE,EAAE;QACrE,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAChE,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,EACpB,OAAO,CACR,CAAC;IACJ,CAAC,CAAC;IACF,OAAO;QACL,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC;QACvC,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC;QAC/C,KAAK,CAAC,KAAK;YACT,OAAO,GAAG,IAAI,CAAC;YACf,iFAAiF;YACjF,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { constants as fsConstants, type PathLike } from \"node:fs\";\nimport { createHash } from \"node:crypto\";\nimport { chmod, lstat, mkdir, open, readlink, realpath, stat as statPath } from \"node:fs/promises\";\nimport { userInfo } from \"node:os\";\nimport path from \"node:path\";\nimport { lock } from \"proper-lockfile\";\nimport {\n createProcessOwnedLockFileSystem,\n initializeProcessOwnedLockIdentity,\n} from \"../platform/process-owned-lock.js\";\nimport {\n createOwnerOnlyWindowsDirectory,\n readWindowsDirectoryNamespaceSecuritySnapshot,\n readWindowsDirectorySecuritySnapshot,\n type WindowsDirectorySecuritySnapshot,\n} from \"../platform/windows-acl.js\";\nimport { isManagedRecorderDirectory } from \"../platform/recorder-directory.js\";\nimport {\n secureCachedWindowsLockRoot,\n type WindowsLockRootIdentity,\n} from \"../platform/windows-lock-root.js\";\nimport type { ServerRequestEvent } from \"./http.js\";\n\nexport type ServerEventObserver = (event: ServerRequestEvent) => void | Promise<void>;\n\nexport class ServerRecorderCommittedError extends AggregateError {\n readonly committed = true;\n readonly indeterminate: boolean;\n\n constructor(\n filePath: string,\n operationError: unknown,\n relatedErrors: unknown[] = [],\n indeterminate = false,\n ) {\n super(\n [operationError, ...relatedErrors],\n indeterminate\n ? `Server recorder append may have been published for \"${filePath}\", but completion is indeterminate.`\n : `Server recorder append committed for \"${filePath}\", but subsequent work failed.`,\n { cause: operationError },\n );\n this.name = \"ServerRecorderCommittedError\";\n this.indeterminate = indeterminate;\n }\n}\n\nclass ServerRecorderRotationError extends Error {}\n\nclass ServerRecorderDirectorySyncError extends AggregateError {\n constructor(\n readonly syncError: unknown,\n readonly closeError: unknown,\n ) {\n super(\n [syncError, closeError],\n \"Server recorder directory sync and handle cleanup both failed.\",\n { cause: syncError },\n );\n }\n}\n\ntype RecorderFileIdentity = {\n dev: bigint;\n ino: bigint;\n nlink: bigint;\n};\n\ntype ObserverTask = {\n markStarted: () => void;\n started: Promise<void>;\n};\n\ntype ObserverPlan = {\n dependencies: Set<ObserverTask>;\n task: ObserverTask;\n};\n\nconst pendingAppends = new Map<string, Promise<void>>();\nconst pendingAdmissions = new Map<string, Promise<void>>();\nconst pendingLogicalObservers = new Map<string, ObserverTask>();\nconst pendingPublicationObservers = new Map<string, ObserverTask>();\nconst securedWindowsLockRoots = new Map<string, Promise<WindowsLockRootIdentity>>();\nconst securedWindowsRecorderDirectories = new Map<string, Promise<WindowsLockRootIdentity>>();\nconst MAX_RECOVERY_VALIDATION_BYTES = 64 * 1024 * 1024;\nconst MAX_RECOVERY_SCAN_BYTES = MAX_RECOVERY_VALIDATION_BYTES + 1;\nconst RECORDER_LOCK_RETRY_MS = 100;\nconst RECORDER_LOCK_STALE_MS = 30_000;\nconst RECORDER_LOCK_UPDATE_MS = 10_000;\nconst RECORDER_LOCK_WAIT_MARGIN_MS = 5_000;\nconst RECORDER_LOCK_DIRECTORY_ENV = \"CRABLINE_RECORDER_LOCK_DIR\";\nconst RECORDER_PATH_ATTEMPTS = 3;\nconst RECORDER_ROTATION_ATTEMPTS = 3;\nconst TAIL_SCAN_CHUNK_BYTES = 64 * 1024;\n\nasync function readBufferAt(\n file: Awaited<ReturnType<typeof open>>,\n length: number,\n position: number,\n): Promise<Buffer> {\n const buffer = Buffer.alloc(length);\n let bytesRead = 0;\n while (bytesRead < length) {\n const result = await file.read(buffer, bytesRead, length - bytesRead, position + bytesRead);\n if (result.bytesRead === 0) {\n break;\n }\n bytesRead += result.bytesRead;\n }\n return buffer.subarray(0, bytesRead);\n}\n\nasync function appendRecorderText(\n file: Awaited<ReturnType<typeof open>>,\n contents: string,\n position: number,\n): Promise<void> {\n if (process.platform !== \"win32\") {\n await file.appendFile(contents, { encoding: \"utf8\" });\n return;\n }\n const buffer = Buffer.from(contents, \"utf8\");\n let written = 0;\n while (written < buffer.length) {\n const result = await file.write(buffer, written, buffer.length - written, position + written);\n if (result.bytesWritten === 0) {\n throw new Error(\"Server recorder append made no progress.\");\n }\n written += result.bytesWritten;\n }\n}\n\nasync function findIncompleteTailStart(\n file: Awaited<ReturnType<typeof open>>,\n fileSize: number,\n): Promise<number> {\n let position = fileSize;\n while (position > 0) {\n const scannedBytes = fileSize - position;\n const remainingScanBytes = MAX_RECOVERY_SCAN_BYTES - scannedBytes;\n if (remainingScanBytes <= 0) {\n throw recoveryValidationLimitError();\n }\n const chunkStart = Math.max(0, position - Math.min(TAIL_SCAN_CHUNK_BYTES, remainingScanBytes));\n const chunk = await readBufferAt(file, position - chunkStart, chunkStart);\n const lastNewline = chunk.lastIndexOf(0x0a);\n if (lastNewline >= 0) {\n return chunkStart + lastNewline + 1;\n }\n if (chunk.length === 0) {\n break;\n }\n position = chunkStart;\n }\n return 0;\n}\n\nfunction recoveryValidationLimitError(): Error {\n return new Error(\n \"Server recorder final record is too large to validate safely; refusing to modify it.\",\n );\n}\n\nfunction recorderFileSize(size: bigint | number): number {\n const normalized = typeof size === \"bigint\" ? Number(size) : size;\n if (!Number.isSafeInteger(normalized) || normalized < 0) {\n throw new Error(\"Server recorder file size exceeds the supported range.\");\n }\n return normalized;\n}\n\nasync function openRecorderFile(\n filePath: string,\n): Promise<{ created: boolean; file: Awaited<ReturnType<typeof open>> }> {\n try {\n return {\n created: true,\n file: await open(filePath, \"ax+\", 0o600),\n };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") {\n throw error;\n }\n return {\n created: false,\n file: await open(\n filePath,\n // Windows callers secure the publication directory before reaching this open.\n process.platform === \"win32\"\n ? \"r+\"\n : fsConstants.O_RDWR |\n fsConstants.O_APPEND |\n fsConstants.O_NONBLOCK |\n fsConstants.O_NOFOLLOW,\n 0o600,\n ),\n };\n }\n}\n\nasync function truncateRecorderFile(\n file: Awaited<ReturnType<typeof open>>,\n filePath: string,\n expectedIdentity: string,\n length: number,\n): Promise<boolean> {\n if (process.platform !== \"win32\") {\n await file.truncate(length);\n return true;\n }\n let repairFile: Awaited<ReturnType<typeof open>>;\n try {\n repairFile = await open(filePath, \"r+\");\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code === \"ENOENT\" || code === \"ENOTDIR\" || code === \"EISDIR\" || code === \"ELOOP\") {\n return false;\n }\n throw error;\n }\n let result = false;\n let operationFailed = false;\n let operationError: unknown;\n try {\n if (requireRecorderIdentity(await repairFile.stat({ bigint: true })) === expectedIdentity) {\n await repairFile.truncate(length);\n await repairFile.sync();\n result = true;\n }\n } catch (error) {\n operationFailed = true;\n operationError = error;\n }\n let closeFailed = false;\n let closeError: unknown;\n try {\n await repairFile.close();\n } catch (error) {\n closeFailed = true;\n closeError = error;\n }\n if (closeFailed) {\n if (operationFailed) {\n throw new AggregateError(\n [operationError, closeError],\n \"Server recorder tail repair and repair-handle close both failed.\",\n { cause: closeError },\n );\n }\n throw closeError;\n }\n if (operationFailed) {\n throw operationError;\n }\n return result;\n}\n\nasync function syncDirectory(directoryPath: string): Promise<void> {\n if (process.platform === \"win32\") {\n return;\n }\n const directory = await open(directoryPath, \"r\");\n let syncError: unknown;\n try {\n await directory.sync();\n } catch (error) {\n syncError = error;\n }\n let closeError: unknown;\n try {\n await directory.close();\n } catch (error) {\n closeError = error;\n }\n if (syncError !== undefined && closeError !== undefined) {\n throw new ServerRecorderDirectorySyncError(syncError, closeError);\n }\n if (syncError !== undefined) {\n throw syncError;\n }\n if (closeError !== undefined) {\n throw closeError;\n }\n}\n\nasync function syncRecorderPathAncestry(\n filePath: string,\n firstCreatedDirectory?: string,\n): Promise<void> {\n if (process.platform === \"win32\") {\n return;\n }\n const resolvedFilePath = path.resolve(filePath);\n let currentPath = resolvedFilePath;\n const syncThroughPath =\n firstCreatedDirectory === undefined ? undefined : path.resolve(firstCreatedDirectory);\n for (;;) {\n const directoryPath = path.dirname(currentPath);\n const mandatory = syncThroughPath !== undefined || currentPath === resolvedFilePath;\n try {\n await syncDirectory(directoryPath);\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (!mandatory && (code === \"EACCES\" || code === \"EPERM\")) {\n return;\n }\n throw error;\n }\n if (syncThroughPath === undefined) {\n return;\n }\n if (currentPath === syncThroughPath) {\n return;\n }\n if (path.dirname(directoryPath) === directoryPath) {\n return;\n }\n currentPath = directoryPath;\n }\n}\n\nfunction recorderIdentity(stats: { dev?: bigint; ino?: bigint }): string | undefined {\n if (stats.dev === undefined || stats.ino === undefined) {\n return undefined;\n }\n return `${stats.dev}:${stats.ino}`;\n}\n\nfunction requireRecorderFileIdentity(stats: {\n dev?: bigint;\n ino?: bigint;\n isFile?: () => boolean;\n nlink?: bigint;\n}): RecorderFileIdentity {\n if (stats.isFile?.() === false) {\n throw new Error(\"Server recorder path is not a regular file.\");\n }\n if (stats.dev === undefined || stats.ino === undefined) {\n throw new Error(\"Server recorder file identity is unavailable.\");\n }\n if (stats.nlink === undefined) {\n throw new Error(\"Server recorder file link count is unavailable.\");\n }\n return {\n dev: stats.dev,\n ino: stats.ino,\n nlink: stats.nlink,\n };\n}\n\nasync function recorderPathHasIdentity(\n filePath: string,\n expectedIdentity: string,\n): Promise<boolean> {\n try {\n const stats = await statPath(filePath, { bigint: true });\n if (stats.isFile?.() === false) {\n throw new Error(`Server recorder path is not a regular file: ${filePath}`);\n }\n return recorderIdentity(stats) === expectedIdentity;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n}\n\nasync function recorderWindowsPathIsRegular(filePath: string): Promise<boolean> {\n try {\n const stats = await lstat(filePath, { bigint: true });\n if (stats.isSymbolicLink() || !stats.isFile()) {\n throw new Error(`Server recorder path is not a regular file: ${filePath}`);\n }\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n}\n\nfunction requireRecorderIdentity(stats: { dev?: bigint; ino?: bigint }): string {\n const identity = recorderIdentity(stats);\n if (identity === undefined) {\n throw new Error(\"Server recorder file identity is unavailable.\");\n }\n return identity;\n}\n\nfunction recorderLockReleaseError(\n filePath: string,\n operationError: unknown,\n releaseError: unknown,\n): AggregateError | ServerRecorderCommittedError {\n if (operationError instanceof ServerRecorderCommittedError) {\n return new ServerRecorderCommittedError(\n filePath,\n operationError,\n [releaseError],\n operationError.indeterminate,\n );\n }\n return new AggregateError(\n [operationError, releaseError],\n `Server recorder append and lock release both failed for \"${filePath}\".`,\n { cause: operationError },\n );\n}\n\nfunction recorderLockAcquisitionReleaseError(\n filePath: string,\n acquisitionError: unknown,\n releaseError: unknown,\n): AggregateError {\n return new AggregateError(\n [acquisitionError, releaseError],\n `Server recorder shared lock acquisition and local lock release both failed for \"${filePath}\".`,\n { cause: acquisitionError },\n );\n}\n\nfunction recorderIdentityLockAcquisitionReleaseError(\n acquisitionError: unknown,\n releaseErrors: unknown[],\n): AggregateError {\n return new AggregateError(\n [acquisitionError, ...releaseErrors],\n \"Server recorder identity lock acquisition and cleanup both failed.\",\n { cause: acquisitionError },\n );\n}\n\nfunction isRecorderLockContention(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n (error as NodeJS.ErrnoException).code === \"ELOCKED\"\n );\n}\n\nasync function verifyPrivateServerRecorderDirectory(\n directory: string,\n currentUserId: number,\n requirePrivateMode: boolean,\n): Promise<void> {\n const handle = await open(\n directory,\n fsConstants.O_RDONLY | fsConstants.O_DIRECTORY | fsConstants.O_NOFOLLOW,\n );\n try {\n const identity = await handle.stat({ bigint: true });\n const current = await lstat(directory, { bigint: true });\n if (\n !identity.isDirectory() ||\n !current.isDirectory() ||\n current.isSymbolicLink() ||\n identity.dev !== current.dev ||\n identity.ino !== current.ino ||\n identity.uid !== BigInt(currentUserId) ||\n current.uid !== BigInt(currentUserId) ||\n (!requirePrivateMode && (identity.mode & 0o022n) !== 0n)\n ) {\n throw new Error(\"Server recorder lock directory is not privately owned.\");\n }\n if (requirePrivateMode && (identity.mode & 0o777n) !== 0o700n) {\n await handle.chmod(0o700);\n const secured = await handle.stat({ bigint: true });\n if ((secured.mode & 0o777n) !== 0o700n) {\n throw new Error(\"Server recorder lock directory permissions are not private.\");\n }\n }\n } finally {\n await handle.close();\n }\n}\n\nasync function securePrivateServerRecorderLockRoot(\n baseDirectory: string,\n components: string[],\n currentUserId: number,\n): Promise<string> {\n await verifyPrivateServerRecorderLockAncestry(baseDirectory, currentUserId);\n let currentPath = await realpath(baseDirectory);\n await verifyPrivateServerRecorderLockAncestry(currentPath, currentUserId);\n await verifyPrivateServerRecorderDirectory(currentPath, currentUserId, false);\n for (const component of components) {\n currentPath = path.join(currentPath, component);\n let created = false;\n try {\n await mkdir(currentPath, { mode: 0o700 });\n created = true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") {\n throw error;\n }\n }\n if (created) {\n await chmod(currentPath, 0o700);\n }\n await verifyPrivateServerRecorderDirectory(currentPath, currentUserId, true);\n }\n return currentPath;\n}\n\nasync function verifyPrivateServerRecorderLockAncestry(\n directory: string,\n currentUserId: number,\n): Promise<void> {\n let currentPath = path.resolve(directory);\n for (;;) {\n const current = await lstat(currentPath, { bigint: true });\n const ownerIsTrusted = current.uid === BigInt(currentUserId) || current.uid === 0n;\n if (current.isSymbolicLink()) {\n if (!ownerIsTrusted) {\n throw new Error(\"Server recorder lock directory parent namespace is not trusted.\");\n }\n } else {\n const peerWritable = (current.mode & 0o022n) !== 0n;\n const sticky = (current.mode & 0o1000n) !== 0n;\n if (!current.isDirectory() || !ownerIsTrusted || (peerWritable && !sticky)) {\n throw new Error(\"Server recorder lock directory parent namespace is not trusted.\");\n }\n }\n const parent = path.dirname(currentPath);\n if (parent === currentPath) {\n return;\n }\n currentPath = parent;\n }\n}\n\nasync function serverRecorderUnixLockRoot(currentUserId: number): Promise<string> {\n let homeDirectory: string;\n try {\n homeDirectory = userInfo().homedir;\n } catch (error) {\n throw new Error(\n `Server recorder identity locking requires an OS account home or ${RECORDER_LOCK_DIRECTORY_ENV}.`,\n { cause: error },\n );\n }\n await verifyPrivateServerRecorderLockAncestry(homeDirectory, currentUserId);\n const cacheDirectory = path.join(homeDirectory, \".cache\");\n let cacheCreated = false;\n try {\n await mkdir(cacheDirectory, { mode: 0o700 });\n cacheCreated = true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") {\n throw error;\n }\n }\n if (cacheCreated) {\n await chmod(cacheDirectory, 0o700);\n }\n return await securePrivateServerRecorderLockRoot(\n cacheDirectory,\n [\"crabline\", \"locks\", \"server-recorder\"],\n currentUserId,\n );\n}\n\ntype SecuredRecorderLockRoot = {\n assertIdentity(): Promise<void>;\n close(): Promise<void>;\n root: string;\n};\n\ntype SecuredRecorderLockArtifact = {\n assertIdentity(): Promise<void>;\n close(): Promise<void>;\n};\n\ntype RecorderLockArtifactIdentity = {\n dev: bigint;\n ino: bigint;\n};\n\nasync function secureRecorderLockArtifact(\n lockTarget: string,\n expectedIdentity: RecorderLockArtifactIdentity,\n): Promise<SecuredRecorderLockArtifact> {\n const lockDirectory = `${lockTarget}.lock`;\n let handle: Awaited<ReturnType<typeof open>>;\n try {\n handle = await open(\n lockDirectory,\n process.platform === \"win32\"\n ? \"r\"\n : fsConstants.O_RDONLY | fsConstants.O_DIRECTORY | fsConstants.O_NOFOLLOW,\n );\n } catch (error) {\n throw new Error(\"Server recorder shared lock artifact changed during acquisition.\", {\n cause: error,\n });\n }\n try {\n const identity = await handle.stat({ bigint: true });\n const current = await lstat(lockDirectory, { bigint: true });\n if (\n !identity.isDirectory() ||\n !current.isDirectory() ||\n current.isSymbolicLink() ||\n identity.dev !== expectedIdentity.dev ||\n identity.ino !== expectedIdentity.ino ||\n identity.dev !== current.dev ||\n identity.ino !== current.ino\n ) {\n throw new Error(\"Server recorder shared lock artifact changed during acquisition.\");\n }\n return {\n async assertIdentity() {\n const held = await handle.stat({ bigint: true });\n const candidate = await lstat(lockDirectory, { bigint: true });\n if (\n !held.isDirectory() ||\n !candidate.isDirectory() ||\n candidate.isSymbolicLink() ||\n held.dev !== identity.dev ||\n held.ino !== identity.ino ||\n candidate.dev !== identity.dev ||\n candidate.ino !== identity.ino\n ) {\n throw new Error(\"Server recorder shared lock artifact changed after acquisition.\");\n }\n },\n async close() {\n await handle.close();\n },\n };\n } catch (error) {\n try {\n await handle.close();\n } catch (closeError) {\n const aggregateError = new AggregateError(\n [error, closeError],\n \"Server recorder shared lock validation and handle cleanup both failed.\",\n );\n aggregateError.cause = closeError;\n throw aggregateError;\n }\n throw error;\n }\n}\n\nasync function secureRecorderLockRoot(root: string): Promise<SecuredRecorderLockRoot> {\n const configuredRoot = path.resolve(root);\n let windowsNamespace:\n | {\n path: string;\n snapshot: WindowsDirectorySecuritySnapshot;\n }\n | undefined;\n let currentUserId: number | undefined;\n if (process.platform === \"win32\") {\n const namespacePath = path.dirname(configuredRoot);\n // Writers may share the root ACL, but its parent namespace must not permit\n // an untrusted principal to replace that root.\n windowsNamespace = {\n path: namespacePath,\n snapshot: await readWindowsDirectoryNamespaceSecuritySnapshot(namespacePath),\n };\n } else {\n currentUserId = process.geteuid?.();\n if (currentUserId === undefined) {\n throw new Error(\"Server recorder identity locking requires a current user id.\");\n }\n await verifyPrivateServerRecorderLockAncestry(path.dirname(configuredRoot), currentUserId);\n }\n const canonicalRoot = await realpath(configuredRoot);\n if (path.relative(configuredRoot, canonicalRoot) !== \"\") {\n throw new Error(\n `${RECORDER_LOCK_DIRECTORY_ENV} must name a canonical directory without symlink components.`,\n );\n }\n if (currentUserId !== undefined) {\n await verifyPrivateServerRecorderLockAncestry(path.dirname(canonicalRoot), currentUserId);\n }\n const handle = await open(\n canonicalRoot,\n process.platform === \"win32\"\n ? \"r\"\n : fsConstants.O_RDONLY | fsConstants.O_DIRECTORY | fsConstants.O_NOFOLLOW,\n );\n try {\n const identity = await handle.stat({ bigint: true });\n const current = await lstat(canonicalRoot, { bigint: true });\n if (\n !identity.isDirectory() ||\n !current.isDirectory() ||\n current.isSymbolicLink() ||\n identity.dev !== current.dev ||\n identity.ino !== current.ino\n ) {\n throw new Error(\"Server recorder lock directory changed while opening it.\");\n }\n if (\n currentUserId !== undefined &&\n ((identity.mode & 0o002n) !== 0n || (current.mode & 0o002n) !== 0n)\n ) {\n throw new Error(\"Server recorder shared lock directory is writable by every local user.\");\n }\n if (windowsNamespace) {\n const currentNamespace = await readWindowsDirectoryNamespaceSecuritySnapshot(\n windowsNamespace.path,\n );\n if (\n currentNamespace.identity !== windowsNamespace.snapshot.identity ||\n currentNamespace.securityDescriptor !== windowsNamespace.snapshot.securityDescriptor\n ) {\n throw new Error(\"Server recorder shared lock directory changed while opening it.\");\n }\n }\n return {\n async assertIdentity() {\n if (currentUserId !== undefined) {\n await verifyPrivateServerRecorderLockAncestry(path.dirname(canonicalRoot), currentUserId);\n }\n const held = await handle.stat({ bigint: true });\n const candidate = await lstat(canonicalRoot, { bigint: true });\n if (\n !held.isDirectory() ||\n !candidate.isDirectory() ||\n candidate.isSymbolicLink() ||\n held.dev !== identity.dev ||\n held.ino !== identity.ino ||\n candidate.dev !== identity.dev ||\n candidate.ino !== identity.ino ||\n (currentUserId !== undefined &&\n ((held.mode & 0o002n) !== 0n || (candidate.mode & 0o002n) !== 0n))\n ) {\n throw new Error(\"Server recorder shared lock directory changed after validation.\");\n }\n if (windowsNamespace) {\n const currentNamespace = await readWindowsDirectoryNamespaceSecuritySnapshot(\n windowsNamespace.path,\n );\n if (\n currentNamespace.identity !== windowsNamespace.snapshot.identity ||\n currentNamespace.securityDescriptor !== windowsNamespace.snapshot.securityDescriptor\n ) {\n throw new Error(\"Server recorder shared lock directory changed after validation.\");\n }\n }\n },\n async close() {\n await handle.close();\n },\n root: canonicalRoot,\n };\n } catch (error) {\n try {\n await handle.close();\n } catch (closeError) {\n const aggregateError = new AggregateError(\n [error, closeError],\n \"Server recorder lock-root validation and handle cleanup both failed.\",\n );\n aggregateError.cause = closeError;\n throw aggregateError;\n }\n throw error;\n }\n}\n\nfunction recorderIdentityLockPath(root: string, identity: RecorderFileIdentity): string {\n return path.join(root, `recorder-${identity.dev}-${identity.ino}`);\n}\n\nfunction recorderSharedIdentityLockPath(root: string, identity: RecorderFileIdentity): string {\n // A shared inode can report different device numbers across mount namespaces.\n return path.join(root, `recorder-${identity.ino}`);\n}\n\ntype RecorderLockTarget = {\n namespaces: SecuredRecorderLockRoot[];\n path: string;\n};\n\nfunction deduplicateRecorderLockTargets(targets: RecorderLockTarget[]): RecorderLockTarget[] {\n const retained = new Map<string, RecorderLockTarget>();\n for (const target of targets) {\n const resolved = path.resolve(target.path);\n const key =\n process.platform === \"win32\" ? path.win32.normalize(resolved).toLowerCase() : resolved;\n const existing = retained.get(key);\n if (existing) {\n for (const namespace of target.namespaces) {\n if (!existing.namespaces.includes(namespace)) {\n existing.namespaces.push(namespace);\n }\n }\n continue;\n }\n retained.set(key, { namespaces: [...target.namespaces], path: target.path });\n }\n return [...retained.values()];\n}\n\nexport async function secureServerRecorderWindowsLockRoot(\n root: string,\n options: {\n createWindowsDirectory?: (directoryPath: string) => Promise<void>;\n readWindowsDirectorySecuritySnapshot?: (\n directoryPath: string,\n ) => Promise<WindowsDirectorySecuritySnapshot>;\n } = {},\n): Promise<string> {\n const cacheKey = path.win32.normalize(path.resolve(root)).toLowerCase();\n return secureCachedWindowsLockRoot({\n cache: securedWindowsLockRoots,\n cacheKey,\n createDirectory: () =>\n (options.createWindowsDirectory ?? createOwnerOnlyWindowsDirectory)(root),\n errorPrefix: \"Server recorder Windows lock root\",\n readSecuritySnapshot: () =>\n (options.readWindowsDirectorySecuritySnapshot ?? readWindowsDirectorySecuritySnapshot)(root),\n root,\n });\n}\n\nasync function secureServerRecorderWindowsDirectory(root: string): Promise<string> {\n const cacheKey = path.win32.normalize(path.resolve(root)).toLowerCase();\n return secureCachedWindowsLockRoot({\n cache: securedWindowsRecorderDirectories,\n cacheKey,\n createDirectory: async () => {\n try {\n const identity = await lstat(root);\n if (!identity.isDirectory() || identity.isSymbolicLink()) {\n throw new Error(\"Server recorder Windows directory is not a private directory.\");\n }\n if (isManagedRecorderDirectory(root)) {\n await createOwnerOnlyWindowsDirectory(root);\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n await createOwnerOnlyWindowsDirectory(root);\n }\n },\n errorPrefix: \"Server recorder Windows directory\",\n readSecuritySnapshot: () => readWindowsDirectoryNamespaceSecuritySnapshot(root),\n root,\n });\n}\n\nfunction serverRecorderWindowsLockRoot(): string {\n const configuredRoot = process.env.LOCALAPPDATA?.trim();\n const localAppData =\n configuredRoot && path.isAbsolute(configuredRoot)\n ? configuredRoot\n : path.join(userInfo().homedir, \"AppData\", \"Local\");\n return path.join(localAppData, \"Crabline\", \"locks\", \"server-recorder\");\n}\n\nexport function serverRecorderWindowsLockPath(root: string, filePath: string): string {\n const canonicalPath = path.win32.normalize(filePath).toLowerCase();\n const fingerprint = createHash(\"sha256\").update(canonicalPath).digest(\"hex\");\n return path.join(root, `recorder-${fingerprint}`);\n}\n\nasync function recorderProcessLockTarget(filePath: string): Promise<string> {\n if (process.platform !== \"win32\") {\n return filePath;\n }\n const root = await secureServerRecorderWindowsLockRoot(serverRecorderWindowsLockRoot());\n return serverRecorderWindowsLockPath(root, filePath);\n}\n\nasync function recorderLocalIdentityLockTarget(\n fileIdentity: RecorderFileIdentity,\n): Promise<string> {\n if (process.platform === \"win32\") {\n const root = await secureServerRecorderWindowsLockRoot(serverRecorderWindowsLockRoot());\n return recorderIdentityLockPath(root, fileIdentity);\n }\n const currentUserId = process.geteuid?.();\n if (currentUserId === undefined) {\n throw new Error(\"Server recorder identity locking requires a current user id.\");\n }\n return recorderIdentityLockPath(await serverRecorderUnixLockRoot(currentUserId), fileIdentity);\n}\n\nasync function recorderIdentityLockTargets(\n fileIdentity: RecorderFileIdentity,\n): Promise<RecorderLockTarget[]> {\n const configuredRoot = process.env[RECORDER_LOCK_DIRECTORY_ENV]?.trim();\n if (configuredRoot) {\n if (!path.isAbsolute(configuredRoot)) {\n throw new Error(`${RECORDER_LOCK_DIRECTORY_ENV} must be an absolute path.`);\n }\n const sharedRoot = await secureRecorderLockRoot(configuredRoot);\n try {\n // Lock every configured writer in the shared namespace before a first hardlink can appear.\n return deduplicateRecorderLockTargets([\n { namespaces: [], path: await recorderLocalIdentityLockTarget(fileIdentity) },\n {\n namespaces: [sharedRoot],\n path: recorderSharedIdentityLockPath(sharedRoot.root, fileIdentity),\n },\n ]);\n } catch (error) {\n await sharedRoot.close();\n throw error;\n }\n }\n if (fileIdentity.nlink > 1n) {\n throw new Error(\n `Server recorder hardlinks require ${RECORDER_LOCK_DIRECTORY_ENV} to name one shared writable lock directory for every writer.`,\n );\n }\n return deduplicateRecorderLockTargets([\n { namespaces: [], path: await recorderLocalIdentityLockTarget(fileIdentity) },\n ]);\n}\n\ntype AcquiredRecorderLock = {\n artifactIdentity: RecorderLockArtifactIdentity | undefined;\n release(): Promise<void>;\n};\n\nasync function acquireSingleRecorderLock(filePath: string): Promise<AcquiredRecorderLock> {\n const deadline = performance.now() + RECORDER_LOCK_STALE_MS + RECORDER_LOCK_WAIT_MARGIN_MS;\n const lockDirectory = path.resolve(`${filePath}.lock`);\n let artifactIdentity: RecorderLockArtifactIdentity | undefined;\n const lockFileSystem = createProcessOwnedLockFileSystem({\n onDirectoryOwned(directoryPath, identity) {\n if (path.resolve(directoryPath) === lockDirectory) {\n artifactIdentity = identity;\n }\n },\n });\n // proper-lockfile reports a failed initial mtime probe before its rmdir settles.\n const trackedFileSystem = Object.create(lockFileSystem) as typeof lockFileSystem;\n const removeDirectory = lockFileSystem.rmdir.bind(lockFileSystem);\n let pendingRemoval: Promise<void> | undefined;\n trackedFileSystem.rmdir = ((\n directory: PathLike,\n callback: (error: NodeJS.ErrnoException | null) => void,\n ) => {\n pendingRemoval = new Promise<void>((resolve) => {\n removeDirectory(directory, (error) => {\n callback(error);\n resolve();\n });\n });\n }) as typeof lockFileSystem.rmdir;\n for (;;) {\n try {\n const release = await lock(filePath, {\n fs: trackedFileSystem,\n realpath: false,\n retries: 0,\n stale: RECORDER_LOCK_STALE_MS,\n update: RECORDER_LOCK_UPDATE_MS,\n });\n return { artifactIdentity, release };\n } catch (error) {\n await pendingRemoval;\n if (!isRecorderLockContention(error)) {\n throw error;\n }\n const remainingMs = deadline - performance.now();\n if (remainingMs <= 0) {\n throw error;\n }\n await new Promise((resolve) =>\n setTimeout(resolve, Math.min(RECORDER_LOCK_RETRY_MS, remainingMs)),\n );\n }\n }\n}\n\nasync function releaseRecorderLockSet(releases: Array<() => Promise<void>>): Promise<void> {\n const errors: unknown[] = [];\n for (const release of releases.reverse()) {\n try {\n await release();\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length === 1) {\n throw errors[0];\n }\n if (errors.length > 1) {\n throw new AggregateError(errors, \"Multiple server recorder locks failed to release.\");\n }\n}\n\nasync function acquireRecorderLock(\n filePath: string,\n useProcessLocalWindowsTarget = true,\n): Promise<AcquiredRecorderLock> {\n if (process.platform !== \"win32\" || !useProcessLocalWindowsTarget) {\n return await acquireSingleRecorderLock(filePath);\n }\n const localLock = await acquireSingleRecorderLock(await recorderProcessLockTarget(filePath));\n try {\n const sharedLock = await acquireSingleRecorderLock(filePath);\n return {\n artifactIdentity: sharedLock.artifactIdentity,\n async release() {\n await releaseRecorderLockSet([localLock.release, sharedLock.release]);\n },\n };\n } catch (error) {\n const [releaseResult] = await Promise.allSettled([localLock.release()]);\n if (releaseResult?.status === \"rejected\") {\n throw recorderLockAcquisitionReleaseError(filePath, error, releaseResult.reason);\n }\n throw error;\n }\n}\n\nasync function acquireRecorderIdentityLock(identity: RecorderFileIdentity): Promise<{\n assertNamespace(): Promise<void>;\n release(): Promise<void>;\n}> {\n const releases: Array<() => Promise<void>> = [];\n const artifacts = new Set<SecuredRecorderLockArtifact>();\n const namespaces = new Set<SecuredRecorderLockRoot>();\n const closeBindings = async (): Promise<unknown[]> => {\n const closeResults = await Promise.allSettled(\n [...artifacts, ...namespaces].map(async (binding) => binding.close()),\n );\n return closeResults\n .filter((result): result is PromiseRejectedResult => result.status === \"rejected\")\n .map((result) => result.reason);\n };\n const assertNamespaces = async (): Promise<void> => {\n for (const namespace of namespaces) {\n await namespace.assertIdentity();\n }\n for (const artifact of artifacts) {\n await artifact.assertIdentity();\n }\n };\n try {\n const targets = await recorderIdentityLockTargets(identity);\n for (const target of targets) {\n for (const namespace of target.namespaces) {\n namespaces.add(namespace);\n }\n }\n for (const target of targets) {\n for (const namespace of target.namespaces) {\n await namespace.assertIdentity();\n }\n const acquired = await acquireRecorderLock(target.path, false);\n try {\n if (target.namespaces.length > 0) {\n if (!acquired.artifactIdentity) {\n throw new Error(\n \"Server recorder shared lock identity is unavailable after acquisition.\",\n );\n }\n artifacts.add(await secureRecorderLockArtifact(target.path, acquired.artifactIdentity));\n }\n } catch (error) {\n try {\n await acquired.release();\n } catch (releaseError) {\n throw recorderLockAcquisitionReleaseError(target.path, error, releaseError);\n }\n throw error;\n }\n releases.push(acquired.release);\n for (const namespace of target.namespaces) {\n await namespace.assertIdentity();\n }\n }\n } catch (error) {\n const releaseResults = await Promise.allSettled(\n releases.reverse().map(async (release) => release()),\n );\n const releaseErrors = releaseResults\n .filter((result): result is PromiseRejectedResult => result.status === \"rejected\")\n .map((result) => result.reason);\n const cleanupErrors = [...releaseErrors, ...(await closeBindings())];\n if (cleanupErrors.length > 0) {\n throw recorderIdentityLockAcquisitionReleaseError(error, cleanupErrors);\n }\n throw error;\n }\n return {\n assertNamespace: assertNamespaces,\n async release() {\n let releaseError: unknown;\n try {\n await releaseRecorderLockSet(releases);\n } catch (error) {\n releaseError = error;\n }\n const closeErrors = await closeBindings();\n if (releaseError !== undefined) {\n if (closeErrors.length > 0) {\n throw new AggregateError(\n [releaseError, ...closeErrors],\n \"Server recorder identity lock and namespace cleanup both failed.\",\n { cause: releaseError },\n );\n }\n throw releaseError;\n }\n if (closeErrors.length === 1) {\n throw closeErrors[0];\n }\n if (closeErrors.length > 1) {\n throw new AggregateError(\n closeErrors,\n \"Multiple server recorder lock namespaces failed to close.\",\n );\n }\n },\n };\n}\n\nasync function withRecorderLock(\n lockPath: string,\n logicalPath: string,\n operation: () => Promise<boolean | undefined>,\n): Promise<boolean | undefined> {\n const { release } = await acquireRecorderLock(lockPath);\n let operationFailed = false;\n let operationError: unknown;\n let result: boolean | undefined;\n try {\n result = await operation();\n } catch (error) {\n operationFailed = true;\n operationError = error;\n }\n try {\n await release();\n } catch (releaseError) {\n if (operationFailed) {\n throw recorderLockReleaseError(logicalPath, operationError, releaseError);\n }\n if (result === true) {\n throw new ServerRecorderCommittedError(logicalPath, releaseError);\n }\n throw releaseError;\n }\n if (operationFailed) {\n throw operationError;\n }\n return result;\n}\n\nasync function closeRecorderAttempt(params: {\n committed: boolean;\n file: Awaited<ReturnType<typeof open>>;\n filePath: string;\n operationFailed: boolean;\n operationError: unknown;\n}): Promise<void> {\n let closeFailed = false;\n let closeError: unknown;\n try {\n await params.file.close();\n } catch (error) {\n closeFailed = true;\n closeError = error;\n }\n if (closeFailed) {\n if (params.operationFailed) {\n if (params.operationError instanceof ServerRecorderCommittedError) {\n throw new ServerRecorderCommittedError(\n params.filePath,\n params.operationError,\n [closeError],\n params.operationError.indeterminate,\n );\n }\n throw new AggregateError(\n [params.operationError, closeError],\n \"Server recorder operation and file close both failed.\",\n { cause: closeError },\n );\n }\n if (params.committed) {\n throw new ServerRecorderCommittedError(params.filePath, closeError);\n }\n throw closeError;\n }\n if (params.operationFailed) {\n throw params.operationError;\n }\n}\n\nasync function appendRecorderAttempt(params: {\n createdDirectory: string | undefined;\n logicalPath: string;\n line: string;\n publicationPath: string;\n}): Promise<\"committed\" | \"retargeted\" | \"retry\"> {\n const opened = await openRecorderFile(params.publicationPath);\n const { file } = opened;\n let committed = false;\n let operationFailed = false;\n let operationError: unknown;\n let identityLock:\n | {\n assertNamespace(): Promise<void>;\n release(): Promise<void>;\n }\n | undefined;\n let result: \"committed\" | \"retargeted\" | \"retry\" | undefined;\n try {\n const openedStats = await file.stat({ bigint: true });\n const lockedIdentity = requireRecorderFileIdentity(openedStats);\n let identity = `${lockedIdentity.dev}:${lockedIdentity.ino}`;\n if (opened.created) {\n await file.chmod(0o600);\n }\n if (\n process.platform === \"win32\" &&\n !(await recorderWindowsPathIsRegular(params.publicationPath))\n ) {\n result = \"retry\";\n } else if (!(await recorderPathHasIdentity(params.publicationPath, identity))) {\n result = \"retry\";\n } else {\n identityLock = await acquireRecorderIdentityLock(lockedIdentity);\n await identityLock.assertNamespace();\n // Lock acquisition may have blocked while another writer repaired or appended.\n let stats = await file.stat({ bigint: true });\n const currentIdentity = requireRecorderFileIdentity(stats);\n identity = requireRecorderIdentity(stats);\n if (\n currentIdentity.dev !== lockedIdentity.dev ||\n currentIdentity.ino !== lockedIdentity.ino ||\n currentIdentity.nlink !== lockedIdentity.nlink ||\n !(await recorderPathHasIdentity(params.publicationPath, identity))\n ) {\n result = \"retry\";\n } else if ((await resolveRecorderPath(params.logicalPath)) !== params.publicationPath) {\n result = \"retargeted\";\n }\n if (result === undefined) {\n const fileSize = recorderFileSize(stats.size);\n if (fileSize > 0) {\n const finalByte = await readBufferAt(file, 1, fileSize - 1);\n if (finalByte[0] !== 0x0a) {\n const tailStart = await findIncompleteTailStart(file, fileSize);\n const tailLength = fileSize - tailStart;\n if (tailLength > MAX_RECOVERY_VALIDATION_BYTES) {\n throw recoveryValidationLimitError();\n }\n const tail = await readBufferAt(file, tailLength, tailStart);\n if (tail.length !== tailLength) {\n throw new Error(\"Server recorder changed while repairing its final record.\");\n }\n try {\n JSON.parse(tail.toString(\"utf8\"));\n await identityLock.assertNamespace();\n await appendRecorderText(file, \"\\n\", fileSize);\n } catch (error) {\n if (!(error instanceof SyntaxError)) {\n throw error;\n }\n await identityLock.assertNamespace();\n if (\n !(await truncateRecorderFile(file, params.publicationPath, identity, tailStart))\n ) {\n result = \"retry\";\n }\n }\n }\n }\n if (result === undefined) {\n // Repair and truncation change EOF; refresh it before a positional Windows append.\n stats = await file.stat({ bigint: true });\n identity = requireRecorderIdentity(stats);\n }\n if (\n result === undefined &&\n !(await recorderPathHasIdentity(params.publicationPath, identity))\n ) {\n result = \"retry\";\n } else if (result === undefined) {\n try {\n await identityLock.assertNamespace();\n await appendRecorderText(file, params.line, recorderFileSize(stats.size));\n await file.sync();\n if (\n !(await recorderPathHasIdentity(params.publicationPath, identity)) ||\n (await resolveRecorderPath(params.logicalPath)) !== params.publicationPath\n ) {\n throw new ServerRecorderCommittedError(\n params.logicalPath,\n new ServerRecorderRotationError(\"Server recorder rotated during append.\"),\n );\n } else {\n const firstCreatedPath =\n params.createdDirectory ?? (opened.created ? params.publicationPath : undefined);\n await syncRecorderPathAncestry(params.publicationPath, firstCreatedPath);\n if (\n !(await recorderPathHasIdentity(params.publicationPath, identity)) ||\n (await resolveRecorderPath(params.logicalPath)) !== params.publicationPath\n ) {\n throw new ServerRecorderCommittedError(\n params.logicalPath,\n new ServerRecorderRotationError(\n \"Server recorder rotated while syncing path ancestry.\",\n ),\n );\n } else {\n committed = true;\n result = \"committed\";\n }\n }\n } catch (error) {\n if (error instanceof ServerRecorderCommittedError) {\n throw error;\n }\n if (error instanceof ServerRecorderDirectorySyncError) {\n throw new ServerRecorderCommittedError(\n params.logicalPath,\n error.syncError,\n [error.closeError],\n true,\n );\n }\n throw new ServerRecorderCommittedError(params.logicalPath, error, [], true);\n }\n }\n }\n }\n } catch (error) {\n operationFailed = true;\n operationError = error;\n }\n if (identityLock) {\n try {\n await identityLock.release();\n } catch (releaseError) {\n if (operationFailed) {\n operationError = recorderLockReleaseError(params.logicalPath, operationError, releaseError);\n } else {\n operationFailed = true;\n operationError = committed\n ? new ServerRecorderCommittedError(params.logicalPath, releaseError)\n : releaseError;\n }\n }\n }\n await closeRecorderAttempt({\n committed,\n file,\n filePath: params.logicalPath,\n operationError,\n operationFailed,\n });\n return result ?? \"retry\";\n}\n\nasync function resolveRecorderPath(filePath: string): Promise<string> {\n try {\n return await realpath(filePath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n try {\n if ((await lstat(filePath)).isSymbolicLink()) {\n const target = await readlink(filePath);\n return await resolveRecorderPath(path.resolve(path.dirname(filePath), target));\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n return path.join(await resolveRecorderPath(path.dirname(filePath)), path.basename(filePath));\n}\n\nfunction planObserver(params: {\n key: string;\n logicalPath: string;\n onEvent: ServerEventObserver | undefined;\n}): ObserverPlan | undefined {\n if (params.onEvent === undefined) {\n return undefined;\n }\n const dependencies = new Set<ObserverTask>();\n const previousLogical = pendingLogicalObservers.get(params.logicalPath);\n const previousPublication = pendingPublicationObservers.get(params.key);\n if (previousLogical !== undefined) {\n dependencies.add(previousLogical);\n }\n if (previousPublication !== undefined) {\n dependencies.add(previousPublication);\n }\n let markStarted!: () => void;\n const started = new Promise<void>((resolve) => {\n markStarted = resolve;\n });\n const task: ObserverTask = {\n markStarted,\n started,\n };\n return { dependencies, task };\n}\n\nfunction activateObserver(params: {\n event: ServerRequestEvent;\n key: string;\n logicalPath: string;\n onEvent: ServerEventObserver | undefined;\n plan: ObserverPlan | undefined;\n}): Promise<void> {\n if (params.onEvent === undefined || params.plan === undefined) {\n return Promise.resolve();\n }\n const { dependencies, task } = params.plan;\n const current = Promise.all(\n [...dependencies].map((dependency) => dependency.started.catch(() => {})),\n ).then(async () => {\n try {\n const observation = params.onEvent?.(params.event);\n task.markStarted();\n await observation;\n } catch (error) {\n task.markStarted();\n throw new ServerRecorderCommittedError(params.logicalPath, error);\n }\n });\n pendingLogicalObservers.set(params.logicalPath, task);\n pendingPublicationObservers.set(params.key, task);\n void current.then(\n () => {\n if (pendingLogicalObservers.get(params.logicalPath) === task) {\n pendingLogicalObservers.delete(params.logicalPath);\n }\n if (pendingPublicationObservers.get(params.key) === task) {\n pendingPublicationObservers.delete(params.key);\n }\n },\n () => {\n if (pendingLogicalObservers.get(params.logicalPath) === task) {\n pendingLogicalObservers.delete(params.logicalPath);\n }\n if (pendingPublicationObservers.get(params.key) === task) {\n pendingPublicationObservers.delete(params.key);\n }\n },\n );\n return current;\n}\n\ntype RecorderAppendResult = {\n observation: Promise<void>;\n};\n\nasync function appendResolvedJsonLine(params: {\n event: ServerRequestEvent;\n line: string;\n logicalPath: string;\n onEvent: ServerEventObserver | undefined;\n}): Promise<RecorderAppendResult | undefined> {\n const { logicalPath } = params;\n const key = await resolveRecorderPath(logicalPath);\n const previous = pendingAppends.get(key) ?? Promise.resolve();\n const current = previous\n .catch(() => {})\n .then(async () => {\n const observerPlan = planObserver({\n key,\n logicalPath,\n onEvent: params.onEvent,\n });\n let observerActivated = false;\n try {\n const directory = path.dirname(key);\n let createdDirectory: string | undefined;\n if (process.platform === \"win32\") {\n await secureServerRecorderWindowsDirectory(directory);\n } else {\n createdDirectory = await mkdir(directory, { mode: 0o700, recursive: true });\n if (createdDirectory !== undefined || isManagedRecorderDirectory(directory)) {\n await chmod(directory, 0o700);\n }\n }\n // Keep the cross-process lock through append verification.\n const committed = await withRecorderLock(key, logicalPath, async () => {\n if ((await resolveRecorderPath(logicalPath)) !== key) {\n return undefined;\n }\n for (let attempt = 0; attempt < RECORDER_ROTATION_ATTEMPTS; attempt++) {\n const result = await appendRecorderAttempt({\n createdDirectory,\n logicalPath,\n line: params.line,\n publicationPath: key,\n });\n if (result === \"committed\") {\n return true;\n }\n if (result === \"retargeted\") {\n return undefined;\n }\n }\n throw new ServerRecorderRotationError(\n `Server recorder rotation retries exhausted for \"${logicalPath}\".`,\n );\n });\n if (committed !== true) {\n return undefined;\n }\n observerActivated = true;\n return {\n observation: activateObserver({\n event: params.event,\n key,\n logicalPath,\n onEvent: params.onEvent,\n plan: observerPlan,\n }),\n };\n } finally {\n if (!observerActivated) {\n observerPlan?.task.markStarted();\n }\n }\n });\n const tail = current.then(\n () => undefined,\n () => undefined,\n );\n pendingAppends.set(key, tail);\n\n try {\n return await current;\n } finally {\n if (pendingAppends.get(key) === tail) {\n pendingAppends.delete(key);\n }\n }\n}\n\nasync function appendJsonLine(params: {\n event: ServerRequestEvent;\n line: string;\n onEvent: ServerEventObserver | undefined;\n recorderPath: string;\n}): Promise<RecorderAppendResult> {\n const logicalPath = path.resolve(params.recorderPath);\n const previous = pendingAdmissions.get(logicalPath) ?? Promise.resolve();\n const current = previous\n .catch(() => {})\n .then(async () => {\n for (let attempt = 0; attempt < RECORDER_PATH_ATTEMPTS; attempt++) {\n const result = await appendResolvedJsonLine({\n event: params.event,\n line: params.line,\n logicalPath,\n onEvent: params.onEvent,\n });\n if (result !== undefined) {\n return result;\n }\n }\n throw new ServerRecorderRotationError(\n `Server recorder path retries exhausted for \"${logicalPath}\".`,\n );\n });\n const tail = current.then(\n () => undefined,\n () => undefined,\n );\n pendingAdmissions.set(logicalPath, tail);\n\n let result: RecorderAppendResult;\n try {\n result = await current;\n } finally {\n if (pendingAdmissions.get(logicalPath) === tail) {\n pendingAdmissions.delete(logicalPath);\n }\n }\n return result;\n}\n\nfunction snapshotServerEvent(event: ServerRequestEvent): {\n event: ServerRequestEvent;\n line: string;\n} {\n const serialized = JSON.stringify(event);\n if (serialized === undefined) {\n throw new TypeError(\"Server recorder event is not JSON-serializable.\");\n }\n return {\n event: JSON.parse(serialized) as ServerRequestEvent,\n line: `${serialized}\\n`,\n };\n}\n\ntype ServerRecorderWrite = {\n event: ServerRequestEvent;\n onEvent: ServerEventObserver | undefined;\n recorderPath: string;\n};\n\nexport async function recordServerEvent(\n params: ServerRecorderWrite,\n pending?: Set<Promise<RecorderAppendResult>>,\n): Promise<void> {\n const snapshot = snapshotServerEvent(params.event);\n const persistence = appendJsonLine({\n ...snapshot,\n onEvent: params.onEvent,\n recorderPath: params.recorderPath,\n });\n pending?.add(persistence);\n let result: RecorderAppendResult;\n try {\n result = await persistence;\n } finally {\n pending?.delete(persistence);\n }\n await result.observation;\n}\n\nexport async function recordCommittedServerEvent(\n params: ServerRecorderWrite,\n pending?: Set<Promise<RecorderAppendResult>>,\n): Promise<void> {\n try {\n await recordServerEvent(params, pending);\n } catch {\n // The provider mutation already committed, so telemetry failure cannot change its response.\n }\n}\n\nexport type ServerRecorder = {\n record(event: ServerRequestEvent): Promise<void>;\n recordCommitted(event: ServerRequestEvent): Promise<void>;\n close(): Promise<void>;\n};\n\nexport function createServerRecorder(params: {\n recorderPath: string;\n onEvent: ServerEventObserver | undefined;\n}): ServerRecorder {\n initializeProcessOwnedLockIdentity();\n const pending = new Set<Promise<RecorderAppendResult>>();\n let closing = false;\n const record = async (event: ServerRequestEvent, committed: boolean) => {\n if (closing) {\n if (committed) {\n return;\n }\n throw new Error(\"Server recorder is closed.\");\n }\n await (committed ? recordCommittedServerEvent : recordServerEvent)(\n { ...params, event },\n pending,\n );\n };\n return {\n record: (event) => record(event, false),\n recordCommitted: (event) => record(event, true),\n async close() {\n closing = true;\n // Observers can call close themselves; only persistence owns recorder artifacts.\n await Promise.allSettled(pending);\n },\n };\n}\n"]}
@@ -2,8 +2,8 @@ import { randomBytes } from "node:crypto";
2
2
  import { createServer } from "node:http";
3
3
  import { isIP } from "node:net";
4
4
  import path from "node:path";
5
- import { adminAuthError, closeServer, drainRequestBody, formatUrlHost, hasAdminToken, InvalidJsonBodyError, isJsonObject, jsonResponse, parseUnknownRequestBody, queryRecord, readInteger, readTrimmedString, RequestBodyTooLargeError, writeResponse, } from "./http.js";
6
- import { recordCommittedServerEvent, recordServerEvent, ServerRecorderCommittedError, } from "./recorder.js";
5
+ import { adminAuthError, closeServer, createServerClose, drainRequestBody, formatUrlHost, hasAdminToken, InvalidJsonBodyError, isJsonObject, jsonResponse, parseUnknownRequestBody, queryRecord, readInteger, readTrimmedString, RequestBodyTooLargeError, writeResponse, } from "./http.js";
6
+ import { createServerRecorder, ServerRecorderCommittedError, } from "./recorder.js";
7
7
  import { resolveMaxPendingInboundEvents } from "./pending-events.js";
8
8
  const SIGNAL_CLI_SSE_KEEPALIVE_MS = 15_000;
9
9
  const DEFAULT_MAX_SIGNAL_SSE_CLIENTS = 32;
@@ -11,8 +11,7 @@ const MAX_SIGNAL_SSE_BUFFER_BYTES = 2 * 1024 * 1024;
11
11
  const SIGNAL_PHONE_NUMBER_RE = /^\+[1-9]\d{2,14}$/u;
12
12
  const SIGNAL_UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/iu;
13
13
  async function appendEvent(state, event, committed = false) {
14
- const params = { event, onEvent: state.onEvent, recorderPath: state.recorderPath };
15
- await (committed ? recordCommittedServerEvent(params) : recordServerEvent(params));
14
+ await (committed ? state.recorder.recordCommitted(event) : state.recorder.record(event));
16
15
  }
17
16
  function rpcResponse(id, result) {
18
17
  return jsonResponse({ id: id ?? null, jsonrpc: "2.0", result });
@@ -716,6 +715,7 @@ export async function startSignalServer(params = {}) {
716
715
  if (!account) {
717
716
  throw new Error("account must be an E.164 telephone number.");
718
717
  }
718
+ const recorderPath = params.recorderPath ?? path.resolve(".crabline", "servers", "signal.jsonl");
719
719
  const state = {
720
720
  account,
721
721
  adminToken: params.adminToken ?? randomBytes(24).toString("base64url"),
@@ -728,12 +728,12 @@ export async function startSignalServer(params = {}) {
728
728
  : DEFAULT_MAX_SIGNAL_SSE_CLIENTS,
729
729
  nextEventSequence: 1,
730
730
  nextTimestamp: Date.now(),
731
- onEvent: params.onEvent,
731
+ recorder: createServerRecorder({ recorderPath, onEvent: params.onEvent }),
732
732
  pendingEventBytes: 0,
733
733
  pendingEvents: [],
734
734
  pendingTimestampCommits: Promise.resolve(),
735
735
  pendingSseClients: 0,
736
- recorderPath: params.recorderPath ?? path.resolve(".crabline", "servers", "signal.jsonl"),
736
+ recorderPath,
737
737
  };
738
738
  const host = params.host ?? "127.0.0.1";
739
739
  const normalizedHost = normalizeSignalHost(host);
@@ -797,13 +797,13 @@ export async function startSignalServer(params = {}) {
797
797
  const advertisedHost = normalizedHost === "0.0.0.0" ? "127.0.0.1" : normalizedHost === "::" ? "::1" : host;
798
798
  const baseUrl = `http://${formatUrlHost(advertisedHost)}:${address.port}`;
799
799
  return {
800
- async close() {
800
+ close: createServerClose(state.recorder, async () => {
801
801
  clearInterval(keepalive);
802
802
  for (const client of state.clients) {
803
803
  client.end();
804
804
  }
805
805
  await closeServer(server);
806
- },
806
+ }),
807
807
  manifest: {
808
808
  account: state.account,
809
809
  adminToken: state.adminToken,