@rejot-dev/thalo 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +396 -0
- package/dist/ast/ast-types.d.ts +469 -0
- package/dist/ast/ast-types.d.ts.map +1 -0
- package/dist/ast/ast-types.js +11 -0
- package/dist/ast/ast-types.js.map +1 -0
- package/dist/ast/builder.js +158 -0
- package/dist/ast/builder.js.map +1 -0
- package/dist/ast/extract.js +748 -0
- package/dist/ast/extract.js.map +1 -0
- package/dist/ast/node-at-position.d.ts +147 -0
- package/dist/ast/node-at-position.d.ts.map +1 -0
- package/dist/ast/node-at-position.js +382 -0
- package/dist/ast/node-at-position.js.map +1 -0
- package/dist/ast/visitor.js +232 -0
- package/dist/ast/visitor.js.map +1 -0
- package/dist/checker/check.d.ts +53 -0
- package/dist/checker/check.d.ts.map +1 -0
- package/dist/checker/check.js +105 -0
- package/dist/checker/check.js.map +1 -0
- package/dist/checker/rules/actualize-missing-updated.js +34 -0
- package/dist/checker/rules/actualize-missing-updated.js.map +1 -0
- package/dist/checker/rules/actualize-unresolved-target.js +42 -0
- package/dist/checker/rules/actualize-unresolved-target.js.map +1 -0
- package/dist/checker/rules/alter-before-define.js +53 -0
- package/dist/checker/rules/alter-before-define.js.map +1 -0
- package/dist/checker/rules/alter-undefined-entity.js +32 -0
- package/dist/checker/rules/alter-undefined-entity.js.map +1 -0
- package/dist/checker/rules/create-requires-section.js +34 -0
- package/dist/checker/rules/create-requires-section.js.map +1 -0
- package/dist/checker/rules/define-entity-requires-section.js +31 -0
- package/dist/checker/rules/define-entity-requires-section.js.map +1 -0
- package/dist/checker/rules/duplicate-entity-definition.js +37 -0
- package/dist/checker/rules/duplicate-entity-definition.js.map +1 -0
- package/dist/checker/rules/duplicate-field-in-schema.js +38 -0
- package/dist/checker/rules/duplicate-field-in-schema.js.map +1 -0
- package/dist/checker/rules/duplicate-link-id.js +52 -0
- package/dist/checker/rules/duplicate-link-id.js.map +1 -0
- package/dist/checker/rules/duplicate-metadata-key.js +21 -0
- package/dist/checker/rules/duplicate-metadata-key.js.map +1 -0
- package/dist/checker/rules/duplicate-section-heading.js +41 -0
- package/dist/checker/rules/duplicate-section-heading.js.map +1 -0
- package/dist/checker/rules/duplicate-section-in-schema.js +38 -0
- package/dist/checker/rules/duplicate-section-in-schema.js.map +1 -0
- package/dist/checker/rules/duplicate-timestamp.js +104 -0
- package/dist/checker/rules/duplicate-timestamp.js.map +1 -0
- package/dist/checker/rules/empty-required-value.js +45 -0
- package/dist/checker/rules/empty-required-value.js.map +1 -0
- package/dist/checker/rules/empty-section.js +21 -0
- package/dist/checker/rules/empty-section.js.map +1 -0
- package/dist/checker/rules/invalid-date-range-value.js +56 -0
- package/dist/checker/rules/invalid-date-range-value.js.map +1 -0
- package/dist/checker/rules/invalid-default-value.js +86 -0
- package/dist/checker/rules/invalid-default-value.js.map +1 -0
- package/dist/checker/rules/invalid-field-type.js +45 -0
- package/dist/checker/rules/invalid-field-type.js.map +1 -0
- package/dist/checker/rules/missing-required-field.js +48 -0
- package/dist/checker/rules/missing-required-field.js.map +1 -0
- package/dist/checker/rules/missing-required-section.js +51 -0
- package/dist/checker/rules/missing-required-section.js.map +1 -0
- package/dist/checker/rules/missing-title.js +56 -0
- package/dist/checker/rules/missing-title.js.map +1 -0
- package/dist/checker/rules/remove-undefined-field.js +42 -0
- package/dist/checker/rules/remove-undefined-field.js.map +1 -0
- package/dist/checker/rules/remove-undefined-section.js +42 -0
- package/dist/checker/rules/remove-undefined-section.js.map +1 -0
- package/dist/checker/rules/rules.d.ts +71 -0
- package/dist/checker/rules/rules.d.ts.map +1 -0
- package/dist/checker/rules/rules.js +102 -0
- package/dist/checker/rules/rules.js.map +1 -0
- package/dist/checker/rules/synthesis-empty-query.js +35 -0
- package/dist/checker/rules/synthesis-empty-query.js.map +1 -0
- package/dist/checker/rules/synthesis-missing-prompt.js +42 -0
- package/dist/checker/rules/synthesis-missing-prompt.js.map +1 -0
- package/dist/checker/rules/synthesis-missing-sources.js +32 -0
- package/dist/checker/rules/synthesis-missing-sources.js.map +1 -0
- package/dist/checker/rules/synthesis-unknown-query-entity.js +39 -0
- package/dist/checker/rules/synthesis-unknown-query-entity.js.map +1 -0
- package/dist/checker/rules/timestamp-out-of-order.js +55 -0
- package/dist/checker/rules/timestamp-out-of-order.js.map +1 -0
- package/dist/checker/rules/unknown-entity.js +32 -0
- package/dist/checker/rules/unknown-entity.js.map +1 -0
- package/dist/checker/rules/unknown-field.js +40 -0
- package/dist/checker/rules/unknown-field.js.map +1 -0
- package/dist/checker/rules/unknown-section.js +47 -0
- package/dist/checker/rules/unknown-section.js.map +1 -0
- package/dist/checker/rules/unresolved-link.js +34 -0
- package/dist/checker/rules/unresolved-link.js.map +1 -0
- package/dist/checker/rules/update-without-create.js +65 -0
- package/dist/checker/rules/update-without-create.js.map +1 -0
- package/dist/checker/visitor.d.ts +69 -0
- package/dist/checker/visitor.d.ts.map +1 -0
- package/dist/checker/visitor.js +67 -0
- package/dist/checker/visitor.js.map +1 -0
- package/dist/checker/workspace-index.d.ts +50 -0
- package/dist/checker/workspace-index.d.ts.map +1 -0
- package/dist/checker/workspace-index.js +108 -0
- package/dist/checker/workspace-index.js.map +1 -0
- package/dist/commands/actualize.d.ts +113 -0
- package/dist/commands/actualize.d.ts.map +1 -0
- package/dist/commands/actualize.js +111 -0
- package/dist/commands/actualize.js.map +1 -0
- package/dist/commands/check.d.ts +65 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +61 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/format.d.ts +90 -0
- package/dist/commands/format.d.ts.map +1 -0
- package/dist/commands/format.js +80 -0
- package/dist/commands/format.js.map +1 -0
- package/dist/commands/query.d.ts +152 -0
- package/dist/commands/query.d.ts.map +1 -0
- package/dist/commands/query.js +151 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/constants.d.ts +31 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +51 -0
- package/dist/constants.js.map +1 -0
- package/dist/files.d.ts +58 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +103 -0
- package/dist/files.js.map +1 -0
- package/dist/formatters.d.ts +39 -0
- package/dist/formatters.d.ts.map +1 -0
- package/dist/formatters.js +200 -0
- package/dist/formatters.js.map +1 -0
- package/dist/fragment.d.ts +22 -0
- package/dist/fragment.d.ts.map +1 -0
- package/dist/git/git.js +240 -0
- package/dist/git/git.js.map +1 -0
- package/dist/merge/conflict-detector.d.ts +89 -0
- package/dist/merge/conflict-detector.d.ts.map +1 -0
- package/dist/merge/conflict-detector.js +352 -0
- package/dist/merge/conflict-detector.js.map +1 -0
- package/dist/merge/conflict-formatter.js +143 -0
- package/dist/merge/conflict-formatter.js.map +1 -0
- package/dist/merge/driver.d.ts +54 -0
- package/dist/merge/driver.d.ts.map +1 -0
- package/dist/merge/driver.js +112 -0
- package/dist/merge/driver.js.map +1 -0
- package/dist/merge/entry-matcher.d.ts +50 -0
- package/dist/merge/entry-matcher.d.ts.map +1 -0
- package/dist/merge/entry-matcher.js +141 -0
- package/dist/merge/entry-matcher.js.map +1 -0
- package/dist/merge/entry-merger.js +194 -0
- package/dist/merge/entry-merger.js.map +1 -0
- package/dist/merge/merge-result-builder.d.ts +62 -0
- package/dist/merge/merge-result-builder.d.ts.map +1 -0
- package/dist/merge/merge-result-builder.js +89 -0
- package/dist/merge/merge-result-builder.js.map +1 -0
- package/dist/mod.d.ts +31 -0
- package/dist/mod.js +23 -0
- package/dist/model/document.d.ts +134 -0
- package/dist/model/document.d.ts.map +1 -0
- package/dist/model/document.js +275 -0
- package/dist/model/document.js.map +1 -0
- package/dist/model/line-index.d.ts +85 -0
- package/dist/model/line-index.d.ts.map +1 -0
- package/dist/model/line-index.js +159 -0
- package/dist/model/line-index.js.map +1 -0
- package/dist/model/workspace.d.ts +296 -0
- package/dist/model/workspace.d.ts.map +1 -0
- package/dist/model/workspace.js +562 -0
- package/dist/model/workspace.js.map +1 -0
- package/dist/parser.js +27 -0
- package/dist/parser.js.map +1 -0
- package/dist/parser.native.d.ts +51 -0
- package/dist/parser.native.d.ts.map +1 -0
- package/dist/parser.native.js +62 -0
- package/dist/parser.native.js.map +1 -0
- package/dist/parser.shared.d.ts +99 -0
- package/dist/parser.shared.d.ts.map +1 -0
- package/dist/parser.shared.js +124 -0
- package/dist/parser.shared.js.map +1 -0
- package/dist/parser.web.d.ts +67 -0
- package/dist/parser.web.d.ts.map +1 -0
- package/dist/parser.web.js +49 -0
- package/dist/parser.web.js.map +1 -0
- package/dist/schema/registry.d.ts +108 -0
- package/dist/schema/registry.d.ts.map +1 -0
- package/dist/schema/registry.js +281 -0
- package/dist/schema/registry.js.map +1 -0
- package/dist/semantic/analyzer.d.ts +107 -0
- package/dist/semantic/analyzer.d.ts.map +1 -0
- package/dist/semantic/analyzer.js +261 -0
- package/dist/semantic/analyzer.js.map +1 -0
- package/dist/services/change-tracker/change-tracker.d.ts +111 -0
- package/dist/services/change-tracker/change-tracker.d.ts.map +1 -0
- package/dist/services/change-tracker/change-tracker.js +62 -0
- package/dist/services/change-tracker/change-tracker.js.map +1 -0
- package/dist/services/change-tracker/create-tracker.d.ts +42 -0
- package/dist/services/change-tracker/create-tracker.d.ts.map +1 -0
- package/dist/services/change-tracker/create-tracker.js +53 -0
- package/dist/services/change-tracker/create-tracker.js.map +1 -0
- package/dist/services/change-tracker/git-tracker.d.ts +59 -0
- package/dist/services/change-tracker/git-tracker.d.ts.map +1 -0
- package/dist/services/change-tracker/git-tracker.js +218 -0
- package/dist/services/change-tracker/git-tracker.js.map +1 -0
- package/dist/services/change-tracker/timestamp-tracker.d.ts +22 -0
- package/dist/services/change-tracker/timestamp-tracker.d.ts.map +1 -0
- package/dist/services/change-tracker/timestamp-tracker.js +74 -0
- package/dist/services/change-tracker/timestamp-tracker.js.map +1 -0
- package/dist/services/definition.d.ts +37 -0
- package/dist/services/definition.d.ts.map +1 -0
- package/dist/services/definition.js +43 -0
- package/dist/services/definition.js.map +1 -0
- package/dist/services/entity-navigation.d.ts +200 -0
- package/dist/services/entity-navigation.d.ts.map +1 -0
- package/dist/services/entity-navigation.js +211 -0
- package/dist/services/entity-navigation.js.map +1 -0
- package/dist/services/hover.d.ts +81 -0
- package/dist/services/hover.d.ts.map +1 -0
- package/dist/services/hover.js +669 -0
- package/dist/services/hover.js.map +1 -0
- package/dist/services/query.d.ts +116 -0
- package/dist/services/query.d.ts.map +1 -0
- package/dist/services/query.js +225 -0
- package/dist/services/query.js.map +1 -0
- package/dist/services/references.d.ts +52 -0
- package/dist/services/references.d.ts.map +1 -0
- package/dist/services/references.js +66 -0
- package/dist/services/references.js.map +1 -0
- package/dist/services/semantic-tokens.d.ts +54 -0
- package/dist/services/semantic-tokens.d.ts.map +1 -0
- package/dist/services/semantic-tokens.js +213 -0
- package/dist/services/semantic-tokens.js.map +1 -0
- package/dist/services/synthesis.d.ts +90 -0
- package/dist/services/synthesis.d.ts.map +1 -0
- package/dist/services/synthesis.js +113 -0
- package/dist/services/synthesis.js.map +1 -0
- package/dist/source-map.d.ts +42 -0
- package/dist/source-map.d.ts.map +1 -0
- package/dist/source-map.js +170 -0
- package/dist/source-map.js.map +1 -0
- package/package.json +128 -0
- package/tree-sitter-thalo.wasm +0 -0
- package/web-tree-sitter.wasm +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.js","names":["timezone: Result<TimezonePart, \"missing_timezone\">"],"sources":["../../src/ast/builder.ts"],"sourcesContent":["/**\n * AST Builder: Converts Tree-sitter CST to typed AST with syntax validation.\n *\n * This module is responsible for:\n * - Converting CST nodes to typed AST nodes\n * - Decomposing timestamps into date, time, and timezone parts\n * - Validating syntax constraints (timezone required, etc.)\n * - Emitting SyntaxErrorNode for recoverable syntax errors\n *\n * Note: This module runs alongside extract.ts during the migration period.\n * Once migration is complete, extract.ts can be removed.\n */\nimport type { SyntaxNode, Point } from \"./ast-types.js\";\nimport type {\n Location,\n SyntaxErrorCode,\n SyntaxErrorNode,\n DatePart,\n TimePart,\n TimezonePart,\n Timestamp,\n Result,\n} from \"./ast-types.js\";\n\n// ===================\n// Location Utilities\n// ===================\n\n/**\n * Extract location information from a tree-sitter node\n */\nfunction extractLocation(node: SyntaxNode): Location {\n return {\n startIndex: node.startIndex,\n endIndex: node.endIndex,\n startPosition: node.startPosition,\n endPosition: node.endPosition,\n };\n}\n\n/**\n * Create a synthetic location from two points\n */\nfunction syntheticLocation(\n start: { index: number; position: Point },\n end: { index: number; position: Point },\n): Location {\n return {\n startIndex: start.index,\n endIndex: end.index,\n startPosition: start.position,\n endPosition: end.position,\n };\n}\n\n// ===================\n// Syntax Error Helpers\n// ===================\n\n/**\n * Create a syntax error node for recoverable parse errors\n */\nexport function createSyntaxError<Code extends SyntaxErrorCode>(\n code: Code,\n message: string,\n text: string,\n node: SyntaxNode,\n): SyntaxErrorNode<Code> {\n return {\n type: \"syntax_error\",\n code,\n message,\n text,\n location: extractLocation(node),\n syntaxNode: node,\n };\n}\n\n/**\n * Create a syntax error node with a synthetic location\n */\nexport function createSyntaxErrorAt<Code extends SyntaxErrorCode>(\n code: Code,\n message: string,\n text: string,\n location: Location,\n syntaxNode: SyntaxNode,\n): SyntaxErrorNode<Code> {\n return {\n type: \"syntax_error\",\n code,\n message,\n text,\n location,\n syntaxNode,\n };\n}\n\n// ===================\n// Timestamp Building\n// ===================\n\n/**\n * Parse a timezone string and return the offset in minutes\n *\n * @param tz - Timezone string like \"Z\", \"+05:30\", \"-08:00\"\n * @returns Offset from UTC in minutes (0 for Z, positive for east, negative for west)\n */\nexport function parseTimezoneOffset(tz: string): number {\n if (tz === \"Z\") {\n return 0;\n }\n\n const match = tz.match(/^([+-])(\\d{2}):(\\d{2})$/);\n if (!match) {\n throw new Error(`Invalid timezone format: \"${tz}\"`);\n }\n\n const sign = match[1] === \"+\" ? 1 : -1;\n const hours = parseInt(match[2], 10);\n const minutes = parseInt(match[3], 10);\n\n return sign * (hours * 60 + minutes);\n}\n\n/**\n * Build a DatePart from a date string (YYYY-MM-DD)\n */\nexport function buildDatePart(\n dateStr: string,\n location: Location,\n syntaxNode: SyntaxNode,\n): DatePart {\n const match = dateStr.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n if (!match) {\n throw new Error(`Invalid date format: \"${dateStr}\"`);\n }\n\n return {\n type: \"date_part\",\n year: parseInt(match[1], 10),\n month: parseInt(match[2], 10),\n day: parseInt(match[3], 10),\n value: dateStr,\n location,\n syntaxNode,\n };\n}\n\n/**\n * Build a TimePart from a time string (HH:MM)\n */\nexport function buildTimePart(\n timeStr: string,\n location: Location,\n syntaxNode: SyntaxNode,\n): TimePart {\n const match = timeStr.match(/^(\\d{2}):(\\d{2})$/);\n if (!match) {\n throw new Error(`Invalid time format: \"${timeStr}\"`);\n }\n\n return {\n type: \"time_part\",\n hour: parseInt(match[1], 10),\n minute: parseInt(match[2], 10),\n value: timeStr,\n location,\n syntaxNode,\n };\n}\n\n/**\n * Build a TimezonePart from a timezone string\n */\nexport function buildTimezonePart(\n tzStr: string,\n location: Location,\n syntaxNode: SyntaxNode,\n): TimezonePart {\n return {\n type: \"timezone_part\",\n value: tzStr,\n offsetMinutes: parseTimezoneOffset(tzStr),\n location,\n syntaxNode,\n };\n}\n\n/**\n * Build a Timestamp with decomposed parts from tree-sitter child nodes.\n *\n * The grammar decomposes timestamp into:\n * - timestamp_date: \"YYYY-MM-DD\" (date)\n * - timestamp_t: \"T\" (separator, not a field)\n * - timestamp_time: \"HH:MM\" (time)\n * - timestamp_tz: \"Z\" or \"±HH:MM\" (optional timezone)\n *\n * If the timezone is missing, a SyntaxErrorNode is created for the timezone field.\n *\n * @param node - The tree-sitter timestamp node with date, time, and optional tz children\n * @returns Timestamp with decomposed date, time, and timezone parts\n */\nexport function buildTimestamp(node: SyntaxNode): Timestamp {\n const text = node.text;\n\n // Get child nodes by field name\n const dateNode = node.childForFieldName(\"date\");\n const timeNode = node.childForFieldName(\"time\");\n const tzNode = node.childForFieldName(\"tz\");\n\n if (!dateNode || !timeNode) {\n throw new Error(`Invalid timestamp structure: missing date or time node in \"${text}\"`);\n }\n\n // Build date part with location from the actual node\n const dateLocation = extractLocation(dateNode);\n const datePart = buildDatePart(dateNode.text, dateLocation, dateNode);\n\n // Build time part with location from the actual node\n const timeLocation = extractLocation(timeNode);\n const timePart = buildTimePart(timeNode.text, timeLocation, timeNode);\n\n // Build timezone or syntax error if missing\n let timezone: Result<TimezonePart, \"missing_timezone\">;\n\n if (tzNode) {\n const tzLocation = extractLocation(tzNode);\n timezone = buildTimezonePart(tzNode.text, tzLocation, tzNode);\n } else {\n // Missing timezone - create syntax error at end of timestamp (after time)\n const errorLocation = syntheticLocation(\n { index: timeNode.endIndex, position: timeNode.endPosition },\n { index: timeNode.endIndex, position: timeNode.endPosition },\n );\n timezone = createSyntaxErrorAt(\n \"missing_timezone\",\n \"Timestamp requires timezone (e.g., Z or +05:30)\",\n text,\n errorLocation,\n node,\n );\n }\n\n return {\n type: \"timestamp\",\n value: text,\n date: datePart,\n time: timePart,\n timezone,\n location: extractLocation(node),\n syntaxNode: node,\n };\n}\n\n// ===================\n// Validation Helpers\n// ===================\n\n/**\n * Check if a timestamp has a valid timezone (not a syntax error)\n */\nexport function hasValidTimezone(timestamp: Timestamp): boolean {\n if (!timestamp.timezone) {\n return false;\n }\n return timestamp.timezone.type !== \"syntax_error\";\n}\n\n/**\n * Get the timezone value from a timestamp, or null if missing/invalid\n */\nexport function getTimezoneValue(timestamp: Timestamp): string | null {\n if (!timestamp.timezone || timestamp.timezone.type === \"syntax_error\") {\n return null;\n }\n return timestamp.timezone.value;\n}\n\n/**\n * Get the full formatted timestamp value, including timezone if valid\n * Re-exported from formatters for consistency\n */\nexport { formatTimestamp } from \"../formatters.js\";\n"],"mappings":";;;;;;AA+BA,SAAS,gBAAgB,MAA4B;AACnD,QAAO;EACL,YAAY,KAAK;EACjB,UAAU,KAAK;EACf,eAAe,KAAK;EACpB,aAAa,KAAK;EACnB;;;;;AAMH,SAAS,kBACP,OACA,KACU;AACV,QAAO;EACL,YAAY,MAAM;EAClB,UAAU,IAAI;EACd,eAAe,MAAM;EACrB,aAAa,IAAI;EAClB;;;;;AAUH,SAAgB,kBACd,MACA,SACA,MACA,MACuB;AACvB,QAAO;EACL,MAAM;EACN;EACA;EACA;EACA,UAAU,gBAAgB,KAAK;EAC/B,YAAY;EACb;;;;;AAMH,SAAgB,oBACd,MACA,SACA,MACA,UACA,YACuB;AACvB,QAAO;EACL,MAAM;EACN;EACA;EACA;EACA;EACA;EACD;;;;;;;;AAaH,SAAgB,oBAAoB,IAAoB;AACtD,KAAI,OAAO,IACT,QAAO;CAGT,MAAM,QAAQ,GAAG,MAAM,0BAA0B;AACjD,KAAI,CAAC,MACH,OAAM,IAAI,MAAM,6BAA6B,GAAG,GAAG;CAGrD,MAAM,OAAO,MAAM,OAAO,MAAM,IAAI;CACpC,MAAM,QAAQ,SAAS,MAAM,IAAI,GAAG;CACpC,MAAM,UAAU,SAAS,MAAM,IAAI,GAAG;AAEtC,QAAO,QAAQ,QAAQ,KAAK;;;;;AAM9B,SAAgB,cACd,SACA,UACA,YACU;CACV,MAAM,QAAQ,QAAQ,MAAM,4BAA4B;AACxD,KAAI,CAAC,MACH,OAAM,IAAI,MAAM,yBAAyB,QAAQ,GAAG;AAGtD,QAAO;EACL,MAAM;EACN,MAAM,SAAS,MAAM,IAAI,GAAG;EAC5B,OAAO,SAAS,MAAM,IAAI,GAAG;EAC7B,KAAK,SAAS,MAAM,IAAI,GAAG;EAC3B,OAAO;EACP;EACA;EACD;;;;;AAMH,SAAgB,cACd,SACA,UACA,YACU;CACV,MAAM,QAAQ,QAAQ,MAAM,oBAAoB;AAChD,KAAI,CAAC,MACH,OAAM,IAAI,MAAM,yBAAyB,QAAQ,GAAG;AAGtD,QAAO;EACL,MAAM;EACN,MAAM,SAAS,MAAM,IAAI,GAAG;EAC5B,QAAQ,SAAS,MAAM,IAAI,GAAG;EAC9B,OAAO;EACP;EACA;EACD;;;;;AAMH,SAAgB,kBACd,OACA,UACA,YACc;AACd,QAAO;EACL,MAAM;EACN,OAAO;EACP,eAAe,oBAAoB,MAAM;EACzC;EACA;EACD;;;;;;;;;;;;;;;;AAiBH,SAAgB,eAAe,MAA6B;CAC1D,MAAM,OAAO,KAAK;CAGlB,MAAM,WAAW,KAAK,kBAAkB,OAAO;CAC/C,MAAM,WAAW,KAAK,kBAAkB,OAAO;CAC/C,MAAM,SAAS,KAAK,kBAAkB,KAAK;AAE3C,KAAI,CAAC,YAAY,CAAC,SAChB,OAAM,IAAI,MAAM,8DAA8D,KAAK,GAAG;CAIxF,MAAM,eAAe,gBAAgB,SAAS;CAC9C,MAAM,WAAW,cAAc,SAAS,MAAM,cAAc,SAAS;CAGrE,MAAM,eAAe,gBAAgB,SAAS;CAC9C,MAAM,WAAW,cAAc,SAAS,MAAM,cAAc,SAAS;CAGrE,IAAIA;AAEJ,KAAI,QAAQ;EACV,MAAM,aAAa,gBAAgB,OAAO;AAC1C,aAAW,kBAAkB,OAAO,MAAM,YAAY,OAAO;OAO7D,YAAW,oBACT,oBACA,mDACA,MAPoB,kBACpB;EAAE,OAAO,SAAS;EAAU,UAAU,SAAS;EAAa,EAC5D;EAAE,OAAO,SAAS;EAAU,UAAU,SAAS;EAAa,CAC7D,EAMC,KACD;AAGH,QAAO;EACL,MAAM;EACN,OAAO;EACP,MAAM;EACN,MAAM;EACN;EACA,UAAU,gBAAgB,KAAK;EAC/B,YAAY;EACb"}
|