@nexart/ai-execution 0.8.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +167 -3
- package/dist/index.cjs +182 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +68 -3
- package/dist/index.d.ts +68 -3
- package/dist/index.mjs +178 -1
- package/dist/index.mjs.map +1 -1
- package/dist/langchain.cjs +480 -0
- package/dist/langchain.cjs.map +1 -0
- package/dist/langchain.d.cts +185 -0
- package/dist/langchain.d.ts +185 -0
- package/dist/langchain.mjs +444 -0
- package/dist/langchain.mjs.map +1 -0
- package/dist/providers/anthropic.d.cts +1 -1
- package/dist/providers/anthropic.d.ts +1 -1
- package/dist/providers/openai.d.cts +1 -1
- package/dist/providers/openai.d.ts +1 -1
- package/dist/providers/wrap.d.cts +1 -1
- package/dist/providers/wrap.d.ts +1 -1
- package/dist/{types-CcqCDPrD.d.cts → types-C5t12OK8.d.cts} +2 -0
- package/dist/{types-CcqCDPrD.d.ts → types-C5t12OK8.d.ts} +2 -0
- package/package.json +7 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/types.ts","../src/errors.ts","../src/canonicalJson.ts","../src/hash.ts","../src/snapshot.ts","../src/cer.ts","../src/certify.ts","../src/run.ts","../src/sanitize.ts","../src/attest.ts","../src/archive.ts","../src/providers/wrap.ts","../src/receipt.ts","../src/wrappers.ts","../node_modules/@noble/ed25519/index.js","../node_modules/@noble/hashes/src/utils.ts","../node_modules/@noble/hashes/src/_md.ts","../node_modules/@noble/hashes/src/_u64.ts","../node_modules/@noble/hashes/src/sha2.ts","../src/nodeReceipt.ts","../src/certifyFromProvider.ts","../src/providerExtract.ts","../src/client.ts","../src/aief.ts","../src/tools.ts","../src/chain.ts","../src/redact.ts","../src/profile.ts","../src/exportRedacted.ts","../src/runHelper.ts"],"sourcesContent":["export { CerVerifyCode } from './types.js';\nexport type {\n CerVerifyCode as CerVerifyCodeType,\n AiExecutionSnapshotV1,\n AiExecutionParameters,\n CerAiExecutionBundle,\n CerMeta,\n VerificationResult,\n CreateSnapshotParams,\n AttestationResult,\n AttestationReceipt,\n AttestationReceiptResult,\n AttestOptions,\n CertifyDecisionParams,\n RunBuilderOptions,\n StepParams,\n RunSummary,\n ProviderConfig,\n WrappedExecutionParams,\n WrappedExecutionResult,\n NodeKeysDocument,\n SignedAttestationReceipt,\n NodeReceiptVerifyResult,\n // v0.6.0\n ProviderCallParams,\n ProviderCallResult,\n ClientDefaults,\n NexArtClient,\n SanitizeStorageOptions,\n // v0.7.0\n ToolEvent,\n BundleDeclaration,\n RedactionEnvelope,\n AiefVerifyResult,\n RunSummaryVerifyResult,\n AiefProfile,\n} from './types.js';\n\nexport { CerVerificationError, CerAttestationError } from './errors.js';\nexport { toCanonicalJson } from './canonicalJson.js';\nexport { sha256Hex, hashUtf8, hashCanonicalJson, computeInputHash, computeOutputHash } from './hash.js';\nexport { createSnapshot, verifySnapshot } from './snapshot.js';\nexport { sealCer, verifyCer, verifyCer as verify } from './cer.js';\nexport { certifyDecision } from './certify.js';\nexport { RunBuilder } from './run.js';\nexport { attest } from './attest.js';\nexport { exportCer, importCer } from './archive.js';\nexport { wrapProvider } from './providers/wrap.js';\nexport {\n sanitizeForAttestation,\n sanitizeForStorage,\n sanitizeForStamp,\n hasAttestation,\n} from './sanitize.js';\nexport { getAttestationReceipt } from './receipt.js';\nexport { certifyAndAttestDecision, attestIfNeeded } from './wrappers.js';\nexport {\n verifyNodeReceiptSignature,\n fetchNodeKeys,\n selectNodeKey,\n verifyBundleAttestation,\n} from './nodeReceipt.js';\n\n// v0.6.0: high-level provider wrapper\nexport { certifyDecisionFromProviderCall } from './certifyFromProvider.js';\n\n// v0.6.0: opinionated client factory\nexport { createClient } from './client.js';\n\n// ─── v0.7.0: AIEF Alignment Layer ────────────────────────────────────────────\n\n// Feature B: AIEF §9 verifier adapter\nexport { verifyAief, mapToAiefReason } from './aief.js';\n\n// Feature C: Level 4 tool/dependency evidence helpers\nexport { hashToolOutput, makeToolEvent } from './tools.js';\nexport type { MakeToolEventParams } from './tools.js';\n\n// Feature D: Level 4 chain integrity verification\nexport { verifyRunSummary } from './chain.js';\nexport type { VerifyRunSummaryOptions } from './chain.js';\n\n// Feature F: Pre-seal verifiable redaction\nexport { redactBeforeSeal } from './redact.js';\nexport type { RedactBeforeSealPolicy } from './redact.js';\n\n// Feature E: Opt-in AIEF profiles\nexport { validateProfile } from './profile.js';\nexport type { ProfileValidationResult } from './profile.js';\n\n// ─── Verifiable redacted export ───────────────────────────────────────────────\n\nexport { exportVerifiableRedacted } from './exportRedacted.js';\nexport type {\n ExportVerifiableRedactedOptions,\n ExportVerifiableRedactedResult,\n ExportVerifiableRedactedProvenance,\n} from './exportRedacted.js';\n\n// ─── Opinionated run helper ───────────────────────────────────────────────────\n\nexport { certifyAndAttestRun } from './runHelper.js';\nexport type {\n CertifyAndAttestRunOptions,\n CertifyAndAttestRunResult,\n} from './runHelper.js';\n","export interface AiExecutionParameters {\n temperature: number;\n maxTokens: number;\n topP: number | null;\n seed: number | null;\n}\n\n// ─── v0.7.0: Tool / dependency evidence ──────────────────────────────────────\n\n/** AIEF-06 tool call evidence record. Include in snapshot.toolCalls. */\nexport interface ToolEvent {\n toolId: string;\n at: string;\n inputHash?: string;\n outputHash: string;\n evidenceRef?: string;\n error?: string;\n}\n\n// ─── v0.7.0: Bundle self-description (not hashed) ────────────────────────────\n\n/**\n * Declarative block attached to a bundle that describes its integrity scheme\n * and protected set. EXCLUDED from certificateHash by design — purely informational.\n * Satisfies AIEF-02 SHOULD requirement for self-describing artifacts.\n */\nexport interface BundleDeclaration {\n stabilitySchemeId: string;\n protectedSetId: string;\n protectedFields: string[];\n notes?: string;\n}\n\n// ─── v0.7.0: Redaction envelope ──────────────────────────────────────────────\n\n/** Stable placeholder produced by redactBeforeSeal(). Preserves the original value's hash. */\nexport interface RedactionEnvelope {\n _redacted: true;\n hash: string;\n}\n\n// ─── v0.7.0: AIEF §9.1 verifier output schema ────────────────────────────────\n\n/** Exact AIEF §9.1 output shape returned by verifyAief(). */\nexport interface AiefVerifyResult {\n result: 'PASS' | 'FAIL';\n reason: string | null;\n checks: {\n schemaSupported: boolean;\n integrityValid: boolean;\n protectedSetValid: boolean;\n chainValid: boolean;\n };\n field?: string;\n expected?: string;\n observed?: string;\n notes?: string[];\n}\n\n// ─── v0.7.0: Chain verification result ───────────────────────────────────────\n\n/** Result returned by verifyRunSummary(). */\nexport interface RunSummaryVerifyResult {\n ok: boolean;\n code: CerVerifyCode;\n errors: string[];\n details?: string[];\n breakAt?: number;\n expectedPrev?: string;\n observedPrev?: string;\n}\n\n// ─── v0.7.0: Profiles ────────────────────────────────────────────────────────\n\n/** Opt-in strictness profile. Does NOT affect certificateHash computation. */\nexport type AiefProfile = 'flexible' | 'AIEF_L2' | 'AIEF_L3' | 'AIEF_L4';\n\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface AiExecutionSnapshotV1 {\n type: 'ai.execution.v1';\n protocolVersion: '1.2.0';\n executionSurface: 'ai';\n executionId: string;\n timestamp: string;\n provider: string;\n model: string;\n modelVersion: string | null;\n prompt: string;\n input: string | Record<string, unknown>;\n inputHash: string;\n parameters: AiExecutionParameters;\n output: string | Record<string, unknown>;\n outputHash: string;\n sdkVersion: string | null;\n appId: string | null;\n runId?: string | null;\n stepId?: string | null;\n stepIndex?: number | null;\n workflowId?: string | null;\n conversationId?: string | null;\n prevStepHash?: string | null;\n /** v0.7.0 — AIEF-06 tool/dependency evidence. Included in certificateHash when present. */\n toolCalls?: ToolEvent[];\n}\n\nexport interface CerMeta {\n source?: string;\n tags?: string[];\n [key: string]: unknown;\n}\n\nexport interface CerAiExecutionBundle {\n bundleType: 'cer.ai.execution.v1';\n certificateHash: string;\n createdAt: string;\n version: '0.1';\n snapshot: AiExecutionSnapshotV1;\n meta?: CerMeta;\n /**\n * v0.7.0 — Optional declarative block describing the integrity scheme and protected set.\n * EXCLUDED from certificateHash computation by design. Purely informational.\n * Satisfies AIEF-02 SHOULD requirement for self-describing artifacts.\n */\n declaration?: BundleDeclaration;\n}\n\nexport const CerVerifyCode = {\n OK: 'OK',\n CERTIFICATE_HASH_MISMATCH: 'CERTIFICATE_HASH_MISMATCH',\n SNAPSHOT_HASH_MISMATCH: 'SNAPSHOT_HASH_MISMATCH',\n INPUT_HASH_MISMATCH: 'INPUT_HASH_MISMATCH',\n OUTPUT_HASH_MISMATCH: 'OUTPUT_HASH_MISMATCH',\n INVALID_SHA256_FORMAT: 'INVALID_SHA256_FORMAT',\n CANONICALIZATION_ERROR: 'CANONICALIZATION_ERROR',\n SCHEMA_ERROR: 'SCHEMA_ERROR',\n UNKNOWN_ERROR: 'UNKNOWN_ERROR',\n ATTESTATION_MISSING: 'ATTESTATION_MISSING',\n ATTESTATION_KEY_NOT_FOUND: 'ATTESTATION_KEY_NOT_FOUND',\n ATTESTATION_INVALID_SIGNATURE: 'ATTESTATION_INVALID_SIGNATURE',\n ATTESTATION_KEY_FORMAT_UNSUPPORTED: 'ATTESTATION_KEY_FORMAT_UNSUPPORTED',\n // v0.7.0 — Level 4 + AIEF interop codes\n CHAIN_BREAK_DETECTED: 'CHAIN_BREAK_DETECTED',\n INCOMPLETE_ARTIFACT: 'INCOMPLETE_ARTIFACT',\n VERIFICATION_MATERIAL_UNAVAILABLE: 'VERIFICATION_MATERIAL_UNAVAILABLE',\n TOOL_EVIDENCE_MISSING: 'TOOL_EVIDENCE_MISSING',\n TOOL_OUTPUT_HASH_MISMATCH: 'TOOL_OUTPUT_HASH_MISMATCH',\n} as const;\n\nexport type CerVerifyCode = typeof CerVerifyCode[keyof typeof CerVerifyCode];\n\nexport interface VerificationResult {\n ok: boolean;\n errors: string[];\n code: CerVerifyCode;\n details?: string[];\n}\n\nexport interface CreateSnapshotParams {\n executionId: string;\n timestamp?: string;\n provider: string;\n model: string;\n modelVersion?: string | null;\n prompt: string;\n input: string | Record<string, unknown>;\n parameters: AiExecutionParameters;\n output: string | Record<string, unknown>;\n sdkVersion?: string | null;\n appId?: string | null;\n runId?: string | null;\n stepId?: string | null;\n stepIndex?: number | null;\n workflowId?: string | null;\n conversationId?: string | null;\n prevStepHash?: string | null;\n /** v0.7.0 — AIEF-06 tool/dependency evidence records. */\n toolCalls?: ToolEvent[];\n}\n\nexport interface AttestationResult {\n ok: boolean;\n attestationId?: string;\n nodeRuntimeHash?: string;\n certificateHash?: string;\n protocolVersion?: string;\n errors?: string[];\n raw?: unknown;\n}\n\nexport type AttestationReceipt = {\n attestationId: string;\n certificateHash: string;\n nodeRuntimeHash: string;\n protocolVersion: string;\n nodeId?: string;\n attestedAt?: string;\n attestorKeyId?: string;\n signatureB64Url?: string;\n};\n\nexport type NodeKeysDocument = {\n nodeId: string;\n activeKid?: string;\n keys: Array<{\n kid: string;\n alg: 'Ed25519';\n use?: 'sig';\n publicKeyJwk?: { kty: 'OKP'; crv: 'Ed25519'; x: string };\n publicKeySpkiB64?: string;\n publicKey?: string;\n createdAt?: string;\n }>;\n};\n\nexport type SignedAttestationReceipt = {\n receiptVersion?: string;\n attestationId: string;\n certificateHash: string;\n nodeRuntimeHash: string;\n protocolVersion: string;\n attestedAt?: string;\n nodeId?: string;\n attestorKeyId?: string;\n};\n\nexport type NodeReceiptVerifyResult = {\n ok: boolean;\n code: CerVerifyCode;\n details?: string[];\n};\n\nexport type AttestationReceiptResult = {\n receipt: AttestationReceipt;\n};\n\nexport interface AttestOptions {\n nodeUrl: string;\n apiKey: string;\n timeoutMs?: number;\n}\n\nexport interface CertifyDecisionParams {\n executionId?: string;\n timestamp?: string;\n provider: string;\n model: string;\n modelVersion?: string | null;\n prompt: string;\n input: string | Record<string, unknown>;\n parameters: AiExecutionParameters;\n output: string | Record<string, unknown>;\n sdkVersion?: string | null;\n appId?: string | null;\n meta?: CerMeta;\n runId?: string | null;\n stepId?: string | null;\n stepIndex?: number | null;\n workflowId?: string | null;\n conversationId?: string | null;\n prevStepHash?: string | null;\n}\n\nexport interface RunBuilderOptions {\n runId?: string;\n workflowId?: string | null;\n conversationId?: string | null;\n appId?: string | null;\n}\n\nexport interface StepParams {\n stepId?: string;\n provider: string;\n model: string;\n modelVersion?: string | null;\n prompt: string;\n input: string | Record<string, unknown>;\n parameters: AiExecutionParameters;\n output: string | Record<string, unknown>;\n timestamp?: string;\n meta?: CerMeta;\n}\n\nexport interface RunSummary {\n runId: string;\n workflowId: string | null;\n conversationId: string | null;\n stepCount: number;\n steps: Array<{\n stepIndex: number;\n stepId: string;\n executionId: string;\n certificateHash: string;\n prevStepHash: string | null;\n }>;\n finalStepHash: string | null;\n}\n\nexport interface ProviderConfig<TInput = unknown, TOutput = unknown> {\n provider: string;\n callFn: (input: TInput) => Promise<TOutput>;\n extractOutput: (raw: TOutput) => string | Record<string, unknown>;\n extractModelVersion?: (raw: TOutput) => string | null;\n}\n\n// ─── v0.6.0 ──────────────────────────────────────────────────────────────────\n\n/** Parameters for the high-level certifyDecisionFromProviderCall wrapper. */\nexport interface ProviderCallParams {\n provider: string;\n model?: string;\n request: Record<string, unknown>;\n response: Record<string, unknown>;\n meta?: CerMeta;\n executionId?: string;\n timestamp?: string;\n /** CER creation timestamp. Defaults to current time if omitted. */\n createdAt?: string;\n appId?: string | null;\n workflowId?: string | null;\n conversationId?: string | null;\n}\n\n/** Result of certifyDecisionFromProviderCall. */\nexport type ProviderCallResult =\n | { ok: true; bundle: CerAiExecutionBundle }\n | { ok: false; code: typeof CerVerifyCode.SCHEMA_ERROR; reason: string };\n\n/** Defaults applied to every call made through a NexArtClient instance. */\nexport interface ClientDefaults {\n appId?: string | null;\n workflowId?: string | null;\n nodeUrl?: string;\n apiKey?: string | (() => string | Promise<string>);\n tags?: string[];\n source?: string;\n}\n\n/** Pre-configured client returned by createClient(). */\nexport interface NexArtClient {\n certifyDecision(params: CertifyDecisionParams): CerAiExecutionBundle;\n certifyAndAttestDecision(\n params: CertifyDecisionParams,\n options?: Partial<AttestOptions>,\n ): Promise<{ bundle: CerAiExecutionBundle; receipt: AttestationReceipt }>;\n verify(bundle: CerAiExecutionBundle): VerificationResult;\n verifyBundleAttestation(\n bundle: unknown,\n options?: { nodeUrl?: string; kid?: string },\n ): Promise<NodeReceiptVerifyResult>;\n}\n\n/** Options for sanitizeForStorage. */\nexport interface SanitizeStorageOptions {\n redactPaths?: string[];\n redactWith?: string;\n}\n\nexport interface WrappedExecutionParams {\n prompt: string;\n input: string | Record<string, unknown>;\n model: string;\n parameters: AiExecutionParameters;\n modelVersion?: string | null;\n appId?: string | null;\n meta?: CerMeta;\n executionId?: string;\n}\n\nexport interface WrappedExecutionResult {\n output: string | Record<string, unknown>;\n snapshot: AiExecutionSnapshotV1;\n bundle: CerAiExecutionBundle;\n}\n","export class CerVerificationError extends Error {\n public readonly errors: string[];\n\n constructor(errors: string[]) {\n super(`CER verification failed: ${errors.join('; ')}`);\n this.name = 'CerVerificationError';\n this.errors = errors;\n }\n}\n\nexport class CerAttestationError extends Error {\n public readonly statusCode?: number;\n public readonly responseBody?: unknown;\n public readonly details?: string[];\n\n constructor(message: string, statusCode?: number, responseBody?: unknown, details?: string[]) {\n super(message);\n this.name = 'CerAttestationError';\n this.statusCode = statusCode;\n this.responseBody = responseBody;\n this.details = details;\n }\n}\n","export function toCanonicalJson(value: unknown): string {\n return canonicalize(value);\n}\n\nfunction canonicalize(value: unknown): string {\n if (value === null) {\n return 'null';\n }\n\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false';\n }\n\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) {\n throw new Error(`Non-finite number not allowed in canonical JSON: ${value}`);\n }\n return JSON.stringify(value);\n }\n\n if (typeof value === 'string') {\n return JSON.stringify(value);\n }\n\n if (Array.isArray(value)) {\n const items = value.map(item => canonicalize(item));\n return '[' + items.join(',') + ']';\n }\n\n if (typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj).sort();\n const entries = keys.map(key => {\n const val = obj[key];\n if (val === undefined) {\n return null;\n }\n return JSON.stringify(key) + ':' + canonicalize(val);\n }).filter(e => e !== null);\n return '{' + entries.join(',') + '}';\n }\n\n throw new Error(`Unsupported type for canonical JSON: ${typeof value}`);\n}\n","import * as crypto from 'crypto';\nimport { toCanonicalJson } from './canonicalJson.js';\n\nexport function sha256Hex(data: string | Uint8Array): string {\n const hash = crypto.createHash('sha256');\n if (typeof data === 'string') {\n hash.update(data, 'utf-8');\n } else {\n hash.update(data);\n }\n return hash.digest('hex');\n}\n\nexport function hashUtf8(value: string): string {\n return `sha256:${sha256Hex(value)}`;\n}\n\nexport function hashCanonicalJson(value: unknown): string {\n const canonical = toCanonicalJson(value);\n return `sha256:${sha256Hex(canonical)}`;\n}\n\nexport function computeInputHash(input: string | Record<string, unknown>): string {\n if (typeof input === 'string') {\n return hashUtf8(input);\n }\n return hashCanonicalJson(input);\n}\n\nexport function computeOutputHash(output: string | Record<string, unknown>): string {\n if (typeof output === 'string') {\n return hashUtf8(output);\n }\n return hashCanonicalJson(output);\n}\n","import type { AiExecutionSnapshotV1, CreateSnapshotParams, VerificationResult, AiExecutionParameters } from './types.js';\nimport { CerVerifyCode } from './types.js';\nimport { computeInputHash, computeOutputHash } from './hash.js';\n\nconst PACKAGE_VERSION = '0.8.0';\n\nfunction validateParameters(params: AiExecutionParameters): string[] {\n const errors: string[] = [];\n\n if (typeof params.temperature !== 'number' || !Number.isFinite(params.temperature)) {\n errors.push(`parameters.temperature must be a finite number, got: ${params.temperature}`);\n }\n\n if (typeof params.maxTokens !== 'number' || !Number.isFinite(params.maxTokens)) {\n errors.push(`parameters.maxTokens must be a finite number, got: ${params.maxTokens}`);\n }\n\n if (params.topP !== null && (typeof params.topP !== 'number' || !Number.isFinite(params.topP))) {\n errors.push(`parameters.topP must be a finite number or null, got: ${params.topP}`);\n }\n\n if (params.seed !== null && (typeof params.seed !== 'number' || !Number.isFinite(params.seed))) {\n errors.push(`parameters.seed must be a finite number or null, got: ${params.seed}`);\n }\n\n return errors;\n}\n\nexport function createSnapshot(params: CreateSnapshotParams): AiExecutionSnapshotV1 {\n const paramErrors = validateParameters(params.parameters);\n if (paramErrors.length > 0) {\n throw new Error(`Invalid parameters: ${paramErrors.join('; ')}`);\n }\n\n const inputHash = computeInputHash(params.input);\n const outputHash = computeOutputHash(params.output);\n\n const snapshot: AiExecutionSnapshotV1 = {\n type: 'ai.execution.v1',\n protocolVersion: '1.2.0',\n executionSurface: 'ai',\n executionId: params.executionId,\n timestamp: params.timestamp ?? new Date().toISOString(),\n provider: params.provider,\n model: params.model,\n modelVersion: params.modelVersion ?? null,\n prompt: params.prompt,\n input: params.input,\n inputHash,\n parameters: {\n temperature: params.parameters.temperature,\n maxTokens: params.parameters.maxTokens,\n topP: params.parameters.topP ?? null,\n seed: params.parameters.seed ?? null,\n },\n output: params.output,\n outputHash,\n sdkVersion: params.sdkVersion ?? PACKAGE_VERSION,\n appId: params.appId ?? null,\n };\n\n if (params.runId !== undefined) snapshot.runId = params.runId ?? null;\n if (params.stepId !== undefined) snapshot.stepId = params.stepId ?? null;\n if (params.stepIndex !== undefined) snapshot.stepIndex = params.stepIndex ?? null;\n if (params.workflowId !== undefined) snapshot.workflowId = params.workflowId ?? null;\n if (params.conversationId !== undefined) snapshot.conversationId = params.conversationId ?? null;\n if (params.prevStepHash !== undefined) snapshot.prevStepHash = params.prevStepHash ?? null;\n\n // v0.7.0: AIEF-06 tool/dependency evidence — included in certificateHash when present\n if (params.toolCalls !== undefined && params.toolCalls.length > 0) {\n snapshot.toolCalls = params.toolCalls;\n }\n\n return snapshot;\n}\n\nexport function verifySnapshot(snapshot: AiExecutionSnapshotV1): VerificationResult {\n const schemaErrors: string[] = [];\n const formatErrors: string[] = [];\n const inputHashErrors: string[] = [];\n const outputHashErrors: string[] = [];\n\n if (snapshot.type !== 'ai.execution.v1') {\n schemaErrors.push(`Expected type \"ai.execution.v1\", got \"${snapshot.type}\"`);\n }\n\n if (snapshot.protocolVersion !== '1.2.0') {\n schemaErrors.push(`Expected protocolVersion \"1.2.0\", got \"${snapshot.protocolVersion}\"`);\n }\n\n if (snapshot.executionSurface !== 'ai') {\n schemaErrors.push(`Expected executionSurface \"ai\", got \"${snapshot.executionSurface}\"`);\n }\n\n if (!snapshot.executionId || typeof snapshot.executionId !== 'string') {\n schemaErrors.push('executionId must be a non-empty string');\n }\n\n if (!snapshot.timestamp || typeof snapshot.timestamp !== 'string') {\n schemaErrors.push('timestamp must be a non-empty string');\n }\n\n if (!snapshot.provider || typeof snapshot.provider !== 'string') {\n schemaErrors.push('provider must be a non-empty string');\n }\n\n if (!snapshot.model || typeof snapshot.model !== 'string') {\n schemaErrors.push('model must be a non-empty string');\n }\n\n if (!snapshot.prompt || typeof snapshot.prompt !== 'string') {\n schemaErrors.push('prompt must be a non-empty string');\n }\n\n if (snapshot.input === undefined || snapshot.input === null) {\n schemaErrors.push('input must be a string or object');\n }\n\n if (snapshot.output === undefined || snapshot.output === null) {\n schemaErrors.push('output must be a string or object');\n }\n\n const paramErrors = validateParameters(snapshot.parameters);\n schemaErrors.push(...paramErrors);\n\n if (!snapshot.inputHash || !snapshot.inputHash.startsWith('sha256:')) {\n formatErrors.push(`inputHash must start with \"sha256:\", got \"${snapshot.inputHash}\"`);\n }\n\n if (!snapshot.outputHash || !snapshot.outputHash.startsWith('sha256:')) {\n formatErrors.push(`outputHash must start with \"sha256:\", got \"${snapshot.outputHash}\"`);\n }\n\n if (formatErrors.length === 0) {\n const expectedInputHash = computeInputHash(snapshot.input);\n if (snapshot.inputHash !== expectedInputHash) {\n inputHashErrors.push(`inputHash mismatch: expected ${expectedInputHash}, got ${snapshot.inputHash}`);\n }\n\n const expectedOutputHash = computeOutputHash(snapshot.output);\n if (snapshot.outputHash !== expectedOutputHash) {\n outputHashErrors.push(`outputHash mismatch: expected ${expectedOutputHash}, got ${snapshot.outputHash}`);\n }\n }\n\n const errors = [...schemaErrors, ...formatErrors, ...inputHashErrors, ...outputHashErrors];\n\n if (errors.length === 0) {\n return { ok: true, errors: [], code: CerVerifyCode.OK };\n }\n\n let code: typeof CerVerifyCode[keyof typeof CerVerifyCode];\n let details: string[];\n\n if (schemaErrors.length > 0) {\n code = CerVerifyCode.SCHEMA_ERROR;\n details = schemaErrors;\n } else if (formatErrors.length > 0) {\n code = CerVerifyCode.INVALID_SHA256_FORMAT;\n details = formatErrors;\n } else if (inputHashErrors.length > 0 && outputHashErrors.length > 0) {\n code = CerVerifyCode.SNAPSHOT_HASH_MISMATCH;\n details = [...inputHashErrors, ...outputHashErrors];\n } else if (inputHashErrors.length > 0) {\n code = CerVerifyCode.INPUT_HASH_MISMATCH;\n details = inputHashErrors;\n } else if (outputHashErrors.length > 0) {\n code = CerVerifyCode.OUTPUT_HASH_MISMATCH;\n details = outputHashErrors;\n } else {\n code = CerVerifyCode.UNKNOWN_ERROR;\n details = errors;\n }\n\n return { ok: false, errors, code, details };\n}\n","import type { AiExecutionSnapshotV1, CerAiExecutionBundle, CerMeta, BundleDeclaration, VerificationResult } from './types.js';\nimport { CerVerifyCode } from './types.js';\nimport { toCanonicalJson } from './canonicalJson.js';\nimport { sha256Hex } from './hash.js';\nimport { verifySnapshot } from './snapshot.js';\n\ninterface CertificatePayload {\n bundleType: 'cer.ai.execution.v1';\n createdAt: string;\n snapshot: AiExecutionSnapshotV1;\n version: '0.1';\n}\n\nfunction computeCertificateHash(payload: CertificatePayload): string {\n const canonical = toCanonicalJson(payload);\n return `sha256:${sha256Hex(canonical)}`;\n}\n\nexport function sealCer(\n snapshot: AiExecutionSnapshotV1,\n options?: { createdAt?: string; meta?: CerMeta; declaration?: BundleDeclaration }\n): CerAiExecutionBundle {\n const createdAt = options?.createdAt ?? new Date().toISOString();\n\n // certificateHash covers ONLY { bundleType, createdAt, snapshot, version }.\n // `declaration` and `meta` are intentionally excluded — they are non-evidentiary.\n const payload: CertificatePayload = {\n bundleType: 'cer.ai.execution.v1',\n createdAt,\n snapshot,\n version: '0.1',\n };\n\n const certificateHash = computeCertificateHash(payload);\n\n const bundle: CerAiExecutionBundle = {\n bundleType: 'cer.ai.execution.v1',\n certificateHash,\n createdAt,\n version: '0.1',\n snapshot,\n };\n\n if (options?.meta) {\n bundle.meta = options.meta;\n }\n\n // v0.7.0: attach declaration block AFTER hashing — excluded from certificateHash by design.\n if (options?.declaration) {\n bundle.declaration = options.declaration;\n }\n\n return bundle;\n}\n\nexport function verifyCer(bundle: CerAiExecutionBundle): VerificationResult {\n const schemaErrors: string[] = [];\n const formatErrors: string[] = [];\n\n if (bundle.bundleType !== 'cer.ai.execution.v1') {\n schemaErrors.push(`Expected bundleType \"cer.ai.execution.v1\", got \"${bundle.bundleType}\"`);\n }\n\n if (bundle.version !== '0.1') {\n schemaErrors.push(`Expected version \"0.1\", got \"${bundle.version}\"`);\n }\n\n if (!bundle.createdAt || typeof bundle.createdAt !== 'string') {\n schemaErrors.push('createdAt must be a non-empty string');\n }\n\n if (!bundle.certificateHash || !bundle.certificateHash.startsWith('sha256:')) {\n formatErrors.push(`certificateHash must start with \"sha256:\", got \"${bundle.certificateHash}\"`);\n }\n\n if (!bundle.snapshot) {\n schemaErrors.push('snapshot is required');\n const allErrors = [...schemaErrors, ...formatErrors];\n return { ok: false, errors: allErrors, code: CerVerifyCode.SCHEMA_ERROR, details: schemaErrors };\n }\n\n let canonicalizationError: string | null = null;\n let snapshotResult: VerificationResult | null = null;\n\n try {\n snapshotResult = verifySnapshot(bundle.snapshot);\n } catch (err) {\n canonicalizationError = err instanceof Error ? err.message : String(err);\n }\n\n if (canonicalizationError !== null) {\n const errors = [...schemaErrors, ...formatErrors, canonicalizationError];\n return { ok: false, errors, code: CerVerifyCode.CANONICALIZATION_ERROR, details: [canonicalizationError] };\n }\n\n const snapshotErrors = snapshotResult!.errors;\n\n const certHashErrors: string[] = [];\n try {\n const payload: CertificatePayload = {\n bundleType: 'cer.ai.execution.v1',\n createdAt: bundle.createdAt,\n snapshot: bundle.snapshot,\n version: '0.1',\n };\n const expectedHash = computeCertificateHash(payload);\n if (bundle.certificateHash !== expectedHash) {\n certHashErrors.push(`certificateHash mismatch: expected ${expectedHash}, got ${bundle.certificateHash}`);\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n const errors = [...schemaErrors, ...formatErrors, ...snapshotErrors, msg];\n return { ok: false, errors, code: CerVerifyCode.CANONICALIZATION_ERROR, details: [msg] };\n }\n\n const errors = [...schemaErrors, ...formatErrors, ...snapshotErrors, ...certHashErrors];\n\n if (errors.length === 0) {\n return { ok: true, errors: [], code: CerVerifyCode.OK };\n }\n\n let code: typeof CerVerifyCode[keyof typeof CerVerifyCode];\n let details: string[];\n\n if (schemaErrors.length > 0) {\n code = CerVerifyCode.SCHEMA_ERROR;\n details = schemaErrors;\n } else if (formatErrors.length > 0) {\n code = CerVerifyCode.INVALID_SHA256_FORMAT;\n details = formatErrors;\n } else if (certHashErrors.length > 0 && snapshotErrors.length === 0) {\n code = CerVerifyCode.CERTIFICATE_HASH_MISMATCH;\n details = certHashErrors;\n } else if (snapshotResult && snapshotResult.code !== CerVerifyCode.OK) {\n code = snapshotResult.code;\n details = snapshotResult.details ?? snapshotErrors;\n } else if (certHashErrors.length > 0) {\n code = CerVerifyCode.CERTIFICATE_HASH_MISMATCH;\n details = certHashErrors;\n } else {\n code = CerVerifyCode.UNKNOWN_ERROR;\n details = errors;\n }\n\n return { ok: false, errors, code, details };\n}\n","import * as crypto from 'crypto';\nimport type { CerAiExecutionBundle, CertifyDecisionParams } from './types.js';\nimport { createSnapshot } from './snapshot.js';\nimport { sealCer } from './cer.js';\n\nexport function certifyDecision(params: CertifyDecisionParams): CerAiExecutionBundle {\n const executionId = params.executionId ?? crypto.randomUUID();\n\n const snapshot = createSnapshot({\n executionId,\n timestamp: params.timestamp,\n provider: params.provider,\n model: params.model,\n modelVersion: params.modelVersion,\n prompt: params.prompt,\n input: params.input,\n parameters: params.parameters,\n output: params.output,\n sdkVersion: params.sdkVersion,\n appId: params.appId,\n runId: params.runId,\n stepId: params.stepId,\n stepIndex: params.stepIndex,\n workflowId: params.workflowId,\n conversationId: params.conversationId,\n prevStepHash: params.prevStepHash,\n });\n\n return sealCer(snapshot, { meta: params.meta });\n}\n","import * as crypto from 'crypto';\nimport type {\n CerAiExecutionBundle,\n RunBuilderOptions,\n StepParams,\n RunSummary,\n} from './types.js';\nimport { createSnapshot } from './snapshot.js';\nimport { sealCer } from './cer.js';\n\nexport class RunBuilder {\n private readonly runId: string;\n private readonly workflowId: string | null;\n private readonly conversationId: string | null;\n private readonly appId: string | null;\n private stepIndex: number = 0;\n private prevStepHash: string | null = null;\n private steps: RunSummary['steps'] = [];\n\n constructor(options?: RunBuilderOptions) {\n this.runId = options?.runId ?? crypto.randomUUID();\n this.workflowId = options?.workflowId ?? null;\n this.conversationId = options?.conversationId ?? null;\n this.appId = options?.appId ?? null;\n }\n\n step(params: StepParams): CerAiExecutionBundle {\n const stepId = params.stepId ?? crypto.randomUUID();\n const executionId = `${this.runId}-step-${this.stepIndex}`;\n\n const snapshot = createSnapshot({\n executionId,\n timestamp: params.timestamp,\n provider: params.provider,\n model: params.model,\n modelVersion: params.modelVersion,\n prompt: params.prompt,\n input: params.input,\n parameters: params.parameters,\n output: params.output,\n appId: this.appId,\n runId: this.runId,\n stepId,\n stepIndex: this.stepIndex,\n workflowId: this.workflowId,\n conversationId: this.conversationId,\n prevStepHash: this.prevStepHash,\n });\n\n const bundle = sealCer(snapshot, { meta: params.meta });\n\n this.steps.push({\n stepIndex: this.stepIndex,\n stepId,\n executionId,\n certificateHash: bundle.certificateHash,\n prevStepHash: this.prevStepHash,\n });\n\n this.prevStepHash = bundle.certificateHash;\n this.stepIndex++;\n\n return bundle;\n }\n\n finalize(): RunSummary {\n return {\n runId: this.runId,\n workflowId: this.workflowId,\n conversationId: this.conversationId,\n stepCount: this.steps.length,\n steps: [...this.steps],\n finalStepHash: this.prevStepHash,\n };\n }\n}\n","import type { CerAiExecutionBundle, SanitizeStorageOptions } from './types.js';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Internal deep sanitizer\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction deepRemoveUndefined(value: unknown): unknown {\n if (value === null || value === undefined) return value;\n\n if (typeof value === 'bigint') {\n throw new Error('BigInt values are not JSON-safe and cannot be sanitized');\n }\n if (typeof value === 'function') {\n throw new Error('Function values are not JSON-safe and cannot be sanitized');\n }\n if (typeof value === 'symbol') {\n throw new Error('Symbol values are not JSON-safe and cannot be sanitized');\n }\n\n if (Array.isArray(value)) {\n return value.map(deepRemoveUndefined);\n }\n\n if (typeof value === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value as Record<string, unknown>)) {\n if (val === undefined) continue;\n result[key] = deepRemoveUndefined(val);\n }\n return result;\n }\n\n return value;\n}\n\n/** Redact a value at a dot-separated path inside an object (immutable). */\nfunction redactPath(\n obj: Record<string, unknown>,\n path: string,\n replacement: string,\n): Record<string, unknown> {\n const parts = path.split('.');\n const clone = { ...obj };\n let cursor: Record<string, unknown> = clone;\n\n for (let i = 0; i < parts.length - 1; i++) {\n const key = parts[i];\n if (typeof cursor[key] !== 'object' || cursor[key] === null) return clone;\n cursor[key] = { ...(cursor[key] as Record<string, unknown>) };\n cursor = cursor[key] as Record<string, unknown>;\n }\n\n const last = parts[parts.length - 1];\n if (last in cursor) cursor[last] = replacement;\n return clone;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// v0.4 legacy: sanitizeForAttestation (kept for backward compatibility)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** @deprecated Use sanitizeForStorage or sanitizeForStamp instead. */\nexport function sanitizeForAttestation(bundle: CerAiExecutionBundle): CerAiExecutionBundle {\n return deepRemoveUndefined(bundle) as CerAiExecutionBundle;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// v0.6 helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Prepare a bundle for safe storage:\n * - Removes undefined keys.\n * - Removes non-JSON-serializable types (bigint, function, symbol).\n * - Optionally redacts sensitive field paths.\n *\n * Does NOT recompute certificateHash or any content hashes.\n */\nexport function sanitizeForStorage(\n bundle: CerAiExecutionBundle,\n options?: SanitizeStorageOptions,\n): CerAiExecutionBundle {\n let cleaned = deepRemoveUndefined(bundle) as CerAiExecutionBundle;\n\n if (options?.redactPaths && options.redactPaths.length > 0) {\n const replacement = options.redactWith ?? '[REDACTED]';\n let obj = cleaned as unknown as Record<string, unknown>;\n for (const path of options.redactPaths) {\n obj = redactPath(obj, path, replacement);\n }\n cleaned = obj as unknown as CerAiExecutionBundle;\n }\n\n return cleaned;\n}\n\n/**\n * Produce the minimal \"attestable core\" envelope for a bundle.\n *\n * Returns only: bundleType, certificateHash, createdAt, version, snapshot.\n * The meta field is excluded — it is informational and not included in the\n * certificateHash computation.\n *\n * Does NOT recompute any hashes.\n */\nexport function sanitizeForStamp(bundle: CerAiExecutionBundle): Omit<CerAiExecutionBundle, 'meta'> {\n const core: Omit<CerAiExecutionBundle, 'meta'> = {\n bundleType: bundle.bundleType,\n certificateHash: bundle.certificateHash,\n createdAt: bundle.createdAt,\n version: bundle.version,\n snapshot: bundle.snapshot,\n };\n return deepRemoveUndefined(core) as Omit<CerAiExecutionBundle, 'meta'>;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Unchanged utility\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function hasAttestation(bundle: unknown): boolean {\n if (typeof bundle !== 'object' || bundle === null) return false;\n const b = bundle as Record<string, unknown>;\n\n if (typeof b.attestationId === 'string' && b.attestationId.length > 0) return true;\n if (typeof b.nodeRuntimeHash === 'string' && b.nodeRuntimeHash.length > 0) return true;\n\n if (typeof b.attestation === 'object' && b.attestation !== null) {\n const att = b.attestation as Record<string, unknown>;\n if (typeof att.attestationId === 'string' && att.attestationId.length > 0) return true;\n if (typeof att.nodeRuntimeHash === 'string' && att.nodeRuntimeHash.length > 0) return true;\n }\n\n return false;\n}\n","import type { CerAiExecutionBundle, AttestationResult, AttestOptions } from './types.js';\nimport { CerAttestationError } from './errors.js';\nimport { sanitizeForAttestation } from './sanitize.js';\n\nconst SHA256_PATTERN = /^sha256:[0-9a-f]{64}$/;\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nfunction validateHashFormat(value: unknown, fieldName: string): string | null {\n if (typeof value !== 'string') return null;\n if (!SHA256_PATTERN.test(value)) {\n return `${fieldName} is not in sha256:<64hex> format: \"${value}\"`;\n }\n return null;\n}\n\nexport async function attest(\n bundle: CerAiExecutionBundle,\n options: AttestOptions,\n): Promise<AttestationResult> {\n const url = `${options.nodeUrl.replace(/\\/+$/, '')}/api/attest`;\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const sanitized = sanitizeForAttestation(bundle);\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n let response: Response;\n try {\n response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${options.apiKey}`,\n },\n body: JSON.stringify(sanitized),\n signal: controller.signal,\n });\n } catch (err) {\n clearTimeout(timer);\n const error = err as Error;\n if (error.name === 'AbortError') {\n throw new CerAttestationError(\n `Attestation request timed out after ${timeoutMs}ms`,\n );\n }\n throw new CerAttestationError(\n `Network error contacting attestation node: ${error.message}`,\n );\n } finally {\n clearTimeout(timer);\n }\n\n let body: unknown;\n try {\n body = await response.json();\n } catch {\n const text = await response.text().catch(() => '');\n throw new CerAttestationError(\n `Attestation node returned non-JSON response (${response.status}): ${text}`,\n response.status,\n );\n }\n\n if (!response.ok) {\n const result = body as Record<string, unknown>;\n const msg = typeof result.error === 'string'\n ? result.error\n : `HTTP ${response.status}`;\n const details = Array.isArray(result.details) ? result.details as string[] : undefined;\n throw new CerAttestationError(\n `Attestation failed: ${msg}`,\n response.status,\n body,\n details,\n );\n }\n\n const result = body as Record<string, unknown>;\n const errors: string[] = [];\n\n if (typeof result.certificateHash === 'string' && result.certificateHash !== bundle.certificateHash) {\n errors.push(\n `Node returned certificateHash \"${result.certificateHash}\" but bundle has \"${bundle.certificateHash}\"`,\n );\n }\n\n const certHashErr = validateHashFormat(result.certificateHash, 'response.certificateHash');\n if (certHashErr) errors.push(certHashErr);\n\n const runtimeHashErr = validateHashFormat(result.nodeRuntimeHash, 'response.nodeRuntimeHash');\n if (runtimeHashErr) errors.push(runtimeHashErr);\n\n if (errors.length > 0) {\n throw new CerAttestationError(\n `Attestation response validation failed: ${errors.join('; ')}`,\n response.status,\n body,\n errors,\n );\n }\n\n return {\n ok: true,\n attestationId: typeof result.attestationId === 'string' ? result.attestationId : undefined,\n nodeRuntimeHash: typeof result.nodeRuntimeHash === 'string' ? result.nodeRuntimeHash : undefined,\n certificateHash: typeof result.certificateHash === 'string' ? result.certificateHash : undefined,\n protocolVersion: typeof result.protocolVersion === 'string' ? result.protocolVersion : undefined,\n raw: body,\n };\n}\n","import type { CerAiExecutionBundle } from './types.js';\nimport { toCanonicalJson } from './canonicalJson.js';\nimport { verifyCer } from './cer.js';\nimport { CerVerificationError } from './errors.js';\n\nexport function exportCer(bundle: CerAiExecutionBundle): string {\n return toCanonicalJson(bundle);\n}\n\nexport function importCer(json: string): CerAiExecutionBundle {\n let parsed: unknown;\n try {\n parsed = JSON.parse(json);\n } catch (err) {\n throw new CerVerificationError([`Invalid JSON: ${(err as Error).message}`]);\n }\n\n const bundle = parsed as CerAiExecutionBundle;\n\n if (!bundle || typeof bundle !== 'object') {\n throw new CerVerificationError(['Parsed value is not an object']);\n }\n\n if (bundle.bundleType !== 'cer.ai.execution.v1') {\n throw new CerVerificationError([`Expected bundleType \"cer.ai.execution.v1\", got \"${bundle.bundleType}\"`]);\n }\n\n const result = verifyCer(bundle);\n if (!result.ok) {\n throw new CerVerificationError(result.errors);\n }\n\n return bundle;\n}\n","import * as crypto from 'crypto';\nimport type {\n ProviderConfig,\n WrappedExecutionParams,\n WrappedExecutionResult,\n} from '../types.js';\nimport { createSnapshot } from '../snapshot.js';\nimport { sealCer } from '../cer.js';\n\nexport function wrapProvider<TInput = unknown, TOutput = unknown>(\n config: ProviderConfig<TInput, TOutput>,\n) {\n return {\n async execute(params: WrappedExecutionParams & { providerInput: TInput }): Promise<WrappedExecutionResult> {\n const raw = await config.callFn(params.providerInput);\n const output = config.extractOutput(raw);\n const modelVersion = config.extractModelVersion\n ? config.extractModelVersion(raw)\n : (params.modelVersion ?? null);\n\n const snapshot = createSnapshot({\n executionId: params.executionId ?? crypto.randomUUID(),\n provider: config.provider,\n model: params.model,\n modelVersion,\n prompt: params.prompt,\n input: params.input,\n parameters: params.parameters,\n output,\n appId: params.appId,\n });\n\n const bundle = sealCer(snapshot, { meta: params.meta });\n\n return { output, snapshot, bundle };\n },\n };\n}\n","import type { AttestationReceipt } from './types.js';\n\nfunction extractStr(obj: Record<string, unknown>, key: string): string | undefined {\n const v = obj[key];\n return typeof v === 'string' && v.length > 0 ? v : undefined;\n}\n\nfunction buildReceipt(obj: Record<string, unknown>): AttestationReceipt | null {\n const attestationId = extractStr(obj, 'attestationId');\n const certificateHash = extractStr(obj, 'certificateHash');\n const nodeRuntimeHash = extractStr(obj, 'nodeRuntimeHash');\n const protocolVersion = extractStr(obj, 'protocolVersion');\n\n if (!attestationId || !certificateHash || !nodeRuntimeHash || !protocolVersion) {\n return null;\n }\n\n const receipt: AttestationReceipt = {\n attestationId,\n certificateHash,\n nodeRuntimeHash,\n protocolVersion,\n };\n\n const nodeId = extractStr(obj, 'nodeId');\n if (nodeId) receipt.nodeId = nodeId;\n\n const attestedAt = extractStr(obj, 'attestedAt');\n if (attestedAt) receipt.attestedAt = attestedAt;\n\n const attestorKeyId = extractStr(obj, 'attestorKeyId');\n if (attestorKeyId) receipt.attestorKeyId = attestorKeyId;\n\n const signatureB64Url = extractStr(obj, 'signature') ?? extractStr(obj, 'signatureB64Url');\n if (signatureB64Url) receipt.signatureB64Url = signatureB64Url;\n\n return receipt;\n}\n\nexport function getAttestationReceipt(bundle: unknown): AttestationReceipt | null {\n if (typeof bundle !== 'object' || bundle === null) return null;\n\n const b = bundle as Record<string, unknown>;\n\n const topLevel = buildReceipt(b);\n if (topLevel) return topLevel;\n\n if (typeof b.meta === 'object' && b.meta !== null) {\n const meta = b.meta as Record<string, unknown>;\n if (typeof meta.attestation === 'object' && meta.attestation !== null) {\n const nested = buildReceipt(meta.attestation as Record<string, unknown>);\n if (nested) return nested;\n }\n }\n\n return null;\n}\n","import type { CerAiExecutionBundle, CertifyDecisionParams, AttestOptions, AttestationReceipt } from './types.js';\nimport { certifyDecision } from './certify.js';\nimport { attest } from './attest.js';\nimport { hasAttestation } from './sanitize.js';\nimport { getAttestationReceipt } from './receipt.js';\nimport { CerAttestationError } from './errors.js';\n\nfunction receiptFromProof(\n proof: Awaited<ReturnType<typeof attest>>,\n bundle: CerAiExecutionBundle,\n): AttestationReceipt {\n if (\n !proof.attestationId ||\n !proof.nodeRuntimeHash ||\n !proof.protocolVersion\n ) {\n throw new CerAttestationError(\n 'Attestation proof is missing required fields (attestationId, nodeRuntimeHash, protocolVersion)',\n );\n }\n\n return {\n attestationId: proof.attestationId,\n certificateHash: proof.certificateHash ?? bundle.certificateHash,\n nodeRuntimeHash: proof.nodeRuntimeHash,\n protocolVersion: proof.protocolVersion,\n };\n}\n\nexport async function certifyAndAttestDecision(\n params: CertifyDecisionParams,\n options: AttestOptions,\n): Promise<{ bundle: CerAiExecutionBundle; receipt: AttestationReceipt }> {\n const bundle = certifyDecision(params);\n const proof = await attest(bundle, options);\n const receipt = receiptFromProof(proof, bundle);\n return { bundle, receipt };\n}\n\nexport async function attestIfNeeded(\n bundle: CerAiExecutionBundle,\n options: AttestOptions,\n): Promise<{ bundle: CerAiExecutionBundle; receipt: AttestationReceipt }> {\n if (hasAttestation(bundle)) {\n const existing = getAttestationReceipt(bundle);\n if (existing) {\n return { bundle, receipt: existing };\n }\n }\n\n const proof = await attest(bundle, options);\n const receipt = receiptFromProof(proof, bundle);\n return { bundle, receipt };\n}\n","/*! noble-ed25519 - MIT License (c) 2019 Paul Miller (paulmillr.com) */\n/**\n * 5KB JS implementation of ed25519 EdDSA signatures.\n * Compliant with RFC8032, FIPS 186-5 & ZIP215.\n * @module\n * @example\n * ```js\nimport * as ed from '@noble/ed25519';\n(async () => {\n const secretKey = ed.utils.randomSecretKey();\n const message = Uint8Array.from([0xab, 0xbc, 0xcd, 0xde]);\n const pubKey = await ed.getPublicKeyAsync(secretKey); // Sync methods are also present\n const signature = await ed.signAsync(message, secretKey);\n const isValid = await ed.verifyAsync(signature, message, pubKey);\n})();\n```\n */\n/**\n * Curve params. ed25519 is twisted edwards curve. Equation is −x² + y² = -a + dx²y².\n * * P = `2n**255n - 19n` // field over which calculations are done\n * * N = `2n**252n + 27742317777372353535851937790883648493n` // group order, amount of curve points\n * * h = 8 // cofactor\n * * a = `Fp.create(BigInt(-1))` // equation param\n * * d = -121665/121666 a.k.a. `Fp.neg(121665 * Fp.inv(121666))` // equation param\n * * Gx, Gy are coordinates of Generator / base point\n */\nconst ed25519_CURVE = {\n p: 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffedn,\n n: 0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3edn,\n h: 8n,\n a: 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecn,\n d: 0x52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a3n,\n Gx: 0x216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51an,\n Gy: 0x6666666666666666666666666666666666666666666666666666666666666658n,\n};\nconst { p: P, n: N, Gx, Gy, a: _a, d: _d, h } = ed25519_CURVE;\nconst L = 32; // field / group byte length\nconst L2 = 64;\n// Helpers and Precomputes sections are reused between libraries\n// ## Helpers\n// ----------\nconst captureTrace = (...args) => {\n if ('captureStackTrace' in Error && typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(...args);\n }\n};\nconst err = (message = '') => {\n const e = new Error(message);\n captureTrace(e, err);\n throw e;\n};\nconst isBig = (n) => typeof n === 'bigint'; // is big integer\nconst isStr = (s) => typeof s === 'string'; // is string\nconst isBytes = (a) => a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n/** Asserts something is Uint8Array. */\nconst abytes = (value, length, title = '') => {\n const bytes = isBytes(value);\n const len = value?.length;\n const needsLen = length !== undefined;\n if (!bytes || (needsLen && len !== length)) {\n const prefix = title && `\"${title}\" `;\n const ofLen = needsLen ? ` of length ${length}` : '';\n const got = bytes ? `length=${len}` : `type=${typeof value}`;\n err(prefix + 'expected Uint8Array' + ofLen + ', got ' + got);\n }\n return value;\n};\n/** create Uint8Array */\nconst u8n = (len) => new Uint8Array(len);\nconst u8fr = (buf) => Uint8Array.from(buf);\nconst padh = (n, pad) => n.toString(16).padStart(pad, '0');\nconst bytesToHex = (b) => Array.from(abytes(b))\n .map((e) => padh(e, 2))\n .join('');\nconst C = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 }; // ASCII characters\nconst _ch = (ch) => {\n if (ch >= C._0 && ch <= C._9)\n return ch - C._0; // '2' => 50-48\n if (ch >= C.A && ch <= C.F)\n return ch - (C.A - 10); // 'B' => 66-(65-10)\n if (ch >= C.a && ch <= C.f)\n return ch - (C.a - 10); // 'b' => 98-(97-10)\n return;\n};\nconst hexToBytes = (hex) => {\n const e = 'hex invalid';\n if (!isStr(hex))\n return err(e);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2)\n return err(e);\n const array = u8n(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n // treat each char as ASCII\n const n1 = _ch(hex.charCodeAt(hi)); // parse first char, multiply it by 16\n const n2 = _ch(hex.charCodeAt(hi + 1)); // parse second char\n if (n1 === undefined || n2 === undefined)\n return err(e);\n array[ai] = n1 * 16 + n2; // example: 'A9' => 10*16 + 9\n }\n return array;\n};\nconst cr = () => globalThis?.crypto; // WebCrypto is available in all modern environments\nconst subtle = () => cr()?.subtle ?? err('crypto.subtle must be defined, consider polyfill');\n// prettier-ignore\nconst concatBytes = (...arrs) => {\n const r = u8n(arrs.reduce((sum, a) => sum + abytes(a).length, 0)); // create u8a of summed length\n let pad = 0; // walk through each array,\n arrs.forEach(a => { r.set(a, pad); pad += a.length; }); // ensure they have proper type\n return r;\n};\n/** WebCrypto OS-level CSPRNG (random number generator). Will throw when not available. */\nconst randomBytes = (len = L) => {\n const c = cr();\n return c.getRandomValues(u8n(len));\n};\nconst big = BigInt;\nconst assertRange = (n, min, max, msg = 'bad number: out of range') => (isBig(n) && min <= n && n < max ? n : err(msg));\n/** modular division */\nconst M = (a, b = P) => {\n const r = a % b;\n return r >= 0n ? r : b + r;\n};\nconst modN = (a) => M(a, N);\n/** Modular inversion using euclidean GCD (non-CT). No negative exponent for now. */\n// prettier-ignore\nconst invert = (num, md) => {\n if (num === 0n || md <= 0n)\n err('no inverse n=' + num + ' mod=' + md);\n let a = M(num, md), b = md, x = 0n, y = 1n, u = 1n, v = 0n;\n while (a !== 0n) {\n const q = b / a, r = b % a;\n const m = x - u * q, n = y - v * q;\n b = a, a = r, x = u, y = v, u = m, v = n;\n }\n return b === 1n ? M(x, md) : err('no inverse'); // b is gcd at this point\n};\nconst callHash = (name) => {\n // @ts-ignore\n const fn = hashes[name];\n if (typeof fn !== 'function')\n err('hashes.' + name + ' not set');\n return fn;\n};\nconst hash = (msg) => callHash('sha512')(msg);\nconst apoint = (p) => (p instanceof Point ? p : err('Point expected'));\n// ## End of Helpers\n// -----------------\nconst B256 = 2n ** 256n;\n/** Point in XYZT extended coordinates. */\nclass Point {\n static BASE;\n static ZERO;\n X;\n Y;\n Z;\n T;\n constructor(X, Y, Z, T) {\n const max = B256;\n this.X = assertRange(X, 0n, max);\n this.Y = assertRange(Y, 0n, max);\n this.Z = assertRange(Z, 1n, max);\n this.T = assertRange(T, 0n, max);\n Object.freeze(this);\n }\n static CURVE() {\n return ed25519_CURVE;\n }\n static fromAffine(p) {\n return new Point(p.x, p.y, 1n, M(p.x * p.y));\n }\n /** RFC8032 5.1.3: Uint8Array to Point. */\n static fromBytes(hex, zip215 = false) {\n const d = _d;\n // Copy array to not mess it up.\n const normed = u8fr(abytes(hex, L));\n // adjust first LE byte = last BE byte\n const lastByte = hex[31];\n normed[31] = lastByte & ~0x80;\n const y = bytesToNumLE(normed);\n // zip215=true: 0 <= y < 2^256\n // zip215=false, RFC8032: 0 <= y < 2^255-19\n const max = zip215 ? B256 : P;\n assertRange(y, 0n, max);\n const y2 = M(y * y); // y²\n const u = M(y2 - 1n); // u=y²-1\n const v = M(d * y2 + 1n); // v=dy²+1\n let { isValid, value: x } = uvRatio(u, v); // (uv³)(uv⁷)^(p-5)/8; square root\n if (!isValid)\n err('bad point: y not sqrt'); // not square root: bad point\n const isXOdd = (x & 1n) === 1n; // adjust sign of x coordinate\n const isLastByteOdd = (lastByte & 0x80) !== 0; // x_0, last bit\n if (!zip215 && x === 0n && isLastByteOdd)\n err('bad point: x==0, isLastByteOdd'); // x=0, x_0=1\n if (isLastByteOdd !== isXOdd)\n x = M(-x);\n return new Point(x, y, 1n, M(x * y)); // Z=1, T=xy\n }\n static fromHex(hex, zip215) {\n return Point.fromBytes(hexToBytes(hex), zip215);\n }\n get x() {\n return this.toAffine().x;\n }\n get y() {\n return this.toAffine().y;\n }\n /** Checks if the point is valid and on-curve. */\n assertValidity() {\n const a = _a;\n const d = _d;\n const p = this;\n if (p.is0())\n return err('bad point: ZERO'); // TODO: optimize, with vars below?\n // Equation in affine coordinates: ax² + y² = 1 + dx²y²\n // Equation in projective coordinates (X/Z, Y/Z, Z): (aX² + Y²)Z² = Z⁴ + dX²Y²\n const { X, Y, Z, T } = p;\n const X2 = M(X * X); // X²\n const Y2 = M(Y * Y); // Y²\n const Z2 = M(Z * Z); // Z²\n const Z4 = M(Z2 * Z2); // Z⁴\n const aX2 = M(X2 * a); // aX²\n const left = M(Z2 * M(aX2 + Y2)); // (aX² + Y²)Z²\n const right = M(Z4 + M(d * M(X2 * Y2))); // Z⁴ + dX²Y²\n if (left !== right)\n return err('bad point: equation left != right (1)');\n // In Extended coordinates we also have T, which is x*y=T/Z: check X*Y == Z*T\n const XY = M(X * Y);\n const ZT = M(Z * T);\n if (XY !== ZT)\n return err('bad point: equation left != right (2)');\n return this;\n }\n /** Equality check: compare points P&Q. */\n equals(other) {\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const { X: X2, Y: Y2, Z: Z2 } = apoint(other); // checks class equality\n const X1Z2 = M(X1 * Z2);\n const X2Z1 = M(X2 * Z1);\n const Y1Z2 = M(Y1 * Z2);\n const Y2Z1 = M(Y2 * Z1);\n return X1Z2 === X2Z1 && Y1Z2 === Y2Z1;\n }\n is0() {\n return this.equals(I);\n }\n /** Flip point over y coordinate. */\n negate() {\n return new Point(M(-this.X), this.Y, this.Z, M(-this.T));\n }\n /** Point doubling. Complete formula. Cost: `4M + 4S + 1*a + 6add + 1*2`. */\n double() {\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const a = _a;\n // https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#doubling-dbl-2008-hwcd\n const A = M(X1 * X1);\n const B = M(Y1 * Y1);\n const C = M(2n * M(Z1 * Z1));\n const D = M(a * A);\n const x1y1 = X1 + Y1;\n const E = M(M(x1y1 * x1y1) - A - B);\n const G = D + B;\n const F = G - C;\n const H = D - B;\n const X3 = M(E * F);\n const Y3 = M(G * H);\n const T3 = M(E * H);\n const Z3 = M(F * G);\n return new Point(X3, Y3, Z3, T3);\n }\n /** Point addition. Complete formula. Cost: `8M + 1*k + 8add + 1*2`. */\n add(other) {\n const { X: X1, Y: Y1, Z: Z1, T: T1 } = this;\n const { X: X2, Y: Y2, Z: Z2, T: T2 } = apoint(other); // doesn't check if other on-curve\n const a = _a;\n const d = _d;\n // https://hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html#addition-add-2008-hwcd-3\n const A = M(X1 * X2);\n const B = M(Y1 * Y2);\n const C = M(T1 * d * T2);\n const D = M(Z1 * Z2);\n const E = M((X1 + Y1) * (X2 + Y2) - A - B);\n const F = M(D - C);\n const G = M(D + C);\n const H = M(B - a * A);\n const X3 = M(E * F);\n const Y3 = M(G * H);\n const T3 = M(E * H);\n const Z3 = M(F * G);\n return new Point(X3, Y3, Z3, T3);\n }\n subtract(other) {\n return this.add(apoint(other).negate());\n }\n /**\n * Point-by-scalar multiplication. Scalar must be in range 1 <= n < CURVE.n.\n * Uses {@link wNAF} for base point.\n * Uses fake point to mitigate side-channel leakage.\n * @param n scalar by which point is multiplied\n * @param safe safe mode guards against timing attacks; unsafe mode is faster\n */\n multiply(n, safe = true) {\n if (!safe && (n === 0n || this.is0()))\n return I;\n assertRange(n, 1n, N);\n if (n === 1n)\n return this;\n if (this.equals(G))\n return wNAF(n).p;\n // init result point & fake point\n let p = I;\n let f = G;\n for (let d = this; n > 0n; d = d.double(), n >>= 1n) {\n // if bit is present, add to point\n // if not present, add to fake, for timing safety\n if (n & 1n)\n p = p.add(d);\n else if (safe)\n f = f.add(d);\n }\n return p;\n }\n multiplyUnsafe(scalar) {\n return this.multiply(scalar, false);\n }\n /** Convert point to 2d xy affine point. (X, Y, Z) ∋ (x=X/Z, y=Y/Z) */\n toAffine() {\n const { X, Y, Z } = this;\n // fast-paths for ZERO point OR Z=1\n if (this.equals(I))\n return { x: 0n, y: 1n };\n const iz = invert(Z, P);\n // (Z * Z^-1) must be 1, otherwise bad math\n if (M(Z * iz) !== 1n)\n err('invalid inverse');\n // x = X*Z^-1; y = Y*Z^-1\n const x = M(X * iz);\n const y = M(Y * iz);\n return { x, y };\n }\n toBytes() {\n const { x, y } = this.assertValidity().toAffine();\n const b = numTo32bLE(y);\n // store sign in first LE byte\n b[31] |= x & 1n ? 0x80 : 0;\n return b;\n }\n toHex() {\n return bytesToHex(this.toBytes());\n }\n clearCofactor() {\n return this.multiply(big(h), false);\n }\n isSmallOrder() {\n return this.clearCofactor().is0();\n }\n isTorsionFree() {\n // Multiply by big number N. We can't `mul(N)` because of checks. Instead, we `mul(N/2)*2+1`\n let p = this.multiply(N / 2n, false).double();\n if (N % 2n)\n p = p.add(this);\n return p.is0();\n }\n}\n/** Generator / base point */\nconst G = new Point(Gx, Gy, 1n, M(Gx * Gy));\n/** Identity / zero point */\nconst I = new Point(0n, 1n, 1n, 0n);\n// Static aliases\nPoint.BASE = G;\nPoint.ZERO = I;\nconst numTo32bLE = (num) => hexToBytes(padh(assertRange(num, 0n, B256), L2)).reverse();\nconst bytesToNumLE = (b) => big('0x' + bytesToHex(u8fr(abytes(b)).reverse()));\nconst pow2 = (x, power) => {\n // pow2(x, 4) == x^(2^4)\n let r = x;\n while (power-- > 0n) {\n r *= r;\n r %= P;\n }\n return r;\n};\n// prettier-ignore\nconst pow_2_252_3 = (x) => {\n const x2 = (x * x) % P; // x^2, bits 1\n const b2 = (x2 * x) % P; // x^3, bits 11\n const b4 = (pow2(b2, 2n) * b2) % P; // x^(2^4-1), bits 1111\n const b5 = (pow2(b4, 1n) * x) % P; // x^(2^5-1), bits 11111\n const b10 = (pow2(b5, 5n) * b5) % P; // x^(2^10)\n const b20 = (pow2(b10, 10n) * b10) % P; // x^(2^20)\n const b40 = (pow2(b20, 20n) * b20) % P; // x^(2^40)\n const b80 = (pow2(b40, 40n) * b40) % P; // x^(2^80)\n const b160 = (pow2(b80, 80n) * b80) % P; // x^(2^160)\n const b240 = (pow2(b160, 80n) * b80) % P; // x^(2^240)\n const b250 = (pow2(b240, 10n) * b10) % P; // x^(2^250)\n const pow_p_5_8 = (pow2(b250, 2n) * x) % P; // < To pow to (p+3)/8, multiply it by x.\n return { pow_p_5_8, b2 };\n};\nconst RM1 = 0x2b8324804fc1df0b2b4d00993dfbd7a72f431806ad2fe478c4ee1b274a0ea0b0n; // √-1\n// for sqrt comp\n// prettier-ignore\nconst uvRatio = (u, v) => {\n const v3 = M(v * v * v); // v³\n const v7 = M(v3 * v3 * v); // v⁷\n const pow = pow_2_252_3(u * v7).pow_p_5_8; // (uv⁷)^(p-5)/8\n let x = M(u * v3 * pow); // (uv³)(uv⁷)^(p-5)/8\n const vx2 = M(v * x * x); // vx²\n const root1 = x; // First root candidate\n const root2 = M(x * RM1); // Second root candidate; RM1 is √-1\n const useRoot1 = vx2 === u; // If vx² = u (mod p), x is a square root\n const useRoot2 = vx2 === M(-u); // If vx² = -u, set x <-- x * 2^((p-1)/4)\n const noRoot = vx2 === M(-u * RM1); // There is no valid root, vx² = -u√-1\n if (useRoot1)\n x = root1;\n if (useRoot2 || noRoot)\n x = root2; // We return root2 anyway, for const-time\n if ((M(x) & 1n) === 1n)\n x = M(-x); // edIsNegative\n return { isValid: useRoot1 || useRoot2, value: x };\n};\n// N == L, just weird naming\nconst modL_LE = (hash) => modN(bytesToNumLE(hash)); // modulo L; but little-endian\n/** hashes.sha512 should conform to the interface. */\n// TODO: rename\nconst sha512a = (...m) => hashes.sha512Async(concatBytes(...m)); // Async SHA512\nconst sha512s = (...m) => callHash('sha512')(concatBytes(...m));\n// RFC8032 5.1.5\nconst hash2extK = (hashed) => {\n // slice creates a copy, unlike subarray\n const head = hashed.slice(0, L);\n head[0] &= 248; // Clamp bits: 0b1111_1000\n head[31] &= 127; // 0b0111_1111\n head[31] |= 64; // 0b0100_0000\n const prefix = hashed.slice(L, L2); // secret key \"prefix\"\n const scalar = modL_LE(head); // modular division over curve order\n const point = G.multiply(scalar); // public key point\n const pointBytes = point.toBytes(); // point serialized to Uint8Array\n return { head, prefix, scalar, point, pointBytes };\n};\n// RFC8032 5.1.5; getPublicKey async, sync. Hash priv key and extract point.\nconst getExtendedPublicKeyAsync = (secretKey) => sha512a(abytes(secretKey, L)).then(hash2extK);\nconst getExtendedPublicKey = (secretKey) => hash2extK(sha512s(abytes(secretKey, L)));\n/** Creates 32-byte ed25519 public key from 32-byte secret key. Async. */\nconst getPublicKeyAsync = (secretKey) => getExtendedPublicKeyAsync(secretKey).then((p) => p.pointBytes);\n/** Creates 32-byte ed25519 public key from 32-byte secret key. To use, set `hashes.sha512` first. */\nconst getPublicKey = (priv) => getExtendedPublicKey(priv).pointBytes;\nconst hashFinishA = (res) => sha512a(res.hashable).then(res.finish);\nconst hashFinishS = (res) => res.finish(sha512s(res.hashable));\n// Code, shared between sync & async sign\nconst _sign = (e, rBytes, msg) => {\n const { pointBytes: P, scalar: s } = e;\n const r = modL_LE(rBytes); // r was created outside, reduce it modulo L\n const R = G.multiply(r).toBytes(); // R = [r]B\n const hashable = concatBytes(R, P, msg); // dom2(F, C) || R || A || PH(M)\n const finish = (hashed) => {\n // k = SHA512(dom2(F, C) || R || A || PH(M))\n const S = modN(r + modL_LE(hashed) * s); // S = (r + k * s) mod L; 0 <= s < l\n return abytes(concatBytes(R, numTo32bLE(S)), L2); // 64-byte sig: 32b R.x + 32b LE(S)\n };\n return { hashable, finish };\n};\n/**\n * Signs message using secret key. Async.\n * Follows RFC8032 5.1.6.\n */\nconst signAsync = async (message, secretKey) => {\n const m = abytes(message);\n const e = await getExtendedPublicKeyAsync(secretKey);\n const rBytes = await sha512a(e.prefix, m); // r = SHA512(dom2(F, C) || prefix || PH(M))\n return hashFinishA(_sign(e, rBytes, m)); // gen R, k, S, then 64-byte signature\n};\n/**\n * Signs message using secret key. To use, set `hashes.sha512` first.\n * Follows RFC8032 5.1.6.\n */\nconst sign = (message, secretKey) => {\n const m = abytes(message);\n const e = getExtendedPublicKey(secretKey);\n const rBytes = sha512s(e.prefix, m); // r = SHA512(dom2(F, C) || prefix || PH(M))\n return hashFinishS(_sign(e, rBytes, m)); // gen R, k, S, then 64-byte signature\n};\nconst defaultVerifyOpts = { zip215: true };\nconst _verify = (sig, msg, pub, opts = defaultVerifyOpts) => {\n sig = abytes(sig, L2); // Signature hex str/Bytes, must be 64 bytes\n msg = abytes(msg); // Message hex str/Bytes\n pub = abytes(pub, L);\n const { zip215 } = opts; // switch between zip215 and rfc8032 verif\n let A;\n let R;\n let s;\n let SB;\n let hashable = Uint8Array.of();\n try {\n A = Point.fromBytes(pub, zip215); // public key A decoded\n R = Point.fromBytes(sig.slice(0, L), zip215); // 0 <= R < 2^256: ZIP215 R can be >= P\n s = bytesToNumLE(sig.slice(L, L2)); // Decode second half as an integer S\n SB = G.multiply(s, false); // in the range 0 <= s < L\n hashable = concatBytes(R.toBytes(), A.toBytes(), msg); // dom2(F, C) || R || A || PH(M)\n }\n catch (error) { }\n const finish = (hashed) => {\n // k = SHA512(dom2(F, C) || R || A || PH(M))\n if (SB == null)\n return false; // false if try-catch catched an error\n if (!zip215 && A.isSmallOrder())\n return false; // false for SBS: Strongly Binding Signature\n const k = modL_LE(hashed); // decode in little-endian, modulo L\n const RkA = R.add(A.multiply(k, false)); // [8]R + [8][k]A'\n return RkA.add(SB.negate()).clearCofactor().is0(); // [8][S]B = [8]R + [8][k]A'\n };\n return { hashable, finish };\n};\n/** Verifies signature on message and public key. Async. Follows RFC8032 5.1.7. */\nconst verifyAsync = async (signature, message, publicKey, opts = defaultVerifyOpts) => hashFinishA(_verify(signature, message, publicKey, opts));\n/** Verifies signature on message and public key. To use, set `hashes.sha512` first. Follows RFC8032 5.1.7. */\nconst verify = (signature, message, publicKey, opts = defaultVerifyOpts) => hashFinishS(_verify(signature, message, publicKey, opts));\n/** Math, hex, byte helpers. Not in `utils` because utils share API with noble-curves. */\nconst etc = {\n bytesToHex: bytesToHex,\n hexToBytes: hexToBytes,\n concatBytes: concatBytes,\n mod: M,\n invert: invert,\n randomBytes: randomBytes,\n};\nconst hashes = {\n sha512Async: async (message) => {\n const s = subtle();\n const m = concatBytes(message);\n return u8n(await s.digest('SHA-512', m.buffer));\n },\n sha512: undefined,\n};\n// FIPS 186 B.4.1 compliant key generation produces private keys\n// with modulo bias being neglible. takes >N+16 bytes, returns (hash mod n-1)+1\nconst randomSecretKey = (seed = randomBytes(L)) => seed;\nconst keygen = (seed) => {\n const secretKey = randomSecretKey(seed);\n const publicKey = getPublicKey(secretKey);\n return { secretKey, publicKey };\n};\nconst keygenAsync = async (seed) => {\n const secretKey = randomSecretKey(seed);\n const publicKey = await getPublicKeyAsync(secretKey);\n return { secretKey, publicKey };\n};\n/** ed25519-specific key utilities. */\nconst utils = {\n getExtendedPublicKeyAsync: getExtendedPublicKeyAsync,\n getExtendedPublicKey: getExtendedPublicKey,\n randomSecretKey: randomSecretKey,\n};\n// ## Precomputes\n// --------------\nconst W = 8; // W is window size\nconst scalarBits = 256;\nconst pwindows = Math.ceil(scalarBits / W) + 1; // 33 for W=8, NOT 32 - see wNAF loop\nconst pwindowSize = 2 ** (W - 1); // 128 for W=8\nconst precompute = () => {\n const points = [];\n let p = G;\n let b = p;\n for (let w = 0; w < pwindows; w++) {\n b = p;\n points.push(b);\n for (let i = 1; i < pwindowSize; i++) {\n b = b.add(p);\n points.push(b);\n } // i=1, bc we skip 0\n p = b.double();\n }\n return points;\n};\nlet Gpows = undefined; // precomputes for base point G\n// const-time negate\nconst ctneg = (cnd, p) => {\n const n = p.negate();\n return cnd ? n : p;\n};\n/**\n * Precomputes give 12x faster getPublicKey(), 10x sign(), 2x verify() by\n * caching multiples of G (base point). Cache is stored in 32MB of RAM.\n * Any time `G.multiply` is done, precomputes are used.\n * Not used for getSharedSecret, which instead multiplies random pubkey `P.multiply`.\n *\n * w-ary non-adjacent form (wNAF) precomputation method is 10% slower than windowed method,\n * but takes 2x less RAM. RAM reduction is possible by utilizing `.subtract`.\n *\n * !! Precomputes can be disabled by commenting-out call of the wNAF() inside Point#multiply().\n */\nconst wNAF = (n) => {\n const comp = Gpows || (Gpows = precompute());\n let p = I;\n let f = G; // f must be G, or could become I in the end\n const pow_2_w = 2 ** W; // 256 for W=8\n const maxNum = pow_2_w; // 256 for W=8\n const mask = big(pow_2_w - 1); // 255 for W=8 == mask 0b11111111\n const shiftBy = big(W); // 8 for W=8\n for (let w = 0; w < pwindows; w++) {\n let wbits = Number(n & mask); // extract W bits.\n n >>= shiftBy; // shift number by W bits.\n // We use negative indexes to reduce size of precomputed table by 2x.\n // Instead of needing precomputes 0..256, we only calculate them for 0..128.\n // If an index > 128 is found, we do (256-index) - where 256 is next window.\n // Naive: index +127 => 127, +224 => 224\n // Optimized: index +127 => 127, +224 => 256-32\n if (wbits > pwindowSize) {\n wbits -= maxNum;\n n += 1n;\n }\n const off = w * pwindowSize;\n const offF = off; // offsets, evaluate both\n const offP = off + Math.abs(wbits) - 1;\n const isEven = w % 2 !== 0; // conditions, evaluate both\n const isNeg = wbits < 0;\n if (wbits === 0) {\n // off == I: can't add it. Adding random offF instead.\n f = f.add(ctneg(isEven, comp[offF])); // bits are 0: add garbage to fake point\n }\n else {\n p = p.add(ctneg(isNeg, comp[offP])); // bits are 1: add to result point\n }\n }\n if (n !== 0n)\n err('invalid wnaf');\n return { p, f }; // return both real and fake points for JIT\n};\n// !! Remove the export to easily use in REPL / browser console\nexport { etc, getPublicKey, getPublicKeyAsync, hash, hashes, keygen, keygenAsync, Point, sign, signAsync, utils, verify, verifyAsync, };\n","/**\n * Utilities for hex, bytes, CSPRNG.\n * @module\n */\n/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\n// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.\n// node.js versions earlier than v19 don't declare it in global scope.\n// For node.js, package.json#exports field mapping rewrites import\n// from `crypto` to `cryptoNode`, which imports native module.\n// Makes the utils un-importable in browsers without a bundler.\n// Once node.js 18 is deprecated (2025-04-30), we can just drop the import.\nimport { crypto } from '@noble/hashes/crypto';\n\n/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */\nexport function isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n\n/** Asserts something is positive integer. */\nexport function anumber(n: number): void {\n if (!Number.isSafeInteger(n) || n < 0) throw new Error('positive integer expected, got ' + n);\n}\n\n/** Asserts something is Uint8Array. */\nexport function abytes(b: Uint8Array | undefined, ...lengths: number[]): void {\n if (!isBytes(b)) throw new Error('Uint8Array expected');\n if (lengths.length > 0 && !lengths.includes(b.length))\n throw new Error('Uint8Array expected of length ' + lengths + ', got length=' + b.length);\n}\n\n/** Asserts something is hash */\nexport function ahash(h: IHash): void {\n if (typeof h !== 'function' || typeof h.create !== 'function')\n throw new Error('Hash should be wrapped by utils.createHasher');\n anumber(h.outputLen);\n anumber(h.blockLen);\n}\n\n/** Asserts a hash instance has not been destroyed / finished */\nexport function aexists(instance: any, checkFinished = true): void {\n if (instance.destroyed) throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished) throw new Error('Hash#digest() has already been called');\n}\n\n/** Asserts output is properly-sized byte array */\nexport function aoutput(out: any, instance: any): void {\n abytes(out);\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error('digestInto() expects output buffer of length at least ' + min);\n }\n}\n\n/** Generic type encompassing 8/16/32-byte arrays - but not 64-byte. */\n// prettier-ignore\nexport type TypedArray = Int8Array | Uint8ClampedArray | Uint8Array |\n Uint16Array | Int16Array | Uint32Array | Int32Array;\n\n/** Cast u8 / u16 / u32 to u8. */\nexport function u8(arr: TypedArray): Uint8Array {\n return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** Cast u8 / u16 / u32 to u32. */\nexport function u32(arr: TypedArray): Uint32Array {\n return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n\n/** Zeroize a byte array. Warning: JS provides no guarantees. */\nexport function clean(...arrays: TypedArray[]): void {\n for (let i = 0; i < arrays.length; i++) {\n arrays[i].fill(0);\n }\n}\n\n/** Create DataView of an array for easy byte-level manipulation. */\nexport function createView(arr: TypedArray): DataView {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** The rotate right (circular right shift) operation for uint32 */\nexport function rotr(word: number, shift: number): number {\n return (word << (32 - shift)) | (word >>> shift);\n}\n\n/** The rotate left (circular left shift) operation for uint32 */\nexport function rotl(word: number, shift: number): number {\n return (word << shift) | ((word >>> (32 - shift)) >>> 0);\n}\n\n/** Is current platform little-endian? Most are. Big-Endian platform: IBM */\nexport const isLE: boolean = /* @__PURE__ */ (() =>\n new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n\n/** The byte swap operation for uint32 */\nexport function byteSwap(word: number): number {\n return (\n ((word << 24) & 0xff000000) |\n ((word << 8) & 0xff0000) |\n ((word >>> 8) & 0xff00) |\n ((word >>> 24) & 0xff)\n );\n}\n/** Conditionally byte swap if on a big-endian platform */\nexport const swap8IfBE: (n: number) => number = isLE\n ? (n: number) => n\n : (n: number) => byteSwap(n);\n\n/** @deprecated */\nexport const byteSwapIfBE: typeof swap8IfBE = swap8IfBE;\n/** In place byte swap for Uint32Array */\nexport function byteSwap32(arr: Uint32Array): Uint32Array {\n for (let i = 0; i < arr.length; i++) {\n arr[i] = byteSwap(arr[i]);\n }\n return arr;\n}\n\nexport const swap32IfBE: (u: Uint32Array) => Uint32Array = isLE\n ? (u: Uint32Array) => u\n : byteSwap32;\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin: boolean = /* @__PURE__ */ (() =>\n // @ts-ignore\n typeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) =>\n i.toString(16).padStart(2, '0')\n);\n\n/**\n * Convert byte array to hex string. Uses built-in function, when available.\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n abytes(bytes);\n // @ts-ignore\n if (hasHexBuiltin) return bytes.toHex();\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n\n// We use optimized technique to convert hex string to byte array\nconst asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 } as const;\nfunction asciiToBase16(ch: number): number | undefined {\n if (ch >= asciis._0 && ch <= asciis._9) return ch - asciis._0; // '2' => 50-48\n if (ch >= asciis.A && ch <= asciis.F) return ch - (asciis.A - 10); // 'B' => 66-(65-10)\n if (ch >= asciis.a && ch <= asciis.f) return ch - (asciis.a - 10); // 'b' => 98-(97-10)\n return;\n}\n\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex: string): Uint8Array {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n // @ts-ignore\n if (hasHexBuiltin) return Uint8Array.fromHex(hex);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2) throw new Error('hex string expected, got unpadded hex of length ' + hl);\n const array = new Uint8Array(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n const n1 = asciiToBase16(hex.charCodeAt(hi));\n const n2 = asciiToBase16(hex.charCodeAt(hi + 1));\n if (n1 === undefined || n2 === undefined) {\n const char = hex[hi] + hex[hi + 1];\n throw new Error('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n }\n array[ai] = n1 * 16 + n2; // multiply first octet, e.g. 'a3' => 10*16+3 => 160 + 3 => 163\n }\n return array;\n}\n\n/**\n * There is no setImmediate in browser and setTimeout is slow.\n * Call of async fn will return Promise, which will be fullfiled only on\n * next scheduler queue processing step and this is exactly what we need.\n */\nexport const nextTick = async (): Promise<void> => {};\n\n/** Returns control to thread each 'tick' ms to avoid blocking. */\nexport async function asyncLoop(\n iters: number,\n tick: number,\n cb: (i: number) => void\n): Promise<void> {\n let ts = Date.now();\n for (let i = 0; i < iters; i++) {\n cb(i);\n // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n const diff = Date.now() - ts;\n if (diff >= 0 && diff < tick) continue;\n await nextTick();\n ts += diff;\n }\n}\n\n// Global symbols, but ts doesn't see them: https://github.com/microsoft/TypeScript/issues/31535\ndeclare const TextEncoder: any;\ndeclare const TextDecoder: any;\n\n/**\n * Converts string to bytes using UTF8 encoding.\n * @example utf8ToBytes('abc') // Uint8Array.from([97, 98, 99])\n */\nexport function utf8ToBytes(str: string): Uint8Array {\n if (typeof str !== 'string') throw new Error('string expected');\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n\n/**\n * Converts bytes to string using UTF8 encoding.\n * @example bytesToUtf8(Uint8Array.from([97, 98, 99])) // 'abc'\n */\nexport function bytesToUtf8(bytes: Uint8Array): string {\n return new TextDecoder().decode(bytes);\n}\n\n/** Accepted input of hash functions. Strings are converted to byte arrays. */\nexport type Input = string | Uint8Array;\n/**\n * Normalizes (non-hex) string or Uint8Array to Uint8Array.\n * Warning: when Uint8Array is passed, it would NOT get copied.\n * Keep in mind for future mutable operations.\n */\nexport function toBytes(data: Input): Uint8Array {\n if (typeof data === 'string') data = utf8ToBytes(data);\n abytes(data);\n return data;\n}\n\n/** KDFs can accept string or Uint8Array for user convenience. */\nexport type KDFInput = string | Uint8Array;\n/**\n * Helper for KDFs: consumes uint8array or string.\n * When string is passed, does utf8 decoding, using TextDecoder.\n */\nexport function kdfInputToBytes(data: KDFInput): Uint8Array {\n if (typeof data === 'string') data = utf8ToBytes(data);\n abytes(data);\n return data;\n}\n\n/** Copies several Uint8Arrays into one. */\nexport function concatBytes(...arrays: Uint8Array[]): Uint8Array {\n let sum = 0;\n for (let i = 0; i < arrays.length; i++) {\n const a = arrays[i];\n abytes(a);\n sum += a.length;\n }\n const res = new Uint8Array(sum);\n for (let i = 0, pad = 0; i < arrays.length; i++) {\n const a = arrays[i];\n res.set(a, pad);\n pad += a.length;\n }\n return res;\n}\n\ntype EmptyObj = {};\nexport function checkOpts<T1 extends EmptyObj, T2 extends EmptyObj>(\n defaults: T1,\n opts?: T2\n): T1 & T2 {\n if (opts !== undefined && {}.toString.call(opts) !== '[object Object]')\n throw new Error('options should be object or undefined');\n const merged = Object.assign(defaults, opts);\n return merged as T1 & T2;\n}\n\n/** Hash interface. */\nexport type IHash = {\n (data: Uint8Array): Uint8Array;\n blockLen: number;\n outputLen: number;\n create: any;\n};\n\n/** For runtime check if class implements interface */\nexport abstract class Hash<T extends Hash<T>> {\n abstract blockLen: number; // Bytes per block\n abstract outputLen: number; // Bytes in output\n abstract update(buf: Input): this;\n // Writes digest into buf\n abstract digestInto(buf: Uint8Array): void;\n abstract digest(): Uint8Array;\n /**\n * Resets internal state. Makes Hash instance unusable.\n * Reset is impossible for keyed hashes if key is consumed into state. If digest is not consumed\n * by user, they will need to manually call `destroy()` when zeroing is necessary.\n */\n abstract destroy(): void;\n /**\n * Clones hash instance. Unsafe: doesn't check whether `to` is valid. Can be used as `clone()`\n * when no options are passed.\n * Reasons to use `_cloneInto` instead of clone: 1) performance 2) reuse instance => all internal\n * buffers are overwritten => causes buffer overwrite which is used for digest in some cases.\n * There are no guarantees for clean-up because it's impossible in JS.\n */\n abstract _cloneInto(to?: T): T;\n // Safe version that clones internal state\n abstract clone(): T;\n}\n\n/**\n * XOF: streaming API to read digest in chunks.\n * Same as 'squeeze' in keccak/k12 and 'seek' in blake3, but more generic name.\n * When hash used in XOF mode it is up to user to call '.destroy' afterwards, since we cannot\n * destroy state, next call can require more bytes.\n */\nexport type HashXOF<T extends Hash<T>> = Hash<T> & {\n xof(bytes: number): Uint8Array; // Read 'bytes' bytes from digest stream\n xofInto(buf: Uint8Array): Uint8Array; // read buf.length bytes from digest stream into buf\n};\n\n/** Hash function */\nexport type CHash = ReturnType<typeof createHasher>;\n/** Hash function with output */\nexport type CHashO = ReturnType<typeof createOptHasher>;\n/** XOF with output */\nexport type CHashXO = ReturnType<typeof createXOFer>;\n\n/** Wraps hash function, creating an interface on top of it */\nexport function createHasher<T extends Hash<T>>(\n hashCons: () => Hash<T>\n): {\n (msg: Input): Uint8Array;\n outputLen: number;\n blockLen: number;\n create(): Hash<T>;\n} {\n const hashC = (msg: Input): Uint8Array => hashCons().update(toBytes(msg)).digest();\n const tmp = hashCons();\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = () => hashCons();\n return hashC;\n}\n\nexport function createOptHasher<H extends Hash<H>, T extends Object>(\n hashCons: (opts?: T) => Hash<H>\n): {\n (msg: Input, opts?: T): Uint8Array;\n outputLen: number;\n blockLen: number;\n create(opts?: T): Hash<H>;\n} {\n const hashC = (msg: Input, opts?: T): Uint8Array => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({} as T);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts?: T) => hashCons(opts);\n return hashC;\n}\n\nexport function createXOFer<H extends HashXOF<H>, T extends Object>(\n hashCons: (opts?: T) => HashXOF<H>\n): {\n (msg: Input, opts?: T): Uint8Array;\n outputLen: number;\n blockLen: number;\n create(opts?: T): HashXOF<H>;\n} {\n const hashC = (msg: Input, opts?: T): Uint8Array => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({} as T);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts?: T) => hashCons(opts);\n return hashC;\n}\nexport const wrapConstructor: typeof createHasher = createHasher;\nexport const wrapConstructorWithOpts: typeof createOptHasher = createOptHasher;\nexport const wrapXOFConstructorWithOpts: typeof createXOFer = createXOFer;\n\n/** Cryptographically secure PRNG. Uses internal OS-level `crypto.getRandomValues`. */\nexport function randomBytes(bytesLength = 32): Uint8Array {\n if (crypto && typeof crypto.getRandomValues === 'function') {\n return crypto.getRandomValues(new Uint8Array(bytesLength));\n }\n // Legacy Node.js compatibility\n if (crypto && typeof crypto.randomBytes === 'function') {\n return Uint8Array.from(crypto.randomBytes(bytesLength));\n }\n throw new Error('crypto.getRandomValues must be defined');\n}\n","/**\n * Internal Merkle-Damgard hash utils.\n * @module\n */\nimport { type Input, Hash, abytes, aexists, aoutput, clean, createView, toBytes } from './utils.ts';\n\n/** Polyfill for Safari 14. https://caniuse.com/mdn-javascript_builtins_dataview_setbiguint64 */\nexport function setBigUint64(\n view: DataView,\n byteOffset: number,\n value: bigint,\n isLE: boolean\n): void {\n if (typeof view.setBigUint64 === 'function') return view.setBigUint64(byteOffset, value, isLE);\n const _32n = BigInt(32);\n const _u32_max = BigInt(0xffffffff);\n const wh = Number((value >> _32n) & _u32_max);\n const wl = Number(value & _u32_max);\n const h = isLE ? 4 : 0;\n const l = isLE ? 0 : 4;\n view.setUint32(byteOffset + h, wh, isLE);\n view.setUint32(byteOffset + l, wl, isLE);\n}\n\n/** Choice: a ? b : c */\nexport function Chi(a: number, b: number, c: number): number {\n return (a & b) ^ (~a & c);\n}\n\n/** Majority function, true if any two inputs is true. */\nexport function Maj(a: number, b: number, c: number): number {\n return (a & b) ^ (a & c) ^ (b & c);\n}\n\n/**\n * Merkle-Damgard hash construction base class.\n * Could be used to create MD5, RIPEMD, SHA1, SHA2.\n */\nexport abstract class HashMD<T extends HashMD<T>> extends Hash<T> {\n protected abstract process(buf: DataView, offset: number): void;\n protected abstract get(): number[];\n protected abstract set(...args: number[]): void;\n abstract destroy(): void;\n protected abstract roundClean(): void;\n\n readonly blockLen: number;\n readonly outputLen: number;\n readonly padOffset: number;\n readonly isLE: boolean;\n\n // For partial updates less than block size\n protected buffer: Uint8Array;\n protected view: DataView;\n protected finished = false;\n protected length = 0;\n protected pos = 0;\n protected destroyed = false;\n\n constructor(blockLen: number, outputLen: number, padOffset: number, isLE: boolean) {\n super();\n this.blockLen = blockLen;\n this.outputLen = outputLen;\n this.padOffset = padOffset;\n this.isLE = isLE;\n this.buffer = new Uint8Array(blockLen);\n this.view = createView(this.buffer);\n }\n update(data: Input): this {\n aexists(this);\n data = toBytes(data);\n abytes(data);\n const { view, buffer, blockLen } = this;\n const len = data.length;\n for (let pos = 0; pos < len; ) {\n const take = Math.min(blockLen - this.pos, len - pos);\n // Fast path: we have at least one block in input, cast it to view and process\n if (take === blockLen) {\n const dataView = createView(data);\n for (; blockLen <= len - pos; pos += blockLen) this.process(dataView, pos);\n continue;\n }\n buffer.set(data.subarray(pos, pos + take), this.pos);\n this.pos += take;\n pos += take;\n if (this.pos === blockLen) {\n this.process(view, 0);\n this.pos = 0;\n }\n }\n this.length += data.length;\n this.roundClean();\n return this;\n }\n digestInto(out: Uint8Array): void {\n aexists(this);\n aoutput(out, this);\n this.finished = true;\n // Padding\n // We can avoid allocation of buffer for padding completely if it\n // was previously not allocated here. But it won't change performance.\n const { buffer, view, blockLen, isLE } = this;\n let { pos } = this;\n // append the bit '1' to the message\n buffer[pos++] = 0b10000000;\n clean(this.buffer.subarray(pos));\n // we have less than padOffset left in buffer, so we cannot put length in\n // current block, need process it and pad again\n if (this.padOffset > blockLen - pos) {\n this.process(view, 0);\n pos = 0;\n }\n // Pad until full block byte with zeros\n for (let i = pos; i < blockLen; i++) buffer[i] = 0;\n // Note: sha512 requires length to be 128bit integer, but length in JS will overflow before that\n // You need to write around 2 exabytes (u64_max / 8 / (1024**6)) for this to happen.\n // So we just write lowest 64 bits of that value.\n setBigUint64(view, blockLen - 8, BigInt(this.length * 8), isLE);\n this.process(view, 0);\n const oview = createView(out);\n const len = this.outputLen;\n // NOTE: we do division by 4 later, which should be fused in single op with modulo by JIT\n if (len % 4) throw new Error('_sha2: outputLen should be aligned to 32bit');\n const outLen = len / 4;\n const state = this.get();\n if (outLen > state.length) throw new Error('_sha2: outputLen bigger than state');\n for (let i = 0; i < outLen; i++) oview.setUint32(4 * i, state[i], isLE);\n }\n digest(): Uint8Array {\n const { buffer, outputLen } = this;\n this.digestInto(buffer);\n const res = buffer.slice(0, outputLen);\n this.destroy();\n return res;\n }\n _cloneInto(to?: T): T {\n to ||= new (this.constructor as any)() as T;\n to.set(...this.get());\n const { blockLen, buffer, length, finished, destroyed, pos } = this;\n to.destroyed = destroyed;\n to.finished = finished;\n to.length = length;\n to.pos = pos;\n if (length % blockLen) to.buffer.set(buffer);\n return to;\n }\n clone(): T {\n return this._cloneInto();\n }\n}\n\n/**\n * Initial SHA-2 state: fractional parts of square roots of first 16 primes 2..53.\n * Check out `test/misc/sha2-gen-iv.js` for recomputation guide.\n */\n\n/** Initial SHA256 state. Bits 0..32 of frac part of sqrt of primes 2..19 */\nexport const SHA256_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n]);\n\n/** Initial SHA224 state. Bits 32..64 of frac part of sqrt of primes 23..53 */\nexport const SHA224_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4,\n]);\n\n/** Initial SHA384 state. Bits 0..64 of frac part of sqrt of primes 23..53 */\nexport const SHA384_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0xcbbb9d5d, 0xc1059ed8, 0x629a292a, 0x367cd507, 0x9159015a, 0x3070dd17, 0x152fecd8, 0xf70e5939,\n 0x67332667, 0xffc00b31, 0x8eb44a87, 0x68581511, 0xdb0c2e0d, 0x64f98fa7, 0x47b5481d, 0xbefa4fa4,\n]);\n\n/** Initial SHA512 state. Bits 0..64 of frac part of sqrt of primes 2..19 */\nexport const SHA512_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xf3bcc908, 0xbb67ae85, 0x84caa73b, 0x3c6ef372, 0xfe94f82b, 0xa54ff53a, 0x5f1d36f1,\n 0x510e527f, 0xade682d1, 0x9b05688c, 0x2b3e6c1f, 0x1f83d9ab, 0xfb41bd6b, 0x5be0cd19, 0x137e2179,\n]);\n","/**\n * Internal helpers for u64. BigUint64Array is too slow as per 2025, so we implement it using Uint32Array.\n * @todo re-check https://issues.chromium.org/issues/42212588\n * @module\n */\nconst U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);\nconst _32n = /* @__PURE__ */ BigInt(32);\n\nfunction fromBig(\n n: bigint,\n le = false\n): {\n h: number;\n l: number;\n} {\n if (le) return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };\n return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };\n}\n\nfunction split(lst: bigint[], le = false): Uint32Array[] {\n const len = lst.length;\n let Ah = new Uint32Array(len);\n let Al = new Uint32Array(len);\n for (let i = 0; i < len; i++) {\n const { h, l } = fromBig(lst[i], le);\n [Ah[i], Al[i]] = [h, l];\n }\n return [Ah, Al];\n}\n\nconst toBig = (h: number, l: number): bigint => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);\n// for Shift in [0, 32)\nconst shrSH = (h: number, _l: number, s: number): number => h >>> s;\nconst shrSL = (h: number, l: number, s: number): number => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in [1, 32)\nconst rotrSH = (h: number, l: number, s: number): number => (h >>> s) | (l << (32 - s));\nconst rotrSL = (h: number, l: number, s: number): number => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotrBH = (h: number, l: number, s: number): number => (h << (64 - s)) | (l >>> (s - 32));\nconst rotrBL = (h: number, l: number, s: number): number => (h >>> (s - 32)) | (l << (64 - s));\n// Right rotate for shift===32 (just swaps l&h)\nconst rotr32H = (_h: number, l: number): number => l;\nconst rotr32L = (h: number, _l: number): number => h;\n// Left rotate for Shift in [1, 32)\nconst rotlSH = (h: number, l: number, s: number): number => (h << s) | (l >>> (32 - s));\nconst rotlSL = (h: number, l: number, s: number): number => (l << s) | (h >>> (32 - s));\n// Left rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotlBH = (h: number, l: number, s: number): number => (l << (s - 32)) | (h >>> (64 - s));\nconst rotlBL = (h: number, l: number, s: number): number => (h << (s - 32)) | (l >>> (64 - s));\n\n// JS uses 32-bit signed integers for bitwise operations which means we cannot\n// simple take carry out of low bit sum by shift, we need to use division.\nfunction add(\n Ah: number,\n Al: number,\n Bh: number,\n Bl: number\n): {\n h: number;\n l: number;\n} {\n const l = (Al >>> 0) + (Bl >>> 0);\n return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };\n}\n// Addition with more than 2 elements\nconst add3L = (Al: number, Bl: number, Cl: number): number => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);\nconst add3H = (low: number, Ah: number, Bh: number, Ch: number): number =>\n (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;\nconst add4L = (Al: number, Bl: number, Cl: number, Dl: number): number =>\n (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);\nconst add4H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number): number =>\n (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;\nconst add5L = (Al: number, Bl: number, Cl: number, Dl: number, El: number): number =>\n (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);\nconst add5H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number, Eh: number): number =>\n (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;\n\n// prettier-ignore\nexport {\n add, add3H, add3L, add4H, add4L, add5H, add5L, fromBig, rotlBH, rotlBL, rotlSH, rotlSL, rotr32H, rotr32L, rotrBH, rotrBL, rotrSH, rotrSL, shrSH, shrSL, split, toBig\n};\n// prettier-ignore\nconst u64: { fromBig: typeof fromBig; split: typeof split; toBig: (h: number, l: number) => bigint; shrSH: (h: number, _l: number, s: number) => number; shrSL: (h: number, l: number, s: number) => number; rotrSH: (h: number, l: number, s: number) => number; rotrSL: (h: number, l: number, s: number) => number; rotrBH: (h: number, l: number, s: number) => number; rotrBL: (h: number, l: number, s: number) => number; rotr32H: (_h: number, l: number) => number; rotr32L: (h: number, _l: number) => number; rotlSH: (h: number, l: number, s: number) => number; rotlSL: (h: number, l: number, s: number) => number; rotlBH: (h: number, l: number, s: number) => number; rotlBL: (h: number, l: number, s: number) => number; add: typeof add; add3L: (Al: number, Bl: number, Cl: number) => number; add3H: (low: number, Ah: number, Bh: number, Ch: number) => number; add4L: (Al: number, Bl: number, Cl: number, Dl: number) => number; add4H: (low: number, Ah: number, Bh: number, Ch: number, Dh: number) => number; add5H: (low: number, Ah: number, Bh: number, Ch: number, Dh: number, Eh: number) => number; add5L: (Al: number, Bl: number, Cl: number, Dl: number, El: number) => number; } = {\n fromBig, split, toBig,\n shrSH, shrSL,\n rotrSH, rotrSL, rotrBH, rotrBL,\n rotr32H, rotr32L,\n rotlSH, rotlSL, rotlBH, rotlBL,\n add, add3L, add3H, add4L, add4H, add5H, add5L,\n};\nexport default u64;\n","/**\n * SHA2 hash function. A.k.a. sha256, sha384, sha512, sha512_224, sha512_256.\n * SHA256 is the fastest hash implementable in JS, even faster than Blake3.\n * Check out [RFC 4634](https://datatracker.ietf.org/doc/html/rfc4634) and\n * [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf).\n * @module\n */\nimport { Chi, HashMD, Maj, SHA224_IV, SHA256_IV, SHA384_IV, SHA512_IV } from './_md.ts';\nimport * as u64 from './_u64.ts';\nimport { type CHash, clean, createHasher, rotr } from './utils.ts';\n\n/**\n * Round constants:\n * First 32 bits of fractional parts of the cube roots of the first 64 primes 2..311)\n */\n// prettier-ignore\nconst SHA256_K = /* @__PURE__ */ Uint32Array.from([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n]);\n\n/** Reusable temporary buffer. \"W\" comes straight from spec. */\nconst SHA256_W = /* @__PURE__ */ new Uint32Array(64);\nexport class SHA256 extends HashMD<SHA256> {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n protected A: number = SHA256_IV[0] | 0;\n protected B: number = SHA256_IV[1] | 0;\n protected C: number = SHA256_IV[2] | 0;\n protected D: number = SHA256_IV[3] | 0;\n protected E: number = SHA256_IV[4] | 0;\n protected F: number = SHA256_IV[5] | 0;\n protected G: number = SHA256_IV[6] | 0;\n protected H: number = SHA256_IV[7] | 0;\n\n constructor(outputLen: number = 32) {\n super(64, outputLen, 8, false);\n }\n protected get(): [number, number, number, number, number, number, number, number] {\n const { A, B, C, D, E, F, G, H } = this;\n return [A, B, C, D, E, F, G, H];\n }\n // prettier-ignore\n protected set(\n A: number, B: number, C: number, D: number, E: number, F: number, G: number, H: number\n ): void {\n this.A = A | 0;\n this.B = B | 0;\n this.C = C | 0;\n this.D = D | 0;\n this.E = E | 0;\n this.F = F | 0;\n this.G = G | 0;\n this.H = H | 0;\n }\n protected process(view: DataView, offset: number): void {\n // Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4) SHA256_W[i] = view.getUint32(offset, false);\n for (let i = 16; i < 64; i++) {\n const W15 = SHA256_W[i - 15];\n const W2 = SHA256_W[i - 2];\n const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ (W15 >>> 3);\n const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ (W2 >>> 10);\n SHA256_W[i] = (s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16]) | 0;\n }\n // Compression function main loop, 64 rounds\n let { A, B, C, D, E, F, G, H } = this;\n for (let i = 0; i < 64; i++) {\n const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25);\n const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22);\n const T2 = (sigma0 + Maj(A, B, C)) | 0;\n H = G;\n G = F;\n F = E;\n E = (D + T1) | 0;\n D = C;\n C = B;\n B = A;\n A = (T1 + T2) | 0;\n }\n // Add the compressed chunk to the current hash value\n A = (A + this.A) | 0;\n B = (B + this.B) | 0;\n C = (C + this.C) | 0;\n D = (D + this.D) | 0;\n E = (E + this.E) | 0;\n F = (F + this.F) | 0;\n G = (G + this.G) | 0;\n H = (H + this.H) | 0;\n this.set(A, B, C, D, E, F, G, H);\n }\n protected roundClean(): void {\n clean(SHA256_W);\n }\n destroy(): void {\n this.set(0, 0, 0, 0, 0, 0, 0, 0);\n clean(this.buffer);\n }\n}\n\nexport class SHA224 extends SHA256 {\n protected A: number = SHA224_IV[0] | 0;\n protected B: number = SHA224_IV[1] | 0;\n protected C: number = SHA224_IV[2] | 0;\n protected D: number = SHA224_IV[3] | 0;\n protected E: number = SHA224_IV[4] | 0;\n protected F: number = SHA224_IV[5] | 0;\n protected G: number = SHA224_IV[6] | 0;\n protected H: number = SHA224_IV[7] | 0;\n constructor() {\n super(28);\n }\n}\n\n// SHA2-512 is slower than sha256 in js because u64 operations are slow.\n\n// Round contants\n// First 32 bits of the fractional parts of the cube roots of the first 80 primes 2..409\n// prettier-ignore\nconst K512 = /* @__PURE__ */ (() => u64.split([\n '0x428a2f98d728ae22', '0x7137449123ef65cd', '0xb5c0fbcfec4d3b2f', '0xe9b5dba58189dbbc',\n '0x3956c25bf348b538', '0x59f111f1b605d019', '0x923f82a4af194f9b', '0xab1c5ed5da6d8118',\n '0xd807aa98a3030242', '0x12835b0145706fbe', '0x243185be4ee4b28c', '0x550c7dc3d5ffb4e2',\n '0x72be5d74f27b896f', '0x80deb1fe3b1696b1', '0x9bdc06a725c71235', '0xc19bf174cf692694',\n '0xe49b69c19ef14ad2', '0xefbe4786384f25e3', '0x0fc19dc68b8cd5b5', '0x240ca1cc77ac9c65',\n '0x2de92c6f592b0275', '0x4a7484aa6ea6e483', '0x5cb0a9dcbd41fbd4', '0x76f988da831153b5',\n '0x983e5152ee66dfab', '0xa831c66d2db43210', '0xb00327c898fb213f', '0xbf597fc7beef0ee4',\n '0xc6e00bf33da88fc2', '0xd5a79147930aa725', '0x06ca6351e003826f', '0x142929670a0e6e70',\n '0x27b70a8546d22ffc', '0x2e1b21385c26c926', '0x4d2c6dfc5ac42aed', '0x53380d139d95b3df',\n '0x650a73548baf63de', '0x766a0abb3c77b2a8', '0x81c2c92e47edaee6', '0x92722c851482353b',\n '0xa2bfe8a14cf10364', '0xa81a664bbc423001', '0xc24b8b70d0f89791', '0xc76c51a30654be30',\n '0xd192e819d6ef5218', '0xd69906245565a910', '0xf40e35855771202a', '0x106aa07032bbd1b8',\n '0x19a4c116b8d2d0c8', '0x1e376c085141ab53', '0x2748774cdf8eeb99', '0x34b0bcb5e19b48a8',\n '0x391c0cb3c5c95a63', '0x4ed8aa4ae3418acb', '0x5b9cca4f7763e373', '0x682e6ff3d6b2b8a3',\n '0x748f82ee5defb2fc', '0x78a5636f43172f60', '0x84c87814a1f0ab72', '0x8cc702081a6439ec',\n '0x90befffa23631e28', '0xa4506cebde82bde9', '0xbef9a3f7b2c67915', '0xc67178f2e372532b',\n '0xca273eceea26619c', '0xd186b8c721c0c207', '0xeada7dd6cde0eb1e', '0xf57d4f7fee6ed178',\n '0x06f067aa72176fba', '0x0a637dc5a2c898a6', '0x113f9804bef90dae', '0x1b710b35131c471b',\n '0x28db77f523047d84', '0x32caab7b40c72493', '0x3c9ebe0a15c9bebc', '0x431d67c49c100d4c',\n '0x4cc5d4becb3e42b6', '0x597f299cfc657e2a', '0x5fcb6fab3ad6faec', '0x6c44198c4a475817'\n].map(n => BigInt(n))))();\nconst SHA512_Kh = /* @__PURE__ */ (() => K512[0])();\nconst SHA512_Kl = /* @__PURE__ */ (() => K512[1])();\n\n// Reusable temporary buffers\nconst SHA512_W_H = /* @__PURE__ */ new Uint32Array(80);\nconst SHA512_W_L = /* @__PURE__ */ new Uint32Array(80);\n\nexport class SHA512 extends HashMD<SHA512> {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n // h -- high 32 bits, l -- low 32 bits\n protected Ah: number = SHA512_IV[0] | 0;\n protected Al: number = SHA512_IV[1] | 0;\n protected Bh: number = SHA512_IV[2] | 0;\n protected Bl: number = SHA512_IV[3] | 0;\n protected Ch: number = SHA512_IV[4] | 0;\n protected Cl: number = SHA512_IV[5] | 0;\n protected Dh: number = SHA512_IV[6] | 0;\n protected Dl: number = SHA512_IV[7] | 0;\n protected Eh: number = SHA512_IV[8] | 0;\n protected El: number = SHA512_IV[9] | 0;\n protected Fh: number = SHA512_IV[10] | 0;\n protected Fl: number = SHA512_IV[11] | 0;\n protected Gh: number = SHA512_IV[12] | 0;\n protected Gl: number = SHA512_IV[13] | 0;\n protected Hh: number = SHA512_IV[14] | 0;\n protected Hl: number = SHA512_IV[15] | 0;\n\n constructor(outputLen: number = 64) {\n super(128, outputLen, 16, false);\n }\n // prettier-ignore\n protected get(): [\n number, number, number, number, number, number, number, number,\n number, number, number, number, number, number, number, number\n ] {\n const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl];\n }\n // prettier-ignore\n protected set(\n Ah: number, Al: number, Bh: number, Bl: number, Ch: number, Cl: number, Dh: number, Dl: number,\n Eh: number, El: number, Fh: number, Fl: number, Gh: number, Gl: number, Hh: number, Hl: number\n ): void {\n this.Ah = Ah | 0;\n this.Al = Al | 0;\n this.Bh = Bh | 0;\n this.Bl = Bl | 0;\n this.Ch = Ch | 0;\n this.Cl = Cl | 0;\n this.Dh = Dh | 0;\n this.Dl = Dl | 0;\n this.Eh = Eh | 0;\n this.El = El | 0;\n this.Fh = Fh | 0;\n this.Fl = Fl | 0;\n this.Gh = Gh | 0;\n this.Gl = Gl | 0;\n this.Hh = Hh | 0;\n this.Hl = Hl | 0;\n }\n protected process(view: DataView, offset: number): void {\n // Extend the first 16 words into the remaining 64 words w[16..79] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4) {\n SHA512_W_H[i] = view.getUint32(offset);\n SHA512_W_L[i] = view.getUint32((offset += 4));\n }\n for (let i = 16; i < 80; i++) {\n // s0 := (w[i-15] rightrotate 1) xor (w[i-15] rightrotate 8) xor (w[i-15] rightshift 7)\n const W15h = SHA512_W_H[i - 15] | 0;\n const W15l = SHA512_W_L[i - 15] | 0;\n const s0h = u64.rotrSH(W15h, W15l, 1) ^ u64.rotrSH(W15h, W15l, 8) ^ u64.shrSH(W15h, W15l, 7);\n const s0l = u64.rotrSL(W15h, W15l, 1) ^ u64.rotrSL(W15h, W15l, 8) ^ u64.shrSL(W15h, W15l, 7);\n // s1 := (w[i-2] rightrotate 19) xor (w[i-2] rightrotate 61) xor (w[i-2] rightshift 6)\n const W2h = SHA512_W_H[i - 2] | 0;\n const W2l = SHA512_W_L[i - 2] | 0;\n const s1h = u64.rotrSH(W2h, W2l, 19) ^ u64.rotrBH(W2h, W2l, 61) ^ u64.shrSH(W2h, W2l, 6);\n const s1l = u64.rotrSL(W2h, W2l, 19) ^ u64.rotrBL(W2h, W2l, 61) ^ u64.shrSL(W2h, W2l, 6);\n // SHA256_W[i] = s0 + s1 + SHA256_W[i - 7] + SHA256_W[i - 16];\n const SUMl = u64.add4L(s0l, s1l, SHA512_W_L[i - 7], SHA512_W_L[i - 16]);\n const SUMh = u64.add4H(SUMl, s0h, s1h, SHA512_W_H[i - 7], SHA512_W_H[i - 16]);\n SHA512_W_H[i] = SUMh | 0;\n SHA512_W_L[i] = SUMl | 0;\n }\n let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n // Compression function main loop, 80 rounds\n for (let i = 0; i < 80; i++) {\n // S1 := (e rightrotate 14) xor (e rightrotate 18) xor (e rightrotate 41)\n const sigma1h = u64.rotrSH(Eh, El, 14) ^ u64.rotrSH(Eh, El, 18) ^ u64.rotrBH(Eh, El, 41);\n const sigma1l = u64.rotrSL(Eh, El, 14) ^ u64.rotrSL(Eh, El, 18) ^ u64.rotrBL(Eh, El, 41);\n //const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const CHIh = (Eh & Fh) ^ (~Eh & Gh);\n const CHIl = (El & Fl) ^ (~El & Gl);\n // T1 = H + sigma1 + Chi(E, F, G) + SHA512_K[i] + SHA512_W[i]\n // prettier-ignore\n const T1ll = u64.add5L(Hl, sigma1l, CHIl, SHA512_Kl[i], SHA512_W_L[i]);\n const T1h = u64.add5H(T1ll, Hh, sigma1h, CHIh, SHA512_Kh[i], SHA512_W_H[i]);\n const T1l = T1ll | 0;\n // S0 := (a rightrotate 28) xor (a rightrotate 34) xor (a rightrotate 39)\n const sigma0h = u64.rotrSH(Ah, Al, 28) ^ u64.rotrBH(Ah, Al, 34) ^ u64.rotrBH(Ah, Al, 39);\n const sigma0l = u64.rotrSL(Ah, Al, 28) ^ u64.rotrBL(Ah, Al, 34) ^ u64.rotrBL(Ah, Al, 39);\n const MAJh = (Ah & Bh) ^ (Ah & Ch) ^ (Bh & Ch);\n const MAJl = (Al & Bl) ^ (Al & Cl) ^ (Bl & Cl);\n Hh = Gh | 0;\n Hl = Gl | 0;\n Gh = Fh | 0;\n Gl = Fl | 0;\n Fh = Eh | 0;\n Fl = El | 0;\n ({ h: Eh, l: El } = u64.add(Dh | 0, Dl | 0, T1h | 0, T1l | 0));\n Dh = Ch | 0;\n Dl = Cl | 0;\n Ch = Bh | 0;\n Cl = Bl | 0;\n Bh = Ah | 0;\n Bl = Al | 0;\n const All = u64.add3L(T1l, sigma0l, MAJl);\n Ah = u64.add3H(All, T1h, sigma0h, MAJh);\n Al = All | 0;\n }\n // Add the compressed chunk to the current hash value\n ({ h: Ah, l: Al } = u64.add(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0));\n ({ h: Bh, l: Bl } = u64.add(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0));\n ({ h: Ch, l: Cl } = u64.add(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0));\n ({ h: Dh, l: Dl } = u64.add(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0));\n ({ h: Eh, l: El } = u64.add(this.Eh | 0, this.El | 0, Eh | 0, El | 0));\n ({ h: Fh, l: Fl } = u64.add(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0));\n ({ h: Gh, l: Gl } = u64.add(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0));\n ({ h: Hh, l: Hl } = u64.add(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0));\n this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl);\n }\n protected roundClean(): void {\n clean(SHA512_W_H, SHA512_W_L);\n }\n destroy(): void {\n clean(this.buffer);\n this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n }\n}\n\nexport class SHA384 extends SHA512 {\n protected Ah: number = SHA384_IV[0] | 0;\n protected Al: number = SHA384_IV[1] | 0;\n protected Bh: number = SHA384_IV[2] | 0;\n protected Bl: number = SHA384_IV[3] | 0;\n protected Ch: number = SHA384_IV[4] | 0;\n protected Cl: number = SHA384_IV[5] | 0;\n protected Dh: number = SHA384_IV[6] | 0;\n protected Dl: number = SHA384_IV[7] | 0;\n protected Eh: number = SHA384_IV[8] | 0;\n protected El: number = SHA384_IV[9] | 0;\n protected Fh: number = SHA384_IV[10] | 0;\n protected Fl: number = SHA384_IV[11] | 0;\n protected Gh: number = SHA384_IV[12] | 0;\n protected Gl: number = SHA384_IV[13] | 0;\n protected Hh: number = SHA384_IV[14] | 0;\n protected Hl: number = SHA384_IV[15] | 0;\n\n constructor() {\n super(48);\n }\n}\n\n/**\n * Truncated SHA512/256 and SHA512/224.\n * SHA512_IV is XORed with 0xa5a5a5a5a5a5a5a5, then used as \"intermediary\" IV of SHA512/t.\n * Then t hashes string to produce result IV.\n * See `test/misc/sha2-gen-iv.js`.\n */\n\n/** SHA512/224 IV */\nconst T224_IV = /* @__PURE__ */ Uint32Array.from([\n 0x8c3d37c8, 0x19544da2, 0x73e19966, 0x89dcd4d6, 0x1dfab7ae, 0x32ff9c82, 0x679dd514, 0x582f9fcf,\n 0x0f6d2b69, 0x7bd44da8, 0x77e36f73, 0x04c48942, 0x3f9d85a8, 0x6a1d36c8, 0x1112e6ad, 0x91d692a1,\n]);\n\n/** SHA512/256 IV */\nconst T256_IV = /* @__PURE__ */ Uint32Array.from([\n 0x22312194, 0xfc2bf72c, 0x9f555fa3, 0xc84c64c2, 0x2393b86b, 0x6f53b151, 0x96387719, 0x5940eabd,\n 0x96283ee2, 0xa88effe3, 0xbe5e1e25, 0x53863992, 0x2b0199fc, 0x2c85b8aa, 0x0eb72ddc, 0x81c52ca2,\n]);\n\nexport class SHA512_224 extends SHA512 {\n protected Ah: number = T224_IV[0] | 0;\n protected Al: number = T224_IV[1] | 0;\n protected Bh: number = T224_IV[2] | 0;\n protected Bl: number = T224_IV[3] | 0;\n protected Ch: number = T224_IV[4] | 0;\n protected Cl: number = T224_IV[5] | 0;\n protected Dh: number = T224_IV[6] | 0;\n protected Dl: number = T224_IV[7] | 0;\n protected Eh: number = T224_IV[8] | 0;\n protected El: number = T224_IV[9] | 0;\n protected Fh: number = T224_IV[10] | 0;\n protected Fl: number = T224_IV[11] | 0;\n protected Gh: number = T224_IV[12] | 0;\n protected Gl: number = T224_IV[13] | 0;\n protected Hh: number = T224_IV[14] | 0;\n protected Hl: number = T224_IV[15] | 0;\n\n constructor() {\n super(28);\n }\n}\n\nexport class SHA512_256 extends SHA512 {\n protected Ah: number = T256_IV[0] | 0;\n protected Al: number = T256_IV[1] | 0;\n protected Bh: number = T256_IV[2] | 0;\n protected Bl: number = T256_IV[3] | 0;\n protected Ch: number = T256_IV[4] | 0;\n protected Cl: number = T256_IV[5] | 0;\n protected Dh: number = T256_IV[6] | 0;\n protected Dl: number = T256_IV[7] | 0;\n protected Eh: number = T256_IV[8] | 0;\n protected El: number = T256_IV[9] | 0;\n protected Fh: number = T256_IV[10] | 0;\n protected Fl: number = T256_IV[11] | 0;\n protected Gh: number = T256_IV[12] | 0;\n protected Gl: number = T256_IV[13] | 0;\n protected Hh: number = T256_IV[14] | 0;\n protected Hl: number = T256_IV[15] | 0;\n\n constructor() {\n super(32);\n }\n}\n\n/**\n * SHA2-256 hash function from RFC 4634.\n *\n * It is the fastest JS hash, even faster than Blake3.\n * To break sha256 using birthday attack, attackers need to try 2^128 hashes.\n * BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n */\nexport const sha256: CHash = /* @__PURE__ */ createHasher(() => new SHA256());\n/** SHA2-224 hash function from RFC 4634 */\nexport const sha224: CHash = /* @__PURE__ */ createHasher(() => new SHA224());\n\n/** SHA2-512 hash function from RFC 4634. */\nexport const sha512: CHash = /* @__PURE__ */ createHasher(() => new SHA512());\n/** SHA2-384 hash function from RFC 4634. */\nexport const sha384: CHash = /* @__PURE__ */ createHasher(() => new SHA384());\n\n/**\n * SHA2-512/256 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_256: CHash = /* @__PURE__ */ createHasher(() => new SHA512_256());\n/**\n * SHA2-512/224 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_224: CHash = /* @__PURE__ */ createHasher(() => new SHA512_224());\n","import { verify } from '@noble/ed25519';\nimport { sha512 } from '@noble/hashes/sha2.js';\nimport { toCanonicalJson } from './canonicalJson.js';\nimport { CerVerifyCode } from './types.js';\nimport type { NodeKeysDocument, SignedAttestationReceipt, NodeReceiptVerifyResult } from './types.js';\n\nimport { hashes } from '@noble/ed25519';\nhashes.sha512 = sha512;\n\nfunction base64urlToBytes(s: string): Uint8Array {\n const pad = s.length % 4;\n const base64 = s.replace(/-/g, '+').replace(/_/g, '/') + (pad ? '='.repeat(4 - pad) : '');\n if (typeof Buffer !== 'undefined') {\n return new Uint8Array(Buffer.from(base64, 'base64'));\n }\n const binary = atob(base64);\n return Uint8Array.from(binary, (c) => c.charCodeAt(0));\n}\n\nexport async function verifyNodeReceiptSignature(params: {\n receipt: SignedAttestationReceipt;\n signatureB64Url: string;\n key: {\n jwk?: NodeKeysDocument['keys'][number]['publicKeyJwk'];\n spkiB64?: string;\n rawB64Url?: string;\n };\n}): Promise<NodeReceiptVerifyResult> {\n try {\n const { receipt, signatureB64Url, key } = params;\n\n let pubKeyBytes: Uint8Array;\n\n if (key.jwk) {\n if (key.jwk.kty !== 'OKP' || key.jwk.crv !== 'Ed25519') {\n return {\n ok: false,\n code: CerVerifyCode.ATTESTATION_KEY_FORMAT_UNSUPPORTED,\n details: [\n `JWK must have kty=OKP and crv=Ed25519, got kty=${key.jwk.kty} crv=${key.jwk.crv}`,\n ],\n };\n }\n pubKeyBytes = base64urlToBytes(key.jwk.x);\n } else if (key.rawB64Url) {\n pubKeyBytes = base64urlToBytes(key.rawB64Url);\n } else if (key.spkiB64) {\n const spkiBytes = base64urlToBytes(key.spkiB64);\n if (spkiBytes.length < 32) {\n return {\n ok: false,\n code: CerVerifyCode.ATTESTATION_KEY_FORMAT_UNSUPPORTED,\n details: ['SPKI key too short to extract Ed25519 public key'],\n };\n }\n pubKeyBytes = spkiBytes.slice(spkiBytes.length - 32);\n } else {\n return {\n ok: false,\n code: CerVerifyCode.ATTESTATION_KEY_FORMAT_UNSUPPORTED,\n details: ['No usable key provided: supply jwk, rawB64Url, or spkiB64'],\n };\n }\n\n if (pubKeyBytes.length !== 32) {\n return {\n ok: false,\n code: CerVerifyCode.ATTESTATION_KEY_FORMAT_UNSUPPORTED,\n details: [`Ed25519 public key must be 32 bytes, got ${pubKeyBytes.length}`],\n };\n }\n\n const sigBytes = base64urlToBytes(signatureB64Url);\n\n if (sigBytes.length !== 64) {\n return {\n ok: false,\n code: CerVerifyCode.ATTESTATION_INVALID_SIGNATURE,\n details: [`Ed25519 signature must be 64 bytes, got ${sigBytes.length}`],\n };\n }\n\n const msgBytes = new TextEncoder().encode(toCanonicalJson(receipt));\n\n const isValid = await verify(sigBytes, msgBytes, pubKeyBytes);\n\n if (!isValid) {\n return {\n ok: false,\n code: CerVerifyCode.ATTESTATION_INVALID_SIGNATURE,\n details: ['Ed25519 signature verification failed'],\n };\n }\n\n return { ok: true, code: CerVerifyCode.OK };\n } catch (err) {\n return {\n ok: false,\n code: CerVerifyCode.ATTESTATION_INVALID_SIGNATURE,\n details: [err instanceof Error ? err.message : String(err)],\n };\n }\n}\n\nexport async function fetchNodeKeys(nodeUrl: string): Promise<NodeKeysDocument> {\n const url = `${nodeUrl.replace(/\\/+$/, '')}/.well-known/nexart-node.json`;\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch node keys from ${url}: HTTP ${response.status}`);\n }\n const data = await response.json() as unknown;\n if (typeof data !== 'object' || data === null) {\n throw new Error('Node keys response is not an object');\n }\n const doc = data as Record<string, unknown>;\n if (typeof doc.nodeId !== 'string' || !Array.isArray(doc.keys)) {\n throw new Error('Node keys document missing required fields (nodeId, keys)');\n }\n return data as NodeKeysDocument;\n}\n\ntype SelectKeySuccess = { key: NodeKeysDocument['keys'][number]; error?: never };\ntype SelectKeyFailure = { error: NodeReceiptVerifyResult; key?: never };\ntype SelectKeyResult = SelectKeySuccess | SelectKeyFailure;\n\nexport function selectNodeKey(doc: NodeKeysDocument, kid?: string): SelectKeyResult {\n if (kid) {\n const found = doc.keys.find((k) => k.kid === kid);\n if (!found) {\n return {\n error: {\n ok: false,\n code: CerVerifyCode.ATTESTATION_KEY_NOT_FOUND,\n details: [`Key with kid=\"${kid}\" not found in node keys document`],\n },\n };\n }\n return { key: found };\n }\n\n if (doc.activeKid) {\n const found = doc.keys.find((k) => k.kid === doc.activeKid);\n if (!found) {\n return {\n error: {\n ok: false,\n code: CerVerifyCode.ATTESTATION_KEY_NOT_FOUND,\n details: [`activeKid=\"${doc.activeKid}\" not found in keys array`],\n },\n };\n }\n return { key: found };\n }\n\n if (doc.keys.length === 0) {\n return {\n error: {\n ok: false,\n code: CerVerifyCode.ATTESTATION_KEY_NOT_FOUND,\n details: ['No keys available in node keys document'],\n },\n };\n }\n\n return { key: doc.keys[0] };\n}\n\nfunction extractReceiptAndSignature(bundle: unknown): {\n receipt: SignedAttestationReceipt;\n signatureB64Url: string;\n attestorKeyId?: string;\n} | null {\n if (typeof bundle !== 'object' || bundle === null) return null;\n const b = bundle as Record<string, unknown>;\n\n if (typeof b.receipt === 'object' && b.receipt !== null && typeof b.signature === 'string') {\n return {\n receipt: b.receipt as SignedAttestationReceipt,\n signatureB64Url: b.signature,\n attestorKeyId: typeof b.attestorKeyId === 'string' ? b.attestorKeyId : undefined,\n };\n }\n\n if (typeof b.meta === 'object' && b.meta !== null) {\n const meta = b.meta as Record<string, unknown>;\n if (typeof meta.attestation === 'object' && meta.attestation !== null) {\n const att = meta.attestation as Record<string, unknown>;\n if (typeof att.receipt === 'object' && att.receipt !== null && typeof att.signature === 'string') {\n return {\n receipt: att.receipt as SignedAttestationReceipt,\n signatureB64Url: att.signature,\n attestorKeyId: typeof att.attestorKeyId === 'string' ? att.attestorKeyId : undefined,\n };\n }\n }\n }\n\n return null;\n}\n\nexport async function verifyBundleAttestation(\n bundle: unknown,\n options: { nodeUrl: string; kid?: string },\n): Promise<NodeReceiptVerifyResult> {\n const extracted = extractReceiptAndSignature(bundle);\n\n if (!extracted) {\n return {\n ok: false,\n code: CerVerifyCode.ATTESTATION_MISSING,\n details: ['No signed receipt found in bundle (expected bundle.receipt + bundle.signature)'],\n };\n }\n\n const nodeId = extracted.receipt.nodeId;\n const resolvedKid = options.kid ?? extracted.attestorKeyId ?? extracted.receipt.attestorKeyId;\n\n function ctx(): string[] {\n const lines: string[] = [];\n if (nodeId) lines.push(`nodeId: ${nodeId}`);\n if (resolvedKid) lines.push(`kid: ${resolvedKid}`);\n return lines;\n }\n\n let keysDoc: NodeKeysDocument;\n try {\n keysDoc = await fetchNodeKeys(options.nodeUrl);\n } catch (err) {\n return {\n ok: false,\n code: CerVerifyCode.ATTESTATION_KEY_NOT_FOUND,\n details: [...ctx(), err instanceof Error ? err.message : String(err)],\n };\n }\n\n if (typeof (bundle as Record<string, unknown>).certificateHash === 'string') {\n const bundleCertHash = (bundle as Record<string, unknown>).certificateHash as string;\n if (extracted.receipt.certificateHash !== bundleCertHash) {\n return {\n ok: false,\n code: CerVerifyCode.CERTIFICATE_HASH_MISMATCH,\n details: [\n `Receipt certificateHash does not match bundle certificateHash`,\n `receipt.certificateHash: ${extracted.receipt.certificateHash}`,\n `bundle.certificateHash: ${bundleCertHash}`,\n ...ctx(),\n ],\n };\n }\n }\n\n const selected = selectNodeKey(keysDoc, resolvedKid);\n if (selected.error) {\n return {\n ...selected.error,\n details: [...ctx(), ...(selected.error.details ?? [])],\n };\n }\n const keyEntry = selected.key;\n\n const keyParam: Parameters<typeof verifyNodeReceiptSignature>[0]['key'] = {};\n if (keyEntry.publicKeyJwk) keyParam.jwk = keyEntry.publicKeyJwk;\n else if (keyEntry.publicKey) keyParam.rawB64Url = keyEntry.publicKey;\n else if (keyEntry.publicKeySpkiB64) keyParam.spkiB64 = keyEntry.publicKeySpkiB64;\n else {\n return {\n ok: false,\n code: CerVerifyCode.ATTESTATION_KEY_FORMAT_UNSUPPORTED,\n details: [\n `Key kid=\"${keyEntry.kid}\" has no usable public key field (publicKeyJwk, publicKey, or publicKeySpkiB64)`,\n ...ctx(),\n ],\n };\n }\n\n const sigResult = await verifyNodeReceiptSignature({\n receipt: extracted.receipt,\n signatureB64Url: extracted.signatureB64Url,\n key: keyParam,\n });\n\n const contextLines = ctx();\n if (contextLines.length === 0) return sigResult;\n\n return sigResult.ok\n ? { ok: true, code: CerVerifyCode.OK, details: contextLines }\n : { ...sigResult, details: [...contextLines, ...(sigResult.details ?? [])] };\n}\n","/**\n * @nexart/ai-execution — certifyDecisionFromProviderCall (v0.6.0)\n *\n * High-level one-function wrapper for common AI provider call patterns.\n * Extracts prompt / input / output / parameters from raw request+response\n * objects and produces a sealed CerAiExecutionBundle.\n *\n * Supported providers: openai, anthropic, mistral, gemini, bedrock, + generic.\n *\n * Returns { ok: true, bundle } on success.\n * Returns { ok: false, code: 'SCHEMA_ERROR', reason } when a required field\n * cannot be extracted — never silently guesses.\n */\n\nimport * as crypto from 'crypto';\nimport type { CerAiExecutionBundle, CerMeta } from './types.js';\nimport { CerVerifyCode } from './types.js';\nimport { createSnapshot } from './snapshot.js';\nimport { sealCer } from './cer.js';\nimport { extractFromProviderCall } from './providerExtract.js';\n\nexport interface ProviderCallParams {\n provider: string;\n model?: string;\n request: Record<string, unknown>;\n response: Record<string, unknown>;\n meta?: CerMeta;\n executionId?: string;\n timestamp?: string;\n /** CER creation timestamp. Defaults to current time if omitted. */\n createdAt?: string;\n appId?: string | null;\n workflowId?: string | null;\n conversationId?: string | null;\n}\n\nexport type ProviderCallResult =\n | { ok: true; bundle: CerAiExecutionBundle }\n | { ok: false; code: typeof CerVerifyCode.SCHEMA_ERROR; reason: string };\n\n/**\n * Certify an AI provider call from raw request + response objects.\n *\n * @example\n * ```typescript\n * const res = certifyDecisionFromProviderCall({\n * provider: 'openai',\n * request: { model: 'gpt-4o', messages: [...] },\n * response: { choices: [{ message: { content: 'Hello' } }] },\n * });\n * if (res.ok) console.log(res.bundle.certificateHash);\n * else console.error(res.reason);\n * ```\n */\nexport function certifyDecisionFromProviderCall(params: ProviderCallParams): ProviderCallResult {\n const extracted = extractFromProviderCall(\n params.provider,\n params.model,\n params.request,\n params.response,\n );\n\n if (!extracted.ok) {\n return { ok: false, code: CerVerifyCode.SCHEMA_ERROR, reason: extracted.reason };\n }\n\n const { model, modelVersion, prompt, input, output, parameters } = extracted.data;\n\n try {\n const snapshot = createSnapshot({\n executionId: params.executionId ?? crypto.randomUUID(),\n timestamp: params.timestamp,\n provider: params.provider,\n model,\n modelVersion,\n prompt,\n input,\n parameters,\n output,\n appId: params.appId ?? null,\n workflowId: params.workflowId ?? null,\n conversationId: params.conversationId ?? null,\n });\n\n const bundle = sealCer(snapshot, { meta: params.meta, createdAt: params.createdAt });\n return { ok: true, bundle };\n } catch (err) {\n return {\n ok: false,\n code: CerVerifyCode.SCHEMA_ERROR,\n reason: err instanceof Error ? err.message : String(err),\n };\n }\n}\n","/**\n * @nexart/ai-execution — Provider-Agnostic Extraction (v0.6.0)\n *\n * Best-effort extraction of prompt / input / output / parameters\n * from raw provider request + response objects.\n *\n * Supported shapes (in detection order):\n * OpenAI / Mistral — response.choices[n].message.content\n * Anthropic — response.content[n].text\n * Gemini — response.candidates[n].content.parts[n].text\n * Bedrock wrapper — request.modelId + body unwrap\n * Generic fallback — response.text | response.output | response.output_text\n *\n * Rules:\n * - Never silently guess; return SCHEMA_ERROR with a reason string when\n * a required field cannot be determined.\n * - Do NOT recompute existing hashes.\n * - All extraction is read-only.\n */\n\nimport type { AiExecutionParameters } from './types.js';\n\nexport interface ExtractedCall {\n model: string;\n prompt: string;\n input: string | Record<string, unknown>;\n output: string | Record<string, unknown>;\n parameters: AiExecutionParameters;\n modelVersion: string | null;\n}\n\nexport type ExtractResult =\n | { ok: true; data: ExtractedCall }\n | { ok: false; reason: string };\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Internal helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction str(v: unknown): string | null {\n return typeof v === 'string' && v.length > 0 ? v : null;\n}\n\nfunction num(v: unknown, fallback: number): number {\n return typeof v === 'number' && Number.isFinite(v) ? v : fallback;\n}\n\nfunction numOrNull(v: unknown): number | null {\n return typeof v === 'number' && Number.isFinite(v) ? v : null;\n}\n\n/** OpenAI / Mistral: response.choices[0].message.content */\nfunction extractChoicesOutput(response: Record<string, unknown>): string | null {\n const choices = response.choices;\n if (!Array.isArray(choices) || choices.length === 0) return null;\n const first = choices[0] as Record<string, unknown> | null;\n if (!first || typeof first !== 'object') return null;\n const msg = first.message as Record<string, unknown> | null;\n if (!msg || typeof msg !== 'object') return null;\n // content can be string or array of content parts\n if (typeof msg.content === 'string') return msg.content;\n if (Array.isArray(msg.content)) {\n const texts = (msg.content as unknown[])\n .filter((p): p is Record<string, unknown> => typeof p === 'object' && p !== null)\n .map((p) => str((p as Record<string, unknown>).text))\n .filter((t): t is string => t !== null);\n return texts.length > 0 ? texts.join('\\n') : null;\n }\n return null;\n}\n\n/** Anthropic: response.content[0].text */\nfunction extractAnthropicOutput(response: Record<string, unknown>): string | null {\n const content = response.content;\n if (!Array.isArray(content) || content.length === 0) return null;\n const first = content[0] as Record<string, unknown> | null;\n if (!first || typeof first !== 'object') return null;\n return str(first.text);\n}\n\n/** Gemini: response.candidates[0].content.parts[0].text */\nfunction extractGeminiOutput(response: Record<string, unknown>): string | null {\n const candidates = response.candidates;\n if (!Array.isArray(candidates) || candidates.length === 0) return null;\n const first = candidates[0] as Record<string, unknown> | null;\n if (!first || typeof first !== 'object') return null;\n const contentObj = first.content as Record<string, unknown> | null;\n if (!contentObj || typeof contentObj !== 'object') return null;\n const parts = contentObj.parts;\n if (!Array.isArray(parts) || parts.length === 0) return null;\n const part = parts[0] as Record<string, unknown> | null;\n if (!part || typeof part !== 'object') return null;\n return str(part.text);\n}\n\n/** Generic fallback: text | output | output_text | result */\nfunction extractGenericOutput(response: Record<string, unknown>): string | null {\n return (\n str(response.text) ??\n str(response.output_text) ??\n (typeof response.output === 'string' ? response.output : null) ??\n str(response.result) ??\n null\n );\n}\n\n/** Extract output text from any response shape */\nfunction extractOutput(response: Record<string, unknown>): string | null {\n return (\n extractChoicesOutput(response) ??\n extractAnthropicOutput(response) ??\n extractGeminiOutput(response) ??\n extractGenericOutput(response)\n );\n}\n\n/** Extract messages array as the canonical input representation */\nfunction extractInput(request: Record<string, unknown>): string | Record<string, unknown> | null {\n // messages array (OpenAI / Anthropic / Mistral) — wrapped to satisfy Record<string,unknown>\n if (Array.isArray(request.messages) && request.messages.length > 0) {\n return { messages: request.messages };\n }\n // Gemini: contents array — wrapped\n if (Array.isArray(request.contents) && request.contents.length > 0) {\n return { contents: request.contents };\n }\n // Direct prompt string\n if (typeof request.prompt === 'string') return request.prompt;\n // Direct input field\n if (typeof request.input === 'string') return request.input;\n if (typeof request.input === 'object' && request.input !== null) {\n return request.input as Record<string, unknown>;\n }\n return null;\n}\n\n/** Derive human-readable prompt string from input for snapshot.prompt */\nfunction derivePrompt(request: Record<string, unknown>): string | null {\n if (typeof request.prompt === 'string') return request.prompt;\n // Last user message from messages\n if (Array.isArray(request.messages)) {\n const msgs = request.messages as Array<Record<string, unknown>>;\n for (let i = msgs.length - 1; i >= 0; i--) {\n const msg = msgs[i];\n if (msg.role === 'user' || msg.role === 'human') {\n const content = msg.content;\n if (typeof content === 'string') return content;\n if (Array.isArray(content)) {\n const text = content\n .filter((p): p is Record<string, unknown> => typeof p === 'object' && p !== null)\n .map((p) => str(p.text))\n .filter((t): t is string => t !== null)\n .join('\\n');\n if (text) return text;\n }\n }\n }\n }\n // Gemini: last user content\n if (Array.isArray(request.contents)) {\n const contents = request.contents as Array<Record<string, unknown>>;\n for (let i = contents.length - 1; i >= 0; i--) {\n const c = contents[i];\n if (c.role === 'user') {\n const parts = c.parts;\n if (Array.isArray(parts)) {\n const text = (parts as Array<Record<string, unknown>>)\n .map((p) => str(p.text))\n .filter((t): t is string => t !== null)\n .join('\\n');\n if (text) return text;\n }\n }\n }\n }\n return null;\n}\n\n/** Extract AiExecutionParameters from a request object */\nfunction extractParams(request: Record<string, unknown>): AiExecutionParameters {\n // Handle Gemini generationConfig nesting\n const cfg =\n typeof request.generationConfig === 'object' && request.generationConfig !== null\n ? (request.generationConfig as Record<string, unknown>)\n : request;\n\n return {\n temperature: num(cfg.temperature, 1.0),\n maxTokens: num(cfg.max_tokens ?? cfg.maxTokens ?? cfg.maxOutputTokens ?? cfg.max_output_tokens, 1024),\n topP: numOrNull(cfg.top_p ?? cfg.topP),\n seed: numOrNull(cfg.seed),\n };\n}\n\n/** Extract model from request or response */\nfunction extractModel(\n providerHint: string,\n request: Record<string, unknown>,\n response: Record<string, unknown>,\n override?: string,\n): { model: string; modelVersion: string | null } | null {\n const raw =\n override ??\n str(request.model) ??\n str(request.modelId) ?? // Bedrock\n str(response.model) ??\n str(response.modelId) ??\n null;\n\n if (!raw) return null;\n\n // Attempt to split \"provider/model-version\" style strings\n const parts = raw.split('/');\n const modelName = parts[parts.length - 1];\n const modelVersion = str(response.model_version ?? response.modelVersion) ?? null;\n\n return { model: modelName, modelVersion };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Bedrock unwrap\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction tryUnwrapBedrock(\n request: Record<string, unknown>,\n): { req: Record<string, unknown>; modelId: string } | null {\n const modelId = str(request.modelId);\n if (!modelId) return null;\n\n // body may be a JSON string or an object\n let body: Record<string, unknown> = {};\n if (typeof request.body === 'string') {\n try { body = JSON.parse(request.body); } catch { body = {}; }\n } else if (typeof request.body === 'object' && request.body !== null) {\n body = request.body as Record<string, unknown>;\n }\n\n return { req: { ...body, modelId }, modelId };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Public extraction entry point\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function extractFromProviderCall(\n provider: string,\n modelOverride: string | undefined,\n rawRequest: Record<string, unknown>,\n rawResponse: Record<string, unknown>,\n): ExtractResult {\n // Bedrock: unwrap request body before extracting\n let request = rawRequest;\n if (provider === 'bedrock' || str(rawRequest.modelId)) {\n const unwrapped = tryUnwrapBedrock(rawRequest);\n if (unwrapped) request = unwrapped.req;\n }\n\n // Model\n const modelResult = extractModel(provider, request, rawResponse, modelOverride);\n if (!modelResult) {\n return {\n ok: false,\n reason:\n 'Could not determine model name. Provide it via the `model` field, ' +\n 'or ensure request.model / request.modelId is present.',\n };\n }\n\n // Input\n const input = extractInput(request);\n if (input === null) {\n return {\n ok: false,\n reason:\n 'Could not extract input. Expected request.messages (OpenAI/Anthropic/Mistral), ' +\n 'request.contents (Gemini), or request.prompt/request.input (generic).',\n };\n }\n\n // Prompt\n const prompt = derivePrompt(request) ?? (typeof input === 'string' ? input : '[structured input]');\n\n // Output\n const output = extractOutput(rawResponse);\n if (output === null) {\n return {\n ok: false,\n reason:\n 'Could not extract output text. Expected response.choices[0].message.content (OpenAI/Mistral), ' +\n 'response.content[0].text (Anthropic), response.candidates[0].content.parts[0].text (Gemini), ' +\n 'or response.text / response.output_text (generic).',\n };\n }\n\n // Parameters\n const parameters = extractParams(request);\n\n return {\n ok: true,\n data: {\n model: modelResult.model,\n modelVersion: modelResult.modelVersion,\n prompt,\n input,\n output,\n parameters,\n },\n };\n}\n","/**\n * @nexart/ai-execution — createClient factory (v0.6.0)\n *\n * Returns a configured client with opinionated defaults applied to every call.\n * Defaults NEVER affect bundle hashing — they are only injected into snapshot\n * fields (appId, workflowId) and attestation options (nodeUrl, apiKey).\n *\n * Usage:\n * const client = createClient({ appId: 'my-app', nodeUrl: 'https://...' });\n * const bundle = client.certifyDecision({ provider, model, ... });\n * const result = await client.verify(bundle);\n */\n\nimport type {\n CerAiExecutionBundle,\n CertifyDecisionParams,\n AttestOptions,\n AttestationReceipt,\n VerificationResult,\n NodeReceiptVerifyResult,\n CerMeta,\n} from './types.js';\nimport { certifyDecision } from './certify.js';\nimport { certifyAndAttestDecision } from './wrappers.js';\nimport { verifyCer } from './cer.js';\nimport { verifyBundleAttestation } from './nodeReceipt.js';\n\nexport interface ClientDefaults {\n appId?: string | null;\n workflowId?: string | null;\n nodeUrl?: string;\n apiKey?: string | (() => string | Promise<string>);\n tags?: string[];\n source?: string;\n}\n\nexport interface NexArtClient {\n certifyDecision(params: CertifyDecisionParams): CerAiExecutionBundle;\n certifyAndAttestDecision(\n params: CertifyDecisionParams,\n options?: Partial<AttestOptions>,\n ): Promise<{ bundle: CerAiExecutionBundle; receipt: AttestationReceipt }>;\n verify(bundle: CerAiExecutionBundle): VerificationResult;\n verifyBundleAttestation(\n bundle: unknown,\n options?: { nodeUrl?: string; kid?: string },\n ): Promise<NodeReceiptVerifyResult>;\n}\n\nasync function resolveApiKey(\n key: ClientDefaults['apiKey'],\n): Promise<string> {\n if (typeof key === 'function') return key();\n return key ?? '';\n}\n\nfunction mergeDefaultMeta(defaults: ClientDefaults, meta?: CerMeta): CerMeta | undefined {\n const base: CerMeta = {};\n if (defaults.tags && defaults.tags.length > 0) base.tags = defaults.tags;\n if (defaults.source) base.source = defaults.source;\n if (!meta && Object.keys(base).length === 0) return undefined;\n return { ...base, ...meta };\n}\n\n/**\n * Create a pre-configured client that applies defaults to every operation.\n *\n * @param defaults — Shared configuration applied to all client calls.\n */\nexport function createClient(defaults: ClientDefaults = {}): NexArtClient {\n return {\n certifyDecision(params: CertifyDecisionParams): CerAiExecutionBundle {\n return certifyDecision({\n appId: defaults.appId ?? null,\n workflowId: defaults.workflowId ?? null,\n ...params,\n meta: mergeDefaultMeta(defaults, params.meta),\n });\n },\n\n async certifyAndAttestDecision(\n params: CertifyDecisionParams,\n options?: Partial<AttestOptions>,\n ): Promise<{ bundle: CerAiExecutionBundle; receipt: AttestationReceipt }> {\n const nodeUrl = options?.nodeUrl ?? defaults.nodeUrl;\n if (!nodeUrl) {\n throw new Error('certifyAndAttestDecision requires nodeUrl (set in defaults or options)');\n }\n const apiKey = options?.apiKey ?? (await resolveApiKey(defaults.apiKey));\n\n const mergedParams: CertifyDecisionParams = {\n appId: defaults.appId ?? null,\n workflowId: defaults.workflowId ?? null,\n ...params,\n meta: mergeDefaultMeta(defaults, params.meta),\n };\n\n return certifyAndAttestDecision(mergedParams, {\n nodeUrl,\n apiKey,\n timeoutMs: options?.timeoutMs,\n });\n },\n\n verify(bundle: CerAiExecutionBundle): VerificationResult {\n return verifyCer(bundle);\n },\n\n async verifyBundleAttestation(\n bundle: unknown,\n options?: { nodeUrl?: string; kid?: string },\n ): Promise<NodeReceiptVerifyResult> {\n const nodeUrl = options?.nodeUrl ?? defaults.nodeUrl;\n if (!nodeUrl) {\n throw new Error('verifyBundleAttestation requires nodeUrl (set in defaults or options)');\n }\n return verifyBundleAttestation(bundle, { nodeUrl, kid: options?.kid });\n },\n };\n}\n","/**\n * @nexart/ai-execution — AIEF §9 verifier adapter (v0.7.0)\n *\n * Provides verifyAief() which wraps the existing verifyCer() and returns the\n * exact AIEF §9.1 output schema required for cross-vendor verifier interoperability.\n *\n * Existing verify() / verifyCer() output is unchanged — this is additive only.\n */\n\nimport type { CerAiExecutionBundle, AiefVerifyResult } from './types.js';\nimport { CerVerifyCode } from './types.js';\nimport { verifyCer } from './cer.js';\n\nconst AIEF_REASON_MAP: Readonly<Record<string, string>> = {\n [CerVerifyCode.OK]: 'ok',\n [CerVerifyCode.CERTIFICATE_HASH_MISMATCH]: 'integrityProofMismatch',\n [CerVerifyCode.SNAPSHOT_HASH_MISMATCH]: 'integrityProofMismatch',\n [CerVerifyCode.INPUT_HASH_MISMATCH]: 'integrityProofMismatch',\n [CerVerifyCode.OUTPUT_HASH_MISMATCH]: 'integrityProofMismatch',\n [CerVerifyCode.TOOL_OUTPUT_HASH_MISMATCH]: 'integrityProofMismatch',\n [CerVerifyCode.SCHEMA_ERROR]: 'unsupportedSchema',\n [CerVerifyCode.CANONICALIZATION_ERROR]: 'malformedArtifact',\n [CerVerifyCode.INVALID_SHA256_FORMAT]: 'malformedArtifact',\n [CerVerifyCode.UNKNOWN_ERROR]: 'malformedArtifact',\n [CerVerifyCode.INCOMPLETE_ARTIFACT]: 'incompleteArtifact',\n [CerVerifyCode.CHAIN_BREAK_DETECTED]: 'chainBreakDetected',\n [CerVerifyCode.VERIFICATION_MATERIAL_UNAVAILABLE]: 'verificationMaterialUnavailable',\n [CerVerifyCode.TOOL_EVIDENCE_MISSING]: 'incompleteArtifact',\n [CerVerifyCode.ATTESTATION_INVALID_SIGNATURE]: 'signatureInvalid',\n [CerVerifyCode.ATTESTATION_MISSING]: 'verificationMaterialUnavailable',\n [CerVerifyCode.ATTESTATION_KEY_NOT_FOUND]: 'verificationMaterialUnavailable',\n [CerVerifyCode.ATTESTATION_KEY_FORMAT_UNSUPPORTED]: 'verificationMaterialUnavailable',\n} as const;\n\nconst INTEGRITY_FAILURE_CODES = new Set<string>([\n CerVerifyCode.CERTIFICATE_HASH_MISMATCH,\n CerVerifyCode.SNAPSHOT_HASH_MISMATCH,\n CerVerifyCode.INPUT_HASH_MISMATCH,\n CerVerifyCode.OUTPUT_HASH_MISMATCH,\n CerVerifyCode.TOOL_OUTPUT_HASH_MISMATCH,\n]);\n\nconst SCHEMA_FAILURE_CODES = new Set<string>([\n CerVerifyCode.SCHEMA_ERROR,\n CerVerifyCode.CANONICALIZATION_ERROR,\n CerVerifyCode.INVALID_SHA256_FORMAT,\n CerVerifyCode.UNKNOWN_ERROR,\n CerVerifyCode.INCOMPLETE_ARTIFACT,\n]);\n\n/**\n * Map a NexArt CerVerifyCode to an AIEF §9.2 reason string.\n * Unknown codes fall back to \"malformedArtifact\".\n */\nexport function mapToAiefReason(code: string): string {\n return AIEF_REASON_MAP[code] ?? 'malformedArtifact';\n}\n\n/**\n * Verify a CER bundle and return the exact AIEF §9.1 output shape.\n *\n * This wraps verifyCer() — hashing logic is not duplicated.\n * The internal NexArt verify() output is unchanged; this is purely an adapter.\n *\n * Per AIEF §9.0 rule #7: if chain fields are absent, chainValid MUST be true.\n */\nexport function verifyAief(bundle: CerAiExecutionBundle): AiefVerifyResult {\n const inner = verifyCer(bundle);\n\n if (inner.ok) {\n return {\n result: 'PASS',\n reason: null,\n checks: {\n schemaSupported: true,\n integrityValid: true,\n protectedSetValid: true,\n chainValid: true,\n },\n };\n }\n\n const aiefReason = mapToAiefReason(inner.code);\n\n const isIntegrityFailure = INTEGRITY_FAILURE_CODES.has(inner.code);\n const isSchemaFailure = SCHEMA_FAILURE_CODES.has(inner.code);\n const isChainFailure = inner.code === CerVerifyCode.CHAIN_BREAK_DETECTED;\n\n const result: AiefVerifyResult = {\n result: 'FAIL',\n reason: aiefReason,\n checks: {\n schemaSupported: !isSchemaFailure,\n integrityValid: !isIntegrityFailure,\n protectedSetValid: !isIntegrityFailure,\n chainValid: !isChainFailure,\n },\n };\n\n if (inner.details && inner.details.length > 0) {\n result.notes = inner.details;\n } else if (inner.errors.length > 0) {\n result.notes = inner.errors;\n }\n\n return result;\n}\n","/**\n * @nexart/ai-execution — Level 4 tool/dependency evidence helpers (v0.7.0)\n *\n * Provides hashToolOutput() and makeToolEvent() for building AIEF-06 compliant\n * tool call evidence records to include in AiExecutionSnapshotV1.toolCalls.\n */\n\nimport { hashUtf8, hashCanonicalJson } from './hash.js';\nimport type { ToolEvent } from './types.js';\n\n/**\n * Hash a tool output value for use as `outputHash` in a ToolEvent.\n *\n * - string → SHA-256 of UTF-8 bytes\n * - anything else → SHA-256 of stable canonical JSON bytes\n *\n * Returns \"sha256:<64hex>\" format.\n */\nexport function hashToolOutput(value: unknown): string {\n if (typeof value === 'string') {\n return hashUtf8(value);\n }\n return hashCanonicalJson(value);\n}\n\nexport interface MakeToolEventParams {\n toolId: string;\n output: unknown;\n at?: string;\n input?: unknown;\n evidenceRef?: string;\n error?: string;\n}\n\n/**\n * Build a ToolEvent record for inclusion in snapshot.toolCalls.\n *\n * The outputHash is computed by hashToolOutput(output) so it is always consistent.\n * Optionally computes inputHash if `input` is provided.\n * If `at` is omitted, the current time is used.\n */\nexport function makeToolEvent(params: MakeToolEventParams): ToolEvent {\n const at = params.at ?? new Date().toISOString();\n const outputHash = hashToolOutput(params.output);\n\n const event: ToolEvent = {\n toolId: params.toolId,\n at,\n outputHash,\n };\n\n if (params.input !== undefined) {\n event.inputHash = hashToolOutput(params.input);\n }\n\n if (params.evidenceRef !== undefined) {\n event.evidenceRef = params.evidenceRef;\n }\n\n if (params.error !== undefined) {\n event.error = params.error;\n }\n\n return event;\n}\n","/**\n * @nexart/ai-execution — Level 4 chain integrity verification (v0.7.0)\n *\n * Provides verifyRunSummary() for validating multi-step RunBuilder outputs against\n * AIEF-07 requirements: detects insertion, deletion, and reordering of steps.\n */\n\nimport type { RunSummary, CerAiExecutionBundle, RunSummaryVerifyResult } from './types.js';\nimport { CerVerifyCode } from './types.js';\nimport { verifyCer } from './cer.js';\n\nexport interface VerifyRunSummaryOptions {\n /** Skip per-bundle certificateHash verification (use only if already verified separately). */\n skipBundleVerification?: boolean;\n}\n\n/**\n * Verify that a RunSummary and its corresponding step bundles form a valid,\n * unbroken cryptographic chain.\n *\n * Detects:\n * - Missing steps (INCOMPLETE_ARTIFACT)\n * - Extra steps (INCOMPLETE_ARTIFACT)\n * - Reordered steps (CHAIN_BREAK_DETECTED via stepIndex or prevStepHash mismatch)\n * - Inserted steps (CHAIN_BREAK_DETECTED)\n * - Deleted steps (CHAIN_BREAK_DETECTED)\n * - Summary finalStepHash mismatch (CHAIN_BREAK_DETECTED)\n *\n * @param summary RunSummary from RunBuilder.finalize()\n * @param bundles Step bundles in declared order (step 0 first)\n * @param opts Options for verification behaviour\n */\nexport function verifyRunSummary(\n summary: RunSummary,\n bundles: CerAiExecutionBundle[],\n opts?: VerifyRunSummaryOptions,\n): RunSummaryVerifyResult {\n if (bundles.length !== summary.stepCount) {\n return {\n ok: false,\n code: CerVerifyCode.INCOMPLETE_ARTIFACT,\n errors: [\n `Step count mismatch: summary declares ${summary.stepCount} step(s), received ${bundles.length}`,\n ],\n details: ['Possible step deletion or insertion'],\n };\n }\n\n if (bundles.length === 0) {\n return { ok: true, code: CerVerifyCode.OK, errors: [] };\n }\n\n let prevHash: string | null = null;\n\n for (let i = 0; i < bundles.length; i++) {\n const bundle = bundles[i];\n const summaryStep = summary.steps[i];\n\n if (!summaryStep) {\n return {\n ok: false,\n code: CerVerifyCode.INCOMPLETE_ARTIFACT,\n errors: [`Missing summary entry for step index ${i}`],\n breakAt: i,\n };\n }\n\n if (!opts?.skipBundleVerification) {\n const bundleResult = verifyCer(bundle);\n if (!bundleResult.ok) {\n return {\n ok: false,\n code: bundleResult.code,\n errors: [`Step ${i}: individual bundle verification failed: ${bundleResult.errors.join('; ')}`],\n details: bundleResult.details,\n breakAt: i,\n };\n }\n }\n\n const stepIndex = bundle.snapshot?.stepIndex;\n if (stepIndex !== i) {\n return {\n ok: false,\n code: CerVerifyCode.CHAIN_BREAK_DETECTED,\n errors: [`Step ${i}: expected stepIndex ${i}, got ${String(stepIndex)}`],\n details: ['stepIndex mismatch indicates insertion or reordering'],\n breakAt: i,\n };\n }\n\n const snapshotPrevHash = bundle.snapshot?.prevStepHash ?? null;\n\n if (i === 0) {\n if (snapshotPrevHash !== null) {\n return {\n ok: false,\n code: CerVerifyCode.CHAIN_BREAK_DETECTED,\n errors: [`Step 0: expected prevStepHash null, got \"${snapshotPrevHash}\"`],\n details: ['First step must have prevStepHash null'],\n breakAt: 0,\n expectedPrev: 'null',\n observedPrev: snapshotPrevHash,\n };\n }\n } else {\n if (snapshotPrevHash !== prevHash) {\n return {\n ok: false,\n code: CerVerifyCode.CHAIN_BREAK_DETECTED,\n errors: [`Step ${i}: prevStepHash mismatch — chain break detected`],\n details: [\n `Expected prevStepHash \"${prevHash ?? 'null'}\", got \"${snapshotPrevHash ?? 'null'}\"`,\n ],\n breakAt: i,\n expectedPrev: prevHash ?? undefined,\n observedPrev: snapshotPrevHash ?? undefined,\n };\n }\n }\n\n if (bundle.certificateHash !== summaryStep.certificateHash) {\n return {\n ok: false,\n code: CerVerifyCode.CHAIN_BREAK_DETECTED,\n errors: [`Step ${i}: certificateHash does not match summary record`],\n details: [\n `Summary has \"${summaryStep.certificateHash}\", bundle has \"${bundle.certificateHash}\"`,\n ],\n breakAt: i,\n };\n }\n\n prevHash = bundle.certificateHash;\n }\n\n const lastBundle = bundles[bundles.length - 1];\n if (summary.finalStepHash !== lastBundle.certificateHash) {\n return {\n ok: false,\n code: CerVerifyCode.CHAIN_BREAK_DETECTED,\n errors: ['summary.finalStepHash does not match last step certificateHash'],\n details: [\n `Expected \"${summary.finalStepHash ?? 'null'}\", got \"${lastBundle.certificateHash}\"`,\n ],\n breakAt: bundles.length - 1,\n expectedPrev: summary.finalStepHash ?? undefined,\n observedPrev: lastBundle.certificateHash,\n };\n }\n\n return { ok: true, code: CerVerifyCode.OK, errors: [] };\n}\n","/**\n * @nexart/ai-execution — Pre-seal redaction helpers (v0.7.0)\n *\n * redactBeforeSeal() replaces sensitive snapshot fields with stable redaction\n * envelopes { _redacted: true, hash: \"sha256:...\" } BEFORE the snapshot is\n * sealed with sealCer(). The resulting bundle will verify correctly because\n * the certificateHash was computed over the already-redacted snapshot.\n *\n * For `input` and `output` fields, the corresponding `inputHash`/`outputHash`\n * are recomputed to reflect the envelope (the original value's hash is\n * preserved inside the envelope itself).\n *\n * IMPORTANT: Post-hoc redaction via sanitizeForStorage() breaks certificateHash\n * by design. Only pre-seal redaction produces verifiable bundles.\n */\n\nimport type { AiExecutionSnapshotV1, RedactionEnvelope } from './types.js';\nimport { hashUtf8, hashCanonicalJson, computeInputHash, computeOutputHash } from './hash.js';\n\nexport interface RedactBeforeSealPolicy {\n /** Dot-separated field paths to redact, e.g. [\"input\", \"prompt\"]. */\n paths: string[];\n}\n\nfunction hashValue(value: unknown): string {\n if (typeof value === 'string') return hashUtf8(value);\n return hashCanonicalJson(value);\n}\n\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n const parts = path.split('.');\n let cursor: unknown = obj;\n for (const part of parts) {\n if (typeof cursor !== 'object' || cursor === null) return undefined;\n cursor = (cursor as Record<string, unknown>)[part];\n }\n return cursor;\n}\n\nfunction setNestedPath(\n obj: Record<string, unknown>,\n path: string,\n value: unknown,\n): Record<string, unknown> {\n const parts = path.split('.');\n const clone = { ...obj };\n let cursor: Record<string, unknown> = clone;\n\n for (let i = 0; i < parts.length - 1; i++) {\n const key = parts[i];\n const child = cursor[key];\n if (typeof child !== 'object' || child === null) return clone;\n cursor[key] = { ...(child as Record<string, unknown>) };\n cursor = cursor[key] as Record<string, unknown>;\n }\n\n const last = parts[parts.length - 1];\n if (last in cursor) {\n cursor[last] = value;\n }\n return clone;\n}\n\n/**\n * Replace sensitive snapshot fields with stable redaction envelopes before sealing.\n *\n * - For `input`: replaces with envelope and recomputes inputHash from envelope\n * - For `output`: replaces with envelope and recomputes outputHash from envelope\n * - For other paths: replaces with envelope (nested paths supported via dot notation)\n *\n * The original value's hash is preserved inside the envelope at `envelope.hash`,\n * providing a trail for authorized reviewers while keeping the raw value private.\n *\n * @example\n * ```typescript\n * const redactedSnap = redactBeforeSeal(snapshot, { paths: ['input', 'prompt'] });\n * const bundle = sealCer(redactedSnap);\n * // verifyCer(bundle) → { ok: true }\n * ```\n */\nexport function redactBeforeSeal(\n snapshot: AiExecutionSnapshotV1,\n policy: RedactBeforeSealPolicy,\n): AiExecutionSnapshotV1 {\n let result = { ...snapshot } as unknown as Record<string, unknown>;\n\n for (const path of policy.paths) {\n const original = getNestedValue(result, path);\n if (original === undefined) continue;\n\n const envelope: RedactionEnvelope = {\n _redacted: true,\n hash: hashValue(original),\n };\n\n result = setNestedPath(result, path, envelope);\n\n if (path === 'input') {\n result['inputHash'] = computeInputHash(envelope as unknown as Record<string, unknown>);\n } else if (path === 'output') {\n result['outputHash'] = computeOutputHash(envelope as unknown as Record<string, unknown>);\n }\n }\n\n return result as unknown as AiExecutionSnapshotV1;\n}\n","/**\n * @nexart/ai-execution — AIEF profile validation (v0.7.0)\n *\n * Profiles add opt-in strictness at creation time — they enforce field\n * presence and structure only. They NEVER change certificateHash computation.\n *\n * Available profiles:\n * \"flexible\" — No extra validation (default SDK behaviour)\n * \"AIEF_L2\" — Validates AIEF-01 required fields are present\n * \"AIEF_L3\" — Same as AIEF_L2 (portability is structural, not field-level)\n * \"AIEF_L4\" — AIEF_L3 + validates toolCalls fields, prevStepHash for step > 0\n */\n\nimport type { AiExecutionSnapshotV1, CerAiExecutionBundle, AiefProfile, ToolEvent } from './types.js';\n\nexport interface ProfileValidationResult {\n ok: boolean;\n errors: string[];\n}\n\nconst SHA256_PATTERN = /^sha256:[0-9a-f]{64}$/;\n\nfunction validateToolEvent(event: ToolEvent, index: number): string[] {\n const errs: string[] = [];\n if (!event.toolId || typeof event.toolId !== 'string') {\n errs.push(`toolCalls[${index}].toolId must be a non-empty string`);\n }\n if (!event.at || typeof event.at !== 'string') {\n errs.push(`toolCalls[${index}].at must be a non-empty ISO 8601 string`);\n }\n if (!event.outputHash || !SHA256_PATTERN.test(event.outputHash)) {\n errs.push(`toolCalls[${index}].outputHash must be in sha256:<64hex> format, got \"${event.outputHash ?? ''}\"`);\n }\n if (event.inputHash !== undefined && !SHA256_PATTERN.test(event.inputHash)) {\n errs.push(`toolCalls[${index}].inputHash must be in sha256:<64hex> format when present`);\n }\n return errs;\n}\n\nfunction validateL2(snapshot: AiExecutionSnapshotV1, label: string): string[] {\n const errs: string[] = [];\n if (!snapshot.executionId) errs.push(`executionId is required for ${label}`);\n if (!snapshot.timestamp) errs.push(`timestamp is required for ${label}`);\n if (!snapshot.provider) errs.push(`provider is required for ${label}`);\n if (!snapshot.model) errs.push(`model is required for ${label}`);\n if (snapshot.input === undefined || snapshot.input === null) errs.push(`input is required for ${label}`);\n if (snapshot.output === undefined || snapshot.output === null) errs.push(`output is required for ${label}`);\n if (!snapshot.inputHash) errs.push(`inputHash is required for ${label}`);\n if (!snapshot.outputHash) errs.push(`outputHash is required for ${label}`);\n return errs;\n}\n\nfunction resolveSnapshot(target: AiExecutionSnapshotV1 | CerAiExecutionBundle): AiExecutionSnapshotV1 {\n if ('snapshot' in target && (target as CerAiExecutionBundle).snapshot) {\n return (target as CerAiExecutionBundle).snapshot;\n }\n return target as AiExecutionSnapshotV1;\n}\n\n/**\n * Validate a snapshot or bundle against the given AIEF profile.\n *\n * Returns { ok: true, errors: [] } for \"flexible\".\n * Does NOT throw — errors are returned in the result.\n * Does NOT affect hashing or sealing.\n */\nexport function validateProfile(\n target: AiExecutionSnapshotV1 | CerAiExecutionBundle,\n profile: AiefProfile,\n): ProfileValidationResult {\n if (profile === 'flexible') {\n return { ok: true, errors: [] };\n }\n\n const snapshot = resolveSnapshot(target);\n const errors: string[] = [];\n\n if (profile === 'AIEF_L2' || profile === 'AIEF_L3' || profile === 'AIEF_L4') {\n errors.push(...validateL2(snapshot, profile));\n }\n\n if (profile === 'AIEF_L4') {\n if (snapshot.toolCalls && snapshot.toolCalls.length > 0) {\n for (let i = 0; i < snapshot.toolCalls.length; i++) {\n errors.push(...validateToolEvent(snapshot.toolCalls[i], i));\n }\n }\n if (\n snapshot.stepIndex !== null &&\n snapshot.stepIndex !== undefined &&\n snapshot.stepIndex > 0 &&\n !snapshot.prevStepHash\n ) {\n errors.push('prevStepHash is required when stepIndex > 0 in AIEF_L4 profile');\n }\n }\n\n return { ok: errors.length === 0, errors };\n}\n","/**\n * @nexart/ai-execution — Verifiable redacted export helper\n *\n * exportVerifiableRedacted() produces a NEW sealed bundle whose snapshot has\n * sensitive fields replaced with redaction envelopes via redactBeforeSeal().\n *\n * The result is a fully independently verifiable bundle with a NEW certificateHash.\n * The original certificateHash is preserved in meta.provenance as an informational\n * cross-reference ONLY — it does not establish any cryptographic relationship\n * between the two bundles.\n *\n * verify(newBundle) → { ok: true } ✅ the new bundle verifies on its own\n * verify(originalBundle) → { ok: true } ✅ the original is unaffected\n *\n * IMPORTANT CONSTRAINTS:\n * - Only `input` and `output` paths are safe to redact (their content hashes are\n * recomputed from the envelope). Schema-validated string fields like `prompt`\n * cannot be replaced with an object envelope — verify() will return SCHEMA_ERROR.\n * - `meta.provenance.originalCertificateHash` is reference metadata only.\n * Anyone who receives only the new bundle cannot verify the original's integrity.\n */\n\nimport type { CerAiExecutionBundle, CerMeta } from './types.js';\nimport { sealCer } from './cer.js';\nimport { redactBeforeSeal } from './redact.js';\nimport type { RedactBeforeSealPolicy } from './redact.js';\n\nexport type { RedactBeforeSealPolicy };\n\nexport interface ExportVerifiableRedactedOptions {\n createdAt?: string;\n}\n\nexport interface ExportVerifiableRedactedProvenance {\n originalCertificateHash: string;\n redactionPolicy: { paths: string[] };\n redactedAt: string;\n}\n\nexport interface ExportVerifiableRedactedResult {\n bundle: CerAiExecutionBundle;\n /**\n * The original bundle's certificateHash. Convenience alias for\n * `bundle.meta.provenance.originalCertificateHash`.\n * Reference only — no cryptographic link to the new bundle.\n */\n originalCertificateHash: string;\n}\n\n/**\n * Produce a new sealed bundle with redacted snapshot fields.\n *\n * @param bundle The original sealed bundle to redact from.\n * @param policy Which snapshot paths to redact. Only 'input' and 'output'\n * are safe for verifiable redaction (their content hashes are\n * recomputed). Other schema-validated string fields will cause\n * verify() to return SCHEMA_ERROR on the new bundle.\n * @param options Optional overrides (createdAt).\n *\n * @example\n * ```typescript\n * import { certifyDecision, verify, exportVerifiableRedacted } from '@nexart/ai-execution';\n *\n * const original = certifyDecision({ ... });\n * const { bundle, originalCertificateHash } = exportVerifiableRedacted(\n * original,\n * { paths: ['input', 'output'] },\n * );\n *\n * verify(bundle).ok; // true\n * bundle.meta.provenance.originalCertificateHash; // 'sha256:...' — reference only\n * bundle.snapshot.input; // { _redacted: true, hash: 'sha256:...' }\n * ```\n */\nexport function exportVerifiableRedacted(\n bundle: CerAiExecutionBundle,\n policy: RedactBeforeSealPolicy,\n options?: ExportVerifiableRedactedOptions,\n): ExportVerifiableRedactedResult {\n const createdAt = options?.createdAt ?? new Date().toISOString();\n\n const redactedSnapshot = redactBeforeSeal(bundle.snapshot, policy);\n\n const provenance: ExportVerifiableRedactedProvenance = {\n originalCertificateHash: bundle.certificateHash,\n redactionPolicy: { paths: [...policy.paths] },\n redactedAt: createdAt,\n };\n\n const mergedMeta: CerMeta = {\n ...bundle.meta,\n provenance,\n };\n\n const newBundle = sealCer(redactedSnapshot, {\n createdAt,\n meta: mergedMeta,\n declaration: bundle.declaration,\n });\n\n return {\n bundle: newBundle,\n originalCertificateHash: bundle.certificateHash,\n };\n}\n","/**\n * @nexart/ai-execution — Opinionated run helper\n *\n * certifyAndAttestRun(): certify every step in a multi-step run via RunBuilder,\n * optionally attest each sealed bundle, and return a consolidated result.\n *\n * Design principles:\n * - Does NOT mutate or wrap any externally-owned RunBuilder. Creates its own.\n * - RunBuilder semantics are unchanged: prevStepHash chaining is automatic.\n * - attestStep is optional and injectable so callers can mock in tests without\n * hitting the network.\n * - Network failures from attestStep bubble up — wrap in try/catch for partial\n * failure tolerance.\n */\n\nimport type {\n StepParams,\n RunSummary,\n CerAiExecutionBundle,\n AttestationReceipt,\n} from './types.js';\nimport { RunBuilder } from './run.js';\n\nexport interface CertifyAndAttestRunOptions {\n runId?: string;\n workflowId?: string | null;\n conversationId?: string | null;\n appId?: string | null;\n /**\n * Optional per-step attestation function. Receives each sealed step bundle\n * immediately after it is created. Return an AttestationReceipt on success.\n *\n * If omitted, all receipts will be null (bundles are sealed but not attested).\n *\n * @example\n * ```typescript\n * import { attest } from '@nexart/ai-execution';\n * certifyAndAttestRun(steps, {\n * attestStep: (bundle) => attest(bundle, { nodeUrl, apiKey }),\n * });\n * ```\n */\n attestStep?: (bundle: CerAiExecutionBundle) => Promise<AttestationReceipt>;\n}\n\nexport interface CertifyAndAttestRunResult {\n runSummary: RunSummary;\n stepBundles: CerAiExecutionBundle[];\n /**\n * Attestation receipts in step order. `null` at index i means the step\n * was sealed but not attested (no `attestStep` option was provided).\n */\n receipts: (AttestationReceipt | null)[];\n /** Alias for runSummary.finalStepHash — the last step's certificateHash. */\n finalStepHash: string | null;\n}\n\n/**\n * Certify every step in a multi-step run and optionally attest each bundle.\n *\n * Each step is sealed via RunBuilder, which automatically:\n * - assigns stepIndex (0-based)\n * - sets prevStepHash to the previous step's certificateHash\n * - assigns a unique executionId and stepId per step\n *\n * The resulting runSummary + stepBundles can be validated offline with\n * verifyRunSummary(runSummary, stepBundles).\n *\n * @param steps Ordered list of step parameters (step 0 first).\n * @param options Run-level options and optional attestation hook.\n *\n * @example\n * ```typescript\n * import { certifyAndAttestRun, verifyRunSummary } from '@nexart/ai-execution';\n *\n * const { runSummary, stepBundles, receipts, finalStepHash } =\n * await certifyAndAttestRun(\n * [step0Params, step1Params, step2Params],\n * {\n * runId: 'analysis-run',\n * workflowId: 'data-pipeline',\n * attestStep: (bundle) => attest(bundle, { nodeUrl, apiKey }),\n * },\n * );\n *\n * verifyRunSummary(runSummary, stepBundles); // { ok: true }\n * ```\n */\nexport async function certifyAndAttestRun(\n steps: StepParams[],\n options?: CertifyAndAttestRunOptions,\n): Promise<CertifyAndAttestRunResult> {\n const run = new RunBuilder({\n runId: options?.runId,\n workflowId: options?.workflowId,\n conversationId: options?.conversationId,\n appId: options?.appId,\n });\n\n const stepBundles: CerAiExecutionBundle[] = [];\n const receipts: (AttestationReceipt | null)[] = [];\n\n for (const stepParams of steps) {\n const bundle = run.step(stepParams);\n stepBundles.push(bundle);\n\n if (options?.attestStep) {\n const receipt = await options.attestStep(bundle);\n receipts.push(receipt);\n } else {\n receipts.push(null);\n }\n }\n\n const runSummary = run.finalize();\n\n return {\n runSummary,\n stepBundles,\n receipts,\n finalStepHash: runSummary.finalStepHash,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AC+HO,IAAM,gBAAgB;AAAA,EAC3B,IAAI;AAAA,EACJ,2BAA2B;AAAA,EAC3B,wBAAwB;AAAA,EACxB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,wBAAwB;AAAA,EACxB,cAAc;AAAA,EACd,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,2BAA2B;AAAA,EAC3B,+BAA+B;AAAA,EAC/B,oCAAoC;AAAA;AAAA,EAEpC,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,mCAAmC;AAAA,EACnC,uBAAuB;AAAA,EACvB,2BAA2B;AAC7B;;;ACnJO,IAAM,uBAAN,cAAmC,MAAM;AAAA,EAC9B;AAAA,EAEhB,YAAY,QAAkB;AAC5B,UAAM,4BAA4B,OAAO,KAAK,IAAI,CAAC,EAAE;AACrD,SAAK,OAAO;AACZ,SAAK,SAAS;AAAA,EAChB;AACF;AAEO,IAAM,sBAAN,cAAkC,MAAM;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EAEhB,YAAY,SAAiB,YAAqB,cAAwB,SAAoB;AAC5F,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,aAAa;AAClB,SAAK,eAAe;AACpB,SAAK,UAAU;AAAA,EACjB;AACF;;;ACtBO,SAAS,gBAAgB,OAAwB;AACtD,SAAO,aAAa,KAAK;AAC3B;AAEA,SAAS,aAAa,OAAwB;AAC5C,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,WAAW;AAC9B,WAAO,QAAQ,SAAS;AAAA,EAC1B;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,YAAM,IAAI,MAAM,oDAAoD,KAAK,EAAE;AAAA,IAC7E;AACA,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAM,QAAQ,MAAM,IAAI,UAAQ,aAAa,IAAI,CAAC;AAClD,WAAO,MAAM,MAAM,KAAK,GAAG,IAAI;AAAA,EACjC;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,MAAM;AACZ,UAAM,OAAO,OAAO,KAAK,GAAG,EAAE,KAAK;AACnC,UAAM,UAAU,KAAK,IAAI,SAAO;AAC9B,YAAM,MAAM,IAAI,GAAG;AACnB,UAAI,QAAQ,QAAW;AACrB,eAAO;AAAA,MACT;AACA,aAAO,KAAK,UAAU,GAAG,IAAI,MAAM,aAAa,GAAG;AAAA,IACrD,CAAC,EAAE,OAAO,OAAK,MAAM,IAAI;AACzB,WAAO,MAAM,QAAQ,KAAK,GAAG,IAAI;AAAA,EACnC;AAEA,QAAM,IAAI,MAAM,wCAAwC,OAAO,KAAK,EAAE;AACxE;;;AC3CA,aAAwB;AAGjB,SAAS,UAAU,MAAmC;AAC3D,QAAM,OAAc,kBAAW,QAAQ;AACvC,MAAI,OAAO,SAAS,UAAU;AAC5B,SAAK,OAAO,MAAM,OAAO;AAAA,EAC3B,OAAO;AACL,SAAK,OAAO,IAAI;AAAA,EAClB;AACA,SAAO,KAAK,OAAO,KAAK;AAC1B;AAEO,SAAS,SAAS,OAAuB;AAC9C,SAAO,UAAU,UAAU,KAAK,CAAC;AACnC;AAEO,SAAS,kBAAkB,OAAwB;AACxD,QAAM,YAAY,gBAAgB,KAAK;AACvC,SAAO,UAAU,UAAU,SAAS,CAAC;AACvC;AAEO,SAAS,iBAAiB,OAAiD;AAChF,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,SAAS,KAAK;AAAA,EACvB;AACA,SAAO,kBAAkB,KAAK;AAChC;AAEO,SAAS,kBAAkB,QAAkD;AAClF,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO,SAAS,MAAM;AAAA,EACxB;AACA,SAAO,kBAAkB,MAAM;AACjC;;;AC9BA,IAAM,kBAAkB;AAExB,SAAS,mBAAmB,QAAyC;AACnE,QAAM,SAAmB,CAAC;AAE1B,MAAI,OAAO,OAAO,gBAAgB,YAAY,CAAC,OAAO,SAAS,OAAO,WAAW,GAAG;AAClF,WAAO,KAAK,wDAAwD,OAAO,WAAW,EAAE;AAAA,EAC1F;AAEA,MAAI,OAAO,OAAO,cAAc,YAAY,CAAC,OAAO,SAAS,OAAO,SAAS,GAAG;AAC9E,WAAO,KAAK,sDAAsD,OAAO,SAAS,EAAE;AAAA,EACtF;AAEA,MAAI,OAAO,SAAS,SAAS,OAAO,OAAO,SAAS,YAAY,CAAC,OAAO,SAAS,OAAO,IAAI,IAAI;AAC9F,WAAO,KAAK,yDAAyD,OAAO,IAAI,EAAE;AAAA,EACpF;AAEA,MAAI,OAAO,SAAS,SAAS,OAAO,OAAO,SAAS,YAAY,CAAC,OAAO,SAAS,OAAO,IAAI,IAAI;AAC9F,WAAO,KAAK,yDAAyD,OAAO,IAAI,EAAE;AAAA,EACpF;AAEA,SAAO;AACT;AAEO,SAAS,eAAe,QAAqD;AAClF,QAAM,cAAc,mBAAmB,OAAO,UAAU;AACxD,MAAI,YAAY,SAAS,GAAG;AAC1B,UAAM,IAAI,MAAM,uBAAuB,YAAY,KAAK,IAAI,CAAC,EAAE;AAAA,EACjE;AAEA,QAAM,YAAY,iBAAiB,OAAO,KAAK;AAC/C,QAAM,aAAa,kBAAkB,OAAO,MAAM;AAElD,QAAM,WAAkC;AAAA,IACtC,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,aAAa,OAAO;AAAA,IACpB,WAAW,OAAO,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACtD,UAAU,OAAO;AAAA,IACjB,OAAO,OAAO;AAAA,IACd,cAAc,OAAO,gBAAgB;AAAA,IACrC,QAAQ,OAAO;AAAA,IACf,OAAO,OAAO;AAAA,IACd;AAAA,IACA,YAAY;AAAA,MACV,aAAa,OAAO,WAAW;AAAA,MAC/B,WAAW,OAAO,WAAW;AAAA,MAC7B,MAAM,OAAO,WAAW,QAAQ;AAAA,MAChC,MAAM,OAAO,WAAW,QAAQ;AAAA,IAClC;AAAA,IACA,QAAQ,OAAO;AAAA,IACf;AAAA,IACA,YAAY,OAAO,cAAc;AAAA,IACjC,OAAO,OAAO,SAAS;AAAA,EACzB;AAEA,MAAI,OAAO,UAAU,OAAW,UAAS,QAAQ,OAAO,SAAS;AACjE,MAAI,OAAO,WAAW,OAAW,UAAS,SAAS,OAAO,UAAU;AACpE,MAAI,OAAO,cAAc,OAAW,UAAS,YAAY,OAAO,aAAa;AAC7E,MAAI,OAAO,eAAe,OAAW,UAAS,aAAa,OAAO,cAAc;AAChF,MAAI,OAAO,mBAAmB,OAAW,UAAS,iBAAiB,OAAO,kBAAkB;AAC5F,MAAI,OAAO,iBAAiB,OAAW,UAAS,eAAe,OAAO,gBAAgB;AAGtF,MAAI,OAAO,cAAc,UAAa,OAAO,UAAU,SAAS,GAAG;AACjE,aAAS,YAAY,OAAO;AAAA,EAC9B;AAEA,SAAO;AACT;AAEO,SAAS,eAAe,UAAqD;AAClF,QAAM,eAAyB,CAAC;AAChC,QAAM,eAAyB,CAAC;AAChC,QAAM,kBAA4B,CAAC;AACnC,QAAM,mBAA6B,CAAC;AAEpC,MAAI,SAAS,SAAS,mBAAmB;AACvC,iBAAa,KAAK,yCAAyC,SAAS,IAAI,GAAG;AAAA,EAC7E;AAEA,MAAI,SAAS,oBAAoB,SAAS;AACxC,iBAAa,KAAK,0CAA0C,SAAS,eAAe,GAAG;AAAA,EACzF;AAEA,MAAI,SAAS,qBAAqB,MAAM;AACtC,iBAAa,KAAK,wCAAwC,SAAS,gBAAgB,GAAG;AAAA,EACxF;AAEA,MAAI,CAAC,SAAS,eAAe,OAAO,SAAS,gBAAgB,UAAU;AACrE,iBAAa,KAAK,wCAAwC;AAAA,EAC5D;AAEA,MAAI,CAAC,SAAS,aAAa,OAAO,SAAS,cAAc,UAAU;AACjE,iBAAa,KAAK,sCAAsC;AAAA,EAC1D;AAEA,MAAI,CAAC,SAAS,YAAY,OAAO,SAAS,aAAa,UAAU;AAC/D,iBAAa,KAAK,qCAAqC;AAAA,EACzD;AAEA,MAAI,CAAC,SAAS,SAAS,OAAO,SAAS,UAAU,UAAU;AACzD,iBAAa,KAAK,kCAAkC;AAAA,EACtD;AAEA,MAAI,CAAC,SAAS,UAAU,OAAO,SAAS,WAAW,UAAU;AAC3D,iBAAa,KAAK,mCAAmC;AAAA,EACvD;AAEA,MAAI,SAAS,UAAU,UAAa,SAAS,UAAU,MAAM;AAC3D,iBAAa,KAAK,kCAAkC;AAAA,EACtD;AAEA,MAAI,SAAS,WAAW,UAAa,SAAS,WAAW,MAAM;AAC7D,iBAAa,KAAK,mCAAmC;AAAA,EACvD;AAEA,QAAM,cAAc,mBAAmB,SAAS,UAAU;AAC1D,eAAa,KAAK,GAAG,WAAW;AAEhC,MAAI,CAAC,SAAS,aAAa,CAAC,SAAS,UAAU,WAAW,SAAS,GAAG;AACpE,iBAAa,KAAK,6CAA6C,SAAS,SAAS,GAAG;AAAA,EACtF;AAEA,MAAI,CAAC,SAAS,cAAc,CAAC,SAAS,WAAW,WAAW,SAAS,GAAG;AACtE,iBAAa,KAAK,8CAA8C,SAAS,UAAU,GAAG;AAAA,EACxF;AAEA,MAAI,aAAa,WAAW,GAAG;AAC7B,UAAM,oBAAoB,iBAAiB,SAAS,KAAK;AACzD,QAAI,SAAS,cAAc,mBAAmB;AAC5C,sBAAgB,KAAK,gCAAgC,iBAAiB,SAAS,SAAS,SAAS,EAAE;AAAA,IACrG;AAEA,UAAM,qBAAqB,kBAAkB,SAAS,MAAM;AAC5D,QAAI,SAAS,eAAe,oBAAoB;AAC9C,uBAAiB,KAAK,iCAAiC,kBAAkB,SAAS,SAAS,UAAU,EAAE;AAAA,IACzG;AAAA,EACF;AAEA,QAAM,SAAS,CAAC,GAAG,cAAc,GAAG,cAAc,GAAG,iBAAiB,GAAG,gBAAgB;AAEzF,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO,EAAE,IAAI,MAAM,QAAQ,CAAC,GAAG,MAAM,cAAc,GAAG;AAAA,EACxD;AAEA,MAAI;AACJ,MAAI;AAEJ,MAAI,aAAa,SAAS,GAAG;AAC3B,WAAO,cAAc;AACrB,cAAU;AAAA,EACZ,WAAW,aAAa,SAAS,GAAG;AAClC,WAAO,cAAc;AACrB,cAAU;AAAA,EACZ,WAAW,gBAAgB,SAAS,KAAK,iBAAiB,SAAS,GAAG;AACpE,WAAO,cAAc;AACrB,cAAU,CAAC,GAAG,iBAAiB,GAAG,gBAAgB;AAAA,EACpD,WAAW,gBAAgB,SAAS,GAAG;AACrC,WAAO,cAAc;AACrB,cAAU;AAAA,EACZ,WAAW,iBAAiB,SAAS,GAAG;AACtC,WAAO,cAAc;AACrB,cAAU;AAAA,EACZ,OAAO;AACL,WAAO,cAAc;AACrB,cAAU;AAAA,EACZ;AAEA,SAAO,EAAE,IAAI,OAAO,QAAQ,MAAM,QAAQ;AAC5C;;;AClKA,SAAS,uBAAuB,SAAqC;AACnE,QAAM,YAAY,gBAAgB,OAAO;AACzC,SAAO,UAAU,UAAU,SAAS,CAAC;AACvC;AAEO,SAAS,QACd,UACA,SACsB;AACtB,QAAM,YAAY,SAAS,cAAa,oBAAI,KAAK,GAAE,YAAY;AAI/D,QAAM,UAA8B;AAAA,IAClC,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,SAAS;AAAA,EACX;AAEA,QAAM,kBAAkB,uBAAuB,OAAO;AAEtD,QAAM,SAA+B;AAAA,IACnC,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,EACF;AAEA,MAAI,SAAS,MAAM;AACjB,WAAO,OAAO,QAAQ;AAAA,EACxB;AAGA,MAAI,SAAS,aAAa;AACxB,WAAO,cAAc,QAAQ;AAAA,EAC/B;AAEA,SAAO;AACT;AAEO,SAAS,UAAU,QAAkD;AAC1E,QAAM,eAAyB,CAAC;AAChC,QAAM,eAAyB,CAAC;AAEhC,MAAI,OAAO,eAAe,uBAAuB;AAC/C,iBAAa,KAAK,mDAAmD,OAAO,UAAU,GAAG;AAAA,EAC3F;AAEA,MAAI,OAAO,YAAY,OAAO;AAC5B,iBAAa,KAAK,gCAAgC,OAAO,OAAO,GAAG;AAAA,EACrE;AAEA,MAAI,CAAC,OAAO,aAAa,OAAO,OAAO,cAAc,UAAU;AAC7D,iBAAa,KAAK,sCAAsC;AAAA,EAC1D;AAEA,MAAI,CAAC,OAAO,mBAAmB,CAAC,OAAO,gBAAgB,WAAW,SAAS,GAAG;AAC5E,iBAAa,KAAK,mDAAmD,OAAO,eAAe,GAAG;AAAA,EAChG;AAEA,MAAI,CAAC,OAAO,UAAU;AACpB,iBAAa,KAAK,sBAAsB;AACxC,UAAM,YAAY,CAAC,GAAG,cAAc,GAAG,YAAY;AACnD,WAAO,EAAE,IAAI,OAAO,QAAQ,WAAW,MAAM,cAAc,cAAc,SAAS,aAAa;AAAA,EACjG;AAEA,MAAI,wBAAuC;AAC3C,MAAI,iBAA4C;AAEhD,MAAI;AACF,qBAAiB,eAAe,OAAO,QAAQ;AAAA,EACjD,SAASA,MAAK;AACZ,4BAAwBA,gBAAe,QAAQA,KAAI,UAAU,OAAOA,IAAG;AAAA,EACzE;AAEA,MAAI,0BAA0B,MAAM;AAClC,UAAMC,UAAS,CAAC,GAAG,cAAc,GAAG,cAAc,qBAAqB;AACvE,WAAO,EAAE,IAAI,OAAO,QAAAA,SAAQ,MAAM,cAAc,wBAAwB,SAAS,CAAC,qBAAqB,EAAE;AAAA,EAC3G;AAEA,QAAM,iBAAiB,eAAgB;AAEvC,QAAM,iBAA2B,CAAC;AAClC,MAAI;AACF,UAAM,UAA8B;AAAA,MAClC,YAAY;AAAA,MACZ,WAAW,OAAO;AAAA,MAClB,UAAU,OAAO;AAAA,MACjB,SAAS;AAAA,IACX;AACA,UAAM,eAAe,uBAAuB,OAAO;AACnD,QAAI,OAAO,oBAAoB,cAAc;AAC3C,qBAAe,KAAK,sCAAsC,YAAY,SAAS,OAAO,eAAe,EAAE;AAAA,IACzG;AAAA,EACF,SAASD,MAAK;AACZ,UAAM,MAAMA,gBAAe,QAAQA,KAAI,UAAU,OAAOA,IAAG;AAC3D,UAAMC,UAAS,CAAC,GAAG,cAAc,GAAG,cAAc,GAAG,gBAAgB,GAAG;AACxE,WAAO,EAAE,IAAI,OAAO,QAAAA,SAAQ,MAAM,cAAc,wBAAwB,SAAS,CAAC,GAAG,EAAE;AAAA,EACzF;AAEA,QAAM,SAAS,CAAC,GAAG,cAAc,GAAG,cAAc,GAAG,gBAAgB,GAAG,cAAc;AAEtF,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO,EAAE,IAAI,MAAM,QAAQ,CAAC,GAAG,MAAM,cAAc,GAAG;AAAA,EACxD;AAEA,MAAI;AACJ,MAAI;AAEJ,MAAI,aAAa,SAAS,GAAG;AAC3B,WAAO,cAAc;AACrB,cAAU;AAAA,EACZ,WAAW,aAAa,SAAS,GAAG;AAClC,WAAO,cAAc;AACrB,cAAU;AAAA,EACZ,WAAW,eAAe,SAAS,KAAK,eAAe,WAAW,GAAG;AACnE,WAAO,cAAc;AACrB,cAAU;AAAA,EACZ,WAAW,kBAAkB,eAAe,SAAS,cAAc,IAAI;AACrE,WAAO,eAAe;AACtB,cAAU,eAAe,WAAW;AAAA,EACtC,WAAW,eAAe,SAAS,GAAG;AACpC,WAAO,cAAc;AACrB,cAAU;AAAA,EACZ,OAAO;AACL,WAAO,cAAc;AACrB,cAAU;AAAA,EACZ;AAEA,SAAO,EAAE,IAAI,OAAO,QAAQ,MAAM,QAAQ;AAC5C;;;ACjJA,IAAAC,UAAwB;AAKjB,SAAS,gBAAgB,QAAqD;AACnF,QAAM,cAAc,OAAO,eAAsB,mBAAW;AAE5D,QAAM,WAAW,eAAe;AAAA,IAC9B;AAAA,IACA,WAAW,OAAO;AAAA,IAClB,UAAU,OAAO;AAAA,IACjB,OAAO,OAAO;AAAA,IACd,cAAc,OAAO;AAAA,IACrB,QAAQ,OAAO;AAAA,IACf,OAAO,OAAO;AAAA,IACd,YAAY,OAAO;AAAA,IACnB,QAAQ,OAAO;AAAA,IACf,YAAY,OAAO;AAAA,IACnB,OAAO,OAAO;AAAA,IACd,OAAO,OAAO;AAAA,IACd,QAAQ,OAAO;AAAA,IACf,WAAW,OAAO;AAAA,IAClB,YAAY,OAAO;AAAA,IACnB,gBAAgB,OAAO;AAAA,IACvB,cAAc,OAAO;AAAA,EACvB,CAAC;AAED,SAAO,QAAQ,UAAU,EAAE,MAAM,OAAO,KAAK,CAAC;AAChD;;;AC7BA,IAAAC,UAAwB;AAUjB,IAAM,aAAN,MAAiB;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT,YAAoB;AAAA,EACpB,eAA8B;AAAA,EAC9B,QAA6B,CAAC;AAAA,EAEtC,YAAY,SAA6B;AACvC,SAAK,QAAQ,SAAS,SAAgB,mBAAW;AACjD,SAAK,aAAa,SAAS,cAAc;AACzC,SAAK,iBAAiB,SAAS,kBAAkB;AACjD,SAAK,QAAQ,SAAS,SAAS;AAAA,EACjC;AAAA,EAEA,KAAK,QAA0C;AAC7C,UAAM,SAAS,OAAO,UAAiB,mBAAW;AAClD,UAAM,cAAc,GAAG,KAAK,KAAK,SAAS,KAAK,SAAS;AAExD,UAAM,WAAW,eAAe;AAAA,MAC9B;AAAA,MACA,WAAW,OAAO;AAAA,MAClB,UAAU,OAAO;AAAA,MACjB,OAAO,OAAO;AAAA,MACd,cAAc,OAAO;AAAA,MACrB,QAAQ,OAAO;AAAA,MACf,OAAO,OAAO;AAAA,MACd,YAAY,OAAO;AAAA,MACnB,QAAQ,OAAO;AAAA,MACf,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ;AAAA,MACA,WAAW,KAAK;AAAA,MAChB,YAAY,KAAK;AAAA,MACjB,gBAAgB,KAAK;AAAA,MACrB,cAAc,KAAK;AAAA,IACrB,CAAC;AAED,UAAM,SAAS,QAAQ,UAAU,EAAE,MAAM,OAAO,KAAK,CAAC;AAEtD,SAAK,MAAM,KAAK;AAAA,MACd,WAAW,KAAK;AAAA,MAChB;AAAA,MACA;AAAA,MACA,iBAAiB,OAAO;AAAA,MACxB,cAAc,KAAK;AAAA,IACrB,CAAC;AAED,SAAK,eAAe,OAAO;AAC3B,SAAK;AAEL,WAAO;AAAA,EACT;AAAA,EAEA,WAAuB;AACrB,WAAO;AAAA,MACL,OAAO,KAAK;AAAA,MACZ,YAAY,KAAK;AAAA,MACjB,gBAAgB,KAAK;AAAA,MACrB,WAAW,KAAK,MAAM;AAAA,MACtB,OAAO,CAAC,GAAG,KAAK,KAAK;AAAA,MACrB,eAAe,KAAK;AAAA,IACtB;AAAA,EACF;AACF;;;ACrEA,SAAS,oBAAoB,OAAyB;AACpD,MAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAElD,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AACA,MAAI,OAAO,UAAU,YAAY;AAC/B,UAAM,IAAI,MAAM,2DAA2D;AAAA,EAC7E;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,mBAAmB;AAAA,EACtC;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,SAAkC,CAAC;AACzC,eAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,KAAgC,GAAG;AACzE,UAAI,QAAQ,OAAW;AACvB,aAAO,GAAG,IAAI,oBAAoB,GAAG;AAAA,IACvC;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAGA,SAAS,WACP,KACA,MACA,aACyB;AACzB,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,QAAM,QAAQ,EAAE,GAAG,IAAI;AACvB,MAAI,SAAkC;AAEtC,WAAS,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,KAAK;AACzC,UAAM,MAAM,MAAM,CAAC;AACnB,QAAI,OAAO,OAAO,GAAG,MAAM,YAAY,OAAO,GAAG,MAAM,KAAM,QAAO;AACpE,WAAO,GAAG,IAAI,EAAE,GAAI,OAAO,GAAG,EAA8B;AAC5D,aAAS,OAAO,GAAG;AAAA,EACrB;AAEA,QAAM,OAAO,MAAM,MAAM,SAAS,CAAC;AACnC,MAAI,QAAQ,OAAQ,QAAO,IAAI,IAAI;AACnC,SAAO;AACT;AAOO,SAAS,uBAAuB,QAAoD;AACzF,SAAO,oBAAoB,MAAM;AACnC;AAcO,SAAS,mBACd,QACA,SACsB;AACtB,MAAI,UAAU,oBAAoB,MAAM;AAExC,MAAI,SAAS,eAAe,QAAQ,YAAY,SAAS,GAAG;AAC1D,UAAM,cAAc,QAAQ,cAAc;AAC1C,QAAI,MAAM;AACV,eAAW,QAAQ,QAAQ,aAAa;AACtC,YAAM,WAAW,KAAK,MAAM,WAAW;AAAA,IACzC;AACA,cAAU;AAAA,EACZ;AAEA,SAAO;AACT;AAWO,SAAS,iBAAiB,QAAkE;AACjG,QAAM,OAA2C;AAAA,IAC/C,YAAY,OAAO;AAAA,IACnB,iBAAiB,OAAO;AAAA,IACxB,WAAW,OAAO;AAAA,IAClB,SAAS,OAAO;AAAA,IAChB,UAAU,OAAO;AAAA,EACnB;AACA,SAAO,oBAAoB,IAAI;AACjC;AAMO,SAAS,eAAe,QAA0B;AACvD,MAAI,OAAO,WAAW,YAAY,WAAW,KAAM,QAAO;AAC1D,QAAM,IAAI;AAEV,MAAI,OAAO,EAAE,kBAAkB,YAAY,EAAE,cAAc,SAAS,EAAG,QAAO;AAC9E,MAAI,OAAO,EAAE,oBAAoB,YAAY,EAAE,gBAAgB,SAAS,EAAG,QAAO;AAElF,MAAI,OAAO,EAAE,gBAAgB,YAAY,EAAE,gBAAgB,MAAM;AAC/D,UAAM,MAAM,EAAE;AACd,QAAI,OAAO,IAAI,kBAAkB,YAAY,IAAI,cAAc,SAAS,EAAG,QAAO;AAClF,QAAI,OAAO,IAAI,oBAAoB,YAAY,IAAI,gBAAgB,SAAS,EAAG,QAAO;AAAA,EACxF;AAEA,SAAO;AACT;;;AClIA,IAAM,iBAAiB;AACvB,IAAM,qBAAqB;AAE3B,SAAS,mBAAmB,OAAgB,WAAkC;AAC5E,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI,CAAC,eAAe,KAAK,KAAK,GAAG;AAC/B,WAAO,GAAG,SAAS,sCAAsC,KAAK;AAAA,EAChE;AACA,SAAO;AACT;AAEA,eAAsB,OACpB,QACA,SAC4B;AAC5B,QAAM,MAAM,GAAG,QAAQ,QAAQ,QAAQ,QAAQ,EAAE,CAAC;AAClD,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,YAAY,uBAAuB,MAAM;AAE/C,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,SAAS;AAE5D,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,MAAM,KAAK;AAAA,MAC1B,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,iBAAiB,UAAU,QAAQ,MAAM;AAAA,MAC3C;AAAA,MACA,MAAM,KAAK,UAAU,SAAS;AAAA,MAC9B,QAAQ,WAAW;AAAA,IACrB,CAAC;AAAA,EACH,SAASC,MAAK;AACZ,iBAAa,KAAK;AAClB,UAAM,QAAQA;AACd,QAAI,MAAM,SAAS,cAAc;AAC/B,YAAM,IAAI;AAAA,QACR,uCAAuC,SAAS;AAAA,MAClD;AAAA,IACF;AACA,UAAM,IAAI;AAAA,MACR,8CAA8C,MAAM,OAAO;AAAA,IAC7D;AAAA,EACF,UAAE;AACA,iBAAa,KAAK;AAAA,EACpB;AAEA,MAAI;AACJ,MAAI;AACF,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B,QAAQ;AACN,UAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,EAAE;AACjD,UAAM,IAAI;AAAA,MACR,gDAAgD,SAAS,MAAM,MAAM,IAAI;AAAA,MACzE,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAMC,UAAS;AACf,UAAM,MAAM,OAAOA,QAAO,UAAU,WAChCA,QAAO,QACP,QAAQ,SAAS,MAAM;AAC3B,UAAM,UAAU,MAAM,QAAQA,QAAO,OAAO,IAAIA,QAAO,UAAsB;AAC7E,UAAM,IAAI;AAAA,MACR,uBAAuB,GAAG;AAAA,MAC1B,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS;AACf,QAAM,SAAmB,CAAC;AAE1B,MAAI,OAAO,OAAO,oBAAoB,YAAY,OAAO,oBAAoB,OAAO,iBAAiB;AACnG,WAAO;AAAA,MACL,kCAAkC,OAAO,eAAe,qBAAqB,OAAO,eAAe;AAAA,IACrG;AAAA,EACF;AAEA,QAAM,cAAc,mBAAmB,OAAO,iBAAiB,0BAA0B;AACzF,MAAI,YAAa,QAAO,KAAK,WAAW;AAExC,QAAM,iBAAiB,mBAAmB,OAAO,iBAAiB,0BAA0B;AAC5F,MAAI,eAAgB,QAAO,KAAK,cAAc;AAE9C,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,IAAI;AAAA,MACR,2CAA2C,OAAO,KAAK,IAAI,CAAC;AAAA,MAC5D,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,eAAe,OAAO,OAAO,kBAAkB,WAAW,OAAO,gBAAgB;AAAA,IACjF,iBAAiB,OAAO,OAAO,oBAAoB,WAAW,OAAO,kBAAkB;AAAA,IACvF,iBAAiB,OAAO,OAAO,oBAAoB,WAAW,OAAO,kBAAkB;AAAA,IACvF,iBAAiB,OAAO,OAAO,oBAAoB,WAAW,OAAO,kBAAkB;AAAA,IACvF,KAAK;AAAA,EACP;AACF;;;ACxGO,SAAS,UAAU,QAAsC;AAC9D,SAAO,gBAAgB,MAAM;AAC/B;AAEO,SAAS,UAAU,MAAoC;AAC5D,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,IAAI;AAAA,EAC1B,SAASC,MAAK;AACZ,UAAM,IAAI,qBAAqB,CAAC,iBAAkBA,KAAc,OAAO,EAAE,CAAC;AAAA,EAC5E;AAEA,QAAM,SAAS;AAEf,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,UAAM,IAAI,qBAAqB,CAAC,+BAA+B,CAAC;AAAA,EAClE;AAEA,MAAI,OAAO,eAAe,uBAAuB;AAC/C,UAAM,IAAI,qBAAqB,CAAC,mDAAmD,OAAO,UAAU,GAAG,CAAC;AAAA,EAC1G;AAEA,QAAM,SAAS,UAAU,MAAM;AAC/B,MAAI,CAAC,OAAO,IAAI;AACd,UAAM,IAAI,qBAAqB,OAAO,MAAM;AAAA,EAC9C;AAEA,SAAO;AACT;;;ACjCA,IAAAC,UAAwB;AASjB,SAAS,aACd,QACA;AACA,SAAO;AAAA,IACL,MAAM,QAAQ,QAA6F;AACzG,YAAM,MAAM,MAAM,OAAO,OAAO,OAAO,aAAa;AACpD,YAAM,SAAS,OAAO,cAAc,GAAG;AACvC,YAAM,eAAe,OAAO,sBACxB,OAAO,oBAAoB,GAAG,IAC7B,OAAO,gBAAgB;AAE5B,YAAM,WAAW,eAAe;AAAA,QAC9B,aAAa,OAAO,eAAsB,mBAAW;AAAA,QACrD,UAAU,OAAO;AAAA,QACjB,OAAO,OAAO;AAAA,QACd;AAAA,QACA,QAAQ,OAAO;AAAA,QACf,OAAO,OAAO;AAAA,QACd,YAAY,OAAO;AAAA,QACnB;AAAA,QACA,OAAO,OAAO;AAAA,MAChB,CAAC;AAED,YAAM,SAAS,QAAQ,UAAU,EAAE,MAAM,OAAO,KAAK,CAAC;AAEtD,aAAO,EAAE,QAAQ,UAAU,OAAO;AAAA,IACpC;AAAA,EACF;AACF;;;ACnCA,SAAS,WAAW,KAA8B,KAAiC;AACjF,QAAM,IAAI,IAAI,GAAG;AACjB,SAAO,OAAO,MAAM,YAAY,EAAE,SAAS,IAAI,IAAI;AACrD;AAEA,SAAS,aAAa,KAAyD;AAC7E,QAAM,gBAAgB,WAAW,KAAK,eAAe;AACrD,QAAM,kBAAkB,WAAW,KAAK,iBAAiB;AACzD,QAAM,kBAAkB,WAAW,KAAK,iBAAiB;AACzD,QAAM,kBAAkB,WAAW,KAAK,iBAAiB;AAEzD,MAAI,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,iBAAiB;AAC9E,WAAO;AAAA,EACT;AAEA,QAAM,UAA8B;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,SAAS,WAAW,KAAK,QAAQ;AACvC,MAAI,OAAQ,SAAQ,SAAS;AAE7B,QAAM,aAAa,WAAW,KAAK,YAAY;AAC/C,MAAI,WAAY,SAAQ,aAAa;AAErC,QAAM,gBAAgB,WAAW,KAAK,eAAe;AACrD,MAAI,cAAe,SAAQ,gBAAgB;AAE3C,QAAM,kBAAkB,WAAW,KAAK,WAAW,KAAK,WAAW,KAAK,iBAAiB;AACzF,MAAI,gBAAiB,SAAQ,kBAAkB;AAE/C,SAAO;AACT;AAEO,SAAS,sBAAsB,QAA4C;AAChF,MAAI,OAAO,WAAW,YAAY,WAAW,KAAM,QAAO;AAE1D,QAAM,IAAI;AAEV,QAAM,WAAW,aAAa,CAAC;AAC/B,MAAI,SAAU,QAAO;AAErB,MAAI,OAAO,EAAE,SAAS,YAAY,EAAE,SAAS,MAAM;AACjD,UAAM,OAAO,EAAE;AACf,QAAI,OAAO,KAAK,gBAAgB,YAAY,KAAK,gBAAgB,MAAM;AACrE,YAAM,SAAS,aAAa,KAAK,WAAsC;AACvE,UAAI,OAAQ,QAAO;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AACT;;;ACjDA,SAAS,iBACP,OACA,QACoB;AACpB,MACE,CAAC,MAAM,iBACP,CAAC,MAAM,mBACP,CAAC,MAAM,iBACP;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,eAAe,MAAM;AAAA,IACrB,iBAAiB,MAAM,mBAAmB,OAAO;AAAA,IACjD,iBAAiB,MAAM;AAAA,IACvB,iBAAiB,MAAM;AAAA,EACzB;AACF;AAEA,eAAsB,yBACpB,QACA,SACwE;AACxE,QAAM,SAAS,gBAAgB,MAAM;AACrC,QAAM,QAAQ,MAAM,OAAO,QAAQ,OAAO;AAC1C,QAAM,UAAU,iBAAiB,OAAO,MAAM;AAC9C,SAAO,EAAE,QAAQ,QAAQ;AAC3B;AAEA,eAAsB,eACpB,QACA,SACwE;AACxE,MAAI,eAAe,MAAM,GAAG;AAC1B,UAAM,WAAW,sBAAsB,MAAM;AAC7C,QAAI,UAAU;AACZ,aAAO,EAAE,QAAQ,SAAS,SAAS;AAAA,IACrC;AAAA,EACF;AAEA,QAAM,QAAQ,MAAM,OAAO,QAAQ,OAAO;AAC1C,QAAM,UAAU,iBAAiB,OAAO,MAAM;AAC9C,SAAO,EAAE,QAAQ,QAAQ;AAC3B;;;AC3BA,IAAM,gBAAgB;AAAA,EAClB,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,IAAI;AACR;AACA,IAAM,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,EAAE,IAAI;AAChD,IAAM,IAAI;AACV,IAAM,KAAK;AAIX,IAAM,eAAe,IAAI,SAAS;AAC9B,MAAI,uBAAuB,SAAS,OAAO,MAAM,sBAAsB,YAAY;AAC/E,UAAM,kBAAkB,GAAG,IAAI;AAAA,EACnC;AACJ;AACA,IAAM,MAAM,CAAC,UAAU,OAAO;AAC1B,QAAM,IAAI,IAAI,MAAM,OAAO;AAC3B,eAAa,GAAG,GAAG;AACnB,QAAM;AACV;AACA,IAAM,QAAQ,CAAC,MAAM,OAAO,MAAM;AAClC,IAAM,QAAQ,CAAC,MAAM,OAAO,MAAM;AAClC,IAAM,UAAU,CAAC,MAAM,aAAa,cAAe,YAAY,OAAO,CAAC,KAAK,EAAE,YAAY,SAAS;AAEnG,IAAM,SAAS,CAAC,OAAO,QAAQ,QAAQ,OAAO;AAC1C,QAAM,QAAQ,QAAQ,KAAK;AAC3B,QAAM,MAAM,OAAO;AACnB,QAAM,WAAW,WAAW;AAC5B,MAAI,CAAC,SAAU,YAAY,QAAQ,QAAS;AACxC,UAAM,SAAS,SAAS,IAAI,KAAK;AACjC,UAAM,QAAQ,WAAW,cAAc,MAAM,KAAK;AAClD,UAAM,MAAM,QAAQ,UAAU,GAAG,KAAK,QAAQ,OAAO,KAAK;AAC1D,QAAI,SAAS,wBAAwB,QAAQ,WAAW,GAAG;AAAA,EAC/D;AACA,SAAO;AACX;AAEA,IAAM,MAAM,CAAC,QAAQ,IAAI,WAAW,GAAG;AACvC,IAAM,OAAO,CAAC,QAAQ,WAAW,KAAK,GAAG;AACzC,IAAM,OAAO,CAAC,GAAG,QAAQ,EAAE,SAAS,EAAE,EAAE,SAAS,KAAK,GAAG;AACzD,IAAM,aAAa,CAAC,MAAM,MAAM,KAAK,OAAO,CAAC,CAAC,EACzC,IAAI,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,EACrB,KAAK,EAAE;AACZ,IAAM,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;AACxD,IAAM,MAAM,CAAC,OAAO;AAChB,MAAI,MAAM,EAAE,MAAM,MAAM,EAAE;AACtB,WAAO,KAAK,EAAE;AAClB,MAAI,MAAM,EAAE,KAAK,MAAM,EAAE;AACrB,WAAO,MAAM,EAAE,IAAI;AACvB,MAAI,MAAM,EAAE,KAAK,MAAM,EAAE;AACrB,WAAO,MAAM,EAAE,IAAI;AACvB;AACJ;AACA,IAAM,aAAa,CAAC,QAAQ;AACxB,QAAM,IAAI;AACV,MAAI,CAAC,MAAM,GAAG;AACV,WAAO,IAAI,CAAC;AAChB,QAAM,KAAK,IAAI;AACf,QAAM,KAAK,KAAK;AAChB,MAAI,KAAK;AACL,WAAO,IAAI,CAAC;AAChB,QAAM,QAAQ,IAAI,EAAE;AACpB,WAAS,KAAK,GAAG,KAAK,GAAG,KAAK,IAAI,MAAM,MAAM,GAAG;AAE7C,UAAM,KAAK,IAAI,IAAI,WAAW,EAAE,CAAC;AACjC,UAAM,KAAK,IAAI,IAAI,WAAW,KAAK,CAAC,CAAC;AACrC,QAAI,OAAO,UAAa,OAAO;AAC3B,aAAO,IAAI,CAAC;AAChB,UAAM,EAAE,IAAI,KAAK,KAAK;AAAA,EAC1B;AACA,SAAO;AACX;AACA,IAAM,KAAK,MAAM,YAAY;AAC7B,IAAM,SAAS,MAAM,GAAG,GAAG,UAAU,IAAI,kDAAkD;AAE3F,IAAM,cAAc,IAAI,SAAS;AAC7B,QAAM,IAAI,IAAI,KAAK,OAAO,CAAC,KAAK,MAAM,MAAM,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAChE,MAAI,MAAM;AACV,OAAK,QAAQ,OAAK;AAAE,MAAE,IAAI,GAAG,GAAG;AAAG,WAAO,EAAE;AAAA,EAAQ,CAAC;AACrD,SAAO;AACX;AAMA,IAAM,MAAM;AACZ,IAAM,cAAc,CAAC,GAAG,KAAK,KAAK,MAAM,+BAAgC,MAAM,CAAC,KAAK,OAAO,KAAK,IAAI,MAAM,IAAI,IAAI,GAAG;AAErH,IAAM,IAAI,CAAC,GAAG,IAAI,MAAM;AACpB,QAAM,IAAI,IAAI;AACd,SAAO,KAAK,KAAK,IAAI,IAAI;AAC7B;AACA,IAAM,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;AAG1B,IAAM,SAAS,CAACC,MAAK,OAAO;AACxB,MAAIA,SAAQ,MAAM,MAAM;AACpB,QAAI,kBAAkBA,OAAM,UAAU,EAAE;AAC5C,MAAI,IAAI,EAAEA,MAAK,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AACxD,SAAO,MAAM,IAAI;AACb,UAAM,IAAI,IAAI,GAAG,IAAI,IAAI;AACzB,UAAM,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI;AACjC,QAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;AAAA,EAC3C;AACA,SAAO,MAAM,KAAK,EAAE,GAAG,EAAE,IAAI,IAAI,YAAY;AACjD;AACA,IAAM,WAAW,CAAC,SAAS;AAEvB,QAAM,KAAK,OAAO,IAAI;AACtB,MAAI,OAAO,OAAO;AACd,QAAI,YAAY,OAAO,UAAU;AACrC,SAAO;AACX;AAEA,IAAM,SAAS,CAAC,MAAO,aAAa,QAAQ,IAAI,IAAI,gBAAgB;AAGpE,IAAM,OAAO,MAAM;AAEnB,IAAM,QAAN,MAAM,OAAM;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY,GAAG,GAAG,GAAG,GAAG;AACpB,UAAM,MAAM;AACZ,SAAK,IAAI,YAAY,GAAG,IAAI,GAAG;AAC/B,SAAK,IAAI,YAAY,GAAG,IAAI,GAAG;AAC/B,SAAK,IAAI,YAAY,GAAG,IAAI,GAAG;AAC/B,SAAK,IAAI,YAAY,GAAG,IAAI,GAAG;AAC/B,WAAO,OAAO,IAAI;AAAA,EACtB;AAAA,EACA,OAAO,QAAQ;AACX,WAAO;AAAA,EACX;AAAA,EACA,OAAO,WAAW,GAAG;AACjB,WAAO,IAAI,OAAM,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;AAAA,EAC/C;AAAA;AAAA,EAEA,OAAO,UAAU,KAAK,SAAS,OAAO;AAClC,UAAM,IAAI;AAEV,UAAM,SAAS,KAAK,OAAO,KAAK,CAAC,CAAC;AAElC,UAAM,WAAW,IAAI,EAAE;AACvB,WAAO,EAAE,IAAI,WAAW,CAAC;AACzB,UAAM,IAAI,aAAa,MAAM;AAG7B,UAAM,MAAM,SAAS,OAAO;AAC5B,gBAAY,GAAG,IAAI,GAAG;AACtB,UAAM,KAAK,EAAE,IAAI,CAAC;AAClB,UAAM,IAAI,EAAE,KAAK,EAAE;AACnB,UAAM,IAAI,EAAE,IAAI,KAAK,EAAE;AACvB,QAAI,EAAE,SAAS,OAAO,EAAE,IAAI,QAAQ,GAAG,CAAC;AACxC,QAAI,CAAC;AACD,UAAI,uBAAuB;AAC/B,UAAM,UAAU,IAAI,QAAQ;AAC5B,UAAM,iBAAiB,WAAW,SAAU;AAC5C,QAAI,CAAC,UAAU,MAAM,MAAM;AACvB,UAAI,gCAAgC;AACxC,QAAI,kBAAkB;AAClB,UAAI,EAAE,CAAC,CAAC;AACZ,WAAO,IAAI,OAAM,GAAG,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC;AAAA,EACvC;AAAA,EACA,OAAO,QAAQ,KAAK,QAAQ;AACxB,WAAO,OAAM,UAAU,WAAW,GAAG,GAAG,MAAM;AAAA,EAClD;AAAA,EACA,IAAI,IAAI;AACJ,WAAO,KAAK,SAAS,EAAE;AAAA,EAC3B;AAAA,EACA,IAAI,IAAI;AACJ,WAAO,KAAK,SAAS,EAAE;AAAA,EAC3B;AAAA;AAAA,EAEA,iBAAiB;AACb,UAAM,IAAI;AACV,UAAM,IAAI;AACV,UAAM,IAAI;AACV,QAAI,EAAE,IAAI;AACN,aAAO,IAAI,iBAAiB;AAGhC,UAAM,EAAE,GAAG,GAAG,GAAG,EAAE,IAAI;AACvB,UAAM,KAAK,EAAE,IAAI,CAAC;AAClB,UAAM,KAAK,EAAE,IAAI,CAAC;AAClB,UAAM,KAAK,EAAE,IAAI,CAAC;AAClB,UAAM,KAAK,EAAE,KAAK,EAAE;AACpB,UAAM,MAAM,EAAE,KAAK,CAAC;AACpB,UAAM,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC/B,UAAM,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACtC,QAAI,SAAS;AACT,aAAO,IAAI,uCAAuC;AAEtD,UAAM,KAAK,EAAE,IAAI,CAAC;AAClB,UAAM,KAAK,EAAE,IAAI,CAAC;AAClB,QAAI,OAAO;AACP,aAAO,IAAI,uCAAuC;AACtD,WAAO;AAAA,EACX;AAAA;AAAA,EAEA,OAAO,OAAO;AACV,UAAM,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI;AAChC,UAAM,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,OAAO,KAAK;AAC5C,UAAM,OAAO,EAAE,KAAK,EAAE;AACtB,UAAM,OAAO,EAAE,KAAK,EAAE;AACtB,UAAM,OAAO,EAAE,KAAK,EAAE;AACtB,UAAM,OAAO,EAAE,KAAK,EAAE;AACtB,WAAO,SAAS,QAAQ,SAAS;AAAA,EACrC;AAAA,EACA,MAAM;AACF,WAAO,KAAK,OAAO,CAAC;AAAA,EACxB;AAAA;AAAA,EAEA,SAAS;AACL,WAAO,IAAI,OAAM,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;AAAA,EAC3D;AAAA;AAAA,EAEA,SAAS;AACL,UAAM,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI;AAChC,UAAM,IAAI;AAEV,UAAM,IAAI,EAAE,KAAK,EAAE;AACnB,UAAM,IAAI,EAAE,KAAK,EAAE;AACnB,UAAMC,KAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC3B,UAAM,IAAI,EAAE,IAAI,CAAC;AACjB,UAAM,OAAO,KAAK;AAClB,UAAM,IAAI,EAAE,EAAE,OAAO,IAAI,IAAI,IAAI,CAAC;AAClC,UAAMC,KAAI,IAAI;AACd,UAAM,IAAIA,KAAID;AACd,UAAM,IAAI,IAAI;AACd,UAAM,KAAK,EAAE,IAAI,CAAC;AAClB,UAAM,KAAK,EAAEC,KAAI,CAAC;AAClB,UAAM,KAAK,EAAE,IAAI,CAAC;AAClB,UAAM,KAAK,EAAE,IAAIA,EAAC;AAClB,WAAO,IAAI,OAAM,IAAI,IAAI,IAAI,EAAE;AAAA,EACnC;AAAA;AAAA,EAEA,IAAI,OAAO;AACP,UAAM,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI;AACvC,UAAM,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,OAAO,KAAK;AACnD,UAAM,IAAI;AACV,UAAM,IAAI;AAEV,UAAM,IAAI,EAAE,KAAK,EAAE;AACnB,UAAM,IAAI,EAAE,KAAK,EAAE;AACnB,UAAMD,KAAI,EAAE,KAAK,IAAI,EAAE;AACvB,UAAM,IAAI,EAAE,KAAK,EAAE;AACnB,UAAM,IAAI,GAAG,KAAK,OAAO,KAAK,MAAM,IAAI,CAAC;AACzC,UAAM,IAAI,EAAE,IAAIA,EAAC;AACjB,UAAMC,KAAI,EAAE,IAAID,EAAC;AACjB,UAAM,IAAI,EAAE,IAAI,IAAI,CAAC;AACrB,UAAM,KAAK,EAAE,IAAI,CAAC;AAClB,UAAM,KAAK,EAAEC,KAAI,CAAC;AAClB,UAAM,KAAK,EAAE,IAAI,CAAC;AAClB,UAAM,KAAK,EAAE,IAAIA,EAAC;AAClB,WAAO,IAAI,OAAM,IAAI,IAAI,IAAI,EAAE;AAAA,EACnC;AAAA,EACA,SAAS,OAAO;AACZ,WAAO,KAAK,IAAI,OAAO,KAAK,EAAE,OAAO,CAAC;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAS,GAAG,OAAO,MAAM;AACrB,QAAI,CAAC,SAAS,MAAM,MAAM,KAAK,IAAI;AAC/B,aAAO;AACX,gBAAY,GAAG,IAAI,CAAC;AACpB,QAAI,MAAM;AACN,aAAO;AACX,QAAI,KAAK,OAAO,CAAC;AACb,aAAO,KAAK,CAAC,EAAE;AAEnB,QAAI,IAAI;AACR,QAAI,IAAI;AACR,aAAS,IAAI,MAAM,IAAI,IAAI,IAAI,EAAE,OAAO,GAAG,MAAM,IAAI;AAGjD,UAAI,IAAI;AACJ,YAAI,EAAE,IAAI,CAAC;AAAA,eACN;AACL,YAAI,EAAE,IAAI,CAAC;AAAA,IACnB;AACA,WAAO;AAAA,EACX;AAAA,EACA,eAAe,QAAQ;AACnB,WAAO,KAAK,SAAS,QAAQ,KAAK;AAAA,EACtC;AAAA;AAAA,EAEA,WAAW;AACP,UAAM,EAAE,GAAG,GAAG,EAAE,IAAI;AAEpB,QAAI,KAAK,OAAO,CAAC;AACb,aAAO,EAAE,GAAG,IAAI,GAAG,GAAG;AAC1B,UAAM,KAAK,OAAO,GAAG,CAAC;AAEtB,QAAI,EAAE,IAAI,EAAE,MAAM;AACd,UAAI,iBAAiB;AAEzB,UAAM,IAAI,EAAE,IAAI,EAAE;AAClB,UAAM,IAAI,EAAE,IAAI,EAAE;AAClB,WAAO,EAAE,GAAG,EAAE;AAAA,EAClB;AAAA,EACA,UAAU;AACN,UAAM,EAAE,GAAG,EAAE,IAAI,KAAK,eAAe,EAAE,SAAS;AAChD,UAAM,IAAI,WAAW,CAAC;AAEtB,MAAE,EAAE,KAAK,IAAI,KAAK,MAAO;AACzB,WAAO;AAAA,EACX;AAAA,EACA,QAAQ;AACJ,WAAO,WAAW,KAAK,QAAQ,CAAC;AAAA,EACpC;AAAA,EACA,gBAAgB;AACZ,WAAO,KAAK,SAAS,IAAI,CAAC,GAAG,KAAK;AAAA,EACtC;AAAA,EACA,eAAe;AACX,WAAO,KAAK,cAAc,EAAE,IAAI;AAAA,EACpC;AAAA,EACA,gBAAgB;AAEZ,QAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE,OAAO;AAC5C,QAAI,IAAI;AACJ,UAAI,EAAE,IAAI,IAAI;AAClB,WAAO,EAAE,IAAI;AAAA,EACjB;AACJ;AAEA,IAAM,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC;AAE1C,IAAM,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,EAAE;AAElC,MAAM,OAAO;AACb,MAAM,OAAO;AACb,IAAM,aAAa,CAACC,SAAQ,WAAW,KAAK,YAAYA,MAAK,IAAI,IAAI,GAAG,EAAE,CAAC,EAAE,QAAQ;AACrF,IAAM,eAAe,CAAC,MAAM,IAAI,OAAO,WAAW,KAAK,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC5E,IAAM,OAAO,CAAC,GAAG,UAAU;AAEvB,MAAI,IAAI;AACR,SAAO,UAAU,IAAI;AACjB,SAAK;AACL,SAAK;AAAA,EACT;AACA,SAAO;AACX;AAEA,IAAM,cAAc,CAAC,MAAM;AACvB,QAAM,KAAM,IAAI,IAAK;AACrB,QAAM,KAAM,KAAK,IAAK;AACtB,QAAM,KAAM,KAAK,IAAI,EAAE,IAAI,KAAM;AACjC,QAAM,KAAM,KAAK,IAAI,EAAE,IAAI,IAAK;AAChC,QAAM,MAAO,KAAK,IAAI,EAAE,IAAI,KAAM;AAClC,QAAM,MAAO,KAAK,KAAK,GAAG,IAAI,MAAO;AACrC,QAAM,MAAO,KAAK,KAAK,GAAG,IAAI,MAAO;AACrC,QAAM,MAAO,KAAK,KAAK,GAAG,IAAI,MAAO;AACrC,QAAM,OAAQ,KAAK,KAAK,GAAG,IAAI,MAAO;AACtC,QAAM,OAAQ,KAAK,MAAM,GAAG,IAAI,MAAO;AACvC,QAAM,OAAQ,KAAK,MAAM,GAAG,IAAI,MAAO;AACvC,QAAM,YAAa,KAAK,MAAM,EAAE,IAAI,IAAK;AACzC,SAAO,EAAE,WAAW,GAAG;AAC3B;AACA,IAAM,MAAM;AAGZ,IAAM,UAAU,CAAC,GAAG,MAAM;AACtB,QAAM,KAAK,EAAE,IAAI,IAAI,CAAC;AACtB,QAAM,KAAK,EAAE,KAAK,KAAK,CAAC;AACxB,QAAM,MAAM,YAAY,IAAI,EAAE,EAAE;AAChC,MAAI,IAAI,EAAE,IAAI,KAAK,GAAG;AACtB,QAAM,MAAM,EAAE,IAAI,IAAI,CAAC;AACvB,QAAM,QAAQ;AACd,QAAM,QAAQ,EAAE,IAAI,GAAG;AACvB,QAAM,WAAW,QAAQ;AACzB,QAAM,WAAW,QAAQ,EAAE,CAAC,CAAC;AAC7B,QAAM,SAAS,QAAQ,EAAE,CAAC,IAAI,GAAG;AACjC,MAAI;AACA,QAAI;AACR,MAAI,YAAY;AACZ,QAAI;AACR,OAAK,EAAE,CAAC,IAAI,QAAQ;AAChB,QAAI,EAAE,CAAC,CAAC;AACZ,SAAO,EAAE,SAAS,YAAY,UAAU,OAAO,EAAE;AACrD;AAEA,IAAM,UAAU,CAAC,SAAS,KAAK,aAAa,IAAI,CAAC;AAIjD,IAAM,UAAU,IAAI,MAAM,SAAS,QAAQ,EAAE,YAAY,GAAG,CAAC,CAAC;AAsB9D,IAAM,cAAc,CAAC,QAAQ,IAAI,OAAO,QAAQ,IAAI,QAAQ,CAAC;AAkC7D,IAAM,oBAAoB,EAAE,QAAQ,KAAK;AACzC,IAAM,UAAU,CAAC,KAAK,KAAK,KAAK,OAAO,sBAAsB;AACzD,QAAM,OAAO,KAAK,EAAE;AACpB,QAAM,OAAO,GAAG;AAChB,QAAM,OAAO,KAAK,CAAC;AACnB,QAAM,EAAE,OAAO,IAAI;AACnB,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI,WAAW,WAAW,GAAG;AAC7B,MAAI;AACA,QAAI,MAAM,UAAU,KAAK,MAAM;AAC/B,QAAI,MAAM,UAAU,IAAI,MAAM,GAAG,CAAC,GAAG,MAAM;AAC3C,QAAI,aAAa,IAAI,MAAM,GAAG,EAAE,CAAC;AACjC,SAAK,EAAE,SAAS,GAAG,KAAK;AACxB,eAAW,YAAY,EAAE,QAAQ,GAAG,EAAE,QAAQ,GAAG,GAAG;AAAA,EACxD,SACO,OAAO;AAAA,EAAE;AAChB,QAAM,SAAS,CAAC,WAAW;AAEvB,QAAI,MAAM;AACN,aAAO;AACX,QAAI,CAAC,UAAU,EAAE,aAAa;AAC1B,aAAO;AACX,UAAM,IAAI,QAAQ,MAAM;AACxB,UAAM,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,KAAK,CAAC;AACtC,WAAO,IAAI,IAAI,GAAG,OAAO,CAAC,EAAE,cAAc,EAAE,IAAI;AAAA,EACpD;AACA,SAAO,EAAE,UAAU,OAAO;AAC9B;AAIA,IAAM,SAAS,CAAC,WAAW,SAAS,WAAW,OAAO,sBAAsB,YAAY,QAAQ,WAAW,SAAS,WAAW,IAAI,CAAC;AAUpI,IAAM,SAAS;AAAA,EACX,aAAa,OAAO,YAAY;AAC5B,UAAM,IAAI,OAAO;AACjB,UAAM,IAAI,YAAY,OAAO;AAC7B,WAAO,IAAI,MAAM,EAAE,OAAO,WAAW,EAAE,MAAM,CAAC;AAAA,EAClD;AAAA,EACA,QAAQ;AACZ;AAsBA,IAAM,IAAI;AACV,IAAM,aAAa;AACnB,IAAM,WAAW,KAAK,KAAK,aAAa,CAAC,IAAI;AAC7C,IAAM,cAAc,MAAM,IAAI;AAC9B,IAAM,aAAa,MAAM;AACrB,QAAM,SAAS,CAAC;AAChB,MAAI,IAAI;AACR,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AAC/B,QAAI;AACJ,WAAO,KAAK,CAAC;AACb,aAAS,IAAI,GAAG,IAAI,aAAa,KAAK;AAClC,UAAI,EAAE,IAAI,CAAC;AACX,aAAO,KAAK,CAAC;AAAA,IACjB;AACA,QAAI,EAAE,OAAO;AAAA,EACjB;AACA,SAAO;AACX;AACA,IAAI,QAAQ;AAEZ,IAAM,QAAQ,CAAC,KAAK,MAAM;AACtB,QAAM,IAAI,EAAE,OAAO;AACnB,SAAO,MAAM,IAAI;AACrB;AAYA,IAAM,OAAO,CAAC,MAAM;AAChB,QAAM,OAAO,UAAU,QAAQ,WAAW;AAC1C,MAAI,IAAI;AACR,MAAI,IAAI;AACR,QAAM,UAAU,KAAK;AACrB,QAAM,SAAS;AACf,QAAM,OAAO,IAAI,UAAU,CAAC;AAC5B,QAAM,UAAU,IAAI,CAAC;AACrB,WAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AAC/B,QAAI,QAAQ,OAAO,IAAI,IAAI;AAC3B,UAAM;AAMN,QAAI,QAAQ,aAAa;AACrB,eAAS;AACT,WAAK;AAAA,IACT;AACA,UAAM,MAAM,IAAI;AAChB,UAAM,OAAO;AACb,UAAM,OAAO,MAAM,KAAK,IAAI,KAAK,IAAI;AACrC,UAAM,SAAS,IAAI,MAAM;AACzB,UAAM,QAAQ,QAAQ;AACtB,QAAI,UAAU,GAAG;AAEb,UAAI,EAAE,IAAI,MAAM,QAAQ,KAAK,IAAI,CAAC,CAAC;AAAA,IACvC,OACK;AACD,UAAI,EAAE,IAAI,MAAM,OAAO,KAAK,IAAI,CAAC,CAAC;AAAA,IACtC;AAAA,EACJ;AACA,MAAI,MAAM;AACN,QAAI,cAAc;AACtB,SAAO,EAAE,GAAG,EAAE;AAClB;;;ACpmBM,SAAUC,SAAQ,GAAU;AAChC,SAAO,aAAa,cAAe,YAAY,OAAO,CAAC,KAAK,EAAE,YAAY,SAAS;AACrF;AAQM,SAAUC,QAAO,MAA8B,SAAiB;AACpE,MAAI,CAACC,SAAQ,CAAC;AAAG,UAAM,IAAI,MAAM,qBAAqB;AACtD,MAAI,QAAQ,SAAS,KAAK,CAAC,QAAQ,SAAS,EAAE,MAAM;AAClD,UAAM,IAAI,MAAM,mCAAmC,UAAU,kBAAkB,EAAE,MAAM;AAC3F;AAWM,SAAU,QAAQ,UAAe,gBAAgB,MAAI;AACzD,MAAI,SAAS;AAAW,UAAM,IAAI,MAAM,kCAAkC;AAC1E,MAAI,iBAAiB,SAAS;AAAU,UAAM,IAAI,MAAM,uCAAuC;AACjG;AAGM,SAAU,QAAQ,KAAU,UAAa;AAC7C,EAAAC,QAAO,GAAG;AACV,QAAM,MAAM,SAAS;AACrB,MAAI,IAAI,SAAS,KAAK;AACpB,UAAM,IAAI,MAAM,2DAA2D,GAAG;EAChF;AACF;AAkBM,SAAU,SAAS,QAAoB;AAC3C,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,WAAO,CAAC,EAAE,KAAK,CAAC;EAClB;AACF;AAGM,SAAU,WAAW,KAAe;AACxC,SAAO,IAAI,SAAS,IAAI,QAAQ,IAAI,YAAY,IAAI,UAAU;AAChE;AAuIM,SAAU,YAAYC,MAAW;AACrC,MAAI,OAAOA,SAAQ;AAAU,UAAM,IAAI,MAAM,iBAAiB;AAC9D,SAAO,IAAI,WAAW,IAAI,YAAW,EAAG,OAAOA,IAAG,CAAC;AACrD;AAiBM,SAAU,QAAQ,MAAW;AACjC,MAAI,OAAO,SAAS;AAAU,WAAO,YAAY,IAAI;AACrD,EAAAC,QAAO,IAAI;AACX,SAAO;AACT;AAmDM,IAAgB,OAAhB,MAAoB;;AA4CpB,SAAU,aACd,UAAuB;AAOvB,QAAM,QAAQ,CAAC,QAA2B,SAAQ,EAAG,OAAO,QAAQ,GAAG,CAAC,EAAE,OAAM;AAChF,QAAM,MAAM,SAAQ;AACpB,QAAM,YAAY,IAAI;AACtB,QAAM,WAAW,IAAI;AACrB,QAAM,SAAS,MAAM,SAAQ;AAC7B,SAAO;AACT;;;ACpVM,SAAU,aACd,MACA,YACA,OACA,MAAa;AAEb,MAAI,OAAO,KAAK,iBAAiB;AAAY,WAAO,KAAK,aAAa,YAAY,OAAO,IAAI;AAC7F,QAAMC,QAAO,OAAO,EAAE;AACtB,QAAM,WAAW,OAAO,UAAU;AAClC,QAAM,KAAK,OAAQ,SAASA,QAAQ,QAAQ;AAC5C,QAAM,KAAK,OAAO,QAAQ,QAAQ;AAClC,QAAMC,KAAI,OAAO,IAAI;AACrB,QAAM,IAAI,OAAO,IAAI;AACrB,OAAK,UAAU,aAAaA,IAAG,IAAI,IAAI;AACvC,OAAK,UAAU,aAAa,GAAG,IAAI,IAAI;AACzC;AAgBM,IAAgB,SAAhB,cAAoD,KAAO;EAoB/D,YAAY,UAAkB,WAAmB,WAAmB,MAAa;AAC/E,UAAK;AANG,SAAA,WAAW;AACX,SAAA,SAAS;AACT,SAAA,MAAM;AACN,SAAA,YAAY;AAIpB,SAAK,WAAW;AAChB,SAAK,YAAY;AACjB,SAAK,YAAY;AACjB,SAAK,OAAO;AACZ,SAAK,SAAS,IAAI,WAAW,QAAQ;AACrC,SAAK,OAAO,WAAW,KAAK,MAAM;EACpC;EACA,OAAO,MAAW;AAChB,YAAQ,IAAI;AACZ,WAAO,QAAQ,IAAI;AACnB,IAAAC,QAAO,IAAI;AACX,UAAM,EAAE,MAAM,QAAQ,SAAQ,IAAK;AACnC,UAAM,MAAM,KAAK;AACjB,aAAS,MAAM,GAAG,MAAM,OAAO;AAC7B,YAAM,OAAO,KAAK,IAAI,WAAW,KAAK,KAAK,MAAM,GAAG;AAEpD,UAAI,SAAS,UAAU;AACrB,cAAM,WAAW,WAAW,IAAI;AAChC,eAAO,YAAY,MAAM,KAAK,OAAO;AAAU,eAAK,QAAQ,UAAU,GAAG;AACzE;MACF;AACA,aAAO,IAAI,KAAK,SAAS,KAAK,MAAM,IAAI,GAAG,KAAK,GAAG;AACnD,WAAK,OAAO;AACZ,aAAO;AACP,UAAI,KAAK,QAAQ,UAAU;AACzB,aAAK,QAAQ,MAAM,CAAC;AACpB,aAAK,MAAM;MACb;IACF;AACA,SAAK,UAAU,KAAK;AACpB,SAAK,WAAU;AACf,WAAO;EACT;EACA,WAAW,KAAe;AACxB,YAAQ,IAAI;AACZ,YAAQ,KAAK,IAAI;AACjB,SAAK,WAAW;AAIhB,UAAM,EAAE,QAAQ,MAAM,UAAU,KAAI,IAAK;AACzC,QAAI,EAAE,IAAG,IAAK;AAEd,WAAO,KAAK,IAAI;AAChB,UAAM,KAAK,OAAO,SAAS,GAAG,CAAC;AAG/B,QAAI,KAAK,YAAY,WAAW,KAAK;AACnC,WAAK,QAAQ,MAAM,CAAC;AACpB,YAAM;IACR;AAEA,aAAS,IAAI,KAAK,IAAI,UAAU;AAAK,aAAO,CAAC,IAAI;AAIjD,iBAAa,MAAM,WAAW,GAAG,OAAO,KAAK,SAAS,CAAC,GAAG,IAAI;AAC9D,SAAK,QAAQ,MAAM,CAAC;AACpB,UAAM,QAAQ,WAAW,GAAG;AAC5B,UAAM,MAAM,KAAK;AAEjB,QAAI,MAAM;AAAG,YAAM,IAAI,MAAM,6CAA6C;AAC1E,UAAM,SAAS,MAAM;AACrB,UAAM,QAAQ,KAAK,IAAG;AACtB,QAAI,SAAS,MAAM;AAAQ,YAAM,IAAI,MAAM,oCAAoC;AAC/E,aAAS,IAAI,GAAG,IAAI,QAAQ;AAAK,YAAM,UAAU,IAAI,GAAG,MAAM,CAAC,GAAG,IAAI;EACxE;EACA,SAAM;AACJ,UAAM,EAAE,QAAQ,UAAS,IAAK;AAC9B,SAAK,WAAW,MAAM;AACtB,UAAM,MAAM,OAAO,MAAM,GAAG,SAAS;AACrC,SAAK,QAAO;AACZ,WAAO;EACT;EACA,WAAW,IAAM;AACf,WAAA,KAAO,IAAK,KAAK,YAAmB;AACpC,OAAG,IAAI,GAAG,KAAK,IAAG,CAAE;AACpB,UAAM,EAAE,UAAU,QAAQ,QAAQ,UAAU,WAAW,IAAG,IAAK;AAC/D,OAAG,YAAY;AACf,OAAG,WAAW;AACd,OAAG,SAAS;AACZ,OAAG,MAAM;AACT,QAAI,SAAS;AAAU,SAAG,OAAO,IAAI,MAAM;AAC3C,WAAO;EACT;EACA,QAAK;AACH,WAAO,KAAK,WAAU;EACxB;;AAyBK,IAAM,YAAyC,4BAAY,KAAK;EACrE;EAAY;EAAY;EAAY;EAAY;EAAY;EAAY;EAAY;EACpF;EAAY;EAAY;EAAY;EAAY;EAAY;EAAY;EAAY;CACrF;;;AC1KD,IAAM,aAA6B,uBAAO,KAAK,KAAK,CAAC;AACrD,IAAM,OAAuB,uBAAO,EAAE;AAEtC,SAAS,QACP,GACA,KAAK,OAAK;AAKV,MAAI;AAAI,WAAO,EAAE,GAAG,OAAO,IAAI,UAAU,GAAG,GAAG,OAAQ,KAAK,OAAQ,UAAU,EAAC;AAC/E,SAAO,EAAE,GAAG,OAAQ,KAAK,OAAQ,UAAU,IAAI,GAAG,GAAG,OAAO,IAAI,UAAU,IAAI,EAAC;AACjF;AAEA,SAAS,MAAM,KAAe,KAAK,OAAK;AACtC,QAAM,MAAM,IAAI;AAChB,MAAI,KAAK,IAAI,YAAY,GAAG;AAC5B,MAAI,KAAK,IAAI,YAAY,GAAG;AAC5B,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,UAAM,EAAE,GAAAC,IAAG,EAAC,IAAK,QAAQ,IAAI,CAAC,GAAG,EAAE;AACnC,KAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAACA,IAAG,CAAC;EACxB;AACA,SAAO,CAAC,IAAI,EAAE;AAChB;AAIA,IAAM,QAAQ,CAACC,IAAW,IAAY,MAAsBA,OAAM;AAClE,IAAM,QAAQ,CAACA,IAAW,GAAW,MAAuBA,MAAM,KAAK,IAAO,MAAM;AAEpF,IAAM,SAAS,CAACA,IAAW,GAAW,MAAuBA,OAAM,IAAM,KAAM,KAAK;AACpF,IAAM,SAAS,CAACA,IAAW,GAAW,MAAuBA,MAAM,KAAK,IAAO,MAAM;AAErF,IAAM,SAAS,CAACA,IAAW,GAAW,MAAuBA,MAAM,KAAK,IAAO,MAAO,IAAI;AAC1F,IAAM,SAAS,CAACA,IAAW,GAAW,MAAuBA,OAAO,IAAI,KAAQ,KAAM,KAAK;AAa3F,SAAS,IACP,IACA,IACA,IACA,IAAU;AAKV,QAAM,KAAK,OAAO,MAAM,OAAO;AAC/B,SAAO,EAAE,GAAI,KAAK,MAAO,IAAI,KAAK,KAAM,KAAM,GAAG,GAAG,IAAI,EAAC;AAC3D;AAEA,IAAM,QAAQ,CAAC,IAAY,IAAY,QAAwB,OAAO,MAAM,OAAO,MAAM,OAAO;AAChG,IAAM,QAAQ,CAAC,KAAa,IAAY,IAAY,OACjD,KAAK,KAAK,MAAO,MAAM,KAAK,KAAM,KAAM;AAC3C,IAAM,QAAQ,CAAC,IAAY,IAAY,IAAY,QAChD,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO;AACjD,IAAM,QAAQ,CAAC,KAAa,IAAY,IAAY,IAAY,OAC7D,KAAK,KAAK,KAAK,MAAO,MAAM,KAAK,KAAM,KAAM;AAChD,IAAM,QAAQ,CAAC,IAAY,IAAY,IAAY,IAAY,QAC5D,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO;AAC9D,IAAM,QAAQ,CAAC,KAAa,IAAY,IAAY,IAAY,IAAY,OACzE,KAAK,KAAK,KAAK,KAAK,MAAO,MAAM,KAAK,KAAM,KAAM;;;ACmDrD,IAAM,OAAwB,uBAAU,MAAM;EAC5C;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE,IAAI,OAAK,OAAO,CAAC,CAAC,CAAC,GAAE;AACvB,IAAM,YAA6B,uBAAM,KAAK,CAAC,GAAE;AACjD,IAAM,YAA6B,uBAAM,KAAK,CAAC,GAAE;AAGjD,IAAM,aAA6B,oBAAI,YAAY,EAAE;AACrD,IAAM,aAA6B,oBAAI,YAAY,EAAE;AAE/C,IAAO,SAAP,cAAsB,OAAc;EAqBxC,YAAY,YAAoB,IAAE;AAChC,UAAM,KAAK,WAAW,IAAI,KAAK;AAlBvB,SAAA,KAAa,UAAU,CAAC,IAAI;AAC5B,SAAA,KAAa,UAAU,CAAC,IAAI;AAC5B,SAAA,KAAa,UAAU,CAAC,IAAI;AAC5B,SAAA,KAAa,UAAU,CAAC,IAAI;AAC5B,SAAA,KAAa,UAAU,CAAC,IAAI;AAC5B,SAAA,KAAa,UAAU,CAAC,IAAI;AAC5B,SAAA,KAAa,UAAU,CAAC,IAAI;AAC5B,SAAA,KAAa,UAAU,CAAC,IAAI;AAC5B,SAAA,KAAa,UAAU,CAAC,IAAI;AAC5B,SAAA,KAAa,UAAU,CAAC,IAAI;AAC5B,SAAA,KAAa,UAAU,EAAE,IAAI;AAC7B,SAAA,KAAa,UAAU,EAAE,IAAI;AAC7B,SAAA,KAAa,UAAU,EAAE,IAAI;AAC7B,SAAA,KAAa,UAAU,EAAE,IAAI;AAC7B,SAAA,KAAa,UAAU,EAAE,IAAI;AAC7B,SAAA,KAAa,UAAU,EAAE,IAAI;EAIvC;;EAEU,MAAG;AAIX,UAAM,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAE,IAAK;AAC3E,WAAO,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;EACxE;;EAEU,IACR,IAAY,IAAY,IAAY,IAAY,IAAY,IAAY,IAAY,IACpF,IAAY,IAAY,IAAY,IAAY,IAAY,IAAY,IAAY,IAAU;AAE9F,SAAK,KAAK,KAAK;AACf,SAAK,KAAK,KAAK;AACf,SAAK,KAAK,KAAK;AACf,SAAK,KAAK,KAAK;AACf,SAAK,KAAK,KAAK;AACf,SAAK,KAAK,KAAK;AACf,SAAK,KAAK,KAAK;AACf,SAAK,KAAK,KAAK;AACf,SAAK,KAAK,KAAK;AACf,SAAK,KAAK,KAAK;AACf,SAAK,KAAK,KAAK;AACf,SAAK,KAAK,KAAK;AACf,SAAK,KAAK,KAAK;AACf,SAAK,KAAK,KAAK;AACf,SAAK,KAAK,KAAK;AACf,SAAK,KAAK,KAAK;EACjB;EACU,QAAQ,MAAgB,QAAc;AAE9C,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK,UAAU,GAAG;AACxC,iBAAW,CAAC,IAAI,KAAK,UAAU,MAAM;AACrC,iBAAW,CAAC,IAAI,KAAK,UAAW,UAAU,CAAE;IAC9C;AACA,aAAS,IAAI,IAAI,IAAI,IAAI,KAAK;AAE5B,YAAM,OAAO,WAAW,IAAI,EAAE,IAAI;AAClC,YAAM,OAAO,WAAW,IAAI,EAAE,IAAI;AAClC,YAAM,MAAU,OAAO,MAAM,MAAM,CAAC,IAAQ,OAAO,MAAM,MAAM,CAAC,IAAQ,MAAM,MAAM,MAAM,CAAC;AAC3F,YAAM,MAAU,OAAO,MAAM,MAAM,CAAC,IAAQ,OAAO,MAAM,MAAM,CAAC,IAAQ,MAAM,MAAM,MAAM,CAAC;AAE3F,YAAM,MAAM,WAAW,IAAI,CAAC,IAAI;AAChC,YAAM,MAAM,WAAW,IAAI,CAAC,IAAI;AAChC,YAAM,MAAU,OAAO,KAAK,KAAK,EAAE,IAAQ,OAAO,KAAK,KAAK,EAAE,IAAQ,MAAM,KAAK,KAAK,CAAC;AACvF,YAAM,MAAU,OAAO,KAAK,KAAK,EAAE,IAAQ,OAAO,KAAK,KAAK,EAAE,IAAQ,MAAM,KAAK,KAAK,CAAC;AAEvF,YAAM,OAAW,MAAM,KAAK,KAAK,WAAW,IAAI,CAAC,GAAG,WAAW,IAAI,EAAE,CAAC;AACtE,YAAM,OAAW,MAAM,MAAM,KAAK,KAAK,WAAW,IAAI,CAAC,GAAG,WAAW,IAAI,EAAE,CAAC;AAC5E,iBAAW,CAAC,IAAI,OAAO;AACvB,iBAAW,CAAC,IAAI,OAAO;IACzB;AACA,QAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAE,IAAK;AAEzE,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAE3B,YAAM,UAAc,OAAO,IAAI,IAAI,EAAE,IAAQ,OAAO,IAAI,IAAI,EAAE,IAAQ,OAAO,IAAI,IAAI,EAAE;AACvF,YAAM,UAAc,OAAO,IAAI,IAAI,EAAE,IAAQ,OAAO,IAAI,IAAI,EAAE,IAAQ,OAAO,IAAI,IAAI,EAAE;AAEvF,YAAM,OAAQ,KAAK,KAAO,CAAC,KAAK;AAChC,YAAM,OAAQ,KAAK,KAAO,CAAC,KAAK;AAGhC,YAAM,OAAW,MAAM,IAAI,SAAS,MAAM,UAAU,CAAC,GAAG,WAAW,CAAC,CAAC;AACrE,YAAM,MAAU,MAAM,MAAM,IAAI,SAAS,MAAM,UAAU,CAAC,GAAG,WAAW,CAAC,CAAC;AAC1E,YAAM,MAAM,OAAO;AAEnB,YAAM,UAAc,OAAO,IAAI,IAAI,EAAE,IAAQ,OAAO,IAAI,IAAI,EAAE,IAAQ,OAAO,IAAI,IAAI,EAAE;AACvF,YAAM,UAAc,OAAO,IAAI,IAAI,EAAE,IAAQ,OAAO,IAAI,IAAI,EAAE,IAAQ,OAAO,IAAI,IAAI,EAAE;AACvF,YAAM,OAAQ,KAAK,KAAO,KAAK,KAAO,KAAK;AAC3C,YAAM,OAAQ,KAAK,KAAO,KAAK,KAAO,KAAK;AAC3C,WAAK,KAAK;AACV,WAAK,KAAK;AACV,WAAK,KAAK;AACV,WAAK,KAAK;AACV,WAAK,KAAK;AACV,WAAK,KAAK;AACV,OAAC,EAAE,GAAG,IAAI,GAAG,GAAE,IAAS,IAAI,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAC5D,WAAK,KAAK;AACV,WAAK,KAAK;AACV,WAAK,KAAK;AACV,WAAK,KAAK;AACV,WAAK,KAAK;AACV,WAAK,KAAK;AACV,YAAM,MAAU,MAAM,KAAK,SAAS,IAAI;AACxC,WAAS,MAAM,KAAK,KAAK,SAAS,IAAI;AACtC,WAAK,MAAM;IACb;AAEA,KAAC,EAAE,GAAG,IAAI,GAAG,GAAE,IAAS,IAAI,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AACpE,KAAC,EAAE,GAAG,IAAI,GAAG,GAAE,IAAS,IAAI,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AACpE,KAAC,EAAE,GAAG,IAAI,GAAG,GAAE,IAAS,IAAI,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AACpE,KAAC,EAAE,GAAG,IAAI,GAAG,GAAE,IAAS,IAAI,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AACpE,KAAC,EAAE,GAAG,IAAI,GAAG,GAAE,IAAS,IAAI,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AACpE,KAAC,EAAE,GAAG,IAAI,GAAG,GAAE,IAAS,IAAI,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AACpE,KAAC,EAAE,GAAG,IAAI,GAAG,GAAE,IAAS,IAAI,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AACpE,KAAC,EAAE,GAAG,IAAI,GAAG,GAAE,IAAS,IAAI,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AACpE,SAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;EACzE;EACU,aAAU;AAClB,UAAM,YAAY,UAAU;EAC9B;EACA,UAAO;AACL,UAAM,KAAK,MAAM;AACjB,SAAK,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;EACzD;;AAuGK,IAAM,SAAgC,6BAAa,MAAM,IAAI,OAAM,CAAE;;;AC7X5E,OAAO,SAAS;AAEhB,SAAS,iBAAiB,GAAuB;AAC/C,QAAM,MAAM,EAAE,SAAS;AACvB,QAAM,SAAS,EAAE,QAAQ,MAAM,GAAG,EAAE,QAAQ,MAAM,GAAG,KAAK,MAAM,IAAI,OAAO,IAAI,GAAG,IAAI;AACtF,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO,IAAI,WAAW,OAAO,KAAK,QAAQ,QAAQ,CAAC;AAAA,EACrD;AACA,QAAM,SAAS,KAAK,MAAM;AAC1B,SAAO,WAAW,KAAK,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AACvD;AAEA,eAAsB,2BAA2B,QAQZ;AACnC,MAAI;AACF,UAAM,EAAE,SAAS,iBAAiB,IAAI,IAAI;AAE1C,QAAI;AAEJ,QAAI,IAAI,KAAK;AACX,UAAI,IAAI,IAAI,QAAQ,SAAS,IAAI,IAAI,QAAQ,WAAW;AACtD,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,MAAM,cAAc;AAAA,UACpB,SAAS;AAAA,YACP,kDAAkD,IAAI,IAAI,GAAG,QAAQ,IAAI,IAAI,GAAG;AAAA,UAClF;AAAA,QACF;AAAA,MACF;AACA,oBAAc,iBAAiB,IAAI,IAAI,CAAC;AAAA,IAC1C,WAAW,IAAI,WAAW;AACxB,oBAAc,iBAAiB,IAAI,SAAS;AAAA,IAC9C,WAAW,IAAI,SAAS;AACtB,YAAM,YAAY,iBAAiB,IAAI,OAAO;AAC9C,UAAI,UAAU,SAAS,IAAI;AACzB,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,MAAM,cAAc;AAAA,UACpB,SAAS,CAAC,kDAAkD;AAAA,QAC9D;AAAA,MACF;AACA,oBAAc,UAAU,MAAM,UAAU,SAAS,EAAE;AAAA,IACrD,OAAO;AACL,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM,cAAc;AAAA,QACpB,SAAS,CAAC,2DAA2D;AAAA,MACvE;AAAA,IACF;AAEA,QAAI,YAAY,WAAW,IAAI;AAC7B,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM,cAAc;AAAA,QACpB,SAAS,CAAC,4CAA4C,YAAY,MAAM,EAAE;AAAA,MAC5E;AAAA,IACF;AAEA,UAAM,WAAW,iBAAiB,eAAe;AAEjD,QAAI,SAAS,WAAW,IAAI;AAC1B,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM,cAAc;AAAA,QACpB,SAAS,CAAC,2CAA2C,SAAS,MAAM,EAAE;AAAA,MACxE;AAAA,IACF;AAEA,UAAM,WAAW,IAAI,YAAY,EAAE,OAAO,gBAAgB,OAAO,CAAC;AAElE,UAAM,UAAU,MAAM,OAAO,UAAU,UAAU,WAAW;AAE5D,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM,cAAc;AAAA,QACpB,SAAS,CAAC,uCAAuC;AAAA,MACnD;AAAA,IACF;AAEA,WAAO,EAAE,IAAI,MAAM,MAAM,cAAc,GAAG;AAAA,EAC5C,SAASC,MAAK;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM,cAAc;AAAA,MACpB,SAAS,CAACA,gBAAe,QAAQA,KAAI,UAAU,OAAOA,IAAG,CAAC;AAAA,IAC5D;AAAA,EACF;AACF;AAEA,eAAsB,cAAc,SAA4C;AAC9E,QAAM,MAAM,GAAG,QAAQ,QAAQ,QAAQ,EAAE,CAAC;AAC1C,QAAM,WAAW,MAAM,MAAM,GAAG;AAChC,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,kCAAkC,GAAG,UAAU,SAAS,MAAM,EAAE;AAAA,EAClF;AACA,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,MAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C,UAAM,IAAI,MAAM,qCAAqC;AAAA,EACvD;AACA,QAAM,MAAM;AACZ,MAAI,OAAO,IAAI,WAAW,YAAY,CAAC,MAAM,QAAQ,IAAI,IAAI,GAAG;AAC9D,UAAM,IAAI,MAAM,2DAA2D;AAAA,EAC7E;AACA,SAAO;AACT;AAMO,SAAS,cAAc,KAAuB,KAA+B;AAClF,MAAI,KAAK;AACP,UAAM,QAAQ,IAAI,KAAK,KAAK,CAAC,MAAM,EAAE,QAAQ,GAAG;AAChD,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,QACL,OAAO;AAAA,UACL,IAAI;AAAA,UACJ,MAAM,cAAc;AAAA,UACpB,SAAS,CAAC,iBAAiB,GAAG,mCAAmC;AAAA,QACnE;AAAA,MACF;AAAA,IACF;AACA,WAAO,EAAE,KAAK,MAAM;AAAA,EACtB;AAEA,MAAI,IAAI,WAAW;AACjB,UAAM,QAAQ,IAAI,KAAK,KAAK,CAAC,MAAM,EAAE,QAAQ,IAAI,SAAS;AAC1D,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,QACL,OAAO;AAAA,UACL,IAAI;AAAA,UACJ,MAAM,cAAc;AAAA,UACpB,SAAS,CAAC,cAAc,IAAI,SAAS,2BAA2B;AAAA,QAClE;AAAA,MACF;AAAA,IACF;AACA,WAAO,EAAE,KAAK,MAAM;AAAA,EACtB;AAEA,MAAI,IAAI,KAAK,WAAW,GAAG;AACzB,WAAO;AAAA,MACL,OAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM,cAAc;AAAA,QACpB,SAAS,CAAC,yCAAyC;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,KAAK,IAAI,KAAK,CAAC,EAAE;AAC5B;AAEA,SAAS,2BAA2B,QAI3B;AACP,MAAI,OAAO,WAAW,YAAY,WAAW,KAAM,QAAO;AAC1D,QAAM,IAAI;AAEV,MAAI,OAAO,EAAE,YAAY,YAAY,EAAE,YAAY,QAAQ,OAAO,EAAE,cAAc,UAAU;AAC1F,WAAO;AAAA,MACL,SAAS,EAAE;AAAA,MACX,iBAAiB,EAAE;AAAA,MACnB,eAAe,OAAO,EAAE,kBAAkB,WAAW,EAAE,gBAAgB;AAAA,IACzE;AAAA,EACF;AAEA,MAAI,OAAO,EAAE,SAAS,YAAY,EAAE,SAAS,MAAM;AACjD,UAAM,OAAO,EAAE;AACf,QAAI,OAAO,KAAK,gBAAgB,YAAY,KAAK,gBAAgB,MAAM;AACrE,YAAM,MAAM,KAAK;AACjB,UAAI,OAAO,IAAI,YAAY,YAAY,IAAI,YAAY,QAAQ,OAAO,IAAI,cAAc,UAAU;AAChG,eAAO;AAAA,UACL,SAAS,IAAI;AAAA,UACb,iBAAiB,IAAI;AAAA,UACrB,eAAe,OAAO,IAAI,kBAAkB,WAAW,IAAI,gBAAgB;AAAA,QAC7E;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,wBACpB,QACA,SACkC;AAClC,QAAM,YAAY,2BAA2B,MAAM;AAEnD,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM,cAAc;AAAA,MACpB,SAAS,CAAC,gFAAgF;AAAA,IAC5F;AAAA,EACF;AAEA,QAAM,SAAS,UAAU,QAAQ;AACjC,QAAM,cAAc,QAAQ,OAAO,UAAU,iBAAiB,UAAU,QAAQ;AAEhF,WAAS,MAAgB;AACvB,UAAM,QAAkB,CAAC;AACzB,QAAI,OAAQ,OAAM,KAAK,WAAW,MAAM,EAAE;AAC1C,QAAI,YAAa,OAAM,KAAK,QAAQ,WAAW,EAAE;AACjD,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI;AACF,cAAU,MAAM,cAAc,QAAQ,OAAO;AAAA,EAC/C,SAASA,MAAK;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM,cAAc;AAAA,MACpB,SAAS,CAAC,GAAG,IAAI,GAAGA,gBAAe,QAAQA,KAAI,UAAU,OAAOA,IAAG,CAAC;AAAA,IACtE;AAAA,EACF;AAEA,MAAI,OAAQ,OAAmC,oBAAoB,UAAU;AAC3E,UAAM,iBAAkB,OAAmC;AAC3D,QAAI,UAAU,QAAQ,oBAAoB,gBAAgB;AACxD,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM,cAAc;AAAA,QACpB,SAAS;AAAA,UACP;AAAA,UACA,4BAA4B,UAAU,QAAQ,eAAe;AAAA,UAC7D,4BAA4B,cAAc;AAAA,UAC1C,GAAG,IAAI;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,cAAc,SAAS,WAAW;AACnD,MAAI,SAAS,OAAO;AAClB,WAAO;AAAA,MACL,GAAG,SAAS;AAAA,MACZ,SAAS,CAAC,GAAG,IAAI,GAAG,GAAI,SAAS,MAAM,WAAW,CAAC,CAAE;AAAA,IACvD;AAAA,EACF;AACA,QAAM,WAAW,SAAS;AAE1B,QAAM,WAAoE,CAAC;AAC3E,MAAI,SAAS,aAAc,UAAS,MAAM,SAAS;AAAA,WAC1C,SAAS,UAAW,UAAS,YAAY,SAAS;AAAA,WAClD,SAAS,iBAAkB,UAAS,UAAU,SAAS;AAAA,OAC3D;AACH,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM,cAAc;AAAA,MACpB,SAAS;AAAA,QACP,YAAY,SAAS,GAAG;AAAA,QACxB,GAAG,IAAI;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,2BAA2B;AAAA,IACjD,SAAS,UAAU;AAAA,IACnB,iBAAiB,UAAU;AAAA,IAC3B,KAAK;AAAA,EACP,CAAC;AAED,QAAM,eAAe,IAAI;AACzB,MAAI,aAAa,WAAW,EAAG,QAAO;AAEtC,SAAO,UAAU,KACb,EAAE,IAAI,MAAM,MAAM,cAAc,IAAI,SAAS,aAAa,IAC1D,EAAE,GAAG,WAAW,SAAS,CAAC,GAAG,cAAc,GAAI,UAAU,WAAW,CAAC,CAAE,EAAE;AAC/E;;;ACjRA,IAAAC,UAAwB;;;ACyBxB,SAAS,IAAI,GAA2B;AACtC,SAAO,OAAO,MAAM,YAAY,EAAE,SAAS,IAAI,IAAI;AACrD;AAEA,SAAS,IAAI,GAAY,UAA0B;AACjD,SAAO,OAAO,MAAM,YAAY,OAAO,SAAS,CAAC,IAAI,IAAI;AAC3D;AAEA,SAAS,UAAU,GAA2B;AAC5C,SAAO,OAAO,MAAM,YAAY,OAAO,SAAS,CAAC,IAAI,IAAI;AAC3D;AAGA,SAAS,qBAAqB,UAAkD;AAC9E,QAAM,UAAU,SAAS;AACzB,MAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,QAAQ,WAAW,EAAG,QAAO;AAC5D,QAAM,QAAQ,QAAQ,CAAC;AACvB,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,MAAM,MAAM;AAClB,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAE5C,MAAI,OAAO,IAAI,YAAY,SAAU,QAAO,IAAI;AAChD,MAAI,MAAM,QAAQ,IAAI,OAAO,GAAG;AAC9B,UAAM,QAAS,IAAI,QAChB,OAAO,CAAC,MAAoC,OAAO,MAAM,YAAY,MAAM,IAAI,EAC/E,IAAI,CAAC,MAAM,IAAK,EAA8B,IAAI,CAAC,EACnD,OAAO,CAAC,MAAmB,MAAM,IAAI;AACxC,WAAO,MAAM,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI;AAAA,EAC/C;AACA,SAAO;AACT;AAGA,SAAS,uBAAuB,UAAkD;AAChF,QAAM,UAAU,SAAS;AACzB,MAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,QAAQ,WAAW,EAAG,QAAO;AAC5D,QAAM,QAAQ,QAAQ,CAAC;AACvB,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,SAAO,IAAI,MAAM,IAAI;AACvB;AAGA,SAAS,oBAAoB,UAAkD;AAC7E,QAAM,aAAa,SAAS;AAC5B,MAAI,CAAC,MAAM,QAAQ,UAAU,KAAK,WAAW,WAAW,EAAG,QAAO;AAClE,QAAM,QAAQ,WAAW,CAAC;AAC1B,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,aAAa,MAAM;AACzB,MAAI,CAAC,cAAc,OAAO,eAAe,SAAU,QAAO;AAC1D,QAAM,QAAQ,WAAW;AACzB,MAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,EAAG,QAAO;AACxD,QAAM,OAAO,MAAM,CAAC;AACpB,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAC9C,SAAO,IAAI,KAAK,IAAI;AACtB;AAGA,SAAS,qBAAqB,UAAkD;AAC9E,SACE,IAAI,SAAS,IAAI,KACjB,IAAI,SAAS,WAAW,MACvB,OAAO,SAAS,WAAW,WAAW,SAAS,SAAS,SACzD,IAAI,SAAS,MAAM,KACnB;AAEJ;AAGA,SAAS,cAAc,UAAkD;AACvE,SACE,qBAAqB,QAAQ,KAC7B,uBAAuB,QAAQ,KAC/B,oBAAoB,QAAQ,KAC5B,qBAAqB,QAAQ;AAEjC;AAGA,SAAS,aAAa,SAA2E;AAE/F,MAAI,MAAM,QAAQ,QAAQ,QAAQ,KAAK,QAAQ,SAAS,SAAS,GAAG;AAClE,WAAO,EAAE,UAAU,QAAQ,SAAS;AAAA,EACtC;AAEA,MAAI,MAAM,QAAQ,QAAQ,QAAQ,KAAK,QAAQ,SAAS,SAAS,GAAG;AAClE,WAAO,EAAE,UAAU,QAAQ,SAAS;AAAA,EACtC;AAEA,MAAI,OAAO,QAAQ,WAAW,SAAU,QAAO,QAAQ;AAEvD,MAAI,OAAO,QAAQ,UAAU,SAAU,QAAO,QAAQ;AACtD,MAAI,OAAO,QAAQ,UAAU,YAAY,QAAQ,UAAU,MAAM;AAC/D,WAAO,QAAQ;AAAA,EACjB;AACA,SAAO;AACT;AAGA,SAAS,aAAa,SAAiD;AACrE,MAAI,OAAO,QAAQ,WAAW,SAAU,QAAO,QAAQ;AAEvD,MAAI,MAAM,QAAQ,QAAQ,QAAQ,GAAG;AACnC,UAAM,OAAO,QAAQ;AACrB,aAAS,IAAI,KAAK,SAAS,GAAG,KAAK,GAAG,KAAK;AACzC,YAAM,MAAM,KAAK,CAAC;AAClB,UAAI,IAAI,SAAS,UAAU,IAAI,SAAS,SAAS;AAC/C,cAAM,UAAU,IAAI;AACpB,YAAI,OAAO,YAAY,SAAU,QAAO;AACxC,YAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,gBAAM,OAAO,QACV,OAAO,CAAC,MAAoC,OAAO,MAAM,YAAY,MAAM,IAAI,EAC/E,IAAI,CAAC,MAAM,IAAI,EAAE,IAAI,CAAC,EACtB,OAAO,CAAC,MAAmB,MAAM,IAAI,EACrC,KAAK,IAAI;AACZ,cAAI,KAAM,QAAO;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,QAAQ,QAAQ,GAAG;AACnC,UAAM,WAAW,QAAQ;AACzB,aAAS,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;AAC7C,YAAM,IAAI,SAAS,CAAC;AACpB,UAAI,EAAE,SAAS,QAAQ;AACrB,cAAM,QAAQ,EAAE;AAChB,YAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,gBAAM,OAAQ,MACX,IAAI,CAAC,MAAM,IAAI,EAAE,IAAI,CAAC,EACtB,OAAO,CAAC,MAAmB,MAAM,IAAI,EACrC,KAAK,IAAI;AACZ,cAAI,KAAM,QAAO;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,cAAc,SAAyD;AAE9E,QAAM,MACJ,OAAO,QAAQ,qBAAqB,YAAY,QAAQ,qBAAqB,OACxE,QAAQ,mBACT;AAEN,SAAO;AAAA,IACL,aAAa,IAAI,IAAI,aAAa,CAAG;AAAA,IACrC,WAAW,IAAI,IAAI,cAAc,IAAI,aAAa,IAAI,mBAAmB,IAAI,mBAAmB,IAAI;AAAA,IACpG,MAAM,UAAU,IAAI,SAAS,IAAI,IAAI;AAAA,IACrC,MAAM,UAAU,IAAI,IAAI;AAAA,EAC1B;AACF;AAGA,SAAS,aACP,cACA,SACA,UACA,UACuD;AACvD,QAAM,MACJ,YACA,IAAI,QAAQ,KAAK,KACjB,IAAI,QAAQ,OAAO;AAAA,EACnB,IAAI,SAAS,KAAK,KAClB,IAAI,SAAS,OAAO,KACpB;AAEF,MAAI,CAAC,IAAK,QAAO;AAGjB,QAAM,QAAQ,IAAI,MAAM,GAAG;AAC3B,QAAM,YAAY,MAAM,MAAM,SAAS,CAAC;AACxC,QAAM,eAAe,IAAI,SAAS,iBAAiB,SAAS,YAAY,KAAK;AAE7E,SAAO,EAAE,OAAO,WAAW,aAAa;AAC1C;AAMA,SAAS,iBACP,SAC0D;AAC1D,QAAM,UAAU,IAAI,QAAQ,OAAO;AACnC,MAAI,CAAC,QAAS,QAAO;AAGrB,MAAI,OAAgC,CAAC;AACrC,MAAI,OAAO,QAAQ,SAAS,UAAU;AACpC,QAAI;AAAE,aAAO,KAAK,MAAM,QAAQ,IAAI;AAAA,IAAG,QAAQ;AAAE,aAAO,CAAC;AAAA,IAAG;AAAA,EAC9D,WAAW,OAAO,QAAQ,SAAS,YAAY,QAAQ,SAAS,MAAM;AACpE,WAAO,QAAQ;AAAA,EACjB;AAEA,SAAO,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,GAAG,QAAQ;AAC9C;AAMO,SAAS,wBACd,UACA,eACA,YACA,aACe;AAEf,MAAI,UAAU;AACd,MAAI,aAAa,aAAa,IAAI,WAAW,OAAO,GAAG;AACrD,UAAM,YAAY,iBAAiB,UAAU;AAC7C,QAAI,UAAW,WAAU,UAAU;AAAA,EACrC;AAGA,QAAM,cAAc,aAAa,UAAU,SAAS,aAAa,aAAa;AAC9E,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QACE;AAAA,IAEJ;AAAA,EACF;AAGA,QAAM,QAAQ,aAAa,OAAO;AAClC,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QACE;AAAA,IAEJ;AAAA,EACF;AAGA,QAAM,SAAS,aAAa,OAAO,MAAM,OAAO,UAAU,WAAW,QAAQ;AAG7E,QAAM,SAAS,cAAc,WAAW;AACxC,MAAI,WAAW,MAAM;AACnB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QACE;AAAA,IAGJ;AAAA,EACF;AAGA,QAAM,aAAa,cAAc,OAAO;AAExC,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,OAAO,YAAY;AAAA,MACnB,cAAc,YAAY;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;AD9PO,SAAS,gCAAgC,QAAgD;AAC9F,QAAM,YAAY;AAAA,IAChB,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAEA,MAAI,CAAC,UAAU,IAAI;AACjB,WAAO,EAAE,IAAI,OAAO,MAAM,cAAc,cAAc,QAAQ,UAAU,OAAO;AAAA,EACjF;AAEA,QAAM,EAAE,OAAO,cAAc,QAAQ,OAAO,QAAQ,WAAW,IAAI,UAAU;AAE7E,MAAI;AACF,UAAM,WAAW,eAAe;AAAA,MAC9B,aAAa,OAAO,eAAsB,mBAAW;AAAA,MACrD,WAAW,OAAO;AAAA,MAClB,UAAU,OAAO;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,OAAO,SAAS;AAAA,MACvB,YAAY,OAAO,cAAc;AAAA,MACjC,gBAAgB,OAAO,kBAAkB;AAAA,IAC3C,CAAC;AAED,UAAM,SAAS,QAAQ,UAAU,EAAE,MAAM,OAAO,MAAM,WAAW,OAAO,UAAU,CAAC;AACnF,WAAO,EAAE,IAAI,MAAM,OAAO;AAAA,EAC5B,SAASC,MAAK;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM,cAAc;AAAA,MACpB,QAAQA,gBAAe,QAAQA,KAAI,UAAU,OAAOA,IAAG;AAAA,IACzD;AAAA,EACF;AACF;;;AE5CA,eAAe,cACb,KACiB;AACjB,MAAI,OAAO,QAAQ,WAAY,QAAO,IAAI;AAC1C,SAAO,OAAO;AAChB;AAEA,SAAS,iBAAiB,UAA0B,MAAqC;AACvF,QAAM,OAAgB,CAAC;AACvB,MAAI,SAAS,QAAQ,SAAS,KAAK,SAAS,EAAG,MAAK,OAAO,SAAS;AACpE,MAAI,SAAS,OAAQ,MAAK,SAAS,SAAS;AAC5C,MAAI,CAAC,QAAQ,OAAO,KAAK,IAAI,EAAE,WAAW,EAAG,QAAO;AACpD,SAAO,EAAE,GAAG,MAAM,GAAG,KAAK;AAC5B;AAOO,SAAS,aAAa,WAA2B,CAAC,GAAiB;AACxE,SAAO;AAAA,IACL,gBAAgB,QAAqD;AACnE,aAAO,gBAAgB;AAAA,QACrB,OAAO,SAAS,SAAS;AAAA,QACzB,YAAY,SAAS,cAAc;AAAA,QACnC,GAAG;AAAA,QACH,MAAM,iBAAiB,UAAU,OAAO,IAAI;AAAA,MAC9C,CAAC;AAAA,IACH;AAAA,IAEA,MAAM,yBACJ,QACA,SACwE;AACxE,YAAM,UAAU,SAAS,WAAW,SAAS;AAC7C,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,MAAM,wEAAwE;AAAA,MAC1F;AACA,YAAM,SAAS,SAAS,UAAW,MAAM,cAAc,SAAS,MAAM;AAEtE,YAAM,eAAsC;AAAA,QAC1C,OAAO,SAAS,SAAS;AAAA,QACzB,YAAY,SAAS,cAAc;AAAA,QACnC,GAAG;AAAA,QACH,MAAM,iBAAiB,UAAU,OAAO,IAAI;AAAA,MAC9C;AAEA,aAAO,yBAAyB,cAAc;AAAA,QAC5C;AAAA,QACA;AAAA,QACA,WAAW,SAAS;AAAA,MACtB,CAAC;AAAA,IACH;AAAA,IAEA,OAAO,QAAkD;AACvD,aAAO,UAAU,MAAM;AAAA,IACzB;AAAA,IAEA,MAAM,wBACJ,QACA,SACkC;AAClC,YAAM,UAAU,SAAS,WAAW,SAAS;AAC7C,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,MAAM,uEAAuE;AAAA,MACzF;AACA,aAAO,wBAAwB,QAAQ,EAAE,SAAS,KAAK,SAAS,IAAI,CAAC;AAAA,IACvE;AAAA,EACF;AACF;;;AC1GA,IAAM,kBAAoD;AAAA,EACxD,CAAC,cAAc,EAAE,GAAG;AAAA,EACpB,CAAC,cAAc,yBAAyB,GAAG;AAAA,EAC3C,CAAC,cAAc,sBAAsB,GAAG;AAAA,EACxC,CAAC,cAAc,mBAAmB,GAAG;AAAA,EACrC,CAAC,cAAc,oBAAoB,GAAG;AAAA,EACtC,CAAC,cAAc,yBAAyB,GAAG;AAAA,EAC3C,CAAC,cAAc,YAAY,GAAG;AAAA,EAC9B,CAAC,cAAc,sBAAsB,GAAG;AAAA,EACxC,CAAC,cAAc,qBAAqB,GAAG;AAAA,EACvC,CAAC,cAAc,aAAa,GAAG;AAAA,EAC/B,CAAC,cAAc,mBAAmB,GAAG;AAAA,EACrC,CAAC,cAAc,oBAAoB,GAAG;AAAA,EACtC,CAAC,cAAc,iCAAiC,GAAG;AAAA,EACnD,CAAC,cAAc,qBAAqB,GAAG;AAAA,EACvC,CAAC,cAAc,6BAA6B,GAAG;AAAA,EAC/C,CAAC,cAAc,mBAAmB,GAAG;AAAA,EACrC,CAAC,cAAc,yBAAyB,GAAG;AAAA,EAC3C,CAAC,cAAc,kCAAkC,GAAG;AACtD;AAEA,IAAM,0BAA0B,oBAAI,IAAY;AAAA,EAC9C,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAChB,CAAC;AAED,IAAM,uBAAuB,oBAAI,IAAY;AAAA,EAC3C,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAChB,CAAC;AAMM,SAAS,gBAAgB,MAAsB;AACpD,SAAO,gBAAgB,IAAI,KAAK;AAClC;AAUO,SAAS,WAAW,QAAgD;AACzE,QAAM,QAAQ,UAAU,MAAM;AAE9B,MAAI,MAAM,IAAI;AACZ,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN,iBAAiB;AAAA,QACjB,gBAAgB;AAAA,QAChB,mBAAmB;AAAA,QACnB,YAAY;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aAAa,gBAAgB,MAAM,IAAI;AAE7C,QAAM,qBAAqB,wBAAwB,IAAI,MAAM,IAAI;AACjE,QAAM,kBAAkB,qBAAqB,IAAI,MAAM,IAAI;AAC3D,QAAM,iBAAiB,MAAM,SAAS,cAAc;AAEpD,QAAM,SAA2B;AAAA,IAC/B,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,MACN,iBAAiB,CAAC;AAAA,MAClB,gBAAgB,CAAC;AAAA,MACjB,mBAAmB,CAAC;AAAA,MACpB,YAAY,CAAC;AAAA,IACf;AAAA,EACF;AAEA,MAAI,MAAM,WAAW,MAAM,QAAQ,SAAS,GAAG;AAC7C,WAAO,QAAQ,MAAM;AAAA,EACvB,WAAW,MAAM,OAAO,SAAS,GAAG;AAClC,WAAO,QAAQ,MAAM;AAAA,EACvB;AAEA,SAAO;AACT;;;ACxFO,SAAS,eAAe,OAAwB;AACrD,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,SAAS,KAAK;AAAA,EACvB;AACA,SAAO,kBAAkB,KAAK;AAChC;AAkBO,SAAS,cAAc,QAAwC;AACpE,QAAM,KAAK,OAAO,OAAM,oBAAI,KAAK,GAAE,YAAY;AAC/C,QAAM,aAAa,eAAe,OAAO,MAAM;AAE/C,QAAM,QAAmB;AAAA,IACvB,QAAQ,OAAO;AAAA,IACf;AAAA,IACA;AAAA,EACF;AAEA,MAAI,OAAO,UAAU,QAAW;AAC9B,UAAM,YAAY,eAAe,OAAO,KAAK;AAAA,EAC/C;AAEA,MAAI,OAAO,gBAAgB,QAAW;AACpC,UAAM,cAAc,OAAO;AAAA,EAC7B;AAEA,MAAI,OAAO,UAAU,QAAW;AAC9B,UAAM,QAAQ,OAAO;AAAA,EACvB;AAEA,SAAO;AACT;;;AChCO,SAAS,iBACd,SACA,SACA,MACwB;AACxB,MAAI,QAAQ,WAAW,QAAQ,WAAW;AACxC,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM,cAAc;AAAA,MACpB,QAAQ;AAAA,QACN,yCAAyC,QAAQ,SAAS,sBAAsB,QAAQ,MAAM;AAAA,MAChG;AAAA,MACA,SAAS,CAAC,qCAAqC;AAAA,IACjD;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,EAAE,IAAI,MAAM,MAAM,cAAc,IAAI,QAAQ,CAAC,EAAE;AAAA,EACxD;AAEA,MAAI,WAA0B;AAE9B,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAM,SAAS,QAAQ,CAAC;AACxB,UAAM,cAAc,QAAQ,MAAM,CAAC;AAEnC,QAAI,CAAC,aAAa;AAChB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM,cAAc;AAAA,QACpB,QAAQ,CAAC,wCAAwC,CAAC,EAAE;AAAA,QACpD,SAAS;AAAA,MACX;AAAA,IACF;AAEA,QAAI,CAAC,MAAM,wBAAwB;AACjC,YAAM,eAAe,UAAU,MAAM;AACrC,UAAI,CAAC,aAAa,IAAI;AACpB,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,MAAM,aAAa;AAAA,UACnB,QAAQ,CAAC,QAAQ,CAAC,4CAA4C,aAAa,OAAO,KAAK,IAAI,CAAC,EAAE;AAAA,UAC9F,SAAS,aAAa;AAAA,UACtB,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAEA,UAAM,YAAY,OAAO,UAAU;AACnC,QAAI,cAAc,GAAG;AACnB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM,cAAc;AAAA,QACpB,QAAQ,CAAC,QAAQ,CAAC,wBAAwB,CAAC,SAAS,OAAO,SAAS,CAAC,EAAE;AAAA,QACvE,SAAS,CAAC,sDAAsD;AAAA,QAChE,SAAS;AAAA,MACX;AAAA,IACF;AAEA,UAAM,mBAAmB,OAAO,UAAU,gBAAgB;AAE1D,QAAI,MAAM,GAAG;AACX,UAAI,qBAAqB,MAAM;AAC7B,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,MAAM,cAAc;AAAA,UACpB,QAAQ,CAAC,4CAA4C,gBAAgB,GAAG;AAAA,UACxE,SAAS,CAAC,wCAAwC;AAAA,UAClD,SAAS;AAAA,UACT,cAAc;AAAA,UACd,cAAc;AAAA,QAChB;AAAA,MACF;AAAA,IACF,OAAO;AACL,UAAI,qBAAqB,UAAU;AACjC,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,MAAM,cAAc;AAAA,UACpB,QAAQ,CAAC,QAAQ,CAAC,qDAAgD;AAAA,UAClE,SAAS;AAAA,YACP,0BAA0B,YAAY,MAAM,WAAW,oBAAoB,MAAM;AAAA,UACnF;AAAA,UACA,SAAS;AAAA,UACT,cAAc,YAAY;AAAA,UAC1B,cAAc,oBAAoB;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AAEA,QAAI,OAAO,oBAAoB,YAAY,iBAAiB;AAC1D,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM,cAAc;AAAA,QACpB,QAAQ,CAAC,QAAQ,CAAC,iDAAiD;AAAA,QACnE,SAAS;AAAA,UACP,gBAAgB,YAAY,eAAe,kBAAkB,OAAO,eAAe;AAAA,QACrF;AAAA,QACA,SAAS;AAAA,MACX;AAAA,IACF;AAEA,eAAW,OAAO;AAAA,EACpB;AAEA,QAAM,aAAa,QAAQ,QAAQ,SAAS,CAAC;AAC7C,MAAI,QAAQ,kBAAkB,WAAW,iBAAiB;AACxD,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM,cAAc;AAAA,MACpB,QAAQ,CAAC,gEAAgE;AAAA,MACzE,SAAS;AAAA,QACP,aAAa,QAAQ,iBAAiB,MAAM,WAAW,WAAW,eAAe;AAAA,MACnF;AAAA,MACA,SAAS,QAAQ,SAAS;AAAA,MAC1B,cAAc,QAAQ,iBAAiB;AAAA,MACvC,cAAc,WAAW;AAAA,IAC3B;AAAA,EACF;AAEA,SAAO,EAAE,IAAI,MAAM,MAAM,cAAc,IAAI,QAAQ,CAAC,EAAE;AACxD;;;AChIA,SAAS,UAAU,OAAwB;AACzC,MAAI,OAAO,UAAU,SAAU,QAAO,SAAS,KAAK;AACpD,SAAO,kBAAkB,KAAK;AAChC;AAEA,SAAS,eAAe,KAA8B,MAAuB;AAC3E,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,MAAI,SAAkB;AACtB,aAAW,QAAQ,OAAO;AACxB,QAAI,OAAO,WAAW,YAAY,WAAW,KAAM,QAAO;AAC1D,aAAU,OAAmC,IAAI;AAAA,EACnD;AACA,SAAO;AACT;AAEA,SAAS,cACP,KACA,MACA,OACyB;AACzB,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,QAAM,QAAQ,EAAE,GAAG,IAAI;AACvB,MAAI,SAAkC;AAEtC,WAAS,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,KAAK;AACzC,UAAM,MAAM,MAAM,CAAC;AACnB,UAAM,QAAQ,OAAO,GAAG;AACxB,QAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,WAAO,GAAG,IAAI,EAAE,GAAI,MAAkC;AACtD,aAAS,OAAO,GAAG;AAAA,EACrB;AAEA,QAAM,OAAO,MAAM,MAAM,SAAS,CAAC;AACnC,MAAI,QAAQ,QAAQ;AAClB,WAAO,IAAI,IAAI;AAAA,EACjB;AACA,SAAO;AACT;AAmBO,SAAS,iBACd,UACA,QACuB;AACvB,MAAI,SAAS,EAAE,GAAG,SAAS;AAE3B,aAAW,QAAQ,OAAO,OAAO;AAC/B,UAAM,WAAW,eAAe,QAAQ,IAAI;AAC5C,QAAI,aAAa,OAAW;AAE5B,UAAM,WAA8B;AAAA,MAClC,WAAW;AAAA,MACX,MAAM,UAAU,QAAQ;AAAA,IAC1B;AAEA,aAAS,cAAc,QAAQ,MAAM,QAAQ;AAE7C,QAAI,SAAS,SAAS;AACpB,aAAO,WAAW,IAAI,iBAAiB,QAA8C;AAAA,IACvF,WAAW,SAAS,UAAU;AAC5B,aAAO,YAAY,IAAI,kBAAkB,QAA8C;AAAA,IACzF;AAAA,EACF;AAEA,SAAO;AACT;;;ACrFA,IAAMC,kBAAiB;AAEvB,SAAS,kBAAkB,OAAkB,OAAyB;AACpE,QAAM,OAAiB,CAAC;AACxB,MAAI,CAAC,MAAM,UAAU,OAAO,MAAM,WAAW,UAAU;AACrD,SAAK,KAAK,aAAa,KAAK,qCAAqC;AAAA,EACnE;AACA,MAAI,CAAC,MAAM,MAAM,OAAO,MAAM,OAAO,UAAU;AAC7C,SAAK,KAAK,aAAa,KAAK,0CAA0C;AAAA,EACxE;AACA,MAAI,CAAC,MAAM,cAAc,CAACA,gBAAe,KAAK,MAAM,UAAU,GAAG;AAC/D,SAAK,KAAK,aAAa,KAAK,uDAAuD,MAAM,cAAc,EAAE,GAAG;AAAA,EAC9G;AACA,MAAI,MAAM,cAAc,UAAa,CAACA,gBAAe,KAAK,MAAM,SAAS,GAAG;AAC1E,SAAK,KAAK,aAAa,KAAK,2DAA2D;AAAA,EACzF;AACA,SAAO;AACT;AAEA,SAAS,WAAW,UAAiC,OAAyB;AAC5E,QAAM,OAAiB,CAAC;AACxB,MAAI,CAAC,SAAS,YAAa,MAAK,KAAK,+BAA+B,KAAK,EAAE;AAC3E,MAAI,CAAC,SAAS,UAAW,MAAK,KAAK,6BAA6B,KAAK,EAAE;AACvE,MAAI,CAAC,SAAS,SAAU,MAAK,KAAK,4BAA4B,KAAK,EAAE;AACrE,MAAI,CAAC,SAAS,MAAO,MAAK,KAAK,yBAAyB,KAAK,EAAE;AAC/D,MAAI,SAAS,UAAU,UAAa,SAAS,UAAU,KAAM,MAAK,KAAK,yBAAyB,KAAK,EAAE;AACvG,MAAI,SAAS,WAAW,UAAa,SAAS,WAAW,KAAM,MAAK,KAAK,0BAA0B,KAAK,EAAE;AAC1G,MAAI,CAAC,SAAS,UAAW,MAAK,KAAK,6BAA6B,KAAK,EAAE;AACvE,MAAI,CAAC,SAAS,WAAY,MAAK,KAAK,8BAA8B,KAAK,EAAE;AACzE,SAAO;AACT;AAEA,SAAS,gBAAgB,QAA6E;AACpG,MAAI,cAAc,UAAW,OAAgC,UAAU;AACrE,WAAQ,OAAgC;AAAA,EAC1C;AACA,SAAO;AACT;AASO,SAAS,gBACd,QACA,SACyB;AACzB,MAAI,YAAY,YAAY;AAC1B,WAAO,EAAE,IAAI,MAAM,QAAQ,CAAC,EAAE;AAAA,EAChC;AAEA,QAAM,WAAW,gBAAgB,MAAM;AACvC,QAAM,SAAmB,CAAC;AAE1B,MAAI,YAAY,aAAa,YAAY,aAAa,YAAY,WAAW;AAC3E,WAAO,KAAK,GAAG,WAAW,UAAU,OAAO,CAAC;AAAA,EAC9C;AAEA,MAAI,YAAY,WAAW;AACzB,QAAI,SAAS,aAAa,SAAS,UAAU,SAAS,GAAG;AACvD,eAAS,IAAI,GAAG,IAAI,SAAS,UAAU,QAAQ,KAAK;AAClD,eAAO,KAAK,GAAG,kBAAkB,SAAS,UAAU,CAAC,GAAG,CAAC,CAAC;AAAA,MAC5D;AAAA,IACF;AACA,QACE,SAAS,cAAc,QACvB,SAAS,cAAc,UACvB,SAAS,YAAY,KACrB,CAAC,SAAS,cACV;AACA,aAAO,KAAK,gEAAgE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO,EAAE,IAAI,OAAO,WAAW,GAAG,OAAO;AAC3C;;;ACxBO,SAAS,yBACd,QACA,QACA,SACgC;AAChC,QAAM,YAAY,SAAS,cAAa,oBAAI,KAAK,GAAE,YAAY;AAE/D,QAAM,mBAAmB,iBAAiB,OAAO,UAAU,MAAM;AAEjE,QAAM,aAAiD;AAAA,IACrD,yBAAyB,OAAO;AAAA,IAChC,iBAAiB,EAAE,OAAO,CAAC,GAAG,OAAO,KAAK,EAAE;AAAA,IAC5C,YAAY;AAAA,EACd;AAEA,QAAM,aAAsB;AAAA,IAC1B,GAAG,OAAO;AAAA,IACV;AAAA,EACF;AAEA,QAAM,YAAY,QAAQ,kBAAkB;AAAA,IAC1C;AAAA,IACA,MAAM;AAAA,IACN,aAAa,OAAO;AAAA,EACtB,CAAC;AAED,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,yBAAyB,OAAO;AAAA,EAClC;AACF;;;AChBA,eAAsB,oBACpB,OACA,SACoC;AACpC,QAAM,MAAM,IAAI,WAAW;AAAA,IACzB,OAAO,SAAS;AAAA,IAChB,YAAY,SAAS;AAAA,IACrB,gBAAgB,SAAS;AAAA,IACzB,OAAO,SAAS;AAAA,EAClB,CAAC;AAED,QAAM,cAAsC,CAAC;AAC7C,QAAM,WAA0C,CAAC;AAEjD,aAAW,cAAc,OAAO;AAC9B,UAAM,SAAS,IAAI,KAAK,UAAU;AAClC,gBAAY,KAAK,MAAM;AAEvB,QAAI,SAAS,YAAY;AACvB,YAAM,UAAU,MAAM,QAAQ,WAAW,MAAM;AAC/C,eAAS,KAAK,OAAO;AAAA,IACvB,OAAO;AACL,eAAS,KAAK,IAAI;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,aAAa,IAAI,SAAS;AAEhC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe,WAAW;AAAA,EAC5B;AACF;","names":["err","errors","crypto","crypto","err","result","err","crypto","num","C","G","num","isBytes","abytes","isBytes","abytes","str","abytes","_32n","h","abytes","h","h","err","crypto","err","SHA256_PATTERN"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/types.ts","../src/errors.ts","../src/canonicalJson.ts","../src/hash.ts","../src/snapshot.ts","../src/cer.ts","../src/certify.ts","../src/run.ts","../src/sanitize.ts","../src/attest.ts","../src/archive.ts","../src/providers/wrap.ts","../src/receipt.ts","../src/wrappers.ts","../node_modules/@noble/ed25519/index.js","../node_modules/@noble/hashes/src/utils.ts","../node_modules/@noble/hashes/src/_md.ts","../node_modules/@noble/hashes/src/_u64.ts","../node_modules/@noble/hashes/src/sha2.ts","../src/nodeReceipt.ts","../src/certifyFromProvider.ts","../src/providerExtract.ts","../src/client.ts","../src/aief.ts","../src/tools.ts","../src/chain.ts","../src/redact.ts","../src/profile.ts","../src/exportRedacted.ts","../src/runHelper.ts","../src/cerProtocol.ts","../src/verifyDetailed.ts","../src/langchain.ts"],"sourcesContent":["export { CerVerifyCode } from './types.js';\nexport type {\n CerVerifyCode as CerVerifyCodeType,\n AiExecutionSnapshotV1,\n AiExecutionParameters,\n CerAiExecutionBundle,\n CerMeta,\n VerificationResult,\n CreateSnapshotParams,\n AttestationResult,\n AttestationReceipt,\n AttestationReceiptResult,\n AttestOptions,\n CertifyDecisionParams,\n RunBuilderOptions,\n StepParams,\n RunSummary,\n ProviderConfig,\n WrappedExecutionParams,\n WrappedExecutionResult,\n NodeKeysDocument,\n SignedAttestationReceipt,\n NodeReceiptVerifyResult,\n // v0.6.0\n ProviderCallParams,\n ProviderCallResult,\n ClientDefaults,\n NexArtClient,\n SanitizeStorageOptions,\n // v0.7.0\n ToolEvent,\n BundleDeclaration,\n RedactionEnvelope,\n AiefVerifyResult,\n RunSummaryVerifyResult,\n AiefProfile,\n} from './types.js';\n\nexport { CerVerificationError, CerAttestationError } from './errors.js';\nexport { toCanonicalJson } from './canonicalJson.js';\nexport { sha256Hex, hashUtf8, hashCanonicalJson, computeInputHash, computeOutputHash } from './hash.js';\nexport { createSnapshot, verifySnapshot } from './snapshot.js';\nexport { sealCer, verifyCer, verifyCer as verify } from './cer.js';\nexport { certifyDecision } from './certify.js';\nexport { RunBuilder } from './run.js';\nexport { attest } from './attest.js';\nexport { exportCer, importCer } from './archive.js';\nexport { wrapProvider } from './providers/wrap.js';\nexport {\n sanitizeForAttestation,\n sanitizeForStorage,\n sanitizeForStamp,\n hasAttestation,\n} from './sanitize.js';\nexport { getAttestationReceipt } from './receipt.js';\nexport { certifyAndAttestDecision, attestIfNeeded } from './wrappers.js';\nexport {\n verifyNodeReceiptSignature,\n fetchNodeKeys,\n selectNodeKey,\n verifyBundleAttestation,\n} from './nodeReceipt.js';\n\n// v0.6.0: high-level provider wrapper\nexport { certifyDecisionFromProviderCall } from './certifyFromProvider.js';\n\n// v0.6.0: opinionated client factory\nexport { createClient } from './client.js';\n\n// ─── v0.7.0: AIEF Alignment Layer ────────────────────────────────────────────\n\n// Feature B: AIEF §9 verifier adapter\nexport { verifyAief, mapToAiefReason } from './aief.js';\n\n// Feature C: Level 4 tool/dependency evidence helpers\nexport { hashToolOutput, makeToolEvent } from './tools.js';\nexport type { MakeToolEventParams } from './tools.js';\n\n// Feature D: Level 4 chain integrity verification\nexport { verifyRunSummary } from './chain.js';\nexport type { VerifyRunSummaryOptions } from './chain.js';\n\n// Feature F: Pre-seal verifiable redaction\nexport { redactBeforeSeal } from './redact.js';\nexport type { RedactBeforeSealPolicy } from './redact.js';\n\n// Feature E: Opt-in AIEF profiles\nexport { validateProfile } from './profile.js';\nexport type { ProfileValidationResult } from './profile.js';\n\n// ─── Verifiable redacted export ───────────────────────────────────────────────\n\nexport { exportVerifiableRedacted } from './exportRedacted.js';\nexport type {\n ExportVerifiableRedactedOptions,\n ExportVerifiableRedactedResult,\n ExportVerifiableRedactedProvenance,\n} from './exportRedacted.js';\n\n// ─── Opinionated run helper ───────────────────────────────────────────────────\n\nexport { certifyAndAttestRun } from './runHelper.js';\nexport type {\n CertifyAndAttestRunOptions,\n CertifyAndAttestRunResult,\n} from './runHelper.js';\n\n// ─── v0.9.0: CER Protocol verification types ─────────────────────────────────\n\nexport { ReasonCode } from './cerProtocol.js';\nexport type {\n VerificationStatus,\n CheckStatus,\n ReasonCode as ReasonCodeType,\n CerVerificationResult,\n} from './cerProtocol.js';\n\n// ─── v0.9.0: Protocol-aligned verifier ───────────────────────────────────────\n\nexport { verifyAiCerBundleDetailed } from './verifyDetailed.js';\n\n// ─── v0.10.0: LangChain V1 integration ───────────────────────────────────────\n\nexport { createLangChainCer, certifyLangChainRun } from './langchain.js';\nexport type {\n LangChainCertificationInput,\n LangChainCerResult,\n LangChainAttestedResult,\n AttestDecisionFn,\n} from './langchain.js';\n","export interface AiExecutionParameters {\n temperature: number;\n maxTokens: number;\n topP: number | null;\n seed: number | null;\n}\n\n// ─── v0.7.0: Tool / dependency evidence ──────────────────────────────────────\n\n/** AIEF-06 tool call evidence record. Include in snapshot.toolCalls. */\nexport interface ToolEvent {\n toolId: string;\n at: string;\n inputHash?: string;\n outputHash: string;\n evidenceRef?: string;\n error?: string;\n}\n\n// ─── v0.7.0: Bundle self-description (not hashed) ────────────────────────────\n\n/**\n * Declarative block attached to a bundle that describes its integrity scheme\n * and protected set. EXCLUDED from certificateHash by design — purely informational.\n * Satisfies AIEF-02 SHOULD requirement for self-describing artifacts.\n */\nexport interface BundleDeclaration {\n stabilitySchemeId: string;\n protectedSetId: string;\n protectedFields: string[];\n notes?: string;\n}\n\n// ─── v0.7.0: Redaction envelope ──────────────────────────────────────────────\n\n/** Stable placeholder produced by redactBeforeSeal(). Preserves the original value's hash. */\nexport interface RedactionEnvelope {\n _redacted: true;\n hash: string;\n}\n\n// ─── v0.7.0: AIEF §9.1 verifier output schema ────────────────────────────────\n\n/** Exact AIEF §9.1 output shape returned by verifyAief(). */\nexport interface AiefVerifyResult {\n result: 'PASS' | 'FAIL';\n reason: string | null;\n checks: {\n schemaSupported: boolean;\n integrityValid: boolean;\n protectedSetValid: boolean;\n chainValid: boolean;\n };\n field?: string;\n expected?: string;\n observed?: string;\n notes?: string[];\n}\n\n// ─── v0.7.0: Chain verification result ───────────────────────────────────────\n\n/** Result returned by verifyRunSummary(). */\nexport interface RunSummaryVerifyResult {\n ok: boolean;\n code: CerVerifyCode;\n errors: string[];\n details?: string[];\n breakAt?: number;\n expectedPrev?: string;\n observedPrev?: string;\n}\n\n// ─── v0.7.0: Profiles ────────────────────────────────────────────────────────\n\n/** Opt-in strictness profile. Does NOT affect certificateHash computation. */\nexport type AiefProfile = 'flexible' | 'AIEF_L2' | 'AIEF_L3' | 'AIEF_L4';\n\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface AiExecutionSnapshotV1 {\n type: 'ai.execution.v1';\n protocolVersion: '1.2.0';\n executionSurface: 'ai';\n executionId: string;\n timestamp: string;\n provider: string;\n model: string;\n modelVersion: string | null;\n prompt: string;\n input: string | Record<string, unknown>;\n inputHash: string;\n parameters: AiExecutionParameters;\n output: string | Record<string, unknown>;\n outputHash: string;\n sdkVersion: string | null;\n appId: string | null;\n runId?: string | null;\n stepId?: string | null;\n stepIndex?: number | null;\n workflowId?: string | null;\n conversationId?: string | null;\n prevStepHash?: string | null;\n /** v0.7.0 — AIEF-06 tool/dependency evidence. Included in certificateHash when present. */\n toolCalls?: ToolEvent[];\n}\n\nexport interface CerMeta {\n source?: string;\n tags?: string[];\n [key: string]: unknown;\n}\n\nexport interface CerAiExecutionBundle {\n bundleType: 'cer.ai.execution.v1';\n certificateHash: string;\n createdAt: string;\n version: '0.1';\n snapshot: AiExecutionSnapshotV1;\n meta?: CerMeta;\n /**\n * v0.7.0 — Optional declarative block describing the integrity scheme and protected set.\n * EXCLUDED from certificateHash computation by design. Purely informational.\n * Satisfies AIEF-02 SHOULD requirement for self-describing artifacts.\n */\n declaration?: BundleDeclaration;\n}\n\nexport const CerVerifyCode = {\n OK: 'OK',\n CERTIFICATE_HASH_MISMATCH: 'CERTIFICATE_HASH_MISMATCH',\n SNAPSHOT_HASH_MISMATCH: 'SNAPSHOT_HASH_MISMATCH',\n INPUT_HASH_MISMATCH: 'INPUT_HASH_MISMATCH',\n OUTPUT_HASH_MISMATCH: 'OUTPUT_HASH_MISMATCH',\n INVALID_SHA256_FORMAT: 'INVALID_SHA256_FORMAT',\n CANONICALIZATION_ERROR: 'CANONICALIZATION_ERROR',\n SCHEMA_ERROR: 'SCHEMA_ERROR',\n UNKNOWN_ERROR: 'UNKNOWN_ERROR',\n ATTESTATION_MISSING: 'ATTESTATION_MISSING',\n ATTESTATION_KEY_NOT_FOUND: 'ATTESTATION_KEY_NOT_FOUND',\n ATTESTATION_INVALID_SIGNATURE: 'ATTESTATION_INVALID_SIGNATURE',\n ATTESTATION_KEY_FORMAT_UNSUPPORTED: 'ATTESTATION_KEY_FORMAT_UNSUPPORTED',\n // v0.7.0 — Level 4 + AIEF interop codes\n CHAIN_BREAK_DETECTED: 'CHAIN_BREAK_DETECTED',\n INCOMPLETE_ARTIFACT: 'INCOMPLETE_ARTIFACT',\n VERIFICATION_MATERIAL_UNAVAILABLE: 'VERIFICATION_MATERIAL_UNAVAILABLE',\n TOOL_EVIDENCE_MISSING: 'TOOL_EVIDENCE_MISSING',\n TOOL_OUTPUT_HASH_MISMATCH: 'TOOL_OUTPUT_HASH_MISMATCH',\n} as const;\n\nexport type CerVerifyCode = typeof CerVerifyCode[keyof typeof CerVerifyCode];\n\nexport interface VerificationResult {\n ok: boolean;\n errors: string[];\n code: CerVerifyCode;\n details?: string[];\n}\n\nexport interface CreateSnapshotParams {\n executionId: string;\n timestamp?: string;\n provider: string;\n model: string;\n modelVersion?: string | null;\n prompt: string;\n input: string | Record<string, unknown>;\n parameters: AiExecutionParameters;\n output: string | Record<string, unknown>;\n sdkVersion?: string | null;\n appId?: string | null;\n runId?: string | null;\n stepId?: string | null;\n stepIndex?: number | null;\n workflowId?: string | null;\n conversationId?: string | null;\n prevStepHash?: string | null;\n /** v0.7.0 — AIEF-06 tool/dependency evidence records. */\n toolCalls?: ToolEvent[];\n}\n\nexport interface AttestationResult {\n ok: boolean;\n attestationId?: string;\n nodeRuntimeHash?: string;\n certificateHash?: string;\n protocolVersion?: string;\n errors?: string[];\n raw?: unknown;\n}\n\nexport type AttestationReceipt = {\n attestationId: string;\n certificateHash: string;\n nodeRuntimeHash: string;\n protocolVersion: string;\n nodeId?: string;\n attestedAt?: string;\n attestorKeyId?: string;\n signatureB64Url?: string;\n};\n\nexport type NodeKeysDocument = {\n nodeId: string;\n activeKid?: string;\n keys: Array<{\n kid: string;\n alg: 'Ed25519';\n use?: 'sig';\n publicKeyJwk?: { kty: 'OKP'; crv: 'Ed25519'; x: string };\n publicKeySpkiB64?: string;\n publicKey?: string;\n createdAt?: string;\n }>;\n};\n\nexport type SignedAttestationReceipt = {\n receiptVersion?: string;\n attestationId: string;\n certificateHash: string;\n nodeRuntimeHash: string;\n protocolVersion: string;\n attestedAt?: string;\n nodeId?: string;\n attestorKeyId?: string;\n};\n\nexport type NodeReceiptVerifyResult = {\n ok: boolean;\n code: CerVerifyCode;\n details?: string[];\n};\n\nexport type AttestationReceiptResult = {\n receipt: AttestationReceipt;\n};\n\nexport interface AttestOptions {\n nodeUrl: string;\n apiKey: string;\n timeoutMs?: number;\n}\n\nexport interface CertifyDecisionParams {\n executionId?: string;\n timestamp?: string;\n /** CER bundle creation timestamp. Defaults to current time if omitted. */\n createdAt?: string;\n provider: string;\n model: string;\n modelVersion?: string | null;\n prompt: string;\n input: string | Record<string, unknown>;\n parameters: AiExecutionParameters;\n output: string | Record<string, unknown>;\n sdkVersion?: string | null;\n appId?: string | null;\n meta?: CerMeta;\n runId?: string | null;\n stepId?: string | null;\n stepIndex?: number | null;\n workflowId?: string | null;\n conversationId?: string | null;\n prevStepHash?: string | null;\n}\n\nexport interface RunBuilderOptions {\n runId?: string;\n workflowId?: string | null;\n conversationId?: string | null;\n appId?: string | null;\n}\n\nexport interface StepParams {\n stepId?: string;\n provider: string;\n model: string;\n modelVersion?: string | null;\n prompt: string;\n input: string | Record<string, unknown>;\n parameters: AiExecutionParameters;\n output: string | Record<string, unknown>;\n timestamp?: string;\n meta?: CerMeta;\n}\n\nexport interface RunSummary {\n runId: string;\n workflowId: string | null;\n conversationId: string | null;\n stepCount: number;\n steps: Array<{\n stepIndex: number;\n stepId: string;\n executionId: string;\n certificateHash: string;\n prevStepHash: string | null;\n }>;\n finalStepHash: string | null;\n}\n\nexport interface ProviderConfig<TInput = unknown, TOutput = unknown> {\n provider: string;\n callFn: (input: TInput) => Promise<TOutput>;\n extractOutput: (raw: TOutput) => string | Record<string, unknown>;\n extractModelVersion?: (raw: TOutput) => string | null;\n}\n\n// ─── v0.6.0 ──────────────────────────────────────────────────────────────────\n\n/** Parameters for the high-level certifyDecisionFromProviderCall wrapper. */\nexport interface ProviderCallParams {\n provider: string;\n model?: string;\n request: Record<string, unknown>;\n response: Record<string, unknown>;\n meta?: CerMeta;\n executionId?: string;\n timestamp?: string;\n /** CER creation timestamp. Defaults to current time if omitted. */\n createdAt?: string;\n appId?: string | null;\n workflowId?: string | null;\n conversationId?: string | null;\n}\n\n/** Result of certifyDecisionFromProviderCall. */\nexport type ProviderCallResult =\n | { ok: true; bundle: CerAiExecutionBundle }\n | { ok: false; code: typeof CerVerifyCode.SCHEMA_ERROR; reason: string };\n\n/** Defaults applied to every call made through a NexArtClient instance. */\nexport interface ClientDefaults {\n appId?: string | null;\n workflowId?: string | null;\n nodeUrl?: string;\n apiKey?: string | (() => string | Promise<string>);\n tags?: string[];\n source?: string;\n}\n\n/** Pre-configured client returned by createClient(). */\nexport interface NexArtClient {\n certifyDecision(params: CertifyDecisionParams): CerAiExecutionBundle;\n certifyAndAttestDecision(\n params: CertifyDecisionParams,\n options?: Partial<AttestOptions>,\n ): Promise<{ bundle: CerAiExecutionBundle; receipt: AttestationReceipt }>;\n verify(bundle: CerAiExecutionBundle): VerificationResult;\n verifyBundleAttestation(\n bundle: unknown,\n options?: { nodeUrl?: string; kid?: string },\n ): Promise<NodeReceiptVerifyResult>;\n}\n\n/** Options for sanitizeForStorage. */\nexport interface SanitizeStorageOptions {\n redactPaths?: string[];\n redactWith?: string;\n}\n\nexport interface WrappedExecutionParams {\n prompt: string;\n input: string | Record<string, unknown>;\n model: string;\n parameters: AiExecutionParameters;\n modelVersion?: string | null;\n appId?: string | null;\n meta?: CerMeta;\n executionId?: string;\n}\n\nexport interface WrappedExecutionResult {\n output: string | Record<string, unknown>;\n snapshot: AiExecutionSnapshotV1;\n bundle: CerAiExecutionBundle;\n}\n","export class CerVerificationError extends Error {\n public readonly errors: string[];\n\n constructor(errors: string[]) {\n super(`CER verification failed: ${errors.join('; ')}`);\n this.name = 'CerVerificationError';\n this.errors = errors;\n }\n}\n\nexport class CerAttestationError extends Error {\n public readonly statusCode?: number;\n public readonly responseBody?: unknown;\n public readonly details?: string[];\n\n constructor(message: string, statusCode?: number, responseBody?: unknown, details?: string[]) {\n super(message);\n this.name = 'CerAttestationError';\n this.statusCode = statusCode;\n this.responseBody = responseBody;\n this.details = details;\n }\n}\n","export function toCanonicalJson(value: unknown): string {\n return canonicalize(value);\n}\n\nfunction canonicalize(value: unknown): string {\n if (value === null) {\n return 'null';\n }\n\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false';\n }\n\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) {\n throw new Error(`Non-finite number not allowed in canonical JSON: ${value}`);\n }\n return JSON.stringify(value);\n }\n\n if (typeof value === 'string') {\n return JSON.stringify(value);\n }\n\n if (Array.isArray(value)) {\n const items = value.map(item => canonicalize(item));\n return '[' + items.join(',') + ']';\n }\n\n if (typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj).sort();\n const entries = keys.map(key => {\n const val = obj[key];\n if (val === undefined) {\n return null;\n }\n return JSON.stringify(key) + ':' + canonicalize(val);\n }).filter(e => e !== null);\n return '{' + entries.join(',') + '}';\n }\n\n throw new Error(`Unsupported type for canonical JSON: ${typeof value}`);\n}\n","import * as crypto from 'crypto';\nimport { toCanonicalJson } from './canonicalJson.js';\n\nexport function sha256Hex(data: string | Uint8Array): string {\n const hash = crypto.createHash('sha256');\n if (typeof data === 'string') {\n hash.update(data, 'utf-8');\n } else {\n hash.update(data);\n }\n return hash.digest('hex');\n}\n\nexport function hashUtf8(value: string): string {\n return `sha256:${sha256Hex(value)}`;\n}\n\nexport function hashCanonicalJson(value: unknown): string {\n const canonical = toCanonicalJson(value);\n return `sha256:${sha256Hex(canonical)}`;\n}\n\nexport function computeInputHash(input: string | Record<string, unknown>): string {\n if (typeof input === 'string') {\n return hashUtf8(input);\n }\n return hashCanonicalJson(input);\n}\n\nexport function computeOutputHash(output: string | Record<string, unknown>): string {\n if (typeof output === 'string') {\n return hashUtf8(output);\n }\n return hashCanonicalJson(output);\n}\n","import type { AiExecutionSnapshotV1, CreateSnapshotParams, VerificationResult, AiExecutionParameters } from './types.js';\nimport { CerVerifyCode } from './types.js';\nimport { computeInputHash, computeOutputHash } from './hash.js';\n\nconst PACKAGE_VERSION = '0.8.0';\n\nfunction validateParameters(params: AiExecutionParameters): string[] {\n const errors: string[] = [];\n\n if (typeof params.temperature !== 'number' || !Number.isFinite(params.temperature)) {\n errors.push(`parameters.temperature must be a finite number, got: ${params.temperature}`);\n }\n\n if (typeof params.maxTokens !== 'number' || !Number.isFinite(params.maxTokens)) {\n errors.push(`parameters.maxTokens must be a finite number, got: ${params.maxTokens}`);\n }\n\n if (params.topP !== null && (typeof params.topP !== 'number' || !Number.isFinite(params.topP))) {\n errors.push(`parameters.topP must be a finite number or null, got: ${params.topP}`);\n }\n\n if (params.seed !== null && (typeof params.seed !== 'number' || !Number.isFinite(params.seed))) {\n errors.push(`parameters.seed must be a finite number or null, got: ${params.seed}`);\n }\n\n return errors;\n}\n\nexport function createSnapshot(params: CreateSnapshotParams): AiExecutionSnapshotV1 {\n const paramErrors = validateParameters(params.parameters);\n if (paramErrors.length > 0) {\n throw new Error(`Invalid parameters: ${paramErrors.join('; ')}`);\n }\n\n const inputHash = computeInputHash(params.input);\n const outputHash = computeOutputHash(params.output);\n\n const snapshot: AiExecutionSnapshotV1 = {\n type: 'ai.execution.v1',\n protocolVersion: '1.2.0',\n executionSurface: 'ai',\n executionId: params.executionId,\n timestamp: params.timestamp ?? new Date().toISOString(),\n provider: params.provider,\n model: params.model,\n modelVersion: params.modelVersion ?? null,\n prompt: params.prompt,\n input: params.input,\n inputHash,\n parameters: {\n temperature: params.parameters.temperature,\n maxTokens: params.parameters.maxTokens,\n topP: params.parameters.topP ?? null,\n seed: params.parameters.seed ?? null,\n },\n output: params.output,\n outputHash,\n sdkVersion: params.sdkVersion ?? PACKAGE_VERSION,\n appId: params.appId ?? null,\n };\n\n if (params.runId !== undefined) snapshot.runId = params.runId ?? null;\n if (params.stepId !== undefined) snapshot.stepId = params.stepId ?? null;\n if (params.stepIndex !== undefined) snapshot.stepIndex = params.stepIndex ?? null;\n if (params.workflowId !== undefined) snapshot.workflowId = params.workflowId ?? null;\n if (params.conversationId !== undefined) snapshot.conversationId = params.conversationId ?? null;\n if (params.prevStepHash !== undefined) snapshot.prevStepHash = params.prevStepHash ?? null;\n\n // v0.7.0: AIEF-06 tool/dependency evidence — included in certificateHash when present\n if (params.toolCalls !== undefined && params.toolCalls.length > 0) {\n snapshot.toolCalls = params.toolCalls;\n }\n\n return snapshot;\n}\n\nexport function verifySnapshot(snapshot: AiExecutionSnapshotV1): VerificationResult {\n const schemaErrors: string[] = [];\n const formatErrors: string[] = [];\n const inputHashErrors: string[] = [];\n const outputHashErrors: string[] = [];\n\n if (snapshot.type !== 'ai.execution.v1') {\n schemaErrors.push(`Expected type \"ai.execution.v1\", got \"${snapshot.type}\"`);\n }\n\n if (snapshot.protocolVersion !== '1.2.0') {\n schemaErrors.push(`Expected protocolVersion \"1.2.0\", got \"${snapshot.protocolVersion}\"`);\n }\n\n if (snapshot.executionSurface !== 'ai') {\n schemaErrors.push(`Expected executionSurface \"ai\", got \"${snapshot.executionSurface}\"`);\n }\n\n if (!snapshot.executionId || typeof snapshot.executionId !== 'string') {\n schemaErrors.push('executionId must be a non-empty string');\n }\n\n if (!snapshot.timestamp || typeof snapshot.timestamp !== 'string') {\n schemaErrors.push('timestamp must be a non-empty string');\n }\n\n if (!snapshot.provider || typeof snapshot.provider !== 'string') {\n schemaErrors.push('provider must be a non-empty string');\n }\n\n if (!snapshot.model || typeof snapshot.model !== 'string') {\n schemaErrors.push('model must be a non-empty string');\n }\n\n if (!snapshot.prompt || typeof snapshot.prompt !== 'string') {\n schemaErrors.push('prompt must be a non-empty string');\n }\n\n if (snapshot.input === undefined || snapshot.input === null) {\n schemaErrors.push('input must be a string or object');\n }\n\n if (snapshot.output === undefined || snapshot.output === null) {\n schemaErrors.push('output must be a string or object');\n }\n\n const paramErrors = validateParameters(snapshot.parameters);\n schemaErrors.push(...paramErrors);\n\n if (!snapshot.inputHash || !snapshot.inputHash.startsWith('sha256:')) {\n formatErrors.push(`inputHash must start with \"sha256:\", got \"${snapshot.inputHash}\"`);\n }\n\n if (!snapshot.outputHash || !snapshot.outputHash.startsWith('sha256:')) {\n formatErrors.push(`outputHash must start with \"sha256:\", got \"${snapshot.outputHash}\"`);\n }\n\n if (formatErrors.length === 0) {\n const expectedInputHash = computeInputHash(snapshot.input);\n if (snapshot.inputHash !== expectedInputHash) {\n inputHashErrors.push(`inputHash mismatch: expected ${expectedInputHash}, got ${snapshot.inputHash}`);\n }\n\n const expectedOutputHash = computeOutputHash(snapshot.output);\n if (snapshot.outputHash !== expectedOutputHash) {\n outputHashErrors.push(`outputHash mismatch: expected ${expectedOutputHash}, got ${snapshot.outputHash}`);\n }\n }\n\n const errors = [...schemaErrors, ...formatErrors, ...inputHashErrors, ...outputHashErrors];\n\n if (errors.length === 0) {\n return { ok: true, errors: [], code: CerVerifyCode.OK };\n }\n\n let code: typeof CerVerifyCode[keyof typeof CerVerifyCode];\n let details: string[];\n\n if (schemaErrors.length > 0) {\n code = CerVerifyCode.SCHEMA_ERROR;\n details = schemaErrors;\n } else if (formatErrors.length > 0) {\n code = CerVerifyCode.INVALID_SHA256_FORMAT;\n details = formatErrors;\n } else if (inputHashErrors.length > 0 && outputHashErrors.length > 0) {\n code = CerVerifyCode.SNAPSHOT_HASH_MISMATCH;\n details = [...inputHashErrors, ...outputHashErrors];\n } else if (inputHashErrors.length > 0) {\n code = CerVerifyCode.INPUT_HASH_MISMATCH;\n details = inputHashErrors;\n } else if (outputHashErrors.length > 0) {\n code = CerVerifyCode.OUTPUT_HASH_MISMATCH;\n details = outputHashErrors;\n } else {\n code = CerVerifyCode.UNKNOWN_ERROR;\n details = errors;\n }\n\n return { ok: false, errors, code, details };\n}\n","import type { AiExecutionSnapshotV1, CerAiExecutionBundle, CerMeta, BundleDeclaration, VerificationResult } from './types.js';\nimport { CerVerifyCode } from './types.js';\nimport { toCanonicalJson } from './canonicalJson.js';\nimport { sha256Hex } from './hash.js';\nimport { verifySnapshot } from './snapshot.js';\n\ninterface CertificatePayload {\n bundleType: 'cer.ai.execution.v1';\n createdAt: string;\n snapshot: AiExecutionSnapshotV1;\n version: '0.1';\n}\n\nfunction computeCertificateHash(payload: CertificatePayload): string {\n const canonical = toCanonicalJson(payload);\n return `sha256:${sha256Hex(canonical)}`;\n}\n\nexport function sealCer(\n snapshot: AiExecutionSnapshotV1,\n options?: { createdAt?: string; meta?: CerMeta; declaration?: BundleDeclaration }\n): CerAiExecutionBundle {\n const createdAt = options?.createdAt ?? new Date().toISOString();\n\n // certificateHash covers ONLY { bundleType, createdAt, snapshot, version }.\n // `declaration` and `meta` are intentionally excluded — they are non-evidentiary.\n const payload: CertificatePayload = {\n bundleType: 'cer.ai.execution.v1',\n createdAt,\n snapshot,\n version: '0.1',\n };\n\n const certificateHash = computeCertificateHash(payload);\n\n const bundle: CerAiExecutionBundle = {\n bundleType: 'cer.ai.execution.v1',\n certificateHash,\n createdAt,\n version: '0.1',\n snapshot,\n };\n\n if (options?.meta) {\n bundle.meta = options.meta;\n }\n\n // v0.7.0: attach declaration block AFTER hashing — excluded from certificateHash by design.\n if (options?.declaration) {\n bundle.declaration = options.declaration;\n }\n\n return bundle;\n}\n\nexport function verifyCer(bundle: CerAiExecutionBundle): VerificationResult {\n const schemaErrors: string[] = [];\n const formatErrors: string[] = [];\n\n if (bundle.bundleType !== 'cer.ai.execution.v1') {\n schemaErrors.push(`Expected bundleType \"cer.ai.execution.v1\", got \"${bundle.bundleType}\"`);\n }\n\n if (bundle.version !== '0.1') {\n schemaErrors.push(`Expected version \"0.1\", got \"${bundle.version}\"`);\n }\n\n if (!bundle.createdAt || typeof bundle.createdAt !== 'string') {\n schemaErrors.push('createdAt must be a non-empty string');\n }\n\n if (!bundle.certificateHash || !bundle.certificateHash.startsWith('sha256:')) {\n formatErrors.push(`certificateHash must start with \"sha256:\", got \"${bundle.certificateHash}\"`);\n }\n\n if (!bundle.snapshot) {\n schemaErrors.push('snapshot is required');\n const allErrors = [...schemaErrors, ...formatErrors];\n return { ok: false, errors: allErrors, code: CerVerifyCode.SCHEMA_ERROR, details: schemaErrors };\n }\n\n let canonicalizationError: string | null = null;\n let snapshotResult: VerificationResult | null = null;\n\n try {\n snapshotResult = verifySnapshot(bundle.snapshot);\n } catch (err) {\n canonicalizationError = err instanceof Error ? err.message : String(err);\n }\n\n if (canonicalizationError !== null) {\n const errors = [...schemaErrors, ...formatErrors, canonicalizationError];\n return { ok: false, errors, code: CerVerifyCode.CANONICALIZATION_ERROR, details: [canonicalizationError] };\n }\n\n const snapshotErrors = snapshotResult!.errors;\n\n const certHashErrors: string[] = [];\n try {\n const payload: CertificatePayload = {\n bundleType: 'cer.ai.execution.v1',\n createdAt: bundle.createdAt,\n snapshot: bundle.snapshot,\n version: '0.1',\n };\n const expectedHash = computeCertificateHash(payload);\n if (bundle.certificateHash !== expectedHash) {\n certHashErrors.push(`certificateHash mismatch: expected ${expectedHash}, got ${bundle.certificateHash}`);\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n const errors = [...schemaErrors, ...formatErrors, ...snapshotErrors, msg];\n return { ok: false, errors, code: CerVerifyCode.CANONICALIZATION_ERROR, details: [msg] };\n }\n\n const errors = [...schemaErrors, ...formatErrors, ...snapshotErrors, ...certHashErrors];\n\n if (errors.length === 0) {\n return { ok: true, errors: [], code: CerVerifyCode.OK };\n }\n\n let code: typeof CerVerifyCode[keyof typeof CerVerifyCode];\n let details: string[];\n\n if (schemaErrors.length > 0) {\n code = CerVerifyCode.SCHEMA_ERROR;\n details = schemaErrors;\n } else if (formatErrors.length > 0) {\n code = CerVerifyCode.INVALID_SHA256_FORMAT;\n details = formatErrors;\n } else if (certHashErrors.length > 0 && snapshotErrors.length === 0) {\n code = CerVerifyCode.CERTIFICATE_HASH_MISMATCH;\n details = certHashErrors;\n } else if (snapshotResult && snapshotResult.code !== CerVerifyCode.OK) {\n code = snapshotResult.code;\n details = snapshotResult.details ?? snapshotErrors;\n } else if (certHashErrors.length > 0) {\n code = CerVerifyCode.CERTIFICATE_HASH_MISMATCH;\n details = certHashErrors;\n } else {\n code = CerVerifyCode.UNKNOWN_ERROR;\n details = errors;\n }\n\n return { ok: false, errors, code, details };\n}\n","import * as crypto from 'crypto';\nimport type { CerAiExecutionBundle, CertifyDecisionParams } from './types.js';\nimport { createSnapshot } from './snapshot.js';\nimport { sealCer } from './cer.js';\n\nexport function certifyDecision(params: CertifyDecisionParams): CerAiExecutionBundle {\n const executionId = params.executionId ?? crypto.randomUUID();\n\n const snapshot = createSnapshot({\n executionId,\n timestamp: params.timestamp,\n provider: params.provider,\n model: params.model,\n modelVersion: params.modelVersion,\n prompt: params.prompt,\n input: params.input,\n parameters: params.parameters,\n output: params.output,\n sdkVersion: params.sdkVersion,\n appId: params.appId,\n runId: params.runId,\n stepId: params.stepId,\n stepIndex: params.stepIndex,\n workflowId: params.workflowId,\n conversationId: params.conversationId,\n prevStepHash: params.prevStepHash,\n });\n\n return sealCer(snapshot, { createdAt: params.createdAt, meta: params.meta });\n}\n","import * as crypto from 'crypto';\nimport type {\n CerAiExecutionBundle,\n RunBuilderOptions,\n StepParams,\n RunSummary,\n} from './types.js';\nimport { createSnapshot } from './snapshot.js';\nimport { sealCer } from './cer.js';\n\nexport class RunBuilder {\n private readonly runId: string;\n private readonly workflowId: string | null;\n private readonly conversationId: string | null;\n private readonly appId: string | null;\n private stepIndex: number = 0;\n private prevStepHash: string | null = null;\n private steps: RunSummary['steps'] = [];\n\n constructor(options?: RunBuilderOptions) {\n this.runId = options?.runId ?? crypto.randomUUID();\n this.workflowId = options?.workflowId ?? null;\n this.conversationId = options?.conversationId ?? null;\n this.appId = options?.appId ?? null;\n }\n\n step(params: StepParams): CerAiExecutionBundle {\n const stepId = params.stepId ?? crypto.randomUUID();\n const executionId = `${this.runId}-step-${this.stepIndex}`;\n\n const snapshot = createSnapshot({\n executionId,\n timestamp: params.timestamp,\n provider: params.provider,\n model: params.model,\n modelVersion: params.modelVersion,\n prompt: params.prompt,\n input: params.input,\n parameters: params.parameters,\n output: params.output,\n appId: this.appId,\n runId: this.runId,\n stepId,\n stepIndex: this.stepIndex,\n workflowId: this.workflowId,\n conversationId: this.conversationId,\n prevStepHash: this.prevStepHash,\n });\n\n const bundle = sealCer(snapshot, { meta: params.meta });\n\n this.steps.push({\n stepIndex: this.stepIndex,\n stepId,\n executionId,\n certificateHash: bundle.certificateHash,\n prevStepHash: this.prevStepHash,\n });\n\n this.prevStepHash = bundle.certificateHash;\n this.stepIndex++;\n\n return bundle;\n }\n\n finalize(): RunSummary {\n return {\n runId: this.runId,\n workflowId: this.workflowId,\n conversationId: this.conversationId,\n stepCount: this.steps.length,\n steps: [...this.steps],\n finalStepHash: this.prevStepHash,\n };\n }\n}\n","import type { CerAiExecutionBundle, SanitizeStorageOptions } from './types.js';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Internal deep sanitizer\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction deepRemoveUndefined(value: unknown): unknown {\n if (value === null || value === undefined) return value;\n\n if (typeof value === 'bigint') {\n throw new Error('BigInt values are not JSON-safe and cannot be sanitized');\n }\n if (typeof value === 'function') {\n throw new Error('Function values are not JSON-safe and cannot be sanitized');\n }\n if (typeof value === 'symbol') {\n throw new Error('Symbol values are not JSON-safe and cannot be sanitized');\n }\n\n if (Array.isArray(value)) {\n return value.map(deepRemoveUndefined);\n }\n\n if (typeof value === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value as Record<string, unknown>)) {\n if (val === undefined) continue;\n result[key] = deepRemoveUndefined(val);\n }\n return result;\n }\n\n return value;\n}\n\n/** Redact a value at a dot-separated path inside an object (immutable). */\nfunction redactPath(\n obj: Record<string, unknown>,\n path: string,\n replacement: string,\n): Record<string, unknown> {\n const parts = path.split('.');\n const clone = { ...obj };\n let cursor: Record<string, unknown> = clone;\n\n for (let i = 0; i < parts.length - 1; i++) {\n const key = parts[i];\n if (typeof cursor[key] !== 'object' || cursor[key] === null) return clone;\n cursor[key] = { ...(cursor[key] as Record<string, unknown>) };\n cursor = cursor[key] as Record<string, unknown>;\n }\n\n const last = parts[parts.length - 1];\n if (last in cursor) cursor[last] = replacement;\n return clone;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// v0.4 legacy: sanitizeForAttestation (kept for backward compatibility)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** @deprecated Use sanitizeForStorage or sanitizeForStamp instead. */\nexport function sanitizeForAttestation(bundle: CerAiExecutionBundle): CerAiExecutionBundle {\n return deepRemoveUndefined(bundle) as CerAiExecutionBundle;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// v0.6 helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Prepare a bundle for safe storage:\n * - Removes undefined keys.\n * - Removes non-JSON-serializable types (bigint, function, symbol).\n * - Optionally redacts sensitive field paths.\n *\n * Does NOT recompute certificateHash or any content hashes.\n */\nexport function sanitizeForStorage(\n bundle: CerAiExecutionBundle,\n options?: SanitizeStorageOptions,\n): CerAiExecutionBundle {\n let cleaned = deepRemoveUndefined(bundle) as CerAiExecutionBundle;\n\n if (options?.redactPaths && options.redactPaths.length > 0) {\n const replacement = options.redactWith ?? '[REDACTED]';\n let obj = cleaned as unknown as Record<string, unknown>;\n for (const path of options.redactPaths) {\n obj = redactPath(obj, path, replacement);\n }\n cleaned = obj as unknown as CerAiExecutionBundle;\n }\n\n return cleaned;\n}\n\n/**\n * Produce the minimal \"attestable core\" envelope for a bundle.\n *\n * Returns only: bundleType, certificateHash, createdAt, version, snapshot.\n * The meta field is excluded — it is informational and not included in the\n * certificateHash computation.\n *\n * Does NOT recompute any hashes.\n */\nexport function sanitizeForStamp(bundle: CerAiExecutionBundle): Omit<CerAiExecutionBundle, 'meta'> {\n const core: Omit<CerAiExecutionBundle, 'meta'> = {\n bundleType: bundle.bundleType,\n certificateHash: bundle.certificateHash,\n createdAt: bundle.createdAt,\n version: bundle.version,\n snapshot: bundle.snapshot,\n };\n return deepRemoveUndefined(core) as Omit<CerAiExecutionBundle, 'meta'>;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Unchanged utility\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function hasAttestation(bundle: unknown): boolean {\n if (typeof bundle !== 'object' || bundle === null) return false;\n const b = bundle as Record<string, unknown>;\n\n if (typeof b.attestationId === 'string' && b.attestationId.length > 0) return true;\n if (typeof b.nodeRuntimeHash === 'string' && b.nodeRuntimeHash.length > 0) return true;\n\n if (typeof b.attestation === 'object' && b.attestation !== null) {\n const att = b.attestation as Record<string, unknown>;\n if (typeof att.attestationId === 'string' && att.attestationId.length > 0) return true;\n if (typeof att.nodeRuntimeHash === 'string' && att.nodeRuntimeHash.length > 0) return true;\n }\n\n return false;\n}\n","import type { CerAiExecutionBundle, AttestationResult, AttestOptions } from './types.js';\nimport { CerAttestationError } from './errors.js';\nimport { sanitizeForAttestation } from './sanitize.js';\n\nconst SHA256_PATTERN = /^sha256:[0-9a-f]{64}$/;\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nfunction validateHashFormat(value: unknown, fieldName: string): string | null {\n if (typeof value !== 'string') return null;\n if (!SHA256_PATTERN.test(value)) {\n return `${fieldName} is not in sha256:<64hex> format: \"${value}\"`;\n }\n return null;\n}\n\nexport async function attest(\n bundle: CerAiExecutionBundle,\n options: AttestOptions,\n): Promise<AttestationResult> {\n const url = `${options.nodeUrl.replace(/\\/+$/, '')}/api/attest`;\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const sanitized = sanitizeForAttestation(bundle);\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n let response: Response;\n try {\n response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${options.apiKey}`,\n },\n body: JSON.stringify(sanitized),\n signal: controller.signal,\n });\n } catch (err) {\n clearTimeout(timer);\n const error = err as Error;\n if (error.name === 'AbortError') {\n throw new CerAttestationError(\n `Attestation request timed out after ${timeoutMs}ms`,\n );\n }\n throw new CerAttestationError(\n `Network error contacting attestation node: ${error.message}`,\n );\n } finally {\n clearTimeout(timer);\n }\n\n let body: unknown;\n try {\n body = await response.json();\n } catch {\n const text = await response.text().catch(() => '');\n throw new CerAttestationError(\n `Attestation node returned non-JSON response (${response.status}): ${text}`,\n response.status,\n );\n }\n\n if (!response.ok) {\n const result = body as Record<string, unknown>;\n const msg = typeof result.error === 'string'\n ? result.error\n : `HTTP ${response.status}`;\n const details = Array.isArray(result.details) ? result.details as string[] : undefined;\n throw new CerAttestationError(\n `Attestation failed: ${msg}`,\n response.status,\n body,\n details,\n );\n }\n\n const result = body as Record<string, unknown>;\n const errors: string[] = [];\n\n if (typeof result.certificateHash === 'string' && result.certificateHash !== bundle.certificateHash) {\n errors.push(\n `Node returned certificateHash \"${result.certificateHash}\" but bundle has \"${bundle.certificateHash}\"`,\n );\n }\n\n const certHashErr = validateHashFormat(result.certificateHash, 'response.certificateHash');\n if (certHashErr) errors.push(certHashErr);\n\n const runtimeHashErr = validateHashFormat(result.nodeRuntimeHash, 'response.nodeRuntimeHash');\n if (runtimeHashErr) errors.push(runtimeHashErr);\n\n if (errors.length > 0) {\n throw new CerAttestationError(\n `Attestation response validation failed: ${errors.join('; ')}`,\n response.status,\n body,\n errors,\n );\n }\n\n return {\n ok: true,\n attestationId: typeof result.attestationId === 'string' ? result.attestationId : undefined,\n nodeRuntimeHash: typeof result.nodeRuntimeHash === 'string' ? result.nodeRuntimeHash : undefined,\n certificateHash: typeof result.certificateHash === 'string' ? result.certificateHash : undefined,\n protocolVersion: typeof result.protocolVersion === 'string' ? result.protocolVersion : undefined,\n raw: body,\n };\n}\n","import type { CerAiExecutionBundle } from './types.js';\nimport { toCanonicalJson } from './canonicalJson.js';\nimport { verifyCer } from './cer.js';\nimport { CerVerificationError } from './errors.js';\n\nexport function exportCer(bundle: CerAiExecutionBundle): string {\n return toCanonicalJson(bundle);\n}\n\nexport function importCer(json: string): CerAiExecutionBundle {\n let parsed: unknown;\n try {\n parsed = JSON.parse(json);\n } catch (err) {\n throw new CerVerificationError([`Invalid JSON: ${(err as Error).message}`]);\n }\n\n const bundle = parsed as CerAiExecutionBundle;\n\n if (!bundle || typeof bundle !== 'object') {\n throw new CerVerificationError(['Parsed value is not an object']);\n }\n\n if (bundle.bundleType !== 'cer.ai.execution.v1') {\n throw new CerVerificationError([`Expected bundleType \"cer.ai.execution.v1\", got \"${bundle.bundleType}\"`]);\n }\n\n const result = verifyCer(bundle);\n if (!result.ok) {\n throw new CerVerificationError(result.errors);\n }\n\n return bundle;\n}\n","import * as crypto from 'crypto';\nimport type {\n ProviderConfig,\n WrappedExecutionParams,\n WrappedExecutionResult,\n} from '../types.js';\nimport { createSnapshot } from '../snapshot.js';\nimport { sealCer } from '../cer.js';\n\nexport function wrapProvider<TInput = unknown, TOutput = unknown>(\n config: ProviderConfig<TInput, TOutput>,\n) {\n return {\n async execute(params: WrappedExecutionParams & { providerInput: TInput }): Promise<WrappedExecutionResult> {\n const raw = await config.callFn(params.providerInput);\n const output = config.extractOutput(raw);\n const modelVersion = config.extractModelVersion\n ? config.extractModelVersion(raw)\n : (params.modelVersion ?? null);\n\n const snapshot = createSnapshot({\n executionId: params.executionId ?? crypto.randomUUID(),\n provider: config.provider,\n model: params.model,\n modelVersion,\n prompt: params.prompt,\n input: params.input,\n parameters: params.parameters,\n output,\n appId: params.appId,\n });\n\n const bundle = sealCer(snapshot, { meta: params.meta });\n\n return { output, snapshot, bundle };\n },\n };\n}\n","import type { AttestationReceipt } from './types.js';\n\nfunction extractStr(obj: Record<string, unknown>, key: string): string | undefined {\n const v = obj[key];\n return typeof v === 'string' && v.length > 0 ? v : undefined;\n}\n\nfunction buildReceipt(obj: Record<string, unknown>): AttestationReceipt | null {\n const attestationId = extractStr(obj, 'attestationId');\n const certificateHash = extractStr(obj, 'certificateHash');\n const nodeRuntimeHash = extractStr(obj, 'nodeRuntimeHash');\n const protocolVersion = extractStr(obj, 'protocolVersion');\n\n if (!attestationId || !certificateHash || !nodeRuntimeHash || !protocolVersion) {\n return null;\n }\n\n const receipt: AttestationReceipt = {\n attestationId,\n certificateHash,\n nodeRuntimeHash,\n protocolVersion,\n };\n\n const nodeId = extractStr(obj, 'nodeId');\n if (nodeId) receipt.nodeId = nodeId;\n\n const attestedAt = extractStr(obj, 'attestedAt');\n if (attestedAt) receipt.attestedAt = attestedAt;\n\n const attestorKeyId = extractStr(obj, 'attestorKeyId');\n if (attestorKeyId) receipt.attestorKeyId = attestorKeyId;\n\n const signatureB64Url = extractStr(obj, 'signature') ?? extractStr(obj, 'signatureB64Url');\n if (signatureB64Url) receipt.signatureB64Url = signatureB64Url;\n\n return receipt;\n}\n\nexport function getAttestationReceipt(bundle: unknown): AttestationReceipt | null {\n if (typeof bundle !== 'object' || bundle === null) return null;\n\n const b = bundle as Record<string, unknown>;\n\n const topLevel = buildReceipt(b);\n if (topLevel) return topLevel;\n\n if (typeof b.meta === 'object' && b.meta !== null) {\n const meta = b.meta as Record<string, unknown>;\n if (typeof meta.attestation === 'object' && meta.attestation !== null) {\n const nested = buildReceipt(meta.attestation as Record<string, unknown>);\n if (nested) return nested;\n }\n }\n\n return null;\n}\n","import type { CerAiExecutionBundle, CertifyDecisionParams, AttestOptions, AttestationReceipt } from './types.js';\nimport { certifyDecision } from './certify.js';\nimport { attest } from './attest.js';\nimport { hasAttestation } from './sanitize.js';\nimport { getAttestationReceipt } from './receipt.js';\nimport { CerAttestationError } from './errors.js';\n\nfunction receiptFromProof(\n proof: Awaited<ReturnType<typeof attest>>,\n bundle: CerAiExecutionBundle,\n): AttestationReceipt {\n if (\n !proof.attestationId ||\n !proof.nodeRuntimeHash ||\n !proof.protocolVersion\n ) {\n throw new CerAttestationError(\n 'Attestation proof is missing required fields (attestationId, nodeRuntimeHash, protocolVersion)',\n );\n }\n\n return {\n attestationId: proof.attestationId,\n certificateHash: proof.certificateHash ?? bundle.certificateHash,\n nodeRuntimeHash: proof.nodeRuntimeHash,\n protocolVersion: proof.protocolVersion,\n };\n}\n\nexport async function certifyAndAttestDecision(\n params: CertifyDecisionParams,\n options: AttestOptions,\n): Promise<{ bundle: CerAiExecutionBundle; receipt: AttestationReceipt }> {\n const bundle = certifyDecision(params);\n const proof = await attest(bundle, options);\n const receipt = receiptFromProof(proof, bundle);\n return { bundle, receipt };\n}\n\nexport async function attestIfNeeded(\n bundle: CerAiExecutionBundle,\n options: AttestOptions,\n): Promise<{ bundle: CerAiExecutionBundle; receipt: AttestationReceipt }> {\n if (hasAttestation(bundle)) {\n const existing = getAttestationReceipt(bundle);\n if (existing) {\n return { bundle, receipt: existing };\n }\n }\n\n const proof = await attest(bundle, options);\n const receipt = receiptFromProof(proof, bundle);\n return { bundle, receipt };\n}\n","/*! noble-ed25519 - MIT License (c) 2019 Paul Miller (paulmillr.com) */\n/**\n * 5KB JS implementation of ed25519 EdDSA signatures.\n * Compliant with RFC8032, FIPS 186-5 & ZIP215.\n * @module\n * @example\n * ```js\nimport * as ed from '@noble/ed25519';\n(async () => {\n const secretKey = ed.utils.randomSecretKey();\n const message = Uint8Array.from([0xab, 0xbc, 0xcd, 0xde]);\n const pubKey = await ed.getPublicKeyAsync(secretKey); // Sync methods are also present\n const signature = await ed.signAsync(message, secretKey);\n const isValid = await ed.verifyAsync(signature, message, pubKey);\n})();\n```\n */\n/**\n * Curve params. ed25519 is twisted edwards curve. Equation is −x² + y² = -a + dx²y².\n * * P = `2n**255n - 19n` // field over which calculations are done\n * * N = `2n**252n + 27742317777372353535851937790883648493n` // group order, amount of curve points\n * * h = 8 // cofactor\n * * a = `Fp.create(BigInt(-1))` // equation param\n * * d = -121665/121666 a.k.a. `Fp.neg(121665 * Fp.inv(121666))` // equation param\n * * Gx, Gy are coordinates of Generator / base point\n */\nconst ed25519_CURVE = {\n p: 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffedn,\n n: 0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3edn,\n h: 8n,\n a: 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecn,\n d: 0x52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a3n,\n Gx: 0x216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51an,\n Gy: 0x6666666666666666666666666666666666666666666666666666666666666658n,\n};\nconst { p: P, n: N, Gx, Gy, a: _a, d: _d, h } = ed25519_CURVE;\nconst L = 32; // field / group byte length\nconst L2 = 64;\n// Helpers and Precomputes sections are reused between libraries\n// ## Helpers\n// ----------\nconst captureTrace = (...args) => {\n if ('captureStackTrace' in Error && typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(...args);\n }\n};\nconst err = (message = '') => {\n const e = new Error(message);\n captureTrace(e, err);\n throw e;\n};\nconst isBig = (n) => typeof n === 'bigint'; // is big integer\nconst isStr = (s) => typeof s === 'string'; // is string\nconst isBytes = (a) => a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n/** Asserts something is Uint8Array. */\nconst abytes = (value, length, title = '') => {\n const bytes = isBytes(value);\n const len = value?.length;\n const needsLen = length !== undefined;\n if (!bytes || (needsLen && len !== length)) {\n const prefix = title && `\"${title}\" `;\n const ofLen = needsLen ? ` of length ${length}` : '';\n const got = bytes ? `length=${len}` : `type=${typeof value}`;\n err(prefix + 'expected Uint8Array' + ofLen + ', got ' + got);\n }\n return value;\n};\n/** create Uint8Array */\nconst u8n = (len) => new Uint8Array(len);\nconst u8fr = (buf) => Uint8Array.from(buf);\nconst padh = (n, pad) => n.toString(16).padStart(pad, '0');\nconst bytesToHex = (b) => Array.from(abytes(b))\n .map((e) => padh(e, 2))\n .join('');\nconst C = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 }; // ASCII characters\nconst _ch = (ch) => {\n if (ch >= C._0 && ch <= C._9)\n return ch - C._0; // '2' => 50-48\n if (ch >= C.A && ch <= C.F)\n return ch - (C.A - 10); // 'B' => 66-(65-10)\n if (ch >= C.a && ch <= C.f)\n return ch - (C.a - 10); // 'b' => 98-(97-10)\n return;\n};\nconst hexToBytes = (hex) => {\n const e = 'hex invalid';\n if (!isStr(hex))\n return err(e);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2)\n return err(e);\n const array = u8n(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n // treat each char as ASCII\n const n1 = _ch(hex.charCodeAt(hi)); // parse first char, multiply it by 16\n const n2 = _ch(hex.charCodeAt(hi + 1)); // parse second char\n if (n1 === undefined || n2 === undefined)\n return err(e);\n array[ai] = n1 * 16 + n2; // example: 'A9' => 10*16 + 9\n }\n return array;\n};\nconst cr = () => globalThis?.crypto; // WebCrypto is available in all modern environments\nconst subtle = () => cr()?.subtle ?? err('crypto.subtle must be defined, consider polyfill');\n// prettier-ignore\nconst concatBytes = (...arrs) => {\n const r = u8n(arrs.reduce((sum, a) => sum + abytes(a).length, 0)); // create u8a of summed length\n let pad = 0; // walk through each array,\n arrs.forEach(a => { r.set(a, pad); pad += a.length; }); // ensure they have proper type\n return r;\n};\n/** WebCrypto OS-level CSPRNG (random number generator). Will throw when not available. */\nconst randomBytes = (len = L) => {\n const c = cr();\n return c.getRandomValues(u8n(len));\n};\nconst big = BigInt;\nconst assertRange = (n, min, max, msg = 'bad number: out of range') => (isBig(n) && min <= n && n < max ? n : err(msg));\n/** modular division */\nconst M = (a, b = P) => {\n const r = a % b;\n return r >= 0n ? r : b + r;\n};\nconst modN = (a) => M(a, N);\n/** Modular inversion using euclidean GCD (non-CT). No negative exponent for now. */\n// prettier-ignore\nconst invert = (num, md) => {\n if (num === 0n || md <= 0n)\n err('no inverse n=' + num + ' mod=' + md);\n let a = M(num, md), b = md, x = 0n, y = 1n, u = 1n, v = 0n;\n while (a !== 0n) {\n const q = b / a, r = b % a;\n const m = x - u * q, n = y - v * q;\n b = a, a = r, x = u, y = v, u = m, v = n;\n }\n return b === 1n ? M(x, md) : err('no inverse'); // b is gcd at this point\n};\nconst callHash = (name) => {\n // @ts-ignore\n const fn = hashes[name];\n if (typeof fn !== 'function')\n err('hashes.' + name + ' not set');\n return fn;\n};\nconst hash = (msg) => callHash('sha512')(msg);\nconst apoint = (p) => (p instanceof Point ? p : err('Point expected'));\n// ## End of Helpers\n// -----------------\nconst B256 = 2n ** 256n;\n/** Point in XYZT extended coordinates. */\nclass Point {\n static BASE;\n static ZERO;\n X;\n Y;\n Z;\n T;\n constructor(X, Y, Z, T) {\n const max = B256;\n this.X = assertRange(X, 0n, max);\n this.Y = assertRange(Y, 0n, max);\n this.Z = assertRange(Z, 1n, max);\n this.T = assertRange(T, 0n, max);\n Object.freeze(this);\n }\n static CURVE() {\n return ed25519_CURVE;\n }\n static fromAffine(p) {\n return new Point(p.x, p.y, 1n, M(p.x * p.y));\n }\n /** RFC8032 5.1.3: Uint8Array to Point. */\n static fromBytes(hex, zip215 = false) {\n const d = _d;\n // Copy array to not mess it up.\n const normed = u8fr(abytes(hex, L));\n // adjust first LE byte = last BE byte\n const lastByte = hex[31];\n normed[31] = lastByte & ~0x80;\n const y = bytesToNumLE(normed);\n // zip215=true: 0 <= y < 2^256\n // zip215=false, RFC8032: 0 <= y < 2^255-19\n const max = zip215 ? B256 : P;\n assertRange(y, 0n, max);\n const y2 = M(y * y); // y²\n const u = M(y2 - 1n); // u=y²-1\n const v = M(d * y2 + 1n); // v=dy²+1\n let { isValid, value: x } = uvRatio(u, v); // (uv³)(uv⁷)^(p-5)/8; square root\n if (!isValid)\n err('bad point: y not sqrt'); // not square root: bad point\n const isXOdd = (x & 1n) === 1n; // adjust sign of x coordinate\n const isLastByteOdd = (lastByte & 0x80) !== 0; // x_0, last bit\n if (!zip215 && x === 0n && isLastByteOdd)\n err('bad point: x==0, isLastByteOdd'); // x=0, x_0=1\n if (isLastByteOdd !== isXOdd)\n x = M(-x);\n return new Point(x, y, 1n, M(x * y)); // Z=1, T=xy\n }\n static fromHex(hex, zip215) {\n return Point.fromBytes(hexToBytes(hex), zip215);\n }\n get x() {\n return this.toAffine().x;\n }\n get y() {\n return this.toAffine().y;\n }\n /** Checks if the point is valid and on-curve. */\n assertValidity() {\n const a = _a;\n const d = _d;\n const p = this;\n if (p.is0())\n return err('bad point: ZERO'); // TODO: optimize, with vars below?\n // Equation in affine coordinates: ax² + y² = 1 + dx²y²\n // Equation in projective coordinates (X/Z, Y/Z, Z): (aX² + Y²)Z² = Z⁴ + dX²Y²\n const { X, Y, Z, T } = p;\n const X2 = M(X * X); // X²\n const Y2 = M(Y * Y); // Y²\n const Z2 = M(Z * Z); // Z²\n const Z4 = M(Z2 * Z2); // Z⁴\n const aX2 = M(X2 * a); // aX²\n const left = M(Z2 * M(aX2 + Y2)); // (aX² + Y²)Z²\n const right = M(Z4 + M(d * M(X2 * Y2))); // Z⁴ + dX²Y²\n if (left !== right)\n return err('bad point: equation left != right (1)');\n // In Extended coordinates we also have T, which is x*y=T/Z: check X*Y == Z*T\n const XY = M(X * Y);\n const ZT = M(Z * T);\n if (XY !== ZT)\n return err('bad point: equation left != right (2)');\n return this;\n }\n /** Equality check: compare points P&Q. */\n equals(other) {\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const { X: X2, Y: Y2, Z: Z2 } = apoint(other); // checks class equality\n const X1Z2 = M(X1 * Z2);\n const X2Z1 = M(X2 * Z1);\n const Y1Z2 = M(Y1 * Z2);\n const Y2Z1 = M(Y2 * Z1);\n return X1Z2 === X2Z1 && Y1Z2 === Y2Z1;\n }\n is0() {\n return this.equals(I);\n }\n /** Flip point over y coordinate. */\n negate() {\n return new Point(M(-this.X), this.Y, this.Z, M(-this.T));\n }\n /** Point doubling. Complete formula. Cost: `4M + 4S + 1*a + 6add + 1*2`. */\n double() {\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const a = _a;\n // https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#doubling-dbl-2008-hwcd\n const A = M(X1 * X1);\n const B = M(Y1 * Y1);\n const C = M(2n * M(Z1 * Z1));\n const D = M(a * A);\n const x1y1 = X1 + Y1;\n const E = M(M(x1y1 * x1y1) - A - B);\n const G = D + B;\n const F = G - C;\n const H = D - B;\n const X3 = M(E * F);\n const Y3 = M(G * H);\n const T3 = M(E * H);\n const Z3 = M(F * G);\n return new Point(X3, Y3, Z3, T3);\n }\n /** Point addition. Complete formula. Cost: `8M + 1*k + 8add + 1*2`. */\n add(other) {\n const { X: X1, Y: Y1, Z: Z1, T: T1 } = this;\n const { X: X2, Y: Y2, Z: Z2, T: T2 } = apoint(other); // doesn't check if other on-curve\n const a = _a;\n const d = _d;\n // https://hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html#addition-add-2008-hwcd-3\n const A = M(X1 * X2);\n const B = M(Y1 * Y2);\n const C = M(T1 * d * T2);\n const D = M(Z1 * Z2);\n const E = M((X1 + Y1) * (X2 + Y2) - A - B);\n const F = M(D - C);\n const G = M(D + C);\n const H = M(B - a * A);\n const X3 = M(E * F);\n const Y3 = M(G * H);\n const T3 = M(E * H);\n const Z3 = M(F * G);\n return new Point(X3, Y3, Z3, T3);\n }\n subtract(other) {\n return this.add(apoint(other).negate());\n }\n /**\n * Point-by-scalar multiplication. Scalar must be in range 1 <= n < CURVE.n.\n * Uses {@link wNAF} for base point.\n * Uses fake point to mitigate side-channel leakage.\n * @param n scalar by which point is multiplied\n * @param safe safe mode guards against timing attacks; unsafe mode is faster\n */\n multiply(n, safe = true) {\n if (!safe && (n === 0n || this.is0()))\n return I;\n assertRange(n, 1n, N);\n if (n === 1n)\n return this;\n if (this.equals(G))\n return wNAF(n).p;\n // init result point & fake point\n let p = I;\n let f = G;\n for (let d = this; n > 0n; d = d.double(), n >>= 1n) {\n // if bit is present, add to point\n // if not present, add to fake, for timing safety\n if (n & 1n)\n p = p.add(d);\n else if (safe)\n f = f.add(d);\n }\n return p;\n }\n multiplyUnsafe(scalar) {\n return this.multiply(scalar, false);\n }\n /** Convert point to 2d xy affine point. (X, Y, Z) ∋ (x=X/Z, y=Y/Z) */\n toAffine() {\n const { X, Y, Z } = this;\n // fast-paths for ZERO point OR Z=1\n if (this.equals(I))\n return { x: 0n, y: 1n };\n const iz = invert(Z, P);\n // (Z * Z^-1) must be 1, otherwise bad math\n if (M(Z * iz) !== 1n)\n err('invalid inverse');\n // x = X*Z^-1; y = Y*Z^-1\n const x = M(X * iz);\n const y = M(Y * iz);\n return { x, y };\n }\n toBytes() {\n const { x, y } = this.assertValidity().toAffine();\n const b = numTo32bLE(y);\n // store sign in first LE byte\n b[31] |= x & 1n ? 0x80 : 0;\n return b;\n }\n toHex() {\n return bytesToHex(this.toBytes());\n }\n clearCofactor() {\n return this.multiply(big(h), false);\n }\n isSmallOrder() {\n return this.clearCofactor().is0();\n }\n isTorsionFree() {\n // Multiply by big number N. We can't `mul(N)` because of checks. Instead, we `mul(N/2)*2+1`\n let p = this.multiply(N / 2n, false).double();\n if (N % 2n)\n p = p.add(this);\n return p.is0();\n }\n}\n/** Generator / base point */\nconst G = new Point(Gx, Gy, 1n, M(Gx * Gy));\n/** Identity / zero point */\nconst I = new Point(0n, 1n, 1n, 0n);\n// Static aliases\nPoint.BASE = G;\nPoint.ZERO = I;\nconst numTo32bLE = (num) => hexToBytes(padh(assertRange(num, 0n, B256), L2)).reverse();\nconst bytesToNumLE = (b) => big('0x' + bytesToHex(u8fr(abytes(b)).reverse()));\nconst pow2 = (x, power) => {\n // pow2(x, 4) == x^(2^4)\n let r = x;\n while (power-- > 0n) {\n r *= r;\n r %= P;\n }\n return r;\n};\n// prettier-ignore\nconst pow_2_252_3 = (x) => {\n const x2 = (x * x) % P; // x^2, bits 1\n const b2 = (x2 * x) % P; // x^3, bits 11\n const b4 = (pow2(b2, 2n) * b2) % P; // x^(2^4-1), bits 1111\n const b5 = (pow2(b4, 1n) * x) % P; // x^(2^5-1), bits 11111\n const b10 = (pow2(b5, 5n) * b5) % P; // x^(2^10)\n const b20 = (pow2(b10, 10n) * b10) % P; // x^(2^20)\n const b40 = (pow2(b20, 20n) * b20) % P; // x^(2^40)\n const b80 = (pow2(b40, 40n) * b40) % P; // x^(2^80)\n const b160 = (pow2(b80, 80n) * b80) % P; // x^(2^160)\n const b240 = (pow2(b160, 80n) * b80) % P; // x^(2^240)\n const b250 = (pow2(b240, 10n) * b10) % P; // x^(2^250)\n const pow_p_5_8 = (pow2(b250, 2n) * x) % P; // < To pow to (p+3)/8, multiply it by x.\n return { pow_p_5_8, b2 };\n};\nconst RM1 = 0x2b8324804fc1df0b2b4d00993dfbd7a72f431806ad2fe478c4ee1b274a0ea0b0n; // √-1\n// for sqrt comp\n// prettier-ignore\nconst uvRatio = (u, v) => {\n const v3 = M(v * v * v); // v³\n const v7 = M(v3 * v3 * v); // v⁷\n const pow = pow_2_252_3(u * v7).pow_p_5_8; // (uv⁷)^(p-5)/8\n let x = M(u * v3 * pow); // (uv³)(uv⁷)^(p-5)/8\n const vx2 = M(v * x * x); // vx²\n const root1 = x; // First root candidate\n const root2 = M(x * RM1); // Second root candidate; RM1 is √-1\n const useRoot1 = vx2 === u; // If vx² = u (mod p), x is a square root\n const useRoot2 = vx2 === M(-u); // If vx² = -u, set x <-- x * 2^((p-1)/4)\n const noRoot = vx2 === M(-u * RM1); // There is no valid root, vx² = -u√-1\n if (useRoot1)\n x = root1;\n if (useRoot2 || noRoot)\n x = root2; // We return root2 anyway, for const-time\n if ((M(x) & 1n) === 1n)\n x = M(-x); // edIsNegative\n return { isValid: useRoot1 || useRoot2, value: x };\n};\n// N == L, just weird naming\nconst modL_LE = (hash) => modN(bytesToNumLE(hash)); // modulo L; but little-endian\n/** hashes.sha512 should conform to the interface. */\n// TODO: rename\nconst sha512a = (...m) => hashes.sha512Async(concatBytes(...m)); // Async SHA512\nconst sha512s = (...m) => callHash('sha512')(concatBytes(...m));\n// RFC8032 5.1.5\nconst hash2extK = (hashed) => {\n // slice creates a copy, unlike subarray\n const head = hashed.slice(0, L);\n head[0] &= 248; // Clamp bits: 0b1111_1000\n head[31] &= 127; // 0b0111_1111\n head[31] |= 64; // 0b0100_0000\n const prefix = hashed.slice(L, L2); // secret key \"prefix\"\n const scalar = modL_LE(head); // modular division over curve order\n const point = G.multiply(scalar); // public key point\n const pointBytes = point.toBytes(); // point serialized to Uint8Array\n return { head, prefix, scalar, point, pointBytes };\n};\n// RFC8032 5.1.5; getPublicKey async, sync. Hash priv key and extract point.\nconst getExtendedPublicKeyAsync = (secretKey) => sha512a(abytes(secretKey, L)).then(hash2extK);\nconst getExtendedPublicKey = (secretKey) => hash2extK(sha512s(abytes(secretKey, L)));\n/** Creates 32-byte ed25519 public key from 32-byte secret key. Async. */\nconst getPublicKeyAsync = (secretKey) => getExtendedPublicKeyAsync(secretKey).then((p) => p.pointBytes);\n/** Creates 32-byte ed25519 public key from 32-byte secret key. To use, set `hashes.sha512` first. */\nconst getPublicKey = (priv) => getExtendedPublicKey(priv).pointBytes;\nconst hashFinishA = (res) => sha512a(res.hashable).then(res.finish);\nconst hashFinishS = (res) => res.finish(sha512s(res.hashable));\n// Code, shared between sync & async sign\nconst _sign = (e, rBytes, msg) => {\n const { pointBytes: P, scalar: s } = e;\n const r = modL_LE(rBytes); // r was created outside, reduce it modulo L\n const R = G.multiply(r).toBytes(); // R = [r]B\n const hashable = concatBytes(R, P, msg); // dom2(F, C) || R || A || PH(M)\n const finish = (hashed) => {\n // k = SHA512(dom2(F, C) || R || A || PH(M))\n const S = modN(r + modL_LE(hashed) * s); // S = (r + k * s) mod L; 0 <= s < l\n return abytes(concatBytes(R, numTo32bLE(S)), L2); // 64-byte sig: 32b R.x + 32b LE(S)\n };\n return { hashable, finish };\n};\n/**\n * Signs message using secret key. Async.\n * Follows RFC8032 5.1.6.\n */\nconst signAsync = async (message, secretKey) => {\n const m = abytes(message);\n const e = await getExtendedPublicKeyAsync(secretKey);\n const rBytes = await sha512a(e.prefix, m); // r = SHA512(dom2(F, C) || prefix || PH(M))\n return hashFinishA(_sign(e, rBytes, m)); // gen R, k, S, then 64-byte signature\n};\n/**\n * Signs message using secret key. To use, set `hashes.sha512` first.\n * Follows RFC8032 5.1.6.\n */\nconst sign = (message, secretKey) => {\n const m = abytes(message);\n const e = getExtendedPublicKey(secretKey);\n const rBytes = sha512s(e.prefix, m); // r = SHA512(dom2(F, C) || prefix || PH(M))\n return hashFinishS(_sign(e, rBytes, m)); // gen R, k, S, then 64-byte signature\n};\nconst defaultVerifyOpts = { zip215: true };\nconst _verify = (sig, msg, pub, opts = defaultVerifyOpts) => {\n sig = abytes(sig, L2); // Signature hex str/Bytes, must be 64 bytes\n msg = abytes(msg); // Message hex str/Bytes\n pub = abytes(pub, L);\n const { zip215 } = opts; // switch between zip215 and rfc8032 verif\n let A;\n let R;\n let s;\n let SB;\n let hashable = Uint8Array.of();\n try {\n A = Point.fromBytes(pub, zip215); // public key A decoded\n R = Point.fromBytes(sig.slice(0, L), zip215); // 0 <= R < 2^256: ZIP215 R can be >= P\n s = bytesToNumLE(sig.slice(L, L2)); // Decode second half as an integer S\n SB = G.multiply(s, false); // in the range 0 <= s < L\n hashable = concatBytes(R.toBytes(), A.toBytes(), msg); // dom2(F, C) || R || A || PH(M)\n }\n catch (error) { }\n const finish = (hashed) => {\n // k = SHA512(dom2(F, C) || R || A || PH(M))\n if (SB == null)\n return false; // false if try-catch catched an error\n if (!zip215 && A.isSmallOrder())\n return false; // false for SBS: Strongly Binding Signature\n const k = modL_LE(hashed); // decode in little-endian, modulo L\n const RkA = R.add(A.multiply(k, false)); // [8]R + [8][k]A'\n return RkA.add(SB.negate()).clearCofactor().is0(); // [8][S]B = [8]R + [8][k]A'\n };\n return { hashable, finish };\n};\n/** Verifies signature on message and public key. Async. Follows RFC8032 5.1.7. */\nconst verifyAsync = async (signature, message, publicKey, opts = defaultVerifyOpts) => hashFinishA(_verify(signature, message, publicKey, opts));\n/** Verifies signature on message and public key. To use, set `hashes.sha512` first. Follows RFC8032 5.1.7. */\nconst verify = (signature, message, publicKey, opts = defaultVerifyOpts) => hashFinishS(_verify(signature, message, publicKey, opts));\n/** Math, hex, byte helpers. Not in `utils` because utils share API with noble-curves. */\nconst etc = {\n bytesToHex: bytesToHex,\n hexToBytes: hexToBytes,\n concatBytes: concatBytes,\n mod: M,\n invert: invert,\n randomBytes: randomBytes,\n};\nconst hashes = {\n sha512Async: async (message) => {\n const s = subtle();\n const m = concatBytes(message);\n return u8n(await s.digest('SHA-512', m.buffer));\n },\n sha512: undefined,\n};\n// FIPS 186 B.4.1 compliant key generation produces private keys\n// with modulo bias being neglible. takes >N+16 bytes, returns (hash mod n-1)+1\nconst randomSecretKey = (seed = randomBytes(L)) => seed;\nconst keygen = (seed) => {\n const secretKey = randomSecretKey(seed);\n const publicKey = getPublicKey(secretKey);\n return { secretKey, publicKey };\n};\nconst keygenAsync = async (seed) => {\n const secretKey = randomSecretKey(seed);\n const publicKey = await getPublicKeyAsync(secretKey);\n return { secretKey, publicKey };\n};\n/** ed25519-specific key utilities. */\nconst utils = {\n getExtendedPublicKeyAsync: getExtendedPublicKeyAsync,\n getExtendedPublicKey: getExtendedPublicKey,\n randomSecretKey: randomSecretKey,\n};\n// ## Precomputes\n// --------------\nconst W = 8; // W is window size\nconst scalarBits = 256;\nconst pwindows = Math.ceil(scalarBits / W) + 1; // 33 for W=8, NOT 32 - see wNAF loop\nconst pwindowSize = 2 ** (W - 1); // 128 for W=8\nconst precompute = () => {\n const points = [];\n let p = G;\n let b = p;\n for (let w = 0; w < pwindows; w++) {\n b = p;\n points.push(b);\n for (let i = 1; i < pwindowSize; i++) {\n b = b.add(p);\n points.push(b);\n } // i=1, bc we skip 0\n p = b.double();\n }\n return points;\n};\nlet Gpows = undefined; // precomputes for base point G\n// const-time negate\nconst ctneg = (cnd, p) => {\n const n = p.negate();\n return cnd ? n : p;\n};\n/**\n * Precomputes give 12x faster getPublicKey(), 10x sign(), 2x verify() by\n * caching multiples of G (base point). Cache is stored in 32MB of RAM.\n * Any time `G.multiply` is done, precomputes are used.\n * Not used for getSharedSecret, which instead multiplies random pubkey `P.multiply`.\n *\n * w-ary non-adjacent form (wNAF) precomputation method is 10% slower than windowed method,\n * but takes 2x less RAM. RAM reduction is possible by utilizing `.subtract`.\n *\n * !! Precomputes can be disabled by commenting-out call of the wNAF() inside Point#multiply().\n */\nconst wNAF = (n) => {\n const comp = Gpows || (Gpows = precompute());\n let p = I;\n let f = G; // f must be G, or could become I in the end\n const pow_2_w = 2 ** W; // 256 for W=8\n const maxNum = pow_2_w; // 256 for W=8\n const mask = big(pow_2_w - 1); // 255 for W=8 == mask 0b11111111\n const shiftBy = big(W); // 8 for W=8\n for (let w = 0; w < pwindows; w++) {\n let wbits = Number(n & mask); // extract W bits.\n n >>= shiftBy; // shift number by W bits.\n // We use negative indexes to reduce size of precomputed table by 2x.\n // Instead of needing precomputes 0..256, we only calculate them for 0..128.\n // If an index > 128 is found, we do (256-index) - where 256 is next window.\n // Naive: index +127 => 127, +224 => 224\n // Optimized: index +127 => 127, +224 => 256-32\n if (wbits > pwindowSize) {\n wbits -= maxNum;\n n += 1n;\n }\n const off = w * pwindowSize;\n const offF = off; // offsets, evaluate both\n const offP = off + Math.abs(wbits) - 1;\n const isEven = w % 2 !== 0; // conditions, evaluate both\n const isNeg = wbits < 0;\n if (wbits === 0) {\n // off == I: can't add it. Adding random offF instead.\n f = f.add(ctneg(isEven, comp[offF])); // bits are 0: add garbage to fake point\n }\n else {\n p = p.add(ctneg(isNeg, comp[offP])); // bits are 1: add to result point\n }\n }\n if (n !== 0n)\n err('invalid wnaf');\n return { p, f }; // return both real and fake points for JIT\n};\n// !! Remove the export to easily use in REPL / browser console\nexport { etc, getPublicKey, getPublicKeyAsync, hash, hashes, keygen, keygenAsync, Point, sign, signAsync, utils, verify, verifyAsync, };\n","/**\n * Utilities for hex, bytes, CSPRNG.\n * @module\n */\n/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\n// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.\n// node.js versions earlier than v19 don't declare it in global scope.\n// For node.js, package.json#exports field mapping rewrites import\n// from `crypto` to `cryptoNode`, which imports native module.\n// Makes the utils un-importable in browsers without a bundler.\n// Once node.js 18 is deprecated (2025-04-30), we can just drop the import.\nimport { crypto } from '@noble/hashes/crypto';\n\n/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */\nexport function isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n\n/** Asserts something is positive integer. */\nexport function anumber(n: number): void {\n if (!Number.isSafeInteger(n) || n < 0) throw new Error('positive integer expected, got ' + n);\n}\n\n/** Asserts something is Uint8Array. */\nexport function abytes(b: Uint8Array | undefined, ...lengths: number[]): void {\n if (!isBytes(b)) throw new Error('Uint8Array expected');\n if (lengths.length > 0 && !lengths.includes(b.length))\n throw new Error('Uint8Array expected of length ' + lengths + ', got length=' + b.length);\n}\n\n/** Asserts something is hash */\nexport function ahash(h: IHash): void {\n if (typeof h !== 'function' || typeof h.create !== 'function')\n throw new Error('Hash should be wrapped by utils.createHasher');\n anumber(h.outputLen);\n anumber(h.blockLen);\n}\n\n/** Asserts a hash instance has not been destroyed / finished */\nexport function aexists(instance: any, checkFinished = true): void {\n if (instance.destroyed) throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished) throw new Error('Hash#digest() has already been called');\n}\n\n/** Asserts output is properly-sized byte array */\nexport function aoutput(out: any, instance: any): void {\n abytes(out);\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error('digestInto() expects output buffer of length at least ' + min);\n }\n}\n\n/** Generic type encompassing 8/16/32-byte arrays - but not 64-byte. */\n// prettier-ignore\nexport type TypedArray = Int8Array | Uint8ClampedArray | Uint8Array |\n Uint16Array | Int16Array | Uint32Array | Int32Array;\n\n/** Cast u8 / u16 / u32 to u8. */\nexport function u8(arr: TypedArray): Uint8Array {\n return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** Cast u8 / u16 / u32 to u32. */\nexport function u32(arr: TypedArray): Uint32Array {\n return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n\n/** Zeroize a byte array. Warning: JS provides no guarantees. */\nexport function clean(...arrays: TypedArray[]): void {\n for (let i = 0; i < arrays.length; i++) {\n arrays[i].fill(0);\n }\n}\n\n/** Create DataView of an array for easy byte-level manipulation. */\nexport function createView(arr: TypedArray): DataView {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** The rotate right (circular right shift) operation for uint32 */\nexport function rotr(word: number, shift: number): number {\n return (word << (32 - shift)) | (word >>> shift);\n}\n\n/** The rotate left (circular left shift) operation for uint32 */\nexport function rotl(word: number, shift: number): number {\n return (word << shift) | ((word >>> (32 - shift)) >>> 0);\n}\n\n/** Is current platform little-endian? Most are. Big-Endian platform: IBM */\nexport const isLE: boolean = /* @__PURE__ */ (() =>\n new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n\n/** The byte swap operation for uint32 */\nexport function byteSwap(word: number): number {\n return (\n ((word << 24) & 0xff000000) |\n ((word << 8) & 0xff0000) |\n ((word >>> 8) & 0xff00) |\n ((word >>> 24) & 0xff)\n );\n}\n/** Conditionally byte swap if on a big-endian platform */\nexport const swap8IfBE: (n: number) => number = isLE\n ? (n: number) => n\n : (n: number) => byteSwap(n);\n\n/** @deprecated */\nexport const byteSwapIfBE: typeof swap8IfBE = swap8IfBE;\n/** In place byte swap for Uint32Array */\nexport function byteSwap32(arr: Uint32Array): Uint32Array {\n for (let i = 0; i < arr.length; i++) {\n arr[i] = byteSwap(arr[i]);\n }\n return arr;\n}\n\nexport const swap32IfBE: (u: Uint32Array) => Uint32Array = isLE\n ? (u: Uint32Array) => u\n : byteSwap32;\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin: boolean = /* @__PURE__ */ (() =>\n // @ts-ignore\n typeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) =>\n i.toString(16).padStart(2, '0')\n);\n\n/**\n * Convert byte array to hex string. Uses built-in function, when available.\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n abytes(bytes);\n // @ts-ignore\n if (hasHexBuiltin) return bytes.toHex();\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n\n// We use optimized technique to convert hex string to byte array\nconst asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 } as const;\nfunction asciiToBase16(ch: number): number | undefined {\n if (ch >= asciis._0 && ch <= asciis._9) return ch - asciis._0; // '2' => 50-48\n if (ch >= asciis.A && ch <= asciis.F) return ch - (asciis.A - 10); // 'B' => 66-(65-10)\n if (ch >= asciis.a && ch <= asciis.f) return ch - (asciis.a - 10); // 'b' => 98-(97-10)\n return;\n}\n\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex: string): Uint8Array {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n // @ts-ignore\n if (hasHexBuiltin) return Uint8Array.fromHex(hex);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2) throw new Error('hex string expected, got unpadded hex of length ' + hl);\n const array = new Uint8Array(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n const n1 = asciiToBase16(hex.charCodeAt(hi));\n const n2 = asciiToBase16(hex.charCodeAt(hi + 1));\n if (n1 === undefined || n2 === undefined) {\n const char = hex[hi] + hex[hi + 1];\n throw new Error('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n }\n array[ai] = n1 * 16 + n2; // multiply first octet, e.g. 'a3' => 10*16+3 => 160 + 3 => 163\n }\n return array;\n}\n\n/**\n * There is no setImmediate in browser and setTimeout is slow.\n * Call of async fn will return Promise, which will be fullfiled only on\n * next scheduler queue processing step and this is exactly what we need.\n */\nexport const nextTick = async (): Promise<void> => {};\n\n/** Returns control to thread each 'tick' ms to avoid blocking. */\nexport async function asyncLoop(\n iters: number,\n tick: number,\n cb: (i: number) => void\n): Promise<void> {\n let ts = Date.now();\n for (let i = 0; i < iters; i++) {\n cb(i);\n // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n const diff = Date.now() - ts;\n if (diff >= 0 && diff < tick) continue;\n await nextTick();\n ts += diff;\n }\n}\n\n// Global symbols, but ts doesn't see them: https://github.com/microsoft/TypeScript/issues/31535\ndeclare const TextEncoder: any;\ndeclare const TextDecoder: any;\n\n/**\n * Converts string to bytes using UTF8 encoding.\n * @example utf8ToBytes('abc') // Uint8Array.from([97, 98, 99])\n */\nexport function utf8ToBytes(str: string): Uint8Array {\n if (typeof str !== 'string') throw new Error('string expected');\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n\n/**\n * Converts bytes to string using UTF8 encoding.\n * @example bytesToUtf8(Uint8Array.from([97, 98, 99])) // 'abc'\n */\nexport function bytesToUtf8(bytes: Uint8Array): string {\n return new TextDecoder().decode(bytes);\n}\n\n/** Accepted input of hash functions. Strings are converted to byte arrays. */\nexport type Input = string | Uint8Array;\n/**\n * Normalizes (non-hex) string or Uint8Array to Uint8Array.\n * Warning: when Uint8Array is passed, it would NOT get copied.\n * Keep in mind for future mutable operations.\n */\nexport function toBytes(data: Input): Uint8Array {\n if (typeof data === 'string') data = utf8ToBytes(data);\n abytes(data);\n return data;\n}\n\n/** KDFs can accept string or Uint8Array for user convenience. */\nexport type KDFInput = string | Uint8Array;\n/**\n * Helper for KDFs: consumes uint8array or string.\n * When string is passed, does utf8 decoding, using TextDecoder.\n */\nexport function kdfInputToBytes(data: KDFInput): Uint8Array {\n if (typeof data === 'string') data = utf8ToBytes(data);\n abytes(data);\n return data;\n}\n\n/** Copies several Uint8Arrays into one. */\nexport function concatBytes(...arrays: Uint8Array[]): Uint8Array {\n let sum = 0;\n for (let i = 0; i < arrays.length; i++) {\n const a = arrays[i];\n abytes(a);\n sum += a.length;\n }\n const res = new Uint8Array(sum);\n for (let i = 0, pad = 0; i < arrays.length; i++) {\n const a = arrays[i];\n res.set(a, pad);\n pad += a.length;\n }\n return res;\n}\n\ntype EmptyObj = {};\nexport function checkOpts<T1 extends EmptyObj, T2 extends EmptyObj>(\n defaults: T1,\n opts?: T2\n): T1 & T2 {\n if (opts !== undefined && {}.toString.call(opts) !== '[object Object]')\n throw new Error('options should be object or undefined');\n const merged = Object.assign(defaults, opts);\n return merged as T1 & T2;\n}\n\n/** Hash interface. */\nexport type IHash = {\n (data: Uint8Array): Uint8Array;\n blockLen: number;\n outputLen: number;\n create: any;\n};\n\n/** For runtime check if class implements interface */\nexport abstract class Hash<T extends Hash<T>> {\n abstract blockLen: number; // Bytes per block\n abstract outputLen: number; // Bytes in output\n abstract update(buf: Input): this;\n // Writes digest into buf\n abstract digestInto(buf: Uint8Array): void;\n abstract digest(): Uint8Array;\n /**\n * Resets internal state. Makes Hash instance unusable.\n * Reset is impossible for keyed hashes if key is consumed into state. If digest is not consumed\n * by user, they will need to manually call `destroy()` when zeroing is necessary.\n */\n abstract destroy(): void;\n /**\n * Clones hash instance. Unsafe: doesn't check whether `to` is valid. Can be used as `clone()`\n * when no options are passed.\n * Reasons to use `_cloneInto` instead of clone: 1) performance 2) reuse instance => all internal\n * buffers are overwritten => causes buffer overwrite which is used for digest in some cases.\n * There are no guarantees for clean-up because it's impossible in JS.\n */\n abstract _cloneInto(to?: T): T;\n // Safe version that clones internal state\n abstract clone(): T;\n}\n\n/**\n * XOF: streaming API to read digest in chunks.\n * Same as 'squeeze' in keccak/k12 and 'seek' in blake3, but more generic name.\n * When hash used in XOF mode it is up to user to call '.destroy' afterwards, since we cannot\n * destroy state, next call can require more bytes.\n */\nexport type HashXOF<T extends Hash<T>> = Hash<T> & {\n xof(bytes: number): Uint8Array; // Read 'bytes' bytes from digest stream\n xofInto(buf: Uint8Array): Uint8Array; // read buf.length bytes from digest stream into buf\n};\n\n/** Hash function */\nexport type CHash = ReturnType<typeof createHasher>;\n/** Hash function with output */\nexport type CHashO = ReturnType<typeof createOptHasher>;\n/** XOF with output */\nexport type CHashXO = ReturnType<typeof createXOFer>;\n\n/** Wraps hash function, creating an interface on top of it */\nexport function createHasher<T extends Hash<T>>(\n hashCons: () => Hash<T>\n): {\n (msg: Input): Uint8Array;\n outputLen: number;\n blockLen: number;\n create(): Hash<T>;\n} {\n const hashC = (msg: Input): Uint8Array => hashCons().update(toBytes(msg)).digest();\n const tmp = hashCons();\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = () => hashCons();\n return hashC;\n}\n\nexport function createOptHasher<H extends Hash<H>, T extends Object>(\n hashCons: (opts?: T) => Hash<H>\n): {\n (msg: Input, opts?: T): Uint8Array;\n outputLen: number;\n blockLen: number;\n create(opts?: T): Hash<H>;\n} {\n const hashC = (msg: Input, opts?: T): Uint8Array => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({} as T);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts?: T) => hashCons(opts);\n return hashC;\n}\n\nexport function createXOFer<H extends HashXOF<H>, T extends Object>(\n hashCons: (opts?: T) => HashXOF<H>\n): {\n (msg: Input, opts?: T): Uint8Array;\n outputLen: number;\n blockLen: number;\n create(opts?: T): HashXOF<H>;\n} {\n const hashC = (msg: Input, opts?: T): Uint8Array => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({} as T);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts?: T) => hashCons(opts);\n return hashC;\n}\nexport const wrapConstructor: typeof createHasher = createHasher;\nexport const wrapConstructorWithOpts: typeof createOptHasher = createOptHasher;\nexport const wrapXOFConstructorWithOpts: typeof createXOFer = createXOFer;\n\n/** Cryptographically secure PRNG. Uses internal OS-level `crypto.getRandomValues`. */\nexport function randomBytes(bytesLength = 32): Uint8Array {\n if (crypto && typeof crypto.getRandomValues === 'function') {\n return crypto.getRandomValues(new Uint8Array(bytesLength));\n }\n // Legacy Node.js compatibility\n if (crypto && typeof crypto.randomBytes === 'function') {\n return Uint8Array.from(crypto.randomBytes(bytesLength));\n }\n throw new Error('crypto.getRandomValues must be defined');\n}\n","/**\n * Internal Merkle-Damgard hash utils.\n * @module\n */\nimport { type Input, Hash, abytes, aexists, aoutput, clean, createView, toBytes } from './utils.ts';\n\n/** Polyfill for Safari 14. https://caniuse.com/mdn-javascript_builtins_dataview_setbiguint64 */\nexport function setBigUint64(\n view: DataView,\n byteOffset: number,\n value: bigint,\n isLE: boolean\n): void {\n if (typeof view.setBigUint64 === 'function') return view.setBigUint64(byteOffset, value, isLE);\n const _32n = BigInt(32);\n const _u32_max = BigInt(0xffffffff);\n const wh = Number((value >> _32n) & _u32_max);\n const wl = Number(value & _u32_max);\n const h = isLE ? 4 : 0;\n const l = isLE ? 0 : 4;\n view.setUint32(byteOffset + h, wh, isLE);\n view.setUint32(byteOffset + l, wl, isLE);\n}\n\n/** Choice: a ? b : c */\nexport function Chi(a: number, b: number, c: number): number {\n return (a & b) ^ (~a & c);\n}\n\n/** Majority function, true if any two inputs is true. */\nexport function Maj(a: number, b: number, c: number): number {\n return (a & b) ^ (a & c) ^ (b & c);\n}\n\n/**\n * Merkle-Damgard hash construction base class.\n * Could be used to create MD5, RIPEMD, SHA1, SHA2.\n */\nexport abstract class HashMD<T extends HashMD<T>> extends Hash<T> {\n protected abstract process(buf: DataView, offset: number): void;\n protected abstract get(): number[];\n protected abstract set(...args: number[]): void;\n abstract destroy(): void;\n protected abstract roundClean(): void;\n\n readonly blockLen: number;\n readonly outputLen: number;\n readonly padOffset: number;\n readonly isLE: boolean;\n\n // For partial updates less than block size\n protected buffer: Uint8Array;\n protected view: DataView;\n protected finished = false;\n protected length = 0;\n protected pos = 0;\n protected destroyed = false;\n\n constructor(blockLen: number, outputLen: number, padOffset: number, isLE: boolean) {\n super();\n this.blockLen = blockLen;\n this.outputLen = outputLen;\n this.padOffset = padOffset;\n this.isLE = isLE;\n this.buffer = new Uint8Array(blockLen);\n this.view = createView(this.buffer);\n }\n update(data: Input): this {\n aexists(this);\n data = toBytes(data);\n abytes(data);\n const { view, buffer, blockLen } = this;\n const len = data.length;\n for (let pos = 0; pos < len; ) {\n const take = Math.min(blockLen - this.pos, len - pos);\n // Fast path: we have at least one block in input, cast it to view and process\n if (take === blockLen) {\n const dataView = createView(data);\n for (; blockLen <= len - pos; pos += blockLen) this.process(dataView, pos);\n continue;\n }\n buffer.set(data.subarray(pos, pos + take), this.pos);\n this.pos += take;\n pos += take;\n if (this.pos === blockLen) {\n this.process(view, 0);\n this.pos = 0;\n }\n }\n this.length += data.length;\n this.roundClean();\n return this;\n }\n digestInto(out: Uint8Array): void {\n aexists(this);\n aoutput(out, this);\n this.finished = true;\n // Padding\n // We can avoid allocation of buffer for padding completely if it\n // was previously not allocated here. But it won't change performance.\n const { buffer, view, blockLen, isLE } = this;\n let { pos } = this;\n // append the bit '1' to the message\n buffer[pos++] = 0b10000000;\n clean(this.buffer.subarray(pos));\n // we have less than padOffset left in buffer, so we cannot put length in\n // current block, need process it and pad again\n if (this.padOffset > blockLen - pos) {\n this.process(view, 0);\n pos = 0;\n }\n // Pad until full block byte with zeros\n for (let i = pos; i < blockLen; i++) buffer[i] = 0;\n // Note: sha512 requires length to be 128bit integer, but length in JS will overflow before that\n // You need to write around 2 exabytes (u64_max / 8 / (1024**6)) for this to happen.\n // So we just write lowest 64 bits of that value.\n setBigUint64(view, blockLen - 8, BigInt(this.length * 8), isLE);\n this.process(view, 0);\n const oview = createView(out);\n const len = this.outputLen;\n // NOTE: we do division by 4 later, which should be fused in single op with modulo by JIT\n if (len % 4) throw new Error('_sha2: outputLen should be aligned to 32bit');\n const outLen = len / 4;\n const state = this.get();\n if (outLen > state.length) throw new Error('_sha2: outputLen bigger than state');\n for (let i = 0; i < outLen; i++) oview.setUint32(4 * i, state[i], isLE);\n }\n digest(): Uint8Array {\n const { buffer, outputLen } = this;\n this.digestInto(buffer);\n const res = buffer.slice(0, outputLen);\n this.destroy();\n return res;\n }\n _cloneInto(to?: T): T {\n to ||= new (this.constructor as any)() as T;\n to.set(...this.get());\n const { blockLen, buffer, length, finished, destroyed, pos } = this;\n to.destroyed = destroyed;\n to.finished = finished;\n to.length = length;\n to.pos = pos;\n if (length % blockLen) to.buffer.set(buffer);\n return to;\n }\n clone(): T {\n return this._cloneInto();\n }\n}\n\n/**\n * Initial SHA-2 state: fractional parts of square roots of first 16 primes 2..53.\n * Check out `test/misc/sha2-gen-iv.js` for recomputation guide.\n */\n\n/** Initial SHA256 state. Bits 0..32 of frac part of sqrt of primes 2..19 */\nexport const SHA256_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n]);\n\n/** Initial SHA224 state. Bits 32..64 of frac part of sqrt of primes 23..53 */\nexport const SHA224_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4,\n]);\n\n/** Initial SHA384 state. Bits 0..64 of frac part of sqrt of primes 23..53 */\nexport const SHA384_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0xcbbb9d5d, 0xc1059ed8, 0x629a292a, 0x367cd507, 0x9159015a, 0x3070dd17, 0x152fecd8, 0xf70e5939,\n 0x67332667, 0xffc00b31, 0x8eb44a87, 0x68581511, 0xdb0c2e0d, 0x64f98fa7, 0x47b5481d, 0xbefa4fa4,\n]);\n\n/** Initial SHA512 state. Bits 0..64 of frac part of sqrt of primes 2..19 */\nexport const SHA512_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xf3bcc908, 0xbb67ae85, 0x84caa73b, 0x3c6ef372, 0xfe94f82b, 0xa54ff53a, 0x5f1d36f1,\n 0x510e527f, 0xade682d1, 0x9b05688c, 0x2b3e6c1f, 0x1f83d9ab, 0xfb41bd6b, 0x5be0cd19, 0x137e2179,\n]);\n","/**\n * Internal helpers for u64. BigUint64Array is too slow as per 2025, so we implement it using Uint32Array.\n * @todo re-check https://issues.chromium.org/issues/42212588\n * @module\n */\nconst U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);\nconst _32n = /* @__PURE__ */ BigInt(32);\n\nfunction fromBig(\n n: bigint,\n le = false\n): {\n h: number;\n l: number;\n} {\n if (le) return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };\n return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };\n}\n\nfunction split(lst: bigint[], le = false): Uint32Array[] {\n const len = lst.length;\n let Ah = new Uint32Array(len);\n let Al = new Uint32Array(len);\n for (let i = 0; i < len; i++) {\n const { h, l } = fromBig(lst[i], le);\n [Ah[i], Al[i]] = [h, l];\n }\n return [Ah, Al];\n}\n\nconst toBig = (h: number, l: number): bigint => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);\n// for Shift in [0, 32)\nconst shrSH = (h: number, _l: number, s: number): number => h >>> s;\nconst shrSL = (h: number, l: number, s: number): number => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in [1, 32)\nconst rotrSH = (h: number, l: number, s: number): number => (h >>> s) | (l << (32 - s));\nconst rotrSL = (h: number, l: number, s: number): number => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotrBH = (h: number, l: number, s: number): number => (h << (64 - s)) | (l >>> (s - 32));\nconst rotrBL = (h: number, l: number, s: number): number => (h >>> (s - 32)) | (l << (64 - s));\n// Right rotate for shift===32 (just swaps l&h)\nconst rotr32H = (_h: number, l: number): number => l;\nconst rotr32L = (h: number, _l: number): number => h;\n// Left rotate for Shift in [1, 32)\nconst rotlSH = (h: number, l: number, s: number): number => (h << s) | (l >>> (32 - s));\nconst rotlSL = (h: number, l: number, s: number): number => (l << s) | (h >>> (32 - s));\n// Left rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotlBH = (h: number, l: number, s: number): number => (l << (s - 32)) | (h >>> (64 - s));\nconst rotlBL = (h: number, l: number, s: number): number => (h << (s - 32)) | (l >>> (64 - s));\n\n// JS uses 32-bit signed integers for bitwise operations which means we cannot\n// simple take carry out of low bit sum by shift, we need to use division.\nfunction add(\n Ah: number,\n Al: number,\n Bh: number,\n Bl: number\n): {\n h: number;\n l: number;\n} {\n const l = (Al >>> 0) + (Bl >>> 0);\n return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };\n}\n// Addition with more than 2 elements\nconst add3L = (Al: number, Bl: number, Cl: number): number => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);\nconst add3H = (low: number, Ah: number, Bh: number, Ch: number): number =>\n (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;\nconst add4L = (Al: number, Bl: number, Cl: number, Dl: number): number =>\n (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);\nconst add4H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number): number =>\n (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;\nconst add5L = (Al: number, Bl: number, Cl: number, Dl: number, El: number): number =>\n (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);\nconst add5H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number, Eh: number): number =>\n (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;\n\n// prettier-ignore\nexport {\n add, add3H, add3L, add4H, add4L, add5H, add5L, fromBig, rotlBH, rotlBL, rotlSH, rotlSL, rotr32H, rotr32L, rotrBH, rotrBL, rotrSH, rotrSL, shrSH, shrSL, split, toBig\n};\n// prettier-ignore\nconst u64: { fromBig: typeof fromBig; split: typeof split; toBig: (h: number, l: number) => bigint; shrSH: (h: number, _l: number, s: number) => number; shrSL: (h: number, l: number, s: number) => number; rotrSH: (h: number, l: number, s: number) => number; rotrSL: (h: number, l: number, s: number) => number; rotrBH: (h: number, l: number, s: number) => number; rotrBL: (h: number, l: number, s: number) => number; rotr32H: (_h: number, l: number) => number; rotr32L: (h: number, _l: number) => number; rotlSH: (h: number, l: number, s: number) => number; rotlSL: (h: number, l: number, s: number) => number; rotlBH: (h: number, l: number, s: number) => number; rotlBL: (h: number, l: number, s: number) => number; add: typeof add; add3L: (Al: number, Bl: number, Cl: number) => number; add3H: (low: number, Ah: number, Bh: number, Ch: number) => number; add4L: (Al: number, Bl: number, Cl: number, Dl: number) => number; add4H: (low: number, Ah: number, Bh: number, Ch: number, Dh: number) => number; add5H: (low: number, Ah: number, Bh: number, Ch: number, Dh: number, Eh: number) => number; add5L: (Al: number, Bl: number, Cl: number, Dl: number, El: number) => number; } = {\n fromBig, split, toBig,\n shrSH, shrSL,\n rotrSH, rotrSL, rotrBH, rotrBL,\n rotr32H, rotr32L,\n rotlSH, rotlSL, rotlBH, rotlBL,\n add, add3L, add3H, add4L, add4H, add5H, add5L,\n};\nexport default u64;\n","/**\n * SHA2 hash function. A.k.a. sha256, sha384, sha512, sha512_224, sha512_256.\n * SHA256 is the fastest hash implementable in JS, even faster than Blake3.\n * Check out [RFC 4634](https://datatracker.ietf.org/doc/html/rfc4634) and\n * [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf).\n * @module\n */\nimport { Chi, HashMD, Maj, SHA224_IV, SHA256_IV, SHA384_IV, SHA512_IV } from './_md.ts';\nimport * as u64 from './_u64.ts';\nimport { type CHash, clean, createHasher, rotr } from './utils.ts';\n\n/**\n * Round constants:\n * First 32 bits of fractional parts of the cube roots of the first 64 primes 2..311)\n */\n// prettier-ignore\nconst SHA256_K = /* @__PURE__ */ Uint32Array.from([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n]);\n\n/** Reusable temporary buffer. \"W\" comes straight from spec. */\nconst SHA256_W = /* @__PURE__ */ new Uint32Array(64);\nexport class SHA256 extends HashMD<SHA256> {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n protected A: number = SHA256_IV[0] | 0;\n protected B: number = SHA256_IV[1] | 0;\n protected C: number = SHA256_IV[2] | 0;\n protected D: number = SHA256_IV[3] | 0;\n protected E: number = SHA256_IV[4] | 0;\n protected F: number = SHA256_IV[5] | 0;\n protected G: number = SHA256_IV[6] | 0;\n protected H: number = SHA256_IV[7] | 0;\n\n constructor(outputLen: number = 32) {\n super(64, outputLen, 8, false);\n }\n protected get(): [number, number, number, number, number, number, number, number] {\n const { A, B, C, D, E, F, G, H } = this;\n return [A, B, C, D, E, F, G, H];\n }\n // prettier-ignore\n protected set(\n A: number, B: number, C: number, D: number, E: number, F: number, G: number, H: number\n ): void {\n this.A = A | 0;\n this.B = B | 0;\n this.C = C | 0;\n this.D = D | 0;\n this.E = E | 0;\n this.F = F | 0;\n this.G = G | 0;\n this.H = H | 0;\n }\n protected process(view: DataView, offset: number): void {\n // Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4) SHA256_W[i] = view.getUint32(offset, false);\n for (let i = 16; i < 64; i++) {\n const W15 = SHA256_W[i - 15];\n const W2 = SHA256_W[i - 2];\n const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ (W15 >>> 3);\n const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ (W2 >>> 10);\n SHA256_W[i] = (s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16]) | 0;\n }\n // Compression function main loop, 64 rounds\n let { A, B, C, D, E, F, G, H } = this;\n for (let i = 0; i < 64; i++) {\n const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25);\n const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22);\n const T2 = (sigma0 + Maj(A, B, C)) | 0;\n H = G;\n G = F;\n F = E;\n E = (D + T1) | 0;\n D = C;\n C = B;\n B = A;\n A = (T1 + T2) | 0;\n }\n // Add the compressed chunk to the current hash value\n A = (A + this.A) | 0;\n B = (B + this.B) | 0;\n C = (C + this.C) | 0;\n D = (D + this.D) | 0;\n E = (E + this.E) | 0;\n F = (F + this.F) | 0;\n G = (G + this.G) | 0;\n H = (H + this.H) | 0;\n this.set(A, B, C, D, E, F, G, H);\n }\n protected roundClean(): void {\n clean(SHA256_W);\n }\n destroy(): void {\n this.set(0, 0, 0, 0, 0, 0, 0, 0);\n clean(this.buffer);\n }\n}\n\nexport class SHA224 extends SHA256 {\n protected A: number = SHA224_IV[0] | 0;\n protected B: number = SHA224_IV[1] | 0;\n protected C: number = SHA224_IV[2] | 0;\n protected D: number = SHA224_IV[3] | 0;\n protected E: number = SHA224_IV[4] | 0;\n protected F: number = SHA224_IV[5] | 0;\n protected G: number = SHA224_IV[6] | 0;\n protected H: number = SHA224_IV[7] | 0;\n constructor() {\n super(28);\n }\n}\n\n// SHA2-512 is slower than sha256 in js because u64 operations are slow.\n\n// Round contants\n// First 32 bits of the fractional parts of the cube roots of the first 80 primes 2..409\n// prettier-ignore\nconst K512 = /* @__PURE__ */ (() => u64.split([\n '0x428a2f98d728ae22', '0x7137449123ef65cd', '0xb5c0fbcfec4d3b2f', '0xe9b5dba58189dbbc',\n '0x3956c25bf348b538', '0x59f111f1b605d019', '0x923f82a4af194f9b', '0xab1c5ed5da6d8118',\n '0xd807aa98a3030242', '0x12835b0145706fbe', '0x243185be4ee4b28c', '0x550c7dc3d5ffb4e2',\n '0x72be5d74f27b896f', '0x80deb1fe3b1696b1', '0x9bdc06a725c71235', '0xc19bf174cf692694',\n '0xe49b69c19ef14ad2', '0xefbe4786384f25e3', '0x0fc19dc68b8cd5b5', '0x240ca1cc77ac9c65',\n '0x2de92c6f592b0275', '0x4a7484aa6ea6e483', '0x5cb0a9dcbd41fbd4', '0x76f988da831153b5',\n '0x983e5152ee66dfab', '0xa831c66d2db43210', '0xb00327c898fb213f', '0xbf597fc7beef0ee4',\n '0xc6e00bf33da88fc2', '0xd5a79147930aa725', '0x06ca6351e003826f', '0x142929670a0e6e70',\n '0x27b70a8546d22ffc', '0x2e1b21385c26c926', '0x4d2c6dfc5ac42aed', '0x53380d139d95b3df',\n '0x650a73548baf63de', '0x766a0abb3c77b2a8', '0x81c2c92e47edaee6', '0x92722c851482353b',\n '0xa2bfe8a14cf10364', '0xa81a664bbc423001', '0xc24b8b70d0f89791', '0xc76c51a30654be30',\n '0xd192e819d6ef5218', '0xd69906245565a910', '0xf40e35855771202a', '0x106aa07032bbd1b8',\n '0x19a4c116b8d2d0c8', '0x1e376c085141ab53', '0x2748774cdf8eeb99', '0x34b0bcb5e19b48a8',\n '0x391c0cb3c5c95a63', '0x4ed8aa4ae3418acb', '0x5b9cca4f7763e373', '0x682e6ff3d6b2b8a3',\n '0x748f82ee5defb2fc', '0x78a5636f43172f60', '0x84c87814a1f0ab72', '0x8cc702081a6439ec',\n '0x90befffa23631e28', '0xa4506cebde82bde9', '0xbef9a3f7b2c67915', '0xc67178f2e372532b',\n '0xca273eceea26619c', '0xd186b8c721c0c207', '0xeada7dd6cde0eb1e', '0xf57d4f7fee6ed178',\n '0x06f067aa72176fba', '0x0a637dc5a2c898a6', '0x113f9804bef90dae', '0x1b710b35131c471b',\n '0x28db77f523047d84', '0x32caab7b40c72493', '0x3c9ebe0a15c9bebc', '0x431d67c49c100d4c',\n '0x4cc5d4becb3e42b6', '0x597f299cfc657e2a', '0x5fcb6fab3ad6faec', '0x6c44198c4a475817'\n].map(n => BigInt(n))))();\nconst SHA512_Kh = /* @__PURE__ */ (() => K512[0])();\nconst SHA512_Kl = /* @__PURE__ */ (() => K512[1])();\n\n// Reusable temporary buffers\nconst SHA512_W_H = /* @__PURE__ */ new Uint32Array(80);\nconst SHA512_W_L = /* @__PURE__ */ new Uint32Array(80);\n\nexport class SHA512 extends HashMD<SHA512> {\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n // h -- high 32 bits, l -- low 32 bits\n protected Ah: number = SHA512_IV[0] | 0;\n protected Al: number = SHA512_IV[1] | 0;\n protected Bh: number = SHA512_IV[2] | 0;\n protected Bl: number = SHA512_IV[3] | 0;\n protected Ch: number = SHA512_IV[4] | 0;\n protected Cl: number = SHA512_IV[5] | 0;\n protected Dh: number = SHA512_IV[6] | 0;\n protected Dl: number = SHA512_IV[7] | 0;\n protected Eh: number = SHA512_IV[8] | 0;\n protected El: number = SHA512_IV[9] | 0;\n protected Fh: number = SHA512_IV[10] | 0;\n protected Fl: number = SHA512_IV[11] | 0;\n protected Gh: number = SHA512_IV[12] | 0;\n protected Gl: number = SHA512_IV[13] | 0;\n protected Hh: number = SHA512_IV[14] | 0;\n protected Hl: number = SHA512_IV[15] | 0;\n\n constructor(outputLen: number = 64) {\n super(128, outputLen, 16, false);\n }\n // prettier-ignore\n protected get(): [\n number, number, number, number, number, number, number, number,\n number, number, number, number, number, number, number, number\n ] {\n const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl];\n }\n // prettier-ignore\n protected set(\n Ah: number, Al: number, Bh: number, Bl: number, Ch: number, Cl: number, Dh: number, Dl: number,\n Eh: number, El: number, Fh: number, Fl: number, Gh: number, Gl: number, Hh: number, Hl: number\n ): void {\n this.Ah = Ah | 0;\n this.Al = Al | 0;\n this.Bh = Bh | 0;\n this.Bl = Bl | 0;\n this.Ch = Ch | 0;\n this.Cl = Cl | 0;\n this.Dh = Dh | 0;\n this.Dl = Dl | 0;\n this.Eh = Eh | 0;\n this.El = El | 0;\n this.Fh = Fh | 0;\n this.Fl = Fl | 0;\n this.Gh = Gh | 0;\n this.Gl = Gl | 0;\n this.Hh = Hh | 0;\n this.Hl = Hl | 0;\n }\n protected process(view: DataView, offset: number): void {\n // Extend the first 16 words into the remaining 64 words w[16..79] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4) {\n SHA512_W_H[i] = view.getUint32(offset);\n SHA512_W_L[i] = view.getUint32((offset += 4));\n }\n for (let i = 16; i < 80; i++) {\n // s0 := (w[i-15] rightrotate 1) xor (w[i-15] rightrotate 8) xor (w[i-15] rightshift 7)\n const W15h = SHA512_W_H[i - 15] | 0;\n const W15l = SHA512_W_L[i - 15] | 0;\n const s0h = u64.rotrSH(W15h, W15l, 1) ^ u64.rotrSH(W15h, W15l, 8) ^ u64.shrSH(W15h, W15l, 7);\n const s0l = u64.rotrSL(W15h, W15l, 1) ^ u64.rotrSL(W15h, W15l, 8) ^ u64.shrSL(W15h, W15l, 7);\n // s1 := (w[i-2] rightrotate 19) xor (w[i-2] rightrotate 61) xor (w[i-2] rightshift 6)\n const W2h = SHA512_W_H[i - 2] | 0;\n const W2l = SHA512_W_L[i - 2] | 0;\n const s1h = u64.rotrSH(W2h, W2l, 19) ^ u64.rotrBH(W2h, W2l, 61) ^ u64.shrSH(W2h, W2l, 6);\n const s1l = u64.rotrSL(W2h, W2l, 19) ^ u64.rotrBL(W2h, W2l, 61) ^ u64.shrSL(W2h, W2l, 6);\n // SHA256_W[i] = s0 + s1 + SHA256_W[i - 7] + SHA256_W[i - 16];\n const SUMl = u64.add4L(s0l, s1l, SHA512_W_L[i - 7], SHA512_W_L[i - 16]);\n const SUMh = u64.add4H(SUMl, s0h, s1h, SHA512_W_H[i - 7], SHA512_W_H[i - 16]);\n SHA512_W_H[i] = SUMh | 0;\n SHA512_W_L[i] = SUMl | 0;\n }\n let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n // Compression function main loop, 80 rounds\n for (let i = 0; i < 80; i++) {\n // S1 := (e rightrotate 14) xor (e rightrotate 18) xor (e rightrotate 41)\n const sigma1h = u64.rotrSH(Eh, El, 14) ^ u64.rotrSH(Eh, El, 18) ^ u64.rotrBH(Eh, El, 41);\n const sigma1l = u64.rotrSL(Eh, El, 14) ^ u64.rotrSL(Eh, El, 18) ^ u64.rotrBL(Eh, El, 41);\n //const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const CHIh = (Eh & Fh) ^ (~Eh & Gh);\n const CHIl = (El & Fl) ^ (~El & Gl);\n // T1 = H + sigma1 + Chi(E, F, G) + SHA512_K[i] + SHA512_W[i]\n // prettier-ignore\n const T1ll = u64.add5L(Hl, sigma1l, CHIl, SHA512_Kl[i], SHA512_W_L[i]);\n const T1h = u64.add5H(T1ll, Hh, sigma1h, CHIh, SHA512_Kh[i], SHA512_W_H[i]);\n const T1l = T1ll | 0;\n // S0 := (a rightrotate 28) xor (a rightrotate 34) xor (a rightrotate 39)\n const sigma0h = u64.rotrSH(Ah, Al, 28) ^ u64.rotrBH(Ah, Al, 34) ^ u64.rotrBH(Ah, Al, 39);\n const sigma0l = u64.rotrSL(Ah, Al, 28) ^ u64.rotrBL(Ah, Al, 34) ^ u64.rotrBL(Ah, Al, 39);\n const MAJh = (Ah & Bh) ^ (Ah & Ch) ^ (Bh & Ch);\n const MAJl = (Al & Bl) ^ (Al & Cl) ^ (Bl & Cl);\n Hh = Gh | 0;\n Hl = Gl | 0;\n Gh = Fh | 0;\n Gl = Fl | 0;\n Fh = Eh | 0;\n Fl = El | 0;\n ({ h: Eh, l: El } = u64.add(Dh | 0, Dl | 0, T1h | 0, T1l | 0));\n Dh = Ch | 0;\n Dl = Cl | 0;\n Ch = Bh | 0;\n Cl = Bl | 0;\n Bh = Ah | 0;\n Bl = Al | 0;\n const All = u64.add3L(T1l, sigma0l, MAJl);\n Ah = u64.add3H(All, T1h, sigma0h, MAJh);\n Al = All | 0;\n }\n // Add the compressed chunk to the current hash value\n ({ h: Ah, l: Al } = u64.add(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0));\n ({ h: Bh, l: Bl } = u64.add(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0));\n ({ h: Ch, l: Cl } = u64.add(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0));\n ({ h: Dh, l: Dl } = u64.add(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0));\n ({ h: Eh, l: El } = u64.add(this.Eh | 0, this.El | 0, Eh | 0, El | 0));\n ({ h: Fh, l: Fl } = u64.add(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0));\n ({ h: Gh, l: Gl } = u64.add(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0));\n ({ h: Hh, l: Hl } = u64.add(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0));\n this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl);\n }\n protected roundClean(): void {\n clean(SHA512_W_H, SHA512_W_L);\n }\n destroy(): void {\n clean(this.buffer);\n this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n }\n}\n\nexport class SHA384 extends SHA512 {\n protected Ah: number = SHA384_IV[0] | 0;\n protected Al: number = SHA384_IV[1] | 0;\n protected Bh: number = SHA384_IV[2] | 0;\n protected Bl: number = SHA384_IV[3] | 0;\n protected Ch: number = SHA384_IV[4] | 0;\n protected Cl: number = SHA384_IV[5] | 0;\n protected Dh: number = SHA384_IV[6] | 0;\n protected Dl: number = SHA384_IV[7] | 0;\n protected Eh: number = SHA384_IV[8] | 0;\n protected El: number = SHA384_IV[9] | 0;\n protected Fh: number = SHA384_IV[10] | 0;\n protected Fl: number = SHA384_IV[11] | 0;\n protected Gh: number = SHA384_IV[12] | 0;\n protected Gl: number = SHA384_IV[13] | 0;\n protected Hh: number = SHA384_IV[14] | 0;\n protected Hl: number = SHA384_IV[15] | 0;\n\n constructor() {\n super(48);\n }\n}\n\n/**\n * Truncated SHA512/256 and SHA512/224.\n * SHA512_IV is XORed with 0xa5a5a5a5a5a5a5a5, then used as \"intermediary\" IV of SHA512/t.\n * Then t hashes string to produce result IV.\n * See `test/misc/sha2-gen-iv.js`.\n */\n\n/** SHA512/224 IV */\nconst T224_IV = /* @__PURE__ */ Uint32Array.from([\n 0x8c3d37c8, 0x19544da2, 0x73e19966, 0x89dcd4d6, 0x1dfab7ae, 0x32ff9c82, 0x679dd514, 0x582f9fcf,\n 0x0f6d2b69, 0x7bd44da8, 0x77e36f73, 0x04c48942, 0x3f9d85a8, 0x6a1d36c8, 0x1112e6ad, 0x91d692a1,\n]);\n\n/** SHA512/256 IV */\nconst T256_IV = /* @__PURE__ */ Uint32Array.from([\n 0x22312194, 0xfc2bf72c, 0x9f555fa3, 0xc84c64c2, 0x2393b86b, 0x6f53b151, 0x96387719, 0x5940eabd,\n 0x96283ee2, 0xa88effe3, 0xbe5e1e25, 0x53863992, 0x2b0199fc, 0x2c85b8aa, 0x0eb72ddc, 0x81c52ca2,\n]);\n\nexport class SHA512_224 extends SHA512 {\n protected Ah: number = T224_IV[0] | 0;\n protected Al: number = T224_IV[1] | 0;\n protected Bh: number = T224_IV[2] | 0;\n protected Bl: number = T224_IV[3] | 0;\n protected Ch: number = T224_IV[4] | 0;\n protected Cl: number = T224_IV[5] | 0;\n protected Dh: number = T224_IV[6] | 0;\n protected Dl: number = T224_IV[7] | 0;\n protected Eh: number = T224_IV[8] | 0;\n protected El: number = T224_IV[9] | 0;\n protected Fh: number = T224_IV[10] | 0;\n protected Fl: number = T224_IV[11] | 0;\n protected Gh: number = T224_IV[12] | 0;\n protected Gl: number = T224_IV[13] | 0;\n protected Hh: number = T224_IV[14] | 0;\n protected Hl: number = T224_IV[15] | 0;\n\n constructor() {\n super(28);\n }\n}\n\nexport class SHA512_256 extends SHA512 {\n protected Ah: number = T256_IV[0] | 0;\n protected Al: number = T256_IV[1] | 0;\n protected Bh: number = T256_IV[2] | 0;\n protected Bl: number = T256_IV[3] | 0;\n protected Ch: number = T256_IV[4] | 0;\n protected Cl: number = T256_IV[5] | 0;\n protected Dh: number = T256_IV[6] | 0;\n protected Dl: number = T256_IV[7] | 0;\n protected Eh: number = T256_IV[8] | 0;\n protected El: number = T256_IV[9] | 0;\n protected Fh: number = T256_IV[10] | 0;\n protected Fl: number = T256_IV[11] | 0;\n protected Gh: number = T256_IV[12] | 0;\n protected Gl: number = T256_IV[13] | 0;\n protected Hh: number = T256_IV[14] | 0;\n protected Hl: number = T256_IV[15] | 0;\n\n constructor() {\n super(32);\n }\n}\n\n/**\n * SHA2-256 hash function from RFC 4634.\n *\n * It is the fastest JS hash, even faster than Blake3.\n * To break sha256 using birthday attack, attackers need to try 2^128 hashes.\n * BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n */\nexport const sha256: CHash = /* @__PURE__ */ createHasher(() => new SHA256());\n/** SHA2-224 hash function from RFC 4634 */\nexport const sha224: CHash = /* @__PURE__ */ createHasher(() => new SHA224());\n\n/** SHA2-512 hash function from RFC 4634. */\nexport const sha512: CHash = /* @__PURE__ */ createHasher(() => new SHA512());\n/** SHA2-384 hash function from RFC 4634. */\nexport const sha384: CHash = /* @__PURE__ */ createHasher(() => new SHA384());\n\n/**\n * SHA2-512/256 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_256: CHash = /* @__PURE__ */ createHasher(() => new SHA512_256());\n/**\n * SHA2-512/224 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_224: CHash = /* @__PURE__ */ createHasher(() => new SHA512_224());\n","import { verify } from '@noble/ed25519';\nimport { sha512 } from '@noble/hashes/sha2.js';\nimport { toCanonicalJson } from './canonicalJson.js';\nimport { CerVerifyCode } from './types.js';\nimport type { NodeKeysDocument, SignedAttestationReceipt, NodeReceiptVerifyResult } from './types.js';\n\nimport { hashes } from '@noble/ed25519';\nhashes.sha512 = sha512;\n\nfunction base64urlToBytes(s: string): Uint8Array {\n const pad = s.length % 4;\n const base64 = s.replace(/-/g, '+').replace(/_/g, '/') + (pad ? '='.repeat(4 - pad) : '');\n if (typeof Buffer !== 'undefined') {\n return new Uint8Array(Buffer.from(base64, 'base64'));\n }\n const binary = atob(base64);\n return Uint8Array.from(binary, (c) => c.charCodeAt(0));\n}\n\nexport async function verifyNodeReceiptSignature(params: {\n receipt: SignedAttestationReceipt;\n signatureB64Url: string;\n key: {\n jwk?: NodeKeysDocument['keys'][number]['publicKeyJwk'];\n spkiB64?: string;\n rawB64Url?: string;\n };\n}): Promise<NodeReceiptVerifyResult> {\n try {\n const { receipt, signatureB64Url, key } = params;\n\n let pubKeyBytes: Uint8Array;\n\n if (key.jwk) {\n if (key.jwk.kty !== 'OKP' || key.jwk.crv !== 'Ed25519') {\n return {\n ok: false,\n code: CerVerifyCode.ATTESTATION_KEY_FORMAT_UNSUPPORTED,\n details: [\n `JWK must have kty=OKP and crv=Ed25519, got kty=${key.jwk.kty} crv=${key.jwk.crv}`,\n ],\n };\n }\n pubKeyBytes = base64urlToBytes(key.jwk.x);\n } else if (key.rawB64Url) {\n pubKeyBytes = base64urlToBytes(key.rawB64Url);\n } else if (key.spkiB64) {\n const spkiBytes = base64urlToBytes(key.spkiB64);\n if (spkiBytes.length < 32) {\n return {\n ok: false,\n code: CerVerifyCode.ATTESTATION_KEY_FORMAT_UNSUPPORTED,\n details: ['SPKI key too short to extract Ed25519 public key'],\n };\n }\n pubKeyBytes = spkiBytes.slice(spkiBytes.length - 32);\n } else {\n return {\n ok: false,\n code: CerVerifyCode.ATTESTATION_KEY_FORMAT_UNSUPPORTED,\n details: ['No usable key provided: supply jwk, rawB64Url, or spkiB64'],\n };\n }\n\n if (pubKeyBytes.length !== 32) {\n return {\n ok: false,\n code: CerVerifyCode.ATTESTATION_KEY_FORMAT_UNSUPPORTED,\n details: [`Ed25519 public key must be 32 bytes, got ${pubKeyBytes.length}`],\n };\n }\n\n const sigBytes = base64urlToBytes(signatureB64Url);\n\n if (sigBytes.length !== 64) {\n return {\n ok: false,\n code: CerVerifyCode.ATTESTATION_INVALID_SIGNATURE,\n details: [`Ed25519 signature must be 64 bytes, got ${sigBytes.length}`],\n };\n }\n\n const msgBytes = new TextEncoder().encode(toCanonicalJson(receipt));\n\n const isValid = await verify(sigBytes, msgBytes, pubKeyBytes);\n\n if (!isValid) {\n return {\n ok: false,\n code: CerVerifyCode.ATTESTATION_INVALID_SIGNATURE,\n details: ['Ed25519 signature verification failed'],\n };\n }\n\n return { ok: true, code: CerVerifyCode.OK };\n } catch (err) {\n return {\n ok: false,\n code: CerVerifyCode.ATTESTATION_INVALID_SIGNATURE,\n details: [err instanceof Error ? err.message : String(err)],\n };\n }\n}\n\nexport async function fetchNodeKeys(nodeUrl: string): Promise<NodeKeysDocument> {\n const url = `${nodeUrl.replace(/\\/+$/, '')}/.well-known/nexart-node.json`;\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch node keys from ${url}: HTTP ${response.status}`);\n }\n const data = await response.json() as unknown;\n if (typeof data !== 'object' || data === null) {\n throw new Error('Node keys response is not an object');\n }\n const doc = data as Record<string, unknown>;\n if (typeof doc.nodeId !== 'string' || !Array.isArray(doc.keys)) {\n throw new Error('Node keys document missing required fields (nodeId, keys)');\n }\n return data as NodeKeysDocument;\n}\n\ntype SelectKeySuccess = { key: NodeKeysDocument['keys'][number]; error?: never };\ntype SelectKeyFailure = { error: NodeReceiptVerifyResult; key?: never };\ntype SelectKeyResult = SelectKeySuccess | SelectKeyFailure;\n\nexport function selectNodeKey(doc: NodeKeysDocument, kid?: string): SelectKeyResult {\n if (kid) {\n const found = doc.keys.find((k) => k.kid === kid);\n if (!found) {\n return {\n error: {\n ok: false,\n code: CerVerifyCode.ATTESTATION_KEY_NOT_FOUND,\n details: [`Key with kid=\"${kid}\" not found in node keys document`],\n },\n };\n }\n return { key: found };\n }\n\n if (doc.activeKid) {\n const found = doc.keys.find((k) => k.kid === doc.activeKid);\n if (!found) {\n return {\n error: {\n ok: false,\n code: CerVerifyCode.ATTESTATION_KEY_NOT_FOUND,\n details: [`activeKid=\"${doc.activeKid}\" not found in keys array`],\n },\n };\n }\n return { key: found };\n }\n\n if (doc.keys.length === 0) {\n return {\n error: {\n ok: false,\n code: CerVerifyCode.ATTESTATION_KEY_NOT_FOUND,\n details: ['No keys available in node keys document'],\n },\n };\n }\n\n return { key: doc.keys[0] };\n}\n\nfunction extractReceiptAndSignature(bundle: unknown): {\n receipt: SignedAttestationReceipt;\n signatureB64Url: string;\n attestorKeyId?: string;\n} | null {\n if (typeof bundle !== 'object' || bundle === null) return null;\n const b = bundle as Record<string, unknown>;\n\n if (typeof b.receipt === 'object' && b.receipt !== null && typeof b.signature === 'string') {\n return {\n receipt: b.receipt as SignedAttestationReceipt,\n signatureB64Url: b.signature,\n attestorKeyId: typeof b.attestorKeyId === 'string' ? b.attestorKeyId : undefined,\n };\n }\n\n if (typeof b.meta === 'object' && b.meta !== null) {\n const meta = b.meta as Record<string, unknown>;\n if (typeof meta.attestation === 'object' && meta.attestation !== null) {\n const att = meta.attestation as Record<string, unknown>;\n if (typeof att.receipt === 'object' && att.receipt !== null && typeof att.signature === 'string') {\n return {\n receipt: att.receipt as SignedAttestationReceipt,\n signatureB64Url: att.signature,\n attestorKeyId: typeof att.attestorKeyId === 'string' ? att.attestorKeyId : undefined,\n };\n }\n }\n }\n\n return null;\n}\n\nexport async function verifyBundleAttestation(\n bundle: unknown,\n options: { nodeUrl: string; kid?: string },\n): Promise<NodeReceiptVerifyResult> {\n const extracted = extractReceiptAndSignature(bundle);\n\n if (!extracted) {\n return {\n ok: false,\n code: CerVerifyCode.ATTESTATION_MISSING,\n details: ['No signed receipt found in bundle (expected bundle.receipt + bundle.signature)'],\n };\n }\n\n const nodeId = extracted.receipt.nodeId;\n const resolvedKid = options.kid ?? extracted.attestorKeyId ?? extracted.receipt.attestorKeyId;\n\n function ctx(): string[] {\n const lines: string[] = [];\n if (nodeId) lines.push(`nodeId: ${nodeId}`);\n if (resolvedKid) lines.push(`kid: ${resolvedKid}`);\n return lines;\n }\n\n let keysDoc: NodeKeysDocument;\n try {\n keysDoc = await fetchNodeKeys(options.nodeUrl);\n } catch (err) {\n return {\n ok: false,\n code: CerVerifyCode.ATTESTATION_KEY_NOT_FOUND,\n details: [...ctx(), err instanceof Error ? err.message : String(err)],\n };\n }\n\n if (typeof (bundle as Record<string, unknown>).certificateHash === 'string') {\n const bundleCertHash = (bundle as Record<string, unknown>).certificateHash as string;\n if (extracted.receipt.certificateHash !== bundleCertHash) {\n return {\n ok: false,\n code: CerVerifyCode.CERTIFICATE_HASH_MISMATCH,\n details: [\n `Receipt certificateHash does not match bundle certificateHash`,\n `receipt.certificateHash: ${extracted.receipt.certificateHash}`,\n `bundle.certificateHash: ${bundleCertHash}`,\n ...ctx(),\n ],\n };\n }\n }\n\n const selected = selectNodeKey(keysDoc, resolvedKid);\n if (selected.error) {\n return {\n ...selected.error,\n details: [...ctx(), ...(selected.error.details ?? [])],\n };\n }\n const keyEntry = selected.key;\n\n const keyParam: Parameters<typeof verifyNodeReceiptSignature>[0]['key'] = {};\n if (keyEntry.publicKeyJwk) keyParam.jwk = keyEntry.publicKeyJwk;\n else if (keyEntry.publicKey) keyParam.rawB64Url = keyEntry.publicKey;\n else if (keyEntry.publicKeySpkiB64) keyParam.spkiB64 = keyEntry.publicKeySpkiB64;\n else {\n return {\n ok: false,\n code: CerVerifyCode.ATTESTATION_KEY_FORMAT_UNSUPPORTED,\n details: [\n `Key kid=\"${keyEntry.kid}\" has no usable public key field (publicKeyJwk, publicKey, or publicKeySpkiB64)`,\n ...ctx(),\n ],\n };\n }\n\n const sigResult = await verifyNodeReceiptSignature({\n receipt: extracted.receipt,\n signatureB64Url: extracted.signatureB64Url,\n key: keyParam,\n });\n\n const contextLines = ctx();\n if (contextLines.length === 0) return sigResult;\n\n return sigResult.ok\n ? { ok: true, code: CerVerifyCode.OK, details: contextLines }\n : { ...sigResult, details: [...contextLines, ...(sigResult.details ?? [])] };\n}\n","/**\n * @nexart/ai-execution — certifyDecisionFromProviderCall (v0.6.0)\n *\n * High-level one-function wrapper for common AI provider call patterns.\n * Extracts prompt / input / output / parameters from raw request+response\n * objects and produces a sealed CerAiExecutionBundle.\n *\n * Supported providers: openai, anthropic, mistral, gemini, bedrock, + generic.\n *\n * Returns { ok: true, bundle } on success.\n * Returns { ok: false, code: 'SCHEMA_ERROR', reason } when a required field\n * cannot be extracted — never silently guesses.\n */\n\nimport * as crypto from 'crypto';\nimport type { CerAiExecutionBundle, CerMeta } from './types.js';\nimport { CerVerifyCode } from './types.js';\nimport { createSnapshot } from './snapshot.js';\nimport { sealCer } from './cer.js';\nimport { extractFromProviderCall } from './providerExtract.js';\n\nexport interface ProviderCallParams {\n provider: string;\n model?: string;\n request: Record<string, unknown>;\n response: Record<string, unknown>;\n meta?: CerMeta;\n executionId?: string;\n timestamp?: string;\n /** CER creation timestamp. Defaults to current time if omitted. */\n createdAt?: string;\n appId?: string | null;\n workflowId?: string | null;\n conversationId?: string | null;\n}\n\nexport type ProviderCallResult =\n | { ok: true; bundle: CerAiExecutionBundle }\n | { ok: false; code: typeof CerVerifyCode.SCHEMA_ERROR; reason: string };\n\n/**\n * Certify an AI provider call from raw request + response objects.\n *\n * @example\n * ```typescript\n * const res = certifyDecisionFromProviderCall({\n * provider: 'openai',\n * request: { model: 'gpt-4o', messages: [...] },\n * response: { choices: [{ message: { content: 'Hello' } }] },\n * });\n * if (res.ok) console.log(res.bundle.certificateHash);\n * else console.error(res.reason);\n * ```\n */\nexport function certifyDecisionFromProviderCall(params: ProviderCallParams): ProviderCallResult {\n const extracted = extractFromProviderCall(\n params.provider,\n params.model,\n params.request,\n params.response,\n );\n\n if (!extracted.ok) {\n return { ok: false, code: CerVerifyCode.SCHEMA_ERROR, reason: extracted.reason };\n }\n\n const { model, modelVersion, prompt, input, output, parameters } = extracted.data;\n\n try {\n const snapshot = createSnapshot({\n executionId: params.executionId ?? crypto.randomUUID(),\n timestamp: params.timestamp,\n provider: params.provider,\n model,\n modelVersion,\n prompt,\n input,\n parameters,\n output,\n appId: params.appId ?? null,\n workflowId: params.workflowId ?? null,\n conversationId: params.conversationId ?? null,\n });\n\n const bundle = sealCer(snapshot, { meta: params.meta, createdAt: params.createdAt });\n return { ok: true, bundle };\n } catch (err) {\n return {\n ok: false,\n code: CerVerifyCode.SCHEMA_ERROR,\n reason: err instanceof Error ? err.message : String(err),\n };\n }\n}\n","/**\n * @nexart/ai-execution — Provider-Agnostic Extraction (v0.6.0)\n *\n * Best-effort extraction of prompt / input / output / parameters\n * from raw provider request + response objects.\n *\n * Supported shapes (in detection order):\n * OpenAI / Mistral — response.choices[n].message.content\n * Anthropic — response.content[n].text\n * Gemini — response.candidates[n].content.parts[n].text\n * Bedrock wrapper — request.modelId + body unwrap\n * Generic fallback — response.text | response.output | response.output_text\n *\n * Rules:\n * - Never silently guess; return SCHEMA_ERROR with a reason string when\n * a required field cannot be determined.\n * - Do NOT recompute existing hashes.\n * - All extraction is read-only.\n */\n\nimport type { AiExecutionParameters } from './types.js';\n\nexport interface ExtractedCall {\n model: string;\n prompt: string;\n input: string | Record<string, unknown>;\n output: string | Record<string, unknown>;\n parameters: AiExecutionParameters;\n modelVersion: string | null;\n}\n\nexport type ExtractResult =\n | { ok: true; data: ExtractedCall }\n | { ok: false; reason: string };\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Internal helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction str(v: unknown): string | null {\n return typeof v === 'string' && v.length > 0 ? v : null;\n}\n\nfunction num(v: unknown, fallback: number): number {\n return typeof v === 'number' && Number.isFinite(v) ? v : fallback;\n}\n\nfunction numOrNull(v: unknown): number | null {\n return typeof v === 'number' && Number.isFinite(v) ? v : null;\n}\n\n/** OpenAI / Mistral: response.choices[0].message.content */\nfunction extractChoicesOutput(response: Record<string, unknown>): string | null {\n const choices = response.choices;\n if (!Array.isArray(choices) || choices.length === 0) return null;\n const first = choices[0] as Record<string, unknown> | null;\n if (!first || typeof first !== 'object') return null;\n const msg = first.message as Record<string, unknown> | null;\n if (!msg || typeof msg !== 'object') return null;\n // content can be string or array of content parts\n if (typeof msg.content === 'string') return msg.content;\n if (Array.isArray(msg.content)) {\n const texts = (msg.content as unknown[])\n .filter((p): p is Record<string, unknown> => typeof p === 'object' && p !== null)\n .map((p) => str((p as Record<string, unknown>).text))\n .filter((t): t is string => t !== null);\n return texts.length > 0 ? texts.join('\\n') : null;\n }\n return null;\n}\n\n/** Anthropic: response.content[0].text */\nfunction extractAnthropicOutput(response: Record<string, unknown>): string | null {\n const content = response.content;\n if (!Array.isArray(content) || content.length === 0) return null;\n const first = content[0] as Record<string, unknown> | null;\n if (!first || typeof first !== 'object') return null;\n return str(first.text);\n}\n\n/** Gemini: response.candidates[0].content.parts[0].text */\nfunction extractGeminiOutput(response: Record<string, unknown>): string | null {\n const candidates = response.candidates;\n if (!Array.isArray(candidates) || candidates.length === 0) return null;\n const first = candidates[0] as Record<string, unknown> | null;\n if (!first || typeof first !== 'object') return null;\n const contentObj = first.content as Record<string, unknown> | null;\n if (!contentObj || typeof contentObj !== 'object') return null;\n const parts = contentObj.parts;\n if (!Array.isArray(parts) || parts.length === 0) return null;\n const part = parts[0] as Record<string, unknown> | null;\n if (!part || typeof part !== 'object') return null;\n return str(part.text);\n}\n\n/** Generic fallback: text | output | output_text | result */\nfunction extractGenericOutput(response: Record<string, unknown>): string | null {\n return (\n str(response.text) ??\n str(response.output_text) ??\n (typeof response.output === 'string' ? response.output : null) ??\n str(response.result) ??\n null\n );\n}\n\n/** Extract output text from any response shape */\nfunction extractOutput(response: Record<string, unknown>): string | null {\n return (\n extractChoicesOutput(response) ??\n extractAnthropicOutput(response) ??\n extractGeminiOutput(response) ??\n extractGenericOutput(response)\n );\n}\n\n/** Extract messages array as the canonical input representation */\nfunction extractInput(request: Record<string, unknown>): string | Record<string, unknown> | null {\n // messages array (OpenAI / Anthropic / Mistral) — wrapped to satisfy Record<string,unknown>\n if (Array.isArray(request.messages) && request.messages.length > 0) {\n return { messages: request.messages };\n }\n // Gemini: contents array — wrapped\n if (Array.isArray(request.contents) && request.contents.length > 0) {\n return { contents: request.contents };\n }\n // Direct prompt string\n if (typeof request.prompt === 'string') return request.prompt;\n // Direct input field\n if (typeof request.input === 'string') return request.input;\n if (typeof request.input === 'object' && request.input !== null) {\n return request.input as Record<string, unknown>;\n }\n return null;\n}\n\n/** Derive human-readable prompt string from input for snapshot.prompt */\nfunction derivePrompt(request: Record<string, unknown>): string | null {\n if (typeof request.prompt === 'string') return request.prompt;\n // Last user message from messages\n if (Array.isArray(request.messages)) {\n const msgs = request.messages as Array<Record<string, unknown>>;\n for (let i = msgs.length - 1; i >= 0; i--) {\n const msg = msgs[i];\n if (msg.role === 'user' || msg.role === 'human') {\n const content = msg.content;\n if (typeof content === 'string') return content;\n if (Array.isArray(content)) {\n const text = content\n .filter((p): p is Record<string, unknown> => typeof p === 'object' && p !== null)\n .map((p) => str(p.text))\n .filter((t): t is string => t !== null)\n .join('\\n');\n if (text) return text;\n }\n }\n }\n }\n // Gemini: last user content\n if (Array.isArray(request.contents)) {\n const contents = request.contents as Array<Record<string, unknown>>;\n for (let i = contents.length - 1; i >= 0; i--) {\n const c = contents[i];\n if (c.role === 'user') {\n const parts = c.parts;\n if (Array.isArray(parts)) {\n const text = (parts as Array<Record<string, unknown>>)\n .map((p) => str(p.text))\n .filter((t): t is string => t !== null)\n .join('\\n');\n if (text) return text;\n }\n }\n }\n }\n return null;\n}\n\n/** Extract AiExecutionParameters from a request object */\nfunction extractParams(request: Record<string, unknown>): AiExecutionParameters {\n // Handle Gemini generationConfig nesting\n const cfg =\n typeof request.generationConfig === 'object' && request.generationConfig !== null\n ? (request.generationConfig as Record<string, unknown>)\n : request;\n\n return {\n temperature: num(cfg.temperature, 1.0),\n maxTokens: num(cfg.max_tokens ?? cfg.maxTokens ?? cfg.maxOutputTokens ?? cfg.max_output_tokens, 1024),\n topP: numOrNull(cfg.top_p ?? cfg.topP),\n seed: numOrNull(cfg.seed),\n };\n}\n\n/** Extract model from request or response */\nfunction extractModel(\n providerHint: string,\n request: Record<string, unknown>,\n response: Record<string, unknown>,\n override?: string,\n): { model: string; modelVersion: string | null } | null {\n const raw =\n override ??\n str(request.model) ??\n str(request.modelId) ?? // Bedrock\n str(response.model) ??\n str(response.modelId) ??\n null;\n\n if (!raw) return null;\n\n // Attempt to split \"provider/model-version\" style strings\n const parts = raw.split('/');\n const modelName = parts[parts.length - 1];\n const modelVersion = str(response.model_version ?? response.modelVersion) ?? null;\n\n return { model: modelName, modelVersion };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Bedrock unwrap\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction tryUnwrapBedrock(\n request: Record<string, unknown>,\n): { req: Record<string, unknown>; modelId: string } | null {\n const modelId = str(request.modelId);\n if (!modelId) return null;\n\n // body may be a JSON string or an object\n let body: Record<string, unknown> = {};\n if (typeof request.body === 'string') {\n try { body = JSON.parse(request.body); } catch { body = {}; }\n } else if (typeof request.body === 'object' && request.body !== null) {\n body = request.body as Record<string, unknown>;\n }\n\n return { req: { ...body, modelId }, modelId };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Public extraction entry point\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function extractFromProviderCall(\n provider: string,\n modelOverride: string | undefined,\n rawRequest: Record<string, unknown>,\n rawResponse: Record<string, unknown>,\n): ExtractResult {\n // Bedrock: unwrap request body before extracting\n let request = rawRequest;\n if (provider === 'bedrock' || str(rawRequest.modelId)) {\n const unwrapped = tryUnwrapBedrock(rawRequest);\n if (unwrapped) request = unwrapped.req;\n }\n\n // Model\n const modelResult = extractModel(provider, request, rawResponse, modelOverride);\n if (!modelResult) {\n return {\n ok: false,\n reason:\n 'Could not determine model name. Provide it via the `model` field, ' +\n 'or ensure request.model / request.modelId is present.',\n };\n }\n\n // Input\n const input = extractInput(request);\n if (input === null) {\n return {\n ok: false,\n reason:\n 'Could not extract input. Expected request.messages (OpenAI/Anthropic/Mistral), ' +\n 'request.contents (Gemini), or request.prompt/request.input (generic).',\n };\n }\n\n // Prompt\n const prompt = derivePrompt(request) ?? (typeof input === 'string' ? input : '[structured input]');\n\n // Output\n const output = extractOutput(rawResponse);\n if (output === null) {\n return {\n ok: false,\n reason:\n 'Could not extract output text. Expected response.choices[0].message.content (OpenAI/Mistral), ' +\n 'response.content[0].text (Anthropic), response.candidates[0].content.parts[0].text (Gemini), ' +\n 'or response.text / response.output_text (generic).',\n };\n }\n\n // Parameters\n const parameters = extractParams(request);\n\n return {\n ok: true,\n data: {\n model: modelResult.model,\n modelVersion: modelResult.modelVersion,\n prompt,\n input,\n output,\n parameters,\n },\n };\n}\n","/**\n * @nexart/ai-execution — createClient factory (v0.6.0)\n *\n * Returns a configured client with opinionated defaults applied to every call.\n * Defaults NEVER affect bundle hashing — they are only injected into snapshot\n * fields (appId, workflowId) and attestation options (nodeUrl, apiKey).\n *\n * Usage:\n * const client = createClient({ appId: 'my-app', nodeUrl: 'https://...' });\n * const bundle = client.certifyDecision({ provider, model, ... });\n * const result = await client.verify(bundle);\n */\n\nimport type {\n CerAiExecutionBundle,\n CertifyDecisionParams,\n AttestOptions,\n AttestationReceipt,\n VerificationResult,\n NodeReceiptVerifyResult,\n CerMeta,\n} from './types.js';\nimport { certifyDecision } from './certify.js';\nimport { certifyAndAttestDecision } from './wrappers.js';\nimport { verifyCer } from './cer.js';\nimport { verifyBundleAttestation } from './nodeReceipt.js';\n\nexport interface ClientDefaults {\n appId?: string | null;\n workflowId?: string | null;\n nodeUrl?: string;\n apiKey?: string | (() => string | Promise<string>);\n tags?: string[];\n source?: string;\n}\n\nexport interface NexArtClient {\n certifyDecision(params: CertifyDecisionParams): CerAiExecutionBundle;\n certifyAndAttestDecision(\n params: CertifyDecisionParams,\n options?: Partial<AttestOptions>,\n ): Promise<{ bundle: CerAiExecutionBundle; receipt: AttestationReceipt }>;\n verify(bundle: CerAiExecutionBundle): VerificationResult;\n verifyBundleAttestation(\n bundle: unknown,\n options?: { nodeUrl?: string; kid?: string },\n ): Promise<NodeReceiptVerifyResult>;\n}\n\nasync function resolveApiKey(\n key: ClientDefaults['apiKey'],\n): Promise<string> {\n if (typeof key === 'function') return key();\n return key ?? '';\n}\n\nfunction mergeDefaultMeta(defaults: ClientDefaults, meta?: CerMeta): CerMeta | undefined {\n const base: CerMeta = {};\n if (defaults.tags && defaults.tags.length > 0) base.tags = defaults.tags;\n if (defaults.source) base.source = defaults.source;\n if (!meta && Object.keys(base).length === 0) return undefined;\n return { ...base, ...meta };\n}\n\n/**\n * Create a pre-configured client that applies defaults to every operation.\n *\n * @param defaults — Shared configuration applied to all client calls.\n */\nexport function createClient(defaults: ClientDefaults = {}): NexArtClient {\n return {\n certifyDecision(params: CertifyDecisionParams): CerAiExecutionBundle {\n return certifyDecision({\n appId: defaults.appId ?? null,\n workflowId: defaults.workflowId ?? null,\n ...params,\n meta: mergeDefaultMeta(defaults, params.meta),\n });\n },\n\n async certifyAndAttestDecision(\n params: CertifyDecisionParams,\n options?: Partial<AttestOptions>,\n ): Promise<{ bundle: CerAiExecutionBundle; receipt: AttestationReceipt }> {\n const nodeUrl = options?.nodeUrl ?? defaults.nodeUrl;\n if (!nodeUrl) {\n throw new Error('certifyAndAttestDecision requires nodeUrl (set in defaults or options)');\n }\n const apiKey = options?.apiKey ?? (await resolveApiKey(defaults.apiKey));\n\n const mergedParams: CertifyDecisionParams = {\n appId: defaults.appId ?? null,\n workflowId: defaults.workflowId ?? null,\n ...params,\n meta: mergeDefaultMeta(defaults, params.meta),\n };\n\n return certifyAndAttestDecision(mergedParams, {\n nodeUrl,\n apiKey,\n timeoutMs: options?.timeoutMs,\n });\n },\n\n verify(bundle: CerAiExecutionBundle): VerificationResult {\n return verifyCer(bundle);\n },\n\n async verifyBundleAttestation(\n bundle: unknown,\n options?: { nodeUrl?: string; kid?: string },\n ): Promise<NodeReceiptVerifyResult> {\n const nodeUrl = options?.nodeUrl ?? defaults.nodeUrl;\n if (!nodeUrl) {\n throw new Error('verifyBundleAttestation requires nodeUrl (set in defaults or options)');\n }\n return verifyBundleAttestation(bundle, { nodeUrl, kid: options?.kid });\n },\n };\n}\n","/**\n * @nexart/ai-execution — AIEF §9 verifier adapter (v0.7.0)\n *\n * Provides verifyAief() which wraps the existing verifyCer() and returns the\n * exact AIEF §9.1 output schema required for cross-vendor verifier interoperability.\n *\n * Existing verify() / verifyCer() output is unchanged — this is additive only.\n */\n\nimport type { CerAiExecutionBundle, AiefVerifyResult } from './types.js';\nimport { CerVerifyCode } from './types.js';\nimport { verifyCer } from './cer.js';\n\nconst AIEF_REASON_MAP: Readonly<Record<string, string>> = {\n [CerVerifyCode.OK]: 'ok',\n [CerVerifyCode.CERTIFICATE_HASH_MISMATCH]: 'integrityProofMismatch',\n [CerVerifyCode.SNAPSHOT_HASH_MISMATCH]: 'integrityProofMismatch',\n [CerVerifyCode.INPUT_HASH_MISMATCH]: 'integrityProofMismatch',\n [CerVerifyCode.OUTPUT_HASH_MISMATCH]: 'integrityProofMismatch',\n [CerVerifyCode.TOOL_OUTPUT_HASH_MISMATCH]: 'integrityProofMismatch',\n [CerVerifyCode.SCHEMA_ERROR]: 'unsupportedSchema',\n [CerVerifyCode.CANONICALIZATION_ERROR]: 'malformedArtifact',\n [CerVerifyCode.INVALID_SHA256_FORMAT]: 'malformedArtifact',\n [CerVerifyCode.UNKNOWN_ERROR]: 'malformedArtifact',\n [CerVerifyCode.INCOMPLETE_ARTIFACT]: 'incompleteArtifact',\n [CerVerifyCode.CHAIN_BREAK_DETECTED]: 'chainBreakDetected',\n [CerVerifyCode.VERIFICATION_MATERIAL_UNAVAILABLE]: 'verificationMaterialUnavailable',\n [CerVerifyCode.TOOL_EVIDENCE_MISSING]: 'incompleteArtifact',\n [CerVerifyCode.ATTESTATION_INVALID_SIGNATURE]: 'signatureInvalid',\n [CerVerifyCode.ATTESTATION_MISSING]: 'verificationMaterialUnavailable',\n [CerVerifyCode.ATTESTATION_KEY_NOT_FOUND]: 'verificationMaterialUnavailable',\n [CerVerifyCode.ATTESTATION_KEY_FORMAT_UNSUPPORTED]: 'verificationMaterialUnavailable',\n} as const;\n\nconst INTEGRITY_FAILURE_CODES = new Set<string>([\n CerVerifyCode.CERTIFICATE_HASH_MISMATCH,\n CerVerifyCode.SNAPSHOT_HASH_MISMATCH,\n CerVerifyCode.INPUT_HASH_MISMATCH,\n CerVerifyCode.OUTPUT_HASH_MISMATCH,\n CerVerifyCode.TOOL_OUTPUT_HASH_MISMATCH,\n]);\n\nconst SCHEMA_FAILURE_CODES = new Set<string>([\n CerVerifyCode.SCHEMA_ERROR,\n CerVerifyCode.CANONICALIZATION_ERROR,\n CerVerifyCode.INVALID_SHA256_FORMAT,\n CerVerifyCode.UNKNOWN_ERROR,\n CerVerifyCode.INCOMPLETE_ARTIFACT,\n]);\n\n/**\n * Map a NexArt CerVerifyCode to an AIEF §9.2 reason string.\n * Unknown codes fall back to \"malformedArtifact\".\n */\nexport function mapToAiefReason(code: string): string {\n return AIEF_REASON_MAP[code] ?? 'malformedArtifact';\n}\n\n/**\n * Verify a CER bundle and return the exact AIEF §9.1 output shape.\n *\n * This wraps verifyCer() — hashing logic is not duplicated.\n * The internal NexArt verify() output is unchanged; this is purely an adapter.\n *\n * Per AIEF §9.0 rule #7: if chain fields are absent, chainValid MUST be true.\n */\nexport function verifyAief(bundle: CerAiExecutionBundle): AiefVerifyResult {\n const inner = verifyCer(bundle);\n\n if (inner.ok) {\n return {\n result: 'PASS',\n reason: null,\n checks: {\n schemaSupported: true,\n integrityValid: true,\n protectedSetValid: true,\n chainValid: true,\n },\n };\n }\n\n const aiefReason = mapToAiefReason(inner.code);\n\n const isIntegrityFailure = INTEGRITY_FAILURE_CODES.has(inner.code);\n const isSchemaFailure = SCHEMA_FAILURE_CODES.has(inner.code);\n const isChainFailure = inner.code === CerVerifyCode.CHAIN_BREAK_DETECTED;\n\n const result: AiefVerifyResult = {\n result: 'FAIL',\n reason: aiefReason,\n checks: {\n schemaSupported: !isSchemaFailure,\n integrityValid: !isIntegrityFailure,\n protectedSetValid: !isIntegrityFailure,\n chainValid: !isChainFailure,\n },\n };\n\n if (inner.details && inner.details.length > 0) {\n result.notes = inner.details;\n } else if (inner.errors.length > 0) {\n result.notes = inner.errors;\n }\n\n return result;\n}\n","/**\n * @nexart/ai-execution — Level 4 tool/dependency evidence helpers (v0.7.0)\n *\n * Provides hashToolOutput() and makeToolEvent() for building AIEF-06 compliant\n * tool call evidence records to include in AiExecutionSnapshotV1.toolCalls.\n */\n\nimport { hashUtf8, hashCanonicalJson } from './hash.js';\nimport type { ToolEvent } from './types.js';\n\n/**\n * Hash a tool output value for use as `outputHash` in a ToolEvent.\n *\n * - string → SHA-256 of UTF-8 bytes\n * - anything else → SHA-256 of stable canonical JSON bytes\n *\n * Returns \"sha256:<64hex>\" format.\n */\nexport function hashToolOutput(value: unknown): string {\n if (typeof value === 'string') {\n return hashUtf8(value);\n }\n return hashCanonicalJson(value);\n}\n\nexport interface MakeToolEventParams {\n toolId: string;\n output: unknown;\n at?: string;\n input?: unknown;\n evidenceRef?: string;\n error?: string;\n}\n\n/**\n * Build a ToolEvent record for inclusion in snapshot.toolCalls.\n *\n * The outputHash is computed by hashToolOutput(output) so it is always consistent.\n * Optionally computes inputHash if `input` is provided.\n * If `at` is omitted, the current time is used.\n */\nexport function makeToolEvent(params: MakeToolEventParams): ToolEvent {\n const at = params.at ?? new Date().toISOString();\n const outputHash = hashToolOutput(params.output);\n\n const event: ToolEvent = {\n toolId: params.toolId,\n at,\n outputHash,\n };\n\n if (params.input !== undefined) {\n event.inputHash = hashToolOutput(params.input);\n }\n\n if (params.evidenceRef !== undefined) {\n event.evidenceRef = params.evidenceRef;\n }\n\n if (params.error !== undefined) {\n event.error = params.error;\n }\n\n return event;\n}\n","/**\n * @nexart/ai-execution — Level 4 chain integrity verification (v0.7.0)\n *\n * Provides verifyRunSummary() for validating multi-step RunBuilder outputs against\n * AIEF-07 requirements: detects insertion, deletion, and reordering of steps.\n */\n\nimport type { RunSummary, CerAiExecutionBundle, RunSummaryVerifyResult } from './types.js';\nimport { CerVerifyCode } from './types.js';\nimport { verifyCer } from './cer.js';\n\nexport interface VerifyRunSummaryOptions {\n /** Skip per-bundle certificateHash verification (use only if already verified separately). */\n skipBundleVerification?: boolean;\n}\n\n/**\n * Verify that a RunSummary and its corresponding step bundles form a valid,\n * unbroken cryptographic chain.\n *\n * Detects:\n * - Missing steps (INCOMPLETE_ARTIFACT)\n * - Extra steps (INCOMPLETE_ARTIFACT)\n * - Reordered steps (CHAIN_BREAK_DETECTED via stepIndex or prevStepHash mismatch)\n * - Inserted steps (CHAIN_BREAK_DETECTED)\n * - Deleted steps (CHAIN_BREAK_DETECTED)\n * - Summary finalStepHash mismatch (CHAIN_BREAK_DETECTED)\n *\n * @param summary RunSummary from RunBuilder.finalize()\n * @param bundles Step bundles in declared order (step 0 first)\n * @param opts Options for verification behaviour\n */\nexport function verifyRunSummary(\n summary: RunSummary,\n bundles: CerAiExecutionBundle[],\n opts?: VerifyRunSummaryOptions,\n): RunSummaryVerifyResult {\n if (bundles.length !== summary.stepCount) {\n return {\n ok: false,\n code: CerVerifyCode.INCOMPLETE_ARTIFACT,\n errors: [\n `Step count mismatch: summary declares ${summary.stepCount} step(s), received ${bundles.length}`,\n ],\n details: ['Possible step deletion or insertion'],\n };\n }\n\n if (bundles.length === 0) {\n return { ok: true, code: CerVerifyCode.OK, errors: [] };\n }\n\n let prevHash: string | null = null;\n\n for (let i = 0; i < bundles.length; i++) {\n const bundle = bundles[i];\n const summaryStep = summary.steps[i];\n\n if (!summaryStep) {\n return {\n ok: false,\n code: CerVerifyCode.INCOMPLETE_ARTIFACT,\n errors: [`Missing summary entry for step index ${i}`],\n breakAt: i,\n };\n }\n\n if (!opts?.skipBundleVerification) {\n const bundleResult = verifyCer(bundle);\n if (!bundleResult.ok) {\n return {\n ok: false,\n code: bundleResult.code,\n errors: [`Step ${i}: individual bundle verification failed: ${bundleResult.errors.join('; ')}`],\n details: bundleResult.details,\n breakAt: i,\n };\n }\n }\n\n const stepIndex = bundle.snapshot?.stepIndex;\n if (stepIndex !== i) {\n return {\n ok: false,\n code: CerVerifyCode.CHAIN_BREAK_DETECTED,\n errors: [`Step ${i}: expected stepIndex ${i}, got ${String(stepIndex)}`],\n details: ['stepIndex mismatch indicates insertion or reordering'],\n breakAt: i,\n };\n }\n\n const snapshotPrevHash = bundle.snapshot?.prevStepHash ?? null;\n\n if (i === 0) {\n if (snapshotPrevHash !== null) {\n return {\n ok: false,\n code: CerVerifyCode.CHAIN_BREAK_DETECTED,\n errors: [`Step 0: expected prevStepHash null, got \"${snapshotPrevHash}\"`],\n details: ['First step must have prevStepHash null'],\n breakAt: 0,\n expectedPrev: 'null',\n observedPrev: snapshotPrevHash,\n };\n }\n } else {\n if (snapshotPrevHash !== prevHash) {\n return {\n ok: false,\n code: CerVerifyCode.CHAIN_BREAK_DETECTED,\n errors: [`Step ${i}: prevStepHash mismatch — chain break detected`],\n details: [\n `Expected prevStepHash \"${prevHash ?? 'null'}\", got \"${snapshotPrevHash ?? 'null'}\"`,\n ],\n breakAt: i,\n expectedPrev: prevHash ?? undefined,\n observedPrev: snapshotPrevHash ?? undefined,\n };\n }\n }\n\n if (bundle.certificateHash !== summaryStep.certificateHash) {\n return {\n ok: false,\n code: CerVerifyCode.CHAIN_BREAK_DETECTED,\n errors: [`Step ${i}: certificateHash does not match summary record`],\n details: [\n `Summary has \"${summaryStep.certificateHash}\", bundle has \"${bundle.certificateHash}\"`,\n ],\n breakAt: i,\n };\n }\n\n prevHash = bundle.certificateHash;\n }\n\n const lastBundle = bundles[bundles.length - 1];\n if (summary.finalStepHash !== lastBundle.certificateHash) {\n return {\n ok: false,\n code: CerVerifyCode.CHAIN_BREAK_DETECTED,\n errors: ['summary.finalStepHash does not match last step certificateHash'],\n details: [\n `Expected \"${summary.finalStepHash ?? 'null'}\", got \"${lastBundle.certificateHash}\"`,\n ],\n breakAt: bundles.length - 1,\n expectedPrev: summary.finalStepHash ?? undefined,\n observedPrev: lastBundle.certificateHash,\n };\n }\n\n return { ok: true, code: CerVerifyCode.OK, errors: [] };\n}\n","/**\n * @nexart/ai-execution — Pre-seal redaction helpers (v0.7.0)\n *\n * redactBeforeSeal() replaces sensitive snapshot fields with stable redaction\n * envelopes { _redacted: true, hash: \"sha256:...\" } BEFORE the snapshot is\n * sealed with sealCer(). The resulting bundle will verify correctly because\n * the certificateHash was computed over the already-redacted snapshot.\n *\n * For `input` and `output` fields, the corresponding `inputHash`/`outputHash`\n * are recomputed to reflect the envelope (the original value's hash is\n * preserved inside the envelope itself).\n *\n * IMPORTANT: Post-hoc redaction via sanitizeForStorage() breaks certificateHash\n * by design. Only pre-seal redaction produces verifiable bundles.\n */\n\nimport type { AiExecutionSnapshotV1, RedactionEnvelope } from './types.js';\nimport { hashUtf8, hashCanonicalJson, computeInputHash, computeOutputHash } from './hash.js';\n\nexport interface RedactBeforeSealPolicy {\n /** Dot-separated field paths to redact, e.g. [\"input\", \"prompt\"]. */\n paths: string[];\n}\n\nfunction hashValue(value: unknown): string {\n if (typeof value === 'string') return hashUtf8(value);\n return hashCanonicalJson(value);\n}\n\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n const parts = path.split('.');\n let cursor: unknown = obj;\n for (const part of parts) {\n if (typeof cursor !== 'object' || cursor === null) return undefined;\n cursor = (cursor as Record<string, unknown>)[part];\n }\n return cursor;\n}\n\nfunction setNestedPath(\n obj: Record<string, unknown>,\n path: string,\n value: unknown,\n): Record<string, unknown> {\n const parts = path.split('.');\n const clone = { ...obj };\n let cursor: Record<string, unknown> = clone;\n\n for (let i = 0; i < parts.length - 1; i++) {\n const key = parts[i];\n const child = cursor[key];\n if (typeof child !== 'object' || child === null) return clone;\n cursor[key] = { ...(child as Record<string, unknown>) };\n cursor = cursor[key] as Record<string, unknown>;\n }\n\n const last = parts[parts.length - 1];\n if (last in cursor) {\n cursor[last] = value;\n }\n return clone;\n}\n\n/**\n * Replace sensitive snapshot fields with stable redaction envelopes before sealing.\n *\n * - For `input`: replaces with envelope and recomputes inputHash from envelope\n * - For `output`: replaces with envelope and recomputes outputHash from envelope\n * - For other paths: replaces with envelope (nested paths supported via dot notation)\n *\n * The original value's hash is preserved inside the envelope at `envelope.hash`,\n * providing a trail for authorized reviewers while keeping the raw value private.\n *\n * @example\n * ```typescript\n * const redactedSnap = redactBeforeSeal(snapshot, { paths: ['input', 'prompt'] });\n * const bundle = sealCer(redactedSnap);\n * // verifyCer(bundle) → { ok: true }\n * ```\n */\nexport function redactBeforeSeal(\n snapshot: AiExecutionSnapshotV1,\n policy: RedactBeforeSealPolicy,\n): AiExecutionSnapshotV1 {\n let result = { ...snapshot } as unknown as Record<string, unknown>;\n\n for (const path of policy.paths) {\n const original = getNestedValue(result, path);\n if (original === undefined) continue;\n\n const envelope: RedactionEnvelope = {\n _redacted: true,\n hash: hashValue(original),\n };\n\n result = setNestedPath(result, path, envelope);\n\n if (path === 'input') {\n result['inputHash'] = computeInputHash(envelope as unknown as Record<string, unknown>);\n } else if (path === 'output') {\n result['outputHash'] = computeOutputHash(envelope as unknown as Record<string, unknown>);\n }\n }\n\n return result as unknown as AiExecutionSnapshotV1;\n}\n","/**\n * @nexart/ai-execution — AIEF profile validation (v0.7.0)\n *\n * Profiles add opt-in strictness at creation time — they enforce field\n * presence and structure only. They NEVER change certificateHash computation.\n *\n * Available profiles:\n * \"flexible\" — No extra validation (default SDK behaviour)\n * \"AIEF_L2\" — Validates AIEF-01 required fields are present\n * \"AIEF_L3\" — Same as AIEF_L2 (portability is structural, not field-level)\n * \"AIEF_L4\" — AIEF_L3 + validates toolCalls fields, prevStepHash for step > 0\n */\n\nimport type { AiExecutionSnapshotV1, CerAiExecutionBundle, AiefProfile, ToolEvent } from './types.js';\n\nexport interface ProfileValidationResult {\n ok: boolean;\n errors: string[];\n}\n\nconst SHA256_PATTERN = /^sha256:[0-9a-f]{64}$/;\n\nfunction validateToolEvent(event: ToolEvent, index: number): string[] {\n const errs: string[] = [];\n if (!event.toolId || typeof event.toolId !== 'string') {\n errs.push(`toolCalls[${index}].toolId must be a non-empty string`);\n }\n if (!event.at || typeof event.at !== 'string') {\n errs.push(`toolCalls[${index}].at must be a non-empty ISO 8601 string`);\n }\n if (!event.outputHash || !SHA256_PATTERN.test(event.outputHash)) {\n errs.push(`toolCalls[${index}].outputHash must be in sha256:<64hex> format, got \"${event.outputHash ?? ''}\"`);\n }\n if (event.inputHash !== undefined && !SHA256_PATTERN.test(event.inputHash)) {\n errs.push(`toolCalls[${index}].inputHash must be in sha256:<64hex> format when present`);\n }\n return errs;\n}\n\nfunction validateL2(snapshot: AiExecutionSnapshotV1, label: string): string[] {\n const errs: string[] = [];\n if (!snapshot.executionId) errs.push(`executionId is required for ${label}`);\n if (!snapshot.timestamp) errs.push(`timestamp is required for ${label}`);\n if (!snapshot.provider) errs.push(`provider is required for ${label}`);\n if (!snapshot.model) errs.push(`model is required for ${label}`);\n if (snapshot.input === undefined || snapshot.input === null) errs.push(`input is required for ${label}`);\n if (snapshot.output === undefined || snapshot.output === null) errs.push(`output is required for ${label}`);\n if (!snapshot.inputHash) errs.push(`inputHash is required for ${label}`);\n if (!snapshot.outputHash) errs.push(`outputHash is required for ${label}`);\n return errs;\n}\n\nfunction resolveSnapshot(target: AiExecutionSnapshotV1 | CerAiExecutionBundle): AiExecutionSnapshotV1 {\n if ('snapshot' in target && (target as CerAiExecutionBundle).snapshot) {\n return (target as CerAiExecutionBundle).snapshot;\n }\n return target as AiExecutionSnapshotV1;\n}\n\n/**\n * Validate a snapshot or bundle against the given AIEF profile.\n *\n * Returns { ok: true, errors: [] } for \"flexible\".\n * Does NOT throw — errors are returned in the result.\n * Does NOT affect hashing or sealing.\n */\nexport function validateProfile(\n target: AiExecutionSnapshotV1 | CerAiExecutionBundle,\n profile: AiefProfile,\n): ProfileValidationResult {\n if (profile === 'flexible') {\n return { ok: true, errors: [] };\n }\n\n const snapshot = resolveSnapshot(target);\n const errors: string[] = [];\n\n if (profile === 'AIEF_L2' || profile === 'AIEF_L3' || profile === 'AIEF_L4') {\n errors.push(...validateL2(snapshot, profile));\n }\n\n if (profile === 'AIEF_L4') {\n if (snapshot.toolCalls && snapshot.toolCalls.length > 0) {\n for (let i = 0; i < snapshot.toolCalls.length; i++) {\n errors.push(...validateToolEvent(snapshot.toolCalls[i], i));\n }\n }\n if (\n snapshot.stepIndex !== null &&\n snapshot.stepIndex !== undefined &&\n snapshot.stepIndex > 0 &&\n !snapshot.prevStepHash\n ) {\n errors.push('prevStepHash is required when stepIndex > 0 in AIEF_L4 profile');\n }\n }\n\n return { ok: errors.length === 0, errors };\n}\n","/**\n * @nexart/ai-execution — Verifiable redacted export helper\n *\n * exportVerifiableRedacted() produces a NEW sealed bundle whose snapshot has\n * sensitive fields replaced with redaction envelopes via redactBeforeSeal().\n *\n * The result is a fully independently verifiable bundle with a NEW certificateHash.\n * The original certificateHash is preserved in meta.provenance as an informational\n * cross-reference ONLY — it does not establish any cryptographic relationship\n * between the two bundles.\n *\n * verify(newBundle) → { ok: true } ✅ the new bundle verifies on its own\n * verify(originalBundle) → { ok: true } ✅ the original is unaffected\n *\n * IMPORTANT CONSTRAINTS:\n * - Only `input` and `output` paths are safe to redact (their content hashes are\n * recomputed from the envelope). Schema-validated string fields like `prompt`\n * cannot be replaced with an object envelope — verify() will return SCHEMA_ERROR.\n * - `meta.provenance.originalCertificateHash` is reference metadata only.\n * Anyone who receives only the new bundle cannot verify the original's integrity.\n */\n\nimport type { CerAiExecutionBundle, CerMeta } from './types.js';\nimport { sealCer } from './cer.js';\nimport { redactBeforeSeal } from './redact.js';\nimport type { RedactBeforeSealPolicy } from './redact.js';\n\nexport type { RedactBeforeSealPolicy };\n\nexport interface ExportVerifiableRedactedOptions {\n createdAt?: string;\n}\n\nexport interface ExportVerifiableRedactedProvenance {\n originalCertificateHash: string;\n redactionPolicy: { paths: string[] };\n redactedAt: string;\n}\n\nexport interface ExportVerifiableRedactedResult {\n bundle: CerAiExecutionBundle;\n /**\n * The original bundle's certificateHash. Convenience alias for\n * `bundle.meta.provenance.originalCertificateHash`.\n * Reference only — no cryptographic link to the new bundle.\n */\n originalCertificateHash: string;\n}\n\n/**\n * Produce a new sealed bundle with redacted snapshot fields.\n *\n * @param bundle The original sealed bundle to redact from.\n * @param policy Which snapshot paths to redact. Only 'input' and 'output'\n * are safe for verifiable redaction (their content hashes are\n * recomputed). Other schema-validated string fields will cause\n * verify() to return SCHEMA_ERROR on the new bundle.\n * @param options Optional overrides (createdAt).\n *\n * @example\n * ```typescript\n * import { certifyDecision, verify, exportVerifiableRedacted } from '@nexart/ai-execution';\n *\n * const original = certifyDecision({ ... });\n * const { bundle, originalCertificateHash } = exportVerifiableRedacted(\n * original,\n * { paths: ['input', 'output'] },\n * );\n *\n * verify(bundle).ok; // true\n * bundle.meta.provenance.originalCertificateHash; // 'sha256:...' — reference only\n * bundle.snapshot.input; // { _redacted: true, hash: 'sha256:...' }\n * ```\n */\nexport function exportVerifiableRedacted(\n bundle: CerAiExecutionBundle,\n policy: RedactBeforeSealPolicy,\n options?: ExportVerifiableRedactedOptions,\n): ExportVerifiableRedactedResult {\n const createdAt = options?.createdAt ?? new Date().toISOString();\n\n const redactedSnapshot = redactBeforeSeal(bundle.snapshot, policy);\n\n const provenance: ExportVerifiableRedactedProvenance = {\n originalCertificateHash: bundle.certificateHash,\n redactionPolicy: { paths: [...policy.paths] },\n redactedAt: createdAt,\n };\n\n const mergedMeta: CerMeta = {\n ...bundle.meta,\n provenance,\n };\n\n const newBundle = sealCer(redactedSnapshot, {\n createdAt,\n meta: mergedMeta,\n declaration: bundle.declaration,\n });\n\n return {\n bundle: newBundle,\n originalCertificateHash: bundle.certificateHash,\n };\n}\n","/**\n * @nexart/ai-execution — Opinionated run helper\n *\n * certifyAndAttestRun(): certify every step in a multi-step run via RunBuilder,\n * optionally attest each sealed bundle, and return a consolidated result.\n *\n * Design principles:\n * - Does NOT mutate or wrap any externally-owned RunBuilder. Creates its own.\n * - RunBuilder semantics are unchanged: prevStepHash chaining is automatic.\n * - attestStep is optional and injectable so callers can mock in tests without\n * hitting the network.\n * - Network failures from attestStep bubble up — wrap in try/catch for partial\n * failure tolerance.\n */\n\nimport type {\n StepParams,\n RunSummary,\n CerAiExecutionBundle,\n AttestationReceipt,\n} from './types.js';\nimport { RunBuilder } from './run.js';\n\nexport interface CertifyAndAttestRunOptions {\n runId?: string;\n workflowId?: string | null;\n conversationId?: string | null;\n appId?: string | null;\n /**\n * Optional per-step attestation function. Receives each sealed step bundle\n * immediately after it is created. Return an AttestationReceipt on success.\n *\n * If omitted, all receipts will be null (bundles are sealed but not attested).\n *\n * @example\n * ```typescript\n * import { attest } from '@nexart/ai-execution';\n * certifyAndAttestRun(steps, {\n * attestStep: (bundle) => attest(bundle, { nodeUrl, apiKey }),\n * });\n * ```\n */\n attestStep?: (bundle: CerAiExecutionBundle) => Promise<AttestationReceipt>;\n}\n\nexport interface CertifyAndAttestRunResult {\n runSummary: RunSummary;\n stepBundles: CerAiExecutionBundle[];\n /**\n * Attestation receipts in step order. `null` at index i means the step\n * was sealed but not attested (no `attestStep` option was provided).\n */\n receipts: (AttestationReceipt | null)[];\n /** Alias for runSummary.finalStepHash — the last step's certificateHash. */\n finalStepHash: string | null;\n}\n\n/**\n * Certify every step in a multi-step run and optionally attest each bundle.\n *\n * Each step is sealed via RunBuilder, which automatically:\n * - assigns stepIndex (0-based)\n * - sets prevStepHash to the previous step's certificateHash\n * - assigns a unique executionId and stepId per step\n *\n * The resulting runSummary + stepBundles can be validated offline with\n * verifyRunSummary(runSummary, stepBundles).\n *\n * @param steps Ordered list of step parameters (step 0 first).\n * @param options Run-level options and optional attestation hook.\n *\n * @example\n * ```typescript\n * import { certifyAndAttestRun, verifyRunSummary } from '@nexart/ai-execution';\n *\n * const { runSummary, stepBundles, receipts, finalStepHash } =\n * await certifyAndAttestRun(\n * [step0Params, step1Params, step2Params],\n * {\n * runId: 'analysis-run',\n * workflowId: 'data-pipeline',\n * attestStep: (bundle) => attest(bundle, { nodeUrl, apiKey }),\n * },\n * );\n *\n * verifyRunSummary(runSummary, stepBundles); // { ok: true }\n * ```\n */\nexport async function certifyAndAttestRun(\n steps: StepParams[],\n options?: CertifyAndAttestRunOptions,\n): Promise<CertifyAndAttestRunResult> {\n const run = new RunBuilder({\n runId: options?.runId,\n workflowId: options?.workflowId,\n conversationId: options?.conversationId,\n appId: options?.appId,\n });\n\n const stepBundles: CerAiExecutionBundle[] = [];\n const receipts: (AttestationReceipt | null)[] = [];\n\n for (const stepParams of steps) {\n const bundle = run.step(stepParams);\n stepBundles.push(bundle);\n\n if (options?.attestStep) {\n const receipt = await options.attestStep(bundle);\n receipts.push(receipt);\n } else {\n receipts.push(null);\n }\n }\n\n const runSummary = run.finalize();\n\n return {\n runSummary,\n stepBundles,\n receipts,\n finalStepHash: runSummary.finalStepHash,\n };\n}\n","/**\n * CER Protocol verification types — v0.9.0\n *\n * These are the canonical structured verification types for the NexArt\n * Certified Execution Record (CER) Protocol. All NexArt-compatible verifiers\n * should produce a CerVerificationResult.\n *\n * NOTE: The existing VerificationResult type (ok/errors/code shape) is preserved\n * for backward compatibility. CerVerificationResult is the new protocol-aligned type.\n */\n\nexport type VerificationStatus = 'VERIFIED' | 'FAILED' | 'NOT_FOUND';\nexport type CheckStatus = 'PASS' | 'FAIL' | 'SKIPPED';\n\nexport const ReasonCode = {\n BUNDLE_HASH_MISMATCH: 'BUNDLE_HASH_MISMATCH',\n NODE_SIGNATURE_INVALID: 'NODE_SIGNATURE_INVALID',\n NODE_SIGNATURE_MISSING: 'NODE_SIGNATURE_MISSING',\n RECEIPT_HASH_MISMATCH: 'RECEIPT_HASH_MISMATCH',\n SCHEMA_VERSION_UNSUPPORTED: 'SCHEMA_VERSION_UNSUPPORTED',\n RECORD_NOT_FOUND: 'RECORD_NOT_FOUND',\n BUNDLE_CORRUPTED: 'BUNDLE_CORRUPTED',\n} as const;\n\nexport type ReasonCode = typeof ReasonCode[keyof typeof ReasonCode];\n\n/**\n * Canonical protocol verification result.\n *\n * Produced by verifyAiCerBundleDetailed() and verifyCodeModeSnapshotDetailed().\n * All checks that are not applicable to a given bundle type are SKIPPED (never FAIL).\n */\nexport interface CerVerificationResult {\n status: VerificationStatus;\n checks: {\n bundleIntegrity: CheckStatus;\n nodeSignature: CheckStatus;\n receiptConsistency: CheckStatus;\n };\n reasonCodes: ReasonCode[];\n certificateHash: string;\n bundleType: string;\n verifiedAt: string;\n verifier: string;\n}\n","/**\n * verifyAiCerBundleDetailed — protocol-aligned AI CER verifier\n *\n * Returns a CerVerificationResult conforming to the CER Protocol spec.\n * Wraps the existing verifyCer() + hasAttestation() helpers and maps\n * their results into the structured protocol schema.\n */\n\nimport type { CerAiExecutionBundle } from './types.js';\nimport { CerVerifyCode } from './types.js';\nimport { verifyCer } from './cer.js';\nimport { hasAttestation } from './sanitize.js';\nimport {\n ReasonCode as ReasonCodes,\n type CerVerificationResult,\n type CheckStatus,\n type ReasonCode,\n} from './cerProtocol.js';\n\nfunction mapCerCodeToReasonCodes(cerCode: string): ReasonCode[] {\n switch (cerCode) {\n case CerVerifyCode.CERTIFICATE_HASH_MISMATCH:\n case CerVerifyCode.SNAPSHOT_HASH_MISMATCH:\n case CerVerifyCode.INPUT_HASH_MISMATCH:\n case CerVerifyCode.OUTPUT_HASH_MISMATCH:\n return [ReasonCodes.BUNDLE_HASH_MISMATCH];\n case CerVerifyCode.SCHEMA_ERROR:\n return [ReasonCodes.SCHEMA_VERSION_UNSUPPORTED];\n case CerVerifyCode.CANONICALIZATION_ERROR:\n case CerVerifyCode.UNKNOWN_ERROR:\n case CerVerifyCode.INVALID_SHA256_FORMAT:\n return [ReasonCodes.BUNDLE_CORRUPTED];\n case CerVerifyCode.ATTESTATION_INVALID_SIGNATURE:\n case CerVerifyCode.ATTESTATION_KEY_FORMAT_UNSUPPORTED:\n case CerVerifyCode.ATTESTATION_KEY_NOT_FOUND:\n return [ReasonCodes.NODE_SIGNATURE_INVALID];\n case CerVerifyCode.ATTESTATION_MISSING:\n return [ReasonCodes.NODE_SIGNATURE_MISSING];\n default:\n return [];\n }\n}\n\n/**\n * Verify a CER AI execution bundle and return a structured CerVerificationResult.\n *\n * - bundleIntegrity: PASS/FAIL based on certificateHash integrity\n * - nodeSignature: PASS if attestation present and structurally valid; SKIPPED if absent\n * - receiptConsistency: mirrors nodeSignature (SKIPPED when no attestation)\n *\n * Attestation is optional — its absence sets nodeSignature/receiptConsistency\n * to SKIPPED, not FAIL.\n *\n * @param bundle - The raw CER bundle (typed as unknown for safety; validated internally)\n */\nexport function verifyAiCerBundleDetailed(bundle: unknown): CerVerificationResult {\n const verifiedAt = new Date().toISOString();\n const verifier = '@nexart/ai-execution';\n\n if (!bundle || typeof bundle !== 'object' || Array.isArray(bundle)) {\n return {\n status: 'FAILED',\n checks: { bundleIntegrity: 'FAIL', nodeSignature: 'SKIPPED', receiptConsistency: 'SKIPPED' },\n reasonCodes: [ReasonCodes.BUNDLE_CORRUPTED],\n certificateHash: '',\n bundleType: '',\n verifiedAt,\n verifier,\n };\n }\n\n const b = bundle as Record<string, unknown>;\n const bundleType = typeof b['bundleType'] === 'string' ? b['bundleType'] : '';\n const certificateHash = typeof b['certificateHash'] === 'string' ? b['certificateHash'] : '';\n\n if (bundleType !== 'cer.ai.execution.v1') {\n return {\n status: 'FAILED',\n checks: { bundleIntegrity: 'FAIL', nodeSignature: 'SKIPPED', receiptConsistency: 'SKIPPED' },\n reasonCodes: [ReasonCodes.SCHEMA_VERSION_UNSUPPORTED],\n certificateHash,\n bundleType,\n verifiedAt,\n verifier,\n };\n }\n\n const cerResult = verifyCer(bundle as CerAiExecutionBundle);\n\n const bundleIntegrity: CheckStatus = cerResult.ok ? 'PASS' : 'FAIL';\n\n const attestationPresent = hasAttestation(bundle as CerAiExecutionBundle);\n const nodeSignature: CheckStatus = attestationPresent ? 'PASS' : 'SKIPPED';\n const receiptConsistency: CheckStatus = attestationPresent ? 'PASS' : 'SKIPPED';\n\n const reasonCodes: ReasonCode[] = cerResult.ok ? [] : mapCerCodeToReasonCodes(cerResult.code);\n\n return {\n status: cerResult.ok ? 'VERIFIED' : 'FAILED',\n checks: { bundleIntegrity, nodeSignature, receiptConsistency },\n reasonCodes,\n certificateHash,\n bundleType,\n verifiedAt,\n verifier,\n };\n}\n","/**\n * @nexart/ai-execution — LangChain Integration\n *\n * Provides a minimal helper surface for certifying the final input and\n * final output of a LangChain run as a Certified Execution Record (CER).\n *\n * Two helpers:\n *\n * createLangChainCer(input)\n * Always synchronous. Local CER creation only — no network required.\n * Returns LangChainCerResult.\n *\n * certifyLangChainRun(input)\n * • Without nodeUrl/apiKey → identical to createLangChainCer (sync).\n * • With nodeUrl + apiKey → sends the sealed bundle to a NexArt node\n * for attestation via the existing certifyAndAttestDecision() path.\n * Returns Promise<LangChainAttestedResult>.\n *\n * Both helpers produce bundles that are fully protocol-aligned and pass\n * verifyCer() / verifyAiCerBundleDetailed(). No LangChain-specific schema.\n */\n\nimport * as crypto from 'crypto';\nimport type {\n CerAiExecutionBundle,\n AiExecutionParameters,\n AttestOptions,\n AttestationReceipt,\n CertifyDecisionParams,\n} from './types.js';\nimport { certifyDecision } from './certify.js';\nimport { certifyAndAttestDecision } from './wrappers.js';\n\n// ─── Injectable attest type (for testing) ────────────────────────────────────\n\n/**\n * Injectable attestation function type.\n * Defaults to the real certifyAndAttestDecision(); override in tests to avoid\n * hitting the network. Follows the same injectable pattern as\n * certifyAndAttestRun()'s attestStep option.\n *\n * @internal\n */\nexport type AttestDecisionFn = (\n params: CertifyDecisionParams,\n options: AttestOptions,\n) => Promise<{ bundle: CerAiExecutionBundle; receipt: AttestationReceipt }>;\n\n// ─── Public types ─────────────────────────────────────────────────────────────\n\n/**\n * Normalized input for LangChain CER helpers.\n *\n * Accepts the practical final-run shape produced by LangChain chains,\n * agents, and runnables without requiring any LangChain import.\n */\nexport interface LangChainCertificationInput {\n /** Optional run ID — a UUID is generated if omitted. */\n executionId?: string;\n /** AI provider name (e.g. \"openai\", \"anthropic\", \"google\"). */\n provider: string;\n /** Model name (e.g. \"gpt-4o-mini\", \"claude-3-haiku-20240307\"). */\n model: string;\n /** Model version string — null if unknown. */\n modelVersion?: string | null;\n /**\n * Final run input. Accepts any shape produced by LangChain:\n * { messages: [...] }, a plain string, HumanMessage array, etc.\n * Arrays are wrapped as { items: [...] }.\n */\n input: unknown;\n /**\n * Final run output. Accepts any shape produced by LangChain:\n * AIMessage, { text: \"...\" }, a plain string, etc.\n * Arrays are wrapped as { items: [...] }.\n */\n output: unknown;\n /**\n * Optional metadata from the LangChain run. Recognized keys:\n * - prompt?: string — used as the CER prompt field\n * - appId?: string — included in the CER snapshot\n * - runId?: string\n * - workflowId?: string\n * - conversationId?: string\n * All other keys are preserved in the CER bundle's meta.tags.\n */\n metadata?: Record<string, unknown>;\n /**\n * Optional override for the AI inference timestamp.\n * Defaults to current time if omitted.\n */\n timestamp?: string;\n /**\n * Optional override for the CER bundle creation timestamp.\n * Pin this to a fixed value to get a deterministic certificateHash.\n * Defaults to current time if omitted.\n */\n createdAt?: string;\n /**\n * Optional model inference parameters.\n * Fields not provided default to 0 / null (protocol-safe).\n * These values are included in the certificateHash.\n */\n parameters?: {\n temperature?: number;\n maxTokens?: number;\n topP?: number | null;\n seed?: number | null;\n };\n /**\n * NexArt node URL for attestation (e.g. \"https://node.nexart.io\").\n * When set together with apiKey, certifyLangChainRun() will call the\n * node to produce an AttestationReceipt alongside the local CER.\n * Has no effect on createLangChainCer().\n */\n nodeUrl?: string;\n /**\n * NexArt API key for node attestation.\n * Required when nodeUrl is set.\n */\n apiKey?: string;\n}\n\n/** Result returned by createLangChainCer() and certifyLangChainRun() in local mode. */\nexport interface LangChainCerResult {\n /** The sealed CER bundle. Pass to verifyCer() to verify integrity. */\n bundle: CerAiExecutionBundle;\n /** SHA-256 certificate hash — the tamper-evident fingerprint of this record. */\n certificateHash: string;\n /** The executionId embedded in the CER snapshot. */\n executionId: string;\n}\n\n/**\n * Result returned by certifyLangChainRun() when nodeUrl + apiKey are provided.\n * Extends LangChainCerResult with the receipt from the attestation node.\n */\nexport interface LangChainAttestedResult extends LangChainCerResult {\n /** The attestation receipt from the NexArt node. */\n receipt: AttestationReceipt;\n /** Always true — distinguishes an attested result from a local result. */\n attested: true;\n}\n\n// ─── Internal normalization ───────────────────────────────────────────────────\n\nfunction normalizeCerValue(value: unknown): string | Record<string, unknown> {\n if (typeof value === 'string') return value;\n if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n if (Array.isArray(value)) return { items: value };\n return String(value);\n}\n\nfunction extractPrompt(input: unknown, metadata?: Record<string, unknown>): string {\n if (typeof metadata?.prompt === 'string' && metadata.prompt.length > 0) {\n return metadata.prompt;\n }\n if (input !== null && typeof input === 'object' && !Array.isArray(input)) {\n const obj = input as Record<string, unknown>;\n if (Array.isArray(obj.messages) && obj.messages.length > 0) {\n const first = obj.messages[0] as Record<string, unknown> | undefined;\n if (typeof first?.content === 'string' && first.content.length > 0) {\n return first.content;\n }\n }\n if (typeof obj.prompt === 'string' && obj.prompt.length > 0) return obj.prompt;\n if (typeof obj.text === 'string' && obj.text.length > 0) return obj.text;\n }\n if (typeof input === 'string' && input.length > 0) return input;\n return '[LangChain run]';\n}\n\nfunction buildMeta(metadata?: Record<string, unknown>): Record<string, unknown> | undefined {\n if (!metadata || Object.keys(metadata).length === 0) return undefined;\n const reserved = new Set(['prompt', 'appId', 'runId', 'workflowId', 'conversationId']);\n const extraTags: string[] = [];\n for (const [k, v] of Object.entries(metadata)) {\n if (!reserved.has(k)) {\n extraTags.push(typeof v === 'string' ? `${k}:${v}` : `${k}:${JSON.stringify(v)}`);\n }\n }\n return extraTags.length > 0 ? { tags: extraTags } : undefined;\n}\n\nfunction resolveParameters(\n params?: LangChainCertificationInput['parameters'],\n): AiExecutionParameters {\n return {\n temperature: params?.temperature ?? 0,\n maxTokens: params?.maxTokens ?? 0,\n topP: params?.topP ?? null,\n seed: params?.seed ?? null,\n };\n}\n\n/** Build the CertifyDecisionParams from a LangChainCertificationInput. */\nfunction buildCertifyParams(\n input: LangChainCertificationInput,\n executionId: string,\n): CertifyDecisionParams {\n return {\n executionId,\n timestamp: input.timestamp,\n createdAt: input.createdAt,\n provider: input.provider,\n model: input.model,\n modelVersion: input.modelVersion ?? null,\n prompt: extractPrompt(input.input, input.metadata),\n input: normalizeCerValue(input.input),\n output: normalizeCerValue(input.output),\n parameters: resolveParameters(input.parameters),\n appId: typeof input.metadata?.appId === 'string' ? input.metadata.appId : null,\n runId: typeof input.metadata?.runId === 'string' ? input.metadata.runId : undefined,\n workflowId:\n typeof input.metadata?.workflowId === 'string' ? input.metadata.workflowId : undefined,\n conversationId:\n typeof input.metadata?.conversationId === 'string'\n ? input.metadata.conversationId\n : undefined,\n meta: buildMeta(input.metadata) as CertifyDecisionParams['meta'],\n };\n}\n\n// ─── Public API ───────────────────────────────────────────────────────────────\n\n/**\n * Create a CER bundle locally from a LangChain final run.\n *\n * Always synchronous — no network required. The resulting bundle is fully\n * aligned with the CER Protocol and verifies via verifyCer() /\n * verifyAiCerBundleDetailed().\n *\n * @example\n * ```ts\n * const { bundle, certificateHash } = createLangChainCer({\n * provider: 'openai',\n * model: 'gpt-4o-mini',\n * input: { messages: [{ role: 'user', content: 'What is 2+2?' }] },\n * output: { text: '4' },\n * createdAt: new Date().toISOString(),\n * });\n * ```\n */\nexport function createLangChainCer(input: LangChainCertificationInput): LangChainCerResult {\n const executionId = input.executionId ?? crypto.randomUUID();\n const bundle = certifyDecision(buildCertifyParams(input, executionId));\n return {\n bundle,\n certificateHash: bundle.certificateHash,\n executionId: bundle.snapshot.executionId,\n };\n}\n\n// ─── certifyLangChainRun overloads ────────────────────────────────────────────\n\n/**\n * Attested mode: call the NexArt node to produce an AttestationReceipt\n * alongside the local CER. Requires nodeUrl + apiKey on the input.\n *\n * @example\n * ```ts\n * const { bundle, certificateHash, receipt } = await certifyLangChainRun({\n * provider: 'openai',\n * model: 'gpt-4o-mini',\n * input: { messages: [...] },\n * output: { text: '...' },\n * nodeUrl: 'https://node.nexart.io',\n * apiKey: 'nxa_...',\n * });\n * ```\n */\nexport function certifyLangChainRun(\n input: LangChainCertificationInput & { nodeUrl: string; apiKey: string },\n _options?: { _attestFn?: AttestDecisionFn },\n): Promise<LangChainAttestedResult>;\n\n/**\n * Local mode: identical to createLangChainCer() — synchronous, no network.\n *\n * @example\n * ```ts\n * const { bundle, certificateHash } = certifyLangChainRun({\n * provider: 'openai',\n * model: 'gpt-4o-mini',\n * input: { messages: [...] },\n * output: { text: '...' },\n * createdAt: new Date().toISOString(),\n * });\n * ```\n */\nexport function certifyLangChainRun(input: LangChainCertificationInput): LangChainCerResult;\n\nexport function certifyLangChainRun(\n input: LangChainCertificationInput & { nodeUrl?: string; apiKey?: string },\n _options?: { _attestFn?: AttestDecisionFn },\n): LangChainCerResult | Promise<LangChainAttestedResult> {\n if (input.nodeUrl && input.apiKey) {\n const executionId = input.executionId ?? crypto.randomUUID();\n const certifyParams = buildCertifyParams({ ...input, executionId }, executionId);\n const attestFn = _options?._attestFn ?? certifyAndAttestDecision;\n return attestFn(certifyParams, { nodeUrl: input.nodeUrl, apiKey: input.apiKey }).then(\n ({ bundle, receipt }) => ({\n bundle,\n receipt,\n certificateHash: bundle.certificateHash,\n executionId: bundle.snapshot.executionId,\n attested: true as const,\n }),\n );\n }\n return createLangChainCer(input);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AC+HO,IAAM,gBAAgB;AAAA,EAC3B,IAAI;AAAA,EACJ,2BAA2B;AAAA,EAC3B,wBAAwB;AAAA,EACxB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,wBAAwB;AAAA,EACxB,cAAc;AAAA,EACd,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,2BAA2B;AAAA,EAC3B,+BAA+B;AAAA,EAC/B,oCAAoC;AAAA;AAAA,EAEpC,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,mCAAmC;AAAA,EACnC,uBAAuB;AAAA,EACvB,2BAA2B;AAC7B;;;ACnJO,IAAM,uBAAN,cAAmC,MAAM;AAAA,EAC9B;AAAA,EAEhB,YAAY,QAAkB;AAC5B,UAAM,4BAA4B,OAAO,KAAK,IAAI,CAAC,EAAE;AACrD,SAAK,OAAO;AACZ,SAAK,SAAS;AAAA,EAChB;AACF;AAEO,IAAM,sBAAN,cAAkC,MAAM;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EAEhB,YAAY,SAAiB,YAAqB,cAAwB,SAAoB;AAC5F,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,aAAa;AAClB,SAAK,eAAe;AACpB,SAAK,UAAU;AAAA,EACjB;AACF;;;ACtBO,SAAS,gBAAgB,OAAwB;AACtD,SAAO,aAAa,KAAK;AAC3B;AAEA,SAAS,aAAa,OAAwB;AAC5C,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,WAAW;AAC9B,WAAO,QAAQ,SAAS;AAAA,EAC1B;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,YAAM,IAAI,MAAM,oDAAoD,KAAK,EAAE;AAAA,IAC7E;AACA,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAM,QAAQ,MAAM,IAAI,UAAQ,aAAa,IAAI,CAAC;AAClD,WAAO,MAAM,MAAM,KAAK,GAAG,IAAI;AAAA,EACjC;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,MAAM;AACZ,UAAM,OAAO,OAAO,KAAK,GAAG,EAAE,KAAK;AACnC,UAAM,UAAU,KAAK,IAAI,SAAO;AAC9B,YAAM,MAAM,IAAI,GAAG;AACnB,UAAI,QAAQ,QAAW;AACrB,eAAO;AAAA,MACT;AACA,aAAO,KAAK,UAAU,GAAG,IAAI,MAAM,aAAa,GAAG;AAAA,IACrD,CAAC,EAAE,OAAO,OAAK,MAAM,IAAI;AACzB,WAAO,MAAM,QAAQ,KAAK,GAAG,IAAI;AAAA,EACnC;AAEA,QAAM,IAAI,MAAM,wCAAwC,OAAO,KAAK,EAAE;AACxE;;;AC3CA,aAAwB;AAGjB,SAAS,UAAU,MAAmC;AAC3D,QAAM,OAAc,kBAAW,QAAQ;AACvC,MAAI,OAAO,SAAS,UAAU;AAC5B,SAAK,OAAO,MAAM,OAAO;AAAA,EAC3B,OAAO;AACL,SAAK,OAAO,IAAI;AAAA,EAClB;AACA,SAAO,KAAK,OAAO,KAAK;AAC1B;AAEO,SAAS,SAAS,OAAuB;AAC9C,SAAO,UAAU,UAAU,KAAK,CAAC;AACnC;AAEO,SAAS,kBAAkB,OAAwB;AACxD,QAAM,YAAY,gBAAgB,KAAK;AACvC,SAAO,UAAU,UAAU,SAAS,CAAC;AACvC;AAEO,SAAS,iBAAiB,OAAiD;AAChF,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,SAAS,KAAK;AAAA,EACvB;AACA,SAAO,kBAAkB,KAAK;AAChC;AAEO,SAAS,kBAAkB,QAAkD;AAClF,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO,SAAS,MAAM;AAAA,EACxB;AACA,SAAO,kBAAkB,MAAM;AACjC;;;AC9BA,IAAM,kBAAkB;AAExB,SAAS,mBAAmB,QAAyC;AACnE,QAAM,SAAmB,CAAC;AAE1B,MAAI,OAAO,OAAO,gBAAgB,YAAY,CAAC,OAAO,SAAS,OAAO,WAAW,GAAG;AAClF,WAAO,KAAK,wDAAwD,OAAO,WAAW,EAAE;AAAA,EAC1F;AAEA,MAAI,OAAO,OAAO,cAAc,YAAY,CAAC,OAAO,SAAS,OAAO,SAAS,GAAG;AAC9E,WAAO,KAAK,sDAAsD,OAAO,SAAS,EAAE;AAAA,EACtF;AAEA,MAAI,OAAO,SAAS,SAAS,OAAO,OAAO,SAAS,YAAY,CAAC,OAAO,SAAS,OAAO,IAAI,IAAI;AAC9F,WAAO,KAAK,yDAAyD,OAAO,IAAI,EAAE;AAAA,EACpF;AAEA,MAAI,OAAO,SAAS,SAAS,OAAO,OAAO,SAAS,YAAY,CAAC,OAAO,SAAS,OAAO,IAAI,IAAI;AAC9F,WAAO,KAAK,yDAAyD,OAAO,IAAI,EAAE;AAAA,EACpF;AAEA,SAAO;AACT;AAEO,SAAS,eAAe,QAAqD;AAClF,QAAM,cAAc,mBAAmB,OAAO,UAAU;AACxD,MAAI,YAAY,SAAS,GAAG;AAC1B,UAAM,IAAI,MAAM,uBAAuB,YAAY,KAAK,IAAI,CAAC,EAAE;AAAA,EACjE;AAEA,QAAM,YAAY,iBAAiB,OAAO,KAAK;AAC/C,QAAM,aAAa,kBAAkB,OAAO,MAAM;AAElD,QAAM,WAAkC;AAAA,IACtC,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,aAAa,OAAO;AAAA,IACpB,WAAW,OAAO,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACtD,UAAU,OAAO;AAAA,IACjB,OAAO,OAAO;AAAA,IACd,cAAc,OAAO,gBAAgB;AAAA,IACrC,QAAQ,OAAO;AAAA,IACf,OAAO,OAAO;AAAA,IACd;AAAA,IACA,YAAY;AAAA,MACV,aAAa,OAAO,WAAW;AAAA,MAC/B,WAAW,OAAO,WAAW;AAAA,MAC7B,MAAM,OAAO,WAAW,QAAQ;AAAA,MAChC,MAAM,OAAO,WAAW,QAAQ;AAAA,IAClC;AAAA,IACA,QAAQ,OAAO;AAAA,IACf;AAAA,IACA,YAAY,OAAO,cAAc;AAAA,IACjC,OAAO,OAAO,SAAS;AAAA,EACzB;AAEA,MAAI,OAAO,UAAU,OAAW,UAAS,QAAQ,OAAO,SAAS;AACjE,MAAI,OAAO,WAAW,OAAW,UAAS,SAAS,OAAO,UAAU;AACpE,MAAI,OAAO,cAAc,OAAW,UAAS,YAAY,OAAO,aAAa;AAC7E,MAAI,OAAO,eAAe,OAAW,UAAS,aAAa,OAAO,cAAc;AAChF,MAAI,OAAO,mBAAmB,OAAW,UAAS,iBAAiB,OAAO,kBAAkB;AAC5F,MAAI,OAAO,iBAAiB,OAAW,UAAS,eAAe,OAAO,gBAAgB;AAGtF,MAAI,OAAO,cAAc,UAAa,OAAO,UAAU,SAAS,GAAG;AACjE,aAAS,YAAY,OAAO;AAAA,EAC9B;AAEA,SAAO;AACT;AAEO,SAAS,eAAe,UAAqD;AAClF,QAAM,eAAyB,CAAC;AAChC,QAAM,eAAyB,CAAC;AAChC,QAAM,kBAA4B,CAAC;AACnC,QAAM,mBAA6B,CAAC;AAEpC,MAAI,SAAS,SAAS,mBAAmB;AACvC,iBAAa,KAAK,yCAAyC,SAAS,IAAI,GAAG;AAAA,EAC7E;AAEA,MAAI,SAAS,oBAAoB,SAAS;AACxC,iBAAa,KAAK,0CAA0C,SAAS,eAAe,GAAG;AAAA,EACzF;AAEA,MAAI,SAAS,qBAAqB,MAAM;AACtC,iBAAa,KAAK,wCAAwC,SAAS,gBAAgB,GAAG;AAAA,EACxF;AAEA,MAAI,CAAC,SAAS,eAAe,OAAO,SAAS,gBAAgB,UAAU;AACrE,iBAAa,KAAK,wCAAwC;AAAA,EAC5D;AAEA,MAAI,CAAC,SAAS,aAAa,OAAO,SAAS,cAAc,UAAU;AACjE,iBAAa,KAAK,sCAAsC;AAAA,EAC1D;AAEA,MAAI,CAAC,SAAS,YAAY,OAAO,SAAS,aAAa,UAAU;AAC/D,iBAAa,KAAK,qCAAqC;AAAA,EACzD;AAEA,MAAI,CAAC,SAAS,SAAS,OAAO,SAAS,UAAU,UAAU;AACzD,iBAAa,KAAK,kCAAkC;AAAA,EACtD;AAEA,MAAI,CAAC,SAAS,UAAU,OAAO,SAAS,WAAW,UAAU;AAC3D,iBAAa,KAAK,mCAAmC;AAAA,EACvD;AAEA,MAAI,SAAS,UAAU,UAAa,SAAS,UAAU,MAAM;AAC3D,iBAAa,KAAK,kCAAkC;AAAA,EACtD;AAEA,MAAI,SAAS,WAAW,UAAa,SAAS,WAAW,MAAM;AAC7D,iBAAa,KAAK,mCAAmC;AAAA,EACvD;AAEA,QAAM,cAAc,mBAAmB,SAAS,UAAU;AAC1D,eAAa,KAAK,GAAG,WAAW;AAEhC,MAAI,CAAC,SAAS,aAAa,CAAC,SAAS,UAAU,WAAW,SAAS,GAAG;AACpE,iBAAa,KAAK,6CAA6C,SAAS,SAAS,GAAG;AAAA,EACtF;AAEA,MAAI,CAAC,SAAS,cAAc,CAAC,SAAS,WAAW,WAAW,SAAS,GAAG;AACtE,iBAAa,KAAK,8CAA8C,SAAS,UAAU,GAAG;AAAA,EACxF;AAEA,MAAI,aAAa,WAAW,GAAG;AAC7B,UAAM,oBAAoB,iBAAiB,SAAS,KAAK;AACzD,QAAI,SAAS,cAAc,mBAAmB;AAC5C,sBAAgB,KAAK,gCAAgC,iBAAiB,SAAS,SAAS,SAAS,EAAE;AAAA,IACrG;AAEA,UAAM,qBAAqB,kBAAkB,SAAS,MAAM;AAC5D,QAAI,SAAS,eAAe,oBAAoB;AAC9C,uBAAiB,KAAK,iCAAiC,kBAAkB,SAAS,SAAS,UAAU,EAAE;AAAA,IACzG;AAAA,EACF;AAEA,QAAM,SAAS,CAAC,GAAG,cAAc,GAAG,cAAc,GAAG,iBAAiB,GAAG,gBAAgB;AAEzF,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO,EAAE,IAAI,MAAM,QAAQ,CAAC,GAAG,MAAM,cAAc,GAAG;AAAA,EACxD;AAEA,MAAI;AACJ,MAAI;AAEJ,MAAI,aAAa,SAAS,GAAG;AAC3B,WAAO,cAAc;AACrB,cAAU;AAAA,EACZ,WAAW,aAAa,SAAS,GAAG;AAClC,WAAO,cAAc;AACrB,cAAU;AAAA,EACZ,WAAW,gBAAgB,SAAS,KAAK,iBAAiB,SAAS,GAAG;AACpE,WAAO,cAAc;AACrB,cAAU,CAAC,GAAG,iBAAiB,GAAG,gBAAgB;AAAA,EACpD,WAAW,gBAAgB,SAAS,GAAG;AACrC,WAAO,cAAc;AACrB,cAAU;AAAA,EACZ,WAAW,iBAAiB,SAAS,GAAG;AACtC,WAAO,cAAc;AACrB,cAAU;AAAA,EACZ,OAAO;AACL,WAAO,cAAc;AACrB,cAAU;AAAA,EACZ;AAEA,SAAO,EAAE,IAAI,OAAO,QAAQ,MAAM,QAAQ;AAC5C;;;AClKA,SAAS,uBAAuB,SAAqC;AACnE,QAAM,YAAY,gBAAgB,OAAO;AACzC,SAAO,UAAU,UAAU,SAAS,CAAC;AACvC;AAEO,SAAS,QACd,UACA,SACsB;AACtB,QAAM,YAAY,SAAS,cAAa,oBAAI,KAAK,GAAE,YAAY;AAI/D,QAAM,UAA8B;AAAA,IAClC,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,SAAS;AAAA,EACX;AAEA,QAAM,kBAAkB,uBAAuB,OAAO;AAEtD,QAAM,SAA+B;AAAA,IACnC,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,EACF;AAEA,MAAI,SAAS,MAAM;AACjB,WAAO,OAAO,QAAQ;AAAA,EACxB;AAGA,MAAI,SAAS,aAAa;AACxB,WAAO,cAAc,QAAQ;AAAA,EAC/B;AAEA,SAAO;AACT;AAEO,SAAS,UAAU,QAAkD;AAC1E,QAAM,eAAyB,CAAC;AAChC,QAAM,eAAyB,CAAC;AAEhC,MAAI,OAAO,eAAe,uBAAuB;AAC/C,iBAAa,KAAK,mDAAmD,OAAO,UAAU,GAAG;AAAA,EAC3F;AAEA,MAAI,OAAO,YAAY,OAAO;AAC5B,iBAAa,KAAK,gCAAgC,OAAO,OAAO,GAAG;AAAA,EACrE;AAEA,MAAI,CAAC,OAAO,aAAa,OAAO,OAAO,cAAc,UAAU;AAC7D,iBAAa,KAAK,sCAAsC;AAAA,EAC1D;AAEA,MAAI,CAAC,OAAO,mBAAmB,CAAC,OAAO,gBAAgB,WAAW,SAAS,GAAG;AAC5E,iBAAa,KAAK,mDAAmD,OAAO,eAAe,GAAG;AAAA,EAChG;AAEA,MAAI,CAAC,OAAO,UAAU;AACpB,iBAAa,KAAK,sBAAsB;AACxC,UAAM,YAAY,CAAC,GAAG,cAAc,GAAG,YAAY;AACnD,WAAO,EAAE,IAAI,OAAO,QAAQ,WAAW,MAAM,cAAc,cAAc,SAAS,aAAa;AAAA,EACjG;AAEA,MAAI,wBAAuC;AAC3C,MAAI,iBAA4C;AAEhD,MAAI;AACF,qBAAiB,eAAe,OAAO,QAAQ;AAAA,EACjD,SAASA,MAAK;AACZ,4BAAwBA,gBAAe,QAAQA,KAAI,UAAU,OAAOA,IAAG;AAAA,EACzE;AAEA,MAAI,0BAA0B,MAAM;AAClC,UAAMC,UAAS,CAAC,GAAG,cAAc,GAAG,cAAc,qBAAqB;AACvE,WAAO,EAAE,IAAI,OAAO,QAAAA,SAAQ,MAAM,cAAc,wBAAwB,SAAS,CAAC,qBAAqB,EAAE;AAAA,EAC3G;AAEA,QAAM,iBAAiB,eAAgB;AAEvC,QAAM,iBAA2B,CAAC;AAClC,MAAI;AACF,UAAM,UAA8B;AAAA,MAClC,YAAY;AAAA,MACZ,WAAW,OAAO;AAAA,MAClB,UAAU,OAAO;AAAA,MACjB,SAAS;AAAA,IACX;AACA,UAAM,eAAe,uBAAuB,OAAO;AACnD,QAAI,OAAO,oBAAoB,cAAc;AAC3C,qBAAe,KAAK,sCAAsC,YAAY,SAAS,OAAO,eAAe,EAAE;AAAA,IACzG;AAAA,EACF,SAASD,MAAK;AACZ,UAAM,MAAMA,gBAAe,QAAQA,KAAI,UAAU,OAAOA,IAAG;AAC3D,UAAMC,UAAS,CAAC,GAAG,cAAc,GAAG,cAAc,GAAG,gBAAgB,GAAG;AACxE,WAAO,EAAE,IAAI,OAAO,QAAAA,SAAQ,MAAM,cAAc,wBAAwB,SAAS,CAAC,GAAG,EAAE;AAAA,EACzF;AAEA,QAAM,SAAS,CAAC,GAAG,cAAc,GAAG,cAAc,GAAG,gBAAgB,GAAG,cAAc;AAEtF,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO,EAAE,IAAI,MAAM,QAAQ,CAAC,GAAG,MAAM,cAAc,GAAG;AAAA,EACxD;AAEA,MAAI;AACJ,MAAI;AAEJ,MAAI,aAAa,SAAS,GAAG;AAC3B,WAAO,cAAc;AACrB,cAAU;AAAA,EACZ,WAAW,aAAa,SAAS,GAAG;AAClC,WAAO,cAAc;AACrB,cAAU;AAAA,EACZ,WAAW,eAAe,SAAS,KAAK,eAAe,WAAW,GAAG;AACnE,WAAO,cAAc;AACrB,cAAU;AAAA,EACZ,WAAW,kBAAkB,eAAe,SAAS,cAAc,IAAI;AACrE,WAAO,eAAe;AACtB,cAAU,eAAe,WAAW;AAAA,EACtC,WAAW,eAAe,SAAS,GAAG;AACpC,WAAO,cAAc;AACrB,cAAU;AAAA,EACZ,OAAO;AACL,WAAO,cAAc;AACrB,cAAU;AAAA,EACZ;AAEA,SAAO,EAAE,IAAI,OAAO,QAAQ,MAAM,QAAQ;AAC5C;;;ACjJA,IAAAC,UAAwB;AAKjB,SAAS,gBAAgB,QAAqD;AACnF,QAAM,cAAc,OAAO,eAAsB,mBAAW;AAE5D,QAAM,WAAW,eAAe;AAAA,IAC9B;AAAA,IACA,WAAW,OAAO;AAAA,IAClB,UAAU,OAAO;AAAA,IACjB,OAAO,OAAO;AAAA,IACd,cAAc,OAAO;AAAA,IACrB,QAAQ,OAAO;AAAA,IACf,OAAO,OAAO;AAAA,IACd,YAAY,OAAO;AAAA,IACnB,QAAQ,OAAO;AAAA,IACf,YAAY,OAAO;AAAA,IACnB,OAAO,OAAO;AAAA,IACd,OAAO,OAAO;AAAA,IACd,QAAQ,OAAO;AAAA,IACf,WAAW,OAAO;AAAA,IAClB,YAAY,OAAO;AAAA,IACnB,gBAAgB,OAAO;AAAA,IACvB,cAAc,OAAO;AAAA,EACvB,CAAC;AAED,SAAO,QAAQ,UAAU,EAAE,WAAW,OAAO,WAAW,MAAM,OAAO,KAAK,CAAC;AAC7E;;;AC7BA,IAAAC,UAAwB;AAUjB,IAAM,aAAN,MAAiB;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT,YAAoB;AAAA,EACpB,eAA8B;AAAA,EAC9B,QAA6B,CAAC;AAAA,EAEtC,YAAY,SAA6B;AACvC,SAAK,QAAQ,SAAS,SAAgB,mBAAW;AACjD,SAAK,aAAa,SAAS,cAAc;AACzC,SAAK,iBAAiB,SAAS,kBAAkB;AACjD,SAAK,QAAQ,SAAS,SAAS;AAAA,EACjC;AAAA,EAEA,KAAK,QAA0C;AAC7C,UAAM,SAAS,OAAO,UAAiB,mBAAW;AAClD,UAAM,cAAc,GAAG,KAAK,KAAK,SAAS,KAAK,SAAS;AAExD,UAAM,WAAW,eAAe;AAAA,MAC9B;AAAA,MACA,WAAW,OAAO;AAAA,MAClB,UAAU,OAAO;AAAA,MACjB,OAAO,OAAO;AAAA,MACd,cAAc,OAAO;AAAA,MACrB,QAAQ,OAAO;AAAA,MACf,OAAO,OAAO;AAAA,MACd,YAAY,OAAO;AAAA,MACnB,QAAQ,OAAO;AAAA,MACf,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ;AAAA,MACA,WAAW,KAAK;AAAA,MAChB,YAAY,KAAK;AAAA,MACjB,gBAAgB,KAAK;AAAA,MACrB,cAAc,KAAK;AAAA,IACrB,CAAC;AAED,UAAM,SAAS,QAAQ,UAAU,EAAE,MAAM,OAAO,KAAK,CAAC;AAEtD,SAAK,MAAM,KAAK;AAAA,MACd,WAAW,KAAK;AAAA,MAChB;AAAA,MACA;AAAA,MACA,iBAAiB,OAAO;AAAA,MACxB,cAAc,KAAK;AAAA,IACrB,CAAC;AAED,SAAK,eAAe,OAAO;AAC3B,SAAK;AAEL,WAAO;AAAA,EACT;AAAA,EAEA,WAAuB;AACrB,WAAO;AAAA,MACL,OAAO,KAAK;AAAA,MACZ,YAAY,KAAK;AAAA,MACjB,gBAAgB,KAAK;AAAA,MACrB,WAAW,KAAK,MAAM;AAAA,MACtB,OAAO,CAAC,GAAG,KAAK,KAAK;AAAA,MACrB,eAAe,KAAK;AAAA,IACtB;AAAA,EACF;AACF;;;ACrEA,SAAS,oBAAoB,OAAyB;AACpD,MAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAElD,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AACA,MAAI,OAAO,UAAU,YAAY;AAC/B,UAAM,IAAI,MAAM,2DAA2D;AAAA,EAC7E;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,mBAAmB;AAAA,EACtC;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,SAAkC,CAAC;AACzC,eAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,KAAgC,GAAG;AACzE,UAAI,QAAQ,OAAW;AACvB,aAAO,GAAG,IAAI,oBAAoB,GAAG;AAAA,IACvC;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAGA,SAAS,WACP,KACA,MACA,aACyB;AACzB,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,QAAM,QAAQ,EAAE,GAAG,IAAI;AACvB,MAAI,SAAkC;AAEtC,WAAS,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,KAAK;AACzC,UAAM,MAAM,MAAM,CAAC;AACnB,QAAI,OAAO,OAAO,GAAG,MAAM,YAAY,OAAO,GAAG,MAAM,KAAM,QAAO;AACpE,WAAO,GAAG,IAAI,EAAE,GAAI,OAAO,GAAG,EAA8B;AAC5D,aAAS,OAAO,GAAG;AAAA,EACrB;AAEA,QAAM,OAAO,MAAM,MAAM,SAAS,CAAC;AACnC,MAAI,QAAQ,OAAQ,QAAO,IAAI,IAAI;AACnC,SAAO;AACT;AAOO,SAAS,uBAAuB,QAAoD;AACzF,SAAO,oBAAoB,MAAM;AACnC;AAcO,SAAS,mBACd,QACA,SACsB;AACtB,MAAI,UAAU,oBAAoB,MAAM;AAExC,MAAI,SAAS,eAAe,QAAQ,YAAY,SAAS,GAAG;AAC1D,UAAM,cAAc,QAAQ,cAAc;AAC1C,QAAI,MAAM;AACV,eAAW,QAAQ,QAAQ,aAAa;AACtC,YAAM,WAAW,KAAK,MAAM,WAAW;AAAA,IACzC;AACA,cAAU;AAAA,EACZ;AAEA,SAAO;AACT;AAWO,SAAS,iBAAiB,QAAkE;AACjG,QAAM,OAA2C;AAAA,IAC/C,YAAY,OAAO;AAAA,IACnB,iBAAiB,OAAO;AAAA,IACxB,WAAW,OAAO;AAAA,IAClB,SAAS,OAAO;AAAA,IAChB,UAAU,OAAO;AAAA,EACnB;AACA,SAAO,oBAAoB,IAAI;AACjC;AAMO,SAAS,eAAe,QAA0B;AACvD,MAAI,OAAO,WAAW,YAAY,WAAW,KAAM,QAAO;AAC1D,QAAM,IAAI;AAEV,MAAI,OAAO,EAAE,kBAAkB,YAAY,EAAE,cAAc,SAAS,EAAG,QAAO;AAC9E,MAAI,OAAO,EAAE,oBAAoB,YAAY,EAAE,gBAAgB,SAAS,EAAG,QAAO;AAElF,MAAI,OAAO,EAAE,gBAAgB,YAAY,EAAE,gBAAgB,MAAM;AAC/D,UAAM,MAAM,EAAE;AACd,QAAI,OAAO,IAAI,kBAAkB,YAAY,IAAI,cAAc,SAAS,EAAG,QAAO;AAClF,QAAI,OAAO,IAAI,oBAAoB,YAAY,IAAI,gBAAgB,SAAS,EAAG,QAAO;AAAA,EACxF;AAEA,SAAO;AACT;;;AClIA,IAAM,iBAAiB;AACvB,IAAM,qBAAqB;AAE3B,SAAS,mBAAmB,OAAgB,WAAkC;AAC5E,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI,CAAC,eAAe,KAAK,KAAK,GAAG;AAC/B,WAAO,GAAG,SAAS,sCAAsC,KAAK;AAAA,EAChE;AACA,SAAO;AACT;AAEA,eAAsB,OACpB,QACA,SAC4B;AAC5B,QAAM,MAAM,GAAG,QAAQ,QAAQ,QAAQ,QAAQ,EAAE,CAAC;AAClD,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,YAAY,uBAAuB,MAAM;AAE/C,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,SAAS;AAE5D,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,MAAM,KAAK;AAAA,MAC1B,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,iBAAiB,UAAU,QAAQ,MAAM;AAAA,MAC3C;AAAA,MACA,MAAM,KAAK,UAAU,SAAS;AAAA,MAC9B,QAAQ,WAAW;AAAA,IACrB,CAAC;AAAA,EACH,SAASC,MAAK;AACZ,iBAAa,KAAK;AAClB,UAAM,QAAQA;AACd,QAAI,MAAM,SAAS,cAAc;AAC/B,YAAM,IAAI;AAAA,QACR,uCAAuC,SAAS;AAAA,MAClD;AAAA,IACF;AACA,UAAM,IAAI;AAAA,MACR,8CAA8C,MAAM,OAAO;AAAA,IAC7D;AAAA,EACF,UAAE;AACA,iBAAa,KAAK;AAAA,EACpB;AAEA,MAAI;AACJ,MAAI;AACF,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B,QAAQ;AACN,UAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,EAAE;AACjD,UAAM,IAAI;AAAA,MACR,gDAAgD,SAAS,MAAM,MAAM,IAAI;AAAA,MACzE,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAMC,UAAS;AACf,UAAM,MAAM,OAAOA,QAAO,UAAU,WAChCA,QAAO,QACP,QAAQ,SAAS,MAAM;AAC3B,UAAM,UAAU,MAAM,QAAQA,QAAO,OAAO,IAAIA,QAAO,UAAsB;AAC7E,UAAM,IAAI;AAAA,MACR,uBAAuB,GAAG;AAAA,MAC1B,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS;AACf,QAAM,SAAmB,CAAC;AAE1B,MAAI,OAAO,OAAO,oBAAoB,YAAY,OAAO,oBAAoB,OAAO,iBAAiB;AACnG,WAAO;AAAA,MACL,kCAAkC,OAAO,eAAe,qBAAqB,OAAO,eAAe;AAAA,IACrG;AAAA,EACF;AAEA,QAAM,cAAc,mBAAmB,OAAO,iBAAiB,0BAA0B;AACzF,MAAI,YAAa,QAAO,KAAK,WAAW;AAExC,QAAM,iBAAiB,mBAAmB,OAAO,iBAAiB,0BAA0B;AAC5F,MAAI,eAAgB,QAAO,KAAK,cAAc;AAE9C,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,IAAI;AAAA,MACR,2CAA2C,OAAO,KAAK,IAAI,CAAC;AAAA,MAC5D,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,eAAe,OAAO,OAAO,kBAAkB,WAAW,OAAO,gBAAgB;AAAA,IACjF,iBAAiB,OAAO,OAAO,oBAAoB,WAAW,OAAO,kBAAkB;AAAA,IACvF,iBAAiB,OAAO,OAAO,oBAAoB,WAAW,OAAO,kBAAkB;AAAA,IACvF,iBAAiB,OAAO,OAAO,oBAAoB,WAAW,OAAO,kBAAkB;AAAA,IACvF,KAAK;AAAA,EACP;AACF;;;ACxGO,SAAS,UAAU,QAAsC;AAC9D,SAAO,gBAAgB,MAAM;AAC/B;AAEO,SAAS,UAAU,MAAoC;AAC5D,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,IAAI;AAAA,EAC1B,SAASC,MAAK;AACZ,UAAM,IAAI,qBAAqB,CAAC,iBAAkBA,KAAc,OAAO,EAAE,CAAC;AAAA,EAC5E;AAEA,QAAM,SAAS;AAEf,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,UAAM,IAAI,qBAAqB,CAAC,+BAA+B,CAAC;AAAA,EAClE;AAEA,MAAI,OAAO,eAAe,uBAAuB;AAC/C,UAAM,IAAI,qBAAqB,CAAC,mDAAmD,OAAO,UAAU,GAAG,CAAC;AAAA,EAC1G;AAEA,QAAM,SAAS,UAAU,MAAM;AAC/B,MAAI,CAAC,OAAO,IAAI;AACd,UAAM,IAAI,qBAAqB,OAAO,MAAM;AAAA,EAC9C;AAEA,SAAO;AACT;;;ACjCA,IAAAC,UAAwB;AASjB,SAAS,aACd,QACA;AACA,SAAO;AAAA,IACL,MAAM,QAAQ,QAA6F;AACzG,YAAM,MAAM,MAAM,OAAO,OAAO,OAAO,aAAa;AACpD,YAAM,SAAS,OAAO,cAAc,GAAG;AACvC,YAAM,eAAe,OAAO,sBACxB,OAAO,oBAAoB,GAAG,IAC7B,OAAO,gBAAgB;AAE5B,YAAM,WAAW,eAAe;AAAA,QAC9B,aAAa,OAAO,eAAsB,mBAAW;AAAA,QACrD,UAAU,OAAO;AAAA,QACjB,OAAO,OAAO;AAAA,QACd;AAAA,QACA,QAAQ,OAAO;AAAA,QACf,OAAO,OAAO;AAAA,QACd,YAAY,OAAO;AAAA,QACnB;AAAA,QACA,OAAO,OAAO;AAAA,MAChB,CAAC;AAED,YAAM,SAAS,QAAQ,UAAU,EAAE,MAAM,OAAO,KAAK,CAAC;AAEtD,aAAO,EAAE,QAAQ,UAAU,OAAO;AAAA,IACpC;AAAA,EACF;AACF;;;ACnCA,SAAS,WAAW,KAA8B,KAAiC;AACjF,QAAM,IAAI,IAAI,GAAG;AACjB,SAAO,OAAO,MAAM,YAAY,EAAE,SAAS,IAAI,IAAI;AACrD;AAEA,SAAS,aAAa,KAAyD;AAC7E,QAAM,gBAAgB,WAAW,KAAK,eAAe;AACrD,QAAM,kBAAkB,WAAW,KAAK,iBAAiB;AACzD,QAAM,kBAAkB,WAAW,KAAK,iBAAiB;AACzD,QAAM,kBAAkB,WAAW,KAAK,iBAAiB;AAEzD,MAAI,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,iBAAiB;AAC9E,WAAO;AAAA,EACT;AAEA,QAAM,UAA8B;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,SAAS,WAAW,KAAK,QAAQ;AACvC,MAAI,OAAQ,SAAQ,SAAS;AAE7B,QAAM,aAAa,WAAW,KAAK,YAAY;AAC/C,MAAI,WAAY,SAAQ,aAAa;AAErC,QAAM,gBAAgB,WAAW,KAAK,eAAe;AACrD,MAAI,cAAe,SAAQ,gBAAgB;AAE3C,QAAM,kBAAkB,WAAW,KAAK,WAAW,KAAK,WAAW,KAAK,iBAAiB;AACzF,MAAI,gBAAiB,SAAQ,kBAAkB;AAE/C,SAAO;AACT;AAEO,SAAS,sBAAsB,QAA4C;AAChF,MAAI,OAAO,WAAW,YAAY,WAAW,KAAM,QAAO;AAE1D,QAAM,IAAI;AAEV,QAAM,WAAW,aAAa,CAAC;AAC/B,MAAI,SAAU,QAAO;AAErB,MAAI,OAAO,EAAE,SAAS,YAAY,EAAE,SAAS,MAAM;AACjD,UAAM,OAAO,EAAE;AACf,QAAI,OAAO,KAAK,gBAAgB,YAAY,KAAK,gBAAgB,MAAM;AACrE,YAAM,SAAS,aAAa,KAAK,WAAsC;AACvE,UAAI,OAAQ,QAAO;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AACT;;;ACjDA,SAAS,iBACP,OACA,QACoB;AACpB,MACE,CAAC,MAAM,iBACP,CAAC,MAAM,mBACP,CAAC,MAAM,iBACP;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,eAAe,MAAM;AAAA,IACrB,iBAAiB,MAAM,mBAAmB,OAAO;AAAA,IACjD,iBAAiB,MAAM;AAAA,IACvB,iBAAiB,MAAM;AAAA,EACzB;AACF;AAEA,eAAsB,yBACpB,QACA,SACwE;AACxE,QAAM,SAAS,gBAAgB,MAAM;AACrC,QAAM,QAAQ,MAAM,OAAO,QAAQ,OAAO;AAC1C,QAAM,UAAU,iBAAiB,OAAO,MAAM;AAC9C,SAAO,EAAE,QAAQ,QAAQ;AAC3B;AAEA,eAAsB,eACpB,QACA,SACwE;AACxE,MAAI,eAAe,MAAM,GAAG;AAC1B,UAAM,WAAW,sBAAsB,MAAM;AAC7C,QAAI,UAAU;AACZ,aAAO,EAAE,QAAQ,SAAS,SAAS;AAAA,IACrC;AAAA,EACF;AAEA,QAAM,QAAQ,MAAM,OAAO,QAAQ,OAAO;AAC1C,QAAM,UAAU,iBAAiB,OAAO,MAAM;AAC9C,SAAO,EAAE,QAAQ,QAAQ;AAC3B;;;AC3BA,IAAM,gBAAgB;AAAA,EAClB,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,IAAI;AACR;AACA,IAAM,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,EAAE,IAAI;AAChD,IAAM,IAAI;AACV,IAAM,KAAK;AAIX,IAAM,eAAe,IAAI,SAAS;AAC9B,MAAI,uBAAuB,SAAS,OAAO,MAAM,sBAAsB,YAAY;AAC/E,UAAM,kBAAkB,GAAG,IAAI;AAAA,EACnC;AACJ;AACA,IAAM,MAAM,CAAC,UAAU,OAAO;AAC1B,QAAM,IAAI,IAAI,MAAM,OAAO;AAC3B,eAAa,GAAG,GAAG;AACnB,QAAM;AACV;AACA,IAAM,QAAQ,CAAC,MAAM,OAAO,MAAM;AAClC,IAAM,QAAQ,CAAC,MAAM,OAAO,MAAM;AAClC,IAAM,UAAU,CAAC,MAAM,aAAa,cAAe,YAAY,OAAO,CAAC,KAAK,EAAE,YAAY,SAAS;AAEnG,IAAM,SAAS,CAAC,OAAO,QAAQ,QAAQ,OAAO;AAC1C,QAAM,QAAQ,QAAQ,KAAK;AAC3B,QAAM,MAAM,OAAO;AACnB,QAAM,WAAW,WAAW;AAC5B,MAAI,CAAC,SAAU,YAAY,QAAQ,QAAS;AACxC,UAAM,SAAS,SAAS,IAAI,KAAK;AACjC,UAAM,QAAQ,WAAW,cAAc,MAAM,KAAK;AAClD,UAAM,MAAM,QAAQ,UAAU,GAAG,KAAK,QAAQ,OAAO,KAAK;AAC1D,QAAI,SAAS,wBAAwB,QAAQ,WAAW,GAAG;AAAA,EAC/D;AACA,SAAO;AACX;AAEA,IAAM,MAAM,CAAC,QAAQ,IAAI,WAAW,GAAG;AACvC,IAAM,OAAO,CAAC,QAAQ,WAAW,KAAK,GAAG;AACzC,IAAM,OAAO,CAAC,GAAG,QAAQ,EAAE,SAAS,EAAE,EAAE,SAAS,KAAK,GAAG;AACzD,IAAM,aAAa,CAAC,MAAM,MAAM,KAAK,OAAO,CAAC,CAAC,EACzC,IAAI,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,EACrB,KAAK,EAAE;AACZ,IAAM,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;AACxD,IAAM,MAAM,CAAC,OAAO;AAChB,MAAI,MAAM,EAAE,MAAM,MAAM,EAAE;AACtB,WAAO,KAAK,EAAE;AAClB,MAAI,MAAM,EAAE,KAAK,MAAM,EAAE;AACrB,WAAO,MAAM,EAAE,IAAI;AACvB,MAAI,MAAM,EAAE,KAAK,MAAM,EAAE;AACrB,WAAO,MAAM,EAAE,IAAI;AACvB;AACJ;AACA,IAAM,aAAa,CAAC,QAAQ;AACxB,QAAM,IAAI;AACV,MAAI,CAAC,MAAM,GAAG;AACV,WAAO,IAAI,CAAC;AAChB,QAAM,KAAK,IAAI;AACf,QAAM,KAAK,KAAK;AAChB,MAAI,KAAK;AACL,WAAO,IAAI,CAAC;AAChB,QAAM,QAAQ,IAAI,EAAE;AACpB,WAAS,KAAK,GAAG,KAAK,GAAG,KAAK,IAAI,MAAM,MAAM,GAAG;AAE7C,UAAM,KAAK,IAAI,IAAI,WAAW,EAAE,CAAC;AACjC,UAAM,KAAK,IAAI,IAAI,WAAW,KAAK,CAAC,CAAC;AACrC,QAAI,OAAO,UAAa,OAAO;AAC3B,aAAO,IAAI,CAAC;AAChB,UAAM,EAAE,IAAI,KAAK,KAAK;AAAA,EAC1B;AACA,SAAO;AACX;AACA,IAAM,KAAK,MAAM,YAAY;AAC7B,IAAM,SAAS,MAAM,GAAG,GAAG,UAAU,IAAI,kDAAkD;AAE3F,IAAM,cAAc,IAAI,SAAS;AAC7B,QAAM,IAAI,IAAI,KAAK,OAAO,CAAC,KAAK,MAAM,MAAM,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAChE,MAAI,MAAM;AACV,OAAK,QAAQ,OAAK;AAAE,MAAE,IAAI,GAAG,GAAG;AAAG,WAAO,EAAE;AAAA,EAAQ,CAAC;AACrD,SAAO;AACX;AAMA,IAAM,MAAM;AACZ,IAAM,cAAc,CAAC,GAAG,KAAK,KAAK,MAAM,+BAAgC,MAAM,CAAC,KAAK,OAAO,KAAK,IAAI,MAAM,IAAI,IAAI,GAAG;AAErH,IAAM,IAAI,CAAC,GAAG,IAAI,MAAM;AACpB,QAAM,IAAI,IAAI;AACd,SAAO,KAAK,KAAK,IAAI,IAAI;AAC7B;AACA,IAAM,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;AAG1B,IAAM,SAAS,CAACC,MAAK,OAAO;AACxB,MAAIA,SAAQ,MAAM,MAAM;AACpB,QAAI,kBAAkBA,OAAM,UAAU,EAAE;AAC5C,MAAI,IAAI,EAAEA,MAAK,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AACxD,SAAO,MAAM,IAAI;AACb,UAAM,IAAI,IAAI,GAAG,IAAI,IAAI;AACzB,UAAM,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI;AACjC,QAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;AAAA,EAC3C;AACA,SAAO,MAAM,KAAK,EAAE,GAAG,EAAE,IAAI,IAAI,YAAY;AACjD;AACA,IAAM,WAAW,CAAC,SAAS;AAEvB,QAAM,KAAK,OAAO,IAAI;AACtB,MAAI,OAAO,OAAO;AACd,QAAI,YAAY,OAAO,UAAU;AACrC,SAAO;AACX;AAEA,IAAM,SAAS,CAAC,MAAO,aAAa,QAAQ,IAAI,IAAI,gBAAgB;AAGpE,IAAM,OAAO,MAAM;AAEnB,IAAM,QAAN,MAAM,OAAM;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY,GAAG,GAAG,GAAG,GAAG;AACpB,UAAM,MAAM;AACZ,SAAK,IAAI,YAAY,GAAG,IAAI,GAAG;AAC/B,SAAK,IAAI,YAAY,GAAG,IAAI,GAAG;AAC/B,SAAK,IAAI,YAAY,GAAG,IAAI,GAAG;AAC/B,SAAK,IAAI,YAAY,GAAG,IAAI,GAAG;AAC/B,WAAO,OAAO,IAAI;AAAA,EACtB;AAAA,EACA,OAAO,QAAQ;AACX,WAAO;AAAA,EACX;AAAA,EACA,OAAO,WAAW,GAAG;AACjB,WAAO,IAAI,OAAM,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;AAAA,EAC/C;AAAA;AAAA,EAEA,OAAO,UAAU,KAAK,SAAS,OAAO;AAClC,UAAM,IAAI;AAEV,UAAM,SAAS,KAAK,OAAO,KAAK,CAAC,CAAC;AAElC,UAAM,WAAW,IAAI,EAAE;AACvB,WAAO,EAAE,IAAI,WAAW,CAAC;AACzB,UAAM,IAAI,aAAa,MAAM;AAG7B,UAAM,MAAM,SAAS,OAAO;AAC5B,gBAAY,GAAG,IAAI,GAAG;AACtB,UAAM,KAAK,EAAE,IAAI,CAAC;AAClB,UAAM,IAAI,EAAE,KAAK,EAAE;AACnB,UAAM,IAAI,EAAE,IAAI,KAAK,EAAE;AACvB,QAAI,EAAE,SAAS,OAAO,EAAE,IAAI,QAAQ,GAAG,CAAC;AACxC,QAAI,CAAC;AACD,UAAI,uBAAuB;AAC/B,UAAM,UAAU,IAAI,QAAQ;AAC5B,UAAM,iBAAiB,WAAW,SAAU;AAC5C,QAAI,CAAC,UAAU,MAAM,MAAM;AACvB,UAAI,gCAAgC;AACxC,QAAI,kBAAkB;AAClB,UAAI,EAAE,CAAC,CAAC;AACZ,WAAO,IAAI,OAAM,GAAG,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC;AAAA,EACvC;AAAA,EACA,OAAO,QAAQ,KAAK,QAAQ;AACxB,WAAO,OAAM,UAAU,WAAW,GAAG,GAAG,MAAM;AAAA,EAClD;AAAA,EACA,IAAI,IAAI;AACJ,WAAO,KAAK,SAAS,EAAE;AAAA,EAC3B;AAAA,EACA,IAAI,IAAI;AACJ,WAAO,KAAK,SAAS,EAAE;AAAA,EAC3B;AAAA;AAAA,EAEA,iBAAiB;AACb,UAAM,IAAI;AACV,UAAM,IAAI;AACV,UAAM,IAAI;AACV,QAAI,EAAE,IAAI;AACN,aAAO,IAAI,iBAAiB;AAGhC,UAAM,EAAE,GAAG,GAAG,GAAG,EAAE,IAAI;AACvB,UAAM,KAAK,EAAE,IAAI,CAAC;AAClB,UAAM,KAAK,EAAE,IAAI,CAAC;AAClB,UAAM,KAAK,EAAE,IAAI,CAAC;AAClB,UAAM,KAAK,EAAE,KAAK,EAAE;AACpB,UAAM,MAAM,EAAE,KAAK,CAAC;AACpB,UAAM,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC/B,UAAM,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACtC,QAAI,SAAS;AACT,aAAO,IAAI,uCAAuC;AAEtD,UAAM,KAAK,EAAE,IAAI,CAAC;AAClB,UAAM,KAAK,EAAE,IAAI,CAAC;AAClB,QAAI,OAAO;AACP,aAAO,IAAI,uCAAuC;AACtD,WAAO;AAAA,EACX;AAAA;AAAA,EAEA,OAAO,OAAO;AACV,UAAM,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI;AAChC,UAAM,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,OAAO,KAAK;AAC5C,UAAM,OAAO,EAAE,KAAK,EAAE;AACtB,UAAM,OAAO,EAAE,KAAK,EAAE;AACtB,UAAM,OAAO,EAAE,KAAK,EAAE;AACtB,UAAM,OAAO,EAAE,KAAK,EAAE;AACtB,WAAO,SAAS,QAAQ,SAAS;AAAA,EACrC;AAAA,EACA,MAAM;AACF,WAAO,KAAK,OAAO,CAAC;AAAA,EACxB;AAAA;AAAA,EAEA,SAAS;AACL,WAAO,IAAI,OAAM,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;AAAA,EAC3D;AAAA;AAAA,EAEA,SAAS;AACL,UAAM,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI;AAChC,UAAM,IAAI;AAEV,UAAM,IAAI,EAAE,KAAK,EAAE;AACnB,UAAM,IAAI,EAAE,KAAK,EAAE;AACnB,UAAMC,KAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC3B,UAAM,IAAI,EAAE,IAAI,CAAC;AACjB,UAAM,OAAO,KAAK;AAClB,UAAM,IAAI,EAAE,EAAE,OAAO,IAAI,IAAI,IAAI,CAAC;AAClC,UAAMC,KAAI,IAAI;AACd,UAAM,IAAIA,KAAID;AACd,UAAM,IAAI,IAAI;AACd,UAAM,KAAK,EAAE,IAAI,CAAC;AAClB,UAAM,KAAK,EAAEC,KAAI,CAAC;AAClB,UAAM,KAAK,EAAE,IAAI,CAAC;AAClB,UAAM,KAAK,EAAE,IAAIA,EAAC;AAClB,WAAO,IAAI,OAAM,IAAI,IAAI,IAAI,EAAE;AAAA,EACnC;AAAA;AAAA,EAEA,IAAI,OAAO;AACP,UAAM,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI;AACvC,UAAM,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,OAAO,KAAK;AACnD,UAAM,IAAI;AACV,UAAM,IAAI;AAEV,UAAM,IAAI,EAAE,KAAK,EAAE;AACnB,UAAM,IAAI,EAAE,KAAK,EAAE;AACnB,UAAMD,KAAI,EAAE,KAAK,IAAI,EAAE;AACvB,UAAM,IAAI,EAAE,KAAK,EAAE;AACnB,UAAM,IAAI,GAAG,KAAK,OAAO,KAAK,MAAM,IAAI,CAAC;AACzC,UAAM,IAAI,EAAE,IAAIA,EAAC;AACjB,UAAMC,KAAI,EAAE,IAAID,EAAC;AACjB,UAAM,IAAI,EAAE,IAAI,IAAI,CAAC;AACrB,UAAM,KAAK,EAAE,IAAI,CAAC;AAClB,UAAM,KAAK,EAAEC,KAAI,CAAC;AAClB,UAAM,KAAK,EAAE,IAAI,CAAC;AAClB,UAAM,KAAK,EAAE,IAAIA,EAAC;AAClB,WAAO,IAAI,OAAM,IAAI,IAAI,IAAI,EAAE;AAAA,EACnC;AAAA,EACA,SAAS,OAAO;AACZ,WAAO,KAAK,IAAI,OAAO,KAAK,EAAE,OAAO,CAAC;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAS,GAAG,OAAO,MAAM;AACrB,QAAI,CAAC,SAAS,MAAM,MAAM,KAAK,IAAI;AAC/B,aAAO;AACX,gBAAY,GAAG,IAAI,CAAC;AACpB,QAAI,MAAM;AACN,aAAO;AACX,QAAI,KAAK,OAAO,CAAC;AACb,aAAO,KAAK,CAAC,EAAE;AAEnB,QAAI,IAAI;AACR,QAAI,IAAI;AACR,aAAS,IAAI,MAAM,IAAI,IAAI,IAAI,EAAE,OAAO,GAAG,MAAM,IAAI;AAGjD,UAAI,IAAI;AACJ,YAAI,EAAE,IAAI,CAAC;AAAA,eACN;AACL,YAAI,EAAE,IAAI,CAAC;AAAA,IACnB;AACA,WAAO;AAAA,EACX;AAAA,EACA,eAAe,QAAQ;AACnB,WAAO,KAAK,SAAS,QAAQ,KAAK;AAAA,EACtC;AAAA;AAAA,EAEA,WAAW;AACP,UAAM,EAAE,GAAG,GAAG,EAAE,IAAI;AAEpB,QAAI,KAAK,OAAO,CAAC;AACb,aAAO,EAAE,GAAG,IAAI,GAAG,GAAG;AAC1B,UAAM,KAAK,OAAO,GAAG,CAAC;AAEtB,QAAI,EAAE,IAAI,EAAE,MAAM;AACd,UAAI,iBAAiB;AAEzB,UAAM,IAAI,EAAE,IAAI,EAAE;AAClB,UAAM,IAAI,EAAE,IAAI,EAAE;AAClB,WAAO,EAAE,GAAG,EAAE;AAAA,EAClB;AAAA,EACA,UAAU;AACN,UAAM,EAAE,GAAG,EAAE,IAAI,KAAK,eAAe,EAAE,SAAS;AAChD,UAAM,IAAI,WAAW,CAAC;AAEtB,MAAE,EAAE,KAAK,IAAI,KAAK,MAAO;AACzB,WAAO;AAAA,EACX;AAAA,EACA,QAAQ;AACJ,WAAO,WAAW,KAAK,QAAQ,CAAC;AAAA,EACpC;AAAA,EACA,gBAAgB;AACZ,WAAO,KAAK,SAAS,IAAI,CAAC,GAAG,KAAK;AAAA,EACtC;AAAA,EACA,eAAe;AACX,WAAO,KAAK,cAAc,EAAE,IAAI;AAAA,EACpC;AAAA,EACA,gBAAgB;AAEZ,QAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE,OAAO;AAC5C,QAAI,IAAI;AACJ,UAAI,EAAE,IAAI,IAAI;AAClB,WAAO,EAAE,IAAI;AAAA,EACjB;AACJ;AAEA,IAAM,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC;AAE1C,IAAM,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,EAAE;AAElC,MAAM,OAAO;AACb,MAAM,OAAO;AACb,IAAM,aAAa,CAACC,SAAQ,WAAW,KAAK,YAAYA,MAAK,IAAI,IAAI,GAAG,EAAE,CAAC,EAAE,QAAQ;AACrF,IAAM,eAAe,CAAC,MAAM,IAAI,OAAO,WAAW,KAAK,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC5E,IAAM,OAAO,CAAC,GAAG,UAAU;AAEvB,MAAI,IAAI;AACR,SAAO,UAAU,IAAI;AACjB,SAAK;AACL,SAAK;AAAA,EACT;AACA,SAAO;AACX;AAEA,IAAM,cAAc,CAAC,MAAM;AACvB,QAAM,KAAM,IAAI,IAAK;AACrB,QAAM,KAAM,KAAK,IAAK;AACtB,QAAM,KAAM,KAAK,IAAI,EAAE,IAAI,KAAM;AACjC,QAAM,KAAM,KAAK,IAAI,EAAE,IAAI,IAAK;AAChC,QAAM,MAAO,KAAK,IAAI,EAAE,IAAI,KAAM;AAClC,QAAM,MAAO,KAAK,KAAK,GAAG,IAAI,MAAO;AACrC,QAAM,MAAO,KAAK,KAAK,GAAG,IAAI,MAAO;AACrC,QAAM,MAAO,KAAK,KAAK,GAAG,IAAI,MAAO;AACrC,QAAM,OAAQ,KAAK,KAAK,GAAG,IAAI,MAAO;AACtC,QAAM,OAAQ,KAAK,MAAM,GAAG,IAAI,MAAO;AACvC,QAAM,OAAQ,KAAK,MAAM,GAAG,IAAI,MAAO;AACvC,QAAM,YAAa,KAAK,MAAM,EAAE,IAAI,IAAK;AACzC,SAAO,EAAE,WAAW,GAAG;AAC3B;AACA,IAAM,MAAM;AAGZ,IAAM,UAAU,CAAC,GAAG,MAAM;AACtB,QAAM,KAAK,EAAE,IAAI,IAAI,CAAC;AACtB,QAAM,KAAK,EAAE,KAAK,KAAK,CAAC;AACxB,QAAM,MAAM,YAAY,IAAI,EAAE,EAAE;AAChC,MAAI,IAAI,EAAE,IAAI,KAAK,GAAG;AACtB,QAAM,MAAM,EAAE,IAAI,IAAI,CAAC;AACvB,QAAM,QAAQ;AACd,QAAM,QAAQ,EAAE,IAAI,GAAG;AACvB,QAAM,WAAW,QAAQ;AACzB,QAAM,WAAW,QAAQ,EAAE,CAAC,CAAC;AAC7B,QAAM,SAAS,QAAQ,EAAE,CAAC,IAAI,GAAG;AACjC,MAAI;AACA,QAAI;AACR,MAAI,YAAY;AACZ,QAAI;AACR,OAAK,EAAE,CAAC,IAAI,QAAQ;AAChB,QAAI,EAAE,CAAC,CAAC;AACZ,SAAO,EAAE,SAAS,YAAY,UAAU,OAAO,EAAE;AACrD;AAEA,IAAM,UAAU,CAAC,SAAS,KAAK,aAAa,IAAI,CAAC;AAIjD,IAAM,UAAU,IAAI,MAAM,SAAS,QAAQ,EAAE,YAAY,GAAG,CAAC,CAAC;AAsB9D,IAAM,cAAc,CAAC,QAAQ,IAAI,OAAO,QAAQ,IAAI,QAAQ,CAAC;AAkC7D,IAAM,oBAAoB,EAAE,QAAQ,KAAK;AACzC,IAAM,UAAU,CAAC,KAAK,KAAK,KAAK,OAAO,sBAAsB;AACzD,QAAM,OAAO,KAAK,EAAE;AACpB,QAAM,OAAO,GAAG;AAChB,QAAM,OAAO,KAAK,CAAC;AACnB,QAAM,EAAE,OAAO,IAAI;AACnB,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI,WAAW,WAAW,GAAG;AAC7B,MAAI;AACA,QAAI,MAAM,UAAU,KAAK,MAAM;AAC/B,QAAI,MAAM,UAAU,IAAI,MAAM,GAAG,CAAC,GAAG,MAAM;AAC3C,QAAI,aAAa,IAAI,MAAM,GAAG,EAAE,CAAC;AACjC,SAAK,EAAE,SAAS,GAAG,KAAK;AACxB,eAAW,YAAY,EAAE,QAAQ,GAAG,EAAE,QAAQ,GAAG,GAAG;AAAA,EACxD,SACO,OAAO;AAAA,EAAE;AAChB,QAAM,SAAS,CAAC,WAAW;AAEvB,QAAI,MAAM;AACN,aAAO;AACX,QAAI,CAAC,UAAU,EAAE,aAAa;AAC1B,aAAO;AACX,UAAM,IAAI,QAAQ,MAAM;AACxB,UAAM,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,KAAK,CAAC;AACtC,WAAO,IAAI,IAAI,GAAG,OAAO,CAAC,EAAE,cAAc,EAAE,IAAI;AAAA,EACpD;AACA,SAAO,EAAE,UAAU,OAAO;AAC9B;AAIA,IAAM,SAAS,CAAC,WAAW,SAAS,WAAW,OAAO,sBAAsB,YAAY,QAAQ,WAAW,SAAS,WAAW,IAAI,CAAC;AAUpI,IAAM,SAAS;AAAA,EACX,aAAa,OAAO,YAAY;AAC5B,UAAM,IAAI,OAAO;AACjB,UAAM,IAAI,YAAY,OAAO;AAC7B,WAAO,IAAI,MAAM,EAAE,OAAO,WAAW,EAAE,MAAM,CAAC;AAAA,EAClD;AAAA,EACA,QAAQ;AACZ;AAsBA,IAAM,IAAI;AACV,IAAM,aAAa;AACnB,IAAM,WAAW,KAAK,KAAK,aAAa,CAAC,IAAI;AAC7C,IAAM,cAAc,MAAM,IAAI;AAC9B,IAAM,aAAa,MAAM;AACrB,QAAM,SAAS,CAAC;AAChB,MAAI,IAAI;AACR,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AAC/B,QAAI;AACJ,WAAO,KAAK,CAAC;AACb,aAAS,IAAI,GAAG,IAAI,aAAa,KAAK;AAClC,UAAI,EAAE,IAAI,CAAC;AACX,aAAO,KAAK,CAAC;AAAA,IACjB;AACA,QAAI,EAAE,OAAO;AAAA,EACjB;AACA,SAAO;AACX;AACA,IAAI,QAAQ;AAEZ,IAAM,QAAQ,CAAC,KAAK,MAAM;AACtB,QAAM,IAAI,EAAE,OAAO;AACnB,SAAO,MAAM,IAAI;AACrB;AAYA,IAAM,OAAO,CAAC,MAAM;AAChB,QAAM,OAAO,UAAU,QAAQ,WAAW;AAC1C,MAAI,IAAI;AACR,MAAI,IAAI;AACR,QAAM,UAAU,KAAK;AACrB,QAAM,SAAS;AACf,QAAM,OAAO,IAAI,UAAU,CAAC;AAC5B,QAAM,UAAU,IAAI,CAAC;AACrB,WAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AAC/B,QAAI,QAAQ,OAAO,IAAI,IAAI;AAC3B,UAAM;AAMN,QAAI,QAAQ,aAAa;AACrB,eAAS;AACT,WAAK;AAAA,IACT;AACA,UAAM,MAAM,IAAI;AAChB,UAAM,OAAO;AACb,UAAM,OAAO,MAAM,KAAK,IAAI,KAAK,IAAI;AACrC,UAAM,SAAS,IAAI,MAAM;AACzB,UAAM,QAAQ,QAAQ;AACtB,QAAI,UAAU,GAAG;AAEb,UAAI,EAAE,IAAI,MAAM,QAAQ,KAAK,IAAI,CAAC,CAAC;AAAA,IACvC,OACK;AACD,UAAI,EAAE,IAAI,MAAM,OAAO,KAAK,IAAI,CAAC,CAAC;AAAA,IACtC;AAAA,EACJ;AACA,MAAI,MAAM;AACN,QAAI,cAAc;AACtB,SAAO,EAAE,GAAG,EAAE;AAClB;;;ACpmBM,SAAUC,SAAQ,GAAU;AAChC,SAAO,aAAa,cAAe,YAAY,OAAO,CAAC,KAAK,EAAE,YAAY,SAAS;AACrF;AAQM,SAAUC,QAAO,MAA8B,SAAiB;AACpE,MAAI,CAACC,SAAQ,CAAC;AAAG,UAAM,IAAI,MAAM,qBAAqB;AACtD,MAAI,QAAQ,SAAS,KAAK,CAAC,QAAQ,SAAS,EAAE,MAAM;AAClD,UAAM,IAAI,MAAM,mCAAmC,UAAU,kBAAkB,EAAE,MAAM;AAC3F;AAWM,SAAU,QAAQ,UAAe,gBAAgB,MAAI;AACzD,MAAI,SAAS;AAAW,UAAM,IAAI,MAAM,kCAAkC;AAC1E,MAAI,iBAAiB,SAAS;AAAU,UAAM,IAAI,MAAM,uCAAuC;AACjG;AAGM,SAAU,QAAQ,KAAU,UAAa;AAC7C,EAAAC,QAAO,GAAG;AACV,QAAM,MAAM,SAAS;AACrB,MAAI,IAAI,SAAS,KAAK;AACpB,UAAM,IAAI,MAAM,2DAA2D,GAAG;EAChF;AACF;AAkBM,SAAU,SAAS,QAAoB;AAC3C,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,WAAO,CAAC,EAAE,KAAK,CAAC;EAClB;AACF;AAGM,SAAU,WAAW,KAAe;AACxC,SAAO,IAAI,SAAS,IAAI,QAAQ,IAAI,YAAY,IAAI,UAAU;AAChE;AAuIM,SAAU,YAAYC,MAAW;AACrC,MAAI,OAAOA,SAAQ;AAAU,UAAM,IAAI,MAAM,iBAAiB;AAC9D,SAAO,IAAI,WAAW,IAAI,YAAW,EAAG,OAAOA,IAAG,CAAC;AACrD;AAiBM,SAAU,QAAQ,MAAW;AACjC,MAAI,OAAO,SAAS;AAAU,WAAO,YAAY,IAAI;AACrD,EAAAC,QAAO,IAAI;AACX,SAAO;AACT;AAmDM,IAAgB,OAAhB,MAAoB;;AA4CpB,SAAU,aACd,UAAuB;AAOvB,QAAM,QAAQ,CAAC,QAA2B,SAAQ,EAAG,OAAO,QAAQ,GAAG,CAAC,EAAE,OAAM;AAChF,QAAM,MAAM,SAAQ;AACpB,QAAM,YAAY,IAAI;AACtB,QAAM,WAAW,IAAI;AACrB,QAAM,SAAS,MAAM,SAAQ;AAC7B,SAAO;AACT;;;ACpVM,SAAU,aACd,MACA,YACA,OACA,MAAa;AAEb,MAAI,OAAO,KAAK,iBAAiB;AAAY,WAAO,KAAK,aAAa,YAAY,OAAO,IAAI;AAC7F,QAAMC,QAAO,OAAO,EAAE;AACtB,QAAM,WAAW,OAAO,UAAU;AAClC,QAAM,KAAK,OAAQ,SAASA,QAAQ,QAAQ;AAC5C,QAAM,KAAK,OAAO,QAAQ,QAAQ;AAClC,QAAMC,KAAI,OAAO,IAAI;AACrB,QAAM,IAAI,OAAO,IAAI;AACrB,OAAK,UAAU,aAAaA,IAAG,IAAI,IAAI;AACvC,OAAK,UAAU,aAAa,GAAG,IAAI,IAAI;AACzC;AAgBM,IAAgB,SAAhB,cAAoD,KAAO;EAoB/D,YAAY,UAAkB,WAAmB,WAAmB,MAAa;AAC/E,UAAK;AANG,SAAA,WAAW;AACX,SAAA,SAAS;AACT,SAAA,MAAM;AACN,SAAA,YAAY;AAIpB,SAAK,WAAW;AAChB,SAAK,YAAY;AACjB,SAAK,YAAY;AACjB,SAAK,OAAO;AACZ,SAAK,SAAS,IAAI,WAAW,QAAQ;AACrC,SAAK,OAAO,WAAW,KAAK,MAAM;EACpC;EACA,OAAO,MAAW;AAChB,YAAQ,IAAI;AACZ,WAAO,QAAQ,IAAI;AACnB,IAAAC,QAAO,IAAI;AACX,UAAM,EAAE,MAAM,QAAQ,SAAQ,IAAK;AACnC,UAAM,MAAM,KAAK;AACjB,aAAS,MAAM,GAAG,MAAM,OAAO;AAC7B,YAAM,OAAO,KAAK,IAAI,WAAW,KAAK,KAAK,MAAM,GAAG;AAEpD,UAAI,SAAS,UAAU;AACrB,cAAM,WAAW,WAAW,IAAI;AAChC,eAAO,YAAY,MAAM,KAAK,OAAO;AAAU,eAAK,QAAQ,UAAU,GAAG;AACzE;MACF;AACA,aAAO,IAAI,KAAK,SAAS,KAAK,MAAM,IAAI,GAAG,KAAK,GAAG;AACnD,WAAK,OAAO;AACZ,aAAO;AACP,UAAI,KAAK,QAAQ,UAAU;AACzB,aAAK,QAAQ,MAAM,CAAC;AACpB,aAAK,MAAM;MACb;IACF;AACA,SAAK,UAAU,KAAK;AACpB,SAAK,WAAU;AACf,WAAO;EACT;EACA,WAAW,KAAe;AACxB,YAAQ,IAAI;AACZ,YAAQ,KAAK,IAAI;AACjB,SAAK,WAAW;AAIhB,UAAM,EAAE,QAAQ,MAAM,UAAU,KAAI,IAAK;AACzC,QAAI,EAAE,IAAG,IAAK;AAEd,WAAO,KAAK,IAAI;AAChB,UAAM,KAAK,OAAO,SAAS,GAAG,CAAC;AAG/B,QAAI,KAAK,YAAY,WAAW,KAAK;AACnC,WAAK,QAAQ,MAAM,CAAC;AACpB,YAAM;IACR;AAEA,aAAS,IAAI,KAAK,IAAI,UAAU;AAAK,aAAO,CAAC,IAAI;AAIjD,iBAAa,MAAM,WAAW,GAAG,OAAO,KAAK,SAAS,CAAC,GAAG,IAAI;AAC9D,SAAK,QAAQ,MAAM,CAAC;AACpB,UAAM,QAAQ,WAAW,GAAG;AAC5B,UAAM,MAAM,KAAK;AAEjB,QAAI,MAAM;AAAG,YAAM,IAAI,MAAM,6CAA6C;AAC1E,UAAM,SAAS,MAAM;AACrB,UAAM,QAAQ,KAAK,IAAG;AACtB,QAAI,SAAS,MAAM;AAAQ,YAAM,IAAI,MAAM,oCAAoC;AAC/E,aAAS,IAAI,GAAG,IAAI,QAAQ;AAAK,YAAM,UAAU,IAAI,GAAG,MAAM,CAAC,GAAG,IAAI;EACxE;EACA,SAAM;AACJ,UAAM,EAAE,QAAQ,UAAS,IAAK;AAC9B,SAAK,WAAW,MAAM;AACtB,UAAM,MAAM,OAAO,MAAM,GAAG,SAAS;AACrC,SAAK,QAAO;AACZ,WAAO;EACT;EACA,WAAW,IAAM;AACf,WAAA,KAAO,IAAK,KAAK,YAAmB;AACpC,OAAG,IAAI,GAAG,KAAK,IAAG,CAAE;AACpB,UAAM,EAAE,UAAU,QAAQ,QAAQ,UAAU,WAAW,IAAG,IAAK;AAC/D,OAAG,YAAY;AACf,OAAG,WAAW;AACd,OAAG,SAAS;AACZ,OAAG,MAAM;AACT,QAAI,SAAS;AAAU,SAAG,OAAO,IAAI,MAAM;AAC3C,WAAO;EACT;EACA,QAAK;AACH,WAAO,KAAK,WAAU;EACxB;;AAyBK,IAAM,YAAyC,4BAAY,KAAK;EACrE;EAAY;EAAY;EAAY;EAAY;EAAY;EAAY;EAAY;EACpF;EAAY;EAAY;EAAY;EAAY;EAAY;EAAY;EAAY;CACrF;;;AC1KD,IAAM,aAA6B,uBAAO,KAAK,KAAK,CAAC;AACrD,IAAM,OAAuB,uBAAO,EAAE;AAEtC,SAAS,QACP,GACA,KAAK,OAAK;AAKV,MAAI;AAAI,WAAO,EAAE,GAAG,OAAO,IAAI,UAAU,GAAG,GAAG,OAAQ,KAAK,OAAQ,UAAU,EAAC;AAC/E,SAAO,EAAE,GAAG,OAAQ,KAAK,OAAQ,UAAU,IAAI,GAAG,GAAG,OAAO,IAAI,UAAU,IAAI,EAAC;AACjF;AAEA,SAAS,MAAM,KAAe,KAAK,OAAK;AACtC,QAAM,MAAM,IAAI;AAChB,MAAI,KAAK,IAAI,YAAY,GAAG;AAC5B,MAAI,KAAK,IAAI,YAAY,GAAG;AAC5B,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,UAAM,EAAE,GAAAC,IAAG,EAAC,IAAK,QAAQ,IAAI,CAAC,GAAG,EAAE;AACnC,KAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAACA,IAAG,CAAC;EACxB;AACA,SAAO,CAAC,IAAI,EAAE;AAChB;AAIA,IAAM,QAAQ,CAACC,IAAW,IAAY,MAAsBA,OAAM;AAClE,IAAM,QAAQ,CAACA,IAAW,GAAW,MAAuBA,MAAM,KAAK,IAAO,MAAM;AAEpF,IAAM,SAAS,CAACA,IAAW,GAAW,MAAuBA,OAAM,IAAM,KAAM,KAAK;AACpF,IAAM,SAAS,CAACA,IAAW,GAAW,MAAuBA,MAAM,KAAK,IAAO,MAAM;AAErF,IAAM,SAAS,CAACA,IAAW,GAAW,MAAuBA,MAAM,KAAK,IAAO,MAAO,IAAI;AAC1F,IAAM,SAAS,CAACA,IAAW,GAAW,MAAuBA,OAAO,IAAI,KAAQ,KAAM,KAAK;AAa3F,SAAS,IACP,IACA,IACA,IACA,IAAU;AAKV,QAAM,KAAK,OAAO,MAAM,OAAO;AAC/B,SAAO,EAAE,GAAI,KAAK,MAAO,IAAI,KAAK,KAAM,KAAM,GAAG,GAAG,IAAI,EAAC;AAC3D;AAEA,IAAM,QAAQ,CAAC,IAAY,IAAY,QAAwB,OAAO,MAAM,OAAO,MAAM,OAAO;AAChG,IAAM,QAAQ,CAAC,KAAa,IAAY,IAAY,OACjD,KAAK,KAAK,MAAO,MAAM,KAAK,KAAM,KAAM;AAC3C,IAAM,QAAQ,CAAC,IAAY,IAAY,IAAY,QAChD,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO;AACjD,IAAM,QAAQ,CAAC,KAAa,IAAY,IAAY,IAAY,OAC7D,KAAK,KAAK,KAAK,MAAO,MAAM,KAAK,KAAM,KAAM;AAChD,IAAM,QAAQ,CAAC,IAAY,IAAY,IAAY,IAAY,QAC5D,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO;AAC9D,IAAM,QAAQ,CAAC,KAAa,IAAY,IAAY,IAAY,IAAY,OACzE,KAAK,KAAK,KAAK,KAAK,MAAO,MAAM,KAAK,KAAM,KAAM;;;ACmDrD,IAAM,OAAwB,uBAAU,MAAM;EAC5C;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE;EAAsB;EAAsB;EAAsB;EAClE,IAAI,OAAK,OAAO,CAAC,CAAC,CAAC,GAAE;AACvB,IAAM,YAA6B,uBAAM,KAAK,CAAC,GAAE;AACjD,IAAM,YAA6B,uBAAM,KAAK,CAAC,GAAE;AAGjD,IAAM,aAA6B,oBAAI,YAAY,EAAE;AACrD,IAAM,aAA6B,oBAAI,YAAY,EAAE;AAE/C,IAAO,SAAP,cAAsB,OAAc;EAqBxC,YAAY,YAAoB,IAAE;AAChC,UAAM,KAAK,WAAW,IAAI,KAAK;AAlBvB,SAAA,KAAa,UAAU,CAAC,IAAI;AAC5B,SAAA,KAAa,UAAU,CAAC,IAAI;AAC5B,SAAA,KAAa,UAAU,CAAC,IAAI;AAC5B,SAAA,KAAa,UAAU,CAAC,IAAI;AAC5B,SAAA,KAAa,UAAU,CAAC,IAAI;AAC5B,SAAA,KAAa,UAAU,CAAC,IAAI;AAC5B,SAAA,KAAa,UAAU,CAAC,IAAI;AAC5B,SAAA,KAAa,UAAU,CAAC,IAAI;AAC5B,SAAA,KAAa,UAAU,CAAC,IAAI;AAC5B,SAAA,KAAa,UAAU,CAAC,IAAI;AAC5B,SAAA,KAAa,UAAU,EAAE,IAAI;AAC7B,SAAA,KAAa,UAAU,EAAE,IAAI;AAC7B,SAAA,KAAa,UAAU,EAAE,IAAI;AAC7B,SAAA,KAAa,UAAU,EAAE,IAAI;AAC7B,SAAA,KAAa,UAAU,EAAE,IAAI;AAC7B,SAAA,KAAa,UAAU,EAAE,IAAI;EAIvC;;EAEU,MAAG;AAIX,UAAM,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAE,IAAK;AAC3E,WAAO,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;EACxE;;EAEU,IACR,IAAY,IAAY,IAAY,IAAY,IAAY,IAAY,IAAY,IACpF,IAAY,IAAY,IAAY,IAAY,IAAY,IAAY,IAAY,IAAU;AAE9F,SAAK,KAAK,KAAK;AACf,SAAK,KAAK,KAAK;AACf,SAAK,KAAK,KAAK;AACf,SAAK,KAAK,KAAK;AACf,SAAK,KAAK,KAAK;AACf,SAAK,KAAK,KAAK;AACf,SAAK,KAAK,KAAK;AACf,SAAK,KAAK,KAAK;AACf,SAAK,KAAK,KAAK;AACf,SAAK,KAAK,KAAK;AACf,SAAK,KAAK,KAAK;AACf,SAAK,KAAK,KAAK;AACf,SAAK,KAAK,KAAK;AACf,SAAK,KAAK,KAAK;AACf,SAAK,KAAK,KAAK;AACf,SAAK,KAAK,KAAK;EACjB;EACU,QAAQ,MAAgB,QAAc;AAE9C,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK,UAAU,GAAG;AACxC,iBAAW,CAAC,IAAI,KAAK,UAAU,MAAM;AACrC,iBAAW,CAAC,IAAI,KAAK,UAAW,UAAU,CAAE;IAC9C;AACA,aAAS,IAAI,IAAI,IAAI,IAAI,KAAK;AAE5B,YAAM,OAAO,WAAW,IAAI,EAAE,IAAI;AAClC,YAAM,OAAO,WAAW,IAAI,EAAE,IAAI;AAClC,YAAM,MAAU,OAAO,MAAM,MAAM,CAAC,IAAQ,OAAO,MAAM,MAAM,CAAC,IAAQ,MAAM,MAAM,MAAM,CAAC;AAC3F,YAAM,MAAU,OAAO,MAAM,MAAM,CAAC,IAAQ,OAAO,MAAM,MAAM,CAAC,IAAQ,MAAM,MAAM,MAAM,CAAC;AAE3F,YAAM,MAAM,WAAW,IAAI,CAAC,IAAI;AAChC,YAAM,MAAM,WAAW,IAAI,CAAC,IAAI;AAChC,YAAM,MAAU,OAAO,KAAK,KAAK,EAAE,IAAQ,OAAO,KAAK,KAAK,EAAE,IAAQ,MAAM,KAAK,KAAK,CAAC;AACvF,YAAM,MAAU,OAAO,KAAK,KAAK,EAAE,IAAQ,OAAO,KAAK,KAAK,EAAE,IAAQ,MAAM,KAAK,KAAK,CAAC;AAEvF,YAAM,OAAW,MAAM,KAAK,KAAK,WAAW,IAAI,CAAC,GAAG,WAAW,IAAI,EAAE,CAAC;AACtE,YAAM,OAAW,MAAM,MAAM,KAAK,KAAK,WAAW,IAAI,CAAC,GAAG,WAAW,IAAI,EAAE,CAAC;AAC5E,iBAAW,CAAC,IAAI,OAAO;AACvB,iBAAW,CAAC,IAAI,OAAO;IACzB;AACA,QAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAE,IAAK;AAEzE,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAE3B,YAAM,UAAc,OAAO,IAAI,IAAI,EAAE,IAAQ,OAAO,IAAI,IAAI,EAAE,IAAQ,OAAO,IAAI,IAAI,EAAE;AACvF,YAAM,UAAc,OAAO,IAAI,IAAI,EAAE,IAAQ,OAAO,IAAI,IAAI,EAAE,IAAQ,OAAO,IAAI,IAAI,EAAE;AAEvF,YAAM,OAAQ,KAAK,KAAO,CAAC,KAAK;AAChC,YAAM,OAAQ,KAAK,KAAO,CAAC,KAAK;AAGhC,YAAM,OAAW,MAAM,IAAI,SAAS,MAAM,UAAU,CAAC,GAAG,WAAW,CAAC,CAAC;AACrE,YAAM,MAAU,MAAM,MAAM,IAAI,SAAS,MAAM,UAAU,CAAC,GAAG,WAAW,CAAC,CAAC;AAC1E,YAAM,MAAM,OAAO;AAEnB,YAAM,UAAc,OAAO,IAAI,IAAI,EAAE,IAAQ,OAAO,IAAI,IAAI,EAAE,IAAQ,OAAO,IAAI,IAAI,EAAE;AACvF,YAAM,UAAc,OAAO,IAAI,IAAI,EAAE,IAAQ,OAAO,IAAI,IAAI,EAAE,IAAQ,OAAO,IAAI,IAAI,EAAE;AACvF,YAAM,OAAQ,KAAK,KAAO,KAAK,KAAO,KAAK;AAC3C,YAAM,OAAQ,KAAK,KAAO,KAAK,KAAO,KAAK;AAC3C,WAAK,KAAK;AACV,WAAK,KAAK;AACV,WAAK,KAAK;AACV,WAAK,KAAK;AACV,WAAK,KAAK;AACV,WAAK,KAAK;AACV,OAAC,EAAE,GAAG,IAAI,GAAG,GAAE,IAAS,IAAI,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAC5D,WAAK,KAAK;AACV,WAAK,KAAK;AACV,WAAK,KAAK;AACV,WAAK,KAAK;AACV,WAAK,KAAK;AACV,WAAK,KAAK;AACV,YAAM,MAAU,MAAM,KAAK,SAAS,IAAI;AACxC,WAAS,MAAM,KAAK,KAAK,SAAS,IAAI;AACtC,WAAK,MAAM;IACb;AAEA,KAAC,EAAE,GAAG,IAAI,GAAG,GAAE,IAAS,IAAI,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AACpE,KAAC,EAAE,GAAG,IAAI,GAAG,GAAE,IAAS,IAAI,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AACpE,KAAC,EAAE,GAAG,IAAI,GAAG,GAAE,IAAS,IAAI,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AACpE,KAAC,EAAE,GAAG,IAAI,GAAG,GAAE,IAAS,IAAI,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AACpE,KAAC,EAAE,GAAG,IAAI,GAAG,GAAE,IAAS,IAAI,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AACpE,KAAC,EAAE,GAAG,IAAI,GAAG,GAAE,IAAS,IAAI,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AACpE,KAAC,EAAE,GAAG,IAAI,GAAG,GAAE,IAAS,IAAI,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AACpE,KAAC,EAAE,GAAG,IAAI,GAAG,GAAE,IAAS,IAAI,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AACpE,SAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;EACzE;EACU,aAAU;AAClB,UAAM,YAAY,UAAU;EAC9B;EACA,UAAO;AACL,UAAM,KAAK,MAAM;AACjB,SAAK,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;EACzD;;AAuGK,IAAM,SAAgC,6BAAa,MAAM,IAAI,OAAM,CAAE;;;AC7X5E,OAAO,SAAS;AAEhB,SAAS,iBAAiB,GAAuB;AAC/C,QAAM,MAAM,EAAE,SAAS;AACvB,QAAM,SAAS,EAAE,QAAQ,MAAM,GAAG,EAAE,QAAQ,MAAM,GAAG,KAAK,MAAM,IAAI,OAAO,IAAI,GAAG,IAAI;AACtF,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO,IAAI,WAAW,OAAO,KAAK,QAAQ,QAAQ,CAAC;AAAA,EACrD;AACA,QAAM,SAAS,KAAK,MAAM;AAC1B,SAAO,WAAW,KAAK,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AACvD;AAEA,eAAsB,2BAA2B,QAQZ;AACnC,MAAI;AACF,UAAM,EAAE,SAAS,iBAAiB,IAAI,IAAI;AAE1C,QAAI;AAEJ,QAAI,IAAI,KAAK;AACX,UAAI,IAAI,IAAI,QAAQ,SAAS,IAAI,IAAI,QAAQ,WAAW;AACtD,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,MAAM,cAAc;AAAA,UACpB,SAAS;AAAA,YACP,kDAAkD,IAAI,IAAI,GAAG,QAAQ,IAAI,IAAI,GAAG;AAAA,UAClF;AAAA,QACF;AAAA,MACF;AACA,oBAAc,iBAAiB,IAAI,IAAI,CAAC;AAAA,IAC1C,WAAW,IAAI,WAAW;AACxB,oBAAc,iBAAiB,IAAI,SAAS;AAAA,IAC9C,WAAW,IAAI,SAAS;AACtB,YAAM,YAAY,iBAAiB,IAAI,OAAO;AAC9C,UAAI,UAAU,SAAS,IAAI;AACzB,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,MAAM,cAAc;AAAA,UACpB,SAAS,CAAC,kDAAkD;AAAA,QAC9D;AAAA,MACF;AACA,oBAAc,UAAU,MAAM,UAAU,SAAS,EAAE;AAAA,IACrD,OAAO;AACL,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM,cAAc;AAAA,QACpB,SAAS,CAAC,2DAA2D;AAAA,MACvE;AAAA,IACF;AAEA,QAAI,YAAY,WAAW,IAAI;AAC7B,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM,cAAc;AAAA,QACpB,SAAS,CAAC,4CAA4C,YAAY,MAAM,EAAE;AAAA,MAC5E;AAAA,IACF;AAEA,UAAM,WAAW,iBAAiB,eAAe;AAEjD,QAAI,SAAS,WAAW,IAAI;AAC1B,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM,cAAc;AAAA,QACpB,SAAS,CAAC,2CAA2C,SAAS,MAAM,EAAE;AAAA,MACxE;AAAA,IACF;AAEA,UAAM,WAAW,IAAI,YAAY,EAAE,OAAO,gBAAgB,OAAO,CAAC;AAElE,UAAM,UAAU,MAAM,OAAO,UAAU,UAAU,WAAW;AAE5D,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM,cAAc;AAAA,QACpB,SAAS,CAAC,uCAAuC;AAAA,MACnD;AAAA,IACF;AAEA,WAAO,EAAE,IAAI,MAAM,MAAM,cAAc,GAAG;AAAA,EAC5C,SAASC,MAAK;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM,cAAc;AAAA,MACpB,SAAS,CAACA,gBAAe,QAAQA,KAAI,UAAU,OAAOA,IAAG,CAAC;AAAA,IAC5D;AAAA,EACF;AACF;AAEA,eAAsB,cAAc,SAA4C;AAC9E,QAAM,MAAM,GAAG,QAAQ,QAAQ,QAAQ,EAAE,CAAC;AAC1C,QAAM,WAAW,MAAM,MAAM,GAAG;AAChC,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,kCAAkC,GAAG,UAAU,SAAS,MAAM,EAAE;AAAA,EAClF;AACA,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,MAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C,UAAM,IAAI,MAAM,qCAAqC;AAAA,EACvD;AACA,QAAM,MAAM;AACZ,MAAI,OAAO,IAAI,WAAW,YAAY,CAAC,MAAM,QAAQ,IAAI,IAAI,GAAG;AAC9D,UAAM,IAAI,MAAM,2DAA2D;AAAA,EAC7E;AACA,SAAO;AACT;AAMO,SAAS,cAAc,KAAuB,KAA+B;AAClF,MAAI,KAAK;AACP,UAAM,QAAQ,IAAI,KAAK,KAAK,CAAC,MAAM,EAAE,QAAQ,GAAG;AAChD,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,QACL,OAAO;AAAA,UACL,IAAI;AAAA,UACJ,MAAM,cAAc;AAAA,UACpB,SAAS,CAAC,iBAAiB,GAAG,mCAAmC;AAAA,QACnE;AAAA,MACF;AAAA,IACF;AACA,WAAO,EAAE,KAAK,MAAM;AAAA,EACtB;AAEA,MAAI,IAAI,WAAW;AACjB,UAAM,QAAQ,IAAI,KAAK,KAAK,CAAC,MAAM,EAAE,QAAQ,IAAI,SAAS;AAC1D,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,QACL,OAAO;AAAA,UACL,IAAI;AAAA,UACJ,MAAM,cAAc;AAAA,UACpB,SAAS,CAAC,cAAc,IAAI,SAAS,2BAA2B;AAAA,QAClE;AAAA,MACF;AAAA,IACF;AACA,WAAO,EAAE,KAAK,MAAM;AAAA,EACtB;AAEA,MAAI,IAAI,KAAK,WAAW,GAAG;AACzB,WAAO;AAAA,MACL,OAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM,cAAc;AAAA,QACpB,SAAS,CAAC,yCAAyC;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,KAAK,IAAI,KAAK,CAAC,EAAE;AAC5B;AAEA,SAAS,2BAA2B,QAI3B;AACP,MAAI,OAAO,WAAW,YAAY,WAAW,KAAM,QAAO;AAC1D,QAAM,IAAI;AAEV,MAAI,OAAO,EAAE,YAAY,YAAY,EAAE,YAAY,QAAQ,OAAO,EAAE,cAAc,UAAU;AAC1F,WAAO;AAAA,MACL,SAAS,EAAE;AAAA,MACX,iBAAiB,EAAE;AAAA,MACnB,eAAe,OAAO,EAAE,kBAAkB,WAAW,EAAE,gBAAgB;AAAA,IACzE;AAAA,EACF;AAEA,MAAI,OAAO,EAAE,SAAS,YAAY,EAAE,SAAS,MAAM;AACjD,UAAM,OAAO,EAAE;AACf,QAAI,OAAO,KAAK,gBAAgB,YAAY,KAAK,gBAAgB,MAAM;AACrE,YAAM,MAAM,KAAK;AACjB,UAAI,OAAO,IAAI,YAAY,YAAY,IAAI,YAAY,QAAQ,OAAO,IAAI,cAAc,UAAU;AAChG,eAAO;AAAA,UACL,SAAS,IAAI;AAAA,UACb,iBAAiB,IAAI;AAAA,UACrB,eAAe,OAAO,IAAI,kBAAkB,WAAW,IAAI,gBAAgB;AAAA,QAC7E;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,wBACpB,QACA,SACkC;AAClC,QAAM,YAAY,2BAA2B,MAAM;AAEnD,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM,cAAc;AAAA,MACpB,SAAS,CAAC,gFAAgF;AAAA,IAC5F;AAAA,EACF;AAEA,QAAM,SAAS,UAAU,QAAQ;AACjC,QAAM,cAAc,QAAQ,OAAO,UAAU,iBAAiB,UAAU,QAAQ;AAEhF,WAAS,MAAgB;AACvB,UAAM,QAAkB,CAAC;AACzB,QAAI,OAAQ,OAAM,KAAK,WAAW,MAAM,EAAE;AAC1C,QAAI,YAAa,OAAM,KAAK,QAAQ,WAAW,EAAE;AACjD,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI;AACF,cAAU,MAAM,cAAc,QAAQ,OAAO;AAAA,EAC/C,SAASA,MAAK;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM,cAAc;AAAA,MACpB,SAAS,CAAC,GAAG,IAAI,GAAGA,gBAAe,QAAQA,KAAI,UAAU,OAAOA,IAAG,CAAC;AAAA,IACtE;AAAA,EACF;AAEA,MAAI,OAAQ,OAAmC,oBAAoB,UAAU;AAC3E,UAAM,iBAAkB,OAAmC;AAC3D,QAAI,UAAU,QAAQ,oBAAoB,gBAAgB;AACxD,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM,cAAc;AAAA,QACpB,SAAS;AAAA,UACP;AAAA,UACA,4BAA4B,UAAU,QAAQ,eAAe;AAAA,UAC7D,4BAA4B,cAAc;AAAA,UAC1C,GAAG,IAAI;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,cAAc,SAAS,WAAW;AACnD,MAAI,SAAS,OAAO;AAClB,WAAO;AAAA,MACL,GAAG,SAAS;AAAA,MACZ,SAAS,CAAC,GAAG,IAAI,GAAG,GAAI,SAAS,MAAM,WAAW,CAAC,CAAE;AAAA,IACvD;AAAA,EACF;AACA,QAAM,WAAW,SAAS;AAE1B,QAAM,WAAoE,CAAC;AAC3E,MAAI,SAAS,aAAc,UAAS,MAAM,SAAS;AAAA,WAC1C,SAAS,UAAW,UAAS,YAAY,SAAS;AAAA,WAClD,SAAS,iBAAkB,UAAS,UAAU,SAAS;AAAA,OAC3D;AACH,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM,cAAc;AAAA,MACpB,SAAS;AAAA,QACP,YAAY,SAAS,GAAG;AAAA,QACxB,GAAG,IAAI;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,2BAA2B;AAAA,IACjD,SAAS,UAAU;AAAA,IACnB,iBAAiB,UAAU;AAAA,IAC3B,KAAK;AAAA,EACP,CAAC;AAED,QAAM,eAAe,IAAI;AACzB,MAAI,aAAa,WAAW,EAAG,QAAO;AAEtC,SAAO,UAAU,KACb,EAAE,IAAI,MAAM,MAAM,cAAc,IAAI,SAAS,aAAa,IAC1D,EAAE,GAAG,WAAW,SAAS,CAAC,GAAG,cAAc,GAAI,UAAU,WAAW,CAAC,CAAE,EAAE;AAC/E;;;ACjRA,IAAAC,UAAwB;;;ACyBxB,SAAS,IAAI,GAA2B;AACtC,SAAO,OAAO,MAAM,YAAY,EAAE,SAAS,IAAI,IAAI;AACrD;AAEA,SAAS,IAAI,GAAY,UAA0B;AACjD,SAAO,OAAO,MAAM,YAAY,OAAO,SAAS,CAAC,IAAI,IAAI;AAC3D;AAEA,SAAS,UAAU,GAA2B;AAC5C,SAAO,OAAO,MAAM,YAAY,OAAO,SAAS,CAAC,IAAI,IAAI;AAC3D;AAGA,SAAS,qBAAqB,UAAkD;AAC9E,QAAM,UAAU,SAAS;AACzB,MAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,QAAQ,WAAW,EAAG,QAAO;AAC5D,QAAM,QAAQ,QAAQ,CAAC;AACvB,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,MAAM,MAAM;AAClB,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAE5C,MAAI,OAAO,IAAI,YAAY,SAAU,QAAO,IAAI;AAChD,MAAI,MAAM,QAAQ,IAAI,OAAO,GAAG;AAC9B,UAAM,QAAS,IAAI,QAChB,OAAO,CAAC,MAAoC,OAAO,MAAM,YAAY,MAAM,IAAI,EAC/E,IAAI,CAAC,MAAM,IAAK,EAA8B,IAAI,CAAC,EACnD,OAAO,CAAC,MAAmB,MAAM,IAAI;AACxC,WAAO,MAAM,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI;AAAA,EAC/C;AACA,SAAO;AACT;AAGA,SAAS,uBAAuB,UAAkD;AAChF,QAAM,UAAU,SAAS;AACzB,MAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,QAAQ,WAAW,EAAG,QAAO;AAC5D,QAAM,QAAQ,QAAQ,CAAC;AACvB,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,SAAO,IAAI,MAAM,IAAI;AACvB;AAGA,SAAS,oBAAoB,UAAkD;AAC7E,QAAM,aAAa,SAAS;AAC5B,MAAI,CAAC,MAAM,QAAQ,UAAU,KAAK,WAAW,WAAW,EAAG,QAAO;AAClE,QAAM,QAAQ,WAAW,CAAC;AAC1B,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,aAAa,MAAM;AACzB,MAAI,CAAC,cAAc,OAAO,eAAe,SAAU,QAAO;AAC1D,QAAM,QAAQ,WAAW;AACzB,MAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,EAAG,QAAO;AACxD,QAAM,OAAO,MAAM,CAAC;AACpB,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAC9C,SAAO,IAAI,KAAK,IAAI;AACtB;AAGA,SAAS,qBAAqB,UAAkD;AAC9E,SACE,IAAI,SAAS,IAAI,KACjB,IAAI,SAAS,WAAW,MACvB,OAAO,SAAS,WAAW,WAAW,SAAS,SAAS,SACzD,IAAI,SAAS,MAAM,KACnB;AAEJ;AAGA,SAAS,cAAc,UAAkD;AACvE,SACE,qBAAqB,QAAQ,KAC7B,uBAAuB,QAAQ,KAC/B,oBAAoB,QAAQ,KAC5B,qBAAqB,QAAQ;AAEjC;AAGA,SAAS,aAAa,SAA2E;AAE/F,MAAI,MAAM,QAAQ,QAAQ,QAAQ,KAAK,QAAQ,SAAS,SAAS,GAAG;AAClE,WAAO,EAAE,UAAU,QAAQ,SAAS;AAAA,EACtC;AAEA,MAAI,MAAM,QAAQ,QAAQ,QAAQ,KAAK,QAAQ,SAAS,SAAS,GAAG;AAClE,WAAO,EAAE,UAAU,QAAQ,SAAS;AAAA,EACtC;AAEA,MAAI,OAAO,QAAQ,WAAW,SAAU,QAAO,QAAQ;AAEvD,MAAI,OAAO,QAAQ,UAAU,SAAU,QAAO,QAAQ;AACtD,MAAI,OAAO,QAAQ,UAAU,YAAY,QAAQ,UAAU,MAAM;AAC/D,WAAO,QAAQ;AAAA,EACjB;AACA,SAAO;AACT;AAGA,SAAS,aAAa,SAAiD;AACrE,MAAI,OAAO,QAAQ,WAAW,SAAU,QAAO,QAAQ;AAEvD,MAAI,MAAM,QAAQ,QAAQ,QAAQ,GAAG;AACnC,UAAM,OAAO,QAAQ;AACrB,aAAS,IAAI,KAAK,SAAS,GAAG,KAAK,GAAG,KAAK;AACzC,YAAM,MAAM,KAAK,CAAC;AAClB,UAAI,IAAI,SAAS,UAAU,IAAI,SAAS,SAAS;AAC/C,cAAM,UAAU,IAAI;AACpB,YAAI,OAAO,YAAY,SAAU,QAAO;AACxC,YAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,gBAAM,OAAO,QACV,OAAO,CAAC,MAAoC,OAAO,MAAM,YAAY,MAAM,IAAI,EAC/E,IAAI,CAAC,MAAM,IAAI,EAAE,IAAI,CAAC,EACtB,OAAO,CAAC,MAAmB,MAAM,IAAI,EACrC,KAAK,IAAI;AACZ,cAAI,KAAM,QAAO;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,QAAQ,QAAQ,GAAG;AACnC,UAAM,WAAW,QAAQ;AACzB,aAAS,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;AAC7C,YAAM,IAAI,SAAS,CAAC;AACpB,UAAI,EAAE,SAAS,QAAQ;AACrB,cAAM,QAAQ,EAAE;AAChB,YAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,gBAAM,OAAQ,MACX,IAAI,CAAC,MAAM,IAAI,EAAE,IAAI,CAAC,EACtB,OAAO,CAAC,MAAmB,MAAM,IAAI,EACrC,KAAK,IAAI;AACZ,cAAI,KAAM,QAAO;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,cAAc,SAAyD;AAE9E,QAAM,MACJ,OAAO,QAAQ,qBAAqB,YAAY,QAAQ,qBAAqB,OACxE,QAAQ,mBACT;AAEN,SAAO;AAAA,IACL,aAAa,IAAI,IAAI,aAAa,CAAG;AAAA,IACrC,WAAW,IAAI,IAAI,cAAc,IAAI,aAAa,IAAI,mBAAmB,IAAI,mBAAmB,IAAI;AAAA,IACpG,MAAM,UAAU,IAAI,SAAS,IAAI,IAAI;AAAA,IACrC,MAAM,UAAU,IAAI,IAAI;AAAA,EAC1B;AACF;AAGA,SAAS,aACP,cACA,SACA,UACA,UACuD;AACvD,QAAM,MACJ,YACA,IAAI,QAAQ,KAAK,KACjB,IAAI,QAAQ,OAAO;AAAA,EACnB,IAAI,SAAS,KAAK,KAClB,IAAI,SAAS,OAAO,KACpB;AAEF,MAAI,CAAC,IAAK,QAAO;AAGjB,QAAM,QAAQ,IAAI,MAAM,GAAG;AAC3B,QAAM,YAAY,MAAM,MAAM,SAAS,CAAC;AACxC,QAAM,eAAe,IAAI,SAAS,iBAAiB,SAAS,YAAY,KAAK;AAE7E,SAAO,EAAE,OAAO,WAAW,aAAa;AAC1C;AAMA,SAAS,iBACP,SAC0D;AAC1D,QAAM,UAAU,IAAI,QAAQ,OAAO;AACnC,MAAI,CAAC,QAAS,QAAO;AAGrB,MAAI,OAAgC,CAAC;AACrC,MAAI,OAAO,QAAQ,SAAS,UAAU;AACpC,QAAI;AAAE,aAAO,KAAK,MAAM,QAAQ,IAAI;AAAA,IAAG,QAAQ;AAAE,aAAO,CAAC;AAAA,IAAG;AAAA,EAC9D,WAAW,OAAO,QAAQ,SAAS,YAAY,QAAQ,SAAS,MAAM;AACpE,WAAO,QAAQ;AAAA,EACjB;AAEA,SAAO,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,GAAG,QAAQ;AAC9C;AAMO,SAAS,wBACd,UACA,eACA,YACA,aACe;AAEf,MAAI,UAAU;AACd,MAAI,aAAa,aAAa,IAAI,WAAW,OAAO,GAAG;AACrD,UAAM,YAAY,iBAAiB,UAAU;AAC7C,QAAI,UAAW,WAAU,UAAU;AAAA,EACrC;AAGA,QAAM,cAAc,aAAa,UAAU,SAAS,aAAa,aAAa;AAC9E,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QACE;AAAA,IAEJ;AAAA,EACF;AAGA,QAAM,QAAQ,aAAa,OAAO;AAClC,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QACE;AAAA,IAEJ;AAAA,EACF;AAGA,QAAM,SAAS,aAAa,OAAO,MAAM,OAAO,UAAU,WAAW,QAAQ;AAG7E,QAAM,SAAS,cAAc,WAAW;AACxC,MAAI,WAAW,MAAM;AACnB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QACE;AAAA,IAGJ;AAAA,EACF;AAGA,QAAM,aAAa,cAAc,OAAO;AAExC,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,OAAO,YAAY;AAAA,MACnB,cAAc,YAAY;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;AD9PO,SAAS,gCAAgC,QAAgD;AAC9F,QAAM,YAAY;AAAA,IAChB,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAEA,MAAI,CAAC,UAAU,IAAI;AACjB,WAAO,EAAE,IAAI,OAAO,MAAM,cAAc,cAAc,QAAQ,UAAU,OAAO;AAAA,EACjF;AAEA,QAAM,EAAE,OAAO,cAAc,QAAQ,OAAO,QAAQ,WAAW,IAAI,UAAU;AAE7E,MAAI;AACF,UAAM,WAAW,eAAe;AAAA,MAC9B,aAAa,OAAO,eAAsB,mBAAW;AAAA,MACrD,WAAW,OAAO;AAAA,MAClB,UAAU,OAAO;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,OAAO,SAAS;AAAA,MACvB,YAAY,OAAO,cAAc;AAAA,MACjC,gBAAgB,OAAO,kBAAkB;AAAA,IAC3C,CAAC;AAED,UAAM,SAAS,QAAQ,UAAU,EAAE,MAAM,OAAO,MAAM,WAAW,OAAO,UAAU,CAAC;AACnF,WAAO,EAAE,IAAI,MAAM,OAAO;AAAA,EAC5B,SAASC,MAAK;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM,cAAc;AAAA,MACpB,QAAQA,gBAAe,QAAQA,KAAI,UAAU,OAAOA,IAAG;AAAA,IACzD;AAAA,EACF;AACF;;;AE5CA,eAAe,cACb,KACiB;AACjB,MAAI,OAAO,QAAQ,WAAY,QAAO,IAAI;AAC1C,SAAO,OAAO;AAChB;AAEA,SAAS,iBAAiB,UAA0B,MAAqC;AACvF,QAAM,OAAgB,CAAC;AACvB,MAAI,SAAS,QAAQ,SAAS,KAAK,SAAS,EAAG,MAAK,OAAO,SAAS;AACpE,MAAI,SAAS,OAAQ,MAAK,SAAS,SAAS;AAC5C,MAAI,CAAC,QAAQ,OAAO,KAAK,IAAI,EAAE,WAAW,EAAG,QAAO;AACpD,SAAO,EAAE,GAAG,MAAM,GAAG,KAAK;AAC5B;AAOO,SAAS,aAAa,WAA2B,CAAC,GAAiB;AACxE,SAAO;AAAA,IACL,gBAAgB,QAAqD;AACnE,aAAO,gBAAgB;AAAA,QACrB,OAAO,SAAS,SAAS;AAAA,QACzB,YAAY,SAAS,cAAc;AAAA,QACnC,GAAG;AAAA,QACH,MAAM,iBAAiB,UAAU,OAAO,IAAI;AAAA,MAC9C,CAAC;AAAA,IACH;AAAA,IAEA,MAAM,yBACJ,QACA,SACwE;AACxE,YAAM,UAAU,SAAS,WAAW,SAAS;AAC7C,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,MAAM,wEAAwE;AAAA,MAC1F;AACA,YAAM,SAAS,SAAS,UAAW,MAAM,cAAc,SAAS,MAAM;AAEtE,YAAM,eAAsC;AAAA,QAC1C,OAAO,SAAS,SAAS;AAAA,QACzB,YAAY,SAAS,cAAc;AAAA,QACnC,GAAG;AAAA,QACH,MAAM,iBAAiB,UAAU,OAAO,IAAI;AAAA,MAC9C;AAEA,aAAO,yBAAyB,cAAc;AAAA,QAC5C;AAAA,QACA;AAAA,QACA,WAAW,SAAS;AAAA,MACtB,CAAC;AAAA,IACH;AAAA,IAEA,OAAO,QAAkD;AACvD,aAAO,UAAU,MAAM;AAAA,IACzB;AAAA,IAEA,MAAM,wBACJ,QACA,SACkC;AAClC,YAAM,UAAU,SAAS,WAAW,SAAS;AAC7C,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,MAAM,uEAAuE;AAAA,MACzF;AACA,aAAO,wBAAwB,QAAQ,EAAE,SAAS,KAAK,SAAS,IAAI,CAAC;AAAA,IACvE;AAAA,EACF;AACF;;;AC1GA,IAAM,kBAAoD;AAAA,EACxD,CAAC,cAAc,EAAE,GAAG;AAAA,EACpB,CAAC,cAAc,yBAAyB,GAAG;AAAA,EAC3C,CAAC,cAAc,sBAAsB,GAAG;AAAA,EACxC,CAAC,cAAc,mBAAmB,GAAG;AAAA,EACrC,CAAC,cAAc,oBAAoB,GAAG;AAAA,EACtC,CAAC,cAAc,yBAAyB,GAAG;AAAA,EAC3C,CAAC,cAAc,YAAY,GAAG;AAAA,EAC9B,CAAC,cAAc,sBAAsB,GAAG;AAAA,EACxC,CAAC,cAAc,qBAAqB,GAAG;AAAA,EACvC,CAAC,cAAc,aAAa,GAAG;AAAA,EAC/B,CAAC,cAAc,mBAAmB,GAAG;AAAA,EACrC,CAAC,cAAc,oBAAoB,GAAG;AAAA,EACtC,CAAC,cAAc,iCAAiC,GAAG;AAAA,EACnD,CAAC,cAAc,qBAAqB,GAAG;AAAA,EACvC,CAAC,cAAc,6BAA6B,GAAG;AAAA,EAC/C,CAAC,cAAc,mBAAmB,GAAG;AAAA,EACrC,CAAC,cAAc,yBAAyB,GAAG;AAAA,EAC3C,CAAC,cAAc,kCAAkC,GAAG;AACtD;AAEA,IAAM,0BAA0B,oBAAI,IAAY;AAAA,EAC9C,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAChB,CAAC;AAED,IAAM,uBAAuB,oBAAI,IAAY;AAAA,EAC3C,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAChB,CAAC;AAMM,SAAS,gBAAgB,MAAsB;AACpD,SAAO,gBAAgB,IAAI,KAAK;AAClC;AAUO,SAAS,WAAW,QAAgD;AACzE,QAAM,QAAQ,UAAU,MAAM;AAE9B,MAAI,MAAM,IAAI;AACZ,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN,iBAAiB;AAAA,QACjB,gBAAgB;AAAA,QAChB,mBAAmB;AAAA,QACnB,YAAY;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aAAa,gBAAgB,MAAM,IAAI;AAE7C,QAAM,qBAAqB,wBAAwB,IAAI,MAAM,IAAI;AACjE,QAAM,kBAAkB,qBAAqB,IAAI,MAAM,IAAI;AAC3D,QAAM,iBAAiB,MAAM,SAAS,cAAc;AAEpD,QAAM,SAA2B;AAAA,IAC/B,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,MACN,iBAAiB,CAAC;AAAA,MAClB,gBAAgB,CAAC;AAAA,MACjB,mBAAmB,CAAC;AAAA,MACpB,YAAY,CAAC;AAAA,IACf;AAAA,EACF;AAEA,MAAI,MAAM,WAAW,MAAM,QAAQ,SAAS,GAAG;AAC7C,WAAO,QAAQ,MAAM;AAAA,EACvB,WAAW,MAAM,OAAO,SAAS,GAAG;AAClC,WAAO,QAAQ,MAAM;AAAA,EACvB;AAEA,SAAO;AACT;;;ACxFO,SAAS,eAAe,OAAwB;AACrD,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,SAAS,KAAK;AAAA,EACvB;AACA,SAAO,kBAAkB,KAAK;AAChC;AAkBO,SAAS,cAAc,QAAwC;AACpE,QAAM,KAAK,OAAO,OAAM,oBAAI,KAAK,GAAE,YAAY;AAC/C,QAAM,aAAa,eAAe,OAAO,MAAM;AAE/C,QAAM,QAAmB;AAAA,IACvB,QAAQ,OAAO;AAAA,IACf;AAAA,IACA;AAAA,EACF;AAEA,MAAI,OAAO,UAAU,QAAW;AAC9B,UAAM,YAAY,eAAe,OAAO,KAAK;AAAA,EAC/C;AAEA,MAAI,OAAO,gBAAgB,QAAW;AACpC,UAAM,cAAc,OAAO;AAAA,EAC7B;AAEA,MAAI,OAAO,UAAU,QAAW;AAC9B,UAAM,QAAQ,OAAO;AAAA,EACvB;AAEA,SAAO;AACT;;;AChCO,SAAS,iBACd,SACA,SACA,MACwB;AACxB,MAAI,QAAQ,WAAW,QAAQ,WAAW;AACxC,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM,cAAc;AAAA,MACpB,QAAQ;AAAA,QACN,yCAAyC,QAAQ,SAAS,sBAAsB,QAAQ,MAAM;AAAA,MAChG;AAAA,MACA,SAAS,CAAC,qCAAqC;AAAA,IACjD;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,EAAE,IAAI,MAAM,MAAM,cAAc,IAAI,QAAQ,CAAC,EAAE;AAAA,EACxD;AAEA,MAAI,WAA0B;AAE9B,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAM,SAAS,QAAQ,CAAC;AACxB,UAAM,cAAc,QAAQ,MAAM,CAAC;AAEnC,QAAI,CAAC,aAAa;AAChB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM,cAAc;AAAA,QACpB,QAAQ,CAAC,wCAAwC,CAAC,EAAE;AAAA,QACpD,SAAS;AAAA,MACX;AAAA,IACF;AAEA,QAAI,CAAC,MAAM,wBAAwB;AACjC,YAAM,eAAe,UAAU,MAAM;AACrC,UAAI,CAAC,aAAa,IAAI;AACpB,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,MAAM,aAAa;AAAA,UACnB,QAAQ,CAAC,QAAQ,CAAC,4CAA4C,aAAa,OAAO,KAAK,IAAI,CAAC,EAAE;AAAA,UAC9F,SAAS,aAAa;AAAA,UACtB,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAEA,UAAM,YAAY,OAAO,UAAU;AACnC,QAAI,cAAc,GAAG;AACnB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM,cAAc;AAAA,QACpB,QAAQ,CAAC,QAAQ,CAAC,wBAAwB,CAAC,SAAS,OAAO,SAAS,CAAC,EAAE;AAAA,QACvE,SAAS,CAAC,sDAAsD;AAAA,QAChE,SAAS;AAAA,MACX;AAAA,IACF;AAEA,UAAM,mBAAmB,OAAO,UAAU,gBAAgB;AAE1D,QAAI,MAAM,GAAG;AACX,UAAI,qBAAqB,MAAM;AAC7B,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,MAAM,cAAc;AAAA,UACpB,QAAQ,CAAC,4CAA4C,gBAAgB,GAAG;AAAA,UACxE,SAAS,CAAC,wCAAwC;AAAA,UAClD,SAAS;AAAA,UACT,cAAc;AAAA,UACd,cAAc;AAAA,QAChB;AAAA,MACF;AAAA,IACF,OAAO;AACL,UAAI,qBAAqB,UAAU;AACjC,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,MAAM,cAAc;AAAA,UACpB,QAAQ,CAAC,QAAQ,CAAC,qDAAgD;AAAA,UAClE,SAAS;AAAA,YACP,0BAA0B,YAAY,MAAM,WAAW,oBAAoB,MAAM;AAAA,UACnF;AAAA,UACA,SAAS;AAAA,UACT,cAAc,YAAY;AAAA,UAC1B,cAAc,oBAAoB;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AAEA,QAAI,OAAO,oBAAoB,YAAY,iBAAiB;AAC1D,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM,cAAc;AAAA,QACpB,QAAQ,CAAC,QAAQ,CAAC,iDAAiD;AAAA,QACnE,SAAS;AAAA,UACP,gBAAgB,YAAY,eAAe,kBAAkB,OAAO,eAAe;AAAA,QACrF;AAAA,QACA,SAAS;AAAA,MACX;AAAA,IACF;AAEA,eAAW,OAAO;AAAA,EACpB;AAEA,QAAM,aAAa,QAAQ,QAAQ,SAAS,CAAC;AAC7C,MAAI,QAAQ,kBAAkB,WAAW,iBAAiB;AACxD,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM,cAAc;AAAA,MACpB,QAAQ,CAAC,gEAAgE;AAAA,MACzE,SAAS;AAAA,QACP,aAAa,QAAQ,iBAAiB,MAAM,WAAW,WAAW,eAAe;AAAA,MACnF;AAAA,MACA,SAAS,QAAQ,SAAS;AAAA,MAC1B,cAAc,QAAQ,iBAAiB;AAAA,MACvC,cAAc,WAAW;AAAA,IAC3B;AAAA,EACF;AAEA,SAAO,EAAE,IAAI,MAAM,MAAM,cAAc,IAAI,QAAQ,CAAC,EAAE;AACxD;;;AChIA,SAAS,UAAU,OAAwB;AACzC,MAAI,OAAO,UAAU,SAAU,QAAO,SAAS,KAAK;AACpD,SAAO,kBAAkB,KAAK;AAChC;AAEA,SAAS,eAAe,KAA8B,MAAuB;AAC3E,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,MAAI,SAAkB;AACtB,aAAW,QAAQ,OAAO;AACxB,QAAI,OAAO,WAAW,YAAY,WAAW,KAAM,QAAO;AAC1D,aAAU,OAAmC,IAAI;AAAA,EACnD;AACA,SAAO;AACT;AAEA,SAAS,cACP,KACA,MACA,OACyB;AACzB,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,QAAM,QAAQ,EAAE,GAAG,IAAI;AACvB,MAAI,SAAkC;AAEtC,WAAS,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,KAAK;AACzC,UAAM,MAAM,MAAM,CAAC;AACnB,UAAM,QAAQ,OAAO,GAAG;AACxB,QAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,WAAO,GAAG,IAAI,EAAE,GAAI,MAAkC;AACtD,aAAS,OAAO,GAAG;AAAA,EACrB;AAEA,QAAM,OAAO,MAAM,MAAM,SAAS,CAAC;AACnC,MAAI,QAAQ,QAAQ;AAClB,WAAO,IAAI,IAAI;AAAA,EACjB;AACA,SAAO;AACT;AAmBO,SAAS,iBACd,UACA,QACuB;AACvB,MAAI,SAAS,EAAE,GAAG,SAAS;AAE3B,aAAW,QAAQ,OAAO,OAAO;AAC/B,UAAM,WAAW,eAAe,QAAQ,IAAI;AAC5C,QAAI,aAAa,OAAW;AAE5B,UAAM,WAA8B;AAAA,MAClC,WAAW;AAAA,MACX,MAAM,UAAU,QAAQ;AAAA,IAC1B;AAEA,aAAS,cAAc,QAAQ,MAAM,QAAQ;AAE7C,QAAI,SAAS,SAAS;AACpB,aAAO,WAAW,IAAI,iBAAiB,QAA8C;AAAA,IACvF,WAAW,SAAS,UAAU;AAC5B,aAAO,YAAY,IAAI,kBAAkB,QAA8C;AAAA,IACzF;AAAA,EACF;AAEA,SAAO;AACT;;;ACrFA,IAAMC,kBAAiB;AAEvB,SAAS,kBAAkB,OAAkB,OAAyB;AACpE,QAAM,OAAiB,CAAC;AACxB,MAAI,CAAC,MAAM,UAAU,OAAO,MAAM,WAAW,UAAU;AACrD,SAAK,KAAK,aAAa,KAAK,qCAAqC;AAAA,EACnE;AACA,MAAI,CAAC,MAAM,MAAM,OAAO,MAAM,OAAO,UAAU;AAC7C,SAAK,KAAK,aAAa,KAAK,0CAA0C;AAAA,EACxE;AACA,MAAI,CAAC,MAAM,cAAc,CAACA,gBAAe,KAAK,MAAM,UAAU,GAAG;AAC/D,SAAK,KAAK,aAAa,KAAK,uDAAuD,MAAM,cAAc,EAAE,GAAG;AAAA,EAC9G;AACA,MAAI,MAAM,cAAc,UAAa,CAACA,gBAAe,KAAK,MAAM,SAAS,GAAG;AAC1E,SAAK,KAAK,aAAa,KAAK,2DAA2D;AAAA,EACzF;AACA,SAAO;AACT;AAEA,SAAS,WAAW,UAAiC,OAAyB;AAC5E,QAAM,OAAiB,CAAC;AACxB,MAAI,CAAC,SAAS,YAAa,MAAK,KAAK,+BAA+B,KAAK,EAAE;AAC3E,MAAI,CAAC,SAAS,UAAW,MAAK,KAAK,6BAA6B,KAAK,EAAE;AACvE,MAAI,CAAC,SAAS,SAAU,MAAK,KAAK,4BAA4B,KAAK,EAAE;AACrE,MAAI,CAAC,SAAS,MAAO,MAAK,KAAK,yBAAyB,KAAK,EAAE;AAC/D,MAAI,SAAS,UAAU,UAAa,SAAS,UAAU,KAAM,MAAK,KAAK,yBAAyB,KAAK,EAAE;AACvG,MAAI,SAAS,WAAW,UAAa,SAAS,WAAW,KAAM,MAAK,KAAK,0BAA0B,KAAK,EAAE;AAC1G,MAAI,CAAC,SAAS,UAAW,MAAK,KAAK,6BAA6B,KAAK,EAAE;AACvE,MAAI,CAAC,SAAS,WAAY,MAAK,KAAK,8BAA8B,KAAK,EAAE;AACzE,SAAO;AACT;AAEA,SAAS,gBAAgB,QAA6E;AACpG,MAAI,cAAc,UAAW,OAAgC,UAAU;AACrE,WAAQ,OAAgC;AAAA,EAC1C;AACA,SAAO;AACT;AASO,SAAS,gBACd,QACA,SACyB;AACzB,MAAI,YAAY,YAAY;AAC1B,WAAO,EAAE,IAAI,MAAM,QAAQ,CAAC,EAAE;AAAA,EAChC;AAEA,QAAM,WAAW,gBAAgB,MAAM;AACvC,QAAM,SAAmB,CAAC;AAE1B,MAAI,YAAY,aAAa,YAAY,aAAa,YAAY,WAAW;AAC3E,WAAO,KAAK,GAAG,WAAW,UAAU,OAAO,CAAC;AAAA,EAC9C;AAEA,MAAI,YAAY,WAAW;AACzB,QAAI,SAAS,aAAa,SAAS,UAAU,SAAS,GAAG;AACvD,eAAS,IAAI,GAAG,IAAI,SAAS,UAAU,QAAQ,KAAK;AAClD,eAAO,KAAK,GAAG,kBAAkB,SAAS,UAAU,CAAC,GAAG,CAAC,CAAC;AAAA,MAC5D;AAAA,IACF;AACA,QACE,SAAS,cAAc,QACvB,SAAS,cAAc,UACvB,SAAS,YAAY,KACrB,CAAC,SAAS,cACV;AACA,aAAO,KAAK,gEAAgE;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO,EAAE,IAAI,OAAO,WAAW,GAAG,OAAO;AAC3C;;;ACxBO,SAAS,yBACd,QACA,QACA,SACgC;AAChC,QAAM,YAAY,SAAS,cAAa,oBAAI,KAAK,GAAE,YAAY;AAE/D,QAAM,mBAAmB,iBAAiB,OAAO,UAAU,MAAM;AAEjE,QAAM,aAAiD;AAAA,IACrD,yBAAyB,OAAO;AAAA,IAChC,iBAAiB,EAAE,OAAO,CAAC,GAAG,OAAO,KAAK,EAAE;AAAA,IAC5C,YAAY;AAAA,EACd;AAEA,QAAM,aAAsB;AAAA,IAC1B,GAAG,OAAO;AAAA,IACV;AAAA,EACF;AAEA,QAAM,YAAY,QAAQ,kBAAkB;AAAA,IAC1C;AAAA,IACA,MAAM;AAAA,IACN,aAAa,OAAO;AAAA,EACtB,CAAC;AAED,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,yBAAyB,OAAO;AAAA,EAClC;AACF;;;AChBA,eAAsB,oBACpB,OACA,SACoC;AACpC,QAAM,MAAM,IAAI,WAAW;AAAA,IACzB,OAAO,SAAS;AAAA,IAChB,YAAY,SAAS;AAAA,IACrB,gBAAgB,SAAS;AAAA,IACzB,OAAO,SAAS;AAAA,EAClB,CAAC;AAED,QAAM,cAAsC,CAAC;AAC7C,QAAM,WAA0C,CAAC;AAEjD,aAAW,cAAc,OAAO;AAC9B,UAAM,SAAS,IAAI,KAAK,UAAU;AAClC,gBAAY,KAAK,MAAM;AAEvB,QAAI,SAAS,YAAY;AACvB,YAAM,UAAU,MAAM,QAAQ,WAAW,MAAM;AAC/C,eAAS,KAAK,OAAO;AAAA,IACvB,OAAO;AACL,eAAS,KAAK,IAAI;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,aAAa,IAAI,SAAS;AAEhC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe,WAAW;AAAA,EAC5B;AACF;;;AC5GO,IAAM,aAAa;AAAA,EACxB,sBAAsB;AAAA,EACtB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,uBAAuB;AAAA,EACvB,4BAA4B;AAAA,EAC5B,kBAAkB;AAAA,EAClB,kBAAkB;AACpB;;;ACHA,SAAS,wBAAwB,SAA+B;AAC9D,UAAQ,SAAS;AAAA,IACf,KAAK,cAAc;AAAA,IACnB,KAAK,cAAc;AAAA,IACnB,KAAK,cAAc;AAAA,IACnB,KAAK,cAAc;AACjB,aAAO,CAAC,WAAY,oBAAoB;AAAA,IAC1C,KAAK,cAAc;AACjB,aAAO,CAAC,WAAY,0BAA0B;AAAA,IAChD,KAAK,cAAc;AAAA,IACnB,KAAK,cAAc;AAAA,IACnB,KAAK,cAAc;AACjB,aAAO,CAAC,WAAY,gBAAgB;AAAA,IACtC,KAAK,cAAc;AAAA,IACnB,KAAK,cAAc;AAAA,IACnB,KAAK,cAAc;AACjB,aAAO,CAAC,WAAY,sBAAsB;AAAA,IAC5C,KAAK,cAAc;AACjB,aAAO,CAAC,WAAY,sBAAsB;AAAA,IAC5C;AACE,aAAO,CAAC;AAAA,EACZ;AACF;AAcO,SAAS,0BAA0B,QAAwC;AAChF,QAAM,cAAa,oBAAI,KAAK,GAAE,YAAY;AAC1C,QAAM,WAAW;AAEjB,MAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAClE,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ,EAAE,iBAAiB,QAAQ,eAAe,WAAW,oBAAoB,UAAU;AAAA,MAC3F,aAAa,CAAC,WAAY,gBAAgB;AAAA,MAC1C,iBAAiB;AAAA,MACjB,YAAY;AAAA,MACZ;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,IAAI;AACV,QAAM,aAAa,OAAO,EAAE,YAAY,MAAM,WAAW,EAAE,YAAY,IAAI;AAC3E,QAAM,kBAAkB,OAAO,EAAE,iBAAiB,MAAM,WAAW,EAAE,iBAAiB,IAAI;AAE1F,MAAI,eAAe,uBAAuB;AACxC,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ,EAAE,iBAAiB,QAAQ,eAAe,WAAW,oBAAoB,UAAU;AAAA,MAC3F,aAAa,CAAC,WAAY,0BAA0B;AAAA,MACpD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,UAAU,MAA8B;AAE1D,QAAM,kBAA+B,UAAU,KAAK,SAAS;AAE7D,QAAM,qBAAqB,eAAe,MAA8B;AACxE,QAAM,gBAA6B,qBAAqB,SAAS;AACjE,QAAM,qBAAkC,qBAAqB,SAAS;AAEtE,QAAM,cAA4B,UAAU,KAAK,CAAC,IAAI,wBAAwB,UAAU,IAAI;AAE5F,SAAO;AAAA,IACL,QAAQ,UAAU,KAAK,aAAa;AAAA,IACpC,QAAQ,EAAE,iBAAiB,eAAe,mBAAmB;AAAA,IAC7D;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACpFA,IAAAC,UAAwB;AA4HxB,SAAS,kBAAkB,OAAkD;AAC3E,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;AACxE,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,EAAE,OAAO,MAAM;AAChD,SAAO,OAAO,KAAK;AACrB;AAEA,SAAS,cAAc,OAAgB,UAA4C;AACjF,MAAI,OAAO,UAAU,WAAW,YAAY,SAAS,OAAO,SAAS,GAAG;AACtE,WAAO,SAAS;AAAA,EAClB;AACA,MAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;AACxE,UAAM,MAAM;AACZ,QAAI,MAAM,QAAQ,IAAI,QAAQ,KAAK,IAAI,SAAS,SAAS,GAAG;AAC1D,YAAM,QAAQ,IAAI,SAAS,CAAC;AAC5B,UAAI,OAAO,OAAO,YAAY,YAAY,MAAM,QAAQ,SAAS,GAAG;AAClE,eAAO,MAAM;AAAA,MACf;AAAA,IACF;AACA,QAAI,OAAO,IAAI,WAAW,YAAY,IAAI,OAAO,SAAS,EAAG,QAAO,IAAI;AACxE,QAAI,OAAO,IAAI,SAAS,YAAY,IAAI,KAAK,SAAS,EAAG,QAAO,IAAI;AAAA,EACtE;AACA,MAAI,OAAO,UAAU,YAAY,MAAM,SAAS,EAAG,QAAO;AAC1D,SAAO;AACT;AAEA,SAAS,UAAU,UAAyE;AAC1F,MAAI,CAAC,YAAY,OAAO,KAAK,QAAQ,EAAE,WAAW,EAAG,QAAO;AAC5D,QAAM,WAAW,oBAAI,IAAI,CAAC,UAAU,SAAS,SAAS,cAAc,gBAAgB,CAAC;AACrF,QAAM,YAAsB,CAAC;AAC7B,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAC7C,QAAI,CAAC,SAAS,IAAI,CAAC,GAAG;AACpB,gBAAU,KAAK,OAAO,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,EAAE;AAAA,IAClF;AAAA,EACF;AACA,SAAO,UAAU,SAAS,IAAI,EAAE,MAAM,UAAU,IAAI;AACtD;AAEA,SAAS,kBACP,QACuB;AACvB,SAAO;AAAA,IACL,aAAa,QAAQ,eAAe;AAAA,IACpC,WAAW,QAAQ,aAAa;AAAA,IAChC,MAAM,QAAQ,QAAQ;AAAA,IACtB,MAAM,QAAQ,QAAQ;AAAA,EACxB;AACF;AAGA,SAAS,mBACP,OACA,aACuB;AACvB,SAAO;AAAA,IACL;AAAA,IACA,WAAW,MAAM;AAAA,IACjB,WAAW,MAAM;AAAA,IACjB,UAAU,MAAM;AAAA,IAChB,OAAO,MAAM;AAAA,IACb,cAAc,MAAM,gBAAgB;AAAA,IACpC,QAAQ,cAAc,MAAM,OAAO,MAAM,QAAQ;AAAA,IACjD,OAAO,kBAAkB,MAAM,KAAK;AAAA,IACpC,QAAQ,kBAAkB,MAAM,MAAM;AAAA,IACtC,YAAY,kBAAkB,MAAM,UAAU;AAAA,IAC9C,OAAO,OAAO,MAAM,UAAU,UAAU,WAAW,MAAM,SAAS,QAAQ;AAAA,IAC1E,OAAO,OAAO,MAAM,UAAU,UAAU,WAAW,MAAM,SAAS,QAAQ;AAAA,IAC1E,YACE,OAAO,MAAM,UAAU,eAAe,WAAW,MAAM,SAAS,aAAa;AAAA,IAC/E,gBACE,OAAO,MAAM,UAAU,mBAAmB,WACtC,MAAM,SAAS,iBACf;AAAA,IACN,MAAM,UAAU,MAAM,QAAQ;AAAA,EAChC;AACF;AAsBO,SAAS,mBAAmB,OAAwD;AACzF,QAAM,cAAc,MAAM,eAAsB,mBAAW;AAC3D,QAAM,SAAS,gBAAgB,mBAAmB,OAAO,WAAW,CAAC;AACrE,SAAO;AAAA,IACL;AAAA,IACA,iBAAiB,OAAO;AAAA,IACxB,aAAa,OAAO,SAAS;AAAA,EAC/B;AACF;AAyCO,SAAS,oBACd,OACA,UACuD;AACvD,MAAI,MAAM,WAAW,MAAM,QAAQ;AACjC,UAAM,cAAc,MAAM,eAAsB,mBAAW;AAC3D,UAAM,gBAAgB,mBAAmB,EAAE,GAAG,OAAO,YAAY,GAAG,WAAW;AAC/E,UAAM,WAAW,UAAU,aAAa;AACxC,WAAO,SAAS,eAAe,EAAE,SAAS,MAAM,SAAS,QAAQ,MAAM,OAAO,CAAC,EAAE;AAAA,MAC/E,CAAC,EAAE,QAAQ,QAAQ,OAAO;AAAA,QACxB;AAAA,QACA;AAAA,QACA,iBAAiB,OAAO;AAAA,QACxB,aAAa,OAAO,SAAS;AAAA,QAC7B,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AACA,SAAO,mBAAmB,KAAK;AACjC;","names":["err","errors","crypto","crypto","err","result","err","crypto","num","C","G","num","isBytes","abytes","isBytes","abytes","str","abytes","_32n","h","abytes","h","h","err","crypto","err","SHA256_PATTERN","crypto"]}
|