@formspec/analysis 0.1.0-alpha.20 → 0.1.0-alpha.21

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/path-target.ts","../src/tag-registry.ts","../src/comment-syntax.ts","../src/ts-binding.ts","../src/cursor-context.ts","../src/tag-value-parser.ts","../src/semantic-targets.ts","../src/file-snapshots.ts","../src/compiler-signatures.ts","../src/source-bindings.ts","../src/semantic-protocol.ts","../src/workspace-runtime.ts"],"sourcesContent":["export { parseCommentBlock, parseTagSyntax, sliceCommentSpan } from \"./comment-syntax.js\";\nexport type {\n CommentSourceSpan,\n CommentSpan,\n ParseCommentSyntaxOptions,\n ParsedCommentBlock,\n ParsedCommentTag,\n ParsedCommentTargetSpecifier,\n} from \"./comment-syntax.js\";\nexport type {\n CommentHoverInfo,\n CommentCompletionContext,\n CommentCursorTarget,\n CommentSemanticContextOptions,\n CommentTagSemanticContext,\n EnclosingDocComment,\n SemanticCommentCompletionContext,\n} from \"./cursor-context.js\";\nexport {\n findCommentTagAtOffset,\n findEnclosingDocComment,\n getCommentCompletionContextAtOffset,\n getCommentHoverInfoAtOffset,\n getCommentCursorTargetAtOffset,\n getCommentTagSemanticContext,\n getSemanticCommentCompletionContextAtOffset,\n getTagCompletionPrefixAtOffset,\n} from \"./cursor-context.js\";\nexport type {\n ConstraintTagParseRegistryLike,\n ParseConstraintTagValueOptions,\n} from \"./tag-value-parser.js\";\nexport { parseConstraintTagValue, parseDefaultValueTagValue } from \"./tag-value-parser.js\";\nexport { extractPathTarget, formatPathTarget, type ParsedPathTarget } from \"./path-target.js\";\nexport type {\n AnalysisTypeDefinition,\n AnalysisTypeRegistry,\n ConstraintRegistrationLike,\n ConstraintRegistryLike,\n ConstraintSemanticRoleLike,\n ConstraintSemanticDiagnostic,\n ConstraintTagRegistrationLike,\n ConstraintTargetAnalysisResult,\n EffectiveTargetState,\n ResolvedTargetState,\n} from \"./semantic-targets.js\";\nexport {\n analyzeConstraintTargets,\n buildConstraintTargetStates,\n collectReferencedTypeAnnotations,\n collectReferencedTypeConstraints,\n dereferenceAnalysisType,\n formatConstraintTargetName,\n resolveConstraintTargetState,\n} from \"./semantic-targets.js\";\nexport type {\n ExtensionConstraintTagSource,\n ExtensionTagSource,\n FormSpecPlacement,\n FormSpecTagCategory,\n FormSpecTagDefinition,\n FormSpecTagOverload,\n FormSpecTagParameter,\n FormSpecTargetKind,\n FormSpecValueKind,\n SemanticCapability,\n TagDefinition,\n TagSignature,\n TagSignatureParameter,\n} from \"./tag-registry.js\";\nexport {\n getAllTagDefinitions,\n getConstraintTagDefinitions,\n getTagDefinition,\n getTagHoverMarkdown,\n normalizeFormSpecTagName,\n} from \"./tag-registry.js\";\nexport {\n buildFormSpecAnalysisFileSnapshot,\n type BuildFormSpecAnalysisFileSnapshotOptions,\n} from \"./file-snapshots.js\";\nexport {\n findDeclarationForCommentOffset,\n getHostType,\n getLastLeadingDocCommentRange,\n getSubjectType,\n} from \"./source-bindings.js\";\nexport type {\n FormSpecAnalysisCommentSnapshot,\n FormSpecAnalysisDiagnostic,\n FormSpecAnalysisFileSnapshot,\n FormSpecAnalysisManifest,\n FormSpecAnalysisTagSnapshot,\n FormSpecIpcEndpoint,\n FormSpecSemanticQuery,\n FormSpecSemanticResponse,\n FormSpecSerializedCommentTargetSpecifier,\n FormSpecSerializedCompletionContext,\n FormSpecSerializedHoverInfo,\n FormSpecSerializedTagDefinition,\n FormSpecSerializedTagSemanticContext,\n FormSpecSerializedTagSignature,\n} from \"./semantic-protocol.js\";\nexport {\n FORMSPEC_ANALYSIS_PROTOCOL_VERSION,\n FORMSPEC_ANALYSIS_SCHEMA_VERSION,\n computeFormSpecTextHash,\n isFormSpecAnalysisManifest,\n isFormSpecSemanticQuery,\n isFormSpecSemanticResponse,\n serializeCommentTagSemanticContext,\n serializeCommentTargetSpecifier,\n serializeCompletionContext,\n serializeHoverInfo,\n serializeParsedCommentTag,\n} from \"./semantic-protocol.js\";\nexport {\n getFormSpecManifestPath,\n getFormSpecWorkspaceId,\n getFormSpecWorkspaceRuntimeDirectory,\n} from \"./workspace-runtime.js\";\nexport {\n collectCompatiblePathTargets,\n getTypeSemanticCapabilities,\n hasTypeSemanticCapability,\n resolveDeclarationPlacement,\n resolvePathTargetType,\n type FormSpecSemanticCapability,\n type ResolvedPathTargetType,\n} from \"./ts-binding.js\";\nexport type {\n CheckSyntheticTagApplicationOptions,\n LowerSyntheticTagApplicationOptions,\n LoweredSyntheticTagApplication,\n SyntheticCompilerDiagnostic,\n SyntheticTagCheckResult,\n SyntheticTagTargetKind,\n SyntheticTagTargetSpecifier,\n} from \"./compiler-signatures.js\";\nexport {\n buildSyntheticHelperPrelude,\n checkSyntheticTagApplication,\n getMatchingTagSignatures,\n lowerTagApplicationToSyntheticCall,\n} from \"./compiler-signatures.js\";\n","import type { PathTarget } from \"@formspec/core\";\n\nexport interface ParsedPathTarget {\n readonly path: PathTarget;\n readonly remainingText: string;\n}\n\n/**\n * Extract a `:foo.bar` path target prefix from raw tag text.\n */\nexport function extractPathTarget(text: string): ParsedPathTarget | null {\n const trimmed = text.trimStart();\n const match = /^:([A-Za-z_]\\w*(?:\\.[A-Za-z_]\\w*)*)(?:\\s+([\\s\\S]*))?$/u.exec(trimmed);\n if (!match?.[1]) {\n return null;\n }\n\n return {\n path: { segments: match[1].split(\".\") },\n remainingText: match[2] ?? \"\",\n };\n}\n\nexport function formatPathTarget(path: PathTarget | readonly string[]): string {\n if (\"segments\" in path) {\n return path.segments.join(\".\");\n }\n return path.join(\".\");\n}\n","import {\n BUILTIN_CONSTRAINT_DEFINITIONS,\n normalizeConstraintTagName,\n type BuiltinConstraintName,\n} from \"@formspec/core\";\n\nexport type FormSpecValueKind =\n | \"number\"\n | \"integer\"\n | \"signedInteger\"\n | \"string\"\n | \"json\"\n | \"boolean\"\n | \"condition\";\n\nexport type FormSpecTargetKind = \"none\" | \"path\" | \"member\" | \"variant\";\nexport type FormSpecTagCategory = \"constraint\" | \"annotation\" | \"structure\" | \"ecosystem\";\n\nexport type FormSpecPlacement =\n | \"class\"\n | \"class-field\"\n | \"class-method\"\n | \"interface\"\n | \"interface-field\"\n | \"type-alias\"\n | \"type-alias-field\"\n | \"variable\"\n | \"function\"\n | \"function-parameter\"\n | \"method-parameter\";\n\nexport type SemanticCapability =\n | \"numeric-comparable\"\n | \"string-like\"\n | \"array-like\"\n | \"enum-member-addressable\"\n | \"json-like\"\n | \"condition-like\"\n | \"object-like\";\n\nexport interface TagSignatureParameter {\n readonly kind: \"value\" | \"target-path\" | \"target-member\" | \"target-variant\";\n readonly label: string;\n readonly optional?: boolean;\n readonly capability?: SemanticCapability;\n readonly valueKind?: FormSpecValueKind;\n}\n\nexport interface TagSignature {\n readonly label: string;\n readonly placements: readonly FormSpecPlacement[];\n readonly parameters: readonly TagSignatureParameter[];\n}\n\nexport interface TagDefinition {\n readonly canonicalName: string;\n readonly valueKind: FormSpecValueKind | null;\n readonly requiresArgument: boolean;\n readonly supportedTargets: readonly FormSpecTargetKind[];\n readonly allowDuplicates: boolean;\n readonly category: FormSpecTagCategory;\n readonly placements: readonly FormSpecPlacement[];\n readonly capabilities: readonly SemanticCapability[];\n readonly completionDetail: string;\n readonly hoverMarkdown: string;\n readonly signatures: readonly TagSignature[];\n}\n\nexport type FormSpecTagDefinition = TagDefinition;\nexport type FormSpecTagOverload = TagSignature;\nexport type FormSpecTagParameter = TagSignatureParameter;\n\nexport interface ExtensionConstraintTagSource {\n readonly tagName: string;\n}\n\nexport interface ExtensionTagSource {\n readonly extensionId: string;\n readonly constraintTags?: readonly ExtensionConstraintTagSource[];\n}\n\nconst FIELD_PLACEMENTS = [\n \"class-field\",\n \"interface-field\",\n \"type-alias-field\",\n \"variable\",\n \"function-parameter\",\n \"method-parameter\",\n] as const satisfies readonly FormSpecPlacement[];\n\nconst TYPE_PLACEMENTS = [\n \"class\",\n \"interface\",\n \"type-alias\",\n] as const satisfies readonly FormSpecPlacement[];\n\nconst DECLARATION_PLACEMENTS = [\n \"class-method\",\n \"function\",\n] as const satisfies readonly FormSpecPlacement[];\n\nconst ALL_PLACEMENTS = [\n ...TYPE_PLACEMENTS,\n ...FIELD_PLACEMENTS,\n ...DECLARATION_PLACEMENTS,\n] as const satisfies readonly FormSpecPlacement[];\n\nconst INTEGER_VALUE_TAGS = new Set([\"minLength\", \"maxLength\", \"minItems\", \"maxItems\"]);\nconst SIGNED_INTEGER_VALUE_TAGS = new Set([\"order\"]);\nconst JSON_VALUE_TAGS = new Set([\"const\", \"enumOptions\"]);\nconst BOOLEAN_VALUE_TAGS = new Set([\"uniqueItems\"]);\nconst STRING_VALUE_TAGS = new Set([\n \"pattern\",\n \"displayName\",\n \"description\",\n \"format\",\n \"placeholder\",\n \"group\",\n \"example\",\n \"remarks\",\n \"see\",\n \"apiName\",\n]);\nconst CONDITION_VALUE_TAGS = new Set([\"showWhen\", \"hideWhen\", \"enableWhen\", \"disableWhen\"]);\n\nconst CONSTRAINT_COMPLETION_DETAIL: Record<string, string> = {\n minimum: \"Minimum numeric value (inclusive). Example: `@minimum 0`\",\n maximum: \"Maximum numeric value (inclusive). Example: `@maximum 100`\",\n exclusiveMinimum: \"Minimum numeric value (exclusive). Example: `@exclusiveMinimum 0`\",\n exclusiveMaximum: \"Maximum numeric value (exclusive). Example: `@exclusiveMaximum 100`\",\n multipleOf: \"Value must be a multiple of this number. Example: `@multipleOf 0.01`\",\n minLength: \"Minimum string length. Example: `@minLength 1`\",\n maxLength: \"Maximum string length. Example: `@maxLength 255`\",\n minItems: \"Minimum number of array items. Example: `@minItems 1`\",\n maxItems: \"Maximum number of array items. Example: `@maxItems 10`\",\n uniqueItems: \"Require all array items to be distinct. Example: `@uniqueItems`\",\n pattern: \"Regular expression pattern for string validation. Example: `@pattern ^[a-z]+$`\",\n enumOptions: 'Inline JSON array of allowed enum values. Example: `@enumOptions [\"a\",\"b\",\"c\"]`',\n const: 'Require a constant JSON value. Example: `@const \"USD\"`',\n};\n\nconst CONSTRAINT_HOVER_DOCS: Record<string, string> = {\n minimum: [\n \"**@minimum** `<number>`\",\n \"\",\n \"Sets an inclusive lower bound on a numeric field.\",\n \"\",\n \"Maps to `minimum` in JSON Schema.\",\n \"\",\n \"**Signature:** `@minimum [:path] <number>`\",\n ].join(\"\\n\"),\n maximum: [\n \"**@maximum** `<number>`\",\n \"\",\n \"Sets an inclusive upper bound on a numeric field.\",\n \"\",\n \"Maps to `maximum` in JSON Schema.\",\n \"\",\n \"**Signature:** `@maximum [:path] <number>`\",\n ].join(\"\\n\"),\n exclusiveMinimum: [\n \"**@exclusiveMinimum** `<number>`\",\n \"\",\n \"Sets an exclusive lower bound on a numeric field.\",\n \"\",\n \"Maps to `exclusiveMinimum` in JSON Schema.\",\n \"\",\n \"**Signature:** `@exclusiveMinimum [:path] <number>`\",\n ].join(\"\\n\"),\n exclusiveMaximum: [\n \"**@exclusiveMaximum** `<number>`\",\n \"\",\n \"Sets an exclusive upper bound on a numeric field.\",\n \"\",\n \"Maps to `exclusiveMaximum` in JSON Schema.\",\n \"\",\n \"**Signature:** `@exclusiveMaximum [:path] <number>`\",\n ].join(\"\\n\"),\n multipleOf: [\n \"**@multipleOf** `<number>`\",\n \"\",\n \"Requires the numeric value to be a multiple of the given number.\",\n \"\",\n \"Maps to `multipleOf` in JSON Schema.\",\n \"\",\n \"**Signature:** `@multipleOf [:path] <number>`\",\n ].join(\"\\n\"),\n minLength: [\n \"**@minLength** `<integer>`\",\n \"\",\n \"Sets a minimum character length on a string field.\",\n \"\",\n \"Maps to `minLength` in JSON Schema.\",\n \"\",\n \"**Signature:** `@minLength [:path] <integer>`\",\n ].join(\"\\n\"),\n maxLength: [\n \"**@maxLength** `<integer>`\",\n \"\",\n \"Sets a maximum character length on a string field.\",\n \"\",\n \"Maps to `maxLength` in JSON Schema.\",\n \"\",\n \"**Signature:** `@maxLength [:path] <integer>`\",\n ].join(\"\\n\"),\n minItems: [\n \"**@minItems** `<integer>`\",\n \"\",\n \"Sets a minimum number of items in an array field.\",\n \"\",\n \"Maps to `minItems` in JSON Schema.\",\n \"\",\n \"**Signature:** `@minItems [:path] <integer>`\",\n ].join(\"\\n\"),\n maxItems: [\n \"**@maxItems** `<integer>`\",\n \"\",\n \"Sets a maximum number of items in an array field.\",\n \"\",\n \"Maps to `maxItems` in JSON Schema.\",\n \"\",\n \"**Signature:** `@maxItems [:path] <integer>`\",\n ].join(\"\\n\"),\n uniqueItems: [\n \"**@uniqueItems**\",\n \"\",\n \"Requires all items in an array field to be distinct.\",\n \"\",\n \"Maps to `uniqueItems` in JSON Schema.\",\n \"\",\n \"**Signature:** `@uniqueItems [:path]`\",\n ].join(\"\\n\"),\n pattern: [\n \"**@pattern** `<regex>`\",\n \"\",\n \"Sets a regular expression pattern that a string field must match.\",\n \"\",\n \"Maps to `pattern` in JSON Schema.\",\n \"\",\n \"**Signature:** `@pattern [:path] <regex>`\",\n ].join(\"\\n\"),\n enumOptions: [\n \"**@enumOptions** `<json-array>`\",\n \"\",\n \"Specifies the allowed values for an enum field as an inline JSON array.\",\n \"\",\n \"Maps to `enum` in JSON Schema.\",\n \"\",\n \"**Signature:** `@enumOptions <json-array>`\",\n ].join(\"\\n\"),\n const: [\n \"**@const** `<json-literal>`\",\n \"\",\n \"Requires the field value to equal a single constant JSON value.\",\n \"\",\n \"Maps to `const` in JSON Schema.\",\n \"\",\n \"**Signature:** `@const [:path] <json-literal>`\",\n ].join(\"\\n\"),\n};\n\ntype SupportedSignatureTarget = Exclude<FormSpecTargetKind, \"none\">;\n\ninterface ExtraTagSpec {\n readonly requiresArgument: boolean;\n readonly supportedTargets: readonly FormSpecTargetKind[];\n readonly allowDuplicates: boolean;\n readonly category: FormSpecTagCategory;\n readonly placements: readonly FormSpecPlacement[];\n readonly completionDetail: string;\n readonly hoverSummary: string;\n readonly valueKind?: FormSpecValueKind | null;\n readonly valueLabel?: string;\n readonly targetPlacements?: Partial<\n Record<SupportedSignatureTarget, readonly FormSpecPlacement[]>\n >;\n}\n\nfunction inferValueKind(name: string): FormSpecValueKind | null {\n if (INTEGER_VALUE_TAGS.has(name)) return \"integer\";\n if (SIGNED_INTEGER_VALUE_TAGS.has(name)) return \"signedInteger\";\n if (JSON_VALUE_TAGS.has(name)) return \"json\";\n if (BOOLEAN_VALUE_TAGS.has(name)) return \"boolean\";\n if (STRING_VALUE_TAGS.has(name)) return \"string\";\n if (CONDITION_VALUE_TAGS.has(name)) return \"condition\";\n return null;\n}\n\nfunction getBuiltinValueKind(name: BuiltinConstraintName): FormSpecValueKind {\n return inferValueKind(name) ?? \"number\";\n}\n\nfunction getBuiltinConstraintCapability(name: BuiltinConstraintName): SemanticCapability {\n switch (name) {\n case \"minimum\":\n case \"maximum\":\n case \"exclusiveMinimum\":\n case \"exclusiveMaximum\":\n case \"multipleOf\":\n return \"numeric-comparable\";\n case \"minLength\":\n case \"maxLength\":\n case \"pattern\":\n return \"string-like\";\n case \"minItems\":\n case \"maxItems\":\n case \"uniqueItems\":\n return \"array-like\";\n case \"enumOptions\":\n return \"enum-member-addressable\";\n case \"const\":\n return \"json-like\";\n default: {\n const exhaustive: never = name;\n return exhaustive;\n }\n }\n}\n\nfunction capabilitiesForValueKind(\n valueKind: FormSpecValueKind | null\n): readonly SemanticCapability[] {\n switch (valueKind) {\n case \"number\":\n case \"integer\":\n case \"signedInteger\":\n return [\"numeric-comparable\"];\n case \"string\":\n return [\"string-like\"];\n case \"json\":\n return [\"json-like\"];\n case \"condition\":\n return [\"condition-like\"];\n case \"boolean\":\n case null:\n return [];\n default: {\n const exhaustive: never = valueKind;\n return exhaustive;\n }\n }\n}\n\nfunction valueLabelForKind(valueKind: FormSpecValueKind | null, fallback = \"<value>\"): string {\n switch (valueKind) {\n case \"number\":\n return \"<number>\";\n case \"integer\":\n case \"signedInteger\":\n return \"<integer>\";\n case \"string\":\n return \"<text>\";\n case \"json\":\n return \"<json>\";\n case \"condition\":\n return \"<condition>\";\n case \"boolean\":\n case null:\n return \"\";\n default: {\n const exhaustive: never = valueKind;\n void exhaustive;\n return fallback;\n }\n }\n}\n\nfunction targetLabelForKind(kind: SupportedSignatureTarget): string {\n switch (kind) {\n case \"path\":\n return \"[:path]\";\n case \"member\":\n return \":member\";\n case \"variant\":\n return \":variant\";\n default: {\n const exhaustive: never = kind;\n return exhaustive;\n }\n }\n}\n\nfunction parameterKindForTarget(\n targetKind: SupportedSignatureTarget\n): TagSignatureParameter[\"kind\"] {\n switch (targetKind) {\n case \"path\":\n return \"target-path\";\n case \"member\":\n return \"target-member\";\n case \"variant\":\n return \"target-variant\";\n default: {\n const exhaustive: never = targetKind;\n return exhaustive;\n }\n }\n}\n\nfunction createTargetParameter(\n targetKind: SupportedSignatureTarget,\n valueKind: FormSpecValueKind | null,\n pathCapability?: SemanticCapability\n): TagSignatureParameter {\n const base: TagSignatureParameter = {\n kind: parameterKindForTarget(targetKind),\n label: targetLabelForKind(targetKind),\n optional: targetKind === \"path\",\n };\n\n if (targetKind === \"path\") {\n const capability = pathCapability ?? capabilitiesForValueKind(valueKind)[0];\n return capability === undefined ? base : { ...base, capability };\n }\n\n if (targetKind === \"member\") {\n return { ...base, capability: \"enum-member-addressable\" };\n }\n\n return base;\n}\n\nfunction createSignature(\n name: string,\n placements: readonly FormSpecPlacement[],\n targetKind: SupportedSignatureTarget | null,\n valueKind: FormSpecValueKind | null,\n valueLabel: string,\n pathCapability?: SemanticCapability\n): TagSignature {\n const parameters: TagSignatureParameter[] = [];\n\n if (targetKind !== null) {\n parameters.push(createTargetParameter(targetKind, valueKind, pathCapability));\n }\n if (valueLabel !== \"\") {\n parameters.push(\n valueKind === null\n ? {\n kind: \"value\",\n label: valueLabel,\n }\n : {\n kind: \"value\",\n label: valueLabel,\n valueKind,\n }\n );\n }\n\n const targetLabel = targetKind === null ? \"\" : ` ${targetLabelForKind(targetKind)}`;\n const valueLabelSuffix = valueLabel === \"\" ? \"\" : ` ${valueLabel}`;\n\n return {\n label: `@${name}${targetLabel}${valueLabelSuffix}`,\n placements,\n parameters,\n };\n}\n\nfunction buildHoverMarkdown(\n name: string,\n hoverSummary: string,\n signatures: readonly TagSignature[],\n valueLabel: string\n): string {\n const header = valueLabel === \"\" ? `**@${name}**` : `**@${name}** \\`${valueLabel}\\``;\n const signatureLines =\n signatures.length === 1\n ? [`**Signature:** \\`${signatures[0]?.label ?? `@${name}`}\\``]\n : [\"**Signatures:**\", ...signatures.map((signature) => `- \\`${signature.label}\\``)];\n\n return [header, \"\", hoverSummary, \"\", ...signatureLines].join(\"\\n\");\n}\n\nfunction makeConstraintSignatures(name: BuiltinConstraintName): readonly TagSignature[] {\n const valueKind = getBuiltinValueKind(name);\n const subjectCapability = getBuiltinConstraintCapability(name);\n const valueLabel =\n name === \"pattern\"\n ? \"<regex>\"\n : name === \"enumOptions\"\n ? \"<json-array>\"\n : name === \"const\"\n ? \"<json-literal>\"\n : valueLabelForKind(valueKind);\n\n return [\n createSignature(name, FIELD_PLACEMENTS, null, valueKind, valueLabel),\n createSignature(name, FIELD_PLACEMENTS, \"path\", valueKind, valueLabel, subjectCapability),\n ];\n}\n\nconst BUILTIN_TAG_DEFINITIONS = Object.fromEntries(\n (Object.keys(BUILTIN_CONSTRAINT_DEFINITIONS) as BuiltinConstraintName[]).map((name) => {\n const valueKind = getBuiltinValueKind(name);\n const subjectCapability = getBuiltinConstraintCapability(name);\n return [\n name,\n {\n canonicalName: name,\n valueKind,\n requiresArgument: valueKind !== \"boolean\",\n supportedTargets: [\"none\", \"path\"] as const,\n allowDuplicates: false,\n category: \"constraint\" as const,\n placements: FIELD_PLACEMENTS,\n capabilities: [subjectCapability],\n completionDetail: CONSTRAINT_COMPLETION_DETAIL[name] ?? `@${name}`,\n hoverMarkdown: CONSTRAINT_HOVER_DOCS[name] ?? `**@${name}**`,\n signatures: makeConstraintSignatures(name),\n } satisfies TagDefinition,\n ];\n })\n) as Record<string, TagDefinition>;\n\nconst EXTRA_TAG_SPECS = {\n displayName: {\n requiresArgument: true,\n supportedTargets: [\"none\", \"member\", \"variant\"],\n allowDuplicates: false,\n category: \"annotation\",\n placements: [...TYPE_PLACEMENTS, ...FIELD_PLACEMENTS],\n completionDetail: \"Display label for a type, field, or enum member.\",\n hoverSummary: \"Provides a user-facing display label.\",\n valueLabel: \"<label>\",\n targetPlacements: {\n member: FIELD_PLACEMENTS,\n variant: TYPE_PLACEMENTS,\n },\n },\n description: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: false,\n category: \"annotation\",\n placements: [...TYPE_PLACEMENTS, ...FIELD_PLACEMENTS],\n completionDetail: \"Description text for a type or field.\",\n hoverSummary: \"Provides descriptive documentation for a type or field.\",\n },\n format: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: false,\n category: \"annotation\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Format hint for a field.\",\n hoverSummary: \"Provides a format hint for a field.\",\n valueLabel: \"<format>\",\n },\n placeholder: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: false,\n category: \"annotation\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Placeholder text for a field.\",\n hoverSummary: \"Provides placeholder text for a field.\",\n },\n order: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: false,\n category: \"annotation\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Field display order hint.\",\n hoverSummary: \"Provides an integer ordering hint for UI layout.\",\n },\n apiName: {\n requiresArgument: true,\n supportedTargets: [\"none\", \"member\", \"variant\"],\n allowDuplicates: false,\n category: \"annotation\",\n placements: [...TYPE_PLACEMENTS, ...FIELD_PLACEMENTS],\n completionDetail: \"API-facing serialized name for a type, field, or variant.\",\n hoverSummary: \"Overrides the serialized API name used in generated schema output.\",\n valueLabel: \"<identifier>\",\n targetPlacements: {\n member: FIELD_PLACEMENTS,\n variant: TYPE_PLACEMENTS,\n },\n },\n group: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: false,\n category: \"structure\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Assigns a field to a UI group.\",\n hoverSummary: \"Assigns the field to a named grouping container.\",\n valueLabel: \"<group>\",\n },\n showWhen: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: true,\n category: \"structure\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Conditional visibility rule.\",\n hoverSummary: \"Shows the field only when the condition is satisfied.\",\n },\n hideWhen: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: true,\n category: \"structure\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Conditional visibility suppression rule.\",\n hoverSummary: \"Hides the field when the condition is satisfied.\",\n },\n enableWhen: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: true,\n category: \"structure\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Conditional interactivity rule.\",\n hoverSummary: \"Enables the field only when the condition is satisfied.\",\n },\n disableWhen: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: true,\n category: \"structure\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Conditional disablement rule.\",\n hoverSummary: \"Disables the field when the condition is satisfied.\",\n },\n defaultValue: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: false,\n category: \"ecosystem\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Default JSON value for a field.\",\n hoverSummary: \"Provides a default JSON value for ecosystem integrations.\",\n valueLabel: \"<value>\",\n },\n deprecated: {\n requiresArgument: false,\n supportedTargets: [\"none\"],\n allowDuplicates: false,\n category: \"ecosystem\",\n placements: ALL_PLACEMENTS,\n completionDetail: \"Marks a declaration as deprecated.\",\n hoverSummary: \"Marks the declaration as deprecated.\",\n },\n example: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: true,\n category: \"ecosystem\",\n placements: [...TYPE_PLACEMENTS, ...FIELD_PLACEMENTS],\n completionDetail: \"Example serialized value.\",\n hoverSummary: \"Provides an example value for documentation and tooling.\",\n },\n remarks: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: false,\n category: \"ecosystem\",\n placements: ALL_PLACEMENTS,\n completionDetail: \"Additional remarks text.\",\n hoverSummary: \"Provides additional remarks for the declaration.\",\n },\n see: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: true,\n category: \"ecosystem\",\n placements: ALL_PLACEMENTS,\n completionDetail: \"Reference to related documentation.\",\n hoverSummary: \"References related documentation or declarations.\",\n valueLabel: \"<reference>\",\n },\n} as const satisfies Record<string, ExtraTagSpec>;\n\nfunction buildExtraTagDefinition(canonicalName: string, spec: ExtraTagSpec): TagDefinition {\n const valueKind = spec.valueKind ?? inferValueKind(canonicalName);\n const valueLabel = spec.requiresArgument ? (spec.valueLabel ?? valueLabelForKind(valueKind)) : \"\";\n const signatures: TagSignature[] = [];\n\n if (spec.supportedTargets.includes(\"none\")) {\n signatures.push(createSignature(canonicalName, spec.placements, null, valueKind, valueLabel));\n }\n if (spec.supportedTargets.includes(\"path\")) {\n signatures.push(\n createSignature(\n canonicalName,\n spec.targetPlacements?.path ?? spec.placements,\n \"path\",\n valueKind,\n valueLabel\n )\n );\n }\n if (spec.supportedTargets.includes(\"member\")) {\n signatures.push(\n createSignature(\n canonicalName,\n spec.targetPlacements?.member ?? spec.placements,\n \"member\",\n valueKind,\n valueLabel\n )\n );\n }\n if (spec.supportedTargets.includes(\"variant\")) {\n signatures.push(\n createSignature(\n canonicalName,\n spec.targetPlacements?.variant ?? spec.placements,\n \"variant\",\n valueKind,\n valueLabel\n )\n );\n }\n\n return {\n canonicalName,\n valueKind,\n requiresArgument: spec.requiresArgument,\n supportedTargets: spec.supportedTargets,\n allowDuplicates: spec.allowDuplicates,\n category: spec.category,\n placements: spec.placements,\n capabilities: capabilitiesForValueKind(valueKind),\n completionDetail: spec.completionDetail,\n hoverMarkdown: buildHoverMarkdown(canonicalName, spec.hoverSummary, signatures, valueLabel),\n signatures,\n };\n}\n\nconst EXTRA_TAG_DEFINITIONS: Record<string, TagDefinition> = Object.fromEntries(\n Object.entries(EXTRA_TAG_SPECS).map(([canonicalName, spec]) => [\n canonicalName,\n buildExtraTagDefinition(canonicalName, spec),\n ])\n);\n\nexport function normalizeFormSpecTagName(rawName: string): string {\n return normalizeConstraintTagName(rawName);\n}\n\nexport function getTagDefinition(\n rawName: string,\n extensions?: readonly ExtensionTagSource[]\n): TagDefinition | null {\n const normalized = normalizeFormSpecTagName(rawName);\n const builtin = BUILTIN_TAG_DEFINITIONS[normalized];\n if (builtin !== undefined) {\n return builtin;\n }\n\n const extra = EXTRA_TAG_DEFINITIONS[normalized];\n if (extra !== undefined) {\n return extra;\n }\n\n const extensionRegistration = getExtensionConstraintTags(extensions).find(\n (tag) => tag.tagName === normalized\n );\n\n if (extensionRegistration === undefined) {\n return null;\n }\n\n return {\n canonicalName: extensionRegistration.tagName,\n valueKind: null,\n requiresArgument: true,\n supportedTargets: [\"none\"] as const,\n allowDuplicates: true,\n category: \"constraint\",\n placements: FIELD_PLACEMENTS,\n capabilities: [],\n completionDetail: `Extension constraint tag from ${extensionRegistration.extensionId}`,\n hoverMarkdown: [\n `**@${extensionRegistration.tagName}** \\`<value>\\``,\n \"\",\n `Extension-defined constraint tag from \\`${extensionRegistration.extensionId}\\`.`,\n \"\",\n `**Signature:** \\`@${extensionRegistration.tagName} <value>\\``,\n ].join(\"\\n\"),\n signatures: [\n {\n label: `@${extensionRegistration.tagName} <value>`,\n placements: FIELD_PLACEMENTS,\n parameters: [{ kind: \"value\", label: \"<value>\" }],\n },\n ],\n };\n}\n\nexport function getConstraintTagDefinitions(\n extensions?: readonly ExtensionTagSource[]\n): readonly TagDefinition[] {\n const builtins = Object.values(BUILTIN_TAG_DEFINITIONS);\n const custom = getExtensionConstraintTags(extensions)\n .map((tag) => getTagDefinition(tag.tagName, extensions))\n .filter((tag): tag is TagDefinition => tag !== null);\n return [...builtins, ...custom];\n}\n\nexport function getAllTagDefinitions(\n extensions?: readonly ExtensionTagSource[]\n): readonly TagDefinition[] {\n const builtins = Object.values(BUILTIN_TAG_DEFINITIONS);\n const extras = Object.values(EXTRA_TAG_DEFINITIONS);\n const custom = getExtensionConstraintTags(extensions)\n .map((tag) => getTagDefinition(tag.tagName, extensions))\n .filter((tag): tag is TagDefinition => tag !== null);\n return [...builtins, ...extras, ...custom];\n}\n\nexport function getTagHoverMarkdown(\n rawName: string,\n extensions?: readonly ExtensionTagSource[]\n): string | null {\n return getTagDefinition(rawName, extensions)?.hoverMarkdown ?? null;\n}\n\nfunction getExtensionConstraintTags(\n extensions: readonly ExtensionTagSource[] | undefined\n): readonly { extensionId: string; tagName: string }[] {\n return (\n extensions?.flatMap((extension) => {\n const tagRecords = extension.constraintTags ?? [];\n return tagRecords.map((tag) => ({\n extensionId: extension.extensionId,\n tagName: tag.tagName,\n }));\n }) ?? []\n );\n}\n","import type { PathTarget } from \"@formspec/core\";\nimport { extractPathTarget } from \"./path-target.js\";\nimport {\n getTagDefinition,\n normalizeFormSpecTagName,\n type ExtensionTagSource,\n} from \"./tag-registry.js\";\n\nexport interface CommentSourceSpan {\n readonly start: number;\n readonly end: number;\n}\n\nexport type CommentSpan = CommentSourceSpan;\n\nexport interface ParsedCommentTargetSpecifier {\n readonly rawText: string;\n readonly valid: boolean;\n readonly kind: \"path\" | \"member\" | \"variant\" | \"ambiguous\";\n readonly fullSpan: CommentSourceSpan;\n readonly colonSpan: CommentSourceSpan;\n readonly span: CommentSourceSpan;\n readonly path: PathTarget | null;\n}\n\ninterface ParsedCommentTargetSpecifierWithLocalEnd extends ParsedCommentTargetSpecifier {\n readonly localEnd: number;\n}\n\nexport interface ParsedCommentTag {\n readonly rawTagName: string;\n readonly normalizedTagName: string;\n readonly recognized: boolean;\n readonly fullSpan: CommentSourceSpan;\n readonly tagNameSpan: CommentSourceSpan;\n readonly payloadSpan: CommentSourceSpan | null;\n readonly colonSpan: CommentSourceSpan | null;\n readonly target: ParsedCommentTargetSpecifier | null;\n readonly argumentSpan: CommentSourceSpan | null;\n readonly argumentText: string;\n}\n\nexport interface ParsedCommentBlock {\n readonly commentText: string;\n readonly offset: number;\n readonly tags: readonly ParsedCommentTag[];\n}\n\ninterface CommentLineProjection {\n readonly text: string;\n readonly rawOffsets: readonly number[];\n readonly rawContentEnd: number;\n}\n\nfunction isWhitespace(char: string | undefined): boolean {\n return char === \" \" || char === \"\\t\" || char === \"\\n\" || char === \"\\r\";\n}\n\nfunction isTagStart(lineText: string, index: number): boolean {\n if (lineText[index] !== \"@\") {\n return false;\n }\n\n const nextChar = lineText[index + 1];\n if (nextChar === undefined || !/[A-Za-z]/u.test(nextChar)) {\n return false;\n }\n\n const previousChar = lineText[index - 1];\n return previousChar === undefined || isWhitespace(previousChar);\n}\n\nfunction findTagEnd(lineText: string, index: number): number {\n let cursor = index + 1;\n while (cursor < lineText.length && /[A-Za-z0-9]/u.test(lineText[cursor] ?? \"\")) {\n cursor += 1;\n }\n return cursor;\n}\n\nfunction trimTrailingWhitespace(lineText: string, end: number): number {\n let cursor = end;\n while (cursor > 0 && isWhitespace(lineText[cursor - 1])) {\n cursor -= 1;\n }\n return cursor;\n}\n\nfunction spanFromLine(\n line: CommentLineProjection,\n start: number,\n end: number,\n baseOffset: number\n): CommentSourceSpan {\n const rawStart = line.rawOffsets[start];\n if (rawStart === undefined) {\n throw new Error(`Invalid projected span start: ${String(start)}`);\n }\n\n const rawEnd =\n end >= line.text.length\n ? line.rawContentEnd\n : (line.rawOffsets[end - 1] ?? line.rawContentEnd - 1) + 1;\n\n return {\n start: baseOffset + rawStart,\n end: baseOffset + rawEnd,\n };\n}\n\nfunction classifyTargetKind(\n canonicalName: string,\n targetText: string,\n extensions: readonly ExtensionTagSource[] | undefined\n): ParsedCommentTargetSpecifier[\"kind\"] {\n if (targetText === \"singular\" || targetText === \"plural\") {\n return \"variant\";\n }\n\n if (targetText.includes(\".\")) {\n return \"path\";\n }\n\n const definition = getTagDefinition(canonicalName, extensions);\n const supportedTargets = definition?.supportedTargets.filter((target) => target !== \"none\") ?? [];\n\n if (supportedTargets.includes(\"path\")) {\n return \"path\";\n }\n if (supportedTargets.includes(\"member\") && supportedTargets.includes(\"variant\")) {\n return \"ambiguous\";\n }\n if (supportedTargets.includes(\"member\")) {\n return \"member\";\n }\n if (supportedTargets.includes(\"variant\")) {\n return \"variant\";\n }\n return \"path\";\n}\n\nfunction parseTargetSpecifier(\n line: CommentLineProjection,\n payloadStart: number,\n payloadEnd: number,\n canonicalName: string,\n baseOffset: number,\n extensions: readonly ExtensionTagSource[] | undefined\n): ParsedCommentTargetSpecifierWithLocalEnd | null {\n if (payloadStart >= payloadEnd || line.text[payloadStart] !== \":\") {\n return null;\n }\n\n let targetEnd = payloadStart + 1;\n while (targetEnd < payloadEnd && !isWhitespace(line.text[targetEnd])) {\n targetEnd += 1;\n }\n\n const fullText = line.text.slice(payloadStart, targetEnd);\n const targetText = fullText.slice(1);\n const parsedPath = extractPathTarget(fullText);\n const specifierSpan = spanFromLine(line, payloadStart + 1, targetEnd, baseOffset);\n\n return {\n rawText: targetText,\n valid: parsedPath !== null && parsedPath.remainingText === \"\",\n kind: classifyTargetKind(canonicalName, targetText, extensions),\n fullSpan: spanFromLine(line, payloadStart, targetEnd, baseOffset),\n colonSpan: spanFromLine(line, payloadStart, payloadStart + 1, baseOffset),\n span: specifierSpan,\n path: parsedPath?.path ?? null,\n localEnd: targetEnd,\n };\n}\n\nfunction projectCommentLines(commentText: string): readonly CommentLineProjection[] {\n const projections: CommentLineProjection[] = [];\n const commentBodyStart = commentText.startsWith(\"/**\") ? 3 : commentText.startsWith(\"/*\") ? 2 : 0;\n const commentBodyEnd = commentText.endsWith(\"*/\") ? commentText.length - 2 : commentText.length;\n\n let cursor = commentBodyStart;\n while (cursor <= commentBodyEnd) {\n const lineStart = cursor;\n let lineEnd = cursor;\n while (lineEnd < commentBodyEnd && commentText[lineEnd] !== \"\\n\") {\n lineEnd += 1;\n }\n\n let contentEnd = lineEnd;\n if (contentEnd > lineStart && commentText[contentEnd - 1] === \"\\r\") {\n contentEnd -= 1;\n }\n\n let contentStart = lineStart;\n while (\n contentStart < contentEnd &&\n (commentText[contentStart] === \" \" || commentText[contentStart] === \"\\t\")\n ) {\n contentStart += 1;\n }\n if (contentStart < contentEnd && commentText[contentStart] === \"*\") {\n contentStart += 1;\n while (\n contentStart < contentEnd &&\n (commentText[contentStart] === \" \" || commentText[contentStart] === \"\\t\")\n ) {\n contentStart += 1;\n }\n }\n\n const rawOffsets: number[] = [];\n let text = \"\";\n for (let index = contentStart; index < contentEnd; index += 1) {\n rawOffsets.push(index);\n text += commentText[index] ?? \"\";\n }\n\n projections.push({\n text,\n rawOffsets,\n rawContentEnd: contentEnd,\n });\n\n if (lineEnd >= commentBodyEnd) {\n break;\n }\n cursor = lineEnd + 1;\n }\n\n return projections;\n}\n\nexport interface ParseCommentSyntaxOptions {\n readonly offset?: number;\n readonly extensions?: readonly ExtensionTagSource[];\n}\n\nexport function parseCommentBlock(\n commentText: string,\n options?: ParseCommentSyntaxOptions\n): ParsedCommentBlock {\n const tags: ParsedCommentTag[] = [];\n const baseOffset = options?.offset ?? 0;\n\n for (const line of projectCommentLines(commentText)) {\n const tagStarts: number[] = [];\n\n for (let index = 0; index < line.text.length; index += 1) {\n if (isTagStart(line.text, index)) {\n tagStarts.push(index);\n }\n }\n\n for (let tagIndex = 0; tagIndex < tagStarts.length; tagIndex += 1) {\n const tagStart = tagStarts[tagIndex];\n if (tagStart === undefined) {\n continue;\n }\n\n const tagEnd = findTagEnd(line.text, tagStart);\n const nextTagStart = tagStarts[tagIndex + 1] ?? line.text.length;\n const trimmedTagSegmentEnd = trimTrailingWhitespace(line.text, nextTagStart);\n const rawName = line.text.slice(tagStart + 1, tagEnd);\n const canonicalName = normalizeFormSpecTagName(rawName);\n\n let payloadStart = tagEnd;\n while (payloadStart < trimmedTagSegmentEnd && isWhitespace(line.text[payloadStart])) {\n payloadStart += 1;\n }\n\n const target = parseTargetSpecifier(\n line,\n payloadStart,\n trimmedTagSegmentEnd,\n canonicalName,\n baseOffset,\n options?.extensions\n );\n\n let valueStart = payloadStart;\n if (target !== null) {\n valueStart = target.localEnd;\n while (valueStart < trimmedTagSegmentEnd && isWhitespace(line.text[valueStart])) {\n valueStart += 1;\n }\n }\n\n const payloadSpan =\n payloadStart < trimmedTagSegmentEnd\n ? spanFromLine(line, payloadStart, trimmedTagSegmentEnd, baseOffset)\n : null;\n const valueSpan =\n valueStart < trimmedTagSegmentEnd\n ? spanFromLine(line, valueStart, trimmedTagSegmentEnd, baseOffset)\n : null;\n\n const parsedTarget =\n target === null\n ? null\n : {\n rawText: target.rawText,\n valid: target.valid,\n kind: target.kind,\n fullSpan: target.fullSpan,\n colonSpan: target.colonSpan,\n span: target.span,\n path: target.path,\n };\n\n tags.push({\n rawTagName: rawName,\n normalizedTagName: canonicalName,\n recognized: getTagDefinition(canonicalName, options?.extensions) !== null,\n fullSpan: spanFromLine(line, tagStart, trimmedTagSegmentEnd, baseOffset),\n tagNameSpan: spanFromLine(line, tagStart, tagEnd, baseOffset),\n payloadSpan,\n colonSpan: parsedTarget?.colonSpan ?? null,\n target: parsedTarget,\n argumentSpan: valueSpan,\n argumentText:\n valueSpan === null\n ? \"\"\n : commentText.slice(valueSpan.start - baseOffset, valueSpan.end - baseOffset),\n });\n }\n }\n\n return {\n commentText,\n offset: baseOffset,\n tags,\n };\n}\nexport function parseTagSyntax(\n rawTagName: string,\n payloadText: string,\n options?: Omit<ParseCommentSyntaxOptions, \"offset\">\n): ParsedCommentTag {\n const separator = payloadText === \"\" || isWhitespace(payloadText[0]) ? \"\" : \" \";\n const parsed = parseCommentBlock(`/** @${rawTagName}${separator}${payloadText} */`, options);\n const [tag] = parsed.tags;\n if (tag === undefined) {\n throw new Error(`Unable to parse synthetic tag syntax for @${rawTagName}`);\n }\n return tag;\n}\n\nexport function sliceCommentSpan(\n commentText: string,\n span: CommentSpan,\n options?: { readonly offset?: number }\n): string {\n const baseOffset = options?.offset ?? 0;\n return commentText.slice(span.start - baseOffset, span.end - baseOffset);\n}\n","import * as ts from \"typescript\";\nimport type { FormSpecPlacement, SemanticCapability } from \"./tag-registry.js\";\n\nexport type FormSpecSemanticCapability = SemanticCapability;\n\n/**\n * Result of resolving a dotted FormSpec path target through a TypeScript type.\n */\nexport type ResolvedPathTargetType =\n | {\n readonly kind: \"resolved\";\n readonly type: ts.Type;\n }\n | {\n readonly kind: \"missing-property\";\n readonly segment: string;\n }\n | {\n readonly kind: \"unresolvable\";\n readonly type: ts.Type;\n };\n\nfunction stripNullishUnion(type: ts.Type): ts.Type {\n if (!type.isUnion()) {\n return type;\n }\n\n const nonNullish = type.types.filter(\n (member) => (member.flags & (ts.TypeFlags.Null | ts.TypeFlags.Undefined)) === 0\n );\n if (nonNullish.length === 1 && nonNullish[0] !== undefined) {\n return nonNullish[0];\n }\n\n return type;\n}\n\nfunction isIntersectionWithBase(type: ts.Type, predicate: (member: ts.Type) => boolean): boolean {\n return type.isIntersection() && type.types.some((member) => predicate(member));\n}\n\nfunction isNumberLike(type: ts.Type): boolean {\n const stripped = stripNullishUnion(type);\n if (\n stripped.flags &\n (ts.TypeFlags.Number |\n ts.TypeFlags.NumberLiteral |\n ts.TypeFlags.BigInt |\n ts.TypeFlags.BigIntLiteral)\n ) {\n return true;\n }\n\n if (stripped.isUnion()) {\n return stripped.types.every((member) => isNumberLike(member));\n }\n\n return isIntersectionWithBase(stripped, isNumberLike);\n}\n\nfunction isStringLike(type: ts.Type): boolean {\n const stripped = stripNullishUnion(type);\n if (stripped.flags & (ts.TypeFlags.String | ts.TypeFlags.StringLiteral)) {\n return true;\n }\n\n if (stripped.isUnion()) {\n return stripped.types.every((member) => isStringLike(member));\n }\n\n return isIntersectionWithBase(stripped, isStringLike);\n}\n\nfunction isBooleanLike(type: ts.Type): boolean {\n const stripped = stripNullishUnion(type);\n if (stripped.flags & (ts.TypeFlags.Boolean | ts.TypeFlags.BooleanLiteral)) {\n return true;\n }\n\n if (stripped.isUnion()) {\n return stripped.types.every((member) => isBooleanLike(member));\n }\n\n return isIntersectionWithBase(stripped, isBooleanLike);\n}\n\nfunction isNullLike(type: ts.Type): boolean {\n const stripped = stripNullishUnion(type);\n if (stripped.flags & ts.TypeFlags.Null) {\n return true;\n }\n\n if (stripped.isUnion()) {\n return stripped.types.every((member) => isNullLike(member));\n }\n\n return isIntersectionWithBase(stripped, isNullLike);\n}\n\nfunction isArrayLike(type: ts.Type, checker: ts.TypeChecker): boolean {\n const stripped = stripNullishUnion(type);\n if (checker.isArrayType(stripped)) {\n return true;\n }\n\n const symbol = stripped.getSymbol();\n return symbol?.name === \"Array\" || symbol?.name === \"ReadonlyArray\";\n}\n\nfunction isStringLiteralUnion(type: ts.Type): boolean {\n const stripped = stripNullishUnion(type);\n return stripped.isUnion() && stripped.types.length > 0 && stripped.types.every(isStringLike);\n}\n\nfunction isObjectLike(type: ts.Type, checker: ts.TypeChecker): boolean {\n const stripped = stripNullishUnion(type);\n return !isArrayLike(stripped, checker) && (stripped.flags & ts.TypeFlags.Object) !== 0;\n}\n\nfunction isJsonLike(type: ts.Type, checker: ts.TypeChecker): boolean {\n const stripped = stripNullishUnion(type);\n\n if (\n isNullLike(stripped) ||\n isNumberLike(stripped) ||\n isStringLike(stripped) ||\n isBooleanLike(stripped)\n ) {\n return true;\n }\n\n if (stripped.isUnion()) {\n return stripped.types.every((member) => isJsonLike(member, checker));\n }\n\n if (isArrayLike(stripped, checker) || isObjectLike(stripped, checker)) {\n return true;\n }\n\n return isIntersectionWithBase(stripped, (member) => isJsonLike(member, checker));\n}\n\nfunction getArrayElementType(type: ts.Type, checker: ts.TypeChecker): ts.Type | null {\n const stripped = stripNullishUnion(type);\n if (!checker.isArrayType(stripped)) {\n return null;\n }\n\n return checker.getTypeArguments(stripped as ts.TypeReference)[0] ?? null;\n}\n\nexport function resolveDeclarationPlacement(node: ts.Node): FormSpecPlacement | null {\n if (ts.isClassDeclaration(node)) return \"class\";\n if (ts.isPropertyDeclaration(node)) return \"class-field\";\n if (ts.isMethodDeclaration(node)) return \"class-method\";\n if (ts.isInterfaceDeclaration(node)) return \"interface\";\n if (ts.isPropertySignature(node)) return \"interface-field\";\n if (ts.isTypeAliasDeclaration(node)) return \"type-alias\";\n if (ts.isVariableDeclaration(node)) return \"variable\";\n if (ts.isFunctionDeclaration(node)) return \"function\";\n if (ts.isParameter(node)) {\n if (ts.isMethodDeclaration(node.parent) || ts.isConstructorDeclaration(node.parent)) {\n return \"method-parameter\";\n }\n return \"function-parameter\";\n }\n return null;\n}\n\nexport function getTypeSemanticCapabilities(\n type: ts.Type,\n checker: ts.TypeChecker\n): readonly SemanticCapability[] {\n const capabilities = new Set<SemanticCapability>();\n\n if (isNumberLike(type)) {\n capabilities.add(\"numeric-comparable\");\n }\n if (isStringLike(type)) {\n capabilities.add(\"string-like\");\n }\n if (isJsonLike(type, checker)) {\n capabilities.add(\"json-like\");\n }\n if (isArrayLike(type, checker)) {\n capabilities.add(\"array-like\");\n }\n if (isStringLiteralUnion(type)) {\n capabilities.add(\"enum-member-addressable\");\n }\n if (isObjectLike(type, checker)) {\n capabilities.add(\"object-like\");\n }\n\n return [...capabilities];\n}\n\nexport function hasTypeSemanticCapability(\n type: ts.Type,\n checker: ts.TypeChecker,\n capability: SemanticCapability\n): boolean {\n return getTypeSemanticCapabilities(type, checker).includes(capability);\n}\n\n/**\n * Resolves a dotted FormSpec path target against a TypeScript type.\n *\n * Arrays are traversed through their item type so path-targets behave the same\n * way they do in the IR validator and cursor-context completion logic.\n */\nexport function resolvePathTargetType(\n type: ts.Type,\n checker: ts.TypeChecker,\n segments: readonly string[]\n): ResolvedPathTargetType {\n const stripped = stripNullishUnion(type);\n\n if (segments.length === 0) {\n return {\n kind: \"resolved\",\n type: stripped,\n };\n }\n\n const arrayElementType = getArrayElementType(stripped, checker);\n if (arrayElementType !== null) {\n return resolvePathTargetType(arrayElementType, checker, segments);\n }\n\n if ((stripped.flags & ts.TypeFlags.Object) === 0) {\n return {\n kind: \"unresolvable\",\n type: stripped,\n };\n }\n\n const [segment, ...rest] = segments;\n if (segment === undefined) {\n throw new Error(\"Invariant violation: path traversal requires a segment\");\n }\n\n const property = stripped.getProperty(segment);\n if (property === undefined) {\n return {\n kind: \"missing-property\",\n segment,\n };\n }\n\n const declaration = property.valueDeclaration ?? property.declarations?.[0];\n if (declaration === undefined) {\n return {\n kind: \"unresolvable\",\n type: stripped,\n };\n }\n\n return resolvePathTargetType(\n checker.getTypeOfSymbolAtLocation(property, declaration),\n checker,\n rest\n );\n}\n\nfunction collectPropertyPaths(\n type: ts.Type,\n checker: ts.TypeChecker,\n capability: SemanticCapability,\n prefix: readonly string[],\n visited: Set<ts.Type>\n): string[] {\n const stripped = stripNullishUnion(type);\n if (visited.has(stripped)) {\n return [];\n }\n visited.add(stripped);\n\n const suggestions: string[] = [];\n\n if (hasTypeSemanticCapability(stripped, checker, capability) && prefix.length > 0) {\n suggestions.push(prefix.join(\".\"));\n }\n\n for (const property of stripped.getProperties()) {\n const declaration = property.valueDeclaration ?? property.declarations?.[0];\n if (declaration === undefined) {\n continue;\n }\n\n const propertyType = checker.getTypeOfSymbolAtLocation(property, declaration);\n const nextPrefix = [...prefix, property.name];\n suggestions.push(\n ...collectPropertyPaths(propertyType, checker, capability, nextPrefix, visited)\n );\n }\n\n return suggestions;\n}\n\nexport function collectCompatiblePathTargets(\n type: ts.Type,\n checker: ts.TypeChecker,\n capability: SemanticCapability\n): readonly string[] {\n return collectPropertyPaths(type, checker, capability, [], new Set<ts.Type>());\n}\n","import {\n parseCommentBlock,\n type ParsedCommentBlock,\n type ParsedCommentTag,\n} from \"./comment-syntax.js\";\nimport type * as ts from \"typescript\";\nimport { collectCompatiblePathTargets } from \"./ts-binding.js\";\nimport {\n getAllTagDefinitions,\n getTagDefinition,\n type ExtensionTagSource,\n type FormSpecPlacement,\n type FormSpecTargetKind,\n type TagDefinition,\n type TagSignature,\n} from \"./tag-registry.js\";\n\nexport interface EnclosingDocComment {\n readonly text: string;\n readonly start: number;\n readonly end: number;\n readonly parsed: ParsedCommentBlock;\n}\n\nexport interface CommentCursorTarget {\n readonly kind: \"tag-name\" | \"colon\" | \"target\" | \"argument\";\n readonly tag: ParsedCommentTag;\n}\n\nexport type CommentCompletionContext =\n | {\n readonly kind: \"tag-name\";\n readonly prefix: string;\n }\n | {\n readonly kind: \"target\";\n readonly tag: ParsedCommentTag;\n }\n | {\n readonly kind: \"argument\";\n readonly tag: ParsedCommentTag;\n }\n | {\n readonly kind: \"none\";\n };\n\nexport interface CommentSemanticContextOptions {\n readonly extensions?: readonly ExtensionTagSource[];\n readonly placement?: FormSpecPlacement | null;\n readonly checker?: ts.TypeChecker;\n readonly subjectType?: ts.Type;\n}\n\nexport interface CommentTagSemanticContext {\n readonly tag: ParsedCommentTag;\n readonly tagDefinition: TagDefinition | null;\n readonly placement: FormSpecPlacement | null;\n readonly signatures: readonly TagSignature[];\n readonly supportedTargets: readonly FormSpecTargetKind[];\n readonly targetCompletions: readonly string[];\n readonly compatiblePathTargets: readonly string[];\n readonly valueLabels: readonly string[];\n readonly tagHoverMarkdown: string | null;\n readonly targetHoverMarkdown: string | null;\n readonly argumentHoverMarkdown: string | null;\n}\n\nexport type SemanticCommentCompletionContext =\n | {\n readonly kind: \"tag-name\";\n readonly prefix: string;\n readonly availableTags: readonly TagDefinition[];\n }\n | {\n readonly kind: \"target\";\n readonly semantic: CommentTagSemanticContext;\n }\n | {\n readonly kind: \"argument\";\n readonly semantic: CommentTagSemanticContext;\n readonly valueLabels: readonly string[];\n }\n | {\n readonly kind: \"none\";\n };\n\nexport interface CommentHoverInfo {\n readonly kind: \"tag-name\" | \"target\" | \"argument\";\n readonly markdown: string;\n}\n\nfunction isWordChar(char: string | undefined): boolean {\n return char !== undefined && /[A-Za-z0-9]/u.test(char);\n}\n\nfunction isWhitespaceLike(char: string | undefined): boolean {\n return char === undefined || /\\s/u.test(char) || char === \"*\";\n}\n\nfunction containsOffset(tag: ParsedCommentTag, offset: number): boolean {\n return offset >= tag.tagNameSpan.start && offset <= tag.tagNameSpan.end;\n}\n\nfunction filterSignaturesByPlacement(\n signatures: readonly TagSignature[],\n placement: FormSpecPlacement | null | undefined\n): readonly TagSignature[] {\n if (placement === undefined || placement === null) {\n return signatures;\n }\n\n const filtered = signatures.filter((signature) => signature.placements.includes(placement));\n return filtered.length > 0 ? filtered : signatures;\n}\n\nfunction getCompatiblePathTargetsForSignatures(\n signatures: readonly TagSignature[],\n checker: ts.TypeChecker | undefined,\n subjectType: ts.Type | undefined\n): readonly string[] {\n if (checker === undefined || subjectType === undefined) {\n return [];\n }\n\n const suggestions = new Set<string>();\n for (const signature of signatures) {\n for (const parameter of signature.parameters) {\n if (parameter.kind !== \"target-path\" || parameter.capability === undefined) {\n continue;\n }\n\n for (const target of collectCompatiblePathTargets(\n subjectType,\n checker,\n parameter.capability\n )) {\n suggestions.add(target);\n }\n }\n }\n\n return [...suggestions].sort();\n}\n\nfunction getSupportedTargets(signatures: readonly TagSignature[]): readonly FormSpecTargetKind[] {\n const supportedTargets = new Set<FormSpecTargetKind>([\"none\"]);\n\n for (const signature of signatures) {\n for (const parameter of signature.parameters) {\n switch (parameter.kind) {\n case \"target-path\":\n supportedTargets.add(\"path\");\n break;\n case \"target-member\":\n supportedTargets.add(\"member\");\n break;\n case \"target-variant\":\n supportedTargets.add(\"variant\");\n break;\n default:\n break;\n }\n }\n }\n\n return [...supportedTargets];\n}\n\nfunction getTargetCompletions(\n signatures: readonly TagSignature[],\n compatiblePathTargets: readonly string[]\n): readonly string[] {\n const completions = new Set<string>();\n\n for (const signature of signatures) {\n for (const parameter of signature.parameters) {\n switch (parameter.kind) {\n case \"target-path\":\n for (const target of compatiblePathTargets) {\n completions.add(target);\n }\n break;\n case \"target-variant\":\n completions.add(\"singular\");\n completions.add(\"plural\");\n break;\n default:\n break;\n }\n }\n }\n\n return [...completions];\n}\n\nexport function getCommentTagSemanticContext(\n tag: ParsedCommentTag,\n options?: CommentSemanticContextOptions\n): CommentTagSemanticContext {\n const tagDefinition = getTagDefinition(tag.normalizedTagName, options?.extensions);\n const signatures = filterSignaturesByPlacement(\n tagDefinition?.signatures ?? [],\n options?.placement\n );\n const compatiblePathTargets = getCompatiblePathTargetsForSignatures(\n signatures,\n options?.checker,\n options?.subjectType\n );\n\n const semantic: CommentTagSemanticContext = {\n tag,\n tagDefinition,\n placement: options?.placement ?? null,\n signatures,\n supportedTargets: getSupportedTargets(signatures),\n targetCompletions: getTargetCompletions(signatures, compatiblePathTargets),\n compatiblePathTargets,\n valueLabels: getValueLabels(signatures),\n tagHoverMarkdown: tagDefinition?.hoverMarkdown ?? null,\n targetHoverMarkdown: null,\n argumentHoverMarkdown: null,\n };\n\n return {\n ...semantic,\n targetHoverMarkdown: buildTargetHoverMarkdown(semantic),\n argumentHoverMarkdown: buildArgumentHoverMarkdown(semantic),\n };\n}\n\nfunction getValueLabels(signatures: readonly TagSignature[]): readonly string[] {\n const labels = new Set<string>();\n for (const signature of signatures) {\n for (const parameter of signature.parameters) {\n if (parameter.kind === \"value\") {\n labels.add(parameter.label);\n }\n }\n }\n return [...labels];\n}\n\nfunction getTargetKindLabels(supportedTargets: readonly FormSpecTargetKind[]): string {\n const labels = supportedTargets\n .filter((kind): kind is Exclude<FormSpecTargetKind, \"none\"> => kind !== \"none\")\n .map((kind) => `\\`${kind}\\``);\n return labels.length === 0 ? \"none\" : labels.join(\", \");\n}\n\nfunction buildTargetHoverMarkdown(semantic: CommentTagSemanticContext): string | null {\n if (semantic.tagDefinition === null) {\n return null;\n }\n\n const currentTarget = semantic.tag.target?.rawText ?? \"\";\n const lines = [\n `**Target for @${semantic.tagDefinition.canonicalName}**`,\n \"\",\n `Supported target forms: ${getTargetKindLabels(semantic.supportedTargets)}`,\n ];\n\n if (currentTarget !== \"\") {\n lines.push(\"\", `Current target: \\`:${currentTarget}\\``);\n }\n\n const MAX_HOVER_PATH_TARGETS = 8;\n if (semantic.compatiblePathTargets.length > 0) {\n lines.push(\"\", \"**Compatible path targets:**\");\n for (const target of semantic.compatiblePathTargets.slice(0, MAX_HOVER_PATH_TARGETS)) {\n lines.push(`- \\`:${target}\\``);\n }\n } else if (semantic.supportedTargets.includes(\"variant\")) {\n lines.push(\"\", \"Use `:singular` or `:plural` for variant-specific names.\");\n } else if (semantic.supportedTargets.includes(\"path\")) {\n lines.push(\n \"\",\n \"Type-aware path completions become available when TypeScript binding is provided.\"\n );\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction buildArgumentHoverMarkdown(semantic: CommentTagSemanticContext): string | null {\n if (semantic.tagDefinition === null) {\n return null;\n }\n\n const valueLabels = getValueLabels(semantic.signatures);\n const formattedValueLabels = valueLabels.map((label) => `\\`${label}\\``);\n const soleSignature = semantic.signatures.length === 1 ? semantic.signatures[0] : undefined;\n const signatureLines =\n semantic.signatures.length === 0\n ? []\n : soleSignature !== undefined\n ? [`**Signature:** \\`${soleSignature.label}\\``]\n : [\n \"**Signatures:**\",\n ...semantic.signatures.map((signature) => `- \\`${signature.label}\\``),\n ];\n\n return [\n `**Argument for @${semantic.tagDefinition.canonicalName}**`,\n \"\",\n `Expected value: ${formattedValueLabels.join(\" or \") || \"`<value>`\"}`,\n \"\",\n ...signatureLines,\n ].join(\"\\n\");\n}\n\nexport function findEnclosingDocComment(\n documentText: string,\n offset: number,\n options?: { readonly extensions?: readonly ExtensionTagSource[] }\n): EnclosingDocComment | null {\n const commentPattern = /\\/\\*\\*[\\s\\S]*?\\*\\//gu;\n\n for (const match of documentText.matchAll(commentPattern)) {\n const fullMatch = match[0];\n const index = match.index;\n const start = index;\n const end = start + fullMatch.length;\n if (offset >= start && offset <= end) {\n return {\n text: fullMatch,\n start,\n end,\n parsed: parseCommentBlock(fullMatch, {\n offset: start,\n ...(options?.extensions !== undefined ? { extensions: options.extensions } : {}),\n }),\n };\n }\n }\n\n return null;\n}\n\nexport function findCommentTagAtOffset(\n documentText: string,\n offset: number,\n options?: { readonly extensions?: readonly ExtensionTagSource[] }\n): ParsedCommentTag | null {\n const comment = findEnclosingDocComment(documentText, offset, options);\n if (comment === null) {\n return null;\n }\n\n return comment.parsed.tags.find((tag) => containsOffset(tag, offset)) ?? null;\n}\n\nexport function getCommentCursorTargetAtOffset(\n documentText: string,\n offset: number,\n options?: { readonly extensions?: readonly ExtensionTagSource[] }\n): CommentCursorTarget | null {\n const comment = findEnclosingDocComment(documentText, offset, options);\n if (comment === null) {\n return null;\n }\n\n for (const tag of comment.parsed.tags) {\n if (containsOffset(tag, offset)) {\n return {\n kind: \"tag-name\",\n tag,\n };\n }\n\n if (tag.colonSpan !== null && offset >= tag.colonSpan.start && offset <= tag.colonSpan.end) {\n return {\n kind: \"colon\",\n tag,\n };\n }\n\n if (tag.target !== null && offset >= tag.target.span.start && offset <= tag.target.span.end) {\n return {\n kind: \"target\",\n tag,\n };\n }\n\n if (\n tag.argumentSpan !== null &&\n offset >= tag.argumentSpan.start &&\n offset <= tag.argumentSpan.end\n ) {\n return {\n kind: \"argument\",\n tag,\n };\n }\n }\n\n return null;\n}\n\nexport function getTagCompletionPrefixAtOffset(\n documentText: string,\n offset: number\n): string | null {\n const comment = findEnclosingDocComment(documentText, offset);\n if (comment === null) {\n return null;\n }\n\n const relativeOffset = offset - comment.start;\n if (relativeOffset < 0 || relativeOffset > comment.text.length) {\n return null;\n }\n\n let cursor = relativeOffset;\n while (cursor > 0 && isWordChar(comment.text[cursor - 1])) {\n cursor -= 1;\n }\n\n const atIndex = cursor - 1;\n if (atIndex < 0 || comment.text[atIndex] !== \"@\") {\n return null;\n }\n\n const previousChar = atIndex > 0 ? comment.text[atIndex - 1] : undefined;\n if (!isWhitespaceLike(previousChar)) {\n return null;\n }\n\n return comment.text.slice(cursor, relativeOffset);\n}\n\nexport function getCommentCompletionContextAtOffset(\n documentText: string,\n offset: number,\n options?: { readonly extensions?: readonly ExtensionTagSource[] }\n): CommentCompletionContext {\n const prefix = getTagCompletionPrefixAtOffset(documentText, offset);\n if (prefix !== null) {\n return {\n kind: \"tag-name\",\n prefix,\n };\n }\n\n const target = getCommentCursorTargetAtOffset(documentText, offset, options);\n if (target?.kind === \"target\" || target?.kind === \"colon\") {\n return {\n kind: \"target\",\n tag: target.tag,\n };\n }\n\n if (target?.kind === \"argument\") {\n return {\n kind: \"argument\",\n tag: target.tag,\n };\n }\n\n return {\n kind: \"none\",\n };\n}\n\n/**\n * Resolves the completion context at a document offset, upgrading syntax-only\n * results with placement/type-aware semantics when TypeScript binding data is\n * available.\n */\nexport function getSemanticCommentCompletionContextAtOffset(\n documentText: string,\n offset: number,\n options?: CommentSemanticContextOptions\n): SemanticCommentCompletionContext {\n const prefix = getTagCompletionPrefixAtOffset(documentText, offset);\n if (prefix !== null) {\n return {\n kind: \"tag-name\",\n prefix,\n availableTags: getAllTagDefinitions(options?.extensions),\n };\n }\n\n const target = getCommentCursorTargetAtOffset(\n documentText,\n offset,\n options?.extensions ? { extensions: options.extensions } : undefined\n );\n if (target?.kind === \"target\" || target?.kind === \"colon\") {\n return {\n kind: \"target\",\n semantic: getCommentTagSemanticContext(target.tag, options),\n };\n }\n\n if (target?.kind === \"argument\") {\n const semantic = getCommentTagSemanticContext(target.tag, options);\n return {\n kind: \"argument\",\n semantic,\n valueLabels: semantic.valueLabels,\n };\n }\n\n return { kind: \"none\" };\n}\n\n/**\n * Returns hover information for the comment token under the given document\n * offset, including semantic target/argument help when binding data is\n * available.\n */\nexport function getCommentHoverInfoAtOffset(\n documentText: string,\n offset: number,\n options?: CommentSemanticContextOptions\n): CommentHoverInfo | null {\n const target = getCommentCursorTargetAtOffset(\n documentText,\n offset,\n options?.extensions ? { extensions: options.extensions } : undefined\n );\n if (target === null) {\n return null;\n }\n\n const semantic = getCommentTagSemanticContext(target.tag, options);\n let markdown: string | null = null;\n\n switch (target.kind) {\n case \"tag-name\":\n markdown = semantic.tagHoverMarkdown;\n break;\n case \"colon\":\n case \"target\":\n markdown = semantic.targetHoverMarkdown;\n break;\n case \"argument\":\n markdown = semantic.argumentHoverMarkdown;\n break;\n default: {\n const exhaustive: never = target.kind;\n void exhaustive;\n break;\n }\n }\n\n return markdown === null\n ? null\n : {\n kind: target.kind === \"colon\" ? \"target\" : target.kind,\n markdown,\n };\n}\n","import {\n BUILTIN_CONSTRAINT_DEFINITIONS,\n isBuiltinConstraintName,\n type AnnotationNode,\n type BuiltinConstraintBroadeningRegistration,\n type ConstraintNode,\n type ConstraintTagRegistration,\n type CustomConstraintRegistration,\n type ExtensionDefinition,\n type JsonValue,\n type LengthConstraintNode,\n type NumericConstraintNode,\n type PathTarget,\n type Provenance,\n type TypeNode,\n} from \"@formspec/core\";\nimport { parseTagSyntax } from \"./comment-syntax.js\";\n\nconst NUMERIC_CONSTRAINT_MAP: Record<string, NumericConstraintNode[\"constraintKind\"]> = {\n minimum: \"minimum\",\n maximum: \"maximum\",\n exclusiveMinimum: \"exclusiveMinimum\",\n exclusiveMaximum: \"exclusiveMaximum\",\n multipleOf: \"multipleOf\",\n};\n\nconst LENGTH_CONSTRAINT_MAP: Record<string, LengthConstraintNode[\"constraintKind\"]> = {\n minLength: \"minLength\",\n maxLength: \"maxLength\",\n minItems: \"minItems\",\n maxItems: \"maxItems\",\n};\n\nfunction tryParseJson(text: string): unknown {\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return null;\n }\n}\n\nexport interface ConstraintTagParseRegistryLike {\n readonly extensions: readonly ExtensionDefinition[];\n findConstraint(constraintId: string): CustomConstraintRegistration | undefined;\n findConstraintTag(tagName: string):\n | {\n readonly extensionId: string;\n readonly registration: ConstraintTagRegistration;\n }\n | undefined;\n findBuiltinConstraintBroadening(\n typeId: string,\n tagName: string\n ):\n | {\n readonly extensionId: string;\n readonly registration: BuiltinConstraintBroadeningRegistration;\n }\n | undefined;\n}\n\nexport interface ParseConstraintTagValueOptions {\n readonly registry?: ConstraintTagParseRegistryLike;\n readonly fieldType?: TypeNode;\n}\n\nfunction syntaxOptions(\n registry: ConstraintTagParseRegistryLike | undefined\n): Parameters<typeof parseTagSyntax>[2] {\n return registry?.extensions !== undefined ? { extensions: registry.extensions } : undefined;\n}\n\nexport function parseConstraintTagValue(\n tagName: string,\n text: string,\n provenance: Provenance,\n options?: ParseConstraintTagValueOptions\n): ConstraintNode | null {\n const customConstraint = parseExtensionConstraintTagValue(tagName, text, provenance, options);\n if (customConstraint !== null) {\n return customConstraint;\n }\n\n if (!isBuiltinConstraintName(tagName)) {\n return null;\n }\n\n const parsedTag = parseTagSyntax(tagName, text, syntaxOptions(options?.registry));\n if (parsedTag.target !== null && !parsedTag.target.valid) {\n return null;\n }\n\n const effectiveText = parsedTag.argumentText;\n const path = parsedTag.target?.path ?? undefined;\n const expectedType = BUILTIN_CONSTRAINT_DEFINITIONS[tagName];\n\n if (expectedType !== \"boolean\" && effectiveText.trim() === \"\") {\n return null;\n }\n\n if (expectedType === \"number\") {\n const value = Number(effectiveText);\n if (Number.isNaN(value)) {\n return null;\n }\n\n const numericKind = NUMERIC_CONSTRAINT_MAP[tagName as keyof typeof NUMERIC_CONSTRAINT_MAP];\n if (numericKind !== undefined) {\n return {\n kind: \"constraint\",\n constraintKind: numericKind,\n value,\n ...(path !== undefined && { path }),\n provenance,\n };\n }\n\n const lengthKind = LENGTH_CONSTRAINT_MAP[tagName as keyof typeof LENGTH_CONSTRAINT_MAP];\n if (lengthKind !== undefined) {\n return {\n kind: \"constraint\",\n constraintKind: lengthKind,\n value,\n ...(path !== undefined && { path }),\n provenance,\n };\n }\n\n return null;\n }\n\n if (expectedType === \"boolean\") {\n const trimmed = effectiveText.trim();\n if (trimmed !== \"\" && trimmed !== \"true\") {\n return null;\n }\n\n if (tagName === \"uniqueItems\") {\n return {\n kind: \"constraint\",\n constraintKind: \"uniqueItems\",\n value: true,\n ...(path !== undefined && { path }),\n provenance,\n };\n }\n\n return null;\n }\n\n if (expectedType === \"json\") {\n if (tagName === \"const\") {\n const trimmedText = effectiveText.trim();\n if (trimmedText === \"\") {\n return null;\n }\n\n try {\n const parsed = JSON.parse(trimmedText) as JsonValue;\n return {\n kind: \"constraint\",\n constraintKind: \"const\",\n value: parsed,\n ...(path !== undefined && { path }),\n provenance,\n };\n } catch {\n return {\n kind: \"constraint\",\n constraintKind: \"const\",\n value: trimmedText,\n ...(path !== undefined && { path }),\n provenance,\n };\n }\n }\n\n const parsed = tryParseJson(effectiveText);\n if (!Array.isArray(parsed)) {\n return null;\n }\n\n const members: (string | number)[] = [];\n for (const item of parsed) {\n if (typeof item === \"string\" || typeof item === \"number\") {\n members.push(item);\n continue;\n }\n\n if (typeof item === \"object\" && item !== null && \"id\" in item) {\n const id = (item as Record<string, unknown>)[\"id\"];\n if (typeof id === \"string\" || typeof id === \"number\") {\n members.push(id);\n }\n }\n }\n\n return {\n kind: \"constraint\",\n constraintKind: \"allowedMembers\",\n members,\n ...(path !== undefined && { path }),\n provenance,\n };\n }\n\n return {\n kind: \"constraint\",\n constraintKind: \"pattern\",\n pattern: effectiveText,\n ...(path !== undefined && { path }),\n provenance,\n };\n}\n\nexport function parseDefaultValueTagValue(text: string, provenance: Provenance): AnnotationNode {\n const trimmed = text.trim();\n let value: JsonValue;\n\n if (trimmed === \"null\") {\n value = null;\n } else if (trimmed === \"true\") {\n value = true;\n } else if (trimmed === \"false\") {\n value = false;\n } else {\n const parsed = tryParseJson(trimmed);\n value = parsed !== null ? (parsed as JsonValue) : trimmed;\n }\n\n return {\n kind: \"annotation\",\n annotationKind: \"defaultValue\",\n value,\n provenance,\n };\n}\n\nfunction parseExtensionConstraintTagValue(\n tagName: string,\n text: string,\n provenance: Provenance,\n options?: ParseConstraintTagValueOptions\n): ConstraintNode | null {\n const parsedTag = parseTagSyntax(tagName, text, syntaxOptions(options?.registry));\n if (parsedTag.target !== null && !parsedTag.target.valid) {\n return null;\n }\n\n const effectiveText = parsedTag.argumentText;\n const path = parsedTag.target?.path ?? undefined;\n const registry = options?.registry;\n if (registry === undefined) {\n return null;\n }\n\n if (effectiveText.trim() === \"\") {\n return null;\n }\n\n const directTag = registry.findConstraintTag(tagName);\n if (directTag !== undefined) {\n return makeCustomConstraintNode(\n directTag.extensionId,\n directTag.registration.constraintName,\n directTag.registration.parseValue(effectiveText),\n provenance,\n path,\n registry\n );\n }\n\n if (!isBuiltinConstraintName(tagName)) {\n return null;\n }\n\n const broadenedTypeId = getBroadenedCustomTypeId(options?.fieldType);\n if (broadenedTypeId === undefined) {\n return null;\n }\n\n const broadened = registry.findBuiltinConstraintBroadening(broadenedTypeId, tagName);\n if (broadened === undefined) {\n return null;\n }\n\n return makeCustomConstraintNode(\n broadened.extensionId,\n broadened.registration.constraintName,\n broadened.registration.parseValue(effectiveText),\n provenance,\n path,\n registry\n );\n}\n\nfunction getBroadenedCustomTypeId(fieldType: TypeNode | undefined): string | undefined {\n if (fieldType?.kind === \"custom\") {\n return fieldType.typeId;\n }\n\n if (fieldType?.kind !== \"union\") {\n return undefined;\n }\n\n const customMembers = fieldType.members.filter(\n (member): member is Extract<TypeNode, { kind: \"custom\" }> => member.kind === \"custom\"\n );\n if (customMembers.length !== 1) {\n return undefined;\n }\n\n const nonCustomMembers = fieldType.members.filter((member) => member.kind !== \"custom\");\n const allOtherMembersAreNull = nonCustomMembers.every(\n (member) => member.kind === \"primitive\" && member.primitiveKind === \"null\"\n );\n\n const customMember = customMembers[0];\n return allOtherMembersAreNull && customMember !== undefined ? customMember.typeId : undefined;\n}\n\nfunction makeCustomConstraintNode(\n extensionId: string,\n constraintName: string,\n payload: JsonValue,\n provenance: Provenance,\n path: PathTarget | undefined,\n registry: ConstraintTagParseRegistryLike\n): ConstraintNode {\n const constraintId = `${extensionId}/${constraintName}`;\n const registration = registry.findConstraint(constraintId);\n if (registration === undefined) {\n throw new Error(\n `Custom TSDoc tag resolved to unregistered constraint \"${constraintId}\". Register the constraint before using its tag.`\n );\n }\n\n return {\n kind: \"constraint\",\n constraintKind: \"custom\",\n constraintId,\n payload,\n compositionRule: registration.compositionRule,\n ...(path !== undefined && { path }),\n provenance,\n };\n}\n","import type {\n AnnotationNode,\n ConstraintNode,\n CustomConstraintNode,\n JsonValue,\n ObjectProperty,\n PathTarget,\n Provenance,\n TypeNode,\n} from \"@formspec/core\";\nimport { normalizeConstraintTagName } from \"@formspec/core\";\n\nexport interface AnalysisTypeDefinition {\n readonly name: string;\n readonly type: TypeNode;\n readonly constraints?: readonly ConstraintNode[];\n readonly annotations?: readonly AnnotationNode[];\n readonly provenance: Provenance;\n}\n\nexport type AnalysisTypeRegistry = Record<string, AnalysisTypeDefinition>;\n\nexport interface EffectiveTargetState {\n readonly fieldName: string;\n readonly path: PathTarget | null;\n readonly targetName: string;\n readonly type: TypeNode;\n readonly inheritedConstraints: readonly ConstraintNode[];\n readonly inheritedAnnotations: readonly AnnotationNode[];\n readonly localConstraints: readonly ConstraintNode[];\n readonly effectiveConstraints: readonly ConstraintNode[];\n}\n\nexport type ResolvedTargetState =\n | ({ readonly kind: \"resolved\" } & EffectiveTargetState)\n | {\n readonly kind: \"missing-property\";\n readonly fieldName: string;\n readonly path: PathTarget;\n readonly targetName: string;\n readonly segment: string;\n readonly localConstraints: readonly ConstraintNode[];\n }\n | {\n readonly kind: \"unresolvable\";\n readonly fieldName: string;\n readonly path: PathTarget;\n readonly targetName: string;\n readonly type: TypeNode;\n readonly localConstraints: readonly ConstraintNode[];\n };\n\nexport interface ConstraintSemanticDiagnostic {\n readonly code: string;\n readonly message: string;\n readonly severity: \"error\" | \"warning\";\n readonly primaryLocation: Provenance;\n readonly relatedLocations: readonly Provenance[];\n}\n\nexport interface ConstraintTargetAnalysisResult {\n readonly diagnostics: readonly ConstraintSemanticDiagnostic[];\n readonly targetStates: readonly ResolvedTargetState[];\n}\n\nexport interface ConstraintSemanticRoleLike {\n readonly family: string;\n readonly bound: \"lower\" | \"upper\" | \"exact\";\n readonly inclusive: boolean;\n}\n\nexport interface ConstraintRegistrationLike {\n readonly constraintName: string;\n readonly applicableTypes: readonly TypeNode[\"kind\"][] | null;\n readonly isApplicableToType?: (type: TypeNode) => boolean;\n readonly comparePayloads?: (left: JsonValue, right: JsonValue) => number;\n readonly semanticRole?: ConstraintSemanticRoleLike;\n}\n\nexport interface ConstraintTagRegistrationLike {\n readonly tagName: string;\n readonly constraintName: string;\n readonly isApplicableToType?: (type: TypeNode) => boolean;\n}\n\nexport interface ConstraintRegistryLike {\n findConstraint(constraintId: string): ConstraintRegistrationLike | undefined;\n findConstraintTag(\n tagName: string\n ):\n | { readonly extensionId: string; readonly registration: ConstraintTagRegistrationLike }\n | undefined;\n}\n\nfunction pathKey(path: PathTarget | null): string {\n return path?.segments.join(\".\") ?? \"\";\n}\n\nexport function formatConstraintTargetName(fieldName: string, path: PathTarget | null): string {\n if (path === null || path.segments.length === 0) {\n return fieldName;\n }\n return `${fieldName}.${path.segments.join(\".\")}`;\n}\n\nexport function dereferenceAnalysisType(\n type: TypeNode,\n typeRegistry: AnalysisTypeRegistry\n): TypeNode {\n let current = type;\n const seen = new Set<string>();\n\n while (current.kind === \"reference\") {\n if (seen.has(current.name)) {\n return current;\n }\n seen.add(current.name);\n\n const definition = typeRegistry[current.name];\n if (definition === undefined) {\n return current;\n }\n current = definition.type;\n }\n\n return current;\n}\n\nexport function collectReferencedTypeConstraints(\n type: TypeNode,\n typeRegistry: AnalysisTypeRegistry\n): readonly ConstraintNode[] {\n const collected: ConstraintNode[] = [];\n let current = type;\n const seen = new Set<string>();\n\n while (current.kind === \"reference\") {\n if (seen.has(current.name)) {\n break;\n }\n seen.add(current.name);\n\n const definition = typeRegistry[current.name];\n if (definition === undefined) {\n break;\n }\n\n if (definition.constraints !== undefined) {\n collected.push(...definition.constraints);\n }\n\n current = definition.type;\n }\n\n return collected;\n}\n\nexport function collectReferencedTypeAnnotations(\n type: TypeNode,\n typeRegistry: AnalysisTypeRegistry\n): readonly AnnotationNode[] {\n const collected: AnnotationNode[] = [];\n let current = type;\n const seen = new Set<string>();\n\n while (current.kind === \"reference\") {\n if (seen.has(current.name)) {\n break;\n }\n seen.add(current.name);\n\n const definition = typeRegistry[current.name];\n if (definition === undefined) {\n break;\n }\n\n if (definition.annotations !== undefined) {\n collected.push(...definition.annotations);\n }\n\n current = definition.type;\n }\n\n return collected;\n}\n\nfunction resolveProperty(\n type: TypeNode,\n typeRegistry: AnalysisTypeRegistry,\n segments: readonly string[]\n):\n | {\n readonly kind: \"resolved\";\n readonly property: ObjectProperty | null;\n readonly rawType: TypeNode;\n readonly type: TypeNode;\n }\n | { readonly kind: \"missing-property\"; readonly segment: string }\n | { readonly kind: \"unresolvable\"; readonly type: TypeNode } {\n const effectiveType = dereferenceAnalysisType(type, typeRegistry);\n\n if (segments.length === 0) {\n return { kind: \"resolved\", property: null, rawType: type, type: effectiveType };\n }\n\n if (effectiveType.kind === \"array\") {\n return resolveProperty(effectiveType.items, typeRegistry, segments);\n }\n\n if (effectiveType.kind !== \"object\") {\n return { kind: \"unresolvable\", type: effectiveType };\n }\n\n const [segment, ...rest] = segments;\n if (segment === undefined) {\n throw new Error(\"Invariant violation: object traversal requires a segment\");\n }\n\n const property = effectiveType.properties.find((candidate) => candidate.name === segment);\n if (property === undefined) {\n return { kind: \"missing-property\", segment };\n }\n\n if (rest.length === 0) {\n return {\n kind: \"resolved\",\n property,\n rawType: property.type,\n type: dereferenceAnalysisType(property.type, typeRegistry),\n };\n }\n\n return resolveProperty(property.type, typeRegistry, rest);\n}\n\nexport function resolveConstraintTargetState(\n fieldName: string,\n fieldType: TypeNode,\n path: PathTarget | null,\n localConstraints: readonly ConstraintNode[],\n typeRegistry: AnalysisTypeRegistry\n): ResolvedTargetState {\n if (path === null) {\n const inheritedConstraints = collectReferencedTypeConstraints(fieldType, typeRegistry);\n const inheritedAnnotations = collectReferencedTypeAnnotations(fieldType, typeRegistry);\n const type = dereferenceAnalysisType(fieldType, typeRegistry);\n\n return {\n kind: \"resolved\",\n fieldName,\n path,\n targetName: fieldName,\n type,\n inheritedConstraints,\n inheritedAnnotations,\n localConstraints,\n effectiveConstraints: [...inheritedConstraints, ...localConstraints],\n };\n }\n\n const resolution = resolveProperty(fieldType, typeRegistry, path.segments);\n const targetName = formatConstraintTargetName(fieldName, path);\n\n if (resolution.kind === \"missing-property\") {\n return {\n kind: \"missing-property\",\n fieldName,\n path,\n targetName,\n segment: resolution.segment,\n localConstraints,\n };\n }\n\n if (resolution.kind === \"unresolvable\") {\n return {\n kind: \"unresolvable\",\n fieldName,\n path,\n targetName,\n type: resolution.type,\n localConstraints,\n };\n }\n\n const propertyConstraints = resolution.property?.constraints ?? [];\n const propertyAnnotations = resolution.property?.annotations ?? [];\n const referencedConstraints = collectReferencedTypeConstraints(resolution.rawType, typeRegistry);\n const referencedAnnotations = collectReferencedTypeAnnotations(resolution.rawType, typeRegistry);\n const inheritedConstraints = [...propertyConstraints, ...referencedConstraints];\n const inheritedAnnotations = [...propertyAnnotations, ...referencedAnnotations];\n\n return {\n kind: \"resolved\",\n fieldName,\n path,\n targetName,\n type: resolution.type,\n inheritedConstraints,\n inheritedAnnotations,\n localConstraints,\n effectiveConstraints: [...inheritedConstraints, ...localConstraints],\n };\n}\n\nfunction cloneTargetPath(path: PathTarget | undefined): PathTarget | null {\n if (path === undefined) {\n return null;\n }\n return { segments: [...path.segments] };\n}\n\nexport function buildConstraintTargetStates(\n fieldName: string,\n fieldType: TypeNode,\n constraints: readonly ConstraintNode[],\n typeRegistry: AnalysisTypeRegistry\n): readonly ResolvedTargetState[] {\n const grouped = new Map<string, { path: PathTarget | null; constraints: ConstraintNode[] }>([\n [\"\", { path: null, constraints: [] }],\n ]);\n\n for (const constraint of constraints) {\n const path = cloneTargetPath(constraint.path);\n const key = pathKey(path);\n let bucket = grouped.get(key);\n if (bucket === undefined) {\n bucket = { path, constraints: [] };\n grouped.set(key, bucket);\n }\n bucket.constraints.push(constraint);\n }\n\n return [...grouped.values()].map((group) =>\n resolveConstraintTargetState(fieldName, fieldType, group.path, group.constraints, typeRegistry)\n );\n}\n\nfunction addContradiction(\n diagnostics: ConstraintSemanticDiagnostic[],\n message: string,\n primary: Provenance,\n related: Provenance\n): void {\n diagnostics.push({\n code: \"CONTRADICTING_CONSTRAINTS\",\n message,\n severity: \"error\",\n primaryLocation: primary,\n relatedLocations: [related],\n });\n}\n\nfunction addTypeMismatch(\n diagnostics: ConstraintSemanticDiagnostic[],\n message: string,\n primary: Provenance\n): void {\n diagnostics.push({\n code: \"TYPE_MISMATCH\",\n message,\n severity: \"error\",\n primaryLocation: primary,\n relatedLocations: [],\n });\n}\n\nfunction addUnknownExtension(\n diagnostics: ConstraintSemanticDiagnostic[],\n message: string,\n primary: Provenance\n): void {\n diagnostics.push({\n code: \"UNKNOWN_EXTENSION\",\n message,\n severity: \"warning\",\n primaryLocation: primary,\n relatedLocations: [],\n });\n}\n\nfunction addUnknownPathTarget(\n diagnostics: ConstraintSemanticDiagnostic[],\n message: string,\n primary: Provenance\n): void {\n diagnostics.push({\n code: \"UNKNOWN_PATH_TARGET\",\n message,\n severity: \"error\",\n primaryLocation: primary,\n relatedLocations: [],\n });\n}\n\nfunction addConstraintBroadening(\n diagnostics: ConstraintSemanticDiagnostic[],\n message: string,\n primary: Provenance,\n related: Provenance\n): void {\n diagnostics.push({\n code: \"CONSTRAINT_BROADENING\",\n message,\n severity: \"error\",\n primaryLocation: primary,\n relatedLocations: [related],\n });\n}\n\nfunction getExtensionIdFromConstraintId(constraintId: string): string | null {\n const separator = constraintId.lastIndexOf(\"/\");\n if (separator <= 0) {\n return null;\n }\n return constraintId.slice(0, separator);\n}\n\nfunction typeLabel(type: TypeNode): string {\n switch (type.kind) {\n case \"primitive\":\n return type.primitiveKind;\n case \"enum\":\n return \"enum\";\n case \"array\":\n return \"array\";\n case \"object\":\n return \"object\";\n case \"record\":\n return \"record\";\n case \"union\":\n return \"union\";\n case \"reference\":\n return `reference(${type.name})`;\n case \"dynamic\":\n return `dynamic(${type.dynamicKind})`;\n case \"custom\":\n return `custom(${type.typeId})`;\n default: {\n const exhaustive: never = type;\n return String(exhaustive);\n }\n }\n}\n\nfunction isJsonObject(value: JsonValue): value is Record<string, JsonValue> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isJsonArray(value: JsonValue): value is readonly JsonValue[] {\n return Array.isArray(value);\n}\n\nfunction jsonValueEquals(left: JsonValue, right: JsonValue): boolean {\n if (left === right) {\n return true;\n }\n\n if (isJsonArray(left) || isJsonArray(right)) {\n if (!isJsonArray(left) || !isJsonArray(right) || left.length !== right.length) {\n return false;\n }\n\n for (const [index, item] of left.entries()) {\n const rightItem = right[index];\n if (rightItem === undefined || !jsonValueEquals(item, rightItem)) {\n return false;\n }\n }\n\n return true;\n }\n\n if (isJsonObject(left) || isJsonObject(right)) {\n if (!isJsonObject(left) || !isJsonObject(right)) {\n return false;\n }\n\n const leftKeys = Object.keys(left).sort();\n const rightKeys = Object.keys(right).sort();\n if (leftKeys.length !== rightKeys.length) {\n return false;\n }\n\n return leftKeys.every((key, index) => {\n const rightKey = rightKeys[index];\n if (rightKey !== key) {\n return false;\n }\n\n const leftValue = left[key];\n const rightValue = right[rightKey];\n return (\n leftValue !== undefined &&\n rightValue !== undefined &&\n jsonValueEquals(leftValue, rightValue)\n );\n });\n }\n\n return false;\n}\n\ntype NumericConstraintKind =\n | \"minimum\"\n | \"maximum\"\n | \"exclusiveMinimum\"\n | \"exclusiveMaximum\"\n | \"multipleOf\";\n\ntype LengthConstraintKind = \"minLength\" | \"maxLength\" | \"minItems\" | \"maxItems\";\n\nfunction findNumeric(\n constraints: readonly ConstraintNode[],\n constraintKind: NumericConstraintKind\n): Extract<ConstraintNode, { readonly constraintKind: NumericConstraintKind }> | undefined {\n return constraints.find(\n (\n constraint\n ): constraint is Extract<ConstraintNode, { readonly constraintKind: NumericConstraintKind }> =>\n constraint.constraintKind === constraintKind\n );\n}\n\nfunction findLength(\n constraints: readonly ConstraintNode[],\n constraintKind: LengthConstraintKind\n): Extract<ConstraintNode, { readonly constraintKind: LengthConstraintKind }> | undefined {\n return constraints.find(\n (\n constraint\n ): constraint is Extract<ConstraintNode, { readonly constraintKind: LengthConstraintKind }> =>\n constraint.constraintKind === constraintKind\n );\n}\n\nfunction findAllowedMembers(\n constraints: readonly ConstraintNode[]\n): readonly Extract<ConstraintNode, { readonly constraintKind: \"allowedMembers\" }>[] {\n return constraints.filter(\n (\n constraint\n ): constraint is Extract<ConstraintNode, { readonly constraintKind: \"allowedMembers\" }> =>\n constraint.constraintKind === \"allowedMembers\"\n );\n}\n\nfunction findConstConstraints(\n constraints: readonly ConstraintNode[]\n): readonly Extract<ConstraintNode, { readonly constraintKind: \"const\" }>[] {\n return constraints.filter(\n (constraint): constraint is Extract<ConstraintNode, { readonly constraintKind: \"const\" }> =>\n constraint.constraintKind === \"const\"\n );\n}\n\ntype OrderedBoundKind =\n | \"minimum\"\n | \"exclusiveMinimum\"\n | \"minLength\"\n | \"minItems\"\n | \"maximum\"\n | \"exclusiveMaximum\"\n | \"maxLength\"\n | \"maxItems\";\n\ntype OrderedBoundConstraint = Extract<\n ConstraintNode,\n { readonly constraintKind: OrderedBoundKind }\n>;\n\ntype OrderedBoundFamily =\n | \"numeric-lower\"\n | \"numeric-upper\"\n | \"minLength\"\n | \"minItems\"\n | \"maxLength\"\n | \"maxItems\";\n\nfunction isOrderedBoundConstraint(\n constraint: ConstraintNode\n): constraint is OrderedBoundConstraint {\n return (\n constraint.constraintKind === \"minimum\" ||\n constraint.constraintKind === \"exclusiveMinimum\" ||\n constraint.constraintKind === \"minLength\" ||\n constraint.constraintKind === \"minItems\" ||\n constraint.constraintKind === \"maximum\" ||\n constraint.constraintKind === \"exclusiveMaximum\" ||\n constraint.constraintKind === \"maxLength\" ||\n constraint.constraintKind === \"maxItems\"\n );\n}\n\nfunction constraintPathKey(constraint: ConstraintNode): string {\n return constraint.path?.segments.join(\".\") ?? \"\";\n}\n\nfunction orderedBoundFamily(kind: OrderedBoundKind): OrderedBoundFamily {\n switch (kind) {\n case \"minimum\":\n case \"exclusiveMinimum\":\n return \"numeric-lower\";\n case \"maximum\":\n case \"exclusiveMaximum\":\n return \"numeric-upper\";\n case \"minLength\":\n return \"minLength\";\n case \"minItems\":\n return \"minItems\";\n case \"maxLength\":\n return \"maxLength\";\n case \"maxItems\":\n return \"maxItems\";\n default: {\n const exhaustive: never = kind;\n return exhaustive;\n }\n }\n}\n\nfunction isNumericLowerKind(kind: OrderedBoundKind): kind is \"minimum\" | \"exclusiveMinimum\" {\n return kind === \"minimum\" || kind === \"exclusiveMinimum\";\n}\n\nfunction isNumericUpperKind(kind: OrderedBoundKind): kind is \"maximum\" | \"exclusiveMaximum\" {\n return kind === \"maximum\" || kind === \"exclusiveMaximum\";\n}\n\nfunction describeConstraintTag(constraint: OrderedBoundConstraint): string {\n return `@${constraint.constraintKind}`;\n}\n\nfunction compareConstraintStrength(\n current: OrderedBoundConstraint,\n previous: OrderedBoundConstraint\n): number {\n const family = orderedBoundFamily(current.constraintKind);\n\n if (family === \"numeric-lower\") {\n if (\n !isNumericLowerKind(current.constraintKind) ||\n !isNumericLowerKind(previous.constraintKind)\n ) {\n throw new Error(\"numeric-lower family received non-numeric lower-bound constraint\");\n }\n\n if (current.value !== previous.value) {\n return current.value > previous.value ? 1 : -1;\n }\n if (current.constraintKind === \"exclusiveMinimum\" && previous.constraintKind === \"minimum\") {\n return 1;\n }\n if (current.constraintKind === \"minimum\" && previous.constraintKind === \"exclusiveMinimum\") {\n return -1;\n }\n return 0;\n }\n\n if (family === \"numeric-upper\") {\n if (\n !isNumericUpperKind(current.constraintKind) ||\n !isNumericUpperKind(previous.constraintKind)\n ) {\n throw new Error(\"numeric-upper family received non-numeric upper-bound constraint\");\n }\n\n if (current.value !== previous.value) {\n return current.value < previous.value ? 1 : -1;\n }\n if (current.constraintKind === \"exclusiveMaximum\" && previous.constraintKind === \"maximum\") {\n return 1;\n }\n if (current.constraintKind === \"maximum\" && previous.constraintKind === \"exclusiveMaximum\") {\n return -1;\n }\n return 0;\n }\n\n switch (family) {\n case \"minLength\":\n case \"minItems\":\n if (current.value === previous.value) {\n return 0;\n }\n return current.value > previous.value ? 1 : -1;\n case \"maxLength\":\n case \"maxItems\":\n if (current.value === previous.value) {\n return 0;\n }\n return current.value < previous.value ? 1 : -1;\n default: {\n const exhaustive: never = family;\n return exhaustive;\n }\n }\n}\n\ninterface CustomSemanticEntry {\n readonly constraint: CustomConstraintNode;\n readonly comparePayloads: NonNullable<ConstraintRegistrationLike[\"comparePayloads\"]>;\n readonly role: NonNullable<ConstraintRegistrationLike[\"semanticRole\"]>;\n}\n\nfunction compareSemanticInclusivity(currentInclusive: boolean, previousInclusive: boolean): number {\n if (currentInclusive === previousInclusive) {\n return 0;\n }\n return currentInclusive ? -1 : 1;\n}\n\nfunction compareCustomConstraintStrength(\n current: CustomSemanticEntry,\n previous: CustomSemanticEntry\n): number {\n const order = current.comparePayloads(current.constraint.payload, previous.constraint.payload);\n const equalPayloadTiebreaker =\n order === 0\n ? compareSemanticInclusivity(current.role.inclusive, previous.role.inclusive)\n : order;\n\n switch (current.role.bound) {\n case \"lower\":\n return equalPayloadTiebreaker;\n case \"upper\":\n return equalPayloadTiebreaker === 0 ? 0 : -equalPayloadTiebreaker;\n case \"exact\":\n return order === 0 ? 0 : Number.NaN;\n default: {\n const exhaustive: never = current.role.bound;\n return exhaustive;\n }\n }\n}\n\nfunction customConstraintsContradict(\n lower: CustomSemanticEntry,\n upper: CustomSemanticEntry\n): boolean {\n const order = lower.comparePayloads(lower.constraint.payload, upper.constraint.payload);\n if (order > 0) {\n return true;\n }\n if (order < 0) {\n return false;\n }\n return !lower.role.inclusive || !upper.role.inclusive;\n}\n\nfunction describeCustomConstraintTag(constraint: CustomConstraintNode): string {\n return constraint.provenance.tagName ?? constraint.constraintId;\n}\n\nfunction isNullType(type: TypeNode): boolean {\n return type.kind === \"primitive\" && type.primitiveKind === \"null\";\n}\n\nfunction collectCustomConstraintCandidateTypes(\n type: TypeNode,\n typeRegistry: AnalysisTypeRegistry\n): readonly TypeNode[] {\n const effectiveType = dereferenceAnalysisType(type, typeRegistry);\n const candidates: TypeNode[] = [effectiveType];\n\n if (effectiveType.kind === \"array\") {\n candidates.push(...collectCustomConstraintCandidateTypes(effectiveType.items, typeRegistry));\n }\n\n if (effectiveType.kind === \"union\") {\n const memberTypes = effectiveType.members.map((member) =>\n dereferenceAnalysisType(member, typeRegistry)\n );\n const nonNullMembers = memberTypes.filter((member) => !isNullType(member));\n\n if (nonNullMembers.length === 1 && nonNullMembers.length < memberTypes.length) {\n const [nullableMember] = nonNullMembers;\n if (nullableMember !== undefined) {\n candidates.push(...collectCustomConstraintCandidateTypes(nullableMember, typeRegistry));\n }\n }\n }\n\n return candidates;\n}\n\nfunction checkNumericContradictions(\n diagnostics: ConstraintSemanticDiagnostic[],\n fieldName: string,\n constraints: readonly ConstraintNode[]\n): void {\n const min = findNumeric(constraints, \"minimum\");\n const max = findNumeric(constraints, \"maximum\");\n const exMin = findNumeric(constraints, \"exclusiveMinimum\");\n const exMax = findNumeric(constraints, \"exclusiveMaximum\");\n\n if (min !== undefined && max !== undefined && min.value > max.value) {\n addContradiction(\n diagnostics,\n `Field \"${fieldName}\": minimum (${String(min.value)}) is greater than maximum (${String(max.value)})`,\n min.provenance,\n max.provenance\n );\n }\n\n if (exMin !== undefined && max !== undefined && exMin.value >= max.value) {\n addContradiction(\n diagnostics,\n `Field \"${fieldName}\": exclusiveMinimum (${String(exMin.value)}) is greater than or equal to maximum (${String(max.value)})`,\n exMin.provenance,\n max.provenance\n );\n }\n\n if (min !== undefined && exMax !== undefined && min.value >= exMax.value) {\n addContradiction(\n diagnostics,\n `Field \"${fieldName}\": minimum (${String(min.value)}) is greater than or equal to exclusiveMaximum (${String(exMax.value)})`,\n min.provenance,\n exMax.provenance\n );\n }\n\n if (exMin !== undefined && exMax !== undefined && exMin.value >= exMax.value) {\n addContradiction(\n diagnostics,\n `Field \"${fieldName}\": exclusiveMinimum (${String(exMin.value)}) is greater than or equal to exclusiveMaximum (${String(exMax.value)})`,\n exMin.provenance,\n exMax.provenance\n );\n }\n}\n\nfunction checkLengthContradictions(\n diagnostics: ConstraintSemanticDiagnostic[],\n fieldName: string,\n constraints: readonly ConstraintNode[]\n): void {\n const minLen = findLength(constraints, \"minLength\");\n const maxLen = findLength(constraints, \"maxLength\");\n\n if (minLen !== undefined && maxLen !== undefined && minLen.value > maxLen.value) {\n addContradiction(\n diagnostics,\n `Field \"${fieldName}\": minLength (${String(minLen.value)}) is greater than maxLength (${String(maxLen.value)})`,\n minLen.provenance,\n maxLen.provenance\n );\n }\n\n const minItems = findLength(constraints, \"minItems\");\n const maxItems = findLength(constraints, \"maxItems\");\n\n if (minItems !== undefined && maxItems !== undefined && minItems.value > maxItems.value) {\n addContradiction(\n diagnostics,\n `Field \"${fieldName}\": minItems (${String(minItems.value)}) is greater than maxItems (${String(maxItems.value)})`,\n minItems.provenance,\n maxItems.provenance\n );\n }\n}\n\nfunction checkAllowedMembersContradiction(\n diagnostics: ConstraintSemanticDiagnostic[],\n fieldName: string,\n constraints: readonly ConstraintNode[]\n): void {\n const members = findAllowedMembers(constraints);\n if (members.length < 2) {\n return;\n }\n\n const firstSet = new Set(members[0]?.members ?? []);\n for (let index = 1; index < members.length; index += 1) {\n const current = members[index];\n if (current === undefined) {\n continue;\n }\n\n for (const member of firstSet) {\n if (!current.members.includes(member)) {\n firstSet.delete(member);\n }\n }\n }\n\n if (firstSet.size === 0) {\n const first = members[0];\n const second = members[1];\n if (first !== undefined && second !== undefined) {\n addContradiction(\n diagnostics,\n `Field \"${fieldName}\": allowedMembers constraints have an empty intersection (no valid values remain)`,\n first.provenance,\n second.provenance\n );\n }\n }\n}\n\nfunction checkConstContradictions(\n diagnostics: ConstraintSemanticDiagnostic[],\n fieldName: string,\n constraints: readonly ConstraintNode[]\n): void {\n const constConstraints = findConstConstraints(constraints);\n if (constConstraints.length < 2) {\n return;\n }\n\n const first = constConstraints[0];\n if (first === undefined) {\n return;\n }\n\n for (let index = 1; index < constConstraints.length; index += 1) {\n const current = constConstraints[index];\n if (current === undefined || jsonValueEquals(first.value, current.value)) {\n continue;\n }\n\n addContradiction(\n diagnostics,\n `Field \"${fieldName}\": conflicting @const constraints require both ${JSON.stringify(first.value)} and ${JSON.stringify(current.value)}`,\n first.provenance,\n current.provenance\n );\n }\n}\n\nfunction checkConstraintBroadening(\n diagnostics: ConstraintSemanticDiagnostic[],\n fieldName: string,\n constraints: readonly ConstraintNode[]\n): void {\n const strongestByKey = new Map<string, OrderedBoundConstraint>();\n\n for (const constraint of constraints) {\n if (!isOrderedBoundConstraint(constraint)) {\n continue;\n }\n\n const key = `${orderedBoundFamily(constraint.constraintKind)}:${constraintPathKey(constraint)}`;\n const previous = strongestByKey.get(key);\n if (previous === undefined) {\n strongestByKey.set(key, constraint);\n continue;\n }\n\n const strength = compareConstraintStrength(constraint, previous);\n if (strength < 0) {\n addConstraintBroadening(\n diagnostics,\n `Field \"${fieldName}\": ${describeConstraintTag(constraint)} (${String(constraint.value)}) is broader than earlier ${describeConstraintTag(previous)} (${String(previous.value)}). Constraints can only narrow.`,\n constraint.provenance,\n previous.provenance\n );\n continue;\n }\n\n if (strength > 0) {\n strongestByKey.set(key, constraint);\n }\n }\n}\n\nfunction checkCustomConstraintSemantics(\n diagnostics: ConstraintSemanticDiagnostic[],\n fieldName: string,\n constraints: readonly ConstraintNode[],\n extensionRegistry: ConstraintRegistryLike | undefined\n): void {\n if (extensionRegistry === undefined) {\n return;\n }\n\n const strongestByKey = new Map<string, CustomSemanticEntry>();\n const lowerByFamily = new Map<string, CustomSemanticEntry>();\n const upperByFamily = new Map<string, CustomSemanticEntry>();\n\n for (const constraint of constraints) {\n if (constraint.constraintKind !== \"custom\") {\n continue;\n }\n\n const registration = extensionRegistry.findConstraint(constraint.constraintId);\n if (registration?.comparePayloads === undefined || registration.semanticRole === undefined) {\n continue;\n }\n\n const entry: CustomSemanticEntry = {\n constraint,\n comparePayloads: registration.comparePayloads,\n role: registration.semanticRole,\n };\n const familyKey = `${registration.semanticRole.family}:${constraintPathKey(constraint)}`;\n const boundKey = `${familyKey}:${registration.semanticRole.bound}`;\n const previous = strongestByKey.get(boundKey);\n\n if (previous !== undefined) {\n const strength = compareCustomConstraintStrength(entry, previous);\n if (Number.isNaN(strength)) {\n addContradiction(\n diagnostics,\n `Field \"${fieldName}\": ${describeCustomConstraintTag(constraint)} conflicts with ${describeCustomConstraintTag(previous.constraint)}`,\n constraint.provenance,\n previous.constraint.provenance\n );\n continue;\n }\n\n if (strength < 0) {\n addConstraintBroadening(\n diagnostics,\n `Field \"${fieldName}\": ${describeCustomConstraintTag(constraint)} is broader than earlier ${describeCustomConstraintTag(previous.constraint)}. Constraints can only narrow.`,\n constraint.provenance,\n previous.constraint.provenance\n );\n continue;\n }\n\n if (strength > 0) {\n strongestByKey.set(boundKey, entry);\n }\n } else {\n strongestByKey.set(boundKey, entry);\n }\n\n if (registration.semanticRole.bound === \"lower\") {\n lowerByFamily.set(familyKey, strongestByKey.get(boundKey) ?? entry);\n } else if (registration.semanticRole.bound === \"upper\") {\n upperByFamily.set(familyKey, strongestByKey.get(boundKey) ?? entry);\n }\n }\n\n for (const [familyKey, lower] of lowerByFamily) {\n const upper = upperByFamily.get(familyKey);\n if (upper === undefined || !customConstraintsContradict(lower, upper)) {\n continue;\n }\n\n addContradiction(\n diagnostics,\n `Field \"${fieldName}\": ${describeCustomConstraintTag(lower.constraint)} contradicts ${describeCustomConstraintTag(upper.constraint)}`,\n lower.constraint.provenance,\n upper.constraint.provenance\n );\n }\n}\n\nfunction checkCustomConstraint(\n diagnostics: ConstraintSemanticDiagnostic[],\n fieldName: string,\n type: TypeNode,\n constraint: CustomConstraintNode,\n typeRegistry: AnalysisTypeRegistry,\n extensionRegistry: ConstraintRegistryLike | undefined\n): void {\n if (extensionRegistry === undefined) {\n return;\n }\n\n const registration = extensionRegistry.findConstraint(constraint.constraintId);\n\n if (registration === undefined) {\n addUnknownExtension(\n diagnostics,\n `Field \"${fieldName}\": custom constraint \"${constraint.constraintId}\" is not registered in the extension registry`,\n constraint.provenance\n );\n return;\n }\n\n const candidateTypes = collectCustomConstraintCandidateTypes(type, typeRegistry);\n const normalizedTagName =\n constraint.provenance.tagName === undefined\n ? undefined\n : normalizeConstraintTagName(constraint.provenance.tagName.replace(/^@/, \"\"));\n\n if (normalizedTagName !== undefined) {\n const tagRegistration = extensionRegistry.findConstraintTag(normalizedTagName);\n const extensionId = getExtensionIdFromConstraintId(constraint.constraintId);\n if (\n extensionId !== null &&\n tagRegistration?.extensionId === extensionId &&\n tagRegistration.registration.constraintName === registration.constraintName &&\n !candidateTypes.some(\n (candidateType) =>\n tagRegistration.registration.isApplicableToType?.(candidateType) !== false\n )\n ) {\n addTypeMismatch(\n diagnostics,\n `Field \"${fieldName}\": custom constraint \"${constraint.constraintId}\" is not applicable to type \"${typeLabel(type)}\"`,\n constraint.provenance\n );\n return;\n }\n }\n\n if (registration.applicableTypes === null) {\n if (\n !candidateTypes.some(\n (candidateType) => registration.isApplicableToType?.(candidateType) !== false\n )\n ) {\n addTypeMismatch(\n diagnostics,\n `Field \"${fieldName}\": custom constraint \"${constraint.constraintId}\" is not applicable to type \"${typeLabel(type)}\"`,\n constraint.provenance\n );\n }\n return;\n }\n\n const applicableTypes = registration.applicableTypes;\n const matchesApplicableType = candidateTypes.some(\n (candidateType) =>\n applicableTypes.includes(candidateType.kind) &&\n registration.isApplicableToType?.(candidateType) !== false\n );\n\n if (!matchesApplicableType) {\n addTypeMismatch(\n diagnostics,\n `Field \"${fieldName}\": custom constraint \"${constraint.constraintId}\" is not applicable to type \"${typeLabel(type)}\"`,\n constraint.provenance\n );\n }\n}\n\nfunction checkConstraintOnType(\n diagnostics: ConstraintSemanticDiagnostic[],\n fieldName: string,\n type: TypeNode,\n constraint: ConstraintNode,\n typeRegistry: AnalysisTypeRegistry,\n extensionRegistry: ConstraintRegistryLike | undefined\n): void {\n const effectiveType = dereferenceAnalysisType(type, typeRegistry);\n const isNumber =\n effectiveType.kind === \"primitive\" &&\n [\"number\", \"integer\", \"bigint\"].includes(effectiveType.primitiveKind);\n const isString = effectiveType.kind === \"primitive\" && effectiveType.primitiveKind === \"string\";\n const isArray = effectiveType.kind === \"array\";\n const isEnum = effectiveType.kind === \"enum\";\n const arrayItemType =\n effectiveType.kind === \"array\"\n ? dereferenceAnalysisType(effectiveType.items, typeRegistry)\n : undefined;\n const isStringArray =\n arrayItemType?.kind === \"primitive\" && arrayItemType.primitiveKind === \"string\";\n\n const label = typeLabel(effectiveType);\n\n switch (constraint.constraintKind) {\n case \"minimum\":\n case \"maximum\":\n case \"exclusiveMinimum\":\n case \"exclusiveMaximum\":\n case \"multipleOf\":\n if (!isNumber) {\n addTypeMismatch(\n diagnostics,\n `Field \"${fieldName}\": constraint \"${constraint.constraintKind}\" is only valid on number fields, but field type is \"${label}\"`,\n constraint.provenance\n );\n }\n break;\n case \"minLength\":\n case \"maxLength\":\n case \"pattern\":\n if (!isString && !isStringArray) {\n addTypeMismatch(\n diagnostics,\n `Field \"${fieldName}\": constraint \"${constraint.constraintKind}\" is only valid on string fields or string array items, but field type is \"${label}\"`,\n constraint.provenance\n );\n }\n break;\n case \"minItems\":\n case \"maxItems\":\n case \"uniqueItems\":\n if (!isArray) {\n addTypeMismatch(\n diagnostics,\n `Field \"${fieldName}\": constraint \"${constraint.constraintKind}\" is only valid on array fields, but field type is \"${label}\"`,\n constraint.provenance\n );\n }\n break;\n case \"allowedMembers\":\n if (!isEnum) {\n addTypeMismatch(\n diagnostics,\n `Field \"${fieldName}\": constraint \"allowedMembers\" is only valid on enum fields, but field type is \"${label}\"`,\n constraint.provenance\n );\n }\n break;\n case \"const\": {\n const isPrimitiveConstType =\n (effectiveType.kind === \"primitive\" &&\n [\"string\", \"number\", \"integer\", \"bigint\", \"boolean\", \"null\"].includes(\n effectiveType.primitiveKind\n )) ||\n effectiveType.kind === \"enum\";\n\n if (!isPrimitiveConstType) {\n addTypeMismatch(\n diagnostics,\n `Field \"${fieldName}\": constraint \"const\" is only valid on primitive or enum fields, but field type is \"${label}\"`,\n constraint.provenance\n );\n break;\n }\n\n if (effectiveType.kind === \"primitive\") {\n const valueType =\n constraint.value === null\n ? \"null\"\n : Array.isArray(constraint.value)\n ? \"array\"\n : typeof constraint.value;\n const expectedValueType =\n effectiveType.primitiveKind === \"integer\" || effectiveType.primitiveKind === \"bigint\"\n ? \"number\"\n : effectiveType.primitiveKind;\n if (valueType !== expectedValueType) {\n addTypeMismatch(\n diagnostics,\n `Field \"${fieldName}\": @const value type \"${valueType}\" is incompatible with field type \"${effectiveType.primitiveKind}\"`,\n constraint.provenance\n );\n }\n break;\n }\n\n const memberValues = effectiveType.members.map((member) => member.value);\n if (!memberValues.some((member) => jsonValueEquals(member, constraint.value))) {\n addTypeMismatch(\n diagnostics,\n `Field \"${fieldName}\": @const value ${JSON.stringify(constraint.value)} is not one of the enum members`,\n constraint.provenance\n );\n }\n break;\n }\n case \"custom\":\n checkCustomConstraint(\n diagnostics,\n fieldName,\n effectiveType,\n constraint,\n typeRegistry,\n extensionRegistry\n );\n break;\n default: {\n const exhaustive: never = constraint;\n throw new Error(`Unhandled constraint: ${JSON.stringify(exhaustive)}`);\n }\n }\n}\n\nfunction analyzeResolvedTargetState(\n diagnostics: ConstraintSemanticDiagnostic[],\n state: Extract<ResolvedTargetState, { readonly kind: \"resolved\" }>,\n typeRegistry: AnalysisTypeRegistry,\n extensionRegistry: ConstraintRegistryLike | undefined\n): void {\n checkNumericContradictions(diagnostics, state.targetName, state.effectiveConstraints);\n checkLengthContradictions(diagnostics, state.targetName, state.effectiveConstraints);\n checkAllowedMembersContradiction(diagnostics, state.targetName, state.effectiveConstraints);\n checkConstContradictions(diagnostics, state.targetName, state.effectiveConstraints);\n checkConstraintBroadening(diagnostics, state.targetName, state.effectiveConstraints);\n checkCustomConstraintSemantics(\n diagnostics,\n state.targetName,\n state.effectiveConstraints,\n extensionRegistry\n );\n\n for (const constraint of state.effectiveConstraints) {\n checkConstraintOnType(\n diagnostics,\n state.targetName,\n state.type,\n constraint,\n typeRegistry,\n extensionRegistry\n );\n }\n}\n\n/**\n * Resolves targeted constraints against a field type, producing effective\n * target states plus semantic diagnostics such as contradictions, unknown\n * paths, and type mismatches.\n */\nexport function analyzeConstraintTargets(\n fieldName: string,\n fieldType: TypeNode,\n constraints: readonly ConstraintNode[],\n typeRegistry: AnalysisTypeRegistry,\n options?: {\n readonly extensionRegistry?: ConstraintRegistryLike;\n }\n): ConstraintTargetAnalysisResult {\n const diagnostics: ConstraintSemanticDiagnostic[] = [];\n const targetStates = buildConstraintTargetStates(fieldName, fieldType, constraints, typeRegistry);\n\n for (const targetState of targetStates) {\n switch (targetState.kind) {\n case \"resolved\":\n analyzeResolvedTargetState(\n diagnostics,\n targetState,\n typeRegistry,\n options?.extensionRegistry\n );\n break;\n case \"missing-property\":\n for (const constraint of targetState.localConstraints) {\n addUnknownPathTarget(\n diagnostics,\n `Field \"${targetState.targetName}\": path-targeted constraint \"${constraint.constraintKind}\" references unknown path segment \"${targetState.segment}\"`,\n constraint.provenance\n );\n }\n break;\n case \"unresolvable\":\n for (const constraint of targetState.localConstraints) {\n addTypeMismatch(\n diagnostics,\n `Field \"${targetState.targetName}\": path-targeted constraint \"${constraint.constraintKind}\" is invalid because type \"${typeLabel(targetState.type)}\" cannot be traversed`,\n constraint.provenance\n );\n }\n break;\n default: {\n const exhaustive: never = targetState;\n throw new Error(`Unhandled target state: ${String(exhaustive)}`);\n }\n }\n }\n\n return {\n diagnostics,\n targetStates,\n };\n}\n","import * as ts from \"typescript\";\nimport { checkSyntheticTagApplication } from \"./compiler-signatures.js\";\nimport { parseCommentBlock, type CommentSpan } from \"./comment-syntax.js\";\nimport {\n getCommentTagSemanticContext,\n type CommentSemanticContextOptions,\n} from \"./cursor-context.js\";\nimport { getHostType, getLastLeadingDocCommentRange, getSubjectType } from \"./source-bindings.js\";\nimport {\n computeFormSpecTextHash,\n serializeParsedCommentTag,\n type FormSpecAnalysisCommentSnapshot,\n type FormSpecAnalysisDiagnostic,\n type FormSpecAnalysisFileSnapshot,\n} from \"./semantic-protocol.js\";\nimport { resolveDeclarationPlacement } from \"./ts-binding.js\";\nimport type { ExtensionTagSource, FormSpecPlacement } from \"./tag-registry.js\";\n\n/**\n * Options used when building a serializable, editor-oriented snapshot for a\n * TypeScript source file.\n */\nexport interface BuildFormSpecAnalysisFileSnapshotOptions {\n readonly checker: ts.TypeChecker;\n readonly extensions?: readonly ExtensionTagSource[];\n}\n\nfunction spanFromPos(start: number, end: number): CommentSpan {\n return { start, end };\n}\n\nfunction typeToString(type: ts.Type | undefined, checker: ts.TypeChecker): string | null {\n if (type === undefined) {\n return null;\n }\n\n return checker.typeToString(type, undefined, ts.TypeFormatFlags.NoTruncation);\n}\n\nfunction supportingDeclarationsForType(type: ts.Type | undefined): readonly string[] {\n if (type === undefined) {\n return [];\n }\n\n const symbol = type.aliasSymbol ?? type.getSymbol();\n const declarations = symbol?.declarations ?? [];\n return declarations\n .map((declaration) =>\n declaration.getSourceFile().text.slice(declaration.getFullStart(), declaration.getEnd())\n )\n .filter((declarationText) => declarationText.trim().length > 0);\n}\n\nfunction getSyntheticTargetForTag(tag: ReturnType<typeof parseCommentBlock>[\"tags\"][number]) {\n if (tag.target === null) {\n return null;\n }\n\n switch (tag.target.kind) {\n case \"path\":\n case \"member\":\n case \"variant\":\n return {\n kind: tag.target.kind,\n text: tag.target.rawText,\n } as const;\n case \"ambiguous\":\n return {\n kind: \"path\" as const,\n text: tag.target.rawText,\n };\n default: {\n const exhaustive: never = tag.target.kind;\n return exhaustive;\n }\n }\n}\n\nfunction getArgumentExpression(\n argumentText: string,\n valueLabels: readonly string[],\n capabilityTargets: readonly string[]\n): string | null {\n const trimmed = argumentText.trim();\n if (trimmed === \"\") {\n return null;\n }\n\n if (valueLabels.some((label) => label.includes(\"number\") || label.includes(\"integer\"))) {\n return trimmed;\n }\n if (valueLabels.some((label) => label.includes(\"boolean\"))) {\n return trimmed === \"true\" || trimmed === \"false\" ? trimmed : null;\n }\n if (valueLabels.some((label) => label.includes(\"json\"))) {\n try {\n return JSON.stringify(JSON.parse(trimmed));\n } catch {\n return null;\n }\n }\n if (valueLabels.some((label) => label.includes(\"condition\"))) {\n return \"undefined as unknown as FormSpecCondition\";\n }\n if (capabilityTargets.length > 0 || valueLabels.some((label) => label.includes(\"string\"))) {\n return JSON.stringify(trimmed);\n }\n\n return JSON.stringify(trimmed);\n}\n\nfunction diagnosticSeverity(code: string): FormSpecAnalysisDiagnostic[\"severity\"] {\n switch (code) {\n case \"INVALID_TAG_ARGUMENT\":\n case \"INVALID_TAG_PLACEMENT\":\n case \"TYPE_MISMATCH\":\n case \"UNKNOWN_PATH_TARGET\":\n return \"error\";\n default:\n return \"warning\";\n }\n}\n\nfunction buildTagDiagnostics(\n sourceFile: ts.SourceFile,\n checker: ts.TypeChecker,\n placement: FormSpecPlacement | null,\n hostType: ts.Type | undefined,\n subjectType: ts.Type | undefined,\n commentTags: ReturnType<typeof parseCommentBlock>[\"tags\"],\n semanticOptions: CommentSemanticContextOptions\n): FormSpecAnalysisDiagnostic[] {\n if (placement === null || subjectType === undefined) {\n return [];\n }\n\n const diagnostics: FormSpecAnalysisDiagnostic[] = [];\n const hostTypeText = typeToString(hostType, checker) ?? \"unknown\";\n const subjectTypeText = typeToString(subjectType, checker) ?? \"unknown\";\n const supportingDeclarations = [\n ...supportingDeclarationsForType(hostType),\n ...supportingDeclarationsForType(subjectType),\n ];\n\n for (const tag of commentTags) {\n const semantic = getCommentTagSemanticContext(tag, semanticOptions);\n if (semantic.tagDefinition === null) {\n continue;\n }\n\n const target = getSyntheticTargetForTag(tag);\n const argumentExpression = getArgumentExpression(\n tag.argumentText,\n semantic.valueLabels,\n semantic.compatiblePathTargets\n );\n\n try {\n const result = checkSyntheticTagApplication({\n tagName: tag.normalizedTagName,\n placement,\n hostType: hostTypeText,\n subjectType: subjectTypeText,\n supportingDeclarations,\n ...(target === null ? {} : { target }),\n ...(argumentExpression === null ? {} : { argumentExpression }),\n ...(semanticOptions.extensions === undefined\n ? {}\n : { extensions: semanticOptions.extensions }),\n });\n\n for (const diagnostic of result.diagnostics) {\n const code =\n target !== null && diagnostic.message.includes(\"not assignable\")\n ? target.kind === \"path\"\n ? \"UNKNOWN_PATH_TARGET\"\n : \"TYPE_MISMATCH\"\n : diagnostic.message.includes(\"Expected\")\n ? \"INVALID_TAG_ARGUMENT\"\n : diagnostic.message.includes(\"No overload\")\n ? \"INVALID_TAG_PLACEMENT\"\n : \"TYPE_MISMATCH\";\n diagnostics.push({\n code,\n message: diagnostic.message,\n range: tag.fullSpan,\n severity: diagnosticSeverity(code),\n });\n }\n } catch (error) {\n diagnostics.push({\n code: \"INVALID_TAG_PLACEMENT\",\n message: error instanceof Error ? error.message : String(error),\n range: tag.fullSpan,\n severity: \"error\",\n });\n }\n }\n\n return diagnostics;\n}\n\nfunction buildCommentSnapshot(\n node: ts.Node,\n sourceFile: ts.SourceFile,\n checker: ts.TypeChecker,\n extensions: readonly ExtensionTagSource[] | undefined\n): FormSpecAnalysisCommentSnapshot | null {\n const docComment = getLastLeadingDocCommentRange(node, sourceFile);\n if (docComment === null) {\n return null;\n }\n\n const commentText = sourceFile.text.slice(docComment.pos, docComment.end);\n const parsed = parseCommentBlock(commentText, {\n offset: docComment.pos,\n ...(extensions === undefined ? {} : { extensions }),\n });\n if (parsed.tags.length === 0) {\n return null;\n }\n\n const placement = resolveDeclarationPlacement(node);\n const subjectType = getSubjectType(node, checker);\n const hostType = getHostType(node, checker);\n const semanticOptions: CommentSemanticContextOptions = {\n checker,\n ...(subjectType === undefined ? {} : { subjectType }),\n ...(placement === null ? {} : { placement }),\n ...(extensions === undefined ? {} : { extensions }),\n };\n\n const tags = parsed.tags.map((tag) =>\n serializeParsedCommentTag(tag, getCommentTagSemanticContext(tag, semanticOptions))\n );\n\n return {\n commentSpan: spanFromPos(docComment.pos, docComment.end),\n declarationSpan: spanFromPos(node.getStart(sourceFile), node.getEnd()),\n placement,\n subjectType: typeToString(subjectType, checker),\n hostType: typeToString(hostType, checker),\n tags,\n };\n}\n\n/**\n * Builds a transport-safe snapshot of every FormSpec-bearing doc comment in a\n * source file, including semantic hover/completion context and file-local\n * diagnostics.\n */\nexport function buildFormSpecAnalysisFileSnapshot(\n sourceFile: ts.SourceFile,\n options: BuildFormSpecAnalysisFileSnapshotOptions\n): FormSpecAnalysisFileSnapshot {\n const comments: FormSpecAnalysisCommentSnapshot[] = [];\n const diagnostics: FormSpecAnalysisDiagnostic[] = [];\n\n const visit = (node: ts.Node): void => {\n const placement = resolveDeclarationPlacement(node);\n if (placement !== null) {\n const snapshot = buildCommentSnapshot(node, sourceFile, options.checker, options.extensions);\n if (snapshot !== null) {\n comments.push(snapshot);\n\n const subjectType = getSubjectType(node, options.checker);\n const hostType = getHostType(node, options.checker);\n diagnostics.push(\n ...buildTagDiagnostics(\n sourceFile,\n options.checker,\n placement,\n hostType,\n subjectType,\n snapshot.tags.map((tag) => ({\n rawTagName: tag.rawTagName,\n normalizedTagName: tag.normalizedTagName,\n recognized: tag.recognized,\n fullSpan: tag.fullSpan,\n tagNameSpan: tag.tagNameSpan,\n payloadSpan: tag.payloadSpan,\n colonSpan: tag.target?.colonSpan ?? null,\n target:\n tag.target === null\n ? null\n : {\n rawText: tag.target.rawText,\n valid: tag.target.valid,\n kind: tag.target.kind,\n fullSpan: tag.target.fullSpan,\n colonSpan: tag.target.colonSpan,\n span: tag.target.span,\n path: null,\n },\n argumentSpan: tag.argumentSpan,\n argumentText: tag.argumentText,\n })),\n {\n checker: options.checker,\n ...(subjectType === undefined ? {} : { subjectType }),\n placement,\n ...(options.extensions === undefined ? {} : { extensions: options.extensions }),\n }\n )\n );\n }\n }\n\n ts.forEachChild(node, visit);\n };\n\n visit(sourceFile);\n\n return {\n filePath: sourceFile.fileName,\n sourceHash: computeFormSpecTextHash(sourceFile.text),\n generatedAt: new Date().toISOString(),\n comments,\n diagnostics,\n };\n}\n","import * as ts from \"typescript\";\nimport {\n getAllTagDefinitions,\n getTagDefinition,\n type ExtensionTagSource,\n type FormSpecPlacement,\n type FormSpecValueKind,\n type TagDefinition,\n type TagSignature,\n type TagSignatureParameter,\n} from \"./tag-registry.js\";\n\n/**\n * Target kinds that can be represented in a synthetic compiler call.\n *\n * This intentionally excludes `\"none\"`, because a missing target is modeled by\n * omitting the synthetic target argument entirely.\n */\nexport type SyntheticTagTargetKind = \"path\" | \"member\" | \"variant\";\n\n/**\n * A normalized target argument that can be lowered into a synthetic helper\n * call for compiler-backed validation.\n */\nexport interface SyntheticTagTargetSpecifier {\n readonly kind: SyntheticTagTargetKind;\n readonly text: string;\n}\n\n/**\n * Inputs required to lower a parsed FormSpec tag into a synthetic TypeScript\n * helper call.\n *\n * `hostType` and `subjectType` are trusted snippets of TypeScript type syntax\n * supplied by the caller. They are embedded into an in-memory synthetic source\n * file and are never executed.\n */\nexport interface LowerSyntheticTagApplicationOptions {\n readonly tagName: string;\n readonly placement: FormSpecPlacement;\n readonly hostType: string;\n readonly subjectType: string;\n readonly target?: SyntheticTagTargetSpecifier | null;\n readonly argumentExpression?: string | null;\n readonly extensions?: readonly ExtensionTagSource[];\n}\n\n/**\n * Result of lowering a tag application into the synthetic call representation\n * used for compiler-backed validation.\n */\nexport interface LoweredSyntheticTagApplication {\n readonly definition: TagDefinition;\n readonly matchingSignatures: readonly TagSignature[];\n readonly callExpression: string;\n}\n\n/**\n * A simplified TypeScript diagnostic surfaced from the synthetic compiler pass.\n */\nexport interface SyntheticCompilerDiagnostic {\n readonly code: number;\n readonly message: string;\n}\n\n/**\n * Options for running the TypeScript checker against a synthetic tag call.\n */\nexport interface CheckSyntheticTagApplicationOptions extends LowerSyntheticTagApplicationOptions {\n readonly supportingDeclarations?: readonly string[];\n}\n\n/**\n * Result of checking a lowered synthetic tag application with the TypeScript\n * compiler.\n */\nexport interface SyntheticTagCheckResult {\n readonly sourceText: string;\n readonly diagnostics: readonly SyntheticCompilerDiagnostic[];\n}\n\nconst PRELUDE_LINES = [\n \"type FormSpecPlacement =\",\n ' | \"class\"',\n ' | \"class-field\"',\n ' | \"class-method\"',\n ' | \"interface\"',\n ' | \"interface-field\"',\n ' | \"type-alias\"',\n ' | \"type-alias-field\"',\n ' | \"variable\"',\n ' | \"function\"',\n ' | \"function-parameter\"',\n ' | \"method-parameter\";',\n \"\",\n \"type FormSpecCapability =\",\n ' | \"numeric-comparable\"',\n ' | \"string-like\"',\n ' | \"array-like\"',\n ' | \"enum-member-addressable\"',\n ' | \"json-like\"',\n ' | \"condition-like\"',\n ' | \"object-like\";',\n \"\",\n \"interface TagContext<P extends FormSpecPlacement, Host, Subject> {\",\n \" readonly placement: P;\",\n \" readonly hostType: Host;\",\n \" readonly subjectType: Subject;\",\n \"}\",\n \"\",\n \"type NonNullish<T> = Exclude<T, null | undefined>;\",\n \"\",\n \"type ProvidesCapability<T, Capability extends FormSpecCapability> =\",\n ' Capability extends \"numeric-comparable\"',\n \" ? NonNullish<T> extends number | bigint\",\n \" ? true\",\n \" : false\",\n ' : Capability extends \"string-like\"',\n \" ? NonNullish<T> extends string\",\n \" ? true\",\n \" : false\",\n ' : Capability extends \"array-like\"',\n \" ? NonNullish<T> extends readonly unknown[]\",\n \" ? true\",\n \" : false\",\n ' : Capability extends \"enum-member-addressable\"',\n \" ? NonNullish<T> extends string\",\n \" ? true\",\n \" : false\",\n ' : Capability extends \"json-like\"',\n \" ? true\",\n ' : Capability extends \"condition-like\"',\n \" ? true\",\n ' : Capability extends \"object-like\"',\n \" ? NonNullish<T> extends readonly unknown[]\",\n \" ? false\",\n \" : NonNullish<T> extends object\",\n \" ? true\",\n \" : false\",\n \" : false;\",\n \"\",\n \"type NestedPathOfCapability<Subject, Capability extends FormSpecCapability> =\",\n \" NonNullish<Subject> extends readonly (infer Item)[]\",\n \" ? NestedPathOfCapability<Item, Capability>\",\n \" : NonNullish<Subject> extends object\",\n \" ? {\",\n \" [Key in Extract<keyof NonNullish<Subject>, string>]:\",\n \" | (ProvidesCapability<NonNullish<Subject>[Key], Capability> extends true ? Key : never)\",\n \" | (NestedPathOfCapability<NonNullish<Subject>[Key], Capability> extends never\",\n \" ? never\",\n \" : `${Key}.${NestedPathOfCapability<NonNullish<Subject>[Key], Capability>}`);\",\n \" }[Extract<keyof NonNullish<Subject>, string>]\",\n \" : never;\",\n \"\",\n \"type PathOfCapability<Subject, Capability extends FormSpecCapability> =\",\n \" NestedPathOfCapability<Subject, Capability>;\",\n \"\",\n \"type MemberTarget<Subject> = Extract<keyof NonNullish<Subject>, string>;\",\n \"\",\n 'type VariantTarget<Subject> = \"singular\" | \"plural\";',\n \"\",\n \"type FormSpecCondition = unknown;\",\n \"type JsonValue = unknown;\",\n \"\",\n \"declare function __ctx<P extends FormSpecPlacement, Host, Subject>(): TagContext<P, Host, Subject>;\",\n \"declare function __path<Subject, Capability extends FormSpecCapability>(\",\n \" path: PathOfCapability<Subject, Capability>\",\n \"): PathOfCapability<Subject, Capability>;\",\n \"declare function __member<Subject>(member: MemberTarget<Subject>): MemberTarget<Subject>;\",\n \"declare function __variant<Subject>(variant: VariantTarget<Subject>): VariantTarget<Subject>;\",\n] as const;\n\nfunction placementUnion(placements: readonly FormSpecPlacement[]): string {\n return placements.map((placement) => JSON.stringify(placement)).join(\" | \");\n}\n\nfunction renderValueType(valueKind: FormSpecValueKind | undefined): string {\n switch (valueKind) {\n case \"number\":\n case \"integer\":\n case \"signedInteger\":\n return \"number\";\n case \"string\":\n return \"string\";\n case \"json\":\n return \"JsonValue\";\n case \"boolean\":\n return \"boolean\";\n case \"condition\":\n return \"FormSpecCondition\";\n case undefined:\n return \"unknown\";\n default: {\n const exhaustive: never = valueKind;\n return exhaustive;\n }\n }\n}\n\nfunction renderTargetParameterType(parameter: TagSignatureParameter): string {\n switch (parameter.kind) {\n case \"target-path\":\n return parameter.capability === undefined\n ? \"PathOfCapability<Subject, FormSpecCapability>\"\n : `PathOfCapability<Subject, ${JSON.stringify(parameter.capability)}>`;\n case \"target-member\":\n return \"MemberTarget<Subject>\";\n case \"target-variant\":\n return \"VariantTarget<Subject>\";\n case \"value\":\n return renderValueType(parameter.valueKind);\n default: {\n const exhaustive: never = parameter.kind;\n return exhaustive;\n }\n }\n}\n\nfunction renderSignature(tagName: string, signature: TagSignature): string {\n const parameters = signature.parameters.map((parameter, index) => {\n const name = parameter.kind === \"value\" ? \"value\" : `target${String(index)}`;\n return `${name}: ${renderTargetParameterType(parameter)}`;\n });\n\n return [\n ` function ${getSyntheticTagHelperName(tagName)}<Host, Subject>(`,\n ` ctx: TagContext<${placementUnion(signature.placements)}, Host, Subject>${\n parameters.length > 0 ? \",\" : \"\"\n }`,\n ...parameters.map(\n (parameter, index) => ` ${parameter}${index === parameters.length - 1 ? \"\" : \",\"}`\n ),\n \" ): void;\",\n ].join(\"\\n\");\n}\n\nfunction getSyntheticTagHelperName(tagName: string): string {\n return `tag_${tagName}`;\n}\n\nfunction targetKindForParameter(parameter: TagSignatureParameter): SyntheticTagTargetKind | null {\n switch (parameter.kind) {\n case \"target-path\":\n return \"path\";\n case \"target-member\":\n return \"member\";\n case \"target-variant\":\n return \"variant\";\n case \"value\":\n return null;\n default: {\n const exhaustive: never = parameter.kind;\n return exhaustive;\n }\n }\n}\n\nfunction getSignatureTargetKind(signature: TagSignature): SyntheticTagTargetKind | null {\n for (const parameter of signature.parameters) {\n const targetKind = targetKindForParameter(parameter);\n if (targetKind !== null) {\n return targetKind;\n }\n }\n\n return null;\n}\n\nfunction getTargetParameter(\n signature: TagSignature\n): Exclude<TagSignatureParameter, { kind: \"value\" }> | null {\n return (\n signature.parameters.find(\n (parameter): parameter is Exclude<TagSignatureParameter, { kind: \"value\" }> =>\n parameter.kind !== \"value\"\n ) ?? null\n );\n}\n\nfunction getPathTargetCapability(signature: TagSignature): string {\n const parameter = getTargetParameter(signature);\n if (parameter?.kind !== \"target-path\") {\n throw new Error(`Invariant violation: expected a path-target synthetic signature`);\n }\n if (parameter.capability === undefined) {\n throw new Error(\n `Invariant violation: path-target synthetic signatures must declare a capability`\n );\n }\n\n return JSON.stringify(parameter.capability);\n}\n\nfunction renderTargetArgument(\n target: SyntheticTagTargetSpecifier,\n signature: TagSignature,\n subjectType: string\n): string {\n switch (target.kind) {\n case \"path\":\n return `__path<${subjectType}, ${getPathTargetCapability(signature)}>(${JSON.stringify(\n target.text\n )})`;\n case \"member\":\n return `__member<${subjectType}>(${JSON.stringify(target.text)})`;\n case \"variant\":\n return `__variant<${subjectType}>(${JSON.stringify(target.text)})`;\n }\n}\n\n/**\n * Filters a tag definition's overloads down to the ones that apply to the\n * requested placement and synthetic target form.\n *\n * This is the overload-selection primitive used by both the lowering phase\n * and cursor-aware tooling that wants to show only the currently-applicable\n * signatures for a tag.\n */\nexport function getMatchingTagSignatures(\n definition: TagDefinition,\n placement: FormSpecPlacement,\n targetKind: SyntheticTagTargetKind | null\n): readonly TagSignature[] {\n return definition.signatures.filter(\n (signature) =>\n signature.placements.includes(placement) && getSignatureTargetKind(signature) === targetKind\n );\n}\n\n/**\n * Builds the synthetic helper declarations used to validate FormSpec tag\n * applications through the TypeScript checker.\n *\n * The returned string is a virtual `.d.ts`-style prelude that declares the\n * `__formspec.*` helper namespace together with context, path, member, and\n * variant helper types. It is intended to be embedded into an in-memory\n * TypeScript program, never emitted to disk.\n */\nexport function buildSyntheticHelperPrelude(extensions?: readonly ExtensionTagSource[]): string {\n const lines = [...PRELUDE_LINES, \"\", \"declare namespace __formspec {\"];\n\n for (const definition of getAllTagDefinitions(extensions)) {\n for (const signature of definition.signatures) {\n lines.push(renderSignature(definition.canonicalName, signature));\n }\n }\n\n lines.push(\"}\");\n return lines.join(\"\\n\");\n}\n\n/**\n * Lowers a normalized tag application into a synthetic helper call.\n *\n * The caller is responsible for supplying trusted `hostType` and `subjectType`\n * snippets that are valid TypeScript type syntax in the generated synthetic\n * program. This function does not sanitize those snippets; it only assembles\n * the helper call and selects the matching overload metadata.\n */\nexport function lowerTagApplicationToSyntheticCall(\n options: LowerSyntheticTagApplicationOptions\n): LoweredSyntheticTagApplication {\n const definition = getTagDefinition(options.tagName, options.extensions);\n if (definition === null) {\n throw new Error(`Unknown FormSpec tag: ${options.tagName}`);\n }\n\n const targetKind = options.target?.kind ?? null;\n const matchingSignatures = getMatchingTagSignatures(definition, options.placement, targetKind);\n if (matchingSignatures.length === 0) {\n throw new Error(\n `No synthetic signature for @${definition.canonicalName} on placement \"${options.placement}\"` +\n (targetKind === null ? \"\" : ` with target kind \"${targetKind}\"`)\n );\n }\n\n const args = [\n `__ctx<${JSON.stringify(options.placement)}, ${options.hostType}, ${options.subjectType}>()`,\n ];\n const signature = matchingSignatures[0];\n if (signature === undefined) {\n throw new Error(\n `Invariant violation: missing synthetic signature for @${definition.canonicalName}`\n );\n }\n\n if (options.target !== undefined && options.target !== null) {\n args.push(renderTargetArgument(options.target, signature, options.subjectType));\n }\n\n if (options.argumentExpression !== undefined && options.argumentExpression !== null) {\n args.push(options.argumentExpression);\n }\n\n return {\n definition,\n matchingSignatures,\n callExpression: `__formspec.${getSyntheticTagHelperName(definition.canonicalName)}(${args.join(\", \")});`,\n };\n}\n\nfunction createSyntheticCompilerHost(\n fileName: string,\n sourceText: string,\n compilerOptions: ts.CompilerOptions\n): ts.CompilerHost {\n const host = ts.createCompilerHost(compilerOptions, true);\n const originalGetSourceFile = host.getSourceFile.bind(host);\n\n host.getSourceFile = (requestedFileName, languageVersion, onError, shouldCreateNewSourceFile) => {\n if (requestedFileName === fileName) {\n return ts.createSourceFile(requestedFileName, sourceText, languageVersion, true);\n }\n\n return originalGetSourceFile(\n requestedFileName,\n languageVersion,\n onError,\n shouldCreateNewSourceFile\n );\n };\n\n host.readFile = (requestedFileName) => {\n if (requestedFileName === fileName) {\n return sourceText;\n }\n return ts.sys.readFile(requestedFileName);\n };\n\n host.fileExists = (requestedFileName) =>\n requestedFileName === fileName || ts.sys.fileExists(requestedFileName);\n\n host.writeFile = () => undefined;\n return host;\n}\n\nfunction flattenDiagnosticMessage(message: string | ts.DiagnosticMessageChain): string {\n return ts.flattenDiagnosticMessageText(message, \"\\n\");\n}\n\nconst syntheticCheckCache = new Map<string, SyntheticTagCheckResult>();\n\n/**\n * Runs the TypeScript checker against a lowered synthetic tag application.\n *\n * This is the compiler-backed validation entrypoint used by FormSpec analysis\n * to verify placement, target binding, and argument compatibility without\n * requiring comment tags themselves to be valid TypeScript syntax.\n */\nexport function checkSyntheticTagApplication(\n options: CheckSyntheticTagApplicationOptions\n): SyntheticTagCheckResult {\n const lowered = lowerTagApplicationToSyntheticCall(options);\n const sourceText = [\n buildSyntheticHelperPrelude(options.extensions),\n \"\",\n ...(options.supportingDeclarations ?? []),\n \"\",\n lowered.callExpression,\n ].join(\"\\n\");\n const cached = syntheticCheckCache.get(sourceText);\n if (cached !== undefined) {\n return cached;\n }\n const fileName = \"/virtual/formspec-synthetic.ts\";\n const compilerOptions: ts.CompilerOptions = {\n strict: true,\n noEmit: true,\n target: ts.ScriptTarget.ES2022,\n module: ts.ModuleKind.ESNext,\n lib: [\"lib.es2022.d.ts\"],\n };\n const host = createSyntheticCompilerHost(fileName, sourceText, compilerOptions);\n const program = ts.createProgram([fileName], compilerOptions, host);\n const diagnostics = ts\n .getPreEmitDiagnostics(program)\n .filter((diagnostic) => diagnostic.file === undefined || diagnostic.file.fileName === fileName)\n .map((diagnostic) => ({\n code: diagnostic.code,\n message: flattenDiagnosticMessage(diagnostic.messageText),\n }));\n\n const result = {\n sourceText,\n diagnostics,\n };\n syntheticCheckCache.set(sourceText, result);\n return result;\n}\n","import * as ts from \"typescript\";\nimport { resolveDeclarationPlacement } from \"./ts-binding.js\";\n\n/**\n * Returns the last leading TSDoc/JSDoc block attached to a declaration node.\n */\nexport function getLastLeadingDocCommentRange(\n node: ts.Node,\n sourceFile: ts.SourceFile\n): ts.CommentRange | null {\n const ranges = ts.getLeadingCommentRanges(sourceFile.text, node.getFullStart()) ?? [];\n const docRanges = ranges.filter((range) =>\n sourceFile.text.slice(range.pos, range.end).startsWith(\"/**\")\n );\n return docRanges.length === 0 ? null : (docRanges[docRanges.length - 1] ?? null);\n}\n\n/**\n * Resolves the direct subject type for declarations that can carry FormSpec\n * comment tags.\n */\nexport function getSubjectType(node: ts.Node, checker: ts.TypeChecker): ts.Type | undefined {\n if (\n ts.isClassDeclaration(node) ||\n ts.isInterfaceDeclaration(node) ||\n ts.isTypeAliasDeclaration(node) ||\n ts.isPropertyDeclaration(node) ||\n ts.isPropertySignature(node) ||\n ts.isMethodDeclaration(node) ||\n ts.isFunctionDeclaration(node) ||\n ts.isVariableDeclaration(node) ||\n ts.isParameter(node)\n ) {\n return checker.getTypeAtLocation(node);\n }\n\n return undefined;\n}\n\n/**\n * Resolves the enclosing host type for declarations nested under a containing\n * class, interface, or type literal.\n */\nexport function getHostType(node: ts.Node, checker: ts.TypeChecker): ts.Type | undefined {\n const parent = node.parent;\n if (\n ts.isClassDeclaration(parent) ||\n ts.isInterfaceDeclaration(parent) ||\n ts.isTypeLiteralNode(parent) ||\n ts.isTypeAliasDeclaration(parent)\n ) {\n return checker.getTypeAtLocation(parent);\n }\n\n return getSubjectType(node, checker);\n}\n\n/**\n * Finds the smallest declaration whose leading doc comment contains the given\n * source offset.\n */\nexport function findDeclarationForCommentOffset(\n sourceFile: ts.SourceFile,\n offset: number\n): ts.Node | null {\n let bestMatch: ts.Node | null = null;\n\n const visit = (node: ts.Node): void => {\n if (resolveDeclarationPlacement(node) !== null) {\n const range = getLastLeadingDocCommentRange(node, sourceFile);\n if (range !== null && offset >= range.pos && offset <= range.end) {\n if (bestMatch === null || node.getWidth(sourceFile) < bestMatch.getWidth(sourceFile)) {\n bestMatch = node;\n }\n }\n }\n\n ts.forEachChild(node, visit);\n };\n\n visit(sourceFile);\n return bestMatch;\n}\n","import type {\n CommentSpan,\n ParsedCommentTag,\n ParsedCommentTargetSpecifier,\n} from \"./comment-syntax.js\";\nimport type {\n CommentHoverInfo,\n CommentTagSemanticContext,\n SemanticCommentCompletionContext,\n} from \"./cursor-context.js\";\nimport type { FormSpecPlacement, FormSpecTargetKind } from \"./tag-registry.js\";\n\nexport const FORMSPEC_ANALYSIS_PROTOCOL_VERSION = 1;\nexport const FORMSPEC_ANALYSIS_SCHEMA_VERSION = 1;\n\n/**\n * Cross-process endpoint used by the language server to reach the semantic\n * tsserver plugin on the current workspace host.\n */\nexport interface FormSpecIpcEndpoint {\n readonly kind: \"unix-socket\" | \"windows-pipe\";\n readonly address: string;\n}\n\n/**\n * Discovery record written by the tsserver plugin so other FormSpec tooling\n * can locate and validate the matching semantic service for a workspace.\n */\nexport interface FormSpecAnalysisManifest {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly analysisSchemaVersion: typeof FORMSPEC_ANALYSIS_SCHEMA_VERSION;\n readonly workspaceRoot: string;\n readonly workspaceId: string;\n readonly endpoint: FormSpecIpcEndpoint;\n readonly typescriptVersion: string;\n readonly extensionFingerprint: string;\n readonly generation: number;\n readonly updatedAt: string;\n}\n\n/**\n * Serializable subset of tag metadata needed by hover and completion UIs.\n */\nexport interface FormSpecSerializedTagDefinition {\n readonly canonicalName: string;\n readonly completionDetail: string;\n readonly hoverMarkdown: string;\n}\n\n/**\n * Serializable overload/signature summary for one comment tag form.\n */\nexport interface FormSpecSerializedTagSignature {\n readonly label: string;\n readonly placements: readonly FormSpecPlacement[];\n}\n\n/**\n * Serialized representation of a parsed target specifier with exact spans.\n */\nexport interface FormSpecSerializedCommentTargetSpecifier {\n readonly rawText: string;\n readonly valid: boolean;\n readonly kind: ParsedCommentTargetSpecifier[\"kind\"];\n readonly fullSpan: CommentSpan;\n readonly colonSpan: CommentSpan;\n readonly span: CommentSpan;\n}\n\n/**\n * Semantic facts about one parsed tag, reduced to JSON-safe data for IPC.\n */\nexport interface FormSpecSerializedTagSemanticContext {\n readonly tagName: string;\n readonly tagDefinition: FormSpecSerializedTagDefinition | null;\n readonly placement: FormSpecPlacement | null;\n readonly supportedTargets: readonly FormSpecTargetKind[];\n readonly targetCompletions: readonly string[];\n readonly compatiblePathTargets: readonly string[];\n readonly valueLabels: readonly string[];\n readonly signatures: readonly FormSpecSerializedTagSignature[];\n readonly tagHoverMarkdown: string | null;\n readonly targetHoverMarkdown: string | null;\n readonly argumentHoverMarkdown: string | null;\n}\n\n/**\n * Cursor-scoped completion context serialized for transport between the\n * semantic tsserver plugin and the lightweight LSP.\n */\nexport type FormSpecSerializedCompletionContext =\n | {\n readonly kind: \"tag-name\";\n readonly prefix: string;\n readonly availableTags: readonly FormSpecSerializedTagDefinition[];\n }\n | {\n readonly kind: \"target\";\n readonly semantic: FormSpecSerializedTagSemanticContext;\n }\n | {\n readonly kind: \"argument\";\n readonly semantic: FormSpecSerializedTagSemanticContext;\n readonly valueLabels: readonly string[];\n }\n | {\n readonly kind: \"none\";\n };\n\n/**\n * Hover payload for a single comment token under the cursor.\n */\nexport interface FormSpecSerializedHoverInfo {\n readonly kind: CommentHoverInfo[\"kind\"];\n readonly markdown: string;\n}\n\n/**\n * File-local diagnostic derived from comment parsing or semantic analysis.\n */\nexport interface FormSpecAnalysisDiagnostic {\n readonly code: string;\n readonly message: string;\n readonly range: CommentSpan;\n readonly severity: \"error\" | \"warning\" | \"info\";\n}\n\n/**\n * Serializable view of a single parsed FormSpec tag within a doc comment.\n */\nexport interface FormSpecAnalysisTagSnapshot {\n readonly rawTagName: string;\n readonly normalizedTagName: string;\n readonly recognized: boolean;\n readonly fullSpan: CommentSpan;\n readonly tagNameSpan: CommentSpan;\n readonly payloadSpan: CommentSpan | null;\n readonly target: FormSpecSerializedCommentTargetSpecifier | null;\n readonly argumentSpan: CommentSpan | null;\n readonly argumentText: string;\n readonly semantic: FormSpecSerializedTagSemanticContext;\n}\n\n/**\n * Serializable view of one declaration-attached doc comment in a source file.\n */\nexport interface FormSpecAnalysisCommentSnapshot {\n readonly commentSpan: CommentSpan;\n readonly declarationSpan: CommentSpan;\n readonly placement: FormSpecPlacement | null;\n readonly subjectType: string | null;\n readonly hostType: string | null;\n readonly tags: readonly FormSpecAnalysisTagSnapshot[];\n}\n\n/**\n * Serializable analysis artifact for a single source file.\n */\nexport interface FormSpecAnalysisFileSnapshot {\n readonly filePath: string;\n readonly sourceHash: string;\n readonly generatedAt: string;\n readonly comments: readonly FormSpecAnalysisCommentSnapshot[];\n readonly diagnostics: readonly FormSpecAnalysisDiagnostic[];\n}\n\n/**\n * Query variants supported by the semantic tsserver plugin.\n */\nexport type FormSpecSemanticQuery =\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"health\";\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"completion\";\n readonly filePath: string;\n readonly offset: number;\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"hover\";\n readonly filePath: string;\n readonly offset: number;\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"diagnostics\";\n readonly filePath: string;\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"file-snapshot\";\n readonly filePath: string;\n };\n\n/**\n * Response variants returned by the semantic tsserver plugin.\n */\nexport type FormSpecSemanticResponse =\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"health\";\n readonly manifest: FormSpecAnalysisManifest;\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"completion\";\n readonly sourceHash: string;\n readonly context: FormSpecSerializedCompletionContext;\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"hover\";\n readonly sourceHash: string;\n readonly hover: FormSpecSerializedHoverInfo | null;\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"diagnostics\";\n readonly sourceHash: string;\n readonly diagnostics: readonly FormSpecAnalysisDiagnostic[];\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"file-snapshot\";\n readonly snapshot: FormSpecAnalysisFileSnapshot | null;\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"error\";\n readonly error: string;\n };\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isCommentSpan(value: unknown): value is CommentSpan {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<CommentSpan>;\n return typeof candidate.start === \"number\" && typeof candidate.end === \"number\";\n}\n\nfunction isStringArray(value: unknown): value is readonly string[] {\n return Array.isArray(value) && value.every((entry) => typeof entry === \"string\");\n}\n\nfunction isPlacementArray(value: unknown): value is readonly FormSpecPlacement[] {\n return isStringArray(value);\n}\n\nfunction isTargetKindArray(value: unknown): value is readonly FormSpecTargetKind[] {\n return isStringArray(value);\n}\n\nfunction isIpcEndpoint(value: unknown): value is FormSpecIpcEndpoint {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecIpcEndpoint>;\n return (\n (candidate.kind === \"unix-socket\" || candidate.kind === \"windows-pipe\") &&\n typeof candidate.address === \"string\"\n );\n}\n\nfunction isSerializedTagDefinition(value: unknown): value is FormSpecSerializedTagDefinition {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecSerializedTagDefinition>;\n return (\n typeof candidate.canonicalName === \"string\" &&\n typeof candidate.completionDetail === \"string\" &&\n typeof candidate.hoverMarkdown === \"string\"\n );\n}\n\nfunction isSerializedTagSignature(value: unknown): value is FormSpecSerializedTagSignature {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecSerializedTagSignature>;\n return typeof candidate.label === \"string\" && isPlacementArray(candidate.placements);\n}\n\nfunction isSerializedCommentTargetSpecifier(\n value: unknown\n): value is FormSpecSerializedCommentTargetSpecifier {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecSerializedCommentTargetSpecifier>;\n return (\n typeof candidate.rawText === \"string\" &&\n typeof candidate.valid === \"boolean\" &&\n typeof candidate.kind === \"string\" &&\n isCommentSpan(candidate.fullSpan) &&\n isCommentSpan(candidate.colonSpan) &&\n isCommentSpan(candidate.span)\n );\n}\n\nfunction isSerializedTagSemanticContext(\n value: unknown\n): value is FormSpecSerializedTagSemanticContext {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecSerializedTagSemanticContext>;\n return (\n typeof candidate.tagName === \"string\" &&\n (candidate.tagDefinition === null || isSerializedTagDefinition(candidate.tagDefinition)) &&\n (candidate.placement === null || typeof candidate.placement === \"string\") &&\n isTargetKindArray(candidate.supportedTargets) &&\n isStringArray(candidate.targetCompletions) &&\n isStringArray(candidate.compatiblePathTargets) &&\n isStringArray(candidate.valueLabels) &&\n Array.isArray(candidate.signatures) &&\n candidate.signatures.every(isSerializedTagSignature) &&\n (candidate.tagHoverMarkdown === null || typeof candidate.tagHoverMarkdown === \"string\") &&\n (candidate.targetHoverMarkdown === null || typeof candidate.targetHoverMarkdown === \"string\") &&\n (candidate.argumentHoverMarkdown === null ||\n typeof candidate.argumentHoverMarkdown === \"string\")\n );\n}\n\nfunction isSerializedCompletionContext(\n value: unknown\n): value is FormSpecSerializedCompletionContext {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecSerializedCompletionContext>;\n if (typeof candidate.kind !== \"string\") {\n return false;\n }\n\n switch (candidate.kind) {\n case \"tag-name\":\n return typeof candidate.prefix === \"string\" && Array.isArray(candidate.availableTags)\n ? candidate.availableTags.every(isSerializedTagDefinition)\n : false;\n case \"target\":\n return isSerializedTagSemanticContext(candidate.semantic);\n case \"argument\":\n return (\n isSerializedTagSemanticContext(candidate.semantic) && isStringArray(candidate.valueLabels)\n );\n case \"none\":\n return true;\n default:\n return false;\n }\n}\n\nfunction isSerializedHoverInfo(value: unknown): value is FormSpecSerializedHoverInfo {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecSerializedHoverInfo>;\n return (\n (candidate.kind === \"tag-name\" ||\n candidate.kind === \"target\" ||\n candidate.kind === \"argument\") &&\n typeof candidate.markdown === \"string\"\n );\n}\n\nfunction hasCurrentProtocolVersion(\n value: unknown\n): value is { readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION } {\n return isObjectRecord(value) && value[\"protocolVersion\"] === FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n}\n\nfunction isAnalysisDiagnostic(value: unknown): value is FormSpecAnalysisDiagnostic {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecAnalysisDiagnostic>;\n return (\n typeof candidate.code === \"string\" &&\n typeof candidate.message === \"string\" &&\n isCommentSpan(candidate.range) &&\n (candidate.severity === \"error\" ||\n candidate.severity === \"warning\" ||\n candidate.severity === \"info\")\n );\n}\n\nfunction isAnalysisTagSnapshot(value: unknown): value is FormSpecAnalysisTagSnapshot {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecAnalysisTagSnapshot>;\n return (\n typeof candidate.rawTagName === \"string\" &&\n typeof candidate.normalizedTagName === \"string\" &&\n typeof candidate.recognized === \"boolean\" &&\n isCommentSpan(candidate.fullSpan) &&\n isCommentSpan(candidate.tagNameSpan) &&\n (candidate.payloadSpan === null || isCommentSpan(candidate.payloadSpan)) &&\n (candidate.target === null || isSerializedCommentTargetSpecifier(candidate.target)) &&\n (candidate.argumentSpan === null || isCommentSpan(candidate.argumentSpan)) &&\n typeof candidate.argumentText === \"string\" &&\n isSerializedTagSemanticContext(candidate.semantic)\n );\n}\n\nfunction isAnalysisCommentSnapshot(value: unknown): value is FormSpecAnalysisCommentSnapshot {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecAnalysisCommentSnapshot>;\n return (\n isCommentSpan(candidate.commentSpan) &&\n isCommentSpan(candidate.declarationSpan) &&\n (candidate.placement === null || typeof candidate.placement === \"string\") &&\n (candidate.subjectType === null || typeof candidate.subjectType === \"string\") &&\n (candidate.hostType === null || typeof candidate.hostType === \"string\") &&\n Array.isArray(candidate.tags) &&\n candidate.tags.every(isAnalysisTagSnapshot)\n );\n}\n\nfunction isAnalysisFileSnapshot(value: unknown): value is FormSpecAnalysisFileSnapshot {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecAnalysisFileSnapshot>;\n return (\n typeof candidate.filePath === \"string\" &&\n typeof candidate.sourceHash === \"string\" &&\n typeof candidate.generatedAt === \"string\" &&\n Array.isArray(candidate.comments) &&\n candidate.comments.every(isAnalysisCommentSnapshot) &&\n Array.isArray(candidate.diagnostics) &&\n candidate.diagnostics.every(isAnalysisDiagnostic)\n );\n}\n\n/**\n * Validates an unknown manifest payload from disk before consumers trust it.\n */\nexport function isFormSpecAnalysisManifest(value: unknown): value is FormSpecAnalysisManifest {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecAnalysisManifest>;\n return (\n candidate.protocolVersion === FORMSPEC_ANALYSIS_PROTOCOL_VERSION &&\n candidate.analysisSchemaVersion === FORMSPEC_ANALYSIS_SCHEMA_VERSION &&\n typeof candidate.workspaceRoot === \"string\" &&\n typeof candidate.workspaceId === \"string\" &&\n isIpcEndpoint(candidate.endpoint) &&\n typeof candidate.typescriptVersion === \"string\" &&\n typeof candidate.extensionFingerprint === \"string\" &&\n typeof candidate.generation === \"number\" &&\n typeof candidate.updatedAt === \"string\"\n );\n}\n\n/**\n * Validates an unknown inbound IPC request before dispatching it.\n */\nexport function isFormSpecSemanticQuery(value: unknown): value is FormSpecSemanticQuery {\n if (!hasCurrentProtocolVersion(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecSemanticQuery>;\n if (typeof candidate.kind !== \"string\") {\n return false;\n }\n\n switch (candidate.kind) {\n case \"health\":\n return true;\n case \"completion\":\n case \"hover\":\n return typeof candidate.filePath === \"string\" && typeof candidate.offset === \"number\";\n case \"diagnostics\":\n case \"file-snapshot\":\n return typeof candidate.filePath === \"string\";\n default:\n return false;\n }\n}\n\n/**\n * Validates an unknown IPC response before the language server consumes it.\n */\nexport function isFormSpecSemanticResponse(value: unknown): value is FormSpecSemanticResponse {\n if (!hasCurrentProtocolVersion(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecSemanticResponse>;\n if (typeof candidate.kind !== \"string\") {\n return false;\n }\n\n switch (candidate.kind) {\n case \"health\":\n return isFormSpecAnalysisManifest(candidate.manifest);\n case \"completion\":\n return (\n typeof candidate.sourceHash === \"string\" && isSerializedCompletionContext(candidate.context)\n );\n case \"hover\":\n return (\n typeof candidate.sourceHash === \"string\" &&\n (candidate.hover === null || isSerializedHoverInfo(candidate.hover))\n );\n case \"diagnostics\":\n return (\n typeof candidate.sourceHash === \"string\" &&\n Array.isArray(candidate.diagnostics) &&\n candidate.diagnostics.every(isAnalysisDiagnostic)\n );\n case \"file-snapshot\":\n return candidate.snapshot === null || isAnalysisFileSnapshot(candidate.snapshot);\n case \"error\":\n return typeof candidate.error === \"string\";\n default:\n return false;\n }\n}\n\n/**\n * Computes a stable, non-cryptographic hash for document staleness checks\n * across the plugin/LSP boundary.\n */\nexport function computeFormSpecTextHash(text: string): string {\n let hash = 0x811c9dc5;\n for (let index = 0; index < text.length; index += 1) {\n hash ^= text.charCodeAt(index);\n hash = Math.imul(hash, 0x01000193);\n }\n\n return (hash >>> 0).toString(16).padStart(8, \"0\");\n}\n\n/**\n * Converts a parsed target specifier into its transport-safe JSON form.\n */\nexport function serializeCommentTargetSpecifier(\n target: ParsedCommentTargetSpecifier | null\n): FormSpecSerializedCommentTargetSpecifier | null {\n if (target === null) {\n return null;\n }\n\n return {\n rawText: target.rawText,\n valid: target.valid,\n kind: target.kind,\n fullSpan: target.fullSpan,\n colonSpan: target.colonSpan,\n span: target.span,\n };\n}\n\n/**\n * Serializes tag-level semantic context for cross-process consumption.\n */\nexport function serializeCommentTagSemanticContext(\n semantic: CommentTagSemanticContext\n): FormSpecSerializedTagSemanticContext {\n return {\n tagName: semantic.tag.normalizedTagName,\n tagDefinition:\n semantic.tagDefinition === null\n ? null\n : {\n canonicalName: semantic.tagDefinition.canonicalName,\n completionDetail: semantic.tagDefinition.completionDetail,\n hoverMarkdown: semantic.tagDefinition.hoverMarkdown,\n },\n placement: semantic.placement,\n supportedTargets: semantic.supportedTargets,\n targetCompletions: semantic.targetCompletions,\n compatiblePathTargets: semantic.compatiblePathTargets,\n valueLabels: semantic.valueLabels,\n signatures: semantic.signatures.map((signature) => ({\n label: signature.label,\n placements: signature.placements,\n })),\n tagHoverMarkdown: semantic.tagHoverMarkdown,\n targetHoverMarkdown: semantic.targetHoverMarkdown,\n argumentHoverMarkdown: semantic.argumentHoverMarkdown,\n };\n}\n\n/**\n * Serializes a cursor-scoped completion context for IPC.\n */\nexport function serializeCompletionContext(\n context: SemanticCommentCompletionContext\n): FormSpecSerializedCompletionContext {\n switch (context.kind) {\n case \"tag-name\":\n return {\n kind: \"tag-name\",\n prefix: context.prefix,\n availableTags: context.availableTags.map((tag) => ({\n canonicalName: tag.canonicalName,\n completionDetail: tag.completionDetail,\n hoverMarkdown: tag.hoverMarkdown,\n })),\n };\n case \"target\":\n return {\n kind: \"target\",\n semantic: serializeCommentTagSemanticContext(context.semantic),\n };\n case \"argument\":\n return {\n kind: \"argument\",\n semantic: serializeCommentTagSemanticContext(context.semantic),\n valueLabels: context.valueLabels,\n };\n case \"none\":\n return { kind: \"none\" };\n default: {\n const exhaustive: never = context;\n return exhaustive;\n }\n }\n}\n\n/**\n * Serializes hover information for cross-process transport.\n */\nexport function serializeHoverInfo(\n hover: CommentHoverInfo | null\n): FormSpecSerializedHoverInfo | null {\n return hover === null\n ? null\n : {\n kind: hover.kind,\n markdown: hover.markdown,\n };\n}\n\n/**\n * Serializes a parsed tag plus its semantic context into a file snapshot entry.\n */\nexport function serializeParsedCommentTag(\n tag: ParsedCommentTag,\n semantic: CommentTagSemanticContext\n): FormSpecAnalysisTagSnapshot {\n return {\n rawTagName: tag.rawTagName,\n normalizedTagName: tag.normalizedTagName,\n recognized: tag.recognized,\n fullSpan: tag.fullSpan,\n tagNameSpan: tag.tagNameSpan,\n payloadSpan: tag.payloadSpan,\n target: serializeCommentTargetSpecifier(tag.target),\n argumentSpan: tag.argumentSpan,\n argumentText: tag.argumentText,\n semantic: serializeCommentTagSemanticContext(semantic),\n };\n}\n","import path from \"node:path\";\nimport { computeFormSpecTextHash } from \"./semantic-protocol.js\";\n\n/**\n * Stable workspace-scoped identifier derived from the absolute workspace root.\n */\nexport function getFormSpecWorkspaceId(workspaceRoot: string): string {\n return computeFormSpecTextHash(workspaceRoot);\n}\n\n/**\n * Directory used for machine-generated FormSpec tooling state inside a\n * workspace.\n */\nexport function getFormSpecWorkspaceRuntimeDirectory(workspaceRoot: string): string {\n return path.join(workspaceRoot, \".cache\", \"formspec\", \"tooling\");\n}\n\n/**\n * Path to the manifest that advertises the local FormSpec semantic service for\n * a workspace.\n */\nexport function getFormSpecManifestPath(workspaceRoot: string): string {\n return path.join(getFormSpecWorkspaceRuntimeDirectory(workspaceRoot), \"manifest.json\");\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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACUO,SAAS,kBAAkB,MAAuC;AACvE,QAAM,UAAU,KAAK,UAAU;AAC/B,QAAM,QAAQ,yDAAyD,KAAK,OAAO;AACnF,MAAI,CAAC,QAAQ,CAAC,GAAG;AACf,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM,EAAE,UAAU,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE;AAAA,IACtC,eAAe,MAAM,CAAC,KAAK;AAAA,EAC7B;AACF;AAEO,SAAS,iBAAiBA,OAA8C;AAC7E,MAAI,cAAcA,OAAM;AACtB,WAAOA,MAAK,SAAS,KAAK,GAAG;AAAA,EAC/B;AACA,SAAOA,MAAK,KAAK,GAAG;AACtB;;;AC5BA,kBAIO;AA6EP,IAAM,mBAAmB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,yBAAyB;AAAA,EAC7B;AAAA,EACA;AACF;AAEA,IAAM,iBAAiB;AAAA,EACrB,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AAEA,IAAM,qBAAqB,oBAAI,IAAI,CAAC,aAAa,aAAa,YAAY,UAAU,CAAC;AACrF,IAAM,4BAA4B,oBAAI,IAAI,CAAC,OAAO,CAAC;AACnD,IAAM,kBAAkB,oBAAI,IAAI,CAAC,SAAS,aAAa,CAAC;AACxD,IAAM,qBAAqB,oBAAI,IAAI,CAAC,aAAa,CAAC;AAClD,IAAM,oBAAoB,oBAAI,IAAI;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,uBAAuB,oBAAI,IAAI,CAAC,YAAY,YAAY,cAAc,aAAa,CAAC;AAE1F,IAAM,+BAAuD;AAAA,EAC3D,SAAS;AAAA,EACT,SAAS;AAAA,EACT,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,UAAU;AAAA,EACV,UAAU;AAAA,EACV,aAAa;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,OAAO;AACT;AAEA,IAAM,wBAAgD;AAAA,EACpD,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EACX,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EACX,kBAAkB;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EACX,kBAAkB;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EACX,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EACX,WAAW;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EACX,WAAW;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EACX,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EACX,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EACX,aAAa;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EACX,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EACX,aAAa;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EACX,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAmBA,SAAS,eAAe,MAAwC;AAC9D,MAAI,mBAAmB,IAAI,IAAI,EAAG,QAAO;AACzC,MAAI,0BAA0B,IAAI,IAAI,EAAG,QAAO;AAChD,MAAI,gBAAgB,IAAI,IAAI,EAAG,QAAO;AACtC,MAAI,mBAAmB,IAAI,IAAI,EAAG,QAAO;AACzC,MAAI,kBAAkB,IAAI,IAAI,EAAG,QAAO;AACxC,MAAI,qBAAqB,IAAI,IAAI,EAAG,QAAO;AAC3C,SAAO;AACT;AAEA,SAAS,oBAAoB,MAAgD;AAC3E,SAAO,eAAe,IAAI,KAAK;AACjC;AAEA,SAAS,+BAA+B,MAAiD;AACvF,UAAQ,MAAM;AAAA,IACZ,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,SAAS;AACP,YAAM,aAAoB;AAC1B,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,yBACP,WAC+B;AAC/B,UAAQ,WAAW;AAAA,IACjB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,CAAC,oBAAoB;AAAA,IAC9B,KAAK;AACH,aAAO,CAAC,aAAa;AAAA,IACvB,KAAK;AACH,aAAO,CAAC,WAAW;AAAA,IACrB,KAAK;AACH,aAAO,CAAC,gBAAgB;AAAA,IAC1B,KAAK;AAAA,IACL,KAAK;AACH,aAAO,CAAC;AAAA,IACV,SAAS;AACP,YAAM,aAAoB;AAC1B,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,WAAqC,WAAW,WAAmB;AAC5F,UAAQ,WAAW;AAAA,IACjB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,SAAS;AACP,YAAM,aAAoB;AAC1B,WAAK;AACL,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,MAAwC;AAClE,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,SAAS;AACP,YAAM,aAAoB;AAC1B,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,uBACP,YAC+B;AAC/B,UAAQ,YAAY;AAAA,IAClB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,SAAS;AACP,YAAM,aAAoB;AAC1B,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,sBACP,YACA,WACA,gBACuB;AACvB,QAAM,OAA8B;AAAA,IAClC,MAAM,uBAAuB,UAAU;AAAA,IACvC,OAAO,mBAAmB,UAAU;AAAA,IACpC,UAAU,eAAe;AAAA,EAC3B;AAEA,MAAI,eAAe,QAAQ;AACzB,UAAM,aAAa,kBAAkB,yBAAyB,SAAS,EAAE,CAAC;AAC1E,WAAO,eAAe,SAAY,OAAO,EAAE,GAAG,MAAM,WAAW;AAAA,EACjE;AAEA,MAAI,eAAe,UAAU;AAC3B,WAAO,EAAE,GAAG,MAAM,YAAY,0BAA0B;AAAA,EAC1D;AAEA,SAAO;AACT;AAEA,SAAS,gBACP,MACA,YACA,YACA,WACA,YACA,gBACc;AACd,QAAM,aAAsC,CAAC;AAE7C,MAAI,eAAe,MAAM;AACvB,eAAW,KAAK,sBAAsB,YAAY,WAAW,cAAc,CAAC;AAAA,EAC9E;AACA,MAAI,eAAe,IAAI;AACrB,eAAW;AAAA,MACT,cAAc,OACV;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,MACT,IACA;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP;AAAA,MACF;AAAA,IACN;AAAA,EACF;AAEA,QAAM,cAAc,eAAe,OAAO,KAAK,IAAI,mBAAmB,UAAU,CAAC;AACjF,QAAM,mBAAmB,eAAe,KAAK,KAAK,IAAI,UAAU;AAEhE,SAAO;AAAA,IACL,OAAO,IAAI,IAAI,GAAG,WAAW,GAAG,gBAAgB;AAAA,IAChD;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,mBACP,MACA,cACA,YACA,YACQ;AACR,QAAM,SAAS,eAAe,KAAK,MAAM,IAAI,OAAO,MAAM,IAAI,QAAQ,UAAU;AAChF,QAAM,iBACJ,WAAW,WAAW,IAClB,CAAC,oBAAoB,WAAW,CAAC,GAAG,SAAS,IAAI,IAAI,EAAE,IAAI,IAC3D,CAAC,mBAAmB,GAAG,WAAW,IAAI,CAAC,cAAc,OAAO,UAAU,KAAK,IAAI,CAAC;AAEtF,SAAO,CAAC,QAAQ,IAAI,cAAc,IAAI,GAAG,cAAc,EAAE,KAAK,IAAI;AACpE;AAEA,SAAS,yBAAyB,MAAsD;AACtF,QAAM,YAAY,oBAAoB,IAAI;AAC1C,QAAM,oBAAoB,+BAA+B,IAAI;AAC7D,QAAM,aACJ,SAAS,YACL,YACA,SAAS,gBACP,iBACA,SAAS,UACP,mBACA,kBAAkB,SAAS;AAErC,SAAO;AAAA,IACL,gBAAgB,MAAM,kBAAkB,MAAM,WAAW,UAAU;AAAA,IACnE,gBAAgB,MAAM,kBAAkB,QAAQ,WAAW,YAAY,iBAAiB;AAAA,EAC1F;AACF;AAEA,IAAM,0BAA0B,OAAO;AAAA,EACpC,OAAO,KAAK,0CAA8B,EAA8B,IAAI,CAAC,SAAS;AACrF,UAAM,YAAY,oBAAoB,IAAI;AAC1C,UAAM,oBAAoB,+BAA+B,IAAI;AAC7D,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,eAAe;AAAA,QACf;AAAA,QACA,kBAAkB,cAAc;AAAA,QAChC,kBAAkB,CAAC,QAAQ,MAAM;AAAA,QACjC,iBAAiB;AAAA,QACjB,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,cAAc,CAAC,iBAAiB;AAAA,QAChC,kBAAkB,6BAA6B,IAAI,KAAK,IAAI,IAAI;AAAA,QAChE,eAAe,sBAAsB,IAAI,KAAK,MAAM,IAAI;AAAA,QACxD,YAAY,yBAAyB,IAAI;AAAA,MAC3C;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,IAAM,kBAAkB;AAAA,EACtB,aAAa;AAAA,IACX,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,QAAQ,UAAU,SAAS;AAAA,IAC9C,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY,CAAC,GAAG,iBAAiB,GAAG,gBAAgB;AAAA,IACpD,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,kBAAkB;AAAA,MAChB,QAAQ;AAAA,MACR,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,MAAM;AAAA,IACzB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY,CAAC,GAAG,iBAAiB,GAAG,gBAAgB;AAAA,IACpD,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AAAA,EACA,QAAQ;AAAA,IACN,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,MAAM;AAAA,IACzB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,YAAY;AAAA,EACd;AAAA,EACA,aAAa;AAAA,IACX,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,MAAM;AAAA,IACzB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AAAA,EACA,OAAO;AAAA,IACL,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,MAAM;AAAA,IACzB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AAAA,EACA,SAAS;AAAA,IACP,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,QAAQ,UAAU,SAAS;AAAA,IAC9C,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY,CAAC,GAAG,iBAAiB,GAAG,gBAAgB;AAAA,IACpD,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,kBAAkB;AAAA,MAChB,QAAQ;AAAA,MACR,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,MAAM;AAAA,IACzB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,YAAY;AAAA,EACd;AAAA,EACA,UAAU;AAAA,IACR,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,MAAM;AAAA,IACzB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AAAA,EACA,UAAU;AAAA,IACR,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,MAAM;AAAA,IACzB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AAAA,EACA,YAAY;AAAA,IACV,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,MAAM;AAAA,IACzB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AAAA,EACA,aAAa;AAAA,IACX,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,MAAM;AAAA,IACzB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AAAA,EACA,cAAc;AAAA,IACZ,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,MAAM;AAAA,IACzB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,YAAY;AAAA,EACd;AAAA,EACA,YAAY;AAAA,IACV,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,MAAM;AAAA,IACzB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AAAA,EACA,SAAS;AAAA,IACP,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,MAAM;AAAA,IACzB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY,CAAC,GAAG,iBAAiB,GAAG,gBAAgB;AAAA,IACpD,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AAAA,EACA,SAAS;AAAA,IACP,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,MAAM;AAAA,IACzB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AAAA,EACA,KAAK;AAAA,IACH,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,MAAM;AAAA,IACzB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,YAAY;AAAA,EACd;AACF;AAEA,SAAS,wBAAwB,eAAuB,MAAmC;AACzF,QAAM,YAAY,KAAK,aAAa,eAAe,aAAa;AAChE,QAAM,aAAa,KAAK,mBAAoB,KAAK,cAAc,kBAAkB,SAAS,IAAK;AAC/F,QAAM,aAA6B,CAAC;AAEpC,MAAI,KAAK,iBAAiB,SAAS,MAAM,GAAG;AAC1C,eAAW,KAAK,gBAAgB,eAAe,KAAK,YAAY,MAAM,WAAW,UAAU,CAAC;AAAA,EAC9F;AACA,MAAI,KAAK,iBAAiB,SAAS,MAAM,GAAG;AAC1C,eAAW;AAAA,MACT;AAAA,QACE;AAAA,QACA,KAAK,kBAAkB,QAAQ,KAAK;AAAA,QACpC;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,KAAK,iBAAiB,SAAS,QAAQ,GAAG;AAC5C,eAAW;AAAA,MACT;AAAA,QACE;AAAA,QACA,KAAK,kBAAkB,UAAU,KAAK;AAAA,QACtC;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,KAAK,iBAAiB,SAAS,SAAS,GAAG;AAC7C,eAAW;AAAA,MACT;AAAA,QACE;AAAA,QACA,KAAK,kBAAkB,WAAW,KAAK;AAAA,QACvC;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,kBAAkB,KAAK;AAAA,IACvB,kBAAkB,KAAK;AAAA,IACvB,iBAAiB,KAAK;AAAA,IACtB,UAAU,KAAK;AAAA,IACf,YAAY,KAAK;AAAA,IACjB,cAAc,yBAAyB,SAAS;AAAA,IAChD,kBAAkB,KAAK;AAAA,IACvB,eAAe,mBAAmB,eAAe,KAAK,cAAc,YAAY,UAAU;AAAA,IAC1F;AAAA,EACF;AACF;AAEA,IAAM,wBAAuD,OAAO;AAAA,EAClE,OAAO,QAAQ,eAAe,EAAE,IAAI,CAAC,CAAC,eAAe,IAAI,MAAM;AAAA,IAC7D;AAAA,IACA,wBAAwB,eAAe,IAAI;AAAA,EAC7C,CAAC;AACH;AAEO,SAAS,yBAAyB,SAAyB;AAChE,aAAO,wCAA2B,OAAO;AAC3C;AAEO,SAAS,iBACd,SACA,YACsB;AACtB,QAAM,aAAa,yBAAyB,OAAO;AACnD,QAAM,UAAU,wBAAwB,UAAU;AAClD,MAAI,YAAY,QAAW;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,sBAAsB,UAAU;AAC9C,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,wBAAwB,2BAA2B,UAAU,EAAE;AAAA,IACnE,CAAC,QAAQ,IAAI,YAAY;AAAA,EAC3B;AAEA,MAAI,0BAA0B,QAAW;AACvC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,eAAe,sBAAsB;AAAA,IACrC,WAAW;AAAA,IACX,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,MAAM;AAAA,IACzB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,cAAc,CAAC;AAAA,IACf,kBAAkB,iCAAiC,sBAAsB,WAAW;AAAA,IACpF,eAAe;AAAA,MACb,MAAM,sBAAsB,OAAO;AAAA,MACnC;AAAA,MACA,2CAA2C,sBAAsB,WAAW;AAAA,MAC5E;AAAA,MACA,qBAAqB,sBAAsB,OAAO;AAAA,IACpD,EAAE,KAAK,IAAI;AAAA,IACX,YAAY;AAAA,MACV;AAAA,QACE,OAAO,IAAI,sBAAsB,OAAO;AAAA,QACxC,YAAY;AAAA,QACZ,YAAY,CAAC,EAAE,MAAM,SAAS,OAAO,UAAU,CAAC;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,4BACd,YAC0B;AAC1B,QAAM,WAAW,OAAO,OAAO,uBAAuB;AACtD,QAAM,SAAS,2BAA2B,UAAU,EACjD,IAAI,CAAC,QAAQ,iBAAiB,IAAI,SAAS,UAAU,CAAC,EACtD,OAAO,CAAC,QAA8B,QAAQ,IAAI;AACrD,SAAO,CAAC,GAAG,UAAU,GAAG,MAAM;AAChC;AAEO,SAAS,qBACd,YAC0B;AAC1B,QAAM,WAAW,OAAO,OAAO,uBAAuB;AACtD,QAAM,SAAS,OAAO,OAAO,qBAAqB;AAClD,QAAM,SAAS,2BAA2B,UAAU,EACjD,IAAI,CAAC,QAAQ,iBAAiB,IAAI,SAAS,UAAU,CAAC,EACtD,OAAO,CAAC,QAA8B,QAAQ,IAAI;AACrD,SAAO,CAAC,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM;AAC3C;AAEO,SAAS,oBACd,SACA,YACe;AACf,SAAO,iBAAiB,SAAS,UAAU,GAAG,iBAAiB;AACjE;AAEA,SAAS,2BACP,YACqD;AACrD,SACE,YAAY,QAAQ,CAAC,cAAc;AACjC,UAAM,aAAa,UAAU,kBAAkB,CAAC;AAChD,WAAO,WAAW,IAAI,CAAC,SAAS;AAAA,MAC9B,aAAa,UAAU;AAAA,MACvB,SAAS,IAAI;AAAA,IACf,EAAE;AAAA,EACJ,CAAC,KAAK,CAAC;AAEX;;;AC7wBA,SAAS,aAAa,MAAmC;AACvD,SAAO,SAAS,OAAO,SAAS,OAAQ,SAAS,QAAQ,SAAS;AACpE;AAEA,SAAS,WAAW,UAAkB,OAAwB;AAC5D,MAAI,SAAS,KAAK,MAAM,KAAK;AAC3B,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,SAAS,QAAQ,CAAC;AACnC,MAAI,aAAa,UAAa,CAAC,YAAY,KAAK,QAAQ,GAAG;AACzD,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,SAAS,QAAQ,CAAC;AACvC,SAAO,iBAAiB,UAAa,aAAa,YAAY;AAChE;AAEA,SAAS,WAAW,UAAkB,OAAuB;AAC3D,MAAI,SAAS,QAAQ;AACrB,SAAO,SAAS,SAAS,UAAU,eAAe,KAAK,SAAS,MAAM,KAAK,EAAE,GAAG;AAC9E,cAAU;AAAA,EACZ;AACA,SAAO;AACT;AAEA,SAAS,uBAAuB,UAAkB,KAAqB;AACrE,MAAI,SAAS;AACb,SAAO,SAAS,KAAK,aAAa,SAAS,SAAS,CAAC,CAAC,GAAG;AACvD,cAAU;AAAA,EACZ;AACA,SAAO;AACT;AAEA,SAAS,aACP,MACA,OACA,KACA,YACmB;AACnB,QAAM,WAAW,KAAK,WAAW,KAAK;AACtC,MAAI,aAAa,QAAW;AAC1B,UAAM,IAAI,MAAM,iCAAiC,OAAO,KAAK,CAAC,EAAE;AAAA,EAClE;AAEA,QAAM,SACJ,OAAO,KAAK,KAAK,SACb,KAAK,iBACJ,KAAK,WAAW,MAAM,CAAC,KAAK,KAAK,gBAAgB,KAAK;AAE7D,SAAO;AAAA,IACL,OAAO,aAAa;AAAA,IACpB,KAAK,aAAa;AAAA,EACpB;AACF;AAEA,SAAS,mBACP,eACA,YACA,YACsC;AACtC,MAAI,eAAe,cAAc,eAAe,UAAU;AACxD,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,SAAS,GAAG,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,iBAAiB,eAAe,UAAU;AAC7D,QAAM,mBAAmB,YAAY,iBAAiB,OAAO,CAAC,WAAW,WAAW,MAAM,KAAK,CAAC;AAEhG,MAAI,iBAAiB,SAAS,MAAM,GAAG;AACrC,WAAO;AAAA,EACT;AACA,MAAI,iBAAiB,SAAS,QAAQ,KAAK,iBAAiB,SAAS,SAAS,GAAG;AAC/E,WAAO;AAAA,EACT;AACA,MAAI,iBAAiB,SAAS,QAAQ,GAAG;AACvC,WAAO;AAAA,EACT;AACA,MAAI,iBAAiB,SAAS,SAAS,GAAG;AACxC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,qBACP,MACA,cACA,YACA,eACA,YACA,YACiD;AACjD,MAAI,gBAAgB,cAAc,KAAK,KAAK,YAAY,MAAM,KAAK;AACjE,WAAO;AAAA,EACT;AAEA,MAAI,YAAY,eAAe;AAC/B,SAAO,YAAY,cAAc,CAAC,aAAa,KAAK,KAAK,SAAS,CAAC,GAAG;AACpE,iBAAa;AAAA,EACf;AAEA,QAAM,WAAW,KAAK,KAAK,MAAM,cAAc,SAAS;AACxD,QAAM,aAAa,SAAS,MAAM,CAAC;AACnC,QAAM,aAAa,kBAAkB,QAAQ;AAC7C,QAAM,gBAAgB,aAAa,MAAM,eAAe,GAAG,WAAW,UAAU;AAEhF,SAAO;AAAA,IACL,SAAS;AAAA,IACT,OAAO,eAAe,QAAQ,WAAW,kBAAkB;AAAA,IAC3D,MAAM,mBAAmB,eAAe,YAAY,UAAU;AAAA,IAC9D,UAAU,aAAa,MAAM,cAAc,WAAW,UAAU;AAAA,IAChE,WAAW,aAAa,MAAM,cAAc,eAAe,GAAG,UAAU;AAAA,IACxE,MAAM;AAAA,IACN,MAAM,YAAY,QAAQ;AAAA,IAC1B,UAAU;AAAA,EACZ;AACF;AAEA,SAAS,oBAAoB,aAAuD;AAClF,QAAM,cAAuC,CAAC;AAC9C,QAAM,mBAAmB,YAAY,WAAW,KAAK,IAAI,IAAI,YAAY,WAAW,IAAI,IAAI,IAAI;AAChG,QAAM,iBAAiB,YAAY,SAAS,IAAI,IAAI,YAAY,SAAS,IAAI,YAAY;AAEzF,MAAI,SAAS;AACb,SAAO,UAAU,gBAAgB;AAC/B,UAAM,YAAY;AAClB,QAAI,UAAU;AACd,WAAO,UAAU,kBAAkB,YAAY,OAAO,MAAM,MAAM;AAChE,iBAAW;AAAA,IACb;AAEA,QAAI,aAAa;AACjB,QAAI,aAAa,aAAa,YAAY,aAAa,CAAC,MAAM,MAAM;AAClE,oBAAc;AAAA,IAChB;AAEA,QAAI,eAAe;AACnB,WACE,eAAe,eACd,YAAY,YAAY,MAAM,OAAO,YAAY,YAAY,MAAM,MACpE;AACA,sBAAgB;AAAA,IAClB;AACA,QAAI,eAAe,cAAc,YAAY,YAAY,MAAM,KAAK;AAClE,sBAAgB;AAChB,aACE,eAAe,eACd,YAAY,YAAY,MAAM,OAAO,YAAY,YAAY,MAAM,MACpE;AACA,wBAAgB;AAAA,MAClB;AAAA,IACF;AAEA,UAAM,aAAuB,CAAC;AAC9B,QAAI,OAAO;AACX,aAAS,QAAQ,cAAc,QAAQ,YAAY,SAAS,GAAG;AAC7D,iBAAW,KAAK,KAAK;AACrB,cAAQ,YAAY,KAAK,KAAK;AAAA,IAChC;AAEA,gBAAY,KAAK;AAAA,MACf;AAAA,MACA;AAAA,MACA,eAAe;AAAA,IACjB,CAAC;AAED,QAAI,WAAW,gBAAgB;AAC7B;AAAA,IACF;AACA,aAAS,UAAU;AAAA,EACrB;AAEA,SAAO;AACT;AAOO,SAAS,kBACd,aACA,SACoB;AACpB,QAAM,OAA2B,CAAC;AAClC,QAAM,aAAa,SAAS,UAAU;AAEtC,aAAW,QAAQ,oBAAoB,WAAW,GAAG;AACnD,UAAM,YAAsB,CAAC;AAE7B,aAAS,QAAQ,GAAG,QAAQ,KAAK,KAAK,QAAQ,SAAS,GAAG;AACxD,UAAI,WAAW,KAAK,MAAM,KAAK,GAAG;AAChC,kBAAU,KAAK,KAAK;AAAA,MACtB;AAAA,IACF;AAEA,aAAS,WAAW,GAAG,WAAW,UAAU,QAAQ,YAAY,GAAG;AACjE,YAAM,WAAW,UAAU,QAAQ;AACnC,UAAI,aAAa,QAAW;AAC1B;AAAA,MACF;AAEA,YAAM,SAAS,WAAW,KAAK,MAAM,QAAQ;AAC7C,YAAM,eAAe,UAAU,WAAW,CAAC,KAAK,KAAK,KAAK;AAC1D,YAAM,uBAAuB,uBAAuB,KAAK,MAAM,YAAY;AAC3E,YAAM,UAAU,KAAK,KAAK,MAAM,WAAW,GAAG,MAAM;AACpD,YAAM,gBAAgB,yBAAyB,OAAO;AAEtD,UAAI,eAAe;AACnB,aAAO,eAAe,wBAAwB,aAAa,KAAK,KAAK,YAAY,CAAC,GAAG;AACnF,wBAAgB;AAAA,MAClB;AAEA,YAAM,SAAS;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,MACX;AAEA,UAAI,aAAa;AACjB,UAAI,WAAW,MAAM;AACnB,qBAAa,OAAO;AACpB,eAAO,aAAa,wBAAwB,aAAa,KAAK,KAAK,UAAU,CAAC,GAAG;AAC/E,wBAAc;AAAA,QAChB;AAAA,MACF;AAEA,YAAM,cACJ,eAAe,uBACX,aAAa,MAAM,cAAc,sBAAsB,UAAU,IACjE;AACN,YAAM,YACJ,aAAa,uBACT,aAAa,MAAM,YAAY,sBAAsB,UAAU,IAC/D;AAEN,YAAM,eACJ,WAAW,OACP,OACA;AAAA,QACE,SAAS,OAAO;AAAA,QAChB,OAAO,OAAO;AAAA,QACd,MAAM,OAAO;AAAA,QACb,UAAU,OAAO;AAAA,QACjB,WAAW,OAAO;AAAA,QAClB,MAAM,OAAO;AAAA,QACb,MAAM,OAAO;AAAA,MACf;AAEN,WAAK,KAAK;AAAA,QACR,YAAY;AAAA,QACZ,mBAAmB;AAAA,QACnB,YAAY,iBAAiB,eAAe,SAAS,UAAU,MAAM;AAAA,QACrE,UAAU,aAAa,MAAM,UAAU,sBAAsB,UAAU;AAAA,QACvE,aAAa,aAAa,MAAM,UAAU,QAAQ,UAAU;AAAA,QAC5D;AAAA,QACA,WAAW,cAAc,aAAa;AAAA,QACtC,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,cACE,cAAc,OACV,KACA,YAAY,MAAM,UAAU,QAAQ,YAAY,UAAU,MAAM,UAAU;AAAA,MAClF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,EACF;AACF;AACO,SAAS,eACd,YACA,aACA,SACkB;AAClB,QAAM,YAAY,gBAAgB,MAAM,aAAa,YAAY,CAAC,CAAC,IAAI,KAAK;AAC5E,QAAM,SAAS,kBAAkB,QAAQ,UAAU,GAAG,SAAS,GAAG,WAAW,OAAO,OAAO;AAC3F,QAAM,CAAC,GAAG,IAAI,OAAO;AACrB,MAAI,QAAQ,QAAW;AACrB,UAAM,IAAI,MAAM,6CAA6C,UAAU,EAAE;AAAA,EAC3E;AACA,SAAO;AACT;AAEO,SAAS,iBACd,aACA,MACA,SACQ;AACR,QAAM,aAAa,SAAS,UAAU;AACtC,SAAO,YAAY,MAAM,KAAK,QAAQ,YAAY,KAAK,MAAM,UAAU;AACzE;;;AClWA,SAAoB;AAsBpB,SAAS,kBAAkB,MAAwB;AACjD,MAAI,CAAC,KAAK,QAAQ,GAAG;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,KAAK,MAAM;AAAA,IAC5B,CAAC,YAAY,OAAO,SAAY,aAAU,OAAU,aAAU,gBAAgB;AAAA,EAChF;AACA,MAAI,WAAW,WAAW,KAAK,WAAW,CAAC,MAAM,QAAW;AAC1D,WAAO,WAAW,CAAC;AAAA,EACrB;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,MAAe,WAAkD;AAC/F,SAAO,KAAK,eAAe,KAAK,KAAK,MAAM,KAAK,CAAC,WAAW,UAAU,MAAM,CAAC;AAC/E;AAEA,SAAS,aAAa,MAAwB;AAC5C,QAAM,WAAW,kBAAkB,IAAI;AACvC,MACE,SAAS,SACL,aAAU,SACT,aAAU,gBACV,aAAU,SACV,aAAU,gBACf;AACA,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,QAAQ,GAAG;AACtB,WAAO,SAAS,MAAM,MAAM,CAAC,WAAW,aAAa,MAAM,CAAC;AAAA,EAC9D;AAEA,SAAO,uBAAuB,UAAU,YAAY;AACtD;AAEA,SAAS,aAAa,MAAwB;AAC5C,QAAM,WAAW,kBAAkB,IAAI;AACvC,MAAI,SAAS,SAAY,aAAU,SAAY,aAAU,gBAAgB;AACvE,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,QAAQ,GAAG;AACtB,WAAO,SAAS,MAAM,MAAM,CAAC,WAAW,aAAa,MAAM,CAAC;AAAA,EAC9D;AAEA,SAAO,uBAAuB,UAAU,YAAY;AACtD;AAEA,SAAS,cAAc,MAAwB;AAC7C,QAAM,WAAW,kBAAkB,IAAI;AACvC,MAAI,SAAS,SAAY,aAAU,UAAa,aAAU,iBAAiB;AACzE,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,QAAQ,GAAG;AACtB,WAAO,SAAS,MAAM,MAAM,CAAC,WAAW,cAAc,MAAM,CAAC;AAAA,EAC/D;AAEA,SAAO,uBAAuB,UAAU,aAAa;AACvD;AAEA,SAAS,WAAW,MAAwB;AAC1C,QAAM,WAAW,kBAAkB,IAAI;AACvC,MAAI,SAAS,QAAW,aAAU,MAAM;AACtC,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,QAAQ,GAAG;AACtB,WAAO,SAAS,MAAM,MAAM,CAAC,WAAW,WAAW,MAAM,CAAC;AAAA,EAC5D;AAEA,SAAO,uBAAuB,UAAU,UAAU;AACpD;AAEA,SAAS,YAAY,MAAe,SAAkC;AACpE,QAAM,WAAW,kBAAkB,IAAI;AACvC,MAAI,QAAQ,YAAY,QAAQ,GAAG;AACjC,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,SAAS,UAAU;AAClC,SAAO,QAAQ,SAAS,WAAW,QAAQ,SAAS;AACtD;AAEA,SAAS,qBAAqB,MAAwB;AACpD,QAAM,WAAW,kBAAkB,IAAI;AACvC,SAAO,SAAS,QAAQ,KAAK,SAAS,MAAM,SAAS,KAAK,SAAS,MAAM,MAAM,YAAY;AAC7F;AAEA,SAAS,aAAa,MAAe,SAAkC;AACrE,QAAM,WAAW,kBAAkB,IAAI;AACvC,SAAO,CAAC,YAAY,UAAU,OAAO,MAAM,SAAS,QAAW,aAAU,YAAY;AACvF;AAEA,SAAS,WAAW,MAAe,SAAkC;AACnE,QAAM,WAAW,kBAAkB,IAAI;AAEvC,MACE,WAAW,QAAQ,KACnB,aAAa,QAAQ,KACrB,aAAa,QAAQ,KACrB,cAAc,QAAQ,GACtB;AACA,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,QAAQ,GAAG;AACtB,WAAO,SAAS,MAAM,MAAM,CAAC,WAAW,WAAW,QAAQ,OAAO,CAAC;AAAA,EACrE;AAEA,MAAI,YAAY,UAAU,OAAO,KAAK,aAAa,UAAU,OAAO,GAAG;AACrE,WAAO;AAAA,EACT;AAEA,SAAO,uBAAuB,UAAU,CAAC,WAAW,WAAW,QAAQ,OAAO,CAAC;AACjF;AAEA,SAAS,oBAAoB,MAAe,SAAyC;AACnF,QAAM,WAAW,kBAAkB,IAAI;AACvC,MAAI,CAAC,QAAQ,YAAY,QAAQ,GAAG;AAClC,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,iBAAiB,QAA4B,EAAE,CAAC,KAAK;AACtE;AAEO,SAAS,4BAA4B,MAAyC;AACnF,MAAO,sBAAmB,IAAI,EAAG,QAAO;AACxC,MAAO,yBAAsB,IAAI,EAAG,QAAO;AAC3C,MAAO,uBAAoB,IAAI,EAAG,QAAO;AACzC,MAAO,0BAAuB,IAAI,EAAG,QAAO;AAC5C,MAAO,uBAAoB,IAAI,EAAG,QAAO;AACzC,MAAO,0BAAuB,IAAI,EAAG,QAAO;AAC5C,MAAO,yBAAsB,IAAI,EAAG,QAAO;AAC3C,MAAO,yBAAsB,IAAI,EAAG,QAAO;AAC3C,MAAO,eAAY,IAAI,GAAG;AACxB,QAAO,uBAAoB,KAAK,MAAM,KAAQ,4BAAyB,KAAK,MAAM,GAAG;AACnF,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,4BACd,MACA,SAC+B;AAC/B,QAAM,eAAe,oBAAI,IAAwB;AAEjD,MAAI,aAAa,IAAI,GAAG;AACtB,iBAAa,IAAI,oBAAoB;AAAA,EACvC;AACA,MAAI,aAAa,IAAI,GAAG;AACtB,iBAAa,IAAI,aAAa;AAAA,EAChC;AACA,MAAI,WAAW,MAAM,OAAO,GAAG;AAC7B,iBAAa,IAAI,WAAW;AAAA,EAC9B;AACA,MAAI,YAAY,MAAM,OAAO,GAAG;AAC9B,iBAAa,IAAI,YAAY;AAAA,EAC/B;AACA,MAAI,qBAAqB,IAAI,GAAG;AAC9B,iBAAa,IAAI,yBAAyB;AAAA,EAC5C;AACA,MAAI,aAAa,MAAM,OAAO,GAAG;AAC/B,iBAAa,IAAI,aAAa;AAAA,EAChC;AAEA,SAAO,CAAC,GAAG,YAAY;AACzB;AAEO,SAAS,0BACd,MACA,SACA,YACS;AACT,SAAO,4BAA4B,MAAM,OAAO,EAAE,SAAS,UAAU;AACvE;AAQO,SAAS,sBACd,MACA,SACA,UACwB;AACxB,QAAM,WAAW,kBAAkB,IAAI;AAEvC,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,mBAAmB,oBAAoB,UAAU,OAAO;AAC9D,MAAI,qBAAqB,MAAM;AAC7B,WAAO,sBAAsB,kBAAkB,SAAS,QAAQ;AAAA,EAClE;AAEA,OAAK,SAAS,QAAW,aAAU,YAAY,GAAG;AAChD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,CAAC,SAAS,GAAG,IAAI,IAAI;AAC3B,MAAI,YAAY,QAAW;AACzB,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AAEA,QAAM,WAAW,SAAS,YAAY,OAAO;AAC7C,MAAI,aAAa,QAAW;AAC1B,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc,SAAS,oBAAoB,SAAS,eAAe,CAAC;AAC1E,MAAI,gBAAgB,QAAW;AAC7B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ,0BAA0B,UAAU,WAAW;AAAA,IACvD;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,qBACP,MACA,SACA,YACA,QACA,SACU;AACV,QAAM,WAAW,kBAAkB,IAAI;AACvC,MAAI,QAAQ,IAAI,QAAQ,GAAG;AACzB,WAAO,CAAC;AAAA,EACV;AACA,UAAQ,IAAI,QAAQ;AAEpB,QAAM,cAAwB,CAAC;AAE/B,MAAI,0BAA0B,UAAU,SAAS,UAAU,KAAK,OAAO,SAAS,GAAG;AACjF,gBAAY,KAAK,OAAO,KAAK,GAAG,CAAC;AAAA,EACnC;AAEA,aAAW,YAAY,SAAS,cAAc,GAAG;AAC/C,UAAM,cAAc,SAAS,oBAAoB,SAAS,eAAe,CAAC;AAC1E,QAAI,gBAAgB,QAAW;AAC7B;AAAA,IACF;AAEA,UAAM,eAAe,QAAQ,0BAA0B,UAAU,WAAW;AAC5E,UAAM,aAAa,CAAC,GAAG,QAAQ,SAAS,IAAI;AAC5C,gBAAY;AAAA,MACV,GAAG,qBAAqB,cAAc,SAAS,YAAY,YAAY,OAAO;AAAA,IAChF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,6BACd,MACA,SACA,YACmB;AACnB,SAAO,qBAAqB,MAAM,SAAS,YAAY,CAAC,GAAG,oBAAI,IAAa,CAAC;AAC/E;;;ACvNA,SAAS,WAAW,MAAmC;AACrD,SAAO,SAAS,UAAa,eAAe,KAAK,IAAI;AACvD;AAEA,SAAS,iBAAiB,MAAmC;AAC3D,SAAO,SAAS,UAAa,MAAM,KAAK,IAAI,KAAK,SAAS;AAC5D;AAEA,SAAS,eAAe,KAAuB,QAAyB;AACtE,SAAO,UAAU,IAAI,YAAY,SAAS,UAAU,IAAI,YAAY;AACtE;AAEA,SAAS,4BACP,YACA,WACyB;AACzB,MAAI,cAAc,UAAa,cAAc,MAAM;AACjD,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,WAAW,OAAO,CAAC,cAAc,UAAU,WAAW,SAAS,SAAS,CAAC;AAC1F,SAAO,SAAS,SAAS,IAAI,WAAW;AAC1C;AAEA,SAAS,sCACP,YACA,SACA,aACmB;AACnB,MAAI,YAAY,UAAa,gBAAgB,QAAW;AACtD,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,cAAc,oBAAI,IAAY;AACpC,aAAW,aAAa,YAAY;AAClC,eAAW,aAAa,UAAU,YAAY;AAC5C,UAAI,UAAU,SAAS,iBAAiB,UAAU,eAAe,QAAW;AAC1E;AAAA,MACF;AAEA,iBAAW,UAAU;AAAA,QACnB;AAAA,QACA;AAAA,QACA,UAAU;AAAA,MACZ,GAAG;AACD,oBAAY,IAAI,MAAM;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,WAAW,EAAE,KAAK;AAC/B;AAEA,SAAS,oBAAoB,YAAoE;AAC/F,QAAM,mBAAmB,oBAAI,IAAwB,CAAC,MAAM,CAAC;AAE7D,aAAW,aAAa,YAAY;AAClC,eAAW,aAAa,UAAU,YAAY;AAC5C,cAAQ,UAAU,MAAM;AAAA,QACtB,KAAK;AACH,2BAAiB,IAAI,MAAM;AAC3B;AAAA,QACF,KAAK;AACH,2BAAiB,IAAI,QAAQ;AAC7B;AAAA,QACF,KAAK;AACH,2BAAiB,IAAI,SAAS;AAC9B;AAAA,QACF;AACE;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,gBAAgB;AAC7B;AAEA,SAAS,qBACP,YACA,uBACmB;AACnB,QAAM,cAAc,oBAAI,IAAY;AAEpC,aAAW,aAAa,YAAY;AAClC,eAAW,aAAa,UAAU,YAAY;AAC5C,cAAQ,UAAU,MAAM;AAAA,QACtB,KAAK;AACH,qBAAW,UAAU,uBAAuB;AAC1C,wBAAY,IAAI,MAAM;AAAA,UACxB;AACA;AAAA,QACF,KAAK;AACH,sBAAY,IAAI,UAAU;AAC1B,sBAAY,IAAI,QAAQ;AACxB;AAAA,QACF;AACE;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,WAAW;AACxB;AAEO,SAAS,6BACd,KACA,SAC2B;AAC3B,QAAM,gBAAgB,iBAAiB,IAAI,mBAAmB,SAAS,UAAU;AACjF,QAAM,aAAa;AAAA,IACjB,eAAe,cAAc,CAAC;AAAA,IAC9B,SAAS;AAAA,EACX;AACA,QAAM,wBAAwB;AAAA,IAC5B;AAAA,IACA,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AAEA,QAAM,WAAsC;AAAA,IAC1C;AAAA,IACA;AAAA,IACA,WAAW,SAAS,aAAa;AAAA,IACjC;AAAA,IACA,kBAAkB,oBAAoB,UAAU;AAAA,IAChD,mBAAmB,qBAAqB,YAAY,qBAAqB;AAAA,IACzE;AAAA,IACA,aAAa,eAAe,UAAU;AAAA,IACtC,kBAAkB,eAAe,iBAAiB;AAAA,IAClD,qBAAqB;AAAA,IACrB,uBAAuB;AAAA,EACzB;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,qBAAqB,yBAAyB,QAAQ;AAAA,IACtD,uBAAuB,2BAA2B,QAAQ;AAAA,EAC5D;AACF;AAEA,SAAS,eAAe,YAAwD;AAC9E,QAAM,SAAS,oBAAI,IAAY;AAC/B,aAAW,aAAa,YAAY;AAClC,eAAW,aAAa,UAAU,YAAY;AAC5C,UAAI,UAAU,SAAS,SAAS;AAC9B,eAAO,IAAI,UAAU,KAAK;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AACA,SAAO,CAAC,GAAG,MAAM;AACnB;AAEA,SAAS,oBAAoB,kBAAyD;AACpF,QAAM,SAAS,iBACZ,OAAO,CAAC,SAAsD,SAAS,MAAM,EAC7E,IAAI,CAAC,SAAS,KAAK,IAAI,IAAI;AAC9B,SAAO,OAAO,WAAW,IAAI,SAAS,OAAO,KAAK,IAAI;AACxD;AAEA,SAAS,yBAAyB,UAAoD;AACpF,MAAI,SAAS,kBAAkB,MAAM;AACnC,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,SAAS,IAAI,QAAQ,WAAW;AACtD,QAAM,QAAQ;AAAA,IACZ,iBAAiB,SAAS,cAAc,aAAa;AAAA,IACrD;AAAA,IACA,2BAA2B,oBAAoB,SAAS,gBAAgB,CAAC;AAAA,EAC3E;AAEA,MAAI,kBAAkB,IAAI;AACxB,UAAM,KAAK,IAAI,sBAAsB,aAAa,IAAI;AAAA,EACxD;AAEA,QAAM,yBAAyB;AAC/B,MAAI,SAAS,sBAAsB,SAAS,GAAG;AAC7C,UAAM,KAAK,IAAI,8BAA8B;AAC7C,eAAW,UAAU,SAAS,sBAAsB,MAAM,GAAG,sBAAsB,GAAG;AACpF,YAAM,KAAK,QAAQ,MAAM,IAAI;AAAA,IAC/B;AAAA,EACF,WAAW,SAAS,iBAAiB,SAAS,SAAS,GAAG;AACxD,UAAM,KAAK,IAAI,0DAA0D;AAAA,EAC3E,WAAW,SAAS,iBAAiB,SAAS,MAAM,GAAG;AACrD,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,2BAA2B,UAAoD;AACtF,MAAI,SAAS,kBAAkB,MAAM;AACnC,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,eAAe,SAAS,UAAU;AACtD,QAAM,uBAAuB,YAAY,IAAI,CAAC,UAAU,KAAK,KAAK,IAAI;AACtE,QAAM,gBAAgB,SAAS,WAAW,WAAW,IAAI,SAAS,WAAW,CAAC,IAAI;AAClF,QAAM,iBACJ,SAAS,WAAW,WAAW,IAC3B,CAAC,IACD,kBAAkB,SAChB,CAAC,oBAAoB,cAAc,KAAK,IAAI,IAC5C;AAAA,IACE;AAAA,IACA,GAAG,SAAS,WAAW,IAAI,CAAC,cAAc,OAAO,UAAU,KAAK,IAAI;AAAA,EACtE;AAER,SAAO;AAAA,IACL,mBAAmB,SAAS,cAAc,aAAa;AAAA,IACvD;AAAA,IACA,mBAAmB,qBAAqB,KAAK,MAAM,KAAK,WAAW;AAAA,IACnE;AAAA,IACA,GAAG;AAAA,EACL,EAAE,KAAK,IAAI;AACb;AAEO,SAAS,wBACd,cACA,QACA,SAC4B;AAC5B,QAAM,iBAAiB;AAEvB,aAAW,SAAS,aAAa,SAAS,cAAc,GAAG;AACzD,UAAM,YAAY,MAAM,CAAC;AACzB,UAAM,QAAQ,MAAM;AACpB,UAAM,QAAQ;AACd,UAAM,MAAM,QAAQ,UAAU;AAC9B,QAAI,UAAU,SAAS,UAAU,KAAK;AACpC,aAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,QAAQ,kBAAkB,WAAW;AAAA,UACnC,QAAQ;AAAA,UACR,GAAI,SAAS,eAAe,SAAY,EAAE,YAAY,QAAQ,WAAW,IAAI,CAAC;AAAA,QAChF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,uBACd,cACA,QACA,SACyB;AACzB,QAAM,UAAU,wBAAwB,cAAc,QAAQ,OAAO;AACrE,MAAI,YAAY,MAAM;AACpB,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,OAAO,KAAK,KAAK,CAAC,QAAQ,eAAe,KAAK,MAAM,CAAC,KAAK;AAC3E;AAEO,SAAS,+BACd,cACA,QACA,SAC4B;AAC5B,QAAM,UAAU,wBAAwB,cAAc,QAAQ,OAAO;AACrE,MAAI,YAAY,MAAM;AACpB,WAAO;AAAA,EACT;AAEA,aAAW,OAAO,QAAQ,OAAO,MAAM;AACrC,QAAI,eAAe,KAAK,MAAM,GAAG;AAC/B,aAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAEA,QAAI,IAAI,cAAc,QAAQ,UAAU,IAAI,UAAU,SAAS,UAAU,IAAI,UAAU,KAAK;AAC1F,aAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAEA,QAAI,IAAI,WAAW,QAAQ,UAAU,IAAI,OAAO,KAAK,SAAS,UAAU,IAAI,OAAO,KAAK,KAAK;AAC3F,aAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAEA,QACE,IAAI,iBAAiB,QACrB,UAAU,IAAI,aAAa,SAC3B,UAAU,IAAI,aAAa,KAC3B;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,+BACd,cACA,QACe;AACf,QAAM,UAAU,wBAAwB,cAAc,MAAM;AAC5D,MAAI,YAAY,MAAM;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,SAAS,QAAQ;AACxC,MAAI,iBAAiB,KAAK,iBAAiB,QAAQ,KAAK,QAAQ;AAC9D,WAAO;AAAA,EACT;AAEA,MAAI,SAAS;AACb,SAAO,SAAS,KAAK,WAAW,QAAQ,KAAK,SAAS,CAAC,CAAC,GAAG;AACzD,cAAU;AAAA,EACZ;AAEA,QAAM,UAAU,SAAS;AACzB,MAAI,UAAU,KAAK,QAAQ,KAAK,OAAO,MAAM,KAAK;AAChD,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,UAAU,IAAI,QAAQ,KAAK,UAAU,CAAC,IAAI;AAC/D,MAAI,CAAC,iBAAiB,YAAY,GAAG;AACnC,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,KAAK,MAAM,QAAQ,cAAc;AAClD;AAEO,SAAS,oCACd,cACA,QACA,SAC0B;AAC1B,QAAM,SAAS,+BAA+B,cAAc,MAAM;AAClE,MAAI,WAAW,MAAM;AACnB,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,+BAA+B,cAAc,QAAQ,OAAO;AAC3E,MAAI,QAAQ,SAAS,YAAY,QAAQ,SAAS,SAAS;AACzD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,KAAK,OAAO;AAAA,IACd;AAAA,EACF;AAEA,MAAI,QAAQ,SAAS,YAAY;AAC/B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,KAAK,OAAO;AAAA,IACd;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,EACR;AACF;AAOO,SAAS,4CACd,cACA,QACA,SACkC;AAClC,QAAM,SAAS,+BAA+B,cAAc,MAAM;AAClE,MAAI,WAAW,MAAM;AACnB,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,eAAe,qBAAqB,SAAS,UAAU;AAAA,IACzD;AAAA,EACF;AAEA,QAAM,SAAS;AAAA,IACb;AAAA,IACA;AAAA,IACA,SAAS,aAAa,EAAE,YAAY,QAAQ,WAAW,IAAI;AAAA,EAC7D;AACA,MAAI,QAAQ,SAAS,YAAY,QAAQ,SAAS,SAAS;AACzD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU,6BAA6B,OAAO,KAAK,OAAO;AAAA,IAC5D;AAAA,EACF;AAEA,MAAI,QAAQ,SAAS,YAAY;AAC/B,UAAM,WAAW,6BAA6B,OAAO,KAAK,OAAO;AACjE,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,aAAa,SAAS;AAAA,IACxB;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,OAAO;AACxB;AAOO,SAAS,4BACd,cACA,QACA,SACyB;AACzB,QAAM,SAAS;AAAA,IACb;AAAA,IACA;AAAA,IACA,SAAS,aAAa,EAAE,YAAY,QAAQ,WAAW,IAAI;AAAA,EAC7D;AACA,MAAI,WAAW,MAAM;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,6BAA6B,OAAO,KAAK,OAAO;AACjE,MAAI,WAA0B;AAE9B,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,iBAAW,SAAS;AACpB;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,iBAAW,SAAS;AACpB;AAAA,IACF,KAAK;AACH,iBAAW,SAAS;AACpB;AAAA,IACF,SAAS;AACP,YAAM,aAAoB,OAAO;AACjC,WAAK;AACL;AAAA,IACF;AAAA,EACF;AAEA,SAAO,aAAa,OAChB,OACA;AAAA,IACE,MAAM,OAAO,SAAS,UAAU,WAAW,OAAO;AAAA,IAClD;AAAA,EACF;AACN;;;ACziBA,IAAAC,eAeO;AAGP,IAAM,yBAAkF;AAAA,EACtF,SAAS;AAAA,EACT,SAAS;AAAA,EACT,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,YAAY;AACd;AAEA,IAAM,wBAAgF;AAAA,EACpF,WAAW;AAAA,EACX,WAAW;AAAA,EACX,UAAU;AAAA,EACV,UAAU;AACZ;AAEA,SAAS,aAAa,MAAuB;AAC3C,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AA2BA,SAAS,cACP,UACsC;AACtC,SAAO,UAAU,eAAe,SAAY,EAAE,YAAY,SAAS,WAAW,IAAI;AACpF;AAEO,SAAS,wBACd,SACA,MACA,YACA,SACuB;AACvB,QAAM,mBAAmB,iCAAiC,SAAS,MAAM,YAAY,OAAO;AAC5F,MAAI,qBAAqB,MAAM;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,KAAC,sCAAwB,OAAO,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,eAAe,SAAS,MAAM,cAAc,SAAS,QAAQ,CAAC;AAChF,MAAI,UAAU,WAAW,QAAQ,CAAC,UAAU,OAAO,OAAO;AACxD,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,UAAU;AAChC,QAAMC,QAAO,UAAU,QAAQ,QAAQ;AACvC,QAAM,eAAe,4CAA+B,OAAO;AAE3D,MAAI,iBAAiB,aAAa,cAAc,KAAK,MAAM,IAAI;AAC7D,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB,UAAU;AAC7B,UAAM,QAAQ,OAAO,aAAa;AAClC,QAAI,OAAO,MAAM,KAAK,GAAG;AACvB,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,uBAAuB,OAA8C;AACzF,QAAI,gBAAgB,QAAW;AAC7B,aAAO;AAAA,QACL,MAAM;AAAA,QACN,gBAAgB;AAAA,QAChB;AAAA,QACA,GAAIA,UAAS,UAAa,EAAE,MAAAA,MAAK;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAEA,UAAM,aAAa,sBAAsB,OAA6C;AACtF,QAAI,eAAe,QAAW;AAC5B,aAAO;AAAA,QACL,MAAM;AAAA,QACN,gBAAgB;AAAA,QAChB;AAAA,QACA,GAAIA,UAAS,UAAa,EAAE,MAAAA,MAAK;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB,WAAW;AAC9B,UAAM,UAAU,cAAc,KAAK;AACnC,QAAI,YAAY,MAAM,YAAY,QAAQ;AACxC,aAAO;AAAA,IACT;AAEA,QAAI,YAAY,eAAe;AAC7B,aAAO;AAAA,QACL,MAAM;AAAA,QACN,gBAAgB;AAAA,QAChB,OAAO;AAAA,QACP,GAAIA,UAAS,UAAa,EAAE,MAAAA,MAAK;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB,QAAQ;AAC3B,QAAI,YAAY,SAAS;AACvB,YAAM,cAAc,cAAc,KAAK;AACvC,UAAI,gBAAgB,IAAI;AACtB,eAAO;AAAA,MACT;AAEA,UAAI;AACF,cAAMC,UAAS,KAAK,MAAM,WAAW;AACrC,eAAO;AAAA,UACL,MAAM;AAAA,UACN,gBAAgB;AAAA,UAChB,OAAOA;AAAA,UACP,GAAID,UAAS,UAAa,EAAE,MAAAA,MAAK;AAAA,UACjC;AAAA,QACF;AAAA,MACF,QAAQ;AACN,eAAO;AAAA,UACL,MAAM;AAAA,UACN,gBAAgB;AAAA,UAChB,OAAO;AAAA,UACP,GAAIA,UAAS,UAAa,EAAE,MAAAA,MAAK;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAAS,aAAa,aAAa;AACzC,QAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,aAAO;AAAA,IACT;AAEA,UAAM,UAA+B,CAAC;AACtC,eAAW,QAAQ,QAAQ;AACzB,UAAI,OAAO,SAAS,YAAY,OAAO,SAAS,UAAU;AACxD,gBAAQ,KAAK,IAAI;AACjB;AAAA,MACF;AAEA,UAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,QAAQ,MAAM;AAC7D,cAAM,KAAM,KAAiC,IAAI;AACjD,YAAI,OAAO,OAAO,YAAY,OAAO,OAAO,UAAU;AACpD,kBAAQ,KAAK,EAAE;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB;AAAA,MACA,GAAIA,UAAS,UAAa,EAAE,MAAAA,MAAK;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,GAAIA,UAAS,UAAa,EAAE,MAAAA,MAAK;AAAA,IACjC;AAAA,EACF;AACF;AAEO,SAAS,0BAA0B,MAAc,YAAwC;AAC9F,QAAM,UAAU,KAAK,KAAK;AAC1B,MAAI;AAEJ,MAAI,YAAY,QAAQ;AACtB,YAAQ;AAAA,EACV,WAAW,YAAY,QAAQ;AAC7B,YAAQ;AAAA,EACV,WAAW,YAAY,SAAS;AAC9B,YAAQ;AAAA,EACV,OAAO;AACL,UAAM,SAAS,aAAa,OAAO;AACnC,YAAQ,WAAW,OAAQ,SAAuB;AAAA,EACpD;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,iCACP,SACA,MACA,YACA,SACuB;AACvB,QAAM,YAAY,eAAe,SAAS,MAAM,cAAc,SAAS,QAAQ,CAAC;AAChF,MAAI,UAAU,WAAW,QAAQ,CAAC,UAAU,OAAO,OAAO;AACxD,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,UAAU;AAChC,QAAMA,QAAO,UAAU,QAAQ,QAAQ;AACvC,QAAM,WAAW,SAAS;AAC1B,MAAI,aAAa,QAAW;AAC1B,WAAO;AAAA,EACT;AAEA,MAAI,cAAc,KAAK,MAAM,IAAI;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,SAAS,kBAAkB,OAAO;AACpD,MAAI,cAAc,QAAW;AAC3B,WAAO;AAAA,MACL,UAAU;AAAA,MACV,UAAU,aAAa;AAAA,MACvB,UAAU,aAAa,WAAW,aAAa;AAAA,MAC/C;AAAA,MACAA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,KAAC,sCAAwB,OAAO,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,yBAAyB,SAAS,SAAS;AACnE,MAAI,oBAAoB,QAAW;AACjC,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,SAAS,gCAAgC,iBAAiB,OAAO;AACnF,MAAI,cAAc,QAAW;AAC3B,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,UAAU,aAAa;AAAA,IACvB,UAAU,aAAa,WAAW,aAAa;AAAA,IAC/C;AAAA,IACAA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,yBAAyB,WAAqD;AACrF,MAAI,WAAW,SAAS,UAAU;AAChC,WAAO,UAAU;AAAA,EACnB;AAEA,MAAI,WAAW,SAAS,SAAS;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,UAAU,QAAQ;AAAA,IACtC,CAAC,WAA4D,OAAO,SAAS;AAAA,EAC/E;AACA,MAAI,cAAc,WAAW,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,QAAM,mBAAmB,UAAU,QAAQ,OAAO,CAAC,WAAW,OAAO,SAAS,QAAQ;AACtF,QAAM,yBAAyB,iBAAiB;AAAA,IAC9C,CAAC,WAAW,OAAO,SAAS,eAAe,OAAO,kBAAkB;AAAA,EACtE;AAEA,QAAM,eAAe,cAAc,CAAC;AACpC,SAAO,0BAA0B,iBAAiB,SAAY,aAAa,SAAS;AACtF;AAEA,SAAS,yBACP,aACA,gBACA,SACA,YACAA,OACA,UACgB;AAChB,QAAM,eAAe,GAAG,WAAW,IAAI,cAAc;AACrD,QAAM,eAAe,SAAS,eAAe,YAAY;AACzD,MAAI,iBAAiB,QAAW;AAC9B,UAAM,IAAI;AAAA,MACR,yDAAyD,YAAY;AAAA,IACvE;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,IACA,iBAAiB,aAAa;AAAA,IAC9B,GAAIA,UAAS,UAAa,EAAE,MAAAA,MAAK;AAAA,IACjC;AAAA,EACF;AACF;;;AChVA,IAAAE,eAA2C;AAoF3C,SAAS,QAAQC,OAAiC;AAChD,SAAOA,OAAM,SAAS,KAAK,GAAG,KAAK;AACrC;AAEO,SAAS,2BAA2B,WAAmBA,OAAiC;AAC7F,MAAIA,UAAS,QAAQA,MAAK,SAAS,WAAW,GAAG;AAC/C,WAAO;AAAA,EACT;AACA,SAAO,GAAG,SAAS,IAAIA,MAAK,SAAS,KAAK,GAAG,CAAC;AAChD;AAEO,SAAS,wBACd,MACA,cACU;AACV,MAAI,UAAU;AACd,QAAM,OAAO,oBAAI,IAAY;AAE7B,SAAO,QAAQ,SAAS,aAAa;AACnC,QAAI,KAAK,IAAI,QAAQ,IAAI,GAAG;AAC1B,aAAO;AAAA,IACT;AACA,SAAK,IAAI,QAAQ,IAAI;AAErB,UAAM,aAAa,aAAa,QAAQ,IAAI;AAC5C,QAAI,eAAe,QAAW;AAC5B,aAAO;AAAA,IACT;AACA,cAAU,WAAW;AAAA,EACvB;AAEA,SAAO;AACT;AAEO,SAAS,iCACd,MACA,cAC2B;AAC3B,QAAM,YAA8B,CAAC;AACrC,MAAI,UAAU;AACd,QAAM,OAAO,oBAAI,IAAY;AAE7B,SAAO,QAAQ,SAAS,aAAa;AACnC,QAAI,KAAK,IAAI,QAAQ,IAAI,GAAG;AAC1B;AAAA,IACF;AACA,SAAK,IAAI,QAAQ,IAAI;AAErB,UAAM,aAAa,aAAa,QAAQ,IAAI;AAC5C,QAAI,eAAe,QAAW;AAC5B;AAAA,IACF;AAEA,QAAI,WAAW,gBAAgB,QAAW;AACxC,gBAAU,KAAK,GAAG,WAAW,WAAW;AAAA,IAC1C;AAEA,cAAU,WAAW;AAAA,EACvB;AAEA,SAAO;AACT;AAEO,SAAS,iCACd,MACA,cAC2B;AAC3B,QAAM,YAA8B,CAAC;AACrC,MAAI,UAAU;AACd,QAAM,OAAO,oBAAI,IAAY;AAE7B,SAAO,QAAQ,SAAS,aAAa;AACnC,QAAI,KAAK,IAAI,QAAQ,IAAI,GAAG;AAC1B;AAAA,IACF;AACA,SAAK,IAAI,QAAQ,IAAI;AAErB,UAAM,aAAa,aAAa,QAAQ,IAAI;AAC5C,QAAI,eAAe,QAAW;AAC5B;AAAA,IACF;AAEA,QAAI,WAAW,gBAAgB,QAAW;AACxC,gBAAU,KAAK,GAAG,WAAW,WAAW;AAAA,IAC1C;AAEA,cAAU,WAAW;AAAA,EACvB;AAEA,SAAO;AACT;AAEA,SAAS,gBACP,MACA,cACA,UAS6D;AAC7D,QAAM,gBAAgB,wBAAwB,MAAM,YAAY;AAEhE,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,EAAE,MAAM,YAAY,UAAU,MAAM,SAAS,MAAM,MAAM,cAAc;AAAA,EAChF;AAEA,MAAI,cAAc,SAAS,SAAS;AAClC,WAAO,gBAAgB,cAAc,OAAO,cAAc,QAAQ;AAAA,EACpE;AAEA,MAAI,cAAc,SAAS,UAAU;AACnC,WAAO,EAAE,MAAM,gBAAgB,MAAM,cAAc;AAAA,EACrD;AAEA,QAAM,CAAC,SAAS,GAAG,IAAI,IAAI;AAC3B,MAAI,YAAY,QAAW;AACzB,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AAEA,QAAM,WAAW,cAAc,WAAW,KAAK,CAAC,cAAc,UAAU,SAAS,OAAO;AACxF,MAAI,aAAa,QAAW;AAC1B,WAAO,EAAE,MAAM,oBAAoB,QAAQ;AAAA,EAC7C;AAEA,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,SAAS,SAAS;AAAA,MAClB,MAAM,wBAAwB,SAAS,MAAM,YAAY;AAAA,IAC3D;AAAA,EACF;AAEA,SAAO,gBAAgB,SAAS,MAAM,cAAc,IAAI;AAC1D;AAEO,SAAS,6BACd,WACA,WACAA,OACA,kBACA,cACqB;AACrB,MAAIA,UAAS,MAAM;AACjB,UAAMC,wBAAuB,iCAAiC,WAAW,YAAY;AACrF,UAAMC,wBAAuB,iCAAiC,WAAW,YAAY;AACrF,UAAM,OAAO,wBAAwB,WAAW,YAAY;AAE5D,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,MAAAF;AAAA,MACA,YAAY;AAAA,MACZ;AAAA,MACA,sBAAAC;AAAA,MACA,sBAAAC;AAAA,MACA;AAAA,MACA,sBAAsB,CAAC,GAAGD,uBAAsB,GAAG,gBAAgB;AAAA,IACrE;AAAA,EACF;AAEA,QAAM,aAAa,gBAAgB,WAAW,cAAcD,MAAK,QAAQ;AACzE,QAAM,aAAa,2BAA2B,WAAWA,KAAI;AAE7D,MAAI,WAAW,SAAS,oBAAoB;AAC1C,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,MAAAA;AAAA,MACA;AAAA,MACA,SAAS,WAAW;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,WAAW,SAAS,gBAAgB;AACtC,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,MAAAA;AAAA,MACA;AAAA,MACA,MAAM,WAAW;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,sBAAsB,WAAW,UAAU,eAAe,CAAC;AACjE,QAAM,sBAAsB,WAAW,UAAU,eAAe,CAAC;AACjE,QAAM,wBAAwB,iCAAiC,WAAW,SAAS,YAAY;AAC/F,QAAM,wBAAwB,iCAAiC,WAAW,SAAS,YAAY;AAC/F,QAAM,uBAAuB,CAAC,GAAG,qBAAqB,GAAG,qBAAqB;AAC9E,QAAM,uBAAuB,CAAC,GAAG,qBAAqB,GAAG,qBAAqB;AAE9E,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,MAAAA;AAAA,IACA;AAAA,IACA,MAAM,WAAW;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA,sBAAsB,CAAC,GAAG,sBAAsB,GAAG,gBAAgB;AAAA,EACrE;AACF;AAEA,SAAS,gBAAgBA,OAAiD;AACxE,MAAIA,UAAS,QAAW;AACtB,WAAO;AAAA,EACT;AACA,SAAO,EAAE,UAAU,CAAC,GAAGA,MAAK,QAAQ,EAAE;AACxC;AAEO,SAAS,4BACd,WACA,WACA,aACA,cACgC;AAChC,QAAM,UAAU,oBAAI,IAAwE;AAAA,IAC1F,CAAC,IAAI,EAAE,MAAM,MAAM,aAAa,CAAC,EAAE,CAAC;AAAA,EACtC,CAAC;AAED,aAAW,cAAc,aAAa;AACpC,UAAMA,QAAO,gBAAgB,WAAW,IAAI;AAC5C,UAAM,MAAM,QAAQA,KAAI;AACxB,QAAI,SAAS,QAAQ,IAAI,GAAG;AAC5B,QAAI,WAAW,QAAW;AACxB,eAAS,EAAE,MAAAA,OAAM,aAAa,CAAC,EAAE;AACjC,cAAQ,IAAI,KAAK,MAAM;AAAA,IACzB;AACA,WAAO,YAAY,KAAK,UAAU;AAAA,EACpC;AAEA,SAAO,CAAC,GAAG,QAAQ,OAAO,CAAC,EAAE;AAAA,IAAI,CAAC,UAChC,6BAA6B,WAAW,WAAW,MAAM,MAAM,MAAM,aAAa,YAAY;AAAA,EAChG;AACF;AAEA,SAAS,iBACP,aACA,SACA,SACA,SACM;AACN,cAAY,KAAK;AAAA,IACf,MAAM;AAAA,IACN;AAAA,IACA,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,kBAAkB,CAAC,OAAO;AAAA,EAC5B,CAAC;AACH;AAEA,SAAS,gBACP,aACA,SACA,SACM;AACN,cAAY,KAAK;AAAA,IACf,MAAM;AAAA,IACN;AAAA,IACA,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,kBAAkB,CAAC;AAAA,EACrB,CAAC;AACH;AAEA,SAAS,oBACP,aACA,SACA,SACM;AACN,cAAY,KAAK;AAAA,IACf,MAAM;AAAA,IACN;AAAA,IACA,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,kBAAkB,CAAC;AAAA,EACrB,CAAC;AACH;AAEA,SAAS,qBACP,aACA,SACA,SACM;AACN,cAAY,KAAK;AAAA,IACf,MAAM;AAAA,IACN;AAAA,IACA,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,kBAAkB,CAAC;AAAA,EACrB,CAAC;AACH;AAEA,SAAS,wBACP,aACA,SACA,SACA,SACM;AACN,cAAY,KAAK;AAAA,IACf,MAAM;AAAA,IACN;AAAA,IACA,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,kBAAkB,CAAC,OAAO;AAAA,EAC5B,CAAC;AACH;AAEA,SAAS,+BAA+B,cAAqC;AAC3E,QAAM,YAAY,aAAa,YAAY,GAAG;AAC9C,MAAI,aAAa,GAAG;AAClB,WAAO;AAAA,EACT;AACA,SAAO,aAAa,MAAM,GAAG,SAAS;AACxC;AAEA,SAAS,UAAU,MAAwB;AACzC,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,KAAK;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,aAAa,KAAK,IAAI;AAAA,IAC/B,KAAK;AACH,aAAO,WAAW,KAAK,WAAW;AAAA,IACpC,KAAK;AACH,aAAO,UAAU,KAAK,MAAM;AAAA,IAC9B,SAAS;AACP,YAAM,aAAoB;AAC1B,aAAO,OAAO,UAAU;AAAA,IAC1B;AAAA,EACF;AACF;AAEA,SAAS,aAAa,OAAsD;AAC1E,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,YAAY,OAAiD;AACpE,SAAO,MAAM,QAAQ,KAAK;AAC5B;AAEA,SAAS,gBAAgB,MAAiB,OAA2B;AACnE,MAAI,SAAS,OAAO;AAClB,WAAO;AAAA,EACT;AAEA,MAAI,YAAY,IAAI,KAAK,YAAY,KAAK,GAAG;AAC3C,QAAI,CAAC,YAAY,IAAI,KAAK,CAAC,YAAY,KAAK,KAAK,KAAK,WAAW,MAAM,QAAQ;AAC7E,aAAO;AAAA,IACT;AAEA,eAAW,CAAC,OAAO,IAAI,KAAK,KAAK,QAAQ,GAAG;AAC1C,YAAM,YAAY,MAAM,KAAK;AAC7B,UAAI,cAAc,UAAa,CAAC,gBAAgB,MAAM,SAAS,GAAG;AAChE,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,IAAI,KAAK,aAAa,KAAK,GAAG;AAC7C,QAAI,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa,KAAK,GAAG;AAC/C,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,OAAO,KAAK,IAAI,EAAE,KAAK;AACxC,UAAM,YAAY,OAAO,KAAK,KAAK,EAAE,KAAK;AAC1C,QAAI,SAAS,WAAW,UAAU,QAAQ;AACxC,aAAO;AAAA,IACT;AAEA,WAAO,SAAS,MAAM,CAAC,KAAK,UAAU;AACpC,YAAM,WAAW,UAAU,KAAK;AAChC,UAAI,aAAa,KAAK;AACpB,eAAO;AAAA,MACT;AAEA,YAAM,YAAY,KAAK,GAAG;AAC1B,YAAM,aAAa,MAAM,QAAQ;AACjC,aACE,cAAc,UACd,eAAe,UACf,gBAAgB,WAAW,UAAU;AAAA,IAEzC,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAWA,SAAS,YACP,aACA,gBACyF;AACzF,SAAO,YAAY;AAAA,IACjB,CACE,eAEA,WAAW,mBAAmB;AAAA,EAClC;AACF;AAEA,SAAS,WACP,aACA,gBACwF;AACxF,SAAO,YAAY;AAAA,IACjB,CACE,eAEA,WAAW,mBAAmB;AAAA,EAClC;AACF;AAEA,SAAS,mBACP,aACmF;AACnF,SAAO,YAAY;AAAA,IACjB,CACE,eAEA,WAAW,mBAAmB;AAAA,EAClC;AACF;AAEA,SAAS,qBACP,aAC0E;AAC1E,SAAO,YAAY;AAAA,IACjB,CAAC,eACC,WAAW,mBAAmB;AAAA,EAClC;AACF;AAyBA,SAAS,yBACP,YACsC;AACtC,SACE,WAAW,mBAAmB,aAC9B,WAAW,mBAAmB,sBAC9B,WAAW,mBAAmB,eAC9B,WAAW,mBAAmB,cAC9B,WAAW,mBAAmB,aAC9B,WAAW,mBAAmB,sBAC9B,WAAW,mBAAmB,eAC9B,WAAW,mBAAmB;AAElC;AAEA,SAAS,kBAAkB,YAAoC;AAC7D,SAAO,WAAW,MAAM,SAAS,KAAK,GAAG,KAAK;AAChD;AAEA,SAAS,mBAAmB,MAA4C;AACtE,UAAQ,MAAM;AAAA,IACZ,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,SAAS;AACP,YAAM,aAAoB;AAC1B,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,MAAgE;AAC1F,SAAO,SAAS,aAAa,SAAS;AACxC;AAEA,SAAS,mBAAmB,MAAgE;AAC1F,SAAO,SAAS,aAAa,SAAS;AACxC;AAEA,SAAS,sBAAsB,YAA4C;AACzE,SAAO,IAAI,WAAW,cAAc;AACtC;AAEA,SAAS,0BACP,SACA,UACQ;AACR,QAAM,SAAS,mBAAmB,QAAQ,cAAc;AAExD,MAAI,WAAW,iBAAiB;AAC9B,QACE,CAAC,mBAAmB,QAAQ,cAAc,KAC1C,CAAC,mBAAmB,SAAS,cAAc,GAC3C;AACA,YAAM,IAAI,MAAM,kEAAkE;AAAA,IACpF;AAEA,QAAI,QAAQ,UAAU,SAAS,OAAO;AACpC,aAAO,QAAQ,QAAQ,SAAS,QAAQ,IAAI;AAAA,IAC9C;AACA,QAAI,QAAQ,mBAAmB,sBAAsB,SAAS,mBAAmB,WAAW;AAC1F,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,mBAAmB,aAAa,SAAS,mBAAmB,oBAAoB;AAC1F,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,iBAAiB;AAC9B,QACE,CAAC,mBAAmB,QAAQ,cAAc,KAC1C,CAAC,mBAAmB,SAAS,cAAc,GAC3C;AACA,YAAM,IAAI,MAAM,kEAAkE;AAAA,IACpF;AAEA,QAAI,QAAQ,UAAU,SAAS,OAAO;AACpC,aAAO,QAAQ,QAAQ,SAAS,QAAQ,IAAI;AAAA,IAC9C;AACA,QAAI,QAAQ,mBAAmB,sBAAsB,SAAS,mBAAmB,WAAW;AAC1F,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,mBAAmB,aAAa,SAAS,mBAAmB,oBAAoB;AAC1F,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,UAAQ,QAAQ;AAAA,IACd,KAAK;AAAA,IACL,KAAK;AACH,UAAI,QAAQ,UAAU,SAAS,OAAO;AACpC,eAAO;AAAA,MACT;AACA,aAAO,QAAQ,QAAQ,SAAS,QAAQ,IAAI;AAAA,IAC9C,KAAK;AAAA,IACL,KAAK;AACH,UAAI,QAAQ,UAAU,SAAS,OAAO;AACpC,eAAO;AAAA,MACT;AACA,aAAO,QAAQ,QAAQ,SAAS,QAAQ,IAAI;AAAA,IAC9C,SAAS;AACP,YAAM,aAAoB;AAC1B,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAQA,SAAS,2BAA2B,kBAA2B,mBAAoC;AACjG,MAAI,qBAAqB,mBAAmB;AAC1C,WAAO;AAAA,EACT;AACA,SAAO,mBAAmB,KAAK;AACjC;AAEA,SAAS,gCACP,SACA,UACQ;AACR,QAAM,QAAQ,QAAQ,gBAAgB,QAAQ,WAAW,SAAS,SAAS,WAAW,OAAO;AAC7F,QAAM,yBACJ,UAAU,IACN,2BAA2B,QAAQ,KAAK,WAAW,SAAS,KAAK,SAAS,IAC1E;AAEN,UAAQ,QAAQ,KAAK,OAAO;AAAA,IAC1B,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,2BAA2B,IAAI,IAAI,CAAC;AAAA,IAC7C,KAAK;AACH,aAAO,UAAU,IAAI,IAAI,OAAO;AAAA,IAClC,SAAS;AACP,YAAM,aAAoB,QAAQ,KAAK;AACvC,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,4BACP,OACA,OACS;AACT,QAAM,QAAQ,MAAM,gBAAgB,MAAM,WAAW,SAAS,MAAM,WAAW,OAAO;AACtF,MAAI,QAAQ,GAAG;AACb,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,GAAG;AACb,WAAO;AAAA,EACT;AACA,SAAO,CAAC,MAAM,KAAK,aAAa,CAAC,MAAM,KAAK;AAC9C;AAEA,SAAS,4BAA4B,YAA0C;AAC7E,SAAO,WAAW,WAAW,WAAW,WAAW;AACrD;AAEA,SAAS,WAAW,MAAyB;AAC3C,SAAO,KAAK,SAAS,eAAe,KAAK,kBAAkB;AAC7D;AAEA,SAAS,sCACP,MACA,cACqB;AACrB,QAAM,gBAAgB,wBAAwB,MAAM,YAAY;AAChE,QAAM,aAAyB,CAAC,aAAa;AAE7C,MAAI,cAAc,SAAS,SAAS;AAClC,eAAW,KAAK,GAAG,sCAAsC,cAAc,OAAO,YAAY,CAAC;AAAA,EAC7F;AAEA,MAAI,cAAc,SAAS,SAAS;AAClC,UAAM,cAAc,cAAc,QAAQ;AAAA,MAAI,CAAC,WAC7C,wBAAwB,QAAQ,YAAY;AAAA,IAC9C;AACA,UAAM,iBAAiB,YAAY,OAAO,CAAC,WAAW,CAAC,WAAW,MAAM,CAAC;AAEzE,QAAI,eAAe,WAAW,KAAK,eAAe,SAAS,YAAY,QAAQ;AAC7E,YAAM,CAAC,cAAc,IAAI;AACzB,UAAI,mBAAmB,QAAW;AAChC,mBAAW,KAAK,GAAG,sCAAsC,gBAAgB,YAAY,CAAC;AAAA,MACxF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,2BACP,aACA,WACA,aACM;AACN,QAAM,MAAM,YAAY,aAAa,SAAS;AAC9C,QAAM,MAAM,YAAY,aAAa,SAAS;AAC9C,QAAM,QAAQ,YAAY,aAAa,kBAAkB;AACzD,QAAM,QAAQ,YAAY,aAAa,kBAAkB;AAEzD,MAAI,QAAQ,UAAa,QAAQ,UAAa,IAAI,QAAQ,IAAI,OAAO;AACnE;AAAA,MACE;AAAA,MACA,UAAU,SAAS,eAAe,OAAO,IAAI,KAAK,CAAC,8BAA8B,OAAO,IAAI,KAAK,CAAC;AAAA,MAClG,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AAAA,EACF;AAEA,MAAI,UAAU,UAAa,QAAQ,UAAa,MAAM,SAAS,IAAI,OAAO;AACxE;AAAA,MACE;AAAA,MACA,UAAU,SAAS,wBAAwB,OAAO,MAAM,KAAK,CAAC,0CAA0C,OAAO,IAAI,KAAK,CAAC;AAAA,MACzH,MAAM;AAAA,MACN,IAAI;AAAA,IACN;AAAA,EACF;AAEA,MAAI,QAAQ,UAAa,UAAU,UAAa,IAAI,SAAS,MAAM,OAAO;AACxE;AAAA,MACE;AAAA,MACA,UAAU,SAAS,eAAe,OAAO,IAAI,KAAK,CAAC,mDAAmD,OAAO,MAAM,KAAK,CAAC;AAAA,MACzH,IAAI;AAAA,MACJ,MAAM;AAAA,IACR;AAAA,EACF;AAEA,MAAI,UAAU,UAAa,UAAU,UAAa,MAAM,SAAS,MAAM,OAAO;AAC5E;AAAA,MACE;AAAA,MACA,UAAU,SAAS,wBAAwB,OAAO,MAAM,KAAK,CAAC,mDAAmD,OAAO,MAAM,KAAK,CAAC;AAAA,MACpI,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,0BACP,aACA,WACA,aACM;AACN,QAAM,SAAS,WAAW,aAAa,WAAW;AAClD,QAAM,SAAS,WAAW,aAAa,WAAW;AAElD,MAAI,WAAW,UAAa,WAAW,UAAa,OAAO,QAAQ,OAAO,OAAO;AAC/E;AAAA,MACE;AAAA,MACA,UAAU,SAAS,iBAAiB,OAAO,OAAO,KAAK,CAAC,gCAAgC,OAAO,OAAO,KAAK,CAAC;AAAA,MAC5G,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,WAAW,WAAW,aAAa,UAAU;AACnD,QAAM,WAAW,WAAW,aAAa,UAAU;AAEnD,MAAI,aAAa,UAAa,aAAa,UAAa,SAAS,QAAQ,SAAS,OAAO;AACvF;AAAA,MACE;AAAA,MACA,UAAU,SAAS,gBAAgB,OAAO,SAAS,KAAK,CAAC,+BAA+B,OAAO,SAAS,KAAK,CAAC;AAAA,MAC9G,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEA,SAAS,iCACP,aACA,WACA,aACM;AACN,QAAM,UAAU,mBAAmB,WAAW;AAC9C,MAAI,QAAQ,SAAS,GAAG;AACtB;AAAA,EACF;AAEA,QAAM,WAAW,IAAI,IAAI,QAAQ,CAAC,GAAG,WAAW,CAAC,CAAC;AAClD,WAAS,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AACtD,UAAM,UAAU,QAAQ,KAAK;AAC7B,QAAI,YAAY,QAAW;AACzB;AAAA,IACF;AAEA,eAAW,UAAU,UAAU;AAC7B,UAAI,CAAC,QAAQ,QAAQ,SAAS,MAAM,GAAG;AACrC,iBAAS,OAAO,MAAM;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,SAAS,GAAG;AACvB,UAAM,QAAQ,QAAQ,CAAC;AACvB,UAAM,SAAS,QAAQ,CAAC;AACxB,QAAI,UAAU,UAAa,WAAW,QAAW;AAC/C;AAAA,QACE;AAAA,QACA,UAAU,SAAS;AAAA,QACnB,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,yBACP,aACA,WACA,aACM;AACN,QAAM,mBAAmB,qBAAqB,WAAW;AACzD,MAAI,iBAAiB,SAAS,GAAG;AAC/B;AAAA,EACF;AAEA,QAAM,QAAQ,iBAAiB,CAAC;AAChC,MAAI,UAAU,QAAW;AACvB;AAAA,EACF;AAEA,WAAS,QAAQ,GAAG,QAAQ,iBAAiB,QAAQ,SAAS,GAAG;AAC/D,UAAM,UAAU,iBAAiB,KAAK;AACtC,QAAI,YAAY,UAAa,gBAAgB,MAAM,OAAO,QAAQ,KAAK,GAAG;AACxE;AAAA,IACF;AAEA;AAAA,MACE;AAAA,MACA,UAAU,SAAS,kDAAkD,KAAK,UAAU,MAAM,KAAK,CAAC,QAAQ,KAAK,UAAU,QAAQ,KAAK,CAAC;AAAA,MACrI,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,EACF;AACF;AAEA,SAAS,0BACP,aACA,WACA,aACM;AACN,QAAM,iBAAiB,oBAAI,IAAoC;AAE/D,aAAW,cAAc,aAAa;AACpC,QAAI,CAAC,yBAAyB,UAAU,GAAG;AACzC;AAAA,IACF;AAEA,UAAM,MAAM,GAAG,mBAAmB,WAAW,cAAc,CAAC,IAAI,kBAAkB,UAAU,CAAC;AAC7F,UAAM,WAAW,eAAe,IAAI,GAAG;AACvC,QAAI,aAAa,QAAW;AAC1B,qBAAe,IAAI,KAAK,UAAU;AAClC;AAAA,IACF;AAEA,UAAM,WAAW,0BAA0B,YAAY,QAAQ;AAC/D,QAAI,WAAW,GAAG;AAChB;AAAA,QACE;AAAA,QACA,UAAU,SAAS,MAAM,sBAAsB,UAAU,CAAC,KAAK,OAAO,WAAW,KAAK,CAAC,6BAA6B,sBAAsB,QAAQ,CAAC,KAAK,OAAO,SAAS,KAAK,CAAC;AAAA,QAC9K,WAAW;AAAA,QACX,SAAS;AAAA,MACX;AACA;AAAA,IACF;AAEA,QAAI,WAAW,GAAG;AAChB,qBAAe,IAAI,KAAK,UAAU;AAAA,IACpC;AAAA,EACF;AACF;AAEA,SAAS,+BACP,aACA,WACA,aACA,mBACM;AACN,MAAI,sBAAsB,QAAW;AACnC;AAAA,EACF;AAEA,QAAM,iBAAiB,oBAAI,IAAiC;AAC5D,QAAM,gBAAgB,oBAAI,IAAiC;AAC3D,QAAM,gBAAgB,oBAAI,IAAiC;AAE3D,aAAW,cAAc,aAAa;AACpC,QAAI,WAAW,mBAAmB,UAAU;AAC1C;AAAA,IACF;AAEA,UAAM,eAAe,kBAAkB,eAAe,WAAW,YAAY;AAC7E,QAAI,cAAc,oBAAoB,UAAa,aAAa,iBAAiB,QAAW;AAC1F;AAAA,IACF;AAEA,UAAM,QAA6B;AAAA,MACjC;AAAA,MACA,iBAAiB,aAAa;AAAA,MAC9B,MAAM,aAAa;AAAA,IACrB;AACA,UAAM,YAAY,GAAG,aAAa,aAAa,MAAM,IAAI,kBAAkB,UAAU,CAAC;AACtF,UAAM,WAAW,GAAG,SAAS,IAAI,aAAa,aAAa,KAAK;AAChE,UAAM,WAAW,eAAe,IAAI,QAAQ;AAE5C,QAAI,aAAa,QAAW;AAC1B,YAAM,WAAW,gCAAgC,OAAO,QAAQ;AAChE,UAAI,OAAO,MAAM,QAAQ,GAAG;AAC1B;AAAA,UACE;AAAA,UACA,UAAU,SAAS,MAAM,4BAA4B,UAAU,CAAC,mBAAmB,4BAA4B,SAAS,UAAU,CAAC;AAAA,UACnI,WAAW;AAAA,UACX,SAAS,WAAW;AAAA,QACtB;AACA;AAAA,MACF;AAEA,UAAI,WAAW,GAAG;AAChB;AAAA,UACE;AAAA,UACA,UAAU,SAAS,MAAM,4BAA4B,UAAU,CAAC,4BAA4B,4BAA4B,SAAS,UAAU,CAAC;AAAA,UAC5I,WAAW;AAAA,UACX,SAAS,WAAW;AAAA,QACtB;AACA;AAAA,MACF;AAEA,UAAI,WAAW,GAAG;AAChB,uBAAe,IAAI,UAAU,KAAK;AAAA,MACpC;AAAA,IACF,OAAO;AACL,qBAAe,IAAI,UAAU,KAAK;AAAA,IACpC;AAEA,QAAI,aAAa,aAAa,UAAU,SAAS;AAC/C,oBAAc,IAAI,WAAW,eAAe,IAAI,QAAQ,KAAK,KAAK;AAAA,IACpE,WAAW,aAAa,aAAa,UAAU,SAAS;AACtD,oBAAc,IAAI,WAAW,eAAe,IAAI,QAAQ,KAAK,KAAK;AAAA,IACpE;AAAA,EACF;AAEA,aAAW,CAAC,WAAW,KAAK,KAAK,eAAe;AAC9C,UAAM,QAAQ,cAAc,IAAI,SAAS;AACzC,QAAI,UAAU,UAAa,CAAC,4BAA4B,OAAO,KAAK,GAAG;AACrE;AAAA,IACF;AAEA;AAAA,MACE;AAAA,MACA,UAAU,SAAS,MAAM,4BAA4B,MAAM,UAAU,CAAC,gBAAgB,4BAA4B,MAAM,UAAU,CAAC;AAAA,MACnI,MAAM,WAAW;AAAA,MACjB,MAAM,WAAW;AAAA,IACnB;AAAA,EACF;AACF;AAEA,SAAS,sBACP,aACA,WACA,MACA,YACA,cACA,mBACM;AACN,MAAI,sBAAsB,QAAW;AACnC;AAAA,EACF;AAEA,QAAM,eAAe,kBAAkB,eAAe,WAAW,YAAY;AAE7E,MAAI,iBAAiB,QAAW;AAC9B;AAAA,MACE;AAAA,MACA,UAAU,SAAS,yBAAyB,WAAW,YAAY;AAAA,MACnE,WAAW;AAAA,IACb;AACA;AAAA,EACF;AAEA,QAAM,iBAAiB,sCAAsC,MAAM,YAAY;AAC/E,QAAM,oBACJ,WAAW,WAAW,YAAY,SAC9B,aACA,yCAA2B,WAAW,WAAW,QAAQ,QAAQ,MAAM,EAAE,CAAC;AAEhF,MAAI,sBAAsB,QAAW;AACnC,UAAM,kBAAkB,kBAAkB,kBAAkB,iBAAiB;AAC7E,UAAM,cAAc,+BAA+B,WAAW,YAAY;AAC1E,QACE,gBAAgB,QAChB,iBAAiB,gBAAgB,eACjC,gBAAgB,aAAa,mBAAmB,aAAa,kBAC7D,CAAC,eAAe;AAAA,MACd,CAAC,kBACC,gBAAgB,aAAa,qBAAqB,aAAa,MAAM;AAAA,IACzE,GACA;AACA;AAAA,QACE;AAAA,QACA,UAAU,SAAS,yBAAyB,WAAW,YAAY,gCAAgC,UAAU,IAAI,CAAC;AAAA,QAClH,WAAW;AAAA,MACb;AACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,aAAa,oBAAoB,MAAM;AACzC,QACE,CAAC,eAAe;AAAA,MACd,CAAC,kBAAkB,aAAa,qBAAqB,aAAa,MAAM;AAAA,IAC1E,GACA;AACA;AAAA,QACE;AAAA,QACA,UAAU,SAAS,yBAAyB,WAAW,YAAY,gCAAgC,UAAU,IAAI,CAAC;AAAA,QAClH,WAAW;AAAA,MACb;AAAA,IACF;AACA;AAAA,EACF;AAEA,QAAM,kBAAkB,aAAa;AACrC,QAAM,wBAAwB,eAAe;AAAA,IAC3C,CAAC,kBACC,gBAAgB,SAAS,cAAc,IAAI,KAC3C,aAAa,qBAAqB,aAAa,MAAM;AAAA,EACzD;AAEA,MAAI,CAAC,uBAAuB;AAC1B;AAAA,MACE;AAAA,MACA,UAAU,SAAS,yBAAyB,WAAW,YAAY,gCAAgC,UAAU,IAAI,CAAC;AAAA,MAClH,WAAW;AAAA,IACb;AAAA,EACF;AACF;AAEA,SAAS,sBACP,aACA,WACA,MACA,YACA,cACA,mBACM;AACN,QAAM,gBAAgB,wBAAwB,MAAM,YAAY;AAChE,QAAM,WACJ,cAAc,SAAS,eACvB,CAAC,UAAU,WAAW,QAAQ,EAAE,SAAS,cAAc,aAAa;AACtE,QAAM,WAAW,cAAc,SAAS,eAAe,cAAc,kBAAkB;AACvF,QAAM,UAAU,cAAc,SAAS;AACvC,QAAM,SAAS,cAAc,SAAS;AACtC,QAAM,gBACJ,cAAc,SAAS,UACnB,wBAAwB,cAAc,OAAO,YAAY,IACzD;AACN,QAAMG,iBACJ,eAAe,SAAS,eAAe,cAAc,kBAAkB;AAEzE,QAAM,QAAQ,UAAU,aAAa;AAErC,UAAQ,WAAW,gBAAgB;AAAA,IACjC,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,UAAI,CAAC,UAAU;AACb;AAAA,UACE;AAAA,UACA,UAAU,SAAS,kBAAkB,WAAW,cAAc,wDAAwD,KAAK;AAAA,UAC3H,WAAW;AAAA,QACb;AAAA,MACF;AACA;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,UAAI,CAAC,YAAY,CAACA,gBAAe;AAC/B;AAAA,UACE;AAAA,UACA,UAAU,SAAS,kBAAkB,WAAW,cAAc,8EAA8E,KAAK;AAAA,UACjJ,WAAW;AAAA,QACb;AAAA,MACF;AACA;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,UAAI,CAAC,SAAS;AACZ;AAAA,UACE;AAAA,UACA,UAAU,SAAS,kBAAkB,WAAW,cAAc,uDAAuD,KAAK;AAAA,UAC1H,WAAW;AAAA,QACb;AAAA,MACF;AACA;AAAA,IACF,KAAK;AACH,UAAI,CAAC,QAAQ;AACX;AAAA,UACE;AAAA,UACA,UAAU,SAAS,mFAAmF,KAAK;AAAA,UAC3G,WAAW;AAAA,QACb;AAAA,MACF;AACA;AAAA,IACF,KAAK,SAAS;AACZ,YAAM,uBACH,cAAc,SAAS,eACtB,CAAC,UAAU,UAAU,WAAW,UAAU,WAAW,MAAM,EAAE;AAAA,QAC3D,cAAc;AAAA,MAChB,KACF,cAAc,SAAS;AAEzB,UAAI,CAAC,sBAAsB;AACzB;AAAA,UACE;AAAA,UACA,UAAU,SAAS,uFAAuF,KAAK;AAAA,UAC/G,WAAW;AAAA,QACb;AACA;AAAA,MACF;AAEA,UAAI,cAAc,SAAS,aAAa;AACtC,cAAM,YACJ,WAAW,UAAU,OACjB,SACA,MAAM,QAAQ,WAAW,KAAK,IAC5B,UACA,OAAO,WAAW;AAC1B,cAAM,oBACJ,cAAc,kBAAkB,aAAa,cAAc,kBAAkB,WACzE,WACA,cAAc;AACpB,YAAI,cAAc,mBAAmB;AACnC;AAAA,YACE;AAAA,YACA,UAAU,SAAS,yBAAyB,SAAS,sCAAsC,cAAc,aAAa;AAAA,YACtH,WAAW;AAAA,UACb;AAAA,QACF;AACA;AAAA,MACF;AAEA,YAAM,eAAe,cAAc,QAAQ,IAAI,CAAC,WAAW,OAAO,KAAK;AACvE,UAAI,CAAC,aAAa,KAAK,CAAC,WAAW,gBAAgB,QAAQ,WAAW,KAAK,CAAC,GAAG;AAC7E;AAAA,UACE;AAAA,UACA,UAAU,SAAS,mBAAmB,KAAK,UAAU,WAAW,KAAK,CAAC;AAAA,UACtE,WAAW;AAAA,QACb;AAAA,MACF;AACA;AAAA,IACF;AAAA,IACA,KAAK;AACH;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA;AAAA,IACF,SAAS;AACP,YAAM,aAAoB;AAC1B,YAAM,IAAI,MAAM,yBAAyB,KAAK,UAAU,UAAU,CAAC,EAAE;AAAA,IACvE;AAAA,EACF;AACF;AAEA,SAAS,2BACP,aACA,OACA,cACA,mBACM;AACN,6BAA2B,aAAa,MAAM,YAAY,MAAM,oBAAoB;AACpF,4BAA0B,aAAa,MAAM,YAAY,MAAM,oBAAoB;AACnF,mCAAiC,aAAa,MAAM,YAAY,MAAM,oBAAoB;AAC1F,2BAAyB,aAAa,MAAM,YAAY,MAAM,oBAAoB;AAClF,4BAA0B,aAAa,MAAM,YAAY,MAAM,oBAAoB;AACnF;AAAA,IACE;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,IACN;AAAA,EACF;AAEA,aAAW,cAAc,MAAM,sBAAsB;AACnD;AAAA,MACE;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAOO,SAAS,yBACd,WACA,WACA,aACA,cACA,SAGgC;AAChC,QAAM,cAA8C,CAAC;AACrD,QAAM,eAAe,4BAA4B,WAAW,WAAW,aAAa,YAAY;AAEhG,aAAW,eAAe,cAAc;AACtC,YAAQ,YAAY,MAAM;AAAA,MACxB,KAAK;AACH;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS;AAAA,QACX;AACA;AAAA,MACF,KAAK;AACH,mBAAW,cAAc,YAAY,kBAAkB;AACrD;AAAA,YACE;AAAA,YACA,UAAU,YAAY,UAAU,gCAAgC,WAAW,cAAc,sCAAsC,YAAY,OAAO;AAAA,YAClJ,WAAW;AAAA,UACb;AAAA,QACF;AACA;AAAA,MACF,KAAK;AACH,mBAAW,cAAc,YAAY,kBAAkB;AACrD;AAAA,YACE;AAAA,YACA,UAAU,YAAY,UAAU,gCAAgC,WAAW,cAAc,8BAA8B,UAAU,YAAY,IAAI,CAAC;AAAA,YAClJ,WAAW;AAAA,UACb;AAAA,QACF;AACA;AAAA,MACF,SAAS;AACP,cAAM,aAAoB;AAC1B,cAAM,IAAI,MAAM,2BAA2B,OAAO,UAAU,CAAC,EAAE;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;;;ACx0CA,IAAAC,MAAoB;;;ACApB,IAAAC,MAAoB;AAiFpB,IAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,eAAe,YAAkD;AACxE,SAAO,WAAW,IAAI,CAAC,cAAc,KAAK,UAAU,SAAS,CAAC,EAAE,KAAK,KAAK;AAC5E;AAEA,SAAS,gBAAgB,WAAkD;AACzE,UAAQ,WAAW;AAAA,IACjB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,SAAS;AACP,YAAM,aAAoB;AAC1B,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,0BAA0B,WAA0C;AAC3E,UAAQ,UAAU,MAAM;AAAA,IACtB,KAAK;AACH,aAAO,UAAU,eAAe,SAC5B,kDACA,6BAA6B,KAAK,UAAU,UAAU,UAAU,CAAC;AAAA,IACvE,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,gBAAgB,UAAU,SAAS;AAAA,IAC5C,SAAS;AACP,YAAM,aAAoB,UAAU;AACpC,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,SAAiB,WAAiC;AACzE,QAAM,aAAa,UAAU,WAAW,IAAI,CAAC,WAAW,UAAU;AAChE,UAAM,OAAO,UAAU,SAAS,UAAU,UAAU,SAAS,OAAO,KAAK,CAAC;AAC1E,WAAO,GAAG,IAAI,KAAK,0BAA0B,SAAS,CAAC;AAAA,EACzD,CAAC;AAED,SAAO;AAAA,IACL,cAAc,0BAA0B,OAAO,CAAC;AAAA,IAChD,uBAAuB,eAAe,UAAU,UAAU,CAAC,mBACzD,WAAW,SAAS,IAAI,MAAM,EAChC;AAAA,IACA,GAAG,WAAW;AAAA,MACZ,CAAC,WAAW,UAAU,OAAO,SAAS,GAAG,UAAU,WAAW,SAAS,IAAI,KAAK,GAAG;AAAA,IACrF;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,0BAA0B,SAAyB;AAC1D,SAAO,OAAO,OAAO;AACvB;AAEA,SAAS,uBAAuB,WAAiE;AAC/F,UAAQ,UAAU,MAAM;AAAA,IACtB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,SAAS;AACP,YAAM,aAAoB,UAAU;AACpC,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,uBAAuB,WAAwD;AACtF,aAAW,aAAa,UAAU,YAAY;AAC5C,UAAM,aAAa,uBAAuB,SAAS;AACnD,QAAI,eAAe,MAAM;AACvB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,mBACP,WAC0D;AAC1D,SACE,UAAU,WAAW;AAAA,IACnB,CAAC,cACC,UAAU,SAAS;AAAA,EACvB,KAAK;AAET;AAEA,SAAS,wBAAwB,WAAiC;AAChE,QAAM,YAAY,mBAAmB,SAAS;AAC9C,MAAI,WAAW,SAAS,eAAe;AACrC,UAAM,IAAI,MAAM,iEAAiE;AAAA,EACnF;AACA,MAAI,UAAU,eAAe,QAAW;AACtC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO,KAAK,UAAU,UAAU,UAAU;AAC5C;AAEA,SAAS,qBACP,QACA,WACA,aACQ;AACR,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,UAAU,WAAW,KAAK,wBAAwB,SAAS,CAAC,KAAK,KAAK;AAAA,QAC3E,OAAO;AAAA,MACT,CAAC;AAAA,IACH,KAAK;AACH,aAAO,YAAY,WAAW,KAAK,KAAK,UAAU,OAAO,IAAI,CAAC;AAAA,IAChE,KAAK;AACH,aAAO,aAAa,WAAW,KAAK,KAAK,UAAU,OAAO,IAAI,CAAC;AAAA,EACnE;AACF;AAUO,SAAS,yBACd,YACA,WACA,YACyB;AACzB,SAAO,WAAW,WAAW;AAAA,IAC3B,CAAC,cACC,UAAU,WAAW,SAAS,SAAS,KAAK,uBAAuB,SAAS,MAAM;AAAA,EACtF;AACF;AAWO,SAAS,4BAA4B,YAAoD;AAC9F,QAAM,QAAQ,CAAC,GAAG,eAAe,IAAI,gCAAgC;AAErE,aAAW,cAAc,qBAAqB,UAAU,GAAG;AACzD,eAAW,aAAa,WAAW,YAAY;AAC7C,YAAM,KAAK,gBAAgB,WAAW,eAAe,SAAS,CAAC;AAAA,IACjE;AAAA,EACF;AAEA,QAAM,KAAK,GAAG;AACd,SAAO,MAAM,KAAK,IAAI;AACxB;AAUO,SAAS,mCACd,SACgC;AAChC,QAAM,aAAa,iBAAiB,QAAQ,SAAS,QAAQ,UAAU;AACvE,MAAI,eAAe,MAAM;AACvB,UAAM,IAAI,MAAM,yBAAyB,QAAQ,OAAO,EAAE;AAAA,EAC5D;AAEA,QAAM,aAAa,QAAQ,QAAQ,QAAQ;AAC3C,QAAM,qBAAqB,yBAAyB,YAAY,QAAQ,WAAW,UAAU;AAC7F,MAAI,mBAAmB,WAAW,GAAG;AACnC,UAAM,IAAI;AAAA,MACR,+BAA+B,WAAW,aAAa,kBAAkB,QAAQ,SAAS,OACvF,eAAe,OAAO,KAAK,sBAAsB,UAAU;AAAA,IAChE;AAAA,EACF;AAEA,QAAM,OAAO;AAAA,IACX,SAAS,KAAK,UAAU,QAAQ,SAAS,CAAC,KAAK,QAAQ,QAAQ,KAAK,QAAQ,WAAW;AAAA,EACzF;AACA,QAAM,YAAY,mBAAmB,CAAC;AACtC,MAAI,cAAc,QAAW;AAC3B,UAAM,IAAI;AAAA,MACR,yDAAyD,WAAW,aAAa;AAAA,IACnF;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW,UAAa,QAAQ,WAAW,MAAM;AAC3D,SAAK,KAAK,qBAAqB,QAAQ,QAAQ,WAAW,QAAQ,WAAW,CAAC;AAAA,EAChF;AAEA,MAAI,QAAQ,uBAAuB,UAAa,QAAQ,uBAAuB,MAAM;AACnF,SAAK,KAAK,QAAQ,kBAAkB;AAAA,EACtC;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,gBAAgB,cAAc,0BAA0B,WAAW,aAAa,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC;AAAA,EACtG;AACF;AAEA,SAAS,4BACP,UACA,YACA,iBACiB;AACjB,QAAM,OAAU,uBAAmB,iBAAiB,IAAI;AACxD,QAAM,wBAAwB,KAAK,cAAc,KAAK,IAAI;AAE1D,OAAK,gBAAgB,CAAC,mBAAmB,iBAAiB,SAAS,8BAA8B;AAC/F,QAAI,sBAAsB,UAAU;AAClC,aAAU,qBAAiB,mBAAmB,YAAY,iBAAiB,IAAI;AAAA,IACjF;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,OAAK,WAAW,CAAC,sBAAsB;AACrC,QAAI,sBAAsB,UAAU;AAClC,aAAO;AAAA,IACT;AACA,WAAU,QAAI,SAAS,iBAAiB;AAAA,EAC1C;AAEA,OAAK,aAAa,CAAC,sBACjB,sBAAsB,YAAe,QAAI,WAAW,iBAAiB;AAEvE,OAAK,YAAY,MAAM;AACvB,SAAO;AACT;AAEA,SAAS,yBAAyB,SAAqD;AACrF,SAAU,iCAA6B,SAAS,IAAI;AACtD;AAEA,IAAM,sBAAsB,oBAAI,IAAqC;AAS9D,SAAS,6BACd,SACyB;AACzB,QAAM,UAAU,mCAAmC,OAAO;AAC1D,QAAM,aAAa;AAAA,IACjB,4BAA4B,QAAQ,UAAU;AAAA,IAC9C;AAAA,IACA,GAAI,QAAQ,0BAA0B,CAAC;AAAA,IACvC;AAAA,IACA,QAAQ;AAAA,EACV,EAAE,KAAK,IAAI;AACX,QAAM,SAAS,oBAAoB,IAAI,UAAU;AACjD,MAAI,WAAW,QAAW;AACxB,WAAO;AAAA,EACT;AACA,QAAM,WAAW;AACjB,QAAM,kBAAsC;AAAA,IAC1C,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAW,iBAAa;AAAA,IACxB,QAAW,eAAW;AAAA,IACtB,KAAK,CAAC,iBAAiB;AAAA,EACzB;AACA,QAAM,OAAO,4BAA4B,UAAU,YAAY,eAAe;AAC9E,QAAM,UAAa,kBAAc,CAAC,QAAQ,GAAG,iBAAiB,IAAI;AAClE,QAAM,cACH,0BAAsB,OAAO,EAC7B,OAAO,CAAC,eAAe,WAAW,SAAS,UAAa,WAAW,KAAK,aAAa,QAAQ,EAC7F,IAAI,CAAC,gBAAgB;AAAA,IACpB,MAAM,WAAW;AAAA,IACjB,SAAS,yBAAyB,WAAW,WAAW;AAAA,EAC1D,EAAE;AAEJ,QAAM,SAAS;AAAA,IACb;AAAA,IACA;AAAA,EACF;AACA,sBAAoB,IAAI,YAAY,MAAM;AAC1C,SAAO;AACT;;;ACxeA,IAAAC,MAAoB;AAMb,SAAS,8BACd,MACA,YACwB;AACxB,QAAM,SAAY,4BAAwB,WAAW,MAAM,KAAK,aAAa,CAAC,KAAK,CAAC;AACpF,QAAM,YAAY,OAAO;AAAA,IAAO,CAAC,UAC/B,WAAW,KAAK,MAAM,MAAM,KAAK,MAAM,GAAG,EAAE,WAAW,KAAK;AAAA,EAC9D;AACA,SAAO,UAAU,WAAW,IAAI,OAAQ,UAAU,UAAU,SAAS,CAAC,KAAK;AAC7E;AAMO,SAAS,eAAe,MAAe,SAA8C;AAC1F,MACK,uBAAmB,IAAI,KACvB,2BAAuB,IAAI,KAC3B,2BAAuB,IAAI,KAC3B,0BAAsB,IAAI,KAC1B,wBAAoB,IAAI,KACxB,wBAAoB,IAAI,KACxB,0BAAsB,IAAI,KAC1B,0BAAsB,IAAI,KAC1B,gBAAY,IAAI,GACnB;AACA,WAAO,QAAQ,kBAAkB,IAAI;AAAA,EACvC;AAEA,SAAO;AACT;AAMO,SAAS,YAAY,MAAe,SAA8C;AACvF,QAAM,SAAS,KAAK;AACpB,MACK,uBAAmB,MAAM,KACzB,2BAAuB,MAAM,KAC7B,sBAAkB,MAAM,KACxB,2BAAuB,MAAM,GAChC;AACA,WAAO,QAAQ,kBAAkB,MAAM;AAAA,EACzC;AAEA,SAAO,eAAe,MAAM,OAAO;AACrC;AAMO,SAAS,gCACd,YACA,QACgB;AAChB,MAAI,YAA4B;AAEhC,QAAM,QAAQ,CAAC,SAAwB;AACrC,QAAI,4BAA4B,IAAI,MAAM,MAAM;AAC9C,YAAM,QAAQ,8BAA8B,MAAM,UAAU;AAC5D,UAAI,UAAU,QAAQ,UAAU,MAAM,OAAO,UAAU,MAAM,KAAK;AAChE,YAAI,cAAc,QAAQ,KAAK,SAAS,UAAU,IAAI,UAAU,SAAS,UAAU,GAAG;AACpF,sBAAY;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAEA,IAAG,iBAAa,MAAM,KAAK;AAAA,EAC7B;AAEA,QAAM,UAAU;AAChB,SAAO;AACT;;;ACtEO,IAAM,qCAAqC;AAC3C,IAAM,mCAAmC;AA8NhD,SAAS,eAAe,OAAkD;AACxE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,cAAc,OAAsC;AAC3D,MAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,SAAO,OAAO,UAAU,UAAU,YAAY,OAAO,UAAU,QAAQ;AACzE;AAEA,SAAS,cAAc,OAA4C;AACjE,SAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,MAAM,CAAC,UAAU,OAAO,UAAU,QAAQ;AACjF;AAEA,SAAS,iBAAiB,OAAuD;AAC/E,SAAO,cAAc,KAAK;AAC5B;AAEA,SAAS,kBAAkB,OAAwD;AACjF,SAAO,cAAc,KAAK;AAC5B;AAEA,SAAS,cAAc,OAA8C;AACnE,MAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,UACG,UAAU,SAAS,iBAAiB,UAAU,SAAS,mBACxD,OAAO,UAAU,YAAY;AAEjC;AAEA,SAAS,0BAA0B,OAA0D;AAC3F,MAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,SACE,OAAO,UAAU,kBAAkB,YACnC,OAAO,UAAU,qBAAqB,YACtC,OAAO,UAAU,kBAAkB;AAEvC;AAEA,SAAS,yBAAyB,OAAyD;AACzF,MAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,SAAO,OAAO,UAAU,UAAU,YAAY,iBAAiB,UAAU,UAAU;AACrF;AAEA,SAAS,mCACP,OACmD;AACnD,MAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,SACE,OAAO,UAAU,YAAY,YAC7B,OAAO,UAAU,UAAU,aAC3B,OAAO,UAAU,SAAS,YAC1B,cAAc,UAAU,QAAQ,KAChC,cAAc,UAAU,SAAS,KACjC,cAAc,UAAU,IAAI;AAEhC;AAEA,SAAS,+BACP,OAC+C;AAC/C,MAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,SACE,OAAO,UAAU,YAAY,aAC5B,UAAU,kBAAkB,QAAQ,0BAA0B,UAAU,aAAa,OACrF,UAAU,cAAc,QAAQ,OAAO,UAAU,cAAc,aAChE,kBAAkB,UAAU,gBAAgB,KAC5C,cAAc,UAAU,iBAAiB,KACzC,cAAc,UAAU,qBAAqB,KAC7C,cAAc,UAAU,WAAW,KACnC,MAAM,QAAQ,UAAU,UAAU,KAClC,UAAU,WAAW,MAAM,wBAAwB,MAClD,UAAU,qBAAqB,QAAQ,OAAO,UAAU,qBAAqB,cAC7E,UAAU,wBAAwB,QAAQ,OAAO,UAAU,wBAAwB,cACnF,UAAU,0BAA0B,QACnC,OAAO,UAAU,0BAA0B;AAEjD;AAEA,SAAS,8BACP,OAC8C;AAC9C,MAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,MAAI,OAAO,UAAU,SAAS,UAAU;AACtC,WAAO;AAAA,EACT;AAEA,UAAQ,UAAU,MAAM;AAAA,IACtB,KAAK;AACH,aAAO,OAAO,UAAU,WAAW,YAAY,MAAM,QAAQ,UAAU,aAAa,IAChF,UAAU,cAAc,MAAM,yBAAyB,IACvD;AAAA,IACN,KAAK;AACH,aAAO,+BAA+B,UAAU,QAAQ;AAAA,IAC1D,KAAK;AACH,aACE,+BAA+B,UAAU,QAAQ,KAAK,cAAc,UAAU,WAAW;AAAA,IAE7F,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,sBAAsB,OAAsD;AACnF,MAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,UACG,UAAU,SAAS,cAClB,UAAU,SAAS,YACnB,UAAU,SAAS,eACrB,OAAO,UAAU,aAAa;AAElC;AAEA,SAAS,0BACP,OACkF;AAClF,SAAO,eAAe,KAAK,KAAK,MAAM,iBAAiB,MAAM;AAC/D;AAEA,SAAS,qBAAqB,OAAqD;AACjF,MAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,SACE,OAAO,UAAU,SAAS,YAC1B,OAAO,UAAU,YAAY,YAC7B,cAAc,UAAU,KAAK,MAC5B,UAAU,aAAa,WACtB,UAAU,aAAa,aACvB,UAAU,aAAa;AAE7B;AAEA,SAAS,sBAAsB,OAAsD;AACnF,MAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,SACE,OAAO,UAAU,eAAe,YAChC,OAAO,UAAU,sBAAsB,YACvC,OAAO,UAAU,eAAe,aAChC,cAAc,UAAU,QAAQ,KAChC,cAAc,UAAU,WAAW,MAClC,UAAU,gBAAgB,QAAQ,cAAc,UAAU,WAAW,OACrE,UAAU,WAAW,QAAQ,mCAAmC,UAAU,MAAM,OAChF,UAAU,iBAAiB,QAAQ,cAAc,UAAU,YAAY,MACxE,OAAO,UAAU,iBAAiB,YAClC,+BAA+B,UAAU,QAAQ;AAErD;AAEA,SAAS,0BAA0B,OAA0D;AAC3F,MAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,SACE,cAAc,UAAU,WAAW,KACnC,cAAc,UAAU,eAAe,MACtC,UAAU,cAAc,QAAQ,OAAO,UAAU,cAAc,cAC/D,UAAU,gBAAgB,QAAQ,OAAO,UAAU,gBAAgB,cACnE,UAAU,aAAa,QAAQ,OAAO,UAAU,aAAa,aAC9D,MAAM,QAAQ,UAAU,IAAI,KAC5B,UAAU,KAAK,MAAM,qBAAqB;AAE9C;AAEA,SAAS,uBAAuB,OAAuD;AACrF,MAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,SACE,OAAO,UAAU,aAAa,YAC9B,OAAO,UAAU,eAAe,YAChC,OAAO,UAAU,gBAAgB,YACjC,MAAM,QAAQ,UAAU,QAAQ,KAChC,UAAU,SAAS,MAAM,yBAAyB,KAClD,MAAM,QAAQ,UAAU,WAAW,KACnC,UAAU,YAAY,MAAM,oBAAoB;AAEpD;AAKO,SAAS,2BAA2B,OAAmD;AAC5F,MAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,SACE,UAAU,oBAAoB,sCAC9B,UAAU,0BAA0B,oCACpC,OAAO,UAAU,kBAAkB,YACnC,OAAO,UAAU,gBAAgB,YACjC,cAAc,UAAU,QAAQ,KAChC,OAAO,UAAU,sBAAsB,YACvC,OAAO,UAAU,yBAAyB,YAC1C,OAAO,UAAU,eAAe,YAChC,OAAO,UAAU,cAAc;AAEnC;AAKO,SAAS,wBAAwB,OAAgD;AACtF,MAAI,CAAC,0BAA0B,KAAK,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,MAAI,OAAO,UAAU,SAAS,UAAU;AACtC,WAAO;AAAA,EACT;AAEA,UAAQ,UAAU,MAAM;AAAA,IACtB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO,OAAO,UAAU,aAAa,YAAY,OAAO,UAAU,WAAW;AAAA,IAC/E,KAAK;AAAA,IACL,KAAK;AACH,aAAO,OAAO,UAAU,aAAa;AAAA,IACvC;AACE,aAAO;AAAA,EACX;AACF;AAKO,SAAS,2BAA2B,OAAmD;AAC5F,MAAI,CAAC,0BAA0B,KAAK,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,MAAI,OAAO,UAAU,SAAS,UAAU;AACtC,WAAO;AAAA,EACT;AAEA,UAAQ,UAAU,MAAM;AAAA,IACtB,KAAK;AACH,aAAO,2BAA2B,UAAU,QAAQ;AAAA,IACtD,KAAK;AACH,aACE,OAAO,UAAU,eAAe,YAAY,8BAA8B,UAAU,OAAO;AAAA,IAE/F,KAAK;AACH,aACE,OAAO,UAAU,eAAe,aAC/B,UAAU,UAAU,QAAQ,sBAAsB,UAAU,KAAK;AAAA,IAEtE,KAAK;AACH,aACE,OAAO,UAAU,eAAe,YAChC,MAAM,QAAQ,UAAU,WAAW,KACnC,UAAU,YAAY,MAAM,oBAAoB;AAAA,IAEpD,KAAK;AACH,aAAO,UAAU,aAAa,QAAQ,uBAAuB,UAAU,QAAQ;AAAA,IACjF,KAAK;AACH,aAAO,OAAO,UAAU,UAAU;AAAA,IACpC;AACE,aAAO;AAAA,EACX;AACF;AAMO,SAAS,wBAAwB,MAAsB;AAC5D,MAAI,OAAO;AACX,WAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACnD,YAAQ,KAAK,WAAW,KAAK;AAC7B,WAAO,KAAK,KAAK,MAAM,QAAU;AAAA,EACnC;AAEA,UAAQ,SAAS,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAClD;AAKO,SAAS,gCACd,QACiD;AACjD,MAAI,WAAW,MAAM;AACnB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,SAAS,OAAO;AAAA,IAChB,OAAO,OAAO;AAAA,IACd,MAAM,OAAO;AAAA,IACb,UAAU,OAAO;AAAA,IACjB,WAAW,OAAO;AAAA,IAClB,MAAM,OAAO;AAAA,EACf;AACF;AAKO,SAAS,mCACd,UACsC;AACtC,SAAO;AAAA,IACL,SAAS,SAAS,IAAI;AAAA,IACtB,eACE,SAAS,kBAAkB,OACvB,OACA;AAAA,MACE,eAAe,SAAS,cAAc;AAAA,MACtC,kBAAkB,SAAS,cAAc;AAAA,MACzC,eAAe,SAAS,cAAc;AAAA,IACxC;AAAA,IACN,WAAW,SAAS;AAAA,IACpB,kBAAkB,SAAS;AAAA,IAC3B,mBAAmB,SAAS;AAAA,IAC5B,uBAAuB,SAAS;AAAA,IAChC,aAAa,SAAS;AAAA,IACtB,YAAY,SAAS,WAAW,IAAI,CAAC,eAAe;AAAA,MAClD,OAAO,UAAU;AAAA,MACjB,YAAY,UAAU;AAAA,IACxB,EAAE;AAAA,IACF,kBAAkB,SAAS;AAAA,IAC3B,qBAAqB,SAAS;AAAA,IAC9B,uBAAuB,SAAS;AAAA,EAClC;AACF;AAKO,SAAS,2BACd,SACqC;AACrC,UAAQ,QAAQ,MAAM;AAAA,IACpB,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ,QAAQ;AAAA,QAChB,eAAe,QAAQ,cAAc,IAAI,CAAC,SAAS;AAAA,UACjD,eAAe,IAAI;AAAA,UACnB,kBAAkB,IAAI;AAAA,UACtB,eAAe,IAAI;AAAA,QACrB,EAAE;AAAA,MACJ;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU,mCAAmC,QAAQ,QAAQ;AAAA,MAC/D;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU,mCAAmC,QAAQ,QAAQ;AAAA,QAC7D,aAAa,QAAQ;AAAA,MACvB;AAAA,IACF,KAAK;AACH,aAAO,EAAE,MAAM,OAAO;AAAA,IACxB,SAAS;AACP,YAAM,aAAoB;AAC1B,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAKO,SAAS,mBACd,OACoC;AACpC,SAAO,UAAU,OACb,OACA;AAAA,IACE,MAAM,MAAM;AAAA,IACZ,UAAU,MAAM;AAAA,EAClB;AACN;AAKO,SAAS,0BACd,KACA,UAC6B;AAC7B,SAAO;AAAA,IACL,YAAY,IAAI;AAAA,IAChB,mBAAmB,IAAI;AAAA,IACvB,YAAY,IAAI;AAAA,IAChB,UAAU,IAAI;AAAA,IACd,aAAa,IAAI;AAAA,IACjB,aAAa,IAAI;AAAA,IACjB,QAAQ,gCAAgC,IAAI,MAAM;AAAA,IAClD,cAAc,IAAI;AAAA,IAClB,cAAc,IAAI;AAAA,IAClB,UAAU,mCAAmC,QAAQ;AAAA,EACvD;AACF;;;AH9oBA,SAAS,YAAY,OAAe,KAA0B;AAC5D,SAAO,EAAE,OAAO,IAAI;AACtB;AAEA,SAAS,aAAa,MAA2B,SAAwC;AACvF,MAAI,SAAS,QAAW;AACtB,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,aAAa,MAAM,QAAc,oBAAgB,YAAY;AAC9E;AAEA,SAAS,8BAA8B,MAA8C;AACnF,MAAI,SAAS,QAAW;AACtB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,SAAS,KAAK,eAAe,KAAK,UAAU;AAClD,QAAM,eAAe,QAAQ,gBAAgB,CAAC;AAC9C,SAAO,aACJ;AAAA,IAAI,CAAC,gBACJ,YAAY,cAAc,EAAE,KAAK,MAAM,YAAY,aAAa,GAAG,YAAY,OAAO,CAAC;AAAA,EACzF,EACC,OAAO,CAAC,oBAAoB,gBAAgB,KAAK,EAAE,SAAS,CAAC;AAClE;AAEA,SAAS,yBAAyB,KAA2D;AAC3F,MAAI,IAAI,WAAW,MAAM;AACvB,WAAO;AAAA,EACT;AAEA,UAAQ,IAAI,OAAO,MAAM;AAAA,IACvB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,MAAM,IAAI,OAAO;AAAA,QACjB,MAAM,IAAI,OAAO;AAAA,MACnB;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,IAAI,OAAO;AAAA,MACnB;AAAA,IACF,SAAS;AACP,YAAM,aAAoB,IAAI,OAAO;AACrC,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,sBACP,cACA,aACA,mBACe;AACf,QAAM,UAAU,aAAa,KAAK;AAClC,MAAI,YAAY,IAAI;AAClB,WAAO;AAAA,EACT;AAEA,MAAI,YAAY,KAAK,CAAC,UAAU,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,SAAS,CAAC,GAAG;AACtF,WAAO;AAAA,EACT;AACA,MAAI,YAAY,KAAK,CAAC,UAAU,MAAM,SAAS,SAAS,CAAC,GAAG;AAC1D,WAAO,YAAY,UAAU,YAAY,UAAU,UAAU;AAAA,EAC/D;AACA,MAAI,YAAY,KAAK,CAAC,UAAU,MAAM,SAAS,MAAM,CAAC,GAAG;AACvD,QAAI;AACF,aAAO,KAAK,UAAU,KAAK,MAAM,OAAO,CAAC;AAAA,IAC3C,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,YAAY,KAAK,CAAC,UAAU,MAAM,SAAS,WAAW,CAAC,GAAG;AAC5D,WAAO;AAAA,EACT;AACA,MAAI,kBAAkB,SAAS,KAAK,YAAY,KAAK,CAAC,UAAU,MAAM,SAAS,QAAQ,CAAC,GAAG;AACzF,WAAO,KAAK,UAAU,OAAO;AAAA,EAC/B;AAEA,SAAO,KAAK,UAAU,OAAO;AAC/B;AAEA,SAAS,mBAAmB,MAAsD;AAChF,UAAQ,MAAM;AAAA,IACZ,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,oBACP,YACA,SACA,WACA,UACA,aACA,aACA,iBAC8B;AAC9B,MAAI,cAAc,QAAQ,gBAAgB,QAAW;AACnD,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,cAA4C,CAAC;AACnD,QAAM,eAAe,aAAa,UAAU,OAAO,KAAK;AACxD,QAAM,kBAAkB,aAAa,aAAa,OAAO,KAAK;AAC9D,QAAM,yBAAyB;AAAA,IAC7B,GAAG,8BAA8B,QAAQ;AAAA,IACzC,GAAG,8BAA8B,WAAW;AAAA,EAC9C;AAEA,aAAW,OAAO,aAAa;AAC7B,UAAM,WAAW,6BAA6B,KAAK,eAAe;AAClE,QAAI,SAAS,kBAAkB,MAAM;AACnC;AAAA,IACF;AAEA,UAAM,SAAS,yBAAyB,GAAG;AAC3C,UAAM,qBAAqB;AAAA,MACzB,IAAI;AAAA,MACJ,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAEA,QAAI;AACF,YAAM,SAAS,6BAA6B;AAAA,QAC1C,SAAS,IAAI;AAAA,QACb;AAAA,QACA,UAAU;AAAA,QACV,aAAa;AAAA,QACb;AAAA,QACA,GAAI,WAAW,OAAO,CAAC,IAAI,EAAE,OAAO;AAAA,QACpC,GAAI,uBAAuB,OAAO,CAAC,IAAI,EAAE,mBAAmB;AAAA,QAC5D,GAAI,gBAAgB,eAAe,SAC/B,CAAC,IACD,EAAE,YAAY,gBAAgB,WAAW;AAAA,MAC/C,CAAC;AAED,iBAAW,cAAc,OAAO,aAAa;AAC3C,cAAM,OACJ,WAAW,QAAQ,WAAW,QAAQ,SAAS,gBAAgB,IAC3D,OAAO,SAAS,SACd,wBACA,kBACF,WAAW,QAAQ,SAAS,UAAU,IACpC,yBACA,WAAW,QAAQ,SAAS,aAAa,IACvC,0BACA;AACV,oBAAY,KAAK;AAAA,UACf;AAAA,UACA,SAAS,WAAW;AAAA,UACpB,OAAO,IAAI;AAAA,UACX,UAAU,mBAAmB,IAAI;AAAA,QACnC,CAAC;AAAA,MACH;AAAA,IACF,SAAS,OAAO;AACd,kBAAY,KAAK;AAAA,QACf,MAAM;AAAA,QACN,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC9D,OAAO,IAAI;AAAA,QACX,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,qBACP,MACA,YACA,SACA,YACwC;AACxC,QAAM,aAAa,8BAA8B,MAAM,UAAU;AACjE,MAAI,eAAe,MAAM;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,WAAW,KAAK,MAAM,WAAW,KAAK,WAAW,GAAG;AACxE,QAAM,SAAS,kBAAkB,aAAa;AAAA,IAC5C,QAAQ,WAAW;AAAA,IACnB,GAAI,eAAe,SAAY,CAAC,IAAI,EAAE,WAAW;AAAA,EACnD,CAAC;AACD,MAAI,OAAO,KAAK,WAAW,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,4BAA4B,IAAI;AAClD,QAAM,cAAc,eAAe,MAAM,OAAO;AAChD,QAAM,WAAW,YAAY,MAAM,OAAO;AAC1C,QAAM,kBAAiD;AAAA,IACrD;AAAA,IACA,GAAI,gBAAgB,SAAY,CAAC,IAAI,EAAE,YAAY;AAAA,IACnD,GAAI,cAAc,OAAO,CAAC,IAAI,EAAE,UAAU;AAAA,IAC1C,GAAI,eAAe,SAAY,CAAC,IAAI,EAAE,WAAW;AAAA,EACnD;AAEA,QAAM,OAAO,OAAO,KAAK;AAAA,IAAI,CAAC,QAC5B,0BAA0B,KAAK,6BAA6B,KAAK,eAAe,CAAC;AAAA,EACnF;AAEA,SAAO;AAAA,IACL,aAAa,YAAY,WAAW,KAAK,WAAW,GAAG;AAAA,IACvD,iBAAiB,YAAY,KAAK,SAAS,UAAU,GAAG,KAAK,OAAO,CAAC;AAAA,IACrE;AAAA,IACA,aAAa,aAAa,aAAa,OAAO;AAAA,IAC9C,UAAU,aAAa,UAAU,OAAO;AAAA,IACxC;AAAA,EACF;AACF;AAOO,SAAS,kCACd,YACA,SAC8B;AAC9B,QAAM,WAA8C,CAAC;AACrD,QAAM,cAA4C,CAAC;AAEnD,QAAM,QAAQ,CAAC,SAAwB;AACrC,UAAM,YAAY,4BAA4B,IAAI;AAClD,QAAI,cAAc,MAAM;AACtB,YAAM,WAAW,qBAAqB,MAAM,YAAY,QAAQ,SAAS,QAAQ,UAAU;AAC3F,UAAI,aAAa,MAAM;AACrB,iBAAS,KAAK,QAAQ;AAEtB,cAAM,cAAc,eAAe,MAAM,QAAQ,OAAO;AACxD,cAAM,WAAW,YAAY,MAAM,QAAQ,OAAO;AAClD,oBAAY;AAAA,UACV,GAAG;AAAA,YACD;AAAA,YACA,QAAQ;AAAA,YACR;AAAA,YACA;AAAA,YACA;AAAA,YACA,SAAS,KAAK,IAAI,CAAC,SAAS;AAAA,cAC1B,YAAY,IAAI;AAAA,cAChB,mBAAmB,IAAI;AAAA,cACvB,YAAY,IAAI;AAAA,cAChB,UAAU,IAAI;AAAA,cACd,aAAa,IAAI;AAAA,cACjB,aAAa,IAAI;AAAA,cACjB,WAAW,IAAI,QAAQ,aAAa;AAAA,cACpC,QACE,IAAI,WAAW,OACX,OACA;AAAA,gBACE,SAAS,IAAI,OAAO;AAAA,gBACpB,OAAO,IAAI,OAAO;AAAA,gBAClB,MAAM,IAAI,OAAO;AAAA,gBACjB,UAAU,IAAI,OAAO;AAAA,gBACrB,WAAW,IAAI,OAAO;AAAA,gBACtB,MAAM,IAAI,OAAO;AAAA,gBACjB,MAAM;AAAA,cACR;AAAA,cACN,cAAc,IAAI;AAAA,cAClB,cAAc,IAAI;AAAA,YACpB,EAAE;AAAA,YACF;AAAA,cACE,SAAS,QAAQ;AAAA,cACjB,GAAI,gBAAgB,SAAY,CAAC,IAAI,EAAE,YAAY;AAAA,cACnD;AAAA,cACA,GAAI,QAAQ,eAAe,SAAY,CAAC,IAAI,EAAE,YAAY,QAAQ,WAAW;AAAA,YAC/E;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAG,iBAAa,MAAM,KAAK;AAAA,EAC7B;AAEA,QAAM,UAAU;AAEhB,SAAO;AAAA,IACL,UAAU,WAAW;AAAA,IACrB,YAAY,wBAAwB,WAAW,IAAI;AAAA,IACnD,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AAAA,IACA;AAAA,EACF;AACF;;;AIhUA,uBAAiB;AAMV,SAAS,uBAAuB,eAA+B;AACpE,SAAO,wBAAwB,aAAa;AAC9C;AAMO,SAAS,qCAAqC,eAA+B;AAClF,SAAO,iBAAAC,QAAK,KAAK,eAAe,UAAU,YAAY,SAAS;AACjE;AAMO,SAAS,wBAAwB,eAA+B;AACrE,SAAO,iBAAAA,QAAK,KAAK,qCAAqC,aAAa,GAAG,eAAe;AACvF;","names":["path","import_core","path","parsed","import_core","path","inheritedConstraints","inheritedAnnotations","isStringArray","ts","ts","ts","path"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/tag-registry.ts","../src/semantic-protocol.ts","../src/workspace-runtime.ts"],"sourcesContent":["export * from \"./protocol.js\";\n","import {\n BUILTIN_CONSTRAINT_DEFINITIONS,\n normalizeConstraintTagName,\n type BuiltinConstraintName,\n} from \"@formspec/core\";\n\nexport type FormSpecValueKind =\n | \"number\"\n | \"integer\"\n | \"signedInteger\"\n | \"string\"\n | \"json\"\n | \"boolean\"\n | \"condition\";\n\nexport type FormSpecTargetKind = \"none\" | \"path\" | \"member\" | \"variant\";\nexport type FormSpecTagCategory = \"constraint\" | \"annotation\" | \"structure\" | \"ecosystem\";\n\nexport type FormSpecPlacement =\n | \"class\"\n | \"class-field\"\n | \"class-method\"\n | \"interface\"\n | \"interface-field\"\n | \"type-alias\"\n | \"type-alias-field\"\n | \"variable\"\n | \"function\"\n | \"function-parameter\"\n | \"method-parameter\";\n\nexport type SemanticCapability =\n | \"numeric-comparable\"\n | \"string-like\"\n | \"array-like\"\n | \"enum-member-addressable\"\n | \"json-like\"\n | \"condition-like\"\n | \"object-like\";\n\nexport interface TagSignatureParameter {\n readonly kind: \"value\" | \"target-path\" | \"target-member\" | \"target-variant\";\n readonly label: string;\n readonly optional?: boolean;\n readonly capability?: SemanticCapability;\n readonly valueKind?: FormSpecValueKind;\n}\n\nexport interface TagSignature {\n readonly label: string;\n readonly placements: readonly FormSpecPlacement[];\n readonly parameters: readonly TagSignatureParameter[];\n}\n\nexport interface TagDefinition {\n readonly canonicalName: string;\n readonly valueKind: FormSpecValueKind | null;\n readonly requiresArgument: boolean;\n readonly supportedTargets: readonly FormSpecTargetKind[];\n readonly allowDuplicates: boolean;\n readonly category: FormSpecTagCategory;\n readonly placements: readonly FormSpecPlacement[];\n readonly capabilities: readonly SemanticCapability[];\n readonly completionDetail: string;\n readonly hoverMarkdown: string;\n readonly signatures: readonly TagSignature[];\n}\n\nexport type FormSpecTagDefinition = TagDefinition;\nexport type FormSpecTagOverload = TagSignature;\nexport type FormSpecTagParameter = TagSignatureParameter;\n\nexport interface ExtensionConstraintTagSource {\n readonly tagName: string;\n}\n\nexport interface ExtensionTagSource {\n readonly extensionId: string;\n readonly constraintTags?: readonly ExtensionConstraintTagSource[];\n}\n\nexport const FORM_SPEC_PLACEMENTS = [\n \"class\",\n \"class-field\",\n \"class-method\",\n \"interface\",\n \"interface-field\",\n \"type-alias\",\n \"type-alias-field\",\n \"variable\",\n \"function\",\n \"function-parameter\",\n \"method-parameter\",\n] as const satisfies readonly FormSpecPlacement[];\n\nexport const FORM_SPEC_TARGET_KINDS = [\n \"none\",\n \"path\",\n \"member\",\n \"variant\",\n] as const satisfies readonly FormSpecTargetKind[];\n\nconst FIELD_PLACEMENTS = [\n \"class-field\",\n \"interface-field\",\n \"type-alias-field\",\n \"variable\",\n \"function-parameter\",\n \"method-parameter\",\n] as const satisfies readonly FormSpecPlacement[];\n\nconst TYPE_PLACEMENTS = [\n \"class\",\n \"interface\",\n \"type-alias\",\n] as const satisfies readonly FormSpecPlacement[];\n\nconst DECLARATION_PLACEMENTS = [\n \"class-method\",\n \"function\",\n] as const satisfies readonly FormSpecPlacement[];\n\nconst ALL_PLACEMENTS = [\n ...TYPE_PLACEMENTS,\n ...FIELD_PLACEMENTS,\n ...DECLARATION_PLACEMENTS,\n] as const satisfies readonly FormSpecPlacement[];\n\nconst INTEGER_VALUE_TAGS = new Set([\"minLength\", \"maxLength\", \"minItems\", \"maxItems\"]);\nconst SIGNED_INTEGER_VALUE_TAGS = new Set([\"order\"]);\nconst JSON_VALUE_TAGS = new Set([\"const\", \"enumOptions\"]);\nconst BOOLEAN_VALUE_TAGS = new Set([\"uniqueItems\"]);\nconst STRING_VALUE_TAGS = new Set([\n \"pattern\",\n \"displayName\",\n \"description\",\n \"format\",\n \"placeholder\",\n \"group\",\n \"example\",\n \"remarks\",\n \"see\",\n \"apiName\",\n]);\nconst CONDITION_VALUE_TAGS = new Set([\"showWhen\", \"hideWhen\", \"enableWhen\", \"disableWhen\"]);\n\nconst CONSTRAINT_COMPLETION_DETAIL: Record<string, string> = {\n minimum: \"Minimum numeric value (inclusive). Example: `@minimum 0`\",\n maximum: \"Maximum numeric value (inclusive). Example: `@maximum 100`\",\n exclusiveMinimum: \"Minimum numeric value (exclusive). Example: `@exclusiveMinimum 0`\",\n exclusiveMaximum: \"Maximum numeric value (exclusive). Example: `@exclusiveMaximum 100`\",\n multipleOf: \"Value must be a multiple of this number. Example: `@multipleOf 0.01`\",\n minLength: \"Minimum string length. Example: `@minLength 1`\",\n maxLength: \"Maximum string length. Example: `@maxLength 255`\",\n minItems: \"Minimum number of array items. Example: `@minItems 1`\",\n maxItems: \"Maximum number of array items. Example: `@maxItems 10`\",\n uniqueItems: \"Require all array items to be distinct. Example: `@uniqueItems`\",\n pattern: \"Regular expression pattern for string validation. Example: `@pattern ^[a-z]+$`\",\n enumOptions: 'Inline JSON array of allowed enum values. Example: `@enumOptions [\"a\",\"b\",\"c\"]`',\n const: 'Require a constant JSON value. Example: `@const \"USD\"`',\n};\n\nconst CONSTRAINT_HOVER_DOCS: Record<string, string> = {\n minimum: [\n \"**@minimum** `<number>`\",\n \"\",\n \"Sets an inclusive lower bound on a numeric field.\",\n \"\",\n \"Maps to `minimum` in JSON Schema.\",\n \"\",\n \"**Signature:** `@minimum [:path] <number>`\",\n ].join(\"\\n\"),\n maximum: [\n \"**@maximum** `<number>`\",\n \"\",\n \"Sets an inclusive upper bound on a numeric field.\",\n \"\",\n \"Maps to `maximum` in JSON Schema.\",\n \"\",\n \"**Signature:** `@maximum [:path] <number>`\",\n ].join(\"\\n\"),\n exclusiveMinimum: [\n \"**@exclusiveMinimum** `<number>`\",\n \"\",\n \"Sets an exclusive lower bound on a numeric field.\",\n \"\",\n \"Maps to `exclusiveMinimum` in JSON Schema.\",\n \"\",\n \"**Signature:** `@exclusiveMinimum [:path] <number>`\",\n ].join(\"\\n\"),\n exclusiveMaximum: [\n \"**@exclusiveMaximum** `<number>`\",\n \"\",\n \"Sets an exclusive upper bound on a numeric field.\",\n \"\",\n \"Maps to `exclusiveMaximum` in JSON Schema.\",\n \"\",\n \"**Signature:** `@exclusiveMaximum [:path] <number>`\",\n ].join(\"\\n\"),\n multipleOf: [\n \"**@multipleOf** `<number>`\",\n \"\",\n \"Requires the numeric value to be a multiple of the given number.\",\n \"\",\n \"Maps to `multipleOf` in JSON Schema.\",\n \"\",\n \"**Signature:** `@multipleOf [:path] <number>`\",\n ].join(\"\\n\"),\n minLength: [\n \"**@minLength** `<integer>`\",\n \"\",\n \"Sets a minimum character length on a string field.\",\n \"\",\n \"Maps to `minLength` in JSON Schema.\",\n \"\",\n \"**Signature:** `@minLength [:path] <integer>`\",\n ].join(\"\\n\"),\n maxLength: [\n \"**@maxLength** `<integer>`\",\n \"\",\n \"Sets a maximum character length on a string field.\",\n \"\",\n \"Maps to `maxLength` in JSON Schema.\",\n \"\",\n \"**Signature:** `@maxLength [:path] <integer>`\",\n ].join(\"\\n\"),\n minItems: [\n \"**@minItems** `<integer>`\",\n \"\",\n \"Sets a minimum number of items in an array field.\",\n \"\",\n \"Maps to `minItems` in JSON Schema.\",\n \"\",\n \"**Signature:** `@minItems [:path] <integer>`\",\n ].join(\"\\n\"),\n maxItems: [\n \"**@maxItems** `<integer>`\",\n \"\",\n \"Sets a maximum number of items in an array field.\",\n \"\",\n \"Maps to `maxItems` in JSON Schema.\",\n \"\",\n \"**Signature:** `@maxItems [:path] <integer>`\",\n ].join(\"\\n\"),\n uniqueItems: [\n \"**@uniqueItems**\",\n \"\",\n \"Requires all items in an array field to be distinct.\",\n \"\",\n \"Maps to `uniqueItems` in JSON Schema.\",\n \"\",\n \"**Signature:** `@uniqueItems [:path]`\",\n ].join(\"\\n\"),\n pattern: [\n \"**@pattern** `<regex>`\",\n \"\",\n \"Sets a regular expression pattern that a string field must match.\",\n \"\",\n \"Maps to `pattern` in JSON Schema.\",\n \"\",\n \"**Signature:** `@pattern [:path] <regex>`\",\n ].join(\"\\n\"),\n enumOptions: [\n \"**@enumOptions** `<json-array>`\",\n \"\",\n \"Specifies the allowed values for an enum field as an inline JSON array.\",\n \"\",\n \"Maps to `enum` in JSON Schema.\",\n \"\",\n \"**Signature:** `@enumOptions <json-array>`\",\n ].join(\"\\n\"),\n const: [\n \"**@const** `<json-literal>`\",\n \"\",\n \"Requires the field value to equal a single constant JSON value.\",\n \"\",\n \"Maps to `const` in JSON Schema.\",\n \"\",\n \"**Signature:** `@const [:path] <json-literal>`\",\n ].join(\"\\n\"),\n};\n\ntype SupportedSignatureTarget = Exclude<FormSpecTargetKind, \"none\">;\n\ninterface ExtraTagSpec {\n readonly requiresArgument: boolean;\n readonly supportedTargets: readonly FormSpecTargetKind[];\n readonly allowDuplicates: boolean;\n readonly category: FormSpecTagCategory;\n readonly placements: readonly FormSpecPlacement[];\n readonly completionDetail: string;\n readonly hoverSummary: string;\n readonly valueKind?: FormSpecValueKind | null;\n readonly valueLabel?: string;\n readonly targetPlacements?: Partial<\n Record<SupportedSignatureTarget, readonly FormSpecPlacement[]>\n >;\n}\n\nfunction inferValueKind(name: string): FormSpecValueKind | null {\n if (INTEGER_VALUE_TAGS.has(name)) return \"integer\";\n if (SIGNED_INTEGER_VALUE_TAGS.has(name)) return \"signedInteger\";\n if (JSON_VALUE_TAGS.has(name)) return \"json\";\n if (BOOLEAN_VALUE_TAGS.has(name)) return \"boolean\";\n if (STRING_VALUE_TAGS.has(name)) return \"string\";\n if (CONDITION_VALUE_TAGS.has(name)) return \"condition\";\n return null;\n}\n\nfunction getBuiltinValueKind(name: BuiltinConstraintName): FormSpecValueKind {\n return inferValueKind(name) ?? \"number\";\n}\n\nfunction getBuiltinConstraintCapability(name: BuiltinConstraintName): SemanticCapability {\n switch (name) {\n case \"minimum\":\n case \"maximum\":\n case \"exclusiveMinimum\":\n case \"exclusiveMaximum\":\n case \"multipleOf\":\n return \"numeric-comparable\";\n case \"minLength\":\n case \"maxLength\":\n case \"pattern\":\n return \"string-like\";\n case \"minItems\":\n case \"maxItems\":\n case \"uniqueItems\":\n return \"array-like\";\n case \"enumOptions\":\n return \"enum-member-addressable\";\n case \"const\":\n return \"json-like\";\n default: {\n const exhaustive: never = name;\n return exhaustive;\n }\n }\n}\n\nfunction capabilitiesForValueKind(\n valueKind: FormSpecValueKind | null\n): readonly SemanticCapability[] {\n switch (valueKind) {\n case \"number\":\n case \"integer\":\n case \"signedInteger\":\n return [\"numeric-comparable\"];\n case \"string\":\n return [\"string-like\"];\n case \"json\":\n return [\"json-like\"];\n case \"condition\":\n return [\"condition-like\"];\n case \"boolean\":\n case null:\n return [];\n default: {\n const exhaustive: never = valueKind;\n return exhaustive;\n }\n }\n}\n\nfunction valueLabelForKind(valueKind: FormSpecValueKind | null, fallback = \"<value>\"): string {\n switch (valueKind) {\n case \"number\":\n return \"<number>\";\n case \"integer\":\n case \"signedInteger\":\n return \"<integer>\";\n case \"string\":\n return \"<text>\";\n case \"json\":\n return \"<json>\";\n case \"condition\":\n return \"<condition>\";\n case \"boolean\":\n case null:\n return \"\";\n default: {\n const exhaustive: never = valueKind;\n void exhaustive;\n return fallback;\n }\n }\n}\n\nfunction targetLabelForKind(kind: SupportedSignatureTarget): string {\n switch (kind) {\n case \"path\":\n return \"[:path]\";\n case \"member\":\n return \":member\";\n case \"variant\":\n return \":variant\";\n default: {\n const exhaustive: never = kind;\n return exhaustive;\n }\n }\n}\n\nfunction parameterKindForTarget(\n targetKind: SupportedSignatureTarget\n): TagSignatureParameter[\"kind\"] {\n switch (targetKind) {\n case \"path\":\n return \"target-path\";\n case \"member\":\n return \"target-member\";\n case \"variant\":\n return \"target-variant\";\n default: {\n const exhaustive: never = targetKind;\n return exhaustive;\n }\n }\n}\n\nfunction createTargetParameter(\n targetKind: SupportedSignatureTarget,\n valueKind: FormSpecValueKind | null,\n pathCapability?: SemanticCapability\n): TagSignatureParameter {\n const base: TagSignatureParameter = {\n kind: parameterKindForTarget(targetKind),\n label: targetLabelForKind(targetKind),\n optional: targetKind === \"path\",\n };\n\n if (targetKind === \"path\") {\n const capability = pathCapability ?? capabilitiesForValueKind(valueKind)[0];\n return capability === undefined ? base : { ...base, capability };\n }\n\n if (targetKind === \"member\") {\n return { ...base, capability: \"enum-member-addressable\" };\n }\n\n return base;\n}\n\nfunction createSignature(\n name: string,\n placements: readonly FormSpecPlacement[],\n targetKind: SupportedSignatureTarget | null,\n valueKind: FormSpecValueKind | null,\n valueLabel: string,\n pathCapability?: SemanticCapability\n): TagSignature {\n const parameters: TagSignatureParameter[] = [];\n\n if (targetKind !== null) {\n parameters.push(createTargetParameter(targetKind, valueKind, pathCapability));\n }\n if (valueLabel !== \"\") {\n parameters.push(\n valueKind === null\n ? {\n kind: \"value\",\n label: valueLabel,\n }\n : {\n kind: \"value\",\n label: valueLabel,\n valueKind,\n }\n );\n }\n\n const targetLabel = targetKind === null ? \"\" : ` ${targetLabelForKind(targetKind)}`;\n const valueLabelSuffix = valueLabel === \"\" ? \"\" : ` ${valueLabel}`;\n\n return {\n label: `@${name}${targetLabel}${valueLabelSuffix}`,\n placements,\n parameters,\n };\n}\n\nfunction buildHoverMarkdown(\n name: string,\n hoverSummary: string,\n signatures: readonly TagSignature[],\n valueLabel: string\n): string {\n const header = valueLabel === \"\" ? `**@${name}**` : `**@${name}** \\`${valueLabel}\\``;\n const signatureLines =\n signatures.length === 1\n ? [`**Signature:** \\`${signatures[0]?.label ?? `@${name}`}\\``]\n : [\"**Signatures:**\", ...signatures.map((signature) => `- \\`${signature.label}\\``)];\n\n return [header, \"\", hoverSummary, \"\", ...signatureLines].join(\"\\n\");\n}\n\nfunction makeConstraintSignatures(name: BuiltinConstraintName): readonly TagSignature[] {\n const valueKind = getBuiltinValueKind(name);\n const subjectCapability = getBuiltinConstraintCapability(name);\n const valueLabel =\n name === \"pattern\"\n ? \"<regex>\"\n : name === \"enumOptions\"\n ? \"<json-array>\"\n : name === \"const\"\n ? \"<json-literal>\"\n : valueLabelForKind(valueKind);\n\n return [\n createSignature(name, FIELD_PLACEMENTS, null, valueKind, valueLabel),\n createSignature(name, FIELD_PLACEMENTS, \"path\", valueKind, valueLabel, subjectCapability),\n ];\n}\n\nconst BUILTIN_TAG_DEFINITIONS = Object.fromEntries(\n (Object.keys(BUILTIN_CONSTRAINT_DEFINITIONS) as BuiltinConstraintName[]).map((name) => {\n const valueKind = getBuiltinValueKind(name);\n const subjectCapability = getBuiltinConstraintCapability(name);\n return [\n name,\n {\n canonicalName: name,\n valueKind,\n requiresArgument: valueKind !== \"boolean\",\n supportedTargets: [\"none\", \"path\"] as const,\n allowDuplicates: false,\n category: \"constraint\" as const,\n placements: FIELD_PLACEMENTS,\n capabilities: [subjectCapability],\n completionDetail: CONSTRAINT_COMPLETION_DETAIL[name] ?? `@${name}`,\n hoverMarkdown: CONSTRAINT_HOVER_DOCS[name] ?? `**@${name}**`,\n signatures: makeConstraintSignatures(name),\n } satisfies TagDefinition,\n ];\n })\n) as Record<string, TagDefinition>;\n\nconst EXTRA_TAG_SPECS = {\n displayName: {\n requiresArgument: true,\n supportedTargets: [\"none\", \"member\", \"variant\"],\n allowDuplicates: false,\n category: \"annotation\",\n placements: [...TYPE_PLACEMENTS, ...FIELD_PLACEMENTS],\n completionDetail: \"Display label for a type, field, or enum member.\",\n hoverSummary: \"Provides a user-facing display label.\",\n valueLabel: \"<label>\",\n targetPlacements: {\n member: FIELD_PLACEMENTS,\n variant: TYPE_PLACEMENTS,\n },\n },\n description: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: false,\n category: \"annotation\",\n placements: [...TYPE_PLACEMENTS, ...FIELD_PLACEMENTS],\n completionDetail: \"Description text for a type or field.\",\n hoverSummary: \"Provides descriptive documentation for a type or field.\",\n },\n format: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: false,\n category: \"annotation\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Format hint for a field.\",\n hoverSummary: \"Provides a format hint for a field.\",\n valueLabel: \"<format>\",\n },\n placeholder: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: false,\n category: \"annotation\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Placeholder text for a field.\",\n hoverSummary: \"Provides placeholder text for a field.\",\n },\n order: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: false,\n category: \"annotation\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Field display order hint.\",\n hoverSummary: \"Provides an integer ordering hint for UI layout.\",\n },\n apiName: {\n requiresArgument: true,\n supportedTargets: [\"none\", \"member\", \"variant\"],\n allowDuplicates: false,\n category: \"annotation\",\n placements: [...TYPE_PLACEMENTS, ...FIELD_PLACEMENTS],\n completionDetail: \"API-facing serialized name for a type, field, or variant.\",\n hoverSummary: \"Overrides the serialized API name used in generated schema output.\",\n valueLabel: \"<identifier>\",\n targetPlacements: {\n member: FIELD_PLACEMENTS,\n variant: TYPE_PLACEMENTS,\n },\n },\n group: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: false,\n category: \"structure\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Assigns a field to a UI group.\",\n hoverSummary: \"Assigns the field to a named grouping container.\",\n valueLabel: \"<group>\",\n },\n showWhen: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: true,\n category: \"structure\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Conditional visibility rule.\",\n hoverSummary: \"Shows the field only when the condition is satisfied.\",\n },\n hideWhen: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: true,\n category: \"structure\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Conditional visibility suppression rule.\",\n hoverSummary: \"Hides the field when the condition is satisfied.\",\n },\n enableWhen: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: true,\n category: \"structure\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Conditional interactivity rule.\",\n hoverSummary: \"Enables the field only when the condition is satisfied.\",\n },\n disableWhen: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: true,\n category: \"structure\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Conditional disablement rule.\",\n hoverSummary: \"Disables the field when the condition is satisfied.\",\n },\n defaultValue: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: false,\n category: \"ecosystem\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Default JSON value for a field.\",\n hoverSummary: \"Provides a default JSON value for ecosystem integrations.\",\n valueLabel: \"<value>\",\n },\n deprecated: {\n requiresArgument: false,\n supportedTargets: [\"none\"],\n allowDuplicates: false,\n category: \"ecosystem\",\n placements: ALL_PLACEMENTS,\n completionDetail: \"Marks a declaration as deprecated.\",\n hoverSummary: \"Marks the declaration as deprecated.\",\n },\n example: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: true,\n category: \"ecosystem\",\n placements: [...TYPE_PLACEMENTS, ...FIELD_PLACEMENTS],\n completionDetail: \"Example serialized value.\",\n hoverSummary: \"Provides an example value for documentation and tooling.\",\n },\n remarks: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: false,\n category: \"ecosystem\",\n placements: ALL_PLACEMENTS,\n completionDetail: \"Additional remarks text.\",\n hoverSummary: \"Provides additional remarks for the declaration.\",\n },\n see: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: true,\n category: \"ecosystem\",\n placements: ALL_PLACEMENTS,\n completionDetail: \"Reference to related documentation.\",\n hoverSummary: \"References related documentation or declarations.\",\n valueLabel: \"<reference>\",\n },\n} as const satisfies Record<string, ExtraTagSpec>;\n\nfunction buildExtraTagDefinition(canonicalName: string, spec: ExtraTagSpec): TagDefinition {\n const valueKind = spec.valueKind ?? inferValueKind(canonicalName);\n const valueLabel = spec.requiresArgument ? (spec.valueLabel ?? valueLabelForKind(valueKind)) : \"\";\n const signatures: TagSignature[] = [];\n\n if (spec.supportedTargets.includes(\"none\")) {\n signatures.push(createSignature(canonicalName, spec.placements, null, valueKind, valueLabel));\n }\n if (spec.supportedTargets.includes(\"path\")) {\n signatures.push(\n createSignature(\n canonicalName,\n spec.targetPlacements?.path ?? spec.placements,\n \"path\",\n valueKind,\n valueLabel\n )\n );\n }\n if (spec.supportedTargets.includes(\"member\")) {\n signatures.push(\n createSignature(\n canonicalName,\n spec.targetPlacements?.member ?? spec.placements,\n \"member\",\n valueKind,\n valueLabel\n )\n );\n }\n if (spec.supportedTargets.includes(\"variant\")) {\n signatures.push(\n createSignature(\n canonicalName,\n spec.targetPlacements?.variant ?? spec.placements,\n \"variant\",\n valueKind,\n valueLabel\n )\n );\n }\n\n return {\n canonicalName,\n valueKind,\n requiresArgument: spec.requiresArgument,\n supportedTargets: spec.supportedTargets,\n allowDuplicates: spec.allowDuplicates,\n category: spec.category,\n placements: spec.placements,\n capabilities: capabilitiesForValueKind(valueKind),\n completionDetail: spec.completionDetail,\n hoverMarkdown: buildHoverMarkdown(canonicalName, spec.hoverSummary, signatures, valueLabel),\n signatures,\n };\n}\n\nconst EXTRA_TAG_DEFINITIONS: Record<string, TagDefinition> = Object.fromEntries(\n Object.entries(EXTRA_TAG_SPECS).map(([canonicalName, spec]) => [\n canonicalName,\n buildExtraTagDefinition(canonicalName, spec),\n ])\n);\n\nexport function normalizeFormSpecTagName(rawName: string): string {\n return normalizeConstraintTagName(rawName);\n}\n\nexport function getTagDefinition(\n rawName: string,\n extensions?: readonly ExtensionTagSource[]\n): TagDefinition | null {\n const normalized = normalizeFormSpecTagName(rawName);\n const builtin = BUILTIN_TAG_DEFINITIONS[normalized];\n if (builtin !== undefined) {\n return builtin;\n }\n\n const extra = EXTRA_TAG_DEFINITIONS[normalized];\n if (extra !== undefined) {\n return extra;\n }\n\n const extensionRegistration = getExtensionConstraintTags(extensions).find(\n (tag) => tag.tagName === normalized\n );\n\n if (extensionRegistration === undefined) {\n return null;\n }\n\n return {\n canonicalName: extensionRegistration.tagName,\n valueKind: null,\n requiresArgument: true,\n supportedTargets: [\"none\"] as const,\n allowDuplicates: true,\n category: \"constraint\",\n placements: FIELD_PLACEMENTS,\n capabilities: [],\n completionDetail: `Extension constraint tag from ${extensionRegistration.extensionId}`,\n hoverMarkdown: [\n `**@${extensionRegistration.tagName}** \\`<value>\\``,\n \"\",\n `Extension-defined constraint tag from \\`${extensionRegistration.extensionId}\\`.`,\n \"\",\n `**Signature:** \\`@${extensionRegistration.tagName} <value>\\``,\n ].join(\"\\n\"),\n signatures: [\n {\n label: `@${extensionRegistration.tagName} <value>`,\n placements: FIELD_PLACEMENTS,\n parameters: [{ kind: \"value\", label: \"<value>\" }],\n },\n ],\n };\n}\n\nexport function getConstraintTagDefinitions(\n extensions?: readonly ExtensionTagSource[]\n): readonly TagDefinition[] {\n const builtins = Object.values(BUILTIN_TAG_DEFINITIONS);\n const custom = getExtensionConstraintTags(extensions)\n .map((tag) => getTagDefinition(tag.tagName, extensions))\n .filter((tag): tag is TagDefinition => tag !== null);\n return [...builtins, ...custom];\n}\n\nexport function getAllTagDefinitions(\n extensions?: readonly ExtensionTagSource[]\n): readonly TagDefinition[] {\n const builtins = Object.values(BUILTIN_TAG_DEFINITIONS);\n const extras = Object.values(EXTRA_TAG_DEFINITIONS);\n const custom = getExtensionConstraintTags(extensions)\n .map((tag) => getTagDefinition(tag.tagName, extensions))\n .filter((tag): tag is TagDefinition => tag !== null);\n return [...builtins, ...extras, ...custom];\n}\n\nexport function getTagHoverMarkdown(\n rawName: string,\n extensions?: readonly ExtensionTagSource[]\n): string | null {\n return getTagDefinition(rawName, extensions)?.hoverMarkdown ?? null;\n}\n\nfunction getExtensionConstraintTags(\n extensions: readonly ExtensionTagSource[] | undefined\n): readonly { extensionId: string; tagName: string }[] {\n return (\n extensions?.flatMap((extension) => {\n const tagRecords = extension.constraintTags ?? [];\n return tagRecords.map((tag) => ({\n extensionId: extension.extensionId,\n tagName: tag.tagName,\n }));\n }) ?? []\n );\n}\n","import type {\n CommentSpan,\n ParsedCommentTag,\n ParsedCommentTargetSpecifier,\n} from \"./comment-syntax.js\";\nimport type {\n CommentHoverInfo,\n CommentTagSemanticContext,\n SemanticCommentCompletionContext,\n} from \"./cursor-context.js\";\nimport {\n FORM_SPEC_PLACEMENTS,\n FORM_SPEC_TARGET_KINDS,\n type FormSpecPlacement,\n type FormSpecTargetKind,\n} from \"./tag-registry.js\";\n\n/** @public */\nexport const FORMSPEC_ANALYSIS_PROTOCOL_VERSION = 1;\n/** @public */\nexport const FORMSPEC_ANALYSIS_SCHEMA_VERSION = 1;\n\n/**\n * Cross-process endpoint used by the language server to reach the semantic\n * tsserver plugin on the current workspace host.\n *\n * @public\n */\nexport interface FormSpecIpcEndpoint {\n readonly kind: \"unix-socket\" | \"windows-pipe\";\n readonly address: string;\n}\n\n/**\n * Discovery record written by the tsserver plugin so other FormSpec tooling\n * can locate and validate the matching semantic service for a workspace.\n *\n * @public\n */\nexport interface FormSpecAnalysisManifest {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly analysisSchemaVersion: typeof FORMSPEC_ANALYSIS_SCHEMA_VERSION;\n readonly workspaceRoot: string;\n readonly workspaceId: string;\n readonly endpoint: FormSpecIpcEndpoint;\n readonly typescriptVersion: string;\n readonly extensionFingerprint: string;\n readonly generation: number;\n readonly updatedAt: string;\n}\n\n/**\n * Serializable subset of tag metadata needed by hover and completion UIs.\n *\n * @public\n */\nexport interface FormSpecSerializedTagDefinition {\n readonly canonicalName: string;\n readonly completionDetail: string;\n readonly hoverMarkdown: string;\n}\n\n/**\n * Serializable overload/signature summary for one comment tag form.\n *\n * @public\n */\nexport interface FormSpecSerializedTagSignature {\n readonly label: string;\n readonly placements: readonly FormSpecPlacement[];\n}\n\n/**\n * Serialized representation of a parsed target specifier with exact spans.\n *\n * @public\n */\nexport interface FormSpecSerializedCommentTargetSpecifier {\n readonly rawText: string;\n readonly valid: boolean;\n readonly kind: ParsedCommentTargetSpecifier[\"kind\"];\n readonly fullSpan: CommentSpan;\n readonly colonSpan: CommentSpan;\n readonly span: CommentSpan;\n}\n\n/**\n * Semantic facts about one parsed tag, reduced to JSON-safe data for IPC.\n *\n * @public\n */\nexport interface FormSpecSerializedTagSemanticContext {\n readonly tagName: string;\n readonly tagDefinition: FormSpecSerializedTagDefinition | null;\n readonly placement: FormSpecPlacement | null;\n readonly supportedTargets: readonly FormSpecTargetKind[];\n readonly targetCompletions: readonly string[];\n readonly compatiblePathTargets: readonly string[];\n readonly valueLabels: readonly string[];\n readonly signatures: readonly FormSpecSerializedTagSignature[];\n readonly tagHoverMarkdown: string | null;\n readonly targetHoverMarkdown: string | null;\n readonly argumentHoverMarkdown: string | null;\n}\n\n/**\n * Cursor-scoped completion context serialized for transport between the\n * semantic tsserver plugin and the lightweight LSP.\n *\n * @public\n */\nexport type FormSpecSerializedCompletionContext =\n | {\n readonly kind: \"tag-name\";\n readonly prefix: string;\n readonly availableTags: readonly FormSpecSerializedTagDefinition[];\n }\n | {\n readonly kind: \"target\";\n readonly semantic: FormSpecSerializedTagSemanticContext;\n }\n | {\n readonly kind: \"argument\";\n readonly semantic: FormSpecSerializedTagSemanticContext;\n readonly valueLabels: readonly string[];\n }\n | {\n readonly kind: \"none\";\n };\n\n/**\n * Hover payload for a single comment token under the cursor.\n *\n * @public\n */\nexport interface FormSpecSerializedHoverInfo {\n readonly kind: CommentHoverInfo[\"kind\"];\n readonly markdown: string;\n}\n\n/**\n * File-local diagnostic derived from comment parsing or semantic analysis.\n *\n * @public\n */\nexport interface FormSpecAnalysisDiagnostic {\n readonly code: string;\n readonly message: string;\n readonly range: CommentSpan;\n readonly severity: \"error\" | \"warning\" | \"info\";\n}\n\n/**\n * Serializable view of a single parsed FormSpec tag within a doc comment.\n *\n * @public\n */\nexport interface FormSpecAnalysisTagSnapshot {\n readonly rawTagName: string;\n readonly normalizedTagName: string;\n readonly recognized: boolean;\n readonly fullSpan: CommentSpan;\n readonly tagNameSpan: CommentSpan;\n readonly payloadSpan: CommentSpan | null;\n readonly target: FormSpecSerializedCommentTargetSpecifier | null;\n readonly argumentSpan: CommentSpan | null;\n readonly argumentText: string;\n readonly semantic: FormSpecSerializedTagSemanticContext;\n}\n\n/**\n * Serializable view of one declaration-attached doc comment in a source file.\n *\n * @public\n */\nexport interface FormSpecAnalysisCommentSnapshot {\n readonly commentSpan: CommentSpan;\n readonly declarationSpan: CommentSpan;\n readonly placement: FormSpecPlacement | null;\n readonly subjectType: string | null;\n readonly hostType: string | null;\n readonly tags: readonly FormSpecAnalysisTagSnapshot[];\n}\n\n/**\n * Serializable analysis artifact for a single source file.\n *\n * @public\n */\nexport interface FormSpecAnalysisFileSnapshot {\n readonly filePath: string;\n readonly sourceHash: string;\n readonly generatedAt: string;\n readonly comments: readonly FormSpecAnalysisCommentSnapshot[];\n readonly diagnostics: readonly FormSpecAnalysisDiagnostic[];\n}\n\n/**\n * Query variants supported by the semantic tsserver plugin.\n *\n * @public\n */\nexport type FormSpecSemanticQuery =\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"health\";\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"completion\";\n readonly filePath: string;\n readonly offset: number;\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"hover\";\n readonly filePath: string;\n readonly offset: number;\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"diagnostics\";\n readonly filePath: string;\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"file-snapshot\";\n readonly filePath: string;\n };\n\n/**\n * Response variants returned by the semantic tsserver plugin.\n *\n * @public\n */\nexport type FormSpecSemanticResponse =\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"health\";\n readonly manifest: FormSpecAnalysisManifest;\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"completion\";\n readonly sourceHash: string;\n readonly context: FormSpecSerializedCompletionContext;\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"hover\";\n readonly sourceHash: string;\n readonly hover: FormSpecSerializedHoverInfo | null;\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"diagnostics\";\n readonly sourceHash: string;\n readonly diagnostics: readonly FormSpecAnalysisDiagnostic[];\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"file-snapshot\";\n readonly snapshot: FormSpecAnalysisFileSnapshot | null;\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"error\";\n readonly error: string;\n };\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isCommentSpan(value: unknown): value is CommentSpan {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<CommentSpan>;\n return typeof candidate.start === \"number\" && typeof candidate.end === \"number\";\n}\n\nfunction isStringArray(value: unknown): value is readonly string[] {\n return Array.isArray(value) && value.every((entry) => typeof entry === \"string\");\n}\n\nconst FORM_SPEC_PLACEMENT_VALUES = new Set<FormSpecPlacement>(FORM_SPEC_PLACEMENTS);\n\nconst FORM_SPEC_TARGET_KIND_VALUES = new Set<FormSpecTargetKind>(FORM_SPEC_TARGET_KINDS);\n\nfunction isPlacementValue(value: unknown): value is FormSpecPlacement {\n return typeof value === \"string\" && FORM_SPEC_PLACEMENT_VALUES.has(value as FormSpecPlacement);\n}\n\nfunction isTargetKindValue(value: unknown): value is FormSpecTargetKind {\n return typeof value === \"string\" && FORM_SPEC_TARGET_KIND_VALUES.has(value as FormSpecTargetKind);\n}\n\nfunction isPlacementArray(value: unknown): value is readonly FormSpecPlacement[] {\n return Array.isArray(value) && value.every(isPlacementValue);\n}\n\nfunction isTargetKindArray(value: unknown): value is readonly FormSpecTargetKind[] {\n return Array.isArray(value) && value.every(isTargetKindValue);\n}\n\nfunction isIpcEndpoint(value: unknown): value is FormSpecIpcEndpoint {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecIpcEndpoint>;\n return (\n (candidate.kind === \"unix-socket\" || candidate.kind === \"windows-pipe\") &&\n typeof candidate.address === \"string\"\n );\n}\n\nfunction isSerializedTagDefinition(value: unknown): value is FormSpecSerializedTagDefinition {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecSerializedTagDefinition>;\n return (\n typeof candidate.canonicalName === \"string\" &&\n typeof candidate.completionDetail === \"string\" &&\n typeof candidate.hoverMarkdown === \"string\"\n );\n}\n\nfunction isSerializedTagSignature(value: unknown): value is FormSpecSerializedTagSignature {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecSerializedTagSignature>;\n return typeof candidate.label === \"string\" && isPlacementArray(candidate.placements);\n}\n\nfunction isSerializedCommentTargetSpecifier(\n value: unknown\n): value is FormSpecSerializedCommentTargetSpecifier {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecSerializedCommentTargetSpecifier>;\n return (\n typeof candidate.rawText === \"string\" &&\n typeof candidate.valid === \"boolean\" &&\n typeof candidate.kind === \"string\" &&\n isCommentSpan(candidate.fullSpan) &&\n isCommentSpan(candidate.colonSpan) &&\n isCommentSpan(candidate.span)\n );\n}\n\nfunction isSerializedTagSemanticContext(\n value: unknown\n): value is FormSpecSerializedTagSemanticContext {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecSerializedTagSemanticContext>;\n return (\n typeof candidate.tagName === \"string\" &&\n (candidate.tagDefinition === null || isSerializedTagDefinition(candidate.tagDefinition)) &&\n (candidate.placement === null || isPlacementValue(candidate.placement)) &&\n isTargetKindArray(candidate.supportedTargets) &&\n isStringArray(candidate.targetCompletions) &&\n isStringArray(candidate.compatiblePathTargets) &&\n isStringArray(candidate.valueLabels) &&\n Array.isArray(candidate.signatures) &&\n candidate.signatures.every(isSerializedTagSignature) &&\n (candidate.tagHoverMarkdown === null || typeof candidate.tagHoverMarkdown === \"string\") &&\n (candidate.targetHoverMarkdown === null || typeof candidate.targetHoverMarkdown === \"string\") &&\n (candidate.argumentHoverMarkdown === null ||\n typeof candidate.argumentHoverMarkdown === \"string\")\n );\n}\n\nfunction isSerializedCompletionContext(\n value: unknown\n): value is FormSpecSerializedCompletionContext {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecSerializedCompletionContext>;\n if (typeof candidate.kind !== \"string\") {\n return false;\n }\n\n switch (candidate.kind) {\n case \"tag-name\":\n return typeof candidate.prefix === \"string\" && Array.isArray(candidate.availableTags)\n ? candidate.availableTags.every(isSerializedTagDefinition)\n : false;\n case \"target\":\n return isSerializedTagSemanticContext(candidate.semantic);\n case \"argument\":\n return (\n isSerializedTagSemanticContext(candidate.semantic) && isStringArray(candidate.valueLabels)\n );\n case \"none\":\n return true;\n default:\n return false;\n }\n}\n\nfunction isSerializedHoverInfo(value: unknown): value is FormSpecSerializedHoverInfo {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecSerializedHoverInfo>;\n return (\n (candidate.kind === \"tag-name\" ||\n candidate.kind === \"target\" ||\n candidate.kind === \"argument\") &&\n typeof candidate.markdown === \"string\"\n );\n}\n\nfunction hasCurrentProtocolVersion(\n value: unknown\n): value is { readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION } {\n return isObjectRecord(value) && value[\"protocolVersion\"] === FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n}\n\nfunction isAnalysisDiagnostic(value: unknown): value is FormSpecAnalysisDiagnostic {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecAnalysisDiagnostic>;\n return (\n typeof candidate.code === \"string\" &&\n typeof candidate.message === \"string\" &&\n isCommentSpan(candidate.range) &&\n (candidate.severity === \"error\" ||\n candidate.severity === \"warning\" ||\n candidate.severity === \"info\")\n );\n}\n\nfunction isAnalysisTagSnapshot(value: unknown): value is FormSpecAnalysisTagSnapshot {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecAnalysisTagSnapshot>;\n return (\n typeof candidate.rawTagName === \"string\" &&\n typeof candidate.normalizedTagName === \"string\" &&\n typeof candidate.recognized === \"boolean\" &&\n isCommentSpan(candidate.fullSpan) &&\n isCommentSpan(candidate.tagNameSpan) &&\n (candidate.payloadSpan === null || isCommentSpan(candidate.payloadSpan)) &&\n (candidate.target === null || isSerializedCommentTargetSpecifier(candidate.target)) &&\n (candidate.argumentSpan === null || isCommentSpan(candidate.argumentSpan)) &&\n typeof candidate.argumentText === \"string\" &&\n isSerializedTagSemanticContext(candidate.semantic)\n );\n}\n\nfunction isAnalysisCommentSnapshot(value: unknown): value is FormSpecAnalysisCommentSnapshot {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecAnalysisCommentSnapshot>;\n return (\n isCommentSpan(candidate.commentSpan) &&\n isCommentSpan(candidate.declarationSpan) &&\n (candidate.placement === null || isPlacementValue(candidate.placement)) &&\n (candidate.subjectType === null || typeof candidate.subjectType === \"string\") &&\n (candidate.hostType === null || typeof candidate.hostType === \"string\") &&\n Array.isArray(candidate.tags) &&\n candidate.tags.every(isAnalysisTagSnapshot)\n );\n}\n\nfunction isAnalysisFileSnapshot(value: unknown): value is FormSpecAnalysisFileSnapshot {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecAnalysisFileSnapshot>;\n return (\n typeof candidate.filePath === \"string\" &&\n typeof candidate.sourceHash === \"string\" &&\n typeof candidate.generatedAt === \"string\" &&\n Array.isArray(candidate.comments) &&\n candidate.comments.every(isAnalysisCommentSnapshot) &&\n Array.isArray(candidate.diagnostics) &&\n candidate.diagnostics.every(isAnalysisDiagnostic)\n );\n}\n\n/**\n * Validates an unknown manifest payload from disk before consumers trust it.\n *\n * @public\n */\nexport function isFormSpecAnalysisManifest(value: unknown): value is FormSpecAnalysisManifest {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecAnalysisManifest>;\n return (\n candidate.protocolVersion === FORMSPEC_ANALYSIS_PROTOCOL_VERSION &&\n candidate.analysisSchemaVersion === FORMSPEC_ANALYSIS_SCHEMA_VERSION &&\n typeof candidate.workspaceRoot === \"string\" &&\n typeof candidate.workspaceId === \"string\" &&\n isIpcEndpoint(candidate.endpoint) &&\n typeof candidate.typescriptVersion === \"string\" &&\n typeof candidate.extensionFingerprint === \"string\" &&\n typeof candidate.generation === \"number\" &&\n typeof candidate.updatedAt === \"string\"\n );\n}\n\n/**\n * Validates an unknown inbound IPC request before dispatching it.\n *\n * @public\n */\nexport function isFormSpecSemanticQuery(value: unknown): value is FormSpecSemanticQuery {\n if (!hasCurrentProtocolVersion(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecSemanticQuery>;\n if (typeof candidate.kind !== \"string\") {\n return false;\n }\n\n switch (candidate.kind) {\n case \"health\":\n return true;\n case \"completion\":\n case \"hover\":\n return typeof candidate.filePath === \"string\" && typeof candidate.offset === \"number\";\n case \"diagnostics\":\n case \"file-snapshot\":\n return typeof candidate.filePath === \"string\";\n default:\n return false;\n }\n}\n\n/**\n * Validates an unknown IPC response before the language server consumes it.\n *\n * @public\n */\nexport function isFormSpecSemanticResponse(value: unknown): value is FormSpecSemanticResponse {\n if (!hasCurrentProtocolVersion(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecSemanticResponse>;\n if (typeof candidate.kind !== \"string\") {\n return false;\n }\n\n switch (candidate.kind) {\n case \"health\":\n return isFormSpecAnalysisManifest(candidate.manifest);\n case \"completion\":\n return (\n typeof candidate.sourceHash === \"string\" && isSerializedCompletionContext(candidate.context)\n );\n case \"hover\":\n return (\n typeof candidate.sourceHash === \"string\" &&\n (candidate.hover === null || isSerializedHoverInfo(candidate.hover))\n );\n case \"diagnostics\":\n return (\n typeof candidate.sourceHash === \"string\" &&\n Array.isArray(candidate.diagnostics) &&\n candidate.diagnostics.every(isAnalysisDiagnostic)\n );\n case \"file-snapshot\":\n return candidate.snapshot === null || isAnalysisFileSnapshot(candidate.snapshot);\n case \"error\":\n return typeof candidate.error === \"string\";\n default:\n return false;\n }\n}\n\n/**\n * Computes a stable, non-cryptographic hash for document staleness checks\n * across the plugin/LSP boundary.\n *\n * @public\n */\nexport function computeFormSpecTextHash(text: string): string {\n let hash = 0x811c9dc5;\n for (let index = 0; index < text.length; index += 1) {\n hash ^= text.charCodeAt(index);\n hash = Math.imul(hash, 0x01000193);\n }\n\n return (hash >>> 0).toString(16).padStart(8, \"0\");\n}\n\n/**\n * Converts a parsed target specifier into its transport-safe JSON form.\n *\n * @public\n */\nexport function serializeCommentTargetSpecifier(\n target: ParsedCommentTargetSpecifier | null\n): FormSpecSerializedCommentTargetSpecifier | null {\n if (target === null) {\n return null;\n }\n\n return {\n rawText: target.rawText,\n valid: target.valid,\n kind: target.kind,\n fullSpan: target.fullSpan,\n colonSpan: target.colonSpan,\n span: target.span,\n };\n}\n\n/**\n * Serializes tag-level semantic context for cross-process consumption.\n *\n * @public\n */\nexport function serializeCommentTagSemanticContext(\n semantic: CommentTagSemanticContext\n): FormSpecSerializedTagSemanticContext {\n return {\n tagName: semantic.tag.normalizedTagName,\n tagDefinition:\n semantic.tagDefinition === null\n ? null\n : {\n canonicalName: semantic.tagDefinition.canonicalName,\n completionDetail: semantic.tagDefinition.completionDetail,\n hoverMarkdown: semantic.tagDefinition.hoverMarkdown,\n },\n placement: semantic.placement,\n supportedTargets: semantic.supportedTargets,\n targetCompletions: semantic.targetCompletions,\n compatiblePathTargets: semantic.compatiblePathTargets,\n valueLabels: semantic.valueLabels,\n signatures: semantic.signatures.map((signature) => ({\n label: signature.label,\n placements: signature.placements,\n })),\n tagHoverMarkdown: semantic.tagHoverMarkdown,\n targetHoverMarkdown: semantic.targetHoverMarkdown,\n argumentHoverMarkdown: semantic.argumentHoverMarkdown,\n };\n}\n\n/**\n * Serializes a cursor-scoped completion context for IPC.\n *\n * @public\n */\nexport function serializeCompletionContext(\n context: SemanticCommentCompletionContext\n): FormSpecSerializedCompletionContext {\n switch (context.kind) {\n case \"tag-name\":\n return {\n kind: \"tag-name\",\n prefix: context.prefix,\n availableTags: context.availableTags.map((tag) => ({\n canonicalName: tag.canonicalName,\n completionDetail: tag.completionDetail,\n hoverMarkdown: tag.hoverMarkdown,\n })),\n };\n case \"target\":\n return {\n kind: \"target\",\n semantic: serializeCommentTagSemanticContext(context.semantic),\n };\n case \"argument\":\n return {\n kind: \"argument\",\n semantic: serializeCommentTagSemanticContext(context.semantic),\n valueLabels: context.valueLabels,\n };\n case \"none\":\n return { kind: \"none\" };\n default: {\n const exhaustive: never = context;\n return exhaustive;\n }\n }\n}\n\n/**\n * Serializes hover information for cross-process transport.\n *\n * @public\n */\nexport function serializeHoverInfo(\n hover: CommentHoverInfo | null\n): FormSpecSerializedHoverInfo | null {\n return hover === null\n ? null\n : {\n kind: hover.kind,\n markdown: hover.markdown,\n };\n}\n\n/**\n * Serializes a parsed tag plus its semantic context into a file snapshot entry.\n *\n * @public\n */\nexport function serializeParsedCommentTag(\n tag: ParsedCommentTag,\n semantic: CommentTagSemanticContext\n): FormSpecAnalysisTagSnapshot {\n return {\n rawTagName: tag.rawTagName,\n normalizedTagName: tag.normalizedTagName,\n recognized: tag.recognized,\n fullSpan: tag.fullSpan,\n tagNameSpan: tag.tagNameSpan,\n payloadSpan: tag.payloadSpan,\n target: serializeCommentTargetSpecifier(tag.target),\n argumentSpan: tag.argumentSpan,\n argumentText: tag.argumentText,\n semantic: serializeCommentTagSemanticContext(semantic),\n };\n}\n","import path from \"node:path\";\nimport { computeFormSpecTextHash } from \"./semantic-protocol.js\";\n\n/**\n * Stable workspace-scoped identifier derived from the absolute workspace root.\n *\n * @public\n */\nexport function getFormSpecWorkspaceId(workspaceRoot: string): string {\n return computeFormSpecTextHash(workspaceRoot);\n}\n\n/**\n * Directory used for machine-generated FormSpec tooling state inside a\n * workspace.\n *\n * @public\n */\nexport function getFormSpecWorkspaceRuntimeDirectory(workspaceRoot: string): string {\n return path.join(workspaceRoot, \".cache\", \"formspec\", \"tooling\");\n}\n\n/**\n * Path to the manifest that advertises the local FormSpec semantic service for\n * a workspace.\n *\n * @public\n */\nexport function getFormSpecManifestPath(workspaceRoot: string): string {\n return path.join(getFormSpecWorkspaceRuntimeDirectory(workspaceRoot), \"manifest.json\");\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,kBAIO;AA6EA,IAAM,uBAAuB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,yBAAyB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,mBAAmB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,yBAAyB;AAAA,EAC7B;AAAA,EACA;AACF;AAEA,IAAM,iBAAiB;AAAA,EACrB,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AAEA,IAAM,qBAAqB,oBAAI,IAAI,CAAC,aAAa,aAAa,YAAY,UAAU,CAAC;AACrF,IAAM,4BAA4B,oBAAI,IAAI,CAAC,OAAO,CAAC;AACnD,IAAM,kBAAkB,oBAAI,IAAI,CAAC,SAAS,aAAa,CAAC;AACxD,IAAM,qBAAqB,oBAAI,IAAI,CAAC,aAAa,CAAC;AAClD,IAAM,oBAAoB,oBAAI,IAAI;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,uBAAuB,oBAAI,IAAI,CAAC,YAAY,YAAY,cAAc,aAAa,CAAC;AAE1F,IAAM,+BAAuD;AAAA,EAC3D,SAAS;AAAA,EACT,SAAS;AAAA,EACT,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,UAAU;AAAA,EACV,UAAU;AAAA,EACV,aAAa;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,OAAO;AACT;AAEA,IAAM,wBAAgD;AAAA,EACpD,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EACX,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EACX,kBAAkB;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EACX,kBAAkB;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EACX,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EACX,WAAW;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EACX,WAAW;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EACX,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EACX,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EACX,aAAa;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EACX,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EACX,aAAa;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAAA,EACX,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAmBA,SAAS,eAAe,MAAwC;AAC9D,MAAI,mBAAmB,IAAI,IAAI,EAAG,QAAO;AACzC,MAAI,0BAA0B,IAAI,IAAI,EAAG,QAAO;AAChD,MAAI,gBAAgB,IAAI,IAAI,EAAG,QAAO;AACtC,MAAI,mBAAmB,IAAI,IAAI,EAAG,QAAO;AACzC,MAAI,kBAAkB,IAAI,IAAI,EAAG,QAAO;AACxC,MAAI,qBAAqB,IAAI,IAAI,EAAG,QAAO;AAC3C,SAAO;AACT;AAEA,SAAS,oBAAoB,MAAgD;AAC3E,SAAO,eAAe,IAAI,KAAK;AACjC;AAEA,SAAS,+BAA+B,MAAiD;AACvF,UAAQ,MAAM;AAAA,IACZ,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,SAAS;AACP,YAAM,aAAoB;AAC1B,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,yBACP,WAC+B;AAC/B,UAAQ,WAAW;AAAA,IACjB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,CAAC,oBAAoB;AAAA,IAC9B,KAAK;AACH,aAAO,CAAC,aAAa;AAAA,IACvB,KAAK;AACH,aAAO,CAAC,WAAW;AAAA,IACrB,KAAK;AACH,aAAO,CAAC,gBAAgB;AAAA,IAC1B,KAAK;AAAA,IACL,KAAK;AACH,aAAO,CAAC;AAAA,IACV,SAAS;AACP,YAAM,aAAoB;AAC1B,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,WAAqC,WAAW,WAAmB;AAC5F,UAAQ,WAAW;AAAA,IACjB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,SAAS;AACP,YAAM,aAAoB;AAC1B,WAAK;AACL,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,MAAwC;AAClE,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,SAAS;AACP,YAAM,aAAoB;AAC1B,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,uBACP,YAC+B;AAC/B,UAAQ,YAAY;AAAA,IAClB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,SAAS;AACP,YAAM,aAAoB;AAC1B,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,sBACP,YACA,WACA,gBACuB;AACvB,QAAM,OAA8B;AAAA,IAClC,MAAM,uBAAuB,UAAU;AAAA,IACvC,OAAO,mBAAmB,UAAU;AAAA,IACpC,UAAU,eAAe;AAAA,EAC3B;AAEA,MAAI,eAAe,QAAQ;AACzB,UAAM,aAAa,kBAAkB,yBAAyB,SAAS,EAAE,CAAC;AAC1E,WAAO,eAAe,SAAY,OAAO,EAAE,GAAG,MAAM,WAAW;AAAA,EACjE;AAEA,MAAI,eAAe,UAAU;AAC3B,WAAO,EAAE,GAAG,MAAM,YAAY,0BAA0B;AAAA,EAC1D;AAEA,SAAO;AACT;AAEA,SAAS,gBACP,MACA,YACA,YACA,WACA,YACA,gBACc;AACd,QAAM,aAAsC,CAAC;AAE7C,MAAI,eAAe,MAAM;AACvB,eAAW,KAAK,sBAAsB,YAAY,WAAW,cAAc,CAAC;AAAA,EAC9E;AACA,MAAI,eAAe,IAAI;AACrB,eAAW;AAAA,MACT,cAAc,OACV;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,MACT,IACA;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,QACP;AAAA,MACF;AAAA,IACN;AAAA,EACF;AAEA,QAAM,cAAc,eAAe,OAAO,KAAK,IAAI,mBAAmB,UAAU,CAAC;AACjF,QAAM,mBAAmB,eAAe,KAAK,KAAK,IAAI,UAAU;AAEhE,SAAO;AAAA,IACL,OAAO,IAAI,IAAI,GAAG,WAAW,GAAG,gBAAgB;AAAA,IAChD;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,mBACP,MACA,cACA,YACA,YACQ;AACR,QAAM,SAAS,eAAe,KAAK,MAAM,IAAI,OAAO,MAAM,IAAI,QAAQ,UAAU;AAChF,QAAM,iBACJ,WAAW,WAAW,IAClB,CAAC,oBAAoB,WAAW,CAAC,GAAG,SAAS,IAAI,IAAI,EAAE,IAAI,IAC3D,CAAC,mBAAmB,GAAG,WAAW,IAAI,CAAC,cAAc,OAAO,UAAU,KAAK,IAAI,CAAC;AAEtF,SAAO,CAAC,QAAQ,IAAI,cAAc,IAAI,GAAG,cAAc,EAAE,KAAK,IAAI;AACpE;AAEA,SAAS,yBAAyB,MAAsD;AACtF,QAAM,YAAY,oBAAoB,IAAI;AAC1C,QAAM,oBAAoB,+BAA+B,IAAI;AAC7D,QAAM,aACJ,SAAS,YACL,YACA,SAAS,gBACP,iBACA,SAAS,UACP,mBACA,kBAAkB,SAAS;AAErC,SAAO;AAAA,IACL,gBAAgB,MAAM,kBAAkB,MAAM,WAAW,UAAU;AAAA,IACnE,gBAAgB,MAAM,kBAAkB,QAAQ,WAAW,YAAY,iBAAiB;AAAA,EAC1F;AACF;AAEA,IAAM,0BAA0B,OAAO;AAAA,EACpC,OAAO,KAAK,0CAA8B,EAA8B,IAAI,CAAC,SAAS;AACrF,UAAM,YAAY,oBAAoB,IAAI;AAC1C,UAAM,oBAAoB,+BAA+B,IAAI;AAC7D,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,eAAe;AAAA,QACf;AAAA,QACA,kBAAkB,cAAc;AAAA,QAChC,kBAAkB,CAAC,QAAQ,MAAM;AAAA,QACjC,iBAAiB;AAAA,QACjB,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,cAAc,CAAC,iBAAiB;AAAA,QAChC,kBAAkB,6BAA6B,IAAI,KAAK,IAAI,IAAI;AAAA,QAChE,eAAe,sBAAsB,IAAI,KAAK,MAAM,IAAI;AAAA,QACxD,YAAY,yBAAyB,IAAI;AAAA,MAC3C;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,IAAM,kBAAkB;AAAA,EACtB,aAAa;AAAA,IACX,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,QAAQ,UAAU,SAAS;AAAA,IAC9C,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY,CAAC,GAAG,iBAAiB,GAAG,gBAAgB;AAAA,IACpD,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,kBAAkB;AAAA,MAChB,QAAQ;AAAA,MACR,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,MAAM;AAAA,IACzB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY,CAAC,GAAG,iBAAiB,GAAG,gBAAgB;AAAA,IACpD,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AAAA,EACA,QAAQ;AAAA,IACN,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,MAAM;AAAA,IACzB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,YAAY;AAAA,EACd;AAAA,EACA,aAAa;AAAA,IACX,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,MAAM;AAAA,IACzB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AAAA,EACA,OAAO;AAAA,IACL,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,MAAM;AAAA,IACzB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AAAA,EACA,SAAS;AAAA,IACP,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,QAAQ,UAAU,SAAS;AAAA,IAC9C,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY,CAAC,GAAG,iBAAiB,GAAG,gBAAgB;AAAA,IACpD,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,kBAAkB;AAAA,MAChB,QAAQ;AAAA,MACR,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,MAAM;AAAA,IACzB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,YAAY;AAAA,EACd;AAAA,EACA,UAAU;AAAA,IACR,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,MAAM;AAAA,IACzB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AAAA,EACA,UAAU;AAAA,IACR,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,MAAM;AAAA,IACzB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AAAA,EACA,YAAY;AAAA,IACV,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,MAAM;AAAA,IACzB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AAAA,EACA,aAAa;AAAA,IACX,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,MAAM;AAAA,IACzB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AAAA,EACA,cAAc;AAAA,IACZ,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,MAAM;AAAA,IACzB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,YAAY;AAAA,EACd;AAAA,EACA,YAAY;AAAA,IACV,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,MAAM;AAAA,IACzB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AAAA,EACA,SAAS;AAAA,IACP,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,MAAM;AAAA,IACzB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY,CAAC,GAAG,iBAAiB,GAAG,gBAAgB;AAAA,IACpD,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AAAA,EACA,SAAS;AAAA,IACP,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,MAAM;AAAA,IACzB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AAAA,EACA,KAAK;AAAA,IACH,kBAAkB;AAAA,IAClB,kBAAkB,CAAC,MAAM;AAAA,IACzB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,YAAY;AAAA,EACd;AACF;AAEA,SAAS,wBAAwB,eAAuB,MAAmC;AACzF,QAAM,YAAY,KAAK,aAAa,eAAe,aAAa;AAChE,QAAM,aAAa,KAAK,mBAAoB,KAAK,cAAc,kBAAkB,SAAS,IAAK;AAC/F,QAAM,aAA6B,CAAC;AAEpC,MAAI,KAAK,iBAAiB,SAAS,MAAM,GAAG;AAC1C,eAAW,KAAK,gBAAgB,eAAe,KAAK,YAAY,MAAM,WAAW,UAAU,CAAC;AAAA,EAC9F;AACA,MAAI,KAAK,iBAAiB,SAAS,MAAM,GAAG;AAC1C,eAAW;AAAA,MACT;AAAA,QACE;AAAA,QACA,KAAK,kBAAkB,QAAQ,KAAK;AAAA,QACpC;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,KAAK,iBAAiB,SAAS,QAAQ,GAAG;AAC5C,eAAW;AAAA,MACT;AAAA,QACE;AAAA,QACA,KAAK,kBAAkB,UAAU,KAAK;AAAA,QACtC;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,KAAK,iBAAiB,SAAS,SAAS,GAAG;AAC7C,eAAW;AAAA,MACT;AAAA,QACE;AAAA,QACA,KAAK,kBAAkB,WAAW,KAAK;AAAA,QACvC;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,kBAAkB,KAAK;AAAA,IACvB,kBAAkB,KAAK;AAAA,IACvB,iBAAiB,KAAK;AAAA,IACtB,UAAU,KAAK;AAAA,IACf,YAAY,KAAK;AAAA,IACjB,cAAc,yBAAyB,SAAS;AAAA,IAChD,kBAAkB,KAAK;AAAA,IACvB,eAAe,mBAAmB,eAAe,KAAK,cAAc,YAAY,UAAU;AAAA,IAC1F;AAAA,EACF;AACF;AAEA,IAAM,wBAAuD,OAAO;AAAA,EAClE,OAAO,QAAQ,eAAe,EAAE,IAAI,CAAC,CAAC,eAAe,IAAI,MAAM;AAAA,IAC7D;AAAA,IACA,wBAAwB,eAAe,IAAI;AAAA,EAC7C,CAAC;AACH;;;ACtuBO,IAAM,qCAAqC;AAE3C,IAAM,mCAAmC;AA0PhD,SAAS,eAAe,OAAkD;AACxE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,cAAc,OAAsC;AAC3D,MAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,SAAO,OAAO,UAAU,UAAU,YAAY,OAAO,UAAU,QAAQ;AACzE;AAEA,SAAS,cAAc,OAA4C;AACjE,SAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,MAAM,CAAC,UAAU,OAAO,UAAU,QAAQ;AACjF;AAEA,IAAM,6BAA6B,IAAI,IAAuB,oBAAoB;AAElF,IAAM,+BAA+B,IAAI,IAAwB,sBAAsB;AAEvF,SAAS,iBAAiB,OAA4C;AACpE,SAAO,OAAO,UAAU,YAAY,2BAA2B,IAAI,KAA0B;AAC/F;AAEA,SAAS,kBAAkB,OAA6C;AACtE,SAAO,OAAO,UAAU,YAAY,6BAA6B,IAAI,KAA2B;AAClG;AAEA,SAAS,iBAAiB,OAAuD;AAC/E,SAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,MAAM,gBAAgB;AAC7D;AAEA,SAAS,kBAAkB,OAAwD;AACjF,SAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,MAAM,iBAAiB;AAC9D;AAEA,SAAS,cAAc,OAA8C;AACnE,MAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,UACG,UAAU,SAAS,iBAAiB,UAAU,SAAS,mBACxD,OAAO,UAAU,YAAY;AAEjC;AAEA,SAAS,0BAA0B,OAA0D;AAC3F,MAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,SACE,OAAO,UAAU,kBAAkB,YACnC,OAAO,UAAU,qBAAqB,YACtC,OAAO,UAAU,kBAAkB;AAEvC;AAEA,SAAS,yBAAyB,OAAyD;AACzF,MAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,SAAO,OAAO,UAAU,UAAU,YAAY,iBAAiB,UAAU,UAAU;AACrF;AAEA,SAAS,mCACP,OACmD;AACnD,MAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,SACE,OAAO,UAAU,YAAY,YAC7B,OAAO,UAAU,UAAU,aAC3B,OAAO,UAAU,SAAS,YAC1B,cAAc,UAAU,QAAQ,KAChC,cAAc,UAAU,SAAS,KACjC,cAAc,UAAU,IAAI;AAEhC;AAEA,SAAS,+BACP,OAC+C;AAC/C,MAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,SACE,OAAO,UAAU,YAAY,aAC5B,UAAU,kBAAkB,QAAQ,0BAA0B,UAAU,aAAa,OACrF,UAAU,cAAc,QAAQ,iBAAiB,UAAU,SAAS,MACrE,kBAAkB,UAAU,gBAAgB,KAC5C,cAAc,UAAU,iBAAiB,KACzC,cAAc,UAAU,qBAAqB,KAC7C,cAAc,UAAU,WAAW,KACnC,MAAM,QAAQ,UAAU,UAAU,KAClC,UAAU,WAAW,MAAM,wBAAwB,MAClD,UAAU,qBAAqB,QAAQ,OAAO,UAAU,qBAAqB,cAC7E,UAAU,wBAAwB,QAAQ,OAAO,UAAU,wBAAwB,cACnF,UAAU,0BAA0B,QACnC,OAAO,UAAU,0BAA0B;AAEjD;AAEA,SAAS,8BACP,OAC8C;AAC9C,MAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,MAAI,OAAO,UAAU,SAAS,UAAU;AACtC,WAAO;AAAA,EACT;AAEA,UAAQ,UAAU,MAAM;AAAA,IACtB,KAAK;AACH,aAAO,OAAO,UAAU,WAAW,YAAY,MAAM,QAAQ,UAAU,aAAa,IAChF,UAAU,cAAc,MAAM,yBAAyB,IACvD;AAAA,IACN,KAAK;AACH,aAAO,+BAA+B,UAAU,QAAQ;AAAA,IAC1D,KAAK;AACH,aACE,+BAA+B,UAAU,QAAQ,KAAK,cAAc,UAAU,WAAW;AAAA,IAE7F,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,sBAAsB,OAAsD;AACnF,MAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,UACG,UAAU,SAAS,cAClB,UAAU,SAAS,YACnB,UAAU,SAAS,eACrB,OAAO,UAAU,aAAa;AAElC;AAEA,SAAS,0BACP,OACkF;AAClF,SAAO,eAAe,KAAK,KAAK,MAAM,iBAAiB,MAAM;AAC/D;AAEA,SAAS,qBAAqB,OAAqD;AACjF,MAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,SACE,OAAO,UAAU,SAAS,YAC1B,OAAO,UAAU,YAAY,YAC7B,cAAc,UAAU,KAAK,MAC5B,UAAU,aAAa,WACtB,UAAU,aAAa,aACvB,UAAU,aAAa;AAE7B;AAEA,SAAS,sBAAsB,OAAsD;AACnF,MAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,SACE,OAAO,UAAU,eAAe,YAChC,OAAO,UAAU,sBAAsB,YACvC,OAAO,UAAU,eAAe,aAChC,cAAc,UAAU,QAAQ,KAChC,cAAc,UAAU,WAAW,MAClC,UAAU,gBAAgB,QAAQ,cAAc,UAAU,WAAW,OACrE,UAAU,WAAW,QAAQ,mCAAmC,UAAU,MAAM,OAChF,UAAU,iBAAiB,QAAQ,cAAc,UAAU,YAAY,MACxE,OAAO,UAAU,iBAAiB,YAClC,+BAA+B,UAAU,QAAQ;AAErD;AAEA,SAAS,0BAA0B,OAA0D;AAC3F,MAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,SACE,cAAc,UAAU,WAAW,KACnC,cAAc,UAAU,eAAe,MACtC,UAAU,cAAc,QAAQ,iBAAiB,UAAU,SAAS,OACpE,UAAU,gBAAgB,QAAQ,OAAO,UAAU,gBAAgB,cACnE,UAAU,aAAa,QAAQ,OAAO,UAAU,aAAa,aAC9D,MAAM,QAAQ,UAAU,IAAI,KAC5B,UAAU,KAAK,MAAM,qBAAqB;AAE9C;AAEA,SAAS,uBAAuB,OAAuD;AACrF,MAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,SACE,OAAO,UAAU,aAAa,YAC9B,OAAO,UAAU,eAAe,YAChC,OAAO,UAAU,gBAAgB,YACjC,MAAM,QAAQ,UAAU,QAAQ,KAChC,UAAU,SAAS,MAAM,yBAAyB,KAClD,MAAM,QAAQ,UAAU,WAAW,KACnC,UAAU,YAAY,MAAM,oBAAoB;AAEpD;AAOO,SAAS,2BAA2B,OAAmD;AAC5F,MAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,SACE,UAAU,oBAAoB,sCAC9B,UAAU,0BAA0B,oCACpC,OAAO,UAAU,kBAAkB,YACnC,OAAO,UAAU,gBAAgB,YACjC,cAAc,UAAU,QAAQ,KAChC,OAAO,UAAU,sBAAsB,YACvC,OAAO,UAAU,yBAAyB,YAC1C,OAAO,UAAU,eAAe,YAChC,OAAO,UAAU,cAAc;AAEnC;AAOO,SAAS,wBAAwB,OAAgD;AACtF,MAAI,CAAC,0BAA0B,KAAK,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,MAAI,OAAO,UAAU,SAAS,UAAU;AACtC,WAAO;AAAA,EACT;AAEA,UAAQ,UAAU,MAAM;AAAA,IACtB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO,OAAO,UAAU,aAAa,YAAY,OAAO,UAAU,WAAW;AAAA,IAC/E,KAAK;AAAA,IACL,KAAK;AACH,aAAO,OAAO,UAAU,aAAa;AAAA,IACvC;AACE,aAAO;AAAA,EACX;AACF;AAOO,SAAS,2BAA2B,OAAmD;AAC5F,MAAI,CAAC,0BAA0B,KAAK,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,MAAI,OAAO,UAAU,SAAS,UAAU;AACtC,WAAO;AAAA,EACT;AAEA,UAAQ,UAAU,MAAM;AAAA,IACtB,KAAK;AACH,aAAO,2BAA2B,UAAU,QAAQ;AAAA,IACtD,KAAK;AACH,aACE,OAAO,UAAU,eAAe,YAAY,8BAA8B,UAAU,OAAO;AAAA,IAE/F,KAAK;AACH,aACE,OAAO,UAAU,eAAe,aAC/B,UAAU,UAAU,QAAQ,sBAAsB,UAAU,KAAK;AAAA,IAEtE,KAAK;AACH,aACE,OAAO,UAAU,eAAe,YAChC,MAAM,QAAQ,UAAU,WAAW,KACnC,UAAU,YAAY,MAAM,oBAAoB;AAAA,IAEpD,KAAK;AACH,aAAO,UAAU,aAAa,QAAQ,uBAAuB,UAAU,QAAQ;AAAA,IACjF,KAAK;AACH,aAAO,OAAO,UAAU,UAAU;AAAA,IACpC;AACE,aAAO;AAAA,EACX;AACF;AAQO,SAAS,wBAAwB,MAAsB;AAC5D,MAAI,OAAO;AACX,WAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACnD,YAAQ,KAAK,WAAW,KAAK;AAC7B,WAAO,KAAK,KAAK,MAAM,QAAU;AAAA,EACnC;AAEA,UAAQ,SAAS,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAClD;AAOO,SAAS,gCACd,QACiD;AACjD,MAAI,WAAW,MAAM;AACnB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,SAAS,OAAO;AAAA,IAChB,OAAO,OAAO;AAAA,IACd,MAAM,OAAO;AAAA,IACb,UAAU,OAAO;AAAA,IACjB,WAAW,OAAO;AAAA,IAClB,MAAM,OAAO;AAAA,EACf;AACF;AAOO,SAAS,mCACd,UACsC;AACtC,SAAO;AAAA,IACL,SAAS,SAAS,IAAI;AAAA,IACtB,eACE,SAAS,kBAAkB,OACvB,OACA;AAAA,MACE,eAAe,SAAS,cAAc;AAAA,MACtC,kBAAkB,SAAS,cAAc;AAAA,MACzC,eAAe,SAAS,cAAc;AAAA,IACxC;AAAA,IACN,WAAW,SAAS;AAAA,IACpB,kBAAkB,SAAS;AAAA,IAC3B,mBAAmB,SAAS;AAAA,IAC5B,uBAAuB,SAAS;AAAA,IAChC,aAAa,SAAS;AAAA,IACtB,YAAY,SAAS,WAAW,IAAI,CAAC,eAAe;AAAA,MAClD,OAAO,UAAU;AAAA,MACjB,YAAY,UAAU;AAAA,IACxB,EAAE;AAAA,IACF,kBAAkB,SAAS;AAAA,IAC3B,qBAAqB,SAAS;AAAA,IAC9B,uBAAuB,SAAS;AAAA,EAClC;AACF;AAOO,SAAS,2BACd,SACqC;AACrC,UAAQ,QAAQ,MAAM;AAAA,IACpB,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ,QAAQ;AAAA,QAChB,eAAe,QAAQ,cAAc,IAAI,CAAC,SAAS;AAAA,UACjD,eAAe,IAAI;AAAA,UACnB,kBAAkB,IAAI;AAAA,UACtB,eAAe,IAAI;AAAA,QACrB,EAAE;AAAA,MACJ;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU,mCAAmC,QAAQ,QAAQ;AAAA,MAC/D;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU,mCAAmC,QAAQ,QAAQ;AAAA,QAC7D,aAAa,QAAQ;AAAA,MACvB;AAAA,IACF,KAAK;AACH,aAAO,EAAE,MAAM,OAAO;AAAA,IACxB,SAAS;AACP,YAAM,aAAoB;AAC1B,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAOO,SAAS,mBACd,OACoC;AACpC,SAAO,UAAU,OACb,OACA;AAAA,IACE,MAAM,MAAM;AAAA,IACZ,UAAU,MAAM;AAAA,EAClB;AACN;AAOO,SAAS,0BACd,KACA,UAC6B;AAC7B,SAAO;AAAA,IACL,YAAY,IAAI;AAAA,IAChB,mBAAmB,IAAI;AAAA,IACvB,YAAY,IAAI;AAAA,IAChB,UAAU,IAAI;AAAA,IACd,aAAa,IAAI;AAAA,IACjB,aAAa,IAAI;AAAA,IACjB,QAAQ,gCAAgC,IAAI,MAAM;AAAA,IAClD,cAAc,IAAI;AAAA,IAClB,cAAc,IAAI;AAAA,IAClB,UAAU,mCAAmC,QAAQ;AAAA,EACvD;AACF;;;AC1uBA,uBAAiB;AAQV,SAAS,uBAAuB,eAA+B;AACpE,SAAO,wBAAwB,aAAa;AAC9C;AAQO,SAAS,qCAAqC,eAA+B;AAClF,SAAO,iBAAAA,QAAK,KAAK,eAAe,UAAU,YAAY,SAAS;AACjE;AAQO,SAAS,wBAAwB,eAA+B;AACrE,SAAO,iBAAAA,QAAK,KAAK,qCAAqC,aAAa,GAAG,eAAe;AACvF;","names":["path"]}