canicode 0.11.1 → 0.11.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/cli/index.js +165 -183
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.ts +22 -5
- package/dist/index.js +26 -8
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.js +22 -5
- package/dist/mcp/server.js.map +1 -1
- package/docs/CUSTOMIZATION.md +38 -2
- package/package.json +2 -2
- package/skills/canicode-gotchas/SKILL.md +53 -7
- package/skills/canicode-roundtrip/SKILL.md +49 -2
- package/skills/canicode-roundtrip/canicode-roundtrip-helpers.d.ts +54 -0
- package/skills/canicode-roundtrip/helpers-bootstrap.js +21 -0
- package/skills/canicode-roundtrip/helpers-installer.js +14 -0
- package/skills/cursor/canicode-gotchas/SKILL.md +53 -7
- package/skills/cursor/canicode-roundtrip/SKILL.md +49 -2
- package/skills/cursor/canicode-roundtrip/canicode-roundtrip-helpers.d.ts +54 -0
- package/skills/cursor/canicode-roundtrip/helpers-bootstrap.js +21 -0
- package/skills/cursor/canicode-roundtrip/helpers-installer.js +14 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../package.json","../src/core/contracts/severity.ts","../src/core/contracts/channels.ts","../src/core/contracts/analysis-scope.ts","../src/core/contracts/category.ts","../src/core/contracts/figma-node.ts","../src/core/contracts/rule.ts","../src/core/contracts/issue.ts","../src/core/contracts/score.ts","../src/core/contracts/report.ts","../src/core/contracts/visual-compare.ts","../src/core/contracts/mcp-response.ts","../src/core/contracts/gotcha-survey.ts","../src/core/rules/rule-config.ts","../src/core/rules/rule-registry.ts","../src/core/contracts/acknowledgment.ts","../src/core/engine/rule-engine.ts","../src/core/adapters/instance-id-parser.ts","../src/core/gotcha/apply-context.ts","../src/core/engine/scoring.ts","../src/core/design-tree/design-tree.ts","../src/core/design-tree/strip.ts","../src/core/design-tree/delta.ts","../src/core/gotcha/resolve-apply-target.ts","../src/core/rules/node-semantics.ts","../src/core/rules/rule-exceptions.ts","../src/core/rules/rule-messages.ts","../src/core/rules/structure/index.ts","../src/core/rules/token/index.ts","../src/core/rules/component/index.ts","../src/core/rules/naming/index.ts","../src/core/rules/interaction/index.ts","../src/core/adapters/figma-url-parser.ts","../src/core/adapters/figma-client.ts","../src/core/adapters/figma-transformer.ts","../src/core/adapters/figma-file-loader.ts","../src/core/adapters/component-resolver.ts","../src/agents/contracts/calibration.ts","../src/agents/contracts/analysis-agent.ts","../src/agents/contracts/conversion-agent.ts","../src/agents/contracts/evaluation-agent.ts","../src/agents/contracts/tuning-agent.ts","../src/agents/contracts/gap-analyzer.ts","../src/agents/analysis-agent.ts","../src/agents/evaluation-agent.ts","../src/agents/tuning-agent.ts","../src/agents/report-generator.ts","../src/agents/contracts/evidence.ts","../src/agents/evidence-collector.ts","../src/core/engine/config-store.ts","../src/core/engine/loader.ts","../src/agents/calibration-compute.ts","../src/agents/activity-logger.ts"],"names":["z","GradeSchema","BATCH_SIZE","existsSync","readFileSync","dirname","join","resolve","response","file","componentDefs","interactionDests","loadFile","mkdirSync"],"mappings":"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","file":"index.js","sourcesContent":["{\n \"name\": \"canicode\",\n \"version\": \"0.11.1\",\n \"mcpName\": \"io.github.let-sunny/canicode\",\n \"description\": \"Lint Figma designs for AI code-gen and roundtrip the answers back into the file. CLI + MCP server.\",\n \"type\": \"module\",\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"bin\": {\n \"canicode\": \"dist/cli/index.js\",\n \"canicode-mcp\": \"dist/mcp/server.js\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n }\n },\n \"scripts\": {\n \"build\": \"tsup --config tsup.config.ts && pnpm build:roundtrip && pnpm bundle:skills\",\n \"build:web\": \"bash scripts/build-web.sh\",\n \"build:roundtrip\": \"tsup --config tsup.roundtrip.config.ts\",\n \"bundle:skills\": \"bash scripts/bundle-skills.sh\",\n \"dev\": \"tsup --watch\",\n \"test\": \"vitest\",\n \"test:run\": \"vitest run\",\n \"lint\": \"tsc --noEmit\",\n \"build:plugin\": \"bash scripts/build-plugin.sh\",\n \"sync-docs\": \"tsx scripts/sync-rule-docs.ts\",\n \"check:skill-determinism\": \"tsx scripts/check-skill-determinism.ts\",\n \"clean\": \"rm -rf dist skills\"\n },\n \"files\": [\n \"dist\",\n \"skills\",\n \"README.md\",\n \"docs/CUSTOMIZATION.md\"\n ],\n \"keywords\": [\n \"figma\",\n \"design\",\n \"analysis\",\n \"cli\",\n \"mcp\",\n \"readiness\",\n \"ai\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/let-sunny/canicode.git\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/let-sunny/canicode/issues\"\n },\n \"homepage\": \"https://github.com/let-sunny/canicode\",\n \"author\": \"minseon\",\n \"license\": \"MIT\",\n \"pnpm\": {\n \"overrides\": {\n \"picomatch\": \"4.0.4\",\n \"path-to-regexp\": \"8.4.0\"\n }\n },\n \"packageManager\": \"pnpm@10.32.1\",\n \"engines\": {\n \"node\": \">=22\"\n },\n \"dependencies\": {\n \"@figma/rest-api-spec\": \"^0.36.0\",\n \"@modelcontextprotocol/sdk\": \"^1.27.1\",\n \"cac\": \"^7.0.0\",\n \"dotenv\": \"^17.3.1\",\n \"pixelmatch\": \"^7.1.0\",\n \"pngjs\": \"^7.0.0\",\n \"zod\": \"^4.3.6\"\n },\n \"devDependencies\": {\n \"@anthropic-ai/sdk\": \"^0.80.0\",\n \"@figma/plugin-typings\": \"^1.123.0\",\n \"@types/node\": \"^25.5.0\",\n \"@types/pngjs\": \"^6.0.5\",\n \"playwright\": \"^1.58.2\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.19.0\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.1.0\"\n }\n}\n","import { z } from \"zod\";\n\nexport const SeveritySchema = z.enum([\n \"blocking\",\n \"risk\",\n \"missing-info\",\n \"suggestion\",\n]);\n\nexport type Severity = z.infer<typeof SeveritySchema>;\n\nexport const SEVERITY_WEIGHT: Record<Severity, number> = {\n blocking: 10,\n risk: 5,\n \"missing-info\": 2,\n suggestion: 1,\n};\n\nexport const SEVERITY_LABELS: Record<Severity, string> = {\n blocking: \"Blocking\",\n risk: \"Risk\",\n \"missing-info\": \"Missing Info\",\n suggestion: \"Suggestion\",\n};\n","import { z } from \"zod\";\n\n/**\n * #402 shared output-channel vocabulary.\n * Detection stays rule-based; output channel and persistence intent vary by\n * consumer payload (score/transient vs annotation/durable).\n */\nexport const DetectionSchema = z.literal(\"rule-based\");\nexport const OutputChannelSchema = z.enum([\"score\", \"annotation\"]);\nexport const PersistenceIntentSchema = z.enum([\"transient\", \"durable\"]);\n\nexport type Detection = z.infer<typeof DetectionSchema>;\nexport type OutputChannel = z.infer<typeof OutputChannelSchema>;\nexport type PersistenceIntent = z.infer<typeof PersistenceIntentSchema>;\n\n/**\n * #406 rule purpose classification.\n * - `violation`: score-primary. Node is violating a best-practice expectation;\n * fixing the violation removes the rule fire. Gotcha question is secondary\n * context about how to resolve the violation.\n * - `info-collection`: annotation-primary. Node is not necessarily \"wrong,\"\n * but implementation-critical context is absent from Figma (e.g. click\n * target, interaction states). Gotcha question is the primary output;\n * score impact is intentionally minimal (typically -1 or 0).\n *\n * Detection stays `rule-based` in both cases — see ADR-017.\n */\nexport const RulePurposeSchema = z.enum([\"violation\", \"info-collection\"]);\nexport type RulePurpose = z.infer<typeof RulePurposeSchema>;\n","import { z } from \"zod\";\nimport type { AnalysisNode } from \"./figma-node.js\";\n\n/**\n * #404: Analysis scope — what the user is asking canicode to reason about.\n *\n * - `page`: full screen / section / layout. Container frames are\n * responsible for bounds; repetition detection is meaningful; rules\n * that assume \"this is a self-contained screen\" apply.\n * - `component`: standalone reusable UI unit (COMPONENT / COMPONENT_SET\n * / INSTANCE analyzed in isolation). Root FILL is the design contract\n * rather than a missing bound; repetition detection is generally a\n * false signal because a component is itself the unit of reuse.\n *\n * The enum is intentionally two-valued; multi-scope analysis (analyzing\n * a page and its inner components in one run) is explicitly out of scope\n * per the issue. Each rule decides how (or whether) to switch on `scope`;\n * this PR only carries the context. Rule-level consumption lands in\n * follow-up PRs (e.g. #403 for `missing-size-constraint`).\n */\nexport const AnalysisScopeSchema = z.enum([\"page\", \"component\"]);\nexport type AnalysisScope = z.infer<typeof AnalysisScopeSchema>;\n\n/**\n * Figma node types that unambiguously indicate a component-scope analysis\n * when they appear as the analysis **root**.\n *\n * - `COMPONENT` / `COMPONENT_SET`: the design unit IS the component.\n * - `INSTANCE`: the root is a reusable unit's placement; treating it as\n * component scope keeps rules like `missing-size-constraint` from\n * demanding bounds on a node whose bounds are the container's job.\n *\n * Any other root type (`FRAME`, `SECTION`, `CANVAS`, `DOCUMENT`, `GROUP`,\n * etc.) resolves to page scope — the common case for analyzing a screen\n * or page section via `?node-id=...`.\n */\nconst COMPONENT_SCOPE_ROOT_TYPES = new Set([\"COMPONENT\", \"COMPONENT_SET\", \"INSTANCE\"]);\n\n/**\n * Deterministically detect analysis scope from the root node type. Returns\n * `\"component\"` for `COMPONENT` / `COMPONENT_SET` / `INSTANCE` roots, and\n * `\"page\"` for everything else.\n *\n * The CLI / MCP layer may override this with an explicit `scope` flag when\n * the user knows the heuristic mis-detects (e.g. analyzing a FRAME that\n * ships as a standalone design-system example rather than a screen).\n */\nexport function detectAnalysisScope(rootNode: AnalysisNode): AnalysisScope {\n return COMPONENT_SCOPE_ROOT_TYPES.has(rootNode.type) ? \"component\" : \"page\";\n}\n","import { z } from \"zod\";\n\nexport const CategorySchema = z.enum([\n \"pixel-critical\",\n \"responsive-critical\",\n \"code-quality\",\n \"token-management\",\n \"semantic\",\n \"interaction\",\n]);\n\nexport type Category = z.infer<typeof CategorySchema>;\n\nexport const CATEGORIES = CategorySchema.options;\n\nexport const CATEGORY_LABELS: Record<Category, string> = {\n \"pixel-critical\": \"Pixel Critical\",\n \"responsive-critical\": \"Responsive Critical\",\n \"code-quality\": \"Code Quality\",\n \"token-management\": \"Token Management\",\n \"semantic\": \"Semantic\",\n \"interaction\": \"Interaction\",\n};\n","import { z } from \"zod\";\n\n/**\n * Figma node types required for analysis\n * See @figma/rest-api-spec for full API types\n */\n\nexport const AnalysisNodeTypeSchema = z.enum([\n \"DOCUMENT\",\n \"CANVAS\",\n \"FRAME\",\n \"GROUP\",\n \"SECTION\",\n \"COMPONENT\",\n \"COMPONENT_SET\",\n \"INSTANCE\",\n \"RECTANGLE\",\n \"ELLIPSE\",\n \"VECTOR\",\n \"TEXT\",\n \"LINE\",\n \"BOOLEAN_OPERATION\",\n \"STAR\",\n \"REGULAR_POLYGON\",\n \"SLICE\",\n \"STICKY\",\n \"SHAPE_WITH_TEXT\",\n \"CONNECTOR\",\n \"WIDGET\",\n \"EMBED\",\n \"LINK_UNFURL\",\n \"TABLE\",\n \"TABLE_CELL\",\n \"SLOT\",\n]);\n\nexport type AnalysisNodeType = z.infer<typeof AnalysisNodeTypeSchema>;\n\nexport const LayoutModeSchema = z.enum([\"NONE\", \"HORIZONTAL\", \"VERTICAL\", \"GRID\"]);\nexport type LayoutMode = z.infer<typeof LayoutModeSchema>;\n\nexport const LayoutAlignSchema = z.enum([\"MIN\", \"CENTER\", \"MAX\", \"STRETCH\", \"INHERIT\"]);\nexport type LayoutAlign = z.infer<typeof LayoutAlignSchema>;\n\nexport const LayoutPositioningSchema = z.enum([\"AUTO\", \"ABSOLUTE\"]);\nexport type LayoutPositioning = z.infer<typeof LayoutPositioningSchema>;\n\nexport const LayoutConstraintSchema = z.object({\n horizontal: z.enum([\"LEFT\", \"RIGHT\", \"CENTER\", \"LEFT_RIGHT\", \"SCALE\"]),\n vertical: z.enum([\"TOP\", \"BOTTOM\", \"CENTER\", \"TOP_BOTTOM\", \"SCALE\"]),\n});\nexport type LayoutConstraint = z.infer<typeof LayoutConstraintSchema>;\n\nexport const LayoutWrapSchema = z.enum([\"NO_WRAP\", \"WRAP\"]);\nexport type LayoutWrap = z.infer<typeof LayoutWrapSchema>;\n\nexport const OverflowDirectionSchema = z.enum([\n \"HORIZONTAL_SCROLLING\",\n \"VERTICAL_SCROLLING\",\n \"HORIZONTAL_AND_VERTICAL_SCROLLING\",\n \"NONE\",\n]);\nexport type OverflowDirection = z.infer<typeof OverflowDirectionSchema>;\n\nexport const GridChildAlignSchema = z.enum([\"AUTO\", \"MIN\", \"CENTER\", \"MAX\"]);\nexport type GridChildAlign = z.infer<typeof GridChildAlignSchema>;\n\n/**\n * Lightweight FigmaNode type for analysis\n * Contains only properties needed by rules\n */\nconst BaseAnalysisNodeSchema = z.object({\n // Basic identification\n id: z.string(),\n name: z.string(),\n type: AnalysisNodeTypeSchema,\n visible: z.boolean().default(true),\n\n // Layout analysis\n layoutMode: LayoutModeSchema.optional(),\n layoutAlign: LayoutAlignSchema.optional(),\n layoutPositioning: LayoutPositioningSchema.optional(),\n layoutSizingHorizontal: z.enum([\"FIXED\", \"HUG\", \"FILL\"]).optional(),\n layoutSizingVertical: z.enum([\"FIXED\", \"HUG\", \"FILL\"]).optional(),\n primaryAxisAlignItems: z.string().optional(),\n counterAxisAlignItems: z.string().optional(),\n itemSpacing: z.number().optional(),\n paddingLeft: z.number().optional(),\n paddingRight: z.number().optional(),\n paddingTop: z.number().optional(),\n paddingBottom: z.number().optional(),\n\n // Size constraints (responsive)\n minWidth: z.number().optional(),\n maxWidth: z.number().optional(),\n minHeight: z.number().optional(),\n maxHeight: z.number().optional(),\n layoutGrow: z.union([z.literal(0), z.literal(1)]).optional(),\n constraints: LayoutConstraintSchema.optional(),\n\n // Wrap (flex-wrap)\n layoutWrap: LayoutWrapSchema.optional(),\n counterAxisSpacing: z.number().optional(),\n counterAxisAlignContent: z.enum([\"AUTO\", \"SPACE_BETWEEN\"]).optional(),\n\n // Grid layout (container)\n gridRowCount: z.number().optional(),\n gridColumnCount: z.number().optional(),\n gridRowGap: z.number().optional(),\n gridColumnGap: z.number().optional(),\n gridColumnsSizing: z.string().optional(),\n gridRowsSizing: z.string().optional(),\n\n // Grid layout (child)\n gridChildHorizontalAlign: GridChildAlignSchema.optional(),\n gridChildVerticalAlign: GridChildAlignSchema.optional(),\n gridRowSpan: z.number().optional(),\n gridColumnSpan: z.number().optional(),\n gridRowAnchorIndex: z.number().optional(),\n gridColumnAnchorIndex: z.number().optional(),\n\n // Overflow / clip\n clipsContent: z.boolean().optional(),\n overflowDirection: OverflowDirectionSchema.optional(),\n\n // Size/position analysis\n absoluteBoundingBox: z\n .object({\n x: z.number(),\n y: z.number(),\n width: z.number(),\n height: z.number(),\n })\n .nullable()\n .optional(),\n\n // Component analysis\n componentId: z.string().optional(),\n componentPropertyDefinitions: z.record(z.string(), z.unknown()).optional(),\n componentProperties: z.record(z.string(), z.unknown()).optional(),\n\n // Style/token analysis\n styles: z.record(z.string(), z.string()).optional(),\n fills: z.array(z.unknown()).optional(),\n strokes: z.array(z.unknown()).optional(),\n strokeWeight: z.number().optional(),\n individualStrokeWeights: z.record(z.string(), z.number()).optional(),\n effects: z.array(z.unknown()).optional(),\n cornerRadius: z.number().optional(),\n opacity: z.number().optional(),\n\n // Variable binding analysis (design tokens)\n boundVariables: z.record(z.string(), z.unknown()).optional(),\n\n // Text analysis\n characters: z.string().optional(),\n style: z.record(z.string(), z.unknown()).optional(),\n textTruncation: z.enum([\"DISABLED\", \"ENDING\"]).optional(),\n maxLines: z.number().optional(),\n\n // Handoff analysis\n devStatus: z\n .object({\n type: z.enum([\"NONE\", \"READY_FOR_DEV\", \"COMPLETED\"]),\n description: z.string().optional(),\n })\n .optional(),\n\n // Prototype interactions\n interactions: z.array(z.unknown()).optional(),\n\n // Naming analysis metadata\n isAsset: z.boolean().optional(),\n});\n\nexport type AnalysisNode = z.infer<typeof BaseAnalysisNodeSchema> & {\n children?: AnalysisNode[] | undefined;\n};\n\nexport const AnalysisNodeSchema: z.ZodType<AnalysisNode> =\n BaseAnalysisNodeSchema.extend({\n children: z.lazy(() => AnalysisNodeSchema.array().optional()),\n }) as z.ZodType<AnalysisNode>;\n\n/**\n * Figma file metadata for analysis\n */\nexport const AnalysisFileSchema = z.object({\n fileKey: z.string(),\n name: z.string(),\n lastModified: z.string(),\n version: z.string(),\n sourceUrl: z.string().optional(),\n document: AnalysisNodeSchema,\n components: z.record(\n z.string(),\n z.object({\n key: z.string(),\n name: z.string(),\n description: z.string(),\n })\n ),\n componentDefinitions: z.record(z.string(), AnalysisNodeSchema).optional(),\n interactionDestinations: z.record(z.string(), AnalysisNodeSchema).optional(),\n styles: z.record(\n z.string(),\n z.object({\n key: z.string(),\n name: z.string(),\n styleType: z.string(),\n })\n ),\n});\n\nexport type AnalysisFile = z.infer<typeof AnalysisFileSchema>;\n","import { z } from \"zod\";\nimport type { AnalysisScope } from \"./analysis-scope.js\";\nimport { CategorySchema, type Category } from \"./category.js\";\nimport { SeveritySchema } from \"./severity.js\";\nimport type { AnalysisFile, AnalysisNode } from \"./figma-node.js\";\n\n/**\n * Rule definition - static metadata (does not change)\n */\nexport const RuleDefinitionSchema = z.object({\n id: z.string(),\n name: z.string(),\n category: CategorySchema,\n why: z.string(),\n impact: z.string(),\n fix: z.string(),\n});\n\nexport type RuleDefinition = z.infer<typeof RuleDefinitionSchema>;\n\n/**\n * Rule config - adjustable settings (can be modified via presets)\n */\nexport const RuleConfigSchema = z.object({\n severity: SeveritySchema,\n score: z.number().int().max(0),\n depthWeight: z.number().min(1).max(2).optional(),\n enabled: z.boolean().default(true),\n options: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport type RuleConfig = z.infer<typeof RuleConfigSchema>;\n\n/**\n * Context passed to rule check functions\n */\nexport interface RuleContext {\n file: AnalysisFile;\n parent?: AnalysisNode | undefined;\n depth: number;\n /** Depth relative to the nearest COMPONENT/INSTANCE ancestor. Resets at component boundaries. */\n componentDepth: number;\n maxDepth: number;\n path: string[];\n /** Ancestor node types from root to parent (excludes current node). */\n ancestorTypes: string[];\n siblings?: AnalysisNode[] | undefined;\n /** Per-analysis shared state. Created fresh for each analysis run, eliminating module-level mutable state. */\n analysisState: Map<string, unknown>;\n /**\n * #404: Scope of the analysis root (`page` vs `component`). Rules use\n * this to decide whether expectations like \"container must define\n * bounds\" or \"repetition should become a component\" apply. Constant for\n * all nodes in a single analysis — whether the CURRENT node happens to\n * be a `COMPONENT` descendant of a page root is already signalled by\n * `componentDepth`, not by re-deriving scope per node.\n */\n scope: AnalysisScope;\n /**\n * #403: Figma node type of the analysis root, captured once in\n * `RuleEngine.analyze`. This is an *axis orthogonal to* `scope`:\n * `scope === \"component\"` does not tell a rule whether the root is a\n * `COMPONENT`/`COMPONENT_SET` (component being audited) or an\n * `INSTANCE` (component being used, possibly with overrides). The\n * `missing-size-constraint` redesign needs that distinction so the\n * gotcha question can ask the right thing — \"intentionally\n * non-responsive?\" vs \"override intended? original may be FILL\". The\n * value is the raw Figma node type string (no new enum) so it stays in\n * sync with `AnalysisNode.type` without a translation layer.\n */\n rootNodeType: string;\n}\n\n/**\n * Get or initialize per-analysis state for a rule.\n * Each key gets its own lazily-initialized state that persists for the duration of one analysis run.\n */\nexport function getAnalysisState<T>(context: RuleContext, key: string, init: () => T): T {\n if (context.analysisState.has(key)) {\n return context.analysisState.get(key) as T;\n }\n const value = init();\n context.analysisState.set(key, value);\n return value;\n}\n\n/**\n * Rule violation result from check function\n */\nexport interface RuleViolation {\n ruleId: string;\n subType?: string;\n nodeId: string;\n nodePath: string;\n message: string;\n suggestion: string;\n guide?: string;\n /**\n * Pre-computed name to write to `node.name` in Figma — populated by naming\n * rules whose suggestion is a deterministic function of the node's existing\n * state (`non-standard-naming`, `inconsistent-naming-convention`).\n * Capitalized for direct Plugin-API use; the human-readable `suggestion`\n * string keeps lowercase prose.\n */\n suggestedName?: string;\n}\n\n/**\n * Rule check function signature\n */\nexport type RuleCheckFn = (\n node: AnalysisNode,\n context: RuleContext,\n options?: Record<string, unknown>\n) => RuleViolation | null;\n\n/**\n * Complete rule with definition, config, and check function\n */\nexport interface Rule {\n definition: RuleDefinition;\n check: RuleCheckFn;\n}\n\n/**\n * Rule ID type for type safety\n */\nexport type RuleId =\n // Pixel Critical — layout issues that directly affect pixel accuracy (ΔV ≥ 5%)\n | \"no-auto-layout\"\n | \"absolute-position-in-auto-layout\"\n | \"non-layout-container\"\n // Responsive Critical — size issues that break at different viewports (ΔV ≥ 15%)\n | \"fixed-size-in-auto-layout\"\n | \"missing-size-constraint\"\n // Code Quality — structural issues affecting code reuse (ΔV ≈ 0%, CSS classes -8~15)\n | \"missing-component\"\n | \"detached-instance\"\n | \"variant-structure-mismatch\"\n | \"deep-nesting\"\n // Token Management — raw values without design tokens\n | \"raw-value\"\n | \"irregular-spacing\"\n // Interaction — missing state variants and prototype links for interactive components\n | \"missing-interaction-state\"\n | \"missing-prototype\"\n // Semantic — naming issues with negligible pixel impact (ΔV < 2%)\n | \"non-standard-naming\"\n | \"non-semantic-name\"\n | \"inconsistent-naming-convention\";\n\n/**\n * Categories that support depthWeight\n */\nexport const DEPTH_WEIGHT_CATEGORIES: Category[] = [\"pixel-critical\", \"responsive-critical\"];\n\n/**\n * Check if a category supports depth weighting\n */\nexport function supportsDepthWeight(category: Category): boolean {\n return DEPTH_WEIGHT_CATEGORIES.includes(category);\n}\n","import { z } from \"zod\";\nimport { SeveritySchema } from \"./severity.js\";\n\nexport const IssueSchema = z.object({\n nodeId: z.string(),\n nodePath: z.string(),\n figmaDeepLink: z.string().url(),\n ruleId: z.string(),\n message: z.string(),\n severity: SeveritySchema,\n});\n\nexport type Issue = z.infer<typeof IssueSchema>;\n","import { z } from \"zod\";\nimport { CategorySchema } from \"./category.js\";\n\nexport const CategoryScoreSchema = z.object({\n category: CategorySchema,\n score: z.number().min(0).max(100),\n maxScore: z.number().min(0).max(100),\n issueCount: z.object({\n error: z.number().int().min(0),\n warning: z.number().int().min(0),\n info: z.number().int().min(0),\n }),\n});\n\nexport type CategoryScore = z.infer<typeof CategoryScoreSchema>;\n","import { z } from \"zod\";\nimport { CategoryScoreSchema } from \"./score.js\";\nimport { IssueSchema } from \"./issue.js\";\n\nexport const ReportMetadataSchema = z.object({\n fileKey: z.string(),\n fileName: z.string(),\n analyzedAt: z.string().datetime(),\n version: z.string(),\n});\n\nexport type ReportMetadata = z.infer<typeof ReportMetadataSchema>;\n\nexport const ReportSchema = z.object({\n metadata: ReportMetadataSchema,\n totalScore: z.number().min(0).max(100),\n categoryScores: z.array(CategoryScoreSchema),\n issues: z.array(IssueSchema),\n summary: z.object({\n totalNodes: z.number().int().min(0),\n analyzedNodes: z.number().int().min(0),\n errorCount: z.number().int().min(0),\n warningCount: z.number().int().min(0),\n infoCount: z.number().int().min(0),\n }),\n});\n\nexport type Report = z.infer<typeof ReportSchema>;\n","import { z } from \"zod\";\n\nconst positiveCliNumber = z\n .union([z.string(), z.number()])\n .transform((v) => Number(v))\n .refine(Number.isFinite, \"must be a valid number\")\n .refine((v) => v > 0, \"must be positive\");\n\nconst figmaScaleNumber = z\n .union([z.string(), z.number()])\n .transform((v) => Number(v))\n .refine(Number.isFinite, \"must be a valid number\")\n .refine((v) => v >= 1, \"must be >= 1\");\n\n/** Zod schema for CLI visual-compare options (raw CLI input). */\nexport const VisualCompareCliOptionsSchema = z.object({\n figmaUrl: z.string().optional(),\n figmaScreenshot: z.string().optional(),\n token: z.string().optional(),\n output: z.string().optional(),\n width: positiveCliNumber.optional(),\n height: positiveCliNumber.optional(),\n figmaScale: figmaScaleNumber.optional(),\n expandRoot: z.boolean().optional(),\n});\n\nexport type VisualCompareCliOptions = z.infer<typeof VisualCompareCliOptionsSchema>;\n","import { z } from \"zod\";\nimport { SeveritySchema } from \"./severity.js\";\nimport { CategorySchema } from \"./category.js\";\nimport { AnalysisScopeSchema } from \"./analysis-scope.js\";\nimport {\n DetectionSchema,\n OutputChannelSchema,\n PersistenceIntentSchema,\n RulePurposeSchema,\n} from \"./channels.js\";\n\nconst GradeSchema = z.enum([\"S\", \"A+\", \"A\", \"B+\", \"B\", \"C+\", \"C\", \"D\", \"F\"]);\n\nconst CategoryScoreResultSchema = z.object({\n category: CategorySchema,\n score: z.number(),\n maxScore: z.number(),\n percentage: z.number(),\n issueCount: z.number().int().min(0),\n uniqueRuleCount: z.number().int().min(0),\n weightedIssueCount: z.number(),\n densityScore: z.number(),\n diversityScore: z.number(),\n bySeverity: z.object({\n blocking: z.number().int().min(0),\n risk: z.number().int().min(0),\n \"missing-info\": z.number().int().min(0),\n suggestion: z.number().int().min(0),\n }),\n});\n\nconst McpIssueSchema = z.object({\n ruleId: z.string(),\n detection: DetectionSchema,\n outputChannel: OutputChannelSchema.extract([\"score\"]),\n persistenceIntent: PersistenceIntentSchema.extract([\"transient\"]),\n /**\n * #406: Whether the triggering rule's primary output is a score penalty\n * (`violation`) or a gotcha annotation (`info-collection`). MCP consumers\n * use this to decide whether the issue is actionable (\"fix this\") or\n * annotation-seeking (\"tell us what you meant here\").\n */\n purpose: RulePurposeSchema,\n subType: z.string().optional(),\n severity: SeveritySchema,\n nodeId: z.string(),\n nodePath: z.string(),\n message: z.string(),\n});\n\n/**\n * Zod schema for the MCP analyze tool response body.\n * This is the shape of the JSON returned by `buildResultJson` in scoring.ts.\n */\nexport const McpAnalyzeResponseSchema = z.object({\n version: z.string(),\n analyzedAt: z.string(),\n fileKey: z.string().optional(),\n fileName: z.string(),\n nodeCount: z.number().int().min(0),\n maxDepth: z.number().int().min(0),\n /**\n * #404: Resolved analysis scope (`page` vs `component`). Downstream\n * consumers (e.g. `figma-implement-design`, gotcha UI) branch on this\n * the same way rules do — a component-scope result should not be\n * treated as if container bounds are missing, and repetition detection\n * on a component-scope result is not meaningful.\n */\n scope: AnalysisScopeSchema,\n issueCount: z.number().int().min(0),\n isReadyForCodeGen: z.boolean(),\n blockingIssueCount: z.number().int().min(0),\n scores: z.object({\n overall: z.object({\n score: z.number(),\n maxScore: z.number(),\n percentage: z.number(),\n grade: GradeSchema,\n }),\n categories: z.record(CategorySchema, CategoryScoreResultSchema),\n }),\n issuesByRule: z.record(z.string(), z.number().int().min(0)),\n issues: z.array(McpIssueSchema),\n summary: z.string(),\n failedRules: z.array(z.string()).optional(),\n});\n\nexport type McpAnalyzeResponse = z.infer<typeof McpAnalyzeResponseSchema>;\n","import { z } from \"zod\";\nimport { SeveritySchema } from \"./severity.js\";\nimport {\n DetectionSchema,\n OutputChannelSchema,\n PersistenceIntentSchema,\n RulePurposeSchema,\n} from \"./channels.js\";\n\nconst GradeSchema = z.enum([\"S\", \"A+\", \"A\", \"B+\", \"B\", \"C+\", \"C\", \"D\", \"F\"]);\n\nexport const InstanceContextSchema = z.object({\n parentInstanceNodeId: z.string(),\n sourceNodeId: z.string(),\n sourceComponentId: z.string().optional(),\n sourceComponentName: z.string().optional(),\n});\n\nexport type InstanceContext = z.infer<typeof InstanceContextSchema>;\n\n/**\n * Apply-strategy enum surfaced on survey questions and analyze-output issues.\n * Mirrors `RuleApplyStrategy` in `src/core/gotcha/apply-context.ts` —\n * declared as a Zod enum here so MCP responses validate end-to-end.\n */\nexport const RuleApplyStrategySchema = z.enum([\n \"property-mod\",\n \"structural-mod\",\n \"annotation\",\n \"auto-fix\",\n]);\n\nexport type RuleApplyStrategy = z.infer<typeof RuleApplyStrategySchema>;\n\nconst TargetPropertySchema = z.union([z.string(), z.array(z.string())]);\n\n/**\n * Mirrors the `AnnotationProperty` interface in `src/core/roundtrip/types.ts`.\n * Declared here per the project's Zod convention (schemas live in contracts/)\n * so MCP responses validate end-to-end.\n */\nexport const AnnotationPropertySchema = z.object({ type: z.string() });\n\n/**\n * #402: Gotcha output is generated by a rule-based detection pass but flows\n * to the annotation channel (not the score channel). Answers are durable\n * context intended to survive beyond a single re-analysis cycle.\n */\nexport const GotchaDetectionSchema = DetectionSchema;\nexport const GotchaOutputChannelSchema = OutputChannelSchema.extract([\n \"annotation\",\n]);\nexport const GotchaPersistenceIntentSchema = PersistenceIntentSchema.extract([\n \"durable\",\n]);\n\nexport const GotchaSurveyQuestionSchema = z.object({\n nodeId: z.string(),\n nodeName: z.string(),\n ruleId: z.string(),\n detection: GotchaDetectionSchema,\n outputChannel: GotchaOutputChannelSchema,\n persistenceIntent: GotchaPersistenceIntentSchema,\n /**\n * #406: Classifies the triggering rule as `violation` (score-primary,\n * gotcha secondary) or `info-collection` (annotation-primary, score\n * minimal). Consumers use this to prioritize answers that collect durable\n * implementation context over answers that merely describe how to fix a\n * violation the rule will stop firing for.\n */\n purpose: RulePurposeSchema,\n severity: SeveritySchema,\n question: z.string(),\n hint: z.string(),\n example: z.string(),\n instanceContext: InstanceContextSchema.optional(),\n applyStrategy: RuleApplyStrategySchema,\n targetProperty: TargetPropertySchema.optional(),\n annotationProperties: z.array(AnnotationPropertySchema).optional(),\n suggestedName: z.string().optional(),\n isInstanceChild: z.boolean(),\n sourceChildId: z.string().optional(),\n // #356: when this question collapses N instance-child issues that share the\n // same `(sourceComponentId, sourceNodeId, ruleId)` tuple, `replicas` is the\n // total instance count (>=2) and `replicaNodeIds` lists every instance scene\n // node id OTHER than the kept `nodeId`. Apply step iterates\n // `[nodeId, ...replicaNodeIds]` so the same answer lands on every replica.\n // Single-instance questions omit both fields.\n replicas: z.number().int().min(2).optional(),\n replicaNodeIds: z.array(z.string()).optional(),\n});\n\nexport type GotchaSurveyQuestion = z.infer<typeof GotchaSurveyQuestionSchema>;\n\n/**\n * Pre-grouped+batched view of `questions` (#369, #370, #381). Decoupled from\n * `questions` so consumers that just want the flat list can ignore it; SKILLs\n * (`canicode-gotchas`, `canicode-roundtrip`) iterate over `groupedQuestions`\n * to keep sort / partition / batchable-rule decisions out of the LLM's\n * prose interpretation, per ADR-016.\n *\n * Generated by `groupAndBatchSurveyQuestions` in `core/gotcha/`. Sort key is\n * `(sourceComponentId ?? \"_no-source\", ruleId, nodeName)`. Source-component\n * groups are emitted first; the trailing group with `instanceContext: null`\n * carries every non-instance question.\n */\nexport const SurveyQuestionBatchSchema = z.object({\n ruleId: z.string(),\n /**\n * `true` when every member shares an answer-shape uniformly applicable to\n * all of them (e.g. one `min-width` value covers all FILL children).\n * The SKILL renders one shared prompt for `batchable: true` batches with\n * `questions.length >= 2`; everything else falls through to the\n * single-question template.\n */\n batchable: z.boolean(),\n questions: z.array(GotchaSurveyQuestionSchema),\n /**\n * Sum of `max(question.replicas, 1)` across `questions`. Counts the\n * actual Figma scene fan-out so the SKILL can render `N instances`\n * accurately even when one batch member already collapses multiple\n * replicas via the #356 source-component dedupe.\n */\n totalScenes: z.number().int().min(1),\n});\n\nexport type SurveyQuestionBatch = z.infer<typeof SurveyQuestionBatchSchema>;\n\nexport const SurveyQuestionGroupSchema = z.object({\n /**\n * Shared `instanceContext` for the group, or `null` for the trailing\n * non-instance group. The SKILL emits the verbose \"Instance note\" header\n * once per non-null group instead of once per question (#370).\n */\n instanceContext: InstanceContextSchema.nullable(),\n batches: z.array(SurveyQuestionBatchSchema),\n});\n\nexport type SurveyQuestionGroup = z.infer<typeof SurveyQuestionGroupSchema>;\n\nexport const GroupedSurveySchema = z.object({\n groups: z.array(SurveyQuestionGroupSchema),\n});\n\nexport type GroupedSurvey = z.infer<typeof GroupedSurveySchema>;\n\nexport const GotchaSurveySchema = z.object({\n designGrade: GradeSchema,\n isReadyForCodeGen: z.boolean(),\n questions: z.array(GotchaSurveyQuestionSchema),\n groupedQuestions: GroupedSurveySchema,\n /**\n * #384 — canonical identifier for this design across canicode runs.\n * Computed by `computeDesignKey(input)` (`<fileKey>#<nodeId>` for Figma\n * URLs, absolute path for fixtures). The `canicode-gotchas` SKILL reads\n * this directly when upserting the per-design section, so the SKILL.md\n * prose no longer parses URLs (per ADR-016).\n */\n designKey: z.string(),\n});\n\nexport type GotchaSurvey = z.infer<typeof GotchaSurveySchema>;\n","import type { Category } from \"../contracts/category.js\";\nimport type { RulePurpose } from \"../contracts/channels.js\";\nimport type { RuleConfig, RuleId } from \"../contracts/rule.js\";\nimport type { AnnotationProperty } from \"../roundtrip/types.js\";\n\n/**\n * Maps each rule ID to its category.\n * Categories are based on ablation experiment data (PR #149, #150):\n * - pixel-critical: ΔV ≥ 5% — layout info removal directly degrades pixel accuracy\n * - responsive-critical: ΔV ≥ 15% at expanded viewport — size info critical for responsive\n * - code-quality: ΔV ≈ 0% but CSS classes -8~15 — affects code structure, not pixels\n * - token-management: raw values without design tokens — wrong input = wrong output\n * - semantic: ΔV < 2%, negligible code difference — naming and semantic issues\n */\nexport const RULE_ID_CATEGORY: Record<RuleId, Category> = {\n // Pixel Critical\n \"no-auto-layout\": \"pixel-critical\",\n \"absolute-position-in-auto-layout\": \"pixel-critical\",\n \"non-layout-container\": \"pixel-critical\",\n // Responsive Critical\n \"fixed-size-in-auto-layout\": \"responsive-critical\",\n \"missing-size-constraint\": \"responsive-critical\",\n // Code Quality\n \"missing-component\": \"code-quality\",\n \"detached-instance\": \"code-quality\",\n \"variant-structure-mismatch\": \"code-quality\",\n \"deep-nesting\": \"code-quality\",\n // Token Management\n \"raw-value\": \"token-management\",\n \"irregular-spacing\": \"token-management\",\n // Interaction\n \"missing-interaction-state\": \"interaction\",\n \"missing-prototype\": \"interaction\",\n // Semantic\n \"non-standard-naming\": \"semantic\",\n \"non-semantic-name\": \"semantic\",\n \"inconsistent-naming-convention\": \"semantic\",\n};\n\n/**\n * #406: Classifies each rule by primary output channel.\n *\n * - `violation` (default): score-primary. Rule fires when a best-practice\n * expectation is broken; the score penalty is the main signal, gotcha\n * questions are secondary context on how to resolve the violation.\n * - `info-collection`: annotation-primary. Rule fires on nodes that need\n * implementation context Figma cannot encode natively (click target,\n * state variants). The gotcha annotation IS the output; score impact is\n * kept minimal (-1 range) so presence/absence of the annotation — not\n * the penalty — differentiates designs.\n *\n * Sibling map (mirrors `RULE_ID_CATEGORY`) so existing `RuleDefinition`\n * call sites don't need to be touched. Look up via `getRulePurpose`.\n */\nexport const RULE_PURPOSE: Record<RuleId, RulePurpose> = {\n // Pixel Critical\n \"no-auto-layout\": \"violation\",\n \"absolute-position-in-auto-layout\": \"violation\",\n \"non-layout-container\": \"violation\",\n // Responsive Critical\n \"fixed-size-in-auto-layout\": \"violation\",\n // #403: missing-size-constraint reframed as info-collection. The rule\n // fires on width chains whose intent is structurally undecidable\n // (FILL container with no chain-bound ancestor; FIXED component or\n // instance root). The gotcha question is the primary signal; the\n // -1 score is just enough to keep the rule visible in\n // diversity scoring without driving grade swings on its own.\n \"missing-size-constraint\": \"info-collection\",\n // Code Quality\n \"missing-component\": \"violation\",\n \"detached-instance\": \"violation\",\n \"variant-structure-mismatch\": \"violation\",\n \"deep-nesting\": \"violation\",\n // Token Management\n \"raw-value\": \"violation\",\n \"irregular-spacing\": \"violation\",\n // Interaction — gotcha-primary: Figma cannot encode \"what happens on\n // click\" or \"which states exist\" in a way downstream code generation can\n // consume. Rules fire to trigger the annotation, not to flag a violation.\n \"missing-interaction-state\": \"info-collection\",\n \"missing-prototype\": \"info-collection\",\n // Semantic\n \"non-standard-naming\": \"violation\",\n \"non-semantic-name\": \"violation\",\n \"inconsistent-naming-convention\": \"violation\",\n};\n\n/**\n * Resolve a rule's purpose. Accepts `string` (not `RuleId`) because the\n * purpose concept must work for out-of-tree custom rules added via the\n * config loader — callers pass `issue.violation.ruleId` which is a plain\n * string. Defaults to `\"violation\"` for unknown ids. Keeping the cast\n * inside this helper (rather than forcing every caller to do `as RuleId`)\n * makes the fallback semantically honest.\n */\nexport function getRulePurpose(ruleId: string): RulePurpose {\n return RULE_PURPOSE[ruleId as RuleId] ?? \"violation\";\n}\n\n/**\n * Central configuration for all rules.\n * Scores based on ablation experiment + AI implementation interview (#200):\n * - pixel-critical: -10 ~ -7 (layout strip caused ΔV +5.4%)\n * - responsive-critical: -8 ~ -6 (size-constraints ΔV +15.9% at responsive viewports)\n * - code-quality: -7 ~ -3 (CSS classes -8~15, no pixel impact)\n * - token-management: -5 ~ -4 (wrong input = wrong output, irregular spacing actively causes errors)\n * - interaction: -1 (uncalibrated — no metric to validate, kept minimal #210)\n * - semantic: -4 ~ -1 (non-semantic-name upgraded per interview — causes actual implementation errors)\n *\n * Category weights removed (#196) — overall score is simple average of categories.\n */\nexport const RULE_CONFIGS: Record<RuleId, RuleConfig> = {\n // ── Pixel Critical ──\n \"no-auto-layout\": {\n severity: \"blocking\",\n score: -10,\n depthWeight: 1.5,\n enabled: true,\n },\n \"absolute-position-in-auto-layout\": {\n severity: \"blocking\",\n score: -7,\n depthWeight: 1.3,\n enabled: true,\n },\n \"non-layout-container\": {\n severity: \"blocking\",\n score: -8,\n depthWeight: 1.2,\n enabled: true,\n },\n\n // ── Responsive Critical ──\n \"fixed-size-in-auto-layout\": {\n severity: \"risk\",\n score: -6,\n enabled: true,\n },\n \"missing-size-constraint\": {\n // #403: severity downgraded `risk → missing-info` and score from\n // -8 → -1 to match the new info-collection purpose. Keeping the\n // rule enabled (not disabled) so its gotchas still surface in the\n // survey — see RULE_PURPOSE entry above for the full rationale.\n severity: \"missing-info\",\n score: -1,\n enabled: true,\n },\n\n // ── Code Quality ──\n \"missing-component\": {\n severity: \"risk\",\n score: -7,\n enabled: true,\n options: {\n minRepetitions: 2,\n structureMinRepetitions: 2,\n maxFingerprintDepth: 3,\n },\n },\n \"detached-instance\": {\n severity: \"risk\",\n score: -4,\n enabled: true,\n },\n \"variant-structure-mismatch\": {\n severity: \"risk\",\n score: -6,\n enabled: true,\n },\n \"deep-nesting\": {\n severity: \"risk\",\n score: -3,\n enabled: true,\n options: {\n maxDepth: 5,\n },\n },\n\n // ── Token Management ──\n \"raw-value\": {\n severity: \"missing-info\",\n score: -4,\n enabled: true,\n },\n \"irregular-spacing\": {\n severity: \"risk\",\n score: -5,\n enabled: true,\n options: {\n gridBase: 2,\n },\n },\n\n // ── Interaction ──\n // #406: both rules are `info-collection` — primary output is the gotcha\n // annotation, not the score. Severity is `missing-info` so they surface in\n // the gotcha survey (see `generateGotchaSurvey`) even though the penalty\n // is minimal. Score stays at -1 so re-enabling `missing-prototype` on\n // fixtures that lack `interactionDestinations` (#139) cannot swing grades.\n \"missing-interaction-state\": {\n severity: \"missing-info\",\n score: -1, // uncalibrated: no metric to validate score (#210), kept at -1 to preserve category visibility\n enabled: true,\n },\n \"missing-prototype\": {\n severity: \"missing-info\",\n score: -1, // #406: info-collection — annotation is primary output; score kept minimal so #139 fixtures don't skew calibration\n enabled: true,\n },\n\n // ── Semantic ──\n \"non-standard-naming\": {\n severity: \"suggestion\",\n score: -3, // higher than other naming rules: non-standard state names break interaction detection pipeline\n enabled: true,\n },\n \"non-semantic-name\": {\n severity: \"risk\",\n score: -4,\n enabled: true,\n },\n \"inconsistent-naming-convention\": {\n severity: \"suggestion\",\n score: -1,\n enabled: true,\n },\n};\n\n/**\n * Preset types for different analysis modes\n */\nexport type Preset = \"relaxed\" | \"dev-friendly\" | \"ai-ready\" | \"strict\";\n\n/**\n * Get rule configs with preset applied\n */\nexport function getConfigsWithPreset(\n preset: Preset\n): Record<RuleId, RuleConfig> {\n const configs = { ...RULE_CONFIGS };\n\n switch (preset) {\n case \"relaxed\":\n // Disable blocking rules, reduce scores\n for (const [id, config] of Object.entries(configs)) {\n if (config.severity === \"blocking\") {\n configs[id as RuleId] = {\n ...config,\n severity: \"risk\",\n score: Math.round(config.score * 0.5),\n };\n }\n }\n break;\n\n case \"dev-friendly\":\n // Focus on pixel-critical and responsive-critical issues\n for (const [id, config] of Object.entries(configs)) {\n const ruleId = id as RuleId;\n const category = RULE_ID_CATEGORY[ruleId];\n if (category !== \"pixel-critical\" && category !== \"responsive-critical\") {\n configs[ruleId] = { ...config, enabled: false };\n }\n }\n break;\n\n case \"ai-ready\":\n // Boost pixel-critical and token-management rules\n for (const [id, config] of Object.entries(configs)) {\n const ruleId = id as RuleId;\n const category = RULE_ID_CATEGORY[ruleId];\n if (category === \"pixel-critical\" || category === \"token-management\") {\n configs[ruleId] = {\n ...config,\n score: Math.round(config.score * 1.5),\n };\n }\n }\n break;\n\n case \"strict\":\n // Increase scores but respect disabled rules\n for (const [id, config] of Object.entries(configs)) {\n configs[id as RuleId] = {\n ...config,\n score: Math.round(config.score * 1.5),\n };\n }\n break;\n }\n\n return configs;\n}\n\n/**\n * Per-rule annotation `properties` hints surfaced in Dev Mode. Kept as a\n * sibling map rather than a field on `RuleConfig` so the existing\n * `RuleConfigSchema` Zod contract and preset helpers stay untouched.\n *\n * `bySubType` takes precedence over `default` — mirrors the ruleId+subType\n * resolution pattern already used for `targetProperty` in apply-context.ts.\n * The Experiment 09 node-type matrix is enforced at write time by\n * `upsertCanicodeAnnotation`'s retry path, so hints can be passed\n * speculatively without server-side filtering.\n */\nexport const RULE_ANNOTATION_PROPERTIES: Partial<\n Record<\n RuleId,\n {\n default?: AnnotationProperty[];\n bySubType?: Record<string, AnnotationProperty[]>;\n }\n >\n> = {\n \"missing-size-constraint\": {\n // #403: width-only — the redesigned rule does not evaluate the\n // height axis (deferred follow-up). Emitting a `height` annotation\n // here would mark properties the rule never inspected and confuse\n // downstream Dev Mode hints.\n default: [{ type: \"width\" }],\n },\n \"irregular-spacing\": {\n bySubType: {\n gap: [{ type: \"itemSpacing\" }],\n padding: [{ type: \"padding\" }],\n },\n },\n \"fixed-size-in-auto-layout\": {\n default: [{ type: \"width\" }, { type: \"height\" }, { type: \"layoutMode\" }],\n },\n \"raw-value\": {\n bySubType: {\n color: [{ type: \"fills\" }],\n font: [\n { type: \"fontSize\" },\n { type: \"fontFamily\" },\n { type: \"fontWeight\" },\n { type: \"lineHeight\" },\n ],\n spacing: [{ type: \"itemSpacing\" }, { type: \"padding\" }],\n },\n },\n \"absolute-position-in-auto-layout\": {\n default: [{ type: \"layoutMode\" }],\n },\n};\n\n/**\n * Resolve the annotation `properties` hint for a ruleId (+ subType).\n * Returns `undefined` for rules with no entry.\n */\nexport function getAnnotationProperties(\n ruleId: RuleId,\n subType?: string\n): AnnotationProperty[] | undefined {\n const entry = RULE_ANNOTATION_PROPERTIES[ruleId];\n if (!entry) return undefined;\n if (subType !== undefined && entry.bySubType) {\n const match = entry.bySubType[subType];\n if (match) return match;\n }\n return entry.default;\n}\n\n/**\n * Get option value for a rule with type safety\n */\nexport function getRuleOption<T>(\n ruleId: RuleId,\n optionKey: string,\n defaultValue: T\n): T {\n const config = RULE_CONFIGS[ruleId];\n if (!config.options) return defaultValue;\n const value = config.options[optionKey];\n return (value as T) ?? defaultValue;\n}\n","import type { Rule, RuleConfig, RuleId } from \"../contracts/rule.js\";\nimport type { Category } from \"../contracts/category.js\";\nimport { RULE_CONFIGS } from \"./rule-config.js\";\n\n/**\n * Registry for all rules\n */\nclass RuleRegistry {\n private rules: Map<RuleId, Rule> = new Map();\n\n /**\n * Register a rule\n */\n register(rule: Rule): void {\n this.rules.set(rule.definition.id as RuleId, rule);\n }\n\n /**\n * Remove a rule by ID. Primarily used by tests that register a\n * throwaway rule and need to restore the registry afterwards. Returns\n * `true` if the rule was present.\n */\n unregister(id: RuleId): boolean {\n return this.rules.delete(id);\n }\n\n /**\n * Get a rule by ID\n */\n get(id: RuleId): Rule | undefined {\n return this.rules.get(id);\n }\n\n /**\n * Get all registered rules\n */\n getAll(): Rule[] {\n return Array.from(this.rules.values());\n }\n\n /**\n * Get rules by category\n */\n getByCategory(category: Category): Rule[] {\n return this.getAll().filter((rule) => rule.definition.category === category);\n }\n\n /**\n * Get enabled rules with their configs\n */\n getEnabled(configs: Record<RuleId, RuleConfig> = RULE_CONFIGS): Rule[] {\n return this.getAll().filter((rule) => {\n const config = configs[rule.definition.id as RuleId];\n return config?.enabled ?? true;\n });\n }\n\n /**\n * Get config for a rule\n */\n getConfig(\n id: RuleId,\n configs: Record<RuleId, RuleConfig> = RULE_CONFIGS\n ): RuleConfig {\n return configs[id];\n }\n\n /**\n * Check if a rule is registered\n */\n has(id: RuleId): boolean {\n return this.rules.has(id);\n }\n\n /**\n * Get count of registered rules\n */\n get size(): number {\n return this.rules.size;\n }\n}\n\n/**\n * Global rule registry instance\n */\nexport const ruleRegistry = new RuleRegistry();\n\n/**\n * Helper to create and register a rule\n */\nexport function defineRule(rule: Rule): Rule {\n ruleRegistry.register(rule);\n return rule;\n}\n","import { z } from \"zod\";\n\n/**\n * Acknowledgment marker — surfaced from a Figma Dev Mode annotation that\n * canicode itself wrote during a roundtrip. When the analysis pipeline\n * receives a list of acknowledgments, matching `(nodeId, ruleId)` issues are\n * flagged `acknowledged: true` and contribute half their normal weight to\n * the density score (#371).\n *\n * This contract is consumed by:\n * - The MCP `analyze` tool (`acknowledgments?: Acknowledgment[]` input)\n * - The CLI `analyze --acknowledgments <path>` flag\n * - `RuleEngineOptions.acknowledgments`\n *\n * It is produced by the Plugin-API helper\n * `extractAcknowledgmentsFromNode` / `readCanicodeAcknowledgments`\n * (see `src/core/roundtrip/read-acknowledgments.ts`).\n *\n * ADR-019 / #444: optional `intent`, `sceneWriteOutcome`, and `codegenDirective`\n * are read from a fenced canicode-json block when present; legacy annotations\n * omit them and remain valid for density scoring.\n */\nexport const AcknowledgmentIntentSchema = z.object({\n field: z.string(),\n value: z.unknown(),\n scope: z.enum([\"instance\", \"definition\"]),\n});\n\nexport type AcknowledgmentIntent = z.infer<typeof AcknowledgmentIntentSchema>;\n\nexport const AcknowledgmentSceneWriteOutcomeSchema = z.object({\n result: z.enum([\n \"succeeded\",\n \"silent-ignored\",\n \"api-rejected\",\n \"user-declined-propagation\",\n \"unknown\",\n ]),\n reason: z.string().optional(),\n});\n\nexport type AcknowledgmentSceneWriteOutcome = z.infer<\n typeof AcknowledgmentSceneWriteOutcomeSchema\n>;\n\nexport const AcknowledgmentSchema = z.object({\n nodeId: z.string(),\n ruleId: z.string(),\n intent: AcknowledgmentIntentSchema.optional(),\n sceneWriteOutcome: AcknowledgmentSceneWriteOutcomeSchema.optional(),\n codegenDirective: z.string().optional(),\n});\n\nexport type Acknowledgment = z.infer<typeof AcknowledgmentSchema>;\n\nexport const AcknowledgmentListSchema = z.array(AcknowledgmentSchema);\n\n/**\n * Normalize a Figma node id into `:`-separated form so callers can pass\n * either URL-style (`123-456`) or Plugin-API-style (`123:456`) ids and the\n * engine matches them consistently. Non-instance ids stay unchanged; the\n * `I…;…` instance-child format keeps its semicolon — only `-` → `:`\n * happens.\n */\nexport function normalizeNodeId(id: string): string {\n return id.replace(/-/g, \":\");\n}\n","import type { AnalysisFile, AnalysisNode } from \"../contracts/figma-node.js\";\nimport type {\n Rule,\n RuleConfig,\n RuleContext,\n RuleId,\n RuleViolation,\n} from \"../contracts/rule.js\";\nimport { supportsDepthWeight } from \"../contracts/rule.js\";\nimport { ruleRegistry } from \"../rules/rule-registry.js\";\nimport { RULE_CONFIGS } from \"../rules/rule-config.js\";\nimport {\n normalizeNodeId,\n type Acknowledgment,\n} from \"../contracts/acknowledgment.js\";\nimport {\n detectAnalysisScope,\n type AnalysisScope,\n} from \"../contracts/analysis-scope.js\";\n\n/**\n * Analysis issue with calculated score and metadata.\n *\n * `acknowledged` (#371) — set when the analysis engine receives an\n * `acknowledgments` list (typically read from canicode-authored Figma\n * annotations) whose `(nodeId, ruleId)` matches this issue. Acknowledged\n * issues still surface in the result (so code-gen retains the context) but\n * contribute half their normal weight to the density score, so the grade\n * reflects \"the designer has a plan for this\" instead of treating the rule\n * as fully unaddressed.\n */\nexport interface AnalysisIssue {\n violation: RuleViolation;\n rule: Rule;\n config: RuleConfig;\n depth: number;\n maxDepth: number;\n calculatedScore: number;\n acknowledged?: boolean;\n}\n\n/**\n * Information about a rule that threw during analysis\n */\nexport interface RuleFailure {\n ruleId: string;\n nodeName: string;\n nodeId: string;\n error: string;\n}\n\n/**\n * Analysis result from the rule engine\n */\nexport interface AnalysisResult {\n file: AnalysisFile;\n issues: AnalysisIssue[];\n failedRules: RuleFailure[];\n maxDepth: number;\n nodeCount: number;\n analyzedAt: string;\n /**\n * #404: Resolved analysis scope (`page` vs `component`). Either detected\n * from the root node type or taken from the caller's explicit override.\n * Propagated to MCP / JSON output so downstream consumers (code-gen,\n * reports) can branch the same way rules do.\n */\n scope: AnalysisScope;\n}\n\n/**\n * Options for the rule engine\n */\nexport interface RuleEngineOptions {\n configs?: Record<RuleId, RuleConfig>;\n enabledRules?: RuleId[];\n disabledRules?: RuleId[];\n targetNodeId?: string;\n excludeNodeNames?: string[];\n excludeNodeTypes?: string[];\n /**\n * `(nodeId, ruleId)` pairs sourced from canicode-authored Figma annotations\n * (#371). Issues whose violation matches an entry are flagged\n * `acknowledged: true` and contribute half their normal weight to the\n * density score in `calculateScores`. nodeId may be passed in URL form\n * (`123-456`) or Plugin-API form (`123:456`) — both normalize to `:`.\n */\n acknowledgments?: Acknowledgment[];\n /**\n * #404: Explicit scope override. When omitted, the engine auto-detects\n * from the analysis root's node type via `detectAnalysisScope`. Supply\n * this when the caller knows the heuristic would mis-detect — e.g. a\n * FRAME that happens to be a design-system demo (component scope) or a\n * COMPONENT_SET being audited as part of a full page inventory (page\n * scope).\n */\n scope?: AnalysisScope;\n}\n\n/**\n * Calculate the maximum depth of a node tree\n */\nfunction calculateMaxDepth(node: AnalysisNode, currentDepth = 0): number {\n if (!node.children || node.children.length === 0) {\n return currentDepth;\n }\n\n let maxChildDepth = currentDepth;\n for (const child of node.children) {\n const childDepth = calculateMaxDepth(child, currentDepth + 1);\n if (childDepth > maxChildDepth) {\n maxChildDepth = childDepth;\n }\n }\n\n return maxChildDepth;\n}\n\n/**\n * Count total nodes in a tree\n */\nfunction countNodes(node: AnalysisNode): number {\n let count = 1;\n if (node.children) {\n for (const child of node.children) {\n count += countNodes(child);\n }\n }\n return count;\n}\n\n/**\n * Find a node by ID in the tree\n */\nfunction findNodeById(node: AnalysisNode, nodeId: string): AnalysisNode | null {\n // Figma node IDs use \":\" separator, URL uses \"-\"\n const normalizedId = nodeId.replace(/-/g, \":\");\n\n if (node.id === normalizedId) {\n return node;\n }\n\n if (node.children) {\n for (const child of node.children) {\n const found = findNodeById(child, nodeId);\n if (found) return found;\n }\n }\n\n return null;\n}\n\n/**\n * Calculate depth weight multiplier for a rule\n * Higher values (closer to 1.5x) at root level, 1.0x at leaf level\n */\nfunction calcDepthWeight(\n depth: number,\n maxDepth: number,\n depthWeight?: number\n): number {\n if (!depthWeight || depthWeight <= 1) return 1;\n if (maxDepth === 0) return depthWeight;\n\n // Linear interpolation: depthWeight at depth 0, 1.0 at maxDepth\n const ratio = depth / maxDepth;\n return depthWeight - (depthWeight - 1) * ratio;\n}\n\n/**\n * Rule engine for analyzing Figma files\n */\nexport class RuleEngine {\n private configs: Record<RuleId, RuleConfig>;\n private enabledRuleIds: Set<RuleId> | null;\n private disabledRuleIds: Set<RuleId>;\n private targetNodeId: string | undefined;\n private excludeNamePattern: RegExp | null;\n private excludeNodeTypes: Set<string> | null;\n private acknowledgments: ReadonlySet<string>;\n private scopeOverride: AnalysisScope | undefined;\n\n constructor(options: RuleEngineOptions = {}) {\n this.configs = options.configs ?? RULE_CONFIGS;\n this.enabledRuleIds = options.enabledRules\n ? new Set(options.enabledRules)\n : null;\n this.disabledRuleIds = new Set(options.disabledRules ?? []);\n this.targetNodeId = options.targetNodeId;\n this.excludeNamePattern = options.excludeNodeNames && options.excludeNodeNames.length > 0\n ? new RegExp(`\\\\b(${options.excludeNodeNames.join(\"|\")})\\\\b`, \"i\")\n : null;\n this.excludeNodeTypes = options.excludeNodeTypes && options.excludeNodeTypes.length > 0\n ? new Set(options.excludeNodeTypes)\n : null;\n this.acknowledgments = new Set(\n (options.acknowledgments ?? []).map(\n (a) => `${normalizeNodeId(a.nodeId)}::${a.ruleId}`\n )\n );\n this.scopeOverride = options.scope;\n }\n\n /**\n * Analyze a Figma file and return issues\n */\n analyze(file: AnalysisFile): AnalysisResult {\n // Fresh per-analysis state — eliminates module-level mutable state in rules\n const analysisState = new Map<string, unknown>();\n\n // Find target node if specified\n let rootNode = file.document;\n if (this.targetNodeId) {\n const targetNode = findNodeById(file.document, this.targetNodeId);\n if (!targetNode) {\n throw new Error(`Node not found: ${this.targetNodeId}`);\n }\n rootNode = targetNode;\n }\n\n // Calculate max depth before analysis\n const maxDepth = calculateMaxDepth(rootNode);\n const nodeCount = countNodes(rootNode);\n\n // #404: resolve scope once per analysis. Caller override wins over\n // type-based detection so CLI/MCP users can correct false positives\n // (e.g. design-system demo frames classified as page scope).\n const scope: AnalysisScope =\n this.scopeOverride ?? detectAnalysisScope(rootNode);\n\n // #403: capture root node type as a separate axis from `scope`. Rules\n // that branch on whether a component-scope root is the component\n // itself vs an INSTANCE of one need this even when `scope` already\n // resolves to \"component\". Captured once here, threaded read-only\n // through every `RuleContext` in this analysis.\n const rootNodeType = rootNode.type;\n\n const issues: AnalysisIssue[] = [];\n const failedRules: RuleFailure[] = [];\n const enabledRules = this.getEnabledRules();\n\n // Traverse the tree and run rules on each node\n this.traverseAndCheck(\n rootNode,\n file,\n enabledRules,\n maxDepth,\n issues,\n failedRules,\n 0,\n [],\n [],\n 0,\n analysisState,\n scope,\n rootNodeType,\n undefined,\n undefined\n );\n\n if (this.acknowledgments.size > 0) {\n for (const issue of issues) {\n const key = `${normalizeNodeId(issue.violation.nodeId)}::${issue.violation.ruleId}`;\n if (this.acknowledgments.has(key)) {\n issue.acknowledged = true;\n }\n }\n }\n\n return {\n file,\n issues,\n failedRules,\n maxDepth,\n nodeCount,\n analyzedAt: new Date().toISOString(),\n scope,\n };\n }\n\n /**\n * Get rules that should be run based on configuration\n */\n private getEnabledRules(): Rule[] {\n return ruleRegistry.getAll().filter((rule) => {\n const ruleId = rule.definition.id as RuleId;\n\n // Check if explicitly disabled\n if (this.disabledRuleIds.has(ruleId)) return false;\n\n // Check if we have an explicit enable list\n if (this.enabledRuleIds && !this.enabledRuleIds.has(ruleId)) return false;\n\n // Check config enabled status\n const config = this.configs[ruleId];\n return config?.enabled ?? true;\n });\n }\n\n /**\n * Recursively traverse the tree and run rules\n */\n private traverseAndCheck(\n node: AnalysisNode,\n file: AnalysisFile,\n rules: Rule[],\n maxDepth: number,\n issues: AnalysisIssue[],\n failedRules: RuleFailure[],\n depth: number,\n path: string[],\n ancestorTypes: string[],\n componentDepth: number,\n analysisState: Map<string, unknown>,\n scope: AnalysisScope,\n rootNodeType: string,\n parent?: AnalysisNode,\n siblings?: AnalysisNode[]\n ): void {\n const nodePath = [...path, node.name];\n\n // Reset componentDepth at component boundaries\n const isComponentBoundary = node.type === \"COMPONENT\" || node.type === \"COMPONENT_SET\" || node.type === \"INSTANCE\";\n const currentComponentDepth = isComponentBoundary ? 0 : componentDepth;\n\n // Skip nodes matching excluded types or name patterns\n if (this.excludeNodeTypes && this.excludeNodeTypes.has(node.type)) {\n return;\n }\n if (this.excludeNamePattern && this.excludeNamePattern.test(node.name)) {\n return;\n }\n\n // Build context for this node\n const context: RuleContext = {\n file,\n parent,\n depth,\n componentDepth: currentComponentDepth,\n maxDepth,\n path: nodePath,\n ancestorTypes,\n siblings,\n analysisState,\n scope,\n rootNodeType,\n };\n\n // Run each rule on this node\n for (const rule of rules) {\n const ruleId = rule.definition.id as RuleId;\n const config = this.configs[ruleId];\n const options = config?.options;\n\n try {\n const violation = rule.check(node, context, options);\n\n if (violation) {\n // Calculate score with depth weight if applicable\n let calculatedScore = config.score;\n\n if (\n supportsDepthWeight(rule.definition.category) &&\n config.depthWeight\n ) {\n const weight = calcDepthWeight(depth, maxDepth, config.depthWeight);\n calculatedScore = Math.round(config.score * weight);\n }\n\n issues.push({\n violation,\n rule,\n config,\n depth,\n maxDepth,\n calculatedScore,\n });\n }\n } catch (error) {\n // Track failure and continue — never let one rule break the whole analysis\n failedRules.push({\n ruleId,\n nodeName: node.name,\n nodeId: node.id,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n // Recurse into children\n if (node.children && node.children.length > 0) {\n const childAncestorTypes = [...ancestorTypes, node.type];\n for (const child of node.children) {\n this.traverseAndCheck(\n child,\n file,\n rules,\n maxDepth,\n issues,\n failedRules,\n depth + 1,\n nodePath,\n childAncestorTypes,\n currentComponentDepth + 1,\n analysisState,\n scope,\n rootNodeType,\n node,\n node.children\n );\n }\n }\n }\n}\n\n/**\n * Create a rule engine with default configuration\n */\nexport function createRuleEngine(options?: RuleEngineOptions): RuleEngine {\n return new RuleEngine(options);\n}\n\n/**\n * Convenience function to analyze a file with default settings\n */\nexport function analyzeFile(\n file: AnalysisFile,\n options?: RuleEngineOptions\n): AnalysisResult {\n const engine = createRuleEngine(options);\n return engine.analyze(file);\n}\n","/**\n * Parse Figma instance-child node IDs.\n *\n * Nodes inside an instance carry an `I`-prefixed id with semicolon-separated\n * path segments: `I<parentInstanceId>;<sourceNodeId>`. For nested instances\n * the format chains further, e.g. `I<parentId>;<midId>;<sourceNodeId>` —\n * each `;` represents one additional level of instance expansion. The LAST\n * segment is always the id of the node inside the innermost source component,\n * which is reachable directly via `figma.getNodeById`.\n *\n * Siblings: `figma-url-parser.ts#toCommentableNodeId` handles the same id\n * format for a different purpose (stripping for the Comments API). That\n * helper is intentionally left alone — this module owns id parsing for the\n * apply pipeline.\n */\n\nexport interface InstanceChildIdParts {\n parentInstanceId: string;\n sourceNodeId: string;\n}\n\nexport function isInstanceChildNodeId(nodeId: string): boolean {\n return nodeId.startsWith(\"I\") && nodeId.includes(\";\");\n}\n\nexport function parseInstanceChildNodeId(\n nodeId: string,\n): InstanceChildIdParts | null {\n if (!isInstanceChildNodeId(nodeId)) return null;\n\n const segments = nodeId.split(\";\");\n if (segments.length < 2) return null;\n\n const parentInstanceId = segments[0]!.replace(/^I/, \"\");\n const sourceNodeId = segments[segments.length - 1]!;\n\n if (!parentInstanceId || !sourceNodeId) return null;\n\n return { parentInstanceId, sourceNodeId };\n}\n","import type { RuleId, RuleViolation } from \"../contracts/rule.js\";\nimport type { InstanceContext } from \"../contracts/gotcha-survey.js\";\nimport type { AnnotationProperty } from \"../roundtrip/types.js\";\nimport {\n isInstanceChildNodeId,\n parseInstanceChildNodeId,\n} from \"../adapters/instance-id-parser.js\";\nimport { getAnnotationProperties } from \"../rules/rule-config.js\";\n\n/**\n * Apply strategy for a rule violation. Tells the SKILL.md/`use_figma`\n * pipeline which Plugin-API path to take.\n *\n * - `property-mod` — Strategy A. Direct property write on the scene/instance node.\n * - `structural-mod` — Strategy B. Structural change; ask user to confirm before applying.\n * - `annotation` — Strategy C. Cannot be auto-fixed; record as a Figma annotation.\n * - `auto-fix` — Strategy D. Lower-severity rules from analyze output;\n * may be a property write (naming) or annotation-only.\n *\n * Sibling module `resolve-apply-target.ts` solves a different concern\n * (scene-vs-definition write target). Compose them — do not merge.\n */\nexport type RuleApplyStrategy =\n | \"property-mod\"\n | \"structural-mod\"\n | \"annotation\"\n | \"auto-fix\";\n\n/**\n * Pre-computed apply context attached to gotcha-survey questions and\n * analyze-output issues. Lets the SKILL.md consume the data directly\n * instead of re-deriving rule routing on every roundtrip run.\n *\n * `targetProperty` is `string` for single-property writes, `string[]`\n * for rules that require multiple writes (e.g. `irregular-spacing`\n * subType `padding` → 4 padding fields), and `undefined` for\n * annotation/structural strategies that have no single property target.\n */\nexport interface ApplyContext {\n applyStrategy: RuleApplyStrategy;\n targetProperty?: string | string[];\n annotationProperties?: AnnotationProperty[];\n isInstanceChild: boolean;\n sourceChildId?: string;\n}\n\nconst STRATEGY_BY_RULE: Record<RuleId, RuleApplyStrategy> = {\n // Strategy A — property modification\n \"no-auto-layout\": \"property-mod\",\n \"fixed-size-in-auto-layout\": \"property-mod\",\n \"missing-size-constraint\": \"property-mod\",\n \"irregular-spacing\": \"property-mod\",\n \"non-semantic-name\": \"property-mod\",\n // Strategy B — structural modification (needs user confirmation)\n \"non-layout-container\": \"structural-mod\",\n \"deep-nesting\": \"structural-mod\",\n \"missing-component\": \"structural-mod\",\n \"detached-instance\": \"structural-mod\",\n // Strategy C — annotation only\n \"absolute-position-in-auto-layout\": \"annotation\",\n \"variant-structure-mismatch\": \"annotation\",\n // Strategy D — auto-fix lower-severity issues from analyze output\n \"non-standard-naming\": \"auto-fix\",\n \"inconsistent-naming-convention\": \"auto-fix\",\n \"raw-value\": \"auto-fix\",\n \"missing-interaction-state\": \"auto-fix\",\n \"missing-prototype\": \"auto-fix\",\n};\n\n/**\n * Resolve the Figma Plugin-API target property (or properties) for a\n * violation. Returns `undefined` for rules whose strategy does not write\n * a single property (structural-mod, annotation), or for naming auto-fixes\n * where the value comes from `violation.suggestedName` rather than a\n * specific Figma property — except the `name` write itself, which we\n * surface so SKILL.md can branch uniformly on `targetProperty === 'name'`.\n */\nfunction resolveTargetProperty(\n ruleId: RuleId,\n subType: string | undefined,\n): string | string[] | undefined {\n switch (ruleId) {\n case \"no-auto-layout\":\n return [\"layoutMode\", \"itemSpacing\"];\n case \"fixed-size-in-auto-layout\":\n if (subType === \"horizontal\") return \"layoutSizingHorizontal\";\n // both-axes — write both axes\n return [\"layoutSizingHorizontal\", \"layoutSizingVertical\"];\n case \"missing-size-constraint\":\n // #374: always return BOTH bounds so `applyPropertyMod`'s array branch\n // iterates the full `{ minWidth, maxWidth }` answer shape. Pre-fix the\n // `wrap` subType returned `\"minWidth\"` and `max-width` returned\n // `\"maxWidth\"` as single strings — the user typically answered with\n // both keys (the gotcha hint asks for both) and the apply step\n // silently dropped half the intent because it only iterated the one\n // property in `targetProperty`. Partial answers still work: the per-\n // property lookup in `applyPropertyMod` returns `undefined` for the\n // missing key and the helper skips it.\n return [\"minWidth\", \"maxWidth\"];\n case \"irregular-spacing\":\n if (subType === \"gap\") return \"itemSpacing\";\n // padding — all four padding fields\n return [\"paddingTop\", \"paddingRight\", \"paddingBottom\", \"paddingLeft\"];\n case \"non-semantic-name\":\n return \"name\";\n case \"non-layout-container\":\n return \"layoutMode\";\n case \"non-standard-naming\":\n case \"inconsistent-naming-convention\":\n return \"name\";\n case \"deep-nesting\":\n case \"missing-component\":\n case \"detached-instance\":\n case \"absolute-position-in-auto-layout\":\n case \"variant-structure-mismatch\":\n case \"raw-value\":\n case \"missing-interaction-state\":\n case \"missing-prototype\":\n return undefined;\n }\n}\n\n/**\n * Compute the deterministic apply context for a rule violation.\n *\n * - `applyStrategy` and `targetProperty` come from the ruleId/subType tables above.\n * - `isInstanceChild` and `sourceChildId` are parsed from the violation `nodeId`\n * via `parseInstanceChildNodeId` — single source of truth for `I...;...` ids.\n * - `instanceContext`, when supplied, takes precedence for `sourceChildId` so\n * callers that already resolved the source component (gotcha-survey) do not\n * re-parse the id.\n *\n * Strategy D rules that target scene nodes (analyze output) can pass\n * `instanceContext: undefined` — the function still returns the parsed\n * `isInstanceChild`/`sourceChildId` so SKILL.md knows whether to walk the\n * instance fallback.\n */\nexport function computeApplyContext(\n violation: Pick<RuleViolation, \"ruleId\" | \"subType\" | \"nodeId\">,\n instanceContext?: InstanceContext,\n): ApplyContext {\n const ruleId = violation.ruleId as RuleId;\n const applyStrategy = STRATEGY_BY_RULE[ruleId] ?? \"annotation\";\n const targetProperty = resolveTargetProperty(ruleId, violation.subType);\n const annotationProperties = getAnnotationProperties(\n ruleId,\n violation.subType,\n );\n\n const parsed = parseInstanceChildNodeId(violation.nodeId);\n const isInstanceChild =\n parsed !== null || isInstanceChildNodeId(violation.nodeId);\n const sourceChildId = instanceContext?.sourceNodeId ?? parsed?.sourceNodeId;\n\n return {\n applyStrategy,\n ...(targetProperty !== undefined ? { targetProperty } : {}),\n ...(annotationProperties !== undefined ? { annotationProperties } : {}),\n isInstanceChild,\n ...(sourceChildId !== undefined ? { sourceChildId } : {}),\n };\n}\n","import type { Category } from \"../contracts/category.js\";\nimport { CATEGORIES, CATEGORY_LABELS } from \"../contracts/category.js\";\nimport type { RuleId, RuleConfig } from \"../contracts/rule.js\";\nimport type { Severity } from \"../contracts/severity.js\";\nimport type { AnalysisResult } from \"./rule-engine.js\";\nimport { RULE_CONFIGS, RULE_ID_CATEGORY, getRulePurpose } from \"../rules/rule-config.js\";\nimport { computeApplyContext } from \"../gotcha/apply-context.js\";\nimport { version as VERSION } from \"../../../package.json\";\n\n/**\n * Score breakdown for a single category\n */\nexport interface CategoryScoreResult {\n category: Category;\n score: number;\n maxScore: number;\n percentage: number;\n issueCount: number;\n uniqueRuleCount: number;\n weightedIssueCount: number;\n densityScore: number;\n diversityScore: number;\n bySeverity: Record<Severity, number>;\n}\n\n/**\n * Overall score report\n */\nexport interface ScoreReport {\n overall: {\n score: number;\n maxScore: number;\n percentage: number;\n grade: Grade;\n };\n byCategory: Record<Category, CategoryScoreResult>;\n summary: {\n totalIssues: number;\n blocking: number;\n risk: number;\n missingInfo: number;\n suggestion: number;\n nodeCount: number;\n /**\n * Number of issues marked `acknowledged` by an upstream\n * acknowledgments list (#371). Acknowledged issues are still counted in\n * `totalIssues` and the per-severity tallies — the count here is purely\n * additive context so consumers can render\n * `N issues — A acknowledged / N-A unaddressed`. They contribute half\n * weight to the density score upstream.\n */\n acknowledgedCount: number;\n };\n}\n\n/**\n * Grade levels based on percentage\n */\nexport type Grade = \"S\" | \"A+\" | \"A\" | \"B+\" | \"B\" | \"C+\" | \"C\" | \"D\" | \"F\";\n\n/**\n * Density weighting uses per-rule base |score| with sqrt damping (#226).\n *\n * Previously, each issue's |calculatedScore| was summed linearly — a rule\n * triggering N times contributed N× its score. This over-penalized designs\n * with many instances of the same issue (e.g., raw-value ×79 = -316 weight),\n * causing most real files to score Grade D/F with no differentiation.\n *\n * Now: same rule triggered N times contributes |score| × sqrt(N).\n * raw-value ×79 = 4 × sqrt(79) ≈ 36 instead of 316.\n * At low counts sqrt ≈ linear (sqrt(1)=1, sqrt(4)=2), preserving sensitivity.\n * At high counts the curve flattens — 79th occurrence adds ~0.2 vs 1st adding 4.\n *\n * Category weights removed (#196) — overall score is simple average of categories.\n * Category importance is already encoded in rule scores (pixel-critical -10\n * vs semantic -4), so per-category weighting is unnecessary.\n */\n\n/**\n * Compute sum of |score| for all rules in each category from a given config map.\n * Used as denominator for severity-weighted diversity scoring.\n * Must use the same preset-adjusted config map that produced the analysis issues,\n * otherwise diversity ratios will be incorrect.\n */\nfunction computeTotalScorePerCategory(\n configs: Record<RuleId, RuleConfig>\n): Record<Category, number> {\n const totals = Object.fromEntries(\n CATEGORIES.map(c => [c, 0])\n ) as Record<Category, number>;\n\n for (const [id, config] of Object.entries(configs)) {\n const category = RULE_ID_CATEGORY[id as RuleId];\n if (category && config.enabled) {\n totals[category] += Math.abs(config.score);\n }\n }\n\n return totals;\n}\n\n/**\n * Score composition weights (initial intuition, pending calibration validation).\n *\n * Density (0.7): \"how many issues per node\" — measures issue volume relative to design size.\n * Designs with many issues per node are harder to implement accurately.\n *\n * Diversity (0.3): \"how many different rule types triggered\" — measures issue breadth.\n * A design that triggers 1 rule 50 times is easier to fix than one triggering 10 different rules.\n *\n * The 70:30 ratio prioritizes volume over variety. Rationale: a design with a single\n * systemic problem (e.g., all frames missing auto-layout) is still very hard to implement,\n * even though diversity is low. Density captures this; diversity adds a penalty for\n * designs with scattered, unrelated issues.\n *\n * Status: initial values. To be validated via /calibrate against visual-compare results.\n */\nconst DENSITY_WEIGHT = 0.7;\nconst DIVERSITY_WEIGHT = 0.3;\n\n/**\n * Minimum score floor.\n * Even the worst design gets 5% instead of 0%. Rationale: a score of 0 implies\n * \"completely unimplementable\", but any Figma file with visible nodes provides\n * some structural information. The floor also avoids demoralizing UX — seeing 0%\n * feels like the tool failed, not that the design needs improvement.\n */\nconst SCORE_FLOOR = 5;\n\n/**\n * Calculate grade from percentage.\n * Thresholds follow a 5-point interval pattern (95/90/85/80/75/70/65) with a wider\n * gap for D (50-64) and F (<50). This mirrors academic grading conventions where\n * the top tiers are tightly spaced and the failing range is broad.\n */\nfunction calculateGrade(percentage: number): Grade {\n if (percentage >= 95) return \"S\";\n if (percentage >= 90) return \"A+\";\n if (percentage >= 85) return \"A\";\n if (percentage >= 80) return \"B+\";\n if (percentage >= 75) return \"B\";\n if (percentage >= 70) return \"C+\";\n if (percentage >= 65) return \"C\";\n if (percentage >= 50) return \"D\";\n return \"F\";\n}\n\n/**\n * Returns true if the design is ready for code generation.\n * S, A+, and A grades (percentage >= 85) indicate the design has minimal blockers\n * and can be implemented accurately by AI or developers.\n */\nexport function isReadyForCodeGen(grade: Grade): boolean {\n return grade === \"S\" || grade === \"A+\" || grade === \"A\";\n}\n\n/**\n * Convert grade to a CSS-safe class name suffix\n * e.g. \"A+\" -> \"Aplus\", \"B+\" -> \"Bplus\", \"C+\" -> \"Cplus\"\n */\nexport function gradeToClassName(grade: Grade): string {\n return grade.replace(\"+\", \"plus\");\n}\n\n/**\n * Clamp a value between min and max\n */\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * Calculate scores from analysis result using density + diversity scoring\n *\n * Density Score = 100 - (weighted issue count / node count) * 100\n * Diversity Score = (1 - weighted triggered rule scores / total category scores) * 100\n * Final Score = density * 0.7 + diversity * 0.3\n *\n * @param result Analysis result with issues\n * @param configs Optional preset-adjusted config map used to produce the issues.\n * If not provided, diversity totals are reconstructed from issue.config values.\n */\nexport function calculateScores(\n result: AnalysisResult,\n configs?: Record<RuleId, RuleConfig>\n): ScoreReport {\n const categoryScores = initializeCategoryScores();\n const nodeCount = result.nodeCount;\n\n // Track unique rules and their base |score| per category\n const uniqueRulesPerCategory = new Map<Category, Set<string>>();\n const ruleScorePerCategory = new Map<Category, Map<string, number>>();\n // Track issue counts per rule per category for sqrt damping (#226)\n const ruleIssueCountPerCategory = new Map<Category, Map<string, number>>();\n for (const category of CATEGORIES) {\n uniqueRulesPerCategory.set(category, new Set());\n ruleScorePerCategory.set(category, new Map());\n ruleIssueCountPerCategory.set(category, new Map());\n }\n\n // Compute totals from the config map.\n // If configs provided: use preset-adjusted totals (recommended when using presets).\n // If not: fall back to static RULE_CONFIGS — only correct when issues were\n // produced with default RULE_CONFIGS, otherwise diversity ratios will be skewed.\n const totalScorePerCategory = computeTotalScorePerCategory(configs ?? RULE_CONFIGS);\n\n // Count issues by severity per category and track unique rules with scores\n for (const issue of result.issues) {\n const category = issue.rule.definition.category;\n const severity = issue.config.severity;\n const ruleId = issue.rule.definition.id;\n\n categoryScores[category].issueCount++;\n categoryScores[category].bySeverity[severity]++;\n uniqueRulesPerCategory.get(category)!.add(ruleId);\n ruleScorePerCategory.get(category)!.set(ruleId, Math.abs(issue.config.score));\n // Accumulate per-rule issue count using a per-issue weight: 1.0 for\n // unacknowledged issues, 0.5 for acknowledged ones (#371). The sqrt\n // damping below treats this sum as the \"occurrence count\" so the\n // half-weight flows through to density without changing the formula.\n // Diversity is left untouched — acknowledgment is per-issue, not\n // per-rule, and the rule still represents a kind of problem.\n const ruleCountMap = ruleIssueCountPerCategory.get(category)!;\n const weight = issue.acknowledged === true ? 0.5 : 1;\n ruleCountMap.set(ruleId, (ruleCountMap.get(ruleId) ?? 0) + weight);\n }\n\n // Compute weightedIssueCount with sqrt damping per rule (#226).\n // Same rule triggered N times contributes |score| × sqrt(N) instead of |score| × N.\n // Rationale: 79 raw-value issues represent one systemic problem, not 79× the difficulty.\n // First few occurrences identify the problem; subsequent ones have diminishing impact.\n // At low counts sqrt ≈ linear (sqrt(1)=1, sqrt(4)=2), preserving sensitivity for rare issues.\n for (const category of CATEGORIES) {\n const ruleCountMap = ruleIssueCountPerCategory.get(category)!;\n const ruleScoreMap = ruleScorePerCategory.get(category)!;\n let dampedWeight = 0;\n for (const [ruleId, count] of ruleCountMap) {\n const ruleScore = ruleScoreMap.get(ruleId) ?? 0;\n dampedWeight += ruleScore * Math.sqrt(count);\n }\n categoryScores[category].weightedIssueCount = dampedWeight;\n }\n\n // Calculate percentage for each category based on density + diversity\n for (const category of CATEGORIES) {\n const catScore = categoryScores[category];\n const uniqueRules = uniqueRulesPerCategory.get(category)!;\n\n catScore.uniqueRuleCount = uniqueRules.size;\n\n // Density score: lower density = higher score\n let densityScore = 100;\n if (nodeCount > 0 && catScore.issueCount > 0) {\n const density = catScore.weightedIssueCount / nodeCount;\n densityScore = clamp(Math.round(100 - density * 100), 0, 100);\n }\n catScore.densityScore = densityScore;\n\n // Diversity score: weighted by base rule |score| (config.score, not calculatedScore).\n // Uses base score intentionally — diversity measures \"what types of problems exist\",\n // not \"where they occur\". depthWeight affects density (volume penalty) but not diversity\n // (breadth penalty). A blocking rule (score -10) penalizes diversity more than a\n // suggestion (score -1), so low-severity-only designs correctly get high diversity scores.\n let diversityScore = 100;\n if (catScore.issueCount > 0) {\n const ruleScores = ruleScorePerCategory.get(category)!;\n const weightedTriggered = Array.from(ruleScores.values()).reduce((sum, s) => sum + s, 0);\n const weightedTotal = totalScorePerCategory[category];\n const diversityRatio = weightedTotal > 0 ? weightedTriggered / weightedTotal : 0;\n diversityScore = clamp(Math.round((1 - diversityRatio) * 100), 0, 100);\n }\n catScore.diversityScore = diversityScore;\n\n // Combined score with floor\n const combinedScore = densityScore * DENSITY_WEIGHT + diversityScore * DIVERSITY_WEIGHT;\n catScore.percentage = catScore.issueCount > 0\n ? clamp(Math.round(combinedScore), SCORE_FLOOR, 100)\n : 100;\n\n catScore.score = catScore.percentage;\n catScore.maxScore = 100;\n }\n\n // Calculate overall score as simple average of categories\n // Category importance is already encoded in rule scores (weight baked in),\n // so no per-category weighting is needed.\n let categorySum = 0;\n for (const category of CATEGORIES) {\n categorySum += categoryScores[category].percentage;\n }\n\n const overallPercentage = CATEGORIES.length > 0\n ? Math.round(categorySum / CATEGORIES.length)\n : 100;\n\n // Count issues by severity\n const summary = {\n totalIssues: result.issues.length,\n blocking: 0,\n risk: 0,\n missingInfo: 0,\n suggestion: 0,\n nodeCount,\n acknowledgedCount: 0,\n };\n\n for (const issue of result.issues) {\n switch (issue.config.severity) {\n case \"blocking\":\n summary.blocking++;\n break;\n case \"risk\":\n summary.risk++;\n break;\n case \"missing-info\":\n summary.missingInfo++;\n break;\n case \"suggestion\":\n summary.suggestion++;\n break;\n }\n if (issue.acknowledged === true) summary.acknowledgedCount++;\n }\n\n return {\n overall: {\n score: overallPercentage,\n maxScore: 100,\n percentage: overallPercentage,\n grade: calculateGrade(overallPercentage),\n },\n byCategory: categoryScores,\n summary,\n };\n}\n\n/**\n * Initialize empty category scores\n */\nfunction initializeCategoryScores(): Record<Category, CategoryScoreResult> {\n const scores: Partial<Record<Category, CategoryScoreResult>> = {};\n\n for (const category of CATEGORIES) {\n scores[category] = {\n category,\n score: 100,\n maxScore: 100,\n percentage: 100,\n issueCount: 0,\n uniqueRuleCount: 0,\n weightedIssueCount: 0,\n densityScore: 100,\n diversityScore: 100,\n bySeverity: {\n blocking: 0,\n risk: 0,\n \"missing-info\": 0,\n suggestion: 0,\n },\n };\n }\n\n return scores as Record<Category, CategoryScoreResult>;\n}\n\n/**\n * Format score report as a summary string\n */\nexport function formatScoreSummary(report: ScoreReport): string {\n const lines: string[] = [];\n\n lines.push(`Overall: ${report.overall.grade} (${report.overall.percentage}%)`);\n lines.push(\"\");\n lines.push(\"By Category:\");\n\n for (const category of CATEGORIES) {\n const cat = report.byCategory[category];\n lines.push(` ${category}: ${cat.percentage}% (${cat.issueCount} issues, ${cat.uniqueRuleCount} rules)`);\n }\n\n lines.push(\"\");\n lines.push(\"Issues:\");\n lines.push(` Blocking: ${report.summary.blocking}`);\n lines.push(` Risk: ${report.summary.risk}`);\n lines.push(` Missing Info: ${report.summary.missingInfo}`);\n lines.push(` Suggestion: ${report.summary.suggestion}`);\n if (report.summary.acknowledgedCount > 0) {\n const unaddressed =\n report.summary.totalIssues - report.summary.acknowledgedCount;\n lines.push(\n ` Total: ${report.summary.totalIssues} (${report.summary.acknowledgedCount} acknowledged via canicode annotations / ${unaddressed} unaddressed)`\n );\n } else {\n lines.push(` Total: ${report.summary.totalIssues}`);\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Get category label for display\n */\nexport function getCategoryLabel(category: Category): string {\n return CATEGORY_LABELS[category];\n}\n\n/**\n * Get severity label for display\n */\nexport function getSeverityLabel(severity: Severity): string {\n const labels: Record<Severity, string> = {\n blocking: \"Blocking\",\n risk: \"Risk\",\n \"missing-info\": \"Missing Info\",\n suggestion: \"Suggestion\",\n };\n return labels[severity];\n}\n\n/**\n * Build a JSON-serializable analysis result summary.\n * Shared by CLI (--json) and MCP server (analyze tool response).\n */\nexport function buildResultJson(\n fileName: string,\n result: AnalysisResult,\n scores: ScoreReport,\n options?: { fileKey?: string; designKey?: string },\n): Record<string, unknown> {\n const issuesByRule: Record<string, number> = {};\n for (const issue of result.issues) {\n const id = issue.violation.ruleId;\n issuesByRule[id] = (issuesByRule[id] ?? 0) + 1;\n }\n\n const issues = result.issues.map((issue) => {\n const applyContext = computeApplyContext(issue.violation);\n const suggestedName = issue.violation.suggestedName;\n return {\n ruleId: issue.violation.ruleId,\n detection: \"rule-based\" as const,\n outputChannel: \"score\" as const,\n persistenceIntent: \"transient\" as const,\n purpose: getRulePurpose(issue.violation.ruleId),\n ...(issue.violation.subType && { subType: issue.violation.subType }),\n severity: issue.config.severity,\n nodeId: issue.violation.nodeId,\n nodePath: issue.violation.nodePath,\n message: issue.violation.message,\n applyStrategy: applyContext.applyStrategy,\n ...(applyContext.targetProperty !== undefined\n ? { targetProperty: applyContext.targetProperty }\n : {}),\n ...(applyContext.annotationProperties !== undefined\n ? { annotationProperties: applyContext.annotationProperties }\n : {}),\n ...(suggestedName !== undefined ? { suggestedName } : {}),\n isInstanceChild: applyContext.isInstanceChild,\n ...(applyContext.sourceChildId !== undefined\n ? { sourceChildId: applyContext.sourceChildId }\n : {}),\n ...(issue.acknowledged === true ? { acknowledged: true as const } : {}),\n };\n });\n\n const json: Record<string, unknown> = {\n version: VERSION,\n analyzedAt: result.analyzedAt,\n ...(options?.fileKey && { fileKey: options.fileKey }),\n ...(options?.designKey && { designKey: options.designKey }),\n fileName,\n nodeCount: result.nodeCount,\n maxDepth: result.maxDepth,\n scope: result.scope,\n issueCount: result.issues.length,\n acknowledgedCount: scores.summary.acknowledgedCount,\n isReadyForCodeGen: isReadyForCodeGen(scores.overall.grade),\n blockingIssueCount: scores.summary.blocking,\n scores: {\n overall: scores.overall,\n categories: scores.byCategory,\n },\n issuesByRule,\n issues,\n summary: formatScoreSummary(scores),\n };\n\n if (result.failedRules.length > 0) {\n json[\"failedRules\"] = result.failedRules;\n }\n\n return json;\n}","/**\n * Extract a DOM-like design tree from AnalysisFile.\n * Converts Figma node tree to a concise text format with inline CSS styles.\n * AI reads this 1:1 to generate HTML+CSS — no information loss, 50-100x smaller.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { AnalysisFile, AnalysisNode } from \"../contracts/figma-node.js\";\n\n/** Convert Figma RGBA color object to CSS hex string. */\nfunction rgbaToHex(color: { r?: number; g?: number; b?: number; a?: number }): string | null {\n if (!color) return null;\n const r = Math.round((color.r ?? 0) * 255);\n const g = Math.round((color.g ?? 0) * 255);\n const b = Math.round((color.b ?? 0) * 255);\n return `#${r.toString(16).padStart(2, \"0\")}${g.toString(16).padStart(2, \"0\")}${b.toString(16).padStart(2, \"0\")}`.toUpperCase();\n}\n\ninterface FillInfo {\n color: string | null;\n hasImage: boolean;\n imageScaleMode: string | null;\n}\n\n/** Extract fill color and IMAGE presence from a node, skipping invisible fills. */\nfunction getFillInfo(node: AnalysisNode): FillInfo {\n const result: FillInfo = { color: null, hasImage: false, imageScaleMode: null };\n if (!node.fills || !Array.isArray(node.fills)) return result;\n for (const fill of node.fills) {\n const f = fill as {\n type?: string;\n visible?: boolean;\n color?: { r?: number; g?: number; b?: number; a?: number };\n opacity?: number;\n boundVariables?: { color?: { id?: string } };\n scaleMode?: string;\n };\n // Skip invisible fills\n if (f.visible === false) continue;\n if (f.type === \"SOLID\" && f.color) {\n const opacity = f.opacity ?? f.color.a ?? 1;\n let colorValue: string;\n if (opacity < 1) {\n const r = Math.round((f.color.r ?? 0) * 255);\n const g = Math.round((f.color.g ?? 0) * 255);\n const b = Math.round((f.color.b ?? 0) * 255);\n colorValue = `rgba(${r}, ${g}, ${b}, ${opacity})`;\n } else {\n colorValue = rgbaToHex(f.color) ?? \"#000\";\n }\n // Append variable reference if available\n if (f.boundVariables?.color?.id) {\n result.color = `${colorValue} /* var:${f.boundVariables.color.id} */`;\n } else {\n result.color = colorValue;\n }\n } else if (f.type === \"IMAGE\") {\n result.hasImage = true;\n result.imageScaleMode = f.scaleMode ?? null;\n }\n }\n return result;\n}\n\n/** @deprecated Use getFillInfo instead for full fill details */\nfunction getFill(node: AnalysisNode): string | null {\n return getFillInfo(node).color;\n}\n\n/** Extract the first solid stroke color as a CSS hex string. */\nfunction getStroke(node: AnalysisNode): string | null {\n if (!node.strokes || !Array.isArray(node.strokes)) return null;\n for (const stroke of node.strokes) {\n const s = stroke as { type?: string; color?: { r?: number; g?: number; b?: number } };\n if (s.type === \"SOLID\" && s.color) return rgbaToHex(s.color);\n }\n return null;\n}\n\n/** Extract the first visible shadow effect as a CSS box-shadow value. */\nfunction getShadow(node: AnalysisNode): string | null {\n if (!node.effects || !Array.isArray(node.effects)) return null;\n for (const effect of node.effects) {\n const e = effect as {\n type?: string;\n visible?: boolean;\n color?: { r?: number; g?: number; b?: number };\n offset?: { x?: number; y?: number };\n radius?: number;\n };\n if ((e.type === \"DROP_SHADOW\" || e.type === \"INNER_SHADOW\") && e.visible !== false) {\n const c = e.color ? rgbaToHex(e.color) : \"#000\";\n const ox = e.offset?.x ?? 0;\n const oy = e.offset?.y ?? 0;\n return `${ox}px ${oy}px ${e.radius ?? 0}px ${c}`;\n }\n }\n return null;\n}\n\n/** Map Figma alignment values to CSS flexbox equivalents. */\nfunction mapAlign(figmaAlign: string): string {\n const map: Record<string, string> = {\n MIN: \"flex-start\",\n CENTER: \"center\",\n MAX: \"flex-end\",\n SPACE_BETWEEN: \"space-between\",\n };\n return map[figmaAlign] ?? figmaAlign;\n}\n\n/** Map Figma text horizontal alignment to CSS text-align. */\nfunction mapTextAlignHorizontal(figmaAlign: string): string {\n const map: Record<string, string> = {\n LEFT: \"left\",\n CENTER: \"center\",\n RIGHT: \"right\",\n JUSTIFIED: \"justify\",\n };\n return map[figmaAlign] ?? figmaAlign.toLowerCase();\n}\n\n/** Map Figma text vertical alignment to CSS flex align-items. */\nfunction mapTextAlignVertical(figmaAlign: string): string {\n const map: Record<string, string> = {\n TOP: \"flex-start\",\n CENTER: \"center\",\n BOTTOM: \"flex-end\",\n };\n return map[figmaAlign] ?? figmaAlign.toLowerCase();\n}\n\n/** Get variable reference comment from boundVariables if available. */\nfunction getVarRef(node: AnalysisNode, prop: string): string {\n const bv = node.boundVariables as Record<string, unknown> | undefined;\n if (!bv) return \"\";\n const ref = bv[prop];\n if (!ref) return \"\";\n if (typeof ref === \"object\" && ref !== null && \"id\" in ref) {\n return ` /* var:${(ref as { id: string }).id} */`;\n }\n return \"\";\n}\n\n/** Get first variable ref among multiple properties. */\nfunction getFirstVarRef(node: AnalysisNode, props: string[]): string {\n for (const prop of props) {\n const ref = getVarRef(node, prop);\n if (ref) return ref;\n }\n return \"\";\n}\n\n/** Format instance component property values for AI hints. */\nfunction formatComponentProperties(node: AnalysisNode): string | null {\n if (!node.componentProperties || typeof node.componentProperties !== \"object\") return null;\n const entries = Object.entries(node.componentProperties)\n .map(([name, value]) => {\n const v = value as { value?: unknown };\n const raw = typeof v?.value === \"string\" ? v.value : JSON.stringify(v?.value ?? \"\");\n return `${name}=${raw}`;\n });\n if (entries.length === 0) return null;\n return entries.join(\", \");\n}\n\n/** Extract key visual styles from a node for hover diff comparison. */\nfunction extractVisualStyles(node: AnalysisNode): Record<string, string> {\n const styles: Record<string, string> = {};\n const fillInfo = getFillInfo(node);\n if (fillInfo.color && node.type !== \"TEXT\") styles[\"background\"] = fillInfo.color;\n const stroke = getStroke(node);\n if (stroke) styles[\"border-color\"] = stroke;\n if (node.cornerRadius) styles[\"border-radius\"] = `${node.cornerRadius}px`;\n if (node.opacity !== undefined && node.opacity < 1) styles[\"opacity\"] = `${Math.round(node.opacity * 100) / 100}`;\n const shadow = getShadow(node);\n if (shadow) styles[\"box-shadow\"] = shadow;\n // Text color\n if (node.type === \"TEXT\") {\n const textColor = getFill(node);\n if (textColor) styles[\"color\"] = textColor;\n }\n return styles;\n}\n\nconst HOVER_STYLE_DEFAULTS: Record<string, string> = {\n background: \"transparent\",\n \"border-color\": \"transparent\",\n \"border-radius\": \"0px\",\n opacity: \"1\",\n \"box-shadow\": \"none\",\n color: \"inherit\",\n};\n\nfunction getHoverResetValue(styleKey: string): string {\n return HOVER_STYLE_DEFAULTS[styleKey] ?? \"initial\";\n}\n\nfunction appendStyleDiffs(\n currentStyles: Record<string, string>,\n hoverStyles: Record<string, string>,\n diffs: string[],\n namePrefix?: string,\n): void {\n const styleKeys = new Set([...Object.keys(currentStyles), ...Object.keys(hoverStyles)]);\n for (const key of styleKeys) {\n const currentValue = currentStyles[key];\n const hoverValue = hoverStyles[key] ?? getHoverResetValue(key);\n if (currentValue !== hoverValue) {\n const prefix = namePrefix ? `${namePrefix}: ` : \"\";\n diffs.push(`${prefix}${key}: ${hoverValue}`);\n }\n }\n}\n\nfunction getChildStableKey(node: AnalysisNode): string | null {\n // Prefer name over id: variant children share the same name but have different ids\n if (node.name) return `name:${node.name}`;\n return node.id ?? null;\n}\n\n/** Compute style diff between current node and its hover variant. */\nfunction computeHoverDiff(\n currentNode: AnalysisNode,\n hoverNode: AnalysisNode,\n): string | null {\n const current = extractVisualStyles(currentNode);\n const hover = extractVisualStyles(hoverNode);\n const diffs: string[] = [];\n appendStyleDiffs(current, hover, diffs);\n // Check children for text/color changes (first level only)\n if (currentNode.children && hoverNode.children) {\n const hoverByStableKey = new Map<string, AnalysisNode>();\n const hoverUnmatchedByIndex: AnalysisNode[] = [];\n\n for (const child of hoverNode.children) {\n const key = getChildStableKey(child);\n if (key) {\n // Keep the first occurrence to reduce noisy collisions.\n if (!hoverByStableKey.has(key)) hoverByStableKey.set(key, child);\n } else {\n hoverUnmatchedByIndex.push(child);\n }\n }\n\n let unkeyedIdx = 0;\n for (let i = 0; i < currentNode.children.length; i++) {\n const cc = currentNode.children[i];\n if (!cc) continue;\n\n const stableKey = getChildStableKey(cc);\n let hc: AnalysisNode | undefined;\n if (stableKey) {\n hc = hoverByStableKey.get(stableKey);\n } else {\n hc = hoverUnmatchedByIndex[unkeyedIdx];\n unkeyedIdx++;\n }\n if (!hc) continue;\n const ccStyles = extractVisualStyles(cc);\n const hcStyles = extractVisualStyles(hc);\n appendStyleDiffs(ccStyles, hcStyles, diffs, cc.name);\n }\n }\n return diffs.length > 0 ? diffs.join(\"; \") : null;\n}\n\n/** Render a single node and its children as indented design-tree text. */\nfunction renderNode(\n node: AnalysisNode,\n indent: number,\n vectorDir?: string,\n components?: AnalysisFile[\"components\"],\n imageMapping?: Record<string, string>,\n vectorMapping?: Record<string, string>,\n fileStyles?: AnalysisFile[\"styles\"],\n interactionDests?: Record<string, AnalysisNode>,\n parentBBox?: { x: number; y: number; width: number; height: number },\n): string {\n if (node.visible === false) return \"\";\n\n const prefix = \" \".repeat(indent);\n const lines: string[] = [];\n\n // Header — annotate INSTANCE nodes with component name\n const bbox = node.absoluteBoundingBox;\n const w = bbox ? Math.round(bbox.width) : \"?\";\n const h = bbox ? Math.round(bbox.height) : \"?\";\n let header = `${prefix}${node.name} (${node.type}, ${w}x${h})`;\n if (node.type === \"INSTANCE\" && node.componentId && components) {\n const comp = components[node.componentId];\n if (comp) {\n header += ` [component: ${comp.name}]`;\n }\n }\n lines.push(header);\n if (node.type === \"INSTANCE\") {\n const componentProps = formatComponentProperties(node);\n if (componentProps) {\n lines.push(`${prefix} component-properties: ${componentProps}`);\n }\n }\n\n // Styles\n const styles: string[] = [];\n\n // Layout\n if (node.layoutMode && node.layoutMode !== \"NONE\") {\n if (node.layoutMode === \"GRID\") {\n styles.push(`display: grid`);\n if (node.gridColumnsSizing) styles.push(`grid-template-columns: ${node.gridColumnsSizing}`);\n if (node.gridRowsSizing) styles.push(`grid-template-rows: ${node.gridRowsSizing}`);\n if (node.gridColumnGap != null && node.gridRowGap != null) {\n styles.push(`gap: ${node.gridRowGap}px ${node.gridColumnGap}px`);\n } else if (node.gridRowGap != null) {\n styles.push(`row-gap: ${node.gridRowGap}px`);\n } else if (node.gridColumnGap != null) {\n styles.push(`column-gap: ${node.gridColumnGap}px`);\n } else if (node.itemSpacing != null) {\n styles.push(`gap: ${node.itemSpacing}px`);\n }\n } else {\n const dir = node.layoutMode === \"VERTICAL\" ? \"column\" : \"row\";\n styles.push(`display: flex; flex-direction: ${dir}`);\n if (node.layoutWrap === \"WRAP\") styles.push(`flex-wrap: wrap`);\n if (node.itemSpacing != null) {\n const mainGap = node.layoutMode === \"VERTICAL\" ? \"row-gap\" : \"column-gap\";\n styles.push(`${mainGap}: ${node.itemSpacing}px${getVarRef(node, \"itemSpacing\")}`);\n }\n if (node.counterAxisSpacing != null) {\n const crossGap = node.layoutMode === \"VERTICAL\" ? \"column-gap\" : \"row-gap\";\n styles.push(`${crossGap}: ${node.counterAxisSpacing}px${getVarRef(node, \"counterAxisSpacing\")}`);\n }\n if (node.primaryAxisAlignItems) styles.push(`justify-content: ${mapAlign(node.primaryAxisAlignItems)}`);\n // Figma default is MIN (flex-start), CSS default is stretch — emit explicitly\n styles.push(`align-items: ${mapAlign(node.counterAxisAlignItems ?? \"MIN\")}`);\n if (node.counterAxisAlignContent && node.counterAxisAlignContent !== \"AUTO\") {\n styles.push(`align-content: ${mapAlign(node.counterAxisAlignContent)}`);\n }\n }\n }\n // Child self-alignment in auto-layout\n if (node.layoutAlign && node.layoutAlign !== \"INHERIT\") {\n styles.push(`align-self: ${mapAlign(node.layoutAlign)}`);\n }\n if (node.layoutGrow === 1) {\n styles.push(\"flex-grow: 1\");\n }\n\n // Absolute positioning (child placed outside normal auto-layout flow)\n if (node.layoutPositioning === \"ABSOLUTE\") {\n styles.push(\"position: absolute\");\n if (parentBBox && node.absoluteBoundingBox) {\n const top = Math.round(node.absoluteBoundingBox.y - parentBBox.y);\n const left = Math.round(node.absoluteBoundingBox.x - parentBBox.x);\n styles.push(`top: ${top}px`);\n styles.push(`left: ${left}px`);\n }\n }\n // If any child is absolute, parent needs position: relative (but not if already absolute)\n if (node.layoutPositioning !== \"ABSOLUTE\" && node.children?.some((c) => c.layoutPositioning === \"ABSOLUTE\")) {\n styles.push(\"position: relative\");\n }\n\n // Padding\n const pt = node.paddingTop ?? 0;\n const pr = node.paddingRight ?? 0;\n const pb = node.paddingBottom ?? 0;\n const pl = node.paddingLeft ?? 0;\n if (pt || pr || pb || pl) {\n const padRef = getFirstVarRef(node, [\"paddingTop\", \"paddingRight\", \"paddingBottom\", \"paddingLeft\"]);\n styles.push(`padding: ${pt}px ${pr}px ${pb}px ${pl}px${padRef}`);\n }\n\n // Sizing — FILL = stretch to parent. If flex-grow is already set, skip width: 100% (redundant + breaks wrap layouts)\n if (node.layoutSizingHorizontal === \"FILL\" && node.layoutGrow !== 1) styles.push(\"width: 100%\");\n if (node.layoutSizingVertical === \"FILL\") styles.push(\"height: 100%\");\n\n // Fill (not for TEXT — text fill is color)\n const fillInfo = getFillInfo(node);\n if (fillInfo.color && node.type !== \"TEXT\") styles.push(`background: ${fillInfo.color}`);\n if (fillInfo.hasImage) {\n const hasChildren = node.children && node.children.length > 0;\n const mappedFile = imageMapping?.[node.id];\n if (mappedFile) {\n if (hasChildren) {\n // Background image: node has children on top → CSS background-image\n styles.push(`background-image: url(images/${mappedFile})`);\n styles.push(\"background-position: center\");\n styles.push(\"background-repeat: no-repeat\");\n if (fillInfo.imageScaleMode === \"FIT\") {\n styles.push(\"background-size: contain\");\n } else if (fillInfo.imageScaleMode === \"FILL\") {\n styles.push(\"background-size: cover\");\n }\n } else {\n // Content image: leaf node → <img> tag\n styles.push(`content-image: url(images/${mappedFile})`);\n if (fillInfo.imageScaleMode === \"FIT\") {\n styles.push(\"object-fit: contain\");\n } else if (fillInfo.imageScaleMode === \"FILL\") {\n styles.push(\"object-fit: cover\");\n }\n }\n } else {\n styles.push(hasChildren ? \"background-image: [IMAGE]\" : \"content-image: [IMAGE]\");\n }\n }\n\n // Border — respect per-side stroke weights\n const stroke = getStroke(node);\n if (stroke) {\n const isw = node.individualStrokeWeights as\n | { top?: number; right?: number; bottom?: number; left?: number }\n | undefined;\n const sw = (node.strokeWeight as number | undefined) ?? 1;\n if (isw) {\n const strokeRef = getFirstVarRef(node, [\"individualStrokeWeights\", \"strokes\"]);\n if (isw.top) styles.push(`border-top: ${isw.top}px solid ${stroke}${strokeRef}`);\n if (isw.right) styles.push(`border-right: ${isw.right}px solid ${stroke}${strokeRef}`);\n if (isw.bottom) styles.push(`border-bottom: ${isw.bottom}px solid ${stroke}${strokeRef}`);\n if (isw.left) styles.push(`border-left: ${isw.left}px solid ${stroke}${strokeRef}`);\n } else {\n styles.push(`border: ${sw}px solid ${stroke}${getVarRef(node, \"strokes\")}`);\n }\n }\n\n // Border radius\n if (node.cornerRadius) {\n const radiusRef = getVarRef(node, \"rectangleCornerRadii\");\n styles.push(`border-radius: ${node.cornerRadius}px${radiusRef}`);\n }\n\n // Shadow\n const shadow = getShadow(node);\n if (shadow) styles.push(`box-shadow: ${shadow}`);\n\n // Overflow\n if (node.clipsContent) styles.push(\"overflow: hidden\");\n\n // Opacity\n if (node.opacity !== undefined && node.opacity < 1) {\n styles.push(`opacity: ${Math.round(node.opacity * 100) / 100}`);\n }\n\n // Min/max constraints\n if (node.minWidth !== undefined) styles.push(`min-width: ${Math.round(node.minWidth)}px`);\n if (node.maxWidth !== undefined) styles.push(`max-width: ${Math.round(node.maxWidth)}px`);\n if (node.minHeight !== undefined) styles.push(`min-height: ${Math.round(node.minHeight)}px`);\n if (node.maxHeight !== undefined) styles.push(`max-height: ${Math.round(node.maxHeight)}px`);\n\n // Typography\n if (node.type === \"TEXT\" && node.style) {\n // Add text style name if available\n const nodeStyles = node.styles as Record<string, string> | undefined;\n const textStyleId = nodeStyles?.[\"text\"];\n if (textStyleId && fileStyles) {\n const styleInfo = fileStyles[textStyleId] as { name?: string } | undefined;\n if (styleInfo?.name) {\n styles.push(`/* text-style: ${styleInfo.name} */`);\n }\n }\n\n const s = node.style as Record<string, unknown>;\n if (s[\"fontFamily\"]) styles.push(`font-family: \"${s[\"fontFamily\"]}\"${getVarRef(node, \"fontFamily\")}`);\n if (s[\"fontWeight\"]) styles.push(`font-weight: ${s[\"fontWeight\"]}${getVarRef(node, \"fontWeight\")}`);\n if (s[\"fontSize\"]) styles.push(`font-size: ${s[\"fontSize\"]}px${getVarRef(node, \"fontSize\")}`);\n if (s[\"lineHeightPx\"]) {\n const lh = s[\"lineHeightPx\"] as number;\n styles.push(`line-height: ${Math.round(lh * 100) / 100}px`);\n }\n if (s[\"letterSpacing\"]) {\n const ls = s[\"letterSpacing\"] as number;\n styles.push(`letter-spacing: ${Math.round(ls * 100) / 100}px`);\n }\n if (s[\"textDecoration\"]) {\n const td = (s[\"textDecoration\"] as string).toLowerCase();\n if (td !== \"none\") styles.push(`text-decoration: ${td}`);\n }\n if (s[\"textAlignHorizontal\"]) {\n styles.push(`text-align: ${mapTextAlignHorizontal(String(s[\"textAlignHorizontal\"]))}`);\n }\n if (s[\"textAlignVertical\"] && s[\"textAlignVertical\"] !== \"TOP\") {\n // CSS has no direct text vertical-align in a text box; emit flex hint.\n // TOP is the default — only emit for CENTER/BOTTOM.\n styles.push(\"display: flex\");\n styles.push(`align-items: ${mapTextAlignVertical(String(s[\"textAlignVertical\"]))}`);\n }\n\n const textColor = getFill(node);\n if (textColor) styles.push(`color: ${textColor}`);\n\n // Text auto-resize behavior\n const textAutoResize = s[\"textAutoResize\"] as string | undefined;\n if (textAutoResize === \"WIDTH_AND_HEIGHT\") {\n styles.push(\"text-resize: auto\");\n } else if (textAutoResize === \"HEIGHT\") {\n styles.push(\"text-resize: fixed-height\");\n } else if (textAutoResize === \"TRUNCATE\") {\n styles.push(\"text-resize: truncate\");\n styles.push(\"text-overflow: ellipsis\");\n if (node.maxLines != null) {\n styles.push(`max-lines: ${node.maxLines}`);\n }\n }\n\n // Text truncation (when textAutoResize is not TRUNCATE but truncation is set)\n if (textAutoResize !== \"TRUNCATE\" && node.textTruncation === \"ENDING\") {\n styles.push(\"text-overflow: ellipsis\");\n if (node.maxLines != null) {\n styles.push(`max-lines: ${node.maxLines}`);\n }\n }\n\n // Paragraph spacing\n const paragraphSpacing = s[\"paragraphSpacing\"] as number | undefined;\n if (paragraphSpacing) {\n styles.push(`paragraph-spacing: ${paragraphSpacing}px`);\n }\n }\n\n // Text content\n if (node.type === \"TEXT\" && node.characters) {\n styles.push(`text: \"${node.characters.replace(/\\\\/g, \"\\\\\\\\\").replace(/\\n/g, \"\\\\n\").replace(/\\r/g, \"\\\\r\").replace(/\"/g, '\\\\\"')}\"`);\n }\n\n // Vector SVG inline (when vector dir with downloaded SVGs is available)\n if (node.type === \"VECTOR\" && vectorDir) {\n const mappedFile = vectorMapping?.[node.id];\n const svgPath = mappedFile\n ? join(vectorDir, mappedFile)\n : join(vectorDir, `${node.id.replace(/:/g, \"-\")}.svg`); // fallback to legacy ID-based naming\n if (existsSync(svgPath)) {\n const svg = readFileSync(svgPath, \"utf-8\").trim().replace(/\\n\\s*/g, \" \");\n styles.push(`svg: ${svg}`);\n }\n }\n\n if (styles.length > 0) {\n lines.push(`${prefix} style: ${styles.join(\"; \")}`);\n }\n\n // Interaction states (hover)\n if (node.interactions && interactionDests) {\n for (const interaction of node.interactions) {\n const i = interaction as {\n trigger?: { type?: string };\n actions?: Array<{ destinationId?: string; navigation?: string }>;\n };\n if (i.trigger?.type === \"ON_HOVER\" && i.actions) {\n for (const action of i.actions) {\n if (action.destinationId && action.navigation === \"CHANGE_TO\") {\n const hoverNode = interactionDests[action.destinationId];\n if (hoverNode) {\n const diff = computeHoverDiff(node, hoverNode);\n if (diff) {\n lines.push(`${prefix} [hover]: ${diff}`);\n }\n }\n }\n }\n }\n }\n }\n\n // Children\n if (node.children) {\n for (const child of node.children) {\n const childOutput = renderNode(child, indent + 1, vectorDir, components, imageMapping, vectorMapping, fileStyles, interactionDests, node.absoluteBoundingBox ?? undefined);\n if (childOutput) lines.push(childOutput);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n/** Options for design tree generation. */\nexport interface DesignTreeOptions {\n /** Directory containing <nodeId>.svg files for VECTOR nodes */\n vectorDir?: string;\n /** Directory containing downloaded PNGs and mapping.json for IMAGE fill nodes */\n imageDir?: string;\n}\n\n/**\n * Generate a design tree string from an AnalysisFile.\n */\nexport interface DesignTreeResult {\n /** The design tree text */\n tree: string;\n /** Estimated token count (~4 chars per token for mixed code/text) */\n estimatedTokens: number;\n /** Raw byte size */\n bytes: number;\n}\n\n/**\n * Generate a design tree string from an AnalysisFile.\n */\nexport function generateDesignTree(file: AnalysisFile, options?: DesignTreeOptions): string {\n return generateDesignTreeWithStats(file, options).tree;\n}\n\n/**\n * Generate a design tree with token/size statistics.\n * Use this when you need to measure token consumption for AI context budget.\n */\nexport function generateDesignTreeWithStats(file: AnalysisFile, options?: DesignTreeOptions): DesignTreeResult {\n const root = file.document;\n const w = root.absoluteBoundingBox ? Math.round(root.absoluteBoundingBox.width) : 0;\n const h = root.absoluteBoundingBox ? Math.round(root.absoluteBoundingBox.height) : 0;\n\n // Load image mapping once if imageDir is provided\n let imageMapping: Record<string, string> | undefined;\n if (options?.imageDir) {\n const mappingPath = join(options.imageDir, \"mapping.json\");\n if (existsSync(mappingPath)) {\n try {\n imageMapping = JSON.parse(readFileSync(mappingPath, \"utf-8\")) as Record<string, string>;\n } catch { /* ignore malformed mapping */ }\n }\n }\n\n // Load vector mapping once if vectorDir is provided\n let vectorMapping: Record<string, string> | undefined;\n if (options?.vectorDir) {\n const mappingPath = join(options.vectorDir, \"mapping.json\");\n if (existsSync(mappingPath)) {\n try {\n vectorMapping = JSON.parse(readFileSync(mappingPath, \"utf-8\")) as Record<string, string>;\n } catch { /* ignore malformed mapping */ }\n }\n }\n\n const tree = renderNode(root, 0, options?.vectorDir, file.components, imageMapping, vectorMapping, file.styles, file.interactionDestinations);\n\n const result = [\n \"# Design Tree\",\n `# Root: ${w}px x ${h}px`,\n \"# Each node shows: name (TYPE, WxH) followed by CSS-like styles\",\n \"# Reproduce this tree as HTML. Each node = one HTML element.\",\n \"# Every style value is from Figma data — use exactly as shown.\",\n \"\",\n tree,\n ].join(\"\\n\");\n\n const bytes = Buffer.byteLength(result, \"utf-8\");\n // ~4 chars per token for mixed code/text (conservative estimate)\n const estimatedTokens = Math.ceil(result.length / 4);\n\n return { tree: result, estimatedTokens, bytes };\n}\n","/**\n * Strip specific information types from design-tree text for ablation experiments.\n * Post-processes the generated text — does NOT modify design-tree.ts.\n *\n * Flow: generateDesignTree() → stripDesignTree() → send to LLM\n */\n\n/** All strip types available (including utility strips not used in experiments). */\nexport type DesignTreeStripType =\n | \"layout-direction-spacing\"\n | \"size-constraints\"\n | \"position-stacking\"\n | \"color-values\"\n | \"typography\"\n | \"shadows-effects\"\n | \"component-references\"\n | \"component-descriptions\"\n | \"node-names-hierarchy\"\n | \"overflow-text-behavior\"\n | \"hover-interaction-states\"\n | \"variable-references\"\n | \"style-references\";\n\n/**\n * Experiment-relevant strip types only.\n * Excludes trivially obvious types (color, typography, shadows, overflow, hover)\n * and no-op types (position-stacking, component-descriptions).\n */\nexport type DesignTreeInfoType =\n | \"layout-direction-spacing\"\n | \"size-constraints\"\n | \"component-references\"\n | \"node-names-hierarchy\"\n | \"variable-references\"\n | \"style-references\";\n\n/** All strip types (used for exhaustive testing). */\nexport const ALL_STRIP_TYPES: readonly DesignTreeStripType[] = [\n \"layout-direction-spacing\", \"size-constraints\", \"position-stacking\",\n \"color-values\", \"typography\", \"shadows-effects\", \"component-references\",\n \"component-descriptions\", \"node-names-hierarchy\", \"overflow-text-behavior\",\n \"hover-interaction-states\", \"variable-references\", \"style-references\",\n] as const;\n\n/**\n * Strip experiment types used in calibration ablation (six types).\n * Keep in sync with `StripTypeEnum` / `STRIP_TYPE_RULES` in the agents layer.\n * `size-constraints` pairs with responsive rules `missing-size-constraint`, `fixed-size-in-auto-layout`.\n */\nexport const DESIGN_TREE_INFO_TYPES: readonly DesignTreeInfoType[] = [\n \"layout-direction-spacing\",\n \"size-constraints\",\n \"component-references\",\n \"node-names-hierarchy\",\n \"variable-references\",\n \"style-references\",\n] as const;\n\n// --- Style property matchers ---\n\nconst LAYOUT_PROPS = new Set([\n \"display\",\n \"flex-direction\",\n \"flex-wrap\",\n \"gap\",\n \"row-gap\",\n \"column-gap\",\n \"justify-content\",\n \"align-items\",\n \"align-content\",\n \"padding\",\n \"grid-template-columns\",\n \"grid-template-rows\",\n \"align-self\",\n]);\n\nconst SIZE_PROPS = new Set([\n \"min-width\",\n \"max-width\",\n \"min-height\",\n \"max-height\",\n \"flex-grow\",\n]);\n\nconst TYPOGRAPHY_PROPS = new Set([\n \"font-family\",\n \"font-weight\",\n \"font-size\",\n \"line-height\",\n \"letter-spacing\",\n \"text-align\",\n \"text-decoration\",\n]);\n\nconst SHADOW_PROPS = new Set([\n \"box-shadow\",\n \"opacity\",\n]);\n\n/** Get the CSS property name from a style segment like \"font-size: 16px\" */\nfunction getPropertyName(segment: string): string {\n const colonIdx = segment.indexOf(\":\");\n if (colonIdx === -1) return segment.trim();\n return segment.slice(0, colonIdx).trim();\n}\n\n/** Check if a style segment is a \"fill\" size (width: 100% or height: 100%) */\nfunction isFillSize(segment: string): boolean {\n const trimmed = segment.trim();\n return trimmed === \"width: 100%\" || trimmed === \"height: 100%\";\n}\n\n// --- Color replacement ---\n\nconst HEX_COLOR_RE = /#[0-9A-Fa-f]{6,8}/g;\nconst RGBA_RE = /rgba?\\(\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*\\d+\\s*(?:,\\s*[\\d.]+\\s*)?\\)/g;\nconst SVG_COLOR_ATTR_RE = /(fill|stroke)=\"(#[0-9A-Fa-f]{6,8})\"/g;\n\nfunction replaceColors(segment: string): string {\n let result = segment;\n result = result.replace(RGBA_RE, \"[COLOR]\");\n result = result.replace(HEX_COLOR_RE, \"[COLOR]\");\n return result;\n}\n\nfunction replaceColorsInSvg(svgContent: string): string {\n return svgContent.replace(SVG_COLOR_ATTR_RE, '$1=\"[COLOR]\"');\n}\n\n// --- Reference removal ---\n\nconst VAR_COMMENT_RE = /\\s*\\/\\*\\s*var:[^*]*\\*\\//g;\nconst TEXT_STYLE_COMMENT_RE = /\\s*\\/\\*\\s*text-style:[^*]*\\*\\//g;\n\nfunction removeVarRefs(segment: string): string {\n return segment.replace(VAR_COMMENT_RE, \"\").trim();\n}\n\nfunction removeStyleRefs(segment: string): string {\n return segment.replace(TEXT_STYLE_COMMENT_RE, \"\").trim();\n}\n\n\n// --- Line classification ---\n\ninterface ParsedStyleLine {\n indent: string;\n properties: string[];\n svgSegment: string | null;\n /** text: \"...\" content — always preserved, never stripped or split. */\n textSegment: string | null;\n}\n\n/** Extract `text: \"...\"` segment from raw style string, handling escaped quotes. */\nfunction extractTextSegment(raw: string): { textSegment: string | null; rest: string } {\n // Match text: \"...\" allowing escaped quotes inside\n const textMatch = raw.match(/(?:^|;\\s*)text:\\s*\"(?:[^\"\\\\]|\\\\.)*\"/);\n if (!textMatch) return { textSegment: null, rest: raw };\n const textSegment = textMatch[0].replace(/^;\\s*/, \"\").trim();\n const rest = raw.replace(textMatch[0], \"\").replace(/;\\s*$/, \"\").replace(/^;\\s*/, \"\");\n return { textSegment, rest };\n}\n\n/** Split a style line into prefix, individual properties, optional SVG tail, and protected text. */\nfunction parseStyleLine(line: string): ParsedStyleLine | null {\n const match = line.match(/^(\\s*)style:\\s*(.*)/s);\n if (!match) return null;\n const indent = match[1] ?? \"\";\n const raw = match[2] ?? \"\";\n\n // 1. Extract text: \"...\" first (protected from splitting)\n const { textSegment, rest: afterText } = extractTextSegment(raw);\n\n // 2. Separate SVG segment (always last, starts with \"svg: <\")\n let svgSegment: string | null = null;\n let propsRaw = afterText;\n const svgIdx = afterText.indexOf(\"svg: <\");\n if (svgIdx !== -1) {\n svgSegment = afterText.slice(svgIdx);\n propsRaw = afterText.slice(0, svgIdx).replace(/;\\s*$/, \"\");\n }\n\n // 3. Split remaining properties by \"; \"\n const properties = propsRaw\n ? propsRaw.split(\"; \").map((p) => p.trim()).filter(Boolean)\n : [];\n\n return { indent, properties, svgSegment, textSegment };\n}\n\n/** Reassemble a style line from parts. Returns null if no properties remain. */\nfunction reassembleStyleLine(parsed: ParsedStyleLine): string | null {\n const parts = [...parsed.properties];\n if (parsed.svgSegment) parts.push(parsed.svgSegment);\n if (parsed.textSegment) parts.push(parsed.textSegment);\n if (parts.length === 0) return null;\n return `${parsed.indent}style: ${parts.join(\"; \")}`;\n}\n\n// --- Per-type strip functions ---\n\nfunction stripLayoutSpacing(lines: string[]): string[] {\n return lines.map((line) => {\n const parsed = parseStyleLine(line);\n if (!parsed) return line;\n parsed.properties = parsed.properties.filter((p) => {\n const prop = getPropertyName(p);\n return !LAYOUT_PROPS.has(prop);\n });\n return reassembleStyleLine(parsed);\n }).filter((line): line is string => line !== null);\n}\n\nfunction stripSizeConstraints(lines: string[]): string[] {\n return lines.map((line) => {\n const parsed = parseStyleLine(line);\n if (!parsed) return line;\n parsed.properties = parsed.properties.filter((p) => {\n const prop = getPropertyName(p);\n if (SIZE_PROPS.has(prop)) return false;\n if (isFillSize(p)) return false;\n return true;\n });\n return reassembleStyleLine(parsed);\n }).filter((line): line is string => line !== null);\n}\n\nfunction stripColorValues(lines: string[]): string[] {\n return lines.map((line) => {\n // Handle [hover] lines — replace colors there too\n if (line.match(/^\\s*\\[hover\\]:/)) {\n return replaceColors(line);\n }\n\n const parsed = parseStyleLine(line);\n if (!parsed) return line;\n\n parsed.properties = parsed.properties.map((p) => {\n const prop = getPropertyName(p);\n // Don't touch image paths or text content\n if (prop === \"background-image\") return p;\n if (prop === \"content-image\") return p;\n if (prop === \"text\") return p;\n // Replace colors in background, color, border, box-shadow\n if ([\"background\", \"color\", \"border\", \"border-top\", \"border-right\",\n \"border-bottom\", \"border-left\", \"box-shadow\"].includes(prop)) {\n return replaceColors(p);\n }\n return p;\n });\n\n // Replace colors in SVG\n if (parsed.svgSegment) {\n parsed.svgSegment = replaceColorsInSvg(parsed.svgSegment);\n }\n\n return reassembleStyleLine(parsed);\n }).filter((line): line is string => line !== null);\n}\n\nfunction stripTypography(lines: string[]): string[] {\n return lines.map((line) => {\n const parsed = parseStyleLine(line);\n if (!parsed) return line;\n parsed.properties = parsed.properties.filter((p) => {\n const prop = getPropertyName(p);\n if (TYPOGRAPHY_PROPS.has(prop)) return false;\n if (p.trim().startsWith(\"/* text-style:\")) return false;\n return true;\n });\n return reassembleStyleLine(parsed);\n }).filter((line): line is string => line !== null);\n}\n\nfunction stripShadowsEffects(lines: string[]): string[] {\n return lines.map((line) => {\n const parsed = parseStyleLine(line);\n if (!parsed) return line;\n parsed.properties = parsed.properties.filter((p) => {\n const prop = getPropertyName(p);\n return !SHADOW_PROPS.has(prop);\n });\n return reassembleStyleLine(parsed);\n }).filter((line): line is string => line !== null);\n}\n\n/** Header line pattern: {indent}Name (TYPE, WxH) with optional [component: ...] */\nconst HEADER_RE = /^(\\s*)(.+?)(\\s*\\([A-Z_]+,\\s*[\\d?]+x[\\d?]+\\).*)$/;\n\n/** Check if a line is a node header (not style/comment/component-properties/hover). */\nfunction isHeaderLine(line: string): boolean {\n if (line.trimStart().startsWith(\"style:\")) return false;\n if (line.trimStart().startsWith(\"[hover]:\")) return false;\n if (line.trimStart().startsWith(\"component-properties:\")) return false;\n if (line.startsWith(\"#\")) return false;\n return HEADER_RE.test(line);\n}\n\nfunction stripComponentReferences(lines: string[]): string[] {\n return lines\n .filter((line) => !line.match(/^\\s*component-properties:/))\n .map((line) => {\n if (isHeaderLine(line)) {\n return line.replace(/\\s*\\[component:[^\\]]*\\]$/, \"\");\n }\n return line;\n });\n}\n\nfunction stripNodeNames(lines: string[]): string[] {\n let counter = 0;\n return lines.map((line) => {\n if (!isHeaderLine(line)) return line;\n const match = line.match(HEADER_RE);\n if (match) {\n counter++;\n return `${match[1]}Node${counter}${match[3]}`;\n }\n return line;\n });\n}\n\nfunction stripOverflow(lines: string[]): string[] {\n return lines.map((line) => {\n const parsed = parseStyleLine(line);\n if (!parsed) return line;\n parsed.properties = parsed.properties.filter((p) =>\n p.trim() !== \"overflow: hidden\"\n );\n return reassembleStyleLine(parsed);\n }).filter((line): line is string => line !== null);\n}\n\nfunction stripHoverStates(lines: string[]): string[] {\n return lines.filter((line) => !line.match(/^\\s*\\[hover\\]:/));\n}\n\n/** Strip variable reference comments only (keep text-style references). */\nfunction stripVariableReferences(lines: string[]): string[] {\n return lines.map((line) => {\n const parsed = parseStyleLine(line);\n if (!parsed) return line;\n parsed.properties = parsed.properties\n .map((p) => removeVarRefs(p))\n .filter(Boolean);\n return reassembleStyleLine(parsed);\n }).filter((line): line is string => line !== null);\n}\n\n/** Strip text-style comments only (keep variable references). */\nfunction stripStyleReferences(lines: string[]): string[] {\n return lines.map((line) => {\n const parsed = parseStyleLine(line);\n if (!parsed) return line;\n parsed.properties = parsed.properties\n .map((p) => removeStyleRefs(p))\n .filter(Boolean);\n return reassembleStyleLine(parsed);\n }).filter((line): line is string => line !== null);\n}\n\n// --- Main API ---\n\nconst STRIP_FUNCTIONS: Record<DesignTreeStripType, (lines: string[]) => string[]> = {\n \"layout-direction-spacing\": stripLayoutSpacing,\n \"size-constraints\": stripSizeConstraints,\n \"position-stacking\": (lines) => lines,\n \"color-values\": stripColorValues,\n \"typography\": stripTypography,\n \"shadows-effects\": stripShadowsEffects,\n \"component-references\": stripComponentReferences,\n \"component-descriptions\": (lines) => lines,\n \"node-names-hierarchy\": stripNodeNames,\n \"overflow-text-behavior\": stripOverflow,\n \"hover-interaction-states\": stripHoverStates,\n \"variable-references\": stripVariableReferences,\n \"style-references\": stripStyleReferences,\n};\n\n/**\n * Strip a specific information type from a design-tree text.\n * Returns a new string with the target information removed.\n */\nexport function stripDesignTree(tree: string, type: DesignTreeStripType): string {\n const lines = tree.split(\"\\n\");\n const stripped = STRIP_FUNCTIONS[type](lines);\n return stripped.join(\"\\n\");\n}\n","/**\n * Delta-based difficulty mapping for ablation experiments.\n * Converts pixel similarity delta (baseline - stripped) to a difficulty level.\n *\n * Used by calibration pipeline to objectively measure rule impact\n * instead of relying on Converter self-assessment.\n */\n\nimport type { Difficulty } from \"../../agents/contracts/conversion-agent.js\";\n\n/**\n * Map a strip experiment's similarity delta to a difficulty level.\n *\n * Delta = baseline similarity - stripped similarity (percentage points).\n * Higher delta means removing that information caused more pixel degradation.\n *\n * Thresholds from issue #191:\n * - ≤ 5%p → easy (removing info barely matters)\n * - 6-15%p → moderate (noticeable degradation)\n * - 16-30%p → hard (significant degradation)\n * - > 30%p → failed (critical information)\n */\nexport function stripDeltaToDifficulty(delta: number): Difficulty {\n if (!Number.isFinite(delta)) {\n throw new TypeError(`Invalid strip delta: ${delta}`);\n }\n if (delta <= 5) return \"easy\";\n if (delta <= 15) return \"moderate\";\n if (delta <= 30) return \"hard\";\n return \"failed\";\n}\n\n/**\n * Map a token count delta percentage to a difficulty level.\n *\n * tokenDelta = baselineInputTokens - strippedInputTokens.\n * tokenDeltaPercent = tokenDelta / baselineInputTokens * 100.\n * Higher percentage means removing that info significantly reduces token cost,\n * i.e. the info contributed a lot of tokens — its absence matters for token management.\n *\n * Thresholds:\n * - ≤ 5% → easy (minimal token impact)\n * - 6-20% → moderate (noticeable token savings)\n * - 21-40% → hard (significant token impact)\n * - > 40% → failed (critical for token budget)\n */\nexport function tokenDeltaToDifficulty(baselineTokens: number, strippedTokens: number): Difficulty {\n if (!Number.isFinite(baselineTokens) || !Number.isFinite(strippedTokens)) {\n throw new TypeError(`Invalid token counts: baseline=${baselineTokens}, stripped=${strippedTokens}`);\n }\n if (baselineTokens <= 0) return \"easy\";\n const deltaPercent = ((baselineTokens - strippedTokens) / baselineTokens) * 100;\n if (deltaPercent <= 5) return \"easy\";\n if (deltaPercent <= 20) return \"moderate\";\n if (deltaPercent <= 40) return \"hard\";\n return \"failed\";\n}\n","import type { InstanceContext } from \"../contracts/gotcha-survey.js\";\nimport { isInstanceChildNodeId } from \"../adapters/instance-id-parser.js\";\n\n/**\n * Write strategy for a gotcha apply target. Consumers can branch on this enum\n * without parsing the human-readable `guidance` string.\n *\n * - `scene-only`: plain scene node id, no instance handling needed.\n * - `prefer-definition`: instance-child id + resolved `instanceContext`; layout\n * and min/max writes should go to the definition node after user confirmation.\n * - `definition-unknown`: instance-child id but `instanceContext` is missing;\n * caller must resolve the source component at runtime.\n */\nexport type GotchaApplyStrategy =\n | \"scene-only\"\n | \"prefer-definition\"\n | \"definition-unknown\";\n\n/**\n * Resolved targets for applying gotcha fixes in Figma (Plugin API or MCP `use_figma`).\n *\n * Survey questions may include `instanceContext` when the violation `nodeId` is an\n * instance-child id (`I...;...`). Property overrides often fail on those scene nodes;\n * the definition node id is the usual write target after user confirmation.\n */\nexport type GotchaApplyResolution = {\n /** Scene node id from the survey (`question.nodeId`). */\n sceneNodeId: string;\n /** Source definition node id from `instanceContext.sourceNodeId`, when known. */\n definitionNodeId: string | undefined;\n /** Machine-readable write strategy — branch on this from TS consumers. */\n strategy: GotchaApplyStrategy;\n /**\n * Opt-in hints for the caller. Fields in this namespace take effect ONLY\n * when the caller has enabled `allowDefinitionWrite` on the roundtrip helper.\n * Under the ADR-012 default (opt-in off), these are informational — the\n * actual write still routes to scene-then-annotate regardless.\n *\n * ADR-012 Q5: future per-rule opt-in fields grow under this namespace.\n */\n optIn: {\n /**\n * Hint that the definition node is the better write target for layout and\n * min/max size-constraint writes on this node. Takes effect only when\n * `allowDefinitionWrite` is enabled — otherwise the helper annotates the\n * scene and names the source component without propagating.\n */\n preferDefinitionForLayoutProps: boolean;\n };\n /**\n * Human-readable note for skills, UI, or logs. Skill-oriented (may reference\n * Plugin API calls like `getMainComponentAsync`). TS consumers should branch\n * on `strategy` instead of parsing this string.\n */\n guidance: string;\n};\n\n/**\n * Resolve which node ids and policy apply for a gotcha survey question.\n */\nexport function resolveGotchaApplyTarget(\n nodeId: string,\n instanceContext: InstanceContext | undefined,\n): GotchaApplyResolution {\n if (instanceContext) {\n const componentPhrase = instanceContext.sourceComponentName\n ? `inside component ${instanceContext.sourceComponentName}`\n : \"inside the source component\";\n return {\n sceneNodeId: nodeId,\n definitionNodeId: instanceContext.sourceNodeId,\n strategy: \"prefer-definition\",\n optIn: { preferDefinitionForLayoutProps: true },\n guidance:\n `This question targets a node inside an instance. Overrides may fail on the scene node. ` +\n `For layout and min/max sizing, apply changes on node ${instanceContext.sourceNodeId} ` +\n `${componentPhrase} (parent instance ${instanceContext.parentInstanceNodeId}). ` +\n `Confirm with the user first — definition edits propagate to every instance of that component in the file.`,\n };\n }\n\n if (isInstanceChildNodeId(nodeId)) {\n return {\n sceneNodeId: nodeId,\n definitionNodeId: undefined,\n strategy: \"definition-unknown\",\n optIn: { preferDefinitionForLayoutProps: true },\n guidance:\n \"The node id looks like a Figma instance child (`I...;...`) but no `instanceContext` was attached. \" +\n \"Parse the segment after the last `;` as the source definition id, resolve the parent INSTANCE, \" +\n \"and use `getMainComponentAsync()` when `figma.getNodeById(sourceId)` is not enough (e.g. nested instances).\",\n };\n }\n\n return {\n sceneNodeId: nodeId,\n definitionNodeId: undefined,\n strategy: \"scene-only\",\n optIn: { preferDefinitionForLayoutProps: false },\n guidance: \"\",\n };\n}\n","/**\n * Centralized node semantic classification.\n * All \"what is this node?\" logic lives here so rules share the same predicates.\n *\n * Categories:\n * - Container: layout containers (frame, group, component, instance)\n * - Visual: decorative/graphic elements (vector, shape, image)\n * - Interactive: user-interactable elements (button, link, tab, input, toggle)\n * - Overlay: elements that open on top (modal, drawer, dropdown)\n * - Carousel: elements that slide/swipe (carousel, slider, gallery)\n * - Token: style/variable binding checks\n * - Naming: name pattern classification\n */\n\nimport type { AnalysisNode } from \"../contracts/figma-node.js\";\n\n// ── Container classification ─────────────────────────────────────────────────\n\nexport function isContainerNode(node: AnalysisNode): boolean {\n return node.type === \"FRAME\" || node.type === \"GROUP\" || node.type === \"COMPONENT\" || node.type === \"INSTANCE\";\n}\n\nexport function hasAutoLayout(node: AnalysisNode): boolean {\n return node.layoutMode !== undefined && node.layoutMode !== \"NONE\";\n}\n\nexport function hasTextContent(node: AnalysisNode): boolean {\n return node.type === \"TEXT\" || (node.children?.some((c) => c.type === \"TEXT\") ?? false);\n}\n\nexport function hasOverlappingBounds(a: AnalysisNode, b: AnalysisNode): boolean {\n const boxA = a.absoluteBoundingBox;\n const boxB = b.absoluteBoundingBox;\n\n if (!boxA || !boxB) return false;\n\n return !(\n boxA.x + boxA.width <= boxB.x ||\n boxB.x + boxB.width <= boxA.x ||\n boxA.y + boxA.height <= boxB.y ||\n boxB.y + boxB.height <= boxA.y\n );\n}\n\n// ── Visual classification ────────────────────────────────────────────────────\n\nconst VISUAL_LEAF_TYPES = new Set([\n \"VECTOR\", \"BOOLEAN_OPERATION\", \"ELLIPSE\", \"LINE\", \"STAR\", \"REGULAR_POLYGON\", \"RECTANGLE\",\n]);\n\nexport function isVisualLeafType(type: string): boolean {\n return VISUAL_LEAF_TYPES.has(type);\n}\n\nexport function hasImageFill(node: AnalysisNode): boolean {\n if (!Array.isArray(node.fills)) return false;\n return node.fills.some(\n (fill) =>\n typeof fill === \"object\" &&\n fill !== null &&\n (fill as { type?: unknown }).type === \"IMAGE\",\n );\n}\n\nexport function isVisualOnlyNode(node: AnalysisNode): boolean {\n if (VISUAL_LEAF_TYPES.has(node.type)) return true;\n const hasOnlyVisualChildren =\n node.children !== undefined &&\n node.children.length > 0 &&\n node.children.every((c) => VISUAL_LEAF_TYPES.has(c.type));\n // Image fill only counts as visual-only when there are no content children\n if (hasImageFill(node) && (!node.children || node.children.length === 0 || hasOnlyVisualChildren)) {\n return true;\n }\n if (hasOnlyVisualChildren) return true;\n return false;\n}\n\n// ── Interactive classification ───────────────────────────────────────────────\n\nexport type StatefulComponentType = \"button\" | \"link\" | \"tab\" | \"input\" | \"toggle\";\n\n/** Name patterns → interactive type mapping */\nexport const STATEFUL_PATTERNS: Array<{ pattern: RegExp; type: StatefulComponentType }> = [\n { pattern: /\\b(btn|button|cta)\\b/i, type: \"button\" },\n { pattern: /\\b(link|anchor)\\b/i, type: \"link\" },\n { pattern: /\\b(tab|tabs)\\b/i, type: \"tab\" },\n { pattern: /\\b(nav|navigation|menu|navbar)\\b/i, type: \"tab\" },\n { pattern: /\\b(input|text-?field|search-?bar|textarea)\\b/i, type: \"input\" },\n { pattern: /\\b(select|dropdown|combo-?box)\\b/i, type: \"input\" },\n { pattern: /\\b(toggle|switch|checkbox|radio)\\b/i, type: \"toggle\" },\n];\n\nexport function getStatefulComponentType(node: AnalysisNode): StatefulComponentType | null {\n if (!node.name) return null;\n for (const entry of STATEFUL_PATTERNS) {\n if (entry.pattern.test(node.name)) return entry.type;\n }\n return null;\n}\n\nexport function isStatefulComponent(node: AnalysisNode): boolean {\n return getStatefulComponentType(node) !== null;\n}\n\n/**\n * Standard state names across web + mobile platforms.\n * Used by missing-interaction-state (to detect presence) and\n * non-standard-naming (to flag non-standard names).\n *\n * Sources:\n * - CSS: :hover, :active, :focus, :disabled, :enabled — https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Selectors/Pseudo-classes\n * - Material Design 3: Hovered, Focused, Pressed, Dragged — https://m3.material.io/foundations/interaction/states\n * - UIKit: highlighted, selected, disabled, focused — https://developer.apple.com/documentation/uikit/uicontrol/state\n */\nexport const STANDARD_STATE_NAMES = new Set([\n // CSS pseudo-classes (web)\n \"default\", \"hover\", \"active\", \"focus\", \"focused\", \"disabled\", \"enabled\",\n // Material Design 3 (Android)\n \"pressed\", \"dragged\",\n // UIKit (iOS)\n \"highlighted\",\n // Common\n \"selected\",\n]);\n\n/**\n * Patterns that look like state names but aren't in the standard set.\n * Maps common non-standard names to their standard equivalent for suggestions.\n */\nexport const STATE_NAME_SUGGESTIONS: Record<string, string> = {\n on: \"active\",\n off: \"default\",\n clicked: \"pressed\",\n tapped: \"pressed\",\n inactive: \"disabled\",\n normal: \"default\",\n rest: \"default\",\n hovered: \"hover\",\n activated: \"active\",\n checked: \"selected\",\n unchecked: \"default\",\n};\n\n/** Pattern to detect state-like variant option names (broad match) */\nexport const STATE_LIKE_PATTERN = /\\b(on|off|clicked|tapped|inactive|normal|rest|hovered|activated|checked|unchecked)\\b/i;\n\n// ── Overlay / Carousel patterns ──────────────────────────────────────────────\n\n/** Elements that open on top of current view */\nexport const OVERLAY_PATTERN = /\\b(dropdown|select|combo-?box|popover|accordion|drawer|modal|bottom-?sheet|sheet|sidebar|panel|dialog|popup|toast)\\b/i;\n\n/** Elements that swipe/slide between items */\nexport const CAROUSEL_PATTERN = /\\b(carousel|slider|swiper|slide-?show|gallery)\\b/i;\n\nexport function isOverlayNode(node: AnalysisNode): boolean {\n return node.name !== undefined && OVERLAY_PATTERN.test(node.name);\n}\n\nexport function isCarouselNode(node: AnalysisNode): boolean {\n return node.name !== undefined && CAROUSEL_PATTERN.test(node.name);\n}\n\n// ── Token classification ─────────────────────────────────────────────────────\n\nexport function hasStyleReference(node: AnalysisNode, styleType: string): boolean {\n return node.styles !== undefined && styleType in node.styles;\n}\n\nexport function hasBoundVariable(node: AnalysisNode, key: string): boolean {\n return node.boundVariables !== undefined && key in node.boundVariables;\n}\n\n// ── Naming patterns ──────────────────────────────────────────────────────────\n\n/** Figma default name patterns (Frame 1, Group 2, etc.) */\nexport const DEFAULT_NAME_PATTERNS = [\n /^Frame\\s*\\d*$/i,\n /^Group\\s*\\d*$/i,\n /^Rectangle\\s*\\d*$/i,\n /^Ellipse\\s*\\d*$/i,\n /^Vector\\s*\\d*$/i,\n /^Line\\s*\\d*$/i,\n /^Text\\s*\\d*$/i,\n /^Image\\s*\\d*$/i,\n /^Component\\s*\\d*$/i,\n /^Instance\\s*\\d*$/i,\n];\n\nexport function isDefaultName(name: string): boolean {\n return DEFAULT_NAME_PATTERNS.some((pattern) => pattern.test(name));\n}\n\n/** Shape-only non-semantic names */\nexport const NON_SEMANTIC_NAMES = [\n \"rectangle\", \"ellipse\", \"vector\", \"line\", \"polygon\",\n \"star\", \"path\", \"shape\", \"image\", \"fill\", \"stroke\",\n];\n\nexport function isNonSemanticName(name: string): boolean {\n return NON_SEMANTIC_NAMES.includes(name.toLowerCase().trim());\n}\n\n// ── Exclusion ────────────────────────────────────────────────────────────────\n\nexport const EXCLUDED_NAME_PATTERN = /(badge|close|dismiss|overlay|float|fab|dot|indicator|corner|decoration|tag|status|notification|icon|ico|image|asset|filter|dim|dimmed|bg|background|logo|avatar|divider|separator|nav|navigation|gnb|header|footer|sidebar|toolbar|modal|dialog|popup|toast|tooltip|dropdown|menu|sticky|spinner|loader|cursor|cta|chatbot|thumb|thumbnail|tabbar|tab-bar|statusbar|status-bar)/i;\n\nexport function isExcludedName(name: string): boolean {\n return EXCLUDED_NAME_PATTERN.test(name);\n}\n","import type { AnalysisNode } from \"../contracts/figma-node.js\";\nimport { isVisualLeafType, isVisualOnlyNode, isExcludedName } from \"./node-semantics.js\";\n\n// ============================================\n// Auto-layout exceptions\n// ============================================\n\n/** Frames that don't need auto-layout (only visual-leaf children like icon paths) */\nexport function isAutoLayoutExempt(node: AnalysisNode): boolean {\n if (\n node.children &&\n node.children.length > 0 &&\n node.children.every((c) => isVisualLeafType(c.type))\n ) return true;\n\n return false;\n}\n\n// ============================================\n// Absolute-position exceptions\n// ============================================\n\n/** Nodes that are allowed to use absolute positioning inside auto-layout */\nexport function isAbsolutePositionExempt(node: AnalysisNode): boolean {\n if (isVisualOnlyNode(node)) return true;\n\n // Intentional name patterns (badge, close, overlay, etc.)\n if (isExcludedName(node.name)) return true;\n\n return false;\n}\n\n// ============================================\n// Size-constraint exceptions\n// ============================================\n//\n// `isSizeConstraintExempt` was removed in #403 (commit\n// `feat(rules): missing-size-constraint scope-aware…`). The new rule\n// walks the full ancestor chain to determine whether any container\n// already establishes a width bound, which strictly subsumes the old\n// \"parent has maxWidth OR depth <= 1\" heuristic. Keeping the helper\n// would produce two divergent definitions of \"bound\" in the codebase.\n\n// ============================================\n// Fixed-size exceptions\n// ============================================\n\n/** Nodes that are allowed to use fixed sizing inside auto-layout */\nexport function isFixedSizeExempt(node: AnalysisNode): boolean {\n // Visual-only nodes (icons, images, shapes) — intentionally fixed\n if (isVisualOnlyNode(node)) return true;\n\n // Excluded names (nav, header, etc.)\n if (isExcludedName(node.name)) return true;\n\n return false;\n}\n","/**\n * Centralized rule violation messages.\n * All message text lives here so CLI, web, plugin, and MCP share the same strings.\n *\n * Each message function returns { message, suggestion, guide? }:\n * - message: what's wrong (node-specific, dynamic)\n * - suggestion: how to fix it (node-specific, dynamic)\n * - guide: exemption hint (optional, when the rule auto-excludes certain cases)\n */\n\n// ── Message return type ─────────────────────────────────────────────────────\n\nexport interface ViolationMsg {\n message: string;\n suggestion: string;\n guide?: string;\n}\n\n// ── Sub-type definitions ─────────────────────────────────────────────────────\n\nexport type RawValueSubType = \"color\" | \"font\" | \"shadow\" | \"opacity\" | \"spacing\";\nexport type NoAutoLayoutSubType = \"overlapping\" | \"nested\" | \"basic\";\nexport type FixedSizeSubType = \"both-axes\" | \"horizontal\";\nexport type MissingComponentSubType = \"unused-component\" | \"name-repetition\" | \"structure-repetition\" | \"style-override\";\n\n// ── raw-value ────────────────────────────────────────────────────────────────\n\nexport const rawValueMsg = {\n color: (name: string, hex: string): ViolationMsg => ({\n message: `\"${name}\" uses raw fill color ${hex} without style or variable`,\n suggestion: `Bind to a color token`,\n }),\n font: (name: string, fontDesc: string): ViolationMsg => ({\n message: `\"${name}\" uses raw font${fontDesc} without text style`,\n suggestion: `Apply a text style`,\n }),\n shadow: (name: string, shadowType: string, details: string): ViolationMsg => ({\n message: `\"${name}\" has ${shadowType}${details} without effect style`,\n suggestion: `Apply an effect style`,\n }),\n opacity: (name: string, pct: number): ViolationMsg => ({\n message: `\"${name}\" uses raw opacity (${pct}%) without a variable binding`,\n suggestion: `Bind opacity to a variable`,\n }),\n spacing: (name: string, label: string, value: number): ViolationMsg => ({\n message: `\"${name}\" uses raw ${label} (${value}px) without a variable binding`,\n suggestion: `Bind spacing to a variable`,\n }),\n};\n\n// ── irregular-spacing ────────────────────────────────────────────────────────\n\nexport type IrregularSpacingSubType = \"padding\" | \"gap\";\n\nexport const irregularSpacingMsg = (name: string, spacing: number, gridBase: number, nearest: number): ViolationMsg => ({\n message: `\"${name}\" has spacing ${spacing}px not on ${gridBase}pt grid`,\n suggestion: `Round to nearest ${gridBase}pt multiple (${nearest}px)`,\n});\n\n// ── no-auto-layout ───────────────────────────────────────────────────────────\n\nexport const noAutoLayoutMsg = {\n overlapping: (name: string): ViolationMsg => ({\n message: `\"${name}\" has overlapping children without Auto Layout`,\n suggestion: `Apply auto-layout to separate overlapping children`,\n guide: `If this is an intentional overlay (e.g., badge on avatar), this can be ignored`,\n }),\n nested: (name: string): ViolationMsg => ({\n message: `\"${name}\" has nested containers without layout hints`,\n suggestion: `Apply auto-layout to organize nested containers`,\n guide: `Icon wrappers containing only vectors are automatically excluded`,\n }),\n basic: (name: string, arrangement: string, directionHint: string): ViolationMsg => ({\n message: `Frame \"${name}\" has no auto-layout${arrangement}`,\n suggestion: directionHint ? `Apply ${directionHint} auto-layout` : `Apply auto-layout`,\n guide: `Single-child wrappers and icon containers are automatically excluded`,\n }),\n};\n\n// ── absolute-position-in-auto-layout ─────────────────────────────────────────\n\nexport const absolutePositionMsg = (name: string, parentName: string): ViolationMsg => ({\n message: `\"${name}\" uses absolute positioning inside Auto Layout parent \"${parentName}\"`,\n suggestion: `Remove absolute positioning or restructure outside the auto-layout parent`,\n guide: `If this is a badge or overlay, name it with \"badge\", \"overlay\", or \"icon\" to auto-exclude`,\n});\n\n// ── fixed-size-in-auto-layout ────────────────────────────────────────────────\n\nexport const fixedSizeMsg = {\n bothAxes: (name: string, width: number, height: number): ViolationMsg => ({\n message: `Container \"${name}\" (${width}×${height}) uses fixed size on both axes inside auto-layout`,\n suggestion: `Set at least one axis to HUG or FILL`,\n }),\n horizontal: (name: string, width: number): ViolationMsg => ({\n message: `\"${name}\" has fixed width (${width}px) inside auto-layout`,\n suggestion: `Set horizontal sizing to FILL`,\n }),\n};\n\n// ── missing-size-constraint ──────────────────────────────────────────────────\n//\n// #403: Subtypes are case-of-firing rather than property-of-fix. Each\n// subtype's gotcha question is a pure function of the subtype — the\n// message function does not need to read `rootNodeType` or `scope`\n// again. This keeps gotcha rendering simple at the cost of a slightly\n// longer subtype list (4 instead of 1).\n\nexport type MissingSizeConstraintSubType =\n | \"page-container-unbound\"\n | \"page-instance-fixed\"\n | \"component-fixed-by-design\"\n | \"component-fixed-by-override\";\n\nexport const missingSizeConstraintMsg = {\n pageContainerUnbound: (name: string, currentWidth: string): ViolationMsg => ({\n message: `Container \"${name}\" uses FILL width (currently ${currentWidth}) and no ancestor defines a width bound`,\n suggestion: `Decide whether this area should stretch with the screen, or set min/max-width here so the responsive behavior is explicit`,\n }),\n pageInstanceFixed: (name: string, currentWidth: string): ViolationMsg => ({\n message: `Instance \"${name}\" has fixed width (${currentWidth}) inside an Auto Layout parent`,\n suggestion: `Confirm whether this fixed width is intentional — if not, set the instance to FILL so it follows the parent's layout`,\n }),\n componentFixedByDesign: (name: string, currentWidth: string): ViolationMsg => ({\n message: `Component \"${name}\" has fixed width (${currentWidth}) at its root`,\n suggestion: `Confirm whether this component is intentionally non-responsive — otherwise switch root sizing to FILL or set min/max bounds`,\n }),\n componentFixedByOverride: (name: string, currentWidth: string): ViolationMsg => ({\n message: `Instance \"${name}\" overrides root width to fixed (${currentWidth}); the original component may be FILL`,\n suggestion: `Confirm whether the fixed-width override is intentional — if not, restore root sizing to inherit from the component definition`,\n }),\n};\n\n// ── non-layout-container (was group-usage) ───────────────────────────────────\n\nexport type NonLayoutContainerSubType = \"group\" | \"section\";\n\nexport const nonLayoutContainerMsg = {\n group: (name: string): ViolationMsg => ({\n message: `\"${name}\" is a Group`,\n suggestion: `Convert to Frame and apply auto-layout`,\n }),\n section: (name: string): ViolationMsg => ({\n message: `\"${name}\" is a Section used as layout container`,\n suggestion: `Convert to Frame and apply auto-layout`,\n }),\n};\n\n// ── deep-nesting ─────────────────────────────────────────────────────────────\n\nexport const deepNestingMsg = (name: string, depth: number, maxDepth: number): ViolationMsg => ({\n message: `\"${name}\" is nested ${depth} levels deep within its component (max: ${maxDepth})`,\n suggestion: `Extract into a sub-component to reduce depth`,\n});\n\n// ── missing-component ────────────────────────────────────────────────────────\n\nexport const missingComponentMsg = {\n unusedComponent: (componentName: string, count: number): ViolationMsg => ({\n message: `Component \"${componentName}\" exists but ${count} repeated frames found instead of instances`,\n suggestion: `Replace frames with component instances`,\n }),\n nameRepetition: (name: string, count: number): ViolationMsg => ({\n message: `\"${name}\" appears ${count} times`,\n suggestion: `Extract as a reusable component`,\n }),\n structureRepetition: (name: string, siblingCount: number): ViolationMsg => ({\n message: `\"${name}\" and ${siblingCount} sibling frame(s) share the same internal structure`,\n suggestion: `Extract a shared component from the repeated structure`,\n }),\n styleOverride: (componentName: string, overrides: string[]): ViolationMsg => ({\n message: `\"${componentName}\" instance has style overrides (${overrides.join(\", \")})`,\n suggestion: `Create a new variant for this style combination`,\n }),\n};\n\n// ── detached-instance ────────────────────────────────────────────────────────\n\nexport const detachedInstanceMsg = (name: string, componentName: string): ViolationMsg => ({\n message: `\"${name}\" may be a detached instance of component \"${componentName}\"`,\n suggestion: `Restore as an instance of \"${componentName}\" or create a new variant`,\n});\n\n// ── variant-structure-mismatch ───────────────────────────────────────────────\n\nexport const variantStructureMismatchMsg = (name: string, mismatchCount: number, totalVariants: number): ViolationMsg => ({\n message: `\"${name}\" has ${mismatchCount}/${totalVariants} variants with different child structures`,\n suggestion: `Unify variant structures using visibility toggles for optional elements`,\n});\n\n// ── non-standard-naming ──────────────────────────────────────────────────────\n\nexport type NonStandardNamingSubType = \"state-name\";\n\nexport const nonStandardNamingMsg = {\n stateName: (name: string, nonStandard: string, suggested: string): ViolationMsg => ({\n message: `\"${name}\" has non-standard state name \"${nonStandard}\"`,\n suggestion: `Use \"${suggested}\" for dev-friendly naming`,\n }),\n};\n\n// ── non-semantic-name (merged: default-name + non-semantic-name) ─────────────\n\nexport type NonSemanticNameSubType = \"frame\" | \"group\" | \"vector\" | \"shape\" | \"text\" | \"image\" | \"component\" | \"instance\" | \"shape-name\";\n\nconst DEFAULT_NAME_SUBTYPE_MAP: Record<string, NonSemanticNameSubType> = {\n FRAME: \"frame\",\n GROUP: \"group\",\n RECTANGLE: \"shape\",\n ELLIPSE: \"shape\",\n VECTOR: \"vector\",\n LINE: \"vector\",\n STAR: \"shape\",\n REGULAR_POLYGON: \"shape\",\n TEXT: \"text\",\n IMAGE: \"image\",\n COMPONENT: \"component\",\n COMPONENT_SET: \"component\",\n INSTANCE: \"instance\",\n};\n\nexport function getDefaultNameSubType(nodeType: string): NonSemanticNameSubType {\n return DEFAULT_NAME_SUBTYPE_MAP[nodeType] ?? \"frame\";\n}\n\nconst NON_SEMANTIC_EXAMPLES: Record<string, string> = {\n FRAME: '\"Header\", \"ProductCard\", \"Sidebar\"',\n GROUP: '\"NavItems\", \"ButtonGroup\", \"CardContent\"',\n VECTOR: '\"ArrowIcon\", \"CheckMark\", \"LogoSymbol\"',\n LINE: '\"Divider\", \"Separator\", \"Underline\"',\n RECTANGLE: '\"Background\", \"Divider\", \"Overlay\"',\n ELLIPSE: '\"AvatarShape\", \"StatusDot\", \"Badge\"',\n STAR: '\"RatingIcon\", \"FavoriteIcon\", \"StarBadge\"',\n REGULAR_POLYGON: '\"PlayIcon\", \"WarningIcon\", \"ShapeDecor\"',\n TEXT: '\"PageTitle\", \"Description\", \"Price\"',\n IMAGE: '\"Avatar\", \"ProductPhoto\", \"Banner\"',\n COMPONENT: '\"PrimaryButton\", \"InputField\", \"CardTemplate\"',\n COMPONENT_SET: '\"Button\", \"Input\", \"Card\"',\n INSTANCE: '\"CloseButton\", \"UserAvatar\", \"StarIcon\"',\n};\n\nexport const nonSemanticNameMsg = (type: string, name: string): ViolationMsg => {\n const examples = NON_SEMANTIC_EXAMPLES[type] ?? '\"Header\", \"ProductCard\", \"Icon\"';\n return {\n message: `${type} \"${name}\" is a non-semantic name`,\n suggestion: `Rename to describe its role (e.g., ${examples})`,\n };\n};\n\n// ── missing-interaction-state ─────────────────────────────────────────────────\n\nexport type MissingInteractionStateSubType = \"hover\" | \"disabled\" | \"active\" | \"focus\";\n\nexport const missingInteractionStateMsg = {\n hover: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks interactive but has no Hover state variant`,\n suggestion: `Add a State=Hover variant`,\n }),\n disabled: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks interactive but has no Disabled state variant`,\n suggestion: `Add a State=Disabled variant`,\n }),\n active: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks interactive but has no Active state variant`,\n suggestion: `Add a State=Active variant`,\n }),\n focus: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks interactive but has no Focus state variant`,\n suggestion: `Add a State=Focus variant`,\n }),\n};\n\n// ── missing-prototype ─────────────────────────────────────────────────────────\n\nexport type MissingPrototypeSubType = \"button\" | \"navigation\" | \"tab\" | \"overlay\" | \"carousel\" | \"input\" | \"toggle\";\n\nexport const missingPrototypeMsg = {\n button: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks like a button but has no click prototype`,\n suggestion: `Add an ON_CLICK interaction to define the click behavior`,\n }),\n navigation: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks like a navigation link but has no click prototype`,\n suggestion: `Add an ON_CLICK interaction to define the destination`,\n }),\n tab: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks like a tab but has no click prototype`,\n suggestion: `Add an ON_CLICK interaction to define tab switching behavior`,\n }),\n overlay: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks like an overlay trigger but has no click prototype`,\n suggestion: `Add an ON_CLICK interaction to define open/close behavior`,\n }),\n carousel: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks like a carousel but has no interaction prototype`,\n suggestion: `Add an ON_CLICK or ON_DRAG interaction to define slide navigation`,\n }),\n input: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks like an input but has no click prototype`,\n suggestion: `Add an ON_CLICK interaction to define focus/interaction behavior`,\n }),\n toggle: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks like a toggle but has no click prototype`,\n suggestion: `Add an ON_CLICK interaction to define on/off behavior`,\n }),\n};\n\n// ── inconsistent-naming-convention ───────────────────────────────────────────\n\nexport const inconsistentNamingMsg = (name: string, nodeConvention: string, dominantConvention: string, suggested: string): ViolationMsg => ({\n message: `\"${name}\" uses ${nodeConvention} while siblings use ${dominantConvention}`,\n suggestion: `Rename to \"${suggested}\"`,\n guide: `This checks sibling layers at the same level — you don't have to follow the exact suggestion, just keep naming consistent across siblings`,\n});\n","import type { AnalysisNode } from \"../../contracts/figma-node.js\";\nimport type { RuleCheckFn, RuleContext, RuleDefinition, RuleViolation } from \"../../contracts/rule.js\";\nimport { getAnalysisState } from \"../../contracts/rule.js\";\nimport { defineRule } from \"../rule-registry.js\";\nimport { getRuleOption } from \"../rule-config.js\";\nimport { isAutoLayoutExempt, isAbsolutePositionExempt, isFixedSizeExempt } from \"../rule-exceptions.js\";\nimport { noAutoLayoutMsg, absolutePositionMsg, fixedSizeMsg, missingSizeConstraintMsg, nonLayoutContainerMsg, deepNestingMsg } from \"../rule-messages.js\";\nimport { isContainerNode, hasAutoLayout, hasOverlappingBounds } from \"../node-semantics.js\";\n\n// ============================================\n// no-auto-layout (merged: absorbs ambiguous-structure + missing-layout-hint)\n// ============================================\n\nconst noAutoLayoutDef: RuleDefinition = {\n id: \"no-auto-layout\",\n name: \"No Auto Layout\",\n category: \"pixel-critical\",\n why: \"Without Auto Layout, AI must guess positioning from absolute coordinates instead of reading explicit layout rules\",\n impact: \"Generated code uses hardcoded positions that break on any content or screen size change\",\n fix: \"Apply Auto Layout to create clear, explicit structure — enables AI to generate flexbox/grid instead of absolute positioning\",\n};\n\nconst noAutoLayoutCheck: RuleCheckFn = (node, context) => {\n if (!isContainerNode(node)) return null;\n if (hasAutoLayout(node)) return null;\n if (!node.children || node.children.length === 0) return null;\n\n if (isAutoLayoutExempt(node)) return null;\n\n // Priority 1: Check for overlapping visible children (ambiguous-structure)\n if (node.children.length >= 2) {\n for (let i = 0; i < node.children.length; i++) {\n for (let j = i + 1; j < node.children.length; j++) {\n const childA = node.children[i];\n const childB = node.children[j];\n if (!childA || !childB) continue;\n\n if (hasOverlappingBounds(childA, childB)) {\n if (childA.visible !== false && childB.visible !== false) {\n return {\n ruleId: noAutoLayoutDef.id,\n subType: \"overlapping\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...noAutoLayoutMsg.overlapping(node.name),\n };\n }\n }\n }\n }\n }\n\n // Priority 2: Check for nested containers without layout hints (missing-layout-hint)\n if (node.children.length >= 2) {\n const nestedContainers = node.children.filter((c) => isContainerNode(c));\n if (nestedContainers.length >= 2) {\n const withoutLayout = nestedContainers.filter((c) => !hasAutoLayout(c));\n if (withoutLayout.length >= 2) {\n return {\n ruleId: noAutoLayoutDef.id,\n subType: \"nested\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...noAutoLayoutMsg.nested(node.name),\n };\n }\n }\n }\n\n // Priority 3: Basic no-auto-layout check (FRAME only)\n if (node.type !== \"FRAME\") return null;\n\n const childCount = node.children?.length ?? 0;\n let directionHint = \"\";\n if (node.children && node.children.length >= 2) {\n const boxes = node.children.filter(c => c.absoluteBoundingBox).map(c => c.absoluteBoundingBox!);\n if (boxes.length >= 2) {\n const yRange = Math.max(...boxes.map(b => b.y)) - Math.min(...boxes.map(b => b.y));\n const xRange = Math.max(...boxes.map(b => b.x)) - Math.min(...boxes.map(b => b.x));\n directionHint = yRange > xRange ? \"VERTICAL\" : \"HORIZONTAL\";\n }\n }\n\n const arrangement = directionHint\n ? ` (${childCount} children arranged ${directionHint.toLowerCase()}ly)`\n : childCount > 0 ? ` (${childCount} children)` : \"\";\n\n return {\n ruleId: noAutoLayoutDef.id,\n subType: \"basic\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...noAutoLayoutMsg.basic(node.name, arrangement, directionHint),\n };\n};\n\nexport const noAutoLayout = defineRule({\n definition: noAutoLayoutDef,\n check: noAutoLayoutCheck,\n});\n\n// ============================================\n// absolute-position-in-auto-layout\n// ============================================\n\nconst absolutePositionInAutoLayoutDef: RuleDefinition = {\n id: \"absolute-position-in-auto-layout\",\n name: \"Absolute Position in Auto Layout\",\n category: \"pixel-critical\",\n why: \"Absolute positioning inside Auto Layout contradicts the parent's layout rules — AI sees conflicting instructions\",\n impact: \"AI must decide whether to follow the parent's flexbox or the child's absolute position — often gets it wrong\",\n fix: \"Remove absolute positioning or use proper Auto Layout alignment\",\n};\n\nconst absolutePositionInAutoLayoutCheck: RuleCheckFn = (node, context) => {\n if (!context.parent) return null;\n if (!hasAutoLayout(context.parent)) return null;\n if (node.layoutPositioning !== \"ABSOLUTE\") return null;\n\n if (isAbsolutePositionExempt(node)) return null;\n\n return {\n ruleId: absolutePositionInAutoLayoutDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...absolutePositionMsg(node.name, context.parent.name),\n };\n};\n\nexport const absolutePositionInAutoLayout = defineRule({\n definition: absolutePositionInAutoLayoutDef,\n check: absolutePositionInAutoLayoutCheck,\n});\n\n// ============================================\n// fixed-size-in-auto-layout (merged: absorbs fixed-width-in-responsive-context)\n// ============================================\n\nconst fixedSizeInAutoLayoutDef: RuleDefinition = {\n id: \"fixed-size-in-auto-layout\",\n name: \"Fixed Size in Auto Layout\",\n category: \"responsive-critical\",\n why: \"Fixed sizing inside Auto Layout contradicts the flexible layout intent\",\n impact: \"AI generates a rigid element inside a flex container — the layout won't respond to content changes\",\n fix: \"Use 'Hug' or 'Fill' for at least one axis. Both-axes FIXED → layout completely rigid; horizontal-only FIXED → width won't adapt to parent resize\",\n};\n\nconst fixedSizeInAutoLayoutCheck: RuleCheckFn = (node, context) => {\n if (!context.parent) return null;\n if (!hasAutoLayout(context.parent)) return null;\n if (!isContainerNode(node)) return null;\n if (!node.absoluteBoundingBox) return null;\n\n if (isFixedSizeExempt(node)) return null;\n\n const { width, height } = node.absoluteBoundingBox;\n\n // Check both axes FIXED (stronger case)\n const hFixed =\n node.layoutSizingHorizontal === \"FIXED\" || node.layoutSizingHorizontal === undefined;\n const vFixed =\n node.layoutSizingVertical === \"FIXED\" || node.layoutSizingVertical === undefined;\n\n if (hFixed && vFixed) {\n // Skip if it has its own auto-layout\n if (node.layoutMode && node.layoutMode !== \"NONE\") return null;\n\n return {\n ruleId: fixedSizeInAutoLayoutDef.id,\n subType: \"both-axes\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...fixedSizeMsg.bothAxes(node.name, width, height),\n };\n }\n\n // Check horizontal-only FIXED (lighter case, from fixed-width-in-responsive-context)\n if (hFixed && !vFixed) {\n // Use layoutSizingHorizontal if available (accurate)\n if (node.layoutSizingHorizontal) {\n if (node.layoutSizingHorizontal !== \"FIXED\") return null;\n } else {\n // Fallback: STRETCH means fill, skip\n if (node.layoutAlign === \"STRETCH\") return null;\n if (node.layoutAlign !== \"INHERIT\") return null;\n }\n\n return {\n ruleId: fixedSizeInAutoLayoutDef.id,\n subType: \"horizontal\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...fixedSizeMsg.horizontal(node.name, width),\n };\n }\n\n return null;\n};\n\nexport const fixedSizeInAutoLayout = defineRule({\n definition: fixedSizeInAutoLayoutDef,\n check: fixedSizeInAutoLayoutCheck,\n});\n\n// ============================================\n// missing-size-constraint (#403 redesign — scope-aware, info-collection)\n// ============================================\n//\n// Pre-#403 this rule fired on every FILL container with no max-width\n// regardless of whether an ancestor already established a bound, and\n// scored -8/risk. The redesign narrows it to genuinely ambiguous sizing\n// situations and reframes the output as a gotcha rather than a\n// violation (per ADR-017 channel separation):\n//\n// page scope:\n// - container FRAME/SECTION with FILL width AND no chain-bound\n// ancestor (chain-bound = FIXED width OR FILL/HUG with explicit\n// min/max). Fires `page-container-unbound` — designer intent\n// (stretch with screen vs. cap at content) is structurally\n// undecidable.\n// - INSTANCE with FIXED width inside an Auto Layout parent. Fires\n// `page-instance-fixed` — could be intentional override or a stale\n// size carried over from the component definition.\n//\n// component scope:\n// - the analysis root (and only the root — internal nodes pass)\n// with FIXED width. Fires `component-fixed-by-design` for\n// COMPONENT/COMPONENT_SET roots, `component-fixed-by-override`\n// for INSTANCE roots — same shape, different gotcha framing.\n//\n// Deliberately scoped out (see PR body):\n// - INSTANCE FIXED outside Auto Layout — `no-auto-layout` already\n// owns the score channel on the non-auto-layout parent. Firing\n// here too would double-penalize one structural concern.\n// - Nodes inside an INSTANCE — Plugin API silently ignores min/max\n// overrides on instance internal nodes, so the gotcha would be\n// un-actionable.\n// - Height axis — width is the dominant responsive concern; height\n// redesign deferred to a follow-up issue.\n\nconst missingSizeConstraintDef: RuleDefinition = {\n id: \"missing-size-constraint\",\n name: \"Missing Size Constraint\",\n category: \"responsive-critical\",\n why: \"Width sizing without explicit bounds (FIXED root or FILL chained to a bounded ancestor) is structurally indistinguishable from missing information — AI cannot tell whether the designer intended responsive stretching, a fixed cap, or simply forgot to set min/max\",\n impact: \"Generated code either guesses hard-coded widths or omits responsive constraints; either way the runtime layout drifts from the design intent at viewports the designer never explicitly considered\",\n fix: \"Answer the gotcha to declare intent (responsive vs. fixed-by-design vs. instance override), then encode the answer in Figma sizing — FILL/HUG with min/max for responsive bounds, FIXED only when intentionally non-responsive\",\n};\n\n// ── Chain-bound walker (memoized via analysisState) ──────────────────────\n//\n// \"Chain-bound\" = some ancestor in the analysis tree (root included)\n// resolves the width chain by either fixing the width or capping a\n// FILL with min/max. Computed lazily as the rule visits each node:\n// because traverseAndCheck runs the check fn parent-first, by the time\n// a child asks `parentChainBound(child)` the parent's entry is already\n// in the cache. The side-effect MUST run for every visited node — see\n// `recordChainBound` call placement below.\n\ntype ChainBoundCache = Map<string, boolean>;\nconst CHAIN_BOUND_KEY = \"missing-size-constraint:chain-bound\";\n\nfunction getChainBoundCache(context: RuleContext): ChainBoundCache {\n return getAnalysisState(context, CHAIN_BOUND_KEY, () => new Map<string, boolean>());\n}\n\nfunction establishesOwnWidthBound(node: AnalysisNode): boolean {\n if (node.layoutSizingHorizontal === \"FIXED\") return true;\n if (node.minWidth !== undefined || node.maxWidth !== undefined) return true;\n return false;\n}\n\nfunction recordChainBound(context: RuleContext, node: AnalysisNode): boolean {\n const cache = getChainBoundCache(context);\n const cached = cache.get(node.id);\n if (cached !== undefined) return cached;\n const own = establishesOwnWidthBound(node);\n const parent = context.parent;\n const inherited = parent ? cache.get(parent.id) ?? false : false;\n const result = own || inherited;\n cache.set(node.id, result);\n return result;\n}\n\nfunction parentChainBound(context: RuleContext): boolean {\n if (!context.parent) return false;\n return getChainBoundCache(context).get(context.parent.id) ?? false;\n}\n\n// ── Subtype dispatchers ──────────────────────────────────────────────────\n\nconst PAGE_CONTAINER_FRAME_TYPES = new Set([\"FRAME\", \"SECTION\"]);\n\nfunction formatWidth(node: AnalysisNode): string {\n return node.absoluteBoundingBox ? `${node.absoluteBoundingBox.width}px` : \"unknown\";\n}\n\nfunction buildViolation(\n subType: \"page-container-unbound\" | \"page-instance-fixed\" | \"component-fixed-by-design\" | \"component-fixed-by-override\",\n node: AnalysisNode,\n context: RuleContext,\n msg: { message: string; suggestion: string; guide?: string }\n): RuleViolation {\n return {\n ruleId: missingSizeConstraintDef.id,\n subType,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...msg,\n };\n}\n\nfunction checkComponentScopeRoot(\n node: AnalysisNode,\n context: RuleContext\n): RuleViolation | null {\n // Only the analysis root in component scope — internal nodes pass.\n // Variants of a COMPONENT_SET sit at depth=1 and are intentionally\n // skipped; variant-level sizing is the variant-structure-mismatch\n // rule's concern, not this one.\n if (context.depth !== 0) return null;\n if (node.layoutSizingHorizontal !== \"FIXED\") return null;\n\n const currentWidth = formatWidth(node);\n if (context.rootNodeType === \"INSTANCE\") {\n return buildViolation(\n \"component-fixed-by-override\",\n node,\n context,\n missingSizeConstraintMsg.componentFixedByOverride(node.name, currentWidth),\n );\n }\n // COMPONENT, COMPONENT_SET, or scope-overridden FRAME treated as a\n // component definition. The gotcha framing is identical — \"is this\n // intentionally non-responsive?\" — so they share the subtype.\n return buildViolation(\n \"component-fixed-by-design\",\n node,\n context,\n missingSizeConstraintMsg.componentFixedByDesign(node.name, currentWidth),\n );\n}\n\nfunction checkPageInstanceFixed(\n node: AnalysisNode,\n context: RuleContext\n): RuleViolation | null {\n if (node.type !== \"INSTANCE\") return null;\n if (node.layoutSizingHorizontal !== \"FIXED\") return null;\n\n // Scope-out (#403): when the parent is not Auto Layout,\n // `no-auto-layout` already fires on that parent and owns the score\n // channel for the structural problem. Adding a sizing gotcha on top\n // double-counts one underlying issue. The leak case\n // (INSTANCE direct child of a SECTION page-root, where\n // no-auto-layout's behavior on SECTION is ambiguous) will surface in\n // Phase 4's fire-rate gate; revisit then if it actually appears.\n if (!context.parent || !hasAutoLayout(context.parent)) return null;\n\n const currentWidth = formatWidth(node);\n return buildViolation(\n \"page-instance-fixed\",\n node,\n context,\n missingSizeConstraintMsg.pageInstanceFixed(node.name, currentWidth),\n );\n}\n\nfunction checkPageContainerUnbound(\n node: AnalysisNode,\n context: RuleContext\n): RuleViolation | null {\n if (!PAGE_CONTAINER_FRAME_TYPES.has(node.type)) return null;\n if (node.layoutSizingHorizontal !== \"FILL\") return null;\n // Some ancestor already establishes the width bound for this chain —\n // the FILL here will resolve to a finite range, no ambiguity.\n if (parentChainBound(context)) return null;\n\n const currentWidth = formatWidth(node);\n return buildViolation(\n \"page-container-unbound\",\n node,\n context,\n missingSizeConstraintMsg.pageContainerUnbound(node.name, currentWidth),\n );\n}\n\nconst missingSizeConstraintCheck: RuleCheckFn = (node, context) => {\n // Side-effect: record this node's chain-bound status for descendants.\n // MUST run for every visited node BEFORE any early return, otherwise\n // `parentChainBound` lookups on children will miss and silently\n // default to `false`. Co-locating the recorder with the only consumer\n // (this rule) keeps the cache contract local.\n recordChainBound(context, node);\n\n // Actionability filter (#403, D6): the Figma Plugin API silently\n // ignores min/max writes targeting nodes inside an INSTANCE, so any\n // gotcha generated here would be un-actionable. We exclude INSTANCE\n // descendants (but keep the INSTANCE node itself in scope — that's\n // the page-instance-fixed case, where the override IS actionable).\n if (context.ancestorTypes.includes(\"INSTANCE\")) return null;\n\n if (context.scope === \"component\") {\n return checkComponentScopeRoot(node, context);\n }\n\n // page scope — at most one of these fires per node by construction\n // (different node-type predicates), so order does not matter.\n return checkPageInstanceFixed(node, context) ?? checkPageContainerUnbound(node, context);\n};\n\nexport const missingSizeConstraint = defineRule({\n definition: missingSizeConstraintDef,\n check: missingSizeConstraintCheck,\n});\n\n// ============================================\n// non-layout-container (was group-usage — now also catches Section)\n// ============================================\n\nconst nonLayoutContainerDef: RuleDefinition = {\n id: \"non-layout-container\",\n name: \"Non-Layout Container\",\n category: \"pixel-critical\",\n why: \"Groups and Sections lack proper layout rules — AI sees children with absolute coordinates but no container logic\",\n impact: \"AI wraps elements in a plain div with no spacing/alignment, producing fragile layouts\",\n fix: \"Convert to Frame with Auto Layout so AI can generate proper flex/grid containers\",\n};\n\nconst nonLayoutContainerCheck: RuleCheckFn = (node, context) => {\n if (node.type === \"GROUP\") {\n return {\n ruleId: nonLayoutContainerDef.id,\n subType: \"group\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...nonLayoutContainerMsg.group(node.name),\n };\n }\n\n if (node.type === \"SECTION\") {\n return {\n ruleId: nonLayoutContainerDef.id,\n subType: \"section\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...nonLayoutContainerMsg.section(node.name),\n };\n }\n\n return null;\n};\n\nexport const nonLayoutContainer = defineRule({\n definition: nonLayoutContainerDef,\n check: nonLayoutContainerCheck,\n});\n\n// ============================================\n// deep-nesting\n// ============================================\n\nconst deepNestingDef: RuleDefinition = {\n id: \"deep-nesting\",\n name: \"Deep Nesting\",\n category: \"code-quality\",\n why: \"Deep nesting consumes AI context exponentially — each level adds indentation and structural overhead\",\n impact: \"AI may lose track of parent-child relationships in deeply nested trees, producing wrong layout hierarchy\",\n fix: \"Flatten the structure by extracting deeply nested groups into sub-components\",\n};\n\nconst deepNestingCheck: RuleCheckFn = (node, context, options) => {\n const maxDepth = (options?.[\"maxDepth\"] as number) ?? getRuleOption(\"deep-nesting\", \"maxDepth\", 5);\n\n if (context.componentDepth < maxDepth) return null;\n if (!isContainerNode(node)) return null;\n\n return {\n ruleId: deepNestingDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...deepNestingMsg(node.name, context.componentDepth, maxDepth),\n };\n};\n\nexport const deepNesting = defineRule({\n definition: deepNestingDef,\n check: deepNestingCheck,\n});\n\n","import type { RuleCheckFn, RuleDefinition } from \"../../contracts/rule.js\";\nimport { defineRule } from \"../rule-registry.js\";\nimport { getRuleOption } from \"../rule-config.js\";\nimport { rawValueMsg, irregularSpacingMsg } from \"../rule-messages.js\";\nimport { hasStyleReference, hasBoundVariable } from \"../node-semantics.js\";\n\nfunction isOnGrid(value: number, gridBase: number): boolean {\n return value % gridBase === 0;\n}\n\n// ============================================\n// raw-value (merged: raw-color + raw-font + raw-shadow + raw-opacity + raw-spacing)\n// ============================================\n\nconst rawValueDef: RuleDefinition = {\n id: \"raw-value\",\n name: \"Raw Value\",\n category: \"token-management\",\n why: \"Values without design tokens or variables must be reproduced exactly per node — one typo means a visible difference\",\n impact: \"AI cannot reference a shared token, so each raw value is an independent source of error across large pages\",\n fix: \"Use design tokens or variables (color styles, text styles, effect styles, opacity/spacing variables) so values are referenceable\",\n};\n\nconst rawValueCheck: RuleCheckFn = (node, context) => {\n const nodePath = context.path.join(\" > \");\n\n // Check 1: Raw fill color\n if (node.fills && Array.isArray(node.fills) && node.fills.length > 0) {\n if (!hasStyleReference(node, \"fill\") && !hasBoundVariable(node, \"fills\")) {\n for (const fill of node.fills) {\n const fillObj = fill as Record<string, unknown>;\n if (fillObj[\"type\"] === \"SOLID\" && fillObj[\"color\"]) {\n const c = fillObj[\"color\"] as Record<string, number>;\n const hex = `#${Math.round((c[\"r\"] ?? 0) * 255).toString(16).padStart(2, \"0\")}${Math.round((c[\"g\"] ?? 0) * 255).toString(16).padStart(2, \"0\")}${Math.round((c[\"b\"] ?? 0) * 255).toString(16).padStart(2, \"0\")}`.toUpperCase();\n return {\n ruleId: rawValueDef.id,\n subType: \"color\" as const,\n nodeId: node.id,\n nodePath,\n ...rawValueMsg.color(node.name, hex),\n };\n }\n }\n }\n }\n\n // Check 2: Raw font (TEXT nodes without text style)\n if (node.type === \"TEXT\") {\n if (\n !hasStyleReference(node, \"text\") &&\n (!hasBoundVariable(node, \"fontFamily\") || !hasBoundVariable(node, \"fontSize\"))\n ) {\n const fontParts: string[] = [];\n const s = node.style;\n if (s) {\n if (s[\"fontFamily\"]) fontParts.push(String(s[\"fontFamily\"]));\n if (s[\"fontSize\"]) fontParts.push(`${s[\"fontSize\"]}px`);\n if (s[\"fontWeight\"]) fontParts.push(String(s[\"fontWeight\"]));\n }\n const fontDesc = fontParts.length > 0 ? ` (${fontParts.join(\" \")})` : \"\";\n return {\n ruleId: rawValueDef.id,\n subType: \"font\" as const,\n nodeId: node.id,\n nodePath,\n ...rawValueMsg.font(node.name, fontDesc),\n };\n }\n }\n\n // Check 3: Raw shadow (effects without effect style)\n if (node.effects && Array.isArray(node.effects) && node.effects.length > 0) {\n if (!hasStyleReference(node, \"effect\")) {\n for (const effect of node.effects) {\n const effectObj = effect as Record<string, unknown>;\n if (effectObj[\"type\"] === \"DROP_SHADOW\" || effectObj[\"type\"] === \"INNER_SHADOW\") {\n const shadowType = effectObj[\"type\"] === \"DROP_SHADOW\" ? \"drop shadow\" : \"inner shadow\";\n const offset = effectObj[\"offset\"] as Record<string, number> | undefined;\n const radius = effectObj[\"radius\"] as number | undefined;\n const detailParts: string[] = [];\n if (offset) detailParts.push(`offset ${Math.round(offset[\"x\"] ?? 0)},${Math.round(offset[\"y\"] ?? 0)}`);\n if (radius !== undefined) detailParts.push(`blur ${Math.round(radius)}`);\n const details = detailParts.length > 0 ? ` (${detailParts.join(\" \")})` : \"\";\n return {\n ruleId: rawValueDef.id,\n subType: \"shadow\" as const,\n nodeId: node.id,\n nodePath,\n ...rawValueMsg.shadow(node.name, shadowType, details),\n };\n }\n }\n }\n }\n\n // Check 4: Raw opacity (non-default opacity without variable)\n if (node.opacity !== undefined && node.opacity < 1 && !hasBoundVariable(node, \"opacity\")) {\n return {\n ruleId: rawValueDef.id,\n subType: \"opacity\" as const,\n nodeId: node.id,\n nodePath,\n ...rawValueMsg.opacity(node.name, Math.round(node.opacity * 100)),\n };\n }\n\n // Check 5: Raw spacing (padding/gap without variable binding)\n const spacingKeys = [\"paddingLeft\", \"paddingRight\", \"paddingTop\", \"paddingBottom\", \"itemSpacing\"] as const;\n for (const key of spacingKeys) {\n const value = node[key];\n if (value !== undefined && value > 0 && !hasBoundVariable(node, key)) {\n const label = key === \"itemSpacing\" ? \"gap\" : key.replace(\"padding\", \"padding-\").toLowerCase();\n return {\n ruleId: rawValueDef.id,\n subType: \"spacing\" as const,\n nodeId: node.id,\n nodePath,\n ...rawValueMsg.spacing(node.name, label, value),\n };\n }\n }\n\n return null;\n};\n\nexport const rawValue = defineRule({\n definition: rawValueDef,\n check: rawValueCheck,\n});\n\n// ============================================\n// irregular-spacing (merged: inconsistent-spacing + magic-number-spacing)\n// ============================================\n\nconst irregularSpacingDef: RuleDefinition = {\n id: \"irregular-spacing\",\n name: \"Irregular Spacing\",\n category: \"token-management\",\n why: \"Off-grid or arbitrary spacing values force AI to handle many unique values instead of a predictable pattern\",\n impact: \"Higher chance of pixel-level differences when AI substitutes nearby round values\",\n fix: \"Align spacing to the design system grid (e.g., 4pt/8pt increments) for predictable implementation\",\n};\n\nconst irregularSpacingCheck: RuleCheckFn = (node, context, options) => {\n const configuredGridBase = (options?.[\"gridBase\"] as number) ?? getRuleOption(\"irregular-spacing\", \"gridBase\", 4);\n const gridBase = Number.isFinite(configuredGridBase) && configuredGridBase > 0 ? configuredGridBase : 4;\n\n const spacingEntries: Array<{ value: number; subType: \"padding\" | \"gap\" }> = [];\n for (const key of [\"paddingLeft\", \"paddingRight\", \"paddingTop\", \"paddingBottom\"] as const) {\n const v = node[key];\n if (v !== undefined && v > 0) spacingEntries.push({ value: v, subType: \"padding\" });\n }\n if (node.itemSpacing !== undefined && node.itemSpacing > 0) {\n spacingEntries.push({ value: node.itemSpacing, subType: \"gap\" });\n }\n\n // Allow small intentional values\n const commonValues = [1, 2];\n\n for (const entry of spacingEntries) {\n if (commonValues.includes(entry.value)) continue;\n if (!isOnGrid(entry.value, gridBase)) {\n return {\n ruleId: irregularSpacingDef.id,\n subType: entry.subType,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...irregularSpacingMsg(node.name, entry.value, gridBase, Math.round(entry.value / gridBase) * gridBase),\n };\n }\n }\n\n return null;\n};\n\nexport const irregularSpacing = defineRule({\n definition: irregularSpacingDef,\n check: irregularSpacingCheck,\n});\n","import type { RuleCheckFn, RuleDefinition, RuleContext } from \"../../contracts/rule.js\";\nimport { getAnalysisState } from \"../../contracts/rule.js\";\nimport type { AnalysisNode } from \"../../contracts/figma-node.js\";\nimport { defineRule } from \"../rule-registry.js\";\nimport { getRuleOption } from \"../rule-config.js\";\nimport { missingComponentMsg, detachedInstanceMsg, variantStructureMismatchMsg } from \"../rule-messages.js\";\n\n// ============================================\n// Helper functions\n// ============================================\n\n\n/** Style properties to compare between master and instance. */\nconst STYLE_COMPARE_KEYS = [\"fills\", \"strokes\", \"effects\", \"cornerRadius\", \"strokeWeight\", \"individualStrokeWeights\"] as const;\n\n/**\n * Detect style overrides between a component master and an instance.\n * Returns list of property names that differ.\n */\nfunction detectStyleOverrides(master: AnalysisNode, instance: AnalysisNode): string[] {\n const overrides: string[] = [];\n for (const key of STYLE_COMPARE_KEYS) {\n const masterVal = master[key];\n const instanceVal = instance[key];\n // Both undefined/null → no override\n if (masterVal == null && instanceVal == null) continue;\n // One exists, other doesn't → override\n if (masterVal == null || instanceVal == null) {\n overrides.push(key);\n continue;\n }\n // Deep compare via JSON\n if (JSON.stringify(masterVal) !== JSON.stringify(instanceVal)) {\n overrides.push(key);\n }\n }\n return overrides;\n}\n\n/**\n * Collect all frame names in the file for duplicate detection\n */\nfunction collectFrameNames(\n node: AnalysisNode,\n names: Map<string, string[]> = new Map()\n): Map<string, string[]> {\n if (node.type === \"FRAME\" && node.name) {\n const existing = names.get(node.name) ?? [];\n existing.push(node.id);\n names.set(node.name, existing);\n }\n\n if (node.children) {\n for (const child of node.children) {\n collectFrameNames(child, names);\n }\n }\n\n return names;\n}\n\n/**\n * Build a structural fingerprint for a node.\n * The fingerprint encodes type, layoutMode, and child types recursively up to maxDepth.\n */\nfunction buildFingerprint(node: AnalysisNode, depth: number): string {\n if (depth <= 0 || !node.children || node.children.length === 0) {\n return `${node.type}:${node.layoutMode ?? \"NONE\"}`;\n }\n\n const childFingerprints = node.children\n .map((child) => buildFingerprint(child, depth - 1))\n .join(\",\");\n\n return `${node.type}:${node.layoutMode ?? \"NONE\"}:[${childFingerprints}]`;\n}\n\n/**\n * Check if the node is inside an INSTANCE subtree.\n * Walks the full ancestor type chain to detect INSTANCE at any level.\n */\nfunction isInsideInstance(context: {\n ancestorTypes: string[];\n}): boolean {\n return context.ancestorTypes.includes(\"INSTANCE\");\n}\n\n\n\n// ============================================\n// missing-component (unified 4-stage rule)\n// ============================================\n\n/** State keys for per-analysis deduplication via RuleContext.analysisState */\nconst SEEN_STAGE1_KEY = \"missing-component:seenStage1ComponentNames\";\nconst SEEN_STAGE4_KEY = \"missing-component:seenStage4ComponentIds\";\n\nfunction getSeenStage1(context: RuleContext): Set<string> {\n return getAnalysisState(context, SEEN_STAGE1_KEY, () => new Set<string>());\n}\n\nfunction getSeenStage4(context: RuleContext): Set<string> {\n return getAnalysisState(context, SEEN_STAGE4_KEY, () => new Set<string>());\n}\n\nconst missingComponentDef: RuleDefinition = {\n id: \"missing-component\",\n name: \"Missing Component\",\n category: \"code-quality\",\n why: \"Repeated structures, unused components, and divergent instance overrides indicate missing or underutilized components. This inflates AI token consumption and forces manual maintenance.\",\n impact: \"AI code generators reproduce each repeated frame independently instead of emitting a reusable component. Divergent instance overrides produce inconsistent implementations.\",\n fix: \"Create components from repeated structures, use instances instead of duplicated frames, and create variants for instances with significantly different overrides.\",\n};\n\nconst missingComponentCheck: RuleCheckFn = (node, context, options) => {\n // ========================================\n // FRAME stages (1, 2, 3) — ordered by priority\n // ========================================\n if (node.type === \"FRAME\") {\n // Stage 1: Component exists but not used — FRAME name matches a component in metadata AND frame is repeated\n const components = context.file.components;\n const matchingComponent = Object.values(components).find(\n (c) => c.name.toLowerCase() === node.name.toLowerCase()\n );\n\n // Collect frame names once for Stage 1 and Stage 2\n const frameNames = collectFrameNames(context.file.document);\n const sameNameFrames = frameNames.get(node.name);\n const firstFrame = sameNameFrames?.[0];\n\n if (matchingComponent) {\n const seenStage1 = getSeenStage1(context);\n if (\n sameNameFrames &&\n firstFrame !== undefined &&\n sameNameFrames.length >= 2 &&\n !seenStage1.has(node.name.toLowerCase()) &&\n firstFrame === node.id\n ) {\n seenStage1.add(node.name.toLowerCase());\n return {\n ruleId: missingComponentDef.id,\n subType: \"unused-component\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...missingComponentMsg.unusedComponent(matchingComponent.name, sameNameFrames.length),\n };\n }\n }\n\n // Stage 2: Name-based repetition (existing logic)\n const minRepetitions =\n (options?.[\"minRepetitions\"] as number | undefined) ??\n getRuleOption(\"missing-component\", \"minRepetitions\", 3);\n\n if (sameNameFrames && firstFrame !== undefined && sameNameFrames.length >= minRepetitions) {\n if (firstFrame === node.id) {\n return {\n ruleId: missingComponentDef.id,\n subType: \"name-repetition\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...missingComponentMsg.nameRepetition(node.name, sameNameFrames.length),\n };\n }\n }\n\n // Stage 3: Structure-based repetition (absorbed from repeated-frame-structure)\n // Skip if node is inside an INSTANCE subtree\n if (isInsideInstance(context)) return null;\n\n // Skip if parent is COMPONENT_SET\n if (context.parent?.type === \"COMPONENT_SET\") return null;\n\n // Skip if node has no children\n if (!node.children || node.children.length === 0) return null;\n\n const structureMinRepetitions =\n (options?.[\"structureMinRepetitions\"] as number | undefined) ??\n getRuleOption(\"missing-component\", \"structureMinRepetitions\", 2);\n\n const maxFingerprintDepth =\n (options?.[\"maxFingerprintDepth\"] as number | undefined) ??\n getRuleOption(\"missing-component\", \"maxFingerprintDepth\", 3);\n\n // Compute fingerprint for this node\n const fingerprint = buildFingerprint(node, maxFingerprintDepth);\n\n // Access siblings (may be undefined)\n const siblings = context.siblings ?? [];\n\n // Filter siblings to qualifying frames (type === FRAME, not inside INSTANCE, has children)\n const qualifyingSiblings = siblings.filter(\n (s) =>\n s.type === \"FRAME\" &&\n s.children !== undefined &&\n s.children.length > 0\n );\n\n // Count siblings (including self) sharing the same fingerprint\n const matchingNodes = qualifyingSiblings.filter(\n (s) => buildFingerprint(s, maxFingerprintDepth) === fingerprint\n );\n\n // Ensure self is counted (it should be in siblings, but add a guard)\n const selfIsInSiblings = qualifyingSiblings.some((s) => s.id === node.id);\n const count = selfIsInSiblings\n ? matchingNodes.length\n : matchingNodes.length + 1;\n\n if (count >= structureMinRepetitions) {\n // Only emit for the first sibling (by array order) with this fingerprint\n const firstMatch = qualifyingSiblings.find(\n (s) => buildFingerprint(s, maxFingerprintDepth) === fingerprint\n );\n\n // If self is not in siblings list, treat self as first match when no earlier match exists\n const firstMatchId = firstMatch?.id ?? node.id;\n if (firstMatchId === node.id) {\n return {\n ruleId: missingComponentDef.id,\n subType: \"structure-repetition\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...missingComponentMsg.structureRepetition(node.name, count - 1),\n };\n }\n }\n\n return null;\n }\n\n // ========================================\n // Stage 4: Instance style override detection\n // Compares instance styles against component master.\n // Any style override (fills, strokes, effects, cornerRadius) means\n // the designer should use a variant instead.\n // ========================================\n if (node.type === \"INSTANCE\" && node.componentId) {\n const seenStage4 = getSeenStage4(context);\n if (seenStage4.has(node.componentId)) return null;\n\n const componentDefs = context.file.componentDefinitions;\n if (!componentDefs) return null;\n\n const master = componentDefs[node.componentId];\n if (!master) return null;\n\n // Compare style properties between master and instance\n const overrides = detectStyleOverrides(master, node);\n if (overrides.length > 0) {\n // Only mark as seen when we actually flag — allows other instances to be checked\n seenStage4.add(node.componentId);\n const componentMeta = context.file.components[node.componentId];\n const componentName = componentMeta?.name ?? node.name;\n\n return {\n ruleId: missingComponentDef.id,\n subType: \"style-override\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...missingComponentMsg.styleOverride(componentName, overrides),\n };\n }\n return null;\n }\n\n return null;\n};\n\nexport const missingComponent = defineRule({\n definition: missingComponentDef,\n check: missingComponentCheck,\n});\n\n// ============================================\n// detached-instance\n// ============================================\n\nconst detachedInstanceDef: RuleDefinition = {\n id: \"detached-instance\",\n name: \"Detached Instance\",\n category: \"code-quality\",\n why: \"Detached instances lose component relationship — AI sees a one-off frame instead of a reusable component reference\",\n impact: \"AI generates duplicate code instead of reusing the component, inflating output and causing inconsistencies\",\n fix: \"Reset the instance or create a new variant if customization is needed\",\n};\n\nconst detachedInstanceCheck: RuleCheckFn = (node, context) => {\n // A detached instance would be a FRAME that was once an INSTANCE\n // This is hard to detect without historical data\n // Heuristic: Frame with a name that looks like it came from a component\n if (node.type !== \"FRAME\") return null;\n\n // Check if there's a component in the file with a matching name (word boundary)\n const components = context.file.components;\n\n for (const [, component] of Object.entries(components)) {\n const pattern = new RegExp(`\\\\b${component.name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}\\\\b`);\n if (pattern.test(node.name)) {\n // This frame might be a detached instance of this component\n return {\n ruleId: detachedInstanceDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...detachedInstanceMsg(node.name, component.name),\n };\n }\n }\n\n return null;\n};\n\nexport const detachedInstance = defineRule({\n definition: detachedInstanceDef,\n check: detachedInstanceCheck,\n});\n\n// ============================================\n// variant-structure-mismatch\n// ============================================\n\nconst variantStructureMismatchDef: RuleDefinition = {\n id: \"variant-structure-mismatch\",\n name: \"Variant Structure Mismatch\",\n category: \"code-quality\",\n why: \"Variants with different child structures prevent AI from creating a unified component template\",\n impact: \"AI must generate separate implementations for each variant instead of a single parameterized component\",\n fix: \"Ensure all variants share the same child structure, using visibility toggles for optional elements\",\n};\n\nconst variantStructureMismatchCheck: RuleCheckFn = (node, context) => {\n // Only COMPONENT_SET\n if (node.type !== \"COMPONENT_SET\") return null;\n if (!node.children?.length || node.children.length < 2) return null;\n\n // Build fingerprint for each variant child\n const fingerprints = node.children\n .filter(child => child.type === \"COMPONENT\")\n .map(child => buildFingerprint(child, 2));\n\n if (fingerprints.length < 2) return null;\n\n // Compare all fingerprints to the first one\n const base = fingerprints[0];\n const mismatched = fingerprints.filter(fp => fp !== base);\n\n if (mismatched.length === 0) return null;\n\n const mismatchCount = mismatched.length;\n const totalVariants = fingerprints.length;\n\n return {\n ruleId: variantStructureMismatchDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...variantStructureMismatchMsg(node.name, mismatchCount, totalVariants),\n };\n};\n\nexport const variantStructureMismatch = defineRule({\n definition: variantStructureMismatchDef,\n check: variantStructureMismatchCheck,\n});\n\n","import type { RuleCheckFn, RuleDefinition } from \"../../contracts/rule.js\";\nimport { defineRule } from \"../rule-registry.js\";\nimport { getDefaultNameSubType, nonSemanticNameMsg, inconsistentNamingMsg, nonStandardNamingMsg } from \"../rule-messages.js\";\nimport { isExcludedName, isDefaultName, isNonSemanticName, STANDARD_STATE_NAMES, STATE_NAME_SUGGESTIONS, STATE_LIKE_PATTERN } from \"../node-semantics.js\";\n\nfunction capitalize(s: string): string {\n if (!s) return s;\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nfunction detectNamingConvention(name: string): string | null {\n if (/^[a-z]+(-[a-z]+)*$/.test(name)) return \"kebab-case\";\n if (/^[a-z]+(_[a-z]+)*$/.test(name)) return \"snake_case\";\n if (/^[a-z]+([A-Z][a-z]*)*$/.test(name)) return \"camelCase\";\n if (/^[A-Z][a-z]+([A-Z][a-z]*)*$/.test(name)) return \"PascalCase\";\n if (/^[A-Z]+(_[A-Z]+)*$/.test(name)) return \"SCREAMING_SNAKE_CASE\";\n if (/\\s/.test(name)) return \"Title Case\";\n return null;\n}\n\n/** Single capitalized word is compatible with both PascalCase and Title Case */\nfunction isCompatible(nodeConvention: string, dominantConvention: string, name: string): boolean {\n if (!/^[A-Z][a-z]+$/.test(name)) return false;\n const pair = new Set([nodeConvention, dominantConvention]);\n return pair.has(\"PascalCase\") && pair.has(\"Title Case\");\n}\n\n/** Split a name into words regardless of convention */\nfunction splitWords(name: string): string[] {\n // Title Case / space-separated\n if (/\\s/.test(name)) return name.split(/\\s+/);\n // SCREAMING_SNAKE_CASE or snake_case\n if (name.includes(\"_\")) return name.split(\"_\");\n // kebab-case\n if (name.includes(\"-\")) return name.split(\"-\");\n // camelCase / PascalCase — split on uppercase boundaries (including acronym runs)\n return name\n .replace(/([a-z0-9])([A-Z])/g, \"$1\\0$2\")\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1\\0$2\")\n .split(\"\\0\");\n}\n\n/** Convert a name to the target convention */\nfunction convertName(name: string, target: string): string {\n const words = splitWords(name);\n switch (target) {\n case \"kebab-case\":\n return words.map(w => w.toLowerCase()).join(\"-\");\n case \"snake_case\":\n return words.map(w => w.toLowerCase()).join(\"_\");\n case \"camelCase\":\n return words.map((w, i) => i === 0 ? w.toLowerCase() : w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join(\"\");\n case \"PascalCase\":\n return words.map(w => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join(\"\");\n case \"SCREAMING_SNAKE_CASE\":\n return words.map(w => w.toUpperCase()).join(\"_\");\n case \"Title Case\":\n return words.map(w => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join(\" \");\n default:\n return name;\n }\n}\n\n// ============================================\n// non-semantic-name (merged: default-name + non-semantic-name)\n// ============================================\n\nconst nonSemanticNameDef: RuleDefinition = {\n id: \"non-semantic-name\",\n name: \"Non-Semantic Name\",\n category: \"semantic\",\n why: \"Default or shape names give AI no semantic context — it cannot choose appropriate HTML tags or class names\",\n impact: \"AI generates generic <div> wrappers instead of semantic elements like <header>, <nav>, <article>\",\n fix: \"Rename with a descriptive, purpose-driven name (e.g., 'Header', 'ProductCard', 'Divider')\",\n};\n\nconst nonSemanticNameCheck: RuleCheckFn = (node, context) => {\n if (!node.name) return null;\n if (isExcludedName(node.name)) return null;\n\n // Check 1: Figma default names (Frame 1, Group 2, etc.)\n if (isDefaultName(node.name)) {\n return {\n ruleId: nonSemanticNameDef.id,\n subType: getDefaultNameSubType(node.type),\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...nonSemanticNameMsg(node.type, node.name),\n };\n }\n\n // Check 2: Shape-only names (rectangle, ellipse, vector, etc.)\n if (isNonSemanticName(node.name)) {\n // Allow shape names for actual shape primitives at leaf level\n if (!node.children || node.children.length === 0) {\n const shapeTypes = [\"RECTANGLE\", \"ELLIPSE\", \"VECTOR\", \"LINE\", \"STAR\", \"REGULAR_POLYGON\"];\n if (shapeTypes.includes(node.type)) return null;\n }\n\n return {\n ruleId: nonSemanticNameDef.id,\n subType: \"shape-name\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...nonSemanticNameMsg(node.type, node.name),\n };\n }\n\n return null;\n};\n\nexport const nonSemanticName = defineRule({\n definition: nonSemanticNameDef,\n check: nonSemanticNameCheck,\n});\n\n// ============================================\n// inconsistent-naming-convention\n// ============================================\n\nconst inconsistentNamingConventionDef: RuleDefinition = {\n id: \"inconsistent-naming-convention\",\n name: \"Inconsistent Naming Convention\",\n category: \"semantic\",\n why: \"Mixed naming conventions (camelCase + kebab-case + Title Case) at the same level confuse AI pattern recognition\",\n impact: \"AI generates inconsistent class/component names, making the codebase harder to maintain\",\n fix: \"Pick one convention for sibling elements (e.g., kebab-case: 'product-card', or PascalCase: 'ProductCard') — AI maps names to CSS classes and component names, so mixed conventions produce inconsistent code\",\n};\n\nconst inconsistentNamingConventionCheck: RuleCheckFn = (node, context) => {\n if (!context.siblings || context.siblings.length < 2) return null;\n\n // Detect conventions used by siblings\n const conventions = new Map<string, number>();\n let ambiguousPascalCount = 0;\n\n for (const sibling of context.siblings) {\n if (!sibling.name) continue;\n const convention = detectNamingConvention(sibling.name);\n if (convention) {\n conventions.set(convention, (conventions.get(convention) ?? 0) + 1);\n if (convention === \"PascalCase\" && /^[A-Z][a-z]+$/.test(sibling.name)) {\n ambiguousPascalCount++;\n }\n }\n }\n\n // Single capitalized words (Header, Footer) are detected as PascalCase but are\n // equally valid as Title Case. When both conventions appear, discount these\n // ambiguous names so they don't bias the dominant convention toward PascalCase.\n if (conventions.has(\"PascalCase\") && conventions.has(\"Title Case\") && ambiguousPascalCount > 0) {\n const adjusted = (conventions.get(\"PascalCase\") ?? 0) - ambiguousPascalCount;\n if (adjusted <= 0) {\n conventions.delete(\"PascalCase\");\n } else {\n conventions.set(\"PascalCase\", adjusted);\n }\n }\n\n // Skip if we can't detect clear conventions\n if (conventions.size < 2) return null;\n\n // Find the dominant convention\n let dominantConvention = \"\";\n let maxCount = 0;\n for (const [convention, count] of conventions) {\n if (count > maxCount) {\n maxCount = count;\n dominantConvention = convention;\n }\n }\n\n // Check if current node violates the dominant convention\n const nodeConvention = detectNamingConvention(node.name);\n if (nodeConvention && nodeConvention !== dominantConvention && maxCount >= 2) {\n // Single capitalized word is compatible with both PascalCase and Title Case\n if (isCompatible(nodeConvention, dominantConvention, node.name)) return null;\n\n const suggested = convertName(node.name, dominantConvention);\n // #372: suppress when the case-conversion produces the same string as\n // the current name. Single-character names (\"X\"), all-numeric names, and\n // any input whose every word maps to itself across cases all fall into\n // this bucket — flagging them produces a no-op rename, an empty diff\n // visible as a misleading \"✅ resolved\" wrap-up entry.\n if (suggested === node.name) return null;\n return {\n ruleId: inconsistentNamingConventionDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n suggestedName: suggested,\n ...inconsistentNamingMsg(node.name, nodeConvention, dominantConvention, suggested),\n };\n }\n\n return null;\n};\n\nexport const inconsistentNamingConvention = defineRule({\n definition: inconsistentNamingConventionDef,\n check: inconsistentNamingConventionCheck,\n});\n\n// ============================================\n// non-standard-naming\n// ============================================\n\nconst nonStandardNamingDef: RuleDefinition = {\n id: \"non-standard-naming\",\n name: \"Non-Standard Naming\",\n category: \"semantic\",\n why: \"Non-standard state names prevent interaction rules from detecting state variants — AI cannot generate correct :hover/:active/:disabled styles\",\n impact: \"Interaction state detection fails, resulting in static UI with no state transitions\",\n fix: \"Use platform-standard state names: default, hover, active, pressed, selected, highlighted, disabled, enabled, focus, focused, dragged\",\n};\n\nconst nonStandardNamingCheck: RuleCheckFn = (node, context) => {\n // Only check COMPONENT_SET (variant container)\n if (node.type !== \"COMPONENT_SET\") return null;\n if (!node.componentPropertyDefinitions) return null;\n\n for (const prop of Object.values(node.componentPropertyDefinitions)) {\n const p = prop as Record<string, unknown>;\n if (p[\"type\"] !== \"VARIANT\") continue;\n const options = p[\"variantOptions\"];\n if (!Array.isArray(options)) continue;\n\n for (const opt of options) {\n if (typeof opt !== \"string\") continue;\n const lower = opt.toLowerCase().trim();\n\n // Skip if it's a standard name\n if (STANDARD_STATE_NAMES.has(lower)) continue;\n\n // Check if it matches a known non-standard state name\n if (STATE_LIKE_PATTERN.test(opt)) {\n const suggestion = STATE_NAME_SUGGESTIONS[lower];\n if (suggestion) {\n return {\n ruleId: nonStandardNamingDef.id,\n subType: \"state-name\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n suggestedName: capitalize(suggestion),\n ...nonStandardNamingMsg.stateName(node.name, opt, suggestion),\n };\n }\n }\n }\n }\n\n return null;\n};\n\nexport const nonStandardNaming = defineRule({\n definition: nonStandardNamingDef,\n check: nonStandardNamingCheck,\n});\n\n","import type { RuleCheckFn, RuleDefinition, RuleContext } from \"../../contracts/rule.js\";\nimport { getAnalysisState } from \"../../contracts/rule.js\";\nimport type { AnalysisNode } from \"../../contracts/figma-node.js\";\nimport { defineRule } from \"../rule-registry.js\";\nimport type { MissingInteractionStateSubType, MissingPrototypeSubType } from \"../rule-messages.js\";\nimport { missingInteractionStateMsg, missingPrototypeMsg } from \"../rule-messages.js\";\nimport { getStatefulComponentType, isOverlayNode, isCarouselNode, type StatefulComponentType } from \"../node-semantics.js\";\n\n/** Expected state variants by interactive type */\nconst EXPECTED_STATES: Record<StatefulComponentType, MissingInteractionStateSubType[]> = {\n button: [\"hover\", \"active\", \"disabled\"],\n link: [\"hover\"],\n tab: [\"hover\", \"active\"],\n input: [\"focus\", \"disabled\"],\n toggle: [\"disabled\"],\n};\n\n/** State name patterns — web + mobile platform standard names */\nconst STATE_PATTERNS: Record<MissingInteractionStateSubType, RegExp> = {\n hover: /\\bhover\\b/i,\n disabled: /\\bdisabled\\b/i,\n active: /\\b(active|pressed|selected|highlighted)\\b/i,\n focus: /\\bfocus(ed)?\\b/i,\n};\n\n// ============================================\n// Helpers\n// ============================================\n\n/** Dedup key: emit at most one violation per componentId + subType */\nconst SEEN_KEY = \"missing-interaction-state:seen\";\n\nfunction getSeen(context: RuleContext): Set<string> {\n return getAnalysisState(context, SEEN_KEY, () => new Set<string>());\n}\n\n/**\n * Check if a state variant exists via componentPropertyDefinitions.\n * Looks for VARIANT type properties where variantOptions contain the state name.\n */\nfunction hasStateInVariantProps(node: AnalysisNode, statePattern: RegExp): boolean {\n if (!node.componentPropertyDefinitions) return false;\n for (const prop of Object.values(node.componentPropertyDefinitions)) {\n const p = prop as Record<string, unknown>;\n if (p[\"type\"] !== \"VARIANT\") continue;\n const options = p[\"variantOptions\"];\n if (!Array.isArray(options)) continue;\n if (options.some((opt) => typeof opt === \"string\" && statePattern.test(opt))) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Check if a state variant exists via component master's componentPropertyDefinitions.\n * Falls back to componentDefinitions (fetched masters) when the instance itself\n * doesn't carry the property definitions.\n */\nfunction hasStateInComponentMaster(\n node: AnalysisNode,\n context: RuleContext,\n statePattern: RegExp,\n): boolean {\n if (!node.componentId) return false;\n const defs = context.file.componentDefinitions;\n if (!defs) return false;\n const master = defs[node.componentId];\n if (!master) return false;\n return hasStateInVariantProps(master, statePattern);\n}\n\n/**\n * Master names that look like a single variant of a SET (e.g. `State=Default`,\n * `Variant=Primary, State=Default, Size=Medium`). When a fetched COMPONENT\n * carries this naming AND has no own `componentPropertyDefinitions`, the\n * variant axes live on the parent COMPONENT_SET — which the loader does not\n * fetch today (#397). Treat as undeterminable rather than asserting a missing\n * variant we cannot actually see.\n */\nconst VARIANT_POSITION_NAME_RE = /^[\\w ]+=[^,]+(,\\s*[\\w ]+=[^,]+)*$/;\n\nfunction hasUsablePropDefs(propDefs: unknown): boolean {\n // `undefined` = not fetched; `null` = REST returned blank (e.g. variant\n // INSIDE a SET — axes live on the SET parent, not here). Both are\n // non-evidence. `{}` (fetched-and-empty) IS positive evidence the master\n // truly has no axes — must keep firing per the test for #354.\n return propDefs != null && typeof propDefs === \"object\";\n}\n\n/**\n * Decide whether we have enough source data to assert a state variant is missing.\n *\n * The Figma REST API does not consistently mirror `componentPropertyDefinitions`\n * onto deeply-nested INSTANCE children, and `context.file.componentDefinitions`\n * only contains masters the loader actually fetched (external-library masters\n * stay null even after extra passes). When BOTH paths are empty for an INSTANCE\n * we cannot tell whether the master defines the variant or not — treat that as\n * \"unknown\" (return false here) rather than asserting a missing variant.\n *\n * The fetched master may also be a single variant of a SET (name like\n * `State=Default`); the variant axes live on the SET parent which we do not\n * fetch. Detect this via name pattern and treat as undeterminable too (#397).\n *\n * COMPONENT nodes are special: a COMPONENT IS the master, so the absence of\n * `componentPropertyDefinitions` on a COMPONENT is itself meaningful evidence\n * (standalone master with no variant axis at all) — UNLESS the COMPONENT name\n * follows the variant-position pattern, in which case the SET parent holds the\n * axes and we cannot decide.\n */\nfunction canDetermineVariants(node: AnalysisNode, context: RuleContext): boolean {\n if (hasUsablePropDefs(node.componentPropertyDefinitions)) return true;\n if (node.type === \"COMPONENT\") {\n return !VARIANT_POSITION_NAME_RE.test(node.name);\n }\n if (node.componentId !== undefined) {\n const defs = context.file.componentDefinitions;\n const master = defs?.[node.componentId];\n if (master) {\n if (hasUsablePropDefs(master.componentPropertyDefinitions)) return true;\n return !VARIANT_POSITION_NAME_RE.test(master.name);\n }\n }\n return false;\n}\n\n// ============================================\n// missing-interaction-state\n// ============================================\n\nconst missingInteractionStateDef: RuleDefinition = {\n id: \"missing-interaction-state\",\n name: \"Missing Interaction State\",\n category: \"interaction\",\n why: \"Interactive components without state variants force AI to guess hover/focus/disabled appearances — or skip them entirely\",\n impact: \"Generated code has no :hover, :focus, or :disabled styles, making the UI feel static and unresponsive\",\n fix: \"Add state variants (Hover, Disabled, Focus, Active) to interactive components in Figma\",\n};\n\nconst missingInteractionStateCheck: RuleCheckFn = (node, context) => {\n // Only check component instances and components\n if (node.type !== \"INSTANCE\" && node.type !== \"COMPONENT\") return null;\n\n const interactiveType = getStatefulComponentType(node);\n if (!interactiveType) return null;\n\n const expectedStates = EXPECTED_STATES[interactiveType];\n if (!expectedStates) return null;\n\n // Probe gate: only assert a missing variant when we can actually observe the\n // master's variant axes. For nested INSTANCE children whose master was not\n // fetched into `componentDefinitions` and whose own `componentPropertyDefinitions`\n // is undefined, treat the verdict as unknown and skip — this avoids the\n // false-positive class described in #354. The data-availability check is\n // per-node (not per-state), so it lives outside the for-loop below.\n if (!canDetermineVariants(node, context)) return null;\n\n const seen = getSeen(context);\n const nodePath = context.path.join(\" > \");\n\n for (const state of expectedStates) {\n const dedupeKey = `${node.componentId ?? node.id}:${state}`;\n if (seen.has(dedupeKey)) continue;\n\n const pattern = STATE_PATTERNS[state];\n\n // Check variant properties on instance\n if (hasStateInVariantProps(node, pattern)) continue;\n\n // Check variant properties on component master (fetched definitions)\n if (hasStateInComponentMaster(node, context, pattern)) continue;\n\n // Missing state — report first missing one\n seen.add(dedupeKey);\n return {\n ruleId: missingInteractionStateDef.id,\n subType: state,\n nodeId: node.id,\n nodePath,\n ...missingInteractionStateMsg[state](node.name),\n };\n }\n\n return null;\n};\n\nexport const missingInteractionState = defineRule({\n definition: missingInteractionStateDef,\n check: missingInteractionStateCheck,\n});\n\n// ============================================\n// missing-prototype\n// ============================================\n\n/** Interactive types that need click prototype */\nconst PROTOTYPE_TYPES: Record<StatefulComponentType, MissingPrototypeSubType> = {\n button: \"button\",\n link: \"navigation\",\n tab: \"tab\",\n input: \"input\",\n toggle: \"toggle\",\n};\n\nfunction getPrototypeSubType(node: AnalysisNode): MissingPrototypeSubType | null {\n // Check overlay/carousel first — select/dropdown are classified as \"input\" in\n // STATEFUL_PATTERNS but need \"overlay\" subType for prototype checks\n if (isOverlayNode(node)) return \"overlay\";\n if (isCarouselNode(node)) return \"carousel\";\n const interactiveType = getStatefulComponentType(node);\n if (interactiveType) {\n const mapped = PROTOTYPE_TYPES[interactiveType];\n if (mapped) return mapped;\n }\n return null;\n}\n\nfunction hasInteractionTrigger(node: AnalysisNode, triggerType: string): boolean {\n if (!node.interactions || !Array.isArray(node.interactions)) return false;\n return node.interactions.some((interaction) => {\n const i = interaction as { trigger?: { type?: string } };\n return i.trigger?.type === triggerType;\n });\n}\n\n/** Check if node (or its component master) has any of the given trigger types */\nfunction hasAnyInteraction(node: AnalysisNode, context: RuleContext, triggers: string[]): boolean {\n for (const trigger of triggers) {\n if (hasInteractionTrigger(node, trigger)) return true;\n }\n // INSTANCE nodes don't inherit interactions from master — check master fallback\n if (node.componentId && context.file.componentDefinitions) {\n const master = context.file.componentDefinitions[node.componentId];\n if (master) {\n for (const trigger of triggers) {\n if (hasInteractionTrigger(master, trigger)) return true;\n }\n }\n }\n return false;\n}\n\n/** Trigger types to check per subType */\nconst PROTOTYPE_TRIGGERS: Record<string, string[]> = {\n carousel: [\"ON_CLICK\", \"ON_DRAG\"],\n};\n\nconst DEFAULT_TRIGGERS = [\"ON_CLICK\"];\n\nconst missingPrototypeDef: RuleDefinition = {\n id: \"missing-prototype\",\n name: \"Missing Prototype\",\n category: \"interaction\",\n why: \"Interactive elements without prototype interactions give AI no information about navigation or behavior\",\n impact: \"AI cannot generate interaction handlers, routing, or state changes — interactive elements become static\",\n fix: \"Add prototype interactions (ON_CLICK, ON_DRAG) to define navigation targets or state changes\",\n};\n\nconst SEEN_PROTO_KEY = \"missing-prototype:seen\";\n\nfunction getSeenProto(context: RuleContext): Set<string> {\n return getAnalysisState(context, SEEN_PROTO_KEY, () => new Set<string>());\n}\n\nconst missingPrototypeCheck: RuleCheckFn = (node, context) => {\n if (node.type !== \"INSTANCE\" && node.type !== \"COMPONENT\" && node.type !== \"FRAME\") return null;\n\n const subType = getPrototypeSubType(node);\n if (!subType) return null;\n\n // Already has relevant interaction (click, or drag for carousel)\n const triggers = PROTOTYPE_TRIGGERS[subType] ?? DEFAULT_TRIGGERS;\n if (hasAnyInteraction(node, context, triggers)) return null;\n\n // Dedup per componentId + subType\n const seen = getSeenProto(context);\n const dedupeKey = `${node.componentId ?? node.id}:${subType}`;\n if (seen.has(dedupeKey)) return null;\n seen.add(dedupeKey);\n\n return {\n ruleId: missingPrototypeDef.id,\n subType,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...missingPrototypeMsg[subType](node.name),\n };\n};\n\nexport const missingPrototype = defineRule({\n definition: missingPrototypeDef,\n check: missingPrototypeCheck,\n});\n","import { z } from \"zod\";\n\nexport const FigmaUrlInfoSchema = z.object({\n fileKey: z.string(),\n nodeId: z.string().optional(),\n fileName: z.string().optional(),\n});\n\nexport type FigmaUrlInfo = z.infer<typeof FigmaUrlInfoSchema>;\n\nconst FIGMA_URL_PATTERNS = [\n // https://www.figma.com/design/FILE_KEY/FILE_NAME?node-id=NODE_ID\n /figma\\.com\\/design\\/([a-zA-Z0-9]+)(?:\\/([^?]+))?(?:\\?.*node-id=([^&]+))?/,\n // https://www.figma.com/file/FILE_KEY/FILE_NAME?node-id=NODE_ID\n /figma\\.com\\/file\\/([a-zA-Z0-9]+)(?:\\/([^?]+))?(?:\\?.*node-id=([^&]+))?/,\n // https://www.figma.com/proto/FILE_KEY/FILE_NAME?node-id=NODE_ID\n /figma\\.com\\/proto\\/([a-zA-Z0-9]+)(?:\\/([^?]+))?(?:\\?.*node-id=([^&]+))?/,\n];\n\nexport function parseFigmaUrl(url: string): FigmaUrlInfo {\n for (const pattern of FIGMA_URL_PATTERNS) {\n const match = url.match(pattern);\n if (match) {\n const [, fileKey, fileName, nodeId] = match;\n if (!fileKey) {\n throw new FigmaUrlParseError(`Invalid Figma URL: missing file key`);\n }\n return {\n fileKey,\n fileName: fileName ? decodeURIComponent(fileName) : undefined,\n nodeId: nodeId ? decodeURIComponent(nodeId) : undefined,\n };\n }\n }\n\n throw new FigmaUrlParseError(\n `Invalid Figma URL format. Expected: https://www.figma.com/design/FILE_KEY/...`\n );\n}\n\nexport class FigmaUrlParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"FigmaUrlParseError\";\n }\n}\n\n/**\n * Extract the commentable node ID from a potentially nested instance path.\n * Instance-internal IDs like \"I3010:7457;1442:7704\" use semicolons to\n * separate path segments. The Figma Comments API only accepts simple IDs\n * (e.g. \"3010:7457\"), so we take the first segment and strip the \"I\" prefix.\n */\nexport function toCommentableNodeId(nodeId: string): string {\n const firstSegment = nodeId.split(\";\")[0]!;\n return firstSegment.replace(/^I/, \"\");\n}\n\nexport function buildFigmaDeepLink(fileKey: string, nodeId: string): string {\n // Strip instance-internal path to top-level node:\n // \"I175:7425;1442:7704\" → \"175:7425\" → \"175-7425\"\n const topNodeId = toCommentableNodeId(nodeId).replace(/:/g, \"-\");\n return `https://www.figma.com/design/${fileKey}?node-id=${topNodeId}`;\n}\n","import type { GetFileResponse, Node } from \"@figma/rest-api-spec\";\n\nconst FIGMA_API_BASE = \"https://api.figma.com/v1\";\n\nexport interface GetFileNodesResponse {\n name: string;\n lastModified: string;\n version: string;\n nodes: Record<string, {\n document: Node;\n components: GetFileResponse[\"components\"];\n styles: GetFileResponse[\"styles\"];\n }>;\n}\n\nexport interface FigmaClientOptions {\n token: string;\n}\n\nexport class FigmaClient {\n private token: string;\n\n constructor(options: FigmaClientOptions) {\n this.token = options.token;\n }\n\n static fromEnv(): FigmaClient {\n const token = process.env[\"FIGMA_TOKEN\"];\n if (!token) {\n throw new FigmaClientError(\n \"FIGMA_TOKEN environment variable is not set\"\n );\n }\n return new FigmaClient({ token });\n }\n\n async getFile(fileKey: string): Promise<GetFileResponse> {\n const url = `${FIGMA_API_BASE}/files/${fileKey}`;\n const response = await fetch(url, {\n headers: {\n \"X-Figma-Token\": this.token,\n },\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new FigmaClientError(\n `Failed to fetch file: ${response.status} ${response.statusText}`,\n response.status,\n error\n );\n }\n\n return response.json() as Promise<GetFileResponse>;\n }\n\n /**\n * Get rendered images for specific nodes\n * Returns a map of nodeId → image URL\n */\n async getNodeImages(\n fileKey: string,\n nodeIds: string[],\n options?: { format?: \"png\" | \"svg\" | \"jpg\"; scale?: number }\n ): Promise<Record<string, string | null>> {\n const format = options?.format ?? \"png\";\n const scale = options?.scale ?? 2;\n\n // Batch into chunks to avoid 414 URI Too Large\n const BATCH_SIZE = 50;\n const allImages: Record<string, string | null> = {};\n\n for (let i = 0; i < nodeIds.length; i += BATCH_SIZE) {\n const batch = nodeIds.slice(i, i + BATCH_SIZE);\n const ids = batch.join(\",\");\n const url = `${FIGMA_API_BASE}/images/${fileKey}?ids=${encodeURIComponent(ids)}&format=${format}&scale=${scale}`;\n const response = await fetch(url, {\n headers: {\n \"X-Figma-Token\": this.token,\n },\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new FigmaClientError(\n `Failed to fetch images: ${response.status} ${response.statusText}`,\n response.status,\n error\n );\n }\n\n const data = await response.json() as { images: Record<string, string | null> };\n for (const [nodeId, imageUrl] of Object.entries(data.images)) {\n allImages[nodeId] = imageUrl;\n }\n }\n\n return allImages;\n }\n\n /**\n * Get original image fill URLs by imageRef.\n * Returns a mapping of imageRef → download URL for all image fills in the file.\n */\n async getImageFills(fileKey: string): Promise<Record<string, string>> {\n const url = `${FIGMA_API_BASE}/files/${fileKey}/images`;\n const response = await fetch(url, {\n headers: { \"X-Figma-Token\": this.token },\n });\n if (!response.ok) {\n const error = await response.text().catch(() => \"\");\n throw new FigmaClientError(\n `Failed to fetch image fills: ${response.status} ${response.statusText}`,\n response.status,\n error\n );\n }\n const data = await response.json() as { meta?: { images?: Record<string, string> } };\n return data.meta?.images ?? {};\n }\n\n /**\n * Download an image URL and return as base64\n */\n async fetchImageAsBase64(imageUrl: string): Promise<string> {\n const response = await fetch(imageUrl);\n if (!response.ok) {\n throw new FigmaClientError(\n `Failed to download image: ${response.status}`,\n response.status\n );\n }\n const buffer = await response.arrayBuffer();\n return Buffer.from(buffer).toString(\"base64\");\n }\n\n async getFileNodes(\n fileKey: string,\n nodeIds: string[]\n ): Promise<GetFileNodesResponse> {\n const ids = nodeIds.join(\",\");\n const url = `${FIGMA_API_BASE}/files/${fileKey}/nodes?ids=${encodeURIComponent(ids)}`;\n const response = await fetch(url, {\n headers: {\n \"X-Figma-Token\": this.token,\n },\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new FigmaClientError(\n `Failed to fetch nodes: ${response.status} ${response.statusText}`,\n response.status,\n error\n );\n }\n\n return response.json() as Promise<GetFileNodesResponse>;\n }\n}\n\nexport class FigmaClientError extends Error {\n constructor(\n message: string,\n public statusCode?: number,\n public responseBody?: unknown\n ) {\n super(message);\n this.name = \"FigmaClientError\";\n }\n}\n","import type { GetFileResponse, Node } from \"@figma/rest-api-spec\";\nimport type { GetFileNodesResponse } from \"./figma-client.js\";\nimport type { AnalysisFile, AnalysisNode } from \"../contracts/figma-node.js\";\n\n/**\n * Transform Figma API response to analysis types\n */\nexport function transformFigmaResponse(\n fileKey: string,\n response: GetFileResponse\n): AnalysisFile {\n return {\n fileKey,\n name: response.name,\n lastModified: response.lastModified,\n version: response.version,\n document: transformNode(response.document),\n components: transformComponents(response.components),\n styles: transformStyles(response.styles),\n };\n}\n\nfunction transformNode(node: Node): AnalysisNode {\n const base: AnalysisNode = {\n id: node.id,\n name: node.name,\n type: node.type as AnalysisNode[\"type\"],\n visible: \"visible\" in node ? (node.visible ?? true) : true,\n };\n\n // Layout properties\n if (\"layoutMode\" in node && node.layoutMode) {\n base.layoutMode = node.layoutMode as AnalysisNode[\"layoutMode\"];\n }\n if (\"layoutAlign\" in node && node.layoutAlign) {\n base.layoutAlign = node.layoutAlign as AnalysisNode[\"layoutAlign\"];\n }\n if (\"layoutPositioning\" in node && node.layoutPositioning) {\n base.layoutPositioning =\n node.layoutPositioning as AnalysisNode[\"layoutPositioning\"];\n }\n if (\"layoutSizingHorizontal\" in node && node.layoutSizingHorizontal) {\n base.layoutSizingHorizontal =\n node.layoutSizingHorizontal as AnalysisNode[\"layoutSizingHorizontal\"];\n }\n if (\"layoutSizingVertical\" in node && node.layoutSizingVertical) {\n base.layoutSizingVertical =\n node.layoutSizingVertical as AnalysisNode[\"layoutSizingVertical\"];\n }\n if (\"primaryAxisAlignItems\" in node) {\n base.primaryAxisAlignItems = node.primaryAxisAlignItems as string;\n }\n if (\"counterAxisAlignItems\" in node) {\n base.counterAxisAlignItems = node.counterAxisAlignItems as string;\n }\n if (\"itemSpacing\" in node) {\n base.itemSpacing = node.itemSpacing as number;\n }\n if (\"paddingLeft\" in node) {\n base.paddingLeft = node.paddingLeft as number;\n }\n if (\"paddingRight\" in node) {\n base.paddingRight = node.paddingRight as number;\n }\n if (\"paddingTop\" in node) {\n base.paddingTop = node.paddingTop as number;\n }\n if (\"paddingBottom\" in node) {\n base.paddingBottom = node.paddingBottom as number;\n }\n\n // Size constraints (responsive)\n if (\"minWidth\" in node && typeof node.minWidth === \"number\") {\n base.minWidth = node.minWidth;\n }\n if (\"maxWidth\" in node && typeof node.maxWidth === \"number\") {\n base.maxWidth = node.maxWidth;\n }\n if (\"minHeight\" in node && typeof node.minHeight === \"number\") {\n base.minHeight = node.minHeight;\n }\n if (\"maxHeight\" in node && typeof node.maxHeight === \"number\") {\n base.maxHeight = node.maxHeight;\n }\n if (\"layoutGrow\" in node && node.layoutGrow !== undefined) {\n base.layoutGrow = node.layoutGrow as 0 | 1;\n }\n if (\"constraints\" in node && node.constraints) {\n base.constraints = node.constraints as AnalysisNode[\"constraints\"];\n }\n\n // Wrap (flex-wrap)\n if (\"layoutWrap\" in node && node.layoutWrap) {\n base.layoutWrap = node.layoutWrap as AnalysisNode[\"layoutWrap\"];\n }\n if (\"counterAxisSpacing\" in node && typeof node.counterAxisSpacing === \"number\") {\n base.counterAxisSpacing = node.counterAxisSpacing;\n }\n if (\"counterAxisAlignContent\" in node && node.counterAxisAlignContent) {\n base.counterAxisAlignContent =\n node.counterAxisAlignContent as AnalysisNode[\"counterAxisAlignContent\"];\n }\n\n // Grid layout (container)\n if (\"gridRowCount\" in node && typeof node.gridRowCount === \"number\") {\n base.gridRowCount = node.gridRowCount;\n }\n if (\"gridColumnCount\" in node && typeof node.gridColumnCount === \"number\") {\n base.gridColumnCount = node.gridColumnCount;\n }\n if (\"gridRowGap\" in node && typeof node.gridRowGap === \"number\") {\n base.gridRowGap = node.gridRowGap;\n }\n if (\"gridColumnGap\" in node && typeof node.gridColumnGap === \"number\") {\n base.gridColumnGap = node.gridColumnGap;\n }\n if (\"gridColumnsSizing\" in node && typeof node.gridColumnsSizing === \"string\") {\n base.gridColumnsSizing = node.gridColumnsSizing;\n }\n if (\"gridRowsSizing\" in node && typeof node.gridRowsSizing === \"string\") {\n base.gridRowsSizing = node.gridRowsSizing;\n }\n\n // Grid layout (child)\n if (\"gridChildHorizontalAlign\" in node && node.gridChildHorizontalAlign) {\n base.gridChildHorizontalAlign =\n node.gridChildHorizontalAlign as AnalysisNode[\"gridChildHorizontalAlign\"];\n }\n if (\"gridChildVerticalAlign\" in node && node.gridChildVerticalAlign) {\n base.gridChildVerticalAlign =\n node.gridChildVerticalAlign as AnalysisNode[\"gridChildVerticalAlign\"];\n }\n if (\"gridRowSpan\" in node && typeof node.gridRowSpan === \"number\") {\n base.gridRowSpan = node.gridRowSpan;\n }\n if (\"gridColumnSpan\" in node && typeof node.gridColumnSpan === \"number\") {\n base.gridColumnSpan = node.gridColumnSpan;\n }\n if (\"gridRowAnchorIndex\" in node && typeof node.gridRowAnchorIndex === \"number\") {\n base.gridRowAnchorIndex = node.gridRowAnchorIndex;\n }\n if (\"gridColumnAnchorIndex\" in node && typeof node.gridColumnAnchorIndex === \"number\") {\n base.gridColumnAnchorIndex = node.gridColumnAnchorIndex;\n }\n\n // Overflow / clip\n if (\"clipsContent\" in node && typeof node.clipsContent === \"boolean\") {\n base.clipsContent = node.clipsContent;\n }\n if (\"overflowDirection\" in node && node.overflowDirection) {\n base.overflowDirection =\n node.overflowDirection as AnalysisNode[\"overflowDirection\"];\n }\n\n // Size/position\n if (\"absoluteBoundingBox\" in node && node.absoluteBoundingBox) {\n base.absoluteBoundingBox = node.absoluteBoundingBox;\n }\n\n // Component properties\n if (\"componentId\" in node) {\n base.componentId = node.componentId as string;\n }\n if (\"componentPropertyDefinitions\" in node) {\n base.componentPropertyDefinitions =\n node.componentPropertyDefinitions as Record<string, unknown>;\n }\n if (\"componentProperties\" in node) {\n base.componentProperties = node.componentProperties as Record<\n string,\n unknown\n >;\n }\n\n // Style properties\n if (\"styles\" in node) {\n base.styles = node.styles as Record<string, string>;\n }\n if (\"fills\" in node) {\n base.fills = node.fills as unknown[];\n }\n if (\"strokes\" in node) {\n base.strokes = node.strokes as unknown[];\n }\n if (\"strokeWeight\" in node && typeof node.strokeWeight === \"number\") {\n base.strokeWeight = node.strokeWeight;\n }\n if (\"individualStrokeWeights\" in node && node.individualStrokeWeights) {\n base.individualStrokeWeights = node.individualStrokeWeights as Record<string, number>;\n }\n if (\"effects\" in node) {\n base.effects = node.effects as unknown[];\n }\n if (\"cornerRadius\" in node && typeof node.cornerRadius === \"number\") {\n base.cornerRadius = node.cornerRadius;\n }\n if (\"opacity\" in node && typeof node.opacity === \"number\" && node.opacity < 1) {\n base.opacity = node.opacity;\n }\n\n // Variable bindings\n if (\"boundVariables\" in node && node.boundVariables) {\n base.boundVariables = node.boundVariables as Record<string, unknown>;\n }\n\n // Text properties\n if (\"characters\" in node) {\n base.characters = node.characters as string;\n }\n if (\"style\" in node) {\n base.style = node.style as Record<string, unknown>;\n }\n if (\"textTruncation\" in node && (node.textTruncation === \"DISABLED\" || node.textTruncation === \"ENDING\")) {\n base.textTruncation = node.textTruncation;\n }\n if (\"maxLines\" in node && typeof node.maxLines === \"number\") {\n base.maxLines = node.maxLines;\n }\n\n // Handoff status\n if (\"devStatus\" in node && node.devStatus) {\n base.devStatus = node.devStatus as AnalysisNode[\"devStatus\"];\n }\n\n // Prototype interactions\n if (\"interactions\" in node && Array.isArray(node.interactions) && node.interactions.length > 0) {\n base.interactions = node.interactions;\n }\n\n // Recursively transform children\n if (\"children\" in node && Array.isArray(node.children)) {\n base.children = node.children.map(transformNode);\n }\n\n return base;\n}\n\n/**\n * Transform Figma /v1/files/{key}/nodes response to analysis types.\n * Returns the first node's subtree as the document.\n */\nexport function transformFileNodesResponse(\n fileKey: string,\n response: GetFileNodesResponse\n): AnalysisFile {\n const entries = Object.values(response.nodes);\n const first = entries[0];\n if (!first)\n throw new Error(\n \"No nodes returned from Figma API — the node-id in the URL may be invalid or deleted. \" +\n \"Try selecting the frame in Figma and copying the link again.\"\n );\n\n return {\n fileKey,\n name: response.name,\n lastModified: response.lastModified,\n version: response.version,\n document: transformNode(first.document),\n components: transformComponents(first.components),\n styles: transformStyles(first.styles),\n };\n}\n\n/**\n * Transform component master nodes from a /v1/files/{key}/nodes response.\n * Each requested node ID is transformed into an AnalysisNode if present.\n */\nexport function transformComponentMasterNodes(\n response: GetFileNodesResponse,\n requestedIds: string[]\n): Record<string, AnalysisNode> {\n const result: Record<string, AnalysisNode> = {};\n for (const id of requestedIds) {\n const entry = response.nodes[id];\n if (entry?.document) {\n result[id] = transformNode(entry.document);\n }\n }\n return result;\n}\n\nfunction transformComponents(\n components: GetFileResponse[\"components\"]\n): AnalysisFile[\"components\"] {\n const result: AnalysisFile[\"components\"] = {};\n for (const [id, component] of Object.entries(components)) {\n result[id] = {\n key: component.key,\n name: component.name,\n description: component.description,\n };\n }\n return result;\n}\n\nfunction transformStyles(\n styles: GetFileResponse[\"styles\"]\n): AnalysisFile[\"styles\"] {\n const result: AnalysisFile[\"styles\"] = {};\n for (const [id, style] of Object.entries(styles)) {\n result[id] = {\n key: style.key,\n name: style.name,\n styleType: style.styleType,\n };\n }\n return result;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { basename, dirname } from \"node:path\";\nimport type { GetFileResponse } from \"@figma/rest-api-spec\";\nimport type { AnalysisFile, AnalysisNode } from \"../contracts/figma-node.js\";\nimport { AnalysisNodeSchema } from \"../contracts/figma-node.js\";\nimport { transformFigmaResponse } from \"./figma-transformer.js\";\n\n/**\n * Extract fileKey from fixture path.\n * - fixtures/name/data.json → name (directory-based fixture)\n * - fixtures/name.json → name (legacy flat fixture)\n */\nfunction extractFileKey(filePath: string): string {\n const fileName = basename(filePath, \".json\");\n if (fileName === \"data\") {\n // Directory-based fixture: use parent directory name\n return basename(dirname(filePath));\n }\n return fileName;\n}\n\n/**\n * Load Figma data from a JSON file\n * For MVP testing and fixture support\n */\nexport async function loadFigmaFileFromJson(\n filePath: string\n): Promise<AnalysisFile> {\n const content = await readFile(filePath, \"utf-8\");\n const data = JSON.parse(content) as GetFileResponse & {\n componentDefinitions?: Record<string, unknown>;\n interactionDestinations?: Record<string, unknown>;\n };\n\n const fileKey = extractFileKey(filePath);\n\n const file = transformFigmaResponse(fileKey, data);\n\n // Preserve componentDefinitions from previously-saved fixtures\n if (data.componentDefinitions) {\n const parsed: Record<string, AnalysisNode> = {};\n for (const [id, raw] of Object.entries(data.componentDefinitions)) {\n const result = AnalysisNodeSchema.safeParse(raw);\n if (result.success) {\n parsed[id] = result.data;\n } else {\n console.debug(`[figma-file-loader] componentDefinitions[${id}] failed validation:`, result.error.issues);\n }\n }\n if (Object.keys(parsed).length > 0) {\n file.componentDefinitions = parsed;\n }\n }\n\n // Preserve interactionDestinations from previously-saved fixtures\n if (data.interactionDestinations) {\n const parsed: Record<string, AnalysisNode> = {};\n for (const [id, raw] of Object.entries(data.interactionDestinations)) {\n const result = AnalysisNodeSchema.safeParse(raw);\n if (result.success) {\n parsed[id] = result.data;\n } else {\n console.debug(`[figma-file-loader] interactionDestinations[${id}] failed validation:`, result.error.issues);\n }\n }\n if (Object.keys(parsed).length > 0) {\n file.interactionDestinations = parsed;\n }\n }\n\n return file;\n}\n\n/**\n * Parse Figma data from a JSON string\n */\nexport function parseFigmaJson(\n json: string,\n fileKey: string\n): AnalysisFile {\n const data = JSON.parse(json) as GetFileResponse;\n return transformFigmaResponse(fileKey, data);\n}\n\nexport class FigmaFileLoadError extends Error {\n constructor(message: string, public filePath?: string) {\n super(message);\n this.name = \"FigmaFileLoadError\";\n }\n}\n","import type { FigmaClient } from \"./figma-client.js\";\nimport type { AnalysisNode } from \"../contracts/figma-node.js\";\nimport { transformComponentMasterNodes } from \"./figma-transformer.js\";\n\nconst BATCH_SIZE = 50;\n\n/**\n * Recursively collect all unique componentId values from INSTANCE nodes.\n */\nexport function collectComponentIds(node: AnalysisNode): Set<string> {\n const ids = new Set<string>();\n\n function walk(n: AnalysisNode): void {\n if (n.type === \"INSTANCE\" && n.componentId) {\n ids.add(n.componentId);\n }\n if (n.children) {\n for (const child of n.children) {\n walk(child);\n }\n }\n }\n\n walk(node);\n return ids;\n}\n\n/**\n * Recursively collect all unique interaction destination IDs from nodes.\n * These are the node IDs that interactions (e.g., ON_HOVER → CHANGE_TO) point to.\n */\nexport function collectInteractionDestinationIds(node: AnalysisNode): Set<string> {\n const ids = new Set<string>();\n\n function walk(n: AnalysisNode): void {\n if (n.interactions && Array.isArray(n.interactions)) {\n for (const interaction of n.interactions) {\n const i = interaction as {\n trigger?: { type?: string };\n actions?: Array<{ destinationId?: string; navigation?: string }>;\n };\n if (i.trigger?.type === \"ON_HOVER\" && i.actions) {\n for (const action of i.actions) {\n if (action.navigation === \"CHANGE_TO\" && action.destinationId) {\n ids.add(action.destinationId);\n }\n }\n }\n }\n }\n if (n.children) {\n for (const child of n.children) {\n walk(child);\n }\n }\n }\n\n walk(node);\n return ids;\n}\n\n/**\n * Resolve component master node trees via multi-pass fetching.\n *\n * Pass 1: collect component IDs from the document tree, fetch their masters.\n * Pass 2+: collect component IDs from fetched masters that were not in previous passes.\n * Repeats up to maxPasses (default 2).\n *\n * Batches API calls at BATCH_SIZE IDs per request.\n * Skips IDs that return null (e.g. external library components).\n */\nexport async function resolveComponentDefinitions(\n client: FigmaClient,\n fileKey: string,\n document: AnalysisNode,\n maxPasses = 2\n): Promise<Record<string, AnalysisNode>> {\n const allDefinitions: Record<string, AnalysisNode> = {};\n const resolvedIds = new Set<string>();\n\n // Pass 1: collect from the original document\n let pendingIds = collectComponentIds(document);\n\n for (let pass = 0; pass < maxPasses; pass++) {\n // Filter out already-resolved IDs\n const idsToFetch = [...pendingIds].filter((id) => !resolvedIds.has(id));\n if (idsToFetch.length === 0) break;\n\n // Fetch in batches\n for (let i = 0; i < idsToFetch.length; i += BATCH_SIZE) {\n const batch = idsToFetch.slice(i, i + BATCH_SIZE);\n try {\n const response = await client.getFileNodes(fileKey, batch);\n const transformed = transformComponentMasterNodes(response, batch);\n for (const [id, node] of Object.entries(transformed)) {\n allDefinitions[id] = node;\n }\n } catch (err) {\n // Skip failed batches (e.g. external library components)\n console.debug(`[component-resolver] batch fetch failed (${batch.length} ids):`, err);\n }\n }\n\n // Mark all attempted IDs as resolved (even if they failed/returned null)\n for (const id of idsToFetch) {\n resolvedIds.add(id);\n }\n\n // Collect new IDs only from masters fetched in this pass (not all accumulated)\n pendingIds = new Set<string>();\n for (const id of idsToFetch) {\n const node = allDefinitions[id];\n if (node) {\n for (const nestedId of collectComponentIds(node)) {\n if (!resolvedIds.has(nestedId)) {\n pendingIds.add(nestedId);\n }\n }\n }\n }\n }\n\n return allDefinitions;\n}\n\n/**\n * Resolve interaction destination nodes (e.g., hover variants).\n *\n * Collects all destinationId values from interactions in the document,\n * excludes those already in componentDefinitions, and fetches them.\n */\nexport async function resolveInteractionDestinations(\n client: FigmaClient,\n fileKey: string,\n document: AnalysisNode,\n existingDefinitions?: Record<string, AnalysisNode>,\n): Promise<Record<string, AnalysisNode>> {\n const destIds = collectInteractionDestinationIds(document);\n if (destIds.size === 0) return {};\n\n const allDestinations: Record<string, AnalysisNode> = {};\n const idsToFetch: string[] = [];\n\n for (const id of destIds) {\n const existing = existingDefinitions?.[id];\n if (existing) {\n allDestinations[id] = existing;\n } else {\n idsToFetch.push(id);\n }\n }\n\n if (idsToFetch.length === 0) return allDestinations;\n\n for (let i = 0; i < idsToFetch.length; i += BATCH_SIZE) {\n const batch = idsToFetch.slice(i, i + BATCH_SIZE);\n try {\n const response = await client.getFileNodes(fileKey, batch);\n const transformed = transformComponentMasterNodes(response, batch);\n for (const [id, node] of Object.entries(transformed)) {\n allDestinations[id] = node;\n }\n } catch (err) {\n console.debug(`[component-resolver] interaction destination fetch failed (${batch.length} ids):`, err);\n }\n }\n\n return allDestinations;\n}\n","import { z } from \"zod\";\nimport { AnalysisScopeSchema } from \"../../core/contracts/analysis-scope.js\";\n\nexport const SamplingStrategySchema = z.enum([\"all\", \"top-issues\", \"random\"]);\nexport type SamplingStrategy = z.infer<typeof SamplingStrategySchema>;\n\nexport const CalibrationStatusSchema = z.enum([\n \"pending\",\n \"analyzing\",\n \"converting\",\n \"evaluating\",\n \"tuning\",\n \"completed\",\n \"failed\",\n]);\nexport type CalibrationStatus = z.infer<typeof CalibrationStatusSchema>;\n\nexport const CalibrationConfigSchema = z.object({\n input: z.string(),\n token: z.string().optional(),\n targetNodeId: z.string().optional(),\n maxConversionNodes: z.number().int().positive().default(20),\n samplingStrategy: SamplingStrategySchema.default(\"top-issues\"),\n outputPath: z.string().default(\"logs/calibration/calibration-report.md\"),\n runDir: z.string().optional(),\n /**\n * #404: Explicit analysis scope for the calibration run. When omitted,\n * the orchestrator (`scripts/calibrate.ts`) injects `\"page\"` as the\n * policy default — `fixtures/done/*` are conceptually pages even though\n * they are stored as `COMPONENT` variants (\"Platform=Desktop\" etc.) and\n * would otherwise auto-detect as component scope. A `.scope` file in\n * the fixture directory overrides the default per-fixture.\n */\n scope: AnalysisScopeSchema.optional(),\n});\n\nexport type CalibrationConfig = z.infer<typeof CalibrationConfigSchema>;\nexport type CalibrationConfigInput = z.input<typeof CalibrationConfigSchema>;\n\nexport interface CalibrationRun {\n config: CalibrationConfig;\n status: CalibrationStatus;\n startedAt: string;\n completedAt?: string;\n error?: string;\n}\n","import { z } from \"zod\";\nimport type { AnalysisResult } from \"../../core/engine/rule-engine.js\";\nimport type { ScoreReport } from \"../../core/engine/scoring.js\";\nimport type { RuleId } from \"../../core/contracts/rule.js\";\nimport type { Severity } from \"../../core/contracts/severity.js\";\n\nexport const NodeIssueSummarySchema = z.object({\n nodeId: z.string(),\n nodePath: z.string(),\n totalScore: z.number(),\n issueCount: z.number(),\n flaggedRuleIds: z.array(z.string()),\n severities: z.array(z.string()),\n});\n\nexport type NodeIssueSummary = z.infer<typeof NodeIssueSummarySchema>;\n\nexport interface AnalysisAgentInput {\n analysisResult: AnalysisResult;\n}\n\nexport interface AnalysisAgentOutput {\n analysisResult: AnalysisResult;\n scoreReport: ScoreReport;\n nodeIssueSummaries: NodeIssueSummary[];\n}\n\nexport interface NodeIssueDetail {\n ruleId: RuleId;\n severity: Severity;\n calculatedScore: number;\n message: string;\n}\n","import { z } from \"zod\";\n\nexport const DifficultySchema = z.enum([\"easy\", \"moderate\", \"hard\", \"failed\"]);\nexport type Difficulty = z.infer<typeof DifficultySchema>;\n\nexport const RuleRelatedStruggleSchema = z.object({\n ruleId: z.string(),\n description: z.string(),\n actualImpact: DifficultySchema,\n});\n\nexport type RuleRelatedStruggle = z.infer<typeof RuleRelatedStruggleSchema>;\n\nexport const UncoveredStruggleSchema = z.object({\n description: z.string(),\n suggestedCategory: z.string(),\n estimatedImpact: DifficultySchema,\n});\n\nexport type UncoveredStruggle = z.infer<typeof UncoveredStruggleSchema>;\n\nexport const ConversionRecordSchema = z.object({\n nodeId: z.string(),\n nodePath: z.string(),\n generatedCode: z.string(),\n difficulty: DifficultySchema,\n notes: z.string(),\n ruleRelatedStruggles: z.array(RuleRelatedStruggleSchema),\n uncoveredStruggles: z.array(UncoveredStruggleSchema),\n durationMs: z.number(),\n});\n\nexport type ConversionRecord = z.infer<typeof ConversionRecordSchema>;\n\nexport const StripTypeEnum = z.enum([\n \"layout-direction-spacing\",\n \"size-constraints\",\n \"component-references\",\n \"node-names-hierarchy\",\n \"variable-references\",\n \"style-references\",\n]);\n\nexport const StripDeltaResultSchema = z.object({\n stripType: StripTypeEnum,\n // Pixel similarity (design viewport)\n baselineSimilarity: z.number(),\n strippedSimilarity: z.number(),\n delta: z.number().finite(),\n deltaDifficulty: DifficultySchema,\n // Responsive similarity (expanded viewport — primarily for size-constraints)\n baselineResponsiveSimilarity: z.number().finite().nullable().optional(),\n strippedResponsiveSimilarity: z.number().finite().nullable().optional(),\n responsiveDelta: z.number().finite().nullable().optional(),\n responsiveViewport: z.number().int().positive().nullable().optional(),\n // Input tokens (design-tree token count)\n baselineInputTokens: z.number().int().nonnegative().optional(),\n strippedInputTokens: z.number().int().nonnegative().optional(),\n tokenDelta: z.number().int().optional(),\n // HTML output size\n baselineHtmlBytes: z.number().int().nonnegative().optional(),\n strippedHtmlBytes: z.number().int().nonnegative().optional(),\n htmlBytesDelta: z.number().int().optional(),\n // CSS metrics\n baselineCssClassCount: z.number().int().nonnegative().optional(),\n strippedCssClassCount: z.number().int().nonnegative().optional(),\n baselineCssVariableCount: z.number().int().nonnegative().optional(),\n strippedCssVariableCount: z.number().int().nonnegative().optional(),\n});\n\nexport const StripDeltasArraySchema = z.array(StripDeltaResultSchema);\n\nexport type StripDeltaResult = z.infer<typeof StripDeltaResultSchema>;\n\nexport const RuleImpactAssessmentSchema = z.array(\n z.object({\n ruleId: z.string(),\n issueCount: z.number(),\n actualImpact: z.string(),\n description: z.string(),\n })\n);\n\nexport const UncoveredStrugglesInputSchema = z.array(\n z.object({\n description: z.string(),\n suggestedCategory: z.string(),\n estimatedImpact: z.string(),\n })\n);\n\n","import { z } from \"zod\";\nimport { DifficultySchema } from \"./conversion-agent.js\";\nimport { SeveritySchema } from \"../../core/contracts/severity.js\";\n\nexport const MismatchTypeSchema = z.enum([\n \"overscored\",\n \"underscored\",\n \"missing-rule\",\n \"validated\",\n]);\nexport type MismatchType = z.infer<typeof MismatchTypeSchema>;\n\nexport const MismatchCaseSchema = z.object({\n type: MismatchTypeSchema,\n nodeId: z.string(),\n nodePath: z.string(),\n ruleId: z.string().optional(),\n currentScore: z.number().optional(),\n currentSeverity: SeveritySchema.optional(),\n actualDifficulty: DifficultySchema,\n reasoning: z.string(),\n category: z.string().optional(),\n description: z.string().optional(),\n});\n\nexport type MismatchCase = z.infer<typeof MismatchCaseSchema>;\n\nexport interface StripDeltaForEval {\n /** Pixel similarity delta (baseline - stripped) at design viewport */\n pixelDelta: number;\n /** Responsive pixel similarity delta at expanded viewport (null if not measured) */\n responsiveDelta: number | null;\n /** Baseline design-tree input token count */\n baselineInputTokens: number | null;\n /** Stripped design-tree input token count */\n strippedInputTokens: number | null;\n}\n\nexport interface EvaluationAgentInput {\n nodeIssueSummaries: Array<{\n nodeId: string;\n nodePath: string;\n flaggedRuleIds: string[];\n }>;\n conversionRecords: Array<{\n nodeId: string;\n nodePath: string;\n difficulty: string;\n ruleRelatedStruggles: Array<{\n ruleId: string;\n description: string;\n actualImpact: string;\n }>;\n uncoveredStruggles: Array<{\n description: string;\n suggestedCategory: string;\n estimatedImpact: string;\n }>;\n }>;\n ruleScores: Record<string, { score: number; severity: string }>;\n /**\n * Responsive viewport comparison delta (similarity - responsiveSimilarity).\n * Positive = design breaks at expanded viewport. Used to evaluate responsive-critical rules.\n * null/undefined = no responsive comparison available.\n */\n responsiveDelta?: number | null | undefined;\n /**\n * Strip ablation results keyed by strip type.\n * Contains pixel delta, token counts, responsive delta, and HTML metrics per strip.\n * Used to objectively override AI self-assessment with category-appropriate metrics.\n * undefined = no strip ablation data available.\n */\n stripDeltas?: Record<string, StripDeltaForEval> | undefined;\n /**\n * Whether the conversion was whole-design (single root record covering the entire page).\n * When true, evaluation merges all nodeIssueSummaries' flaggedRuleIds into the single record\n * so rules flagged on child nodes aren't silently dropped.\n */\n wholeDesign?: boolean | undefined;\n}\n\nexport interface EvaluationAgentOutput {\n mismatches: MismatchCase[];\n validatedRules: string[];\n}\n","import { z } from \"zod\";\nimport { SeveritySchema } from \"../../core/contracts/severity.js\";\nimport type { CrossRunEvidence } from \"./evidence.js\";\n\nexport const ConfidenceSchema = z.enum([\"high\", \"medium\", \"low\"]);\nexport type Confidence = z.infer<typeof ConfidenceSchema>;\n\nexport const ScoreAdjustmentSchema = z.object({\n ruleId: z.string(),\n currentScore: z.number(),\n proposedScore: z.number(),\n currentSeverity: SeveritySchema,\n proposedSeverity: SeveritySchema.optional(),\n reasoning: z.string(),\n confidence: ConfidenceSchema,\n supportingCases: z.number(),\n proposedDisable: z.boolean().optional(),\n});\n\nexport type ScoreAdjustment = z.infer<typeof ScoreAdjustmentSchema>;\n\nexport const NewRuleProposalSchema = z.object({\n suggestedId: z.string(),\n category: z.string(),\n description: z.string(),\n suggestedSeverity: SeveritySchema,\n suggestedScore: z.number(),\n reasoning: z.string(),\n supportingCases: z.number(),\n});\n\nexport type NewRuleProposal = z.infer<typeof NewRuleProposalSchema>;\n\nexport interface TuningAgentInput {\n mismatches: Array<{\n type: string;\n nodeId: string;\n nodePath: string;\n ruleId?: string | undefined;\n currentScore?: number | undefined;\n currentSeverity?: string | undefined;\n actualDifficulty: string;\n reasoning: string;\n category?: string | undefined;\n description?: string | undefined;\n }>;\n ruleScores: Record<string, { score: number; severity: string }>;\n priorEvidence?: CrossRunEvidence;\n}\n\nexport interface TuningAgentOutput {\n adjustments: ScoreAdjustment[];\n newRuleProposals: NewRuleProposal[];\n}\n","import { z } from \"zod\";\n\nexport const GapEntrySchema = z.object({\n category: z.string(),\n description: z.string(),\n pixelImpact: z.string().optional(),\n coveredByRule: z.string().nullable().optional(),\n coveredByExistingRule: z.boolean().optional(),\n existingRule: z.string().nullable().optional(),\n causedByInterpretation: z.boolean().optional(),\n actionable: z.boolean().optional(),\n suggestedRuleCategory: z.string().optional(),\n area: z.string().optional(),\n});\n\nexport type GapEntry = z.infer<typeof GapEntrySchema>;\n\nexport const GapAnalyzerOutputSchema = z.object({\n fixture: z.string().optional(),\n similarity: z.number().optional(),\n timestamp: z.string().optional(),\n gaps: z.array(GapEntrySchema),\n summary: z\n .object({\n totalGaps: z.number(),\n actionableGaps: z.number(),\n coveredByExistingRules: z.number(),\n newRuleCandidates: z.number(),\n renderingArtifacts: z.number(),\n })\n .optional(),\n newRuleSuggestions: z\n .array(\n z.object({\n ruleId: z.string(),\n rationale: z.string().optional(),\n })\n )\n .optional(),\n});\n\nexport type GapAnalyzerOutput = z.infer<typeof GapAnalyzerOutputSchema>;\n","import type { AnalysisResult } from \"../core/engine/rule-engine.js\";\nimport { calculateScores } from \"../core/engine/scoring.js\";\nimport type { RuleId } from \"../core/contracts/rule.js\";\nimport type { Severity } from \"../core/contracts/severity.js\";\nimport type {\n AnalysisAgentInput,\n AnalysisAgentOutput,\n NodeIssueSummary,\n} from \"./contracts/analysis-agent.js\";\n\n/**\n * Group issues by nodeId and produce sorted summaries\n */\nfunction buildNodeIssueSummaries(\n result: AnalysisResult\n): NodeIssueSummary[] {\n const nodeMap = new Map<\n string,\n {\n nodePath: string;\n totalScore: number;\n issueCount: number;\n ruleIds: Set<string>;\n severities: Set<string>;\n }\n >();\n\n for (const issue of result.issues) {\n const nodeId = issue.violation.nodeId;\n const existing = nodeMap.get(nodeId);\n\n if (existing) {\n existing.totalScore += issue.calculatedScore;\n existing.issueCount++;\n existing.ruleIds.add(issue.rule.definition.id);\n existing.severities.add(issue.config.severity);\n } else {\n nodeMap.set(nodeId, {\n nodePath: issue.violation.nodePath,\n totalScore: issue.calculatedScore,\n issueCount: 1,\n ruleIds: new Set([issue.rule.definition.id]),\n severities: new Set([issue.config.severity as string]),\n });\n }\n }\n\n const summaries: NodeIssueSummary[] = [];\n\n for (const [nodeId, data] of nodeMap) {\n summaries.push({\n nodeId,\n nodePath: data.nodePath,\n totalScore: data.totalScore,\n issueCount: data.issueCount,\n flaggedRuleIds: [...data.ruleIds],\n severities: [...data.severities],\n });\n }\n\n // Sort by totalScore ascending (most negative = most problematic first)\n summaries.sort((a, b) => a.totalScore - b.totalScore);\n\n return summaries;\n}\n\n/**\n * Extract rule scores map from analysis result for downstream agents\n */\nexport function extractRuleScores(\n result: AnalysisResult\n): Record<string, { score: number; severity: string }> {\n const scores: Record<string, { score: number; severity: string }> = {};\n\n for (const issue of result.issues) {\n const ruleId = issue.rule.definition.id as RuleId;\n if (!scores[ruleId]) {\n scores[ruleId] = {\n score: issue.config.score,\n severity: issue.config.severity as Severity,\n };\n }\n }\n\n return scores;\n}\n\n/**\n * Analysis Agent - Step 1 of calibration pipeline\n *\n * Wraps existing analyzeFile + calculateScores and adds\n * nodeId-grouped issue summaries for downstream agents.\n */\nexport function runAnalysisAgent(\n input: AnalysisAgentInput\n): AnalysisAgentOutput {\n const { analysisResult } = input;\n\n const scoreReport = calculateScores(analysisResult);\n const nodeIssueSummaries = buildNodeIssueSummaries(analysisResult);\n\n return {\n analysisResult,\n scoreReport,\n nodeIssueSummaries,\n };\n}\n","import type {\n EvaluationAgentInput,\n EvaluationAgentOutput,\n MismatchCase,\n MismatchType,\n StripDeltaForEval,\n} from \"./contracts/evaluation-agent.js\";\nimport type { Difficulty } from \"./contracts/conversion-agent.js\";\nimport type { Severity } from \"../core/contracts/severity.js\";\nimport type { RuleId } from \"../core/contracts/rule.js\";\nimport { RULE_ID_CATEGORY } from \"../core/rules/rule-config.js\";\nimport type { DesignTreeInfoType } from \"../core/design-tree/strip.js\";\nimport { stripDeltaToDifficulty, tokenDeltaToDifficulty } from \"../core/design-tree/delta.js\";\n\n/**\n * Difficulty-to-score range mapping.\n * Used to determine if a rule's current score aligns with actual conversion difficulty.\n *\n * easy → score should be 0 to -3\n * moderate → score should be -4 to -7\n * hard → score should be -8 to -12\n * failed → score should be -8 to -12\n */\nconst DIFFICULTY_SCORE_RANGES: Record<Difficulty, { min: number; max: number }> = {\n easy: { min: -3, max: 0 },\n moderate: { min: -7, max: -4 },\n hard: { min: -12, max: -8 },\n failed: { min: -12, max: -8 },\n};\n\n/**\n * Check if a score falls within the expected range for a given difficulty\n */\nfunction scoreMatchesDifficulty(score: number, difficulty: Difficulty): boolean {\n const range = DIFFICULTY_SCORE_RANGES[difficulty];\n return score >= range.min && score <= range.max;\n}\n\n/**\n * Determine mismatch type for a flagged rule based on conversion difficulty\n */\nfunction classifyFlaggedRule(\n currentScore: number,\n actualDifficulty: Difficulty\n): MismatchType {\n if (scoreMatchesDifficulty(currentScore, actualDifficulty)) {\n return \"validated\";\n }\n\n // If actual difficulty is easier than what the score suggests\n if (\n (actualDifficulty === \"easy\" && currentScore < -3) ||\n (actualDifficulty === \"moderate\" && currentScore < -7)\n ) {\n return \"overscored\";\n }\n\n // If actual difficulty is harder than what the score suggests\n return \"underscored\";\n}\n\n/**\n * Build reasoning string for a mismatch\n */\nfunction buildReasoning(\n type: MismatchType,\n ruleId: string | undefined,\n currentScore: number | undefined,\n actualDifficulty: Difficulty\n): string {\n const range = DIFFICULTY_SCORE_RANGES[actualDifficulty];\n\n switch (type) {\n case \"validated\":\n return `Rule \"${ruleId}\" score (${currentScore}) aligns with actual difficulty \"${actualDifficulty}\" (expected range: ${range.min} to ${range.max}).`;\n case \"overscored\":\n return `Rule \"${ruleId}\" score (${currentScore}) is too harsh for actual difficulty \"${actualDifficulty}\" (expected range: ${range.min} to ${range.max}).`;\n case \"underscored\":\n return `Rule \"${ruleId}\" score (${currentScore}) is too lenient for actual difficulty \"${actualDifficulty}\" (expected range: ${range.min} to ${range.max}).`;\n case \"missing-rule\":\n return `No rule covers this difficulty \"${actualDifficulty}\" (expected score range: ${range.min} to ${range.max}).`;\n }\n}\n\n/**\n * Merge all node issue summaries into a single virtual summary.\n * Used when whole-design conversion produces a single root record but analysis\n * flags rules on individual child nodes. Without merging, rules only flagged on\n * non-root nodes would be silently dropped from evaluation.\n */\nfunction mergeAllSummaries(\n summaries: Array<{ nodeId: string; nodePath: string; flaggedRuleIds: string[] }>,\n rootNodeId: string,\n rootNodePath: string,\n): { nodeId: string; nodePath: string; flaggedRuleIds: string[] } {\n const allRuleIds = new Set<string>();\n for (const s of summaries) {\n for (const id of s.flaggedRuleIds) {\n allRuleIds.add(id);\n }\n }\n return { nodeId: rootNodeId, nodePath: rootNodePath, flaggedRuleIds: [...allRuleIds] };\n}\n\n/**\n * Evaluation Agent - Step 3 of calibration pipeline\n *\n * Deterministic comparison of analysis results vs conversion results.\n * No LLM required — pure algorithmic evaluation.\n */\nexport function runEvaluationAgent(\n input: EvaluationAgentInput\n): EvaluationAgentOutput {\n const mismatches: MismatchCase[] = [];\n const validatedRuleSet = new Set<string>();\n\n // Build a lookup from nodeId to issue summary\n const nodeSummaryMap = new Map(\n input.nodeIssueSummaries.map((s) => [s.nodeId, s])\n );\n\n for (const record of input.conversionRecords) {\n const summary = input.wholeDesign\n ? mergeAllSummaries(input.nodeIssueSummaries, record.nodeId, record.nodePath)\n : nodeSummaryMap.get(record.nodeId);\n const difficulty = record.difficulty as Difficulty;\n\n // Process rule-related struggles from conversion\n for (const struggle of record.ruleRelatedStruggles) {\n const ruleInfo = input.ruleScores[struggle.ruleId];\n if (!ruleInfo) continue;\n\n const actualDifficulty = struggle.actualImpact as Difficulty;\n const type = classifyFlaggedRule(ruleInfo.score, actualDifficulty);\n\n if (type === \"validated\") {\n validatedRuleSet.add(struggle.ruleId);\n }\n\n mismatches.push({\n type,\n nodeId: record.nodeId,\n nodePath: record.nodePath,\n ruleId: struggle.ruleId,\n currentScore: ruleInfo.score,\n currentSeverity: ruleInfo.severity as Severity,\n actualDifficulty,\n reasoning: buildReasoning(type, struggle.ruleId, ruleInfo.score, actualDifficulty),\n });\n }\n\n // Process flagged rules that had NO struggle reported\n // Not mentioned ≠ overscored. Only classify as overscored when the Converter\n // explicitly reported actualImpact: \"easy\" for this rule. Otherwise validate.\n if (summary) {\n const struggledRuleIds = new Set(\n record.ruleRelatedStruggles.map((s) => s.ruleId)\n );\n\n for (const ruleId of summary.flaggedRuleIds) {\n if (struggledRuleIds.has(ruleId)) continue;\n\n const ruleInfo = input.ruleScores[ruleId];\n if (!ruleInfo) continue;\n\n // Rule was flagged but conversion had no struggle with it — validate conservatively\n validatedRuleSet.add(ruleId);\n mismatches.push({\n type: \"validated\",\n nodeId: record.nodeId,\n nodePath: record.nodePath,\n ruleId,\n currentScore: ruleInfo.score,\n currentSeverity: ruleInfo.severity as Severity,\n actualDifficulty: difficulty,\n reasoning: `Rule \"${ruleId}\" was flagged but not mentioned in conversion struggles (overall: \"${difficulty}\") — validated (no explicit easy signal).`,\n });\n }\n }\n\n // Process uncovered struggles (no existing rule)\n for (const uncovered of record.uncoveredStruggles) {\n const estimatedDifficulty = uncovered.estimatedImpact as Difficulty;\n\n mismatches.push({\n type: \"missing-rule\",\n nodeId: record.nodeId,\n nodePath: record.nodePath,\n actualDifficulty: estimatedDifficulty,\n reasoning: `Uncovered struggle: \"${uncovered.description}\" (category: ${uncovered.suggestedCategory}, impact: ${estimatedDifficulty}).`,\n category: uncovered.suggestedCategory,\n description: uncovered.description,\n });\n }\n }\n\n // Override responsive-critical rule evaluations with measured responsiveDelta\n if (input.responsiveDelta != null) {\n const responsiveDifficulty = responsiveDeltaToDifficulty(input.responsiveDelta);\n for (const mismatch of mismatches) {\n if (!mismatch.ruleId) continue;\n if (!(mismatch.ruleId in RULE_ID_CATEGORY)) continue;\n const category = RULE_ID_CATEGORY[mismatch.ruleId as RuleId];\n if (category !== \"responsive-critical\") continue;\n\n const prevType = mismatch.type;\n const newType = classifyFlaggedRule(mismatch.currentScore ?? 0, responsiveDifficulty);\n mismatch.type = newType;\n mismatch.actualDifficulty = responsiveDifficulty;\n mismatch.reasoning = buildReasoning(newType, mismatch.ruleId, mismatch.currentScore, responsiveDifficulty)\n + ` (responsive: delta=${input.responsiveDelta}%p, overrides AI opinion \"${prevType}\")`;\n\n if (newType === \"validated\") {\n validatedRuleSet.add(mismatch.ruleId);\n } else {\n validatedRuleSet.delete(mismatch.ruleId);\n }\n }\n }\n\n // Override rule evaluations with objective strip ablation deltas\n if (input.stripDeltas) {\n for (const mismatch of mismatches) {\n if (!mismatch.ruleId) continue;\n // Responsive-critical: only apply strip override when size-constraints has a measured\n // responsive delta (#205). Otherwise skip so design-viewport pixel fallback cannot replace\n // baseline page responsiveDelta classification.\n if (mismatch.ruleId in RULE_ID_CATEGORY) {\n const category = RULE_ID_CATEGORY[mismatch.ruleId as RuleId];\n if (\n category === \"responsive-critical\" &&\n !sizeConstraintsStripHasResponsiveMetric(input.stripDeltas)\n ) {\n continue;\n }\n }\n const stripDifficulty = getStripDifficultyForRule(mismatch.ruleId, input.stripDeltas);\n if (!stripDifficulty) continue;\n\n const prevType = mismatch.type;\n const newType = classifyFlaggedRule(mismatch.currentScore ?? 0, stripDifficulty);\n mismatch.type = newType;\n mismatch.actualDifficulty = stripDifficulty;\n mismatch.reasoning = buildReasoning(newType, mismatch.ruleId, mismatch.currentScore, stripDifficulty)\n + ` (strip-ablation: overrides AI opinion \"${prevType}\")`;\n\n if (newType === \"validated\") {\n validatedRuleSet.add(mismatch.ruleId);\n } else {\n validatedRuleSet.delete(mismatch.ruleId);\n }\n }\n }\n\n return {\n mismatches,\n validatedRules: [...validatedRuleSet],\n };\n}\n\n/**\n * Map strip type to related rule IDs.\n * Based on what information each strip type removes and which rules detect those issues.\n */\nfunction sizeConstraintsStripHasResponsiveMetric(\n stripDeltas: Record<string, StripDeltaForEval>,\n): boolean {\n const rd = stripDeltas[\"size-constraints\"]?.responsiveDelta;\n return rd != null && Number.isFinite(rd);\n}\n\nconst STRIP_TYPE_RULES: Record<DesignTreeInfoType, RuleId[]> = {\n \"layout-direction-spacing\": [\"no-auto-layout\", \"absolute-position-in-auto-layout\", \"non-layout-container\", \"irregular-spacing\"],\n \"size-constraints\": [\"missing-size-constraint\", \"fixed-size-in-auto-layout\"],\n \"component-references\": [\"missing-component\", \"detached-instance\", \"variant-structure-mismatch\"],\n \"node-names-hierarchy\": [\"non-standard-naming\", \"non-semantic-name\", \"inconsistent-naming-convention\"],\n \"variable-references\": [\"raw-value\"],\n \"style-references\": [\"raw-value\"],\n};\n\n/**\n * Strip types that should use token delta instead of pixel delta.\n * These represent information whose absence affects token cost/code quality,\n * not pixel accuracy at design viewport.\n */\nconst TOKEN_METRIC_STRIPS = new Set<DesignTreeInfoType>([\n \"component-references\",\n \"node-names-hierarchy\",\n \"variable-references\",\n \"style-references\",\n]);\n\n/**\n * Strip types that should use responsive pixel delta.\n * These represent information whose absence manifests at expanded viewports.\n */\nconst RESPONSIVE_METRIC_STRIPS = new Set<DesignTreeInfoType>([\n \"size-constraints\",\n]);\n\n/**\n * Get the objective strip-based difficulty for a rule.\n * Uses category-appropriate metric per strip type:\n * - layout-direction-spacing → pixel delta\n * - size-constraints → responsive pixel delta\n * - component/naming/variable/style → token delta\n * If multiple strip types affect the same rule, take the worst difficulty.\n */\nfunction getStripDifficultyForRule(\n ruleId: string,\n stripDeltas: Record<string, StripDeltaForEval>,\n): Difficulty | null {\n const difficulties: Difficulty[] = [];\n\n for (const [stripType, ruleIds] of Object.entries(STRIP_TYPE_RULES)) {\n if (!ruleIds.includes(ruleId as RuleId)) continue;\n const data = stripDeltas[stripType];\n if (!data) continue;\n\n const infoType = stripType as DesignTreeInfoType;\n\n if (RESPONSIVE_METRIC_STRIPS.has(infoType)) {\n // size-constraints: use responsive delta if available, fall back to pixel delta\n const delta = data.responsiveDelta ?? data.pixelDelta;\n difficulties.push(stripDeltaToDifficulty(delta));\n } else if (TOKEN_METRIC_STRIPS.has(infoType)) {\n // token-management strips: use token delta if available, fall back to pixel delta\n if (data.baselineInputTokens != null && data.strippedInputTokens != null) {\n difficulties.push(tokenDeltaToDifficulty(data.baselineInputTokens, data.strippedInputTokens));\n } else {\n difficulties.push(stripDeltaToDifficulty(data.pixelDelta));\n }\n } else {\n // layout: use pixel delta\n difficulties.push(stripDeltaToDifficulty(data.pixelDelta));\n }\n }\n\n if (difficulties.length === 0) return null;\n\n // Take worst difficulty (failed > hard > moderate > easy)\n const order: Difficulty[] = [\"easy\", \"moderate\", \"hard\", \"failed\"];\n return difficulties.reduce((worst, d) =>\n order.indexOf(d) > order.indexOf(worst) ? d : worst\n );\n}\n\n/**\n * Map responsiveDelta to difficulty.\n * Based on ablation Experiment 04: structure drops -32%p at different viewport.\n * Higher delta = more responsive breakage = harder to implement.\n */\nfunction responsiveDeltaToDifficulty(delta: number): Difficulty {\n // Negative delta = expanded viewport matches better than original (unusual).\n // Treat as easy — the design is not breaking at wider viewport.\n const d = Math.max(0, delta);\n if (d <= 5) return \"easy\"; // minimal responsive breakage\n if (d <= 15) return \"moderate\"; // noticeable breakage\n if (d <= 30) return \"hard\"; // severe breakage\n return \"failed\"; // completely broken at expanded viewport\n}\n","import type { Severity } from \"../core/contracts/severity.js\";\nimport type { Confidence } from \"./contracts/tuning-agent.js\";\nimport type {\n TuningAgentInput,\n TuningAgentOutput,\n ScoreAdjustment,\n NewRuleProposal,\n} from \"./contracts/tuning-agent.js\";\n\n/**\n * Difficulty-to-score midpoint mapping for proposing new scores\n */\nconst DIFFICULTY_MIDPOINT: Record<string, number> = {\n easy: -2,\n moderate: -5,\n hard: -10,\n failed: -12,\n};\n\n/**\n * Difficulty-to-severity mapping for new rule proposals\n */\nconst DIFFICULTY_SEVERITY: Record<string, Severity> = {\n easy: \"suggestion\",\n moderate: \"risk\",\n hard: \"blocking\",\n failed: \"blocking\",\n};\n\n/**\n * Determine confidence based on number of supporting cases\n */\nfunction getConfidence(caseCount: number): Confidence {\n if (caseCount >= 3) return \"high\";\n if (caseCount >= 2) return \"medium\";\n return \"low\";\n}\n\n/**\n * Score range for worst-case floor clamping\n */\nconst DIFFICULTY_SCORE_MAX: Record<string, number> = {\n easy: 0,\n moderate: -4,\n hard: -8,\n failed: -8,\n};\n\n/**\n * Propose a score based on weighted average of actual difficulties,\n * with a worst-case floor so hard cases aren't drowned out by easy ones.\n */\nfunction proposedScoreFromDifficulties(difficulties: string[]): number {\n if (difficulties.length === 0) return -5;\n\n // Weighted average: Σ(midpoint × count) / total\n let sum = 0;\n let worstFloor = 0;\n for (const d of difficulties) {\n const midpoint = DIFFICULTY_MIDPOINT[d] ?? -5;\n sum += midpoint;\n // Track the harshest floor from any observed difficulty\n const floor = DIFFICULTY_SCORE_MAX[d] ?? -5;\n if (floor < worstFloor) worstFloor = floor;\n }\n\n const weightedAvg = Math.round(sum / difficulties.length);\n\n // Clamp: proposed score must be at least as harsh as the worst observed difficulty's range start\n return Math.min(weightedAvg, worstFloor);\n}\n\n/**\n * Determine if severity should change based on proposed score\n */\nfunction proposeSeverity(\n currentSeverity: Severity,\n proposedScore: number\n): Severity | undefined {\n let expectedSeverity: Severity;\n if (proposedScore <= -8) {\n expectedSeverity = \"blocking\";\n } else if (proposedScore <= -4) {\n expectedSeverity = \"risk\";\n } else if (proposedScore <= -2) {\n expectedSeverity = \"missing-info\";\n } else {\n expectedSeverity = \"suggestion\";\n }\n\n if (expectedSeverity !== currentSeverity) {\n return expectedSeverity;\n }\n return undefined;\n}\n\n/**\n * Tuning Agent - Step 4 of calibration pipeline\n *\n * Deterministic aggregation algorithm. No LLM required.\n * Aggregates mismatch cases into score adjustment proposals.\n */\nexport function runTuningAgent(\n input: TuningAgentInput\n): TuningAgentOutput {\n const adjustments: ScoreAdjustment[] = [];\n const newRuleProposals: NewRuleProposal[] = [];\n\n // Group mismatches by ruleId for overscored and underscored\n const overscoredByRule = new Map<string, typeof input.mismatches>();\n const underscoredByRule = new Map<string, typeof input.mismatches>();\n const missingRuleCases: typeof input.mismatches = [];\n\n for (const mismatch of input.mismatches) {\n switch (mismatch.type) {\n case \"overscored\": {\n if (!mismatch.ruleId) break;\n const existing = overscoredByRule.get(mismatch.ruleId);\n if (existing) {\n existing.push(mismatch);\n } else {\n overscoredByRule.set(mismatch.ruleId, [mismatch]);\n }\n break;\n }\n case \"underscored\": {\n if (!mismatch.ruleId) break;\n const existing = underscoredByRule.get(mismatch.ruleId);\n if (existing) {\n existing.push(mismatch);\n } else {\n underscoredByRule.set(mismatch.ruleId, [mismatch]);\n }\n break;\n }\n case \"missing-rule\":\n missingRuleCases.push(mismatch);\n break;\n }\n }\n\n const prior = input.priorEvidence ?? {};\n\n // Generate score reduction proposals for overscored rules\n // Include rules with prior-only evidence (no current mismatches)\n const allOverscoredRuleIds = new Set([\n ...overscoredByRule.keys(),\n ...Object.keys(prior).filter((id) => {\n const p = prior[id];\n return p && p.overscoredCount > 0 && !overscoredByRule.has(id);\n }),\n ]);\n\n for (const ruleId of allOverscoredRuleIds) {\n const ruleInfo = input.ruleScores[ruleId];\n if (!ruleInfo) continue;\n\n const cases = overscoredByRule.get(ruleId) ?? [];\n const priorData = prior[ruleId];\n const currentDifficulties = cases.map((c) => c.actualDifficulty);\n const priorDifficulties = priorData?.overscoredDifficulties ?? [];\n const allDifficulties = [...currentDifficulties, ...priorDifficulties];\n const totalCases = cases.length + (priorData?.overscoredCount ?? 0);\n\n const proposedScore = proposedScoreFromDifficulties(allDifficulties);\n const currentSeverity = ruleInfo.severity as Severity;\n const newSeverity = proposeSeverity(currentSeverity, proposedScore);\n const priorNote = priorData?.overscoredCount\n ? ` (+ ${priorData.overscoredCount} case(s) from prior runs)`\n : \"\";\n\n // Propose disable when rule converges to zero impact:\n // score already at suggestion floor (-2) + 3+ cases + all easy\n const shouldDisable =\n proposedScore >= -2 &&\n totalCases >= 3 &&\n allDifficulties.every((d) => d === \"easy\");\n\n adjustments.push({\n ruleId,\n currentScore: ruleInfo.score,\n proposedScore,\n currentSeverity,\n proposedSeverity: newSeverity,\n reasoning: shouldDisable\n ? `Converged to zero impact: ${totalCases} case(s) all \"easy\"${priorNote}. Recommend disabling.`\n : `Overscored in ${cases.length} case(s)${priorNote}. Actual difficulties: [${allDifficulties.join(\", \")}]. Current score ${ruleInfo.score} is too harsh.`,\n confidence: getConfidence(totalCases),\n supportingCases: totalCases,\n ...(shouldDisable && { proposedDisable: true }),\n });\n }\n\n // Generate score increase proposals for underscored rules\n // Include rules with prior-only evidence (no current mismatches)\n const allUnderscoredRuleIds = new Set([\n ...underscoredByRule.keys(),\n ...Object.keys(prior).filter((id) => {\n const p = prior[id];\n return p && p.underscoredCount > 0 && !underscoredByRule.has(id);\n }),\n ]);\n\n for (const ruleId of allUnderscoredRuleIds) {\n const ruleInfo = input.ruleScores[ruleId];\n if (!ruleInfo) continue;\n\n const cases = underscoredByRule.get(ruleId) ?? [];\n const priorData = prior[ruleId];\n const currentDifficulties = cases.map((c) => c.actualDifficulty);\n const priorDifficulties = priorData?.underscoredDifficulties ?? [];\n const allDifficulties = [...currentDifficulties, ...priorDifficulties];\n const totalCases = cases.length + (priorData?.underscoredCount ?? 0);\n\n const proposedScore = proposedScoreFromDifficulties(allDifficulties);\n const currentSeverity = ruleInfo.severity as Severity;\n const newSeverity = proposeSeverity(currentSeverity, proposedScore);\n const priorNote = priorData?.underscoredCount\n ? ` (+ ${priorData.underscoredCount} case(s) from prior runs)`\n : \"\";\n\n adjustments.push({\n ruleId,\n currentScore: ruleInfo.score,\n proposedScore,\n currentSeverity,\n proposedSeverity: newSeverity,\n reasoning: `Underscored in ${cases.length} case(s)${priorNote}. Actual difficulties: [${allDifficulties.join(\", \")}]. Current score ${ruleInfo.score} is too lenient.`,\n confidence: getConfidence(totalCases),\n supportingCases: totalCases,\n });\n }\n\n // Generate new rule proposals from missing-rule cases\n // Group by suggestedCategory extracted from reasoning\n const missingGrouped = new Map<string, typeof input.mismatches>();\n\n for (const c of missingRuleCases) {\n const category = c.category ?? \"unknown\";\n\n const existing = missingGrouped.get(category);\n if (existing) {\n existing.push(c);\n } else {\n missingGrouped.set(category, [c]);\n }\n }\n\n for (const [category, cases] of missingGrouped) {\n const difficulties = cases.map((c) => c.actualDifficulty);\n const dominantDifficulty = getDominantDifficulty(difficulties);\n const descriptions = cases.map((c) => c.description ?? c.reasoning);\n\n newRuleProposals.push({\n suggestedId: `new-${category}-rule`,\n category,\n description: descriptions.join(\"; \"),\n suggestedSeverity: DIFFICULTY_SEVERITY[dominantDifficulty] ?? \"risk\",\n suggestedScore: DIFFICULTY_MIDPOINT[dominantDifficulty] ?? -5,\n reasoning: `${cases.length} uncovered struggle(s) in category \"${category}\". Difficulties: [${difficulties.join(\", \")}].`,\n supportingCases: cases.length,\n });\n }\n\n return { adjustments, newRuleProposals };\n}\n\nfunction getDominantDifficulty(difficulties: string[]): string {\n const counts: Record<string, number> = {};\n for (const d of difficulties) {\n counts[d] = (counts[d] ?? 0) + 1;\n }\n\n let dominant = difficulties[0] ?? \"moderate\";\n let maxCount = 0;\n for (const [difficulty, count] of Object.entries(counts)) {\n if (count > maxCount) {\n maxCount = count;\n dominant = difficulty;\n }\n }\n return dominant;\n}\n","import type { ScoreReport } from \"../core/engine/scoring.js\";\nimport type { MismatchCase } from \"./contracts/evaluation-agent.js\";\nimport type { ScoreAdjustment, NewRuleProposal } from \"./contracts/tuning-agent.js\";\n\n/** Data structure for generating calibration report markdown. */\nexport interface CalibrationReportData {\n fileKey: string;\n fileName: string;\n analyzedAt: string;\n nodeCount: number;\n issueCount: number;\n convertedNodeCount: number;\n skippedNodeCount: number;\n scoreReport: ScoreReport;\n mismatches: MismatchCase[];\n validatedRules: string[];\n adjustments: ScoreAdjustment[];\n newRuleProposals: NewRuleProposal[];\n /** Design tree token metrics (optional — present when design-tree stats are available) */\n tokenMetrics?: {\n designTreeTokens: number;\n designTreeBytes: number;\n tokensPerNode: number;\n } | undefined;\n}\n\n/**\n * Generate a CALIBRATION_REPORT.md from calibration pipeline results\n */\nexport function generateCalibrationReport(data: CalibrationReportData): string {\n const lines: string[] = [];\n\n lines.push(\"# Calibration Report\");\n lines.push(\"\");\n lines.push(renderOverview(data));\n lines.push(renderCurrentScores(data));\n lines.push(renderAdjustmentProposals(data.adjustments));\n lines.push(renderNewRuleProposals(data.newRuleProposals));\n lines.push(renderValidatedRules(data.validatedRules));\n lines.push(renderMismatchDetails(data.mismatches));\n lines.push(renderApplicationGuide(data.adjustments));\n\n return lines.join(\"\\n\");\n}\n\nfunction renderOverview(data: CalibrationReportData): string {\n return `## Overview\n\n| Metric | Value |\n|--------|-------|\n| File | ${data.fileName} (${data.fileKey}) |\n| Analyzed At | ${data.analyzedAt} |\n| Total Nodes | ${data.nodeCount} |\n| Total Issues | ${data.issueCount} |\n| Converted Nodes | ${data.convertedNodeCount} |\n| Skipped Nodes | ${data.skippedNodeCount} |\n| Overall Grade | ${data.scoreReport.overall.grade} (${data.scoreReport.overall.percentage}%) |${data.tokenMetrics ? `\n| Design Tree Tokens | ~${data.tokenMetrics.designTreeTokens.toLocaleString()} tokens (${Math.round(data.tokenMetrics.designTreeBytes / 1024)}KB) |\n| Tokens per Node | ~${Math.round(data.tokenMetrics.tokensPerNode)} |` : \"\"}\n`;\n}\n\nfunction renderCurrentScores(data: CalibrationReportData): string {\n const lines: string[] = [];\n lines.push(\"## Current Score Summary\");\n lines.push(\"\");\n lines.push(\"| Category | Score | Issues | Density | Diversity |\");\n lines.push(\"|----------|-------|--------|---------|-----------|\");\n\n for (const [category, catScore] of Object.entries(data.scoreReport.byCategory)) {\n lines.push(\n `| ${category} | ${catScore.percentage}% | ${catScore.issueCount} | ${catScore.densityScore} | ${catScore.diversityScore} |`\n );\n }\n\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nfunction renderAdjustmentProposals(adjustments: ScoreAdjustment[]): string {\n if (adjustments.length === 0) {\n return \"## Score Adjustment Proposals\\n\\nNo adjustments proposed.\\n\";\n }\n\n const lines: string[] = [];\n lines.push(\"## Score Adjustment Proposals\");\n lines.push(\"\");\n lines.push(\"| Rule | Current Score | Proposed Score | Disable? | Severity Change | Confidence | Cases | Reasoning |\");\n lines.push(\"|------|--------------|----------------|----------|-----------------|------------|-------|-----------|\");\n\n for (const adj of adjustments) {\n const severityChange = adj.proposedSeverity\n ? `${adj.currentSeverity} -> ${adj.proposedSeverity}`\n : adj.currentSeverity;\n const disable = adj.proposedDisable ? \"⛔ YES\" : \"\";\n\n lines.push(\n `| ${adj.ruleId} | ${adj.currentScore} | ${adj.proposedScore} | ${disable} | ${severityChange} | ${adj.confidence} | ${adj.supportingCases} | ${adj.reasoning} |`\n );\n }\n\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nfunction renderNewRuleProposals(proposals: NewRuleProposal[]): string {\n if (proposals.length === 0) {\n return \"## New Rule Proposals\\n\\nNo new rules proposed.\\n\";\n }\n\n const lines: string[] = [];\n lines.push(\"## New Rule Proposals\");\n lines.push(\"\");\n\n for (const proposal of proposals) {\n lines.push(`### ${proposal.suggestedId}`);\n lines.push(\"\");\n lines.push(`- **Category**: ${proposal.category}`);\n lines.push(`- **Suggested Severity**: ${proposal.suggestedSeverity}`);\n lines.push(`- **Suggested Score**: ${proposal.suggestedScore}`);\n lines.push(`- **Supporting Cases**: ${proposal.supportingCases}`);\n lines.push(`- **Description**: ${proposal.description}`);\n lines.push(`- **Reasoning**: ${proposal.reasoning}`);\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction renderValidatedRules(validatedRules: string[]): string {\n if (validatedRules.length === 0) {\n return \"## Validated Rules\\n\\nNo rules were validated in this run.\\n\";\n }\n\n const lines: string[] = [];\n lines.push(\"## Validated Rules\");\n lines.push(\"\");\n lines.push(\"The following rules had scores that aligned with actual conversion difficulty:\");\n lines.push(\"\");\n\n for (const ruleId of validatedRules) {\n lines.push(`- \\`${ruleId}\\``);\n }\n\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nfunction renderMismatchDetails(mismatches: MismatchCase[]): string {\n if (mismatches.length === 0) {\n return \"## Detailed Mismatch List\\n\\nNo mismatches found.\\n\";\n }\n\n const lines: string[] = [];\n lines.push(\"## Detailed Mismatch List\");\n lines.push(\"\");\n\n const grouped: Record<string, MismatchCase[]> = {};\n for (const m of mismatches) {\n const list = grouped[m.type];\n if (list) {\n list.push(m);\n } else {\n grouped[m.type] = [m];\n }\n }\n\n for (const [type, cases] of Object.entries(grouped)) {\n lines.push(`### ${type} (${cases.length})`);\n lines.push(\"\");\n\n for (const c of cases) {\n const ruleInfo = c.ruleId ? ` | Rule: \\`${c.ruleId}\\`` : \"\";\n const scoreInfo = c.currentScore !== undefined ? ` | Score: ${c.currentScore}` : \"\";\n lines.push(`- **${c.nodePath}** (${c.nodeId})${ruleInfo}${scoreInfo} | Difficulty: ${c.actualDifficulty}`);\n lines.push(` > ${c.reasoning}`);\n }\n\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction renderApplicationGuide(adjustments: ScoreAdjustment[]): string {\n const lines: string[] = [];\n lines.push(\"## Application Guide\");\n lines.push(\"\");\n lines.push(\"To apply these calibration results:\");\n lines.push(\"\");\n lines.push(\"1. Review each adjustment proposal above\");\n lines.push(\"2. Edit `src/core/rules/rule-config.ts` to update scores and severities\");\n lines.push(\"3. Run `pnpm test:run` to verify no tests break\");\n lines.push(\"4. Re-run calibration to confirm improvements\");\n lines.push(\"\");\n\n if (adjustments.length > 0) {\n lines.push(\"### Suggested Changes to `rule-config.ts`\");\n lines.push(\"\");\n lines.push(\"```typescript\");\n\n for (const adj of adjustments) {\n if (adj.proposedDisable) {\n lines.push(`// ${adj.ruleId}: DISABLE (${adj.confidence} confidence, ${adj.supportingCases} cases)`);\n lines.push(`// enabled: false`);\n } else {\n lines.push(`// ${adj.ruleId}: ${adj.currentScore} -> ${adj.proposedScore} (${adj.confidence} confidence)`);\n }\n if (adj.proposedSeverity && !adj.proposedDisable) {\n lines.push(`// severity: \"${adj.currentSeverity}\" -> \"${adj.proposedSeverity}\"`);\n }\n }\n\n lines.push(\"```\");\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n","import { z } from \"zod\";\n\n// --- Calibration evidence ---\n\nexport const CalibrationEvidenceEntrySchema = z.object({\n ruleId: z.string(),\n type: z.enum([\"overscored\", \"underscored\"]),\n actualDifficulty: z.string(),\n fixture: z.string(),\n timestamp: z.string(),\n // Phase 1 fields (#144) — optional for backward compatibility with existing evidence\n confidence: z.enum([\"high\", \"medium\", \"low\"]).optional(),\n pro: z.array(z.string()).optional(),\n con: z.array(z.string()).optional(),\n decision: z.enum([\"APPROVE\", \"REJECT\", \"REVISE\", \"HOLD\"]).optional(),\n});\n\nexport type CalibrationEvidenceEntry = z.infer<typeof CalibrationEvidenceEntrySchema>;\n\nexport const CrossRunEvidenceGroupSchema = z.object({\n overscoredCount: z.number(),\n underscoredCount: z.number(),\n overscoredDifficulties: z.array(z.string()),\n underscoredDifficulties: z.array(z.string()),\n // Aggregated pro/con from all entries for this rule\n allPro: z.array(z.string()).optional(),\n allCon: z.array(z.string()).optional(),\n lastConfidence: z.enum([\"high\", \"medium\", \"low\"]).optional(),\n lastDecision: z.enum([\"APPROVE\", \"REJECT\", \"REVISE\", \"HOLD\"]).optional(),\n});\n\nexport type CrossRunEvidenceGroup = z.infer<typeof CrossRunEvidenceGroupSchema>;\n\nexport type CrossRunEvidence = Record<string, CrossRunEvidenceGroup>;\n\n// --- Evidence ratio summary (deterministic pre-computation for Critic) ---\n\nexport const EvidenceRatioSummarySchema = z.object({\n totalSamples: z.number(),\n overscoredCount: z.number(),\n underscoredCount: z.number(),\n overscoredRate: z.number(),\n underscoredRate: z.number(),\n dominantDirection: z.enum([\"overscored\", \"underscored\", \"mixed\"]),\n dominantRate: z.number(),\n expectedDifficulty: z.string(),\n confidence: z.enum([\"high\", \"medium\", \"low\", \"insufficient\"]),\n summary: z.string(),\n});\n\nexport type EvidenceRatioSummary = z.infer<typeof EvidenceRatioSummarySchema>;\n\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport {\n CalibrationEvidenceEntrySchema,\n} from \"./contracts/evidence.js\";\nimport type {\n CalibrationEvidenceEntry,\n CrossRunEvidence,\n CrossRunEvidenceGroup,\n EvidenceRatioSummary,\n} from \"./contracts/evidence.js\";\n\nexport type { CalibrationEvidenceEntry, CrossRunEvidence, CrossRunEvidenceGroup, EvidenceRatioSummary };\n\nconst DEFAULT_CALIBRATION_PATH = resolve(\"data/calibration-evidence.json\");\n\nfunction readValidatedArray<T>(\n filePath: string,\n schema: { safeParse: (v: unknown) => { success: boolean; data?: T } }\n): T[] {\n if (!existsSync(filePath)) return [];\n try {\n const raw = JSON.parse(readFileSync(filePath, \"utf-8\")) as unknown;\n if (!Array.isArray(raw)) return [];\n const result: T[] = [];\n for (const item of raw) {\n const parsed = schema.safeParse(item);\n if (parsed.success && parsed.data !== undefined) {\n result.push(parsed.data);\n }\n }\n return result;\n } catch {\n return [];\n }\n}\n\nfunction writeJsonArray<T>(filePath: string, data: T[]): void {\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(filePath, JSON.stringify(data, null, 2) + \"\\n\", \"utf-8\");\n}\n\n/**\n * Load calibration evidence and group by ruleId for the tuning agent.\n */\nexport function loadCalibrationEvidence(\n evidencePath: string = DEFAULT_CALIBRATION_PATH\n): CrossRunEvidence {\n const entries = readValidatedArray(evidencePath, CalibrationEvidenceEntrySchema);\n const result: CrossRunEvidence = {};\n\n for (const entry of entries) {\n let group = result[entry.ruleId];\n if (!group) {\n group = {\n overscoredCount: 0,\n underscoredCount: 0,\n overscoredDifficulties: [],\n underscoredDifficulties: [],\n allPro: [],\n allCon: [],\n };\n result[entry.ruleId] = group;\n }\n\n if (entry.type === \"overscored\") {\n group.overscoredCount++;\n group.overscoredDifficulties.push(entry.actualDifficulty);\n } else {\n group.underscoredCount++;\n group.underscoredDifficulties.push(entry.actualDifficulty);\n }\n\n // Aggregate pro/con from enriched entries (deduplicated)\n if (entry.pro) {\n group.allPro ??= [];\n for (const p of entry.pro) {\n if (!group.allPro.includes(p)) group.allPro.push(p);\n }\n }\n if (entry.con) {\n group.allCon ??= [];\n for (const c of entry.con) {\n if (!group.allCon.includes(c)) group.allCon.push(c);\n }\n }\n // Keep last confidence/decision (most recent entry wins)\n if (entry.confidence) group.lastConfidence = entry.confidence;\n if (entry.decision) group.lastDecision = entry.decision;\n }\n\n return result;\n}\n\n/**\n * Minimum sample size before ratio-based confidence kicks in.\n * Below this threshold, confidence is \"insufficient\".\n * Lowered from 3→2: strip ablation deltas provide objective signal,\n * so fewer fixtures are needed for convergence (#194).\n */\nconst MIN_RATIO_SAMPLES = 2;\n\n/**\n * Difficulty dominance: pick the most frequent difficulty from a list.\n */\nfunction dominantDifficulty(difficulties: string[]): string {\n if (difficulties.length === 0) return \"moderate\";\n const counts: Record<string, number> = {};\n for (const d of difficulties) {\n counts[d] = (counts[d] ?? 0) + 1;\n }\n let best = difficulties[0]!;\n let bestCount = 0;\n for (const [d, c] of Object.entries(counts)) {\n if (c > bestCount) {\n bestCount = c;\n best = d;\n }\n }\n return best;\n}\n\n/**\n * Compute a deterministic ratio summary from cross-run evidence for a single rule.\n * This pre-digests contradictory evidence into a clear signal so the Critic\n * doesn't have to do statistics — it just reads the conclusion.\n */\nexport function computeEvidenceRatio(group: CrossRunEvidenceGroup): EvidenceRatioSummary {\n const total = group.overscoredCount + group.underscoredCount;\n\n if (total === 0) {\n return {\n totalSamples: 0,\n overscoredCount: 0,\n underscoredCount: 0,\n overscoredRate: 0,\n underscoredRate: 0,\n dominantDirection: \"mixed\",\n dominantRate: 0,\n expectedDifficulty: \"moderate\",\n confidence: \"insufficient\",\n summary: \"No evidence available.\",\n };\n }\n\n const overscoredRate = group.overscoredCount / total;\n const underscoredRate = group.underscoredCount / total;\n\n // Determine dominant direction\n let dir: \"overscored\" | \"underscored\" | \"mixed\";\n let dominantRate: number;\n if (overscoredRate >= 0.6) {\n dir = \"overscored\";\n dominantRate = overscoredRate;\n } else if (underscoredRate >= 0.6) {\n dir = \"underscored\";\n dominantRate = underscoredRate;\n } else {\n dir = \"mixed\";\n dominantRate = Math.max(overscoredRate, underscoredRate);\n }\n\n // Expected difficulty from the dominant direction's difficulties\n const relevantDifficulties =\n dir === \"underscored\"\n ? group.underscoredDifficulties\n : dir === \"overscored\"\n ? group.overscoredDifficulties\n : [...group.overscoredDifficulties, ...group.underscoredDifficulties];\n const expectedDiff = dominantDifficulty(relevantDifficulties);\n\n // Confidence based on sample size + dominance clarity\n let confidence: \"high\" | \"medium\" | \"low\" | \"insufficient\";\n if (total < MIN_RATIO_SAMPLES) {\n confidence = \"insufficient\";\n } else if (dominantRate >= 0.7 && total >= 3) {\n confidence = \"high\";\n } else if (dominantRate >= 0.6 && total >= MIN_RATIO_SAMPLES) {\n confidence = \"medium\";\n } else {\n confidence = \"low\";\n }\n\n // Human-readable summary\n const pct = (r: number) => `${Math.round(r * 100)}%`;\n let summary: string;\n if (dir === \"mixed\") {\n summary = `Mixed signals: ${group.overscoredCount} overscored (${pct(overscoredRate)}) vs ${group.underscoredCount} underscored (${pct(underscoredRate)}) across ${total} fixtures. No clear direction.`;\n } else {\n summary = `${total} fixtures: ${dir} in ${dir === \"overscored\" ? group.overscoredCount : group.underscoredCount}/${total} (${pct(dominantRate)}). Expected difficulty: ${expectedDiff}. Confidence: ${confidence}.`;\n }\n\n return {\n totalSamples: total,\n overscoredCount: group.overscoredCount,\n underscoredCount: group.underscoredCount,\n overscoredRate: Math.round(overscoredRate * 1000) / 1000,\n underscoredRate: Math.round(underscoredRate * 1000) / 1000,\n dominantDirection: dir,\n dominantRate: Math.round(dominantRate * 1000) / 1000,\n expectedDifficulty: expectedDiff,\n confidence,\n summary,\n };\n}\n\n/**\n * Append new calibration evidence entries (overscored/underscored mismatches).\n *\n * Dedup policy: one entry per (ruleId, fixture) — last-write-wins within and across calls.\n * This is intentional: with strip-ablation (#194) each rule gets one objective delta per fixture,\n * so multiple entries for the same (ruleId, fixture) would be redundant.\n * Cross-run confidence in `computeEvidenceRatio` counts entries (=fixtures), not occurrences.\n */\nexport function appendCalibrationEvidence(\n entries: CalibrationEvidenceEntry[],\n evidencePath: string = DEFAULT_CALIBRATION_PATH\n): void {\n if (entries.length === 0) return;\n const existing = readValidatedArray(evidencePath, CalibrationEvidenceEntrySchema);\n // Same batch can repeat (ruleId, fixture); last entry wins (matches cross-call behavior)\n // Normalize ruleId/fixture to prevent bucket splitting from whitespace differences\n const incomingByKey = new Map<string, CalibrationEvidenceEntry>();\n for (const e of entries) {\n const normalized = { ...e, ruleId: e.ruleId.trim(), fixture: e.fixture.trim() };\n const k = `${normalized.ruleId}\\0${normalized.fixture}`;\n incomingByKey.set(k, normalized);\n }\n const mergedIncoming = [...incomingByKey.values()];\n const keys = new Set(incomingByKey.keys());\n const withoutDupes = existing.filter(\n (e) => !keys.has(`${e.ruleId.trim()}\\0${e.fixture.trim()}`),\n );\n withoutDupes.push(...mergedIncoming);\n writeJsonArray(evidencePath, withoutDupes);\n}\n\n/**\n * Remove entries for rules whose scores were applied/revised by the Arbitrator.\n * Prunes all fixtures for the given ruleIds — score changes are global.\n */\nexport function pruneCalibrationEvidence(\n appliedRuleIds: string[],\n evidencePath: string = DEFAULT_CALIBRATION_PATH\n): void {\n if (appliedRuleIds.length === 0) return;\n const ruleSet = new Set(appliedRuleIds.map((id) => id.trim()).filter((id) => id.length > 0));\n const existing = readValidatedArray(evidencePath, CalibrationEvidenceEntrySchema);\n const pruned = existing.filter((e) => !ruleSet.has(e.ruleId.trim()));\n writeJsonArray(evidencePath, pruned);\n}\n\n/**\n * Enrich existing calibration evidence entries with Critic's structured review data.\n * Matches by (ruleId, fixture) to avoid overwriting entries from other fixtures.\n * Entries without a matching review are left unchanged.\n */\nexport function enrichCalibrationEvidence(\n reviews: Array<{\n ruleId: string;\n confidence?: \"high\" | \"medium\" | \"low\";\n pro?: string[];\n con?: string[];\n decision?: \"APPROVE\" | \"REJECT\" | \"REVISE\" | \"HOLD\";\n }>,\n fixture: string,\n evidencePath: string = DEFAULT_CALIBRATION_PATH\n): void {\n if (reviews.length === 0) return;\n const existing = readValidatedArray(evidencePath, CalibrationEvidenceEntrySchema);\n if (existing.length === 0) return;\n\n const reviewByRule = new Map(reviews.map((r) => [r.ruleId.trim(), r]));\n const fixtureTrimmed = fixture.trim();\n\n let matchCount = 0;\n const enriched = existing.map((entry) => {\n if (entry.fixture.trim() !== fixtureTrimmed) return entry;\n const review = reviewByRule.get(entry.ruleId.trim());\n if (!review) return entry;\n matchCount++;\n return {\n ...entry,\n ...(review.confidence && { confidence: review.confidence }),\n ...(review.pro && { pro: review.pro }),\n ...(review.con && { con: review.con }),\n ...(review.decision && { decision: review.decision }),\n };\n });\n\n if (matchCount === 0) {\n console.warn(`[enrich] No entries matched fixture=\"${fixture}\" — evidence unchanged`);\n return;\n }\n writeJsonArray(evidencePath, enriched);\n}\n\n","import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { randomUUID } from \"node:crypto\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nconst AIREADY_DIR = join(homedir(), \".canicode\");\nconst CONFIG_PATH = join(AIREADY_DIR, \"config.json\");\nconst REPORTS_DIR = join(AIREADY_DIR, \"reports\");\n\ninterface AireadyConfig {\n figmaToken?: string;\n telemetry?: boolean;\n posthogApiKey?: string;\n sentryDsn?: string;\n deviceId?: string;\n}\n\nfunction hardenPermissions(path: string, mode: number): void {\n if (process.platform !== \"win32\") {\n chmodSync(path, mode);\n }\n}\n\nfunction ensureDir(dir: string): void {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true, mode: 0o700 });\n }\n hardenPermissions(dir, 0o700);\n}\n\nexport function readConfig(): AireadyConfig {\n if (!existsSync(CONFIG_PATH)) {\n return {};\n }\n try {\n const raw = readFileSync(CONFIG_PATH, \"utf-8\");\n return JSON.parse(raw) as AireadyConfig;\n } catch {\n return {};\n }\n}\n\nexport function writeConfig(config: AireadyConfig): void {\n ensureDir(AIREADY_DIR);\n writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2) + \"\\n\", {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n hardenPermissions(CONFIG_PATH, 0o600);\n}\n\nexport function getFigmaToken(): string | undefined {\n // Priority: env var > config file\n return process.env[\"FIGMA_TOKEN\"] ?? readConfig().figmaToken;\n}\n\nexport function setFigmaToken(token: string): void {\n const config = readConfig();\n config.figmaToken = token;\n writeConfig(config);\n}\n\nexport function hasConfig(): boolean {\n return existsSync(CONFIG_PATH);\n}\n\nexport function getConfigPath(): string {\n return CONFIG_PATH;\n}\n\nexport function getReportsDir(): string {\n return REPORTS_DIR;\n}\n\nexport function ensureReportsDir(): void {\n ensureDir(AIREADY_DIR);\n ensureDir(REPORTS_DIR);\n}\n\nexport function getTelemetryEnabled(): boolean {\n return readConfig().telemetry !== false;\n}\n\nexport function setTelemetryEnabled(enabled: boolean): void {\n const config = readConfig();\n config.telemetry = enabled;\n writeConfig(config);\n}\n\nexport function getPosthogApiKey(): string | undefined {\n return process.env[\"POSTHOG_API_KEY\"] ?? readConfig().posthogApiKey;\n}\n\nexport function getSentryDsn(): string | undefined {\n return process.env[\"SENTRY_DSN\"] ?? readConfig().sentryDsn;\n}\n\n/**\n * Get or create a stable anonymous device ID for telemetry.\n * Stored in ~/.canicode/config.json, persists across sessions.\n */\nexport function getDeviceId(): string {\n const config = readConfig();\n if (config.deviceId) return config.deviceId;\n\n const id = randomUUID();\n config.deviceId = id;\n writeConfig(config);\n return id;\n}\n\n/**\n * Initialize canicode: write config + create reports dir\n */\nexport function initAiready(token: string): void {\n setFigmaToken(token);\n ensureReportsDir();\n}\n","import { existsSync, statSync } from \"node:fs\";\nimport { resolve, join } from \"node:path\";\nimport { FigmaClient } from \"../adapters/figma-client.js\";\nimport { resolveComponentDefinitions, resolveInteractionDestinations } from \"../adapters/component-resolver.js\";\nimport { loadFigmaFileFromJson } from \"../adapters/figma-file-loader.js\";\nimport { transformFigmaResponse, transformFileNodesResponse } from \"../adapters/figma-transformer.js\";\nimport { parseFigmaUrl } from \"../adapters/figma-url-parser.js\";\nimport { getFigmaToken } from \"./config-store.js\";\nimport type { AnalysisFile } from \"../contracts/figma-node.js\";\n\nexport interface LoadResult {\n file: AnalysisFile;\n nodeId?: string | undefined;\n}\n\n/** Check if input string is a Figma URL. */\nexport function isFigmaUrl(input: string): boolean {\n return input.includes(\"figma.com/\");\n}\n\n/** Check if input string is a JSON file path. */\nexport function isJsonFile(input: string): boolean {\n return input.endsWith(\".json\");\n}\n\n/**\n * Check if input is a fixture directory (contains data.json).\n */\nexport function isFixtureDir(input: string): boolean {\n const resolved = resolve(input);\n if (!existsSync(resolved)) return false;\n try {\n if (!statSync(resolved).isDirectory()) return false;\n } catch {\n return false;\n }\n return existsSync(join(resolved, \"data.json\"));\n}\n\n/**\n * Resolve fixture input to data.json path.\n * Input: fixtures/name/ or fixtures/name → fixtures/name/data.json\n */\nexport function resolveFixturePath(input: string): string {\n if (isJsonFile(input)) return resolve(input);\n return resolve(join(input, \"data.json\"));\n}\n\n/**\n * Load a Figma file from a URL, JSON file, or fixture directory.\n * Resolves component master node trees for accurate analysis.\n */\nexport async function loadFile(\n input: string,\n token?: string,\n): Promise<LoadResult> {\n if (isJsonFile(input) || isFixtureDir(input)) {\n const filePath = resolveFixturePath(input);\n if (!existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n console.error(`Loading from JSON: ${filePath}`);\n return { file: await loadFigmaFileFromJson(filePath) };\n }\n\n if (isFigmaUrl(input)) {\n const { fileKey, nodeId } = parseFigmaUrl(input);\n return loadFromApi(fileKey, nodeId, token);\n }\n\n throw new Error(\n `Invalid input: ${input}. Provide a Figma URL or fixture directory path.`\n );\n}\n\nasync function loadFromApi(\n fileKey: string,\n nodeId: string | undefined,\n token?: string\n): Promise<LoadResult> {\n console.error(`Fetching from Figma REST API: ${fileKey}`);\n if (nodeId) {\n console.error(`Target node: ${nodeId}`);\n }\n\n const figmaToken = token ?? getFigmaToken();\n if (!figmaToken) {\n throw new Error(\n \"Figma token required. Run 'canicode init --token YOUR_TOKEN' or set FIGMA_TOKEN env var.\"\n );\n }\n\n const client = new FigmaClient({ token: figmaToken });\n\n if (nodeId) {\n // Fetch only the target node subtree — faster, less rate limit impact\n const response = await client.getFileNodes(fileKey, [nodeId.replace(/-/g, \":\")]);\n const file = transformFileNodesResponse(fileKey, response);\n\n // Resolve component master node trees for accurate analysis\n const componentDefs = await resolveComponentDefinitions(client, fileKey, file.document);\n if (Object.keys(componentDefs).length > 0) {\n file.componentDefinitions = componentDefs;\n }\n\n // Resolve interaction destination nodes (e.g., hover variants)\n const interactionDests = await resolveInteractionDestinations(client, fileKey, file.document, file.componentDefinitions);\n if (Object.keys(interactionDests).length > 0) {\n file.interactionDestinations = interactionDests;\n }\n\n return { file, nodeId };\n }\n\n const response = await client.getFile(fileKey);\n const file = transformFigmaResponse(fileKey, response);\n\n // Full file fetch may still miss component masters from external libraries\n const componentDefs = await resolveComponentDefinitions(client, fileKey, file.document);\n if (Object.keys(componentDefs).length > 0) {\n file.componentDefinitions = componentDefs;\n }\n\n // Resolve interaction destination nodes (e.g., hover variants)\n const interactionDests = await resolveInteractionDestinations(client, fileKey, file.document, file.componentDefinitions);\n if (Object.keys(interactionDests).length > 0) {\n file.interactionDestinations = interactionDests;\n }\n\n return { file, nodeId };\n}\n","import type { AnalysisFile, AnalysisNode, AnalysisNodeType } from \"../core/contracts/figma-node.js\";\nimport { analyzeFile } from \"../core/engine/rule-engine.js\";\nimport { RULE_CONFIGS } from \"../core/rules/rule-config.js\";\n\nimport type { CalibrationConfigInput } from \"./contracts/calibration.js\";\nimport { StripDeltasArraySchema, RuleImpactAssessmentSchema, UncoveredStrugglesInputSchema } from \"./contracts/conversion-agent.js\";\nimport { CalibrationConfigSchema } from \"./contracts/calibration.js\";\nimport type { NodeIssueSummary } from \"./contracts/analysis-agent.js\";\nimport type { ScoreReport } from \"../core/engine/scoring.js\";\n\nimport { runAnalysisAgent, extractRuleScores } from \"./analysis-agent.js\";\nimport { runEvaluationAgent } from \"./evaluation-agent.js\";\nimport { runTuningAgent } from \"./tuning-agent.js\";\nimport { generateCalibrationReport } from \"./report-generator.js\";\nimport {\n loadCalibrationEvidence,\n appendCalibrationEvidence,\n} from \"./evidence-collector.js\";\nimport type { CalibrationEvidenceEntry } from \"./evidence-collector.js\";\n\n/**\n * Normalize Converter's actualImpact (none/low/medium/high) to Difficulty enum (easy/moderate/hard/failed).\n * Falls back to \"moderate\" for unknown values.\n */\nfunction normalizeActualImpact(impact: string): string {\n const mapping: Record<string, string> = {\n none: \"easy\",\n low: \"easy\",\n easy: \"easy\",\n medium: \"moderate\",\n moderate: \"moderate\",\n high: \"hard\",\n hard: \"hard\",\n failed: \"failed\",\n };\n return mapping[impact] ?? \"moderate\";\n}\n\n/**\n * Calibration tier thresholds (percentage-based).\n * - \"full\": Converter + Measurements + Gap Analysis\n * - \"visual-only\": Converter + Measurements (Gap Analysis skipped)\n */\nexport const CALIBRATION_TIER_THRESHOLDS = {\n full: 90, // A or higher\n visualOnly: 0, // everything else — always run Converter\n} as const;\n\nexport type CalibrationTier = \"full\" | \"visual-only\";\n\n/**\n * Determine calibration tier from analysis percentage.\n */\nexport function determineCalibrationTier(percentage: number): CalibrationTier {\n if (percentage >= CALIBRATION_TIER_THRESHOLDS.full) return \"full\";\n return \"visual-only\";\n}\n\n/**\n * Map visual-compare similarity percentage to conversion difficulty.\n * Used by Converter and Evaluation agents.\n */\nexport const SIMILARITY_DIFFICULTY_THRESHOLDS = {\n easy: 90,\n moderate: 70,\n hard: 50,\n} as const;\n\nexport type ConversionDifficulty = \"easy\" | \"moderate\" | \"hard\" | \"failed\";\n\nexport function similarityToDifficulty(similarity: number): ConversionDifficulty {\n if (similarity >= SIMILARITY_DIFFICULTY_THRESHOLDS.easy) return \"easy\";\n if (similarity >= SIMILARITY_DIFFICULTY_THRESHOLDS.moderate) return \"moderate\";\n if (similarity >= SIMILARITY_DIFFICULTY_THRESHOLDS.hard) return \"hard\";\n return \"failed\";\n}\n\n/**\n * Node types that are pure graphics — not useful for code conversion\n */\nconst EXCLUDED_NODE_TYPES: Set<AnalysisNodeType> = new Set([\n \"VECTOR\",\n \"BOOLEAN_OPERATION\",\n \"STAR\",\n \"REGULAR_POLYGON\",\n \"ELLIPSE\",\n \"LINE\",\n]);\n\n/**\n * Find a node by ID in the tree\n */\nfunction findNode(root: AnalysisNode, nodeId: string): AnalysisNode | null {\n if (root.id === nodeId) return root;\n if (root.children) {\n for (const child of root.children) {\n const found = findNode(child, nodeId);\n if (found) return found;\n }\n }\n return null;\n}\n\n/**\n * Check if a subtree contains at least one TEXT node\n */\nfunction hasTextDescendant(node: AnalysisNode): boolean {\n if (node.type === \"TEXT\") return true;\n if (node.children) {\n for (const child of node.children) {\n if (hasTextDescendant(child)) return true;\n }\n }\n return false;\n}\n\n/**\n * Minimum dimensions for conversion candidates\n */\nconst MIN_WIDTH = 200;\nconst MIN_HEIGHT = 200;\nconst FILTER_THRESHOLD = 500;\n\n/**\n * Node types eligible for code conversion\n */\nconst ELIGIBLE_NODE_TYPES: Set<AnalysisNodeType> = new Set([\n \"FRAME\",\n \"COMPONENT\",\n \"INSTANCE\",\n]);\n\nimport { isExcludedName } from \"../core/rules/node-semantics.js\";\n\n/**\n * Filter node summaries to meaningful conversion candidates.\n *\n * If summaries.length <= FILTER_THRESHOLD (500), all nodes pass (typical page size).\n * Otherwise, inclusion criteria:\n * - type is FRAME, COMPONENT, or INSTANCE\n * - width >= 200 AND height >= 200\n * - 3+ direct children\n * - at least one TEXT descendant (excludes pure icons/graphics)\n *\n * Exclusion criteria:\n * - pure graphic types (VECTOR, BOOLEAN_OPERATION, etc.)\n * - name contains \"icon\", \"ico\", \"badge\", or \"indicator\"\n */\nexport function filterConversionCandidates(\n summaries: NodeIssueSummary[],\n documentRoot: AnalysisNode\n): NodeIssueSummary[] {\n // Always exclude invisible nodes — can't screenshot for visual comparison\n const visibleSummaries = summaries.filter((summary) => {\n const node = findNode(documentRoot, summary.nodeId);\n return node ? node.visible !== false : false;\n });\n\n // Small trees: skip further filtering\n if (visibleSummaries.length <= FILTER_THRESHOLD) return visibleSummaries;\n\n // Large trees: filter to meaningful conversion candidates\n return visibleSummaries.filter((summary) => {\n const node = findNode(documentRoot, summary.nodeId);\n if (!node) return false;\n\n // Exclude pure graphic node types\n if (EXCLUDED_NODE_TYPES.has(node.type)) return false;\n\n // Only allow FRAME, COMPONENT, INSTANCE\n if (!ELIGIBLE_NODE_TYPES.has(node.type)) return false;\n\n // Exclude decorative/structural/overlay nodes by name\n if (isExcludedName(node.name)) return false;\n\n // Require minimum dimensions\n const bbox = node.absoluteBoundingBox;\n if (bbox && (bbox.width < MIN_WIDTH || bbox.height < MIN_HEIGHT)) return false;\n\n // Require 3+ direct children\n if (!node.children || node.children.length < 3) return false;\n\n // Require at least one TEXT descendant\n if (!hasTextDescendant(node)) return false;\n\n return true;\n });\n}\n\n// Reuse loader from core engine\nimport { loadFile as coreLoadFile } from \"../core/engine/loader.js\";\n\nasync function loadFile(\n input: string,\n token?: string\n): Promise<{ file: AnalysisFile; fileKey: string; nodeId: string | undefined }> {\n const { file, nodeId } = await coreLoadFile(input, token);\n return { file, fileKey: file.fileKey, nodeId };\n}\n\n/**\n * Build rule scores map from RULE_CONFIGS\n */\nfunction buildRuleScoresMap(): Record<string, { score: number; severity: string }> {\n const scores: Record<string, { score: number; severity: string }> = {};\n for (const [id, config] of Object.entries(RULE_CONFIGS)) {\n scores[id] = { score: config.score, severity: config.severity };\n }\n return scores;\n}\n\n/**\n * Run Step 1 only: analysis + save JSON output\n */\nexport async function runCalibrationAnalyze(\n config: CalibrationConfigInput\n): Promise<{\n analysisOutput: ReturnType<typeof runAnalysisAgent> extends infer T ? T : never;\n ruleScores: Record<string, { score: number; severity: string }>;\n fileKey: string;\n}> {\n const parsed = CalibrationConfigSchema.parse(config);\n const { file, fileKey, nodeId } = await loadFile(parsed.input, parsed.token);\n\n const analyzeOptions = {\n ...(nodeId ? { targetNodeId: nodeId } : {}),\n ...(parsed.scope ? { scope: parsed.scope } : {}),\n };\n const analysisResult = analyzeFile(file, analyzeOptions);\n\n const analysisOutput = runAnalysisAgent({ analysisResult });\n const ruleScores = {\n ...buildRuleScoresMap(),\n ...extractRuleScores(analysisResult),\n };\n\n return { analysisOutput, ruleScores, fileKey };\n}\n\n/**\n * Run Steps 3+4: evaluation + tuning from pre-computed analysis and conversion data\n */\nexport function runCalibrationEvaluate(\n analysisJson: {\n nodeIssueSummaries: NodeIssueSummary[];\n scoreReport: ScoreReport;\n fileKey: string;\n fileName: string;\n analyzedAt: string;\n nodeCount: number;\n issueCount: number;\n },\n conversionJson: Record<string, unknown>,\n ruleScores: Record<string, { score: number; severity: string }>,\n options?: { collectEvidence?: boolean | undefined; fixtureName?: string | undefined }\n) {\n // Support both formats:\n // Old: { records: [...], skippedNodeIds: [...] }\n // New: { rootNodeId, similarity, ruleImpactAssessment: [...], uncoveredStruggles: [...] }\n let conversionRecords: Array<{\n nodeId: string;\n nodePath: string;\n difficulty: string;\n ruleRelatedStruggles: Array<{ ruleId: string; description: string; actualImpact: string }>;\n uncoveredStruggles: Array<{ description: string; suggestedCategory: string; estimatedImpact: string }>;\n }>;\n let wholeDesign = false;\n\n if (Array.isArray(conversionJson[\"records\"])) {\n // Old per-node format\n conversionRecords = conversionJson[\"records\"] as typeof conversionRecords;\n } else {\n // New whole-design format — Zod-validate before use\n const assessmentParsed = RuleImpactAssessmentSchema.safeParse(conversionJson[\"ruleImpactAssessment\"]);\n if (assessmentParsed.success && assessmentParsed.data.length > 0) {\n wholeDesign = true;\n const assessment = assessmentParsed.data;\n const strugglesParsed = UncoveredStrugglesInputSchema.safeParse(conversionJson[\"uncoveredStruggles\"]);\n const struggles = strugglesParsed.success ? strugglesParsed.data : [];\n conversionRecords = [{\n nodeId: typeof conversionJson[\"rootNodeId\"] === \"string\" ? conversionJson[\"rootNodeId\"] : \"root\",\n nodePath: \"root\",\n difficulty: typeof conversionJson[\"difficulty\"] === \"string\" ? conversionJson[\"difficulty\"] : \"moderate\",\n ruleRelatedStruggles: assessment.map(a => ({\n ruleId: a.ruleId,\n description: a.description,\n actualImpact: normalizeActualImpact(a.actualImpact),\n })),\n uncoveredStruggles: struggles.map(s => ({\n ...s,\n estimatedImpact: normalizeActualImpact(s.estimatedImpact),\n })),\n }];\n } else {\n conversionRecords = [];\n }\n }\n\n // Extract responsive comparison data if available\n const responsiveDelta = typeof conversionJson[\"responsiveDelta\"] === \"number\"\n ? conversionJson[\"responsiveDelta\"] as number\n : null;\n\n // Extract strip ablation deltas if available (Zod-validated)\n let stripDeltas: Record<string, import(\"./contracts/evaluation-agent.js\").StripDeltaForEval> | undefined;\n {\n const parsed = StripDeltasArraySchema.safeParse(conversionJson[\"stripDeltas\"]);\n if (parsed.success && parsed.data.length > 0) {\n stripDeltas = {};\n for (const r of parsed.data) {\n stripDeltas[r.stripType] = {\n pixelDelta: r.delta,\n responsiveDelta: r.responsiveDelta ?? null,\n baselineInputTokens: r.baselineInputTokens ?? null,\n strippedInputTokens: r.strippedInputTokens ?? null,\n };\n }\n }\n }\n\n const evaluationOutput = runEvaluationAgent({\n nodeIssueSummaries: analysisJson.nodeIssueSummaries.map((s) => ({\n nodeId: s.nodeId,\n nodePath: s.nodePath,\n flaggedRuleIds: s.flaggedRuleIds,\n })),\n conversionRecords,\n ruleScores,\n responsiveDelta,\n stripDeltas,\n wholeDesign,\n });\n\n // Load prior evidence if collecting\n const priorEvidence = options?.collectEvidence\n ? loadCalibrationEvidence()\n : undefined;\n\n const tuningInput = {\n mismatches: evaluationOutput.mismatches,\n ruleScores,\n ...(priorEvidence ? { priorEvidence } : {}),\n };\n const tuningOutput = runTuningAgent(tuningInput);\n\n // Collect evidence from this run (non-fatal — pipeline continues on I/O failure)\n if (options?.collectEvidence) {\n try {\n const timestamp = new Date().toISOString();\n const fixture = options.fixtureName ?? analysisJson.fileKey;\n\n // Append calibration evidence (overscored/underscored)\n const calibrationEntries: CalibrationEvidenceEntry[] = [];\n for (const m of evaluationOutput.mismatches) {\n if ((m.type === \"overscored\" || m.type === \"underscored\") && m.ruleId) {\n calibrationEntries.push({\n ruleId: m.ruleId,\n type: m.type,\n actualDifficulty: m.actualDifficulty,\n fixture,\n timestamp,\n });\n }\n }\n appendCalibrationEvidence(calibrationEntries);\n\n } catch (err) {\n console.warn(\"[evidence] Failed to collect evidence (non-fatal):\", err);\n }\n }\n\n const report = generateCalibrationReport({\n fileKey: analysisJson.fileKey,\n fileName: analysisJson.fileName,\n analyzedAt: analysisJson.analyzedAt,\n nodeCount: analysisJson.nodeCount,\n issueCount: analysisJson.issueCount,\n convertedNodeCount: conversionRecords.length,\n skippedNodeCount: Array.isArray(conversionJson[\"skippedNodeIds\"]) ? (conversionJson[\"skippedNodeIds\"] as unknown[]).length : 0,\n scoreReport: analysisJson.scoreReport,\n mismatches: evaluationOutput.mismatches,\n validatedRules: evaluationOutput.validatedRules,\n adjustments: tuningOutput.adjustments,\n newRuleProposals: tuningOutput.newRuleProposals,\n });\n\n return {\n evaluationOutput,\n tuningOutput,\n report,\n };\n}\n\n","import { existsSync, mkdirSync } from \"node:fs\";\nimport { appendFile, writeFile } from \"node:fs/promises\";\nimport { resolve, join } from \"node:path\";\n\nexport interface ActivityStep {\n step: string;\n nodePath?: string;\n result: string;\n durationMs: number;\n}\n\nfunction getIsoTimestamp(): string {\n return new Date().toISOString();\n}\n\nexport class ActivityLogger {\n private logPath: string;\n private initialized = false;\n\n constructor(runDir: string) {\n this.logPath = resolve(join(runDir, \"activity.jsonl\"));\n }\n\n /**\n * Ensure the log directory and file header exist\n */\n private async ensureInitialized(): Promise<void> {\n if (this.initialized) return;\n\n const dir = resolve(this.logPath, \"..\");\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n if (!existsSync(this.logPath)) {\n // Write the initial \"session-start\" entry as the first JSON line\n const entry = {\n step: \"session-start\",\n timestamp: getIsoTimestamp(),\n result: \"Calibration activity log initialized\",\n durationMs: 0,\n };\n await writeFile(this.logPath, JSON.stringify(entry) + \"\\n\", \"utf-8\");\n }\n\n this.initialized = true;\n }\n\n /**\n * Log a pipeline step as a JSON Lines entry\n */\n async logStep(activity: ActivityStep): Promise<void> {\n await this.ensureInitialized();\n\n const entry: Record<string, unknown> = {\n step: activity.step,\n timestamp: getIsoTimestamp(),\n result: activity.result,\n durationMs: activity.durationMs,\n };\n\n if (activity.nodePath !== undefined) {\n entry[\"nodePath\"] = activity.nodePath;\n }\n\n await appendFile(this.logPath, JSON.stringify(entry) + \"\\n\", \"utf-8\");\n }\n\n /**\n * Log a summary at pipeline completion as a JSON Lines entry\n */\n async logSummary(summary: {\n totalDurationMs: number;\n nodesAnalyzed: number;\n nodesConverted: number;\n mismatches: number;\n adjustments: number;\n status: string;\n }): Promise<void> {\n await this.ensureInitialized();\n\n const entry = {\n step: \"Pipeline Summary\",\n timestamp: getIsoTimestamp(),\n result: summary.status,\n durationMs: summary.totalDurationMs,\n nodesAnalyzed: summary.nodesAnalyzed,\n nodesConverted: summary.nodesConverted,\n mismatches: summary.mismatches,\n adjustments: summary.adjustments,\n };\n\n await appendFile(this.logPath, JSON.stringify(entry) + \"\\n\", \"utf-8\");\n }\n\n getLogPath(): string {\n return this.logPath;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../package.json","../src/core/contracts/severity.ts","../src/core/contracts/channels.ts","../src/core/contracts/analysis-scope.ts","../src/core/contracts/category.ts","../src/core/contracts/figma-node.ts","../src/core/contracts/rule.ts","../src/core/contracts/issue.ts","../src/core/contracts/score.ts","../src/core/contracts/report.ts","../src/core/contracts/visual-compare.ts","../src/core/contracts/mcp-response.ts","../src/core/contracts/gotcha-survey.ts","../src/core/rules/rule-config.ts","../src/core/rules/rule-registry.ts","../src/core/contracts/acknowledgment.ts","../src/core/engine/rule-engine.ts","../src/core/adapters/instance-id-parser.ts","../src/core/gotcha/apply-context.ts","../src/core/engine/scoring.ts","../src/core/design-tree/design-tree.ts","../src/core/design-tree/strip.ts","../src/core/design-tree/delta.ts","../src/core/gotcha/resolve-apply-target.ts","../src/core/rules/node-semantics.ts","../src/core/rules/rule-exceptions.ts","../src/core/rules/rule-messages.ts","../src/core/rules/structure/index.ts","../src/core/rules/token/index.ts","../src/core/rules/component/index.ts","../src/core/rules/naming/index.ts","../src/core/rules/interaction/index.ts","../src/core/adapters/figma-url-parser.ts","../src/core/adapters/figma-client.ts","../src/core/adapters/figma-transformer.ts","../src/core/adapters/figma-file-loader.ts","../src/core/adapters/component-resolver.ts","../src/agents/contracts/calibration.ts","../src/agents/contracts/analysis-agent.ts","../src/agents/contracts/conversion-agent.ts","../src/agents/contracts/evaluation-agent.ts","../src/agents/contracts/tuning-agent.ts","../src/agents/contracts/gap-analyzer.ts","../src/agents/analysis-agent.ts","../src/agents/evaluation-agent.ts","../src/agents/tuning-agent.ts","../src/agents/report-generator.ts","../src/agents/contracts/evidence.ts","../src/agents/evidence-collector.ts","../src/core/engine/config-store.ts","../src/core/engine/loader.ts","../src/agents/calibration-compute.ts","../src/agents/activity-logger.ts"],"names":["z","GradeSchema","BATCH_SIZE","existsSync","readFileSync","dirname","join","resolve","response","file","componentDefs","interactionDests","loadFile","mkdirSync"],"mappings":";;;;;;;;AAEE,IAAA,OAAA,GAAW;ACAN,IAAM,cAAA,GAAiB,EAAE,IAAA,CAAK;AAAA,EACnC,UAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAC;AAIM,IAAM,eAAA,GAA4C;AAAA,EACvD,QAAA,EAAU,EAAA;AAAA,EACV,IAAA,EAAM,CAAA;AAAA,EACN,cAAA,EAAgB,CAAA;AAAA,EAChB,UAAA,EAAY;AACd;AAEO,IAAM,eAAA,GAA4C;AAAA,EACvD,QAAA,EAAU,UAAA;AAAA,EACV,IAAA,EAAM,MAAA;AAAA,EACN,cAAA,EAAgB,cAAA;AAAA,EAChB,UAAA,EAAY;AACd;AChBO,IAAM,eAAA,GAAkBA,CAAAA,CAAE,OAAA,CAAQ,YAAY;AAC9C,IAAM,sBAAsBA,CAAAA,CAAE,IAAA,CAAK,CAAC,OAAA,EAAS,YAAY,CAAC;AAC1D,IAAM,0BAA0BA,CAAAA,CAAE,IAAA,CAAK,CAAC,WAAA,EAAa,SAAS,CAAC;AAkB/D,IAAM,oBAAoBA,CAAAA,CAAE,IAAA,CAAK,CAAC,WAAA,EAAa,iBAAiB,CAAC;ACPjE,IAAM,sBAAsBA,CAAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,WAAW,CAAC;AAgB/D,IAAM,6CAA6B,IAAI,GAAA,CAAI,CAAC,WAAA,EAAa,eAAA,EAAiB,UAAU,CAAC,CAAA;AAW9E,SAAS,oBAAoB,QAAA,EAAuC;AACzE,EAAA,OAAO,0BAAA,CAA2B,GAAA,CAAI,QAAA,CAAS,IAAI,IAAI,WAAA,GAAc,MAAA;AACvE;AC/CO,IAAM,cAAA,GAAiBA,EAAE,IAAA,CAAK;AAAA,EACnC,gBAAA;AAAA,EACA,qBAAA;AAAA,EACA,cAAA;AAAA,EACA,kBAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAC;AAIM,IAAM,aAAa,cAAA,CAAe;AAElC,IAAM,eAAA,GAA4C;AAAA,EACvD,gBAAA,EAAkB,gBAAA;AAAA,EAClB,qBAAA,EAAuB,qBAAA;AAAA,EACvB,cAAA,EAAgB,cAAA;AAAA,EAChB,kBAAA,EAAoB,kBAAA;AAAA,EACpB,UAAA,EAAY,UAAA;AAAA,EACZ,aAAA,EAAe;AACjB;ACfO,IAAM,sBAAA,GAAyBA,EAAE,IAAA,CAAK;AAAA,EAC3C,UAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,mBAAA;AAAA,EACA,MAAA;AAAA,EACA,iBAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,iBAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAC;AAIM,IAAM,gBAAA,GAAmBA,EAAE,IAAA,CAAK,CAAC,QAAQ,YAAA,EAAc,UAAA,EAAY,MAAM,CAAC;AAG1E,IAAM,iBAAA,GAAoBA,EAAE,IAAA,CAAK,CAAC,OAAO,QAAA,EAAU,KAAA,EAAO,SAAA,EAAW,SAAS,CAAC;AAG/E,IAAM,0BAA0BA,CAAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,UAAU,CAAC;AAG3D,IAAM,sBAAA,GAAyBA,EAAE,MAAA,CAAO;AAAA,EAC7C,UAAA,EAAYA,EAAE,IAAA,CAAK,CAAC,QAAQ,OAAA,EAAS,QAAA,EAAU,YAAA,EAAc,OAAO,CAAC,CAAA;AAAA,EACrE,QAAA,EAAUA,EAAE,IAAA,CAAK,CAAC,OAAO,QAAA,EAAU,QAAA,EAAU,YAAA,EAAc,OAAO,CAAC;AACrE,CAAC;AAGM,IAAM,mBAAmBA,CAAAA,CAAE,IAAA,CAAK,CAAC,SAAA,EAAW,MAAM,CAAC;AAGnD,IAAM,uBAAA,GAA0BA,EAAE,IAAA,CAAK;AAAA,EAC5C,sBAAA;AAAA,EACA,oBAAA;AAAA,EACA,mCAAA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,oBAAA,GAAuBA,EAAE,IAAA,CAAK,CAAC,QAAQ,KAAA,EAAO,QAAA,EAAU,KAAK,CAAC;AAO3E,IAAM,sBAAA,GAAyBA,EAAE,MAAA,CAAO;AAAA;AAAA,EAEtC,EAAA,EAAIA,EAAE,MAAA,EAAO;AAAA,EACb,IAAA,EAAMA,EAAE,MAAA,EAAO;AAAA,EACf,IAAA,EAAM,sBAAA;AAAA,EACN,OAAA,EAASA,CAAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA;AAAA;AAAA,EAGjC,UAAA,EAAY,iBAAiB,QAAA,EAAS;AAAA,EACtC,WAAA,EAAa,kBAAkB,QAAA,EAAS;AAAA,EACxC,iBAAA,EAAmB,wBAAwB,QAAA,EAAS;AAAA,EACpD,sBAAA,EAAwBA,EAAE,IAAA,CAAK,CAAC,SAAS,KAAA,EAAO,MAAM,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EAClE,oBAAA,EAAsBA,EAAE,IAAA,CAAK,CAAC,SAAS,KAAA,EAAO,MAAM,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EAChE,qBAAA,EAAuBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC3C,qBAAA,EAAuBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC3C,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,YAAA,EAAcA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAClC,UAAA,EAAYA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAChC,aAAA,EAAeA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAGnC,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,SAAA,EAAWA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC/B,SAAA,EAAWA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC/B,UAAA,EAAYA,CAAAA,CAAE,KAAA,CAAM,CAACA,EAAE,OAAA,CAAQ,CAAC,CAAA,EAAGA,CAAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAC,EAAE,QAAA,EAAS;AAAA,EAC3D,WAAA,EAAa,uBAAuB,QAAA,EAAS;AAAA;AAAA,EAG7C,UAAA,EAAY,iBAAiB,QAAA,EAAS;AAAA,EACtC,kBAAA,EAAoBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACxC,uBAAA,EAAyBA,EAAE,IAAA,CAAK,CAAC,QAAQ,eAAe,CAAC,EAAE,QAAA,EAAS;AAAA;AAAA,EAGpE,YAAA,EAAcA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAClC,eAAA,EAAiBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACrC,UAAA,EAAYA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAChC,aAAA,EAAeA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACnC,iBAAA,EAAmBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACvC,cAAA,EAAgBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAGpC,wBAAA,EAA0B,qBAAqB,QAAA,EAAS;AAAA,EACxD,sBAAA,EAAwB,qBAAqB,QAAA,EAAS;AAAA,EACtD,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,cAAA,EAAgBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACpC,kBAAA,EAAoBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACxC,qBAAA,EAAuBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAG3C,YAAA,EAAcA,CAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EACnC,iBAAA,EAAmB,wBAAwB,QAAA,EAAS;AAAA;AAAA,EAGpD,mBAAA,EAAqBA,EAClB,MAAA,CAAO;AAAA,IACN,CAAA,EAAGA,EAAE,MAAA,EAAO;AAAA,IACZ,CAAA,EAAGA,EAAE,MAAA,EAAO;AAAA,IACZ,KAAA,EAAOA,EAAE,MAAA,EAAO;AAAA,IAChB,MAAA,EAAQA,EAAE,MAAA;AAAO,GAClB,CAAA,CACA,QAAA,EAAS,CACT,QAAA,EAAS;AAAA;AAAA,EAGZ,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,4BAAA,EAA8BA,CAAAA,CAAE,MAAA,CAAOA,CAAAA,CAAE,MAAA,IAAUA,CAAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA,EAAS;AAAA,EACzE,mBAAA,EAAqBA,CAAAA,CAAE,MAAA,CAAOA,CAAAA,CAAE,MAAA,IAAUA,CAAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA,EAAS;AAAA;AAAA,EAGhE,MAAA,EAAQA,CAAAA,CAAE,MAAA,CAAOA,CAAAA,CAAE,MAAA,IAAUA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS;AAAA,EAClD,OAAOA,CAAAA,CAAE,KAAA,CAAMA,EAAE,OAAA,EAAS,EAAE,QAAA,EAAS;AAAA,EACrC,SAASA,CAAAA,CAAE,KAAA,CAAMA,EAAE,OAAA,EAAS,EAAE,QAAA,EAAS;AAAA,EACvC,YAAA,EAAcA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAClC,uBAAA,EAAyBA,CAAAA,CAAE,MAAA,CAAOA,CAAAA,CAAE,MAAA,IAAUA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS;AAAA,EACnE,SAASA,CAAAA,CAAE,KAAA,CAAMA,EAAE,OAAA,EAAS,EAAE,QAAA,EAAS;AAAA,EACvC,YAAA,EAAcA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAClC,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAG7B,cAAA,EAAgBA,CAAAA,CAAE,MAAA,CAAOA,CAAAA,CAAE,MAAA,IAAUA,CAAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA,EAAS;AAAA;AAAA,EAG3D,UAAA,EAAYA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAChC,KAAA,EAAOA,CAAAA,CAAE,MAAA,CAAOA,CAAAA,CAAE,MAAA,IAAUA,CAAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA,EAAS;AAAA,EAClD,cAAA,EAAgBA,EAAE,IAAA,CAAK,CAAC,YAAY,QAAQ,CAAC,EAAE,QAAA,EAAS;AAAA,EACxD,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAG9B,SAAA,EAAWA,EACR,MAAA,CAAO;AAAA,IACN,MAAMA,CAAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,eAAA,EAAiB,WAAW,CAAC,CAAA;AAAA,IACnD,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GAClC,EACA,QAAA,EAAS;AAAA;AAAA,EAGZ,cAAcA,CAAAA,CAAE,KAAA,CAAMA,EAAE,OAAA,EAAS,EAAE,QAAA,EAAS;AAAA;AAAA,EAG5C,OAAA,EAASA,CAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AACvB,CAAC,CAAA;AAMM,IAAM,kBAAA,GACX,uBAAuB,MAAA,CAAO;AAAA,EAC5B,QAAA,EAAUA,EAAE,IAAA,CAAK,MAAM,mBAAmB,KAAA,EAAM,CAAE,UAAU;AAC9D,CAAC;AAKI,IAAM,kBAAA,GAAqBA,EAAE,MAAA,CAAO;AAAA,EACzC,OAAA,EAASA,EAAE,MAAA,EAAO;AAAA,EAClB,IAAA,EAAMA,EAAE,MAAA,EAAO;AAAA,EACf,YAAA,EAAcA,EAAE,MAAA,EAAO;AAAA,EACvB,OAAA,EAASA,EAAE,MAAA,EAAO;AAAA,EAClB,SAAA,EAAWA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC/B,QAAA,EAAU,kBAAA;AAAA,EACV,YAAYA,CAAAA,CAAE,MAAA;AAAA,IACZA,EAAE,MAAA,EAAO;AAAA,IACTA,EAAE,MAAA,CAAO;AAAA,MACP,GAAA,EAAKA,EAAE,MAAA,EAAO;AAAA,MACd,IAAA,EAAMA,EAAE,MAAA,EAAO;AAAA,MACf,WAAA,EAAaA,EAAE,MAAA;AAAO,KACvB;AAAA,GACH;AAAA,EACA,oBAAA,EAAsBA,EAAE,MAAA,CAAOA,CAAAA,CAAE,QAAO,EAAG,kBAAkB,EAAE,QAAA,EAAS;AAAA,EACxE,uBAAA,EAAyBA,EAAE,MAAA,CAAOA,CAAAA,CAAE,QAAO,EAAG,kBAAkB,EAAE,QAAA,EAAS;AAAA,EAC3E,QAAQA,CAAAA,CAAE,MAAA;AAAA,IACRA,EAAE,MAAA,EAAO;AAAA,IACTA,EAAE,MAAA,CAAO;AAAA,MACP,GAAA,EAAKA,EAAE,MAAA,EAAO;AAAA,MACd,IAAA,EAAMA,EAAE,MAAA,EAAO;AAAA,MACf,SAAA,EAAWA,EAAE,MAAA;AAAO,KACrB;AAAA;AAEL,CAAC;AC3MM,IAAM,oBAAA,GAAuBA,EAAE,MAAA,CAAO;AAAA,EAC3C,EAAA,EAAIA,EAAE,MAAA,EAAO;AAAA,EACb,IAAA,EAAMA,EAAE,MAAA,EAAO;AAAA,EACf,QAAA,EAAU,cAAA;AAAA,EACV,GAAA,EAAKA,EAAE,MAAA,EAAO;AAAA,EACd,MAAA,EAAQA,EAAE,MAAA,EAAO;AAAA,EACjB,GAAA,EAAKA,EAAE,MAAA;AACT,CAAC;AAOM,IAAM,gBAAA,GAAmBA,EAAE,MAAA,CAAO;AAAA,EACvC,QAAA,EAAU,cAAA;AAAA,EACV,OAAOA,CAAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,IAAI,CAAC,CAAA;AAAA,EAC7B,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EAC/C,OAAA,EAASA,CAAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA;AAAA,EACjC,OAAA,EAASA,CAAAA,CAAE,MAAA,CAAOA,CAAAA,CAAE,MAAA,IAAUA,CAAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA;AAC7C,CAAC;AAgDM,SAAS,gBAAA,CAAoB,OAAA,EAAsB,GAAA,EAAa,IAAA,EAAkB;AACvF,EAAA,IAAI,OAAA,CAAQ,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA,EAAG;AAClC,IAAA,OAAO,OAAA,CAAQ,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AAAA,EACtC;AACA,EAAA,MAAM,QAAQ,IAAA,EAAK;AACnB,EAAA,OAAA,CAAQ,aAAA,CAAc,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AACpC,EAAA,OAAO,KAAA;AACT;AAsEO,IAAM,uBAAA,GAAsC,CAAC,gBAAA,EAAkB,qBAAqB;AAKpF,SAAS,oBAAoB,QAAA,EAA6B;AAC/D,EAAA,OAAO,uBAAA,CAAwB,SAAS,QAAQ,CAAA;AAClD;AC9JO,IAAM,WAAA,GAAcA,EAAE,MAAA,CAAO;AAAA,EAClC,MAAA,EAAQA,EAAE,MAAA,EAAO;AAAA,EACjB,QAAA,EAAUA,EAAE,MAAA,EAAO;AAAA,EACnB,aAAA,EAAeA,CAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI;AAAA,EAC9B,MAAA,EAAQA,EAAE,MAAA,EAAO;AAAA,EACjB,OAAA,EAASA,EAAE,MAAA,EAAO;AAAA,EAClB,QAAA,EAAU;AACZ,CAAC;ACPM,IAAM,mBAAA,GAAsBA,EAAE,MAAA,CAAO;AAAA,EAC1C,QAAA,EAAU,cAAA;AAAA,EACV,KAAA,EAAOA,EAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,GAAG,CAAA;AAAA,EAChC,QAAA,EAAUA,EAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,GAAG,CAAA;AAAA,EACnC,UAAA,EAAYA,EAAE,MAAA,CAAO;AAAA,IACnB,OAAOA,CAAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,IAAI,CAAC,CAAA;AAAA,IAC7B,SAASA,CAAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,IAAI,CAAC,CAAA;AAAA,IAC/B,MAAMA,CAAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,IAAI,CAAC;AAAA,GAC7B;AACH,CAAC;ACRM,IAAM,oBAAA,GAAuBA,EAAE,MAAA,CAAO;AAAA,EAC3C,OAAA,EAASA,EAAE,MAAA,EAAO;AAAA,EAClB,QAAA,EAAUA,EAAE,MAAA,EAAO;AAAA,EACnB,UAAA,EAAYA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAChC,OAAA,EAASA,EAAE,MAAA;AACb,CAAC;AAIM,IAAM,YAAA,GAAeA,EAAE,MAAA,CAAO;AAAA,EACnC,QAAA,EAAU,oBAAA;AAAA,EACV,UAAA,EAAYA,EAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,GAAG,CAAA;AAAA,EACrC,cAAA,EAAgBA,CAAAA,CAAE,KAAA,CAAM,mBAAmB,CAAA;AAAA,EAC3C,MAAA,EAAQA,CAAAA,CAAE,KAAA,CAAM,WAAW,CAAA;AAAA,EAC3B,OAAA,EAASA,EAAE,MAAA,CAAO;AAAA,IAChB,YAAYA,CAAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,IAAI,CAAC,CAAA;AAAA,IAClC,eAAeA,CAAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,IAAI,CAAC,CAAA;AAAA,IACrC,YAAYA,CAAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,IAAI,CAAC,CAAA;AAAA,IAClC,cAAcA,CAAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,IAAI,CAAC,CAAA;AAAA,IACpC,WAAWA,CAAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,IAAI,CAAC;AAAA,GAClC;AACH,CAAC;ACvBD,IAAM,iBAAA,GAAoBA,CAAAA,CACvB,KAAA,CAAM,CAACA,CAAAA,CAAE,MAAA,EAAO,EAAGA,CAAAA,CAAE,MAAA,EAAQ,CAAC,CAAA,CAC9B,SAAA,CAAU,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAC,CAAA,CAC1B,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,wBAAwB,CAAA,CAChD,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,GAAI,GAAG,kBAAkB,CAAA;AAE1C,IAAM,gBAAA,GAAmBA,CAAAA,CACtB,KAAA,CAAM,CAACA,CAAAA,CAAE,MAAA,EAAO,EAAGA,CAAAA,CAAE,MAAA,EAAQ,CAAC,CAAA,CAC9B,SAAA,CAAU,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAC,CAAA,CAC1B,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,wBAAwB,CAAA,CAChD,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,IAAK,GAAG,cAAc,CAAA;AAGhC,IAAM,6BAAA,GAAgCA,EAAE,MAAA,CAAO;AAAA,EACpD,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,eAAA,EAAiBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACrC,KAAA,EAAOA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC3B,MAAA,EAAQA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC5B,KAAA,EAAO,kBAAkB,QAAA,EAAS;AAAA,EAClC,MAAA,EAAQ,kBAAkB,QAAA,EAAS;AAAA,EACnC,UAAA,EAAY,iBAAiB,QAAA,EAAS;AAAA,EACtC,UAAA,EAAYA,CAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AAC1B,CAAC;ACbD,IAAM,WAAA,GAAcA,CAAAA,CAAE,IAAA,CAAK,CAAC,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,GAAA,EAAK,GAAG,CAAC,CAAA;AAE3E,IAAM,yBAAA,GAA4BA,EAAE,MAAA,CAAO;AAAA,EACzC,QAAA,EAAU,cAAA;AAAA,EACV,KAAA,EAAOA,EAAE,MAAA,EAAO;AAAA,EAChB,QAAA,EAAUA,EAAE,MAAA,EAAO;AAAA,EACnB,UAAA,EAAYA,EAAE,MAAA,EAAO;AAAA,EACrB,YAAYA,CAAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,IAAI,CAAC,CAAA;AAAA,EAClC,iBAAiBA,CAAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,IAAI,CAAC,CAAA;AAAA,EACvC,kBAAA,EAAoBA,EAAE,MAAA,EAAO;AAAA,EAC7B,YAAA,EAAcA,EAAE,MAAA,EAAO;AAAA,EACvB,cAAA,EAAgBA,EAAE,MAAA,EAAO;AAAA,EACzB,UAAA,EAAYA,EAAE,MAAA,CAAO;AAAA,IACnB,UAAUA,CAAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,IAAI,CAAC,CAAA;AAAA,IAChC,MAAMA,CAAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,IAAI,CAAC,CAAA;AAAA,IAC5B,gBAAgBA,CAAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,IAAI,CAAC,CAAA;AAAA,IACtC,YAAYA,CAAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,IAAI,CAAC;AAAA,GACnC;AACH,CAAC,CAAA;AAED,IAAM,cAAA,GAAiBA,EAAE,MAAA,CAAO;AAAA,EAC9B,MAAA,EAAQA,EAAE,MAAA,EAAO;AAAA,EACjB,SAAA,EAAW,eAAA;AAAA,EACX,aAAA,EAAe,mBAAA,CAAoB,OAAA,CAAQ,CAAC,OAAO,CAAC,CAAA;AAAA,EACpD,iBAAA,EAAmB,uBAAA,CAAwB,OAAA,CAAQ,CAAC,WAAW,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhE,OAAA,EAAS,iBAAA;AAAA,EACT,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,QAAA,EAAU,cAAA;AAAA,EACV,MAAA,EAAQA,EAAE,MAAA,EAAO;AAAA,EACjB,QAAA,EAAUA,EAAE,MAAA,EAAO;AAAA,EACnB,OAAA,EAASA,EAAE,MAAA;AACb,CAAC,CAAA;AAMM,IAAM,wBAAA,GAA2BA,EAAE,MAAA,CAAO;AAAA,EAC/C,OAAA,EAASA,EAAE,MAAA,EAAO;AAAA,EAClB,UAAA,EAAYA,EAAE,MAAA,EAAO;AAAA,EACrB,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,QAAA,EAAUA,EAAE,MAAA,EAAO;AAAA,EACnB,WAAWA,CAAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,IAAI,CAAC,CAAA;AAAA,EACjC,UAAUA,CAAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,IAAI,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQhC,KAAA,EAAO,mBAAA;AAAA,EACP,YAAYA,CAAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,IAAI,CAAC,CAAA;AAAA,EAClC,iBAAA,EAAmBA,EAAE,OAAA,EAAQ;AAAA,EAC7B,oBAAoBA,CAAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,IAAI,CAAC,CAAA;AAAA,EAC1C,MAAA,EAAQA,EAAE,MAAA,CAAO;AAAA,IACf,OAAA,EAASA,EAAE,MAAA,CAAO;AAAA,MAChB,KAAA,EAAOA,EAAE,MAAA,EAAO;AAAA,MAChB,QAAA,EAAUA,EAAE,MAAA,EAAO;AAAA,MACnB,UAAA,EAAYA,EAAE,MAAA,EAAO;AAAA,MACrB,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,IACD,UAAA,EAAYA,CAAAA,CAAE,MAAA,CAAO,cAAA,EAAgB,yBAAyB;AAAA,GAC/D,CAAA;AAAA,EACD,YAAA,EAAcA,CAAAA,CAAE,MAAA,CAAOA,CAAAA,CAAE,MAAA,EAAO,EAAGA,CAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI,CAAE,GAAA,CAAI,CAAC,CAAC,CAAA;AAAA,EAC1D,MAAA,EAAQA,CAAAA,CAAE,KAAA,CAAM,cAAc,CAAA;AAAA,EAC9B,OAAA,EAASA,EAAE,MAAA,EAAO;AAAA,EAClB,aAAaA,CAAAA,CAAE,KAAA,CAAMA,EAAE,MAAA,EAAQ,EAAE,QAAA;AACnC,CAAC;AC5ED,IAAMC,YAAAA,GAAcD,CAAAA,CAAE,IAAA,CAAK,CAAC,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,GAAA,EAAK,GAAG,CAAC,CAAA;AAEpE,IAAM,qBAAA,GAAwBA,EAAE,MAAA,CAAO;AAAA,EAC5C,oBAAA,EAAsBA,EAAE,MAAA,EAAO;AAAA,EAC/B,YAAA,EAAcA,EAAE,MAAA,EAAO;AAAA,EACvB,iBAAA,EAAmBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACvC,mBAAA,EAAqBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAClC,CAAC;AASM,IAAM,uBAAA,GAA0BA,EAAE,IAAA,CAAK;AAAA,EAC5C,cAAA;AAAA,EACA,gBAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAC;AAID,IAAM,oBAAA,GAAuBA,CAAAA,CAAE,KAAA,CAAM,CAACA,CAAAA,CAAE,MAAA,EAAO,EAAGA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAC,CAAC,CAAA;AAO/D,IAAM,wBAAA,GAA2BA,EAAE,MAAA,CAAO,EAAE,MAAMA,CAAAA,CAAE,MAAA,IAAU;AAO9D,IAAM,qBAAA,GAAwB;AAC9B,IAAM,yBAAA,GAA4B,oBAAoB,OAAA,CAAQ;AAAA,EACnE;AACF,CAAC;AACM,IAAM,6BAAA,GAAgC,wBAAwB,OAAA,CAAQ;AAAA,EAC3E;AACF,CAAC;AAEM,IAAM,0BAAA,GAA6BA,EAAE,MAAA,CAAO;AAAA,EACjD,MAAA,EAAQA,EAAE,MAAA,EAAO;AAAA,EACjB,QAAA,EAAUA,EAAE,MAAA,EAAO;AAAA,EACnB,MAAA,EAAQA,EAAE,MAAA,EAAO;AAAA,EACjB,SAAA,EAAW,qBAAA;AAAA,EACX,aAAA,EAAe,yBAAA;AAAA,EACf,iBAAA,EAAmB,6BAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQnB,OAAA,EAAS,iBAAA;AAAA,EACT,QAAA,EAAU,cAAA;AAAA,EACV,QAAA,EAAUA,EAAE,MAAA,EAAO;AAAA,EACnB,IAAA,EAAMA,EAAE,MAAA,EAAO;AAAA,EACf,OAAA,EAASA,EAAE,MAAA,EAAO;AAAA,EAClB,eAAA,EAAiB,sBAAsB,QAAA,EAAS;AAAA,EAChD,aAAA,EAAe,uBAAA;AAAA,EACf,cAAA,EAAgB,qBAAqB,QAAA,EAAS;AAAA,EAC9C,oBAAA,EAAsBA,CAAAA,CAAE,KAAA,CAAM,wBAAwB,EAAE,QAAA,EAAS;AAAA,EACjE,aAAA,EAAeA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACnC,eAAA,EAAiBA,EAAE,OAAA,EAAQ;AAAA,EAC3B,aAAA,EAAeA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOnC,QAAA,EAAUA,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EAC3C,gBAAgBA,CAAAA,CAAE,KAAA,CAAMA,EAAE,MAAA,EAAQ,EAAE,QAAA;AACtC,CAAC;AAgBM,IAAM,yBAAA,GAA4BA,EAAE,MAAA,CAAO;AAAA,EAChD,MAAA,EAAQA,EAAE,MAAA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYjB,WAAWA,CAAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,QAAA,EAAU,MAAM,CAAC,CAAA;AAAA,EAC5C,SAAA,EAAWA,CAAAA,CAAE,KAAA,CAAM,0BAA0B,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO7C,aAAaA,CAAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,IAAI,CAAC;AACrC,CAAC;AAIM,IAAM,yBAAA,GAA4BA,EAAE,MAAA,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMhD,eAAA,EAAiB,sBAAsB,QAAA,EAAS;AAAA,EAChD,OAAA,EAASA,CAAAA,CAAE,KAAA,CAAM,yBAAyB;AAC5C,CAAC;AAIM,IAAM,mBAAA,GAAsBA,EAAE,MAAA,CAAO;AAAA,EAC1C,MAAA,EAAQA,CAAAA,CAAE,KAAA,CAAM,yBAAyB;AAC3C,CAAC;AAIM,IAAM,kBAAA,GAAqBA,EAAE,MAAA,CAAO;AAAA,EACzC,WAAA,EAAaC,YAAAA;AAAA,EACb,iBAAA,EAAmBD,EAAE,OAAA,EAAQ;AAAA,EAC7B,SAAA,EAAWA,CAAAA,CAAE,KAAA,CAAM,0BAA0B,CAAA;AAAA,EAC7C,gBAAA,EAAkB,mBAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQlB,SAAA,EAAWA,EAAE,MAAA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcpB,qBAAA,EAAuBA,EAAE,OAAA;AAC3B,CAAC;;;ACnKM,IAAM,gBAAA,GAA6C;AAAA;AAAA,EAExD,gBAAA,EAAkB,gBAAA;AAAA,EAClB,kCAAA,EAAoC,gBAAA;AAAA,EACpC,sBAAA,EAAwB,gBAAA;AAAA;AAAA,EAExB,2BAAA,EAA6B,qBAAA;AAAA,EAC7B,yBAAA,EAA2B,qBAAA;AAAA;AAAA,EAE3B,mBAAA,EAAqB,cAAA;AAAA,EACrB,mBAAA,EAAqB,cAAA;AAAA,EACrB,4BAAA,EAA8B,cAAA;AAAA,EAC9B,cAAA,EAAgB,cAAA;AAAA;AAAA,EAEhB,WAAA,EAAa,kBAAA;AAAA,EACb,mBAAA,EAAqB,kBAAA;AAAA;AAAA,EAErB,2BAAA,EAA6B,aAAA;AAAA,EAC7B,mBAAA,EAAqB,aAAA;AAAA;AAAA,EAErB,qBAAA,EAAuB,UAAA;AAAA,EACvB,mBAAA,EAAqB,UAAA;AAAA,EACrB,gCAAA,EAAkC;AACpC;AAiBO,IAAM,YAAA,GAA4C;AAAA;AAAA,EAEvD,gBAAA,EAAkB,WAAA;AAAA,EAClB,kCAAA,EAAoC,WAAA;AAAA,EACpC,sBAAA,EAAwB,WAAA;AAAA;AAAA,EAExB,2BAAA,EAA6B,WAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO7B,yBAAA,EAA2B,iBAAA;AAAA;AAAA,EAE3B,mBAAA,EAAqB,WAAA;AAAA,EACrB,mBAAA,EAAqB,WAAA;AAAA,EACrB,4BAAA,EAA8B,WAAA;AAAA,EAC9B,cAAA,EAAgB,WAAA;AAAA;AAAA,EAEhB,WAAA,EAAa,WAAA;AAAA,EACb,mBAAA,EAAqB,WAAA;AAAA;AAAA;AAAA;AAAA,EAIrB,2BAAA,EAA6B,iBAAA;AAAA,EAC7B,mBAAA,EAAqB,iBAAA;AAAA;AAAA,EAErB,qBAAA,EAAuB,WAAA;AAAA,EACvB,mBAAA,EAAqB,WAAA;AAAA,EACrB,gCAAA,EAAkC;AACpC;AAUO,SAAS,eAAe,MAAA,EAA6B;AAC1D,EAAA,OAAO,YAAA,CAAa,MAAgB,CAAA,IAAK,WAAA;AAC3C;AAcO,IAAM,YAAA,GAA2C;AAAA;AAAA,EAEtD,gBAAA,EAAkB;AAAA,IAChB,QAAA,EAAU,UAAA;AAAA,IACV,KAAA,EAAO,GAAA;AAAA,IACP,WAAA,EAAa,GAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,kCAAA,EAAoC;AAAA,IAClC,QAAA,EAAU,UAAA;AAAA,IACV,KAAA,EAAO,EAAA;AAAA,IACP,WAAA,EAAa,GAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,sBAAA,EAAwB;AAAA,IACtB,QAAA,EAAU,UAAA;AAAA,IACV,KAAA,EAAO,EAAA;AAAA,IACP,WAAA,EAAa,GAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA;AAAA,EAGA,2BAAA,EAA6B;AAAA,IAC3B,QAAA,EAAU,MAAA;AAAA,IACV,KAAA,EAAO,EAAA;AAAA,IACP,OAAA,EAAS;AAAA,GACX;AAAA,EACA,yBAAA,EAA2B;AAAA;AAAA;AAAA;AAAA;AAAA,IAKzB,QAAA,EAAU,cAAA;AAAA,IACV,KAAA,EAAO,EAAA;AAAA,IACP,OAAA,EAAS;AAAA,GACX;AAAA;AAAA,EAGA,mBAAA,EAAqB;AAAA,IACnB,QAAA,EAAU,MAAA;AAAA,IACV,KAAA,EAAO,EAAA;AAAA,IACP,OAAA,EAAS,IAAA;AAAA,IACT,OAAA,EAAS;AAAA,MACP,cAAA,EAAgB,CAAA;AAAA,MAChB,uBAAA,EAAyB,CAAA;AAAA,MACzB,mBAAA,EAAqB;AAAA;AACvB,GACF;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,QAAA,EAAU,MAAA;AAAA,IACV,KAAA,EAAO,EAAA;AAAA,IACP,OAAA,EAAS;AAAA,GACX;AAAA,EACA,4BAAA,EAA8B;AAAA,IAC5B,QAAA,EAAU,MAAA;AAAA,IACV,KAAA,EAAO,EAAA;AAAA,IACP,OAAA,EAAS;AAAA,GACX;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,QAAA,EAAU,MAAA;AAAA,IACV,KAAA,EAAO,EAAA;AAAA,IACP,OAAA,EAAS,IAAA;AAAA,IACT,OAAA,EAAS;AAAA,MACP,QAAA,EAAU;AAAA;AACZ,GACF;AAAA;AAAA,EAGA,WAAA,EAAa;AAAA,IACX,QAAA,EAAU,cAAA;AAAA,IACV,KAAA,EAAO,EAAA;AAAA,IACP,OAAA,EAAS;AAAA,GACX;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,QAAA,EAAU,MAAA;AAAA,IACV,KAAA,EAAO,EAAA;AAAA,IACP,OAAA,EAAS,IAAA;AAAA,IACT,OAAA,EAAS;AAAA,MACP,QAAA,EAAU;AAAA;AACZ,GACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,2BAAA,EAA6B;AAAA,IAC3B,QAAA,EAAU,cAAA;AAAA,IACV,KAAA,EAAO,EAAA;AAAA;AAAA,IACP,OAAA,EAAS;AAAA,GACX;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,QAAA,EAAU,cAAA;AAAA,IACV,KAAA,EAAO,EAAA;AAAA;AAAA,IACP,OAAA,EAAS;AAAA,GACX;AAAA;AAAA,EAGA,qBAAA,EAAuB;AAAA,IACrB,QAAA,EAAU,YAAA;AAAA,IACV,KAAA,EAAO,EAAA;AAAA;AAAA,IACP,OAAA,EAAS;AAAA,GACX;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,QAAA,EAAU,MAAA;AAAA,IACV,KAAA,EAAO,EAAA;AAAA,IACP,OAAA,EAAS;AAAA,GACX;AAAA,EACA,gCAAA,EAAkC;AAAA,IAChC,QAAA,EAAU,YAAA;AAAA,IACV,KAAA,EAAO,EAAA;AAAA,IACP,OAAA,EAAS;AAAA;AAEb;AAUO,SAAS,qBACd,MAAA,EAC4B;AAC5B,EAAA,MAAM,OAAA,GAAU,EAAE,GAAG,YAAA,EAAa;AAElC,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,SAAA;AAEH,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAClD,QAAA,IAAI,MAAA,CAAO,aAAa,UAAA,EAAY;AAClC,UAAA,OAAA,CAAQ,EAAY,CAAA,GAAI;AAAA,YACtB,GAAG,MAAA;AAAA,YACH,QAAA,EAAU,MAAA;AAAA,YACV,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,QAAQ,GAAG;AAAA,WACtC;AAAA,QACF;AAAA,MACF;AACA,MAAA;AAAA,IAEF,KAAK,cAAA;AAEH,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAClD,QAAA,MAAM,MAAA,GAAS,EAAA;AACf,QAAA,MAAM,QAAA,GAAW,iBAAiB,MAAM,CAAA;AACxC,QAAA,IAAI,QAAA,KAAa,gBAAA,IAAoB,QAAA,KAAa,qBAAA,EAAuB;AACvE,UAAA,OAAA,CAAQ,MAAM,CAAA,GAAI,EAAE,GAAG,MAAA,EAAQ,SAAS,KAAA,EAAM;AAAA,QAChD;AAAA,MACF;AACA,MAAA;AAAA,IAEF,KAAK,UAAA;AAEH,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAClD,QAAA,MAAM,MAAA,GAAS,EAAA;AACf,QAAA,MAAM,QAAA,GAAW,iBAAiB,MAAM,CAAA;AACxC,QAAA,IAAI,QAAA,KAAa,gBAAA,IAAoB,QAAA,KAAa,kBAAA,EAAoB;AACpE,UAAA,OAAA,CAAQ,MAAM,CAAA,GAAI;AAAA,YAChB,GAAG,MAAA;AAAA,YACH,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,QAAQ,GAAG;AAAA,WACtC;AAAA,QACF;AAAA,MACF;AACA,MAAA;AAAA,IAEF,KAAK,QAAA;AAEH,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAClD,QAAA,OAAA,CAAQ,EAAY,CAAA,GAAI;AAAA,UACtB,GAAG,MAAA;AAAA,UACH,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,QAAQ,GAAG;AAAA,SACtC;AAAA,MACF;AACA,MAAA;AAAA;AAGJ,EAAA,OAAO,OAAA;AACT;AAaO,IAAM,0BAAA,GAQT;AAAA,EACF,yBAAA,EAA2B;AAAA;AAAA;AAAA;AAAA;AAAA,IAKzB,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,SAAS;AAAA,GAC7B;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,SAAA,EAAW;AAAA,MACT,GAAA,EAAK,CAAC,EAAE,IAAA,EAAM,eAAe,CAAA;AAAA,MAC7B,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,WAAW;AAAA;AAC/B,GACF;AAAA,EACA,2BAAA,EAA6B;AAAA,IAC3B,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,OAAA,EAAQ,EAAG,EAAE,IAAA,EAAM,QAAA,EAAS,EAAG,EAAE,IAAA,EAAM,cAAc;AAAA,GACzE;AAAA,EACA,WAAA,EAAa;AAAA,IACX,SAAA,EAAW;AAAA,MACT,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,SAAS,CAAA;AAAA,MACzB,IAAA,EAAM;AAAA,QACJ,EAAE,MAAM,UAAA,EAAW;AAAA,QACnB,EAAE,MAAM,YAAA,EAAa;AAAA,QACrB,EAAE,MAAM,YAAA,EAAa;AAAA,QACrB,EAAE,MAAM,YAAA;AAAa,OACvB;AAAA,MACA,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,eAAc,EAAG,EAAE,IAAA,EAAM,SAAA,EAAW;AAAA;AACxD,GACF;AAAA,EACA,kCAAA,EAAoC;AAAA,IAClC,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,cAAc;AAAA;AAEpC;AAMO,SAAS,uBAAA,CACd,QACA,OAAA,EACkC;AAClC,EAAA,MAAM,KAAA,GAAQ,2BAA2B,MAAM,CAAA;AAC/C,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,IAAI,OAAA,KAAY,MAAA,IAAa,KAAA,CAAM,SAAA,EAAW;AAC5C,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,SAAA,CAAU,OAAO,CAAA;AACrC,IAAA,IAAI,OAAO,OAAO,KAAA;AAAA,EACpB;AACA,EAAA,OAAO,KAAA,CAAM,OAAA;AACf;AAKO,SAAS,aAAA,CACd,MAAA,EACA,SAAA,EACA,YAAA,EACG;AACH,EAAA,MAAM,MAAA,GAAS,aAAa,MAAM,CAAA;AAClC,EAAA,IAAI,CAAC,MAAA,CAAO,OAAA,EAAS,OAAO,YAAA;AAC5B,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA;AACtC,EAAA,OAAQ,KAAA,IAAe,YAAA;AACzB;;;ACjXA,IAAM,eAAN,MAAmB;AAAA,EACT,KAAA,uBAA+B,GAAA,EAAI;AAAA;AAAA;AAAA;AAAA,EAK3C,SAAS,IAAA,EAAkB;AACzB,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,UAAA,CAAW,IAAc,IAAI,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,EAAA,EAAqB;AAC9B,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,EAAE,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,EAAA,EAA8B;AAChC,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAiB;AACf,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,QAAA,EAA4B;AACxC,IAAA,OAAO,IAAA,CAAK,QAAO,CAAE,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,UAAA,CAAW,QAAA,KAAa,QAAQ,CAAA;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CAAW,UAAsC,YAAA,EAAsB;AACrE,IAAA,OAAO,IAAA,CAAK,MAAA,EAAO,CAAE,MAAA,CAAO,CAAC,IAAA,KAAS;AACpC,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAA,CAAK,UAAA,CAAW,EAAY,CAAA;AACnD,MAAA,OAAO,QAAQ,OAAA,IAAW,IAAA;AAAA,IAC5B,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,CACE,EAAA,EACA,OAAA,GAAsC,YAAA,EAC1B;AACZ,IAAA,OAAO,QAAQ,EAAE,CAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,EAAA,EAAqB;AACvB,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,KAAK,KAAA,CAAM,IAAA;AAAA,EACpB;AACF,CAAA;AAKO,IAAM,YAAA,GAAe,IAAI,YAAA;AAKzB,SAAS,WAAW,IAAA,EAAkB;AAC3C,EAAA,YAAA,CAAa,SAAS,IAAI,CAAA;AAC1B,EAAA,OAAO,IAAA;AACT;ACvEO,IAAM,0BAAA,GAA6BA,EAAE,MAAA,CAAO;AAAA,EACjD,KAAA,EAAOA,EAAE,MAAA,EAAO;AAAA,EAChB,KAAA,EAAOA,EAAE,OAAA,EAAQ;AAAA,EACjB,OAAOA,CAAAA,CAAE,IAAA,CAAK,CAAC,UAAA,EAAY,YAAY,CAAC;AAC1C,CAAC,CAAA;AAIM,IAAM,qCAAA,GAAwCA,EAAE,MAAA,CAAO;AAAA,EAC5D,MAAA,EAAQA,EAAE,IAAA,CAAK;AAAA,IACb,WAAA;AAAA,IACA,gBAAA;AAAA,IACA,cAAA;AAAA,IACA,2BAAA;AAAA,IACA;AAAA,GACD,CAAA;AAAA,EACD,MAAA,EAAQA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACrB,CAAC,CAAA;AAMM,IAAM,oBAAA,GAAuBA,EAAE,MAAA,CAAO;AAAA,EAC3C,MAAA,EAAQA,EAAE,MAAA,EAAO;AAAA,EACjB,MAAA,EAAQA,EAAE,MAAA,EAAO;AAAA,EACjB,MAAA,EAAQ,2BAA2B,QAAA,EAAS;AAAA,EAC5C,iBAAA,EAAmB,sCAAsC,QAAA,EAAS;AAAA,EAClE,gBAAA,EAAkBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAC/B,CAAC,CAAA;AAIuCA,CAAAA,CAAE,KAAA,CAAM,oBAAoB;AAS7D,SAAS,gBAAgB,EAAA,EAAoB;AAClD,EAAA,OAAO,EAAA,CAAG,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA;AAC7B;;;ACoCA,SAAS,iBAAA,CAAkB,IAAA,EAAoB,YAAA,GAAe,CAAA,EAAW;AACvE,EAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA,EAAG;AAChD,IAAA,OAAO,YAAA;AAAA,EACT;AAEA,EAAA,IAAI,aAAA,GAAgB,YAAA;AACpB,EAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,IAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,KAAA,EAAO,YAAA,GAAe,CAAC,CAAA;AAC5D,IAAA,IAAI,aAAa,aAAA,EAAe;AAC9B,MAAA,aAAA,GAAgB,UAAA;AAAA,IAClB;AAAA,EACF;AAEA,EAAA,OAAO,aAAA;AACT;AAKA,SAAS,WAAW,IAAA,EAA4B;AAC9C,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,KAAK,QAAA,EAAU;AACjB,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,MAAA,KAAA,IAAS,WAAW,KAAK,CAAA;AAAA,IAC3B;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,YAAA,CAAa,MAAoB,MAAA,EAAqC;AAE7E,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA;AAE7C,EAAA,IAAI,IAAA,CAAK,OAAO,YAAA,EAAc;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAK,QAAA,EAAU;AACjB,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,MAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,KAAA,EAAO,MAAM,CAAA;AACxC,MAAA,IAAI,OAAO,OAAO,KAAA;AAAA,IACpB;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAMA,SAAS,eAAA,CACP,KAAA,EACA,QAAA,EACA,WAAA,EACQ;AACR,EAAA,IAAI,CAAC,WAAA,IAAe,WAAA,IAAe,CAAA,EAAG,OAAO,CAAA;AAC7C,EAAA,IAAI,QAAA,KAAa,GAAG,OAAO,WAAA;AAG3B,EAAA,MAAM,QAAQ,KAAA,GAAQ,QAAA;AACtB,EAAA,OAAO,WAAA,GAAA,CAAe,cAAc,CAAA,IAAK,KAAA;AAC3C;AAKO,IAAM,aAAN,MAAiB;AAAA,EACd,OAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EAER,WAAA,CAAY,OAAA,GAA6B,EAAC,EAAG;AAC3C,IAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,OAAA,IAAW,YAAA;AAClC,IAAA,IAAA,CAAK,iBAAiB,OAAA,CAAQ,YAAA,GAC1B,IAAI,GAAA,CAAI,OAAA,CAAQ,YAAY,CAAA,GAC5B,IAAA;AACJ,IAAA,IAAA,CAAK,kBAAkB,IAAI,GAAA,CAAI,OAAA,CAAQ,aAAA,IAAiB,EAAE,CAAA;AAC1D,IAAA,IAAA,CAAK,eAAe,OAAA,CAAQ,YAAA;AAC5B,IAAA,IAAA,CAAK,qBAAqB,OAAA,CAAQ,gBAAA,IAAoB,OAAA,CAAQ,gBAAA,CAAiB,SAAS,CAAA,GACpF,IAAI,MAAA,CAAO,CAAA,IAAA,EAAO,QAAQ,gBAAA,CAAiB,IAAA,CAAK,GAAG,CAAC,CAAA,IAAA,CAAA,EAAQ,GAAG,CAAA,GAC/D,IAAA;AACJ,IAAA,IAAA,CAAK,gBAAA,GAAmB,OAAA,CAAQ,gBAAA,IAAoB,OAAA,CAAQ,gBAAA,CAAiB,MAAA,GAAS,CAAA,GAClF,IAAI,GAAA,CAAI,OAAA,CAAQ,gBAAgB,CAAA,GAChC,IAAA;AACJ,IAAA,IAAA,CAAK,kBAAkB,IAAI,GAAA;AAAA,MAAA,CACxB,OAAA,CAAQ,eAAA,IAAmB,EAAC,EAAG,GAAA;AAAA,QAC9B,CAAC,MAAM,CAAA,EAAG,eAAA,CAAgB,EAAE,MAAM,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,MAAM,CAAA;AAAA;AAClD,KACF;AACA,IAAA,IAAA,CAAK,gBAAgB,OAAA,CAAQ,KAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,IAAA,EAAoC;AAE1C,IAAA,MAAM,aAAA,uBAAoB,GAAA,EAAqB;AAG/C,IAAA,IAAI,WAAW,IAAA,CAAK,QAAA;AACpB,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,IAAA,CAAK,QAAA,EAAU,KAAK,YAAY,CAAA;AAChE,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,IAAA,CAAK,YAAY,CAAA,CAAE,CAAA;AAAA,MACxD;AACA,MAAA,QAAA,GAAW,UAAA;AAAA,IACb;AAGA,IAAA,MAAM,QAAA,GAAW,kBAAkB,QAAQ,CAAA;AAC3C,IAAA,MAAM,SAAA,GAAY,WAAW,QAAQ,CAAA;AAKrC,IAAA,MAAM,KAAA,GACJ,IAAA,CAAK,aAAA,IAAiB,mBAAA,CAAoB,QAAQ,CAAA;AAOpD,IAAA,MAAM,eAAe,QAAA,CAAS,IAAA;AAE9B,IAAA,MAAM,SAA0B,EAAC;AACjC,IAAA,MAAM,cAA6B,EAAC;AACpC,IAAA,MAAM,YAAA,GAAe,KAAK,eAAA,EAAgB;AAG1C,IAAA,IAAA,CAAK,gBAAA;AAAA,MACH,QAAA;AAAA,MACA,IAAA;AAAA,MACA,YAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA;AAAA,MACA,WAAA;AAAA,MACA,CAAA;AAAA,MACA,EAAC;AAAA,MACD,EAAC;AAAA,MACD,CAAA;AAAA,MACA,aAAA;AAAA,MACA,KAAA;AAAA,MACA,YAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,IAAA,GAAO,CAAA,EAAG;AACjC,MAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,QAAA,MAAM,GAAA,GAAM,CAAA,EAAG,eAAA,CAAgB,KAAA,CAAM,SAAA,CAAU,MAAM,CAAC,CAAA,EAAA,EAAK,KAAA,CAAM,SAAA,CAAU,MAAM,CAAA,CAAA;AACjF,QAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,EAAG;AACjC,UAAA,KAAA,CAAM,YAAA,GAAe,IAAA;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,MAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MACnC;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAA,GAA0B;AAChC,IAAA,OAAO,YAAA,CAAa,MAAA,EAAO,CAAE,MAAA,CAAO,CAAC,IAAA,KAAS;AAC5C,MAAA,MAAM,MAAA,GAAS,KAAK,UAAA,CAAW,EAAA;AAG/B,MAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,MAAM,GAAG,OAAO,KAAA;AAG7C,MAAA,IAAI,IAAA,CAAK,kBAAkB,CAAC,IAAA,CAAK,eAAe,GAAA,CAAI,MAAM,GAAG,OAAO,KAAA;AAGpE,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAClC,MAAA,OAAO,QAAQ,OAAA,IAAW,IAAA;AAAA,IAC5B,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAA,CACN,IAAA,EACA,IAAA,EACA,KAAA,EACA,UACA,MAAA,EACA,WAAA,EACA,KAAA,EACA,IAAA,EACA,eACA,cAAA,EACA,aAAA,EACA,KAAA,EACA,YAAA,EACA,QACA,QAAA,EACM;AACN,IAAA,MAAM,QAAA,GAAW,CAAC,GAAG,IAAA,EAAM,KAAK,IAAI,CAAA;AAGpC,IAAA,MAAM,mBAAA,GAAsB,KAAK,IAAA,KAAS,WAAA,IAAe,KAAK,IAAA,KAAS,eAAA,IAAmB,KAAK,IAAA,KAAS,UAAA;AACxG,IAAA,MAAM,qBAAA,GAAwB,sBAAsB,CAAA,GAAI,cAAA;AAGxD,IAAA,IAAI,KAAK,gBAAA,IAAoB,IAAA,CAAK,iBAAiB,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG;AACjE,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAK,kBAAA,IAAsB,IAAA,CAAK,mBAAmB,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAG;AACtE,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAAuB;AAAA,MAC3B,IAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA;AAAA,MACA,cAAA,EAAgB,qBAAA;AAAA,MAChB,QAAA;AAAA,MACA,IAAA,EAAM,QAAA;AAAA,MACN,aAAA;AAAA,MACA,QAAA;AAAA,MACA,aAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,MAAA,GAAS,KAAK,UAAA,CAAW,EAAA;AAC/B,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAClC,MAAA,MAAM,UAAU,MAAA,EAAQ,OAAA;AAExB,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,SAAS,OAAO,CAAA;AAEnD,QAAA,IAAI,SAAA,EAAW;AAEb,UAAA,IAAI,kBAAkB,MAAA,CAAO,KAAA;AAE7B,UAAA,IACE,oBAAoB,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,IAC5C,OAAO,WAAA,EACP;AACA,YAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,KAAA,EAAO,QAAA,EAAU,OAAO,WAAW,CAAA;AAClE,YAAA,eAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,KAAA,GAAQ,MAAM,CAAA;AAAA,UACpD;AAEA,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,SAAA;AAAA,YACA,IAAA;AAAA,YACA,MAAA;AAAA,YACA,KAAA;AAAA,YACA,QAAA;AAAA,YACA;AAAA,WACD,CAAA;AAAA,QACH;AAAA,MACF,SAAS,KAAA,EAAO;AAEd,QAAA,WAAA,CAAY,IAAA,CAAK;AAAA,UACf,MAAA;AAAA,UACA,UAAU,IAAA,CAAK,IAAA;AAAA,UACf,QAAQ,IAAA,CAAK,EAAA;AAAA,UACb,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,SAC7D,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,EAAG;AAC7C,MAAA,MAAM,kBAAA,GAAqB,CAAC,GAAG,aAAA,EAAe,KAAK,IAAI,CAAA;AACvD,MAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,QAAA,IAAA,CAAK,gBAAA;AAAA,UACH,KAAA;AAAA,UACA,IAAA;AAAA,UACA,KAAA;AAAA,UACA,QAAA;AAAA,UACA,MAAA;AAAA,UACA,WAAA;AAAA,UACA,KAAA,GAAQ,CAAA;AAAA,UACR,QAAA;AAAA,UACA,kBAAA;AAAA,UACA,qBAAA,GAAwB,CAAA;AAAA,UACxB,aAAA;AAAA,UACA,KAAA;AAAA,UACA,YAAA;AAAA,UACA,IAAA;AAAA,UACA,IAAA,CAAK;AAAA,SACP;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,iBAAiB,OAAA,EAAyC;AACxE,EAAA,OAAO,IAAI,WAAW,OAAO,CAAA;AAC/B;AAKO,SAAS,WAAA,CACd,MACA,OAAA,EACgB;AAChB,EAAA,MAAM,MAAA,GAAS,iBAAiB,OAAO,CAAA;AACvC,EAAA,OAAO,MAAA,CAAO,QAAQ,IAAI,CAAA;AAC5B;;;AC1ZO,SAAS,sBAAsB,MAAA,EAAyB;AAC7D,EAAA,OAAO,OAAO,UAAA,CAAW,GAAG,CAAA,IAAK,MAAA,CAAO,SAAS,GAAG,CAAA;AACtD;AAEO,SAAS,yBACd,MAAA,EAC6B;AAC7B,EAAA,IAAI,CAAC,qBAAA,CAAsB,MAAM,CAAA,EAAG,OAAO,IAAA;AAE3C,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AACjC,EAAA,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AAEhC,EAAA,MAAM,mBAAmB,QAAA,CAAS,CAAC,CAAA,CAAG,OAAA,CAAQ,MAAM,EAAE,CAAA;AACtD,EAAA,MAAM,YAAA,GAAe,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AAEjD,EAAA,IAAI,CAAC,gBAAA,IAAoB,CAAC,YAAA,EAAc,OAAO,IAAA;AAE/C,EAAA,OAAO,EAAE,kBAAkB,YAAA,EAAa;AAC1C;;;ACOA,IAAM,gBAAA,GAAsD;AAAA;AAAA,EAE1D,gBAAA,EAAkB,cAAA;AAAA,EAClB,2BAAA,EAA6B,cAAA;AAAA,EAC7B,yBAAA,EAA2B,cAAA;AAAA,EAC3B,mBAAA,EAAqB,cAAA;AAAA,EACrB,mBAAA,EAAqB,cAAA;AAAA;AAAA,EAErB,sBAAA,EAAwB,gBAAA;AAAA,EACxB,cAAA,EAAgB,gBAAA;AAAA,EAChB,mBAAA,EAAqB,gBAAA;AAAA,EACrB,mBAAA,EAAqB,gBAAA;AAAA;AAAA,EAErB,kCAAA,EAAoC,YAAA;AAAA,EACpC,4BAAA,EAA8B,YAAA;AAAA;AAAA,EAE9B,qBAAA,EAAuB,UAAA;AAAA,EACvB,gCAAA,EAAkC,UAAA;AAAA,EAClC,WAAA,EAAa,UAAA;AAAA,EACb,2BAAA,EAA6B,UAAA;AAAA,EAC7B,mBAAA,EAAqB;AACvB,CAAA;AAUA,SAAS,qBAAA,CACP,QACA,OAAA,EAC+B;AAC/B,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,gBAAA;AACH,MAAA,OAAO,CAAC,cAAc,aAAa,CAAA;AAAA,IACrC,KAAK,2BAAA;AACH,MAAA,IAAI,OAAA,KAAY,cAAc,OAAO,wBAAA;AAErC,MAAA,OAAO,CAAC,0BAA0B,sBAAsB,CAAA;AAAA,IAC1D,KAAK,yBAAA;AAUH,MAAA,OAAO,CAAC,YAAY,UAAU,CAAA;AAAA,IAChC,KAAK,mBAAA;AACH,MAAA,IAAI,OAAA,KAAY,OAAO,OAAO,aAAA;AAE9B,MAAA,OAAO,CAAC,YAAA,EAAc,cAAA,EAAgB,eAAA,EAAiB,aAAa,CAAA;AAAA,IACtE,KAAK,mBAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,sBAAA;AACH,MAAA,OAAO,YAAA;AAAA,IACT,KAAK,qBAAA;AAAA,IACL,KAAK,gCAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,cAAA;AAAA,IACL,KAAK,mBAAA;AAAA,IACL,KAAK,mBAAA;AAAA,IACL,KAAK,kCAAA;AAAA,IACL,KAAK,4BAAA;AAAA,IACL,KAAK,WAAA;AAAA,IACL,KAAK,2BAAA;AAAA,IACL,KAAK,mBAAA;AACH,MAAA,OAAO,MAAA;AAAA;AAEb;AAiBO,SAAS,mBAAA,CACd,WACA,eAAA,EACc;AACd,EAAA,MAAM,SAAS,SAAA,CAAU,MAAA;AACzB,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,MAAM,CAAA,IAAK,YAAA;AAClD,EAAA,MAAM,cAAA,GAAiB,qBAAA,CAAsB,MAAA,EAAQ,SAAA,CAAU,OAAO,CAAA;AACtE,EAAA,MAAM,oBAAA,GAAuB,uBAAA;AAAA,IAC3B,MAAA;AAAA,IACA,SAAA,CAAU;AAAA,GACZ;AAEA,EAAA,MAAM,MAAA,GAAS,wBAAA,CAAyB,SAAA,CAAU,MAAM,CAAA;AACxD,EAAA,MAAM,eAAA,GACJ,MAAA,KAAW,IAAA,IAAQ,qBAAA,CAAsB,UAAU,MAAM,CAAA;AAC3D,EAAA,MAAM,aAAA,GAAiD,MAAA,EAAQ,YAAA;AAE/D,EAAA,OAAO;AAAA,IACL,aAAA;AAAA,IACA,GAAI,cAAA,KAAmB,MAAA,GAAY,EAAE,cAAA,KAAmB,EAAC;AAAA,IACzD,GAAI,oBAAA,KAAyB,MAAA,GAAY,EAAE,oBAAA,KAAyB,EAAC;AAAA,IACrE,eAAA;AAAA,IACA,GAAI,aAAA,KAAkB,MAAA,GAAY,EAAE,aAAA,KAAkB;AAAC,GACzD;AACF;;;AC7EA,SAAS,6BACP,OAAA,EAC0B;AAC1B,EAAA,MAAM,SAAS,MAAA,CAAO,WAAA;AAAA,IACpB,WAAW,GAAA,CAAI,CAAA,CAAA,KAAK,CAAC,CAAA,EAAG,CAAC,CAAC;AAAA,GAC5B;AAEA,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAClD,IAAA,MAAM,QAAA,GAAW,iBAAiB,EAAY,CAAA;AAC9C,IAAA,IAAI,QAAA,IAAY,OAAO,OAAA,EAAS;AAC9B,MAAA,MAAA,CAAO,QAAQ,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,OAAO,KAAK,CAAA;AAAA,IAC3C;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAkBA,IAAM,cAAA,GAAiB,GAAA;AACvB,IAAM,gBAAA,GAAmB,GAAA;AASzB,IAAM,WAAA,GAAc,CAAA;AAQpB,SAAS,eAAe,UAAA,EAA2B;AACjD,EAAA,IAAI,UAAA,IAAc,IAAI,OAAO,GAAA;AAC7B,EAAA,IAAI,UAAA,IAAc,IAAI,OAAO,IAAA;AAC7B,EAAA,IAAI,UAAA,IAAc,IAAI,OAAO,GAAA;AAC7B,EAAA,IAAI,UAAA,IAAc,IAAI,OAAO,IAAA;AAC7B,EAAA,IAAI,UAAA,IAAc,IAAI,OAAO,GAAA;AAC7B,EAAA,IAAI,UAAA,IAAc,IAAI,OAAO,IAAA;AAC7B,EAAA,IAAI,UAAA,IAAc,IAAI,OAAO,GAAA;AAC7B,EAAA,IAAI,UAAA,IAAc,IAAI,OAAO,GAAA;AAC7B,EAAA,OAAO,GAAA;AACT;AAOO,SAAS,kBAAkB,KAAA,EAAuB;AACvD,EAAA,OAAO,KAAA,KAAU,GAAA,IAAO,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,GAAA;AACtD;AAMO,SAAS,iBAAiB,KAAA,EAAsB;AACrD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,GAAA,EAAK,MAAM,CAAA;AAClC;AAKA,SAAS,KAAA,CAAM,KAAA,EAAe,GAAA,EAAa,GAAA,EAAqB;AAC9D,EAAA,OAAO,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,CAAC,CAAA;AAC3C;AAaO,SAAS,eAAA,CACd,QACA,OAAA,EACa;AACb,EAAA,MAAM,iBAAiB,wBAAA,EAAyB;AAChD,EAAA,MAAM,YAAY,MAAA,CAAO,SAAA;AAGzB,EAAA,MAAM,sBAAA,uBAA6B,GAAA,EAA2B;AAC9D,EAAA,MAAM,oBAAA,uBAA2B,GAAA,EAAmC;AAEpE,EAAA,MAAM,yBAAA,uBAAgC,GAAA,EAAmC;AACzE,EAAA,KAAA,MAAW,YAAY,UAAA,EAAY;AACjC,IAAA,sBAAA,CAAuB,GAAA,CAAI,QAAA,kBAAU,IAAI,GAAA,EAAK,CAAA;AAC9C,IAAA,oBAAA,CAAqB,GAAA,CAAI,QAAA,kBAAU,IAAI,GAAA,EAAK,CAAA;AAC5C,IAAA,yBAAA,CAA0B,GAAA,CAAI,QAAA,kBAAU,IAAI,GAAA,EAAK,CAAA;AAAA,EACnD;AAMA,EAAA,MAAM,qBAAA,GAAwB,4BAAA,CAA6B,OAAA,IAAW,YAAY,CAAA;AAGlF,EAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,QAAA;AACvC,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,QAAA;AAC9B,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,EAAA;AAErC,IAAA,cAAA,CAAe,QAAQ,CAAA,CAAE,UAAA,EAAA;AACzB,IAAA,cAAA,CAAe,QAAQ,CAAA,CAAE,UAAA,CAAW,QAAQ,CAAA,EAAA;AAC5C,IAAA,sBAAA,CAAuB,GAAA,CAAI,QAAQ,CAAA,CAAG,GAAA,CAAI,MAAM,CAAA;AAChD,IAAA,oBAAA,CAAqB,GAAA,CAAI,QAAQ,CAAA,CAAG,GAAA,CAAI,MAAA,EAAQ,KAAK,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAO5E,IAAA,MAAM,YAAA,GAAe,yBAAA,CAA0B,GAAA,CAAI,QAAQ,CAAA;AAC3D,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,YAAA,KAAiB,IAAA,GAAO,GAAA,GAAM,CAAA;AACnD,IAAA,YAAA,CAAa,IAAI,MAAA,EAAA,CAAS,YAAA,CAAa,IAAI,MAAM,CAAA,IAAK,KAAK,MAAM,CAAA;AAAA,EACnE;AAOA,EAAA,KAAA,MAAW,YAAY,UAAA,EAAY;AACjC,IAAA,MAAM,YAAA,GAAe,yBAAA,CAA0B,GAAA,CAAI,QAAQ,CAAA;AAC3D,IAAA,MAAM,YAAA,GAAe,oBAAA,CAAqB,GAAA,CAAI,QAAQ,CAAA;AACtD,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,KAAK,CAAA,IAAK,YAAA,EAAc;AAC1C,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA,IAAK,CAAA;AAC9C,MAAA,YAAA,IAAgB,SAAA,GAAY,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,IAC7C;AACA,IAAA,cAAA,CAAe,QAAQ,EAAE,kBAAA,GAAqB,YAAA;AAAA,EAChD;AAGA,EAAA,KAAA,MAAW,YAAY,UAAA,EAAY;AACjC,IAAA,MAAM,QAAA,GAAW,eAAe,QAAQ,CAAA;AACxC,IAAA,MAAM,WAAA,GAAc,sBAAA,CAAuB,GAAA,CAAI,QAAQ,CAAA;AAEvD,IAAA,QAAA,CAAS,kBAAkB,WAAA,CAAY,IAAA;AAGvC,IAAA,IAAI,YAAA,GAAe,GAAA;AACnB,IAAA,IAAI,SAAA,GAAY,CAAA,IAAK,QAAA,CAAS,UAAA,GAAa,CAAA,EAAG;AAC5C,MAAA,MAAM,OAAA,GAAU,SAAS,kBAAA,GAAqB,SAAA;AAC9C,MAAA,YAAA,GAAe,KAAA,CAAM,KAAK,KAAA,CAAM,GAAA,GAAM,UAAU,GAAG,CAAA,EAAG,GAAG,GAAG,CAAA;AAAA,IAC9D;AACA,IAAA,QAAA,CAAS,YAAA,GAAe,YAAA;AAOxB,IAAA,IAAI,cAAA,GAAiB,GAAA;AACrB,IAAA,IAAI,QAAA,CAAS,aAAa,CAAA,EAAG;AAC3B,MAAA,MAAM,UAAA,GAAa,oBAAA,CAAqB,GAAA,CAAI,QAAQ,CAAA;AACpD,MAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,GAAG,CAAC,CAAA;AACvF,MAAA,MAAM,aAAA,GAAgB,sBAAsB,QAAQ,CAAA;AACpD,MAAA,MAAM,cAAA,GAAiB,aAAA,GAAgB,CAAA,GAAI,iBAAA,GAAoB,aAAA,GAAgB,CAAA;AAC/E,MAAA,cAAA,GAAiB,KAAA,CAAM,KAAK,KAAA,CAAA,CAAO,CAAA,GAAI,kBAAkB,GAAG,CAAA,EAAG,GAAG,GAAG,CAAA;AAAA,IACvE;AACA,IAAA,QAAA,CAAS,cAAA,GAAiB,cAAA;AAG1B,IAAA,MAAM,aAAA,GAAgB,YAAA,GAAe,cAAA,GAAiB,cAAA,GAAiB,gBAAA;AACvE,IAAA,QAAA,CAAS,UAAA,GAAa,QAAA,CAAS,UAAA,GAAa,CAAA,GACxC,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,aAAa,CAAA,EAAG,WAAA,EAAa,GAAG,CAAA,GACjD,GAAA;AAEJ,IAAA,QAAA,CAAS,QAAQ,QAAA,CAAS,UAAA;AAC1B,IAAA,QAAA,CAAS,QAAA,GAAW,GAAA;AAAA,EACtB;AAKA,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,KAAA,MAAW,YAAY,UAAA,EAAY;AACjC,IAAA,WAAA,IAAe,cAAA,CAAe,QAAQ,CAAA,CAAE,UAAA;AAAA,EAC1C;AAEA,EAAA,MAAM,iBAAA,GAAoB,WAAW,MAAA,GAAS,CAAA,GAC1C,KAAK,KAAA,CAAM,WAAA,GAAc,UAAA,CAAW,MAAM,CAAA,GAC1C,GAAA;AAGJ,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,WAAA,EAAa,OAAO,MAAA,CAAO,MAAA;AAAA,IAC3B,QAAA,EAAU,CAAA;AAAA,IACV,IAAA,EAAM,CAAA;AAAA,IACN,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY,CAAA;AAAA,IACZ,SAAA;AAAA,IACA,iBAAA,EAAmB;AAAA,GACrB;AAEA,EAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,IAAA,QAAQ,KAAA,CAAM,OAAO,QAAA;AAAU,MAC7B,KAAK,UAAA;AACH,QAAA,OAAA,CAAQ,QAAA,EAAA;AACR,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,OAAA,CAAQ,IAAA,EAAA;AACR,QAAA;AAAA,MACF,KAAK,cAAA;AACH,QAAA,OAAA,CAAQ,WAAA,EAAA;AACR,QAAA;AAAA,MACF,KAAK,YAAA;AACH,QAAA,OAAA,CAAQ,UAAA,EAAA;AACR,QAAA;AAAA;AAEJ,IAAA,IAAI,KAAA,CAAM,YAAA,KAAiB,IAAA,EAAM,OAAA,CAAQ,iBAAA,EAAA;AAAA,EAC3C;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS;AAAA,MACP,KAAA,EAAO,iBAAA;AAAA,MACP,QAAA,EAAU,GAAA;AAAA,MACV,UAAA,EAAY,iBAAA;AAAA,MACZ,KAAA,EAAO,eAAe,iBAAiB;AAAA,KACzC;AAAA,IACA,UAAA,EAAY,cAAA;AAAA,IACZ;AAAA,GACF;AACF;AAKA,SAAS,wBAAA,GAAkE;AACzE,EAAA,MAAM,SAAyD,EAAC;AAEhE,EAAA,KAAA,MAAW,YAAY,UAAA,EAAY;AACjC,IAAA,MAAA,CAAO,QAAQ,CAAA,GAAI;AAAA,MACjB,QAAA;AAAA,MACA,KAAA,EAAO,GAAA;AAAA,MACP,QAAA,EAAU,GAAA;AAAA,MACV,UAAA,EAAY,GAAA;AAAA,MACZ,UAAA,EAAY,CAAA;AAAA,MACZ,eAAA,EAAiB,CAAA;AAAA,MACjB,kBAAA,EAAoB,CAAA;AAAA,MACpB,YAAA,EAAc,GAAA;AAAA,MACd,cAAA,EAAgB,GAAA;AAAA,MAChB,UAAA,EAAY;AAAA,QACV,QAAA,EAAU,CAAA;AAAA,QACV,IAAA,EAAM,CAAA;AAAA,QACN,cAAA,EAAgB,CAAA;AAAA,QAChB,UAAA,EAAY;AAAA;AACd,KACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,mBAAmB,MAAA,EAA6B;AAC9D,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,CAAM,IAAA,CAAK,YAAY,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAA,EAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAA,CAAI,CAAA;AAC7E,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,cAAc,CAAA;AAEzB,EAAA,KAAA,MAAW,YAAY,UAAA,EAAY;AACjC,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,QAAQ,CAAA;AACtC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,QAAQ,CAAA,EAAA,EAAK,GAAA,CAAI,UAAU,CAAA,GAAA,EAAM,GAAA,CAAI,UAAU,CAAA,SAAA,EAAY,GAAA,CAAI,eAAe,CAAA,OAAA,CAAS,CAAA;AAAA,EACzG;AAEA,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AACpB,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,CAAA;AACnD,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AAC3C,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,CAAE,CAAA;AAC1D,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,CAAE,CAAA;AACvD,EAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,iBAAA,GAAoB,CAAA,EAAG;AACxC,IAAA,MAAM,WAAA,GACJ,MAAA,CAAO,OAAA,CAAQ,WAAA,GAAc,OAAO,OAAA,CAAQ,iBAAA;AAC9C,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,SAAA,EAAY,OAAO,OAAA,CAAQ,WAAW,KAAK,MAAA,CAAO,OAAA,CAAQ,iBAAiB,CAAA,yCAAA,EAA4C,WAAW,CAAA,aAAA;AAAA,KACpI;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAY,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,CAAE,CAAA;AAAA,EACrD;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAKO,SAAS,iBAAiB,QAAA,EAA4B;AAC3D,EAAA,OAAO,gBAAgB,QAAQ,CAAA;AACjC;AAKO,SAAS,iBAAiB,QAAA,EAA4B;AAC3D,EAAA,MAAM,MAAA,GAAmC;AAAA,IACvC,QAAA,EAAU,UAAA;AAAA,IACV,IAAA,EAAM,MAAA;AAAA,IACN,cAAA,EAAgB,cAAA;AAAA,IAChB,UAAA,EAAY;AAAA,GACd;AACA,EAAA,OAAO,OAAO,QAAQ,CAAA;AACxB;AAMO,SAAS,eAAA,CACd,QAAA,EACA,MAAA,EACA,MAAA,EACA,OAAA,EACyB;AACzB,EAAA,MAAM,eAAuC,EAAC;AAC9C,EAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,IAAA,MAAM,EAAA,GAAK,MAAM,SAAA,CAAU,MAAA;AAC3B,IAAA,YAAA,CAAa,EAAE,CAAA,GAAA,CAAK,YAAA,CAAa,EAAE,KAAK,CAAA,IAAK,CAAA;AAAA,EAC/C;AAEA,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU;AAC1C,IAAA,MAAM,YAAA,GAAe,mBAAA,CAAoB,KAAA,CAAM,SAAS,CAAA;AACxD,IAAA,MAAM,aAAA,GAAgB,MAAM,SAAA,CAAU,aAAA;AACtC,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,MAAM,SAAA,CAAU,MAAA;AAAA,MACxB,SAAA,EAAW,YAAA;AAAA,MACX,aAAA,EAAe,OAAA;AAAA,MACf,iBAAA,EAAmB,WAAA;AAAA,MACnB,OAAA,EAAS,cAAA,CAAe,KAAA,CAAM,SAAA,CAAU,MAAM,CAAA;AAAA,MAC9C,GAAI,MAAM,SAAA,CAAU,OAAA,IAAW,EAAE,OAAA,EAAS,KAAA,CAAM,UAAU,OAAA,EAAQ;AAAA,MAClE,QAAA,EAAU,MAAM,MAAA,CAAO,QAAA;AAAA,MACvB,MAAA,EAAQ,MAAM,SAAA,CAAU,MAAA;AAAA,MACxB,QAAA,EAAU,MAAM,SAAA,CAAU,QAAA;AAAA,MAC1B,OAAA,EAAS,MAAM,SAAA,CAAU,OAAA;AAAA,MACzB,eAAe,YAAA,CAAa,aAAA;AAAA,MAC5B,GAAI,aAAa,cAAA,KAAmB,MAAA,GAChC,EAAE,cAAA,EAAgB,YAAA,CAAa,cAAA,EAAe,GAC9C,EAAC;AAAA,MACL,GAAI,aAAa,oBAAA,KAAyB,MAAA,GACtC,EAAE,oBAAA,EAAsB,YAAA,CAAa,oBAAA,EAAqB,GAC1D,EAAC;AAAA,MACL,GAAI,aAAA,KAAkB,MAAA,GAAY,EAAE,aAAA,KAAkB,EAAC;AAAA,MACvD,iBAAiB,YAAA,CAAa,eAAA;AAAA,MAC9B,GAAI,aAAa,aAAA,KAAkB,MAAA,GAC/B,EAAE,aAAA,EAAe,YAAA,CAAa,aAAA,EAAc,GAC5C,EAAC;AAAA,MACL,GAAI,MAAM,YAAA,KAAiB,IAAA,GAAO,EAAE,YAAA,EAAc,IAAA,KAAkB;AAAC,KACvE;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,IAAA,GAAgC;AAAA,IACpC,OAAA;AAAA,IACA,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,GAAI,OAAA,EAAS,OAAA,IAAW,EAAE,OAAA,EAAS,QAAQ,OAAA,EAAQ;AAAA,IACnD,GAAI,OAAA,EAAS,SAAA,IAAa,EAAE,SAAA,EAAW,QAAQ,SAAA,EAAU;AAAA,IACzD,QAAA;AAAA,IACA,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,UAAA,EAAY,OAAO,MAAA,CAAO,MAAA;AAAA,IAC1B,iBAAA,EAAmB,OAAO,OAAA,CAAQ,iBAAA;AAAA,IAClC,iBAAA,EAAmB,iBAAA,CAAkB,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AAAA,IACzD,kBAAA,EAAoB,OAAO,OAAA,CAAQ,QAAA;AAAA,IACnC,MAAA,EAAQ;AAAA,MACN,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,YAAY,MAAA,CAAO;AAAA,KACrB;AAAA,IACA,YAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA,EAAS,mBAAmB,MAAM;AAAA,GACpC;AAEA,EAAA,IAAI,MAAA,CAAO,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AACjC,IAAA,IAAA,CAAK,aAAa,IAAI,MAAA,CAAO,WAAA;AAAA,EAC/B;AAEA,EAAA,OAAO,IAAA;AACT;ACjeA,SAAS,UAAU,KAAA,EAA0E;AAC3F,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAA,CAAO,KAAA,CAAM,CAAA,IAAK,KAAK,GAAG,CAAA;AACzC,EAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAA,CAAO,KAAA,CAAM,CAAA,IAAK,KAAK,GAAG,CAAA;AACzC,EAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAA,CAAO,KAAA,CAAM,CAAA,IAAK,KAAK,GAAG,CAAA;AACzC,EAAA,OAAO,CAAA,CAAA,EAAI,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,CAAG,WAAA,EAAY;AAC/H;AASA,SAAS,YAAY,IAAA,EAA8B;AACjD,EAAA,MAAM,SAAmB,EAAE,KAAA,EAAO,MAAM,QAAA,EAAU,KAAA,EAAO,gBAAgB,IAAA,EAAK;AAC9E,EAAA,IAAI,CAAC,KAAK,KAAA,IAAS,CAAC,MAAM,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,MAAA;AACtD,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,IAAA,MAAM,CAAA,GAAI,IAAA;AASV,IAAA,IAAI,CAAA,CAAE,YAAY,KAAA,EAAO;AACzB,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,OAAA,IAAW,CAAA,CAAE,KAAA,EAAO;AACjC,MAAA,MAAM,OAAA,GAAU,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,MAAM,CAAA,IAAK,CAAA;AAC1C,MAAA,IAAI,UAAA;AACJ,MAAA,IAAI,UAAU,CAAA,EAAG;AACf,QAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAA,CAAO,EAAE,KAAA,CAAM,CAAA,IAAK,KAAK,GAAG,CAAA;AAC3C,QAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAA,CAAO,EAAE,KAAA,CAAM,CAAA,IAAK,KAAK,GAAG,CAAA;AAC3C,QAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAA,CAAO,EAAE,KAAA,CAAM,CAAA,IAAK,KAAK,GAAG,CAAA;AAC3C,QAAA,UAAA,GAAa,QAAQ,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,EAAA,EAAK,CAAC,KAAK,OAAO,CAAA,CAAA,CAAA;AAAA,MAChD,CAAA,MAAO;AACL,QAAA,UAAA,GAAa,SAAA,CAAU,CAAA,CAAE,KAAK,CAAA,IAAK,MAAA;AAAA,MACrC;AAEA,MAAA,IAAI,CAAA,CAAE,cAAA,EAAgB,KAAA,EAAO,EAAA,EAAI;AAC/B,QAAA,MAAA,CAAO,QAAQ,CAAA,EAAG,UAAU,WAAW,CAAA,CAAE,cAAA,CAAe,MAAM,EAAE,CAAA,GAAA,CAAA;AAAA,MAClE,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,KAAA,GAAQ,UAAA;AAAA,MACjB;AAAA,IACF,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,OAAA,EAAS;AAC7B,MAAA,MAAA,CAAO,QAAA,GAAW,IAAA;AAClB,MAAA,MAAA,CAAO,cAAA,GAAiB,EAAE,SAAA,IAAa,IAAA;AAAA,IACzC;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAGA,SAAS,QAAQ,IAAA,EAAmC;AAClD,EAAA,OAAO,WAAA,CAAY,IAAI,CAAA,CAAE,KAAA;AAC3B;AAGA,SAAS,UAAU,IAAA,EAAmC;AACpD,EAAA,IAAI,CAAC,KAAK,OAAA,IAAW,CAAC,MAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,EAAG,OAAO,IAAA;AAC1D,EAAA,KAAA,MAAW,MAAA,IAAU,KAAK,OAAA,EAAS;AACjC,IAAA,MAAM,CAAA,GAAI,MAAA;AACV,IAAA,IAAI,CAAA,CAAE,SAAS,OAAA,IAAW,CAAA,CAAE,OAAO,OAAO,SAAA,CAAU,EAAE,KAAK,CAAA;AAAA,EAC7D;AACA,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,UAAU,IAAA,EAAmC;AACpD,EAAA,IAAI,CAAC,KAAK,OAAA,IAAW,CAAC,MAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,EAAG,OAAO,IAAA;AAC1D,EAAA,KAAA,MAAW,MAAA,IAAU,KAAK,OAAA,EAAS;AACjC,IAAA,MAAM,CAAA,GAAI,MAAA;AAOV,IAAA,IAAA,CAAK,CAAA,CAAE,SAAS,aAAA,IAAiB,CAAA,CAAE,SAAS,cAAA,KAAmB,CAAA,CAAE,YAAY,KAAA,EAAO;AAClF,MAAA,MAAM,IAAI,CAAA,CAAE,KAAA,GAAQ,SAAA,CAAU,CAAA,CAAE,KAAK,CAAA,GAAI,MAAA;AACzC,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,MAAA,EAAQ,CAAA,IAAK,CAAA;AAC1B,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,MAAA,EAAQ,CAAA,IAAK,CAAA;AAC1B,MAAA,OAAO,CAAA,EAAG,EAAE,CAAA,GAAA,EAAM,EAAE,MAAM,CAAA,CAAE,MAAA,IAAU,CAAC,CAAA,GAAA,EAAM,CAAC,CAAA,CAAA;AAAA,IAChD;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,SAAS,UAAA,EAA4B;AAC5C,EAAA,MAAM,GAAA,GAA8B;AAAA,IAClC,GAAA,EAAK,YAAA;AAAA,IACL,MAAA,EAAQ,QAAA;AAAA,IACR,GAAA,EAAK,UAAA;AAAA,IACL,aAAA,EAAe;AAAA,GACjB;AACA,EAAA,OAAO,GAAA,CAAI,UAAU,CAAA,IAAK,UAAA;AAC5B;AAGA,SAAS,uBAAuB,UAAA,EAA4B;AAC1D,EAAA,MAAM,GAAA,GAA8B;AAAA,IAClC,IAAA,EAAM,MAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,KAAA,EAAO,OAAA;AAAA,IACP,SAAA,EAAW;AAAA,GACb;AACA,EAAA,OAAO,GAAA,CAAI,UAAU,CAAA,IAAK,UAAA,CAAW,WAAA,EAAY;AACnD;AAGA,SAAS,qBAAqB,UAAA,EAA4B;AACxD,EAAA,MAAM,GAAA,GAA8B;AAAA,IAClC,GAAA,EAAK,YAAA;AAAA,IACL,MAAA,EAAQ,QAAA;AAAA,IACR,MAAA,EAAQ;AAAA,GACV;AACA,EAAA,OAAO,GAAA,CAAI,UAAU,CAAA,IAAK,UAAA,CAAW,WAAA,EAAY;AACnD;AAGA,SAAS,SAAA,CAAU,MAAoB,IAAA,EAAsB;AAC3D,EAAA,MAAM,KAAK,IAAA,CAAK,cAAA;AAChB,EAAA,IAAI,CAAC,IAAI,OAAO,EAAA;AAChB,EAAA,MAAM,GAAA,GAAM,GAAG,IAAI,CAAA;AACnB,EAAA,IAAI,CAAC,KAAK,OAAO,EAAA;AACjB,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,IAAA,IAAQ,QAAQ,GAAA,EAAK;AAC1D,IAAA,OAAO,CAAA,QAAA,EAAY,IAAuB,EAAE,CAAA,GAAA,CAAA;AAAA,EAC9C;AACA,EAAA,OAAO,EAAA;AACT;AAGA,SAAS,cAAA,CAAe,MAAoB,KAAA,EAAyB;AACnE,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,GAAA,GAAM,SAAA,CAAU,IAAA,EAAM,IAAI,CAAA;AAChC,IAAA,IAAI,KAAK,OAAO,GAAA;AAAA,EAClB;AACA,EAAA,OAAO,EAAA;AACT;AAGA,SAAS,0BAA0B,IAAA,EAAmC;AACpE,EAAA,IAAI,CAAC,IAAA,CAAK,mBAAA,IAAuB,OAAO,IAAA,CAAK,mBAAA,KAAwB,UAAU,OAAO,IAAA;AACtF,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,mBAAmB,CAAA,CACpD,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,KAAK,CAAA,KAAM;AACtB,IAAA,MAAM,CAAA,GAAI,KAAA;AACV,IAAA,MAAM,GAAA,GAAM,OAAO,CAAA,EAAG,KAAA,KAAU,QAAA,GAAW,CAAA,CAAE,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,KAAA,IAAS,EAAE,CAAA;AAClF,IAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAAA,EACvB,CAAC,CAAA;AACH,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACjC,EAAA,OAAO,OAAA,CAAQ,KAAK,IAAI,CAAA;AAC1B;AAGA,SAAS,oBAAoB,IAAA,EAA4C;AACvE,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,MAAM,QAAA,GAAW,YAAY,IAAI,CAAA;AACjC,EAAA,IAAI,QAAA,CAAS,SAAS,IAAA,CAAK,IAAA,KAAS,QAAQ,MAAA,CAAO,YAAY,IAAI,QAAA,CAAS,KAAA;AAC5E,EAAA,MAAM,MAAA,GAAS,UAAU,IAAI,CAAA;AAC7B,EAAA,IAAI,MAAA,EAAQ,MAAA,CAAO,cAAc,CAAA,GAAI,MAAA;AACrC,EAAA,IAAI,KAAK,YAAA,EAAc,MAAA,CAAO,eAAe,CAAA,GAAI,CAAA,EAAG,KAAK,YAAY,CAAA,EAAA,CAAA;AACrE,EAAA,IAAI,KAAK,OAAA,KAAY,MAAA,IAAa,IAAA,CAAK,OAAA,GAAU,GAAG,MAAA,CAAO,SAAS,CAAA,GAAI,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,CAAK,OAAA,GAAU,GAAG,IAAI,GAAG,CAAA,CAAA;AAC/G,EAAA,MAAM,MAAA,GAAS,UAAU,IAAI,CAAA;AAC7B,EAAA,IAAI,MAAA,EAAQ,MAAA,CAAO,YAAY,CAAA,GAAI,MAAA;AAEnC,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,IAAA,MAAM,SAAA,GAAY,QAAQ,IAAI,CAAA;AAC9B,IAAA,IAAI,SAAA,EAAW,MAAA,CAAO,OAAO,CAAA,GAAI,SAAA;AAAA,EACnC;AACA,EAAA,OAAO,MAAA;AACT;AAEA,IAAM,oBAAA,GAA+C;AAAA,EACnD,UAAA,EAAY,aAAA;AAAA,EACZ,cAAA,EAAgB,aAAA;AAAA,EAChB,eAAA,EAAiB,KAAA;AAAA,EACjB,OAAA,EAAS,GAAA;AAAA,EACT,YAAA,EAAc,MAAA;AAAA,EACd,KAAA,EAAO;AACT,CAAA;AAEA,SAAS,mBAAmB,QAAA,EAA0B;AACpD,EAAA,OAAO,oBAAA,CAAqB,QAAQ,CAAA,IAAK,SAAA;AAC3C;AAEA,SAAS,gBAAA,CACP,aAAA,EACA,WAAA,EACA,KAAA,EACA,UAAA,EACM;AACN,EAAA,MAAM,SAAA,mBAAY,IAAI,GAAA,CAAI,CAAC,GAAG,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA,EAAG,GAAG,MAAA,CAAO,IAAA,CAAK,WAAW,CAAC,CAAC,CAAA;AACtF,EAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAC3B,IAAA,MAAM,YAAA,GAAe,cAAc,GAAG,CAAA;AACtC,IAAA,MAAM,UAAA,GAAa,WAAA,CAAY,GAAG,CAAA,IAAK,mBAAmB,GAAG,CAAA;AAC7D,IAAA,IAAI,iBAAiB,UAAA,EAAY;AAC/B,MAAA,MAAM,MAAA,GAAS,UAAA,GAAa,CAAA,EAAG,UAAU,CAAA,EAAA,CAAA,GAAO,EAAA;AAChD,MAAA,KAAA,CAAM,KAAK,CAAA,EAAG,MAAM,GAAG,GAAG,CAAA,EAAA,EAAK,UAAU,CAAA,CAAE,CAAA;AAAA,IAC7C;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,IAAA,EAAmC;AAE5D,EAAA,IAAI,IAAA,CAAK,IAAA,EAAM,OAAO,CAAA,KAAA,EAAQ,KAAK,IAAI,CAAA,CAAA;AACvC,EAAA,OAAO,KAAK,EAAA,IAAM,IAAA;AACpB;AAGA,SAAS,gBAAA,CACP,aACA,SAAA,EACe;AACf,EAAA,MAAM,OAAA,GAAU,oBAAoB,WAAW,CAAA;AAC/C,EAAA,MAAM,KAAA,GAAQ,oBAAoB,SAAS,CAAA;AAC3C,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,gBAAA,CAAiB,OAAA,EAAS,OAAO,KAAK,CAAA;AAEtC,EAAA,IAAI,WAAA,CAAY,QAAA,IAAY,SAAA,CAAU,QAAA,EAAU;AAC9C,IAAA,MAAM,gBAAA,uBAAuB,GAAA,EAA0B;AACvD,IAAA,MAAM,wBAAwC,EAAC;AAE/C,IAAA,KAAA,MAAW,KAAA,IAAS,UAAU,QAAA,EAAU;AACtC,MAAA,MAAM,GAAA,GAAM,kBAAkB,KAAK,CAAA;AACnC,MAAA,IAAI,GAAA,EAAK;AAEP,QAAA,IAAI,CAAC,iBAAiB,GAAA,CAAI,GAAG,GAAG,gBAAA,CAAiB,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,MACjE,CAAA,MAAO;AACL,QAAA,qBAAA,CAAsB,KAAK,KAAK,CAAA;AAAA,MAClC;AAAA,IACF;AAEA,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,WAAA,CAAY,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACpD,MAAA,MAAM,EAAA,GAAK,WAAA,CAAY,QAAA,CAAS,CAAC,CAAA;AACjC,MAAA,IAAI,CAAC,EAAA,EAAI;AAET,MAAA,MAAM,SAAA,GAAY,kBAAkB,EAAE,CAAA;AACtC,MAAA,IAAI,EAAA;AACJ,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,EAAA,GAAK,gBAAA,CAAiB,IAAI,SAAS,CAAA;AAAA,MACrC,CAAA,MAAO;AACL,QAAA,EAAA,GAAK,sBAAsB,UAAU,CAAA;AACrC,QAAA,UAAA,EAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,EAAA,EAAI;AACT,MAAA,MAAM,QAAA,GAAW,oBAAoB,EAAE,CAAA;AACvC,MAAA,MAAM,QAAA,GAAW,oBAAoB,EAAE,CAAA;AACvC,MAAA,gBAAA,CAAiB,QAAA,EAAU,QAAA,EAAU,KAAA,EAAO,EAAA,CAAG,IAAI,CAAA;AAAA,IACrD;AAAA,EACF;AACA,EAAA,OAAO,MAAM,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAC/C;AAGA,SAAS,UAAA,CACP,MACA,MAAA,EACA,SAAA,EACA,YACA,YAAA,EACA,aAAA,EACA,UAAA,EACA,gBAAA,EACA,UAAA,EACQ;AACR,EAAA,IAAI,IAAA,CAAK,OAAA,KAAY,KAAA,EAAO,OAAO,EAAA;AAEnC,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AACjC,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,MAAM,OAAO,IAAA,CAAK,mBAAA;AAClB,EAAA,MAAM,IAAI,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,GAAI,GAAA;AAC1C,EAAA,MAAM,IAAI,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA,GAAI,GAAA;AAC3C,EAAA,IAAI,MAAA,GAAS,CAAA,EAAG,MAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAA;AAC3D,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,UAAA,IAAc,IAAA,CAAK,eAAe,UAAA,EAAY;AAC9D,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,IAAA,CAAK,WAAW,CAAA;AACxC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAA,IAAU,CAAA,aAAA,EAAgB,KAAK,IAAI,CAAA,CAAA,CAAA;AAAA,IACrC;AAAA,EACF;AACA,EAAA,KAAA,CAAM,KAAK,MAAM,CAAA;AACjB,EAAA,IAAI,IAAA,CAAK,SAAS,UAAA,EAAY;AAC5B,IAAA,MAAM,cAAA,GAAiB,0BAA0B,IAAI,CAAA;AACrD,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,wBAAA,EAA2B,cAAc,CAAA,CAAE,CAAA;AAAA,IACjE;AAAA,EACF;AAGA,EAAA,MAAM,SAAmB,EAAC;AAG1B,EAAA,IAAI,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,UAAA,KAAe,MAAA,EAAQ;AACjD,IAAA,IAAI,IAAA,CAAK,eAAe,MAAA,EAAQ;AAC9B,MAAA,MAAA,CAAO,KAAK,CAAA,aAAA,CAAe,CAAA;AAC3B,MAAA,IAAI,KAAK,iBAAA,EAAmB,MAAA,CAAO,KAAK,CAAA,uBAAA,EAA0B,IAAA,CAAK,iBAAiB,CAAA,CAAE,CAAA;AAC1F,MAAA,IAAI,KAAK,cAAA,EAAgB,MAAA,CAAO,KAAK,CAAA,oBAAA,EAAuB,IAAA,CAAK,cAAc,CAAA,CAAE,CAAA;AACjF,MAAA,IAAI,IAAA,CAAK,aAAA,IAAiB,IAAA,IAAQ,IAAA,CAAK,cAAc,IAAA,EAAM;AACzD,QAAA,MAAA,CAAO,KAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,UAAU,CAAA,GAAA,EAAM,IAAA,CAAK,aAAa,CAAA,EAAA,CAAI,CAAA;AAAA,MACjE,CAAA,MAAA,IAAW,IAAA,CAAK,UAAA,IAAc,IAAA,EAAM;AAClC,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,SAAA,EAAY,IAAA,CAAK,UAAU,CAAA,EAAA,CAAI,CAAA;AAAA,MAC7C,CAAA,MAAA,IAAW,IAAA,CAAK,aAAA,IAAiB,IAAA,EAAM;AACrC,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,YAAA,EAAe,IAAA,CAAK,aAAa,CAAA,EAAA,CAAI,CAAA;AAAA,MACnD,CAAA,MAAA,IAAW,IAAA,CAAK,WAAA,IAAe,IAAA,EAAM;AACnC,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,WAAW,CAAA,EAAA,CAAI,CAAA;AAAA,MAC1C;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,UAAA,KAAe,UAAA,GAAa,QAAA,GAAW,KAAA;AACxD,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,+BAAA,EAAkC,GAAG,CAAA,CAAE,CAAA;AACnD,MAAA,IAAI,IAAA,CAAK,UAAA,KAAe,MAAA,EAAQ,MAAA,CAAO,KAAK,CAAA,eAAA,CAAiB,CAAA;AAC7D,MAAA,IAAI,IAAA,CAAK,eAAe,IAAA,EAAM;AAC5B,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,KAAe,UAAA,GAAa,SAAA,GAAY,YAAA;AAC7D,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,IAAA,CAAK,WAAW,CAAA,EAAA,EAAK,SAAA,CAAU,IAAA,EAAM,aAAa,CAAC,CAAA,CAAE,CAAA;AAAA,MAClF;AACA,MAAA,IAAI,IAAA,CAAK,sBAAsB,IAAA,EAAM;AACnC,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,UAAA,KAAe,UAAA,GAAa,YAAA,GAAe,SAAA;AACjE,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,IAAA,CAAK,kBAAkB,CAAA,EAAA,EAAK,SAAA,CAAU,IAAA,EAAM,oBAAoB,CAAC,CAAA,CAAE,CAAA;AAAA,MACjG;AACA,MAAA,IAAI,IAAA,CAAK,uBAAuB,MAAA,CAAO,IAAA,CAAK,oBAAoB,QAAA,CAAS,IAAA,CAAK,qBAAqB,CAAC,CAAA,CAAE,CAAA;AAEtG,MAAA,MAAA,CAAO,KAAK,CAAA,aAAA,EAAgB,QAAA,CAAS,KAAK,qBAAA,IAAyB,KAAK,CAAC,CAAA,CAAE,CAAA;AAC3E,MAAA,IAAI,IAAA,CAAK,uBAAA,IAA2B,IAAA,CAAK,uBAAA,KAA4B,MAAA,EAAQ;AAC3E,QAAA,MAAA,CAAO,KAAK,CAAA,eAAA,EAAkB,QAAA,CAAS,IAAA,CAAK,uBAAuB,CAAC,CAAA,CAAE,CAAA;AAAA,MACxE;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,WAAA,KAAgB,SAAA,EAAW;AACtD,IAAA,MAAA,CAAO,KAAK,CAAA,YAAA,EAAe,QAAA,CAAS,IAAA,CAAK,WAAW,CAAC,CAAA,CAAE,CAAA;AAAA,EACzD;AACA,EAAA,IAAI,IAAA,CAAK,eAAe,CAAA,EAAG;AACzB,IAAA,MAAA,CAAO,KAAK,cAAc,CAAA;AAAA,EAC5B;AAGA,EAAA,IAAI,IAAA,CAAK,sBAAsB,UAAA,EAAY;AACzC,IAAA,MAAA,CAAO,KAAK,oBAAoB,CAAA;AAChC,IAAA,IAAI,UAAA,IAAc,KAAK,mBAAA,EAAqB;AAC1C,MAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,mBAAA,CAAoB,CAAA,GAAI,WAAW,CAAC,CAAA;AAChE,MAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,KAAK,mBAAA,CAAoB,CAAA,GAAI,WAAW,CAAC,CAAA;AACjE,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,KAAA,EAAQ,GAAG,CAAA,EAAA,CAAI,CAAA;AAC3B,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,MAAA,EAAS,IAAI,CAAA,EAAA,CAAI,CAAA;AAAA,IAC/B;AAAA,EACF;AAEA,EAAA,IAAI,IAAA,CAAK,iBAAA,KAAsB,UAAA,IAAc,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,iBAAA,KAAsB,UAAU,CAAA,EAAG;AAC3G,IAAA,MAAA,CAAO,KAAK,oBAAoB,CAAA;AAAA,EAClC;AAGA,EAAA,MAAM,EAAA,GAAK,KAAK,UAAA,IAAc,CAAA;AAC9B,EAAA,MAAM,EAAA,GAAK,KAAK,YAAA,IAAgB,CAAA;AAChC,EAAA,MAAM,EAAA,GAAK,KAAK,aAAA,IAAiB,CAAA;AACjC,EAAA,MAAM,EAAA,GAAK,KAAK,WAAA,IAAe,CAAA;AAC/B,EAAA,IAAI,EAAA,IAAM,EAAA,IAAM,EAAA,IAAM,EAAA,EAAI;AACxB,IAAA,MAAM,MAAA,GAAS,eAAe,IAAA,EAAM,CAAC,cAAc,cAAA,EAAgB,eAAA,EAAiB,aAAa,CAAC,CAAA;AAClG,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,SAAA,EAAY,EAAE,CAAA,GAAA,EAAM,EAAE,CAAA,GAAA,EAAM,EAAE,CAAA,GAAA,EAAM,EAAE,CAAA,EAAA,EAAK,MAAM,CAAA,CAAE,CAAA;AAAA,EACjE;AAGA,EAAA,IAAI,IAAA,CAAK,2BAA2B,MAAA,IAAU,IAAA,CAAK,eAAe,CAAA,EAAG,MAAA,CAAO,KAAK,aAAa,CAAA;AAC9F,EAAA,IAAI,IAAA,CAAK,oBAAA,KAAyB,MAAA,EAAQ,MAAA,CAAO,KAAK,cAAc,CAAA;AAGpE,EAAA,MAAM,QAAA,GAAW,YAAY,IAAI,CAAA;AACjC,EAAA,IAAI,QAAA,CAAS,KAAA,IAAS,IAAA,CAAK,IAAA,KAAS,MAAA,SAAe,IAAA,CAAK,CAAA,YAAA,EAAe,QAAA,CAAS,KAAK,CAAA,CAAE,CAAA;AACvF,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,SAAS,MAAA,GAAS,CAAA;AAC5D,IAAA,MAAM,UAAA,GAAa,YAAA,GAAe,IAAA,CAAK,EAAE,CAAA;AACzC,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,IAAI,WAAA,EAAa;AAEf,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,6BAAA,EAAgC,UAAU,CAAA,CAAA,CAAG,CAAA;AACzD,QAAA,MAAA,CAAO,KAAK,6BAA6B,CAAA;AACzC,QAAA,MAAA,CAAO,KAAK,8BAA8B,CAAA;AAC1C,QAAA,IAAI,QAAA,CAAS,mBAAmB,KAAA,EAAO;AACrC,UAAA,MAAA,CAAO,KAAK,0BAA0B,CAAA;AAAA,QACxC,CAAA,MAAA,IAAW,QAAA,CAAS,cAAA,KAAmB,MAAA,EAAQ;AAC7C,UAAA,MAAA,CAAO,KAAK,wBAAwB,CAAA;AAAA,QACtC;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,0BAAA,EAA6B,UAAU,CAAA,CAAA,CAAG,CAAA;AACtD,QAAA,IAAI,QAAA,CAAS,mBAAmB,KAAA,EAAO;AACrC,UAAA,MAAA,CAAO,KAAK,qBAAqB,CAAA;AAAA,QACnC,CAAA,MAAA,IAAW,QAAA,CAAS,cAAA,KAAmB,MAAA,EAAQ;AAC7C,UAAA,MAAA,CAAO,KAAK,mBAAmB,CAAA;AAAA,QACjC;AAAA,MACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,IAAA,CAAK,WAAA,GAAc,2BAAA,GAA8B,wBAAwB,CAAA;AAAA,IAClF;AAAA,EACF;AAGA,EAAA,MAAM,MAAA,GAAS,UAAU,IAAI,CAAA;AAC7B,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,MAAM,IAAA,CAAK,uBAAA;AAGjB,IAAA,MAAM,EAAA,GAAM,KAAK,YAAA,IAAuC,CAAA;AACxD,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,YAAY,cAAA,CAAe,IAAA,EAAM,CAAC,yBAAA,EAA2B,SAAS,CAAC,CAAA;AAC7E,MAAA,IAAI,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,IAAA,CAAK,CAAA,YAAA,EAAe,GAAA,CAAI,GAAG,CAAA,SAAA,EAAY,MAAM,CAAA,EAAG,SAAS,CAAA,CAAE,CAAA;AAC/E,MAAA,IAAI,GAAA,CAAI,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,CAAA,cAAA,EAAiB,GAAA,CAAI,KAAK,CAAA,SAAA,EAAY,MAAM,CAAA,EAAG,SAAS,CAAA,CAAE,CAAA;AACrF,MAAA,IAAI,GAAA,CAAI,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,CAAA,eAAA,EAAkB,GAAA,CAAI,MAAM,CAAA,SAAA,EAAY,MAAM,CAAA,EAAG,SAAS,CAAA,CAAE,CAAA;AACxF,MAAA,IAAI,GAAA,CAAI,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,CAAA,aAAA,EAAgB,GAAA,CAAI,IAAI,CAAA,SAAA,EAAY,MAAM,CAAA,EAAG,SAAS,CAAA,CAAE,CAAA;AAAA,IACpF,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,QAAA,EAAW,EAAE,CAAA,SAAA,EAAY,MAAM,GAAG,SAAA,CAAU,IAAA,EAAM,SAAS,CAAC,CAAA,CAAE,CAAA;AAAA,IAC5E;AAAA,EACF;AAGA,EAAA,IAAI,KAAK,YAAA,EAAc;AACrB,IAAA,MAAM,SAAA,GAAY,SAAA,CAAU,IAAA,EAAM,sBAAsB,CAAA;AACxD,IAAA,MAAA,CAAO,KAAK,CAAA,eAAA,EAAkB,IAAA,CAAK,YAAY,CAAA,EAAA,EAAK,SAAS,CAAA,CAAE,CAAA;AAAA,EACjE;AAGA,EAAA,MAAM,MAAA,GAAS,UAAU,IAAI,CAAA;AAC7B,EAAA,IAAI,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,CAAA,YAAA,EAAe,MAAM,CAAA,CAAE,CAAA;AAG/C,EAAA,IAAI,IAAA,CAAK,YAAA,EAAc,MAAA,CAAO,IAAA,CAAK,kBAAkB,CAAA;AAGrD,EAAA,IAAI,IAAA,CAAK,OAAA,KAAY,MAAA,IAAa,IAAA,CAAK,UAAU,CAAA,EAAG;AAClD,IAAA,MAAA,CAAO,IAAA,CAAK,YAAY,IAAA,CAAK,KAAA,CAAM,KAAK,OAAA,GAAU,GAAG,CAAA,GAAI,GAAG,CAAA,CAAE,CAAA;AAAA,EAChE;AAGA,EAAA,IAAI,IAAA,CAAK,QAAA,KAAa,MAAA,EAAW,MAAA,CAAO,IAAA,CAAK,CAAA,WAAA,EAAc,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA,EAAA,CAAI,CAAA;AACxF,EAAA,IAAI,IAAA,CAAK,QAAA,KAAa,MAAA,EAAW,MAAA,CAAO,IAAA,CAAK,CAAA,WAAA,EAAc,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA,EAAA,CAAI,CAAA;AACxF,EAAA,IAAI,IAAA,CAAK,SAAA,KAAc,MAAA,EAAW,MAAA,CAAO,IAAA,CAAK,CAAA,YAAA,EAAe,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAS,CAAC,CAAA,EAAA,CAAI,CAAA;AAC3F,EAAA,IAAI,IAAA,CAAK,SAAA,KAAc,MAAA,EAAW,MAAA,CAAO,IAAA,CAAK,CAAA,YAAA,EAAe,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAS,CAAC,CAAA,EAAA,CAAI,CAAA;AAG3F,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,IAAU,IAAA,CAAK,KAAA,EAAO;AAEtC,IAAA,MAAM,aAAa,IAAA,CAAK,MAAA;AACxB,IAAA,MAAM,WAAA,GAAc,aAAa,MAAM,CAAA;AACvC,IAAA,IAAI,eAAe,UAAA,EAAY;AAC7B,MAAA,MAAM,SAAA,GAAY,WAAW,WAAW,CAAA;AACxC,MAAA,IAAI,WAAW,IAAA,EAAM;AACnB,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,eAAA,EAAkB,SAAA,CAAU,IAAI,CAAA,GAAA,CAAK,CAAA;AAAA,MACnD;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,IAAA,CAAK,KAAA;AACf,IAAA,IAAI,CAAA,CAAE,YAAY,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,cAAA,EAAiB,CAAA,CAAE,YAAY,CAAC,CAAA,CAAA,EAAI,SAAA,CAAU,IAAA,EAAM,YAAY,CAAC,CAAA,CAAE,CAAA;AACpG,IAAA,IAAI,CAAA,CAAE,YAAY,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,aAAA,EAAgB,CAAA,CAAE,YAAY,CAAC,CAAA,EAAG,SAAA,CAAU,IAAA,EAAM,YAAY,CAAC,CAAA,CAAE,CAAA;AAClG,IAAA,IAAI,CAAA,CAAE,UAAU,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,WAAA,EAAc,CAAA,CAAE,UAAU,CAAC,CAAA,EAAA,EAAK,SAAA,CAAU,IAAA,EAAM,UAAU,CAAC,CAAA,CAAE,CAAA;AAC5F,IAAA,IAAI,CAAA,CAAE,cAAc,CAAA,EAAG;AACrB,MAAA,MAAM,EAAA,GAAK,EAAE,cAAc,CAAA;AAC3B,MAAA,MAAA,CAAO,IAAA,CAAK,gBAAgB,IAAA,CAAK,KAAA,CAAM,KAAK,GAAG,CAAA,GAAI,GAAG,CAAA,EAAA,CAAI,CAAA;AAAA,IAC5D;AACA,IAAA,IAAI,CAAA,CAAE,eAAe,CAAA,EAAG;AACtB,MAAA,MAAM,EAAA,GAAK,EAAE,eAAe,CAAA;AAC5B,MAAA,MAAA,CAAO,IAAA,CAAK,mBAAmB,IAAA,CAAK,KAAA,CAAM,KAAK,GAAG,CAAA,GAAI,GAAG,CAAA,EAAA,CAAI,CAAA;AAAA,IAC/D;AACA,IAAA,IAAI,CAAA,CAAE,gBAAgB,CAAA,EAAG;AACvB,MAAA,MAAM,EAAA,GAAM,CAAA,CAAE,gBAAgB,CAAA,CAAa,WAAA,EAAY;AACvD,MAAA,IAAI,OAAO,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,CAAA,iBAAA,EAAoB,EAAE,CAAA,CAAE,CAAA;AAAA,IACzD;AACA,IAAA,IAAI,CAAA,CAAE,qBAAqB,CAAA,EAAG;AAC5B,MAAA,MAAA,CAAO,IAAA,CAAK,eAAe,sBAAA,CAAuB,MAAA,CAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,IACvF;AACA,IAAA,IAAI,EAAE,mBAAmB,CAAA,IAAK,CAAA,CAAE,mBAAmB,MAAM,KAAA,EAAO;AAG9D,MAAA,MAAA,CAAO,KAAK,eAAe,CAAA;AAC3B,MAAA,MAAA,CAAO,IAAA,CAAK,gBAAgB,oBAAA,CAAqB,MAAA,CAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,IACpF;AAEA,IAAA,MAAM,SAAA,GAAY,QAAQ,IAAI,CAAA;AAC9B,IAAA,IAAI,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,CAAA,OAAA,EAAU,SAAS,CAAA,CAAE,CAAA;AAGhD,IAAA,MAAM,cAAA,GAAiB,EAAE,gBAAgB,CAAA;AACzC,IAAA,IAAI,mBAAmB,kBAAA,EAAoB;AACzC,MAAA,MAAA,CAAO,KAAK,mBAAmB,CAAA;AAAA,IACjC,CAAA,MAAA,IAAW,mBAAmB,QAAA,EAAU;AACtC,MAAA,MAAA,CAAO,KAAK,2BAA2B,CAAA;AAAA,IACzC,CAAA,MAAA,IAAW,mBAAmB,UAAA,EAAY;AACxC,MAAA,MAAA,CAAO,KAAK,uBAAuB,CAAA;AACnC,MAAA,MAAA,CAAO,KAAK,yBAAyB,CAAA;AACrC,MAAA,IAAI,IAAA,CAAK,YAAY,IAAA,EAAM;AACzB,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,WAAA,EAAc,IAAA,CAAK,QAAQ,CAAA,CAAE,CAAA;AAAA,MAC3C;AAAA,IACF;AAGA,IAAA,IAAI,cAAA,KAAmB,UAAA,IAAc,IAAA,CAAK,cAAA,KAAmB,QAAA,EAAU;AACrE,MAAA,MAAA,CAAO,KAAK,yBAAyB,CAAA;AACrC,MAAA,IAAI,IAAA,CAAK,YAAY,IAAA,EAAM;AACzB,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,WAAA,EAAc,IAAA,CAAK,QAAQ,CAAA,CAAE,CAAA;AAAA,MAC3C;AAAA,IACF;AAGA,IAAA,MAAM,gBAAA,GAAmB,EAAE,kBAAkB,CAAA;AAC7C,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,mBAAA,EAAsB,gBAAgB,CAAA,EAAA,CAAI,CAAA;AAAA,IACxD;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,IAAU,IAAA,CAAK,UAAA,EAAY;AAC3C,IAAA,MAAA,CAAO,IAAA,CAAK,UAAU,IAAA,CAAK,UAAA,CAAW,QAAQ,KAAA,EAAO,MAAM,EAAE,OAAA,CAAQ,KAAA,EAAO,KAAK,CAAA,CAAE,OAAA,CAAQ,OAAO,KAAK,CAAA,CAAE,QAAQ,IAAA,EAAM,KAAK,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,EAClI;AAGA,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,QAAA,IAAY,SAAA,EAAW;AACvC,IAAA,MAAM,UAAA,GAAa,aAAA,GAAgB,IAAA,CAAK,EAAE,CAAA;AAC1C,IAAA,MAAM,OAAA,GAAU,UAAA,GACZ,IAAA,CAAK,SAAA,EAAW,UAAU,CAAA,GAC1B,IAAA,CAAK,SAAA,EAAW,CAAA,EAAG,KAAK,EAAA,CAAG,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAC,CAAA,IAAA,CAAM,CAAA;AACvD,IAAA,IAAI,UAAA,CAAW,OAAO,CAAA,EAAG;AACvB,MAAA,MAAM,GAAA,GAAM,aAAa,OAAA,EAAS,OAAO,EAAE,IAAA,EAAK,CAAE,OAAA,CAAQ,QAAA,EAAU,GAAG,CAAA;AACvE,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAE,CAAA;AAAA,IAC3B;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,KAAA,CAAM,IAAA,CAAK,GAAG,MAAM,CAAA,SAAA,EAAY,OAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EACrD;AAGA,EAAA,IAAI,IAAA,CAAK,gBAAgB,gBAAA,EAAkB;AACzC,IAAA,KAAA,MAAW,WAAA,IAAe,KAAK,YAAA,EAAc;AAC3C,MAAA,MAAM,CAAA,GAAI,WAAA;AAIV,MAAA,IAAI,CAAA,CAAE,OAAA,EAAS,IAAA,KAAS,UAAA,IAAc,EAAE,OAAA,EAAS;AAC/C,QAAA,KAAA,MAAW,MAAA,IAAU,EAAE,OAAA,EAAS;AAC9B,UAAA,IAAI,MAAA,CAAO,aAAA,IAAiB,MAAA,CAAO,UAAA,KAAe,WAAA,EAAa;AAC7D,YAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,MAAA,CAAO,aAAa,CAAA;AACvD,YAAA,IAAI,SAAA,EAAW;AACb,cAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAA;AAC7C,cAAA,IAAI,IAAA,EAAM;AACR,gBAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,WAAA,EAAc,IAAI,CAAA,CAAE,CAAA;AAAA,cAC1C;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,KAAK,QAAA,EAAU;AACjB,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,MAAA,MAAM,WAAA,GAAc,UAAA,CAAW,KAAA,EAAO,MAAA,GAAS,CAAA,EAAG,SAAA,EAAW,UAAA,EAAY,YAAA,EAAc,aAAA,EAAe,UAAA,EAAY,gBAAA,EAAkB,IAAA,CAAK,uBAAuB,MAAS,CAAA;AACzK,MAAA,IAAI,WAAA,EAAa,KAAA,CAAM,IAAA,CAAK,WAAW,CAAA;AAAA,IACzC;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAyBO,SAAS,kBAAA,CAAmB,MAAoB,OAAA,EAAqC;AAC1F,EAAA,OAAO,2BAAA,CAA4B,IAAA,EAAM,OAAO,CAAA,CAAE,IAAA;AACpD;AAMO,SAAS,2BAAA,CAA4B,MAAoB,OAAA,EAA+C;AAC7G,EAAA,MAAM,OAAO,IAAA,CAAK,QAAA;AAClB,EAAA,MAAM,CAAA,GAAI,KAAK,mBAAA,GAAsB,IAAA,CAAK,MAAM,IAAA,CAAK,mBAAA,CAAoB,KAAK,CAAA,GAAI,CAAA;AAClF,EAAA,MAAM,CAAA,GAAI,KAAK,mBAAA,GAAsB,IAAA,CAAK,MAAM,IAAA,CAAK,mBAAA,CAAoB,MAAM,CAAA,GAAI,CAAA;AAGnF,EAAA,IAAI,YAAA;AACJ,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,cAAc,CAAA;AACzD,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,MAAA,IAAI;AACF,QAAA,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,WAAA,EAAa,OAAO,CAAC,CAAA;AAAA,MAC9D,CAAA,CAAA,MAAQ;AAAA,MAAiC;AAAA,IAC3C;AAAA,EACF;AAGA,EAAA,IAAI,aAAA;AACJ,EAAA,IAAI,SAAS,SAAA,EAAW;AACtB,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,cAAc,CAAA;AAC1D,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,MAAA,IAAI;AACF,QAAA,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,WAAA,EAAa,OAAO,CAAC,CAAA;AAAA,MAC/D,CAAA,CAAA,MAAQ;AAAA,MAAiC;AAAA,IAC3C;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,IAAA,EAAM,CAAA,EAAG,OAAA,EAAS,SAAA,EAAW,IAAA,CAAK,UAAA,EAAY,YAAA,EAAc,aAAA,EAAe,IAAA,CAAK,MAAA,EAAQ,KAAK,uBAAuB,CAAA;AAE5I,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,eAAA;AAAA,IACA,CAAA,QAAA,EAAW,CAAC,CAAA,KAAA,EAAQ,CAAC,CAAA,EAAA,CAAA;AAAA,IACrB,iEAAA;AAAA,IACA,8DAAA;AAAA,IACA,qEAAA;AAAA,IACA,EAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,IAAI,CAAA;AAEX,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,UAAA,CAAW,MAAA,EAAQ,OAAO,CAAA;AAE/C,EAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,SAAS,CAAC,CAAA;AAEnD,EAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,eAAA,EAAiB,KAAA,EAAM;AAChD;;;ACvmBO,IAAM,eAAA,GAAkD;AAAA,EAC7D,0BAAA;AAAA,EAA4B,kBAAA;AAAA,EAAoB,mBAAA;AAAA,EAChD,cAAA;AAAA,EAAgB,YAAA;AAAA,EAAc,iBAAA;AAAA,EAAmB,sBAAA;AAAA,EACjD,wBAAA;AAAA,EAA0B,sBAAA;AAAA,EAAwB,wBAAA;AAAA,EAClD,0BAAA;AAAA,EAA4B,qBAAA;AAAA,EAAuB;AACrD;AAOO,IAAM,sBAAA,GAAwD;AAAA,EACnE,0BAAA;AAAA,EACA,kBAAA;AAAA,EACA,sBAAA;AAAA,EACA,sBAAA;AAAA,EACA,qBAAA;AAAA,EACA;AACF;AAIA,IAAM,YAAA,uBAAmB,GAAA,CAAI;AAAA,EAC3B,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA;AAAA,EACA,uBAAA;AAAA,EACA,oBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,UAAA,uBAAiB,GAAA,CAAI;AAAA,EACzB,WAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,gBAAA,uBAAuB,GAAA,CAAI;AAAA,EAC/B,aAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,YAAA,uBAAmB,GAAA,CAAI;AAAA,EAC3B,YAAA;AAAA,EACA;AACF,CAAC,CAAA;AAGD,SAAS,gBAAgB,OAAA,EAAyB;AAChD,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AACpC,EAAA,IAAI,QAAA,KAAa,EAAA,EAAI,OAAO,OAAA,CAAQ,IAAA,EAAK;AACzC,EAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,QAAQ,EAAE,IAAA,EAAK;AACzC;AAGA,SAAS,WAAW,OAAA,EAA0B;AAC5C,EAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,EAAK;AAC7B,EAAA,OAAO,OAAA,KAAY,iBAAiB,OAAA,KAAY,cAAA;AAClD;AAIA,IAAM,YAAA,GAAe,oBAAA;AACrB,IAAM,OAAA,GAAU,2DAAA;AAChB,IAAM,iBAAA,GAAoB,sCAAA;AAE1B,SAAS,cAAc,OAAA,EAAyB;AAC9C,EAAA,IAAI,MAAA,GAAS,OAAA;AACb,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,OAAA,EAAS,SAAS,CAAA;AAC1C,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,YAAA,EAAc,SAAS,CAAA;AAC/C,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,mBAAmB,UAAA,EAA4B;AACtD,EAAA,OAAO,UAAA,CAAW,OAAA,CAAQ,iBAAA,EAAmB,cAAc,CAAA;AAC7D;AAIA,IAAM,cAAA,GAAiB,0BAAA;AACvB,IAAM,qBAAA,GAAwB,iCAAA;AAE9B,SAAS,cAAc,OAAA,EAAyB;AAC9C,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,cAAA,EAAgB,EAAE,EAAE,IAAA,EAAK;AAClD;AAEA,SAAS,gBAAgB,OAAA,EAAyB;AAChD,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,qBAAA,EAAuB,EAAE,EAAE,IAAA,EAAK;AACzD;AAcA,SAAS,mBAAmB,GAAA,EAA2D;AAErF,EAAA,MAAM,SAAA,GAAY,GAAA,CAAI,KAAA,CAAM,qCAAqC,CAAA;AACjE,EAAA,IAAI,CAAC,SAAA,EAAW,OAAO,EAAE,WAAA,EAAa,IAAA,EAAM,MAAM,GAAA,EAAI;AACtD,EAAA,MAAM,WAAA,GAAc,UAAU,CAAC,CAAA,CAAE,QAAQ,OAAA,EAAS,EAAE,EAAE,IAAA,EAAK;AAC3D,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,OAAA,CAAQ,SAAA,CAAU,CAAC,CAAA,EAAG,EAAE,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA,CAAE,OAAA,CAAQ,SAAS,EAAE,CAAA;AACnF,EAAA,OAAO,EAAE,aAAa,IAAA,EAAK;AAC7B;AAGA,SAAS,eAAe,IAAA,EAAsC;AAC5D,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,sBAAsB,CAAA;AAC/C,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AAC3B,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AAGxB,EAAA,MAAM,EAAE,WAAA,EAAa,IAAA,EAAM,SAAA,EAAU,GAAI,mBAAmB,GAAG,CAAA;AAG/D,EAAA,IAAI,UAAA,GAA4B,IAAA;AAChC,EAAA,IAAI,QAAA,GAAW,SAAA;AACf,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,OAAA,CAAQ,QAAQ,CAAA;AACzC,EAAA,IAAI,WAAW,EAAA,EAAI;AACjB,IAAA,UAAA,GAAa,SAAA,CAAU,MAAM,MAAM,CAAA;AACnC,IAAA,QAAA,GAAW,UAAU,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,CAAE,OAAA,CAAQ,SAAS,EAAE,CAAA;AAAA,EAC3D;AAGA,EAAA,MAAM,aAAa,QAAA,GACf,QAAA,CAAS,KAAA,CAAM,IAAI,EAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA,CAAE,MAAA,CAAO,OAAO,IACxD,EAAC;AAEL,EAAA,OAAO,EAAE,MAAA,EAAQ,UAAA,EAAY,UAAA,EAAY,WAAA,EAAY;AACvD;AAGA,SAAS,oBAAoB,MAAA,EAAwC;AACnE,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,MAAA,CAAO,UAAU,CAAA;AACnC,EAAA,IAAI,MAAA,CAAO,UAAA,EAAY,KAAA,CAAM,IAAA,CAAK,OAAO,UAAU,CAAA;AACnD,EAAA,IAAI,MAAA,CAAO,WAAA,EAAa,KAAA,CAAM,IAAA,CAAK,OAAO,WAAW,CAAA;AACrD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC/B,EAAA,OAAO,GAAG,MAAA,CAAO,MAAM,UAAU,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AACnD;AAIA,SAAS,mBAAmB,KAAA,EAA2B;AACrD,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACzB,IAAA,MAAM,MAAA,GAAS,eAAe,IAAI,CAAA;AAClC,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,IAAA,MAAA,CAAO,UAAA,GAAa,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAM;AAClD,MAAA,MAAM,IAAA,GAAO,gBAAgB,CAAC,CAAA;AAC9B,MAAA,OAAO,CAAC,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA;AAAA,IAC/B,CAAC,CAAA;AACD,IAAA,OAAO,oBAAoB,MAAM,CAAA;AAAA,EACnC,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,IAAA,KAAyB,SAAS,IAAI,CAAA;AACnD;AAEA,SAAS,qBAAqB,KAAA,EAA2B;AACvD,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACzB,IAAA,MAAM,MAAA,GAAS,eAAe,IAAI,CAAA;AAClC,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,IAAA,MAAA,CAAO,UAAA,GAAa,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAM;AAClD,MAAA,MAAM,IAAA,GAAO,gBAAgB,CAAC,CAAA;AAC9B,MAAA,IAAI,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,EAAG,OAAO,KAAA;AACjC,MAAA,IAAI,UAAA,CAAW,CAAC,CAAA,EAAG,OAAO,KAAA;AAC1B,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AACD,IAAA,OAAO,oBAAoB,MAAM,CAAA;AAAA,EACnC,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,IAAA,KAAyB,SAAS,IAAI,CAAA;AACnD;AAEA,SAAS,iBAAiB,KAAA,EAA2B;AACnD,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AAEzB,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,gBAAgB,CAAA,EAAG;AAChC,MAAA,OAAO,cAAc,IAAI,CAAA;AAAA,IAC3B;AAEA,IAAA,MAAM,MAAA,GAAS,eAAe,IAAI,CAAA;AAClC,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,IAAA,MAAA,CAAO,UAAA,GAAa,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM;AAC/C,MAAA,MAAM,IAAA,GAAO,gBAAgB,CAAC,CAAA;AAE9B,MAAA,IAAI,IAAA,KAAS,oBAAoB,OAAO,CAAA;AACxC,MAAA,IAAI,IAAA,KAAS,iBAAiB,OAAO,CAAA;AACrC,MAAA,IAAI,IAAA,KAAS,QAAQ,OAAO,CAAA;AAE5B,MAAA,IAAI;AAAA,QAAC,YAAA;AAAA,QAAc,OAAA;AAAA,QAAS,QAAA;AAAA,QAAU,YAAA;AAAA,QAAc,cAAA;AAAA,QAC/C,eAAA;AAAA,QAAiB,aAAA;AAAA,QAAe;AAAA,OAAY,CAAE,QAAA,CAAS,IAAI,CAAA,EAAG;AACjE,QAAA,OAAO,cAAc,CAAC,CAAA;AAAA,MACxB;AACA,MAAA,OAAO,CAAA;AAAA,IACT,CAAC,CAAA;AAGD,IAAA,IAAI,OAAO,UAAA,EAAY;AACrB,MAAA,MAAA,CAAO,UAAA,GAAa,kBAAA,CAAmB,MAAA,CAAO,UAAU,CAAA;AAAA,IAC1D;AAEA,IAAA,OAAO,oBAAoB,MAAM,CAAA;AAAA,EACnC,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,IAAA,KAAyB,SAAS,IAAI,CAAA;AACnD;AAEA,SAAS,gBAAgB,KAAA,EAA2B;AAClD,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACzB,IAAA,MAAM,MAAA,GAAS,eAAe,IAAI,CAAA;AAClC,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,IAAA,MAAA,CAAO,UAAA,GAAa,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAM;AAClD,MAAA,MAAM,IAAA,GAAO,gBAAgB,CAAC,CAAA;AAC9B,MAAA,IAAI,gBAAA,CAAiB,GAAA,CAAI,IAAI,CAAA,EAAG,OAAO,KAAA;AACvC,MAAA,IAAI,EAAE,IAAA,EAAK,CAAE,UAAA,CAAW,gBAAgB,GAAG,OAAO,KAAA;AAClD,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AACD,IAAA,OAAO,oBAAoB,MAAM,CAAA;AAAA,EACnC,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,IAAA,KAAyB,SAAS,IAAI,CAAA;AACnD;AAEA,SAAS,oBAAoB,KAAA,EAA2B;AACtD,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACzB,IAAA,MAAM,MAAA,GAAS,eAAe,IAAI,CAAA;AAClC,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,IAAA,MAAA,CAAO,UAAA,GAAa,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAM;AAClD,MAAA,MAAM,IAAA,GAAO,gBAAgB,CAAC,CAAA;AAC9B,MAAA,OAAO,CAAC,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA;AAAA,IAC/B,CAAC,CAAA;AACD,IAAA,OAAO,oBAAoB,MAAM,CAAA;AAAA,EACnC,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,IAAA,KAAyB,SAAS,IAAI,CAAA;AACnD;AAGA,IAAM,SAAA,GAAY,iDAAA;AAGlB,SAAS,aAAa,IAAA,EAAuB;AAC3C,EAAA,IAAI,KAAK,SAAA,EAAU,CAAE,UAAA,CAAW,QAAQ,GAAG,OAAO,KAAA;AAClD,EAAA,IAAI,KAAK,SAAA,EAAU,CAAE,UAAA,CAAW,UAAU,GAAG,OAAO,KAAA;AACpD,EAAA,IAAI,KAAK,SAAA,EAAU,CAAE,UAAA,CAAW,uBAAuB,GAAG,OAAO,KAAA;AACjE,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG,OAAO,KAAA;AACjC,EAAA,OAAO,SAAA,CAAU,KAAK,IAAI,CAAA;AAC5B;AAEA,SAAS,yBAAyB,KAAA,EAA2B;AAC3D,EAAA,OAAO,KAAA,CACJ,MAAA,CAAO,CAAC,IAAA,KAAS,CAAC,IAAA,CAAK,KAAA,CAAM,2BAA2B,CAAC,CAAA,CACzD,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,IAAA,IAAI,YAAA,CAAa,IAAI,CAAA,EAAG;AACtB,MAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,0BAAA,EAA4B,EAAE,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AACL;AAEA,SAAS,eAAe,KAAA,EAA2B;AACjD,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACzB,IAAA,IAAI,CAAC,YAAA,CAAa,IAAI,CAAA,EAAG,OAAO,IAAA;AAChC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AAClC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,OAAA,EAAA;AACA,MAAA,OAAO,CAAA,EAAG,MAAM,CAAC,CAAC,OAAO,OAAO,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAAA,IAC7C;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AACH;AAEA,SAAS,cAAc,KAAA,EAA2B;AAChD,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACzB,IAAA,MAAM,MAAA,GAAS,eAAe,IAAI,CAAA;AAClC,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,IAAA,MAAA,CAAO,UAAA,GAAa,OAAO,UAAA,CAAW,MAAA;AAAA,MAAO,CAAC,CAAA,KAC5C,CAAA,CAAE,IAAA,EAAK,KAAM;AAAA,KACf;AACA,IAAA,OAAO,oBAAoB,MAAM,CAAA;AAAA,EACnC,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,IAAA,KAAyB,SAAS,IAAI,CAAA;AACnD;AAEA,SAAS,iBAAiB,KAAA,EAA2B;AACnD,EAAA,OAAO,KAAA,CAAM,OAAO,CAAC,IAAA,KAAS,CAAC,IAAA,CAAK,KAAA,CAAM,gBAAgB,CAAC,CAAA;AAC7D;AAGA,SAAS,wBAAwB,KAAA,EAA2B;AAC1D,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACzB,IAAA,MAAM,MAAA,GAAS,eAAe,IAAI,CAAA;AAClC,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,IAAA,MAAA,CAAO,UAAA,GAAa,MAAA,CAAO,UAAA,CACxB,GAAA,CAAI,CAAC,CAAA,KAAM,aAAA,CAAc,CAAC,CAAC,CAAA,CAC3B,MAAA,CAAO,OAAO,CAAA;AACjB,IAAA,OAAO,oBAAoB,MAAM,CAAA;AAAA,EACnC,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,IAAA,KAAyB,SAAS,IAAI,CAAA;AACnD;AAGA,SAAS,qBAAqB,KAAA,EAA2B;AACvD,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACzB,IAAA,MAAM,MAAA,GAAS,eAAe,IAAI,CAAA;AAClC,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,IAAA,MAAA,CAAO,UAAA,GAAa,MAAA,CAAO,UAAA,CACxB,GAAA,CAAI,CAAC,CAAA,KAAM,eAAA,CAAgB,CAAC,CAAC,CAAA,CAC7B,MAAA,CAAO,OAAO,CAAA;AACjB,IAAA,OAAO,oBAAoB,MAAM,CAAA;AAAA,EACnC,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,IAAA,KAAyB,SAAS,IAAI,CAAA;AACnD;AAIA,IAAM,eAAA,GAA8E;AAAA,EAClF,0BAAA,EAA4B,kBAAA;AAAA,EAC5B,kBAAA,EAAoB,oBAAA;AAAA,EACpB,mBAAA,EAAqB,CAAC,KAAA,KAAU,KAAA;AAAA,EAChC,cAAA,EAAgB,gBAAA;AAAA,EAChB,YAAA,EAAc,eAAA;AAAA,EACd,iBAAA,EAAmB,mBAAA;AAAA,EACnB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,wBAAA,EAA0B,CAAC,KAAA,KAAU,KAAA;AAAA,EACrC,sBAAA,EAAwB,cAAA;AAAA,EACxB,wBAAA,EAA0B,aAAA;AAAA,EAC1B,0BAAA,EAA4B,gBAAA;AAAA,EAC5B,qBAAA,EAAuB,uBAAA;AAAA,EACvB,kBAAA,EAAoB;AACtB,CAAA;AAMO,SAAS,eAAA,CAAgB,MAAc,IAAA,EAAmC;AAC/E,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,EAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,IAAI,CAAA,CAAE,KAAK,CAAA;AAC5C,EAAA,OAAO,QAAA,CAAS,KAAK,IAAI,CAAA;AAC3B;;;AC7WO,SAAS,uBAAuB,KAAA,EAA2B;AAChE,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,IAAA,MAAM,IAAI,SAAA,CAAU,CAAA,qBAAA,EAAwB,KAAK,CAAA,CAAE,CAAA;AAAA,EACrD;AACA,EAAA,IAAI,KAAA,IAAS,GAAG,OAAO,MAAA;AACvB,EAAA,IAAI,KAAA,IAAS,IAAI,OAAO,UAAA;AACxB,EAAA,IAAI,KAAA,IAAS,IAAI,OAAO,MAAA;AACxB,EAAA,OAAO,QAAA;AACT;AAgBO,SAAS,sBAAA,CAAuB,gBAAwB,cAAA,EAAoC;AACjG,EAAA,IAAI,CAAC,OAAO,QAAA,CAAS,cAAc,KAAK,CAAC,MAAA,CAAO,QAAA,CAAS,cAAc,CAAA,EAAG;AACxE,IAAA,MAAM,IAAI,SAAA,CAAU,CAAA,+BAAA,EAAkC,cAAc,CAAA,WAAA,EAAc,cAAc,CAAA,CAAE,CAAA;AAAA,EACpG;AACA,EAAA,IAAI,cAAA,IAAkB,GAAG,OAAO,MAAA;AAChC,EAAA,MAAM,YAAA,GAAA,CAAiB,cAAA,GAAiB,cAAA,IAAkB,cAAA,GAAkB,GAAA;AAC5E,EAAA,IAAI,YAAA,IAAgB,GAAG,OAAO,MAAA;AAC9B,EAAA,IAAI,YAAA,IAAgB,IAAI,OAAO,UAAA;AAC/B,EAAA,IAAI,YAAA,IAAgB,IAAI,OAAO,MAAA;AAC/B,EAAA,OAAO,QAAA;AACT;;;ACIO,SAAS,wBAAA,CACd,QACA,eAAA,EACuB;AACvB,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,MAAM,kBAAkB,eAAA,CAAgB,mBAAA,GACpC,CAAA,iBAAA,EAAoB,eAAA,CAAgB,mBAAmB,CAAA,CAAA,GACvD,6BAAA;AACJ,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,MAAA;AAAA,MACb,kBAAkB,eAAA,CAAgB,YAAA;AAAA,MAClC,QAAA,EAAU,mBAAA;AAAA,MACV,KAAA,EAAO,EAAE,8BAAA,EAAgC,IAAA,EAAK;AAAA,MAC9C,QAAA,EACE,+IACwD,eAAA,CAAgB,YAAY,IACjF,eAAe,CAAA,kBAAA,EAAqB,gBAAgB,oBAAoB,CAAA,iHAAA;AAAA,KAE/E;AAAA,EACF;AAEA,EAAA,IAAI,qBAAA,CAAsB,MAAM,CAAA,EAAG;AACjC,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,MAAA;AAAA,MACb,gBAAA,EAAkB,MAAA;AAAA,MAClB,QAAA,EAAU,oBAAA;AAAA,MACV,KAAA,EAAO,EAAE,8BAAA,EAAgC,IAAA,EAAK;AAAA,MAC9C,QAAA,EACE;AAAA,KAGJ;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,MAAA;AAAA,IACb,gBAAA,EAAkB,MAAA;AAAA,IAClB,QAAA,EAAU,YAAA;AAAA,IACV,KAAA,EAAO,EAAE,8BAAA,EAAgC,KAAA,EAAM;AAAA,IAC/C,QAAA,EAAU;AAAA,GACZ;AACF;;;ACnFO,SAAS,gBAAgB,IAAA,EAA6B;AAC3D,EAAA,OAAO,IAAA,CAAK,IAAA,KAAS,OAAA,IAAW,IAAA,CAAK,IAAA,KAAS,WAAW,IAAA,CAAK,IAAA,KAAS,WAAA,IAAe,IAAA,CAAK,IAAA,KAAS,UAAA;AACtG;AAEO,SAAS,cAAc,IAAA,EAA6B;AACzD,EAAA,OAAO,IAAA,CAAK,UAAA,KAAe,MAAA,IAAa,IAAA,CAAK,UAAA,KAAe,MAAA;AAC9D;AAMO,SAAS,oBAAA,CAAqB,GAAiB,CAAA,EAA0B;AAC9E,EAAA,MAAM,OAAO,CAAA,CAAE,mBAAA;AACf,EAAA,MAAM,OAAO,CAAA,CAAE,mBAAA;AAEf,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,EAAM,OAAO,KAAA;AAE3B,EAAA,OAAO,EACL,KAAK,CAAA,GAAI,IAAA,CAAK,SAAS,IAAA,CAAK,CAAA,IAC5B,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAA,IAAS,KAAK,CAAA,IAC5B,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,KAC7B,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,CAAA,CAAA;AAEjC;AAIA,IAAM,iBAAA,uBAAwB,GAAA,CAAI;AAAA,EAChC,QAAA;AAAA,EAAU,mBAAA;AAAA,EAAqB,SAAA;AAAA,EAAW,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,iBAAA;AAAA,EAAmB;AAC/E,CAAC,CAAA;AAEM,SAAS,iBAAiB,IAAA,EAAuB;AACtD,EAAA,OAAO,iBAAA,CAAkB,IAAI,IAAI,CAAA;AACnC;AAEO,SAAS,aAAa,IAAA,EAA6B;AACxD,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,KAAK,GAAG,OAAO,KAAA;AACvC,EAAA,OAAO,KAAK,KAAA,CAAM,IAAA;AAAA,IAChB,CAAC,SACC,OAAO,IAAA,KAAS,YAChB,IAAA,KAAS,IAAA,IACR,KAA4B,IAAA,KAAS;AAAA,GAC1C;AACF;AAEO,SAAS,iBAAiB,IAAA,EAA6B;AAC5D,EAAA,IAAI,iBAAA,CAAkB,GAAA,CAAI,IAAA,CAAK,IAAI,GAAG,OAAO,IAAA;AAC7C,EAAA,MAAM,wBACJ,IAAA,CAAK,QAAA,KAAa,MAAA,IAClB,IAAA,CAAK,SAAS,MAAA,GAAS,CAAA,IACvB,IAAA,CAAK,QAAA,CAAS,MAAM,CAAC,CAAA,KAAM,kBAAkB,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AAE1D,EAAA,IAAI,YAAA,CAAa,IAAI,CAAA,KAAM,CAAC,IAAA,CAAK,YAAY,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,CAAA,IAAK,qBAAA,CAAA,EAAwB;AACjG,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,uBAAuB,OAAO,IAAA;AAClC,EAAA,OAAO,KAAA;AACT;AAOO,IAAM,iBAAA,GAA6E;AAAA,EACxF,EAAE,OAAA,EAAS,uBAAA,EAAyB,IAAA,EAAM,QAAA,EAAS;AAAA,EACnD,EAAE,OAAA,EAAS,oBAAA,EAAsB,IAAA,EAAM,MAAA,EAAO;AAAA,EAC9C,EAAE,OAAA,EAAS,iBAAA,EAAmB,IAAA,EAAM,KAAA,EAAM;AAAA,EAC1C,EAAE,OAAA,EAAS,mCAAA,EAAqC,IAAA,EAAM,KAAA,EAAM;AAAA,EAC5D,EAAE,OAAA,EAAS,+CAAA,EAAiD,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC1E,EAAE,OAAA,EAAS,mCAAA,EAAqC,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC9D,EAAE,OAAA,EAAS,qCAAA,EAAuC,IAAA,EAAM,QAAA;AAC1D,CAAA;AAEO,SAAS,yBAAyB,IAAA,EAAkD;AACzF,EAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAM,OAAO,IAAA;AACvB,EAAA,KAAA,MAAW,SAAS,iBAAA,EAAmB;AACrC,IAAA,IAAI,MAAM,OAAA,CAAQ,IAAA,CAAK,KAAK,IAAI,CAAA,SAAU,KAAA,CAAM,IAAA;AAAA,EAClD;AACA,EAAA,OAAO,IAAA;AACT;AAgBO,IAAM,oBAAA,uBAA2B,GAAA,CAAI;AAAA;AAAA,EAE1C,SAAA;AAAA,EAAW,OAAA;AAAA,EAAS,QAAA;AAAA,EAAU,OAAA;AAAA,EAAS,SAAA;AAAA,EAAW,UAAA;AAAA,EAAY,SAAA;AAAA;AAAA,EAE9D,SAAA;AAAA,EAAW,SAAA;AAAA;AAAA,EAEX,aAAA;AAAA;AAAA,EAEA;AACF,CAAC,CAAA;AAMM,IAAM,sBAAA,GAAiD;AAAA,EAC5D,EAAA,EAAI,QAAA;AAAA,EACJ,GAAA,EAAK,SAAA;AAAA,EACL,OAAA,EAAS,SAAA;AAAA,EACT,MAAA,EAAQ,SAAA;AAAA,EACR,QAAA,EAAU,UAAA;AAAA,EACV,MAAA,EAAQ,SAAA;AAAA,EACR,IAAA,EAAM,SAAA;AAAA,EACN,OAAA,EAAS,OAAA;AAAA,EACT,SAAA,EAAW,QAAA;AAAA,EACX,OAAA,EAAS,UAAA;AAAA,EACT,SAAA,EAAW;AACb,CAAA;AAGO,IAAM,kBAAA,GAAqB,uFAAA;AAK3B,IAAM,eAAA,GAAkB,uHAAA;AAGxB,IAAM,gBAAA,GAAmB,mDAAA;AAEzB,SAAS,cAAc,IAAA,EAA6B;AACzD,EAAA,OAAO,KAAK,IAAA,KAAS,MAAA,IAAa,eAAA,CAAgB,IAAA,CAAK,KAAK,IAAI,CAAA;AAClE;AAEO,SAAS,eAAe,IAAA,EAA6B;AAC1D,EAAA,OAAO,KAAK,IAAA,KAAS,MAAA,IAAa,gBAAA,CAAiB,IAAA,CAAK,KAAK,IAAI,CAAA;AACnE;AAIO,SAAS,iBAAA,CAAkB,MAAoB,SAAA,EAA4B;AAChF,EAAA,OAAO,IAAA,CAAK,MAAA,KAAW,MAAA,IAAa,SAAA,IAAa,IAAA,CAAK,MAAA;AACxD;AAEO,SAAS,gBAAA,CAAiB,MAAoB,GAAA,EAAsB;AACzE,EAAA,OAAO,IAAA,CAAK,cAAA,KAAmB,MAAA,IAAa,GAAA,IAAO,IAAA,CAAK,cAAA;AAC1D;AAKO,IAAM,qBAAA,GAAwB;AAAA,EACnC,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,oBAAA;AAAA,EACA,kBAAA;AAAA,EACA,iBAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,oBAAA;AAAA,EACA;AACF,CAAA;AAEO,SAAS,cAAc,IAAA,EAAuB;AACnD,EAAA,OAAO,sBAAsB,IAAA,CAAK,CAAC,YAAY,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA;AACnE;AAGO,IAAM,kBAAA,GAAqB;AAAA,EAChC,WAAA;AAAA,EAAa,SAAA;AAAA,EAAW,QAAA;AAAA,EAAU,MAAA;AAAA,EAAQ,SAAA;AAAA,EAC1C,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,MAAA;AAAA,EAAQ;AAC5C,CAAA;AAEO,SAAS,kBAAkB,IAAA,EAAuB;AACvD,EAAA,OAAO,mBAAmB,QAAA,CAAS,IAAA,CAAK,WAAA,EAAY,CAAE,MAAM,CAAA;AAC9D;AAIO,IAAM,qBAAA,GAAwB,kXAAA;AAE9B,SAAS,eAAe,IAAA,EAAuB;AACpD,EAAA,OAAO,qBAAA,CAAsB,KAAK,IAAI,CAAA;AACxC;;;ACzMO,SAAS,mBAAmB,IAAA,EAA6B;AAC9D,EAAA,IACE,KAAK,QAAA,IACL,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,KACvB,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,CAAC,MAAM,gBAAA,CAAiB,CAAA,CAAE,IAAI,CAAC,GACnD,OAAO,IAAA;AAET,EAAA,OAAO,KAAA;AACT;AAOO,SAAS,yBAAyB,IAAA,EAA6B;AACpE,EAAA,IAAI,gBAAA,CAAiB,IAAI,CAAA,EAAG,OAAO,IAAA;AAGnC,EAAA,IAAI,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,IAAA;AAEtC,EAAA,OAAO,KAAA;AACT;AAkBO,SAAS,kBAAkB,IAAA,EAA6B;AAE7D,EAAA,IAAI,gBAAA,CAAiB,IAAI,CAAA,EAAG,OAAO,IAAA;AAGnC,EAAA,IAAI,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,IAAA;AAEtC,EAAA,OAAO,KAAA;AACT;;;AC7BO,IAAM,WAAA,GAAc;AAAA,EACzB,KAAA,EAAO,CAAC,IAAA,EAAc,GAAA,MAA+B;AAAA,IACnD,OAAA,EAAS,CAAA,CAAA,EAAI,IAAI,CAAA,sBAAA,EAAyB,GAAG,CAAA,0BAAA,CAAA;AAAA,IAC7C,UAAA,EAAY,CAAA,qBAAA;AAAA,GACd,CAAA;AAAA,EACA,IAAA,EAAM,CAAC,IAAA,EAAc,QAAA,MAAoC;AAAA,IACvD,OAAA,EAAS,CAAA,CAAA,EAAI,IAAI,CAAA,eAAA,EAAkB,QAAQ,CAAA,mBAAA,CAAA;AAAA,IAC3C,UAAA,EAAY,CAAA,kBAAA;AAAA,GACd,CAAA;AAAA,EACA,MAAA,EAAQ,CAAC,IAAA,EAAc,UAAA,EAAoB,OAAA,MAAmC;AAAA,IAC5E,SAAS,CAAA,CAAA,EAAI,IAAI,CAAA,MAAA,EAAS,UAAU,GAAG,OAAO,CAAA,qBAAA,CAAA;AAAA,IAC9C,UAAA,EAAY,CAAA,qBAAA;AAAA,GACd,CAAA;AAAA,EACA,OAAA,EAAS,CAAC,IAAA,EAAc,GAAA,MAA+B;AAAA,IACrD,OAAA,EAAS,CAAA,CAAA,EAAI,IAAI,CAAA,oBAAA,EAAuB,GAAG,CAAA,6BAAA,CAAA;AAAA,IAC3C,UAAA,EAAY,CAAA,0BAAA;AAAA,GACd,CAAA;AAAA,EACA,OAAA,EAAS,CAAC,IAAA,EAAc,KAAA,EAAe,KAAA,MAAiC;AAAA,IACtE,SAAS,CAAA,CAAA,EAAI,IAAI,CAAA,WAAA,EAAc,KAAK,KAAK,KAAK,CAAA,8BAAA,CAAA;AAAA,IAC9C,UAAA,EAAY,CAAA,0BAAA;AAAA,GACd;AACF,CAAA;AAMO,IAAM,mBAAA,GAAsB,CAAC,IAAA,EAAc,OAAA,EAAiB,UAAkB,OAAA,MAAmC;AAAA,EACtH,SAAS,CAAA,CAAA,EAAI,IAAI,CAAA,cAAA,EAAiB,OAAO,aAAa,QAAQ,CAAA,OAAA,CAAA;AAAA,EAC9D,UAAA,EAAY,CAAA,iBAAA,EAAoB,QAAQ,CAAA,aAAA,EAAgB,OAAO,CAAA,GAAA;AACjE,CAAA,CAAA;AAIO,IAAM,eAAA,GAAkB;AAAA,EAC7B,WAAA,EAAa,CAAC,IAAA,MAAgC;AAAA,IAC5C,OAAA,EAAS,IAAI,IAAI,CAAA,8CAAA,CAAA;AAAA,IACjB,UAAA,EAAY,CAAA,kDAAA,CAAA;AAAA,IACZ,KAAA,EAAO,CAAA,8EAAA;AAAA,GACT,CAAA;AAAA,EACA,MAAA,EAAQ,CAAC,IAAA,MAAgC;AAAA,IACvC,OAAA,EAAS,IAAI,IAAI,CAAA,4CAAA,CAAA;AAAA,IACjB,UAAA,EAAY,CAAA,+CAAA,CAAA;AAAA,IACZ,KAAA,EAAO,CAAA,gEAAA;AAAA,GACT,CAAA;AAAA,EACA,KAAA,EAAO,CAAC,IAAA,EAAc,WAAA,EAAqB,aAAA,MAAyC;AAAA,IAClF,OAAA,EAAS,CAAA,OAAA,EAAU,IAAI,CAAA,oBAAA,EAAuB,WAAW,CAAA,CAAA;AAAA,IACzD,UAAA,EAAY,aAAA,GAAgB,CAAA,MAAA,EAAS,aAAa,CAAA,YAAA,CAAA,GAAiB,CAAA,iBAAA,CAAA;AAAA,IACnE,KAAA,EAAO,CAAA,oEAAA;AAAA,GACT;AACF,CAAA;AAIO,IAAM,mBAAA,GAAsB,CAAC,IAAA,EAAc,UAAA,MAAsC;AAAA,EACtF,OAAA,EAAS,CAAA,CAAA,EAAI,IAAI,CAAA,uDAAA,EAA0D,UAAU,CAAA,CAAA,CAAA;AAAA,EACrF,UAAA,EAAY,CAAA,yEAAA,CAAA;AAAA,EACZ,KAAA,EAAO,CAAA,yFAAA;AACT,CAAA,CAAA;AAIO,IAAM,YAAA,GAAe;AAAA,EAC1B,QAAA,EAAU,CAAC,IAAA,EAAc,KAAA,EAAe,MAAA,MAAkC;AAAA,IACxE,SAAS,CAAA,WAAA,EAAc,IAAI,CAAA,GAAA,EAAM,KAAK,OAAI,MAAM,CAAA,iDAAA,CAAA;AAAA,IAChD,UAAA,EAAY,CAAA,oCAAA;AAAA,GACd,CAAA;AAAA,EACA,UAAA,EAAY,CAAC,IAAA,EAAc,KAAA,MAAiC;AAAA,IAC1D,OAAA,EAAS,CAAA,CAAA,EAAI,IAAI,CAAA,mBAAA,EAAsB,KAAK,CAAA,sBAAA,CAAA;AAAA,IAC5C,UAAA,EAAY,CAAA,6BAAA;AAAA,GACd;AACF,CAAA;AAgBO,IAAM,wBAAA,GAA2B;AAAA,EACtC,oBAAA,EAAsB,CAAC,IAAA,EAAc,YAAA,MAAwC;AAAA,IAC3E,OAAA,EAAS,CAAA,WAAA,EAAc,IAAI,CAAA,6BAAA,EAAgC,YAAY,CAAA,uCAAA,CAAA;AAAA,IACvE,UAAA,EAAY,CAAA,yHAAA;AAAA,GACd,CAAA;AAAA,EACA,iBAAA,EAAmB,CAAC,IAAA,EAAc,YAAA,MAAwC;AAAA,IACxE,OAAA,EAAS,CAAA,UAAA,EAAa,IAAI,CAAA,mBAAA,EAAsB,YAAY,CAAA,8BAAA,CAAA;AAAA,IAC5D,UAAA,EAAY,CAAA,yHAAA;AAAA,GACd,CAAA;AAAA,EACA,sBAAA,EAAwB,CAAC,IAAA,EAAc,YAAA,MAAwC;AAAA,IAC7E,OAAA,EAAS,CAAA,WAAA,EAAc,IAAI,CAAA,mBAAA,EAAsB,YAAY,CAAA,aAAA,CAAA;AAAA,IAC7D,UAAA,EAAY,CAAA,gIAAA;AAAA,GACd,CAAA;AAAA,EACA,wBAAA,EAA0B,CAAC,IAAA,EAAc,YAAA,MAAwC;AAAA,IAC/E,OAAA,EAAS,CAAA,UAAA,EAAa,IAAI,CAAA,iCAAA,EAAoC,YAAY,CAAA,qCAAA,CAAA;AAAA,IAC1E,UAAA,EAAY,CAAA,mIAAA;AAAA,GACd;AACF,CAAA;AAMO,IAAM,qBAAA,GAAwB;AAAA,EACnC,KAAA,EAAO,CAAC,IAAA,MAAgC;AAAA,IACtC,OAAA,EAAS,IAAI,IAAI,CAAA,YAAA,CAAA;AAAA,IACjB,UAAA,EAAY,CAAA,sCAAA;AAAA,GACd,CAAA;AAAA,EACA,OAAA,EAAS,CAAC,IAAA,MAAgC;AAAA,IACxC,OAAA,EAAS,IAAI,IAAI,CAAA,uCAAA,CAAA;AAAA,IACjB,UAAA,EAAY,CAAA,sCAAA;AAAA,GACd;AACF,CAAA;AAIO,IAAM,cAAA,GAAiB,CAAC,IAAA,EAAc,KAAA,EAAe,QAAA,MAAoC;AAAA,EAC9F,SAAS,CAAA,CAAA,EAAI,IAAI,CAAA,YAAA,EAAe,KAAK,2CAA2C,QAAQ,CAAA,CAAA,CAAA;AAAA,EACxF,UAAA,EAAY,CAAA,4CAAA;AACd,CAAA,CAAA;AAIO,IAAM,mBAAA,GAAsB;AAAA,EACjC,eAAA,EAAiB,CAAC,aAAA,EAAuB,KAAA,MAAiC;AAAA,IACxE,OAAA,EAAS,CAAA,WAAA,EAAc,aAAa,CAAA,aAAA,EAAgB,KAAK,CAAA,2CAAA,CAAA;AAAA,IACzD,UAAA,EAAY,CAAA,uCAAA;AAAA,GACd,CAAA;AAAA,EACA,cAAA,EAAgB,CAAC,IAAA,EAAc,KAAA,MAAiC;AAAA,IAC9D,OAAA,EAAS,CAAA,CAAA,EAAI,IAAI,CAAA,UAAA,EAAa,KAAK,CAAA,MAAA,CAAA;AAAA,IACnC,UAAA,EAAY,CAAA,+BAAA;AAAA,GACd,CAAA;AAAA,EACA,mBAAA,EAAqB,CAAC,IAAA,EAAc,YAAA,MAAwC;AAAA,IAC1E,OAAA,EAAS,CAAA,CAAA,EAAI,IAAI,CAAA,MAAA,EAAS,YAAY,CAAA,mDAAA,CAAA;AAAA,IACtC,UAAA,EAAY,CAAA,sDAAA;AAAA,GACd,CAAA;AAAA,EACA,aAAA,EAAe,CAAC,aAAA,EAAuB,SAAA,MAAuC;AAAA,IAC5E,SAAS,CAAA,CAAA,EAAI,aAAa,mCAAmC,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,IACjF,UAAA,EAAY,CAAA,+CAAA;AAAA,GACd;AACF,CAAA;AAIO,IAAM,mBAAA,GAAsB,CAAC,IAAA,EAAc,aAAA,MAAyC;AAAA,EACzF,OAAA,EAAS,CAAA,CAAA,EAAI,IAAI,CAAA,2CAAA,EAA8C,aAAa,CAAA,CAAA,CAAA;AAAA,EAC5E,UAAA,EAAY,8BAA8B,aAAa,CAAA,yBAAA;AACzD,CAAA,CAAA;AAIO,IAAM,2BAAA,GAA8B,CAAC,IAAA,EAAc,aAAA,EAAuB,aAAA,MAAyC;AAAA,EACxH,SAAS,CAAA,CAAA,EAAI,IAAI,CAAA,MAAA,EAAS,aAAa,IAAI,aAAa,CAAA,yCAAA,CAAA;AAAA,EACxD,UAAA,EAAY,CAAA,uEAAA;AACd,CAAA,CAAA;AAMO,IAAM,oBAAA,GAAuB;AAAA,EAClC,SAAA,EAAW,CAAC,IAAA,EAAc,WAAA,EAAqB,SAAA,MAAqC;AAAA,IAClF,OAAA,EAAS,CAAA,CAAA,EAAI,IAAI,CAAA,+BAAA,EAAkC,WAAW,CAAA,CAAA,CAAA;AAAA,IAC9D,UAAA,EAAY,QAAQ,SAAS,CAAA,yBAAA;AAAA,GAC/B;AACF,CAAA;AAMA,IAAM,wBAAA,GAAmE;AAAA,EACvE,KAAA,EAAO,OAAA;AAAA,EACP,KAAA,EAAO,OAAA;AAAA,EACP,SAAA,EAAW,OAAA;AAAA,EACX,OAAA,EAAS,OAAA;AAAA,EACT,MAAA,EAAQ,QAAA;AAAA,EACR,IAAA,EAAM,QAAA;AAAA,EACN,IAAA,EAAM,OAAA;AAAA,EACN,eAAA,EAAiB,OAAA;AAAA,EACjB,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,SAAA,EAAW,WAAA;AAAA,EACX,aAAA,EAAe,WAAA;AAAA,EACf,QAAA,EAAU;AACZ,CAAA;AAEO,SAAS,sBAAsB,QAAA,EAA0C;AAC9E,EAAA,OAAO,wBAAA,CAAyB,QAAQ,CAAA,IAAK,OAAA;AAC/C;AAEA,IAAM,qBAAA,GAAgD;AAAA,EACpD,KAAA,EAAO,oCAAA;AAAA,EACP,KAAA,EAAO,0CAAA;AAAA,EACP,MAAA,EAAQ,wCAAA;AAAA,EACR,IAAA,EAAM,qCAAA;AAAA,EACN,SAAA,EAAW,oCAAA;AAAA,EACX,OAAA,EAAS,qCAAA;AAAA,EACT,IAAA,EAAM,2CAAA;AAAA,EACN,eAAA,EAAiB,yCAAA;AAAA,EACjB,IAAA,EAAM,qCAAA;AAAA,EACN,KAAA,EAAO,oCAAA;AAAA,EACP,SAAA,EAAW,+CAAA;AAAA,EACX,aAAA,EAAe,2BAAA;AAAA,EACf,QAAA,EAAU;AACZ,CAAA;AAEO,IAAM,kBAAA,GAAqB,CAAC,IAAA,EAAc,IAAA,KAA+B;AAC9E,EAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,IAAI,CAAA,IAAK,iCAAA;AAChD,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,IAAI,CAAA,wBAAA,CAAA;AAAA,IACzB,UAAA,EAAY,sCAAsC,QAAQ,CAAA,CAAA;AAAA,GAC5D;AACF,CAAA;AAMO,IAAM,0BAAA,GAA6B;AAAA,EACxC,KAAA,EAAO,CAAC,IAAA,MAAgC;AAAA,IACtC,OAAA,EAAS,IAAI,IAAI,CAAA,kDAAA,CAAA;AAAA,IACjB,UAAA,EAAY,CAAA,yBAAA;AAAA,GACd,CAAA;AAAA,EACA,QAAA,EAAU,CAAC,IAAA,MAAgC;AAAA,IACzC,OAAA,EAAS,IAAI,IAAI,CAAA,qDAAA,CAAA;AAAA,IACjB,UAAA,EAAY,CAAA,4BAAA;AAAA,GACd,CAAA;AAAA,EACA,MAAA,EAAQ,CAAC,IAAA,MAAgC;AAAA,IACvC,OAAA,EAAS,IAAI,IAAI,CAAA,mDAAA,CAAA;AAAA,IACjB,UAAA,EAAY,CAAA,0BAAA;AAAA,GACd,CAAA;AAAA,EACA,KAAA,EAAO,CAAC,IAAA,MAAgC;AAAA,IACtC,OAAA,EAAS,IAAI,IAAI,CAAA,kDAAA,CAAA;AAAA,IACjB,UAAA,EAAY,CAAA,yBAAA;AAAA,GACd;AACF,CAAA;AAMO,IAAM,mBAAA,GAAsB;AAAA,EACjC,MAAA,EAAQ,CAAC,IAAA,MAAgC;AAAA,IACvC,OAAA,EAAS,IAAI,IAAI,CAAA,gDAAA,CAAA;AAAA,IACjB,UAAA,EAAY,CAAA,wDAAA;AAAA,GACd,CAAA;AAAA,EACA,UAAA,EAAY,CAAC,IAAA,MAAgC;AAAA,IAC3C,OAAA,EAAS,IAAI,IAAI,CAAA,yDAAA,CAAA;AAAA,IACjB,UAAA,EAAY,CAAA,qDAAA;AAAA,GACd,CAAA;AAAA,EACA,GAAA,EAAK,CAAC,IAAA,MAAgC;AAAA,IACpC,OAAA,EAAS,IAAI,IAAI,CAAA,6CAAA,CAAA;AAAA,IACjB,UAAA,EAAY,CAAA,4DAAA;AAAA,GACd,CAAA;AAAA,EACA,OAAA,EAAS,CAAC,IAAA,MAAgC;AAAA,IACxC,OAAA,EAAS,IAAI,IAAI,CAAA,0DAAA,CAAA;AAAA,IACjB,UAAA,EAAY,CAAA,yDAAA;AAAA,GACd,CAAA;AAAA,EACA,QAAA,EAAU,CAAC,IAAA,MAAgC;AAAA,IACzC,OAAA,EAAS,IAAI,IAAI,CAAA,wDAAA,CAAA;AAAA,IACjB,UAAA,EAAY,CAAA,iEAAA;AAAA,GACd,CAAA;AAAA,EACA,KAAA,EAAO,CAAC,IAAA,MAAgC;AAAA,IACtC,OAAA,EAAS,IAAI,IAAI,CAAA,gDAAA,CAAA;AAAA,IACjB,UAAA,EAAY,CAAA,gEAAA;AAAA,GACd,CAAA;AAAA,EACA,MAAA,EAAQ,CAAC,IAAA,MAAgC;AAAA,IACvC,OAAA,EAAS,IAAI,IAAI,CAAA,gDAAA,CAAA;AAAA,IACjB,UAAA,EAAY,CAAA,qDAAA;AAAA,GACd;AACF,CAAA;AAIO,IAAM,qBAAA,GAAwB,CAAC,IAAA,EAAc,cAAA,EAAwB,oBAA4B,SAAA,MAAqC;AAAA,EAC3I,SAAS,CAAA,CAAA,EAAI,IAAI,CAAA,OAAA,EAAU,cAAc,uBAAuB,kBAAkB,CAAA,CAAA;AAAA,EAClF,UAAA,EAAY,cAAc,SAAS,CAAA,CAAA,CAAA;AAAA,EACnC,KAAA,EAAO,CAAA,8IAAA;AACT,CAAA,CAAA;;;AC5SA,IAAM,eAAA,GAAkC;AAAA,EACtC,EAAA,EAAI,gBAAA;AAAA,EACJ,IAAA,EAAM,gBAAA;AAAA,EACN,QAAA,EAAU,gBAAA;AAAA,EACV,GAAA,EAAK,mHAAA;AAAA,EACL,MAAA,EAAQ,yFAAA;AAAA,EACR,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,iBAAA,GAAiC,CAAC,IAAA,EAAM,OAAA,KAAY;AACxD,EAAA,IAAI,CAAC,eAAA,CAAgB,IAAI,CAAA,EAAG,OAAO,IAAA;AACnC,EAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG,OAAO,IAAA;AAChC,EAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,KAAK,QAAA,CAAS,MAAA,KAAW,GAAG,OAAO,IAAA;AAEzD,EAAA,IAAI,kBAAA,CAAmB,IAAI,CAAA,EAAG,OAAO,IAAA;AAGrC,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,IAAU,CAAA,EAAG;AAC7B,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC7C,MAAA,KAAA,IAAS,IAAI,CAAA,GAAI,CAAA,EAAG,IAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACjD,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAC9B,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAC9B,QAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,EAAQ;AAExB,QAAA,IAAI,oBAAA,CAAqB,MAAA,EAAQ,MAAM,CAAA,EAAG;AACxC,UAAA,IAAI,MAAA,CAAO,OAAA,KAAY,KAAA,IAAS,MAAA,CAAO,YAAY,KAAA,EAAO;AACxD,YAAA,OAAO;AAAA,cACL,QAAQ,eAAA,CAAgB,EAAA;AAAA,cACxB,OAAA,EAAS,aAAA;AAAA,cACT,QAAQ,IAAA,CAAK,EAAA;AAAA,cACb,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,cACjC,GAAG,eAAA,CAAgB,WAAA,CAAY,IAAA,CAAK,IAAI;AAAA,aAC1C;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,IAAU,CAAA,EAAG;AAC7B,IAAA,MAAM,gBAAA,GAAmB,KAAK,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,eAAA,CAAgB,CAAC,CAAC,CAAA;AACvE,IAAA,IAAI,gBAAA,CAAiB,UAAU,CAAA,EAAG;AAChC,MAAA,MAAM,aAAA,GAAgB,iBAAiB,MAAA,CAAO,CAAC,MAAM,CAAC,aAAA,CAAc,CAAC,CAAC,CAAA;AACtE,MAAA,IAAI,aAAA,CAAc,UAAU,CAAA,EAAG;AAC7B,QAAA,OAAO;AAAA,UACL,QAAQ,eAAA,CAAgB,EAAA;AAAA,UACxB,OAAA,EAAS,QAAA;AAAA,UACT,QAAQ,IAAA,CAAK,EAAA;AAAA,UACb,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,UACjC,GAAG,eAAA,CAAgB,MAAA,CAAO,IAAA,CAAK,IAAI;AAAA,SACrC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS,OAAO,IAAA;AAElC,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,QAAA,EAAU,MAAA,IAAU,CAAA;AAC5C,EAAA,IAAI,aAAA,GAAgB,EAAA;AACpB,EAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA,EAAG;AAC9C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,mBAAmB,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,mBAAoB,CAAA;AAC9F,IAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACrB,MAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,GAAG,KAAA,CAAM,GAAA,CAAI,OAAK,CAAA,CAAE,CAAC,CAAC,CAAA,GAAI,IAAA,CAAK,IAAI,GAAG,KAAA,CAAM,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,CAAC,CAAC,CAAA;AACjF,MAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,GAAG,KAAA,CAAM,GAAA,CAAI,OAAK,CAAA,CAAE,CAAC,CAAC,CAAA,GAAI,IAAA,CAAK,IAAI,GAAG,KAAA,CAAM,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,CAAC,CAAC,CAAA;AACjF,MAAA,aAAA,GAAgB,MAAA,GAAS,SAAS,UAAA,GAAa,YAAA;AAAA,IACjD;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAc,aAAA,GAChB,CAAA,EAAA,EAAK,UAAU,CAAA,mBAAA,EAAsB,aAAA,CAAc,WAAA,EAAa,CAAA,GAAA,CAAA,GAChE,UAAA,GAAa,CAAA,GAAI,CAAA,EAAA,EAAK,UAAU,CAAA,UAAA,CAAA,GAAe,EAAA;AAEnD,EAAA,OAAO;AAAA,IACL,QAAQ,eAAA,CAAgB,EAAA;AAAA,IACxB,OAAA,EAAS,OAAA;AAAA,IACT,QAAQ,IAAA,CAAK,EAAA;AAAA,IACb,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,IACjC,GAAG,eAAA,CAAgB,KAAA,CAAM,IAAA,CAAK,IAAA,EAAM,aAAa,aAAa;AAAA,GAChE;AACF,CAAA;AAEO,IAAM,eAAe,UAAA,CAAW;AAAA,EACrC,UAAA,EAAY,eAAA;AAAA,EACZ,KAAA,EAAO;AACT,CAAC;AAMD,IAAM,+BAAA,GAAkD;AAAA,EACtD,EAAA,EAAI,kCAAA;AAAA,EACJ,IAAA,EAAM,kCAAA;AAAA,EACN,QAAA,EAAU,gBAAA;AAAA,EACV,GAAA,EAAK,uHAAA;AAAA,EACL,MAAA,EAAQ,mHAAA;AAAA,EACR,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,iCAAA,GAAiD,CAAC,IAAA,EAAM,OAAA,KAAY;AACxE,EAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,EAAQ,OAAO,IAAA;AAC5B,EAAA,IAAI,CAAC,aAAA,CAAc,OAAA,CAAQ,MAAM,GAAG,OAAO,IAAA;AAC3C,EAAA,IAAI,IAAA,CAAK,iBAAA,KAAsB,UAAA,EAAY,OAAO,IAAA;AAElD,EAAA,IAAI,wBAAA,CAAyB,IAAI,CAAA,EAAG,OAAO,IAAA;AAE3C,EAAA,OAAO;AAAA,IACL,QAAQ,+BAAA,CAAgC,EAAA;AAAA,IACxC,QAAQ,IAAA,CAAK,EAAA;AAAA,IACb,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,IACjC,GAAG,mBAAA,CAAoB,IAAA,CAAK,IAAA,EAAM,OAAA,CAAQ,OAAO,IAAI;AAAA,GACvD;AACF,CAAA;AAEO,IAAM,+BAA+B,UAAA,CAAW;AAAA,EACrD,UAAA,EAAY,+BAAA;AAAA,EACZ,KAAA,EAAO;AACT,CAAC;AAMD,IAAM,wBAAA,GAA2C;AAAA,EAC/C,EAAA,EAAI,2BAAA;AAAA,EACJ,IAAA,EAAM,2BAAA;AAAA,EACN,QAAA,EAAU,qBAAA;AAAA,EACV,GAAA,EAAK,wEAAA;AAAA,EACL,MAAA,EAAQ,yGAAA;AAAA,EACR,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,0BAAA,GAA0C,CAAC,IAAA,EAAM,OAAA,KAAY;AACjE,EAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,EAAQ,OAAO,IAAA;AAC5B,EAAA,IAAI,CAAC,aAAA,CAAc,OAAA,CAAQ,MAAM,GAAG,OAAO,IAAA;AAC3C,EAAA,IAAI,CAAC,eAAA,CAAgB,IAAI,CAAA,EAAG,OAAO,IAAA;AACnC,EAAA,IAAI,CAAC,IAAA,CAAK,mBAAA,EAAqB,OAAO,IAAA;AAEtC,EAAA,IAAI,iBAAA,CAAkB,IAAI,CAAA,EAAG,OAAO,IAAA;AAEpC,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,IAAA,CAAK,mBAAA;AAG/B,EAAA,MAAM,MAAA,GACJ,IAAA,CAAK,sBAAA,KAA2B,OAAA,IAAW,KAAK,sBAAA,KAA2B,MAAA;AAC7E,EAAA,MAAM,MAAA,GACJ,IAAA,CAAK,oBAAA,KAAyB,OAAA,IAAW,KAAK,oBAAA,KAAyB,MAAA;AAEzE,EAAA,IAAI,UAAU,MAAA,EAAQ;AAEpB,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,UAAA,KAAe,QAAQ,OAAO,IAAA;AAE1D,IAAA,OAAO;AAAA,MACL,QAAQ,wBAAA,CAAyB,EAAA;AAAA,MACjC,OAAA,EAAS,WAAA;AAAA,MACT,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,MACjC,GAAG,YAAA,CAAa,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,OAAO,MAAM;AAAA,KACnD;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,IAAU,CAAC,MAAA,EAAQ;AAErB,IAAA,IAAI,KAAK,sBAAA,EAAwB;AAC/B,MAAA,IAAI,IAAA,CAAK,sBAAA,KAA2B,OAAA,EAAS,OAAO,IAAA;AAAA,IACtD,CAAA,MAAO;AAEL,MAAA,IAAI,IAAA,CAAK,WAAA,KAAgB,SAAA,EAAW,OAAO,IAAA;AAC3C,MAAA,IAAI,IAAA,CAAK,WAAA,KAAgB,SAAA,EAAW,OAAO,IAAA;AAAA,IAC7C;AAEA,IAAA,OAAO;AAAA,MACL,QAAQ,wBAAA,CAAyB,EAAA;AAAA,MACjC,OAAA,EAAS,YAAA;AAAA,MACT,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,MACjC,GAAG,YAAA,CAAa,UAAA,CAAW,IAAA,CAAK,MAAM,KAAK;AAAA,KAC7C;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT,CAAA;AAEO,IAAM,wBAAwB,UAAA,CAAW;AAAA,EAC9C,UAAA,EAAY,wBAAA;AAAA,EACZ,KAAA,EAAO;AACT,CAAC;AAsCD,IAAM,wBAAA,GAA2C;AAAA,EAC/C,EAAA,EAAI,yBAAA;AAAA,EACJ,IAAA,EAAM,yBAAA;AAAA,EACN,QAAA,EAAU,qBAAA;AAAA,EACV,GAAA,EAAK,4QAAA;AAAA,EACL,MAAA,EAAQ,oMAAA;AAAA,EACR,GAAA,EAAK;AACP,CAAA;AAaA,IAAM,eAAA,GAAkB,qCAAA;AAExB,SAAS,mBAAmB,OAAA,EAAuC;AACjE,EAAA,OAAO,iBAAiB,OAAA,EAAS,eAAA,EAAiB,sBAAM,IAAI,KAAsB,CAAA;AACpF;AAEA,SAAS,yBAAyB,IAAA,EAA6B;AAC7D,EAAA,IAAI,IAAA,CAAK,sBAAA,KAA2B,OAAA,EAAS,OAAO,IAAA;AACpD,EAAA,IAAI,KAAK,QAAA,KAAa,MAAA,IAAa,IAAA,CAAK,QAAA,KAAa,QAAW,OAAO,IAAA;AACvE,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,gBAAA,CAAiB,SAAsB,IAAA,EAA6B;AAC3E,EAAA,MAAM,KAAA,GAAQ,mBAAmB,OAAO,CAAA;AACxC,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AAChC,EAAA,IAAI,MAAA,KAAW,QAAW,OAAO,MAAA;AACjC,EAAA,MAAM,GAAA,GAAM,yBAAyB,IAAI,CAAA;AACzC,EAAA,MAAM,SAAS,OAAA,CAAQ,MAAA;AACvB,EAAA,MAAM,YAAY,MAAA,GAAS,KAAA,CAAM,IAAI,MAAA,CAAO,EAAE,KAAK,KAAA,GAAQ,KAAA;AAC3D,EAAA,MAAM,SAAS,GAAA,IAAO,SAAA;AACtB,EAAA,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,MAAM,CAAA;AACzB,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,iBAAiB,OAAA,EAA+B;AACvD,EAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,EAAQ,OAAO,KAAA;AAC5B,EAAA,OAAO,mBAAmB,OAAO,CAAA,CAAE,IAAI,OAAA,CAAQ,MAAA,CAAO,EAAE,CAAA,IAAK,KAAA;AAC/D;AAIA,IAAM,6CAA6B,IAAI,GAAA,CAAI,CAAC,OAAA,EAAS,SAAS,CAAC,CAAA;AAE/D,SAAS,YAAY,IAAA,EAA4B;AAC/C,EAAA,OAAO,KAAK,mBAAA,GAAsB,CAAA,EAAG,IAAA,CAAK,mBAAA,CAAoB,KAAK,CAAA,EAAA,CAAA,GAAO,SAAA;AAC5E;AAEA,SAAS,cAAA,CACP,OAAA,EACA,IAAA,EACA,OAAA,EACA,GAAA,EACe;AACf,EAAA,OAAO;AAAA,IACL,QAAQ,wBAAA,CAAyB,EAAA;AAAA,IACjC,OAAA;AAAA,IACA,QAAQ,IAAA,CAAK,EAAA;AAAA,IACb,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,IACjC,GAAG;AAAA,GACL;AACF;AAEA,SAAS,uBAAA,CACP,MACA,OAAA,EACsB;AAKtB,EAAA,IAAI,OAAA,CAAQ,KAAA,KAAU,CAAA,EAAG,OAAO,IAAA;AAChC,EAAA,IAAI,IAAA,CAAK,sBAAA,KAA2B,OAAA,EAAS,OAAO,IAAA;AAEpD,EAAA,MAAM,YAAA,GAAe,YAAY,IAAI,CAAA;AACrC,EAAA,IAAI,OAAA,CAAQ,iBAAiB,UAAA,EAAY;AACvC,IAAA,OAAO,cAAA;AAAA,MACL,6BAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA;AAAA,MACA,wBAAA,CAAyB,wBAAA,CAAyB,IAAA,CAAK,IAAA,EAAM,YAAY;AAAA,KAC3E;AAAA,EACF;AAIA,EAAA,OAAO,cAAA;AAAA,IACL,2BAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,wBAAA,CAAyB,sBAAA,CAAuB,IAAA,CAAK,IAAA,EAAM,YAAY;AAAA,GACzE;AACF;AAEA,SAAS,sBAAA,CACP,MACA,OAAA,EACsB;AACtB,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,UAAA,EAAY,OAAO,IAAA;AACrC,EAAA,IAAI,IAAA,CAAK,sBAAA,KAA2B,OAAA,EAAS,OAAO,IAAA;AASpD,EAAA,IAAI,CAAC,QAAQ,MAAA,IAAU,CAAC,cAAc,OAAA,CAAQ,MAAM,GAAG,OAAO,IAAA;AAE9D,EAAA,MAAM,YAAA,GAAe,YAAY,IAAI,CAAA;AACrC,EAAA,OAAO,cAAA;AAAA,IACL,qBAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,wBAAA,CAAyB,iBAAA,CAAkB,IAAA,CAAK,IAAA,EAAM,YAAY;AAAA,GACpE;AACF;AAEA,SAAS,yBAAA,CACP,MACA,OAAA,EACsB;AACtB,EAAA,IAAI,CAAC,0BAAA,CAA2B,GAAA,CAAI,IAAA,CAAK,IAAI,GAAG,OAAO,IAAA;AACvD,EAAA,IAAI,IAAA,CAAK,sBAAA,KAA2B,MAAA,EAAQ,OAAO,IAAA;AAGnD,EAAA,IAAI,gBAAA,CAAiB,OAAO,CAAA,EAAG,OAAO,IAAA;AAEtC,EAAA,MAAM,YAAA,GAAe,YAAY,IAAI,CAAA;AACrC,EAAA,OAAO,cAAA;AAAA,IACL,wBAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,wBAAA,CAAyB,oBAAA,CAAqB,IAAA,CAAK,IAAA,EAAM,YAAY;AAAA,GACvE;AACF;AAEA,IAAM,0BAAA,GAA0C,CAAC,IAAA,EAAM,OAAA,KAAY;AAMjE,EAAA,gBAAA,CAAiB,SAAS,IAAI,CAAA;AAO9B,EAAA,IAAI,OAAA,CAAQ,aAAA,CAAc,QAAA,CAAS,UAAU,GAAG,OAAO,IAAA;AAEvD,EAAA,IAAI,OAAA,CAAQ,UAAU,WAAA,EAAa;AACjC,IAAA,OAAO,uBAAA,CAAwB,MAAM,OAAO,CAAA;AAAA,EAC9C;AAIA,EAAA,OAAO,uBAAuB,IAAA,EAAM,OAAO,CAAA,IAAK,yBAAA,CAA0B,MAAM,OAAO,CAAA;AACzF,CAAA;AAEO,IAAM,wBAAwB,UAAA,CAAW;AAAA,EAC9C,UAAA,EAAY,wBAAA;AAAA,EACZ,KAAA,EAAO;AACT,CAAC;AAMD,IAAM,qBAAA,GAAwC;AAAA,EAC5C,EAAA,EAAI,sBAAA;AAAA,EACJ,IAAA,EAAM,sBAAA;AAAA,EACN,QAAA,EAAU,gBAAA;AAAA,EACV,GAAA,EAAK,uHAAA;AAAA,EACL,MAAA,EAAQ,uFAAA;AAAA,EACR,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,uBAAA,GAAuC,CAAC,IAAA,EAAM,OAAA,KAAY;AAC9D,EAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,IAAA,OAAO;AAAA,MACL,QAAQ,qBAAA,CAAsB,EAAA;AAAA,MAC9B,OAAA,EAAS,OAAA;AAAA,MACT,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,MACjC,GAAG,qBAAA,CAAsB,KAAA,CAAM,IAAA,CAAK,IAAI;AAAA,KAC1C;AAAA,EACF;AAEA,EAAA,IAAI,IAAA,CAAK,SAAS,SAAA,EAAW;AAC3B,IAAA,OAAO;AAAA,MACL,QAAQ,qBAAA,CAAsB,EAAA;AAAA,MAC9B,OAAA,EAAS,SAAA;AAAA,MACT,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,MACjC,GAAG,qBAAA,CAAsB,OAAA,CAAQ,IAAA,CAAK,IAAI;AAAA,KAC5C;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT,CAAA;AAEO,IAAM,qBAAqB,UAAA,CAAW;AAAA,EAC3C,UAAA,EAAY,qBAAA;AAAA,EACZ,KAAA,EAAO;AACT,CAAC;AAMD,IAAM,cAAA,GAAiC;AAAA,EACrC,EAAA,EAAI,cAAA;AAAA,EACJ,IAAA,EAAM,cAAA;AAAA,EACN,QAAA,EAAU,cAAA;AAAA,EACV,GAAA,EAAK,2GAAA;AAAA,EACL,MAAA,EAAQ,0GAAA;AAAA,EACR,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,gBAAA,GAAgC,CAAC,IAAA,EAAM,OAAA,EAAS,OAAA,KAAY;AAChE,EAAA,MAAM,WAAY,OAAA,GAAU,UAAU,KAAgB,aAAA,CAAc,cAAA,EAAgB,YAAY,CAAC,CAAA;AAEjG,EAAA,IAAI,OAAA,CAAQ,cAAA,GAAiB,QAAA,EAAU,OAAO,IAAA;AAC9C,EAAA,IAAI,CAAC,eAAA,CAAgB,IAAI,CAAA,EAAG,OAAO,IAAA;AAEnC,EAAA,OAAO;AAAA,IACL,QAAQ,cAAA,CAAe,EAAA;AAAA,IACvB,QAAQ,IAAA,CAAK,EAAA;AAAA,IACb,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,IACjC,GAAG,cAAA,CAAe,IAAA,CAAK,IAAA,EAAM,OAAA,CAAQ,gBAAgB,QAAQ;AAAA,GAC/D;AACF,CAAA;AAEO,IAAM,cAAc,UAAA,CAAW;AAAA,EACpC,UAAA,EAAY,cAAA;AAAA,EACZ,KAAA,EAAO;AACT,CAAC;;;ACleD,SAAS,QAAA,CAAS,OAAe,QAAA,EAA2B;AAC1D,EAAA,OAAO,QAAQ,QAAA,KAAa,CAAA;AAC9B;AAMA,IAAM,WAAA,GAA8B;AAAA,EAClC,EAAA,EAAI,WAAA;AAAA,EACJ,IAAA,EAAM,WAAA;AAAA,EACN,QAAA,EAAU,kBAAA;AAAA,EACV,GAAA,EAAK,0HAAA;AAAA,EACL,MAAA,EAAQ,4GAAA;AAAA,EACR,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,aAAA,GAA6B,CAAC,IAAA,EAAM,OAAA,KAAY;AACpD,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAGxC,EAAA,IAAI,IAAA,CAAK,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACpE,IAAA,IAAI,CAAC,kBAAkB,IAAA,EAAM,MAAM,KAAK,CAAC,gBAAA,CAAiB,IAAA,EAAM,OAAO,CAAA,EAAG;AACxE,MAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,QAAA,MAAM,OAAA,GAAU,IAAA;AAChB,QAAA,IAAI,QAAQ,MAAM,CAAA,KAAM,OAAA,IAAW,OAAA,CAAQ,OAAO,CAAA,EAAG;AACnD,UAAA,MAAM,CAAA,GAAI,QAAQ,OAAO,CAAA;AACzB,UAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,KAAA,CAAA,CAAO,EAAE,GAAG,CAAA,IAAK,CAAA,IAAK,GAAG,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,KAAK,KAAA,CAAA,CAAO,CAAA,CAAE,GAAG,CAAA,IAAK,CAAA,IAAK,GAAG,EAAE,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,IAAA,CAAK,KAAA,CAAA,CAAO,CAAA,CAAE,GAAG,KAAK,CAAA,IAAK,GAAG,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,CAAG,WAAA,EAAY;AAC5N,UAAA,OAAO;AAAA,YACL,QAAQ,WAAA,CAAY,EAAA;AAAA,YACpB,OAAA,EAAS,OAAA;AAAA,YACT,QAAQ,IAAA,CAAK,EAAA;AAAA,YACb,QAAA;AAAA,YACA,GAAG,WAAA,CAAY,KAAA,CAAM,IAAA,CAAK,MAAM,GAAG;AAAA,WACrC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,IAAA,IACE,CAAC,iBAAA,CAAkB,IAAA,EAAM,MAAM,MAC9B,CAAC,gBAAA,CAAiB,IAAA,EAAM,YAAY,CAAA,IAAK,CAAC,gBAAA,CAAiB,IAAA,EAAM,UAAU,CAAA,CAAA,EAC5E;AACA,MAAA,MAAM,YAAsB,EAAC;AAC7B,MAAA,MAAM,IAAI,IAAA,CAAK,KAAA;AACf,MAAA,IAAI,CAAA,EAAG;AACL,QAAA,IAAI,CAAA,CAAE,YAAY,CAAA,EAAG,SAAA,CAAU,KAAK,MAAA,CAAO,CAAA,CAAE,YAAY,CAAC,CAAC,CAAA;AAC3D,QAAA,IAAI,CAAA,CAAE,UAAU,CAAA,EAAG,SAAA,CAAU,KAAK,CAAA,EAAG,CAAA,CAAE,UAAU,CAAC,CAAA,EAAA,CAAI,CAAA;AACtD,QAAA,IAAI,CAAA,CAAE,YAAY,CAAA,EAAG,SAAA,CAAU,KAAK,MAAA,CAAO,CAAA,CAAE,YAAY,CAAC,CAAC,CAAA;AAAA,MAC7D;AACA,MAAA,MAAM,QAAA,GAAW,UAAU,MAAA,GAAS,CAAA,GAAI,KAAK,SAAA,CAAU,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA,GAAM,EAAA;AACtE,MAAA,OAAO;AAAA,QACL,QAAQ,WAAA,CAAY,EAAA;AAAA,QACpB,OAAA,EAAS,MAAA;AAAA,QACT,QAAQ,IAAA,CAAK,EAAA;AAAA,QACb,QAAA;AAAA,QACA,GAAG,WAAA,CAAY,IAAA,CAAK,IAAA,CAAK,MAAM,QAAQ;AAAA,OACzC;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,CAAK,OAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,IAAK,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AAC1E,IAAA,IAAI,CAAC,iBAAA,CAAkB,IAAA,EAAM,QAAQ,CAAA,EAAG;AACtC,MAAA,KAAA,MAAW,MAAA,IAAU,KAAK,OAAA,EAAS;AACjC,QAAA,MAAM,SAAA,GAAY,MAAA;AAClB,QAAA,IAAI,UAAU,MAAM,CAAA,KAAM,iBAAiB,SAAA,CAAU,MAAM,MAAM,cAAA,EAAgB;AAC/E,UAAA,MAAM,UAAA,GAAa,SAAA,CAAU,MAAM,CAAA,KAAM,gBAAgB,aAAA,GAAgB,cAAA;AACzE,UAAA,MAAM,MAAA,GAAS,UAAU,QAAQ,CAAA;AACjC,UAAA,MAAM,MAAA,GAAS,UAAU,QAAQ,CAAA;AACjC,UAAA,MAAM,cAAwB,EAAC;AAC/B,UAAA,IAAI,QAAQ,WAAA,CAAY,IAAA,CAAK,UAAU,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA,IAAK,CAAC,CAAC,CAAA,CAAA,EAAI,KAAK,KAAA,CAAM,MAAA,CAAO,GAAG,CAAA,IAAK,CAAC,CAAC,CAAA,CAAE,CAAA;AACrG,UAAA,IAAI,MAAA,KAAW,QAAW,WAAA,CAAY,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAA,CAAE,CAAA;AACvE,UAAA,MAAM,OAAA,GAAU,YAAY,MAAA,GAAS,CAAA,GAAI,KAAK,WAAA,CAAY,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA,GAAM,EAAA;AACzE,UAAA,OAAO;AAAA,YACL,QAAQ,WAAA,CAAY,EAAA;AAAA,YACpB,OAAA,EAAS,QAAA;AAAA,YACT,QAAQ,IAAA,CAAK,EAAA;AAAA,YACb,QAAA;AAAA,YACA,GAAG,WAAA,CAAY,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,YAAY,OAAO;AAAA,WACtD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,CAAK,OAAA,KAAY,MAAA,IAAa,IAAA,CAAK,OAAA,GAAU,KAAK,CAAC,gBAAA,CAAiB,IAAA,EAAM,SAAS,CAAA,EAAG;AACxF,IAAA,OAAO;AAAA,MACL,QAAQ,WAAA,CAAY,EAAA;AAAA,MACpB,OAAA,EAAS,SAAA;AAAA,MACT,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,QAAA;AAAA,MACA,GAAG,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,IAAA,EAAM,KAAK,KAAA,CAAM,IAAA,CAAK,OAAA,GAAU,GAAG,CAAC;AAAA,KAClE;AAAA,EACF;AAGA,EAAA,MAAM,cAAc,CAAC,aAAA,EAAe,cAAA,EAAgB,YAAA,EAAc,iBAAiB,aAAa,CAAA;AAChG,EAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAG,CAAA;AACtB,IAAA,IAAI,KAAA,KAAU,UAAa,KAAA,GAAQ,CAAA,IAAK,CAAC,gBAAA,CAAiB,IAAA,EAAM,GAAG,CAAA,EAAG;AACpE,MAAA,MAAM,KAAA,GAAQ,QAAQ,aAAA,GAAgB,KAAA,GAAQ,IAAI,OAAA,CAAQ,SAAA,EAAW,UAAU,CAAA,CAAE,WAAA,EAAY;AAC7F,MAAA,OAAO;AAAA,QACL,QAAQ,WAAA,CAAY,EAAA;AAAA,QACpB,OAAA,EAAS,SAAA;AAAA,QACT,QAAQ,IAAA,CAAK,EAAA;AAAA,QACb,QAAA;AAAA,QACA,GAAG,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,IAAA,EAAM,OAAO,KAAK;AAAA,OAChD;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT,CAAA;AAEO,IAAM,WAAW,UAAA,CAAW;AAAA,EACjC,UAAA,EAAY,WAAA;AAAA,EACZ,KAAA,EAAO;AACT,CAAC;AAMD,IAAM,mBAAA,GAAsC;AAAA,EAC1C,EAAA,EAAI,mBAAA;AAAA,EACJ,IAAA,EAAM,mBAAA;AAAA,EACN,QAAA,EAAU,kBAAA;AAAA,EACV,GAAA,EAAK,6GAAA;AAAA,EACL,MAAA,EAAQ,kFAAA;AAAA,EACR,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,qBAAA,GAAqC,CAAC,IAAA,EAAM,OAAA,EAAS,OAAA,KAAY;AACrE,EAAA,MAAM,qBAAsB,OAAA,GAAU,UAAU,KAAgB,aAAA,CAAc,mBAAA,EAAqB,YAAY,CAAC,CAAA;AAChH,EAAA,MAAM,WAAW,MAAA,CAAO,QAAA,CAAS,kBAAkB,CAAA,IAAK,kBAAA,GAAqB,IAAI,kBAAA,GAAqB,CAAA;AAEtG,EAAA,MAAM,iBAAuE,EAAC;AAC9E,EAAA,KAAA,MAAW,OAAO,CAAC,aAAA,EAAe,cAAA,EAAgB,YAAA,EAAc,eAAe,CAAA,EAAY;AACzF,IAAA,MAAM,CAAA,GAAI,KAAK,GAAG,CAAA;AAClB,IAAA,IAAI,CAAA,KAAM,MAAA,IAAa,CAAA,GAAI,CAAA,EAAG,cAAA,CAAe,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,SAAA,EAAW,CAAA;AAAA,EACpF;AACA,EAAA,IAAI,IAAA,CAAK,WAAA,KAAgB,MAAA,IAAa,IAAA,CAAK,cAAc,CAAA,EAAG;AAC1D,IAAA,cAAA,CAAe,KAAK,EAAE,KAAA,EAAO,KAAK,WAAA,EAAa,OAAA,EAAS,OAAO,CAAA;AAAA,EACjE;AAGA,EAAA,MAAM,YAAA,GAAe,CAAC,CAAA,EAAG,CAAC,CAAA;AAE1B,EAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAClC,IAAA,IAAI,YAAA,CAAa,QAAA,CAAS,KAAA,CAAM,KAAK,CAAA,EAAG;AACxC,IAAA,IAAI,CAAC,QAAA,CAAS,KAAA,CAAM,KAAA,EAAO,QAAQ,CAAA,EAAG;AACpC,MAAA,OAAO;AAAA,QACL,QAAQ,mBAAA,CAAoB,EAAA;AAAA,QAC5B,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,QAAQ,IAAA,CAAK,EAAA;AAAA,QACb,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,QACjC,GAAG,mBAAA,CAAoB,IAAA,CAAK,IAAA,EAAM,KAAA,CAAM,KAAA,EAAO,QAAA,EAAU,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,KAAA,GAAQ,QAAQ,IAAI,QAAQ;AAAA,OACxG;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT,CAAA;AAEO,IAAM,mBAAmB,UAAA,CAAW;AAAA,EACzC,UAAA,EAAY,mBAAA;AAAA,EACZ,KAAA,EAAO;AACT,CAAC;;;ACrKD,IAAM,qBAAqB,CAAC,OAAA,EAAS,WAAW,SAAA,EAAW,cAAA,EAAgB,gBAAgB,yBAAyB,CAAA;AAMpH,SAAS,oBAAA,CAAqB,QAAsB,QAAA,EAAkC;AACpF,EAAA,MAAM,YAAsB,EAAC;AAC7B,EAAA,KAAA,MAAW,OAAO,kBAAA,EAAoB;AACpC,IAAA,MAAM,SAAA,GAAY,OAAO,GAAG,CAAA;AAC5B,IAAA,MAAM,WAAA,GAAc,SAAS,GAAG,CAAA;AAEhC,IAAA,IAAI,SAAA,IAAa,IAAA,IAAQ,WAAA,IAAe,IAAA,EAAM;AAE9C,IAAA,IAAI,SAAA,IAAa,IAAA,IAAQ,WAAA,IAAe,IAAA,EAAM;AAC5C,MAAA,SAAA,CAAU,KAAK,GAAG,CAAA;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAK,SAAA,CAAU,SAAS,MAAM,IAAA,CAAK,SAAA,CAAU,WAAW,CAAA,EAAG;AAC7D,MAAA,SAAA,CAAU,KAAK,GAAG,CAAA;AAAA,IACpB;AAAA,EACF;AACA,EAAA,OAAO,SAAA;AACT;AAKA,SAAS,iBAAA,CACP,IAAA,EACA,KAAA,mBAA+B,IAAI,KAAI,EAChB;AACvB,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,OAAA,IAAW,IAAA,CAAK,IAAA,EAAM;AACtC,IAAA,MAAM,WAAW,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,IAAI,KAAK,EAAC;AAC1C,IAAA,QAAA,CAAS,IAAA,CAAK,KAAK,EAAE,CAAA;AACrB,IAAA,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,QAAQ,CAAA;AAAA,EAC/B;AAEA,EAAA,IAAI,KAAK,QAAA,EAAU;AACjB,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,MAAA,iBAAA,CAAkB,OAAO,KAAK,CAAA;AAAA,IAChC;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAMA,SAAS,gBAAA,CAAiB,MAAoB,KAAA,EAAuB;AACnE,EAAA,IAAI,KAAA,IAAS,KAAK,CAAC,IAAA,CAAK,YAAY,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA,EAAG;AAC9D,IAAA,OAAO,GAAG,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,cAAc,MAAM,CAAA,CAAA;AAAA,EAClD;AAEA,EAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,QAAA,CAC5B,GAAA,CAAI,CAAC,KAAA,KAAU,gBAAA,CAAiB,KAAA,EAAO,KAAA,GAAQ,CAAC,CAAC,CAAA,CACjD,KAAK,GAAG,CAAA;AAEX,EAAA,OAAO,CAAA,EAAG,KAAK,IAAI,CAAA,CAAA,EAAI,KAAK,UAAA,IAAc,MAAM,KAAK,iBAAiB,CAAA,CAAA,CAAA;AACxE;AAMA,SAAS,iBAAiB,OAAA,EAEd;AACV,EAAA,OAAO,OAAA,CAAQ,aAAA,CAAc,QAAA,CAAS,UAAU,CAAA;AAClD;AASA,IAAM,eAAA,GAAkB,4CAAA;AACxB,IAAM,eAAA,GAAkB,0CAAA;AAExB,SAAS,cAAc,OAAA,EAAmC;AACxD,EAAA,OAAO,iBAAiB,OAAA,EAAS,eAAA,EAAiB,sBAAM,IAAI,KAAa,CAAA;AAC3E;AAEA,SAAS,cAAc,OAAA,EAAmC;AACxD,EAAA,OAAO,iBAAiB,OAAA,EAAS,eAAA,EAAiB,sBAAM,IAAI,KAAa,CAAA;AAC3E;AAEA,IAAM,mBAAA,GAAsC;AAAA,EAC1C,EAAA,EAAI,mBAAA;AAAA,EACJ,IAAA,EAAM,mBAAA;AAAA,EACN,QAAA,EAAU,cAAA;AAAA,EACV,GAAA,EAAK,0LAAA;AAAA,EACL,MAAA,EAAQ,6KAAA;AAAA,EACR,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,qBAAA,GAAqC,CAAC,IAAA,EAAM,OAAA,EAAS,OAAA,KAAY;AAIrE,EAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AAEzB,IAAA,MAAM,UAAA,GAAa,QAAQ,IAAA,CAAK,UAAA;AAChC,IAAA,MAAM,iBAAA,GAAoB,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA,CAAE,IAAA;AAAA,MAClD,CAAC,MAAM,CAAA,CAAE,IAAA,CAAK,aAAY,KAAM,IAAA,CAAK,KAAK,WAAA;AAAY,KACxD;AAGA,IAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA;AAC1D,IAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA;AAC/C,IAAA,MAAM,UAAA,GAAa,iBAAiB,CAAC,CAAA;AAErC,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,MAAM,UAAA,GAAa,cAAc,OAAO,CAAA;AACxC,MAAA,IACE,kBACA,UAAA,KAAe,MAAA,IACf,cAAA,CAAe,MAAA,IAAU,KACzB,CAAC,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,KAAK,WAAA,EAAa,CAAA,IACvC,UAAA,KAAe,KAAK,EAAA,EACpB;AACA,QAAA,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,WAAA,EAAa,CAAA;AACtC,QAAA,OAAO;AAAA,UACL,QAAQ,mBAAA,CAAoB,EAAA;AAAA,UAC5B,OAAA,EAAS,kBAAA;AAAA,UACT,QAAQ,IAAA,CAAK,EAAA;AAAA,UACb,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,UACjC,GAAG,mBAAA,CAAoB,eAAA,CAAgB,iBAAA,CAAkB,IAAA,EAAM,eAAe,MAAM;AAAA,SACtF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,iBACH,OAAA,GAAU,gBAAgB,KAC3B,aAAA,CAAc,mBAAA,EAAqB,kBAAkB,CAAC,CAAA;AAExD,IAAA,IAAI,cAAA,IAAkB,UAAA,KAAe,MAAA,IAAa,cAAA,CAAe,UAAU,cAAA,EAAgB;AACzF,MAAA,IAAI,UAAA,KAAe,KAAK,EAAA,EAAI;AAC1B,QAAA,OAAO;AAAA,UACL,QAAQ,mBAAA,CAAoB,EAAA;AAAA,UAC5B,OAAA,EAAS,iBAAA;AAAA,UACT,QAAQ,IAAA,CAAK,EAAA;AAAA,UACb,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,UACjC,GAAG,mBAAA,CAAoB,cAAA,CAAe,IAAA,CAAK,IAAA,EAAM,eAAe,MAAM;AAAA,SACxE;AAAA,MACF;AAAA,IACF;AAIA,IAAA,IAAI,gBAAA,CAAiB,OAAO,CAAA,EAAG,OAAO,IAAA;AAGtC,IAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,IAAA,KAAS,eAAA,EAAiB,OAAO,IAAA;AAGrD,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,KAAK,QAAA,CAAS,MAAA,KAAW,GAAG,OAAO,IAAA;AAEzD,IAAA,MAAM,0BACH,OAAA,GAAU,yBAAyB,KACpC,aAAA,CAAc,mBAAA,EAAqB,2BAA2B,CAAC,CAAA;AAEjE,IAAA,MAAM,sBACH,OAAA,GAAU,qBAAqB,KAChC,aAAA,CAAc,mBAAA,EAAqB,uBAAuB,CAAC,CAAA;AAG7D,IAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,IAAA,EAAM,mBAAmB,CAAA;AAG9D,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,QAAA,IAAY,EAAC;AAGtC,IAAA,MAAM,qBAAqB,QAAA,CAAS,MAAA;AAAA,MAClC,CAAC,CAAA,KACC,CAAA,CAAE,IAAA,KAAS,OAAA,IACX,EAAE,QAAA,KAAa,MAAA,IACf,CAAA,CAAE,QAAA,CAAS,MAAA,GAAS;AAAA,KACxB;AAGA,IAAA,MAAM,gBAAgB,kBAAA,CAAmB,MAAA;AAAA,MACvC,CAAC,CAAA,KAAM,gBAAA,CAAiB,CAAA,EAAG,mBAAmB,CAAA,KAAM;AAAA,KACtD;AAGA,IAAA,MAAM,gBAAA,GAAmB,mBAAmB,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,KAAK,EAAE,CAAA;AACxE,IAAA,MAAM,KAAA,GAAQ,gBAAA,GACV,aAAA,CAAc,MAAA,GACd,cAAc,MAAA,GAAS,CAAA;AAE3B,IAAA,IAAI,SAAS,uBAAA,EAAyB;AAEpC,MAAA,MAAM,aAAa,kBAAA,CAAmB,IAAA;AAAA,QACpC,CAAC,CAAA,KAAM,gBAAA,CAAiB,CAAA,EAAG,mBAAmB,CAAA,KAAM;AAAA,OACtD;AAGA,MAAA,MAAM,YAAA,GAAe,UAAA,EAAY,EAAA,IAAM,IAAA,CAAK,EAAA;AAC5C,MAAA,IAAI,YAAA,KAAiB,KAAK,EAAA,EAAI;AAC5B,QAAA,OAAO;AAAA,UACL,QAAQ,mBAAA,CAAoB,EAAA;AAAA,UAC5B,OAAA,EAAS,sBAAA;AAAA,UACT,QAAQ,IAAA,CAAK,EAAA;AAAA,UACb,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,UACjC,GAAG,mBAAA,CAAoB,mBAAA,CAAoB,IAAA,CAAK,IAAA,EAAM,QAAQ,CAAC;AAAA,SACjE;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAQA,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,UAAA,IAAc,IAAA,CAAK,WAAA,EAAa;AAChD,IAAA,MAAM,UAAA,GAAa,cAAc,OAAO,CAAA;AACxC,IAAA,IAAI,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,WAAW,GAAG,OAAO,IAAA;AAE7C,IAAA,MAAM,aAAA,GAAgB,QAAQ,IAAA,CAAK,oBAAA;AACnC,IAAA,IAAI,CAAC,eAAe,OAAO,IAAA;AAE3B,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,IAAA,CAAK,WAAW,CAAA;AAC7C,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAGpB,IAAA,MAAM,SAAA,GAAY,oBAAA,CAAqB,MAAA,EAAQ,IAAI,CAAA;AACnD,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AAExB,MAAA,UAAA,CAAW,GAAA,CAAI,KAAK,WAAW,CAAA;AAC/B,MAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,IAAA,CAAK,UAAA,CAAW,KAAK,WAAW,CAAA;AAC9D,MAAA,MAAM,aAAA,GAAgB,aAAA,EAAe,IAAA,IAAQ,IAAA,CAAK,IAAA;AAElD,MAAA,OAAO;AAAA,QACL,QAAQ,mBAAA,CAAoB,EAAA;AAAA,QAC5B,OAAA,EAAS,gBAAA;AAAA,QACT,QAAQ,IAAA,CAAK,EAAA;AAAA,QACb,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,QACjC,GAAG,mBAAA,CAAoB,aAAA,CAAc,aAAA,EAAe,SAAS;AAAA,OAC/D;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT,CAAA;AAEO,IAAM,mBAAmB,UAAA,CAAW;AAAA,EACzC,UAAA,EAAY,mBAAA;AAAA,EACZ,KAAA,EAAO;AACT,CAAC;AAMD,IAAM,mBAAA,GAAsC;AAAA,EAC1C,EAAA,EAAI,mBAAA;AAAA,EACJ,IAAA,EAAM,mBAAA;AAAA,EACN,QAAA,EAAU,cAAA;AAAA,EACV,GAAA,EAAK,yHAAA;AAAA,EACL,MAAA,EAAQ,4GAAA;AAAA,EACR,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,qBAAA,GAAqC,CAAC,IAAA,EAAM,OAAA,KAAY;AAI5D,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS,OAAO,IAAA;AAGlC,EAAA,MAAM,UAAA,GAAa,QAAQ,IAAA,CAAK,UAAA;AAEhC,EAAA,KAAA,MAAW,GAAG,SAAS,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACtD,IAAA,MAAM,OAAA,GAAU,IAAI,MAAA,CAAO,CAAA,GAAA,EAAM,SAAA,CAAU,KAAK,OAAA,CAAQ,qBAAA,EAAuB,MAAM,CAAC,CAAA,GAAA,CAAK,CAAA;AAC3F,IAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAG;AAE3B,MAAA,OAAO;AAAA,QACL,QAAQ,mBAAA,CAAoB,EAAA;AAAA,QAC5B,QAAQ,IAAA,CAAK,EAAA;AAAA,QACb,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,QACjC,GAAG,mBAAA,CAAoB,IAAA,CAAK,IAAA,EAAM,UAAU,IAAI;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT,CAAA;AAEO,IAAM,mBAAmB,UAAA,CAAW;AAAA,EACzC,UAAA,EAAY,mBAAA;AAAA,EACZ,KAAA,EAAO;AACT,CAAC;AAMD,IAAM,2BAAA,GAA8C;AAAA,EAClD,EAAA,EAAI,4BAAA;AAAA,EACJ,IAAA,EAAM,4BAAA;AAAA,EACN,QAAA,EAAU,cAAA;AAAA,EACV,GAAA,EAAK,gGAAA;AAAA,EACL,MAAA,EAAQ,wGAAA;AAAA,EACR,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,6BAAA,GAA6C,CAAC,IAAA,EAAM,OAAA,KAAY;AAEpE,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,eAAA,EAAiB,OAAO,IAAA;AAC1C,EAAA,IAAI,CAAC,KAAK,QAAA,EAAU,MAAA,IAAU,KAAK,QAAA,CAAS,MAAA,GAAS,GAAG,OAAO,IAAA;AAG/D,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,QAAA,CACvB,MAAA,CAAO,WAAS,KAAA,CAAM,IAAA,KAAS,WAAW,CAAA,CAC1C,GAAA,CAAI,CAAA,KAAA,KAAS,gBAAA,CAAiB,KAAA,EAAO,CAAC,CAAC,CAAA;AAE1C,EAAA,IAAI,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AAGpC,EAAA,MAAM,IAAA,GAAO,aAAa,CAAC,CAAA;AAC3B,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,MAAA,CAAO,CAAA,EAAA,KAAM,OAAO,IAAI,CAAA;AAExD,EAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEpC,EAAA,MAAM,gBAAgB,UAAA,CAAW,MAAA;AACjC,EAAA,MAAM,gBAAgB,YAAA,CAAa,MAAA;AAEnC,EAAA,OAAO;AAAA,IACL,QAAQ,2BAAA,CAA4B,EAAA;AAAA,IACpC,QAAQ,IAAA,CAAK,EAAA;AAAA,IACb,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,IACjC,GAAG,2BAAA,CAA4B,IAAA,CAAK,IAAA,EAAM,eAAe,aAAa;AAAA,GACxE;AACF,CAAA;AAEO,IAAM,2BAA2B,UAAA,CAAW;AAAA,EACjD,UAAA,EAAY,2BAAA;AAAA,EACZ,KAAA,EAAO;AACT,CAAC;;;ACtWD,SAAS,WAAW,CAAA,EAAmB;AACrC,EAAA,IAAI,CAAC,GAAG,OAAO,CAAA;AACf,EAAA,OAAO,CAAA,CAAE,OAAO,CAAC,CAAA,CAAE,aAAY,GAAI,CAAA,CAAE,MAAM,CAAC,CAAA;AAC9C;AAEA,SAAS,uBAAuB,IAAA,EAA6B;AAC3D,EAAA,IAAI,oBAAA,CAAqB,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,YAAA;AAC5C,EAAA,IAAI,oBAAA,CAAqB,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,YAAA;AAC5C,EAAA,IAAI,wBAAA,CAAyB,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,WAAA;AAChD,EAAA,IAAI,6BAAA,CAA8B,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,YAAA;AACrD,EAAA,IAAI,oBAAA,CAAqB,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,sBAAA;AAC5C,EAAA,IAAI,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,YAAA;AAC5B,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,YAAA,CAAa,cAAA,EAAwB,kBAAA,EAA4B,IAAA,EAAuB;AAC/F,EAAA,IAAI,CAAC,eAAA,CAAgB,IAAA,CAAK,IAAI,GAAG,OAAO,KAAA;AACxC,EAAA,MAAM,uBAAO,IAAI,GAAA,CAAI,CAAC,cAAA,EAAgB,kBAAkB,CAAC,CAAA;AACzD,EAAA,OAAO,KAAK,GAAA,CAAI,YAAY,CAAA,IAAK,IAAA,CAAK,IAAI,YAAY,CAAA;AACxD;AAGA,SAAS,WAAW,IAAA,EAAwB;AAE1C,EAAA,IAAI,KAAK,IAAA,CAAK,IAAI,GAAG,OAAO,IAAA,CAAK,MAAM,KAAK,CAAA;AAE5C,EAAA,IAAI,KAAK,QAAA,CAAS,GAAG,GAAG,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAE7C,EAAA,IAAI,KAAK,QAAA,CAAS,GAAG,GAAG,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAE7C,EAAA,OAAO,IAAA,CACJ,OAAA,CAAQ,oBAAA,EAAsB,QAAQ,CAAA,CACtC,QAAQ,uBAAA,EAAyB,QAAQ,CAAA,CACzC,KAAA,CAAM,IAAI,CAAA;AACf;AAGA,SAAS,WAAA,CAAY,MAAc,MAAA,EAAwB;AACzD,EAAA,MAAM,KAAA,GAAQ,WAAW,IAAI,CAAA;AAC7B,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,YAAA;AACH,MAAA,OAAO,KAAA,CAAM,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,aAAa,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA,IACjD,KAAK,YAAA;AACH,MAAA,OAAO,KAAA,CAAM,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,aAAa,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA,IACjD,KAAK,WAAA;AACH,MAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,MAAM,CAAA,GAAI,CAAA,CAAE,WAAA,EAAY,GAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,CAAA,CAAE,KAAA,CAAM,CAAC,EAAE,WAAA,EAAa,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAAA,IACtH,KAAK,YAAA;AACH,MAAA,OAAO,MAAM,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,CAAA,CAAE,MAAM,CAAC,CAAA,CAAE,aAAa,CAAA,CAAE,KAAK,EAAE,CAAA;AAAA,IACrF,KAAK,sBAAA;AACH,MAAA,OAAO,KAAA,CAAM,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,aAAa,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA,IACjD,KAAK,YAAA;AACH,MAAA,OAAO,MAAM,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,CAAA,CAAE,MAAM,CAAC,CAAA,CAAE,aAAa,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA,IACtF;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;AAMA,IAAM,kBAAA,GAAqC;AAAA,EACzC,EAAA,EAAI,mBAAA;AAAA,EACJ,IAAA,EAAM,mBAAA;AAAA,EACN,QAAA,EAAU,UAAA;AAAA,EACV,GAAA,EAAK,iHAAA;AAAA,EACL,MAAA,EAAQ,kGAAA;AAAA,EACR,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,oBAAA,GAAoC,CAAC,IAAA,EAAM,OAAA,KAAY;AAC3D,EAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAM,OAAO,IAAA;AACvB,EAAA,IAAI,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,IAAA;AAGtC,EAAA,IAAI,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA,EAAG;AAC5B,IAAA,OAAO;AAAA,MACL,QAAQ,kBAAA,CAAmB,EAAA;AAAA,MAC3B,OAAA,EAAS,qBAAA,CAAsB,IAAA,CAAK,IAAI,CAAA;AAAA,MACxC,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,MACjC,GAAG,kBAAA,CAAmB,IAAA,CAAK,IAAA,EAAM,KAAK,IAAI;AAAA,KAC5C;AAAA,EACF;AAGA,EAAA,IAAI,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA,EAAG;AAEhC,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA,EAAG;AAChD,MAAA,MAAM,aAAa,CAAC,WAAA,EAAa,WAAW,QAAA,EAAU,MAAA,EAAQ,QAAQ,iBAAiB,CAAA;AACvF,MAAA,IAAI,UAAA,CAAW,QAAA,CAAS,IAAA,CAAK,IAAI,GAAG,OAAO,IAAA;AAAA,IAC7C;AAEA,IAAA,OAAO;AAAA,MACL,QAAQ,kBAAA,CAAmB,EAAA;AAAA,MAC3B,OAAA,EAAS,YAAA;AAAA,MACT,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,MACjC,GAAG,kBAAA,CAAmB,IAAA,CAAK,IAAA,EAAM,KAAK,IAAI;AAAA,KAC5C;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT,CAAA;AAEO,IAAM,kBAAkB,UAAA,CAAW;AAAA,EACxC,UAAA,EAAY,kBAAA;AAAA,EACZ,KAAA,EAAO;AACT,CAAC;AAMD,IAAM,+BAAA,GAAkD;AAAA,EACtD,EAAA,EAAI,gCAAA;AAAA,EACJ,IAAA,EAAM,gCAAA;AAAA,EACN,QAAA,EAAU,UAAA;AAAA,EACV,GAAA,EAAK,iHAAA;AAAA,EACL,MAAA,EAAQ,yFAAA;AAAA,EACR,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,iCAAA,GAAiD,CAAC,IAAA,EAAM,OAAA,KAAY;AACxE,EAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,IAAY,QAAQ,QAAA,CAAS,MAAA,GAAS,GAAG,OAAO,IAAA;AAG7D,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAoB;AAC5C,EAAA,IAAI,oBAAA,GAAuB,CAAA;AAE3B,EAAA,KAAA,MAAW,OAAA,IAAW,QAAQ,QAAA,EAAU;AACtC,IAAA,IAAI,CAAC,QAAQ,IAAA,EAAM;AACnB,IAAA,MAAM,UAAA,GAAa,sBAAA,CAAuB,OAAA,CAAQ,IAAI,CAAA;AACtD,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,WAAA,CAAY,IAAI,UAAA,EAAA,CAAa,WAAA,CAAY,IAAI,UAAU,CAAA,IAAK,KAAK,CAAC,CAAA;AAClE,MAAA,IAAI,eAAe,YAAA,IAAgB,eAAA,CAAgB,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,EAAG;AACrE,QAAA,oBAAA,EAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAKA,EAAA,IAAI,WAAA,CAAY,IAAI,YAAY,CAAA,IAAK,YAAY,GAAA,CAAI,YAAY,CAAA,IAAK,oBAAA,GAAuB,CAAA,EAAG;AAC9F,IAAA,MAAM,QAAA,GAAA,CAAY,WAAA,CAAY,GAAA,CAAI,YAAY,KAAK,CAAA,IAAK,oBAAA;AACxD,IAAA,IAAI,YAAY,CAAA,EAAG;AACjB,MAAA,WAAA,CAAY,OAAO,YAAY,CAAA;AAAA,IACjC,CAAA,MAAO;AACL,MAAA,WAAA,CAAY,GAAA,CAAI,cAAc,QAAQ,CAAA;AAAA,IACxC;AAAA,EACF;AAGA,EAAA,IAAI,WAAA,CAAY,IAAA,GAAO,CAAA,EAAG,OAAO,IAAA;AAGjC,EAAA,IAAI,kBAAA,GAAqB,EAAA;AACzB,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,KAAA,MAAW,CAAC,UAAA,EAAY,KAAK,CAAA,IAAK,WAAA,EAAa;AAC7C,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,QAAA,GAAW,KAAA;AACX,MAAA,kBAAA,GAAqB,UAAA;AAAA,IACvB;AAAA,EACF;AAGA,EAAA,MAAM,cAAA,GAAiB,sBAAA,CAAuB,IAAA,CAAK,IAAI,CAAA;AACvD,EAAA,IAAI,cAAA,IAAkB,cAAA,KAAmB,kBAAA,IAAsB,QAAA,IAAY,CAAA,EAAG;AAE5E,IAAA,IAAI,aAAa,cAAA,EAAgB,kBAAA,EAAoB,IAAA,CAAK,IAAI,GAAG,OAAO,IAAA;AAExE,IAAA,MAAM,SAAA,GAAY,WAAA,CAAY,IAAA,CAAK,IAAA,EAAM,kBAAkB,CAAA;AAM3D,IAAA,IAAI,SAAA,KAAc,IAAA,CAAK,IAAA,EAAM,OAAO,IAAA;AACpC,IAAA,OAAO;AAAA,MACL,QAAQ,+BAAA,CAAgC,EAAA;AAAA,MACxC,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,MACjC,aAAA,EAAe,SAAA;AAAA,MACf,GAAG,qBAAA,CAAsB,IAAA,CAAK,IAAA,EAAM,cAAA,EAAgB,oBAAoB,SAAS;AAAA,KACnF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT,CAAA;AAEO,IAAM,+BAA+B,UAAA,CAAW;AAAA,EACrD,UAAA,EAAY,+BAAA;AAAA,EACZ,KAAA,EAAO;AACT,CAAC;AAMD,IAAM,oBAAA,GAAuC;AAAA,EAC3C,EAAA,EAAI,qBAAA;AAAA,EACJ,IAAA,EAAM,qBAAA;AAAA,EACN,QAAA,EAAU,UAAA;AAAA,EACV,GAAA,EAAK,oJAAA;AAAA,EACL,MAAA,EAAQ,qFAAA;AAAA,EACR,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,sBAAA,GAAsC,CAAC,IAAA,EAAM,OAAA,KAAY;AAE7D,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,eAAA,EAAiB,OAAO,IAAA;AAC1C,EAAA,IAAI,CAAC,IAAA,CAAK,4BAAA,EAA8B,OAAO,IAAA;AAE/C,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,4BAA4B,CAAA,EAAG;AACnE,IAAA,MAAM,CAAA,GAAI,IAAA;AACV,IAAA,IAAI,CAAA,CAAE,MAAM,CAAA,KAAM,SAAA,EAAW;AAC7B,IAAA,MAAM,OAAA,GAAU,EAAE,gBAAgB,CAAA;AAClC,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAE7B,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,MAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC7B,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,WAAA,EAAY,CAAE,IAAA,EAAK;AAGrC,MAAA,IAAI,oBAAA,CAAqB,GAAA,CAAI,KAAK,CAAA,EAAG;AAGrC,MAAA,IAAI,kBAAA,CAAmB,IAAA,CAAK,GAAG,CAAA,EAAG;AAChC,QAAA,MAAM,UAAA,GAAa,uBAAuB,KAAK,CAAA;AAC/C,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,OAAO;AAAA,YACL,QAAQ,oBAAA,CAAqB,EAAA;AAAA,YAC7B,OAAA,EAAS,YAAA;AAAA,YACT,QAAQ,IAAA,CAAK,EAAA;AAAA,YACb,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,YACjC,aAAA,EAAe,WAAW,UAAU,CAAA;AAAA,YACpC,GAAG,oBAAA,CAAqB,SAAA,CAAU,IAAA,CAAK,IAAA,EAAM,KAAK,UAAU;AAAA,WAC9D;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT,CAAA;AAEO,IAAM,oBAAoB,UAAA,CAAW;AAAA,EAC1C,UAAA,EAAY,oBAAA;AAAA,EACZ,KAAA,EAAO;AACT,CAAC;;;ACvPD,IAAM,eAAA,GAAmF;AAAA,EACvF,MAAA,EAAQ,CAAC,OAAA,EAAS,QAAA,EAAU,UAAU,CAAA;AAAA,EACtC,IAAA,EAAM,CAAC,OAAO,CAAA;AAAA,EACd,GAAA,EAAK,CAAC,OAAA,EAAS,QAAQ,CAAA;AAAA,EACvB,KAAA,EAAO,CAAC,OAAA,EAAS,UAAU,CAAA;AAAA,EAC3B,MAAA,EAAQ,CAAC,UAAU;AACrB,CAAA;AAGA,IAAM,cAAA,GAAiE;AAAA,EACrE,KAAA,EAAO,YAAA;AAAA,EACP,QAAA,EAAU,eAAA;AAAA,EACV,MAAA,EAAQ,4CAAA;AAAA,EACR,KAAA,EAAO;AACT,CAAA;AAOA,IAAM,QAAA,GAAW,gCAAA;AAEjB,SAAS,QAAQ,OAAA,EAAmC;AAClD,EAAA,OAAO,iBAAiB,OAAA,EAAS,QAAA,EAAU,sBAAM,IAAI,KAAa,CAAA;AACpE;AAMA,SAAS,sBAAA,CAAuB,MAAoB,YAAA,EAA+B;AACjF,EAAA,IAAI,CAAC,IAAA,CAAK,4BAAA,EAA8B,OAAO,KAAA;AAC/C,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,4BAA4B,CAAA,EAAG;AACnE,IAAA,MAAM,CAAA,GAAI,IAAA;AACV,IAAA,IAAI,CAAA,CAAE,MAAM,CAAA,KAAM,SAAA,EAAW;AAC7B,IAAA,MAAM,OAAA,GAAU,EAAE,gBAAgB,CAAA;AAClC,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC7B,IAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,CAAC,GAAA,KAAQ,OAAO,GAAA,KAAQ,QAAA,IAAY,YAAA,CAAa,IAAA,CAAK,GAAG,CAAC,CAAA,EAAG;AAC5E,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAOA,SAAS,yBAAA,CACP,IAAA,EACA,OAAA,EACA,YAAA,EACS;AACT,EAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAa,OAAO,KAAA;AAC9B,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,CAAK,oBAAA;AAC1B,EAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,WAAW,CAAA;AACpC,EAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,EAAA,OAAO,sBAAA,CAAuB,QAAQ,YAAY,CAAA;AACpD;AAUA,IAAM,wBAAA,GAA2B,mCAAA;AAEjC,SAAS,kBAAkB,QAAA,EAA4B;AAKrD,EAAA,OAAO,QAAA,IAAY,IAAA,IAAQ,OAAO,QAAA,KAAa,QAAA;AACjD;AAsBA,SAAS,oBAAA,CAAqB,MAAoB,OAAA,EAA+B;AAC/E,EAAA,IAAI,iBAAA,CAAkB,IAAA,CAAK,4BAA4B,CAAA,EAAG,OAAO,IAAA;AACjE,EAAA,IAAI,IAAA,CAAK,SAAS,WAAA,EAAa;AAC7B,IAAA,OAAO,CAAC,wBAAA,CAAyB,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA;AAAA,EACjD;AACA,EAAA,IAAI,IAAA,CAAK,gBAAgB,MAAA,EAAW;AAClC,IAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,CAAK,oBAAA;AAC1B,IAAA,MAAM,MAAA,GAAS,IAAA,GAAO,IAAA,CAAK,WAAW,CAAA;AACtC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAI,iBAAA,CAAkB,MAAA,CAAO,4BAA4B,CAAA,EAAG,OAAO,IAAA;AACnE,MAAA,OAAO,CAAC,wBAAA,CAAyB,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA;AAAA,IACnD;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAMA,IAAM,0BAAA,GAA6C;AAAA,EACjD,EAAA,EAAI,2BAAA;AAAA,EACJ,IAAA,EAAM,2BAAA;AAAA,EACN,QAAA,EAAU,aAAA;AAAA,EACV,GAAA,EAAK,+HAAA;AAAA,EACL,MAAA,EAAQ,uGAAA;AAAA,EACR,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,4BAAA,GAA4C,CAAC,IAAA,EAAM,OAAA,KAAY;AAEnE,EAAA,IAAI,KAAK,IAAA,KAAS,UAAA,IAAc,IAAA,CAAK,IAAA,KAAS,aAAa,OAAO,IAAA;AAElE,EAAA,MAAM,eAAA,GAAkB,yBAAyB,IAAI,CAAA;AACrD,EAAA,IAAI,CAAC,iBAAiB,OAAO,IAAA;AAE7B,EAAA,MAAM,cAAA,GAAiB,gBAAgB,eAAe,CAAA;AACtD,EAAA,IAAI,CAAC,gBAAgB,OAAO,IAAA;AAQ5B,EAAA,IAAI,CAAC,oBAAA,CAAqB,IAAA,EAAM,OAAO,GAAG,OAAO,IAAA;AAEjD,EAAA,MAAM,IAAA,GAAO,QAAQ,OAAO,CAAA;AAC5B,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAExC,EAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAClC,IAAA,MAAM,YAAY,CAAA,EAAG,IAAA,CAAK,eAAe,IAAA,CAAK,EAAE,IAAI,KAAK,CAAA,CAAA;AACzD,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,EAAG;AAEzB,IAAA,MAAM,OAAA,GAAU,eAAe,KAAK,CAAA;AAGpC,IAAA,IAAI,sBAAA,CAAuB,IAAA,EAAM,OAAO,CAAA,EAAG;AAG3C,IAAA,IAAI,yBAAA,CAA0B,IAAA,EAAM,OAAA,EAAS,OAAO,CAAA,EAAG;AAGvD,IAAA,IAAA,CAAK,IAAI,SAAS,CAAA;AAClB,IAAA,OAAO;AAAA,MACL,QAAQ,0BAAA,CAA2B,EAAA;AAAA,MACnC,OAAA,EAAS,KAAA;AAAA,MACT,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,QAAA;AAAA,MACA,GAAG,0BAAA,CAA2B,KAAK,CAAA,CAAE,KAAK,IAAI;AAAA,KAChD;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT,CAAA;AAEO,IAAM,0BAA0B,UAAA,CAAW;AAAA,EAChD,UAAA,EAAY,0BAAA;AAAA,EACZ,KAAA,EAAO;AACT,CAAC;AAOD,IAAM,eAAA,GAA0E;AAAA,EAC9E,MAAA,EAAQ,QAAA;AAAA,EACR,IAAA,EAAM,YAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQ;AACV,CAAA;AAEA,SAAS,oBAAoB,IAAA,EAAoD;AAG/E,EAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG,OAAO,SAAA;AAChC,EAAA,IAAI,cAAA,CAAe,IAAI,CAAA,EAAG,OAAO,UAAA;AACjC,EAAA,MAAM,eAAA,GAAkB,yBAAyB,IAAI,CAAA;AACrD,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,MAAM,MAAA,GAAS,gBAAgB,eAAe,CAAA;AAC9C,IAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,EACrB;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,qBAAA,CAAsB,MAAoB,WAAA,EAA8B;AAC/E,EAAA,IAAI,CAAC,KAAK,YAAA,IAAgB,CAAC,MAAM,OAAA,CAAQ,IAAA,CAAK,YAAY,CAAA,EAAG,OAAO,KAAA;AACpE,EAAA,OAAO,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,CAAC,WAAA,KAAgB;AAC7C,IAAA,MAAM,CAAA,GAAI,WAAA;AACV,IAAA,OAAO,CAAA,CAAE,SAAS,IAAA,KAAS,WAAA;AAAA,EAC7B,CAAC,CAAA;AACH;AAGA,SAAS,iBAAA,CAAkB,IAAA,EAAoB,OAAA,EAAsB,QAAA,EAA6B;AAChG,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAI,qBAAA,CAAsB,IAAA,EAAM,OAAO,CAAA,EAAG,OAAO,IAAA;AAAA,EACnD;AAEA,EAAA,IAAI,IAAA,CAAK,WAAA,IAAe,OAAA,CAAQ,IAAA,CAAK,oBAAA,EAAsB;AACzD,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAA,CAAK,oBAAA,CAAqB,KAAK,WAAW,CAAA;AACjE,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,QAAA,IAAI,qBAAA,CAAsB,MAAA,EAAQ,OAAO,CAAA,EAAG,OAAO,IAAA;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAGA,IAAM,kBAAA,GAA+C;AAAA,EACnD,QAAA,EAAU,CAAC,UAAA,EAAY,SAAS;AAClC,CAAA;AAEA,IAAM,gBAAA,GAAmB,CAAC,UAAU,CAAA;AAEpC,IAAM,mBAAA,GAAsC;AAAA,EAC1C,EAAA,EAAI,mBAAA;AAAA,EACJ,IAAA,EAAM,mBAAA;AAAA,EACN,QAAA,EAAU,aAAA;AAAA,EACV,GAAA,EAAK,yGAAA;AAAA,EACL,MAAA,EAAQ,8GAAA;AAAA,EACR,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,cAAA,GAAiB,wBAAA;AAEvB,SAAS,aAAa,OAAA,EAAmC;AACvD,EAAA,OAAO,iBAAiB,OAAA,EAAS,cAAA,EAAgB,sBAAM,IAAI,KAAa,CAAA;AAC1E;AAEA,IAAM,qBAAA,GAAqC,CAAC,IAAA,EAAM,OAAA,KAAY;AAC5D,EAAA,IAAI,IAAA,CAAK,SAAS,UAAA,IAAc,IAAA,CAAK,SAAS,WAAA,IAAe,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS,OAAO,IAAA;AAE3F,EAAA,MAAM,OAAA,GAAU,oBAAoB,IAAI,CAAA;AACxC,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAGrB,EAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,OAAO,CAAA,IAAK,gBAAA;AAChD,EAAA,IAAI,iBAAA,CAAkB,IAAA,EAAM,OAAA,EAAS,QAAQ,GAAG,OAAO,IAAA;AAGvD,EAAA,MAAM,IAAA,GAAO,aAAa,OAAO,CAAA;AACjC,EAAA,MAAM,YAAY,CAAA,EAAG,IAAA,CAAK,eAAe,IAAA,CAAK,EAAE,IAAI,OAAO,CAAA,CAAA;AAC3D,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,EAAG,OAAO,IAAA;AAChC,EAAA,IAAA,CAAK,IAAI,SAAS,CAAA;AAElB,EAAA,OAAO;AAAA,IACL,QAAQ,mBAAA,CAAoB,EAAA;AAAA,IAC5B,OAAA;AAAA,IACA,QAAQ,IAAA,CAAK,EAAA;AAAA,IACb,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,IACjC,GAAG,mBAAA,CAAoB,OAAO,CAAA,CAAE,KAAK,IAAI;AAAA,GAC3C;AACF,CAAA;AAEO,IAAM,mBAAmB,UAAA,CAAW;AAAA,EACzC,UAAA,EAAY,mBAAA;AAAA,EACZ,KAAA,EAAO;AACT,CAAC;AClSM,IAAM,kBAAA,GAAqBA,EAAE,MAAA,CAAO;AAAA,EACzC,OAAA,EAASA,EAAE,MAAA,EAAO;AAAA,EAClB,MAAA,EAAQA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC5B,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACvB,CAAC;AAID,IAAM,kBAAA,GAAqB;AAAA;AAAA,EAEzB,0EAAA;AAAA;AAAA,EAEA,wEAAA;AAAA;AAAA,EAEA;AACF,CAAA;AAEO,SAAS,cAAc,GAAA,EAA2B;AACvD,EAAA,KAAA,MAAW,WAAW,kBAAA,EAAoB;AACxC,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA;AAC/B,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,GAAG,OAAA,EAAS,QAAA,EAAU,MAAM,CAAA,GAAI,KAAA;AACtC,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAM,IAAI,mBAAmB,CAAA,mCAAA,CAAqC,CAAA;AAAA,MACpE;AACA,MAAA,OAAO;AAAA,QACL,OAAA;AAAA,QACA,QAAA,EAAU,QAAA,GAAW,kBAAA,CAAmB,QAAQ,CAAA,GAAI,MAAA;AAAA,QACpD,MAAA,EAAQ,MAAA,GAAS,kBAAA,CAAmB,MAAM,CAAA,GAAI;AAAA,OAChD;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,IAAI,kBAAA;AAAA,IACR,CAAA,6EAAA;AAAA,GACF;AACF;AAEO,IAAM,kBAAA,GAAN,cAAiC,KAAA,CAAM;AAAA,EAC5C,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,EACd;AACF;AAQO,SAAS,oBAAoB,MAAA,EAAwB;AAC1D,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AACxC,EAAA,OAAO,YAAA,CAAa,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA;AACtC;AAEO,SAAS,kBAAA,CAAmB,SAAiB,MAAA,EAAwB;AAG1E,EAAA,MAAM,YAAY,mBAAA,CAAoB,MAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,GAAG,CAAA;AAC/D,EAAA,OAAO,CAAA,6BAAA,EAAgC,OAAO,CAAA,SAAA,EAAY,SAAS,CAAA,CAAA;AACrE;;;AC7DA,IAAM,cAAA,GAAiB,0BAAA;AAiBhB,IAAM,WAAA,GAAN,MAAM,YAAA,CAAY;AAAA,EACf,KAAA;AAAA,EAER,YAAY,OAAA,EAA6B;AACvC,IAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,KAAA;AAAA,EACvB;AAAA,EAEA,OAAO,OAAA,GAAuB;AAC5B,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA;AACvC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,OAAO,IAAI,YAAA,CAAY,EAAE,KAAA,EAAO,CAAA;AAAA,EAClC;AAAA,EAEA,MAAM,QAAQ,OAAA,EAA2C;AACvD,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,cAAc,CAAA,OAAA,EAAU,OAAO,CAAA,CAAA;AAC9C,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,OAAA,EAAS;AAAA,QACP,iBAAiB,IAAA,CAAK;AAAA;AACxB,KACD,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AACpD,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,CAAA,sBAAA,EAAyB,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,UAAU,CAAA,CAAA;AAAA,QAC/D,QAAA,CAAS,MAAA;AAAA,QACT;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAA,CACJ,OAAA,EACA,OAAA,EACA,OAAA,EACwC;AACxC,IAAA,MAAM,MAAA,GAAS,SAAS,MAAA,IAAU,KAAA;AAClC,IAAA,MAAM,KAAA,GAAQ,SAAS,KAAA,IAAS,CAAA;AAGhC,IAAA,MAAME,WAAAA,GAAa,EAAA;AACnB,IAAA,MAAM,YAA2C,EAAC;AAElD,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,MAAA,EAAQ,KAAKA,WAAAA,EAAY;AACnD,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,IAAIA,WAAU,CAAA;AAC7C,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAC1B,MAAA,MAAM,GAAA,GAAM,CAAA,EAAG,cAAc,CAAA,QAAA,EAAW,OAAO,CAAA,KAAA,EAAQ,kBAAA,CAAmB,GAAG,CAAC,CAAA,QAAA,EAAW,MAAM,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA;AAC9G,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAChC,OAAA,EAAS;AAAA,UACP,iBAAiB,IAAA,CAAK;AAAA;AACxB,OACD,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AACpD,QAAA,MAAM,IAAI,gBAAA;AAAA,UACR,CAAA,wBAAA,EAA2B,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,UAAU,CAAA,CAAA;AAAA,UACjE,QAAA,CAAS,MAAA;AAAA,UACT;AAAA,SACF;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,KAAA,MAAW,CAAC,QAAQ,QAAQ,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,EAAG;AAC5D,QAAA,SAAA,CAAU,MAAM,CAAA,GAAI,QAAA;AAAA,MACtB;AAAA,IACF;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAc,OAAA,EAAkD;AACpE,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,cAAc,CAAA,OAAA,EAAU,OAAO,CAAA,OAAA,CAAA;AAC9C,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,OAAA,EAAS,EAAE,eAAA,EAAiB,IAAA,CAAK,KAAA;AAAM,KACxC,CAAA;AACD,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,QAAQ,MAAM,QAAA,CAAS,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAClD,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,CAAA,6BAAA,EAAgC,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,UAAU,CAAA,CAAA;AAAA,QACtE,QAAA,CAAS,MAAA;AAAA,QACT;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO,IAAA,CAAK,IAAA,EAAM,MAAA,IAAU,EAAC;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,QAAA,EAAmC;AAC1D,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,QAAQ,CAAA;AACrC,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,CAAA,0BAAA,EAA6B,SAAS,MAAM,CAAA,CAAA;AAAA,QAC5C,QAAA,CAAS;AAAA,OACX;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,WAAA,EAAY;AAC1C,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,SAAS,QAAQ,CAAA;AAAA,EAC9C;AAAA,EAEA,MAAM,YAAA,CACJ,OAAA,EACA,OAAA,EAC+B;AAC/B,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA;AAC5B,IAAA,MAAM,GAAA,GAAM,GAAG,cAAc,CAAA,OAAA,EAAU,OAAO,CAAA,WAAA,EAAc,kBAAA,CAAmB,GAAG,CAAC,CAAA,CAAA;AACnF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,OAAA,EAAS;AAAA,QACP,iBAAiB,IAAA,CAAK;AAAA;AACxB,KACD,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AACpD,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,CAAA,uBAAA,EAA0B,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,UAAU,CAAA,CAAA;AAAA,QAChE,QAAA,CAAS,MAAA;AAAA,QACT;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AACF;AAEO,IAAM,gBAAA,GAAN,cAA+B,KAAA,CAAM;AAAA,EAC1C,WAAA,CACE,OAAA,EACO,UAAA,EACA,YAAA,EACP;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAHN,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAGP,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA,EACd;AACF;;;ACnKO,SAAS,sBAAA,CACd,SACA,QAAA,EACc;AACd,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,MAAM,QAAA,CAAS,IAAA;AAAA,IACf,cAAc,QAAA,CAAS,YAAA;AAAA,IACvB,SAAS,QAAA,CAAS,OAAA;AAAA,IAClB,QAAA,EAAU,aAAA,CAAc,QAAA,CAAS,QAAQ,CAAA;AAAA,IACzC,UAAA,EAAY,mBAAA,CAAoB,QAAA,CAAS,UAAU,CAAA;AAAA,IACnD,MAAA,EAAQ,eAAA,CAAgB,QAAA,CAAS,MAAM;AAAA,GACzC;AACF;AAEA,SAAS,cAAc,IAAA,EAA0B;AAC/C,EAAA,MAAM,IAAA,GAAqB;AAAA,IACzB,IAAI,IAAA,CAAK,EAAA;AAAA,IACT,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,OAAA,EAAS,SAAA,IAAa,IAAA,GAAQ,IAAA,CAAK,WAAW,IAAA,GAAQ;AAAA,GACxD;AAGA,EAAA,IAAI,YAAA,IAAgB,IAAA,IAAQ,IAAA,CAAK,UAAA,EAAY;AAC3C,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA;AAAA,EACzB;AACA,EAAA,IAAI,aAAA,IAAiB,IAAA,IAAQ,IAAA,CAAK,WAAA,EAAa;AAC7C,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,WAAA;AAAA,EAC1B;AACA,EAAA,IAAI,mBAAA,IAAuB,IAAA,IAAQ,IAAA,CAAK,iBAAA,EAAmB;AACzD,IAAA,IAAA,CAAK,oBACH,IAAA,CAAK,iBAAA;AAAA,EACT;AACA,EAAA,IAAI,wBAAA,IAA4B,IAAA,IAAQ,IAAA,CAAK,sBAAA,EAAwB;AACnE,IAAA,IAAA,CAAK,yBACH,IAAA,CAAK,sBAAA;AAAA,EACT;AACA,EAAA,IAAI,sBAAA,IAA0B,IAAA,IAAQ,IAAA,CAAK,oBAAA,EAAsB;AAC/D,IAAA,IAAA,CAAK,uBACH,IAAA,CAAK,oBAAA;AAAA,EACT;AACA,EAAA,IAAI,2BAA2B,IAAA,EAAM;AACnC,IAAA,IAAA,CAAK,wBAAwB,IAAA,CAAK,qBAAA;AAAA,EACpC;AACA,EAAA,IAAI,2BAA2B,IAAA,EAAM;AACnC,IAAA,IAAA,CAAK,wBAAwB,IAAA,CAAK,qBAAA;AAAA,EACpC;AACA,EAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,WAAA;AAAA,EAC1B;AACA,EAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,WAAA;AAAA,EAC1B;AACA,EAAA,IAAI,kBAAkB,IAAA,EAAM;AAC1B,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK,YAAA;AAAA,EAC3B;AACA,EAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA;AAAA,EACzB;AACA,EAAA,IAAI,mBAAmB,IAAA,EAAM;AAC3B,IAAA,IAAA,CAAK,gBAAgB,IAAA,CAAK,aAAA;AAAA,EAC5B;AAGA,EAAA,IAAI,UAAA,IAAc,IAAA,IAAQ,OAAO,IAAA,CAAK,aAAa,QAAA,EAAU;AAC3D,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA;AAAA,EACvB;AACA,EAAA,IAAI,UAAA,IAAc,IAAA,IAAQ,OAAO,IAAA,CAAK,aAAa,QAAA,EAAU;AAC3D,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA;AAAA,EACvB;AACA,EAAA,IAAI,WAAA,IAAe,IAAA,IAAQ,OAAO,IAAA,CAAK,cAAc,QAAA,EAAU;AAC7D,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,SAAA;AAAA,EACxB;AACA,EAAA,IAAI,WAAA,IAAe,IAAA,IAAQ,OAAO,IAAA,CAAK,cAAc,QAAA,EAAU;AAC7D,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,SAAA;AAAA,EACxB;AACA,EAAA,IAAI,YAAA,IAAgB,IAAA,IAAQ,IAAA,CAAK,UAAA,KAAe,MAAA,EAAW;AACzD,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA;AAAA,EACzB;AACA,EAAA,IAAI,aAAA,IAAiB,IAAA,IAAQ,IAAA,CAAK,WAAA,EAAa;AAC7C,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,WAAA;AAAA,EAC1B;AAGA,EAAA,IAAI,YAAA,IAAgB,IAAA,IAAQ,IAAA,CAAK,UAAA,EAAY;AAC3C,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA;AAAA,EACzB;AACA,EAAA,IAAI,oBAAA,IAAwB,IAAA,IAAQ,OAAO,IAAA,CAAK,uBAAuB,QAAA,EAAU;AAC/E,IAAA,IAAA,CAAK,qBAAqB,IAAA,CAAK,kBAAA;AAAA,EACjC;AACA,EAAA,IAAI,yBAAA,IAA6B,IAAA,IAAQ,IAAA,CAAK,uBAAA,EAAyB;AACrE,IAAA,IAAA,CAAK,0BACH,IAAA,CAAK,uBAAA;AAAA,EACT;AAGA,EAAA,IAAI,cAAA,IAAkB,IAAA,IAAQ,OAAO,IAAA,CAAK,iBAAiB,QAAA,EAAU;AACnE,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK,YAAA;AAAA,EAC3B;AACA,EAAA,IAAI,iBAAA,IAAqB,IAAA,IAAQ,OAAO,IAAA,CAAK,oBAAoB,QAAA,EAAU;AACzE,IAAA,IAAA,CAAK,kBAAkB,IAAA,CAAK,eAAA;AAAA,EAC9B;AACA,EAAA,IAAI,YAAA,IAAgB,IAAA,IAAQ,OAAO,IAAA,CAAK,eAAe,QAAA,EAAU;AAC/D,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA;AAAA,EACzB;AACA,EAAA,IAAI,eAAA,IAAmB,IAAA,IAAQ,OAAO,IAAA,CAAK,kBAAkB,QAAA,EAAU;AACrE,IAAA,IAAA,CAAK,gBAAgB,IAAA,CAAK,aAAA;AAAA,EAC5B;AACA,EAAA,IAAI,mBAAA,IAAuB,IAAA,IAAQ,OAAO,IAAA,CAAK,sBAAsB,QAAA,EAAU;AAC7E,IAAA,IAAA,CAAK,oBAAoB,IAAA,CAAK,iBAAA;AAAA,EAChC;AACA,EAAA,IAAI,gBAAA,IAAoB,IAAA,IAAQ,OAAO,IAAA,CAAK,mBAAmB,QAAA,EAAU;AACvE,IAAA,IAAA,CAAK,iBAAiB,IAAA,CAAK,cAAA;AAAA,EAC7B;AAGA,EAAA,IAAI,0BAAA,IAA8B,IAAA,IAAQ,IAAA,CAAK,wBAAA,EAA0B;AACvE,IAAA,IAAA,CAAK,2BACH,IAAA,CAAK,wBAAA;AAAA,EACT;AACA,EAAA,IAAI,wBAAA,IAA4B,IAAA,IAAQ,IAAA,CAAK,sBAAA,EAAwB;AACnE,IAAA,IAAA,CAAK,yBACH,IAAA,CAAK,sBAAA;AAAA,EACT;AACA,EAAA,IAAI,aAAA,IAAiB,IAAA,IAAQ,OAAO,IAAA,CAAK,gBAAgB,QAAA,EAAU;AACjE,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,WAAA;AAAA,EAC1B;AACA,EAAA,IAAI,gBAAA,IAAoB,IAAA,IAAQ,OAAO,IAAA,CAAK,mBAAmB,QAAA,EAAU;AACvE,IAAA,IAAA,CAAK,iBAAiB,IAAA,CAAK,cAAA;AAAA,EAC7B;AACA,EAAA,IAAI,oBAAA,IAAwB,IAAA,IAAQ,OAAO,IAAA,CAAK,uBAAuB,QAAA,EAAU;AAC/E,IAAA,IAAA,CAAK,qBAAqB,IAAA,CAAK,kBAAA;AAAA,EACjC;AACA,EAAA,IAAI,uBAAA,IAA2B,IAAA,IAAQ,OAAO,IAAA,CAAK,0BAA0B,QAAA,EAAU;AACrF,IAAA,IAAA,CAAK,wBAAwB,IAAA,CAAK,qBAAA;AAAA,EACpC;AAGA,EAAA,IAAI,cAAA,IAAkB,IAAA,IAAQ,OAAO,IAAA,CAAK,iBAAiB,SAAA,EAAW;AACpE,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK,YAAA;AAAA,EAC3B;AACA,EAAA,IAAI,mBAAA,IAAuB,IAAA,IAAQ,IAAA,CAAK,iBAAA,EAAmB;AACzD,IAAA,IAAA,CAAK,oBACH,IAAA,CAAK,iBAAA;AAAA,EACT;AAGA,EAAA,IAAI,qBAAA,IAAyB,IAAA,IAAQ,IAAA,CAAK,mBAAA,EAAqB;AAC7D,IAAA,IAAA,CAAK,sBAAsB,IAAA,CAAK,mBAAA;AAAA,EAClC;AAGA,EAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,WAAA;AAAA,EAC1B;AACA,EAAA,IAAI,kCAAkC,IAAA,EAAM;AAC1C,IAAA,IAAA,CAAK,+BACH,IAAA,CAAK,4BAAA;AAAA,EACT;AACA,EAAA,IAAI,yBAAyB,IAAA,EAAM;AACjC,IAAA,IAAA,CAAK,sBAAsB,IAAA,CAAK,mBAAA;AAAA,EAIlC;AAGA,EAAA,IAAI,YAAY,IAAA,EAAM;AACpB,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AAAA,EACrB;AACA,EAAA,IAAI,WAAW,IAAA,EAAM;AACnB,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAAA,EACpB;AACA,EAAA,IAAI,aAAa,IAAA,EAAM;AACrB,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AAAA,EACtB;AACA,EAAA,IAAI,cAAA,IAAkB,IAAA,IAAQ,OAAO,IAAA,CAAK,iBAAiB,QAAA,EAAU;AACnE,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK,YAAA;AAAA,EAC3B;AACA,EAAA,IAAI,yBAAA,IAA6B,IAAA,IAAQ,IAAA,CAAK,uBAAA,EAAyB;AACrE,IAAA,IAAA,CAAK,0BAA0B,IAAA,CAAK,uBAAA;AAAA,EACtC;AACA,EAAA,IAAI,aAAa,IAAA,EAAM;AACrB,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AAAA,EACtB;AACA,EAAA,IAAI,cAAA,IAAkB,IAAA,IAAQ,OAAO,IAAA,CAAK,iBAAiB,QAAA,EAAU;AACnE,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK,YAAA;AAAA,EAC3B;AACA,EAAA,IAAI,SAAA,IAAa,QAAQ,OAAO,IAAA,CAAK,YAAY,QAAA,IAAY,IAAA,CAAK,UAAU,CAAA,EAAG;AAC7E,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AAAA,EACtB;AAGA,EAAA,IAAI,gBAAA,IAAoB,IAAA,IAAQ,IAAA,CAAK,cAAA,EAAgB;AACnD,IAAA,IAAA,CAAK,iBAAiB,IAAA,CAAK,cAAA;AAAA,EAC7B;AAGA,EAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA;AAAA,EACzB;AACA,EAAA,IAAI,WAAW,IAAA,EAAM;AACnB,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAAA,EACpB;AACA,EAAA,IAAI,oBAAoB,IAAA,KAAS,IAAA,CAAK,mBAAmB,UAAA,IAAc,IAAA,CAAK,mBAAmB,QAAA,CAAA,EAAW;AACxG,IAAA,IAAA,CAAK,iBAAiB,IAAA,CAAK,cAAA;AAAA,EAC7B;AACA,EAAA,IAAI,UAAA,IAAc,IAAA,IAAQ,OAAO,IAAA,CAAK,aAAa,QAAA,EAAU;AAC3D,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA;AAAA,EACvB;AAGA,EAAA,IAAI,WAAA,IAAe,IAAA,IAAQ,IAAA,CAAK,SAAA,EAAW;AACzC,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,SAAA;AAAA,EACxB;AAGA,EAAA,IAAI,cAAA,IAAkB,IAAA,IAAQ,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,YAAY,CAAA,IAAK,IAAA,CAAK,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AAC9F,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK,YAAA;AAAA,EAC3B;AAGA,EAAA,IAAI,cAAc,IAAA,IAAQ,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA,EAAG;AACtD,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,aAAa,CAAA;AAAA,EACjD;AAEA,EAAA,OAAO,IAAA;AACT;AAMO,SAAS,0BAAA,CACd,SACA,QAAA,EACc;AACd,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA;AACvB,EAAA,IAAI,CAAC,KAAA;AACH,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAEF,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,MAAM,QAAA,CAAS,IAAA;AAAA,IACf,cAAc,QAAA,CAAS,YAAA;AAAA,IACvB,SAAS,QAAA,CAAS,OAAA;AAAA,IAClB,QAAA,EAAU,aAAA,CAAc,KAAA,CAAM,QAAQ,CAAA;AAAA,IACtC,UAAA,EAAY,mBAAA,CAAoB,KAAA,CAAM,UAAU,CAAA;AAAA,IAChD,MAAA,EAAQ,eAAA,CAAgB,KAAA,CAAM,MAAM;AAAA,GACtC;AACF;AAMO,SAAS,6BAAA,CACd,UACA,YAAA,EAC8B;AAC9B,EAAA,MAAM,SAAuC,EAAC;AAC9C,EAAA,KAAA,MAAW,MAAM,YAAA,EAAc;AAC7B,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,EAAE,CAAA;AAC/B,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,MAAA,CAAO,EAAE,CAAA,GAAI,aAAA,CAAc,KAAA,CAAM,QAAQ,CAAA;AAAA,IAC3C;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,oBACP,UAAA,EAC4B;AAC5B,EAAA,MAAM,SAAqC,EAAC;AAC5C,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,SAAS,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACxD,IAAA,MAAA,CAAO,EAAE,CAAA,GAAI;AAAA,MACX,KAAK,SAAA,CAAU,GAAA;AAAA,MACf,MAAM,SAAA,CAAU,IAAA;AAAA,MAChB,aAAa,SAAA,CAAU;AAAA,KACzB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,gBACP,MAAA,EACwB;AACxB,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAChD,IAAA,MAAA,CAAO,EAAE,CAAA,GAAI;AAAA,MACX,KAAK,KAAA,CAAM,GAAA;AAAA,MACX,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,WAAW,KAAA,CAAM;AAAA,KACnB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;ACxSA,SAAS,eAAe,QAAA,EAA0B;AAChD,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AAC3C,EAAA,IAAI,aAAa,MAAA,EAAQ;AAEvB,IAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAAA,EACnC;AACA,EAAA,OAAO,QAAA;AACT;AAMA,eAAsB,sBACpB,QAAA,EACuB;AACvB,EAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AAChD,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAK/B,EAAA,MAAM,OAAA,GAAU,eAAe,QAAQ,CAAA;AAEvC,EAAA,MAAM,IAAA,GAAO,sBAAA,CAAuB,OAAA,EAAS,IAAI,CAAA;AAGjD,EAAA,IAAI,KAAK,oBAAA,EAAsB;AAC7B,IAAA,MAAM,SAAuC,EAAC;AAC9C,IAAA,KAAA,MAAW,CAAC,IAAI,GAAG,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,oBAAoB,CAAA,EAAG;AACjE,MAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,SAAA,CAAU,GAAG,CAAA;AAC/C,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,MAAA,CAAO,EAAE,IAAI,MAAA,CAAO,IAAA;AAAA,MACtB,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,MAAM,CAAA,yCAAA,EAA4C,EAAE,CAAA,oBAAA,CAAA,EAAwB,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA,MACzG;AAAA,IACF;AACA,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,SAAS,CAAA,EAAG;AAClC,MAAA,IAAA,CAAK,oBAAA,GAAuB,MAAA;AAAA,IAC9B;AAAA,EACF;AAGA,EAAA,IAAI,KAAK,uBAAA,EAAyB;AAChC,IAAA,MAAM,SAAuC,EAAC;AAC9C,IAAA,KAAA,MAAW,CAAC,IAAI,GAAG,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,uBAAuB,CAAA,EAAG;AACpE,MAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,SAAA,CAAU,GAAG,CAAA;AAC/C,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,MAAA,CAAO,EAAE,IAAI,MAAA,CAAO,IAAA;AAAA,MACtB,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,MAAM,CAAA,4CAAA,EAA+C,EAAE,CAAA,oBAAA,CAAA,EAAwB,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA,MAC5G;AAAA,IACF;AACA,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,SAAS,CAAA,EAAG;AAClC,MAAA,IAAA,CAAK,uBAAA,GAA0B,MAAA;AAAA,IACjC;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,cAAA,CACd,MACA,OAAA,EACc;AACd,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC5B,EAAA,OAAO,sBAAA,CAAuB,SAAS,IAAI,CAAA;AAC7C;AAEO,IAAM,kBAAA,GAAN,cAAiC,KAAA,CAAM;AAAA,EAC5C,WAAA,CAAY,SAAwB,QAAA,EAAmB;AACrD,IAAA,KAAA,CAAM,OAAO,CAAA;AADqB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAElC,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,EACd;AACF;;;ACrFA,IAAM,UAAA,GAAa,EAAA;AAKZ,SAAS,oBAAoB,IAAA,EAAiC;AACnE,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAE5B,EAAA,SAAS,KAAK,CAAA,EAAuB;AACnC,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,UAAA,IAAc,CAAA,CAAE,WAAA,EAAa;AAC1C,MAAA,GAAA,CAAI,GAAA,CAAI,EAAE,WAAW,CAAA;AAAA,IACvB;AACA,IAAA,IAAI,EAAE,QAAA,EAAU;AACd,MAAA,KAAA,MAAW,KAAA,IAAS,EAAE,QAAA,EAAU;AAC9B,QAAA,IAAA,CAAK,KAAK,CAAA;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAA,CAAK,IAAI,CAAA;AACT,EAAA,OAAO,GAAA;AACT;AAMO,SAAS,iCAAiC,IAAA,EAAiC;AAChF,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAE5B,EAAA,SAAS,KAAK,CAAA,EAAuB;AACnC,IAAA,IAAI,EAAE,YAAA,IAAgB,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,YAAY,CAAA,EAAG;AACnD,MAAA,KAAA,MAAW,WAAA,IAAe,EAAE,YAAA,EAAc;AACxC,QAAA,MAAM,CAAA,GAAI,WAAA;AAIV,QAAA,IAAI,CAAA,CAAE,OAAA,EAAS,IAAA,KAAS,UAAA,IAAc,EAAE,OAAA,EAAS;AAC/C,UAAA,KAAA,MAAW,MAAA,IAAU,EAAE,OAAA,EAAS;AAC9B,YAAA,IAAI,MAAA,CAAO,UAAA,KAAe,WAAA,IAAe,MAAA,CAAO,aAAA,EAAe;AAC7D,cAAA,GAAA,CAAI,GAAA,CAAI,OAAO,aAAa,CAAA;AAAA,YAC9B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,EAAE,QAAA,EAAU;AACd,MAAA,KAAA,MAAW,KAAA,IAAS,EAAE,QAAA,EAAU;AAC9B,QAAA,IAAA,CAAK,KAAK,CAAA;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAA,CAAK,IAAI,CAAA;AACT,EAAA,OAAO,GAAA;AACT;AAYA,eAAsB,2BAAA,CACpB,MAAA,EACA,OAAA,EACA,QAAA,EACA,YAAY,CAAA,EAC2B;AACvC,EAAA,MAAM,iBAA+C,EAAC;AACtD,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AAGpC,EAAA,IAAI,UAAA,GAAa,oBAAoB,QAAQ,CAAA;AAE7C,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,SAAA,EAAW,IAAA,EAAA,EAAQ;AAE3C,IAAA,MAAM,UAAA,GAAa,CAAC,GAAG,UAAU,CAAA,CAAE,MAAA,CAAO,CAAC,EAAA,KAAO,CAAC,WAAA,CAAY,GAAA,CAAI,EAAE,CAAC,CAAA;AACtE,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAG7B,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,MAAA,EAAQ,KAAK,UAAA,EAAY;AACtD,MAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,IAAI,UAAU,CAAA;AAChD,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,YAAA,CAAa,SAAS,KAAK,CAAA;AACzD,QAAA,MAAM,WAAA,GAAc,6BAAA,CAA8B,QAAA,EAAU,KAAK,CAAA;AACjE,QAAA,KAAA,MAAW,CAAC,EAAA,EAAI,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AACpD,UAAA,cAAA,CAAe,EAAE,CAAA,GAAI,IAAA;AAAA,QACvB;AAAA,MACF,SAAS,GAAA,EAAK;AAEZ,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,yCAAA,EAA4C,KAAA,CAAM,MAAM,UAAU,GAAG,CAAA;AAAA,MACrF;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,MAAM,UAAA,EAAY;AAC3B,MAAA,WAAA,CAAY,IAAI,EAAE,CAAA;AAAA,IACpB;AAGA,IAAA,UAAA,uBAAiB,GAAA,EAAY;AAC7B,IAAA,KAAA,MAAW,MAAM,UAAA,EAAY;AAC3B,MAAA,MAAM,IAAA,GAAO,eAAe,EAAE,CAAA;AAC9B,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,KAAA,MAAW,QAAA,IAAY,mBAAA,CAAoB,IAAI,CAAA,EAAG;AAChD,UAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC9B,YAAA,UAAA,CAAW,IAAI,QAAQ,CAAA;AAAA,UACzB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,cAAA;AACT;AAQA,eAAsB,8BAAA,CACpB,MAAA,EACA,OAAA,EACA,QAAA,EACA,mBAAA,EACuC;AACvC,EAAA,MAAM,OAAA,GAAU,iCAAiC,QAAQ,CAAA;AACzD,EAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,CAAA,EAAG,OAAO,EAAC;AAEhC,EAAA,MAAM,kBAAgD,EAAC;AACvD,EAAA,MAAM,aAAuB,EAAC;AAE9B,EAAA,KAAA,MAAW,MAAM,OAAA,EAAS;AACxB,IAAA,MAAM,QAAA,GAAW,sBAAsB,EAAE,CAAA;AACzC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,eAAA,CAAgB,EAAE,CAAA,GAAI,QAAA;AAAA,IACxB,CAAA,MAAO;AACL,MAAA,UAAA,CAAW,KAAK,EAAE,CAAA;AAAA,IACpB;AAAA,EACF;AAEA,EAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,eAAA;AAEpC,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,MAAA,EAAQ,KAAK,UAAA,EAAY;AACtD,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,IAAI,UAAU,CAAA;AAChD,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,YAAA,CAAa,SAAS,KAAK,CAAA;AACzD,MAAA,MAAM,WAAA,GAAc,6BAAA,CAA8B,QAAA,EAAU,KAAK,CAAA;AACjE,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AACpD,QAAA,eAAA,CAAgB,EAAE,CAAA,GAAI,IAAA;AAAA,MACxB;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,2DAAA,EAA8D,KAAA,CAAM,MAAM,UAAU,GAAG,CAAA;AAAA,IACvG;AAAA,EACF;AAEA,EAAA,OAAO,eAAA;AACT;ACrKO,IAAM,yBAAyBF,CAAAA,CAAE,IAAA,CAAK,CAAC,KAAA,EAAO,YAAA,EAAc,QAAQ,CAAC;AAGrE,IAAM,uBAAA,GAA0BA,EAAE,IAAA,CAAK;AAAA,EAC5C,SAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,uBAAA,GAA0BA,EAAE,MAAA,CAAO;AAAA,EAC9C,KAAA,EAAOA,EAAE,MAAA,EAAO;AAAA,EAChB,KAAA,EAAOA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC3B,YAAA,EAAcA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAClC,kBAAA,EAAoBA,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA,EAC1D,gBAAA,EAAkB,sBAAA,CAAuB,OAAA,CAAQ,YAAY,CAAA;AAAA,EAC7D,UAAA,EAAYA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,wCAAwC,CAAA;AAAA,EACvE,MAAA,EAAQA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS5B,KAAA,EAAO,oBAAoB,QAAA;AAC7B,CAAC;AC5BM,IAAM,sBAAA,GAAyBA,EAAE,MAAA,CAAO;AAAA,EAC7C,MAAA,EAAQA,EAAE,MAAA,EAAO;AAAA,EACjB,QAAA,EAAUA,EAAE,MAAA,EAAO;AAAA,EACnB,UAAA,EAAYA,EAAE,MAAA,EAAO;AAAA,EACrB,UAAA,EAAYA,EAAE,MAAA,EAAO;AAAA,EACrB,cAAA,EAAgBA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,QAAQ,CAAA;AAAA,EAClC,UAAA,EAAYA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,QAAQ;AAChC,CAAC;ACXM,IAAM,gBAAA,GAAmBA,EAAE,IAAA,CAAK,CAAC,QAAQ,UAAA,EAAY,MAAA,EAAQ,QAAQ,CAAC;AAGtE,IAAM,yBAAA,GAA4BA,EAAE,MAAA,CAAO;AAAA,EAChD,MAAA,EAAQA,EAAE,MAAA,EAAO;AAAA,EACjB,WAAA,EAAaA,EAAE,MAAA,EAAO;AAAA,EACtB,YAAA,EAAc;AAChB,CAAC;AAIM,IAAM,uBAAA,GAA0BA,EAAE,MAAA,CAAO;AAAA,EAC9C,WAAA,EAAaA,EAAE,MAAA,EAAO;AAAA,EACtB,iBAAA,EAAmBA,EAAE,MAAA,EAAO;AAAA,EAC5B,eAAA,EAAiB;AACnB,CAAC;AAIM,IAAM,sBAAA,GAAyBA,EAAE,MAAA,CAAO;AAAA,EAC7C,MAAA,EAAQA,EAAE,MAAA,EAAO;AAAA,EACjB,QAAA,EAAUA,EAAE,MAAA,EAAO;AAAA,EACnB,aAAA,EAAeA,EAAE,MAAA,EAAO;AAAA,EACxB,UAAA,EAAY,gBAAA;AAAA,EACZ,KAAA,EAAOA,EAAE,MAAA,EAAO;AAAA,EAChB,oBAAA,EAAsBA,CAAAA,CAAE,KAAA,CAAM,yBAAyB,CAAA;AAAA,EACvD,kBAAA,EAAoBA,CAAAA,CAAE,KAAA,CAAM,uBAAuB,CAAA;AAAA,EACnD,UAAA,EAAYA,EAAE,MAAA;AAChB,CAAC;AAIM,IAAM,aAAA,GAAgBA,EAAE,IAAA,CAAK;AAAA,EAClC,0BAAA;AAAA,EACA,kBAAA;AAAA,EACA,sBAAA;AAAA,EACA,sBAAA;AAAA,EACA,qBAAA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,sBAAA,GAAyBA,EAAE,MAAA,CAAO;AAAA,EAC7C,SAAA,EAAW,aAAA;AAAA;AAAA,EAEX,kBAAA,EAAoBA,EAAE,MAAA,EAAO;AAAA,EAC7B,kBAAA,EAAoBA,EAAE,MAAA,EAAO;AAAA,EAC7B,KAAA,EAAOA,CAAAA,CAAE,MAAA,EAAO,CAAE,MAAA,EAAO;AAAA,EACzB,eAAA,EAAiB,gBAAA;AAAA;AAAA,EAEjB,4BAAA,EAA8BA,EAAE,MAAA,EAAO,CAAE,QAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACtE,4BAAA,EAA8BA,EAAE,MAAA,EAAO,CAAE,QAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACtE,eAAA,EAAiBA,EAAE,MAAA,EAAO,CAAE,QAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EACzD,kBAAA,EAAoBA,CAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,QAAA,EAAS,CAAE,QAAA,EAAS,CAAE,QAAA,EAAS;AAAA;AAAA,EAEpE,mBAAA,EAAqBA,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,WAAA,GAAc,QAAA,EAAS;AAAA,EAC7D,mBAAA,EAAqBA,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,WAAA,GAAc,QAAA,EAAS;AAAA,EAC7D,YAAYA,CAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,QAAA,EAAS;AAAA;AAAA,EAEtC,iBAAA,EAAmBA,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,WAAA,GAAc,QAAA,EAAS;AAAA,EAC3D,iBAAA,EAAmBA,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,WAAA,GAAc,QAAA,EAAS;AAAA,EAC3D,gBAAgBA,CAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,QAAA,EAAS;AAAA;AAAA,EAE1C,qBAAA,EAAuBA,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,WAAA,GAAc,QAAA,EAAS;AAAA,EAC/D,qBAAA,EAAuBA,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,WAAA,GAAc,QAAA,EAAS;AAAA,EAC/D,wBAAA,EAA0BA,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,WAAA,GAAc,QAAA,EAAS;AAAA,EAClE,wBAAA,EAA0BA,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,WAAA,GAAc,QAAA;AAC3D,CAAC;AAEM,IAAM,sBAAA,GAAyBA,CAAAA,CAAE,KAAA,CAAM,sBAAsB;AAI7D,IAAM,6BAA6BA,CAAAA,CAAE,KAAA;AAAA,EAC1CA,EAAE,MAAA,CAAO;AAAA,IACP,MAAA,EAAQA,EAAE,MAAA,EAAO;AAAA,IACjB,UAAA,EAAYA,EAAE,MAAA,EAAO;AAAA,IACrB,YAAA,EAAcA,EAAE,MAAA,EAAO;AAAA,IACvB,WAAA,EAAaA,EAAE,MAAA;AAAO,GACvB;AACH;AAEO,IAAM,gCAAgCA,CAAAA,CAAE,KAAA;AAAA,EAC7CA,EAAE,MAAA,CAAO;AAAA,IACP,WAAA,EAAaA,EAAE,MAAA,EAAO;AAAA,IACtB,iBAAA,EAAmBA,EAAE,MAAA,EAAO;AAAA,IAC5B,eAAA,EAAiBA,EAAE,MAAA;AAAO,GAC3B;AACH;ACrFO,IAAM,kBAAA,GAAqBA,EAAE,IAAA,CAAK;AAAA,EACvC,YAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,kBAAA,GAAqBA,EAAE,MAAA,CAAO;AAAA,EACzC,IAAA,EAAM,kBAAA;AAAA,EACN,MAAA,EAAQA,EAAE,MAAA,EAAO;AAAA,EACjB,QAAA,EAAUA,EAAE,MAAA,EAAO;AAAA,EACnB,MAAA,EAAQA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC5B,YAAA,EAAcA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAClC,eAAA,EAAiB,eAAe,QAAA,EAAS;AAAA,EACzC,gBAAA,EAAkB,gBAAA;AAAA,EAClB,SAAA,EAAWA,EAAE,MAAA,EAAO;AAAA,EACpB,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAC1B,CAAC;ACnBM,IAAM,mBAAmBA,CAAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,QAAA,EAAU,KAAK,CAAC;AAGzD,IAAM,qBAAA,GAAwBA,EAAE,MAAA,CAAO;AAAA,EAC5C,MAAA,EAAQA,EAAE,MAAA,EAAO;AAAA,EACjB,YAAA,EAAcA,EAAE,MAAA,EAAO;AAAA,EACvB,aAAA,EAAeA,EAAE,MAAA,EAAO;AAAA,EACxB,eAAA,EAAiB,cAAA;AAAA,EACjB,gBAAA,EAAkB,eAAe,QAAA,EAAS;AAAA,EAC1C,SAAA,EAAWA,EAAE,MAAA,EAAO;AAAA,EACpB,UAAA,EAAY,gBAAA;AAAA,EACZ,eAAA,EAAiBA,EAAE,MAAA,EAAO;AAAA,EAC1B,eAAA,EAAiBA,CAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AAC/B,CAAC;AAIM,IAAM,qBAAA,GAAwBA,EAAE,MAAA,CAAO;AAAA,EAC5C,WAAA,EAAaA,EAAE,MAAA,EAAO;AAAA,EACtB,QAAA,EAAUA,EAAE,MAAA,EAAO;AAAA,EACnB,WAAA,EAAaA,EAAE,MAAA,EAAO;AAAA,EACtB,iBAAA,EAAmB,cAAA;AAAA,EACnB,cAAA,EAAgBA,EAAE,MAAA,EAAO;AAAA,EACzB,SAAA,EAAWA,EAAE,MAAA,EAAO;AAAA,EACpB,eAAA,EAAiBA,EAAE,MAAA;AACrB,CAAC;AC3BM,IAAM,cAAA,GAAiBA,EAAE,MAAA,CAAO;AAAA,EACrC,QAAA,EAAUA,EAAE,MAAA,EAAO;AAAA,EACnB,WAAA,EAAaA,EAAE,MAAA,EAAO;AAAA,EACtB,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,eAAeA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC9C,qBAAA,EAAuBA,CAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAC5C,cAAcA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC7C,sBAAA,EAAwBA,CAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAC7C,UAAA,EAAYA,CAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EACjC,qBAAA,EAAuBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC3C,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACnB,CAAC;AAIM,IAAM,uBAAA,GAA0BA,EAAE,MAAA,CAAO;AAAA,EAC9C,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,UAAA,EAAYA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAChC,SAAA,EAAWA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC/B,IAAA,EAAMA,CAAAA,CAAE,KAAA,CAAM,cAAc,CAAA;AAAA,EAC5B,OAAA,EAASA,EACN,MAAA,CAAO;AAAA,IACN,SAAA,EAAWA,EAAE,MAAA,EAAO;AAAA,IACpB,cAAA,EAAgBA,EAAE,MAAA,EAAO;AAAA,IACzB,sBAAA,EAAwBA,EAAE,MAAA,EAAO;AAAA,IACjC,iBAAA,EAAmBA,EAAE,MAAA,EAAO;AAAA,IAC5B,kBAAA,EAAoBA,EAAE,MAAA;AAAO,GAC9B,EACA,QAAA,EAAS;AAAA,EACZ,oBAAoBA,CAAAA,CACjB,KAAA;AAAA,IACCA,EAAE,MAAA,CAAO;AAAA,MACP,MAAA,EAAQA,EAAE,MAAA,EAAO;AAAA,MACjB,SAAA,EAAWA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,KAChC;AAAA,IAEF,QAAA;AACL,CAAC;;;AC1BD,SAAS,wBACP,MAAA,EACoB;AACpB,EAAA,MAAM,OAAA,uBAAc,GAAA,EASlB;AAEF,EAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,IAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,MAAA;AAC/B,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA;AAEnC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,cAAc,KAAA,CAAM,eAAA;AAC7B,MAAA,QAAA,CAAS,UAAA,EAAA;AACT,MAAA,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,WAAW,EAAE,CAAA;AAC7C,MAAA,QAAA,CAAS,UAAA,CAAW,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAA;AAAA,IAC/C,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAI,MAAA,EAAQ;AAAA,QAClB,QAAA,EAAU,MAAM,SAAA,CAAU,QAAA;AAAA,QAC1B,YAAY,KAAA,CAAM,eAAA;AAAA,QAClB,UAAA,EAAY,CAAA;AAAA,QACZ,OAAA,sBAAa,GAAA,CAAI,CAAC,MAAM,IAAA,CAAK,UAAA,CAAW,EAAE,CAAC,CAAA;AAAA,QAC3C,4BAAY,IAAI,GAAA,CAAI,CAAC,KAAA,CAAM,MAAA,CAAO,QAAkB,CAAC;AAAA,OACtD,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,MAAM,YAAgC,EAAC;AAEvC,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,IAAI,CAAA,IAAK,OAAA,EAAS;AACpC,IAAA,SAAA,CAAU,IAAA,CAAK;AAAA,MACb,MAAA;AAAA,MACA,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,cAAA,EAAgB,CAAC,GAAG,IAAA,CAAK,OAAO,CAAA;AAAA,MAChC,UAAA,EAAY,CAAC,GAAG,IAAA,CAAK,UAAU;AAAA,KAChC,CAAA;AAAA,EACH;AAGA,EAAA,SAAA,CAAU,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,UAAA,GAAa,EAAE,UAAU,CAAA;AAEpD,EAAA,OAAO,SAAA;AACT;AAKO,SAAS,kBACd,MAAA,EACqD;AACrD,EAAA,MAAM,SAA8D,EAAC;AAErE,EAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,EAAA;AACrC,IAAA,IAAI,CAAC,MAAA,CAAO,MAAM,CAAA,EAAG;AACnB,MAAA,MAAA,CAAO,MAAM,CAAA,GAAI;AAAA,QACf,KAAA,EAAO,MAAM,MAAA,CAAO,KAAA;AAAA,QACpB,QAAA,EAAU,MAAM,MAAA,CAAO;AAAA,OACzB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAQO,SAAS,iBACd,KAAA,EACqB;AACrB,EAAA,MAAM,EAAE,gBAAe,GAAI,KAAA;AAE3B,EAAA,MAAM,WAAA,GAAc,gBAAgB,cAAc,CAAA;AAClD,EAAA,MAAM,kBAAA,GAAqB,wBAAwB,cAAc,CAAA;AAEjE,EAAA,OAAO;AAAA,IACL,cAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AACF;;;ACnFA,IAAM,uBAAA,GAA4E;AAAA,EAChF,IAAA,EAAM,EAAE,GAAA,EAAK,EAAA,EAAI,KAAK,CAAA,EAAE;AAAA,EACxB,QAAA,EAAU,EAAE,GAAA,EAAK,EAAA,EAAI,KAAK,EAAA,EAAG;AAAA,EAC7B,IAAA,EAAM,EAAE,GAAA,EAAK,GAAA,EAAK,KAAK,EAAA,EAAG;AAAA,EAC1B,MAAA,EAAQ,EAAE,GAAA,EAAK,GAAA,EAAK,KAAK,EAAA;AAC3B,CAAA;AAKA,SAAS,sBAAA,CAAuB,OAAe,UAAA,EAAiC;AAC9E,EAAA,MAAM,KAAA,GAAQ,wBAAwB,UAAU,CAAA;AAChD,EAAA,OAAO,KAAA,IAAS,KAAA,CAAM,GAAA,IAAO,KAAA,IAAS,KAAA,CAAM,GAAA;AAC9C;AAKA,SAAS,mBAAA,CACP,cACA,gBAAA,EACc;AACd,EAAA,IAAI,sBAAA,CAAuB,YAAA,EAAc,gBAAgB,CAAA,EAAG;AAC1D,IAAA,OAAO,WAAA;AAAA,EACT;AAGA,EAAA,IACG,qBAAqB,MAAA,IAAU,YAAA,GAAe,MAC9C,gBAAA,KAAqB,UAAA,IAAc,eAAe,EAAA,EACnD;AACA,IAAA,OAAO,YAAA;AAAA,EACT;AAGA,EAAA,OAAO,aAAA;AACT;AAKA,SAAS,cAAA,CACP,IAAA,EACA,MAAA,EACA,YAAA,EACA,gBAAA,EACQ;AACR,EAAA,MAAM,KAAA,GAAQ,wBAAwB,gBAAgB,CAAA;AAEtD,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,WAAA;AACH,MAAA,OAAO,CAAA,MAAA,EAAS,MAAM,CAAA,SAAA,EAAY,YAAY,CAAA,iCAAA,EAAoC,gBAAgB,CAAA,mBAAA,EAAsB,KAAA,CAAM,GAAG,CAAA,IAAA,EAAO,KAAA,CAAM,GAAG,CAAA,EAAA,CAAA;AAAA,IACnJ,KAAK,YAAA;AACH,MAAA,OAAO,CAAA,MAAA,EAAS,MAAM,CAAA,SAAA,EAAY,YAAY,CAAA,sCAAA,EAAyC,gBAAgB,CAAA,mBAAA,EAAsB,KAAA,CAAM,GAAG,CAAA,IAAA,EAAO,KAAA,CAAM,GAAG,CAAA,EAAA,CAAA;AAAA,IACxJ,KAAK,aAAA;AACH,MAAA,OAAO,CAAA,MAAA,EAAS,MAAM,CAAA,SAAA,EAAY,YAAY,CAAA,wCAAA,EAA2C,gBAAgB,CAAA,mBAAA,EAAsB,KAAA,CAAM,GAAG,CAAA,IAAA,EAAO,KAAA,CAAM,GAAG,CAAA,EAAA,CAAA;AAAA,IAC1J,KAAK,cAAA;AACH,MAAA,OAAO,mCAAmC,gBAAgB,CAAA,yBAAA,EAA4B,MAAM,GAAG,CAAA,IAAA,EAAO,MAAM,GAAG,CAAA,EAAA,CAAA;AAAA;AAErH;AAQA,SAAS,iBAAA,CACP,SAAA,EACA,UAAA,EACA,YAAA,EACgE;AAChE,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,EAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACzB,IAAA,KAAA,MAAW,EAAA,IAAM,EAAE,cAAA,EAAgB;AACjC,MAAA,UAAA,CAAW,IAAI,EAAE,CAAA;AAAA,IACnB;AAAA,EACF;AACA,EAAA,OAAO,EAAE,QAAQ,UAAA,EAAY,QAAA,EAAU,cAAc,cAAA,EAAgB,CAAC,GAAG,UAAU,CAAA,EAAE;AACvF;AAQO,SAAS,mBACd,KAAA,EACuB;AACvB,EAAA,MAAM,aAA6B,EAAC;AACpC,EAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAY;AAGzC,EAAA,MAAM,iBAAiB,IAAI,GAAA;AAAA,IACzB,KAAA,CAAM,mBAAmB,GAAA,CAAI,CAAC,MAAM,CAAC,CAAA,CAAE,MAAA,EAAQ,CAAC,CAAC;AAAA,GACnD;AAEA,EAAA,KAAA,MAAW,MAAA,IAAU,MAAM,iBAAA,EAAmB;AAC5C,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,WAAA,GAClB,iBAAA,CAAkB,MAAM,kBAAA,EAAoB,MAAA,CAAO,MAAA,EAAQ,MAAA,CAAO,QAAQ,CAAA,GAC1E,cAAA,CAAe,GAAA,CAAI,OAAO,MAAM,CAAA;AACpC,IAAA,MAAM,aAAa,MAAA,CAAO,UAAA;AAG1B,IAAA,KAAA,MAAW,QAAA,IAAY,OAAO,oBAAA,EAAsB;AAClD,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,UAAA,CAAW,QAAA,CAAS,MAAM,CAAA;AACjD,MAAA,IAAI,CAAC,QAAA,EAAU;AAEf,MAAA,MAAM,mBAAmB,QAAA,CAAS,YAAA;AAClC,MAAA,MAAM,IAAA,GAAO,mBAAA,CAAoB,QAAA,CAAS,KAAA,EAAO,gBAAgB,CAAA;AAEjE,MAAA,IAAI,SAAS,WAAA,EAAa;AACxB,QAAA,gBAAA,CAAiB,GAAA,CAAI,SAAS,MAAM,CAAA;AAAA,MACtC;AAEA,MAAA,UAAA,CAAW,IAAA,CAAK;AAAA,QACd,IAAA;AAAA,QACA,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,cAAc,QAAA,CAAS,KAAA;AAAA,QACvB,iBAAiB,QAAA,CAAS,QAAA;AAAA,QAC1B,gBAAA;AAAA,QACA,WAAW,cAAA,CAAe,IAAA,EAAM,SAAS,MAAA,EAAQ,QAAA,CAAS,OAAO,gBAAgB;AAAA,OAClF,CAAA;AAAA,IACH;AAKA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,mBAAmB,IAAI,GAAA;AAAA,QAC3B,OAAO,oBAAA,CAAqB,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,MAAM;AAAA,OACjD;AAEA,MAAA,KAAA,MAAW,MAAA,IAAU,QAAQ,cAAA,EAAgB;AAC3C,QAAA,IAAI,gBAAA,CAAiB,GAAA,CAAI,MAAM,CAAA,EAAG;AAElC,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,UAAA,CAAW,MAAM,CAAA;AACxC,QAAA,IAAI,CAAC,QAAA,EAAU;AAGf,QAAA,gBAAA,CAAiB,IAAI,MAAM,CAAA;AAC3B,QAAA,UAAA,CAAW,IAAA,CAAK;AAAA,UACd,IAAA,EAAM,WAAA;AAAA,UACN,QAAQ,MAAA,CAAO,MAAA;AAAA,UACf,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,MAAA;AAAA,UACA,cAAc,QAAA,CAAS,KAAA;AAAA,UACvB,iBAAiB,QAAA,CAAS,QAAA;AAAA,UAC1B,gBAAA,EAAkB,UAAA;AAAA,UAClB,SAAA,EAAW,CAAA,MAAA,EAAS,MAAM,CAAA,mEAAA,EAAsE,UAAU,CAAA,8CAAA;AAAA,SAC3G,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,SAAA,IAAa,OAAO,kBAAA,EAAoB;AACjD,MAAA,MAAM,sBAAsB,SAAA,CAAU,eAAA;AAEtC,MAAA,UAAA,CAAW,IAAA,CAAK;AAAA,QACd,IAAA,EAAM,cAAA;AAAA,QACN,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,gBAAA,EAAkB,mBAAA;AAAA,QAClB,SAAA,EAAW,wBAAwB,SAAA,CAAU,WAAW,gBAAgB,SAAA,CAAU,iBAAiB,aAAa,mBAAmB,CAAA,EAAA,CAAA;AAAA,QACnI,UAAU,SAAA,CAAU,iBAAA;AAAA,QACpB,aAAa,SAAA,CAAU;AAAA,OACxB,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,IAAI,KAAA,CAAM,mBAAmB,IAAA,EAAM;AACjC,IAAA,MAAM,oBAAA,GAAuB,2BAAA,CAA4B,KAAA,CAAM,eAAe,CAAA;AAC9E,IAAA,KAAA,MAAW,YAAY,UAAA,EAAY;AACjC,MAAA,IAAI,CAAC,SAAS,MAAA,EAAQ;AACtB,MAAA,IAAI,EAAE,QAAA,CAAS,MAAA,IAAU,gBAAA,CAAA,EAAmB;AAC5C,MAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,QAAA,CAAS,MAAgB,CAAA;AAC3D,MAAA,IAAI,aAAa,qBAAA,EAAuB;AAExC,MAAA,MAAM,WAAW,QAAA,CAAS,IAAA;AAC1B,MAAA,MAAM,OAAA,GAAU,mBAAA,CAAoB,QAAA,CAAS,YAAA,IAAgB,GAAG,oBAAoB,CAAA;AACpF,MAAA,QAAA,CAAS,IAAA,GAAO,OAAA;AAChB,MAAA,QAAA,CAAS,gBAAA,GAAmB,oBAAA;AAC5B,MAAA,QAAA,CAAS,SAAA,GAAY,cAAA,CAAe,OAAA,EAAS,QAAA,CAAS,MAAA,EAAQ,QAAA,CAAS,YAAA,EAAc,oBAAoB,CAAA,GACrG,CAAA,oBAAA,EAAuB,KAAA,CAAM,eAAe,6BAA6B,QAAQ,CAAA,EAAA,CAAA;AAErF,MAAA,IAAI,YAAY,WAAA,EAAa;AAC3B,QAAA,gBAAA,CAAiB,GAAA,CAAI,SAAS,MAAM,CAAA;AAAA,MACtC,CAAA,MAAO;AACL,QAAA,gBAAA,CAAiB,MAAA,CAAO,SAAS,MAAM,CAAA;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,MAAM,WAAA,EAAa;AACrB,IAAA,KAAA,MAAW,YAAY,UAAA,EAAY;AACjC,MAAA,IAAI,CAAC,SAAS,MAAA,EAAQ;AAItB,MAAA,IAAI,QAAA,CAAS,UAAU,gBAAA,EAAkB;AACvC,QAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,QAAA,CAAS,MAAgB,CAAA;AAC3D,QAAA,IACE,aAAa,qBAAA,IACb,CAAC,uCAAA,CAAwC,KAAA,CAAM,WAAW,CAAA,EAC1D;AACA,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,MAAM,eAAA,GAAkB,yBAAA,CAA0B,QAAA,CAAS,MAAA,EAAQ,MAAM,WAAW,CAAA;AACpF,MAAA,IAAI,CAAC,eAAA,EAAiB;AAEtB,MAAA,MAAM,WAAW,QAAA,CAAS,IAAA;AAC1B,MAAA,MAAM,OAAA,GAAU,mBAAA,CAAoB,QAAA,CAAS,YAAA,IAAgB,GAAG,eAAe,CAAA;AAC/E,MAAA,QAAA,CAAS,IAAA,GAAO,OAAA;AAChB,MAAA,QAAA,CAAS,gBAAA,GAAmB,eAAA;AAC5B,MAAA,QAAA,CAAS,SAAA,GAAY,cAAA,CAAe,OAAA,EAAS,QAAA,CAAS,MAAA,EAAQ,SAAS,YAAA,EAAc,eAAe,CAAA,GAChG,CAAA,wCAAA,EAA2C,QAAQ,CAAA,EAAA,CAAA;AAEvD,MAAA,IAAI,YAAY,WAAA,EAAa;AAC3B,QAAA,gBAAA,CAAiB,GAAA,CAAI,SAAS,MAAM,CAAA;AAAA,MACtC,CAAA,MAAO;AACL,QAAA,gBAAA,CAAiB,MAAA,CAAO,SAAS,MAAM,CAAA;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,cAAA,EAAgB,CAAC,GAAG,gBAAgB;AAAA,GACtC;AACF;AAMA,SAAS,wCACP,WAAA,EACS;AACT,EAAA,MAAM,EAAA,GAAK,WAAA,CAAY,kBAAkB,CAAA,EAAG,eAAA;AAC5C,EAAA,OAAO,EAAA,IAAM,IAAA,IAAQ,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AACzC;AAEA,IAAM,gBAAA,GAAyD;AAAA,EAC7D,0BAAA,EAA4B,CAAC,gBAAA,EAAkB,kCAAA,EAAoC,wBAAwB,mBAAmB,CAAA;AAAA,EAC9H,kBAAA,EAAoB,CAAC,yBAAA,EAA2B,2BAA2B,CAAA;AAAA,EAC3E,sBAAA,EAAwB,CAAC,mBAAA,EAAqB,mBAAA,EAAqB,4BAA4B,CAAA;AAAA,EAC/F,sBAAA,EAAwB,CAAC,qBAAA,EAAuB,mBAAA,EAAqB,gCAAgC,CAAA;AAAA,EACrG,qBAAA,EAAuB,CAAC,WAAW,CAAA;AAAA,EACnC,kBAAA,EAAoB,CAAC,WAAW;AAClC,CAAA;AAOA,IAAM,mBAAA,uBAA0B,GAAA,CAAwB;AAAA,EACtD,sBAAA;AAAA,EACA,sBAAA;AAAA,EACA,qBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAMD,IAAM,wBAAA,uBAA+B,GAAA,CAAwB;AAAA,EAC3D;AACF,CAAC,CAAA;AAUD,SAAS,yBAAA,CACP,QACA,WAAA,EACmB;AACnB,EAAA,MAAM,eAA6B,EAAC;AAEpC,EAAA,KAAA,MAAW,CAAC,SAAA,EAAW,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAgB,CAAA,EAAG;AACnE,IAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,MAAgB,CAAA,EAAG;AACzC,IAAA,MAAM,IAAA,GAAO,YAAY,SAAS,CAAA;AAClC,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,MAAM,QAAA,GAAW,SAAA;AAEjB,IAAA,IAAI,wBAAA,CAAyB,GAAA,CAAI,QAAQ,CAAA,EAAG;AAE1C,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,UAAA;AAC3C,MAAA,YAAA,CAAa,IAAA,CAAK,sBAAA,CAAuB,KAAK,CAAC,CAAA;AAAA,IACjD,CAAA,MAAA,IAAW,mBAAA,CAAoB,GAAA,CAAI,QAAQ,CAAA,EAAG;AAE5C,MAAA,IAAI,IAAA,CAAK,mBAAA,IAAuB,IAAA,IAAQ,IAAA,CAAK,uBAAuB,IAAA,EAAM;AACxE,QAAA,YAAA,CAAa,KAAK,sBAAA,CAAuB,IAAA,CAAK,mBAAA,EAAqB,IAAA,CAAK,mBAAmB,CAAC,CAAA;AAAA,MAC9F,CAAA,MAAO;AACL,QAAA,YAAA,CAAa,IAAA,CAAK,sBAAA,CAAuB,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,MAC3D;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,YAAA,CAAa,IAAA,CAAK,sBAAA,CAAuB,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,IAC3D;AAAA,EACF;AAEA,EAAA,IAAI,YAAA,CAAa,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAGtC,EAAA,MAAM,KAAA,GAAsB,CAAC,MAAA,EAAQ,UAAA,EAAY,QAAQ,QAAQ,CAAA;AACjE,EAAA,OAAO,YAAA,CAAa,MAAA;AAAA,IAAO,CAAC,KAAA,EAAO,CAAA,KACjC,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,CAAA,GAAI;AAAA,GAChD;AACF;AAOA,SAAS,4BAA4B,KAAA,EAA2B;AAG9D,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAA;AAC3B,EAAA,IAAI,CAAA,IAAK,GAAG,OAAO,MAAA;AACnB,EAAA,IAAI,CAAA,IAAK,IAAI,OAAO,UAAA;AACpB,EAAA,IAAI,CAAA,IAAK,IAAI,OAAO,MAAA;AACpB,EAAA,OAAO,QAAA;AACT;;;AC5VA,IAAM,mBAAA,GAA8C;AAAA,EAClD,IAAA,EAAM,EAAA;AAAA,EACN,QAAA,EAAU,EAAA;AAAA,EACV,IAAA,EAAM,GAAA;AAAA,EACN,MAAA,EAAQ;AACV,CAAA;AAKA,IAAM,mBAAA,GAAgD;AAAA,EACpD,IAAA,EAAM,YAAA;AAAA,EACN,QAAA,EAAU,MAAA;AAAA,EACV,IAAA,EAAM,UAAA;AAAA,EACN,MAAA,EAAQ;AACV,CAAA;AAKA,SAAS,cAAc,SAAA,EAA+B;AACpD,EAAA,IAAI,SAAA,IAAa,GAAG,OAAO,MAAA;AAC3B,EAAA,IAAI,SAAA,IAAa,GAAG,OAAO,QAAA;AAC3B,EAAA,OAAO,KAAA;AACT;AAKA,IAAM,oBAAA,GAA+C;AAAA,EACnD,IAAA,EAAM,CAAA;AAAA,EACN,QAAA,EAAU,EAAA;AAAA,EACV,IAAA,EAAM,EAAA;AAAA,EACN,MAAA,EAAQ;AACV,CAAA;AAMA,SAAS,8BAA8B,YAAA,EAAgC;AACrE,EAAA,IAAI,YAAA,CAAa,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAGtC,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,KAAA,MAAW,KAAK,YAAA,EAAc;AAC5B,IAAA,MAAM,QAAA,GAAW,mBAAA,CAAoB,CAAC,CAAA,IAAK,EAAA;AAC3C,IAAA,GAAA,IAAO,QAAA;AAEP,IAAA,MAAM,KAAA,GAAQ,oBAAA,CAAqB,CAAC,CAAA,IAAK,EAAA;AACzC,IAAA,IAAI,KAAA,GAAQ,YAAY,UAAA,GAAa,KAAA;AAAA,EACvC;AAEA,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,aAAa,MAAM,CAAA;AAGxD,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,UAAU,CAAA;AACzC;AAKA,SAAS,eAAA,CACP,iBACA,aAAA,EACsB;AACtB,EAAA,IAAI,gBAAA;AACJ,EAAA,IAAI,iBAAiB,EAAA,EAAI;AACvB,IAAA,gBAAA,GAAmB,UAAA;AAAA,EACrB,CAAA,MAAA,IAAW,iBAAiB,EAAA,EAAI;AAC9B,IAAA,gBAAA,GAAmB,MAAA;AAAA,EACrB,CAAA,MAAA,IAAW,iBAAiB,EAAA,EAAI;AAC9B,IAAA,gBAAA,GAAmB,cAAA;AAAA,EACrB,CAAA,MAAO;AACL,IAAA,gBAAA,GAAmB,YAAA;AAAA,EACrB;AAEA,EAAA,IAAI,qBAAqB,eAAA,EAAiB;AACxC,IAAA,OAAO,gBAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA;AACT;AAQO,SAAS,eACd,KAAA,EACmB;AACnB,EAAA,MAAM,cAAiC,EAAC;AACxC,EAAA,MAAM,mBAAsC,EAAC;AAG7C,EAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAqC;AAClE,EAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAqC;AACnE,EAAA,MAAM,mBAA4C,EAAC;AAEnD,EAAA,KAAA,MAAW,QAAA,IAAY,MAAM,UAAA,EAAY;AACvC,IAAA,QAAQ,SAAS,IAAA;AAAM,MACrB,KAAK,YAAA,EAAc;AACjB,QAAA,IAAI,CAAC,SAAS,MAAA,EAAQ;AACtB,QAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,GAAA,CAAI,QAAA,CAAS,MAAM,CAAA;AACrD,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,QAAA,CAAS,KAAK,QAAQ,CAAA;AAAA,QACxB,CAAA,MAAO;AACL,UAAA,gBAAA,CAAiB,GAAA,CAAI,QAAA,CAAS,MAAA,EAAQ,CAAC,QAAQ,CAAC,CAAA;AAAA,QAClD;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,aAAA,EAAe;AAClB,QAAA,IAAI,CAAC,SAAS,MAAA,EAAQ;AACtB,QAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,GAAA,CAAI,QAAA,CAAS,MAAM,CAAA;AACtD,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,QAAA,CAAS,KAAK,QAAQ,CAAA;AAAA,QACxB,CAAA,MAAO;AACL,UAAA,iBAAA,CAAkB,GAAA,CAAI,QAAA,CAAS,MAAA,EAAQ,CAAC,QAAQ,CAAC,CAAA;AAAA,QACnD;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,cAAA;AACH,QAAA,gBAAA,CAAiB,KAAK,QAAQ,CAAA;AAC9B,QAAA;AAAA;AACJ,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,aAAA,IAAiB,EAAC;AAItC,EAAA,MAAM,oBAAA,uBAA2B,GAAA,CAAI;AAAA,IACnC,GAAG,iBAAiB,IAAA,EAAK;AAAA,IACzB,GAAG,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,CAAO,CAAC,EAAA,KAAO;AACnC,MAAA,MAAM,CAAA,GAAI,MAAM,EAAE,CAAA;AAClB,MAAA,OAAO,KAAK,CAAA,CAAE,eAAA,GAAkB,KAAK,CAAC,gBAAA,CAAiB,IAAI,EAAE,CAAA;AAAA,IAC/D,CAAC;AAAA,GACF,CAAA;AAED,EAAA,KAAA,MAAW,UAAU,oBAAA,EAAsB;AACzC,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,UAAA,CAAW,MAAM,CAAA;AACxC,IAAA,IAAI,CAAC,QAAA,EAAU;AAEf,IAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,GAAA,CAAI,MAAM,KAAK,EAAC;AAC/C,IAAA,MAAM,SAAA,GAAY,MAAM,MAAM,CAAA;AAC9B,IAAA,MAAM,sBAAsB,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,gBAAgB,CAAA;AAC/D,IAAA,MAAM,iBAAA,GAAoB,SAAA,EAAW,sBAAA,IAA0B,EAAC;AAChE,IAAA,MAAM,eAAA,GAAkB,CAAC,GAAG,mBAAA,EAAqB,GAAG,iBAAiB,CAAA;AACrE,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,MAAA,IAAU,SAAA,EAAW,eAAA,IAAmB,CAAA,CAAA;AAEjE,IAAA,MAAM,aAAA,GAAgB,8BAA8B,eAAe,CAAA;AACnE,IAAA,MAAM,kBAAkB,QAAA,CAAS,QAAA;AACjC,IAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,eAAA,EAAiB,aAAa,CAAA;AAClE,IAAA,MAAM,YAAY,SAAA,EAAW,eAAA,GACzB,CAAA,IAAA,EAAO,SAAA,CAAU,eAAe,CAAA,yBAAA,CAAA,GAChC,EAAA;AAIJ,IAAA,MAAM,aAAA,GACJ,aAAA,IAAiB,EAAA,IACjB,UAAA,IAAc,CAAA,IACd,gBAAgB,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,KAAM,MAAM,CAAA;AAE3C,IAAA,WAAA,CAAY,IAAA,CAAK;AAAA,MACf,MAAA;AAAA,MACA,cAAc,QAAA,CAAS,KAAA;AAAA,MACvB,aAAA;AAAA,MACA,eAAA;AAAA,MACA,gBAAA,EAAkB,WAAA;AAAA,MAClB,WAAW,aAAA,GACP,CAAA,0BAAA,EAA6B,UAAU,CAAA,mBAAA,EAAsB,SAAS,2BACtE,CAAA,cAAA,EAAiB,KAAA,CAAM,MAAM,CAAA,QAAA,EAAW,SAAS,2BAA2B,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAC,CAAA,iBAAA,EAAoB,SAAS,KAAK,CAAA,cAAA,CAAA;AAAA,MAC5I,UAAA,EAAY,cAAc,UAAU,CAAA;AAAA,MACpC,eAAA,EAAiB,UAAA;AAAA,MACjB,GAAI,aAAA,IAAiB,EAAE,eAAA,EAAiB,IAAA;AAAK,KAC9C,CAAA;AAAA,EACH;AAIA,EAAA,MAAM,qBAAA,uBAA4B,GAAA,CAAI;AAAA,IACpC,GAAG,kBAAkB,IAAA,EAAK;AAAA,IAC1B,GAAG,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,CAAO,CAAC,EAAA,KAAO;AACnC,MAAA,MAAM,CAAA,GAAI,MAAM,EAAE,CAAA;AAClB,MAAA,OAAO,KAAK,CAAA,CAAE,gBAAA,GAAmB,KAAK,CAAC,iBAAA,CAAkB,IAAI,EAAE,CAAA;AAAA,IACjE,CAAC;AAAA,GACF,CAAA;AAED,EAAA,KAAA,MAAW,UAAU,qBAAA,EAAuB;AAC1C,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,UAAA,CAAW,MAAM,CAAA;AACxC,IAAA,IAAI,CAAC,QAAA,EAAU;AAEf,IAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,GAAA,CAAI,MAAM,KAAK,EAAC;AAChD,IAAA,MAAM,SAAA,GAAY,MAAM,MAAM,CAAA;AAC9B,IAAA,MAAM,sBAAsB,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,gBAAgB,CAAA;AAC/D,IAAA,MAAM,iBAAA,GAAoB,SAAA,EAAW,uBAAA,IAA2B,EAAC;AACjE,IAAA,MAAM,eAAA,GAAkB,CAAC,GAAG,mBAAA,EAAqB,GAAG,iBAAiB,CAAA;AACrE,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,MAAA,IAAU,SAAA,EAAW,gBAAA,IAAoB,CAAA,CAAA;AAElE,IAAA,MAAM,aAAA,GAAgB,8BAA8B,eAAe,CAAA;AACnE,IAAA,MAAM,kBAAkB,QAAA,CAAS,QAAA;AACjC,IAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,eAAA,EAAiB,aAAa,CAAA;AAClE,IAAA,MAAM,YAAY,SAAA,EAAW,gBAAA,GACzB,CAAA,IAAA,EAAO,SAAA,CAAU,gBAAgB,CAAA,yBAAA,CAAA,GACjC,EAAA;AAEJ,IAAA,WAAA,CAAY,IAAA,CAAK;AAAA,MACf,MAAA;AAAA,MACA,cAAc,QAAA,CAAS,KAAA;AAAA,MACvB,aAAA;AAAA,MACA,eAAA;AAAA,MACA,gBAAA,EAAkB,WAAA;AAAA,MAClB,SAAA,EAAW,CAAA,eAAA,EAAkB,KAAA,CAAM,MAAM,CAAA,QAAA,EAAW,SAAS,CAAA,wBAAA,EAA2B,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAC,CAAA,iBAAA,EAAoB,SAAS,KAAK,CAAA,gBAAA,CAAA;AAAA,MACpJ,UAAA,EAAY,cAAc,UAAU,CAAA;AAAA,MACpC,eAAA,EAAiB;AAAA,KAClB,CAAA;AAAA,EACH;AAIA,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAqC;AAEhE,EAAA,KAAA,MAAW,KAAK,gBAAA,EAAkB;AAChC,IAAA,MAAM,QAAA,GAAW,EAAE,QAAA,IAAY,SAAA;AAE/B,IAAA,MAAM,QAAA,GAAW,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA;AAC5C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,IACjB,CAAA,MAAO;AACL,MAAA,cAAA,CAAe,GAAA,CAAI,QAAA,EAAU,CAAC,CAAC,CAAC,CAAA;AAAA,IAClC;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,CAAC,QAAA,EAAU,KAAK,CAAA,IAAK,cAAA,EAAgB;AAC9C,IAAA,MAAM,eAAe,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,gBAAgB,CAAA;AACxD,IAAA,MAAM,kBAAA,GAAqB,sBAAsB,YAAY,CAAA;AAC7D,IAAA,MAAM,YAAA,GAAe,MAAM,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,WAAA,IAAe,EAAE,SAAS,CAAA;AAElE,IAAA,gBAAA,CAAiB,IAAA,CAAK;AAAA,MACpB,WAAA,EAAa,OAAO,QAAQ,CAAA,KAAA,CAAA;AAAA,MAC5B,QAAA;AAAA,MACA,WAAA,EAAa,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AAAA,MACnC,iBAAA,EAAmB,mBAAA,CAAoB,kBAAkB,CAAA,IAAK,MAAA;AAAA,MAC9D,cAAA,EAAgB,mBAAA,CAAoB,kBAAkB,CAAA,IAAK,EAAA;AAAA,MAC3D,SAAA,EAAW,CAAA,EAAG,KAAA,CAAM,MAAM,CAAA,oCAAA,EAAuC,QAAQ,CAAA,kBAAA,EAAqB,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA,EAAA,CAAA;AAAA,MACrH,iBAAiB,KAAA,CAAM;AAAA,KACxB,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,EAAE,aAAa,gBAAA,EAAiB;AACzC;AAEA,SAAS,sBAAsB,YAAA,EAAgC;AAC7D,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,KAAK,YAAA,EAAc;AAC5B,IAAA,MAAA,CAAO,CAAC,CAAA,GAAA,CAAK,MAAA,CAAO,CAAC,KAAK,CAAA,IAAK,CAAA;AAAA,EACjC;AAEA,EAAA,IAAI,QAAA,GAAW,YAAA,CAAa,CAAC,CAAA,IAAK,UAAA;AAClC,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,KAAA,MAAW,CAAC,UAAA,EAAY,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACxD,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,QAAA,GAAW,KAAA;AACX,MAAA,QAAA,GAAW,UAAA;AAAA,IACb;AAAA,EACF;AACA,EAAA,OAAO,QAAA;AACT;;;AC7PO,SAAS,0BAA0B,IAAA,EAAqC;AAC7E,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,CAAM,KAAK,sBAAsB,CAAA;AACjC,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,IAAA,CAAK,cAAA,CAAe,IAAI,CAAC,CAAA;AAC/B,EAAA,KAAA,CAAM,IAAA,CAAK,mBAAA,CAAoB,IAAI,CAAC,CAAA;AACpC,EAAA,KAAA,CAAM,IAAA,CAAK,yBAAA,CAA0B,IAAA,CAAK,WAAW,CAAC,CAAA;AACtD,EAAA,KAAA,CAAM,IAAA,CAAK,sBAAA,CAAuB,IAAA,CAAK,gBAAgB,CAAC,CAAA;AACxD,EAAA,KAAA,CAAM,IAAA,CAAK,oBAAA,CAAqB,IAAA,CAAK,cAAc,CAAC,CAAA;AACpD,EAAA,KAAA,CAAM,IAAA,CAAK,qBAAA,CAAsB,IAAA,CAAK,UAAU,CAAC,CAAA;AACjD,EAAA,KAAA,CAAM,IAAA,CAAK,sBAAA,CAAuB,IAAA,CAAK,WAAW,CAAC,CAAA;AAEnD,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,SAAS,eAAe,IAAA,EAAqC;AAC3D,EAAA,OAAO,CAAA;;AAAA;AAAA;AAAA,SAAA,EAIE,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK,IAAA,CAAK,OAAO,CAAA;AAAA,gBAAA,EACvB,KAAK,UAAU,CAAA;AAAA,gBAAA,EACf,KAAK,SAAS,CAAA;AAAA,iBAAA,EACb,KAAK,UAAU,CAAA;AAAA,oBAAA,EACZ,KAAK,kBAAkB,CAAA;AAAA,kBAAA,EACzB,KAAK,gBAAgB,CAAA;AAAA,kBAAA,EACrB,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,KAAK,CAAA,EAAA,EAAK,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,UAAU,CAAA,IAAA,EAAO,IAAA,CAAK,YAAA,GAAe;AAAA,wBAAA,EAC3F,IAAA,CAAK,YAAA,CAAa,gBAAA,CAAiB,cAAA,EAAgB,CAAA,SAAA,EAAY,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,eAAA,GAAkB,IAAI,CAAC,CAAA;AAAA,qBAAA,EACtH,KAAK,KAAA,CAAM,IAAA,CAAK,aAAa,aAAa,CAAC,OAAO,EAAE;AAAA,CAAA;AAE3E;AAEA,SAAS,oBAAoB,IAAA,EAAqC;AAChE,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,CAAM,KAAK,0BAA0B,CAAA;AACrC,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,qDAAqD,CAAA;AAChE,EAAA,KAAA,CAAM,KAAK,qDAAqD,CAAA;AAEhE,EAAA,KAAA,MAAW,CAAC,UAAU,QAAQ,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,WAAA,CAAY,UAAU,CAAA,EAAG;AAC9E,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,EAAA,EAAK,QAAQ,CAAA,GAAA,EAAM,QAAA,CAAS,UAAU,CAAA,IAAA,EAAO,QAAA,CAAS,UAAU,CAAA,GAAA,EAAM,QAAA,CAAS,YAAY,CAAA,GAAA,EAAM,SAAS,cAAc,CAAA,EAAA;AAAA,KAC1H;AAAA,EACF;AAEA,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,SAAS,0BAA0B,WAAA,EAAwC;AACzE,EAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,IAAA,OAAO,6DAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,CAAM,KAAK,+BAA+B,CAAA;AAC1C,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,yGAAyG,CAAA;AACpH,EAAA,KAAA,CAAM,KAAK,wGAAwG,CAAA;AAEnH,EAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,IAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,gBAAA,GACvB,CAAA,EAAG,GAAA,CAAI,eAAe,CAAA,IAAA,EAAO,GAAA,CAAI,gBAAgB,CAAA,CAAA,GACjD,GAAA,CAAI,eAAA;AACR,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,eAAA,GAAkB,YAAA,GAAU,EAAA;AAEhD,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,EAAA,EAAK,IAAI,MAAM,CAAA,GAAA,EAAM,IAAI,YAAY,CAAA,GAAA,EAAM,IAAI,aAAa,CAAA,GAAA,EAAM,OAAO,CAAA,GAAA,EAAM,cAAc,MAAM,GAAA,CAAI,UAAU,MAAM,GAAA,CAAI,eAAe,CAAA,GAAA,EAAM,GAAA,CAAI,SAAS,CAAA,EAAA;AAAA,KAC/J;AAAA,EACF;AAEA,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,SAAS,uBAAuB,SAAA,EAAsC;AACpE,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,IAAA,OAAO,mDAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,CAAM,KAAK,uBAAuB,CAAA;AAClC,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,QAAA,CAAS,WAAW,CAAA,CAAE,CAAA;AACxC,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,QAAA,CAAS,QAAQ,CAAA,CAAE,CAAA;AACjD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,0BAAA,EAA6B,QAAA,CAAS,iBAAiB,CAAA,CAAE,CAAA;AACpE,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,uBAAA,EAA0B,QAAA,CAAS,cAAc,CAAA,CAAE,CAAA;AAC9D,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,wBAAA,EAA2B,QAAA,CAAS,eAAe,CAAA,CAAE,CAAA;AAChE,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,mBAAA,EAAsB,QAAA,CAAS,WAAW,CAAA,CAAE,CAAA;AACvD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,iBAAA,EAAoB,QAAA,CAAS,SAAS,CAAA,CAAE,CAAA;AACnD,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,SAAS,qBAAqB,cAAA,EAAkC;AAC9D,EAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AAC/B,IAAA,OAAO,8DAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,CAAM,KAAK,oBAAoB,CAAA;AAC/B,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,gFAAgF,CAAA;AAC3F,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,EAAA,KAAA,MAAW,UAAU,cAAA,EAAgB;AACnC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,MAAM,CAAA,EAAA,CAAI,CAAA;AAAA,EAC9B;AAEA,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,SAAS,sBAAsB,UAAA,EAAoC;AACjE,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,OAAO,qDAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,CAAM,KAAK,2BAA2B,CAAA;AACtC,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,EAAA,MAAM,UAA0C,EAAC;AACjD,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA;AAC3B,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,IACb,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,IACtB;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AACnD,IAAA,KAAA,CAAM,KAAK,CAAA,IAAA,EAAO,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,MAAM,CAAA,CAAA,CAAG,CAAA;AAC1C,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,MAAM,WAAW,CAAA,CAAE,MAAA,GAAS,CAAA,WAAA,EAAc,CAAA,CAAE,MAAM,CAAA,EAAA,CAAA,GAAO,EAAA;AACzD,MAAA,MAAM,YAAY,CAAA,CAAE,YAAA,KAAiB,SAAY,CAAA,UAAA,EAAa,CAAA,CAAE,YAAY,CAAA,CAAA,GAAK,EAAA;AACjF,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,CAAA,CAAE,QAAQ,OAAO,CAAA,CAAE,MAAM,CAAA,CAAA,EAAI,QAAQ,CAAA,EAAG,SAAS,CAAA,eAAA,EAAkB,CAAA,CAAE,gBAAgB,CAAA,CAAE,CAAA;AACzG,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,CAAA,CAAE,SAAS,CAAA,CAAE,CAAA;AAAA,IACjC;AAEA,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,SAAS,uBAAuB,WAAA,EAAwC;AACtE,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,CAAM,KAAK,sBAAsB,CAAA;AACjC,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,qCAAqC,CAAA;AAChD,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,0CAA0C,CAAA;AACrD,EAAA,KAAA,CAAM,KAAK,yEAAyE,CAAA;AACpF,EAAA,KAAA,CAAM,KAAK,iDAAiD,CAAA;AAC5D,EAAA,KAAA,CAAM,KAAK,+CAA+C,CAAA;AAC1D,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,KAAA,CAAM,KAAK,2CAA2C,CAAA;AACtD,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,KAAK,eAAe,CAAA;AAE1B,IAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,MAAA,IAAI,IAAI,eAAA,EAAiB;AACvB,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,GAAA,EAAM,GAAA,CAAI,MAAM,CAAA,WAAA,EAAc,IAAI,UAAU,CAAA,aAAA,EAAgB,GAAA,CAAI,eAAe,CAAA,OAAA,CAAS,CAAA;AACnG,QAAA,KAAA,CAAM,KAAK,CAAA,mBAAA,CAAqB,CAAA;AAAA,MAClC,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,GAAA,EAAM,GAAA,CAAI,MAAM,CAAA,EAAA,EAAK,GAAA,CAAI,YAAY,CAAA,IAAA,EAAO,GAAA,CAAI,aAAa,CAAA,EAAA,EAAK,GAAA,CAAI,UAAU,CAAA,YAAA,CAAc,CAAA;AAAA,MAC3G;AACA,MAAA,IAAI,GAAA,CAAI,gBAAA,IAAoB,CAAC,GAAA,CAAI,eAAA,EAAiB;AAChD,QAAA,KAAA,CAAM,KAAK,CAAA,gBAAA,EAAmB,GAAA,CAAI,eAAe,CAAA,MAAA,EAAS,GAAA,CAAI,gBAAgB,CAAA,CAAA,CAAG,CAAA;AAAA,MACnF;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;ACtNO,IAAM,8BAAA,GAAiCA,EAAE,MAAA,CAAO;AAAA,EACrD,MAAA,EAAQA,EAAE,MAAA,EAAO;AAAA,EACjB,MAAMA,CAAAA,CAAE,IAAA,CAAK,CAAC,YAAA,EAAc,aAAa,CAAC,CAAA;AAAA,EAC1C,gBAAA,EAAkBA,EAAE,MAAA,EAAO;AAAA,EAC3B,OAAA,EAASA,EAAE,MAAA,EAAO;AAAA,EAClB,SAAA,EAAWA,EAAE,MAAA,EAAO;AAAA;AAAA,EAEpB,UAAA,EAAYA,EAAE,IAAA,CAAK,CAAC,QAAQ,QAAA,EAAU,KAAK,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EACvD,KAAKA,CAAAA,CAAE,KAAA,CAAMA,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EAClC,KAAKA,CAAAA,CAAE,KAAA,CAAMA,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EAClC,QAAA,EAAUA,CAAAA,CAAE,IAAA,CAAK,CAAC,SAAA,EAAW,UAAU,QAAA,EAAU,MAAM,CAAC,CAAA,CAAE,QAAA;AAC5D,CAAC,CAAA;AAI0CA,EAAE,MAAA,CAAO;AAAA,EAClD,eAAA,EAAiBA,EAAE,MAAA,EAAO;AAAA,EAC1B,gBAAA,EAAkBA,EAAE,MAAA,EAAO;AAAA,EAC3B,sBAAA,EAAwBA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,QAAQ,CAAA;AAAA,EAC1C,uBAAA,EAAyBA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,QAAQ,CAAA;AAAA;AAAA,EAE3C,QAAQA,CAAAA,CAAE,KAAA,CAAMA,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACrC,QAAQA,CAAAA,CAAE,KAAA,CAAMA,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACrC,cAAA,EAAgBA,EAAE,IAAA,CAAK,CAAC,QAAQ,QAAA,EAAU,KAAK,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EAC3D,YAAA,EAAcA,CAAAA,CAAE,IAAA,CAAK,CAAC,SAAA,EAAW,UAAU,QAAA,EAAU,MAAM,CAAC,CAAA,CAAE,QAAA;AAChE,CAAC;AAQyCA,EAAE,MAAA,CAAO;AAAA,EACjD,YAAA,EAAcA,EAAE,MAAA,EAAO;AAAA,EACvB,eAAA,EAAiBA,EAAE,MAAA,EAAO;AAAA,EAC1B,gBAAA,EAAkBA,EAAE,MAAA,EAAO;AAAA,EAC3B,cAAA,EAAgBA,EAAE,MAAA,EAAO;AAAA,EACzB,eAAA,EAAiBA,EAAE,MAAA,EAAO;AAAA,EAC1B,mBAAmBA,CAAAA,CAAE,IAAA,CAAK,CAAC,YAAA,EAAc,aAAA,EAAe,OAAO,CAAC,CAAA;AAAA,EAChE,YAAA,EAAcA,EAAE,MAAA,EAAO;AAAA,EACvB,kBAAA,EAAoBA,EAAE,MAAA,EAAO;AAAA,EAC7B,UAAA,EAAYA,EAAE,IAAA,CAAK,CAAC,QAAQ,QAAA,EAAU,KAAA,EAAO,cAAc,CAAC,CAAA;AAAA,EAC5D,OAAA,EAASA,EAAE,MAAA;AACb,CAAC;;;AClCD,IAAM,wBAAA,GAA2B,QAAQ,gCAAgC,CAAA;AAEzE,SAAS,kBAAA,CACP,UACA,MAAA,EACK;AACL,EAAA,IAAI,CAACG,UAAAA,CAAW,QAAQ,CAAA,SAAU,EAAC;AACnC,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAMC,YAAAA,CAAa,QAAA,EAAU,OAAO,CAAC,CAAA;AACtD,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,SAAU,EAAC;AACjC,IAAA,MAAM,SAAc,EAAC;AACrB,IAAA,KAAA,MAAW,QAAQ,GAAA,EAAK;AACtB,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,SAAA,CAAU,IAAI,CAAA;AACpC,MAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,IAAA,KAAS,KAAA,CAAA,EAAW;AAC/C,QAAA,MAAA,CAAO,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,MACzB;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEA,SAAS,cAAA,CAAkB,UAAkB,IAAA,EAAiB;AAC5D,EAAA,MAAM,GAAA,GAAMC,QAAQ,QAAQ,CAAA;AAC5B,EAAA,IAAI,CAACF,UAAAA,CAAW,GAAG,CAAA,EAAG;AACpB,IAAA,SAAA,CAAU,GAAA,EAAK,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAAA,EACpC;AACA,EAAA,aAAA,CAAc,QAAA,EAAU,KAAK,SAAA,CAAU,IAAA,EAAM,MAAM,CAAC,CAAA,GAAI,MAAM,OAAO,CAAA;AACvE;AAKO,SAAS,uBAAA,CACd,eAAuB,wBAAA,EACL;AAClB,EAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,YAAA,EAAc,8BAA8B,CAAA;AAC/E,EAAA,MAAM,SAA2B,EAAC;AAElC,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,IAAI,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA;AAC/B,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,KAAA,GAAQ;AAAA,QACN,eAAA,EAAiB,CAAA;AAAA,QACjB,gBAAA,EAAkB,CAAA;AAAA,QAClB,wBAAwB,EAAC;AAAA,QACzB,yBAAyB,EAAC;AAAA,QAC1B,QAAQ,EAAC;AAAA,QACT,QAAQ;AAAC,OACX;AACA,MAAA,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,GAAI,KAAA;AAAA,IACzB;AAEA,IAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AAC/B,MAAA,KAAA,CAAM,eAAA,EAAA;AACN,MAAA,KAAA,CAAM,sBAAA,CAAuB,IAAA,CAAK,KAAA,CAAM,gBAAgB,CAAA;AAAA,IAC1D,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,gBAAA,EAAA;AACN,MAAA,KAAA,CAAM,uBAAA,CAAwB,IAAA,CAAK,KAAA,CAAM,gBAAgB,CAAA;AAAA,IAC3D;AAGA,IAAA,IAAI,MAAM,GAAA,EAAK;AACb,MAAA,KAAA,CAAM,WAAW,EAAC;AAClB,MAAA,KAAA,MAAW,CAAA,IAAK,MAAM,GAAA,EAAK;AACzB,QAAA,IAAI,CAAC,MAAM,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AAAA,MACpD;AAAA,IACF;AACA,IAAA,IAAI,MAAM,GAAA,EAAK;AACb,MAAA,KAAA,CAAM,WAAW,EAAC;AAClB,MAAA,KAAA,MAAW,CAAA,IAAK,MAAM,GAAA,EAAK;AACzB,QAAA,IAAI,CAAC,MAAM,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AAAA,MACpD;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,UAAA,EAAY,KAAA,CAAM,cAAA,GAAiB,KAAA,CAAM,UAAA;AACnD,IAAA,IAAI,KAAA,CAAM,QAAA,EAAU,KAAA,CAAM,YAAA,GAAe,KAAA,CAAM,QAAA;AAAA,EACjD;AAEA,EAAA,OAAO,MAAA;AACT;AA0HO,SAAS,yBAAA,CACd,OAAA,EACA,YAAA,GAAuB,wBAAA,EACjB;AACN,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC1B,EAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,YAAA,EAAc,8BAA8B,CAAA;AAGhF,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAsC;AAChE,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,MAAM,UAAA,GAAa,EAAE,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,IAAA,EAAK,EAAG,OAAA,EAAS,CAAA,CAAE,OAAA,CAAQ,MAAK,EAAE;AAC9E,IAAA,MAAM,IAAI,CAAA,EAAG,UAAA,CAAW,MAAM,CAAA,EAAA,EAAK,WAAW,OAAO,CAAA,CAAA;AACrD,IAAA,aAAA,CAAc,GAAA,CAAI,GAAG,UAAU,CAAA;AAAA,EACjC;AACA,EAAA,MAAM,cAAA,GAAiB,CAAC,GAAG,aAAA,CAAc,QAAQ,CAAA;AACjD,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,aAAA,CAAc,MAAM,CAAA;AACzC,EAAA,MAAM,eAAe,QAAA,CAAS,MAAA;AAAA,IAC5B,CAAC,CAAA,KAAM,CAAC,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA,CAAE,MAAA,CAAO,IAAA,EAAM,CAAA,EAAA,EAAK,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,CAAA,CAAE;AAAA,GAC5D;AACA,EAAA,YAAA,CAAa,IAAA,CAAK,GAAG,cAAc,CAAA;AACnC,EAAA,cAAA,CAAe,cAAc,YAAY,CAAA;AAC3C;ACzOA,IAAM,WAAA,GAAcG,IAAAA,CAAK,OAAA,EAAQ,EAAG,WAAW,CAAA;AAC/C,IAAM,WAAA,GAAcA,IAAAA,CAAK,WAAA,EAAa,aAAa,CAAA;AAC/BA,IAAAA,CAAK,WAAA,EAAa,SAAS;AAuBxC,SAAS,UAAA,GAA4B;AAC1C,EAAA,IAAI,CAACH,UAAAA,CAAW,WAAW,CAAA,EAAG;AAC5B,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAMC,YAAAA,CAAa,WAAA,EAAa,OAAO,CAAA;AAC7C,IAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EACvB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAWO,SAAS,aAAA,GAAoC;AAElD,EAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA,IAAK,YAAW,CAAE,UAAA;AACpD;;;ACtCO,SAAS,WAAW,KAAA,EAAwB;AACjD,EAAA,OAAO,KAAA,CAAM,SAAS,YAAY,CAAA;AACpC;AAGO,SAAS,WAAW,KAAA,EAAwB;AACjD,EAAA,OAAO,KAAA,CAAM,SAAS,OAAO,CAAA;AAC/B;AAKO,SAAS,aAAa,KAAA,EAAwB;AACnD,EAAA,MAAM,QAAA,GAAWG,QAAQ,KAAK,CAAA;AAC9B,EAAA,IAAI,CAACJ,UAAAA,CAAW,QAAQ,CAAA,EAAG,OAAO,KAAA;AAClC,EAAA,IAAI;AACF,IAAA,IAAI,CAAC,QAAA,CAAS,QAAQ,CAAA,CAAE,WAAA,IAAe,OAAO,KAAA;AAAA,EAChD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAOA,UAAAA,CAAWG,IAAAA,CAAK,QAAA,EAAU,WAAW,CAAC,CAAA;AAC/C;AAMO,SAAS,mBAAmB,KAAA,EAAuB;AACxD,EAAA,IAAI,UAAA,CAAW,KAAK,CAAA,EAAG,OAAOC,QAAQ,KAAK,CAAA;AAC3C,EAAA,OAAOA,OAAAA,CAAQD,IAAAA,CAAK,KAAA,EAAO,WAAW,CAAC,CAAA;AACzC;AAMA,eAAsB,QAAA,CACpB,OACA,KAAA,EACqB;AACrB,EAAA,IAAI,UAAA,CAAW,KAAK,CAAA,IAAK,YAAA,CAAa,KAAK,CAAA,EAAG;AAC5C,IAAA,MAAM,QAAA,GAAW,mBAAmB,KAAK,CAAA;AACzC,IAAA,IAAI,CAACH,UAAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,QAAQ,CAAA,CAAE,CAAA;AAAA,IAC/C;AACA,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,mBAAA,EAAsB,QAAQ,CAAA,CAAE,CAAA;AAC9C,IAAA,OAAO,EAAE,IAAA,EAAM,MAAM,qBAAA,CAAsB,QAAQ,CAAA,EAAE;AAAA,EACvD;AAEA,EAAA,IAAI,UAAA,CAAW,KAAK,CAAA,EAAG;AACrB,IAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,cAAc,KAAK,CAAA;AAC/C,IAAA,OAAO,WAAA,CAAY,OAAA,EAAS,MAAA,EAAQ,KAAK,CAAA;AAAA,EAC3C;AAEA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,kBAAkB,KAAK,CAAA,gDAAA;AAAA,GACzB;AACF;AAEA,eAAe,WAAA,CACb,OAAA,EACA,MAAA,EACA,KAAA,EACqB;AACrB,EAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,8BAAA,EAAiC,OAAO,CAAA,CAAE,CAAA;AACxD,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,aAAA,EAAgB,MAAM,CAAA,CAAE,CAAA;AAAA,EACxC;AAEA,EAAA,MAAM,UAAA,GAAa,SAAS,aAAA,EAAc;AAC1C,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,SAAS,IAAI,WAAA,CAAY,EAAE,KAAA,EAAO,YAAY,CAAA;AAEpD,EAAA,IAAI,MAAA,EAAQ;AAEV,IAAA,MAAMK,SAAAA,GAAW,MAAM,MAAA,CAAO,YAAA,CAAa,OAAA,EAAS,CAAC,MAAA,CAAO,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAC,CAAC,CAAA;AAC/E,IAAA,MAAMC,KAAAA,GAAO,0BAAA,CAA2B,OAAA,EAASD,SAAQ,CAAA;AAGzD,IAAA,MAAME,iBAAgB,MAAM,2BAAA,CAA4B,MAAA,EAAQ,OAAA,EAASD,MAAK,QAAQ,CAAA;AACtF,IAAA,IAAI,MAAA,CAAO,IAAA,CAAKC,cAAa,CAAA,CAAE,SAAS,CAAA,EAAG;AACzC,MAAAD,MAAK,oBAAA,GAAuBC,cAAAA;AAAA,IAC9B;AAGA,IAAA,MAAMC,iBAAAA,GAAmB,MAAM,8BAAA,CAA+B,MAAA,EAAQ,SAASF,KAAAA,CAAK,QAAA,EAAUA,MAAK,oBAAoB,CAAA;AACvH,IAAA,IAAI,MAAA,CAAO,IAAA,CAAKE,iBAAgB,CAAA,CAAE,SAAS,CAAA,EAAG;AAC5C,MAAAF,MAAK,uBAAA,GAA0BE,iBAAAA;AAAA,IACjC;AAEA,IAAA,OAAO,EAAE,IAAA,EAAAF,KAAAA,EAAM,MAAA,EAAO;AAAA,EACxB;AAEA,EAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA;AAC7C,EAAA,MAAM,IAAA,GAAO,sBAAA,CAAuB,OAAA,EAAS,QAAQ,CAAA;AAGrD,EAAA,MAAM,gBAAgB,MAAM,2BAAA,CAA4B,MAAA,EAAQ,OAAA,EAAS,KAAK,QAAQ,CAAA;AACtF,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA,CAAE,SAAS,CAAA,EAAG;AACzC,IAAA,IAAA,CAAK,oBAAA,GAAuB,aAAA;AAAA,EAC9B;AAGA,EAAA,MAAM,gBAAA,GAAmB,MAAM,8BAAA,CAA+B,MAAA,EAAQ,SAAS,IAAA,CAAK,QAAA,EAAU,KAAK,oBAAoB,CAAA;AACvH,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,gBAAgB,CAAA,CAAE,SAAS,CAAA,EAAG;AAC5C,IAAA,IAAA,CAAK,uBAAA,GAA0B,gBAAA;AAAA,EACjC;AAEA,EAAA,OAAO,EAAE,MAAM,MAAA,EAAO;AACxB;;;AC1GA,SAAS,sBAAsB,MAAA,EAAwB;AACrD,EAAA,MAAM,OAAA,GAAkC;AAAA,IACtC,IAAA,EAAM,MAAA;AAAA,IACN,GAAA,EAAK,MAAA;AAAA,IACL,IAAA,EAAM,MAAA;AAAA,IACN,MAAA,EAAQ,UAAA;AAAA,IACR,QAAA,EAAU,UAAA;AAAA,IACV,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM,MAAA;AAAA,IACN,MAAA,EAAQ;AAAA,GACV;AACA,EAAA,OAAO,OAAA,CAAQ,MAAM,CAAA,IAAK,UAAA;AAC5B;AA4JA,eAAeG,SAAAA,CACb,OACA,KAAA,EAC8E;AAC9E,EAAA,MAAM,EAAE,IAAA,EAAM,MAAA,KAAW,MAAM,QAAA,CAAa,OAAO,KAAK,CAAA;AACxD,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,CAAK,SAAS,MAAA,EAAO;AAC/C;AAKA,SAAS,kBAAA,GAA0E;AACjF,EAAA,MAAM,SAA8D,EAAC;AACrE,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,EAAG;AACvD,IAAA,MAAA,CAAO,EAAE,IAAI,EAAE,KAAA,EAAO,OAAO,KAAA,EAAO,QAAA,EAAU,OAAO,QAAA,EAAS;AAAA,EAChE;AACA,EAAA,OAAO,MAAA;AACT;AAKA,eAAsB,sBACpB,MAAA,EAKC;AACD,EAAA,MAAM,MAAA,GAAS,uBAAA,CAAwB,KAAA,CAAM,MAAM,CAAA;AACnD,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,EAAO,GAAI,MAAMA,SAAAA,CAAS,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA;AAE3E,EAAA,MAAM,cAAA,GAAiB;AAAA,IACrB,GAAI,MAAA,GAAS,EAAE,YAAA,EAAc,MAAA,KAAW,EAAC;AAAA,IACzC,GAAI,OAAO,KAAA,GAAQ,EAAE,OAAO,MAAA,CAAO,KAAA,KAAU;AAAC,GAChD;AACA,EAAA,MAAM,cAAA,GAAiB,WAAA,CAAY,IAAA,EAAM,cAAc,CAAA;AAEvD,EAAA,MAAM,cAAA,GAAiB,gBAAA,CAAiB,EAAE,cAAA,EAAgB,CAAA;AAC1D,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,GAAG,kBAAA,EAAmB;AAAA,IACtB,GAAG,kBAAkB,cAAc;AAAA,GACrC;AAEA,EAAA,OAAO,EAAE,cAAA,EAAgB,UAAA,EAAY,OAAA,EAAQ;AAC/C;AAKO,SAAS,sBAAA,CACd,YAAA,EASA,cAAA,EACA,UAAA,EACA,OAAA,EACA;AAIA,EAAA,IAAI,iBAAA;AAOJ,EAAA,IAAI,WAAA,GAAc,KAAA;AAElB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,cAAA,CAAe,SAAS,CAAC,CAAA,EAAG;AAE5C,IAAA,iBAAA,GAAoB,eAAe,SAAS,CAAA;AAAA,EAC9C,CAAA,MAAO;AAEL,IAAA,MAAM,gBAAA,GAAmB,0BAAA,CAA2B,SAAA,CAAU,cAAA,CAAe,sBAAsB,CAAC,CAAA;AACpG,IAAA,IAAI,gBAAA,CAAiB,OAAA,IAAW,gBAAA,CAAiB,IAAA,CAAK,SAAS,CAAA,EAAG;AAChE,MAAA,WAAA,GAAc,IAAA;AACd,MAAA,MAAM,aAAa,gBAAA,CAAiB,IAAA;AACpC,MAAA,MAAM,eAAA,GAAkB,6BAAA,CAA8B,SAAA,CAAU,cAAA,CAAe,oBAAoB,CAAC,CAAA;AACpG,MAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,OAAA,GAAU,eAAA,CAAgB,OAAO,EAAC;AACpE,MAAA,iBAAA,GAAoB,CAAC;AAAA,QACnB,MAAA,EAAQ,OAAO,cAAA,CAAe,YAAY,MAAM,QAAA,GAAW,cAAA,CAAe,YAAY,CAAA,GAAI,MAAA;AAAA,QAC1F,QAAA,EAAU,MAAA;AAAA,QACV,UAAA,EAAY,OAAO,cAAA,CAAe,YAAY,MAAM,QAAA,GAAW,cAAA,CAAe,YAAY,CAAA,GAAI,UAAA;AAAA,QAC9F,oBAAA,EAAsB,UAAA,CAAW,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,UACzC,QAAQ,CAAA,CAAE,MAAA;AAAA,UACV,aAAa,CAAA,CAAE,WAAA;AAAA,UACf,YAAA,EAAc,qBAAA,CAAsB,CAAA,CAAE,YAAY;AAAA,SACpD,CAAE,CAAA;AAAA,QACF,kBAAA,EAAoB,SAAA,CAAU,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,UACtC,GAAG,CAAA;AAAA,UACH,eAAA,EAAiB,qBAAA,CAAsB,CAAA,CAAE,eAAe;AAAA,SAC1D,CAAE;AAAA,OACH,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,iBAAA,GAAoB,EAAC;AAAA,IACvB;AAAA,EACF;AAGA,EAAA,MAAM,eAAA,GAAkB,OAAO,cAAA,CAAe,iBAAiB,MAAM,QAAA,GACjE,cAAA,CAAe,iBAAiB,CAAA,GAChC,IAAA;AAGJ,EAAA,IAAI,WAAA;AACJ,EAAA;AACE,IAAA,MAAM,MAAA,GAAS,sBAAA,CAAuB,SAAA,CAAU,cAAA,CAAe,aAAa,CAAC,CAAA;AAC7E,IAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,EAAG;AAC5C,MAAA,WAAA,GAAc,EAAC;AACf,MAAA,KAAA,MAAW,CAAA,IAAK,OAAO,IAAA,EAAM;AAC3B,QAAA,WAAA,CAAY,CAAA,CAAE,SAAS,CAAA,GAAI;AAAA,UACzB,YAAY,CAAA,CAAE,KAAA;AAAA,UACd,eAAA,EAAiB,EAAE,eAAA,IAAmB,IAAA;AAAA,UACtC,mBAAA,EAAqB,EAAE,mBAAA,IAAuB,IAAA;AAAA,UAC9C,mBAAA,EAAqB,EAAE,mBAAA,IAAuB;AAAA,SAChD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,mBAAmB,kBAAA,CAAmB;AAAA,IAC1C,kBAAA,EAAoB,YAAA,CAAa,kBAAA,CAAmB,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MAC9D,QAAQ,CAAA,CAAE,MAAA;AAAA,MACV,UAAU,CAAA,CAAE,QAAA;AAAA,MACZ,gBAAgB,CAAA,CAAE;AAAA,KACpB,CAAE,CAAA;AAAA,IACF,iBAAA;AAAA,IACA,UAAA;AAAA,IACA,eAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,aAAA,GAAgB,OAAA,EAAS,eAAA,GAC3B,uBAAA,EAAwB,GACxB,MAAA;AAEJ,EAAA,MAAM,WAAA,GAAc;AAAA,IAClB,YAAY,gBAAA,CAAiB,UAAA;AAAA,IAC7B,UAAA;AAAA,IACA,GAAI,aAAA,GAAgB,EAAE,aAAA,KAAkB;AAAC,GAC3C;AACA,EAAA,MAAM,YAAA,GAAe,eAAe,WAAW,CAAA;AAG/C,EAAA,IAAI,SAAS,eAAA,EAAiB;AAC5B,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACzC,MAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,WAAA,IAAe,YAAA,CAAa,OAAA;AAGpD,MAAA,MAAM,qBAAiD,EAAC;AACxD,MAAA,KAAA,MAAW,CAAA,IAAK,iBAAiB,UAAA,EAAY;AAC3C,QAAA,IAAA,CAAK,EAAE,IAAA,KAAS,YAAA,IAAgB,EAAE,IAAA,KAAS,aAAA,KAAkB,EAAE,MAAA,EAAQ;AACrE,UAAA,kBAAA,CAAmB,IAAA,CAAK;AAAA,YACtB,QAAQ,CAAA,CAAE,MAAA;AAAA,YACV,MAAM,CAAA,CAAE,IAAA;AAAA,YACR,kBAAkB,CAAA,CAAE,gBAAA;AAAA,YACpB,OAAA;AAAA,YACA;AAAA,WACD,CAAA;AAAA,QACH;AAAA,MACF;AACA,MAAA,yBAAA,CAA0B,kBAAkB,CAAA;AAAA,IAE9C,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,IAAA,CAAK,sDAAsD,GAAG,CAAA;AAAA,IACxE;AAAA,EACF;AAEA,EAAA,MAAM,SAAS,yBAAA,CAA0B;AAAA,IACvC,SAAS,YAAA,CAAa,OAAA;AAAA,IACtB,UAAU,YAAA,CAAa,QAAA;AAAA,IACvB,YAAY,YAAA,CAAa,UAAA;AAAA,IACzB,WAAW,YAAA,CAAa,SAAA;AAAA,IACxB,YAAY,YAAA,CAAa,UAAA;AAAA,IACzB,oBAAoB,iBAAA,CAAkB,MAAA;AAAA,IACtC,gBAAA,EAAkB,KAAA,CAAM,OAAA,CAAQ,cAAA,CAAe,gBAAgB,CAAC,CAAA,GAAK,cAAA,CAAe,gBAAgB,CAAA,CAAgB,MAAA,GAAS,CAAA;AAAA,IAC7H,aAAa,YAAA,CAAa,WAAA;AAAA,IAC1B,YAAY,gBAAA,CAAiB,UAAA;AAAA,IAC7B,gBAAgB,gBAAA,CAAiB,cAAA;AAAA,IACjC,aAAa,YAAA,CAAa,WAAA;AAAA,IAC1B,kBAAkB,YAAA,CAAa;AAAA,GAChC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,gBAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AACF;AC5XA,SAAS,eAAA,GAA0B;AACjC,EAAA,OAAA,iBAAO,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAChC;AAEO,IAAM,iBAAN,MAAqB;AAAA,EAClB,OAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EAEtB,YAAY,MAAA,EAAgB;AAC1B,IAAA,IAAA,CAAK,OAAA,GAAUL,OAAAA,CAAQD,IAAAA,CAAK,MAAA,EAAQ,gBAAgB,CAAC,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBAAA,GAAmC;AAC/C,IAAA,IAAI,KAAK,WAAA,EAAa;AAEtB,IAAA,MAAM,GAAA,GAAMC,OAAAA,CAAQ,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AACtC,IAAA,IAAI,CAACJ,UAAAA,CAAW,GAAG,CAAA,EAAG;AACpB,MAAAU,SAAAA,CAAU,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,IACpC;AAEA,IAAA,IAAI,CAACV,UAAAA,CAAW,IAAA,CAAK,OAAO,CAAA,EAAG;AAE7B,MAAA,MAAM,KAAA,GAAQ;AAAA,QACZ,IAAA,EAAM,eAAA;AAAA,QACN,WAAW,eAAA,EAAgB;AAAA,QAC3B,MAAA,EAAQ,sCAAA;AAAA,QACR,UAAA,EAAY;AAAA,OACd;AACA,MAAA,MAAM,SAAA,CAAU,KAAK,OAAA,EAAS,IAAA,CAAK,UAAU,KAAK,CAAA,GAAI,MAAM,OAAO,CAAA;AAAA,IACrE;AAEA,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,QAAA,EAAuC;AACnD,IAAA,MAAM,KAAK,iBAAA,EAAkB;AAE7B,IAAA,MAAM,KAAA,GAAiC;AAAA,MACrC,MAAM,QAAA,CAAS,IAAA;AAAA,MACf,WAAW,eAAA,EAAgB;AAAA,MAC3B,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,YAAY,QAAA,CAAS;AAAA,KACvB;AAEA,IAAA,IAAI,QAAA,CAAS,aAAa,MAAA,EAAW;AACnC,MAAA,KAAA,CAAM,UAAU,IAAI,QAAA,CAAS,QAAA;AAAA,IAC/B;AAEA,IAAA,MAAM,UAAA,CAAW,KAAK,OAAA,EAAS,IAAA,CAAK,UAAU,KAAK,CAAA,GAAI,MAAM,OAAO,CAAA;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,OAAA,EAOC;AAChB,IAAA,MAAM,KAAK,iBAAA,EAAkB;AAE7B,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,IAAA,EAAM,kBAAA;AAAA,MACN,WAAW,eAAA,EAAgB;AAAA,MAC3B,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,YAAY,OAAA,CAAQ,eAAA;AAAA,MACpB,eAAe,OAAA,CAAQ,aAAA;AAAA,MACvB,gBAAgB,OAAA,CAAQ,cAAA;AAAA,MACxB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,aAAa,OAAA,CAAQ;AAAA,KACvB;AAEA,IAAA,MAAM,UAAA,CAAW,KAAK,OAAA,EAAS,IAAA,CAAK,UAAU,KAAK,CAAA,GAAI,MAAM,OAAO,CAAA;AAAA,EACtE;AAAA,EAEA,UAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AACF","file":"index.js","sourcesContent":["{\n \"name\": \"canicode\",\n \"version\": \"0.11.2\",\n \"mcpName\": \"io.github.let-sunny/canicode\",\n \"description\": \"Lint Figma designs for AI code-gen and roundtrip the answers back into the file. CLI + MCP server.\",\n \"type\": \"module\",\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"bin\": {\n \"canicode\": \"dist/cli/index.js\",\n \"canicode-mcp\": \"dist/mcp/server.js\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n }\n },\n \"scripts\": {\n \"build\": \"tsup --config tsup.config.ts && pnpm build:roundtrip && pnpm bundle:skills\",\n \"build:web\": \"bash scripts/build-web.sh\",\n \"build:roundtrip\": \"tsup --config tsup.roundtrip.config.ts && tsx scripts/bundle-roundtrip-cache.ts\",\n \"bundle:skills\": \"bash scripts/bundle-skills.sh\",\n \"dev\": \"tsup --watch\",\n \"test\": \"vitest\",\n \"test:run\": \"vitest run\",\n \"lint\": \"tsc --noEmit\",\n \"build:plugin\": \"bash scripts/build-plugin.sh\",\n \"sync-docs\": \"tsx scripts/sync-rule-docs.ts\",\n \"check:skill-determinism\": \"tsx scripts/check-skill-determinism.ts\",\n \"clean\": \"rm -rf dist skills\"\n },\n \"files\": [\n \"dist\",\n \"skills\",\n \"README.md\",\n \"docs/CUSTOMIZATION.md\"\n ],\n \"keywords\": [\n \"figma\",\n \"design\",\n \"analysis\",\n \"cli\",\n \"mcp\",\n \"readiness\",\n \"ai\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/let-sunny/canicode.git\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/let-sunny/canicode/issues\"\n },\n \"homepage\": \"https://github.com/let-sunny/canicode\",\n \"author\": \"minseon\",\n \"license\": \"MIT\",\n \"pnpm\": {\n \"overrides\": {\n \"picomatch\": \"4.0.4\",\n \"path-to-regexp\": \"8.4.0\"\n }\n },\n \"packageManager\": \"pnpm@10.32.1\",\n \"engines\": {\n \"node\": \">=22\"\n },\n \"dependencies\": {\n \"@figma/rest-api-spec\": \"^0.36.0\",\n \"@modelcontextprotocol/sdk\": \"^1.27.1\",\n \"cac\": \"^7.0.0\",\n \"dotenv\": \"^17.3.1\",\n \"pixelmatch\": \"^7.1.0\",\n \"pngjs\": \"^7.0.0\",\n \"zod\": \"^4.3.6\"\n },\n \"devDependencies\": {\n \"@anthropic-ai/sdk\": \"^0.80.0\",\n \"@figma/plugin-typings\": \"^1.123.0\",\n \"@types/node\": \"^25.5.0\",\n \"@types/pngjs\": \"^6.0.5\",\n \"playwright\": \"^1.58.2\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.19.0\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.1.0\"\n }\n}\n","import { z } from \"zod\";\n\nexport const SeveritySchema = z.enum([\n \"blocking\",\n \"risk\",\n \"missing-info\",\n \"suggestion\",\n]);\n\nexport type Severity = z.infer<typeof SeveritySchema>;\n\nexport const SEVERITY_WEIGHT: Record<Severity, number> = {\n blocking: 10,\n risk: 5,\n \"missing-info\": 2,\n suggestion: 1,\n};\n\nexport const SEVERITY_LABELS: Record<Severity, string> = {\n blocking: \"Blocking\",\n risk: \"Risk\",\n \"missing-info\": \"Missing Info\",\n suggestion: \"Suggestion\",\n};\n","import { z } from \"zod\";\n\n/**\n * #402 shared output-channel vocabulary.\n * Detection stays rule-based; output channel and persistence intent vary by\n * consumer payload (score/transient vs annotation/durable).\n */\nexport const DetectionSchema = z.literal(\"rule-based\");\nexport const OutputChannelSchema = z.enum([\"score\", \"annotation\"]);\nexport const PersistenceIntentSchema = z.enum([\"transient\", \"durable\"]);\n\nexport type Detection = z.infer<typeof DetectionSchema>;\nexport type OutputChannel = z.infer<typeof OutputChannelSchema>;\nexport type PersistenceIntent = z.infer<typeof PersistenceIntentSchema>;\n\n/**\n * #406 rule purpose classification.\n * - `violation`: score-primary. Node is violating a best-practice expectation;\n * fixing the violation removes the rule fire. Gotcha question is secondary\n * context about how to resolve the violation.\n * - `info-collection`: annotation-primary. Node is not necessarily \"wrong,\"\n * but implementation-critical context is absent from Figma (e.g. click\n * target, interaction states). Gotcha question is the primary output;\n * score impact is intentionally minimal (typically -1 or 0).\n *\n * Detection stays `rule-based` in both cases — see ADR-017.\n */\nexport const RulePurposeSchema = z.enum([\"violation\", \"info-collection\"]);\nexport type RulePurpose = z.infer<typeof RulePurposeSchema>;\n","import { z } from \"zod\";\nimport type { AnalysisNode } from \"./figma-node.js\";\n\n/**\n * #404: Analysis scope — what the user is asking canicode to reason about.\n *\n * - `page`: full screen / section / layout. Container frames are\n * responsible for bounds; repetition detection is meaningful; rules\n * that assume \"this is a self-contained screen\" apply.\n * - `component`: standalone reusable UI unit (COMPONENT / COMPONENT_SET\n * / INSTANCE analyzed in isolation). Root FILL is the design contract\n * rather than a missing bound; repetition detection is generally a\n * false signal because a component is itself the unit of reuse.\n *\n * The enum is intentionally two-valued; multi-scope analysis (analyzing\n * a page and its inner components in one run) is explicitly out of scope\n * per the issue. Each rule decides how (or whether) to switch on `scope`;\n * this PR only carries the context. Rule-level consumption lands in\n * follow-up PRs (e.g. #403 for `missing-size-constraint`).\n */\nexport const AnalysisScopeSchema = z.enum([\"page\", \"component\"]);\nexport type AnalysisScope = z.infer<typeof AnalysisScopeSchema>;\n\n/**\n * Figma node types that unambiguously indicate a component-scope analysis\n * when they appear as the analysis **root**.\n *\n * - `COMPONENT` / `COMPONENT_SET`: the design unit IS the component.\n * - `INSTANCE`: the root is a reusable unit's placement; treating it as\n * component scope keeps rules like `missing-size-constraint` from\n * demanding bounds on a node whose bounds are the container's job.\n *\n * Any other root type (`FRAME`, `SECTION`, `CANVAS`, `DOCUMENT`, `GROUP`,\n * etc.) resolves to page scope — the common case for analyzing a screen\n * or page section via `?node-id=...`.\n */\nconst COMPONENT_SCOPE_ROOT_TYPES = new Set([\"COMPONENT\", \"COMPONENT_SET\", \"INSTANCE\"]);\n\n/**\n * Deterministically detect analysis scope from the root node type. Returns\n * `\"component\"` for `COMPONENT` / `COMPONENT_SET` / `INSTANCE` roots, and\n * `\"page\"` for everything else.\n *\n * The CLI / MCP layer may override this with an explicit `scope` flag when\n * the user knows the heuristic mis-detects (e.g. analyzing a FRAME that\n * ships as a standalone design-system example rather than a screen).\n */\nexport function detectAnalysisScope(rootNode: AnalysisNode): AnalysisScope {\n return COMPONENT_SCOPE_ROOT_TYPES.has(rootNode.type) ? \"component\" : \"page\";\n}\n","import { z } from \"zod\";\n\nexport const CategorySchema = z.enum([\n \"pixel-critical\",\n \"responsive-critical\",\n \"code-quality\",\n \"token-management\",\n \"semantic\",\n \"interaction\",\n]);\n\nexport type Category = z.infer<typeof CategorySchema>;\n\nexport const CATEGORIES = CategorySchema.options;\n\nexport const CATEGORY_LABELS: Record<Category, string> = {\n \"pixel-critical\": \"Pixel Critical\",\n \"responsive-critical\": \"Responsive Critical\",\n \"code-quality\": \"Code Quality\",\n \"token-management\": \"Token Management\",\n \"semantic\": \"Semantic\",\n \"interaction\": \"Interaction\",\n};\n","import { z } from \"zod\";\n\n/**\n * Figma node types required for analysis\n * See @figma/rest-api-spec for full API types\n */\n\nexport const AnalysisNodeTypeSchema = z.enum([\n \"DOCUMENT\",\n \"CANVAS\",\n \"FRAME\",\n \"GROUP\",\n \"SECTION\",\n \"COMPONENT\",\n \"COMPONENT_SET\",\n \"INSTANCE\",\n \"RECTANGLE\",\n \"ELLIPSE\",\n \"VECTOR\",\n \"TEXT\",\n \"LINE\",\n \"BOOLEAN_OPERATION\",\n \"STAR\",\n \"REGULAR_POLYGON\",\n \"SLICE\",\n \"STICKY\",\n \"SHAPE_WITH_TEXT\",\n \"CONNECTOR\",\n \"WIDGET\",\n \"EMBED\",\n \"LINK_UNFURL\",\n \"TABLE\",\n \"TABLE_CELL\",\n \"SLOT\",\n]);\n\nexport type AnalysisNodeType = z.infer<typeof AnalysisNodeTypeSchema>;\n\nexport const LayoutModeSchema = z.enum([\"NONE\", \"HORIZONTAL\", \"VERTICAL\", \"GRID\"]);\nexport type LayoutMode = z.infer<typeof LayoutModeSchema>;\n\nexport const LayoutAlignSchema = z.enum([\"MIN\", \"CENTER\", \"MAX\", \"STRETCH\", \"INHERIT\"]);\nexport type LayoutAlign = z.infer<typeof LayoutAlignSchema>;\n\nexport const LayoutPositioningSchema = z.enum([\"AUTO\", \"ABSOLUTE\"]);\nexport type LayoutPositioning = z.infer<typeof LayoutPositioningSchema>;\n\nexport const LayoutConstraintSchema = z.object({\n horizontal: z.enum([\"LEFT\", \"RIGHT\", \"CENTER\", \"LEFT_RIGHT\", \"SCALE\"]),\n vertical: z.enum([\"TOP\", \"BOTTOM\", \"CENTER\", \"TOP_BOTTOM\", \"SCALE\"]),\n});\nexport type LayoutConstraint = z.infer<typeof LayoutConstraintSchema>;\n\nexport const LayoutWrapSchema = z.enum([\"NO_WRAP\", \"WRAP\"]);\nexport type LayoutWrap = z.infer<typeof LayoutWrapSchema>;\n\nexport const OverflowDirectionSchema = z.enum([\n \"HORIZONTAL_SCROLLING\",\n \"VERTICAL_SCROLLING\",\n \"HORIZONTAL_AND_VERTICAL_SCROLLING\",\n \"NONE\",\n]);\nexport type OverflowDirection = z.infer<typeof OverflowDirectionSchema>;\n\nexport const GridChildAlignSchema = z.enum([\"AUTO\", \"MIN\", \"CENTER\", \"MAX\"]);\nexport type GridChildAlign = z.infer<typeof GridChildAlignSchema>;\n\n/**\n * Lightweight FigmaNode type for analysis\n * Contains only properties needed by rules\n */\nconst BaseAnalysisNodeSchema = z.object({\n // Basic identification\n id: z.string(),\n name: z.string(),\n type: AnalysisNodeTypeSchema,\n visible: z.boolean().default(true),\n\n // Layout analysis\n layoutMode: LayoutModeSchema.optional(),\n layoutAlign: LayoutAlignSchema.optional(),\n layoutPositioning: LayoutPositioningSchema.optional(),\n layoutSizingHorizontal: z.enum([\"FIXED\", \"HUG\", \"FILL\"]).optional(),\n layoutSizingVertical: z.enum([\"FIXED\", \"HUG\", \"FILL\"]).optional(),\n primaryAxisAlignItems: z.string().optional(),\n counterAxisAlignItems: z.string().optional(),\n itemSpacing: z.number().optional(),\n paddingLeft: z.number().optional(),\n paddingRight: z.number().optional(),\n paddingTop: z.number().optional(),\n paddingBottom: z.number().optional(),\n\n // Size constraints (responsive)\n minWidth: z.number().optional(),\n maxWidth: z.number().optional(),\n minHeight: z.number().optional(),\n maxHeight: z.number().optional(),\n layoutGrow: z.union([z.literal(0), z.literal(1)]).optional(),\n constraints: LayoutConstraintSchema.optional(),\n\n // Wrap (flex-wrap)\n layoutWrap: LayoutWrapSchema.optional(),\n counterAxisSpacing: z.number().optional(),\n counterAxisAlignContent: z.enum([\"AUTO\", \"SPACE_BETWEEN\"]).optional(),\n\n // Grid layout (container)\n gridRowCount: z.number().optional(),\n gridColumnCount: z.number().optional(),\n gridRowGap: z.number().optional(),\n gridColumnGap: z.number().optional(),\n gridColumnsSizing: z.string().optional(),\n gridRowsSizing: z.string().optional(),\n\n // Grid layout (child)\n gridChildHorizontalAlign: GridChildAlignSchema.optional(),\n gridChildVerticalAlign: GridChildAlignSchema.optional(),\n gridRowSpan: z.number().optional(),\n gridColumnSpan: z.number().optional(),\n gridRowAnchorIndex: z.number().optional(),\n gridColumnAnchorIndex: z.number().optional(),\n\n // Overflow / clip\n clipsContent: z.boolean().optional(),\n overflowDirection: OverflowDirectionSchema.optional(),\n\n // Size/position analysis\n absoluteBoundingBox: z\n .object({\n x: z.number(),\n y: z.number(),\n width: z.number(),\n height: z.number(),\n })\n .nullable()\n .optional(),\n\n // Component analysis\n componentId: z.string().optional(),\n componentPropertyDefinitions: z.record(z.string(), z.unknown()).optional(),\n componentProperties: z.record(z.string(), z.unknown()).optional(),\n\n // Style/token analysis\n styles: z.record(z.string(), z.string()).optional(),\n fills: z.array(z.unknown()).optional(),\n strokes: z.array(z.unknown()).optional(),\n strokeWeight: z.number().optional(),\n individualStrokeWeights: z.record(z.string(), z.number()).optional(),\n effects: z.array(z.unknown()).optional(),\n cornerRadius: z.number().optional(),\n opacity: z.number().optional(),\n\n // Variable binding analysis (design tokens)\n boundVariables: z.record(z.string(), z.unknown()).optional(),\n\n // Text analysis\n characters: z.string().optional(),\n style: z.record(z.string(), z.unknown()).optional(),\n textTruncation: z.enum([\"DISABLED\", \"ENDING\"]).optional(),\n maxLines: z.number().optional(),\n\n // Handoff analysis\n devStatus: z\n .object({\n type: z.enum([\"NONE\", \"READY_FOR_DEV\", \"COMPLETED\"]),\n description: z.string().optional(),\n })\n .optional(),\n\n // Prototype interactions\n interactions: z.array(z.unknown()).optional(),\n\n // Naming analysis metadata\n isAsset: z.boolean().optional(),\n});\n\nexport type AnalysisNode = z.infer<typeof BaseAnalysisNodeSchema> & {\n children?: AnalysisNode[] | undefined;\n};\n\nexport const AnalysisNodeSchema: z.ZodType<AnalysisNode> =\n BaseAnalysisNodeSchema.extend({\n children: z.lazy(() => AnalysisNodeSchema.array().optional()),\n }) as z.ZodType<AnalysisNode>;\n\n/**\n * Figma file metadata for analysis\n */\nexport const AnalysisFileSchema = z.object({\n fileKey: z.string(),\n name: z.string(),\n lastModified: z.string(),\n version: z.string(),\n sourceUrl: z.string().optional(),\n document: AnalysisNodeSchema,\n components: z.record(\n z.string(),\n z.object({\n key: z.string(),\n name: z.string(),\n description: z.string(),\n })\n ),\n componentDefinitions: z.record(z.string(), AnalysisNodeSchema).optional(),\n interactionDestinations: z.record(z.string(), AnalysisNodeSchema).optional(),\n styles: z.record(\n z.string(),\n z.object({\n key: z.string(),\n name: z.string(),\n styleType: z.string(),\n })\n ),\n});\n\nexport type AnalysisFile = z.infer<typeof AnalysisFileSchema>;\n","import { z } from \"zod\";\nimport type { AnalysisScope } from \"./analysis-scope.js\";\nimport { CategorySchema, type Category } from \"./category.js\";\nimport { SeveritySchema } from \"./severity.js\";\nimport type { AnalysisFile, AnalysisNode } from \"./figma-node.js\";\n\n/**\n * Rule definition - static metadata (does not change)\n */\nexport const RuleDefinitionSchema = z.object({\n id: z.string(),\n name: z.string(),\n category: CategorySchema,\n why: z.string(),\n impact: z.string(),\n fix: z.string(),\n});\n\nexport type RuleDefinition = z.infer<typeof RuleDefinitionSchema>;\n\n/**\n * Rule config - adjustable settings (can be modified via presets)\n */\nexport const RuleConfigSchema = z.object({\n severity: SeveritySchema,\n score: z.number().int().max(0),\n depthWeight: z.number().min(1).max(2).optional(),\n enabled: z.boolean().default(true),\n options: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport type RuleConfig = z.infer<typeof RuleConfigSchema>;\n\n/**\n * Context passed to rule check functions\n */\nexport interface RuleContext {\n file: AnalysisFile;\n parent?: AnalysisNode | undefined;\n depth: number;\n /** Depth relative to the nearest COMPONENT/INSTANCE ancestor. Resets at component boundaries. */\n componentDepth: number;\n maxDepth: number;\n path: string[];\n /** Ancestor node types from root to parent (excludes current node). */\n ancestorTypes: string[];\n siblings?: AnalysisNode[] | undefined;\n /** Per-analysis shared state. Created fresh for each analysis run, eliminating module-level mutable state. */\n analysisState: Map<string, unknown>;\n /**\n * #404: Scope of the analysis root (`page` vs `component`). Rules use\n * this to decide whether expectations like \"container must define\n * bounds\" or \"repetition should become a component\" apply. Constant for\n * all nodes in a single analysis — whether the CURRENT node happens to\n * be a `COMPONENT` descendant of a page root is already signalled by\n * `componentDepth`, not by re-deriving scope per node.\n */\n scope: AnalysisScope;\n /**\n * #403: Figma node type of the analysis root, captured once in\n * `RuleEngine.analyze`. This is an *axis orthogonal to* `scope`:\n * `scope === \"component\"` does not tell a rule whether the root is a\n * `COMPONENT`/`COMPONENT_SET` (component being audited) or an\n * `INSTANCE` (component being used, possibly with overrides). The\n * `missing-size-constraint` redesign needs that distinction so the\n * gotcha question can ask the right thing — \"intentionally\n * non-responsive?\" vs \"override intended? original may be FILL\". The\n * value is the raw Figma node type string (no new enum) so it stays in\n * sync with `AnalysisNode.type` without a translation layer.\n */\n rootNodeType: string;\n}\n\n/**\n * Get or initialize per-analysis state for a rule.\n * Each key gets its own lazily-initialized state that persists for the duration of one analysis run.\n */\nexport function getAnalysisState<T>(context: RuleContext, key: string, init: () => T): T {\n if (context.analysisState.has(key)) {\n return context.analysisState.get(key) as T;\n }\n const value = init();\n context.analysisState.set(key, value);\n return value;\n}\n\n/**\n * Rule violation result from check function\n */\nexport interface RuleViolation {\n ruleId: string;\n subType?: string;\n nodeId: string;\n nodePath: string;\n message: string;\n suggestion: string;\n guide?: string;\n /**\n * Pre-computed name to write to `node.name` in Figma — populated by naming\n * rules whose suggestion is a deterministic function of the node's existing\n * state (`non-standard-naming`, `inconsistent-naming-convention`).\n * Capitalized for direct Plugin-API use; the human-readable `suggestion`\n * string keeps lowercase prose.\n */\n suggestedName?: string;\n}\n\n/**\n * Rule check function signature\n */\nexport type RuleCheckFn = (\n node: AnalysisNode,\n context: RuleContext,\n options?: Record<string, unknown>\n) => RuleViolation | null;\n\n/**\n * Complete rule with definition, config, and check function\n */\nexport interface Rule {\n definition: RuleDefinition;\n check: RuleCheckFn;\n}\n\n/**\n * Rule ID type for type safety\n */\nexport type RuleId =\n // Pixel Critical — layout issues that directly affect pixel accuracy (ΔV ≥ 5%)\n | \"no-auto-layout\"\n | \"absolute-position-in-auto-layout\"\n | \"non-layout-container\"\n // Responsive Critical — size issues that break at different viewports (ΔV ≥ 15%)\n | \"fixed-size-in-auto-layout\"\n | \"missing-size-constraint\"\n // Code Quality — structural issues affecting code reuse (ΔV ≈ 0%, CSS classes -8~15)\n | \"missing-component\"\n | \"detached-instance\"\n | \"variant-structure-mismatch\"\n | \"deep-nesting\"\n // Token Management — raw values without design tokens\n | \"raw-value\"\n | \"irregular-spacing\"\n // Interaction — missing state variants and prototype links for interactive components\n | \"missing-interaction-state\"\n | \"missing-prototype\"\n // Semantic — naming issues with negligible pixel impact (ΔV < 2%)\n | \"non-standard-naming\"\n | \"non-semantic-name\"\n | \"inconsistent-naming-convention\";\n\n/**\n * Categories that support depthWeight\n */\nexport const DEPTH_WEIGHT_CATEGORIES: Category[] = [\"pixel-critical\", \"responsive-critical\"];\n\n/**\n * Check if a category supports depth weighting\n */\nexport function supportsDepthWeight(category: Category): boolean {\n return DEPTH_WEIGHT_CATEGORIES.includes(category);\n}\n","import { z } from \"zod\";\nimport { SeveritySchema } from \"./severity.js\";\n\nexport const IssueSchema = z.object({\n nodeId: z.string(),\n nodePath: z.string(),\n figmaDeepLink: z.string().url(),\n ruleId: z.string(),\n message: z.string(),\n severity: SeveritySchema,\n});\n\nexport type Issue = z.infer<typeof IssueSchema>;\n","import { z } from \"zod\";\nimport { CategorySchema } from \"./category.js\";\n\nexport const CategoryScoreSchema = z.object({\n category: CategorySchema,\n score: z.number().min(0).max(100),\n maxScore: z.number().min(0).max(100),\n issueCount: z.object({\n error: z.number().int().min(0),\n warning: z.number().int().min(0),\n info: z.number().int().min(0),\n }),\n});\n\nexport type CategoryScore = z.infer<typeof CategoryScoreSchema>;\n","import { z } from \"zod\";\nimport { CategoryScoreSchema } from \"./score.js\";\nimport { IssueSchema } from \"./issue.js\";\n\nexport const ReportMetadataSchema = z.object({\n fileKey: z.string(),\n fileName: z.string(),\n analyzedAt: z.string().datetime(),\n version: z.string(),\n});\n\nexport type ReportMetadata = z.infer<typeof ReportMetadataSchema>;\n\nexport const ReportSchema = z.object({\n metadata: ReportMetadataSchema,\n totalScore: z.number().min(0).max(100),\n categoryScores: z.array(CategoryScoreSchema),\n issues: z.array(IssueSchema),\n summary: z.object({\n totalNodes: z.number().int().min(0),\n analyzedNodes: z.number().int().min(0),\n errorCount: z.number().int().min(0),\n warningCount: z.number().int().min(0),\n infoCount: z.number().int().min(0),\n }),\n});\n\nexport type Report = z.infer<typeof ReportSchema>;\n","import { z } from \"zod\";\n\nconst positiveCliNumber = z\n .union([z.string(), z.number()])\n .transform((v) => Number(v))\n .refine(Number.isFinite, \"must be a valid number\")\n .refine((v) => v > 0, \"must be positive\");\n\nconst figmaScaleNumber = z\n .union([z.string(), z.number()])\n .transform((v) => Number(v))\n .refine(Number.isFinite, \"must be a valid number\")\n .refine((v) => v >= 1, \"must be >= 1\");\n\n/** Zod schema for CLI visual-compare options (raw CLI input). */\nexport const VisualCompareCliOptionsSchema = z.object({\n figmaUrl: z.string().optional(),\n figmaScreenshot: z.string().optional(),\n token: z.string().optional(),\n output: z.string().optional(),\n width: positiveCliNumber.optional(),\n height: positiveCliNumber.optional(),\n figmaScale: figmaScaleNumber.optional(),\n expandRoot: z.boolean().optional(),\n});\n\nexport type VisualCompareCliOptions = z.infer<typeof VisualCompareCliOptionsSchema>;\n","import { z } from \"zod\";\nimport { SeveritySchema } from \"./severity.js\";\nimport { CategorySchema } from \"./category.js\";\nimport { AnalysisScopeSchema } from \"./analysis-scope.js\";\nimport {\n DetectionSchema,\n OutputChannelSchema,\n PersistenceIntentSchema,\n RulePurposeSchema,\n} from \"./channels.js\";\n\nconst GradeSchema = z.enum([\"S\", \"A+\", \"A\", \"B+\", \"B\", \"C+\", \"C\", \"D\", \"F\"]);\n\nconst CategoryScoreResultSchema = z.object({\n category: CategorySchema,\n score: z.number(),\n maxScore: z.number(),\n percentage: z.number(),\n issueCount: z.number().int().min(0),\n uniqueRuleCount: z.number().int().min(0),\n weightedIssueCount: z.number(),\n densityScore: z.number(),\n diversityScore: z.number(),\n bySeverity: z.object({\n blocking: z.number().int().min(0),\n risk: z.number().int().min(0),\n \"missing-info\": z.number().int().min(0),\n suggestion: z.number().int().min(0),\n }),\n});\n\nconst McpIssueSchema = z.object({\n ruleId: z.string(),\n detection: DetectionSchema,\n outputChannel: OutputChannelSchema.extract([\"score\"]),\n persistenceIntent: PersistenceIntentSchema.extract([\"transient\"]),\n /**\n * #406: Whether the triggering rule's primary output is a score penalty\n * (`violation`) or a gotcha annotation (`info-collection`). MCP consumers\n * use this to decide whether the issue is actionable (\"fix this\") or\n * annotation-seeking (\"tell us what you meant here\").\n */\n purpose: RulePurposeSchema,\n subType: z.string().optional(),\n severity: SeveritySchema,\n nodeId: z.string(),\n nodePath: z.string(),\n message: z.string(),\n});\n\n/**\n * Zod schema for the MCP analyze tool response body.\n * This is the shape of the JSON returned by `buildResultJson` in scoring.ts.\n */\nexport const McpAnalyzeResponseSchema = z.object({\n version: z.string(),\n analyzedAt: z.string(),\n fileKey: z.string().optional(),\n fileName: z.string(),\n nodeCount: z.number().int().min(0),\n maxDepth: z.number().int().min(0),\n /**\n * #404: Resolved analysis scope (`page` vs `component`). Downstream\n * consumers (e.g. `figma-implement-design`, gotcha UI) branch on this\n * the same way rules do — a component-scope result should not be\n * treated as if container bounds are missing, and repetition detection\n * on a component-scope result is not meaningful.\n */\n scope: AnalysisScopeSchema,\n issueCount: z.number().int().min(0),\n isReadyForCodeGen: z.boolean(),\n blockingIssueCount: z.number().int().min(0),\n scores: z.object({\n overall: z.object({\n score: z.number(),\n maxScore: z.number(),\n percentage: z.number(),\n grade: GradeSchema,\n }),\n categories: z.record(CategorySchema, CategoryScoreResultSchema),\n }),\n issuesByRule: z.record(z.string(), z.number().int().min(0)),\n issues: z.array(McpIssueSchema),\n summary: z.string(),\n failedRules: z.array(z.string()).optional(),\n});\n\nexport type McpAnalyzeResponse = z.infer<typeof McpAnalyzeResponseSchema>;\n","import { z } from \"zod\";\nimport { SeveritySchema } from \"./severity.js\";\nimport {\n DetectionSchema,\n OutputChannelSchema,\n PersistenceIntentSchema,\n RulePurposeSchema,\n} from \"./channels.js\";\n\nconst GradeSchema = z.enum([\"S\", \"A+\", \"A\", \"B+\", \"B\", \"C+\", \"C\", \"D\", \"F\"]);\n\nexport const InstanceContextSchema = z.object({\n parentInstanceNodeId: z.string(),\n sourceNodeId: z.string(),\n sourceComponentId: z.string().optional(),\n sourceComponentName: z.string().optional(),\n});\n\nexport type InstanceContext = z.infer<typeof InstanceContextSchema>;\n\n/**\n * Apply-strategy enum surfaced on survey questions and analyze-output issues.\n * Mirrors `RuleApplyStrategy` in `src/core/gotcha/apply-context.ts` —\n * declared as a Zod enum here so MCP responses validate end-to-end.\n */\nexport const RuleApplyStrategySchema = z.enum([\n \"property-mod\",\n \"structural-mod\",\n \"annotation\",\n \"auto-fix\",\n]);\n\nexport type RuleApplyStrategy = z.infer<typeof RuleApplyStrategySchema>;\n\nconst TargetPropertySchema = z.union([z.string(), z.array(z.string())]);\n\n/**\n * Mirrors the `AnnotationProperty` interface in `src/core/roundtrip/types.ts`.\n * Declared here per the project's Zod convention (schemas live in contracts/)\n * so MCP responses validate end-to-end.\n */\nexport const AnnotationPropertySchema = z.object({ type: z.string() });\n\n/**\n * #402: Gotcha output is generated by a rule-based detection pass but flows\n * to the annotation channel (not the score channel). Answers are durable\n * context intended to survive beyond a single re-analysis cycle.\n */\nexport const GotchaDetectionSchema = DetectionSchema;\nexport const GotchaOutputChannelSchema = OutputChannelSchema.extract([\n \"annotation\",\n]);\nexport const GotchaPersistenceIntentSchema = PersistenceIntentSchema.extract([\n \"durable\",\n]);\n\nexport const GotchaSurveyQuestionSchema = z.object({\n nodeId: z.string(),\n nodeName: z.string(),\n ruleId: z.string(),\n detection: GotchaDetectionSchema,\n outputChannel: GotchaOutputChannelSchema,\n persistenceIntent: GotchaPersistenceIntentSchema,\n /**\n * #406: Classifies the triggering rule as `violation` (score-primary,\n * gotcha secondary) or `info-collection` (annotation-primary, score\n * minimal). Consumers use this to prioritize answers that collect durable\n * implementation context over answers that merely describe how to fix a\n * violation the rule will stop firing for.\n */\n purpose: RulePurposeSchema,\n severity: SeveritySchema,\n question: z.string(),\n hint: z.string(),\n example: z.string(),\n instanceContext: InstanceContextSchema.optional(),\n applyStrategy: RuleApplyStrategySchema,\n targetProperty: TargetPropertySchema.optional(),\n annotationProperties: z.array(AnnotationPropertySchema).optional(),\n suggestedName: z.string().optional(),\n isInstanceChild: z.boolean(),\n sourceChildId: z.string().optional(),\n // #356: when this question collapses N instance-child issues that share the\n // same `(sourceComponentId, sourceNodeId, ruleId)` tuple, `replicas` is the\n // total instance count (>=2) and `replicaNodeIds` lists every instance scene\n // node id OTHER than the kept `nodeId`. Apply step iterates\n // `[nodeId, ...replicaNodeIds]` so the same answer lands on every replica.\n // Single-instance questions omit both fields.\n replicas: z.number().int().min(2).optional(),\n replicaNodeIds: z.array(z.string()).optional(),\n});\n\nexport type GotchaSurveyQuestion = z.infer<typeof GotchaSurveyQuestionSchema>;\n\n/**\n * Pre-grouped+batched view of `questions` (#369, #370, #381). Decoupled from\n * `questions` so consumers that just want the flat list can ignore it; SKILLs\n * (`canicode-gotchas`, `canicode-roundtrip`) iterate over `groupedQuestions`\n * to keep sort / partition / batchable-rule decisions out of the LLM's\n * prose interpretation, per ADR-016.\n *\n * Generated by `groupAndBatchSurveyQuestions` in `core/gotcha/`. Sort key is\n * `(sourceComponentId ?? \"_no-source\", ruleId, nodeName)`. Source-component\n * groups are emitted first; the trailing group with `instanceContext: null`\n * carries every non-instance question.\n */\nexport const SurveyQuestionBatchSchema = z.object({\n ruleId: z.string(),\n /**\n * Rendering mode for this batch (see `BatchMode` in\n * `src/core/gotcha/group-and-batch-questions.ts` — the authoritative\n * whitelists `BATCHABLE_RULE_IDS` and `OPT_IN_BATCHABLE_RULE_IDS` live\n * there):\n * - `\"safe\"` — one answer uniformly applies to every member (#369).\n * - `\"opt-in\"` — one shared answer is a suggested default; the user may\n * reply `split` for per-node override (#426).\n * - `\"none\"` — single-member batch, renders the standard per-question\n * template.\n */\n batchMode: z.enum([\"safe\", \"opt-in\", \"none\"]),\n questions: z.array(GotchaSurveyQuestionSchema),\n /**\n * Sum of `max(question.replicas, 1)` across `questions`. Counts the\n * actual Figma scene fan-out so the SKILL can render `N instances`\n * accurately even when one batch member already collapses multiple\n * replicas via the #356 source-component dedupe.\n */\n totalScenes: z.number().int().min(1),\n});\n\nexport type SurveyQuestionBatch = z.infer<typeof SurveyQuestionBatchSchema>;\n\nexport const SurveyQuestionGroupSchema = z.object({\n /**\n * Shared `instanceContext` for the group, or `null` for the trailing\n * non-instance group. The SKILL emits the verbose \"Instance note\" header\n * once per non-null group instead of once per question (#370).\n */\n instanceContext: InstanceContextSchema.nullable(),\n batches: z.array(SurveyQuestionBatchSchema),\n});\n\nexport type SurveyQuestionGroup = z.infer<typeof SurveyQuestionGroupSchema>;\n\nexport const GroupedSurveySchema = z.object({\n groups: z.array(SurveyQuestionGroupSchema),\n});\n\nexport type GroupedSurvey = z.infer<typeof GroupedSurveySchema>;\n\nexport const GotchaSurveySchema = z.object({\n designGrade: GradeSchema,\n isReadyForCodeGen: z.boolean(),\n questions: z.array(GotchaSurveyQuestionSchema),\n groupedQuestions: GroupedSurveySchema,\n /**\n * #384 — canonical identifier for this design across canicode runs.\n * Computed by `computeDesignKey(input)` (`<fileKey>#<nodeId>` for Figma\n * URLs, absolute path for fixtures). The `canicode-gotchas` SKILL reads\n * this directly when upserting the per-design section, so the SKILL.md\n * prose no longer parses URLs (per ADR-016).\n */\n designKey: z.string(),\n /**\n * #428 — threshold hint for the `allowDefinitionWrite` picker in the\n * `canicode-roundtrip` skill. `true` when `propagationCandidates >= 3`\n * (i.e. three or more questions target instance children that could\n * benefit from definition-level writes). When `false`, the skill silently\n * uses the annotation default (ADR-012) without surfacing the picker —\n * the opt-in flow is over-engineered for tiny surveys.\n *\n * Computed server-side from `questions` so the skill doesn't have to\n * count `isInstanceChild` manually; the skill may still override this\n * hint when it has additional context (e.g. all candidates are\n * read-only per probe result).\n */\n suggestedDefaultApply: z.boolean(),\n});\n\nexport type GotchaSurvey = z.infer<typeof GotchaSurveySchema>;\n","import type { Category } from \"../contracts/category.js\";\nimport type { RulePurpose } from \"../contracts/channels.js\";\nimport type { RuleConfig, RuleId } from \"../contracts/rule.js\";\nimport type { AnnotationProperty } from \"../roundtrip/types.js\";\n\n/**\n * Maps each rule ID to its category.\n * Categories are based on ablation experiment data (PR #149, #150):\n * - pixel-critical: ΔV ≥ 5% — layout info removal directly degrades pixel accuracy\n * - responsive-critical: ΔV ≥ 15% at expanded viewport — size info critical for responsive\n * - code-quality: ΔV ≈ 0% but CSS classes -8~15 — affects code structure, not pixels\n * - token-management: raw values without design tokens — wrong input = wrong output\n * - semantic: ΔV < 2%, negligible code difference — naming and semantic issues\n */\nexport const RULE_ID_CATEGORY: Record<RuleId, Category> = {\n // Pixel Critical\n \"no-auto-layout\": \"pixel-critical\",\n \"absolute-position-in-auto-layout\": \"pixel-critical\",\n \"non-layout-container\": \"pixel-critical\",\n // Responsive Critical\n \"fixed-size-in-auto-layout\": \"responsive-critical\",\n \"missing-size-constraint\": \"responsive-critical\",\n // Code Quality\n \"missing-component\": \"code-quality\",\n \"detached-instance\": \"code-quality\",\n \"variant-structure-mismatch\": \"code-quality\",\n \"deep-nesting\": \"code-quality\",\n // Token Management\n \"raw-value\": \"token-management\",\n \"irregular-spacing\": \"token-management\",\n // Interaction\n \"missing-interaction-state\": \"interaction\",\n \"missing-prototype\": \"interaction\",\n // Semantic\n \"non-standard-naming\": \"semantic\",\n \"non-semantic-name\": \"semantic\",\n \"inconsistent-naming-convention\": \"semantic\",\n};\n\n/**\n * #406: Classifies each rule by primary output channel.\n *\n * - `violation` (default): score-primary. Rule fires when a best-practice\n * expectation is broken; the score penalty is the main signal, gotcha\n * questions are secondary context on how to resolve the violation.\n * - `info-collection`: annotation-primary. Rule fires on nodes that need\n * implementation context Figma cannot encode natively (click target,\n * state variants). The gotcha annotation IS the output; score impact is\n * kept minimal (-1 range) so presence/absence of the annotation — not\n * the penalty — differentiates designs.\n *\n * Sibling map (mirrors `RULE_ID_CATEGORY`) so existing `RuleDefinition`\n * call sites don't need to be touched. Look up via `getRulePurpose`.\n */\nexport const RULE_PURPOSE: Record<RuleId, RulePurpose> = {\n // Pixel Critical\n \"no-auto-layout\": \"violation\",\n \"absolute-position-in-auto-layout\": \"violation\",\n \"non-layout-container\": \"violation\",\n // Responsive Critical\n \"fixed-size-in-auto-layout\": \"violation\",\n // #403: missing-size-constraint reframed as info-collection. The rule\n // fires on width chains whose intent is structurally undecidable\n // (FILL container with no chain-bound ancestor; FIXED component or\n // instance root). The gotcha question is the primary signal; the\n // -1 score is just enough to keep the rule visible in\n // diversity scoring without driving grade swings on its own.\n \"missing-size-constraint\": \"info-collection\",\n // Code Quality\n \"missing-component\": \"violation\",\n \"detached-instance\": \"violation\",\n \"variant-structure-mismatch\": \"violation\",\n \"deep-nesting\": \"violation\",\n // Token Management\n \"raw-value\": \"violation\",\n \"irregular-spacing\": \"violation\",\n // Interaction — gotcha-primary: Figma cannot encode \"what happens on\n // click\" or \"which states exist\" in a way downstream code generation can\n // consume. Rules fire to trigger the annotation, not to flag a violation.\n \"missing-interaction-state\": \"info-collection\",\n \"missing-prototype\": \"info-collection\",\n // Semantic\n \"non-standard-naming\": \"violation\",\n \"non-semantic-name\": \"violation\",\n \"inconsistent-naming-convention\": \"violation\",\n};\n\n/**\n * Resolve a rule's purpose. Accepts `string` (not `RuleId`) because the\n * purpose concept must work for out-of-tree custom rules added via the\n * config loader — callers pass `issue.violation.ruleId` which is a plain\n * string. Defaults to `\"violation\"` for unknown ids. Keeping the cast\n * inside this helper (rather than forcing every caller to do `as RuleId`)\n * makes the fallback semantically honest.\n */\nexport function getRulePurpose(ruleId: string): RulePurpose {\n return RULE_PURPOSE[ruleId as RuleId] ?? \"violation\";\n}\n\n/**\n * Central configuration for all rules.\n * Scores based on ablation experiment + AI implementation interview (#200):\n * - pixel-critical: -10 ~ -7 (layout strip caused ΔV +5.4%)\n * - responsive-critical: -8 ~ -6 (size-constraints ΔV +15.9% at responsive viewports)\n * - code-quality: -7 ~ -3 (CSS classes -8~15, no pixel impact)\n * - token-management: -5 ~ -4 (wrong input = wrong output, irregular spacing actively causes errors)\n * - interaction: -1 (uncalibrated — no metric to validate, kept minimal #210)\n * - semantic: -4 ~ -1 (non-semantic-name upgraded per interview — causes actual implementation errors)\n *\n * Category weights removed (#196) — overall score is simple average of categories.\n */\nexport const RULE_CONFIGS: Record<RuleId, RuleConfig> = {\n // ── Pixel Critical ──\n \"no-auto-layout\": {\n severity: \"blocking\",\n score: -10,\n depthWeight: 1.5,\n enabled: true,\n },\n \"absolute-position-in-auto-layout\": {\n severity: \"blocking\",\n score: -7,\n depthWeight: 1.3,\n enabled: true,\n },\n \"non-layout-container\": {\n severity: \"blocking\",\n score: -8,\n depthWeight: 1.2,\n enabled: true,\n },\n\n // ── Responsive Critical ──\n \"fixed-size-in-auto-layout\": {\n severity: \"risk\",\n score: -6,\n enabled: true,\n },\n \"missing-size-constraint\": {\n // #403: severity downgraded `risk → missing-info` and score from\n // -8 → -1 to match the new info-collection purpose. Keeping the\n // rule enabled (not disabled) so its gotchas still surface in the\n // survey — see RULE_PURPOSE entry above for the full rationale.\n severity: \"missing-info\",\n score: -1,\n enabled: true,\n },\n\n // ── Code Quality ──\n \"missing-component\": {\n severity: \"risk\",\n score: -7,\n enabled: true,\n options: {\n minRepetitions: 2,\n structureMinRepetitions: 2,\n maxFingerprintDepth: 3,\n },\n },\n \"detached-instance\": {\n severity: \"risk\",\n score: -4,\n enabled: true,\n },\n \"variant-structure-mismatch\": {\n severity: \"risk\",\n score: -6,\n enabled: true,\n },\n \"deep-nesting\": {\n severity: \"risk\",\n score: -3,\n enabled: true,\n options: {\n maxDepth: 5,\n },\n },\n\n // ── Token Management ──\n \"raw-value\": {\n severity: \"missing-info\",\n score: -4,\n enabled: true,\n },\n \"irregular-spacing\": {\n severity: \"risk\",\n score: -5,\n enabled: true,\n options: {\n gridBase: 2,\n },\n },\n\n // ── Interaction ──\n // #406: both rules are `info-collection` — primary output is the gotcha\n // annotation, not the score. Severity is `missing-info` so they surface in\n // the gotcha survey (see `generateGotchaSurvey`) even though the penalty\n // is minimal. Score stays at -1 so re-enabling `missing-prototype` on\n // fixtures that lack `interactionDestinations` (#139) cannot swing grades.\n \"missing-interaction-state\": {\n severity: \"missing-info\",\n score: -1, // uncalibrated: no metric to validate score (#210), kept at -1 to preserve category visibility\n enabled: true,\n },\n \"missing-prototype\": {\n severity: \"missing-info\",\n score: -1, // #406: info-collection — annotation is primary output; score kept minimal so #139 fixtures don't skew calibration\n enabled: true,\n },\n\n // ── Semantic ──\n \"non-standard-naming\": {\n severity: \"suggestion\",\n score: -3, // higher than other naming rules: non-standard state names break interaction detection pipeline\n enabled: true,\n },\n \"non-semantic-name\": {\n severity: \"risk\",\n score: -4,\n enabled: true,\n },\n \"inconsistent-naming-convention\": {\n severity: \"suggestion\",\n score: -1,\n enabled: true,\n },\n};\n\n/**\n * Preset types for different analysis modes\n */\nexport type Preset = \"relaxed\" | \"dev-friendly\" | \"ai-ready\" | \"strict\";\n\n/**\n * Get rule configs with preset applied\n */\nexport function getConfigsWithPreset(\n preset: Preset\n): Record<RuleId, RuleConfig> {\n const configs = { ...RULE_CONFIGS };\n\n switch (preset) {\n case \"relaxed\":\n // Disable blocking rules, reduce scores\n for (const [id, config] of Object.entries(configs)) {\n if (config.severity === \"blocking\") {\n configs[id as RuleId] = {\n ...config,\n severity: \"risk\",\n score: Math.round(config.score * 0.5),\n };\n }\n }\n break;\n\n case \"dev-friendly\":\n // Focus on pixel-critical and responsive-critical issues\n for (const [id, config] of Object.entries(configs)) {\n const ruleId = id as RuleId;\n const category = RULE_ID_CATEGORY[ruleId];\n if (category !== \"pixel-critical\" && category !== \"responsive-critical\") {\n configs[ruleId] = { ...config, enabled: false };\n }\n }\n break;\n\n case \"ai-ready\":\n // Boost pixel-critical and token-management rules\n for (const [id, config] of Object.entries(configs)) {\n const ruleId = id as RuleId;\n const category = RULE_ID_CATEGORY[ruleId];\n if (category === \"pixel-critical\" || category === \"token-management\") {\n configs[ruleId] = {\n ...config,\n score: Math.round(config.score * 1.5),\n };\n }\n }\n break;\n\n case \"strict\":\n // Increase scores but respect disabled rules\n for (const [id, config] of Object.entries(configs)) {\n configs[id as RuleId] = {\n ...config,\n score: Math.round(config.score * 1.5),\n };\n }\n break;\n }\n\n return configs;\n}\n\n/**\n * Per-rule annotation `properties` hints surfaced in Dev Mode. Kept as a\n * sibling map rather than a field on `RuleConfig` so the existing\n * `RuleConfigSchema` Zod contract and preset helpers stay untouched.\n *\n * `bySubType` takes precedence over `default` — mirrors the ruleId+subType\n * resolution pattern already used for `targetProperty` in apply-context.ts.\n * The Experiment 09 node-type matrix is enforced at write time by\n * `upsertCanicodeAnnotation`'s retry path, so hints can be passed\n * speculatively without server-side filtering.\n */\nexport const RULE_ANNOTATION_PROPERTIES: Partial<\n Record<\n RuleId,\n {\n default?: AnnotationProperty[];\n bySubType?: Record<string, AnnotationProperty[]>;\n }\n >\n> = {\n \"missing-size-constraint\": {\n // #403: width-only — the redesigned rule does not evaluate the\n // height axis (deferred follow-up). Emitting a `height` annotation\n // here would mark properties the rule never inspected and confuse\n // downstream Dev Mode hints.\n default: [{ type: \"width\" }],\n },\n \"irregular-spacing\": {\n bySubType: {\n gap: [{ type: \"itemSpacing\" }],\n padding: [{ type: \"padding\" }],\n },\n },\n \"fixed-size-in-auto-layout\": {\n default: [{ type: \"width\" }, { type: \"height\" }, { type: \"layoutMode\" }],\n },\n \"raw-value\": {\n bySubType: {\n color: [{ type: \"fills\" }],\n font: [\n { type: \"fontSize\" },\n { type: \"fontFamily\" },\n { type: \"fontWeight\" },\n { type: \"lineHeight\" },\n ],\n spacing: [{ type: \"itemSpacing\" }, { type: \"padding\" }],\n },\n },\n \"absolute-position-in-auto-layout\": {\n default: [{ type: \"layoutMode\" }],\n },\n};\n\n/**\n * Resolve the annotation `properties` hint for a ruleId (+ subType).\n * Returns `undefined` for rules with no entry.\n */\nexport function getAnnotationProperties(\n ruleId: RuleId,\n subType?: string\n): AnnotationProperty[] | undefined {\n const entry = RULE_ANNOTATION_PROPERTIES[ruleId];\n if (!entry) return undefined;\n if (subType !== undefined && entry.bySubType) {\n const match = entry.bySubType[subType];\n if (match) return match;\n }\n return entry.default;\n}\n\n/**\n * Get option value for a rule with type safety\n */\nexport function getRuleOption<T>(\n ruleId: RuleId,\n optionKey: string,\n defaultValue: T\n): T {\n const config = RULE_CONFIGS[ruleId];\n if (!config.options) return defaultValue;\n const value = config.options[optionKey];\n return (value as T) ?? defaultValue;\n}\n","import type { Rule, RuleConfig, RuleId } from \"../contracts/rule.js\";\nimport type { Category } from \"../contracts/category.js\";\nimport { RULE_CONFIGS } from \"./rule-config.js\";\n\n/**\n * Registry for all rules\n */\nclass RuleRegistry {\n private rules: Map<RuleId, Rule> = new Map();\n\n /**\n * Register a rule\n */\n register(rule: Rule): void {\n this.rules.set(rule.definition.id as RuleId, rule);\n }\n\n /**\n * Remove a rule by ID. Primarily used by tests that register a\n * throwaway rule and need to restore the registry afterwards. Returns\n * `true` if the rule was present.\n */\n unregister(id: RuleId): boolean {\n return this.rules.delete(id);\n }\n\n /**\n * Get a rule by ID\n */\n get(id: RuleId): Rule | undefined {\n return this.rules.get(id);\n }\n\n /**\n * Get all registered rules\n */\n getAll(): Rule[] {\n return Array.from(this.rules.values());\n }\n\n /**\n * Get rules by category\n */\n getByCategory(category: Category): Rule[] {\n return this.getAll().filter((rule) => rule.definition.category === category);\n }\n\n /**\n * Get enabled rules with their configs\n */\n getEnabled(configs: Record<RuleId, RuleConfig> = RULE_CONFIGS): Rule[] {\n return this.getAll().filter((rule) => {\n const config = configs[rule.definition.id as RuleId];\n return config?.enabled ?? true;\n });\n }\n\n /**\n * Get config for a rule\n */\n getConfig(\n id: RuleId,\n configs: Record<RuleId, RuleConfig> = RULE_CONFIGS\n ): RuleConfig {\n return configs[id];\n }\n\n /**\n * Check if a rule is registered\n */\n has(id: RuleId): boolean {\n return this.rules.has(id);\n }\n\n /**\n * Get count of registered rules\n */\n get size(): number {\n return this.rules.size;\n }\n}\n\n/**\n * Global rule registry instance\n */\nexport const ruleRegistry = new RuleRegistry();\n\n/**\n * Helper to create and register a rule\n */\nexport function defineRule(rule: Rule): Rule {\n ruleRegistry.register(rule);\n return rule;\n}\n","import { z } from \"zod\";\n\n/**\n * Acknowledgment marker — surfaced from a Figma Dev Mode annotation that\n * canicode itself wrote during a roundtrip. When the analysis pipeline\n * receives a list of acknowledgments, matching `(nodeId, ruleId)` issues are\n * flagged `acknowledged: true` and contribute half their normal weight to\n * the density score (#371).\n *\n * This contract is consumed by:\n * - The MCP `analyze` tool (`acknowledgments?: Acknowledgment[]` input)\n * - The CLI `analyze --acknowledgments <path>` flag\n * - `RuleEngineOptions.acknowledgments`\n *\n * It is produced by the Plugin-API helper\n * `extractAcknowledgmentsFromNode` / `readCanicodeAcknowledgments`\n * (see `src/core/roundtrip/read-acknowledgments.ts`).\n *\n * ADR-019 / #444: optional `intent`, `sceneWriteOutcome`, and `codegenDirective`\n * are read from a fenced canicode-json block when present; legacy annotations\n * omit them and remain valid for density scoring.\n */\nexport const AcknowledgmentIntentSchema = z.object({\n field: z.string(),\n value: z.unknown(),\n scope: z.enum([\"instance\", \"definition\"]),\n});\n\nexport type AcknowledgmentIntent = z.infer<typeof AcknowledgmentIntentSchema>;\n\nexport const AcknowledgmentSceneWriteOutcomeSchema = z.object({\n result: z.enum([\n \"succeeded\",\n \"silent-ignored\",\n \"api-rejected\",\n \"user-declined-propagation\",\n \"unknown\",\n ]),\n reason: z.string().optional(),\n});\n\nexport type AcknowledgmentSceneWriteOutcome = z.infer<\n typeof AcknowledgmentSceneWriteOutcomeSchema\n>;\n\nexport const AcknowledgmentSchema = z.object({\n nodeId: z.string(),\n ruleId: z.string(),\n intent: AcknowledgmentIntentSchema.optional(),\n sceneWriteOutcome: AcknowledgmentSceneWriteOutcomeSchema.optional(),\n codegenDirective: z.string().optional(),\n});\n\nexport type Acknowledgment = z.infer<typeof AcknowledgmentSchema>;\n\nexport const AcknowledgmentListSchema = z.array(AcknowledgmentSchema);\n\n/**\n * Normalize a Figma node id into `:`-separated form so callers can pass\n * either URL-style (`123-456`) or Plugin-API-style (`123:456`) ids and the\n * engine matches them consistently. Non-instance ids stay unchanged; the\n * `I…;…` instance-child format keeps its semicolon — only `-` → `:`\n * happens.\n */\nexport function normalizeNodeId(id: string): string {\n return id.replace(/-/g, \":\");\n}\n","import type { AnalysisFile, AnalysisNode } from \"../contracts/figma-node.js\";\nimport type {\n Rule,\n RuleConfig,\n RuleContext,\n RuleId,\n RuleViolation,\n} from \"../contracts/rule.js\";\nimport { supportsDepthWeight } from \"../contracts/rule.js\";\nimport { ruleRegistry } from \"../rules/rule-registry.js\";\nimport { RULE_CONFIGS } from \"../rules/rule-config.js\";\nimport {\n normalizeNodeId,\n type Acknowledgment,\n} from \"../contracts/acknowledgment.js\";\nimport {\n detectAnalysisScope,\n type AnalysisScope,\n} from \"../contracts/analysis-scope.js\";\n\n/**\n * Analysis issue with calculated score and metadata.\n *\n * `acknowledged` (#371) — set when the analysis engine receives an\n * `acknowledgments` list (typically read from canicode-authored Figma\n * annotations) whose `(nodeId, ruleId)` matches this issue. Acknowledged\n * issues still surface in the result (so code-gen retains the context) but\n * contribute half their normal weight to the density score, so the grade\n * reflects \"the designer has a plan for this\" instead of treating the rule\n * as fully unaddressed.\n */\nexport interface AnalysisIssue {\n violation: RuleViolation;\n rule: Rule;\n config: RuleConfig;\n depth: number;\n maxDepth: number;\n calculatedScore: number;\n acknowledged?: boolean;\n}\n\n/**\n * Information about a rule that threw during analysis\n */\nexport interface RuleFailure {\n ruleId: string;\n nodeName: string;\n nodeId: string;\n error: string;\n}\n\n/**\n * Analysis result from the rule engine\n */\nexport interface AnalysisResult {\n file: AnalysisFile;\n issues: AnalysisIssue[];\n failedRules: RuleFailure[];\n maxDepth: number;\n nodeCount: number;\n analyzedAt: string;\n /**\n * #404: Resolved analysis scope (`page` vs `component`). Either detected\n * from the root node type or taken from the caller's explicit override.\n * Propagated to MCP / JSON output so downstream consumers (code-gen,\n * reports) can branch the same way rules do.\n */\n scope: AnalysisScope;\n}\n\n/**\n * Options for the rule engine\n */\nexport interface RuleEngineOptions {\n configs?: Record<RuleId, RuleConfig>;\n enabledRules?: RuleId[];\n disabledRules?: RuleId[];\n targetNodeId?: string;\n excludeNodeNames?: string[];\n excludeNodeTypes?: string[];\n /**\n * `(nodeId, ruleId)` pairs sourced from canicode-authored Figma annotations\n * (#371). Issues whose violation matches an entry are flagged\n * `acknowledged: true` and contribute half their normal weight to the\n * density score in `calculateScores`. nodeId may be passed in URL form\n * (`123-456`) or Plugin-API form (`123:456`) — both normalize to `:`.\n */\n acknowledgments?: Acknowledgment[];\n /**\n * #404: Explicit scope override. When omitted, the engine auto-detects\n * from the analysis root's node type via `detectAnalysisScope`. Supply\n * this when the caller knows the heuristic would mis-detect — e.g. a\n * FRAME that happens to be a design-system demo (component scope) or a\n * COMPONENT_SET being audited as part of a full page inventory (page\n * scope).\n */\n scope?: AnalysisScope;\n}\n\n/**\n * Calculate the maximum depth of a node tree\n */\nfunction calculateMaxDepth(node: AnalysisNode, currentDepth = 0): number {\n if (!node.children || node.children.length === 0) {\n return currentDepth;\n }\n\n let maxChildDepth = currentDepth;\n for (const child of node.children) {\n const childDepth = calculateMaxDepth(child, currentDepth + 1);\n if (childDepth > maxChildDepth) {\n maxChildDepth = childDepth;\n }\n }\n\n return maxChildDepth;\n}\n\n/**\n * Count total nodes in a tree\n */\nfunction countNodes(node: AnalysisNode): number {\n let count = 1;\n if (node.children) {\n for (const child of node.children) {\n count += countNodes(child);\n }\n }\n return count;\n}\n\n/**\n * Find a node by ID in the tree\n */\nfunction findNodeById(node: AnalysisNode, nodeId: string): AnalysisNode | null {\n // Figma node IDs use \":\" separator, URL uses \"-\"\n const normalizedId = nodeId.replace(/-/g, \":\");\n\n if (node.id === normalizedId) {\n return node;\n }\n\n if (node.children) {\n for (const child of node.children) {\n const found = findNodeById(child, nodeId);\n if (found) return found;\n }\n }\n\n return null;\n}\n\n/**\n * Calculate depth weight multiplier for a rule\n * Higher values (closer to 1.5x) at root level, 1.0x at leaf level\n */\nfunction calcDepthWeight(\n depth: number,\n maxDepth: number,\n depthWeight?: number\n): number {\n if (!depthWeight || depthWeight <= 1) return 1;\n if (maxDepth === 0) return depthWeight;\n\n // Linear interpolation: depthWeight at depth 0, 1.0 at maxDepth\n const ratio = depth / maxDepth;\n return depthWeight - (depthWeight - 1) * ratio;\n}\n\n/**\n * Rule engine for analyzing Figma files\n */\nexport class RuleEngine {\n private configs: Record<RuleId, RuleConfig>;\n private enabledRuleIds: Set<RuleId> | null;\n private disabledRuleIds: Set<RuleId>;\n private targetNodeId: string | undefined;\n private excludeNamePattern: RegExp | null;\n private excludeNodeTypes: Set<string> | null;\n private acknowledgments: ReadonlySet<string>;\n private scopeOverride: AnalysisScope | undefined;\n\n constructor(options: RuleEngineOptions = {}) {\n this.configs = options.configs ?? RULE_CONFIGS;\n this.enabledRuleIds = options.enabledRules\n ? new Set(options.enabledRules)\n : null;\n this.disabledRuleIds = new Set(options.disabledRules ?? []);\n this.targetNodeId = options.targetNodeId;\n this.excludeNamePattern = options.excludeNodeNames && options.excludeNodeNames.length > 0\n ? new RegExp(`\\\\b(${options.excludeNodeNames.join(\"|\")})\\\\b`, \"i\")\n : null;\n this.excludeNodeTypes = options.excludeNodeTypes && options.excludeNodeTypes.length > 0\n ? new Set(options.excludeNodeTypes)\n : null;\n this.acknowledgments = new Set(\n (options.acknowledgments ?? []).map(\n (a) => `${normalizeNodeId(a.nodeId)}::${a.ruleId}`\n )\n );\n this.scopeOverride = options.scope;\n }\n\n /**\n * Analyze a Figma file and return issues\n */\n analyze(file: AnalysisFile): AnalysisResult {\n // Fresh per-analysis state — eliminates module-level mutable state in rules\n const analysisState = new Map<string, unknown>();\n\n // Find target node if specified\n let rootNode = file.document;\n if (this.targetNodeId) {\n const targetNode = findNodeById(file.document, this.targetNodeId);\n if (!targetNode) {\n throw new Error(`Node not found: ${this.targetNodeId}`);\n }\n rootNode = targetNode;\n }\n\n // Calculate max depth before analysis\n const maxDepth = calculateMaxDepth(rootNode);\n const nodeCount = countNodes(rootNode);\n\n // #404: resolve scope once per analysis. Caller override wins over\n // type-based detection so CLI/MCP users can correct false positives\n // (e.g. design-system demo frames classified as page scope).\n const scope: AnalysisScope =\n this.scopeOverride ?? detectAnalysisScope(rootNode);\n\n // #403: capture root node type as a separate axis from `scope`. Rules\n // that branch on whether a component-scope root is the component\n // itself vs an INSTANCE of one need this even when `scope` already\n // resolves to \"component\". Captured once here, threaded read-only\n // through every `RuleContext` in this analysis.\n const rootNodeType = rootNode.type;\n\n const issues: AnalysisIssue[] = [];\n const failedRules: RuleFailure[] = [];\n const enabledRules = this.getEnabledRules();\n\n // Traverse the tree and run rules on each node\n this.traverseAndCheck(\n rootNode,\n file,\n enabledRules,\n maxDepth,\n issues,\n failedRules,\n 0,\n [],\n [],\n 0,\n analysisState,\n scope,\n rootNodeType,\n undefined,\n undefined\n );\n\n if (this.acknowledgments.size > 0) {\n for (const issue of issues) {\n const key = `${normalizeNodeId(issue.violation.nodeId)}::${issue.violation.ruleId}`;\n if (this.acknowledgments.has(key)) {\n issue.acknowledged = true;\n }\n }\n }\n\n return {\n file,\n issues,\n failedRules,\n maxDepth,\n nodeCount,\n analyzedAt: new Date().toISOString(),\n scope,\n };\n }\n\n /**\n * Get rules that should be run based on configuration\n */\n private getEnabledRules(): Rule[] {\n return ruleRegistry.getAll().filter((rule) => {\n const ruleId = rule.definition.id as RuleId;\n\n // Check if explicitly disabled\n if (this.disabledRuleIds.has(ruleId)) return false;\n\n // Check if we have an explicit enable list\n if (this.enabledRuleIds && !this.enabledRuleIds.has(ruleId)) return false;\n\n // Check config enabled status\n const config = this.configs[ruleId];\n return config?.enabled ?? true;\n });\n }\n\n /**\n * Recursively traverse the tree and run rules\n */\n private traverseAndCheck(\n node: AnalysisNode,\n file: AnalysisFile,\n rules: Rule[],\n maxDepth: number,\n issues: AnalysisIssue[],\n failedRules: RuleFailure[],\n depth: number,\n path: string[],\n ancestorTypes: string[],\n componentDepth: number,\n analysisState: Map<string, unknown>,\n scope: AnalysisScope,\n rootNodeType: string,\n parent?: AnalysisNode,\n siblings?: AnalysisNode[]\n ): void {\n const nodePath = [...path, node.name];\n\n // Reset componentDepth at component boundaries\n const isComponentBoundary = node.type === \"COMPONENT\" || node.type === \"COMPONENT_SET\" || node.type === \"INSTANCE\";\n const currentComponentDepth = isComponentBoundary ? 0 : componentDepth;\n\n // Skip nodes matching excluded types or name patterns\n if (this.excludeNodeTypes && this.excludeNodeTypes.has(node.type)) {\n return;\n }\n if (this.excludeNamePattern && this.excludeNamePattern.test(node.name)) {\n return;\n }\n\n // Build context for this node\n const context: RuleContext = {\n file,\n parent,\n depth,\n componentDepth: currentComponentDepth,\n maxDepth,\n path: nodePath,\n ancestorTypes,\n siblings,\n analysisState,\n scope,\n rootNodeType,\n };\n\n // Run each rule on this node\n for (const rule of rules) {\n const ruleId = rule.definition.id as RuleId;\n const config = this.configs[ruleId];\n const options = config?.options;\n\n try {\n const violation = rule.check(node, context, options);\n\n if (violation) {\n // Calculate score with depth weight if applicable\n let calculatedScore = config.score;\n\n if (\n supportsDepthWeight(rule.definition.category) &&\n config.depthWeight\n ) {\n const weight = calcDepthWeight(depth, maxDepth, config.depthWeight);\n calculatedScore = Math.round(config.score * weight);\n }\n\n issues.push({\n violation,\n rule,\n config,\n depth,\n maxDepth,\n calculatedScore,\n });\n }\n } catch (error) {\n // Track failure and continue — never let one rule break the whole analysis\n failedRules.push({\n ruleId,\n nodeName: node.name,\n nodeId: node.id,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n // Recurse into children\n if (node.children && node.children.length > 0) {\n const childAncestorTypes = [...ancestorTypes, node.type];\n for (const child of node.children) {\n this.traverseAndCheck(\n child,\n file,\n rules,\n maxDepth,\n issues,\n failedRules,\n depth + 1,\n nodePath,\n childAncestorTypes,\n currentComponentDepth + 1,\n analysisState,\n scope,\n rootNodeType,\n node,\n node.children\n );\n }\n }\n }\n}\n\n/**\n * Create a rule engine with default configuration\n */\nexport function createRuleEngine(options?: RuleEngineOptions): RuleEngine {\n return new RuleEngine(options);\n}\n\n/**\n * Convenience function to analyze a file with default settings\n */\nexport function analyzeFile(\n file: AnalysisFile,\n options?: RuleEngineOptions\n): AnalysisResult {\n const engine = createRuleEngine(options);\n return engine.analyze(file);\n}\n","/**\n * Parse Figma instance-child node IDs.\n *\n * Nodes inside an instance carry an `I`-prefixed id with semicolon-separated\n * path segments: `I<parentInstanceId>;<sourceNodeId>`. For nested instances\n * the format chains further, e.g. `I<parentId>;<midId>;<sourceNodeId>` —\n * each `;` represents one additional level of instance expansion. The LAST\n * segment is always the id of the node inside the innermost source component,\n * which is reachable directly via `figma.getNodeById`.\n *\n * Siblings: `figma-url-parser.ts#toCommentableNodeId` handles the same id\n * format for a different purpose (stripping for the Comments API). That\n * helper is intentionally left alone — this module owns id parsing for the\n * apply pipeline.\n */\n\nexport interface InstanceChildIdParts {\n parentInstanceId: string;\n sourceNodeId: string;\n}\n\nexport function isInstanceChildNodeId(nodeId: string): boolean {\n return nodeId.startsWith(\"I\") && nodeId.includes(\";\");\n}\n\nexport function parseInstanceChildNodeId(\n nodeId: string,\n): InstanceChildIdParts | null {\n if (!isInstanceChildNodeId(nodeId)) return null;\n\n const segments = nodeId.split(\";\");\n if (segments.length < 2) return null;\n\n const parentInstanceId = segments[0]!.replace(/^I/, \"\");\n const sourceNodeId = segments[segments.length - 1]!;\n\n if (!parentInstanceId || !sourceNodeId) return null;\n\n return { parentInstanceId, sourceNodeId };\n}\n","import type { RuleId, RuleViolation } from \"../contracts/rule.js\";\nimport type { InstanceContext } from \"../contracts/gotcha-survey.js\";\nimport type { AnnotationProperty } from \"../roundtrip/types.js\";\nimport {\n isInstanceChildNodeId,\n parseInstanceChildNodeId,\n} from \"../adapters/instance-id-parser.js\";\nimport { getAnnotationProperties } from \"../rules/rule-config.js\";\n\n/**\n * Apply strategy for a rule violation. Tells the SKILL.md/`use_figma`\n * pipeline which Plugin-API path to take.\n *\n * - `property-mod` — Strategy A. Direct property write on the scene/instance node.\n * - `structural-mod` — Strategy B. Structural change; ask user to confirm before applying.\n * - `annotation` — Strategy C. Cannot be auto-fixed; record as a Figma annotation.\n * - `auto-fix` — Strategy D. Lower-severity rules from analyze output;\n * may be a property write (naming) or annotation-only.\n *\n * Sibling module `resolve-apply-target.ts` solves a different concern\n * (scene-vs-definition write target). Compose them — do not merge.\n */\nexport type RuleApplyStrategy =\n | \"property-mod\"\n | \"structural-mod\"\n | \"annotation\"\n | \"auto-fix\";\n\n/**\n * Pre-computed apply context attached to gotcha-survey questions and\n * analyze-output issues. Lets the SKILL.md consume the data directly\n * instead of re-deriving rule routing on every roundtrip run.\n *\n * `targetProperty` is `string` for single-property writes, `string[]`\n * for rules that require multiple writes (e.g. `irregular-spacing`\n * subType `padding` → 4 padding fields), and `undefined` for\n * annotation/structural strategies that have no single property target.\n */\nexport interface ApplyContext {\n applyStrategy: RuleApplyStrategy;\n targetProperty?: string | string[];\n annotationProperties?: AnnotationProperty[];\n isInstanceChild: boolean;\n sourceChildId?: string;\n}\n\nconst STRATEGY_BY_RULE: Record<RuleId, RuleApplyStrategy> = {\n // Strategy A — property modification\n \"no-auto-layout\": \"property-mod\",\n \"fixed-size-in-auto-layout\": \"property-mod\",\n \"missing-size-constraint\": \"property-mod\",\n \"irregular-spacing\": \"property-mod\",\n \"non-semantic-name\": \"property-mod\",\n // Strategy B — structural modification (needs user confirmation)\n \"non-layout-container\": \"structural-mod\",\n \"deep-nesting\": \"structural-mod\",\n \"missing-component\": \"structural-mod\",\n \"detached-instance\": \"structural-mod\",\n // Strategy C — annotation only\n \"absolute-position-in-auto-layout\": \"annotation\",\n \"variant-structure-mismatch\": \"annotation\",\n // Strategy D — auto-fix lower-severity issues from analyze output\n \"non-standard-naming\": \"auto-fix\",\n \"inconsistent-naming-convention\": \"auto-fix\",\n \"raw-value\": \"auto-fix\",\n \"missing-interaction-state\": \"auto-fix\",\n \"missing-prototype\": \"auto-fix\",\n};\n\n/**\n * Resolve the Figma Plugin-API target property (or properties) for a\n * violation. Returns `undefined` for rules whose strategy does not write\n * a single property (structural-mod, annotation), or for naming auto-fixes\n * where the value comes from `violation.suggestedName` rather than a\n * specific Figma property — except the `name` write itself, which we\n * surface so SKILL.md can branch uniformly on `targetProperty === 'name'`.\n */\nfunction resolveTargetProperty(\n ruleId: RuleId,\n subType: string | undefined,\n): string | string[] | undefined {\n switch (ruleId) {\n case \"no-auto-layout\":\n return [\"layoutMode\", \"itemSpacing\"];\n case \"fixed-size-in-auto-layout\":\n if (subType === \"horizontal\") return \"layoutSizingHorizontal\";\n // both-axes — write both axes\n return [\"layoutSizingHorizontal\", \"layoutSizingVertical\"];\n case \"missing-size-constraint\":\n // #374: always return BOTH bounds so `applyPropertyMod`'s array branch\n // iterates the full `{ minWidth, maxWidth }` answer shape. Pre-fix the\n // `wrap` subType returned `\"minWidth\"` and `max-width` returned\n // `\"maxWidth\"` as single strings — the user typically answered with\n // both keys (the gotcha hint asks for both) and the apply step\n // silently dropped half the intent because it only iterated the one\n // property in `targetProperty`. Partial answers still work: the per-\n // property lookup in `applyPropertyMod` returns `undefined` for the\n // missing key and the helper skips it.\n return [\"minWidth\", \"maxWidth\"];\n case \"irregular-spacing\":\n if (subType === \"gap\") return \"itemSpacing\";\n // padding — all four padding fields\n return [\"paddingTop\", \"paddingRight\", \"paddingBottom\", \"paddingLeft\"];\n case \"non-semantic-name\":\n return \"name\";\n case \"non-layout-container\":\n return \"layoutMode\";\n case \"non-standard-naming\":\n case \"inconsistent-naming-convention\":\n return \"name\";\n case \"deep-nesting\":\n case \"missing-component\":\n case \"detached-instance\":\n case \"absolute-position-in-auto-layout\":\n case \"variant-structure-mismatch\":\n case \"raw-value\":\n case \"missing-interaction-state\":\n case \"missing-prototype\":\n return undefined;\n }\n}\n\n/**\n * Compute the deterministic apply context for a rule violation.\n *\n * - `applyStrategy` and `targetProperty` come from the ruleId/subType tables above.\n * - `isInstanceChild` and `sourceChildId` are parsed from the violation `nodeId`\n * via `parseInstanceChildNodeId` — single source of truth for `I...;...` ids.\n * - `instanceContext`, when supplied, takes precedence for `sourceChildId` so\n * callers that already resolved the source component (gotcha-survey) do not\n * re-parse the id.\n *\n * Strategy D rules that target scene nodes (analyze output) can pass\n * `instanceContext: undefined` — the function still returns the parsed\n * `isInstanceChild`/`sourceChildId` so SKILL.md knows whether to walk the\n * instance fallback.\n */\nexport function computeApplyContext(\n violation: Pick<RuleViolation, \"ruleId\" | \"subType\" | \"nodeId\">,\n instanceContext?: InstanceContext,\n): ApplyContext {\n const ruleId = violation.ruleId as RuleId;\n const applyStrategy = STRATEGY_BY_RULE[ruleId] ?? \"annotation\";\n const targetProperty = resolveTargetProperty(ruleId, violation.subType);\n const annotationProperties = getAnnotationProperties(\n ruleId,\n violation.subType,\n );\n\n const parsed = parseInstanceChildNodeId(violation.nodeId);\n const isInstanceChild =\n parsed !== null || isInstanceChildNodeId(violation.nodeId);\n const sourceChildId = instanceContext?.sourceNodeId ?? parsed?.sourceNodeId;\n\n return {\n applyStrategy,\n ...(targetProperty !== undefined ? { targetProperty } : {}),\n ...(annotationProperties !== undefined ? { annotationProperties } : {}),\n isInstanceChild,\n ...(sourceChildId !== undefined ? { sourceChildId } : {}),\n };\n}\n","import type { Category } from \"../contracts/category.js\";\nimport { CATEGORIES, CATEGORY_LABELS } from \"../contracts/category.js\";\nimport type { RuleId, RuleConfig } from \"../contracts/rule.js\";\nimport type { Severity } from \"../contracts/severity.js\";\nimport type { AnalysisResult } from \"./rule-engine.js\";\nimport { RULE_CONFIGS, RULE_ID_CATEGORY, getRulePurpose } from \"../rules/rule-config.js\";\nimport { computeApplyContext } from \"../gotcha/apply-context.js\";\nimport { version as VERSION } from \"../../../package.json\";\n\n/**\n * Score breakdown for a single category\n */\nexport interface CategoryScoreResult {\n category: Category;\n score: number;\n maxScore: number;\n percentage: number;\n issueCount: number;\n uniqueRuleCount: number;\n weightedIssueCount: number;\n densityScore: number;\n diversityScore: number;\n bySeverity: Record<Severity, number>;\n}\n\n/**\n * Overall score report\n */\nexport interface ScoreReport {\n overall: {\n score: number;\n maxScore: number;\n percentage: number;\n grade: Grade;\n };\n byCategory: Record<Category, CategoryScoreResult>;\n summary: {\n totalIssues: number;\n blocking: number;\n risk: number;\n missingInfo: number;\n suggestion: number;\n nodeCount: number;\n /**\n * Number of issues marked `acknowledged` by an upstream\n * acknowledgments list (#371). Acknowledged issues are still counted in\n * `totalIssues` and the per-severity tallies — the count here is purely\n * additive context so consumers can render\n * `N issues — A acknowledged / N-A unaddressed`. They contribute half\n * weight to the density score upstream.\n */\n acknowledgedCount: number;\n };\n}\n\n/**\n * Grade levels based on percentage\n */\nexport type Grade = \"S\" | \"A+\" | \"A\" | \"B+\" | \"B\" | \"C+\" | \"C\" | \"D\" | \"F\";\n\n/**\n * Density weighting uses per-rule base |score| with sqrt damping (#226).\n *\n * Previously, each issue's |calculatedScore| was summed linearly — a rule\n * triggering N times contributed N× its score. This over-penalized designs\n * with many instances of the same issue (e.g., raw-value ×79 = -316 weight),\n * causing most real files to score Grade D/F with no differentiation.\n *\n * Now: same rule triggered N times contributes |score| × sqrt(N).\n * raw-value ×79 = 4 × sqrt(79) ≈ 36 instead of 316.\n * At low counts sqrt ≈ linear (sqrt(1)=1, sqrt(4)=2), preserving sensitivity.\n * At high counts the curve flattens — 79th occurrence adds ~0.2 vs 1st adding 4.\n *\n * Category weights removed (#196) — overall score is simple average of categories.\n * Category importance is already encoded in rule scores (pixel-critical -10\n * vs semantic -4), so per-category weighting is unnecessary.\n */\n\n/**\n * Compute sum of |score| for all rules in each category from a given config map.\n * Used as denominator for severity-weighted diversity scoring.\n * Must use the same preset-adjusted config map that produced the analysis issues,\n * otherwise diversity ratios will be incorrect.\n */\nfunction computeTotalScorePerCategory(\n configs: Record<RuleId, RuleConfig>\n): Record<Category, number> {\n const totals = Object.fromEntries(\n CATEGORIES.map(c => [c, 0])\n ) as Record<Category, number>;\n\n for (const [id, config] of Object.entries(configs)) {\n const category = RULE_ID_CATEGORY[id as RuleId];\n if (category && config.enabled) {\n totals[category] += Math.abs(config.score);\n }\n }\n\n return totals;\n}\n\n/**\n * Score composition weights (initial intuition, pending calibration validation).\n *\n * Density (0.7): \"how many issues per node\" — measures issue volume relative to design size.\n * Designs with many issues per node are harder to implement accurately.\n *\n * Diversity (0.3): \"how many different rule types triggered\" — measures issue breadth.\n * A design that triggers 1 rule 50 times is easier to fix than one triggering 10 different rules.\n *\n * The 70:30 ratio prioritizes volume over variety. Rationale: a design with a single\n * systemic problem (e.g., all frames missing auto-layout) is still very hard to implement,\n * even though diversity is low. Density captures this; diversity adds a penalty for\n * designs with scattered, unrelated issues.\n *\n * Status: initial values. To be validated via /calibrate against visual-compare results.\n */\nconst DENSITY_WEIGHT = 0.7;\nconst DIVERSITY_WEIGHT = 0.3;\n\n/**\n * Minimum score floor.\n * Even the worst design gets 5% instead of 0%. Rationale: a score of 0 implies\n * \"completely unimplementable\", but any Figma file with visible nodes provides\n * some structural information. The floor also avoids demoralizing UX — seeing 0%\n * feels like the tool failed, not that the design needs improvement.\n */\nconst SCORE_FLOOR = 5;\n\n/**\n * Calculate grade from percentage.\n * Thresholds follow a 5-point interval pattern (95/90/85/80/75/70/65) with a wider\n * gap for D (50-64) and F (<50). This mirrors academic grading conventions where\n * the top tiers are tightly spaced and the failing range is broad.\n */\nfunction calculateGrade(percentage: number): Grade {\n if (percentage >= 95) return \"S\";\n if (percentage >= 90) return \"A+\";\n if (percentage >= 85) return \"A\";\n if (percentage >= 80) return \"B+\";\n if (percentage >= 75) return \"B\";\n if (percentage >= 70) return \"C+\";\n if (percentage >= 65) return \"C\";\n if (percentage >= 50) return \"D\";\n return \"F\";\n}\n\n/**\n * Returns true if the design is ready for code generation.\n * S, A+, and A grades (percentage >= 85) indicate the design has minimal blockers\n * and can be implemented accurately by AI or developers.\n */\nexport function isReadyForCodeGen(grade: Grade): boolean {\n return grade === \"S\" || grade === \"A+\" || grade === \"A\";\n}\n\n/**\n * Convert grade to a CSS-safe class name suffix\n * e.g. \"A+\" -> \"Aplus\", \"B+\" -> \"Bplus\", \"C+\" -> \"Cplus\"\n */\nexport function gradeToClassName(grade: Grade): string {\n return grade.replace(\"+\", \"plus\");\n}\n\n/**\n * Clamp a value between min and max\n */\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * Calculate scores from analysis result using density + diversity scoring\n *\n * Density Score = 100 - (weighted issue count / node count) * 100\n * Diversity Score = (1 - weighted triggered rule scores / total category scores) * 100\n * Final Score = density * 0.7 + diversity * 0.3\n *\n * @param result Analysis result with issues\n * @param configs Optional preset-adjusted config map used to produce the issues.\n * If not provided, diversity totals are reconstructed from issue.config values.\n */\nexport function calculateScores(\n result: AnalysisResult,\n configs?: Record<RuleId, RuleConfig>\n): ScoreReport {\n const categoryScores = initializeCategoryScores();\n const nodeCount = result.nodeCount;\n\n // Track unique rules and their base |score| per category\n const uniqueRulesPerCategory = new Map<Category, Set<string>>();\n const ruleScorePerCategory = new Map<Category, Map<string, number>>();\n // Track issue counts per rule per category for sqrt damping (#226)\n const ruleIssueCountPerCategory = new Map<Category, Map<string, number>>();\n for (const category of CATEGORIES) {\n uniqueRulesPerCategory.set(category, new Set());\n ruleScorePerCategory.set(category, new Map());\n ruleIssueCountPerCategory.set(category, new Map());\n }\n\n // Compute totals from the config map.\n // If configs provided: use preset-adjusted totals (recommended when using presets).\n // If not: fall back to static RULE_CONFIGS — only correct when issues were\n // produced with default RULE_CONFIGS, otherwise diversity ratios will be skewed.\n const totalScorePerCategory = computeTotalScorePerCategory(configs ?? RULE_CONFIGS);\n\n // Count issues by severity per category and track unique rules with scores\n for (const issue of result.issues) {\n const category = issue.rule.definition.category;\n const severity = issue.config.severity;\n const ruleId = issue.rule.definition.id;\n\n categoryScores[category].issueCount++;\n categoryScores[category].bySeverity[severity]++;\n uniqueRulesPerCategory.get(category)!.add(ruleId);\n ruleScorePerCategory.get(category)!.set(ruleId, Math.abs(issue.config.score));\n // Accumulate per-rule issue count using a per-issue weight: 1.0 for\n // unacknowledged issues, 0.5 for acknowledged ones (#371). The sqrt\n // damping below treats this sum as the \"occurrence count\" so the\n // half-weight flows through to density without changing the formula.\n // Diversity is left untouched — acknowledgment is per-issue, not\n // per-rule, and the rule still represents a kind of problem.\n const ruleCountMap = ruleIssueCountPerCategory.get(category)!;\n const weight = issue.acknowledged === true ? 0.5 : 1;\n ruleCountMap.set(ruleId, (ruleCountMap.get(ruleId) ?? 0) + weight);\n }\n\n // Compute weightedIssueCount with sqrt damping per rule (#226).\n // Same rule triggered N times contributes |score| × sqrt(N) instead of |score| × N.\n // Rationale: 79 raw-value issues represent one systemic problem, not 79× the difficulty.\n // First few occurrences identify the problem; subsequent ones have diminishing impact.\n // At low counts sqrt ≈ linear (sqrt(1)=1, sqrt(4)=2), preserving sensitivity for rare issues.\n for (const category of CATEGORIES) {\n const ruleCountMap = ruleIssueCountPerCategory.get(category)!;\n const ruleScoreMap = ruleScorePerCategory.get(category)!;\n let dampedWeight = 0;\n for (const [ruleId, count] of ruleCountMap) {\n const ruleScore = ruleScoreMap.get(ruleId) ?? 0;\n dampedWeight += ruleScore * Math.sqrt(count);\n }\n categoryScores[category].weightedIssueCount = dampedWeight;\n }\n\n // Calculate percentage for each category based on density + diversity\n for (const category of CATEGORIES) {\n const catScore = categoryScores[category];\n const uniqueRules = uniqueRulesPerCategory.get(category)!;\n\n catScore.uniqueRuleCount = uniqueRules.size;\n\n // Density score: lower density = higher score\n let densityScore = 100;\n if (nodeCount > 0 && catScore.issueCount > 0) {\n const density = catScore.weightedIssueCount / nodeCount;\n densityScore = clamp(Math.round(100 - density * 100), 0, 100);\n }\n catScore.densityScore = densityScore;\n\n // Diversity score: weighted by base rule |score| (config.score, not calculatedScore).\n // Uses base score intentionally — diversity measures \"what types of problems exist\",\n // not \"where they occur\". depthWeight affects density (volume penalty) but not diversity\n // (breadth penalty). A blocking rule (score -10) penalizes diversity more than a\n // suggestion (score -1), so low-severity-only designs correctly get high diversity scores.\n let diversityScore = 100;\n if (catScore.issueCount > 0) {\n const ruleScores = ruleScorePerCategory.get(category)!;\n const weightedTriggered = Array.from(ruleScores.values()).reduce((sum, s) => sum + s, 0);\n const weightedTotal = totalScorePerCategory[category];\n const diversityRatio = weightedTotal > 0 ? weightedTriggered / weightedTotal : 0;\n diversityScore = clamp(Math.round((1 - diversityRatio) * 100), 0, 100);\n }\n catScore.diversityScore = diversityScore;\n\n // Combined score with floor\n const combinedScore = densityScore * DENSITY_WEIGHT + diversityScore * DIVERSITY_WEIGHT;\n catScore.percentage = catScore.issueCount > 0\n ? clamp(Math.round(combinedScore), SCORE_FLOOR, 100)\n : 100;\n\n catScore.score = catScore.percentage;\n catScore.maxScore = 100;\n }\n\n // Calculate overall score as simple average of categories\n // Category importance is already encoded in rule scores (weight baked in),\n // so no per-category weighting is needed.\n let categorySum = 0;\n for (const category of CATEGORIES) {\n categorySum += categoryScores[category].percentage;\n }\n\n const overallPercentage = CATEGORIES.length > 0\n ? Math.round(categorySum / CATEGORIES.length)\n : 100;\n\n // Count issues by severity\n const summary = {\n totalIssues: result.issues.length,\n blocking: 0,\n risk: 0,\n missingInfo: 0,\n suggestion: 0,\n nodeCount,\n acknowledgedCount: 0,\n };\n\n for (const issue of result.issues) {\n switch (issue.config.severity) {\n case \"blocking\":\n summary.blocking++;\n break;\n case \"risk\":\n summary.risk++;\n break;\n case \"missing-info\":\n summary.missingInfo++;\n break;\n case \"suggestion\":\n summary.suggestion++;\n break;\n }\n if (issue.acknowledged === true) summary.acknowledgedCount++;\n }\n\n return {\n overall: {\n score: overallPercentage,\n maxScore: 100,\n percentage: overallPercentage,\n grade: calculateGrade(overallPercentage),\n },\n byCategory: categoryScores,\n summary,\n };\n}\n\n/**\n * Initialize empty category scores\n */\nfunction initializeCategoryScores(): Record<Category, CategoryScoreResult> {\n const scores: Partial<Record<Category, CategoryScoreResult>> = {};\n\n for (const category of CATEGORIES) {\n scores[category] = {\n category,\n score: 100,\n maxScore: 100,\n percentage: 100,\n issueCount: 0,\n uniqueRuleCount: 0,\n weightedIssueCount: 0,\n densityScore: 100,\n diversityScore: 100,\n bySeverity: {\n blocking: 0,\n risk: 0,\n \"missing-info\": 0,\n suggestion: 0,\n },\n };\n }\n\n return scores as Record<Category, CategoryScoreResult>;\n}\n\n/**\n * Format score report as a summary string\n */\nexport function formatScoreSummary(report: ScoreReport): string {\n const lines: string[] = [];\n\n lines.push(`Overall: ${report.overall.grade} (${report.overall.percentage}%)`);\n lines.push(\"\");\n lines.push(\"By Category:\");\n\n for (const category of CATEGORIES) {\n const cat = report.byCategory[category];\n lines.push(` ${category}: ${cat.percentage}% (${cat.issueCount} issues, ${cat.uniqueRuleCount} rules)`);\n }\n\n lines.push(\"\");\n lines.push(\"Issues:\");\n lines.push(` Blocking: ${report.summary.blocking}`);\n lines.push(` Risk: ${report.summary.risk}`);\n lines.push(` Missing Info: ${report.summary.missingInfo}`);\n lines.push(` Suggestion: ${report.summary.suggestion}`);\n if (report.summary.acknowledgedCount > 0) {\n const unaddressed =\n report.summary.totalIssues - report.summary.acknowledgedCount;\n lines.push(\n ` Total: ${report.summary.totalIssues} (${report.summary.acknowledgedCount} acknowledged via canicode annotations / ${unaddressed} unaddressed)`\n );\n } else {\n lines.push(` Total: ${report.summary.totalIssues}`);\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Get category label for display\n */\nexport function getCategoryLabel(category: Category): string {\n return CATEGORY_LABELS[category];\n}\n\n/**\n * Get severity label for display\n */\nexport function getSeverityLabel(severity: Severity): string {\n const labels: Record<Severity, string> = {\n blocking: \"Blocking\",\n risk: \"Risk\",\n \"missing-info\": \"Missing Info\",\n suggestion: \"Suggestion\",\n };\n return labels[severity];\n}\n\n/**\n * Build a JSON-serializable analysis result summary.\n * Shared by CLI (--json) and MCP server (analyze tool response).\n */\nexport function buildResultJson(\n fileName: string,\n result: AnalysisResult,\n scores: ScoreReport,\n options?: { fileKey?: string; designKey?: string },\n): Record<string, unknown> {\n const issuesByRule: Record<string, number> = {};\n for (const issue of result.issues) {\n const id = issue.violation.ruleId;\n issuesByRule[id] = (issuesByRule[id] ?? 0) + 1;\n }\n\n const issues = result.issues.map((issue) => {\n const applyContext = computeApplyContext(issue.violation);\n const suggestedName = issue.violation.suggestedName;\n return {\n ruleId: issue.violation.ruleId,\n detection: \"rule-based\" as const,\n outputChannel: \"score\" as const,\n persistenceIntent: \"transient\" as const,\n purpose: getRulePurpose(issue.violation.ruleId),\n ...(issue.violation.subType && { subType: issue.violation.subType }),\n severity: issue.config.severity,\n nodeId: issue.violation.nodeId,\n nodePath: issue.violation.nodePath,\n message: issue.violation.message,\n applyStrategy: applyContext.applyStrategy,\n ...(applyContext.targetProperty !== undefined\n ? { targetProperty: applyContext.targetProperty }\n : {}),\n ...(applyContext.annotationProperties !== undefined\n ? { annotationProperties: applyContext.annotationProperties }\n : {}),\n ...(suggestedName !== undefined ? { suggestedName } : {}),\n isInstanceChild: applyContext.isInstanceChild,\n ...(applyContext.sourceChildId !== undefined\n ? { sourceChildId: applyContext.sourceChildId }\n : {}),\n ...(issue.acknowledged === true ? { acknowledged: true as const } : {}),\n };\n });\n\n const json: Record<string, unknown> = {\n version: VERSION,\n analyzedAt: result.analyzedAt,\n ...(options?.fileKey && { fileKey: options.fileKey }),\n ...(options?.designKey && { designKey: options.designKey }),\n fileName,\n nodeCount: result.nodeCount,\n maxDepth: result.maxDepth,\n scope: result.scope,\n issueCount: result.issues.length,\n acknowledgedCount: scores.summary.acknowledgedCount,\n isReadyForCodeGen: isReadyForCodeGen(scores.overall.grade),\n blockingIssueCount: scores.summary.blocking,\n scores: {\n overall: scores.overall,\n categories: scores.byCategory,\n },\n issuesByRule,\n issues,\n summary: formatScoreSummary(scores),\n };\n\n if (result.failedRules.length > 0) {\n json[\"failedRules\"] = result.failedRules;\n }\n\n return json;\n}","/**\n * Extract a DOM-like design tree from AnalysisFile.\n * Converts Figma node tree to a concise text format with inline CSS styles.\n * AI reads this 1:1 to generate HTML+CSS — no information loss, 50-100x smaller.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { AnalysisFile, AnalysisNode } from \"../contracts/figma-node.js\";\n\n/** Convert Figma RGBA color object to CSS hex string. */\nfunction rgbaToHex(color: { r?: number; g?: number; b?: number; a?: number }): string | null {\n if (!color) return null;\n const r = Math.round((color.r ?? 0) * 255);\n const g = Math.round((color.g ?? 0) * 255);\n const b = Math.round((color.b ?? 0) * 255);\n return `#${r.toString(16).padStart(2, \"0\")}${g.toString(16).padStart(2, \"0\")}${b.toString(16).padStart(2, \"0\")}`.toUpperCase();\n}\n\ninterface FillInfo {\n color: string | null;\n hasImage: boolean;\n imageScaleMode: string | null;\n}\n\n/** Extract fill color and IMAGE presence from a node, skipping invisible fills. */\nfunction getFillInfo(node: AnalysisNode): FillInfo {\n const result: FillInfo = { color: null, hasImage: false, imageScaleMode: null };\n if (!node.fills || !Array.isArray(node.fills)) return result;\n for (const fill of node.fills) {\n const f = fill as {\n type?: string;\n visible?: boolean;\n color?: { r?: number; g?: number; b?: number; a?: number };\n opacity?: number;\n boundVariables?: { color?: { id?: string } };\n scaleMode?: string;\n };\n // Skip invisible fills\n if (f.visible === false) continue;\n if (f.type === \"SOLID\" && f.color) {\n const opacity = f.opacity ?? f.color.a ?? 1;\n let colorValue: string;\n if (opacity < 1) {\n const r = Math.round((f.color.r ?? 0) * 255);\n const g = Math.round((f.color.g ?? 0) * 255);\n const b = Math.round((f.color.b ?? 0) * 255);\n colorValue = `rgba(${r}, ${g}, ${b}, ${opacity})`;\n } else {\n colorValue = rgbaToHex(f.color) ?? \"#000\";\n }\n // Append variable reference if available\n if (f.boundVariables?.color?.id) {\n result.color = `${colorValue} /* var:${f.boundVariables.color.id} */`;\n } else {\n result.color = colorValue;\n }\n } else if (f.type === \"IMAGE\") {\n result.hasImage = true;\n result.imageScaleMode = f.scaleMode ?? null;\n }\n }\n return result;\n}\n\n/** @deprecated Use getFillInfo instead for full fill details */\nfunction getFill(node: AnalysisNode): string | null {\n return getFillInfo(node).color;\n}\n\n/** Extract the first solid stroke color as a CSS hex string. */\nfunction getStroke(node: AnalysisNode): string | null {\n if (!node.strokes || !Array.isArray(node.strokes)) return null;\n for (const stroke of node.strokes) {\n const s = stroke as { type?: string; color?: { r?: number; g?: number; b?: number } };\n if (s.type === \"SOLID\" && s.color) return rgbaToHex(s.color);\n }\n return null;\n}\n\n/** Extract the first visible shadow effect as a CSS box-shadow value. */\nfunction getShadow(node: AnalysisNode): string | null {\n if (!node.effects || !Array.isArray(node.effects)) return null;\n for (const effect of node.effects) {\n const e = effect as {\n type?: string;\n visible?: boolean;\n color?: { r?: number; g?: number; b?: number };\n offset?: { x?: number; y?: number };\n radius?: number;\n };\n if ((e.type === \"DROP_SHADOW\" || e.type === \"INNER_SHADOW\") && e.visible !== false) {\n const c = e.color ? rgbaToHex(e.color) : \"#000\";\n const ox = e.offset?.x ?? 0;\n const oy = e.offset?.y ?? 0;\n return `${ox}px ${oy}px ${e.radius ?? 0}px ${c}`;\n }\n }\n return null;\n}\n\n/** Map Figma alignment values to CSS flexbox equivalents. */\nfunction mapAlign(figmaAlign: string): string {\n const map: Record<string, string> = {\n MIN: \"flex-start\",\n CENTER: \"center\",\n MAX: \"flex-end\",\n SPACE_BETWEEN: \"space-between\",\n };\n return map[figmaAlign] ?? figmaAlign;\n}\n\n/** Map Figma text horizontal alignment to CSS text-align. */\nfunction mapTextAlignHorizontal(figmaAlign: string): string {\n const map: Record<string, string> = {\n LEFT: \"left\",\n CENTER: \"center\",\n RIGHT: \"right\",\n JUSTIFIED: \"justify\",\n };\n return map[figmaAlign] ?? figmaAlign.toLowerCase();\n}\n\n/** Map Figma text vertical alignment to CSS flex align-items. */\nfunction mapTextAlignVertical(figmaAlign: string): string {\n const map: Record<string, string> = {\n TOP: \"flex-start\",\n CENTER: \"center\",\n BOTTOM: \"flex-end\",\n };\n return map[figmaAlign] ?? figmaAlign.toLowerCase();\n}\n\n/** Get variable reference comment from boundVariables if available. */\nfunction getVarRef(node: AnalysisNode, prop: string): string {\n const bv = node.boundVariables as Record<string, unknown> | undefined;\n if (!bv) return \"\";\n const ref = bv[prop];\n if (!ref) return \"\";\n if (typeof ref === \"object\" && ref !== null && \"id\" in ref) {\n return ` /* var:${(ref as { id: string }).id} */`;\n }\n return \"\";\n}\n\n/** Get first variable ref among multiple properties. */\nfunction getFirstVarRef(node: AnalysisNode, props: string[]): string {\n for (const prop of props) {\n const ref = getVarRef(node, prop);\n if (ref) return ref;\n }\n return \"\";\n}\n\n/** Format instance component property values for AI hints. */\nfunction formatComponentProperties(node: AnalysisNode): string | null {\n if (!node.componentProperties || typeof node.componentProperties !== \"object\") return null;\n const entries = Object.entries(node.componentProperties)\n .map(([name, value]) => {\n const v = value as { value?: unknown };\n const raw = typeof v?.value === \"string\" ? v.value : JSON.stringify(v?.value ?? \"\");\n return `${name}=${raw}`;\n });\n if (entries.length === 0) return null;\n return entries.join(\", \");\n}\n\n/** Extract key visual styles from a node for hover diff comparison. */\nfunction extractVisualStyles(node: AnalysisNode): Record<string, string> {\n const styles: Record<string, string> = {};\n const fillInfo = getFillInfo(node);\n if (fillInfo.color && node.type !== \"TEXT\") styles[\"background\"] = fillInfo.color;\n const stroke = getStroke(node);\n if (stroke) styles[\"border-color\"] = stroke;\n if (node.cornerRadius) styles[\"border-radius\"] = `${node.cornerRadius}px`;\n if (node.opacity !== undefined && node.opacity < 1) styles[\"opacity\"] = `${Math.round(node.opacity * 100) / 100}`;\n const shadow = getShadow(node);\n if (shadow) styles[\"box-shadow\"] = shadow;\n // Text color\n if (node.type === \"TEXT\") {\n const textColor = getFill(node);\n if (textColor) styles[\"color\"] = textColor;\n }\n return styles;\n}\n\nconst HOVER_STYLE_DEFAULTS: Record<string, string> = {\n background: \"transparent\",\n \"border-color\": \"transparent\",\n \"border-radius\": \"0px\",\n opacity: \"1\",\n \"box-shadow\": \"none\",\n color: \"inherit\",\n};\n\nfunction getHoverResetValue(styleKey: string): string {\n return HOVER_STYLE_DEFAULTS[styleKey] ?? \"initial\";\n}\n\nfunction appendStyleDiffs(\n currentStyles: Record<string, string>,\n hoverStyles: Record<string, string>,\n diffs: string[],\n namePrefix?: string,\n): void {\n const styleKeys = new Set([...Object.keys(currentStyles), ...Object.keys(hoverStyles)]);\n for (const key of styleKeys) {\n const currentValue = currentStyles[key];\n const hoverValue = hoverStyles[key] ?? getHoverResetValue(key);\n if (currentValue !== hoverValue) {\n const prefix = namePrefix ? `${namePrefix}: ` : \"\";\n diffs.push(`${prefix}${key}: ${hoverValue}`);\n }\n }\n}\n\nfunction getChildStableKey(node: AnalysisNode): string | null {\n // Prefer name over id: variant children share the same name but have different ids\n if (node.name) return `name:${node.name}`;\n return node.id ?? null;\n}\n\n/** Compute style diff between current node and its hover variant. */\nfunction computeHoverDiff(\n currentNode: AnalysisNode,\n hoverNode: AnalysisNode,\n): string | null {\n const current = extractVisualStyles(currentNode);\n const hover = extractVisualStyles(hoverNode);\n const diffs: string[] = [];\n appendStyleDiffs(current, hover, diffs);\n // Check children for text/color changes (first level only)\n if (currentNode.children && hoverNode.children) {\n const hoverByStableKey = new Map<string, AnalysisNode>();\n const hoverUnmatchedByIndex: AnalysisNode[] = [];\n\n for (const child of hoverNode.children) {\n const key = getChildStableKey(child);\n if (key) {\n // Keep the first occurrence to reduce noisy collisions.\n if (!hoverByStableKey.has(key)) hoverByStableKey.set(key, child);\n } else {\n hoverUnmatchedByIndex.push(child);\n }\n }\n\n let unkeyedIdx = 0;\n for (let i = 0; i < currentNode.children.length; i++) {\n const cc = currentNode.children[i];\n if (!cc) continue;\n\n const stableKey = getChildStableKey(cc);\n let hc: AnalysisNode | undefined;\n if (stableKey) {\n hc = hoverByStableKey.get(stableKey);\n } else {\n hc = hoverUnmatchedByIndex[unkeyedIdx];\n unkeyedIdx++;\n }\n if (!hc) continue;\n const ccStyles = extractVisualStyles(cc);\n const hcStyles = extractVisualStyles(hc);\n appendStyleDiffs(ccStyles, hcStyles, diffs, cc.name);\n }\n }\n return diffs.length > 0 ? diffs.join(\"; \") : null;\n}\n\n/** Render a single node and its children as indented design-tree text. */\nfunction renderNode(\n node: AnalysisNode,\n indent: number,\n vectorDir?: string,\n components?: AnalysisFile[\"components\"],\n imageMapping?: Record<string, string>,\n vectorMapping?: Record<string, string>,\n fileStyles?: AnalysisFile[\"styles\"],\n interactionDests?: Record<string, AnalysisNode>,\n parentBBox?: { x: number; y: number; width: number; height: number },\n): string {\n if (node.visible === false) return \"\";\n\n const prefix = \" \".repeat(indent);\n const lines: string[] = [];\n\n // Header — annotate INSTANCE nodes with component name\n const bbox = node.absoluteBoundingBox;\n const w = bbox ? Math.round(bbox.width) : \"?\";\n const h = bbox ? Math.round(bbox.height) : \"?\";\n let header = `${prefix}${node.name} (${node.type}, ${w}x${h})`;\n if (node.type === \"INSTANCE\" && node.componentId && components) {\n const comp = components[node.componentId];\n if (comp) {\n header += ` [component: ${comp.name}]`;\n }\n }\n lines.push(header);\n if (node.type === \"INSTANCE\") {\n const componentProps = formatComponentProperties(node);\n if (componentProps) {\n lines.push(`${prefix} component-properties: ${componentProps}`);\n }\n }\n\n // Styles\n const styles: string[] = [];\n\n // Layout\n if (node.layoutMode && node.layoutMode !== \"NONE\") {\n if (node.layoutMode === \"GRID\") {\n styles.push(`display: grid`);\n if (node.gridColumnsSizing) styles.push(`grid-template-columns: ${node.gridColumnsSizing}`);\n if (node.gridRowsSizing) styles.push(`grid-template-rows: ${node.gridRowsSizing}`);\n if (node.gridColumnGap != null && node.gridRowGap != null) {\n styles.push(`gap: ${node.gridRowGap}px ${node.gridColumnGap}px`);\n } else if (node.gridRowGap != null) {\n styles.push(`row-gap: ${node.gridRowGap}px`);\n } else if (node.gridColumnGap != null) {\n styles.push(`column-gap: ${node.gridColumnGap}px`);\n } else if (node.itemSpacing != null) {\n styles.push(`gap: ${node.itemSpacing}px`);\n }\n } else {\n const dir = node.layoutMode === \"VERTICAL\" ? \"column\" : \"row\";\n styles.push(`display: flex; flex-direction: ${dir}`);\n if (node.layoutWrap === \"WRAP\") styles.push(`flex-wrap: wrap`);\n if (node.itemSpacing != null) {\n const mainGap = node.layoutMode === \"VERTICAL\" ? \"row-gap\" : \"column-gap\";\n styles.push(`${mainGap}: ${node.itemSpacing}px${getVarRef(node, \"itemSpacing\")}`);\n }\n if (node.counterAxisSpacing != null) {\n const crossGap = node.layoutMode === \"VERTICAL\" ? \"column-gap\" : \"row-gap\";\n styles.push(`${crossGap}: ${node.counterAxisSpacing}px${getVarRef(node, \"counterAxisSpacing\")}`);\n }\n if (node.primaryAxisAlignItems) styles.push(`justify-content: ${mapAlign(node.primaryAxisAlignItems)}`);\n // Figma default is MIN (flex-start), CSS default is stretch — emit explicitly\n styles.push(`align-items: ${mapAlign(node.counterAxisAlignItems ?? \"MIN\")}`);\n if (node.counterAxisAlignContent && node.counterAxisAlignContent !== \"AUTO\") {\n styles.push(`align-content: ${mapAlign(node.counterAxisAlignContent)}`);\n }\n }\n }\n // Child self-alignment in auto-layout\n if (node.layoutAlign && node.layoutAlign !== \"INHERIT\") {\n styles.push(`align-self: ${mapAlign(node.layoutAlign)}`);\n }\n if (node.layoutGrow === 1) {\n styles.push(\"flex-grow: 1\");\n }\n\n // Absolute positioning (child placed outside normal auto-layout flow)\n if (node.layoutPositioning === \"ABSOLUTE\") {\n styles.push(\"position: absolute\");\n if (parentBBox && node.absoluteBoundingBox) {\n const top = Math.round(node.absoluteBoundingBox.y - parentBBox.y);\n const left = Math.round(node.absoluteBoundingBox.x - parentBBox.x);\n styles.push(`top: ${top}px`);\n styles.push(`left: ${left}px`);\n }\n }\n // If any child is absolute, parent needs position: relative (but not if already absolute)\n if (node.layoutPositioning !== \"ABSOLUTE\" && node.children?.some((c) => c.layoutPositioning === \"ABSOLUTE\")) {\n styles.push(\"position: relative\");\n }\n\n // Padding\n const pt = node.paddingTop ?? 0;\n const pr = node.paddingRight ?? 0;\n const pb = node.paddingBottom ?? 0;\n const pl = node.paddingLeft ?? 0;\n if (pt || pr || pb || pl) {\n const padRef = getFirstVarRef(node, [\"paddingTop\", \"paddingRight\", \"paddingBottom\", \"paddingLeft\"]);\n styles.push(`padding: ${pt}px ${pr}px ${pb}px ${pl}px${padRef}`);\n }\n\n // Sizing — FILL = stretch to parent. If flex-grow is already set, skip width: 100% (redundant + breaks wrap layouts)\n if (node.layoutSizingHorizontal === \"FILL\" && node.layoutGrow !== 1) styles.push(\"width: 100%\");\n if (node.layoutSizingVertical === \"FILL\") styles.push(\"height: 100%\");\n\n // Fill (not for TEXT — text fill is color)\n const fillInfo = getFillInfo(node);\n if (fillInfo.color && node.type !== \"TEXT\") styles.push(`background: ${fillInfo.color}`);\n if (fillInfo.hasImage) {\n const hasChildren = node.children && node.children.length > 0;\n const mappedFile = imageMapping?.[node.id];\n if (mappedFile) {\n if (hasChildren) {\n // Background image: node has children on top → CSS background-image\n styles.push(`background-image: url(images/${mappedFile})`);\n styles.push(\"background-position: center\");\n styles.push(\"background-repeat: no-repeat\");\n if (fillInfo.imageScaleMode === \"FIT\") {\n styles.push(\"background-size: contain\");\n } else if (fillInfo.imageScaleMode === \"FILL\") {\n styles.push(\"background-size: cover\");\n }\n } else {\n // Content image: leaf node → <img> tag\n styles.push(`content-image: url(images/${mappedFile})`);\n if (fillInfo.imageScaleMode === \"FIT\") {\n styles.push(\"object-fit: contain\");\n } else if (fillInfo.imageScaleMode === \"FILL\") {\n styles.push(\"object-fit: cover\");\n }\n }\n } else {\n styles.push(hasChildren ? \"background-image: [IMAGE]\" : \"content-image: [IMAGE]\");\n }\n }\n\n // Border — respect per-side stroke weights\n const stroke = getStroke(node);\n if (stroke) {\n const isw = node.individualStrokeWeights as\n | { top?: number; right?: number; bottom?: number; left?: number }\n | undefined;\n const sw = (node.strokeWeight as number | undefined) ?? 1;\n if (isw) {\n const strokeRef = getFirstVarRef(node, [\"individualStrokeWeights\", \"strokes\"]);\n if (isw.top) styles.push(`border-top: ${isw.top}px solid ${stroke}${strokeRef}`);\n if (isw.right) styles.push(`border-right: ${isw.right}px solid ${stroke}${strokeRef}`);\n if (isw.bottom) styles.push(`border-bottom: ${isw.bottom}px solid ${stroke}${strokeRef}`);\n if (isw.left) styles.push(`border-left: ${isw.left}px solid ${stroke}${strokeRef}`);\n } else {\n styles.push(`border: ${sw}px solid ${stroke}${getVarRef(node, \"strokes\")}`);\n }\n }\n\n // Border radius\n if (node.cornerRadius) {\n const radiusRef = getVarRef(node, \"rectangleCornerRadii\");\n styles.push(`border-radius: ${node.cornerRadius}px${radiusRef}`);\n }\n\n // Shadow\n const shadow = getShadow(node);\n if (shadow) styles.push(`box-shadow: ${shadow}`);\n\n // Overflow\n if (node.clipsContent) styles.push(\"overflow: hidden\");\n\n // Opacity\n if (node.opacity !== undefined && node.opacity < 1) {\n styles.push(`opacity: ${Math.round(node.opacity * 100) / 100}`);\n }\n\n // Min/max constraints\n if (node.minWidth !== undefined) styles.push(`min-width: ${Math.round(node.minWidth)}px`);\n if (node.maxWidth !== undefined) styles.push(`max-width: ${Math.round(node.maxWidth)}px`);\n if (node.minHeight !== undefined) styles.push(`min-height: ${Math.round(node.minHeight)}px`);\n if (node.maxHeight !== undefined) styles.push(`max-height: ${Math.round(node.maxHeight)}px`);\n\n // Typography\n if (node.type === \"TEXT\" && node.style) {\n // Add text style name if available\n const nodeStyles = node.styles as Record<string, string> | undefined;\n const textStyleId = nodeStyles?.[\"text\"];\n if (textStyleId && fileStyles) {\n const styleInfo = fileStyles[textStyleId] as { name?: string } | undefined;\n if (styleInfo?.name) {\n styles.push(`/* text-style: ${styleInfo.name} */`);\n }\n }\n\n const s = node.style as Record<string, unknown>;\n if (s[\"fontFamily\"]) styles.push(`font-family: \"${s[\"fontFamily\"]}\"${getVarRef(node, \"fontFamily\")}`);\n if (s[\"fontWeight\"]) styles.push(`font-weight: ${s[\"fontWeight\"]}${getVarRef(node, \"fontWeight\")}`);\n if (s[\"fontSize\"]) styles.push(`font-size: ${s[\"fontSize\"]}px${getVarRef(node, \"fontSize\")}`);\n if (s[\"lineHeightPx\"]) {\n const lh = s[\"lineHeightPx\"] as number;\n styles.push(`line-height: ${Math.round(lh * 100) / 100}px`);\n }\n if (s[\"letterSpacing\"]) {\n const ls = s[\"letterSpacing\"] as number;\n styles.push(`letter-spacing: ${Math.round(ls * 100) / 100}px`);\n }\n if (s[\"textDecoration\"]) {\n const td = (s[\"textDecoration\"] as string).toLowerCase();\n if (td !== \"none\") styles.push(`text-decoration: ${td}`);\n }\n if (s[\"textAlignHorizontal\"]) {\n styles.push(`text-align: ${mapTextAlignHorizontal(String(s[\"textAlignHorizontal\"]))}`);\n }\n if (s[\"textAlignVertical\"] && s[\"textAlignVertical\"] !== \"TOP\") {\n // CSS has no direct text vertical-align in a text box; emit flex hint.\n // TOP is the default — only emit for CENTER/BOTTOM.\n styles.push(\"display: flex\");\n styles.push(`align-items: ${mapTextAlignVertical(String(s[\"textAlignVertical\"]))}`);\n }\n\n const textColor = getFill(node);\n if (textColor) styles.push(`color: ${textColor}`);\n\n // Text auto-resize behavior\n const textAutoResize = s[\"textAutoResize\"] as string | undefined;\n if (textAutoResize === \"WIDTH_AND_HEIGHT\") {\n styles.push(\"text-resize: auto\");\n } else if (textAutoResize === \"HEIGHT\") {\n styles.push(\"text-resize: fixed-height\");\n } else if (textAutoResize === \"TRUNCATE\") {\n styles.push(\"text-resize: truncate\");\n styles.push(\"text-overflow: ellipsis\");\n if (node.maxLines != null) {\n styles.push(`max-lines: ${node.maxLines}`);\n }\n }\n\n // Text truncation (when textAutoResize is not TRUNCATE but truncation is set)\n if (textAutoResize !== \"TRUNCATE\" && node.textTruncation === \"ENDING\") {\n styles.push(\"text-overflow: ellipsis\");\n if (node.maxLines != null) {\n styles.push(`max-lines: ${node.maxLines}`);\n }\n }\n\n // Paragraph spacing\n const paragraphSpacing = s[\"paragraphSpacing\"] as number | undefined;\n if (paragraphSpacing) {\n styles.push(`paragraph-spacing: ${paragraphSpacing}px`);\n }\n }\n\n // Text content\n if (node.type === \"TEXT\" && node.characters) {\n styles.push(`text: \"${node.characters.replace(/\\\\/g, \"\\\\\\\\\").replace(/\\n/g, \"\\\\n\").replace(/\\r/g, \"\\\\r\").replace(/\"/g, '\\\\\"')}\"`);\n }\n\n // Vector SVG inline (when vector dir with downloaded SVGs is available)\n if (node.type === \"VECTOR\" && vectorDir) {\n const mappedFile = vectorMapping?.[node.id];\n const svgPath = mappedFile\n ? join(vectorDir, mappedFile)\n : join(vectorDir, `${node.id.replace(/:/g, \"-\")}.svg`); // fallback to legacy ID-based naming\n if (existsSync(svgPath)) {\n const svg = readFileSync(svgPath, \"utf-8\").trim().replace(/\\n\\s*/g, \" \");\n styles.push(`svg: ${svg}`);\n }\n }\n\n if (styles.length > 0) {\n lines.push(`${prefix} style: ${styles.join(\"; \")}`);\n }\n\n // Interaction states (hover)\n if (node.interactions && interactionDests) {\n for (const interaction of node.interactions) {\n const i = interaction as {\n trigger?: { type?: string };\n actions?: Array<{ destinationId?: string; navigation?: string }>;\n };\n if (i.trigger?.type === \"ON_HOVER\" && i.actions) {\n for (const action of i.actions) {\n if (action.destinationId && action.navigation === \"CHANGE_TO\") {\n const hoverNode = interactionDests[action.destinationId];\n if (hoverNode) {\n const diff = computeHoverDiff(node, hoverNode);\n if (diff) {\n lines.push(`${prefix} [hover]: ${diff}`);\n }\n }\n }\n }\n }\n }\n }\n\n // Children\n if (node.children) {\n for (const child of node.children) {\n const childOutput = renderNode(child, indent + 1, vectorDir, components, imageMapping, vectorMapping, fileStyles, interactionDests, node.absoluteBoundingBox ?? undefined);\n if (childOutput) lines.push(childOutput);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n/** Options for design tree generation. */\nexport interface DesignTreeOptions {\n /** Directory containing <nodeId>.svg files for VECTOR nodes */\n vectorDir?: string;\n /** Directory containing downloaded PNGs and mapping.json for IMAGE fill nodes */\n imageDir?: string;\n}\n\n/**\n * Generate a design tree string from an AnalysisFile.\n */\nexport interface DesignTreeResult {\n /** The design tree text */\n tree: string;\n /** Estimated token count (~4 chars per token for mixed code/text) */\n estimatedTokens: number;\n /** Raw byte size */\n bytes: number;\n}\n\n/**\n * Generate a design tree string from an AnalysisFile.\n */\nexport function generateDesignTree(file: AnalysisFile, options?: DesignTreeOptions): string {\n return generateDesignTreeWithStats(file, options).tree;\n}\n\n/**\n * Generate a design tree with token/size statistics.\n * Use this when you need to measure token consumption for AI context budget.\n */\nexport function generateDesignTreeWithStats(file: AnalysisFile, options?: DesignTreeOptions): DesignTreeResult {\n const root = file.document;\n const w = root.absoluteBoundingBox ? Math.round(root.absoluteBoundingBox.width) : 0;\n const h = root.absoluteBoundingBox ? Math.round(root.absoluteBoundingBox.height) : 0;\n\n // Load image mapping once if imageDir is provided\n let imageMapping: Record<string, string> | undefined;\n if (options?.imageDir) {\n const mappingPath = join(options.imageDir, \"mapping.json\");\n if (existsSync(mappingPath)) {\n try {\n imageMapping = JSON.parse(readFileSync(mappingPath, \"utf-8\")) as Record<string, string>;\n } catch { /* ignore malformed mapping */ }\n }\n }\n\n // Load vector mapping once if vectorDir is provided\n let vectorMapping: Record<string, string> | undefined;\n if (options?.vectorDir) {\n const mappingPath = join(options.vectorDir, \"mapping.json\");\n if (existsSync(mappingPath)) {\n try {\n vectorMapping = JSON.parse(readFileSync(mappingPath, \"utf-8\")) as Record<string, string>;\n } catch { /* ignore malformed mapping */ }\n }\n }\n\n const tree = renderNode(root, 0, options?.vectorDir, file.components, imageMapping, vectorMapping, file.styles, file.interactionDestinations);\n\n const result = [\n \"# Design Tree\",\n `# Root: ${w}px x ${h}px`,\n \"# Each node shows: name (TYPE, WxH) followed by CSS-like styles\",\n \"# Reproduce this tree as HTML. Each node = one HTML element.\",\n \"# Every style value is from Figma data — use exactly as shown.\",\n \"\",\n tree,\n ].join(\"\\n\");\n\n const bytes = Buffer.byteLength(result, \"utf-8\");\n // ~4 chars per token for mixed code/text (conservative estimate)\n const estimatedTokens = Math.ceil(result.length / 4);\n\n return { tree: result, estimatedTokens, bytes };\n}\n","/**\n * Strip specific information types from design-tree text for ablation experiments.\n * Post-processes the generated text — does NOT modify design-tree.ts.\n *\n * Flow: generateDesignTree() → stripDesignTree() → send to LLM\n */\n\n/** All strip types available (including utility strips not used in experiments). */\nexport type DesignTreeStripType =\n | \"layout-direction-spacing\"\n | \"size-constraints\"\n | \"position-stacking\"\n | \"color-values\"\n | \"typography\"\n | \"shadows-effects\"\n | \"component-references\"\n | \"component-descriptions\"\n | \"node-names-hierarchy\"\n | \"overflow-text-behavior\"\n | \"hover-interaction-states\"\n | \"variable-references\"\n | \"style-references\";\n\n/**\n * Experiment-relevant strip types only.\n * Excludes trivially obvious types (color, typography, shadows, overflow, hover)\n * and no-op types (position-stacking, component-descriptions).\n */\nexport type DesignTreeInfoType =\n | \"layout-direction-spacing\"\n | \"size-constraints\"\n | \"component-references\"\n | \"node-names-hierarchy\"\n | \"variable-references\"\n | \"style-references\";\n\n/** All strip types (used for exhaustive testing). */\nexport const ALL_STRIP_TYPES: readonly DesignTreeStripType[] = [\n \"layout-direction-spacing\", \"size-constraints\", \"position-stacking\",\n \"color-values\", \"typography\", \"shadows-effects\", \"component-references\",\n \"component-descriptions\", \"node-names-hierarchy\", \"overflow-text-behavior\",\n \"hover-interaction-states\", \"variable-references\", \"style-references\",\n] as const;\n\n/**\n * Strip experiment types used in calibration ablation (six types).\n * Keep in sync with `StripTypeEnum` / `STRIP_TYPE_RULES` in the agents layer.\n * `size-constraints` pairs with responsive rules `missing-size-constraint`, `fixed-size-in-auto-layout`.\n */\nexport const DESIGN_TREE_INFO_TYPES: readonly DesignTreeInfoType[] = [\n \"layout-direction-spacing\",\n \"size-constraints\",\n \"component-references\",\n \"node-names-hierarchy\",\n \"variable-references\",\n \"style-references\",\n] as const;\n\n// --- Style property matchers ---\n\nconst LAYOUT_PROPS = new Set([\n \"display\",\n \"flex-direction\",\n \"flex-wrap\",\n \"gap\",\n \"row-gap\",\n \"column-gap\",\n \"justify-content\",\n \"align-items\",\n \"align-content\",\n \"padding\",\n \"grid-template-columns\",\n \"grid-template-rows\",\n \"align-self\",\n]);\n\nconst SIZE_PROPS = new Set([\n \"min-width\",\n \"max-width\",\n \"min-height\",\n \"max-height\",\n \"flex-grow\",\n]);\n\nconst TYPOGRAPHY_PROPS = new Set([\n \"font-family\",\n \"font-weight\",\n \"font-size\",\n \"line-height\",\n \"letter-spacing\",\n \"text-align\",\n \"text-decoration\",\n]);\n\nconst SHADOW_PROPS = new Set([\n \"box-shadow\",\n \"opacity\",\n]);\n\n/** Get the CSS property name from a style segment like \"font-size: 16px\" */\nfunction getPropertyName(segment: string): string {\n const colonIdx = segment.indexOf(\":\");\n if (colonIdx === -1) return segment.trim();\n return segment.slice(0, colonIdx).trim();\n}\n\n/** Check if a style segment is a \"fill\" size (width: 100% or height: 100%) */\nfunction isFillSize(segment: string): boolean {\n const trimmed = segment.trim();\n return trimmed === \"width: 100%\" || trimmed === \"height: 100%\";\n}\n\n// --- Color replacement ---\n\nconst HEX_COLOR_RE = /#[0-9A-Fa-f]{6,8}/g;\nconst RGBA_RE = /rgba?\\(\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*\\d+\\s*(?:,\\s*[\\d.]+\\s*)?\\)/g;\nconst SVG_COLOR_ATTR_RE = /(fill|stroke)=\"(#[0-9A-Fa-f]{6,8})\"/g;\n\nfunction replaceColors(segment: string): string {\n let result = segment;\n result = result.replace(RGBA_RE, \"[COLOR]\");\n result = result.replace(HEX_COLOR_RE, \"[COLOR]\");\n return result;\n}\n\nfunction replaceColorsInSvg(svgContent: string): string {\n return svgContent.replace(SVG_COLOR_ATTR_RE, '$1=\"[COLOR]\"');\n}\n\n// --- Reference removal ---\n\nconst VAR_COMMENT_RE = /\\s*\\/\\*\\s*var:[^*]*\\*\\//g;\nconst TEXT_STYLE_COMMENT_RE = /\\s*\\/\\*\\s*text-style:[^*]*\\*\\//g;\n\nfunction removeVarRefs(segment: string): string {\n return segment.replace(VAR_COMMENT_RE, \"\").trim();\n}\n\nfunction removeStyleRefs(segment: string): string {\n return segment.replace(TEXT_STYLE_COMMENT_RE, \"\").trim();\n}\n\n\n// --- Line classification ---\n\ninterface ParsedStyleLine {\n indent: string;\n properties: string[];\n svgSegment: string | null;\n /** text: \"...\" content — always preserved, never stripped or split. */\n textSegment: string | null;\n}\n\n/** Extract `text: \"...\"` segment from raw style string, handling escaped quotes. */\nfunction extractTextSegment(raw: string): { textSegment: string | null; rest: string } {\n // Match text: \"...\" allowing escaped quotes inside\n const textMatch = raw.match(/(?:^|;\\s*)text:\\s*\"(?:[^\"\\\\]|\\\\.)*\"/);\n if (!textMatch) return { textSegment: null, rest: raw };\n const textSegment = textMatch[0].replace(/^;\\s*/, \"\").trim();\n const rest = raw.replace(textMatch[0], \"\").replace(/;\\s*$/, \"\").replace(/^;\\s*/, \"\");\n return { textSegment, rest };\n}\n\n/** Split a style line into prefix, individual properties, optional SVG tail, and protected text. */\nfunction parseStyleLine(line: string): ParsedStyleLine | null {\n const match = line.match(/^(\\s*)style:\\s*(.*)/s);\n if (!match) return null;\n const indent = match[1] ?? \"\";\n const raw = match[2] ?? \"\";\n\n // 1. Extract text: \"...\" first (protected from splitting)\n const { textSegment, rest: afterText } = extractTextSegment(raw);\n\n // 2. Separate SVG segment (always last, starts with \"svg: <\")\n let svgSegment: string | null = null;\n let propsRaw = afterText;\n const svgIdx = afterText.indexOf(\"svg: <\");\n if (svgIdx !== -1) {\n svgSegment = afterText.slice(svgIdx);\n propsRaw = afterText.slice(0, svgIdx).replace(/;\\s*$/, \"\");\n }\n\n // 3. Split remaining properties by \"; \"\n const properties = propsRaw\n ? propsRaw.split(\"; \").map((p) => p.trim()).filter(Boolean)\n : [];\n\n return { indent, properties, svgSegment, textSegment };\n}\n\n/** Reassemble a style line from parts. Returns null if no properties remain. */\nfunction reassembleStyleLine(parsed: ParsedStyleLine): string | null {\n const parts = [...parsed.properties];\n if (parsed.svgSegment) parts.push(parsed.svgSegment);\n if (parsed.textSegment) parts.push(parsed.textSegment);\n if (parts.length === 0) return null;\n return `${parsed.indent}style: ${parts.join(\"; \")}`;\n}\n\n// --- Per-type strip functions ---\n\nfunction stripLayoutSpacing(lines: string[]): string[] {\n return lines.map((line) => {\n const parsed = parseStyleLine(line);\n if (!parsed) return line;\n parsed.properties = parsed.properties.filter((p) => {\n const prop = getPropertyName(p);\n return !LAYOUT_PROPS.has(prop);\n });\n return reassembleStyleLine(parsed);\n }).filter((line): line is string => line !== null);\n}\n\nfunction stripSizeConstraints(lines: string[]): string[] {\n return lines.map((line) => {\n const parsed = parseStyleLine(line);\n if (!parsed) return line;\n parsed.properties = parsed.properties.filter((p) => {\n const prop = getPropertyName(p);\n if (SIZE_PROPS.has(prop)) return false;\n if (isFillSize(p)) return false;\n return true;\n });\n return reassembleStyleLine(parsed);\n }).filter((line): line is string => line !== null);\n}\n\nfunction stripColorValues(lines: string[]): string[] {\n return lines.map((line) => {\n // Handle [hover] lines — replace colors there too\n if (line.match(/^\\s*\\[hover\\]:/)) {\n return replaceColors(line);\n }\n\n const parsed = parseStyleLine(line);\n if (!parsed) return line;\n\n parsed.properties = parsed.properties.map((p) => {\n const prop = getPropertyName(p);\n // Don't touch image paths or text content\n if (prop === \"background-image\") return p;\n if (prop === \"content-image\") return p;\n if (prop === \"text\") return p;\n // Replace colors in background, color, border, box-shadow\n if ([\"background\", \"color\", \"border\", \"border-top\", \"border-right\",\n \"border-bottom\", \"border-left\", \"box-shadow\"].includes(prop)) {\n return replaceColors(p);\n }\n return p;\n });\n\n // Replace colors in SVG\n if (parsed.svgSegment) {\n parsed.svgSegment = replaceColorsInSvg(parsed.svgSegment);\n }\n\n return reassembleStyleLine(parsed);\n }).filter((line): line is string => line !== null);\n}\n\nfunction stripTypography(lines: string[]): string[] {\n return lines.map((line) => {\n const parsed = parseStyleLine(line);\n if (!parsed) return line;\n parsed.properties = parsed.properties.filter((p) => {\n const prop = getPropertyName(p);\n if (TYPOGRAPHY_PROPS.has(prop)) return false;\n if (p.trim().startsWith(\"/* text-style:\")) return false;\n return true;\n });\n return reassembleStyleLine(parsed);\n }).filter((line): line is string => line !== null);\n}\n\nfunction stripShadowsEffects(lines: string[]): string[] {\n return lines.map((line) => {\n const parsed = parseStyleLine(line);\n if (!parsed) return line;\n parsed.properties = parsed.properties.filter((p) => {\n const prop = getPropertyName(p);\n return !SHADOW_PROPS.has(prop);\n });\n return reassembleStyleLine(parsed);\n }).filter((line): line is string => line !== null);\n}\n\n/** Header line pattern: {indent}Name (TYPE, WxH) with optional [component: ...] */\nconst HEADER_RE = /^(\\s*)(.+?)(\\s*\\([A-Z_]+,\\s*[\\d?]+x[\\d?]+\\).*)$/;\n\n/** Check if a line is a node header (not style/comment/component-properties/hover). */\nfunction isHeaderLine(line: string): boolean {\n if (line.trimStart().startsWith(\"style:\")) return false;\n if (line.trimStart().startsWith(\"[hover]:\")) return false;\n if (line.trimStart().startsWith(\"component-properties:\")) return false;\n if (line.startsWith(\"#\")) return false;\n return HEADER_RE.test(line);\n}\n\nfunction stripComponentReferences(lines: string[]): string[] {\n return lines\n .filter((line) => !line.match(/^\\s*component-properties:/))\n .map((line) => {\n if (isHeaderLine(line)) {\n return line.replace(/\\s*\\[component:[^\\]]*\\]$/, \"\");\n }\n return line;\n });\n}\n\nfunction stripNodeNames(lines: string[]): string[] {\n let counter = 0;\n return lines.map((line) => {\n if (!isHeaderLine(line)) return line;\n const match = line.match(HEADER_RE);\n if (match) {\n counter++;\n return `${match[1]}Node${counter}${match[3]}`;\n }\n return line;\n });\n}\n\nfunction stripOverflow(lines: string[]): string[] {\n return lines.map((line) => {\n const parsed = parseStyleLine(line);\n if (!parsed) return line;\n parsed.properties = parsed.properties.filter((p) =>\n p.trim() !== \"overflow: hidden\"\n );\n return reassembleStyleLine(parsed);\n }).filter((line): line is string => line !== null);\n}\n\nfunction stripHoverStates(lines: string[]): string[] {\n return lines.filter((line) => !line.match(/^\\s*\\[hover\\]:/));\n}\n\n/** Strip variable reference comments only (keep text-style references). */\nfunction stripVariableReferences(lines: string[]): string[] {\n return lines.map((line) => {\n const parsed = parseStyleLine(line);\n if (!parsed) return line;\n parsed.properties = parsed.properties\n .map((p) => removeVarRefs(p))\n .filter(Boolean);\n return reassembleStyleLine(parsed);\n }).filter((line): line is string => line !== null);\n}\n\n/** Strip text-style comments only (keep variable references). */\nfunction stripStyleReferences(lines: string[]): string[] {\n return lines.map((line) => {\n const parsed = parseStyleLine(line);\n if (!parsed) return line;\n parsed.properties = parsed.properties\n .map((p) => removeStyleRefs(p))\n .filter(Boolean);\n return reassembleStyleLine(parsed);\n }).filter((line): line is string => line !== null);\n}\n\n// --- Main API ---\n\nconst STRIP_FUNCTIONS: Record<DesignTreeStripType, (lines: string[]) => string[]> = {\n \"layout-direction-spacing\": stripLayoutSpacing,\n \"size-constraints\": stripSizeConstraints,\n \"position-stacking\": (lines) => lines,\n \"color-values\": stripColorValues,\n \"typography\": stripTypography,\n \"shadows-effects\": stripShadowsEffects,\n \"component-references\": stripComponentReferences,\n \"component-descriptions\": (lines) => lines,\n \"node-names-hierarchy\": stripNodeNames,\n \"overflow-text-behavior\": stripOverflow,\n \"hover-interaction-states\": stripHoverStates,\n \"variable-references\": stripVariableReferences,\n \"style-references\": stripStyleReferences,\n};\n\n/**\n * Strip a specific information type from a design-tree text.\n * Returns a new string with the target information removed.\n */\nexport function stripDesignTree(tree: string, type: DesignTreeStripType): string {\n const lines = tree.split(\"\\n\");\n const stripped = STRIP_FUNCTIONS[type](lines);\n return stripped.join(\"\\n\");\n}\n","/**\n * Delta-based difficulty mapping for ablation experiments.\n * Converts pixel similarity delta (baseline - stripped) to a difficulty level.\n *\n * Used by calibration pipeline to objectively measure rule impact\n * instead of relying on Converter self-assessment.\n */\n\nimport type { Difficulty } from \"../../agents/contracts/conversion-agent.js\";\n\n/**\n * Map a strip experiment's similarity delta to a difficulty level.\n *\n * Delta = baseline similarity - stripped similarity (percentage points).\n * Higher delta means removing that information caused more pixel degradation.\n *\n * Thresholds from issue #191:\n * - ≤ 5%p → easy (removing info barely matters)\n * - 6-15%p → moderate (noticeable degradation)\n * - 16-30%p → hard (significant degradation)\n * - > 30%p → failed (critical information)\n */\nexport function stripDeltaToDifficulty(delta: number): Difficulty {\n if (!Number.isFinite(delta)) {\n throw new TypeError(`Invalid strip delta: ${delta}`);\n }\n if (delta <= 5) return \"easy\";\n if (delta <= 15) return \"moderate\";\n if (delta <= 30) return \"hard\";\n return \"failed\";\n}\n\n/**\n * Map a token count delta percentage to a difficulty level.\n *\n * tokenDelta = baselineInputTokens - strippedInputTokens.\n * tokenDeltaPercent = tokenDelta / baselineInputTokens * 100.\n * Higher percentage means removing that info significantly reduces token cost,\n * i.e. the info contributed a lot of tokens — its absence matters for token management.\n *\n * Thresholds:\n * - ≤ 5% → easy (minimal token impact)\n * - 6-20% → moderate (noticeable token savings)\n * - 21-40% → hard (significant token impact)\n * - > 40% → failed (critical for token budget)\n */\nexport function tokenDeltaToDifficulty(baselineTokens: number, strippedTokens: number): Difficulty {\n if (!Number.isFinite(baselineTokens) || !Number.isFinite(strippedTokens)) {\n throw new TypeError(`Invalid token counts: baseline=${baselineTokens}, stripped=${strippedTokens}`);\n }\n if (baselineTokens <= 0) return \"easy\";\n const deltaPercent = ((baselineTokens - strippedTokens) / baselineTokens) * 100;\n if (deltaPercent <= 5) return \"easy\";\n if (deltaPercent <= 20) return \"moderate\";\n if (deltaPercent <= 40) return \"hard\";\n return \"failed\";\n}\n","import type { InstanceContext } from \"../contracts/gotcha-survey.js\";\nimport { isInstanceChildNodeId } from \"../adapters/instance-id-parser.js\";\n\n/**\n * Write strategy for a gotcha apply target. Consumers can branch on this enum\n * without parsing the human-readable `guidance` string.\n *\n * - `scene-only`: plain scene node id, no instance handling needed.\n * - `prefer-definition`: instance-child id + resolved `instanceContext`; layout\n * and min/max writes should go to the definition node after user confirmation.\n * - `definition-unknown`: instance-child id but `instanceContext` is missing;\n * caller must resolve the source component at runtime.\n */\nexport type GotchaApplyStrategy =\n | \"scene-only\"\n | \"prefer-definition\"\n | \"definition-unknown\";\n\n/**\n * Resolved targets for applying gotcha fixes in Figma (Plugin API or MCP `use_figma`).\n *\n * Survey questions may include `instanceContext` when the violation `nodeId` is an\n * instance-child id (`I...;...`). Property overrides often fail on those scene nodes;\n * the definition node id is the usual write target after user confirmation.\n */\nexport type GotchaApplyResolution = {\n /** Scene node id from the survey (`question.nodeId`). */\n sceneNodeId: string;\n /** Source definition node id from `instanceContext.sourceNodeId`, when known. */\n definitionNodeId: string | undefined;\n /** Machine-readable write strategy — branch on this from TS consumers. */\n strategy: GotchaApplyStrategy;\n /**\n * Opt-in hints for the caller. Fields in this namespace take effect ONLY\n * when the caller has enabled `allowDefinitionWrite` on the roundtrip helper.\n * Under the ADR-012 default (opt-in off), these are informational — the\n * actual write still routes to scene-then-annotate regardless.\n *\n * ADR-012 Q5: future per-rule opt-in fields grow under this namespace.\n */\n optIn: {\n /**\n * Hint that the definition node is the better write target for layout and\n * min/max size-constraint writes on this node. Takes effect only when\n * `allowDefinitionWrite` is enabled — otherwise the helper annotates the\n * scene and names the source component without propagating.\n */\n preferDefinitionForLayoutProps: boolean;\n };\n /**\n * Human-readable note for skills, UI, or logs. Skill-oriented (may reference\n * Plugin API calls like `getMainComponentAsync`). TS consumers should branch\n * on `strategy` instead of parsing this string.\n */\n guidance: string;\n};\n\n/**\n * Resolve which node ids and policy apply for a gotcha survey question.\n */\nexport function resolveGotchaApplyTarget(\n nodeId: string,\n instanceContext: InstanceContext | undefined,\n): GotchaApplyResolution {\n if (instanceContext) {\n const componentPhrase = instanceContext.sourceComponentName\n ? `inside component ${instanceContext.sourceComponentName}`\n : \"inside the source component\";\n return {\n sceneNodeId: nodeId,\n definitionNodeId: instanceContext.sourceNodeId,\n strategy: \"prefer-definition\",\n optIn: { preferDefinitionForLayoutProps: true },\n guidance:\n `This question targets a node inside an instance. Overrides may fail on the scene node. ` +\n `For layout and min/max sizing, apply changes on node ${instanceContext.sourceNodeId} ` +\n `${componentPhrase} (parent instance ${instanceContext.parentInstanceNodeId}). ` +\n `Confirm with the user first — definition edits propagate to every instance of that component in the file.`,\n };\n }\n\n if (isInstanceChildNodeId(nodeId)) {\n return {\n sceneNodeId: nodeId,\n definitionNodeId: undefined,\n strategy: \"definition-unknown\",\n optIn: { preferDefinitionForLayoutProps: true },\n guidance:\n \"The node id looks like a Figma instance child (`I...;...`) but no `instanceContext` was attached. \" +\n \"Parse the segment after the last `;` as the source definition id, resolve the parent INSTANCE, \" +\n \"and use `getMainComponentAsync()` when `figma.getNodeById(sourceId)` is not enough (e.g. nested instances).\",\n };\n }\n\n return {\n sceneNodeId: nodeId,\n definitionNodeId: undefined,\n strategy: \"scene-only\",\n optIn: { preferDefinitionForLayoutProps: false },\n guidance: \"\",\n };\n}\n","/**\n * Centralized node semantic classification.\n * All \"what is this node?\" logic lives here so rules share the same predicates.\n *\n * Categories:\n * - Container: layout containers (frame, group, component, instance)\n * - Visual: decorative/graphic elements (vector, shape, image)\n * - Interactive: user-interactable elements (button, link, tab, input, toggle)\n * - Overlay: elements that open on top (modal, drawer, dropdown)\n * - Carousel: elements that slide/swipe (carousel, slider, gallery)\n * - Token: style/variable binding checks\n * - Naming: name pattern classification\n */\n\nimport type { AnalysisNode } from \"../contracts/figma-node.js\";\n\n// ── Container classification ─────────────────────────────────────────────────\n\nexport function isContainerNode(node: AnalysisNode): boolean {\n return node.type === \"FRAME\" || node.type === \"GROUP\" || node.type === \"COMPONENT\" || node.type === \"INSTANCE\";\n}\n\nexport function hasAutoLayout(node: AnalysisNode): boolean {\n return node.layoutMode !== undefined && node.layoutMode !== \"NONE\";\n}\n\nexport function hasTextContent(node: AnalysisNode): boolean {\n return node.type === \"TEXT\" || (node.children?.some((c) => c.type === \"TEXT\") ?? false);\n}\n\nexport function hasOverlappingBounds(a: AnalysisNode, b: AnalysisNode): boolean {\n const boxA = a.absoluteBoundingBox;\n const boxB = b.absoluteBoundingBox;\n\n if (!boxA || !boxB) return false;\n\n return !(\n boxA.x + boxA.width <= boxB.x ||\n boxB.x + boxB.width <= boxA.x ||\n boxA.y + boxA.height <= boxB.y ||\n boxB.y + boxB.height <= boxA.y\n );\n}\n\n// ── Visual classification ────────────────────────────────────────────────────\n\nconst VISUAL_LEAF_TYPES = new Set([\n \"VECTOR\", \"BOOLEAN_OPERATION\", \"ELLIPSE\", \"LINE\", \"STAR\", \"REGULAR_POLYGON\", \"RECTANGLE\",\n]);\n\nexport function isVisualLeafType(type: string): boolean {\n return VISUAL_LEAF_TYPES.has(type);\n}\n\nexport function hasImageFill(node: AnalysisNode): boolean {\n if (!Array.isArray(node.fills)) return false;\n return node.fills.some(\n (fill) =>\n typeof fill === \"object\" &&\n fill !== null &&\n (fill as { type?: unknown }).type === \"IMAGE\",\n );\n}\n\nexport function isVisualOnlyNode(node: AnalysisNode): boolean {\n if (VISUAL_LEAF_TYPES.has(node.type)) return true;\n const hasOnlyVisualChildren =\n node.children !== undefined &&\n node.children.length > 0 &&\n node.children.every((c) => VISUAL_LEAF_TYPES.has(c.type));\n // Image fill only counts as visual-only when there are no content children\n if (hasImageFill(node) && (!node.children || node.children.length === 0 || hasOnlyVisualChildren)) {\n return true;\n }\n if (hasOnlyVisualChildren) return true;\n return false;\n}\n\n// ── Interactive classification ───────────────────────────────────────────────\n\nexport type StatefulComponentType = \"button\" | \"link\" | \"tab\" | \"input\" | \"toggle\";\n\n/** Name patterns → interactive type mapping */\nexport const STATEFUL_PATTERNS: Array<{ pattern: RegExp; type: StatefulComponentType }> = [\n { pattern: /\\b(btn|button|cta)\\b/i, type: \"button\" },\n { pattern: /\\b(link|anchor)\\b/i, type: \"link\" },\n { pattern: /\\b(tab|tabs)\\b/i, type: \"tab\" },\n { pattern: /\\b(nav|navigation|menu|navbar)\\b/i, type: \"tab\" },\n { pattern: /\\b(input|text-?field|search-?bar|textarea)\\b/i, type: \"input\" },\n { pattern: /\\b(select|dropdown|combo-?box)\\b/i, type: \"input\" },\n { pattern: /\\b(toggle|switch|checkbox|radio)\\b/i, type: \"toggle\" },\n];\n\nexport function getStatefulComponentType(node: AnalysisNode): StatefulComponentType | null {\n if (!node.name) return null;\n for (const entry of STATEFUL_PATTERNS) {\n if (entry.pattern.test(node.name)) return entry.type;\n }\n return null;\n}\n\nexport function isStatefulComponent(node: AnalysisNode): boolean {\n return getStatefulComponentType(node) !== null;\n}\n\n/**\n * Standard state names across web + mobile platforms.\n * Used by missing-interaction-state (to detect presence) and\n * non-standard-naming (to flag non-standard names).\n *\n * Sources:\n * - CSS: :hover, :active, :focus, :disabled, :enabled — https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Selectors/Pseudo-classes\n * - Material Design 3: Hovered, Focused, Pressed, Dragged — https://m3.material.io/foundations/interaction/states\n * - UIKit: highlighted, selected, disabled, focused — https://developer.apple.com/documentation/uikit/uicontrol/state\n */\nexport const STANDARD_STATE_NAMES = new Set([\n // CSS pseudo-classes (web)\n \"default\", \"hover\", \"active\", \"focus\", \"focused\", \"disabled\", \"enabled\",\n // Material Design 3 (Android)\n \"pressed\", \"dragged\",\n // UIKit (iOS)\n \"highlighted\",\n // Common\n \"selected\",\n]);\n\n/**\n * Patterns that look like state names but aren't in the standard set.\n * Maps common non-standard names to their standard equivalent for suggestions.\n */\nexport const STATE_NAME_SUGGESTIONS: Record<string, string> = {\n on: \"active\",\n off: \"default\",\n clicked: \"pressed\",\n tapped: \"pressed\",\n inactive: \"disabled\",\n normal: \"default\",\n rest: \"default\",\n hovered: \"hover\",\n activated: \"active\",\n checked: \"selected\",\n unchecked: \"default\",\n};\n\n/** Pattern to detect state-like variant option names (broad match) */\nexport const STATE_LIKE_PATTERN = /\\b(on|off|clicked|tapped|inactive|normal|rest|hovered|activated|checked|unchecked)\\b/i;\n\n// ── Overlay / Carousel patterns ──────────────────────────────────────────────\n\n/** Elements that open on top of current view */\nexport const OVERLAY_PATTERN = /\\b(dropdown|select|combo-?box|popover|accordion|drawer|modal|bottom-?sheet|sheet|sidebar|panel|dialog|popup|toast)\\b/i;\n\n/** Elements that swipe/slide between items */\nexport const CAROUSEL_PATTERN = /\\b(carousel|slider|swiper|slide-?show|gallery)\\b/i;\n\nexport function isOverlayNode(node: AnalysisNode): boolean {\n return node.name !== undefined && OVERLAY_PATTERN.test(node.name);\n}\n\nexport function isCarouselNode(node: AnalysisNode): boolean {\n return node.name !== undefined && CAROUSEL_PATTERN.test(node.name);\n}\n\n// ── Token classification ─────────────────────────────────────────────────────\n\nexport function hasStyleReference(node: AnalysisNode, styleType: string): boolean {\n return node.styles !== undefined && styleType in node.styles;\n}\n\nexport function hasBoundVariable(node: AnalysisNode, key: string): boolean {\n return node.boundVariables !== undefined && key in node.boundVariables;\n}\n\n// ── Naming patterns ──────────────────────────────────────────────────────────\n\n/** Figma default name patterns (Frame 1, Group 2, etc.) */\nexport const DEFAULT_NAME_PATTERNS = [\n /^Frame\\s*\\d*$/i,\n /^Group\\s*\\d*$/i,\n /^Rectangle\\s*\\d*$/i,\n /^Ellipse\\s*\\d*$/i,\n /^Vector\\s*\\d*$/i,\n /^Line\\s*\\d*$/i,\n /^Text\\s*\\d*$/i,\n /^Image\\s*\\d*$/i,\n /^Component\\s*\\d*$/i,\n /^Instance\\s*\\d*$/i,\n];\n\nexport function isDefaultName(name: string): boolean {\n return DEFAULT_NAME_PATTERNS.some((pattern) => pattern.test(name));\n}\n\n/** Shape-only non-semantic names */\nexport const NON_SEMANTIC_NAMES = [\n \"rectangle\", \"ellipse\", \"vector\", \"line\", \"polygon\",\n \"star\", \"path\", \"shape\", \"image\", \"fill\", \"stroke\",\n];\n\nexport function isNonSemanticName(name: string): boolean {\n return NON_SEMANTIC_NAMES.includes(name.toLowerCase().trim());\n}\n\n// ── Exclusion ────────────────────────────────────────────────────────────────\n\nexport const EXCLUDED_NAME_PATTERN = /(badge|close|dismiss|overlay|float|fab|dot|indicator|corner|decoration|tag|status|notification|icon|ico|image|asset|filter|dim|dimmed|bg|background|logo|avatar|divider|separator|nav|navigation|gnb|header|footer|sidebar|toolbar|modal|dialog|popup|toast|tooltip|dropdown|menu|sticky|spinner|loader|cursor|cta|chatbot|thumb|thumbnail|tabbar|tab-bar|statusbar|status-bar)/i;\n\nexport function isExcludedName(name: string): boolean {\n return EXCLUDED_NAME_PATTERN.test(name);\n}\n","import type { AnalysisNode } from \"../contracts/figma-node.js\";\nimport { isVisualLeafType, isVisualOnlyNode, isExcludedName } from \"./node-semantics.js\";\n\n// ============================================\n// Auto-layout exceptions\n// ============================================\n\n/** Frames that don't need auto-layout (only visual-leaf children like icon paths) */\nexport function isAutoLayoutExempt(node: AnalysisNode): boolean {\n if (\n node.children &&\n node.children.length > 0 &&\n node.children.every((c) => isVisualLeafType(c.type))\n ) return true;\n\n return false;\n}\n\n// ============================================\n// Absolute-position exceptions\n// ============================================\n\n/** Nodes that are allowed to use absolute positioning inside auto-layout */\nexport function isAbsolutePositionExempt(node: AnalysisNode): boolean {\n if (isVisualOnlyNode(node)) return true;\n\n // Intentional name patterns (badge, close, overlay, etc.)\n if (isExcludedName(node.name)) return true;\n\n return false;\n}\n\n// ============================================\n// Size-constraint exceptions\n// ============================================\n//\n// `isSizeConstraintExempt` was removed in #403 (commit\n// `feat(rules): missing-size-constraint scope-aware…`). The new rule\n// walks the full ancestor chain to determine whether any container\n// already establishes a width bound, which strictly subsumes the old\n// \"parent has maxWidth OR depth <= 1\" heuristic. Keeping the helper\n// would produce two divergent definitions of \"bound\" in the codebase.\n\n// ============================================\n// Fixed-size exceptions\n// ============================================\n\n/** Nodes that are allowed to use fixed sizing inside auto-layout */\nexport function isFixedSizeExempt(node: AnalysisNode): boolean {\n // Visual-only nodes (icons, images, shapes) — intentionally fixed\n if (isVisualOnlyNode(node)) return true;\n\n // Excluded names (nav, header, etc.)\n if (isExcludedName(node.name)) return true;\n\n return false;\n}\n","/**\n * Centralized rule violation messages.\n * All message text lives here so CLI, web, plugin, and MCP share the same strings.\n *\n * Each message function returns { message, suggestion, guide? }:\n * - message: what's wrong (node-specific, dynamic)\n * - suggestion: how to fix it (node-specific, dynamic)\n * - guide: exemption hint (optional, when the rule auto-excludes certain cases)\n */\n\n// ── Message return type ─────────────────────────────────────────────────────\n\nexport interface ViolationMsg {\n message: string;\n suggestion: string;\n guide?: string;\n}\n\n// ── Sub-type definitions ─────────────────────────────────────────────────────\n\nexport type RawValueSubType = \"color\" | \"font\" | \"shadow\" | \"opacity\" | \"spacing\";\nexport type NoAutoLayoutSubType = \"overlapping\" | \"nested\" | \"basic\";\nexport type FixedSizeSubType = \"both-axes\" | \"horizontal\";\nexport type MissingComponentSubType = \"unused-component\" | \"name-repetition\" | \"structure-repetition\" | \"style-override\";\n\n// ── raw-value ────────────────────────────────────────────────────────────────\n\nexport const rawValueMsg = {\n color: (name: string, hex: string): ViolationMsg => ({\n message: `\"${name}\" uses raw fill color ${hex} without style or variable`,\n suggestion: `Bind to a color token`,\n }),\n font: (name: string, fontDesc: string): ViolationMsg => ({\n message: `\"${name}\" uses raw font${fontDesc} without text style`,\n suggestion: `Apply a text style`,\n }),\n shadow: (name: string, shadowType: string, details: string): ViolationMsg => ({\n message: `\"${name}\" has ${shadowType}${details} without effect style`,\n suggestion: `Apply an effect style`,\n }),\n opacity: (name: string, pct: number): ViolationMsg => ({\n message: `\"${name}\" uses raw opacity (${pct}%) without a variable binding`,\n suggestion: `Bind opacity to a variable`,\n }),\n spacing: (name: string, label: string, value: number): ViolationMsg => ({\n message: `\"${name}\" uses raw ${label} (${value}px) without a variable binding`,\n suggestion: `Bind spacing to a variable`,\n }),\n};\n\n// ── irregular-spacing ────────────────────────────────────────────────────────\n\nexport type IrregularSpacingSubType = \"padding\" | \"gap\";\n\nexport const irregularSpacingMsg = (name: string, spacing: number, gridBase: number, nearest: number): ViolationMsg => ({\n message: `\"${name}\" has spacing ${spacing}px not on ${gridBase}pt grid`,\n suggestion: `Round to nearest ${gridBase}pt multiple (${nearest}px)`,\n});\n\n// ── no-auto-layout ───────────────────────────────────────────────────────────\n\nexport const noAutoLayoutMsg = {\n overlapping: (name: string): ViolationMsg => ({\n message: `\"${name}\" has overlapping children without Auto Layout`,\n suggestion: `Apply auto-layout to separate overlapping children`,\n guide: `If this is an intentional overlay (e.g., badge on avatar), this can be ignored`,\n }),\n nested: (name: string): ViolationMsg => ({\n message: `\"${name}\" has nested containers without layout hints`,\n suggestion: `Apply auto-layout to organize nested containers`,\n guide: `Icon wrappers containing only vectors are automatically excluded`,\n }),\n basic: (name: string, arrangement: string, directionHint: string): ViolationMsg => ({\n message: `Frame \"${name}\" has no auto-layout${arrangement}`,\n suggestion: directionHint ? `Apply ${directionHint} auto-layout` : `Apply auto-layout`,\n guide: `Single-child wrappers and icon containers are automatically excluded`,\n }),\n};\n\n// ── absolute-position-in-auto-layout ─────────────────────────────────────────\n\nexport const absolutePositionMsg = (name: string, parentName: string): ViolationMsg => ({\n message: `\"${name}\" uses absolute positioning inside Auto Layout parent \"${parentName}\"`,\n suggestion: `Remove absolute positioning or restructure outside the auto-layout parent`,\n guide: `If this is a badge or overlay, name it with \"badge\", \"overlay\", or \"icon\" to auto-exclude`,\n});\n\n// ── fixed-size-in-auto-layout ────────────────────────────────────────────────\n\nexport const fixedSizeMsg = {\n bothAxes: (name: string, width: number, height: number): ViolationMsg => ({\n message: `Container \"${name}\" (${width}×${height}) uses fixed size on both axes inside auto-layout`,\n suggestion: `Set at least one axis to HUG or FILL`,\n }),\n horizontal: (name: string, width: number): ViolationMsg => ({\n message: `\"${name}\" has fixed width (${width}px) inside auto-layout`,\n suggestion: `Set horizontal sizing to FILL`,\n }),\n};\n\n// ── missing-size-constraint ──────────────────────────────────────────────────\n//\n// #403: Subtypes are case-of-firing rather than property-of-fix. Each\n// subtype's gotcha question is a pure function of the subtype — the\n// message function does not need to read `rootNodeType` or `scope`\n// again. This keeps gotcha rendering simple at the cost of a slightly\n// longer subtype list (4 instead of 1).\n\nexport type MissingSizeConstraintSubType =\n | \"page-container-unbound\"\n | \"page-instance-fixed\"\n | \"component-fixed-by-design\"\n | \"component-fixed-by-override\";\n\nexport const missingSizeConstraintMsg = {\n pageContainerUnbound: (name: string, currentWidth: string): ViolationMsg => ({\n message: `Container \"${name}\" uses FILL width (currently ${currentWidth}) and no ancestor defines a width bound`,\n suggestion: `Decide whether this area should stretch with the screen, or set min/max-width here so the responsive behavior is explicit`,\n }),\n pageInstanceFixed: (name: string, currentWidth: string): ViolationMsg => ({\n message: `Instance \"${name}\" has fixed width (${currentWidth}) inside an Auto Layout parent`,\n suggestion: `Confirm whether this fixed width is intentional — if not, set the instance to FILL so it follows the parent's layout`,\n }),\n componentFixedByDesign: (name: string, currentWidth: string): ViolationMsg => ({\n message: `Component \"${name}\" has fixed width (${currentWidth}) at its root`,\n suggestion: `Confirm whether this component is intentionally non-responsive — otherwise switch root sizing to FILL or set min/max bounds`,\n }),\n componentFixedByOverride: (name: string, currentWidth: string): ViolationMsg => ({\n message: `Instance \"${name}\" overrides root width to fixed (${currentWidth}); the original component may be FILL`,\n suggestion: `Confirm whether the fixed-width override is intentional — if not, restore root sizing to inherit from the component definition`,\n }),\n};\n\n// ── non-layout-container (was group-usage) ───────────────────────────────────\n\nexport type NonLayoutContainerSubType = \"group\" | \"section\";\n\nexport const nonLayoutContainerMsg = {\n group: (name: string): ViolationMsg => ({\n message: `\"${name}\" is a Group`,\n suggestion: `Convert to Frame and apply auto-layout`,\n }),\n section: (name: string): ViolationMsg => ({\n message: `\"${name}\" is a Section used as layout container`,\n suggestion: `Convert to Frame and apply auto-layout`,\n }),\n};\n\n// ── deep-nesting ─────────────────────────────────────────────────────────────\n\nexport const deepNestingMsg = (name: string, depth: number, maxDepth: number): ViolationMsg => ({\n message: `\"${name}\" is nested ${depth} levels deep within its component (max: ${maxDepth})`,\n suggestion: `Extract into a sub-component to reduce depth`,\n});\n\n// ── missing-component ────────────────────────────────────────────────────────\n\nexport const missingComponentMsg = {\n unusedComponent: (componentName: string, count: number): ViolationMsg => ({\n message: `Component \"${componentName}\" exists but ${count} repeated frames found instead of instances`,\n suggestion: `Replace frames with component instances`,\n }),\n nameRepetition: (name: string, count: number): ViolationMsg => ({\n message: `\"${name}\" appears ${count} times`,\n suggestion: `Extract as a reusable component`,\n }),\n structureRepetition: (name: string, siblingCount: number): ViolationMsg => ({\n message: `\"${name}\" and ${siblingCount} sibling frame(s) share the same internal structure`,\n suggestion: `Extract a shared component from the repeated structure`,\n }),\n styleOverride: (componentName: string, overrides: string[]): ViolationMsg => ({\n message: `\"${componentName}\" instance has style overrides (${overrides.join(\", \")})`,\n suggestion: `Create a new variant for this style combination`,\n }),\n};\n\n// ── detached-instance ────────────────────────────────────────────────────────\n\nexport const detachedInstanceMsg = (name: string, componentName: string): ViolationMsg => ({\n message: `\"${name}\" may be a detached instance of component \"${componentName}\"`,\n suggestion: `Restore as an instance of \"${componentName}\" or create a new variant`,\n});\n\n// ── variant-structure-mismatch ───────────────────────────────────────────────\n\nexport const variantStructureMismatchMsg = (name: string, mismatchCount: number, totalVariants: number): ViolationMsg => ({\n message: `\"${name}\" has ${mismatchCount}/${totalVariants} variants with different child structures`,\n suggestion: `Unify variant structures using visibility toggles for optional elements`,\n});\n\n// ── non-standard-naming ──────────────────────────────────────────────────────\n\nexport type NonStandardNamingSubType = \"state-name\";\n\nexport const nonStandardNamingMsg = {\n stateName: (name: string, nonStandard: string, suggested: string): ViolationMsg => ({\n message: `\"${name}\" has non-standard state name \"${nonStandard}\"`,\n suggestion: `Use \"${suggested}\" for dev-friendly naming`,\n }),\n};\n\n// ── non-semantic-name (merged: default-name + non-semantic-name) ─────────────\n\nexport type NonSemanticNameSubType = \"frame\" | \"group\" | \"vector\" | \"shape\" | \"text\" | \"image\" | \"component\" | \"instance\" | \"shape-name\";\n\nconst DEFAULT_NAME_SUBTYPE_MAP: Record<string, NonSemanticNameSubType> = {\n FRAME: \"frame\",\n GROUP: \"group\",\n RECTANGLE: \"shape\",\n ELLIPSE: \"shape\",\n VECTOR: \"vector\",\n LINE: \"vector\",\n STAR: \"shape\",\n REGULAR_POLYGON: \"shape\",\n TEXT: \"text\",\n IMAGE: \"image\",\n COMPONENT: \"component\",\n COMPONENT_SET: \"component\",\n INSTANCE: \"instance\",\n};\n\nexport function getDefaultNameSubType(nodeType: string): NonSemanticNameSubType {\n return DEFAULT_NAME_SUBTYPE_MAP[nodeType] ?? \"frame\";\n}\n\nconst NON_SEMANTIC_EXAMPLES: Record<string, string> = {\n FRAME: '\"Header\", \"ProductCard\", \"Sidebar\"',\n GROUP: '\"NavItems\", \"ButtonGroup\", \"CardContent\"',\n VECTOR: '\"ArrowIcon\", \"CheckMark\", \"LogoSymbol\"',\n LINE: '\"Divider\", \"Separator\", \"Underline\"',\n RECTANGLE: '\"Background\", \"Divider\", \"Overlay\"',\n ELLIPSE: '\"AvatarShape\", \"StatusDot\", \"Badge\"',\n STAR: '\"RatingIcon\", \"FavoriteIcon\", \"StarBadge\"',\n REGULAR_POLYGON: '\"PlayIcon\", \"WarningIcon\", \"ShapeDecor\"',\n TEXT: '\"PageTitle\", \"Description\", \"Price\"',\n IMAGE: '\"Avatar\", \"ProductPhoto\", \"Banner\"',\n COMPONENT: '\"PrimaryButton\", \"InputField\", \"CardTemplate\"',\n COMPONENT_SET: '\"Button\", \"Input\", \"Card\"',\n INSTANCE: '\"CloseButton\", \"UserAvatar\", \"StarIcon\"',\n};\n\nexport const nonSemanticNameMsg = (type: string, name: string): ViolationMsg => {\n const examples = NON_SEMANTIC_EXAMPLES[type] ?? '\"Header\", \"ProductCard\", \"Icon\"';\n return {\n message: `${type} \"${name}\" is a non-semantic name`,\n suggestion: `Rename to describe its role (e.g., ${examples})`,\n };\n};\n\n// ── missing-interaction-state ─────────────────────────────────────────────────\n\nexport type MissingInteractionStateSubType = \"hover\" | \"disabled\" | \"active\" | \"focus\";\n\nexport const missingInteractionStateMsg = {\n hover: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks interactive but has no Hover state variant`,\n suggestion: `Add a State=Hover variant`,\n }),\n disabled: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks interactive but has no Disabled state variant`,\n suggestion: `Add a State=Disabled variant`,\n }),\n active: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks interactive but has no Active state variant`,\n suggestion: `Add a State=Active variant`,\n }),\n focus: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks interactive but has no Focus state variant`,\n suggestion: `Add a State=Focus variant`,\n }),\n};\n\n// ── missing-prototype ─────────────────────────────────────────────────────────\n\nexport type MissingPrototypeSubType = \"button\" | \"navigation\" | \"tab\" | \"overlay\" | \"carousel\" | \"input\" | \"toggle\";\n\nexport const missingPrototypeMsg = {\n button: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks like a button but has no click prototype`,\n suggestion: `Add an ON_CLICK interaction to define the click behavior`,\n }),\n navigation: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks like a navigation link but has no click prototype`,\n suggestion: `Add an ON_CLICK interaction to define the destination`,\n }),\n tab: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks like a tab but has no click prototype`,\n suggestion: `Add an ON_CLICK interaction to define tab switching behavior`,\n }),\n overlay: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks like an overlay trigger but has no click prototype`,\n suggestion: `Add an ON_CLICK interaction to define open/close behavior`,\n }),\n carousel: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks like a carousel but has no interaction prototype`,\n suggestion: `Add an ON_CLICK or ON_DRAG interaction to define slide navigation`,\n }),\n input: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks like an input but has no click prototype`,\n suggestion: `Add an ON_CLICK interaction to define focus/interaction behavior`,\n }),\n toggle: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks like a toggle but has no click prototype`,\n suggestion: `Add an ON_CLICK interaction to define on/off behavior`,\n }),\n};\n\n// ── inconsistent-naming-convention ───────────────────────────────────────────\n\nexport const inconsistentNamingMsg = (name: string, nodeConvention: string, dominantConvention: string, suggested: string): ViolationMsg => ({\n message: `\"${name}\" uses ${nodeConvention} while siblings use ${dominantConvention}`,\n suggestion: `Rename to \"${suggested}\"`,\n guide: `This checks sibling layers at the same level — you don't have to follow the exact suggestion, just keep naming consistent across siblings`,\n});\n","import type { AnalysisNode } from \"../../contracts/figma-node.js\";\nimport type { RuleCheckFn, RuleContext, RuleDefinition, RuleViolation } from \"../../contracts/rule.js\";\nimport { getAnalysisState } from \"../../contracts/rule.js\";\nimport { defineRule } from \"../rule-registry.js\";\nimport { getRuleOption } from \"../rule-config.js\";\nimport { isAutoLayoutExempt, isAbsolutePositionExempt, isFixedSizeExempt } from \"../rule-exceptions.js\";\nimport { noAutoLayoutMsg, absolutePositionMsg, fixedSizeMsg, missingSizeConstraintMsg, nonLayoutContainerMsg, deepNestingMsg } from \"../rule-messages.js\";\nimport { isContainerNode, hasAutoLayout, hasOverlappingBounds } from \"../node-semantics.js\";\n\n// ============================================\n// no-auto-layout (merged: absorbs ambiguous-structure + missing-layout-hint)\n// ============================================\n\nconst noAutoLayoutDef: RuleDefinition = {\n id: \"no-auto-layout\",\n name: \"No Auto Layout\",\n category: \"pixel-critical\",\n why: \"Without Auto Layout, AI must guess positioning from absolute coordinates instead of reading explicit layout rules\",\n impact: \"Generated code uses hardcoded positions that break on any content or screen size change\",\n fix: \"Apply Auto Layout to create clear, explicit structure — enables AI to generate flexbox/grid instead of absolute positioning\",\n};\n\nconst noAutoLayoutCheck: RuleCheckFn = (node, context) => {\n if (!isContainerNode(node)) return null;\n if (hasAutoLayout(node)) return null;\n if (!node.children || node.children.length === 0) return null;\n\n if (isAutoLayoutExempt(node)) return null;\n\n // Priority 1: Check for overlapping visible children (ambiguous-structure)\n if (node.children.length >= 2) {\n for (let i = 0; i < node.children.length; i++) {\n for (let j = i + 1; j < node.children.length; j++) {\n const childA = node.children[i];\n const childB = node.children[j];\n if (!childA || !childB) continue;\n\n if (hasOverlappingBounds(childA, childB)) {\n if (childA.visible !== false && childB.visible !== false) {\n return {\n ruleId: noAutoLayoutDef.id,\n subType: \"overlapping\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...noAutoLayoutMsg.overlapping(node.name),\n };\n }\n }\n }\n }\n }\n\n // Priority 2: Check for nested containers without layout hints (missing-layout-hint)\n if (node.children.length >= 2) {\n const nestedContainers = node.children.filter((c) => isContainerNode(c));\n if (nestedContainers.length >= 2) {\n const withoutLayout = nestedContainers.filter((c) => !hasAutoLayout(c));\n if (withoutLayout.length >= 2) {\n return {\n ruleId: noAutoLayoutDef.id,\n subType: \"nested\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...noAutoLayoutMsg.nested(node.name),\n };\n }\n }\n }\n\n // Priority 3: Basic no-auto-layout check (FRAME only)\n if (node.type !== \"FRAME\") return null;\n\n const childCount = node.children?.length ?? 0;\n let directionHint = \"\";\n if (node.children && node.children.length >= 2) {\n const boxes = node.children.filter(c => c.absoluteBoundingBox).map(c => c.absoluteBoundingBox!);\n if (boxes.length >= 2) {\n const yRange = Math.max(...boxes.map(b => b.y)) - Math.min(...boxes.map(b => b.y));\n const xRange = Math.max(...boxes.map(b => b.x)) - Math.min(...boxes.map(b => b.x));\n directionHint = yRange > xRange ? \"VERTICAL\" : \"HORIZONTAL\";\n }\n }\n\n const arrangement = directionHint\n ? ` (${childCount} children arranged ${directionHint.toLowerCase()}ly)`\n : childCount > 0 ? ` (${childCount} children)` : \"\";\n\n return {\n ruleId: noAutoLayoutDef.id,\n subType: \"basic\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...noAutoLayoutMsg.basic(node.name, arrangement, directionHint),\n };\n};\n\nexport const noAutoLayout = defineRule({\n definition: noAutoLayoutDef,\n check: noAutoLayoutCheck,\n});\n\n// ============================================\n// absolute-position-in-auto-layout\n// ============================================\n\nconst absolutePositionInAutoLayoutDef: RuleDefinition = {\n id: \"absolute-position-in-auto-layout\",\n name: \"Absolute Position in Auto Layout\",\n category: \"pixel-critical\",\n why: \"Absolute positioning inside Auto Layout contradicts the parent's layout rules — AI sees conflicting instructions\",\n impact: \"AI must decide whether to follow the parent's flexbox or the child's absolute position — often gets it wrong\",\n fix: \"Remove absolute positioning or use proper Auto Layout alignment\",\n};\n\nconst absolutePositionInAutoLayoutCheck: RuleCheckFn = (node, context) => {\n if (!context.parent) return null;\n if (!hasAutoLayout(context.parent)) return null;\n if (node.layoutPositioning !== \"ABSOLUTE\") return null;\n\n if (isAbsolutePositionExempt(node)) return null;\n\n return {\n ruleId: absolutePositionInAutoLayoutDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...absolutePositionMsg(node.name, context.parent.name),\n };\n};\n\nexport const absolutePositionInAutoLayout = defineRule({\n definition: absolutePositionInAutoLayoutDef,\n check: absolutePositionInAutoLayoutCheck,\n});\n\n// ============================================\n// fixed-size-in-auto-layout (merged: absorbs fixed-width-in-responsive-context)\n// ============================================\n\nconst fixedSizeInAutoLayoutDef: RuleDefinition = {\n id: \"fixed-size-in-auto-layout\",\n name: \"Fixed Size in Auto Layout\",\n category: \"responsive-critical\",\n why: \"Fixed sizing inside Auto Layout contradicts the flexible layout intent\",\n impact: \"AI generates a rigid element inside a flex container — the layout won't respond to content changes\",\n fix: \"Use 'Hug' or 'Fill' for at least one axis. Both-axes FIXED → layout completely rigid; horizontal-only FIXED → width won't adapt to parent resize\",\n};\n\nconst fixedSizeInAutoLayoutCheck: RuleCheckFn = (node, context) => {\n if (!context.parent) return null;\n if (!hasAutoLayout(context.parent)) return null;\n if (!isContainerNode(node)) return null;\n if (!node.absoluteBoundingBox) return null;\n\n if (isFixedSizeExempt(node)) return null;\n\n const { width, height } = node.absoluteBoundingBox;\n\n // Check both axes FIXED (stronger case)\n const hFixed =\n node.layoutSizingHorizontal === \"FIXED\" || node.layoutSizingHorizontal === undefined;\n const vFixed =\n node.layoutSizingVertical === \"FIXED\" || node.layoutSizingVertical === undefined;\n\n if (hFixed && vFixed) {\n // Skip if it has its own auto-layout\n if (node.layoutMode && node.layoutMode !== \"NONE\") return null;\n\n return {\n ruleId: fixedSizeInAutoLayoutDef.id,\n subType: \"both-axes\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...fixedSizeMsg.bothAxes(node.name, width, height),\n };\n }\n\n // Check horizontal-only FIXED (lighter case, from fixed-width-in-responsive-context)\n if (hFixed && !vFixed) {\n // Use layoutSizingHorizontal if available (accurate)\n if (node.layoutSizingHorizontal) {\n if (node.layoutSizingHorizontal !== \"FIXED\") return null;\n } else {\n // Fallback: STRETCH means fill, skip\n if (node.layoutAlign === \"STRETCH\") return null;\n if (node.layoutAlign !== \"INHERIT\") return null;\n }\n\n return {\n ruleId: fixedSizeInAutoLayoutDef.id,\n subType: \"horizontal\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...fixedSizeMsg.horizontal(node.name, width),\n };\n }\n\n return null;\n};\n\nexport const fixedSizeInAutoLayout = defineRule({\n definition: fixedSizeInAutoLayoutDef,\n check: fixedSizeInAutoLayoutCheck,\n});\n\n// ============================================\n// missing-size-constraint (#403 redesign — scope-aware, info-collection)\n// ============================================\n//\n// Pre-#403 this rule fired on every FILL container with no max-width\n// regardless of whether an ancestor already established a bound, and\n// scored -8/risk. The redesign narrows it to genuinely ambiguous sizing\n// situations and reframes the output as a gotcha rather than a\n// violation (per ADR-017 channel separation):\n//\n// page scope:\n// - container FRAME/SECTION with FILL width AND no chain-bound\n// ancestor (chain-bound = FIXED width OR FILL/HUG with explicit\n// min/max). Fires `page-container-unbound` — designer intent\n// (stretch with screen vs. cap at content) is structurally\n// undecidable.\n// - INSTANCE with FIXED width inside an Auto Layout parent. Fires\n// `page-instance-fixed` — could be intentional override or a stale\n// size carried over from the component definition.\n//\n// component scope:\n// - the analysis root (and only the root — internal nodes pass)\n// with FIXED width. Fires `component-fixed-by-design` for\n// COMPONENT/COMPONENT_SET roots, `component-fixed-by-override`\n// for INSTANCE roots — same shape, different gotcha framing.\n//\n// Deliberately scoped out (see PR body):\n// - INSTANCE FIXED outside Auto Layout — `no-auto-layout` already\n// owns the score channel on the non-auto-layout parent. Firing\n// here too would double-penalize one structural concern.\n// - Nodes inside an INSTANCE — Plugin API silently ignores min/max\n// overrides on instance internal nodes, so the gotcha would be\n// un-actionable.\n// - Height axis — width is the dominant responsive concern; height\n// redesign deferred to a follow-up issue.\n\nconst missingSizeConstraintDef: RuleDefinition = {\n id: \"missing-size-constraint\",\n name: \"Missing Size Constraint\",\n category: \"responsive-critical\",\n why: \"Width sizing without explicit bounds (FIXED root or FILL chained to a bounded ancestor) is structurally indistinguishable from missing information — AI cannot tell whether the designer intended responsive stretching, a fixed cap, or simply forgot to set min/max\",\n impact: \"Generated code either guesses hard-coded widths or omits responsive constraints; either way the runtime layout drifts from the design intent at viewports the designer never explicitly considered\",\n fix: \"Answer the gotcha to declare intent (responsive vs. fixed-by-design vs. instance override), then encode the answer in Figma sizing — FILL/HUG with min/max for responsive bounds, FIXED only when intentionally non-responsive\",\n};\n\n// ── Chain-bound walker (memoized via analysisState) ──────────────────────\n//\n// \"Chain-bound\" = some ancestor in the analysis tree (root included)\n// resolves the width chain by either fixing the width or capping a\n// FILL with min/max. Computed lazily as the rule visits each node:\n// because traverseAndCheck runs the check fn parent-first, by the time\n// a child asks `parentChainBound(child)` the parent's entry is already\n// in the cache. The side-effect MUST run for every visited node — see\n// `recordChainBound` call placement below.\n\ntype ChainBoundCache = Map<string, boolean>;\nconst CHAIN_BOUND_KEY = \"missing-size-constraint:chain-bound\";\n\nfunction getChainBoundCache(context: RuleContext): ChainBoundCache {\n return getAnalysisState(context, CHAIN_BOUND_KEY, () => new Map<string, boolean>());\n}\n\nfunction establishesOwnWidthBound(node: AnalysisNode): boolean {\n if (node.layoutSizingHorizontal === \"FIXED\") return true;\n if (node.minWidth !== undefined || node.maxWidth !== undefined) return true;\n return false;\n}\n\nfunction recordChainBound(context: RuleContext, node: AnalysisNode): boolean {\n const cache = getChainBoundCache(context);\n const cached = cache.get(node.id);\n if (cached !== undefined) return cached;\n const own = establishesOwnWidthBound(node);\n const parent = context.parent;\n const inherited = parent ? cache.get(parent.id) ?? false : false;\n const result = own || inherited;\n cache.set(node.id, result);\n return result;\n}\n\nfunction parentChainBound(context: RuleContext): boolean {\n if (!context.parent) return false;\n return getChainBoundCache(context).get(context.parent.id) ?? false;\n}\n\n// ── Subtype dispatchers ──────────────────────────────────────────────────\n\nconst PAGE_CONTAINER_FRAME_TYPES = new Set([\"FRAME\", \"SECTION\"]);\n\nfunction formatWidth(node: AnalysisNode): string {\n return node.absoluteBoundingBox ? `${node.absoluteBoundingBox.width}px` : \"unknown\";\n}\n\nfunction buildViolation(\n subType: \"page-container-unbound\" | \"page-instance-fixed\" | \"component-fixed-by-design\" | \"component-fixed-by-override\",\n node: AnalysisNode,\n context: RuleContext,\n msg: { message: string; suggestion: string; guide?: string }\n): RuleViolation {\n return {\n ruleId: missingSizeConstraintDef.id,\n subType,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...msg,\n };\n}\n\nfunction checkComponentScopeRoot(\n node: AnalysisNode,\n context: RuleContext\n): RuleViolation | null {\n // Only the analysis root in component scope — internal nodes pass.\n // Variants of a COMPONENT_SET sit at depth=1 and are intentionally\n // skipped; variant-level sizing is the variant-structure-mismatch\n // rule's concern, not this one.\n if (context.depth !== 0) return null;\n if (node.layoutSizingHorizontal !== \"FIXED\") return null;\n\n const currentWidth = formatWidth(node);\n if (context.rootNodeType === \"INSTANCE\") {\n return buildViolation(\n \"component-fixed-by-override\",\n node,\n context,\n missingSizeConstraintMsg.componentFixedByOverride(node.name, currentWidth),\n );\n }\n // COMPONENT, COMPONENT_SET, or scope-overridden FRAME treated as a\n // component definition. The gotcha framing is identical — \"is this\n // intentionally non-responsive?\" — so they share the subtype.\n return buildViolation(\n \"component-fixed-by-design\",\n node,\n context,\n missingSizeConstraintMsg.componentFixedByDesign(node.name, currentWidth),\n );\n}\n\nfunction checkPageInstanceFixed(\n node: AnalysisNode,\n context: RuleContext\n): RuleViolation | null {\n if (node.type !== \"INSTANCE\") return null;\n if (node.layoutSizingHorizontal !== \"FIXED\") return null;\n\n // Scope-out (#403): when the parent is not Auto Layout,\n // `no-auto-layout` already fires on that parent and owns the score\n // channel for the structural problem. Adding a sizing gotcha on top\n // double-counts one underlying issue. The leak case\n // (INSTANCE direct child of a SECTION page-root, where\n // no-auto-layout's behavior on SECTION is ambiguous) will surface in\n // Phase 4's fire-rate gate; revisit then if it actually appears.\n if (!context.parent || !hasAutoLayout(context.parent)) return null;\n\n const currentWidth = formatWidth(node);\n return buildViolation(\n \"page-instance-fixed\",\n node,\n context,\n missingSizeConstraintMsg.pageInstanceFixed(node.name, currentWidth),\n );\n}\n\nfunction checkPageContainerUnbound(\n node: AnalysisNode,\n context: RuleContext\n): RuleViolation | null {\n if (!PAGE_CONTAINER_FRAME_TYPES.has(node.type)) return null;\n if (node.layoutSizingHorizontal !== \"FILL\") return null;\n // Some ancestor already establishes the width bound for this chain —\n // the FILL here will resolve to a finite range, no ambiguity.\n if (parentChainBound(context)) return null;\n\n const currentWidth = formatWidth(node);\n return buildViolation(\n \"page-container-unbound\",\n node,\n context,\n missingSizeConstraintMsg.pageContainerUnbound(node.name, currentWidth),\n );\n}\n\nconst missingSizeConstraintCheck: RuleCheckFn = (node, context) => {\n // Side-effect: record this node's chain-bound status for descendants.\n // MUST run for every visited node BEFORE any early return, otherwise\n // `parentChainBound` lookups on children will miss and silently\n // default to `false`. Co-locating the recorder with the only consumer\n // (this rule) keeps the cache contract local.\n recordChainBound(context, node);\n\n // Actionability filter (#403, D6): the Figma Plugin API silently\n // ignores min/max writes targeting nodes inside an INSTANCE, so any\n // gotcha generated here would be un-actionable. We exclude INSTANCE\n // descendants (but keep the INSTANCE node itself in scope — that's\n // the page-instance-fixed case, where the override IS actionable).\n if (context.ancestorTypes.includes(\"INSTANCE\")) return null;\n\n if (context.scope === \"component\") {\n return checkComponentScopeRoot(node, context);\n }\n\n // page scope — at most one of these fires per node by construction\n // (different node-type predicates), so order does not matter.\n return checkPageInstanceFixed(node, context) ?? checkPageContainerUnbound(node, context);\n};\n\nexport const missingSizeConstraint = defineRule({\n definition: missingSizeConstraintDef,\n check: missingSizeConstraintCheck,\n});\n\n// ============================================\n// non-layout-container (was group-usage — now also catches Section)\n// ============================================\n\nconst nonLayoutContainerDef: RuleDefinition = {\n id: \"non-layout-container\",\n name: \"Non-Layout Container\",\n category: \"pixel-critical\",\n why: \"Groups and Sections lack proper layout rules — AI sees children with absolute coordinates but no container logic\",\n impact: \"AI wraps elements in a plain div with no spacing/alignment, producing fragile layouts\",\n fix: \"Convert to Frame with Auto Layout so AI can generate proper flex/grid containers\",\n};\n\nconst nonLayoutContainerCheck: RuleCheckFn = (node, context) => {\n if (node.type === \"GROUP\") {\n return {\n ruleId: nonLayoutContainerDef.id,\n subType: \"group\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...nonLayoutContainerMsg.group(node.name),\n };\n }\n\n if (node.type === \"SECTION\") {\n return {\n ruleId: nonLayoutContainerDef.id,\n subType: \"section\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...nonLayoutContainerMsg.section(node.name),\n };\n }\n\n return null;\n};\n\nexport const nonLayoutContainer = defineRule({\n definition: nonLayoutContainerDef,\n check: nonLayoutContainerCheck,\n});\n\n// ============================================\n// deep-nesting\n// ============================================\n\nconst deepNestingDef: RuleDefinition = {\n id: \"deep-nesting\",\n name: \"Deep Nesting\",\n category: \"code-quality\",\n why: \"Deep nesting consumes AI context exponentially — each level adds indentation and structural overhead\",\n impact: \"AI may lose track of parent-child relationships in deeply nested trees, producing wrong layout hierarchy\",\n fix: \"Flatten the structure by extracting deeply nested groups into sub-components\",\n};\n\nconst deepNestingCheck: RuleCheckFn = (node, context, options) => {\n const maxDepth = (options?.[\"maxDepth\"] as number) ?? getRuleOption(\"deep-nesting\", \"maxDepth\", 5);\n\n if (context.componentDepth < maxDepth) return null;\n if (!isContainerNode(node)) return null;\n\n return {\n ruleId: deepNestingDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...deepNestingMsg(node.name, context.componentDepth, maxDepth),\n };\n};\n\nexport const deepNesting = defineRule({\n definition: deepNestingDef,\n check: deepNestingCheck,\n});\n\n","import type { RuleCheckFn, RuleDefinition } from \"../../contracts/rule.js\";\nimport { defineRule } from \"../rule-registry.js\";\nimport { getRuleOption } from \"../rule-config.js\";\nimport { rawValueMsg, irregularSpacingMsg } from \"../rule-messages.js\";\nimport { hasStyleReference, hasBoundVariable } from \"../node-semantics.js\";\n\nfunction isOnGrid(value: number, gridBase: number): boolean {\n return value % gridBase === 0;\n}\n\n// ============================================\n// raw-value (merged: raw-color + raw-font + raw-shadow + raw-opacity + raw-spacing)\n// ============================================\n\nconst rawValueDef: RuleDefinition = {\n id: \"raw-value\",\n name: \"Raw Value\",\n category: \"token-management\",\n why: \"Values without design tokens or variables must be reproduced exactly per node — one typo means a visible difference\",\n impact: \"AI cannot reference a shared token, so each raw value is an independent source of error across large pages\",\n fix: \"Use design tokens or variables (color styles, text styles, effect styles, opacity/spacing variables) so values are referenceable\",\n};\n\nconst rawValueCheck: RuleCheckFn = (node, context) => {\n const nodePath = context.path.join(\" > \");\n\n // Check 1: Raw fill color\n if (node.fills && Array.isArray(node.fills) && node.fills.length > 0) {\n if (!hasStyleReference(node, \"fill\") && !hasBoundVariable(node, \"fills\")) {\n for (const fill of node.fills) {\n const fillObj = fill as Record<string, unknown>;\n if (fillObj[\"type\"] === \"SOLID\" && fillObj[\"color\"]) {\n const c = fillObj[\"color\"] as Record<string, number>;\n const hex = `#${Math.round((c[\"r\"] ?? 0) * 255).toString(16).padStart(2, \"0\")}${Math.round((c[\"g\"] ?? 0) * 255).toString(16).padStart(2, \"0\")}${Math.round((c[\"b\"] ?? 0) * 255).toString(16).padStart(2, \"0\")}`.toUpperCase();\n return {\n ruleId: rawValueDef.id,\n subType: \"color\" as const,\n nodeId: node.id,\n nodePath,\n ...rawValueMsg.color(node.name, hex),\n };\n }\n }\n }\n }\n\n // Check 2: Raw font (TEXT nodes without text style)\n if (node.type === \"TEXT\") {\n if (\n !hasStyleReference(node, \"text\") &&\n (!hasBoundVariable(node, \"fontFamily\") || !hasBoundVariable(node, \"fontSize\"))\n ) {\n const fontParts: string[] = [];\n const s = node.style;\n if (s) {\n if (s[\"fontFamily\"]) fontParts.push(String(s[\"fontFamily\"]));\n if (s[\"fontSize\"]) fontParts.push(`${s[\"fontSize\"]}px`);\n if (s[\"fontWeight\"]) fontParts.push(String(s[\"fontWeight\"]));\n }\n const fontDesc = fontParts.length > 0 ? ` (${fontParts.join(\" \")})` : \"\";\n return {\n ruleId: rawValueDef.id,\n subType: \"font\" as const,\n nodeId: node.id,\n nodePath,\n ...rawValueMsg.font(node.name, fontDesc),\n };\n }\n }\n\n // Check 3: Raw shadow (effects without effect style)\n if (node.effects && Array.isArray(node.effects) && node.effects.length > 0) {\n if (!hasStyleReference(node, \"effect\")) {\n for (const effect of node.effects) {\n const effectObj = effect as Record<string, unknown>;\n if (effectObj[\"type\"] === \"DROP_SHADOW\" || effectObj[\"type\"] === \"INNER_SHADOW\") {\n const shadowType = effectObj[\"type\"] === \"DROP_SHADOW\" ? \"drop shadow\" : \"inner shadow\";\n const offset = effectObj[\"offset\"] as Record<string, number> | undefined;\n const radius = effectObj[\"radius\"] as number | undefined;\n const detailParts: string[] = [];\n if (offset) detailParts.push(`offset ${Math.round(offset[\"x\"] ?? 0)},${Math.round(offset[\"y\"] ?? 0)}`);\n if (radius !== undefined) detailParts.push(`blur ${Math.round(radius)}`);\n const details = detailParts.length > 0 ? ` (${detailParts.join(\" \")})` : \"\";\n return {\n ruleId: rawValueDef.id,\n subType: \"shadow\" as const,\n nodeId: node.id,\n nodePath,\n ...rawValueMsg.shadow(node.name, shadowType, details),\n };\n }\n }\n }\n }\n\n // Check 4: Raw opacity (non-default opacity without variable)\n if (node.opacity !== undefined && node.opacity < 1 && !hasBoundVariable(node, \"opacity\")) {\n return {\n ruleId: rawValueDef.id,\n subType: \"opacity\" as const,\n nodeId: node.id,\n nodePath,\n ...rawValueMsg.opacity(node.name, Math.round(node.opacity * 100)),\n };\n }\n\n // Check 5: Raw spacing (padding/gap without variable binding)\n const spacingKeys = [\"paddingLeft\", \"paddingRight\", \"paddingTop\", \"paddingBottom\", \"itemSpacing\"] as const;\n for (const key of spacingKeys) {\n const value = node[key];\n if (value !== undefined && value > 0 && !hasBoundVariable(node, key)) {\n const label = key === \"itemSpacing\" ? \"gap\" : key.replace(\"padding\", \"padding-\").toLowerCase();\n return {\n ruleId: rawValueDef.id,\n subType: \"spacing\" as const,\n nodeId: node.id,\n nodePath,\n ...rawValueMsg.spacing(node.name, label, value),\n };\n }\n }\n\n return null;\n};\n\nexport const rawValue = defineRule({\n definition: rawValueDef,\n check: rawValueCheck,\n});\n\n// ============================================\n// irregular-spacing (merged: inconsistent-spacing + magic-number-spacing)\n// ============================================\n\nconst irregularSpacingDef: RuleDefinition = {\n id: \"irregular-spacing\",\n name: \"Irregular Spacing\",\n category: \"token-management\",\n why: \"Off-grid or arbitrary spacing values force AI to handle many unique values instead of a predictable pattern\",\n impact: \"Higher chance of pixel-level differences when AI substitutes nearby round values\",\n fix: \"Align spacing to the design system grid (e.g., 4pt/8pt increments) for predictable implementation\",\n};\n\nconst irregularSpacingCheck: RuleCheckFn = (node, context, options) => {\n const configuredGridBase = (options?.[\"gridBase\"] as number) ?? getRuleOption(\"irregular-spacing\", \"gridBase\", 4);\n const gridBase = Number.isFinite(configuredGridBase) && configuredGridBase > 0 ? configuredGridBase : 4;\n\n const spacingEntries: Array<{ value: number; subType: \"padding\" | \"gap\" }> = [];\n for (const key of [\"paddingLeft\", \"paddingRight\", \"paddingTop\", \"paddingBottom\"] as const) {\n const v = node[key];\n if (v !== undefined && v > 0) spacingEntries.push({ value: v, subType: \"padding\" });\n }\n if (node.itemSpacing !== undefined && node.itemSpacing > 0) {\n spacingEntries.push({ value: node.itemSpacing, subType: \"gap\" });\n }\n\n // Allow small intentional values\n const commonValues = [1, 2];\n\n for (const entry of spacingEntries) {\n if (commonValues.includes(entry.value)) continue;\n if (!isOnGrid(entry.value, gridBase)) {\n return {\n ruleId: irregularSpacingDef.id,\n subType: entry.subType,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...irregularSpacingMsg(node.name, entry.value, gridBase, Math.round(entry.value / gridBase) * gridBase),\n };\n }\n }\n\n return null;\n};\n\nexport const irregularSpacing = defineRule({\n definition: irregularSpacingDef,\n check: irregularSpacingCheck,\n});\n","import type { RuleCheckFn, RuleDefinition, RuleContext } from \"../../contracts/rule.js\";\nimport { getAnalysisState } from \"../../contracts/rule.js\";\nimport type { AnalysisNode } from \"../../contracts/figma-node.js\";\nimport { defineRule } from \"../rule-registry.js\";\nimport { getRuleOption } from \"../rule-config.js\";\nimport { missingComponentMsg, detachedInstanceMsg, variantStructureMismatchMsg } from \"../rule-messages.js\";\n\n// ============================================\n// Helper functions\n// ============================================\n\n\n/** Style properties to compare between master and instance. */\nconst STYLE_COMPARE_KEYS = [\"fills\", \"strokes\", \"effects\", \"cornerRadius\", \"strokeWeight\", \"individualStrokeWeights\"] as const;\n\n/**\n * Detect style overrides between a component master and an instance.\n * Returns list of property names that differ.\n */\nfunction detectStyleOverrides(master: AnalysisNode, instance: AnalysisNode): string[] {\n const overrides: string[] = [];\n for (const key of STYLE_COMPARE_KEYS) {\n const masterVal = master[key];\n const instanceVal = instance[key];\n // Both undefined/null → no override\n if (masterVal == null && instanceVal == null) continue;\n // One exists, other doesn't → override\n if (masterVal == null || instanceVal == null) {\n overrides.push(key);\n continue;\n }\n // Deep compare via JSON\n if (JSON.stringify(masterVal) !== JSON.stringify(instanceVal)) {\n overrides.push(key);\n }\n }\n return overrides;\n}\n\n/**\n * Collect all frame names in the file for duplicate detection\n */\nfunction collectFrameNames(\n node: AnalysisNode,\n names: Map<string, string[]> = new Map()\n): Map<string, string[]> {\n if (node.type === \"FRAME\" && node.name) {\n const existing = names.get(node.name) ?? [];\n existing.push(node.id);\n names.set(node.name, existing);\n }\n\n if (node.children) {\n for (const child of node.children) {\n collectFrameNames(child, names);\n }\n }\n\n return names;\n}\n\n/**\n * Build a structural fingerprint for a node.\n * The fingerprint encodes type, layoutMode, and child types recursively up to maxDepth.\n */\nfunction buildFingerprint(node: AnalysisNode, depth: number): string {\n if (depth <= 0 || !node.children || node.children.length === 0) {\n return `${node.type}:${node.layoutMode ?? \"NONE\"}`;\n }\n\n const childFingerprints = node.children\n .map((child) => buildFingerprint(child, depth - 1))\n .join(\",\");\n\n return `${node.type}:${node.layoutMode ?? \"NONE\"}:[${childFingerprints}]`;\n}\n\n/**\n * Check if the node is inside an INSTANCE subtree.\n * Walks the full ancestor type chain to detect INSTANCE at any level.\n */\nfunction isInsideInstance(context: {\n ancestorTypes: string[];\n}): boolean {\n return context.ancestorTypes.includes(\"INSTANCE\");\n}\n\n\n\n// ============================================\n// missing-component (unified 4-stage rule)\n// ============================================\n\n/** State keys for per-analysis deduplication via RuleContext.analysisState */\nconst SEEN_STAGE1_KEY = \"missing-component:seenStage1ComponentNames\";\nconst SEEN_STAGE4_KEY = \"missing-component:seenStage4ComponentIds\";\n\nfunction getSeenStage1(context: RuleContext): Set<string> {\n return getAnalysisState(context, SEEN_STAGE1_KEY, () => new Set<string>());\n}\n\nfunction getSeenStage4(context: RuleContext): Set<string> {\n return getAnalysisState(context, SEEN_STAGE4_KEY, () => new Set<string>());\n}\n\nconst missingComponentDef: RuleDefinition = {\n id: \"missing-component\",\n name: \"Missing Component\",\n category: \"code-quality\",\n why: \"Repeated structures, unused components, and divergent instance overrides indicate missing or underutilized components. This inflates AI token consumption and forces manual maintenance.\",\n impact: \"AI code generators reproduce each repeated frame independently instead of emitting a reusable component. Divergent instance overrides produce inconsistent implementations.\",\n fix: \"Create components from repeated structures, use instances instead of duplicated frames, and create variants for instances with significantly different overrides.\",\n};\n\nconst missingComponentCheck: RuleCheckFn = (node, context, options) => {\n // ========================================\n // FRAME stages (1, 2, 3) — ordered by priority\n // ========================================\n if (node.type === \"FRAME\") {\n // Stage 1: Component exists but not used — FRAME name matches a component in metadata AND frame is repeated\n const components = context.file.components;\n const matchingComponent = Object.values(components).find(\n (c) => c.name.toLowerCase() === node.name.toLowerCase()\n );\n\n // Collect frame names once for Stage 1 and Stage 2\n const frameNames = collectFrameNames(context.file.document);\n const sameNameFrames = frameNames.get(node.name);\n const firstFrame = sameNameFrames?.[0];\n\n if (matchingComponent) {\n const seenStage1 = getSeenStage1(context);\n if (\n sameNameFrames &&\n firstFrame !== undefined &&\n sameNameFrames.length >= 2 &&\n !seenStage1.has(node.name.toLowerCase()) &&\n firstFrame === node.id\n ) {\n seenStage1.add(node.name.toLowerCase());\n return {\n ruleId: missingComponentDef.id,\n subType: \"unused-component\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...missingComponentMsg.unusedComponent(matchingComponent.name, sameNameFrames.length),\n };\n }\n }\n\n // Stage 2: Name-based repetition (existing logic)\n const minRepetitions =\n (options?.[\"minRepetitions\"] as number | undefined) ??\n getRuleOption(\"missing-component\", \"minRepetitions\", 3);\n\n if (sameNameFrames && firstFrame !== undefined && sameNameFrames.length >= minRepetitions) {\n if (firstFrame === node.id) {\n return {\n ruleId: missingComponentDef.id,\n subType: \"name-repetition\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...missingComponentMsg.nameRepetition(node.name, sameNameFrames.length),\n };\n }\n }\n\n // Stage 3: Structure-based repetition (absorbed from repeated-frame-structure)\n // Skip if node is inside an INSTANCE subtree\n if (isInsideInstance(context)) return null;\n\n // Skip if parent is COMPONENT_SET\n if (context.parent?.type === \"COMPONENT_SET\") return null;\n\n // Skip if node has no children\n if (!node.children || node.children.length === 0) return null;\n\n const structureMinRepetitions =\n (options?.[\"structureMinRepetitions\"] as number | undefined) ??\n getRuleOption(\"missing-component\", \"structureMinRepetitions\", 2);\n\n const maxFingerprintDepth =\n (options?.[\"maxFingerprintDepth\"] as number | undefined) ??\n getRuleOption(\"missing-component\", \"maxFingerprintDepth\", 3);\n\n // Compute fingerprint for this node\n const fingerprint = buildFingerprint(node, maxFingerprintDepth);\n\n // Access siblings (may be undefined)\n const siblings = context.siblings ?? [];\n\n // Filter siblings to qualifying frames (type === FRAME, not inside INSTANCE, has children)\n const qualifyingSiblings = siblings.filter(\n (s) =>\n s.type === \"FRAME\" &&\n s.children !== undefined &&\n s.children.length > 0\n );\n\n // Count siblings (including self) sharing the same fingerprint\n const matchingNodes = qualifyingSiblings.filter(\n (s) => buildFingerprint(s, maxFingerprintDepth) === fingerprint\n );\n\n // Ensure self is counted (it should be in siblings, but add a guard)\n const selfIsInSiblings = qualifyingSiblings.some((s) => s.id === node.id);\n const count = selfIsInSiblings\n ? matchingNodes.length\n : matchingNodes.length + 1;\n\n if (count >= structureMinRepetitions) {\n // Only emit for the first sibling (by array order) with this fingerprint\n const firstMatch = qualifyingSiblings.find(\n (s) => buildFingerprint(s, maxFingerprintDepth) === fingerprint\n );\n\n // If self is not in siblings list, treat self as first match when no earlier match exists\n const firstMatchId = firstMatch?.id ?? node.id;\n if (firstMatchId === node.id) {\n return {\n ruleId: missingComponentDef.id,\n subType: \"structure-repetition\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...missingComponentMsg.structureRepetition(node.name, count - 1),\n };\n }\n }\n\n return null;\n }\n\n // ========================================\n // Stage 4: Instance style override detection\n // Compares instance styles against component master.\n // Any style override (fills, strokes, effects, cornerRadius) means\n // the designer should use a variant instead.\n // ========================================\n if (node.type === \"INSTANCE\" && node.componentId) {\n const seenStage4 = getSeenStage4(context);\n if (seenStage4.has(node.componentId)) return null;\n\n const componentDefs = context.file.componentDefinitions;\n if (!componentDefs) return null;\n\n const master = componentDefs[node.componentId];\n if (!master) return null;\n\n // Compare style properties between master and instance\n const overrides = detectStyleOverrides(master, node);\n if (overrides.length > 0) {\n // Only mark as seen when we actually flag — allows other instances to be checked\n seenStage4.add(node.componentId);\n const componentMeta = context.file.components[node.componentId];\n const componentName = componentMeta?.name ?? node.name;\n\n return {\n ruleId: missingComponentDef.id,\n subType: \"style-override\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...missingComponentMsg.styleOverride(componentName, overrides),\n };\n }\n return null;\n }\n\n return null;\n};\n\nexport const missingComponent = defineRule({\n definition: missingComponentDef,\n check: missingComponentCheck,\n});\n\n// ============================================\n// detached-instance\n// ============================================\n\nconst detachedInstanceDef: RuleDefinition = {\n id: \"detached-instance\",\n name: \"Detached Instance\",\n category: \"code-quality\",\n why: \"Detached instances lose component relationship — AI sees a one-off frame instead of a reusable component reference\",\n impact: \"AI generates duplicate code instead of reusing the component, inflating output and causing inconsistencies\",\n fix: \"Reset the instance or create a new variant if customization is needed\",\n};\n\nconst detachedInstanceCheck: RuleCheckFn = (node, context) => {\n // A detached instance would be a FRAME that was once an INSTANCE\n // This is hard to detect without historical data\n // Heuristic: Frame with a name that looks like it came from a component\n if (node.type !== \"FRAME\") return null;\n\n // Check if there's a component in the file with a matching name (word boundary)\n const components = context.file.components;\n\n for (const [, component] of Object.entries(components)) {\n const pattern = new RegExp(`\\\\b${component.name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}\\\\b`);\n if (pattern.test(node.name)) {\n // This frame might be a detached instance of this component\n return {\n ruleId: detachedInstanceDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...detachedInstanceMsg(node.name, component.name),\n };\n }\n }\n\n return null;\n};\n\nexport const detachedInstance = defineRule({\n definition: detachedInstanceDef,\n check: detachedInstanceCheck,\n});\n\n// ============================================\n// variant-structure-mismatch\n// ============================================\n\nconst variantStructureMismatchDef: RuleDefinition = {\n id: \"variant-structure-mismatch\",\n name: \"Variant Structure Mismatch\",\n category: \"code-quality\",\n why: \"Variants with different child structures prevent AI from creating a unified component template\",\n impact: \"AI must generate separate implementations for each variant instead of a single parameterized component\",\n fix: \"Ensure all variants share the same child structure, using visibility toggles for optional elements\",\n};\n\nconst variantStructureMismatchCheck: RuleCheckFn = (node, context) => {\n // Only COMPONENT_SET\n if (node.type !== \"COMPONENT_SET\") return null;\n if (!node.children?.length || node.children.length < 2) return null;\n\n // Build fingerprint for each variant child\n const fingerprints = node.children\n .filter(child => child.type === \"COMPONENT\")\n .map(child => buildFingerprint(child, 2));\n\n if (fingerprints.length < 2) return null;\n\n // Compare all fingerprints to the first one\n const base = fingerprints[0];\n const mismatched = fingerprints.filter(fp => fp !== base);\n\n if (mismatched.length === 0) return null;\n\n const mismatchCount = mismatched.length;\n const totalVariants = fingerprints.length;\n\n return {\n ruleId: variantStructureMismatchDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...variantStructureMismatchMsg(node.name, mismatchCount, totalVariants),\n };\n};\n\nexport const variantStructureMismatch = defineRule({\n definition: variantStructureMismatchDef,\n check: variantStructureMismatchCheck,\n});\n\n","import type { RuleCheckFn, RuleDefinition } from \"../../contracts/rule.js\";\nimport { defineRule } from \"../rule-registry.js\";\nimport { getDefaultNameSubType, nonSemanticNameMsg, inconsistentNamingMsg, nonStandardNamingMsg } from \"../rule-messages.js\";\nimport { isExcludedName, isDefaultName, isNonSemanticName, STANDARD_STATE_NAMES, STATE_NAME_SUGGESTIONS, STATE_LIKE_PATTERN } from \"../node-semantics.js\";\n\nfunction capitalize(s: string): string {\n if (!s) return s;\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nfunction detectNamingConvention(name: string): string | null {\n if (/^[a-z]+(-[a-z]+)*$/.test(name)) return \"kebab-case\";\n if (/^[a-z]+(_[a-z]+)*$/.test(name)) return \"snake_case\";\n if (/^[a-z]+([A-Z][a-z]*)*$/.test(name)) return \"camelCase\";\n if (/^[A-Z][a-z]+([A-Z][a-z]*)*$/.test(name)) return \"PascalCase\";\n if (/^[A-Z]+(_[A-Z]+)*$/.test(name)) return \"SCREAMING_SNAKE_CASE\";\n if (/\\s/.test(name)) return \"Title Case\";\n return null;\n}\n\n/** Single capitalized word is compatible with both PascalCase and Title Case */\nfunction isCompatible(nodeConvention: string, dominantConvention: string, name: string): boolean {\n if (!/^[A-Z][a-z]+$/.test(name)) return false;\n const pair = new Set([nodeConvention, dominantConvention]);\n return pair.has(\"PascalCase\") && pair.has(\"Title Case\");\n}\n\n/** Split a name into words regardless of convention */\nfunction splitWords(name: string): string[] {\n // Title Case / space-separated\n if (/\\s/.test(name)) return name.split(/\\s+/);\n // SCREAMING_SNAKE_CASE or snake_case\n if (name.includes(\"_\")) return name.split(\"_\");\n // kebab-case\n if (name.includes(\"-\")) return name.split(\"-\");\n // camelCase / PascalCase — split on uppercase boundaries (including acronym runs)\n return name\n .replace(/([a-z0-9])([A-Z])/g, \"$1\\0$2\")\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1\\0$2\")\n .split(\"\\0\");\n}\n\n/** Convert a name to the target convention */\nfunction convertName(name: string, target: string): string {\n const words = splitWords(name);\n switch (target) {\n case \"kebab-case\":\n return words.map(w => w.toLowerCase()).join(\"-\");\n case \"snake_case\":\n return words.map(w => w.toLowerCase()).join(\"_\");\n case \"camelCase\":\n return words.map((w, i) => i === 0 ? w.toLowerCase() : w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join(\"\");\n case \"PascalCase\":\n return words.map(w => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join(\"\");\n case \"SCREAMING_SNAKE_CASE\":\n return words.map(w => w.toUpperCase()).join(\"_\");\n case \"Title Case\":\n return words.map(w => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join(\" \");\n default:\n return name;\n }\n}\n\n// ============================================\n// non-semantic-name (merged: default-name + non-semantic-name)\n// ============================================\n\nconst nonSemanticNameDef: RuleDefinition = {\n id: \"non-semantic-name\",\n name: \"Non-Semantic Name\",\n category: \"semantic\",\n why: \"Default or shape names give AI no semantic context — it cannot choose appropriate HTML tags or class names\",\n impact: \"AI generates generic <div> wrappers instead of semantic elements like <header>, <nav>, <article>\",\n fix: \"Rename with a descriptive, purpose-driven name (e.g., 'Header', 'ProductCard', 'Divider')\",\n};\n\nconst nonSemanticNameCheck: RuleCheckFn = (node, context) => {\n if (!node.name) return null;\n if (isExcludedName(node.name)) return null;\n\n // Check 1: Figma default names (Frame 1, Group 2, etc.)\n if (isDefaultName(node.name)) {\n return {\n ruleId: nonSemanticNameDef.id,\n subType: getDefaultNameSubType(node.type),\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...nonSemanticNameMsg(node.type, node.name),\n };\n }\n\n // Check 2: Shape-only names (rectangle, ellipse, vector, etc.)\n if (isNonSemanticName(node.name)) {\n // Allow shape names for actual shape primitives at leaf level\n if (!node.children || node.children.length === 0) {\n const shapeTypes = [\"RECTANGLE\", \"ELLIPSE\", \"VECTOR\", \"LINE\", \"STAR\", \"REGULAR_POLYGON\"];\n if (shapeTypes.includes(node.type)) return null;\n }\n\n return {\n ruleId: nonSemanticNameDef.id,\n subType: \"shape-name\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...nonSemanticNameMsg(node.type, node.name),\n };\n }\n\n return null;\n};\n\nexport const nonSemanticName = defineRule({\n definition: nonSemanticNameDef,\n check: nonSemanticNameCheck,\n});\n\n// ============================================\n// inconsistent-naming-convention\n// ============================================\n\nconst inconsistentNamingConventionDef: RuleDefinition = {\n id: \"inconsistent-naming-convention\",\n name: \"Inconsistent Naming Convention\",\n category: \"semantic\",\n why: \"Mixed naming conventions (camelCase + kebab-case + Title Case) at the same level confuse AI pattern recognition\",\n impact: \"AI generates inconsistent class/component names, making the codebase harder to maintain\",\n fix: \"Pick one convention for sibling elements (e.g., kebab-case: 'product-card', or PascalCase: 'ProductCard') — AI maps names to CSS classes and component names, so mixed conventions produce inconsistent code\",\n};\n\nconst inconsistentNamingConventionCheck: RuleCheckFn = (node, context) => {\n if (!context.siblings || context.siblings.length < 2) return null;\n\n // Detect conventions used by siblings\n const conventions = new Map<string, number>();\n let ambiguousPascalCount = 0;\n\n for (const sibling of context.siblings) {\n if (!sibling.name) continue;\n const convention = detectNamingConvention(sibling.name);\n if (convention) {\n conventions.set(convention, (conventions.get(convention) ?? 0) + 1);\n if (convention === \"PascalCase\" && /^[A-Z][a-z]+$/.test(sibling.name)) {\n ambiguousPascalCount++;\n }\n }\n }\n\n // Single capitalized words (Header, Footer) are detected as PascalCase but are\n // equally valid as Title Case. When both conventions appear, discount these\n // ambiguous names so they don't bias the dominant convention toward PascalCase.\n if (conventions.has(\"PascalCase\") && conventions.has(\"Title Case\") && ambiguousPascalCount > 0) {\n const adjusted = (conventions.get(\"PascalCase\") ?? 0) - ambiguousPascalCount;\n if (adjusted <= 0) {\n conventions.delete(\"PascalCase\");\n } else {\n conventions.set(\"PascalCase\", adjusted);\n }\n }\n\n // Skip if we can't detect clear conventions\n if (conventions.size < 2) return null;\n\n // Find the dominant convention\n let dominantConvention = \"\";\n let maxCount = 0;\n for (const [convention, count] of conventions) {\n if (count > maxCount) {\n maxCount = count;\n dominantConvention = convention;\n }\n }\n\n // Check if current node violates the dominant convention\n const nodeConvention = detectNamingConvention(node.name);\n if (nodeConvention && nodeConvention !== dominantConvention && maxCount >= 2) {\n // Single capitalized word is compatible with both PascalCase and Title Case\n if (isCompatible(nodeConvention, dominantConvention, node.name)) return null;\n\n const suggested = convertName(node.name, dominantConvention);\n // #372: suppress when the case-conversion produces the same string as\n // the current name. Single-character names (\"X\"), all-numeric names, and\n // any input whose every word maps to itself across cases all fall into\n // this bucket — flagging them produces a no-op rename, an empty diff\n // visible as a misleading \"✅ resolved\" wrap-up entry.\n if (suggested === node.name) return null;\n return {\n ruleId: inconsistentNamingConventionDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n suggestedName: suggested,\n ...inconsistentNamingMsg(node.name, nodeConvention, dominantConvention, suggested),\n };\n }\n\n return null;\n};\n\nexport const inconsistentNamingConvention = defineRule({\n definition: inconsistentNamingConventionDef,\n check: inconsistentNamingConventionCheck,\n});\n\n// ============================================\n// non-standard-naming\n// ============================================\n\nconst nonStandardNamingDef: RuleDefinition = {\n id: \"non-standard-naming\",\n name: \"Non-Standard Naming\",\n category: \"semantic\",\n why: \"Non-standard state names prevent interaction rules from detecting state variants — AI cannot generate correct :hover/:active/:disabled styles\",\n impact: \"Interaction state detection fails, resulting in static UI with no state transitions\",\n fix: \"Use platform-standard state names: default, hover, active, pressed, selected, highlighted, disabled, enabled, focus, focused, dragged\",\n};\n\nconst nonStandardNamingCheck: RuleCheckFn = (node, context) => {\n // Only check COMPONENT_SET (variant container)\n if (node.type !== \"COMPONENT_SET\") return null;\n if (!node.componentPropertyDefinitions) return null;\n\n for (const prop of Object.values(node.componentPropertyDefinitions)) {\n const p = prop as Record<string, unknown>;\n if (p[\"type\"] !== \"VARIANT\") continue;\n const options = p[\"variantOptions\"];\n if (!Array.isArray(options)) continue;\n\n for (const opt of options) {\n if (typeof opt !== \"string\") continue;\n const lower = opt.toLowerCase().trim();\n\n // Skip if it's a standard name\n if (STANDARD_STATE_NAMES.has(lower)) continue;\n\n // Check if it matches a known non-standard state name\n if (STATE_LIKE_PATTERN.test(opt)) {\n const suggestion = STATE_NAME_SUGGESTIONS[lower];\n if (suggestion) {\n return {\n ruleId: nonStandardNamingDef.id,\n subType: \"state-name\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n suggestedName: capitalize(suggestion),\n ...nonStandardNamingMsg.stateName(node.name, opt, suggestion),\n };\n }\n }\n }\n }\n\n return null;\n};\n\nexport const nonStandardNaming = defineRule({\n definition: nonStandardNamingDef,\n check: nonStandardNamingCheck,\n});\n\n","import type { RuleCheckFn, RuleDefinition, RuleContext } from \"../../contracts/rule.js\";\nimport { getAnalysisState } from \"../../contracts/rule.js\";\nimport type { AnalysisNode } from \"../../contracts/figma-node.js\";\nimport { defineRule } from \"../rule-registry.js\";\nimport type { MissingInteractionStateSubType, MissingPrototypeSubType } from \"../rule-messages.js\";\nimport { missingInteractionStateMsg, missingPrototypeMsg } from \"../rule-messages.js\";\nimport { getStatefulComponentType, isOverlayNode, isCarouselNode, type StatefulComponentType } from \"../node-semantics.js\";\n\n/** Expected state variants by interactive type */\nconst EXPECTED_STATES: Record<StatefulComponentType, MissingInteractionStateSubType[]> = {\n button: [\"hover\", \"active\", \"disabled\"],\n link: [\"hover\"],\n tab: [\"hover\", \"active\"],\n input: [\"focus\", \"disabled\"],\n toggle: [\"disabled\"],\n};\n\n/** State name patterns — web + mobile platform standard names */\nconst STATE_PATTERNS: Record<MissingInteractionStateSubType, RegExp> = {\n hover: /\\bhover\\b/i,\n disabled: /\\bdisabled\\b/i,\n active: /\\b(active|pressed|selected|highlighted)\\b/i,\n focus: /\\bfocus(ed)?\\b/i,\n};\n\n// ============================================\n// Helpers\n// ============================================\n\n/** Dedup key: emit at most one violation per componentId + subType */\nconst SEEN_KEY = \"missing-interaction-state:seen\";\n\nfunction getSeen(context: RuleContext): Set<string> {\n return getAnalysisState(context, SEEN_KEY, () => new Set<string>());\n}\n\n/**\n * Check if a state variant exists via componentPropertyDefinitions.\n * Looks for VARIANT type properties where variantOptions contain the state name.\n */\nfunction hasStateInVariantProps(node: AnalysisNode, statePattern: RegExp): boolean {\n if (!node.componentPropertyDefinitions) return false;\n for (const prop of Object.values(node.componentPropertyDefinitions)) {\n const p = prop as Record<string, unknown>;\n if (p[\"type\"] !== \"VARIANT\") continue;\n const options = p[\"variantOptions\"];\n if (!Array.isArray(options)) continue;\n if (options.some((opt) => typeof opt === \"string\" && statePattern.test(opt))) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Check if a state variant exists via component master's componentPropertyDefinitions.\n * Falls back to componentDefinitions (fetched masters) when the instance itself\n * doesn't carry the property definitions.\n */\nfunction hasStateInComponentMaster(\n node: AnalysisNode,\n context: RuleContext,\n statePattern: RegExp,\n): boolean {\n if (!node.componentId) return false;\n const defs = context.file.componentDefinitions;\n if (!defs) return false;\n const master = defs[node.componentId];\n if (!master) return false;\n return hasStateInVariantProps(master, statePattern);\n}\n\n/**\n * Master names that look like a single variant of a SET (e.g. `State=Default`,\n * `Variant=Primary, State=Default, Size=Medium`). When a fetched COMPONENT\n * carries this naming AND has no own `componentPropertyDefinitions`, the\n * variant axes live on the parent COMPONENT_SET — which the loader does not\n * fetch today (#397). Treat as undeterminable rather than asserting a missing\n * variant we cannot actually see.\n */\nconst VARIANT_POSITION_NAME_RE = /^[\\w ]+=[^,]+(,\\s*[\\w ]+=[^,]+)*$/;\n\nfunction hasUsablePropDefs(propDefs: unknown): boolean {\n // `undefined` = not fetched; `null` = REST returned blank (e.g. variant\n // INSIDE a SET — axes live on the SET parent, not here). Both are\n // non-evidence. `{}` (fetched-and-empty) IS positive evidence the master\n // truly has no axes — must keep firing per the test for #354.\n return propDefs != null && typeof propDefs === \"object\";\n}\n\n/**\n * Decide whether we have enough source data to assert a state variant is missing.\n *\n * The Figma REST API does not consistently mirror `componentPropertyDefinitions`\n * onto deeply-nested INSTANCE children, and `context.file.componentDefinitions`\n * only contains masters the loader actually fetched (external-library masters\n * stay null even after extra passes). When BOTH paths are empty for an INSTANCE\n * we cannot tell whether the master defines the variant or not — treat that as\n * \"unknown\" (return false here) rather than asserting a missing variant.\n *\n * The fetched master may also be a single variant of a SET (name like\n * `State=Default`); the variant axes live on the SET parent which we do not\n * fetch. Detect this via name pattern and treat as undeterminable too (#397).\n *\n * COMPONENT nodes are special: a COMPONENT IS the master, so the absence of\n * `componentPropertyDefinitions` on a COMPONENT is itself meaningful evidence\n * (standalone master with no variant axis at all) — UNLESS the COMPONENT name\n * follows the variant-position pattern, in which case the SET parent holds the\n * axes and we cannot decide.\n */\nfunction canDetermineVariants(node: AnalysisNode, context: RuleContext): boolean {\n if (hasUsablePropDefs(node.componentPropertyDefinitions)) return true;\n if (node.type === \"COMPONENT\") {\n return !VARIANT_POSITION_NAME_RE.test(node.name);\n }\n if (node.componentId !== undefined) {\n const defs = context.file.componentDefinitions;\n const master = defs?.[node.componentId];\n if (master) {\n if (hasUsablePropDefs(master.componentPropertyDefinitions)) return true;\n return !VARIANT_POSITION_NAME_RE.test(master.name);\n }\n }\n return false;\n}\n\n// ============================================\n// missing-interaction-state\n// ============================================\n\nconst missingInteractionStateDef: RuleDefinition = {\n id: \"missing-interaction-state\",\n name: \"Missing Interaction State\",\n category: \"interaction\",\n why: \"Interactive components without state variants force AI to guess hover/focus/disabled appearances — or skip them entirely\",\n impact: \"Generated code has no :hover, :focus, or :disabled styles, making the UI feel static and unresponsive\",\n fix: \"Add state variants (Hover, Disabled, Focus, Active) to interactive components in Figma\",\n};\n\nconst missingInteractionStateCheck: RuleCheckFn = (node, context) => {\n // Only check component instances and components\n if (node.type !== \"INSTANCE\" && node.type !== \"COMPONENT\") return null;\n\n const interactiveType = getStatefulComponentType(node);\n if (!interactiveType) return null;\n\n const expectedStates = EXPECTED_STATES[interactiveType];\n if (!expectedStates) return null;\n\n // Probe gate: only assert a missing variant when we can actually observe the\n // master's variant axes. For nested INSTANCE children whose master was not\n // fetched into `componentDefinitions` and whose own `componentPropertyDefinitions`\n // is undefined, treat the verdict as unknown and skip — this avoids the\n // false-positive class described in #354. The data-availability check is\n // per-node (not per-state), so it lives outside the for-loop below.\n if (!canDetermineVariants(node, context)) return null;\n\n const seen = getSeen(context);\n const nodePath = context.path.join(\" > \");\n\n for (const state of expectedStates) {\n const dedupeKey = `${node.componentId ?? node.id}:${state}`;\n if (seen.has(dedupeKey)) continue;\n\n const pattern = STATE_PATTERNS[state];\n\n // Check variant properties on instance\n if (hasStateInVariantProps(node, pattern)) continue;\n\n // Check variant properties on component master (fetched definitions)\n if (hasStateInComponentMaster(node, context, pattern)) continue;\n\n // Missing state — report first missing one\n seen.add(dedupeKey);\n return {\n ruleId: missingInteractionStateDef.id,\n subType: state,\n nodeId: node.id,\n nodePath,\n ...missingInteractionStateMsg[state](node.name),\n };\n }\n\n return null;\n};\n\nexport const missingInteractionState = defineRule({\n definition: missingInteractionStateDef,\n check: missingInteractionStateCheck,\n});\n\n// ============================================\n// missing-prototype\n// ============================================\n\n/** Interactive types that need click prototype */\nconst PROTOTYPE_TYPES: Record<StatefulComponentType, MissingPrototypeSubType> = {\n button: \"button\",\n link: \"navigation\",\n tab: \"tab\",\n input: \"input\",\n toggle: \"toggle\",\n};\n\nfunction getPrototypeSubType(node: AnalysisNode): MissingPrototypeSubType | null {\n // Check overlay/carousel first — select/dropdown are classified as \"input\" in\n // STATEFUL_PATTERNS but need \"overlay\" subType for prototype checks\n if (isOverlayNode(node)) return \"overlay\";\n if (isCarouselNode(node)) return \"carousel\";\n const interactiveType = getStatefulComponentType(node);\n if (interactiveType) {\n const mapped = PROTOTYPE_TYPES[interactiveType];\n if (mapped) return mapped;\n }\n return null;\n}\n\nfunction hasInteractionTrigger(node: AnalysisNode, triggerType: string): boolean {\n if (!node.interactions || !Array.isArray(node.interactions)) return false;\n return node.interactions.some((interaction) => {\n const i = interaction as { trigger?: { type?: string } };\n return i.trigger?.type === triggerType;\n });\n}\n\n/** Check if node (or its component master) has any of the given trigger types */\nfunction hasAnyInteraction(node: AnalysisNode, context: RuleContext, triggers: string[]): boolean {\n for (const trigger of triggers) {\n if (hasInteractionTrigger(node, trigger)) return true;\n }\n // INSTANCE nodes don't inherit interactions from master — check master fallback\n if (node.componentId && context.file.componentDefinitions) {\n const master = context.file.componentDefinitions[node.componentId];\n if (master) {\n for (const trigger of triggers) {\n if (hasInteractionTrigger(master, trigger)) return true;\n }\n }\n }\n return false;\n}\n\n/** Trigger types to check per subType */\nconst PROTOTYPE_TRIGGERS: Record<string, string[]> = {\n carousel: [\"ON_CLICK\", \"ON_DRAG\"],\n};\n\nconst DEFAULT_TRIGGERS = [\"ON_CLICK\"];\n\nconst missingPrototypeDef: RuleDefinition = {\n id: \"missing-prototype\",\n name: \"Missing Prototype\",\n category: \"interaction\",\n why: \"Interactive elements without prototype interactions give AI no information about navigation or behavior\",\n impact: \"AI cannot generate interaction handlers, routing, or state changes — interactive elements become static\",\n fix: \"Add prototype interactions (ON_CLICK, ON_DRAG) to define navigation targets or state changes\",\n};\n\nconst SEEN_PROTO_KEY = \"missing-prototype:seen\";\n\nfunction getSeenProto(context: RuleContext): Set<string> {\n return getAnalysisState(context, SEEN_PROTO_KEY, () => new Set<string>());\n}\n\nconst missingPrototypeCheck: RuleCheckFn = (node, context) => {\n if (node.type !== \"INSTANCE\" && node.type !== \"COMPONENT\" && node.type !== \"FRAME\") return null;\n\n const subType = getPrototypeSubType(node);\n if (!subType) return null;\n\n // Already has relevant interaction (click, or drag for carousel)\n const triggers = PROTOTYPE_TRIGGERS[subType] ?? DEFAULT_TRIGGERS;\n if (hasAnyInteraction(node, context, triggers)) return null;\n\n // Dedup per componentId + subType\n const seen = getSeenProto(context);\n const dedupeKey = `${node.componentId ?? node.id}:${subType}`;\n if (seen.has(dedupeKey)) return null;\n seen.add(dedupeKey);\n\n return {\n ruleId: missingPrototypeDef.id,\n subType,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...missingPrototypeMsg[subType](node.name),\n };\n};\n\nexport const missingPrototype = defineRule({\n definition: missingPrototypeDef,\n check: missingPrototypeCheck,\n});\n","import { z } from \"zod\";\n\nexport const FigmaUrlInfoSchema = z.object({\n fileKey: z.string(),\n nodeId: z.string().optional(),\n fileName: z.string().optional(),\n});\n\nexport type FigmaUrlInfo = z.infer<typeof FigmaUrlInfoSchema>;\n\nconst FIGMA_URL_PATTERNS = [\n // https://www.figma.com/design/FILE_KEY/FILE_NAME?node-id=NODE_ID\n /figma\\.com\\/design\\/([a-zA-Z0-9]+)(?:\\/([^?]+))?(?:\\?.*node-id=([^&]+))?/,\n // https://www.figma.com/file/FILE_KEY/FILE_NAME?node-id=NODE_ID\n /figma\\.com\\/file\\/([a-zA-Z0-9]+)(?:\\/([^?]+))?(?:\\?.*node-id=([^&]+))?/,\n // https://www.figma.com/proto/FILE_KEY/FILE_NAME?node-id=NODE_ID\n /figma\\.com\\/proto\\/([a-zA-Z0-9]+)(?:\\/([^?]+))?(?:\\?.*node-id=([^&]+))?/,\n];\n\nexport function parseFigmaUrl(url: string): FigmaUrlInfo {\n for (const pattern of FIGMA_URL_PATTERNS) {\n const match = url.match(pattern);\n if (match) {\n const [, fileKey, fileName, nodeId] = match;\n if (!fileKey) {\n throw new FigmaUrlParseError(`Invalid Figma URL: missing file key`);\n }\n return {\n fileKey,\n fileName: fileName ? decodeURIComponent(fileName) : undefined,\n nodeId: nodeId ? decodeURIComponent(nodeId) : undefined,\n };\n }\n }\n\n throw new FigmaUrlParseError(\n `Invalid Figma URL format. Expected: https://www.figma.com/design/FILE_KEY/...`\n );\n}\n\nexport class FigmaUrlParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"FigmaUrlParseError\";\n }\n}\n\n/**\n * Extract the commentable node ID from a potentially nested instance path.\n * Instance-internal IDs like \"I3010:7457;1442:7704\" use semicolons to\n * separate path segments. The Figma Comments API only accepts simple IDs\n * (e.g. \"3010:7457\"), so we take the first segment and strip the \"I\" prefix.\n */\nexport function toCommentableNodeId(nodeId: string): string {\n const firstSegment = nodeId.split(\";\")[0]!;\n return firstSegment.replace(/^I/, \"\");\n}\n\nexport function buildFigmaDeepLink(fileKey: string, nodeId: string): string {\n // Strip instance-internal path to top-level node:\n // \"I175:7425;1442:7704\" → \"175:7425\" → \"175-7425\"\n const topNodeId = toCommentableNodeId(nodeId).replace(/:/g, \"-\");\n return `https://www.figma.com/design/${fileKey}?node-id=${topNodeId}`;\n}\n","import type { GetFileResponse, Node } from \"@figma/rest-api-spec\";\n\nconst FIGMA_API_BASE = \"https://api.figma.com/v1\";\n\nexport interface GetFileNodesResponse {\n name: string;\n lastModified: string;\n version: string;\n nodes: Record<string, {\n document: Node;\n components: GetFileResponse[\"components\"];\n styles: GetFileResponse[\"styles\"];\n }>;\n}\n\nexport interface FigmaClientOptions {\n token: string;\n}\n\nexport class FigmaClient {\n private token: string;\n\n constructor(options: FigmaClientOptions) {\n this.token = options.token;\n }\n\n static fromEnv(): FigmaClient {\n const token = process.env[\"FIGMA_TOKEN\"];\n if (!token) {\n throw new FigmaClientError(\n \"FIGMA_TOKEN environment variable is not set\"\n );\n }\n return new FigmaClient({ token });\n }\n\n async getFile(fileKey: string): Promise<GetFileResponse> {\n const url = `${FIGMA_API_BASE}/files/${fileKey}`;\n const response = await fetch(url, {\n headers: {\n \"X-Figma-Token\": this.token,\n },\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new FigmaClientError(\n `Failed to fetch file: ${response.status} ${response.statusText}`,\n response.status,\n error\n );\n }\n\n return response.json() as Promise<GetFileResponse>;\n }\n\n /**\n * Get rendered images for specific nodes\n * Returns a map of nodeId → image URL\n */\n async getNodeImages(\n fileKey: string,\n nodeIds: string[],\n options?: { format?: \"png\" | \"svg\" | \"jpg\"; scale?: number }\n ): Promise<Record<string, string | null>> {\n const format = options?.format ?? \"png\";\n const scale = options?.scale ?? 2;\n\n // Batch into chunks to avoid 414 URI Too Large\n const BATCH_SIZE = 50;\n const allImages: Record<string, string | null> = {};\n\n for (let i = 0; i < nodeIds.length; i += BATCH_SIZE) {\n const batch = nodeIds.slice(i, i + BATCH_SIZE);\n const ids = batch.join(\",\");\n const url = `${FIGMA_API_BASE}/images/${fileKey}?ids=${encodeURIComponent(ids)}&format=${format}&scale=${scale}`;\n const response = await fetch(url, {\n headers: {\n \"X-Figma-Token\": this.token,\n },\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new FigmaClientError(\n `Failed to fetch images: ${response.status} ${response.statusText}`,\n response.status,\n error\n );\n }\n\n const data = await response.json() as { images: Record<string, string | null> };\n for (const [nodeId, imageUrl] of Object.entries(data.images)) {\n allImages[nodeId] = imageUrl;\n }\n }\n\n return allImages;\n }\n\n /**\n * Get original image fill URLs by imageRef.\n * Returns a mapping of imageRef → download URL for all image fills in the file.\n */\n async getImageFills(fileKey: string): Promise<Record<string, string>> {\n const url = `${FIGMA_API_BASE}/files/${fileKey}/images`;\n const response = await fetch(url, {\n headers: { \"X-Figma-Token\": this.token },\n });\n if (!response.ok) {\n const error = await response.text().catch(() => \"\");\n throw new FigmaClientError(\n `Failed to fetch image fills: ${response.status} ${response.statusText}`,\n response.status,\n error\n );\n }\n const data = await response.json() as { meta?: { images?: Record<string, string> } };\n return data.meta?.images ?? {};\n }\n\n /**\n * Download an image URL and return as base64\n */\n async fetchImageAsBase64(imageUrl: string): Promise<string> {\n const response = await fetch(imageUrl);\n if (!response.ok) {\n throw new FigmaClientError(\n `Failed to download image: ${response.status}`,\n response.status\n );\n }\n const buffer = await response.arrayBuffer();\n return Buffer.from(buffer).toString(\"base64\");\n }\n\n async getFileNodes(\n fileKey: string,\n nodeIds: string[]\n ): Promise<GetFileNodesResponse> {\n const ids = nodeIds.join(\",\");\n const url = `${FIGMA_API_BASE}/files/${fileKey}/nodes?ids=${encodeURIComponent(ids)}`;\n const response = await fetch(url, {\n headers: {\n \"X-Figma-Token\": this.token,\n },\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new FigmaClientError(\n `Failed to fetch nodes: ${response.status} ${response.statusText}`,\n response.status,\n error\n );\n }\n\n return response.json() as Promise<GetFileNodesResponse>;\n }\n}\n\nexport class FigmaClientError extends Error {\n constructor(\n message: string,\n public statusCode?: number,\n public responseBody?: unknown\n ) {\n super(message);\n this.name = \"FigmaClientError\";\n }\n}\n","import type { GetFileResponse, Node } from \"@figma/rest-api-spec\";\nimport type { GetFileNodesResponse } from \"./figma-client.js\";\nimport type { AnalysisFile, AnalysisNode } from \"../contracts/figma-node.js\";\n\n/**\n * Transform Figma API response to analysis types\n */\nexport function transformFigmaResponse(\n fileKey: string,\n response: GetFileResponse\n): AnalysisFile {\n return {\n fileKey,\n name: response.name,\n lastModified: response.lastModified,\n version: response.version,\n document: transformNode(response.document),\n components: transformComponents(response.components),\n styles: transformStyles(response.styles),\n };\n}\n\nfunction transformNode(node: Node): AnalysisNode {\n const base: AnalysisNode = {\n id: node.id,\n name: node.name,\n type: node.type as AnalysisNode[\"type\"],\n visible: \"visible\" in node ? (node.visible ?? true) : true,\n };\n\n // Layout properties\n if (\"layoutMode\" in node && node.layoutMode) {\n base.layoutMode = node.layoutMode as AnalysisNode[\"layoutMode\"];\n }\n if (\"layoutAlign\" in node && node.layoutAlign) {\n base.layoutAlign = node.layoutAlign as AnalysisNode[\"layoutAlign\"];\n }\n if (\"layoutPositioning\" in node && node.layoutPositioning) {\n base.layoutPositioning =\n node.layoutPositioning as AnalysisNode[\"layoutPositioning\"];\n }\n if (\"layoutSizingHorizontal\" in node && node.layoutSizingHorizontal) {\n base.layoutSizingHorizontal =\n node.layoutSizingHorizontal as AnalysisNode[\"layoutSizingHorizontal\"];\n }\n if (\"layoutSizingVertical\" in node && node.layoutSizingVertical) {\n base.layoutSizingVertical =\n node.layoutSizingVertical as AnalysisNode[\"layoutSizingVertical\"];\n }\n if (\"primaryAxisAlignItems\" in node) {\n base.primaryAxisAlignItems = node.primaryAxisAlignItems as string;\n }\n if (\"counterAxisAlignItems\" in node) {\n base.counterAxisAlignItems = node.counterAxisAlignItems as string;\n }\n if (\"itemSpacing\" in node) {\n base.itemSpacing = node.itemSpacing as number;\n }\n if (\"paddingLeft\" in node) {\n base.paddingLeft = node.paddingLeft as number;\n }\n if (\"paddingRight\" in node) {\n base.paddingRight = node.paddingRight as number;\n }\n if (\"paddingTop\" in node) {\n base.paddingTop = node.paddingTop as number;\n }\n if (\"paddingBottom\" in node) {\n base.paddingBottom = node.paddingBottom as number;\n }\n\n // Size constraints (responsive)\n if (\"minWidth\" in node && typeof node.minWidth === \"number\") {\n base.minWidth = node.minWidth;\n }\n if (\"maxWidth\" in node && typeof node.maxWidth === \"number\") {\n base.maxWidth = node.maxWidth;\n }\n if (\"minHeight\" in node && typeof node.minHeight === \"number\") {\n base.minHeight = node.minHeight;\n }\n if (\"maxHeight\" in node && typeof node.maxHeight === \"number\") {\n base.maxHeight = node.maxHeight;\n }\n if (\"layoutGrow\" in node && node.layoutGrow !== undefined) {\n base.layoutGrow = node.layoutGrow as 0 | 1;\n }\n if (\"constraints\" in node && node.constraints) {\n base.constraints = node.constraints as AnalysisNode[\"constraints\"];\n }\n\n // Wrap (flex-wrap)\n if (\"layoutWrap\" in node && node.layoutWrap) {\n base.layoutWrap = node.layoutWrap as AnalysisNode[\"layoutWrap\"];\n }\n if (\"counterAxisSpacing\" in node && typeof node.counterAxisSpacing === \"number\") {\n base.counterAxisSpacing = node.counterAxisSpacing;\n }\n if (\"counterAxisAlignContent\" in node && node.counterAxisAlignContent) {\n base.counterAxisAlignContent =\n node.counterAxisAlignContent as AnalysisNode[\"counterAxisAlignContent\"];\n }\n\n // Grid layout (container)\n if (\"gridRowCount\" in node && typeof node.gridRowCount === \"number\") {\n base.gridRowCount = node.gridRowCount;\n }\n if (\"gridColumnCount\" in node && typeof node.gridColumnCount === \"number\") {\n base.gridColumnCount = node.gridColumnCount;\n }\n if (\"gridRowGap\" in node && typeof node.gridRowGap === \"number\") {\n base.gridRowGap = node.gridRowGap;\n }\n if (\"gridColumnGap\" in node && typeof node.gridColumnGap === \"number\") {\n base.gridColumnGap = node.gridColumnGap;\n }\n if (\"gridColumnsSizing\" in node && typeof node.gridColumnsSizing === \"string\") {\n base.gridColumnsSizing = node.gridColumnsSizing;\n }\n if (\"gridRowsSizing\" in node && typeof node.gridRowsSizing === \"string\") {\n base.gridRowsSizing = node.gridRowsSizing;\n }\n\n // Grid layout (child)\n if (\"gridChildHorizontalAlign\" in node && node.gridChildHorizontalAlign) {\n base.gridChildHorizontalAlign =\n node.gridChildHorizontalAlign as AnalysisNode[\"gridChildHorizontalAlign\"];\n }\n if (\"gridChildVerticalAlign\" in node && node.gridChildVerticalAlign) {\n base.gridChildVerticalAlign =\n node.gridChildVerticalAlign as AnalysisNode[\"gridChildVerticalAlign\"];\n }\n if (\"gridRowSpan\" in node && typeof node.gridRowSpan === \"number\") {\n base.gridRowSpan = node.gridRowSpan;\n }\n if (\"gridColumnSpan\" in node && typeof node.gridColumnSpan === \"number\") {\n base.gridColumnSpan = node.gridColumnSpan;\n }\n if (\"gridRowAnchorIndex\" in node && typeof node.gridRowAnchorIndex === \"number\") {\n base.gridRowAnchorIndex = node.gridRowAnchorIndex;\n }\n if (\"gridColumnAnchorIndex\" in node && typeof node.gridColumnAnchorIndex === \"number\") {\n base.gridColumnAnchorIndex = node.gridColumnAnchorIndex;\n }\n\n // Overflow / clip\n if (\"clipsContent\" in node && typeof node.clipsContent === \"boolean\") {\n base.clipsContent = node.clipsContent;\n }\n if (\"overflowDirection\" in node && node.overflowDirection) {\n base.overflowDirection =\n node.overflowDirection as AnalysisNode[\"overflowDirection\"];\n }\n\n // Size/position\n if (\"absoluteBoundingBox\" in node && node.absoluteBoundingBox) {\n base.absoluteBoundingBox = node.absoluteBoundingBox;\n }\n\n // Component properties\n if (\"componentId\" in node) {\n base.componentId = node.componentId as string;\n }\n if (\"componentPropertyDefinitions\" in node) {\n base.componentPropertyDefinitions =\n node.componentPropertyDefinitions as Record<string, unknown>;\n }\n if (\"componentProperties\" in node) {\n base.componentProperties = node.componentProperties as Record<\n string,\n unknown\n >;\n }\n\n // Style properties\n if (\"styles\" in node) {\n base.styles = node.styles as Record<string, string>;\n }\n if (\"fills\" in node) {\n base.fills = node.fills as unknown[];\n }\n if (\"strokes\" in node) {\n base.strokes = node.strokes as unknown[];\n }\n if (\"strokeWeight\" in node && typeof node.strokeWeight === \"number\") {\n base.strokeWeight = node.strokeWeight;\n }\n if (\"individualStrokeWeights\" in node && node.individualStrokeWeights) {\n base.individualStrokeWeights = node.individualStrokeWeights as Record<string, number>;\n }\n if (\"effects\" in node) {\n base.effects = node.effects as unknown[];\n }\n if (\"cornerRadius\" in node && typeof node.cornerRadius === \"number\") {\n base.cornerRadius = node.cornerRadius;\n }\n if (\"opacity\" in node && typeof node.opacity === \"number\" && node.opacity < 1) {\n base.opacity = node.opacity;\n }\n\n // Variable bindings\n if (\"boundVariables\" in node && node.boundVariables) {\n base.boundVariables = node.boundVariables as Record<string, unknown>;\n }\n\n // Text properties\n if (\"characters\" in node) {\n base.characters = node.characters as string;\n }\n if (\"style\" in node) {\n base.style = node.style as Record<string, unknown>;\n }\n if (\"textTruncation\" in node && (node.textTruncation === \"DISABLED\" || node.textTruncation === \"ENDING\")) {\n base.textTruncation = node.textTruncation;\n }\n if (\"maxLines\" in node && typeof node.maxLines === \"number\") {\n base.maxLines = node.maxLines;\n }\n\n // Handoff status\n if (\"devStatus\" in node && node.devStatus) {\n base.devStatus = node.devStatus as AnalysisNode[\"devStatus\"];\n }\n\n // Prototype interactions\n if (\"interactions\" in node && Array.isArray(node.interactions) && node.interactions.length > 0) {\n base.interactions = node.interactions;\n }\n\n // Recursively transform children\n if (\"children\" in node && Array.isArray(node.children)) {\n base.children = node.children.map(transformNode);\n }\n\n return base;\n}\n\n/**\n * Transform Figma /v1/files/{key}/nodes response to analysis types.\n * Returns the first node's subtree as the document.\n */\nexport function transformFileNodesResponse(\n fileKey: string,\n response: GetFileNodesResponse\n): AnalysisFile {\n const entries = Object.values(response.nodes);\n const first = entries[0];\n if (!first)\n throw new Error(\n \"No nodes returned from Figma API — the node-id in the URL may be invalid or deleted. \" +\n \"Try selecting the frame in Figma and copying the link again.\"\n );\n\n return {\n fileKey,\n name: response.name,\n lastModified: response.lastModified,\n version: response.version,\n document: transformNode(first.document),\n components: transformComponents(first.components),\n styles: transformStyles(first.styles),\n };\n}\n\n/**\n * Transform component master nodes from a /v1/files/{key}/nodes response.\n * Each requested node ID is transformed into an AnalysisNode if present.\n */\nexport function transformComponentMasterNodes(\n response: GetFileNodesResponse,\n requestedIds: string[]\n): Record<string, AnalysisNode> {\n const result: Record<string, AnalysisNode> = {};\n for (const id of requestedIds) {\n const entry = response.nodes[id];\n if (entry?.document) {\n result[id] = transformNode(entry.document);\n }\n }\n return result;\n}\n\nfunction transformComponents(\n components: GetFileResponse[\"components\"]\n): AnalysisFile[\"components\"] {\n const result: AnalysisFile[\"components\"] = {};\n for (const [id, component] of Object.entries(components)) {\n result[id] = {\n key: component.key,\n name: component.name,\n description: component.description,\n };\n }\n return result;\n}\n\nfunction transformStyles(\n styles: GetFileResponse[\"styles\"]\n): AnalysisFile[\"styles\"] {\n const result: AnalysisFile[\"styles\"] = {};\n for (const [id, style] of Object.entries(styles)) {\n result[id] = {\n key: style.key,\n name: style.name,\n styleType: style.styleType,\n };\n }\n return result;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { basename, dirname } from \"node:path\";\nimport type { GetFileResponse } from \"@figma/rest-api-spec\";\nimport type { AnalysisFile, AnalysisNode } from \"../contracts/figma-node.js\";\nimport { AnalysisNodeSchema } from \"../contracts/figma-node.js\";\nimport { transformFigmaResponse } from \"./figma-transformer.js\";\n\n/**\n * Extract fileKey from fixture path.\n * - fixtures/name/data.json → name (directory-based fixture)\n * - fixtures/name.json → name (legacy flat fixture)\n */\nfunction extractFileKey(filePath: string): string {\n const fileName = basename(filePath, \".json\");\n if (fileName === \"data\") {\n // Directory-based fixture: use parent directory name\n return basename(dirname(filePath));\n }\n return fileName;\n}\n\n/**\n * Load Figma data from a JSON file\n * For MVP testing and fixture support\n */\nexport async function loadFigmaFileFromJson(\n filePath: string\n): Promise<AnalysisFile> {\n const content = await readFile(filePath, \"utf-8\");\n const data = JSON.parse(content) as GetFileResponse & {\n componentDefinitions?: Record<string, unknown>;\n interactionDestinations?: Record<string, unknown>;\n };\n\n const fileKey = extractFileKey(filePath);\n\n const file = transformFigmaResponse(fileKey, data);\n\n // Preserve componentDefinitions from previously-saved fixtures\n if (data.componentDefinitions) {\n const parsed: Record<string, AnalysisNode> = {};\n for (const [id, raw] of Object.entries(data.componentDefinitions)) {\n const result = AnalysisNodeSchema.safeParse(raw);\n if (result.success) {\n parsed[id] = result.data;\n } else {\n console.debug(`[figma-file-loader] componentDefinitions[${id}] failed validation:`, result.error.issues);\n }\n }\n if (Object.keys(parsed).length > 0) {\n file.componentDefinitions = parsed;\n }\n }\n\n // Preserve interactionDestinations from previously-saved fixtures\n if (data.interactionDestinations) {\n const parsed: Record<string, AnalysisNode> = {};\n for (const [id, raw] of Object.entries(data.interactionDestinations)) {\n const result = AnalysisNodeSchema.safeParse(raw);\n if (result.success) {\n parsed[id] = result.data;\n } else {\n console.debug(`[figma-file-loader] interactionDestinations[${id}] failed validation:`, result.error.issues);\n }\n }\n if (Object.keys(parsed).length > 0) {\n file.interactionDestinations = parsed;\n }\n }\n\n return file;\n}\n\n/**\n * Parse Figma data from a JSON string\n */\nexport function parseFigmaJson(\n json: string,\n fileKey: string\n): AnalysisFile {\n const data = JSON.parse(json) as GetFileResponse;\n return transformFigmaResponse(fileKey, data);\n}\n\nexport class FigmaFileLoadError extends Error {\n constructor(message: string, public filePath?: string) {\n super(message);\n this.name = \"FigmaFileLoadError\";\n }\n}\n","import type { FigmaClient } from \"./figma-client.js\";\nimport type { AnalysisNode } from \"../contracts/figma-node.js\";\nimport { transformComponentMasterNodes } from \"./figma-transformer.js\";\n\nconst BATCH_SIZE = 50;\n\n/**\n * Recursively collect all unique componentId values from INSTANCE nodes.\n */\nexport function collectComponentIds(node: AnalysisNode): Set<string> {\n const ids = new Set<string>();\n\n function walk(n: AnalysisNode): void {\n if (n.type === \"INSTANCE\" && n.componentId) {\n ids.add(n.componentId);\n }\n if (n.children) {\n for (const child of n.children) {\n walk(child);\n }\n }\n }\n\n walk(node);\n return ids;\n}\n\n/**\n * Recursively collect all unique interaction destination IDs from nodes.\n * These are the node IDs that interactions (e.g., ON_HOVER → CHANGE_TO) point to.\n */\nexport function collectInteractionDestinationIds(node: AnalysisNode): Set<string> {\n const ids = new Set<string>();\n\n function walk(n: AnalysisNode): void {\n if (n.interactions && Array.isArray(n.interactions)) {\n for (const interaction of n.interactions) {\n const i = interaction as {\n trigger?: { type?: string };\n actions?: Array<{ destinationId?: string; navigation?: string }>;\n };\n if (i.trigger?.type === \"ON_HOVER\" && i.actions) {\n for (const action of i.actions) {\n if (action.navigation === \"CHANGE_TO\" && action.destinationId) {\n ids.add(action.destinationId);\n }\n }\n }\n }\n }\n if (n.children) {\n for (const child of n.children) {\n walk(child);\n }\n }\n }\n\n walk(node);\n return ids;\n}\n\n/**\n * Resolve component master node trees via multi-pass fetching.\n *\n * Pass 1: collect component IDs from the document tree, fetch their masters.\n * Pass 2+: collect component IDs from fetched masters that were not in previous passes.\n * Repeats up to maxPasses (default 2).\n *\n * Batches API calls at BATCH_SIZE IDs per request.\n * Skips IDs that return null (e.g. external library components).\n */\nexport async function resolveComponentDefinitions(\n client: FigmaClient,\n fileKey: string,\n document: AnalysisNode,\n maxPasses = 2\n): Promise<Record<string, AnalysisNode>> {\n const allDefinitions: Record<string, AnalysisNode> = {};\n const resolvedIds = new Set<string>();\n\n // Pass 1: collect from the original document\n let pendingIds = collectComponentIds(document);\n\n for (let pass = 0; pass < maxPasses; pass++) {\n // Filter out already-resolved IDs\n const idsToFetch = [...pendingIds].filter((id) => !resolvedIds.has(id));\n if (idsToFetch.length === 0) break;\n\n // Fetch in batches\n for (let i = 0; i < idsToFetch.length; i += BATCH_SIZE) {\n const batch = idsToFetch.slice(i, i + BATCH_SIZE);\n try {\n const response = await client.getFileNodes(fileKey, batch);\n const transformed = transformComponentMasterNodes(response, batch);\n for (const [id, node] of Object.entries(transformed)) {\n allDefinitions[id] = node;\n }\n } catch (err) {\n // Skip failed batches (e.g. external library components)\n console.debug(`[component-resolver] batch fetch failed (${batch.length} ids):`, err);\n }\n }\n\n // Mark all attempted IDs as resolved (even if they failed/returned null)\n for (const id of idsToFetch) {\n resolvedIds.add(id);\n }\n\n // Collect new IDs only from masters fetched in this pass (not all accumulated)\n pendingIds = new Set<string>();\n for (const id of idsToFetch) {\n const node = allDefinitions[id];\n if (node) {\n for (const nestedId of collectComponentIds(node)) {\n if (!resolvedIds.has(nestedId)) {\n pendingIds.add(nestedId);\n }\n }\n }\n }\n }\n\n return allDefinitions;\n}\n\n/**\n * Resolve interaction destination nodes (e.g., hover variants).\n *\n * Collects all destinationId values from interactions in the document,\n * excludes those already in componentDefinitions, and fetches them.\n */\nexport async function resolveInteractionDestinations(\n client: FigmaClient,\n fileKey: string,\n document: AnalysisNode,\n existingDefinitions?: Record<string, AnalysisNode>,\n): Promise<Record<string, AnalysisNode>> {\n const destIds = collectInteractionDestinationIds(document);\n if (destIds.size === 0) return {};\n\n const allDestinations: Record<string, AnalysisNode> = {};\n const idsToFetch: string[] = [];\n\n for (const id of destIds) {\n const existing = existingDefinitions?.[id];\n if (existing) {\n allDestinations[id] = existing;\n } else {\n idsToFetch.push(id);\n }\n }\n\n if (idsToFetch.length === 0) return allDestinations;\n\n for (let i = 0; i < idsToFetch.length; i += BATCH_SIZE) {\n const batch = idsToFetch.slice(i, i + BATCH_SIZE);\n try {\n const response = await client.getFileNodes(fileKey, batch);\n const transformed = transformComponentMasterNodes(response, batch);\n for (const [id, node] of Object.entries(transformed)) {\n allDestinations[id] = node;\n }\n } catch (err) {\n console.debug(`[component-resolver] interaction destination fetch failed (${batch.length} ids):`, err);\n }\n }\n\n return allDestinations;\n}\n","import { z } from \"zod\";\nimport { AnalysisScopeSchema } from \"../../core/contracts/analysis-scope.js\";\n\nexport const SamplingStrategySchema = z.enum([\"all\", \"top-issues\", \"random\"]);\nexport type SamplingStrategy = z.infer<typeof SamplingStrategySchema>;\n\nexport const CalibrationStatusSchema = z.enum([\n \"pending\",\n \"analyzing\",\n \"converting\",\n \"evaluating\",\n \"tuning\",\n \"completed\",\n \"failed\",\n]);\nexport type CalibrationStatus = z.infer<typeof CalibrationStatusSchema>;\n\nexport const CalibrationConfigSchema = z.object({\n input: z.string(),\n token: z.string().optional(),\n targetNodeId: z.string().optional(),\n maxConversionNodes: z.number().int().positive().default(20),\n samplingStrategy: SamplingStrategySchema.default(\"top-issues\"),\n outputPath: z.string().default(\"logs/calibration/calibration-report.md\"),\n runDir: z.string().optional(),\n /**\n * #404: Explicit analysis scope for the calibration run. When omitted,\n * the orchestrator (`scripts/calibrate.ts`) injects `\"page\"` as the\n * policy default — `fixtures/done/*` are conceptually pages even though\n * they are stored as `COMPONENT` variants (\"Platform=Desktop\" etc.) and\n * would otherwise auto-detect as component scope. A `.scope` file in\n * the fixture directory overrides the default per-fixture.\n */\n scope: AnalysisScopeSchema.optional(),\n});\n\nexport type CalibrationConfig = z.infer<typeof CalibrationConfigSchema>;\nexport type CalibrationConfigInput = z.input<typeof CalibrationConfigSchema>;\n\nexport interface CalibrationRun {\n config: CalibrationConfig;\n status: CalibrationStatus;\n startedAt: string;\n completedAt?: string;\n error?: string;\n}\n","import { z } from \"zod\";\nimport type { AnalysisResult } from \"../../core/engine/rule-engine.js\";\nimport type { ScoreReport } from \"../../core/engine/scoring.js\";\nimport type { RuleId } from \"../../core/contracts/rule.js\";\nimport type { Severity } from \"../../core/contracts/severity.js\";\n\nexport const NodeIssueSummarySchema = z.object({\n nodeId: z.string(),\n nodePath: z.string(),\n totalScore: z.number(),\n issueCount: z.number(),\n flaggedRuleIds: z.array(z.string()),\n severities: z.array(z.string()),\n});\n\nexport type NodeIssueSummary = z.infer<typeof NodeIssueSummarySchema>;\n\nexport interface AnalysisAgentInput {\n analysisResult: AnalysisResult;\n}\n\nexport interface AnalysisAgentOutput {\n analysisResult: AnalysisResult;\n scoreReport: ScoreReport;\n nodeIssueSummaries: NodeIssueSummary[];\n}\n\nexport interface NodeIssueDetail {\n ruleId: RuleId;\n severity: Severity;\n calculatedScore: number;\n message: string;\n}\n","import { z } from \"zod\";\n\nexport const DifficultySchema = z.enum([\"easy\", \"moderate\", \"hard\", \"failed\"]);\nexport type Difficulty = z.infer<typeof DifficultySchema>;\n\nexport const RuleRelatedStruggleSchema = z.object({\n ruleId: z.string(),\n description: z.string(),\n actualImpact: DifficultySchema,\n});\n\nexport type RuleRelatedStruggle = z.infer<typeof RuleRelatedStruggleSchema>;\n\nexport const UncoveredStruggleSchema = z.object({\n description: z.string(),\n suggestedCategory: z.string(),\n estimatedImpact: DifficultySchema,\n});\n\nexport type UncoveredStruggle = z.infer<typeof UncoveredStruggleSchema>;\n\nexport const ConversionRecordSchema = z.object({\n nodeId: z.string(),\n nodePath: z.string(),\n generatedCode: z.string(),\n difficulty: DifficultySchema,\n notes: z.string(),\n ruleRelatedStruggles: z.array(RuleRelatedStruggleSchema),\n uncoveredStruggles: z.array(UncoveredStruggleSchema),\n durationMs: z.number(),\n});\n\nexport type ConversionRecord = z.infer<typeof ConversionRecordSchema>;\n\nexport const StripTypeEnum = z.enum([\n \"layout-direction-spacing\",\n \"size-constraints\",\n \"component-references\",\n \"node-names-hierarchy\",\n \"variable-references\",\n \"style-references\",\n]);\n\nexport const StripDeltaResultSchema = z.object({\n stripType: StripTypeEnum,\n // Pixel similarity (design viewport)\n baselineSimilarity: z.number(),\n strippedSimilarity: z.number(),\n delta: z.number().finite(),\n deltaDifficulty: DifficultySchema,\n // Responsive similarity (expanded viewport — primarily for size-constraints)\n baselineResponsiveSimilarity: z.number().finite().nullable().optional(),\n strippedResponsiveSimilarity: z.number().finite().nullable().optional(),\n responsiveDelta: z.number().finite().nullable().optional(),\n responsiveViewport: z.number().int().positive().nullable().optional(),\n // Input tokens (design-tree token count)\n baselineInputTokens: z.number().int().nonnegative().optional(),\n strippedInputTokens: z.number().int().nonnegative().optional(),\n tokenDelta: z.number().int().optional(),\n // HTML output size\n baselineHtmlBytes: z.number().int().nonnegative().optional(),\n strippedHtmlBytes: z.number().int().nonnegative().optional(),\n htmlBytesDelta: z.number().int().optional(),\n // CSS metrics\n baselineCssClassCount: z.number().int().nonnegative().optional(),\n strippedCssClassCount: z.number().int().nonnegative().optional(),\n baselineCssVariableCount: z.number().int().nonnegative().optional(),\n strippedCssVariableCount: z.number().int().nonnegative().optional(),\n});\n\nexport const StripDeltasArraySchema = z.array(StripDeltaResultSchema);\n\nexport type StripDeltaResult = z.infer<typeof StripDeltaResultSchema>;\n\nexport const RuleImpactAssessmentSchema = z.array(\n z.object({\n ruleId: z.string(),\n issueCount: z.number(),\n actualImpact: z.string(),\n description: z.string(),\n })\n);\n\nexport const UncoveredStrugglesInputSchema = z.array(\n z.object({\n description: z.string(),\n suggestedCategory: z.string(),\n estimatedImpact: z.string(),\n })\n);\n\n","import { z } from \"zod\";\nimport { DifficultySchema } from \"./conversion-agent.js\";\nimport { SeveritySchema } from \"../../core/contracts/severity.js\";\n\nexport const MismatchTypeSchema = z.enum([\n \"overscored\",\n \"underscored\",\n \"missing-rule\",\n \"validated\",\n]);\nexport type MismatchType = z.infer<typeof MismatchTypeSchema>;\n\nexport const MismatchCaseSchema = z.object({\n type: MismatchTypeSchema,\n nodeId: z.string(),\n nodePath: z.string(),\n ruleId: z.string().optional(),\n currentScore: z.number().optional(),\n currentSeverity: SeveritySchema.optional(),\n actualDifficulty: DifficultySchema,\n reasoning: z.string(),\n category: z.string().optional(),\n description: z.string().optional(),\n});\n\nexport type MismatchCase = z.infer<typeof MismatchCaseSchema>;\n\nexport interface StripDeltaForEval {\n /** Pixel similarity delta (baseline - stripped) at design viewport */\n pixelDelta: number;\n /** Responsive pixel similarity delta at expanded viewport (null if not measured) */\n responsiveDelta: number | null;\n /** Baseline design-tree input token count */\n baselineInputTokens: number | null;\n /** Stripped design-tree input token count */\n strippedInputTokens: number | null;\n}\n\nexport interface EvaluationAgentInput {\n nodeIssueSummaries: Array<{\n nodeId: string;\n nodePath: string;\n flaggedRuleIds: string[];\n }>;\n conversionRecords: Array<{\n nodeId: string;\n nodePath: string;\n difficulty: string;\n ruleRelatedStruggles: Array<{\n ruleId: string;\n description: string;\n actualImpact: string;\n }>;\n uncoveredStruggles: Array<{\n description: string;\n suggestedCategory: string;\n estimatedImpact: string;\n }>;\n }>;\n ruleScores: Record<string, { score: number; severity: string }>;\n /**\n * Responsive viewport comparison delta (similarity - responsiveSimilarity).\n * Positive = design breaks at expanded viewport. Used to evaluate responsive-critical rules.\n * null/undefined = no responsive comparison available.\n */\n responsiveDelta?: number | null | undefined;\n /**\n * Strip ablation results keyed by strip type.\n * Contains pixel delta, token counts, responsive delta, and HTML metrics per strip.\n * Used to objectively override AI self-assessment with category-appropriate metrics.\n * undefined = no strip ablation data available.\n */\n stripDeltas?: Record<string, StripDeltaForEval> | undefined;\n /**\n * Whether the conversion was whole-design (single root record covering the entire page).\n * When true, evaluation merges all nodeIssueSummaries' flaggedRuleIds into the single record\n * so rules flagged on child nodes aren't silently dropped.\n */\n wholeDesign?: boolean | undefined;\n}\n\nexport interface EvaluationAgentOutput {\n mismatches: MismatchCase[];\n validatedRules: string[];\n}\n","import { z } from \"zod\";\nimport { SeveritySchema } from \"../../core/contracts/severity.js\";\nimport type { CrossRunEvidence } from \"./evidence.js\";\n\nexport const ConfidenceSchema = z.enum([\"high\", \"medium\", \"low\"]);\nexport type Confidence = z.infer<typeof ConfidenceSchema>;\n\nexport const ScoreAdjustmentSchema = z.object({\n ruleId: z.string(),\n currentScore: z.number(),\n proposedScore: z.number(),\n currentSeverity: SeveritySchema,\n proposedSeverity: SeveritySchema.optional(),\n reasoning: z.string(),\n confidence: ConfidenceSchema,\n supportingCases: z.number(),\n proposedDisable: z.boolean().optional(),\n});\n\nexport type ScoreAdjustment = z.infer<typeof ScoreAdjustmentSchema>;\n\nexport const NewRuleProposalSchema = z.object({\n suggestedId: z.string(),\n category: z.string(),\n description: z.string(),\n suggestedSeverity: SeveritySchema,\n suggestedScore: z.number(),\n reasoning: z.string(),\n supportingCases: z.number(),\n});\n\nexport type NewRuleProposal = z.infer<typeof NewRuleProposalSchema>;\n\nexport interface TuningAgentInput {\n mismatches: Array<{\n type: string;\n nodeId: string;\n nodePath: string;\n ruleId?: string | undefined;\n currentScore?: number | undefined;\n currentSeverity?: string | undefined;\n actualDifficulty: string;\n reasoning: string;\n category?: string | undefined;\n description?: string | undefined;\n }>;\n ruleScores: Record<string, { score: number; severity: string }>;\n priorEvidence?: CrossRunEvidence;\n}\n\nexport interface TuningAgentOutput {\n adjustments: ScoreAdjustment[];\n newRuleProposals: NewRuleProposal[];\n}\n","import { z } from \"zod\";\n\nexport const GapEntrySchema = z.object({\n category: z.string(),\n description: z.string(),\n pixelImpact: z.string().optional(),\n coveredByRule: z.string().nullable().optional(),\n coveredByExistingRule: z.boolean().optional(),\n existingRule: z.string().nullable().optional(),\n causedByInterpretation: z.boolean().optional(),\n actionable: z.boolean().optional(),\n suggestedRuleCategory: z.string().optional(),\n area: z.string().optional(),\n});\n\nexport type GapEntry = z.infer<typeof GapEntrySchema>;\n\nexport const GapAnalyzerOutputSchema = z.object({\n fixture: z.string().optional(),\n similarity: z.number().optional(),\n timestamp: z.string().optional(),\n gaps: z.array(GapEntrySchema),\n summary: z\n .object({\n totalGaps: z.number(),\n actionableGaps: z.number(),\n coveredByExistingRules: z.number(),\n newRuleCandidates: z.number(),\n renderingArtifacts: z.number(),\n })\n .optional(),\n newRuleSuggestions: z\n .array(\n z.object({\n ruleId: z.string(),\n rationale: z.string().optional(),\n })\n )\n .optional(),\n});\n\nexport type GapAnalyzerOutput = z.infer<typeof GapAnalyzerOutputSchema>;\n","import type { AnalysisResult } from \"../core/engine/rule-engine.js\";\nimport { calculateScores } from \"../core/engine/scoring.js\";\nimport type { RuleId } from \"../core/contracts/rule.js\";\nimport type { Severity } from \"../core/contracts/severity.js\";\nimport type {\n AnalysisAgentInput,\n AnalysisAgentOutput,\n NodeIssueSummary,\n} from \"./contracts/analysis-agent.js\";\n\n/**\n * Group issues by nodeId and produce sorted summaries\n */\nfunction buildNodeIssueSummaries(\n result: AnalysisResult\n): NodeIssueSummary[] {\n const nodeMap = new Map<\n string,\n {\n nodePath: string;\n totalScore: number;\n issueCount: number;\n ruleIds: Set<string>;\n severities: Set<string>;\n }\n >();\n\n for (const issue of result.issues) {\n const nodeId = issue.violation.nodeId;\n const existing = nodeMap.get(nodeId);\n\n if (existing) {\n existing.totalScore += issue.calculatedScore;\n existing.issueCount++;\n existing.ruleIds.add(issue.rule.definition.id);\n existing.severities.add(issue.config.severity);\n } else {\n nodeMap.set(nodeId, {\n nodePath: issue.violation.nodePath,\n totalScore: issue.calculatedScore,\n issueCount: 1,\n ruleIds: new Set([issue.rule.definition.id]),\n severities: new Set([issue.config.severity as string]),\n });\n }\n }\n\n const summaries: NodeIssueSummary[] = [];\n\n for (const [nodeId, data] of nodeMap) {\n summaries.push({\n nodeId,\n nodePath: data.nodePath,\n totalScore: data.totalScore,\n issueCount: data.issueCount,\n flaggedRuleIds: [...data.ruleIds],\n severities: [...data.severities],\n });\n }\n\n // Sort by totalScore ascending (most negative = most problematic first)\n summaries.sort((a, b) => a.totalScore - b.totalScore);\n\n return summaries;\n}\n\n/**\n * Extract rule scores map from analysis result for downstream agents\n */\nexport function extractRuleScores(\n result: AnalysisResult\n): Record<string, { score: number; severity: string }> {\n const scores: Record<string, { score: number; severity: string }> = {};\n\n for (const issue of result.issues) {\n const ruleId = issue.rule.definition.id as RuleId;\n if (!scores[ruleId]) {\n scores[ruleId] = {\n score: issue.config.score,\n severity: issue.config.severity as Severity,\n };\n }\n }\n\n return scores;\n}\n\n/**\n * Analysis Agent - Step 1 of calibration pipeline\n *\n * Wraps existing analyzeFile + calculateScores and adds\n * nodeId-grouped issue summaries for downstream agents.\n */\nexport function runAnalysisAgent(\n input: AnalysisAgentInput\n): AnalysisAgentOutput {\n const { analysisResult } = input;\n\n const scoreReport = calculateScores(analysisResult);\n const nodeIssueSummaries = buildNodeIssueSummaries(analysisResult);\n\n return {\n analysisResult,\n scoreReport,\n nodeIssueSummaries,\n };\n}\n","import type {\n EvaluationAgentInput,\n EvaluationAgentOutput,\n MismatchCase,\n MismatchType,\n StripDeltaForEval,\n} from \"./contracts/evaluation-agent.js\";\nimport type { Difficulty } from \"./contracts/conversion-agent.js\";\nimport type { Severity } from \"../core/contracts/severity.js\";\nimport type { RuleId } from \"../core/contracts/rule.js\";\nimport { RULE_ID_CATEGORY } from \"../core/rules/rule-config.js\";\nimport type { DesignTreeInfoType } from \"../core/design-tree/strip.js\";\nimport { stripDeltaToDifficulty, tokenDeltaToDifficulty } from \"../core/design-tree/delta.js\";\n\n/**\n * Difficulty-to-score range mapping.\n * Used to determine if a rule's current score aligns with actual conversion difficulty.\n *\n * easy → score should be 0 to -3\n * moderate → score should be -4 to -7\n * hard → score should be -8 to -12\n * failed → score should be -8 to -12\n */\nconst DIFFICULTY_SCORE_RANGES: Record<Difficulty, { min: number; max: number }> = {\n easy: { min: -3, max: 0 },\n moderate: { min: -7, max: -4 },\n hard: { min: -12, max: -8 },\n failed: { min: -12, max: -8 },\n};\n\n/**\n * Check if a score falls within the expected range for a given difficulty\n */\nfunction scoreMatchesDifficulty(score: number, difficulty: Difficulty): boolean {\n const range = DIFFICULTY_SCORE_RANGES[difficulty];\n return score >= range.min && score <= range.max;\n}\n\n/**\n * Determine mismatch type for a flagged rule based on conversion difficulty\n */\nfunction classifyFlaggedRule(\n currentScore: number,\n actualDifficulty: Difficulty\n): MismatchType {\n if (scoreMatchesDifficulty(currentScore, actualDifficulty)) {\n return \"validated\";\n }\n\n // If actual difficulty is easier than what the score suggests\n if (\n (actualDifficulty === \"easy\" && currentScore < -3) ||\n (actualDifficulty === \"moderate\" && currentScore < -7)\n ) {\n return \"overscored\";\n }\n\n // If actual difficulty is harder than what the score suggests\n return \"underscored\";\n}\n\n/**\n * Build reasoning string for a mismatch\n */\nfunction buildReasoning(\n type: MismatchType,\n ruleId: string | undefined,\n currentScore: number | undefined,\n actualDifficulty: Difficulty\n): string {\n const range = DIFFICULTY_SCORE_RANGES[actualDifficulty];\n\n switch (type) {\n case \"validated\":\n return `Rule \"${ruleId}\" score (${currentScore}) aligns with actual difficulty \"${actualDifficulty}\" (expected range: ${range.min} to ${range.max}).`;\n case \"overscored\":\n return `Rule \"${ruleId}\" score (${currentScore}) is too harsh for actual difficulty \"${actualDifficulty}\" (expected range: ${range.min} to ${range.max}).`;\n case \"underscored\":\n return `Rule \"${ruleId}\" score (${currentScore}) is too lenient for actual difficulty \"${actualDifficulty}\" (expected range: ${range.min} to ${range.max}).`;\n case \"missing-rule\":\n return `No rule covers this difficulty \"${actualDifficulty}\" (expected score range: ${range.min} to ${range.max}).`;\n }\n}\n\n/**\n * Merge all node issue summaries into a single virtual summary.\n * Used when whole-design conversion produces a single root record but analysis\n * flags rules on individual child nodes. Without merging, rules only flagged on\n * non-root nodes would be silently dropped from evaluation.\n */\nfunction mergeAllSummaries(\n summaries: Array<{ nodeId: string; nodePath: string; flaggedRuleIds: string[] }>,\n rootNodeId: string,\n rootNodePath: string,\n): { nodeId: string; nodePath: string; flaggedRuleIds: string[] } {\n const allRuleIds = new Set<string>();\n for (const s of summaries) {\n for (const id of s.flaggedRuleIds) {\n allRuleIds.add(id);\n }\n }\n return { nodeId: rootNodeId, nodePath: rootNodePath, flaggedRuleIds: [...allRuleIds] };\n}\n\n/**\n * Evaluation Agent - Step 3 of calibration pipeline\n *\n * Deterministic comparison of analysis results vs conversion results.\n * No LLM required — pure algorithmic evaluation.\n */\nexport function runEvaluationAgent(\n input: EvaluationAgentInput\n): EvaluationAgentOutput {\n const mismatches: MismatchCase[] = [];\n const validatedRuleSet = new Set<string>();\n\n // Build a lookup from nodeId to issue summary\n const nodeSummaryMap = new Map(\n input.nodeIssueSummaries.map((s) => [s.nodeId, s])\n );\n\n for (const record of input.conversionRecords) {\n const summary = input.wholeDesign\n ? mergeAllSummaries(input.nodeIssueSummaries, record.nodeId, record.nodePath)\n : nodeSummaryMap.get(record.nodeId);\n const difficulty = record.difficulty as Difficulty;\n\n // Process rule-related struggles from conversion\n for (const struggle of record.ruleRelatedStruggles) {\n const ruleInfo = input.ruleScores[struggle.ruleId];\n if (!ruleInfo) continue;\n\n const actualDifficulty = struggle.actualImpact as Difficulty;\n const type = classifyFlaggedRule(ruleInfo.score, actualDifficulty);\n\n if (type === \"validated\") {\n validatedRuleSet.add(struggle.ruleId);\n }\n\n mismatches.push({\n type,\n nodeId: record.nodeId,\n nodePath: record.nodePath,\n ruleId: struggle.ruleId,\n currentScore: ruleInfo.score,\n currentSeverity: ruleInfo.severity as Severity,\n actualDifficulty,\n reasoning: buildReasoning(type, struggle.ruleId, ruleInfo.score, actualDifficulty),\n });\n }\n\n // Process flagged rules that had NO struggle reported\n // Not mentioned ≠ overscored. Only classify as overscored when the Converter\n // explicitly reported actualImpact: \"easy\" for this rule. Otherwise validate.\n if (summary) {\n const struggledRuleIds = new Set(\n record.ruleRelatedStruggles.map((s) => s.ruleId)\n );\n\n for (const ruleId of summary.flaggedRuleIds) {\n if (struggledRuleIds.has(ruleId)) continue;\n\n const ruleInfo = input.ruleScores[ruleId];\n if (!ruleInfo) continue;\n\n // Rule was flagged but conversion had no struggle with it — validate conservatively\n validatedRuleSet.add(ruleId);\n mismatches.push({\n type: \"validated\",\n nodeId: record.nodeId,\n nodePath: record.nodePath,\n ruleId,\n currentScore: ruleInfo.score,\n currentSeverity: ruleInfo.severity as Severity,\n actualDifficulty: difficulty,\n reasoning: `Rule \"${ruleId}\" was flagged but not mentioned in conversion struggles (overall: \"${difficulty}\") — validated (no explicit easy signal).`,\n });\n }\n }\n\n // Process uncovered struggles (no existing rule)\n for (const uncovered of record.uncoveredStruggles) {\n const estimatedDifficulty = uncovered.estimatedImpact as Difficulty;\n\n mismatches.push({\n type: \"missing-rule\",\n nodeId: record.nodeId,\n nodePath: record.nodePath,\n actualDifficulty: estimatedDifficulty,\n reasoning: `Uncovered struggle: \"${uncovered.description}\" (category: ${uncovered.suggestedCategory}, impact: ${estimatedDifficulty}).`,\n category: uncovered.suggestedCategory,\n description: uncovered.description,\n });\n }\n }\n\n // Override responsive-critical rule evaluations with measured responsiveDelta\n if (input.responsiveDelta != null) {\n const responsiveDifficulty = responsiveDeltaToDifficulty(input.responsiveDelta);\n for (const mismatch of mismatches) {\n if (!mismatch.ruleId) continue;\n if (!(mismatch.ruleId in RULE_ID_CATEGORY)) continue;\n const category = RULE_ID_CATEGORY[mismatch.ruleId as RuleId];\n if (category !== \"responsive-critical\") continue;\n\n const prevType = mismatch.type;\n const newType = classifyFlaggedRule(mismatch.currentScore ?? 0, responsiveDifficulty);\n mismatch.type = newType;\n mismatch.actualDifficulty = responsiveDifficulty;\n mismatch.reasoning = buildReasoning(newType, mismatch.ruleId, mismatch.currentScore, responsiveDifficulty)\n + ` (responsive: delta=${input.responsiveDelta}%p, overrides AI opinion \"${prevType}\")`;\n\n if (newType === \"validated\") {\n validatedRuleSet.add(mismatch.ruleId);\n } else {\n validatedRuleSet.delete(mismatch.ruleId);\n }\n }\n }\n\n // Override rule evaluations with objective strip ablation deltas\n if (input.stripDeltas) {\n for (const mismatch of mismatches) {\n if (!mismatch.ruleId) continue;\n // Responsive-critical: only apply strip override when size-constraints has a measured\n // responsive delta (#205). Otherwise skip so design-viewport pixel fallback cannot replace\n // baseline page responsiveDelta classification.\n if (mismatch.ruleId in RULE_ID_CATEGORY) {\n const category = RULE_ID_CATEGORY[mismatch.ruleId as RuleId];\n if (\n category === \"responsive-critical\" &&\n !sizeConstraintsStripHasResponsiveMetric(input.stripDeltas)\n ) {\n continue;\n }\n }\n const stripDifficulty = getStripDifficultyForRule(mismatch.ruleId, input.stripDeltas);\n if (!stripDifficulty) continue;\n\n const prevType = mismatch.type;\n const newType = classifyFlaggedRule(mismatch.currentScore ?? 0, stripDifficulty);\n mismatch.type = newType;\n mismatch.actualDifficulty = stripDifficulty;\n mismatch.reasoning = buildReasoning(newType, mismatch.ruleId, mismatch.currentScore, stripDifficulty)\n + ` (strip-ablation: overrides AI opinion \"${prevType}\")`;\n\n if (newType === \"validated\") {\n validatedRuleSet.add(mismatch.ruleId);\n } else {\n validatedRuleSet.delete(mismatch.ruleId);\n }\n }\n }\n\n return {\n mismatches,\n validatedRules: [...validatedRuleSet],\n };\n}\n\n/**\n * Map strip type to related rule IDs.\n * Based on what information each strip type removes and which rules detect those issues.\n */\nfunction sizeConstraintsStripHasResponsiveMetric(\n stripDeltas: Record<string, StripDeltaForEval>,\n): boolean {\n const rd = stripDeltas[\"size-constraints\"]?.responsiveDelta;\n return rd != null && Number.isFinite(rd);\n}\n\nconst STRIP_TYPE_RULES: Record<DesignTreeInfoType, RuleId[]> = {\n \"layout-direction-spacing\": [\"no-auto-layout\", \"absolute-position-in-auto-layout\", \"non-layout-container\", \"irregular-spacing\"],\n \"size-constraints\": [\"missing-size-constraint\", \"fixed-size-in-auto-layout\"],\n \"component-references\": [\"missing-component\", \"detached-instance\", \"variant-structure-mismatch\"],\n \"node-names-hierarchy\": [\"non-standard-naming\", \"non-semantic-name\", \"inconsistent-naming-convention\"],\n \"variable-references\": [\"raw-value\"],\n \"style-references\": [\"raw-value\"],\n};\n\n/**\n * Strip types that should use token delta instead of pixel delta.\n * These represent information whose absence affects token cost/code quality,\n * not pixel accuracy at design viewport.\n */\nconst TOKEN_METRIC_STRIPS = new Set<DesignTreeInfoType>([\n \"component-references\",\n \"node-names-hierarchy\",\n \"variable-references\",\n \"style-references\",\n]);\n\n/**\n * Strip types that should use responsive pixel delta.\n * These represent information whose absence manifests at expanded viewports.\n */\nconst RESPONSIVE_METRIC_STRIPS = new Set<DesignTreeInfoType>([\n \"size-constraints\",\n]);\n\n/**\n * Get the objective strip-based difficulty for a rule.\n * Uses category-appropriate metric per strip type:\n * - layout-direction-spacing → pixel delta\n * - size-constraints → responsive pixel delta\n * - component/naming/variable/style → token delta\n * If multiple strip types affect the same rule, take the worst difficulty.\n */\nfunction getStripDifficultyForRule(\n ruleId: string,\n stripDeltas: Record<string, StripDeltaForEval>,\n): Difficulty | null {\n const difficulties: Difficulty[] = [];\n\n for (const [stripType, ruleIds] of Object.entries(STRIP_TYPE_RULES)) {\n if (!ruleIds.includes(ruleId as RuleId)) continue;\n const data = stripDeltas[stripType];\n if (!data) continue;\n\n const infoType = stripType as DesignTreeInfoType;\n\n if (RESPONSIVE_METRIC_STRIPS.has(infoType)) {\n // size-constraints: use responsive delta if available, fall back to pixel delta\n const delta = data.responsiveDelta ?? data.pixelDelta;\n difficulties.push(stripDeltaToDifficulty(delta));\n } else if (TOKEN_METRIC_STRIPS.has(infoType)) {\n // token-management strips: use token delta if available, fall back to pixel delta\n if (data.baselineInputTokens != null && data.strippedInputTokens != null) {\n difficulties.push(tokenDeltaToDifficulty(data.baselineInputTokens, data.strippedInputTokens));\n } else {\n difficulties.push(stripDeltaToDifficulty(data.pixelDelta));\n }\n } else {\n // layout: use pixel delta\n difficulties.push(stripDeltaToDifficulty(data.pixelDelta));\n }\n }\n\n if (difficulties.length === 0) return null;\n\n // Take worst difficulty (failed > hard > moderate > easy)\n const order: Difficulty[] = [\"easy\", \"moderate\", \"hard\", \"failed\"];\n return difficulties.reduce((worst, d) =>\n order.indexOf(d) > order.indexOf(worst) ? d : worst\n );\n}\n\n/**\n * Map responsiveDelta to difficulty.\n * Based on ablation Experiment 04: structure drops -32%p at different viewport.\n * Higher delta = more responsive breakage = harder to implement.\n */\nfunction responsiveDeltaToDifficulty(delta: number): Difficulty {\n // Negative delta = expanded viewport matches better than original (unusual).\n // Treat as easy — the design is not breaking at wider viewport.\n const d = Math.max(0, delta);\n if (d <= 5) return \"easy\"; // minimal responsive breakage\n if (d <= 15) return \"moderate\"; // noticeable breakage\n if (d <= 30) return \"hard\"; // severe breakage\n return \"failed\"; // completely broken at expanded viewport\n}\n","import type { Severity } from \"../core/contracts/severity.js\";\nimport type { Confidence } from \"./contracts/tuning-agent.js\";\nimport type {\n TuningAgentInput,\n TuningAgentOutput,\n ScoreAdjustment,\n NewRuleProposal,\n} from \"./contracts/tuning-agent.js\";\n\n/**\n * Difficulty-to-score midpoint mapping for proposing new scores\n */\nconst DIFFICULTY_MIDPOINT: Record<string, number> = {\n easy: -2,\n moderate: -5,\n hard: -10,\n failed: -12,\n};\n\n/**\n * Difficulty-to-severity mapping for new rule proposals\n */\nconst DIFFICULTY_SEVERITY: Record<string, Severity> = {\n easy: \"suggestion\",\n moderate: \"risk\",\n hard: \"blocking\",\n failed: \"blocking\",\n};\n\n/**\n * Determine confidence based on number of supporting cases\n */\nfunction getConfidence(caseCount: number): Confidence {\n if (caseCount >= 3) return \"high\";\n if (caseCount >= 2) return \"medium\";\n return \"low\";\n}\n\n/**\n * Score range for worst-case floor clamping\n */\nconst DIFFICULTY_SCORE_MAX: Record<string, number> = {\n easy: 0,\n moderate: -4,\n hard: -8,\n failed: -8,\n};\n\n/**\n * Propose a score based on weighted average of actual difficulties,\n * with a worst-case floor so hard cases aren't drowned out by easy ones.\n */\nfunction proposedScoreFromDifficulties(difficulties: string[]): number {\n if (difficulties.length === 0) return -5;\n\n // Weighted average: Σ(midpoint × count) / total\n let sum = 0;\n let worstFloor = 0;\n for (const d of difficulties) {\n const midpoint = DIFFICULTY_MIDPOINT[d] ?? -5;\n sum += midpoint;\n // Track the harshest floor from any observed difficulty\n const floor = DIFFICULTY_SCORE_MAX[d] ?? -5;\n if (floor < worstFloor) worstFloor = floor;\n }\n\n const weightedAvg = Math.round(sum / difficulties.length);\n\n // Clamp: proposed score must be at least as harsh as the worst observed difficulty's range start\n return Math.min(weightedAvg, worstFloor);\n}\n\n/**\n * Determine if severity should change based on proposed score\n */\nfunction proposeSeverity(\n currentSeverity: Severity,\n proposedScore: number\n): Severity | undefined {\n let expectedSeverity: Severity;\n if (proposedScore <= -8) {\n expectedSeverity = \"blocking\";\n } else if (proposedScore <= -4) {\n expectedSeverity = \"risk\";\n } else if (proposedScore <= -2) {\n expectedSeverity = \"missing-info\";\n } else {\n expectedSeverity = \"suggestion\";\n }\n\n if (expectedSeverity !== currentSeverity) {\n return expectedSeverity;\n }\n return undefined;\n}\n\n/**\n * Tuning Agent - Step 4 of calibration pipeline\n *\n * Deterministic aggregation algorithm. No LLM required.\n * Aggregates mismatch cases into score adjustment proposals.\n */\nexport function runTuningAgent(\n input: TuningAgentInput\n): TuningAgentOutput {\n const adjustments: ScoreAdjustment[] = [];\n const newRuleProposals: NewRuleProposal[] = [];\n\n // Group mismatches by ruleId for overscored and underscored\n const overscoredByRule = new Map<string, typeof input.mismatches>();\n const underscoredByRule = new Map<string, typeof input.mismatches>();\n const missingRuleCases: typeof input.mismatches = [];\n\n for (const mismatch of input.mismatches) {\n switch (mismatch.type) {\n case \"overscored\": {\n if (!mismatch.ruleId) break;\n const existing = overscoredByRule.get(mismatch.ruleId);\n if (existing) {\n existing.push(mismatch);\n } else {\n overscoredByRule.set(mismatch.ruleId, [mismatch]);\n }\n break;\n }\n case \"underscored\": {\n if (!mismatch.ruleId) break;\n const existing = underscoredByRule.get(mismatch.ruleId);\n if (existing) {\n existing.push(mismatch);\n } else {\n underscoredByRule.set(mismatch.ruleId, [mismatch]);\n }\n break;\n }\n case \"missing-rule\":\n missingRuleCases.push(mismatch);\n break;\n }\n }\n\n const prior = input.priorEvidence ?? {};\n\n // Generate score reduction proposals for overscored rules\n // Include rules with prior-only evidence (no current mismatches)\n const allOverscoredRuleIds = new Set([\n ...overscoredByRule.keys(),\n ...Object.keys(prior).filter((id) => {\n const p = prior[id];\n return p && p.overscoredCount > 0 && !overscoredByRule.has(id);\n }),\n ]);\n\n for (const ruleId of allOverscoredRuleIds) {\n const ruleInfo = input.ruleScores[ruleId];\n if (!ruleInfo) continue;\n\n const cases = overscoredByRule.get(ruleId) ?? [];\n const priorData = prior[ruleId];\n const currentDifficulties = cases.map((c) => c.actualDifficulty);\n const priorDifficulties = priorData?.overscoredDifficulties ?? [];\n const allDifficulties = [...currentDifficulties, ...priorDifficulties];\n const totalCases = cases.length + (priorData?.overscoredCount ?? 0);\n\n const proposedScore = proposedScoreFromDifficulties(allDifficulties);\n const currentSeverity = ruleInfo.severity as Severity;\n const newSeverity = proposeSeverity(currentSeverity, proposedScore);\n const priorNote = priorData?.overscoredCount\n ? ` (+ ${priorData.overscoredCount} case(s) from prior runs)`\n : \"\";\n\n // Propose disable when rule converges to zero impact:\n // score already at suggestion floor (-2) + 3+ cases + all easy\n const shouldDisable =\n proposedScore >= -2 &&\n totalCases >= 3 &&\n allDifficulties.every((d) => d === \"easy\");\n\n adjustments.push({\n ruleId,\n currentScore: ruleInfo.score,\n proposedScore,\n currentSeverity,\n proposedSeverity: newSeverity,\n reasoning: shouldDisable\n ? `Converged to zero impact: ${totalCases} case(s) all \"easy\"${priorNote}. Recommend disabling.`\n : `Overscored in ${cases.length} case(s)${priorNote}. Actual difficulties: [${allDifficulties.join(\", \")}]. Current score ${ruleInfo.score} is too harsh.`,\n confidence: getConfidence(totalCases),\n supportingCases: totalCases,\n ...(shouldDisable && { proposedDisable: true }),\n });\n }\n\n // Generate score increase proposals for underscored rules\n // Include rules with prior-only evidence (no current mismatches)\n const allUnderscoredRuleIds = new Set([\n ...underscoredByRule.keys(),\n ...Object.keys(prior).filter((id) => {\n const p = prior[id];\n return p && p.underscoredCount > 0 && !underscoredByRule.has(id);\n }),\n ]);\n\n for (const ruleId of allUnderscoredRuleIds) {\n const ruleInfo = input.ruleScores[ruleId];\n if (!ruleInfo) continue;\n\n const cases = underscoredByRule.get(ruleId) ?? [];\n const priorData = prior[ruleId];\n const currentDifficulties = cases.map((c) => c.actualDifficulty);\n const priorDifficulties = priorData?.underscoredDifficulties ?? [];\n const allDifficulties = [...currentDifficulties, ...priorDifficulties];\n const totalCases = cases.length + (priorData?.underscoredCount ?? 0);\n\n const proposedScore = proposedScoreFromDifficulties(allDifficulties);\n const currentSeverity = ruleInfo.severity as Severity;\n const newSeverity = proposeSeverity(currentSeverity, proposedScore);\n const priorNote = priorData?.underscoredCount\n ? ` (+ ${priorData.underscoredCount} case(s) from prior runs)`\n : \"\";\n\n adjustments.push({\n ruleId,\n currentScore: ruleInfo.score,\n proposedScore,\n currentSeverity,\n proposedSeverity: newSeverity,\n reasoning: `Underscored in ${cases.length} case(s)${priorNote}. Actual difficulties: [${allDifficulties.join(\", \")}]. Current score ${ruleInfo.score} is too lenient.`,\n confidence: getConfidence(totalCases),\n supportingCases: totalCases,\n });\n }\n\n // Generate new rule proposals from missing-rule cases\n // Group by suggestedCategory extracted from reasoning\n const missingGrouped = new Map<string, typeof input.mismatches>();\n\n for (const c of missingRuleCases) {\n const category = c.category ?? \"unknown\";\n\n const existing = missingGrouped.get(category);\n if (existing) {\n existing.push(c);\n } else {\n missingGrouped.set(category, [c]);\n }\n }\n\n for (const [category, cases] of missingGrouped) {\n const difficulties = cases.map((c) => c.actualDifficulty);\n const dominantDifficulty = getDominantDifficulty(difficulties);\n const descriptions = cases.map((c) => c.description ?? c.reasoning);\n\n newRuleProposals.push({\n suggestedId: `new-${category}-rule`,\n category,\n description: descriptions.join(\"; \"),\n suggestedSeverity: DIFFICULTY_SEVERITY[dominantDifficulty] ?? \"risk\",\n suggestedScore: DIFFICULTY_MIDPOINT[dominantDifficulty] ?? -5,\n reasoning: `${cases.length} uncovered struggle(s) in category \"${category}\". Difficulties: [${difficulties.join(\", \")}].`,\n supportingCases: cases.length,\n });\n }\n\n return { adjustments, newRuleProposals };\n}\n\nfunction getDominantDifficulty(difficulties: string[]): string {\n const counts: Record<string, number> = {};\n for (const d of difficulties) {\n counts[d] = (counts[d] ?? 0) + 1;\n }\n\n let dominant = difficulties[0] ?? \"moderate\";\n let maxCount = 0;\n for (const [difficulty, count] of Object.entries(counts)) {\n if (count > maxCount) {\n maxCount = count;\n dominant = difficulty;\n }\n }\n return dominant;\n}\n","import type { ScoreReport } from \"../core/engine/scoring.js\";\nimport type { MismatchCase } from \"./contracts/evaluation-agent.js\";\nimport type { ScoreAdjustment, NewRuleProposal } from \"./contracts/tuning-agent.js\";\n\n/** Data structure for generating calibration report markdown. */\nexport interface CalibrationReportData {\n fileKey: string;\n fileName: string;\n analyzedAt: string;\n nodeCount: number;\n issueCount: number;\n convertedNodeCount: number;\n skippedNodeCount: number;\n scoreReport: ScoreReport;\n mismatches: MismatchCase[];\n validatedRules: string[];\n adjustments: ScoreAdjustment[];\n newRuleProposals: NewRuleProposal[];\n /** Design tree token metrics (optional — present when design-tree stats are available) */\n tokenMetrics?: {\n designTreeTokens: number;\n designTreeBytes: number;\n tokensPerNode: number;\n } | undefined;\n}\n\n/**\n * Generate a CALIBRATION_REPORT.md from calibration pipeline results\n */\nexport function generateCalibrationReport(data: CalibrationReportData): string {\n const lines: string[] = [];\n\n lines.push(\"# Calibration Report\");\n lines.push(\"\");\n lines.push(renderOverview(data));\n lines.push(renderCurrentScores(data));\n lines.push(renderAdjustmentProposals(data.adjustments));\n lines.push(renderNewRuleProposals(data.newRuleProposals));\n lines.push(renderValidatedRules(data.validatedRules));\n lines.push(renderMismatchDetails(data.mismatches));\n lines.push(renderApplicationGuide(data.adjustments));\n\n return lines.join(\"\\n\");\n}\n\nfunction renderOverview(data: CalibrationReportData): string {\n return `## Overview\n\n| Metric | Value |\n|--------|-------|\n| File | ${data.fileName} (${data.fileKey}) |\n| Analyzed At | ${data.analyzedAt} |\n| Total Nodes | ${data.nodeCount} |\n| Total Issues | ${data.issueCount} |\n| Converted Nodes | ${data.convertedNodeCount} |\n| Skipped Nodes | ${data.skippedNodeCount} |\n| Overall Grade | ${data.scoreReport.overall.grade} (${data.scoreReport.overall.percentage}%) |${data.tokenMetrics ? `\n| Design Tree Tokens | ~${data.tokenMetrics.designTreeTokens.toLocaleString()} tokens (${Math.round(data.tokenMetrics.designTreeBytes / 1024)}KB) |\n| Tokens per Node | ~${Math.round(data.tokenMetrics.tokensPerNode)} |` : \"\"}\n`;\n}\n\nfunction renderCurrentScores(data: CalibrationReportData): string {\n const lines: string[] = [];\n lines.push(\"## Current Score Summary\");\n lines.push(\"\");\n lines.push(\"| Category | Score | Issues | Density | Diversity |\");\n lines.push(\"|----------|-------|--------|---------|-----------|\");\n\n for (const [category, catScore] of Object.entries(data.scoreReport.byCategory)) {\n lines.push(\n `| ${category} | ${catScore.percentage}% | ${catScore.issueCount} | ${catScore.densityScore} | ${catScore.diversityScore} |`\n );\n }\n\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nfunction renderAdjustmentProposals(adjustments: ScoreAdjustment[]): string {\n if (adjustments.length === 0) {\n return \"## Score Adjustment Proposals\\n\\nNo adjustments proposed.\\n\";\n }\n\n const lines: string[] = [];\n lines.push(\"## Score Adjustment Proposals\");\n lines.push(\"\");\n lines.push(\"| Rule | Current Score | Proposed Score | Disable? | Severity Change | Confidence | Cases | Reasoning |\");\n lines.push(\"|------|--------------|----------------|----------|-----------------|------------|-------|-----------|\");\n\n for (const adj of adjustments) {\n const severityChange = adj.proposedSeverity\n ? `${adj.currentSeverity} -> ${adj.proposedSeverity}`\n : adj.currentSeverity;\n const disable = adj.proposedDisable ? \"⛔ YES\" : \"\";\n\n lines.push(\n `| ${adj.ruleId} | ${adj.currentScore} | ${adj.proposedScore} | ${disable} | ${severityChange} | ${adj.confidence} | ${adj.supportingCases} | ${adj.reasoning} |`\n );\n }\n\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nfunction renderNewRuleProposals(proposals: NewRuleProposal[]): string {\n if (proposals.length === 0) {\n return \"## New Rule Proposals\\n\\nNo new rules proposed.\\n\";\n }\n\n const lines: string[] = [];\n lines.push(\"## New Rule Proposals\");\n lines.push(\"\");\n\n for (const proposal of proposals) {\n lines.push(`### ${proposal.suggestedId}`);\n lines.push(\"\");\n lines.push(`- **Category**: ${proposal.category}`);\n lines.push(`- **Suggested Severity**: ${proposal.suggestedSeverity}`);\n lines.push(`- **Suggested Score**: ${proposal.suggestedScore}`);\n lines.push(`- **Supporting Cases**: ${proposal.supportingCases}`);\n lines.push(`- **Description**: ${proposal.description}`);\n lines.push(`- **Reasoning**: ${proposal.reasoning}`);\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction renderValidatedRules(validatedRules: string[]): string {\n if (validatedRules.length === 0) {\n return \"## Validated Rules\\n\\nNo rules were validated in this run.\\n\";\n }\n\n const lines: string[] = [];\n lines.push(\"## Validated Rules\");\n lines.push(\"\");\n lines.push(\"The following rules had scores that aligned with actual conversion difficulty:\");\n lines.push(\"\");\n\n for (const ruleId of validatedRules) {\n lines.push(`- \\`${ruleId}\\``);\n }\n\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nfunction renderMismatchDetails(mismatches: MismatchCase[]): string {\n if (mismatches.length === 0) {\n return \"## Detailed Mismatch List\\n\\nNo mismatches found.\\n\";\n }\n\n const lines: string[] = [];\n lines.push(\"## Detailed Mismatch List\");\n lines.push(\"\");\n\n const grouped: Record<string, MismatchCase[]> = {};\n for (const m of mismatches) {\n const list = grouped[m.type];\n if (list) {\n list.push(m);\n } else {\n grouped[m.type] = [m];\n }\n }\n\n for (const [type, cases] of Object.entries(grouped)) {\n lines.push(`### ${type} (${cases.length})`);\n lines.push(\"\");\n\n for (const c of cases) {\n const ruleInfo = c.ruleId ? ` | Rule: \\`${c.ruleId}\\`` : \"\";\n const scoreInfo = c.currentScore !== undefined ? ` | Score: ${c.currentScore}` : \"\";\n lines.push(`- **${c.nodePath}** (${c.nodeId})${ruleInfo}${scoreInfo} | Difficulty: ${c.actualDifficulty}`);\n lines.push(` > ${c.reasoning}`);\n }\n\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction renderApplicationGuide(adjustments: ScoreAdjustment[]): string {\n const lines: string[] = [];\n lines.push(\"## Application Guide\");\n lines.push(\"\");\n lines.push(\"To apply these calibration results:\");\n lines.push(\"\");\n lines.push(\"1. Review each adjustment proposal above\");\n lines.push(\"2. Edit `src/core/rules/rule-config.ts` to update scores and severities\");\n lines.push(\"3. Run `pnpm test:run` to verify no tests break\");\n lines.push(\"4. Re-run calibration to confirm improvements\");\n lines.push(\"\");\n\n if (adjustments.length > 0) {\n lines.push(\"### Suggested Changes to `rule-config.ts`\");\n lines.push(\"\");\n lines.push(\"```typescript\");\n\n for (const adj of adjustments) {\n if (adj.proposedDisable) {\n lines.push(`// ${adj.ruleId}: DISABLE (${adj.confidence} confidence, ${adj.supportingCases} cases)`);\n lines.push(`// enabled: false`);\n } else {\n lines.push(`// ${adj.ruleId}: ${adj.currentScore} -> ${adj.proposedScore} (${adj.confidence} confidence)`);\n }\n if (adj.proposedSeverity && !adj.proposedDisable) {\n lines.push(`// severity: \"${adj.currentSeverity}\" -> \"${adj.proposedSeverity}\"`);\n }\n }\n\n lines.push(\"```\");\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n","import { z } from \"zod\";\n\n// --- Calibration evidence ---\n\nexport const CalibrationEvidenceEntrySchema = z.object({\n ruleId: z.string(),\n type: z.enum([\"overscored\", \"underscored\"]),\n actualDifficulty: z.string(),\n fixture: z.string(),\n timestamp: z.string(),\n // Phase 1 fields (#144) — optional for backward compatibility with existing evidence\n confidence: z.enum([\"high\", \"medium\", \"low\"]).optional(),\n pro: z.array(z.string()).optional(),\n con: z.array(z.string()).optional(),\n decision: z.enum([\"APPROVE\", \"REJECT\", \"REVISE\", \"HOLD\"]).optional(),\n});\n\nexport type CalibrationEvidenceEntry = z.infer<typeof CalibrationEvidenceEntrySchema>;\n\nexport const CrossRunEvidenceGroupSchema = z.object({\n overscoredCount: z.number(),\n underscoredCount: z.number(),\n overscoredDifficulties: z.array(z.string()),\n underscoredDifficulties: z.array(z.string()),\n // Aggregated pro/con from all entries for this rule\n allPro: z.array(z.string()).optional(),\n allCon: z.array(z.string()).optional(),\n lastConfidence: z.enum([\"high\", \"medium\", \"low\"]).optional(),\n lastDecision: z.enum([\"APPROVE\", \"REJECT\", \"REVISE\", \"HOLD\"]).optional(),\n});\n\nexport type CrossRunEvidenceGroup = z.infer<typeof CrossRunEvidenceGroupSchema>;\n\nexport type CrossRunEvidence = Record<string, CrossRunEvidenceGroup>;\n\n// --- Evidence ratio summary (deterministic pre-computation for Critic) ---\n\nexport const EvidenceRatioSummarySchema = z.object({\n totalSamples: z.number(),\n overscoredCount: z.number(),\n underscoredCount: z.number(),\n overscoredRate: z.number(),\n underscoredRate: z.number(),\n dominantDirection: z.enum([\"overscored\", \"underscored\", \"mixed\"]),\n dominantRate: z.number(),\n expectedDifficulty: z.string(),\n confidence: z.enum([\"high\", \"medium\", \"low\", \"insufficient\"]),\n summary: z.string(),\n});\n\nexport type EvidenceRatioSummary = z.infer<typeof EvidenceRatioSummarySchema>;\n\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport {\n CalibrationEvidenceEntrySchema,\n} from \"./contracts/evidence.js\";\nimport type {\n CalibrationEvidenceEntry,\n CrossRunEvidence,\n CrossRunEvidenceGroup,\n EvidenceRatioSummary,\n} from \"./contracts/evidence.js\";\n\nexport type { CalibrationEvidenceEntry, CrossRunEvidence, CrossRunEvidenceGroup, EvidenceRatioSummary };\n\nconst DEFAULT_CALIBRATION_PATH = resolve(\"data/calibration-evidence.json\");\n\nfunction readValidatedArray<T>(\n filePath: string,\n schema: { safeParse: (v: unknown) => { success: boolean; data?: T } }\n): T[] {\n if (!existsSync(filePath)) return [];\n try {\n const raw = JSON.parse(readFileSync(filePath, \"utf-8\")) as unknown;\n if (!Array.isArray(raw)) return [];\n const result: T[] = [];\n for (const item of raw) {\n const parsed = schema.safeParse(item);\n if (parsed.success && parsed.data !== undefined) {\n result.push(parsed.data);\n }\n }\n return result;\n } catch {\n return [];\n }\n}\n\nfunction writeJsonArray<T>(filePath: string, data: T[]): void {\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(filePath, JSON.stringify(data, null, 2) + \"\\n\", \"utf-8\");\n}\n\n/**\n * Load calibration evidence and group by ruleId for the tuning agent.\n */\nexport function loadCalibrationEvidence(\n evidencePath: string = DEFAULT_CALIBRATION_PATH\n): CrossRunEvidence {\n const entries = readValidatedArray(evidencePath, CalibrationEvidenceEntrySchema);\n const result: CrossRunEvidence = {};\n\n for (const entry of entries) {\n let group = result[entry.ruleId];\n if (!group) {\n group = {\n overscoredCount: 0,\n underscoredCount: 0,\n overscoredDifficulties: [],\n underscoredDifficulties: [],\n allPro: [],\n allCon: [],\n };\n result[entry.ruleId] = group;\n }\n\n if (entry.type === \"overscored\") {\n group.overscoredCount++;\n group.overscoredDifficulties.push(entry.actualDifficulty);\n } else {\n group.underscoredCount++;\n group.underscoredDifficulties.push(entry.actualDifficulty);\n }\n\n // Aggregate pro/con from enriched entries (deduplicated)\n if (entry.pro) {\n group.allPro ??= [];\n for (const p of entry.pro) {\n if (!group.allPro.includes(p)) group.allPro.push(p);\n }\n }\n if (entry.con) {\n group.allCon ??= [];\n for (const c of entry.con) {\n if (!group.allCon.includes(c)) group.allCon.push(c);\n }\n }\n // Keep last confidence/decision (most recent entry wins)\n if (entry.confidence) group.lastConfidence = entry.confidence;\n if (entry.decision) group.lastDecision = entry.decision;\n }\n\n return result;\n}\n\n/**\n * Minimum sample size before ratio-based confidence kicks in.\n * Below this threshold, confidence is \"insufficient\".\n * Lowered from 3→2: strip ablation deltas provide objective signal,\n * so fewer fixtures are needed for convergence (#194).\n */\nconst MIN_RATIO_SAMPLES = 2;\n\n/**\n * Difficulty dominance: pick the most frequent difficulty from a list.\n */\nfunction dominantDifficulty(difficulties: string[]): string {\n if (difficulties.length === 0) return \"moderate\";\n const counts: Record<string, number> = {};\n for (const d of difficulties) {\n counts[d] = (counts[d] ?? 0) + 1;\n }\n let best = difficulties[0]!;\n let bestCount = 0;\n for (const [d, c] of Object.entries(counts)) {\n if (c > bestCount) {\n bestCount = c;\n best = d;\n }\n }\n return best;\n}\n\n/**\n * Compute a deterministic ratio summary from cross-run evidence for a single rule.\n * This pre-digests contradictory evidence into a clear signal so the Critic\n * doesn't have to do statistics — it just reads the conclusion.\n */\nexport function computeEvidenceRatio(group: CrossRunEvidenceGroup): EvidenceRatioSummary {\n const total = group.overscoredCount + group.underscoredCount;\n\n if (total === 0) {\n return {\n totalSamples: 0,\n overscoredCount: 0,\n underscoredCount: 0,\n overscoredRate: 0,\n underscoredRate: 0,\n dominantDirection: \"mixed\",\n dominantRate: 0,\n expectedDifficulty: \"moderate\",\n confidence: \"insufficient\",\n summary: \"No evidence available.\",\n };\n }\n\n const overscoredRate = group.overscoredCount / total;\n const underscoredRate = group.underscoredCount / total;\n\n // Determine dominant direction\n let dir: \"overscored\" | \"underscored\" | \"mixed\";\n let dominantRate: number;\n if (overscoredRate >= 0.6) {\n dir = \"overscored\";\n dominantRate = overscoredRate;\n } else if (underscoredRate >= 0.6) {\n dir = \"underscored\";\n dominantRate = underscoredRate;\n } else {\n dir = \"mixed\";\n dominantRate = Math.max(overscoredRate, underscoredRate);\n }\n\n // Expected difficulty from the dominant direction's difficulties\n const relevantDifficulties =\n dir === \"underscored\"\n ? group.underscoredDifficulties\n : dir === \"overscored\"\n ? group.overscoredDifficulties\n : [...group.overscoredDifficulties, ...group.underscoredDifficulties];\n const expectedDiff = dominantDifficulty(relevantDifficulties);\n\n // Confidence based on sample size + dominance clarity\n let confidence: \"high\" | \"medium\" | \"low\" | \"insufficient\";\n if (total < MIN_RATIO_SAMPLES) {\n confidence = \"insufficient\";\n } else if (dominantRate >= 0.7 && total >= 3) {\n confidence = \"high\";\n } else if (dominantRate >= 0.6 && total >= MIN_RATIO_SAMPLES) {\n confidence = \"medium\";\n } else {\n confidence = \"low\";\n }\n\n // Human-readable summary\n const pct = (r: number) => `${Math.round(r * 100)}%`;\n let summary: string;\n if (dir === \"mixed\") {\n summary = `Mixed signals: ${group.overscoredCount} overscored (${pct(overscoredRate)}) vs ${group.underscoredCount} underscored (${pct(underscoredRate)}) across ${total} fixtures. No clear direction.`;\n } else {\n summary = `${total} fixtures: ${dir} in ${dir === \"overscored\" ? group.overscoredCount : group.underscoredCount}/${total} (${pct(dominantRate)}). Expected difficulty: ${expectedDiff}. Confidence: ${confidence}.`;\n }\n\n return {\n totalSamples: total,\n overscoredCount: group.overscoredCount,\n underscoredCount: group.underscoredCount,\n overscoredRate: Math.round(overscoredRate * 1000) / 1000,\n underscoredRate: Math.round(underscoredRate * 1000) / 1000,\n dominantDirection: dir,\n dominantRate: Math.round(dominantRate * 1000) / 1000,\n expectedDifficulty: expectedDiff,\n confidence,\n summary,\n };\n}\n\n/**\n * Append new calibration evidence entries (overscored/underscored mismatches).\n *\n * Dedup policy: one entry per (ruleId, fixture) — last-write-wins within and across calls.\n * This is intentional: with strip-ablation (#194) each rule gets one objective delta per fixture,\n * so multiple entries for the same (ruleId, fixture) would be redundant.\n * Cross-run confidence in `computeEvidenceRatio` counts entries (=fixtures), not occurrences.\n */\nexport function appendCalibrationEvidence(\n entries: CalibrationEvidenceEntry[],\n evidencePath: string = DEFAULT_CALIBRATION_PATH\n): void {\n if (entries.length === 0) return;\n const existing = readValidatedArray(evidencePath, CalibrationEvidenceEntrySchema);\n // Same batch can repeat (ruleId, fixture); last entry wins (matches cross-call behavior)\n // Normalize ruleId/fixture to prevent bucket splitting from whitespace differences\n const incomingByKey = new Map<string, CalibrationEvidenceEntry>();\n for (const e of entries) {\n const normalized = { ...e, ruleId: e.ruleId.trim(), fixture: e.fixture.trim() };\n const k = `${normalized.ruleId}\\0${normalized.fixture}`;\n incomingByKey.set(k, normalized);\n }\n const mergedIncoming = [...incomingByKey.values()];\n const keys = new Set(incomingByKey.keys());\n const withoutDupes = existing.filter(\n (e) => !keys.has(`${e.ruleId.trim()}\\0${e.fixture.trim()}`),\n );\n withoutDupes.push(...mergedIncoming);\n writeJsonArray(evidencePath, withoutDupes);\n}\n\n/**\n * Remove entries for rules whose scores were applied/revised by the Arbitrator.\n * Prunes all fixtures for the given ruleIds — score changes are global.\n */\nexport function pruneCalibrationEvidence(\n appliedRuleIds: string[],\n evidencePath: string = DEFAULT_CALIBRATION_PATH\n): void {\n if (appliedRuleIds.length === 0) return;\n const ruleSet = new Set(appliedRuleIds.map((id) => id.trim()).filter((id) => id.length > 0));\n const existing = readValidatedArray(evidencePath, CalibrationEvidenceEntrySchema);\n const pruned = existing.filter((e) => !ruleSet.has(e.ruleId.trim()));\n writeJsonArray(evidencePath, pruned);\n}\n\n/**\n * Enrich existing calibration evidence entries with Critic's structured review data.\n * Matches by (ruleId, fixture) to avoid overwriting entries from other fixtures.\n * Entries without a matching review are left unchanged.\n */\nexport function enrichCalibrationEvidence(\n reviews: Array<{\n ruleId: string;\n confidence?: \"high\" | \"medium\" | \"low\";\n pro?: string[];\n con?: string[];\n decision?: \"APPROVE\" | \"REJECT\" | \"REVISE\" | \"HOLD\";\n }>,\n fixture: string,\n evidencePath: string = DEFAULT_CALIBRATION_PATH\n): void {\n if (reviews.length === 0) return;\n const existing = readValidatedArray(evidencePath, CalibrationEvidenceEntrySchema);\n if (existing.length === 0) return;\n\n const reviewByRule = new Map(reviews.map((r) => [r.ruleId.trim(), r]));\n const fixtureTrimmed = fixture.trim();\n\n let matchCount = 0;\n const enriched = existing.map((entry) => {\n if (entry.fixture.trim() !== fixtureTrimmed) return entry;\n const review = reviewByRule.get(entry.ruleId.trim());\n if (!review) return entry;\n matchCount++;\n return {\n ...entry,\n ...(review.confidence && { confidence: review.confidence }),\n ...(review.pro && { pro: review.pro }),\n ...(review.con && { con: review.con }),\n ...(review.decision && { decision: review.decision }),\n };\n });\n\n if (matchCount === 0) {\n console.warn(`[enrich] No entries matched fixture=\"${fixture}\" — evidence unchanged`);\n return;\n }\n writeJsonArray(evidencePath, enriched);\n}\n\n","import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { randomUUID } from \"node:crypto\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nconst AIREADY_DIR = join(homedir(), \".canicode\");\nconst CONFIG_PATH = join(AIREADY_DIR, \"config.json\");\nconst REPORTS_DIR = join(AIREADY_DIR, \"reports\");\n\ninterface AireadyConfig {\n figmaToken?: string;\n telemetry?: boolean;\n posthogApiKey?: string;\n sentryDsn?: string;\n deviceId?: string;\n}\n\nfunction hardenPermissions(path: string, mode: number): void {\n if (process.platform !== \"win32\") {\n chmodSync(path, mode);\n }\n}\n\nfunction ensureDir(dir: string): void {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true, mode: 0o700 });\n }\n hardenPermissions(dir, 0o700);\n}\n\nexport function readConfig(): AireadyConfig {\n if (!existsSync(CONFIG_PATH)) {\n return {};\n }\n try {\n const raw = readFileSync(CONFIG_PATH, \"utf-8\");\n return JSON.parse(raw) as AireadyConfig;\n } catch {\n return {};\n }\n}\n\nexport function writeConfig(config: AireadyConfig): void {\n ensureDir(AIREADY_DIR);\n writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2) + \"\\n\", {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n hardenPermissions(CONFIG_PATH, 0o600);\n}\n\nexport function getFigmaToken(): string | undefined {\n // Priority: env var > config file\n return process.env[\"FIGMA_TOKEN\"] ?? readConfig().figmaToken;\n}\n\nexport function setFigmaToken(token: string): void {\n const config = readConfig();\n config.figmaToken = token;\n writeConfig(config);\n}\n\nexport function hasConfig(): boolean {\n return existsSync(CONFIG_PATH);\n}\n\nexport function getConfigPath(): string {\n return CONFIG_PATH;\n}\n\nexport function getReportsDir(): string {\n return REPORTS_DIR;\n}\n\nexport function ensureReportsDir(): void {\n ensureDir(AIREADY_DIR);\n ensureDir(REPORTS_DIR);\n}\n\nexport function getTelemetryEnabled(): boolean {\n return readConfig().telemetry !== false;\n}\n\nexport function setTelemetryEnabled(enabled: boolean): void {\n const config = readConfig();\n config.telemetry = enabled;\n writeConfig(config);\n}\n\nexport function getPosthogApiKey(): string | undefined {\n return process.env[\"POSTHOG_API_KEY\"] ?? readConfig().posthogApiKey;\n}\n\nexport function getSentryDsn(): string | undefined {\n return process.env[\"SENTRY_DSN\"] ?? readConfig().sentryDsn;\n}\n\n/**\n * Get or create a stable anonymous device ID for telemetry.\n * Stored in ~/.canicode/config.json, persists across sessions.\n */\nexport function getDeviceId(): string {\n const config = readConfig();\n if (config.deviceId) return config.deviceId;\n\n const id = randomUUID();\n config.deviceId = id;\n writeConfig(config);\n return id;\n}\n\n/**\n * Initialize canicode: write config + create reports dir\n */\nexport function initAiready(token: string): void {\n setFigmaToken(token);\n ensureReportsDir();\n}\n","import { existsSync, statSync } from \"node:fs\";\nimport { resolve, join } from \"node:path\";\nimport { FigmaClient } from \"../adapters/figma-client.js\";\nimport { resolveComponentDefinitions, resolveInteractionDestinations } from \"../adapters/component-resolver.js\";\nimport { loadFigmaFileFromJson } from \"../adapters/figma-file-loader.js\";\nimport { transformFigmaResponse, transformFileNodesResponse } from \"../adapters/figma-transformer.js\";\nimport { parseFigmaUrl } from \"../adapters/figma-url-parser.js\";\nimport { getFigmaToken } from \"./config-store.js\";\nimport type { AnalysisFile } from \"../contracts/figma-node.js\";\n\nexport interface LoadResult {\n file: AnalysisFile;\n nodeId?: string | undefined;\n}\n\n/** Check if input string is a Figma URL. */\nexport function isFigmaUrl(input: string): boolean {\n return input.includes(\"figma.com/\");\n}\n\n/** Check if input string is a JSON file path. */\nexport function isJsonFile(input: string): boolean {\n return input.endsWith(\".json\");\n}\n\n/**\n * Check if input is a fixture directory (contains data.json).\n */\nexport function isFixtureDir(input: string): boolean {\n const resolved = resolve(input);\n if (!existsSync(resolved)) return false;\n try {\n if (!statSync(resolved).isDirectory()) return false;\n } catch {\n return false;\n }\n return existsSync(join(resolved, \"data.json\"));\n}\n\n/**\n * Resolve fixture input to data.json path.\n * Input: fixtures/name/ or fixtures/name → fixtures/name/data.json\n */\nexport function resolveFixturePath(input: string): string {\n if (isJsonFile(input)) return resolve(input);\n return resolve(join(input, \"data.json\"));\n}\n\n/**\n * Load a Figma file from a URL, JSON file, or fixture directory.\n * Resolves component master node trees for accurate analysis.\n */\nexport async function loadFile(\n input: string,\n token?: string,\n): Promise<LoadResult> {\n if (isJsonFile(input) || isFixtureDir(input)) {\n const filePath = resolveFixturePath(input);\n if (!existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n console.error(`Loading from JSON: ${filePath}`);\n return { file: await loadFigmaFileFromJson(filePath) };\n }\n\n if (isFigmaUrl(input)) {\n const { fileKey, nodeId } = parseFigmaUrl(input);\n return loadFromApi(fileKey, nodeId, token);\n }\n\n throw new Error(\n `Invalid input: ${input}. Provide a Figma URL or fixture directory path.`\n );\n}\n\nasync function loadFromApi(\n fileKey: string,\n nodeId: string | undefined,\n token?: string\n): Promise<LoadResult> {\n console.error(`Fetching from Figma REST API: ${fileKey}`);\n if (nodeId) {\n console.error(`Target node: ${nodeId}`);\n }\n\n const figmaToken = token ?? getFigmaToken();\n if (!figmaToken) {\n throw new Error(\n \"Figma token required. Run 'canicode init --token YOUR_TOKEN' or set FIGMA_TOKEN env var.\"\n );\n }\n\n const client = new FigmaClient({ token: figmaToken });\n\n if (nodeId) {\n // Fetch only the target node subtree — faster, less rate limit impact\n const response = await client.getFileNodes(fileKey, [nodeId.replace(/-/g, \":\")]);\n const file = transformFileNodesResponse(fileKey, response);\n\n // Resolve component master node trees for accurate analysis\n const componentDefs = await resolveComponentDefinitions(client, fileKey, file.document);\n if (Object.keys(componentDefs).length > 0) {\n file.componentDefinitions = componentDefs;\n }\n\n // Resolve interaction destination nodes (e.g., hover variants)\n const interactionDests = await resolveInteractionDestinations(client, fileKey, file.document, file.componentDefinitions);\n if (Object.keys(interactionDests).length > 0) {\n file.interactionDestinations = interactionDests;\n }\n\n return { file, nodeId };\n }\n\n const response = await client.getFile(fileKey);\n const file = transformFigmaResponse(fileKey, response);\n\n // Full file fetch may still miss component masters from external libraries\n const componentDefs = await resolveComponentDefinitions(client, fileKey, file.document);\n if (Object.keys(componentDefs).length > 0) {\n file.componentDefinitions = componentDefs;\n }\n\n // Resolve interaction destination nodes (e.g., hover variants)\n const interactionDests = await resolveInteractionDestinations(client, fileKey, file.document, file.componentDefinitions);\n if (Object.keys(interactionDests).length > 0) {\n file.interactionDestinations = interactionDests;\n }\n\n return { file, nodeId };\n}\n","import type { AnalysisFile, AnalysisNode, AnalysisNodeType } from \"../core/contracts/figma-node.js\";\nimport { analyzeFile } from \"../core/engine/rule-engine.js\";\nimport { RULE_CONFIGS } from \"../core/rules/rule-config.js\";\n\nimport type { CalibrationConfigInput } from \"./contracts/calibration.js\";\nimport { StripDeltasArraySchema, RuleImpactAssessmentSchema, UncoveredStrugglesInputSchema } from \"./contracts/conversion-agent.js\";\nimport { CalibrationConfigSchema } from \"./contracts/calibration.js\";\nimport type { NodeIssueSummary } from \"./contracts/analysis-agent.js\";\nimport type { ScoreReport } from \"../core/engine/scoring.js\";\n\nimport { runAnalysisAgent, extractRuleScores } from \"./analysis-agent.js\";\nimport { runEvaluationAgent } from \"./evaluation-agent.js\";\nimport { runTuningAgent } from \"./tuning-agent.js\";\nimport { generateCalibrationReport } from \"./report-generator.js\";\nimport {\n loadCalibrationEvidence,\n appendCalibrationEvidence,\n} from \"./evidence-collector.js\";\nimport type { CalibrationEvidenceEntry } from \"./evidence-collector.js\";\n\n/**\n * Normalize Converter's actualImpact (none/low/medium/high) to Difficulty enum (easy/moderate/hard/failed).\n * Falls back to \"moderate\" for unknown values.\n */\nfunction normalizeActualImpact(impact: string): string {\n const mapping: Record<string, string> = {\n none: \"easy\",\n low: \"easy\",\n easy: \"easy\",\n medium: \"moderate\",\n moderate: \"moderate\",\n high: \"hard\",\n hard: \"hard\",\n failed: \"failed\",\n };\n return mapping[impact] ?? \"moderate\";\n}\n\n/**\n * Calibration tier thresholds (percentage-based).\n * - \"full\": Converter + Measurements + Gap Analysis\n * - \"visual-only\": Converter + Measurements (Gap Analysis skipped)\n */\nexport const CALIBRATION_TIER_THRESHOLDS = {\n full: 90, // A or higher\n visualOnly: 0, // everything else — always run Converter\n} as const;\n\nexport type CalibrationTier = \"full\" | \"visual-only\";\n\n/**\n * Determine calibration tier from analysis percentage.\n */\nexport function determineCalibrationTier(percentage: number): CalibrationTier {\n if (percentage >= CALIBRATION_TIER_THRESHOLDS.full) return \"full\";\n return \"visual-only\";\n}\n\n/**\n * Map visual-compare similarity percentage to conversion difficulty.\n * Used by Converter and Evaluation agents.\n */\nexport const SIMILARITY_DIFFICULTY_THRESHOLDS = {\n easy: 90,\n moderate: 70,\n hard: 50,\n} as const;\n\nexport type ConversionDifficulty = \"easy\" | \"moderate\" | \"hard\" | \"failed\";\n\nexport function similarityToDifficulty(similarity: number): ConversionDifficulty {\n if (similarity >= SIMILARITY_DIFFICULTY_THRESHOLDS.easy) return \"easy\";\n if (similarity >= SIMILARITY_DIFFICULTY_THRESHOLDS.moderate) return \"moderate\";\n if (similarity >= SIMILARITY_DIFFICULTY_THRESHOLDS.hard) return \"hard\";\n return \"failed\";\n}\n\n/**\n * Node types that are pure graphics — not useful for code conversion\n */\nconst EXCLUDED_NODE_TYPES: Set<AnalysisNodeType> = new Set([\n \"VECTOR\",\n \"BOOLEAN_OPERATION\",\n \"STAR\",\n \"REGULAR_POLYGON\",\n \"ELLIPSE\",\n \"LINE\",\n]);\n\n/**\n * Find a node by ID in the tree\n */\nfunction findNode(root: AnalysisNode, nodeId: string): AnalysisNode | null {\n if (root.id === nodeId) return root;\n if (root.children) {\n for (const child of root.children) {\n const found = findNode(child, nodeId);\n if (found) return found;\n }\n }\n return null;\n}\n\n/**\n * Check if a subtree contains at least one TEXT node\n */\nfunction hasTextDescendant(node: AnalysisNode): boolean {\n if (node.type === \"TEXT\") return true;\n if (node.children) {\n for (const child of node.children) {\n if (hasTextDescendant(child)) return true;\n }\n }\n return false;\n}\n\n/**\n * Minimum dimensions for conversion candidates\n */\nconst MIN_WIDTH = 200;\nconst MIN_HEIGHT = 200;\nconst FILTER_THRESHOLD = 500;\n\n/**\n * Node types eligible for code conversion\n */\nconst ELIGIBLE_NODE_TYPES: Set<AnalysisNodeType> = new Set([\n \"FRAME\",\n \"COMPONENT\",\n \"INSTANCE\",\n]);\n\nimport { isExcludedName } from \"../core/rules/node-semantics.js\";\n\n/**\n * Filter node summaries to meaningful conversion candidates.\n *\n * If summaries.length <= FILTER_THRESHOLD (500), all nodes pass (typical page size).\n * Otherwise, inclusion criteria:\n * - type is FRAME, COMPONENT, or INSTANCE\n * - width >= 200 AND height >= 200\n * - 3+ direct children\n * - at least one TEXT descendant (excludes pure icons/graphics)\n *\n * Exclusion criteria:\n * - pure graphic types (VECTOR, BOOLEAN_OPERATION, etc.)\n * - name contains \"icon\", \"ico\", \"badge\", or \"indicator\"\n */\nexport function filterConversionCandidates(\n summaries: NodeIssueSummary[],\n documentRoot: AnalysisNode\n): NodeIssueSummary[] {\n // Always exclude invisible nodes — can't screenshot for visual comparison\n const visibleSummaries = summaries.filter((summary) => {\n const node = findNode(documentRoot, summary.nodeId);\n return node ? node.visible !== false : false;\n });\n\n // Small trees: skip further filtering\n if (visibleSummaries.length <= FILTER_THRESHOLD) return visibleSummaries;\n\n // Large trees: filter to meaningful conversion candidates\n return visibleSummaries.filter((summary) => {\n const node = findNode(documentRoot, summary.nodeId);\n if (!node) return false;\n\n // Exclude pure graphic node types\n if (EXCLUDED_NODE_TYPES.has(node.type)) return false;\n\n // Only allow FRAME, COMPONENT, INSTANCE\n if (!ELIGIBLE_NODE_TYPES.has(node.type)) return false;\n\n // Exclude decorative/structural/overlay nodes by name\n if (isExcludedName(node.name)) return false;\n\n // Require minimum dimensions\n const bbox = node.absoluteBoundingBox;\n if (bbox && (bbox.width < MIN_WIDTH || bbox.height < MIN_HEIGHT)) return false;\n\n // Require 3+ direct children\n if (!node.children || node.children.length < 3) return false;\n\n // Require at least one TEXT descendant\n if (!hasTextDescendant(node)) return false;\n\n return true;\n });\n}\n\n// Reuse loader from core engine\nimport { loadFile as coreLoadFile } from \"../core/engine/loader.js\";\n\nasync function loadFile(\n input: string,\n token?: string\n): Promise<{ file: AnalysisFile; fileKey: string; nodeId: string | undefined }> {\n const { file, nodeId } = await coreLoadFile(input, token);\n return { file, fileKey: file.fileKey, nodeId };\n}\n\n/**\n * Build rule scores map from RULE_CONFIGS\n */\nfunction buildRuleScoresMap(): Record<string, { score: number; severity: string }> {\n const scores: Record<string, { score: number; severity: string }> = {};\n for (const [id, config] of Object.entries(RULE_CONFIGS)) {\n scores[id] = { score: config.score, severity: config.severity };\n }\n return scores;\n}\n\n/**\n * Run Step 1 only: analysis + save JSON output\n */\nexport async function runCalibrationAnalyze(\n config: CalibrationConfigInput\n): Promise<{\n analysisOutput: ReturnType<typeof runAnalysisAgent> extends infer T ? T : never;\n ruleScores: Record<string, { score: number; severity: string }>;\n fileKey: string;\n}> {\n const parsed = CalibrationConfigSchema.parse(config);\n const { file, fileKey, nodeId } = await loadFile(parsed.input, parsed.token);\n\n const analyzeOptions = {\n ...(nodeId ? { targetNodeId: nodeId } : {}),\n ...(parsed.scope ? { scope: parsed.scope } : {}),\n };\n const analysisResult = analyzeFile(file, analyzeOptions);\n\n const analysisOutput = runAnalysisAgent({ analysisResult });\n const ruleScores = {\n ...buildRuleScoresMap(),\n ...extractRuleScores(analysisResult),\n };\n\n return { analysisOutput, ruleScores, fileKey };\n}\n\n/**\n * Run Steps 3+4: evaluation + tuning from pre-computed analysis and conversion data\n */\nexport function runCalibrationEvaluate(\n analysisJson: {\n nodeIssueSummaries: NodeIssueSummary[];\n scoreReport: ScoreReport;\n fileKey: string;\n fileName: string;\n analyzedAt: string;\n nodeCount: number;\n issueCount: number;\n },\n conversionJson: Record<string, unknown>,\n ruleScores: Record<string, { score: number; severity: string }>,\n options?: { collectEvidence?: boolean | undefined; fixtureName?: string | undefined }\n) {\n // Support both formats:\n // Old: { records: [...], skippedNodeIds: [...] }\n // New: { rootNodeId, similarity, ruleImpactAssessment: [...], uncoveredStruggles: [...] }\n let conversionRecords: Array<{\n nodeId: string;\n nodePath: string;\n difficulty: string;\n ruleRelatedStruggles: Array<{ ruleId: string; description: string; actualImpact: string }>;\n uncoveredStruggles: Array<{ description: string; suggestedCategory: string; estimatedImpact: string }>;\n }>;\n let wholeDesign = false;\n\n if (Array.isArray(conversionJson[\"records\"])) {\n // Old per-node format\n conversionRecords = conversionJson[\"records\"] as typeof conversionRecords;\n } else {\n // New whole-design format — Zod-validate before use\n const assessmentParsed = RuleImpactAssessmentSchema.safeParse(conversionJson[\"ruleImpactAssessment\"]);\n if (assessmentParsed.success && assessmentParsed.data.length > 0) {\n wholeDesign = true;\n const assessment = assessmentParsed.data;\n const strugglesParsed = UncoveredStrugglesInputSchema.safeParse(conversionJson[\"uncoveredStruggles\"]);\n const struggles = strugglesParsed.success ? strugglesParsed.data : [];\n conversionRecords = [{\n nodeId: typeof conversionJson[\"rootNodeId\"] === \"string\" ? conversionJson[\"rootNodeId\"] : \"root\",\n nodePath: \"root\",\n difficulty: typeof conversionJson[\"difficulty\"] === \"string\" ? conversionJson[\"difficulty\"] : \"moderate\",\n ruleRelatedStruggles: assessment.map(a => ({\n ruleId: a.ruleId,\n description: a.description,\n actualImpact: normalizeActualImpact(a.actualImpact),\n })),\n uncoveredStruggles: struggles.map(s => ({\n ...s,\n estimatedImpact: normalizeActualImpact(s.estimatedImpact),\n })),\n }];\n } else {\n conversionRecords = [];\n }\n }\n\n // Extract responsive comparison data if available\n const responsiveDelta = typeof conversionJson[\"responsiveDelta\"] === \"number\"\n ? conversionJson[\"responsiveDelta\"] as number\n : null;\n\n // Extract strip ablation deltas if available (Zod-validated)\n let stripDeltas: Record<string, import(\"./contracts/evaluation-agent.js\").StripDeltaForEval> | undefined;\n {\n const parsed = StripDeltasArraySchema.safeParse(conversionJson[\"stripDeltas\"]);\n if (parsed.success && parsed.data.length > 0) {\n stripDeltas = {};\n for (const r of parsed.data) {\n stripDeltas[r.stripType] = {\n pixelDelta: r.delta,\n responsiveDelta: r.responsiveDelta ?? null,\n baselineInputTokens: r.baselineInputTokens ?? null,\n strippedInputTokens: r.strippedInputTokens ?? null,\n };\n }\n }\n }\n\n const evaluationOutput = runEvaluationAgent({\n nodeIssueSummaries: analysisJson.nodeIssueSummaries.map((s) => ({\n nodeId: s.nodeId,\n nodePath: s.nodePath,\n flaggedRuleIds: s.flaggedRuleIds,\n })),\n conversionRecords,\n ruleScores,\n responsiveDelta,\n stripDeltas,\n wholeDesign,\n });\n\n // Load prior evidence if collecting\n const priorEvidence = options?.collectEvidence\n ? loadCalibrationEvidence()\n : undefined;\n\n const tuningInput = {\n mismatches: evaluationOutput.mismatches,\n ruleScores,\n ...(priorEvidence ? { priorEvidence } : {}),\n };\n const tuningOutput = runTuningAgent(tuningInput);\n\n // Collect evidence from this run (non-fatal — pipeline continues on I/O failure)\n if (options?.collectEvidence) {\n try {\n const timestamp = new Date().toISOString();\n const fixture = options.fixtureName ?? analysisJson.fileKey;\n\n // Append calibration evidence (overscored/underscored)\n const calibrationEntries: CalibrationEvidenceEntry[] = [];\n for (const m of evaluationOutput.mismatches) {\n if ((m.type === \"overscored\" || m.type === \"underscored\") && m.ruleId) {\n calibrationEntries.push({\n ruleId: m.ruleId,\n type: m.type,\n actualDifficulty: m.actualDifficulty,\n fixture,\n timestamp,\n });\n }\n }\n appendCalibrationEvidence(calibrationEntries);\n\n } catch (err) {\n console.warn(\"[evidence] Failed to collect evidence (non-fatal):\", err);\n }\n }\n\n const report = generateCalibrationReport({\n fileKey: analysisJson.fileKey,\n fileName: analysisJson.fileName,\n analyzedAt: analysisJson.analyzedAt,\n nodeCount: analysisJson.nodeCount,\n issueCount: analysisJson.issueCount,\n convertedNodeCount: conversionRecords.length,\n skippedNodeCount: Array.isArray(conversionJson[\"skippedNodeIds\"]) ? (conversionJson[\"skippedNodeIds\"] as unknown[]).length : 0,\n scoreReport: analysisJson.scoreReport,\n mismatches: evaluationOutput.mismatches,\n validatedRules: evaluationOutput.validatedRules,\n adjustments: tuningOutput.adjustments,\n newRuleProposals: tuningOutput.newRuleProposals,\n });\n\n return {\n evaluationOutput,\n tuningOutput,\n report,\n };\n}\n\n","import { existsSync, mkdirSync } from \"node:fs\";\nimport { appendFile, writeFile } from \"node:fs/promises\";\nimport { resolve, join } from \"node:path\";\n\nexport interface ActivityStep {\n step: string;\n nodePath?: string;\n result: string;\n durationMs: number;\n}\n\nfunction getIsoTimestamp(): string {\n return new Date().toISOString();\n}\n\nexport class ActivityLogger {\n private logPath: string;\n private initialized = false;\n\n constructor(runDir: string) {\n this.logPath = resolve(join(runDir, \"activity.jsonl\"));\n }\n\n /**\n * Ensure the log directory and file header exist\n */\n private async ensureInitialized(): Promise<void> {\n if (this.initialized) return;\n\n const dir = resolve(this.logPath, \"..\");\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n if (!existsSync(this.logPath)) {\n // Write the initial \"session-start\" entry as the first JSON line\n const entry = {\n step: \"session-start\",\n timestamp: getIsoTimestamp(),\n result: \"Calibration activity log initialized\",\n durationMs: 0,\n };\n await writeFile(this.logPath, JSON.stringify(entry) + \"\\n\", \"utf-8\");\n }\n\n this.initialized = true;\n }\n\n /**\n * Log a pipeline step as a JSON Lines entry\n */\n async logStep(activity: ActivityStep): Promise<void> {\n await this.ensureInitialized();\n\n const entry: Record<string, unknown> = {\n step: activity.step,\n timestamp: getIsoTimestamp(),\n result: activity.result,\n durationMs: activity.durationMs,\n };\n\n if (activity.nodePath !== undefined) {\n entry[\"nodePath\"] = activity.nodePath;\n }\n\n await appendFile(this.logPath, JSON.stringify(entry) + \"\\n\", \"utf-8\");\n }\n\n /**\n * Log a summary at pipeline completion as a JSON Lines entry\n */\n async logSummary(summary: {\n totalDurationMs: number;\n nodesAnalyzed: number;\n nodesConverted: number;\n mismatches: number;\n adjustments: number;\n status: string;\n }): Promise<void> {\n await this.ensureInitialized();\n\n const entry = {\n step: \"Pipeline Summary\",\n timestamp: getIsoTimestamp(),\n result: summary.status,\n durationMs: summary.totalDurationMs,\n nodesAnalyzed: summary.nodesAnalyzed,\n nodesConverted: summary.nodesConverted,\n mismatches: summary.mismatches,\n adjustments: summary.adjustments,\n };\n\n await appendFile(this.logPath, JSON.stringify(entry) + \"\\n\", \"utf-8\");\n }\n\n getLogPath(): string {\n return this.logPath;\n }\n}\n"]}
|