@health-samurai/react-components 0.0.0-alpha.20 → 0.0.0-alpha.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundle.css +41 -42
- package/dist/src/components/code-editor/fhir-autocomplete.d.ts.map +1 -1
- package/dist/src/components/code-editor/fhir-autocomplete.js +8 -7
- package/dist/src/components/code-editor/fhir-autocomplete.js.map +1 -1
- package/dist/src/components/code-editor/index.d.ts.map +1 -1
- package/dist/src/components/code-editor/index.js +324 -4
- package/dist/src/components/code-editor/index.js.map +1 -1
- package/dist/src/components/code-editor/sql-completion.d.ts.map +1 -1
- package/dist/src/components/code-editor/sql-completion.js +2 -0
- package/dist/src/components/code-editor/sql-completion.js.map +1 -1
- package/dist/src/components/operation-outcome-view.d.ts.map +1 -1
- package/dist/src/components/operation-outcome-view.js +1 -1
- package/dist/src/components/operation-outcome-view.js.map +1 -1
- package/dist/src/index.css +22 -22
- package/dist/src/shadcn/components/ui/button.js +1 -1
- package/dist/src/shadcn/components/ui/button.js.map +1 -1
- package/dist/src/shadcn/components/ui/input.js +1 -1
- package/dist/src/shadcn/components/ui/input.js.map +1 -1
- package/dist/src/shadcn/components/ui/sidebar.js +2 -2
- package/dist/src/shadcn/components/ui/sidebar.js.map +1 -1
- package/dist/src/shadcn/components/ui/table.js +2 -2
- package/dist/src/shadcn/components/ui/table.js.map +1 -1
- package/dist/src/tokens.css +19 -6
- package/package.json +3 -3
- package/src/components/code-editor/fhir-autocomplete.ts +8 -7
- package/src/components/code-editor/index.tsx +319 -1
- package/src/components/code-editor/sql-completion.ts +7 -0
- package/src/components/operation-outcome-view.tsx +1 -0
- package/src/index.css +22 -22
- package/src/shadcn/components/ui/button.tsx +1 -1
- package/src/shadcn/components/ui/input.tsx +2 -2
- package/src/shadcn/components/ui/sidebar.tsx +3 -3
- package/src/shadcn/components/ui/table.tsx +2 -2
- package/src/tokens.css +19 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/code-editor/fhir-autocomplete.ts"],"sourcesContent":["import {\n\ttype Completion,\n\ttype CompletionContext,\n\ttype CompletionResult,\n\ttype CompletionSource,\n\tcompletionStatus,\n\tstartCompletion,\n} from \"@codemirror/autocomplete\";\nimport { jsonLanguage } from \"@codemirror/lang-json\";\nimport { ensureSyntaxTree, syntaxTree } from \"@codemirror/language\";\nimport {\n\ttype Extension,\n\tRangeSet,\n\tStateEffect,\n\tStateField,\n} from \"@codemirror/state\";\nimport {\n\tDecoration,\n\tEditorView,\n\tGutterMarker,\n\tgutterLineClass,\n\tViewPlugin,\n\ttype ViewUpdate,\n} from \"@codemirror/view\";\nimport {\n\tbuildJsonDocumentContext,\n\ttype DocumentContext,\n\tfindRootJsonObject,\n\ttype PropertyInfo,\n\twalkJsonProperties,\n} from \"./json-ast\";\n\n// ── Types ──────────────────────────────────────────────────────────────\n\ninterface FhirElementType {\n\tcode: string;\n\tprofile?: string[];\n\ttargetProfile?: string[];\n}\n\ninterface FhirElement {\n\tpath: string;\n\tshort?: string;\n\tdefinition?: string;\n\tmin?: number;\n\tmax?: string;\n\ttype?: FhirElementType[];\n\tbinding?: { valueSet: string; strength: string };\n\tcontentReference?: string;\n\tsliceName?: string;\n\tfixedUri?: string;\n\tfixedString?: string;\n\tfixedCode?: string;\n}\n\ninterface StructureDefinition {\n\ttype: string;\n\turl?: string;\n\tname?: string;\n\tbaseDefinition?: string;\n\tcontext?: { expression: string; type: string }[];\n\tdifferential?: { element: FhirElement[] };\n}\n\nexport interface StructureDefinitionSearchParams {\n\ttype?: string;\n\turl?: string;\n\tderivation?: string;\n\t\"derivation:missing\"?: string;\n\tkind?: string;\n\t_count?: string;\n\t_elements?: string;\n\t_ilike?: string;\n}\n\nexport type GetStructureDefinitions = (\n\tparams: StructureDefinitionSearchParams,\n) => Promise<StructureDefinition[]>;\n\nexport type ExpandValueSet = (\n\turl: string,\n\tfilter: string,\n) => Promise<{ code: string; display?: string; system?: string }[]>;\n\n// ── Constants ──────────────────────────────────────────────────────────\n\nconst PRIMITIVE_TYPES = new Set([\n\t\"boolean\",\n\t\"integer\",\n\t\"string\",\n\t\"decimal\",\n\t\"uri\",\n\t\"url\",\n\t\"canonical\",\n\t\"base64Binary\",\n\t\"instant\",\n\t\"date\",\n\t\"dateTime\",\n\t\"time\",\n\t\"code\",\n\t\"oid\",\n\t\"id\",\n\t\"markdown\",\n\t\"unsignedInt\",\n\t\"positiveInt\",\n\t\"uuid\",\n\t\"xhtml\",\n]);\n\nfunction isPrimitiveType(typeCode: string): boolean {\n\treturn (\n\t\tPRIMITIVE_TYPES.has(typeCode) ||\n\t\ttypeCode.startsWith(\"http://hl7.org/fhirpath/System.\")\n\t);\n}\n\nconst FHIR_STRING_TYPES = new Set([\n\t\"string\",\n\t\"code\",\n\t\"uri\",\n\t\"url\",\n\t\"canonical\",\n\t\"id\",\n\t\"markdown\",\n\t\"oid\",\n\t\"uuid\",\n\t\"base64Binary\",\n\t\"xhtml\",\n\t\"http://hl7.org/fhirpath/System.String\",\n]);\n\nconst FHIR_NUMBER_TYPES = new Set([\n\t\"boolean\",\n\t\"integer\",\n\t\"decimal\",\n\t\"positiveInt\",\n\t\"unsignedInt\",\n\t\"http://hl7.org/fhirpath/System.Boolean\",\n\t\"http://hl7.org/fhirpath/System.Integer\",\n\t\"http://hl7.org/fhirpath/System.Decimal\",\n]);\n\n// ── Cache ──────────────────────────────────────────────────────────────\n\nconst sdCache = new Map<string, StructureDefinition | null>();\nconst pendingRequests = new Map<string, Promise<StructureDefinition | null>>();\nconst listCache = new Map<string, StructureDefinition[]>();\nconst pendingListRequests = new Map<string, Promise<StructureDefinition[]>>();\n\nconst SD_ELEMENTS = \"differential,type,name,baseDefinition,url,context\";\n\nfunction cacheKey(params: StructureDefinitionSearchParams): string {\n\treturn JSON.stringify(params);\n}\n\nasync function getCachedSDList(\n\tparams: StructureDefinitionSearchParams,\n\tgetSDs: GetStructureDefinitions,\n): Promise<StructureDefinition[]> {\n\tconst key = cacheKey(params);\n\tif (listCache.has(key)) return listCache.get(key) ?? [];\n\n\tlet pending = pendingListRequests.get(key);\n\tif (!pending) {\n\t\tpending = getSDs(params)\n\t\t\t.then((list) => {\n\t\t\t\tlistCache.set(key, list);\n\t\t\t\tpendingListRequests.delete(key);\n\t\t\t\tfor (const sd of list) {\n\t\t\t\t\tif (sd.differential?.element) {\n\t\t\t\t\t\tsdCache.set(sd.type, sd);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn list;\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\tpendingListRequests.delete(key);\n\t\t\t\tlistCache.set(key, []);\n\t\t\t\treturn [];\n\t\t\t});\n\t\tpendingListRequests.set(key, pending);\n\t}\n\treturn pending;\n}\n\nasync function getCachedSD(\n\ttype: string,\n\tgetSDs: GetStructureDefinitions,\n): Promise<StructureDefinition | null> {\n\tif (sdCache.has(type)) return sdCache.get(type) ?? null;\n\n\tconst key = `single:${type}`;\n\tlet pending = pendingRequests.get(key);\n\tif (!pending) {\n\t\tconst isUrl = type.includes(\"/\");\n\t\tconst searchByType = (params: StructureDefinitionSearchParams) =>\n\t\t\tgetSDs(params).then((list) => list[0] ?? null);\n\n\t\tpending = (\n\t\t\tisUrl\n\t\t\t\t? searchByType({ url: type, _elements: SD_ELEMENTS, _count: \"1\" })\n\t\t\t\t: searchByType({\n\t\t\t\t\t\ttype,\n\t\t\t\t\t\tderivation: \"specialization\",\n\t\t\t\t\t\t_elements: SD_ELEMENTS,\n\t\t\t\t\t\t_count: \"1\",\n\t\t\t\t\t}).then(\n\t\t\t\t\t\t(sd) =>\n\t\t\t\t\t\t\tsd ??\n\t\t\t\t\t\t\tsearchByType({\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\t\"derivation:missing\": \"true\",\n\t\t\t\t\t\t\t\t_elements: SD_ELEMENTS,\n\t\t\t\t\t\t\t\t_count: \"1\",\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t)\n\t\t\t.then((sd) => {\n\t\t\t\tsdCache.set(type, sd);\n\t\t\t\tpendingRequests.delete(key);\n\t\t\t\treturn sd;\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\tpendingRequests.delete(key);\n\t\t\t\treturn null;\n\t\t\t});\n\t\tpendingRequests.set(key, pending);\n\t}\n\treturn pending;\n}\n\n// ── Element helpers ────────────────────────────────────────────────────\n\nfunction fieldName(element: FhirElement): string {\n\tconst parts = element.path.split(\".\");\n\treturn (parts[parts.length - 1] ?? \"\").replace(\"[x]\", \"\");\n}\n\nfunction directChildren(\n\telements: FhirElement[],\n\tparentPath: string,\n): FhirElement[] {\n\tconst prefix = `${parentPath}.`;\n\treturn elements.filter((el) => {\n\t\tif (!el.path.startsWith(prefix)) return false;\n\t\tconst rest = el.path.slice(prefix.length);\n\t\treturn !rest.includes(\".\");\n\t});\n}\n\nfunction findElement(\n\telements: FhirElement[],\n\tparentPath: string,\n\tkey: string,\n): FhirElement | undefined {\n\tconst direct = elements.find((el) => {\n\t\tif (!el.path.startsWith(`${parentPath}.`)) return false;\n\t\tconst name = fieldName(el);\n\t\treturn name === key || name.toLowerCase() === key.toLowerCase();\n\t});\n\tif (direct) return direct;\n\n\tfor (const el of elements) {\n\t\tif (!el.path.endsWith(\"[x]\")) continue;\n\t\tif (!el.path.startsWith(`${parentPath}.`)) continue;\n\t\tconst baseName = fieldName(el);\n\t\tif (!key.toLowerCase().startsWith(baseName.toLowerCase())) continue;\n\t\tconst typeSuffix = key.slice(baseName.length).toLowerCase();\n\t\tconst matchedType = el.type?.find(\n\t\t\t(t) => t.code.toLowerCase() === typeSuffix,\n\t\t);\n\t\tif (matchedType) {\n\t\t\treturn { ...el, type: [matchedType] };\n\t\t}\n\t}\n\treturn undefined;\n}\n\n// ── Resolve completions at path ────────────────────────────────────────\n\nasync function collectAllElements(\n\ttype: string,\n\tgetSDs: GetStructureDefinitions,\n): Promise<{ elements: FhirElement[]; basePath: string } | null> {\n\tconst sd = await getCachedSD(type, getSDs);\n\tif (!sd?.differential?.element) return null;\n\n\tconst elements = [...sd.differential.element];\n\n\tif (sd.baseDefinition) {\n\t\tconst base = await collectAllElements(sd.baseDefinition, getSDs);\n\t\tif (base) {\n\t\t\tfor (const baseEl of base.elements) {\n\t\t\t\tconst remappedPath = baseEl.path.replace(\n\t\t\t\t\tnew RegExp(`^${base.basePath}`),\n\t\t\t\t\tsd.type,\n\t\t\t\t);\n\t\t\t\tif (!elements.some((e) => e.path === remappedPath)) {\n\t\t\t\t\telements.push({ ...baseEl, path: remappedPath });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { elements, basePath: sd.type };\n}\n\nasync function resolveElements(\n\tpath: string[],\n\tresourceType: string,\n\tgetSDs: GetStructureDefinitions,\n): Promise<FhirElement[]> {\n\tconst result = await collectAllElements(resourceType, getSDs);\n\tif (!result) return [];\n\n\tlet currentPath = resourceType;\n\tlet currentElements = result.elements;\n\n\tfor (const key of path) {\n\t\tif (key === \"resourceType\") return [];\n\n\t\tconst el = findElement(currentElements, currentPath, key);\n\t\tif (!el) return [];\n\n\t\tif (el.contentReference) {\n\t\t\tcurrentPath = el.contentReference.replace(/^#/, \"\");\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!el.type?.[0]) return [];\n\t\tconst typeCode = el.type[0].code;\n\n\t\tif (typeCode === \"BackboneElement\") {\n\t\t\tcurrentPath = el.path;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst typeResult = await collectAllElements(typeCode, getSDs);\n\t\tif (!typeResult) return [];\n\t\tcurrentPath = typeResult.basePath;\n\t\tcurrentElements = typeResult.elements;\n\t}\n\n\tconst children = directChildren(currentElements, currentPath);\n\tconst expanded: FhirElement[] = [];\n\n\tfor (const el of children) {\n\t\tconst isChoiceType = el.path.endsWith(\"[x]\");\n\t\tif (isChoiceType && el.type && el.type.length > 0) {\n\t\t\tfor (const t of el.type) {\n\t\t\t\texpanded.push({\n\t\t\t\t\t...el,\n\t\t\t\t\tpath: el.path.replace(\n\t\t\t\t\t\t\"[x]\",\n\t\t\t\t\t\tt.code.charAt(0).toUpperCase() + t.code.slice(1),\n\t\t\t\t\t),\n\t\t\t\t\ttype: [t],\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\texpanded.push(el);\n\t\t}\n\t}\n\n\treturn expanded;\n}\n\nasync function findResourceBoundary(\n\tpath: string[],\n\tresourceType: string,\n\tgetSDs: GetStructureDefinitions,\n): Promise<number | null> {\n\tif (path.length === 0) return null;\n\n\tconst result = await collectAllElements(resourceType, getSDs);\n\tif (!result) return null;\n\n\tlet currentPath = resourceType;\n\tlet currentElements = result.elements;\n\n\tfor (let i = 0; i < path.length; i++) {\n\t\tconst key = path[i]!;\n\t\tif (key === \"resourceType\") return null;\n\n\t\tconst el = findElement(currentElements, currentPath, key);\n\t\tif (!el) return null;\n\n\t\tif (el.type?.some((t) => t.code === \"Resource\")) {\n\t\t\treturn i;\n\t\t}\n\n\t\tif (el.contentReference) {\n\t\t\tcurrentPath = el.contentReference.replace(/^#/, \"\");\n\t\t\tcontinue;\n\t\t}\n\t\tif (!el.type?.[0]) return null;\n\t\tconst typeCode = el.type[0].code;\n\t\tif (typeCode === \"BackboneElement\") {\n\t\t\tcurrentPath = el.path;\n\t\t\tcontinue;\n\t\t}\n\t\tconst typeResult = await collectAllElements(typeCode, getSDs);\n\t\tif (!typeResult) return null;\n\t\tcurrentPath = typeResult.basePath;\n\t\tcurrentElements = typeResult.elements;\n\t}\n\treturn null;\n}\n\n// ── Snippet & Completion Builders ──────────────────────────────────────\n\ntype SnippetKind =\n\t| \"array-complex\"\n\t| \"array-primitive\"\n\t| \"array-extension\"\n\t| \"object\"\n\t| \"string\"\n\t| \"number\"\n\t| \"bare\";\n\nfunction snippetKind(element: FhirElement): SnippetKind {\n\tconst isArray = element.max === \"*\";\n\tconst typeCode = element.type?.[0]?.code;\n\tif (!typeCode) {\n\t\tif (element.contentReference) return isArray ? \"array-complex\" : \"object\";\n\t\treturn \"bare\";\n\t}\n\tif (typeCode === \"Extension\" && isArray) return \"array-extension\";\n\tif (isArray)\n\t\treturn isPrimitiveType(typeCode) ? \"array-primitive\" : \"array-complex\";\n\tif (FHIR_NUMBER_TYPES.has(typeCode)) return \"number\";\n\tif (isPrimitiveType(typeCode)) return \"string\";\n\treturn \"object\";\n}\n\nfunction buildSnippet(\n\tname: string,\n\tkind: SnippetKind,\n\tindent: string,\n): { text: string; cursorOffset: number } {\n\tconst inner = `${indent} `;\n\tconst innerInner = `${inner} `;\n\tswitch (kind) {\n\t\tcase \"array-complex\": {\n\t\t\tconst text = `\"${name}\": [\\n${inner}{\\n${innerInner}\\n${inner}}\\n${indent}]`;\n\t\t\treturn {\n\t\t\t\ttext,\n\t\t\t\tcursorOffset: text.indexOf(innerInner) + innerInner.length,\n\t\t\t};\n\t\t}\n\t\tcase \"array-extension\": {\n\t\t\tconst text = `\"${name}\": [\\n${inner}{\\n${innerInner}\"url\": \"\"\\n${inner}}\\n${indent}]`;\n\t\t\treturn { text, cursorOffset: text.lastIndexOf('\"\"') + 1 };\n\t\t}\n\t\tcase \"array-primitive\": {\n\t\t\tconst text = `\"${name}\": [\\n${inner}\\n${indent}]`;\n\t\t\treturn { text, cursorOffset: text.indexOf(`${inner}\\n`) + inner.length };\n\t\t}\n\t\tcase \"object\": {\n\t\t\tconst text = `\"${name}\": {\\n${inner}\\n${indent}}`;\n\t\t\treturn { text, cursorOffset: text.indexOf(`${inner}\\n`) + inner.length };\n\t\t}\n\t\tcase \"string\": {\n\t\t\tconst text = `\"${name}\": \"\"`;\n\t\t\treturn { text, cursorOffset: text.length - 1 };\n\t\t}\n\t\tdefault: {\n\t\t\tconst text = `\"${name}\": `;\n\t\t\treturn { text, cursorOffset: text.length };\n\t\t}\n\t}\n}\n\nfunction toCompletion(element: FhirElement): Completion {\n\tconst name = fieldName(element);\n\tconst types = element.type?.map((t) => t.code).join(\" | \") ?? \"\";\n\tconst kind = snippetKind(element);\n\n\tconst completion: Completion = {\n\t\tlabel: name,\n\t\ttype: \"property\",\n\t\tdetail: types,\n\t\tboost: element.min && element.min > 0 ? 2 : 0,\n\t\tapply: (view, _completion, from, to) => {\n\t\t\tconst doc = view.state.doc.toString();\n\t\t\tlet actualFrom = from;\n\t\t\tlet actualTo = to;\n\t\t\tif (actualFrom > 0 && doc[actualFrom - 1] === '\"') actualFrom--;\n\t\t\tif (actualTo < doc.length && doc[actualTo] === '\"') actualTo++;\n\n\t\t\tconst afterName = doc.slice(actualTo).match(/^\\s*:/);\n\t\t\tif (afterName) {\n\t\t\t\tconst insert = `\"${name}\"`;\n\t\t\t\tview.dispatch({\n\t\t\t\t\tchanges: { from: actualFrom, to: actualTo, insert },\n\t\t\t\t\tselection: { anchor: actualFrom + insert.length },\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst line = view.state.doc.lineAt(actualFrom);\n\t\t\tconst lineText = line.text;\n\t\t\tconst indent = lineText.match(/^(\\s*)/)?.[1] ?? \"\";\n\n\t\t\tconst { text, cursorOffset } = buildSnippet(name, kind, indent);\n\n\t\t\tview.dispatch({\n\t\t\t\tchanges: { from: actualFrom, to: actualTo, insert: text },\n\t\t\t\tselection: { anchor: actualFrom + cursorOffset },\n\t\t\t});\n\n\t\t\tif (\n\t\t\t\tkind === \"string\" ||\n\t\t\t\tkind === \"number\" ||\n\t\t\t\tkind === \"array-primitive\" ||\n\t\t\t\tkind === \"array-extension\"\n\t\t\t) {\n\t\t\t\tsetTimeout(() => startCompletion(view), 0);\n\t\t\t}\n\t\t},\n\t};\n\tif (element.short) completion.info = element.short;\n\treturn completion;\n}\n\nfunction toParameterPropertyCompletion(element: FhirElement): Completion {\n\tconst name = fieldName(element);\n\tif (name !== \"parameter\" && name !== \"part\") return toCompletion(element);\n\n\tconst types = element.type?.map((t) => t.code).join(\" | \") ?? \"\";\n\tconst completion: Completion = {\n\t\tlabel: name,\n\t\ttype: \"property\",\n\t\tdetail: types,\n\t\tboost: element.min && element.min > 0 ? 2 : 0,\n\t\tapply: (view, _completion, from, to) => {\n\t\t\tconst doc = view.state.doc.toString();\n\t\t\tlet actualFrom = from;\n\t\t\tlet actualTo = to;\n\t\t\tif (actualFrom > 0 && doc[actualFrom - 1] === '\"') actualFrom--;\n\t\t\tif (actualTo < doc.length && doc[actualTo] === '\"') actualTo++;\n\n\t\t\tconst afterName = doc.slice(actualTo).match(/^\\s*:/);\n\t\t\tif (afterName) {\n\t\t\t\tconst insert = `\"${name}\"`;\n\t\t\t\tview.dispatch({\n\t\t\t\t\tchanges: { from: actualFrom, to: actualTo, insert },\n\t\t\t\t\tselection: { anchor: actualFrom + insert.length },\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst line = view.state.doc.lineAt(actualFrom);\n\t\t\tconst indent = line.text.match(/^(\\s*)/)?.[1] ?? \"\";\n\t\t\tconst inner = `${indent} `;\n\t\t\tconst innerInner = `${inner} `;\n\t\t\tconst text = `\"${name}\": [\\n${inner}{\\n${innerInner}\"name\": \"\"\\n${inner}}\\n${indent}]`;\n\t\t\tview.dispatch({\n\t\t\t\tchanges: { from: actualFrom, to: actualTo, insert: text },\n\t\t\t\tselection: { anchor: actualFrom + text.lastIndexOf('\"\"') + 1 },\n\t\t\t});\n\t\t\tsetTimeout(() => startCompletion(view), 0);\n\t\t},\n\t};\n\tif (element.short) completion.info = element.short;\n\treturn completion;\n}\n\nfunction elementsToCompletions(\n\telements: FhirElement[],\n\tmapFn: (el: FhirElement) => Completion,\n): Completion[] {\n\tconst completions: Completion[] = [];\n\tfor (const el of elements) {\n\t\tcompletions.push(mapFn(el));\n\t\tconst name = fieldName(el);\n\t\tconst firstTypeCode = el.type?.[0]?.code;\n\t\tif (\n\t\t\tel.type?.length === 1 &&\n\t\t\tfirstTypeCode &&\n\t\t\tPRIMITIVE_TYPES.has(firstTypeCode)\n\t\t) {\n\t\t\tconst ext: Completion = {\n\t\t\t\tlabel: `_${name}`,\n\t\t\t\ttype: \"property\",\n\t\t\t\tdetail: \"Element\",\n\t\t\t\tboost: -1,\n\t\t\t};\n\t\t\text.info = \"Primitive element extension\";\n\t\t\tcompletions.push(ext);\n\t\t}\n\t}\n\treturn completions;\n}\n\n// ── Extension helpers ──────────────────────────────────────────────────\n\ninterface ExtensionInfo {\n\turl: string;\n\tname?: string | undefined;\n\tisNested: boolean;\n\tvalueTypes: string[];\n\tslices: { sliceName: string; fixedUri: string; short?: string | undefined }[];\n}\n\nfunction analyzeExtensionSD(sd: StructureDefinition): ExtensionInfo | null {\n\tif (!sd.differential?.element) return null;\n\tconst elements = sd.differential.element;\n\n\tconst valueEl = elements.find((e) => e.path === \"Extension.value[x]\");\n\tconst isNested = valueEl?.max === \"0\";\n\tconst valueTypes = isNested ? [] : (valueEl?.type?.map((t) => t.code) ?? []);\n\n\tconst slices: ExtensionInfo[\"slices\"] = [];\n\tfor (const el of elements) {\n\t\tif (el.path === \"Extension.extension\" && el.sliceName) {\n\t\t\tconst sliceName = el.sliceName;\n\t\t\tconst urlEl = elements.find(\n\t\t\t\t(e) =>\n\t\t\t\t\te.path === \"Extension.extension.url\" &&\n\t\t\t\t\te.fixedUri &&\n\t\t\t\t\telements.indexOf(e) > elements.indexOf(el),\n\t\t\t);\n\t\t\tconst fixedUri = urlEl?.fixedUri ?? sliceName;\n\t\t\tslices.push({ sliceName, fixedUri, short: el.short });\n\t\t}\n\t}\n\n\treturn {\n\t\turl: sd.url ?? sd.type,\n\t\tname: sd.name,\n\t\tisNested,\n\t\tvalueTypes,\n\t\tslices,\n\t};\n}\n\n// ── Parameters slice helpers ────────────────────────────────────────────\n\nconst parametersTypeCache = new Map<string, boolean>();\n\nasync function isParametersType(\n\tresourceType: string,\n\tgetSDs: GetStructureDefinitions,\n): Promise<boolean> {\n\tif (resourceType === \"Parameters\") return true;\n\tif (parametersTypeCache.has(resourceType))\n\t\treturn parametersTypeCache.get(resourceType)!;\n\n\tconst sd = await getCachedSD(resourceType, getSDs);\n\tif (!sd?.baseDefinition) {\n\t\tparametersTypeCache.set(resourceType, false);\n\t\treturn false;\n\t}\n\tconst baseType = sd.baseDefinition.split(\"/\").pop()?.split(\"|\")[0] ?? \"\";\n\tconst result = await isParametersType(baseType, getSDs);\n\tparametersTypeCache.set(resourceType, result);\n\treturn result;\n}\n\ninterface ParameterSlice {\n\tsliceName: string;\n\tfixedName: string;\n\tmin: number;\n\tmax: string;\n\tvalueTypes: string[];\n\tshort?: string;\n}\n\nasync function getParameterSlices(\n\tprofileUrls: string[],\n\tgetSDs: GetStructureDefinitions,\n): Promise<ParameterSlice[]> {\n\tconst slices: ParameterSlice[] = [];\n\n\tfor (const profileUrl of profileUrls) {\n\t\tconst sd = await getCachedSD(profileUrl, getSDs);\n\t\tif (!sd?.differential?.element) continue;\n\n\t\tconst elements = sd.differential.element;\n\t\t// Find the parameter path dynamically: \"X.parameter\" where X is the profile's type\n\t\tconst paramPath = `${sd.type}.parameter`;\n\n\t\tlet current: {\n\t\t\tsliceName: string;\n\t\t\tmin: number;\n\t\t\tmax: string;\n\t\t\tfixedName: string | null;\n\t\t\tvalueTypes: string[];\n\t\t\tshort: string | undefined;\n\t\t} | null = null;\n\n\t\tconst flush = () => {\n\t\t\tif (current?.fixedName) {\n\t\t\t\tconst s: ParameterSlice = {\n\t\t\t\t\tsliceName: current.sliceName,\n\t\t\t\t\tfixedName: current.fixedName,\n\t\t\t\t\tmin: current.min,\n\t\t\t\t\tmax: current.max,\n\t\t\t\t\tvalueTypes: current.valueTypes,\n\t\t\t\t};\n\t\t\t\tif (current.short != null) s.short = current.short;\n\t\t\t\tslices.push(s);\n\t\t\t}\n\t\t};\n\n\t\tfor (const el of elements) {\n\t\t\tif (el.path === paramPath && el.sliceName) {\n\t\t\t\tflush();\n\t\t\t\tcurrent = {\n\t\t\t\t\tsliceName: el.sliceName,\n\t\t\t\t\tmin: el.min ?? 0,\n\t\t\t\t\tmax: el.max ?? \"*\",\n\t\t\t\t\tfixedName: null,\n\t\t\t\t\tvalueTypes: [],\n\t\t\t\t\tshort: el.short,\n\t\t\t\t};\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!current) continue;\n\n\t\t\tif (el.path === `${paramPath}.name` && el.fixedString) {\n\t\t\t\tcurrent.fixedName = el.fixedString;\n\t\t\t}\n\t\t\tif (el.path === `${paramPath}.value[x]` && el.type) {\n\t\t\t\tcurrent.valueTypes = el.type.map((t) => t.code);\n\t\t\t}\n\t\t}\n\n\t\tflush();\n\t}\n\n\treturn slices;\n}\n\n// ── Fixed value helpers ────────────────────────────────────────────────\n\nasync function getFixedValues(\n\teffectivePath: string[],\n\tvalueKey: string,\n\tresourceType: string,\n\tprofileUrls: string[],\n\tgetSDs: GetStructureDefinitions,\n): Promise<string | null> {\n\tfor (const profileUrl of profileUrls) {\n\t\tconst sd = await getCachedSD(profileUrl, getSDs);\n\t\tif (!sd?.differential?.element) continue;\n\n\t\tconst fhirPath = `${resourceType}.${[...effectivePath, valueKey].join(\".\")}`;\n\t\tfor (const el of sd.differential.element) {\n\t\t\tif (el.path !== fhirPath) continue;\n\t\t\tif (el.fixedString != null) return el.fixedString;\n\t\t\tif (el.fixedUri != null) return el.fixedUri;\n\t\t\tif (el.fixedCode != null) return el.fixedCode;\n\t\t}\n\t}\n\treturn null;\n}\n\n/** @internal — exported for tests only */\nexport function buildParameterSnippet(\n\tname: string,\n\tvalueTypes: string[],\n\tindent: string,\n): { text: string; cursorOffset: number } {\n\tconst inner = `${indent} `;\n\n\tif (valueTypes.length === 1 && FHIR_STRING_TYPES.has(valueTypes[0]!)) {\n\t\tconst tc = valueTypes[0]!;\n\t\tconst vf = `value${tc.charAt(0).toUpperCase()}${tc.slice(1)}`;\n\t\tconst text = `{\\n${inner}\"name\": \"${name}\",\\n${inner}\"${vf}\": \"\"\\n${indent}}`;\n\t\treturn { text, cursorOffset: text.lastIndexOf('\"\"') + 1 };\n\t}\n\tif (valueTypes.length === 1 && FHIR_NUMBER_TYPES.has(valueTypes[0]!)) {\n\t\tconst tc = valueTypes[0]!;\n\t\tconst vf = `value${tc.charAt(0).toUpperCase()}${tc.slice(1)}`;\n\t\tconst text = `{\\n${inner}\"name\": \"${name}\",\\n${inner}\"${vf}\": \\n${indent}}`;\n\t\treturn {\n\t\t\ttext,\n\t\t\tcursorOffset: text.indexOf(`\"${vf}\": \\n`) + `\"${vf}\": `.length,\n\t\t};\n\t}\n\tif (valueTypes.length === 1) {\n\t\tconst tc = valueTypes[0]!;\n\t\tconst vf = `value${tc.charAt(0).toUpperCase()}${tc.slice(1)}`;\n\t\tconst innerInner = `${inner} `;\n\t\tconst text = `{\\n${inner}\"name\": \"${name}\",\\n${inner}\"${vf}\": {\\n${innerInner}\\n${inner}}\\n${indent}}`;\n\t\treturn {\n\t\t\ttext,\n\t\t\tcursorOffset:\n\t\t\t\ttext.indexOf(`${innerInner}\\n${inner}}`) + innerInner.length,\n\t\t};\n\t}\n\t// Default to valueString when no value type constraint\n\tconst text = `{\\n${inner}\"name\": \"${name}\",\\n${inner}\"valueString\": \"\"\\n${indent}}`;\n\tif (name === \"\") {\n\t\t// Generic template: cursor in name\n\t\treturn { text, cursorOffset: text.indexOf('\"\"') + 1 };\n\t}\n\treturn { text, cursorOffset: text.lastIndexOf('\"\"') + 1 };\n}\n\n// ── Binding & Reference Resolution ─────────────────────────────────────\n\nfunction buildFhirElementPath(\n\tresourceType: string,\n\tpath: string[],\n\tvalueKey: string,\n): string {\n\treturn `${resourceType}.${[...path, valueKey].join(\".\")}`;\n}\n\nasync function findProfileBinding(\n\tprofileUrls: string[],\n\tresourceType: string,\n\tpath: string[],\n\tvalueKey: string,\n\tgetSDs: GetStructureDefinitions,\n): Promise<string | null> {\n\tif (profileUrls.length === 0) return null;\n\n\tfor (const profileUrl of profileUrls) {\n\t\tconst sd = await getCachedSD(profileUrl, getSDs);\n\t\tif (!sd?.differential?.element) continue;\n\n\t\tconst directPath = buildFhirElementPath(resourceType, path, valueKey);\n\t\tfor (const el of sd.differential.element) {\n\t\t\tif (el.path === directPath && el.binding?.valueSet) {\n\t\t\t\treturn el.binding.valueSet;\n\t\t\t}\n\t\t}\n\n\t\tif (valueKey === \"code\") {\n\t\t\tfor (let i = path.length; i > 0; i--) {\n\t\t\t\tconst parentFhirPath = buildFhirElementPath(\n\t\t\t\t\tresourceType,\n\t\t\t\t\tpath.slice(0, i - 1),\n\t\t\t\t\tpath[i - 1]!,\n\t\t\t\t);\n\t\t\t\tfor (const el of sd.differential.element) {\n\t\t\t\t\tif (el.path === parentFhirPath && el.binding?.valueSet) {\n\t\t\t\t\t\treturn el.binding.valueSet;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn null;\n}\n\nasync function findExtensionBinding(\n\tdoc: string,\n\tpos: number,\n\tgetSDs: GetStructureDefinitions,\n): Promise<string | null> {\n\tconst textBefore = doc.slice(0, pos);\n\n\tconst urlMatches = [...textBefore.matchAll(/\"url\"\\s*:\\s*\"([^\"]+)\"/g)];\n\tif (urlMatches.length === 0) return null;\n\n\tfor (let i = urlMatches.length - 1; i >= 0; i--) {\n\t\tconst extUrl = urlMatches[i]![1]!;\n\t\tif (\n\t\t\t!extUrl.includes(\"StructureDefinition/\") &&\n\t\t\t!extUrl.includes(\"Extension\")\n\t\t) {\n\t\t\tconst parentUrlMatches = [\n\t\t\t\t...textBefore\n\t\t\t\t\t.slice(0, urlMatches[i]?.index)\n\t\t\t\t\t.matchAll(/\"url\"\\s*:\\s*\"([^\"]+)\"/g),\n\t\t\t];\n\t\t\tfor (let j = parentUrlMatches.length - 1; j >= 0; j--) {\n\t\t\t\tconst parentUrl = parentUrlMatches[j]![1]!;\n\t\t\t\tif (!parentUrl.includes(\"/\")) continue;\n\t\t\t\tconst parentSD = await getCachedSD(parentUrl, getSDs);\n\t\t\t\tif (!parentSD?.differential?.element) continue;\n\t\t\t\tlet inSlice = false;\n\t\t\t\tfor (const el of parentSD.differential.element) {\n\t\t\t\t\tif (el.path === \"Extension.extension\" && el.sliceName) {\n\t\t\t\t\t\tconst urlEl = parentSD.differential.element.find(\n\t\t\t\t\t\t\t(e) =>\n\t\t\t\t\t\t\t\te.path === \"Extension.extension.url\" &&\n\t\t\t\t\t\t\t\te.fixedUri &&\n\t\t\t\t\t\t\t\tparentSD.differential!.element.indexOf(e) >\n\t\t\t\t\t\t\t\t\tparentSD.differential!.element.indexOf(el),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif ((urlEl?.fixedUri ?? el.sliceName) === extUrl) {\n\t\t\t\t\t\t\tinSlice = true;\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (inSlice) break;\n\t\t\t\t\t}\n\t\t\t\t\tif (\n\t\t\t\t\t\tinSlice &&\n\t\t\t\t\t\tel.path === \"Extension.extension.value[x]\" &&\n\t\t\t\t\t\tel.binding?.valueSet\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn el.binding.valueSet;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (inSlice) break;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tconst sd = await getCachedSD(extUrl, getSDs);\n\t\tif (!sd?.differential?.element) continue;\n\t\tfor (const el of sd.differential.element) {\n\t\t\tif (el.path === \"Extension.value[x]\" && el.binding?.valueSet) {\n\t\t\t\treturn el.binding.valueSet;\n\t\t\t}\n\t\t}\n\t}\n\treturn null;\n}\n\nasync function findBindingForValue(\n\tpath: string[],\n\tvalueKey: string,\n\tresourceType: string,\n\tgetSDs: GetStructureDefinitions,\n\tprofileUrls: string[] = [],\n\tdoc?: string,\n\tpos?: number,\n): Promise<string | null> {\n\tif (doc != null && pos != null) {\n\t\tconst inExtension = path.some(\n\t\t\t(p) => p === \"extension\" || p === \"modifierExtension\",\n\t\t);\n\t\tif (inExtension) {\n\t\t\tconst extBinding = await findExtensionBinding(doc, pos, getSDs);\n\t\t\tif (extBinding) return extBinding;\n\t\t}\n\t}\n\n\tconst profileBinding = await findProfileBinding(\n\t\tprofileUrls,\n\t\tresourceType,\n\t\tpath,\n\t\tvalueKey,\n\t\tgetSDs,\n\t);\n\tif (profileBinding) return profileBinding;\n\n\tconst elements = await resolveElements(path, resourceType, getSDs);\n\tfor (const el of elements) {\n\t\tif (fieldName(el) === valueKey && el.binding?.valueSet) {\n\t\t\treturn el.binding.valueSet;\n\t\t}\n\t}\n\n\tif (valueKey === \"code\") {\n\t\tfor (let i = path.length; i > 0; i--) {\n\t\t\tconst parentElements = await resolveElements(\n\t\t\t\tpath.slice(0, i - 1),\n\t\t\t\tresourceType,\n\t\t\t\tgetSDs,\n\t\t\t);\n\t\t\tfor (const el of parentElements) {\n\t\t\t\tif (fieldName(el) === path[i - 1] && el.binding?.valueSet) {\n\t\t\t\t\treturn el.binding.valueSet;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn null;\n}\n\nasync function findCanonicalTargetType(\n\tpath: string[],\n\tarrayKey: string,\n\tresourceType: string,\n\tgetSDs: GetStructureDefinitions,\n): Promise<string | null> {\n\tconst elements = await resolveElements(path, resourceType, getSDs);\n\tfor (const el of elements) {\n\t\tif (fieldName(el) !== arrayKey) continue;\n\t\tif (el.max !== \"*\") continue;\n\t\tconst t = el.type?.[0];\n\t\tif (t?.code !== \"canonical\" || !t.targetProfile?.length) continue;\n\t\treturn t.targetProfile[0]?.split(\"/\").pop() ?? null;\n\t}\n\treturn null;\n}\n\nasync function resolveReferenceTargets(\n\tpath: string[],\n\tresourceType: string,\n\tgetSDs: GetStructureDefinitions,\n): Promise<string[] | null> {\n\tconst result = await collectAllElements(resourceType, getSDs);\n\tif (!result) return null;\n\n\tlet currentPath = resourceType;\n\tlet currentElements = result.elements;\n\n\tfor (let i = 0; i < path.length - 1; i++) {\n\t\tconst key = path[i]!;\n\t\tif (key === \"resourceType\") return null;\n\n\t\tconst el = findElement(currentElements, currentPath, key);\n\t\tif (!el) return null;\n\n\t\tif (el.contentReference) {\n\t\t\tcurrentPath = el.contentReference.replace(/^#/, \"\");\n\t\t\tcontinue;\n\t\t}\n\t\tif (!el.type?.[0]) return null;\n\t\tconst typeCode = el.type[0].code;\n\t\tif (typeCode === \"BackboneElement\") {\n\t\t\tcurrentPath = el.path;\n\t\t\tcontinue;\n\t\t}\n\t\tconst typeResult = await collectAllElements(typeCode, getSDs);\n\t\tif (!typeResult) return null;\n\t\tcurrentPath = typeResult.basePath;\n\t\tcurrentElements = typeResult.elements;\n\t}\n\n\tconst lastKey = path[path.length - 1];\n\tif (!lastKey) return null;\n\n\tconst el = findElement(currentElements, currentPath, lastKey);\n\tif (!el?.type) return null;\n\n\tconst targets: string[] = [];\n\tfor (const t of el.type) {\n\t\tif (t.code === \"Reference\" && t.targetProfile) {\n\t\t\tfor (const profile of t.targetProfile) {\n\t\t\t\tconst rt = profile.split(\"/\").pop();\n\t\t\t\tif (rt) targets.push(rt);\n\t\t\t}\n\t\t}\n\t}\n\treturn targets.length > 0 ? targets : null;\n}\n\n// ── Unified completion handler ─────────────────────────────────────────\n\nasync function fhirComplete(\n\tctx: DocumentContext,\n\tgetSDs: GetStructureDefinitions,\n\tresourceTypeHint: string | undefined,\n\texpandValueSet: ExpandValueSet | undefined,\n\tcompletionContext: CompletionContext,\n): Promise<CompletionResult | null> {\n\tconst { pos, doc } = ctx;\n\n\t// 1. Resolve context: resourceType, effectivePath, profileUrls\n\t// Search from root (outermost scope) inward to find the root resourceType.\n\t// If not found in doc, fall back to resourceTypeHint (derived from URL).\n\tlet resourceType: string | undefined;\n\tlet hasExplicitResourceType = false;\n\tlet rtScope = ctx.getScope(0);\n\tfor (let level = ctx.fullPath.length; level >= 0; level--) {\n\t\tconst s = ctx.getScope(level);\n\t\tconst rt = s.getString(\"resourceType\");\n\t\tif (rt) {\n\t\t\tresourceType = rt;\n\t\t\thasExplicitResourceType = true;\n\t\t\trtScope = s;\n\t\t\tbreak;\n\t\t}\n\t}\n\t// If no resourceType found in any scope, use hint.\n\t// If found only in an inner scope (not the root), still prefer hint for\n\t// boundary detection — the inner RT will be picked up via getScope later.\n\tif (!resourceType) {\n\t\tresourceType = resourceTypeHint;\n\t} else if (resourceTypeHint && ctx.fullPath.length > 0) {\n\t\t// Check if the found RT is actually from an inner scope, not the root.\n\t\t// If the root scope has no RT but hint is available, use hint as the\n\t\t// outer RT so that findResourceBoundary can resolve the path correctly.\n\t\tconst rootRT = ctx.getScope(ctx.fullPath.length).getString(\"resourceType\");\n\t\tif (!rootRT) {\n\t\t\tresourceType = resourceTypeHint;\n\t\t\thasExplicitResourceType = false;\n\t\t}\n\t}\n\n\tlet effectivePath = ctx.fullPath;\n\tlet profileUrls: string[] = [];\n\n\t// Detect Resource-typed boundary (e.g. contained, Bundle.entry.resource)\n\tif (resourceType && effectivePath.length > 0) {\n\t\tconst boundaryIdx = await findResourceBoundary(\n\t\t\teffectivePath,\n\t\t\tresourceType,\n\t\t\tgetSDs,\n\t\t);\n\t\tif (boundaryIdx !== null) {\n\t\t\tconst innerPath = effectivePath.slice(boundaryIdx + 1);\n\t\t\tconst innerScope = ctx.getScope(innerPath.length);\n\t\t\tconst innerRT = innerScope.getString(\"resourceType\");\n\t\t\teffectivePath = innerPath;\n\t\t\tif (innerRT) {\n\t\t\t\tresourceType = innerRT;\n\t\t\t\thasExplicitResourceType = true;\n\t\t\t} else {\n\t\t\t\tresourceType = \"DomainResource\";\n\t\t\t\thasExplicitResourceType = false;\n\t\t\t}\n\t\t\tprofileUrls = innerScope.getStringArray(\"meta\", \"profile\");\n\t\t} else {\n\t\t\tprofileUrls = rtScope.getStringArray(\"meta\", \"profile\");\n\t\t}\n\t} else {\n\t\tprofileUrls = rtScope.getStringArray(\"meta\", \"profile\");\n\t}\n\n\t// 2. Handle cursor position kinds\n\tconst cp = ctx.cursorPosition;\n\n\tif (cp.kind === \"value\") {\n\t\treturn handleValueCompletion(\n\t\t\tcp.key,\n\t\t\teffectivePath,\n\t\t\tresourceType,\n\t\t\thasExplicitResourceType,\n\t\t\tprofileUrls,\n\t\t\tdoc,\n\t\t\tpos,\n\t\t\tgetSDs,\n\t\t\texpandValueSet,\n\t\t\tcompletionContext,\n\t\t\tctx,\n\t\t);\n\t}\n\n\tif (cp.kind === \"array-item\") {\n\t\treturn handleArrayItemCompletion(\n\t\t\tcp.parentKey,\n\t\t\teffectivePath,\n\t\t\tresourceType,\n\t\t\tdoc,\n\t\t\tpos,\n\t\t\tgetSDs,\n\t\t\tcompletionContext,\n\t\t\tprofileUrls,\n\t\t);\n\t}\n\n\tif (cp.kind === \"property\") {\n\t\t// Don't offer property completions inside arrays\n\t\tif (ctx.isInsideArray()) return null;\n\n\t\treturn handlePropertyCompletion(\n\t\t\teffectivePath,\n\t\t\tresourceType,\n\t\t\thasExplicitResourceType,\n\t\t\tdoc,\n\t\t\tpos,\n\t\t\tgetSDs,\n\t\t\tcompletionContext,\n\t\t\tctx,\n\t\t);\n\t}\n\n\treturn null;\n}\n\n// ── Value completion ───────────────────────────────────────────────────\n\nasync function handleValueCompletion(\n\tvalueKey: string,\n\teffectivePath: string[],\n\tresourceType: string | undefined,\n\t_hasExplicitResourceType: boolean,\n\tprofileUrls: string[],\n\tdoc: string,\n\tpos: number,\n\tgetSDs: GetStructureDefinitions,\n\texpandValueSet: ExpandValueSet | undefined,\n\tcompletionContext: CompletionContext,\n\tctx: DocumentContext,\n): Promise<CompletionResult | null> {\n\t// resourceType value\n\tif (valueKey === \"resourceType\") {\n\t\tconst sds = await getCachedSDList(\n\t\t\t{\n\t\t\t\tderivation: \"specialization\",\n\t\t\t\tkind: \"resource\",\n\t\t\t\t_elements: \"type\",\n\t\t\t\t_count: \"500\",\n\t\t\t},\n\t\t\tgetSDs,\n\t\t);\n\t\tconst options: Completion[] = sds.map((sd) => ({\n\t\t\tlabel: sd.type,\n\t\t\ttype: \"type\",\n\t\t\tapply: (view: EditorView, _c: Completion, from: number, to: number) => {\n\t\t\t\tconst d = view.state.doc.toString();\n\t\t\t\tlet actualTo = to;\n\t\t\t\tif (actualTo < d.length && d[actualTo] === '\"') actualTo++;\n\t\t\t\tview.dispatch({\n\t\t\t\t\tchanges: { from, to: actualTo, insert: `${sd.type}\"` },\n\t\t\t\t\tselection: { anchor: from + sd.type.length + 1 },\n\t\t\t\t});\n\t\t\t},\n\t\t}));\n\t\tif (options.length === 0) return null;\n\t\tconst word = completionContext.matchBefore(/[\\w]*/);\n\t\treturn { from: word?.from ?? pos, options, validFor: /^\\w*$/ };\n\t}\n\n\t// Parameters.parameter.name → slice names from profile\n\tif (\n\t\tvalueKey === \"name\" &&\n\t\tresourceType &&\n\t\teffectivePath.length > 0 &&\n\t\teffectivePath[effectivePath.length - 1] === \"parameter\" &&\n\t\t(await isParametersType(resourceType, getSDs))\n\t) {\n\t\tconst slices = await getParameterSlices(profileUrls, getSDs);\n\t\tif (slices.length > 0) {\n\t\t\tconst options: Completion[] = slices.map((slice) => ({\n\t\t\t\tlabel: slice.fixedName,\n\t\t\t\ttype: \"text\",\n\t\t\t\tdetail: slice.min > 0 ? \"required\" : \"optional\",\n\t\t\t\tboost: slice.min > 0 ? 2 : 0,\n\t\t\t\t...(slice.short ? { info: slice.short } : {}),\n\t\t\t\tapply: (view: EditorView, _c: Completion, from: number, to: number) => {\n\t\t\t\t\tconst d = view.state.doc.toString();\n\t\t\t\t\tlet actualTo = to;\n\t\t\t\t\tif (actualTo < d.length && d[actualTo] === '\"') actualTo++;\n\t\t\t\t\tview.dispatch({\n\t\t\t\t\t\tchanges: {\n\t\t\t\t\t\t\tfrom,\n\t\t\t\t\t\t\tto: actualTo,\n\t\t\t\t\t\t\tinsert: `${slice.fixedName}\"`,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tselection: { anchor: from + slice.fixedName.length + 1 },\n\t\t\t\t\t});\n\t\t\t\t\t// Auto-insert value[x] field based on slice type\n\t\t\t\t\tconst vTypes = slice.valueTypes;\n\t\t\t\t\tif (vTypes.length === 0) vTypes.push(\"string\");\n\t\t\t\t\tif (vTypes.length === 1) {\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tconst cp = view.state.selection.main.head;\n\t\t\t\t\t\t\tconst cd = view.state.doc.toString();\n\t\t\t\t\t\t\tconst after = cd.slice(cp);\n\t\t\t\t\t\t\tif (!/^\\s*\\n\\s*\\}/.test(after)) return;\n\t\t\t\t\t\t\tconst lineObj = view.state.doc.lineAt(cp);\n\t\t\t\t\t\t\tconst ind = lineObj.text.match(/^(\\s*)/)?.[1] ?? \"\";\n\t\t\t\t\t\t\tconst tc = vTypes[0]!;\n\t\t\t\t\t\t\tconst vf = `value${tc.charAt(0).toUpperCase()}${tc.slice(1)}`;\n\t\t\t\t\t\t\tlet ins: string;\n\t\t\t\t\t\t\tlet cOff: number;\n\t\t\t\t\t\t\tif (FHIR_STRING_TYPES.has(tc)) {\n\t\t\t\t\t\t\t\tins = `,\\n${ind}\"${vf}\": \"\"`;\n\t\t\t\t\t\t\t\tcOff = ins.length - 1;\n\t\t\t\t\t\t\t} else if (FHIR_NUMBER_TYPES.has(tc)) {\n\t\t\t\t\t\t\t\tins = `,\\n${ind}\"${vf}\": `;\n\t\t\t\t\t\t\t\tcOff = ins.length;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst inner = `${ind} `;\n\t\t\t\t\t\t\t\tins = `,\\n${ind}\"${vf}\": {\\n${inner}\\n${ind}}`;\n\t\t\t\t\t\t\t\tcOff = ins.indexOf(`${inner}\\n${ind}}`) + inner.length;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tview.dispatch({\n\t\t\t\t\t\t\t\tchanges: { from: cp, insert: ins },\n\t\t\t\t\t\t\t\tselection: { anchor: cp + cOff },\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tsetTimeout(() => startCompletion(view), 0);\n\t\t\t\t\t\t}, 10);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t}));\n\t\t\tconst word = completionContext.matchBefore(/[\\w]*/);\n\t\t\treturn { from: word?.from ?? pos, options, validFor: /^\\w*$/ };\n\t\t}\n\t}\n\n\t// Fixed value from profile (fixedString, fixedUri, fixedCode)\n\tif (resourceType && profileUrls.length > 0) {\n\t\tconst fixedVal = await getFixedValues(\n\t\t\teffectivePath,\n\t\t\tvalueKey,\n\t\t\tresourceType,\n\t\t\tprofileUrls,\n\t\t\tgetSDs,\n\t\t);\n\t\tif (fixedVal != null) {\n\t\t\tconst option: Completion = {\n\t\t\t\tlabel: fixedVal,\n\t\t\t\ttype: \"text\",\n\t\t\t\tboost: 10,\n\t\t\t\tapply: (view: EditorView, _c: Completion, from: number, to: number) => {\n\t\t\t\t\tconst d = view.state.doc.toString();\n\t\t\t\t\tlet actualTo = to;\n\t\t\t\t\tif (actualTo < d.length && d[actualTo] === '\"') actualTo++;\n\t\t\t\t\tview.dispatch({\n\t\t\t\t\t\tchanges: { from, to: actualTo, insert: `${fixedVal}\"` },\n\t\t\t\t\t\tselection: { anchor: from + fixedVal.length + 1 },\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst word = completionContext.matchBefore(/[\\w.:/-]*/);\n\t\t\treturn {\n\t\t\t\tfrom: word?.from ?? pos,\n\t\t\t\toptions: [option],\n\t\t\t\tvalidFor: /^[\\w.:/-]*$/,\n\t\t\t};\n\t\t}\n\t}\n\n\t// reference value\n\tif (valueKey === \"reference\" && resourceType) {\n\t\tconst targets = await resolveReferenceTargets(\n\t\t\teffectivePath,\n\t\t\tresourceType,\n\t\t\tgetSDs,\n\t\t);\n\t\tif (targets) {\n\t\t\tconst options: Completion[] = targets.map((rt) => ({\n\t\t\t\tlabel: `${rt}/`,\n\t\t\t\ttype: \"type\",\n\t\t\t\tapply: (view: EditorView, _c: Completion, from: number, to: number) => {\n\t\t\t\t\tview.dispatch({\n\t\t\t\t\t\tchanges: { from, to, insert: `${rt}/` },\n\t\t\t\t\t\tselection: { anchor: from + rt.length + 1 },\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t}));\n\t\t\tconst word = completionContext.matchBefore(/[\\w/]*/);\n\t\t\treturn { from: word?.from ?? pos, options, validFor: /^[\\w/]*$/ };\n\t\t}\n\t}\n\n\t// Extension URL value\n\tif (valueKey === \"url\") {\n\t\tconst lastSeg = ctx.fullPath[ctx.fullPath.length - 1];\n\t\tif (lastSeg === \"extension\" || lastSeg === \"modifierExtension\") {\n\t\t\treturn handleExtensionUrlCompletion(\n\t\t\t\teffectivePath,\n\t\t\t\tresourceType,\n\t\t\t\tprofileUrls,\n\t\t\t\tdoc,\n\t\t\t\tpos,\n\t\t\t\tgetSDs,\n\t\t\t\tcompletionContext,\n\t\t\t\tctx,\n\t\t\t);\n\t\t}\n\t}\n\n\t// Boolean value\n\tif (resourceType) {\n\t\tconst elements = await resolveElements(effectivePath, resourceType, getSDs);\n\t\tconst el = elements.find((e) => fieldName(e) === valueKey);\n\t\tif (el?.type?.length === 1 && el.type[0]?.code === \"boolean\") {\n\t\t\tconst word = completionContext.matchBefore(/[\\w]*/);\n\t\t\tconst options: Completion[] = [\"true\", \"false\"].map((v) => ({\n\t\t\t\tlabel: v,\n\t\t\t\ttype: \"keyword\",\n\t\t\t\tapply: (view: EditorView, _c: Completion, from: number, to: number) => {\n\t\t\t\t\tconst d = view.state.doc.toString();\n\t\t\t\t\tlet actualFrom = from;\n\t\t\t\t\tlet actualTo = to;\n\t\t\t\t\t// Remove surrounding quotes if present\n\t\t\t\t\tif (actualFrom > 0 && d[actualFrom - 1] === '\"') actualFrom--;\n\t\t\t\t\tif (actualTo < d.length && d[actualTo] === '\"') actualTo++;\n\t\t\t\t\tview.dispatch({\n\t\t\t\t\t\tchanges: { from: actualFrom, to: actualTo, insert: v },\n\t\t\t\t\t\tselection: { anchor: actualFrom + v.length },\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t}));\n\t\t\treturn { from: word?.from ?? pos, options, validFor: /^\\w*$/ };\n\t\t}\n\t}\n\n\t// Terminology binding\n\tif (\n\t\tvalueKey !== \"resourceType\" &&\n\t\tvalueKey !== \"reference\" &&\n\t\tvalueKey !== \"url\" &&\n\t\texpandValueSet &&\n\t\tresourceType\n\t) {\n\t\tconst valueSetUrl = await findBindingForValue(\n\t\t\teffectivePath,\n\t\t\tvalueKey,\n\t\t\tresourceType,\n\t\t\tgetSDs,\n\t\t\tprofileUrls,\n\t\t\tdoc,\n\t\t\tpos,\n\t\t);\n\t\tif (valueSetUrl) {\n\t\t\tconst quoteWord = completionContext.matchBefore(/\"[\\w-]*/);\n\t\t\tconst from = quoteWord?.from ?? pos;\n\t\t\tconst filter = quoteWord ? quoteWord.text.replace(/^\"/, \"\") : \"\";\n\t\t\ttry {\n\t\t\t\tconst codes = await expandValueSet(valueSetUrl, filter);\n\t\t\t\tif (codes.length > 0) {\n\t\t\t\t\tconst options: Completion[] = codes.map((c) => ({\n\t\t\t\t\t\tlabel: c.code,\n\t\t\t\t\t\t...(c.display ? { info: c.display } : {}),\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\tapply: (\n\t\t\t\t\t\t\tview: EditorView,\n\t\t\t\t\t\t\t_c: Completion,\n\t\t\t\t\t\t\tapplyFrom: number,\n\t\t\t\t\t\t\tapplyTo: number,\n\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\tconst d = view.state.doc.toString();\n\t\t\t\t\t\t\tlet actualFrom = applyFrom;\n\t\t\t\t\t\t\tlet actualTo = applyTo;\n\t\t\t\t\t\t\tif (d[actualFrom] === '\"') actualFrom++;\n\t\t\t\t\t\t\tif (actualTo < d.length && d[actualTo] === '\"') actualTo++;\n\t\t\t\t\t\t\tview.dispatch({\n\t\t\t\t\t\t\t\tchanges: {\n\t\t\t\t\t\t\t\t\tfrom: actualFrom,\n\t\t\t\t\t\t\t\t\tto: actualTo,\n\t\t\t\t\t\t\t\t\tinsert: `${c.code}\"`,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tselection: { anchor: actualFrom + c.code.length + 1 },\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t}));\n\t\t\t\t\treturn { from, options, filter: false };\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// expand failed\n\t\t\t}\n\t\t}\n\t}\n\n\treturn null;\n}\n\n// ── Extension URL completion ───────────────────────────────────────────\n\nasync function handleExtensionUrlCompletion(\n\t_effectivePath: string[],\n\tresourceType: string | undefined,\n\tprofileUrls: string[],\n\tdoc: string,\n\tpos: number,\n\tgetSDs: GetStructureDefinitions,\n\tcompletionContext: CompletionContext,\n\tctx: DocumentContext,\n): Promise<CompletionResult | null> {\n\t// Check for nested extension (parent has url)\n\tconst urlKeyPos = doc.lastIndexOf('\"url\"', pos);\n\tlet scanEnd = urlKeyPos !== -1 ? urlKeyPos : pos;\n\tfor (let i = scanEnd - 1; i >= 0; i--) {\n\t\tconst c = doc[i];\n\t\tif (c === \"{\") {\n\t\t\tscanEnd = i;\n\t\t\tbreak;\n\t\t}\n\t\tif (c === \"}\" || c === \"]\" || c === \"[\") break;\n\t}\n\tconst textBefore = doc.slice(0, scanEnd);\n\tlet parentExtUrl: string | null = null;\n\tlet depth = 0;\n\tlet inStr = false;\n\tlet esc = false;\n\tlet foundExtArray = false;\n\tfor (let i = textBefore.length - 1; i >= 0; i--) {\n\t\tconst ch = textBefore[i];\n\t\tif (esc) {\n\t\t\tesc = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"\\\\\") {\n\t\t\tesc = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === '\"') {\n\t\t\tinStr = !inStr;\n\t\t\tcontinue;\n\t\t}\n\t\tif (inStr) continue;\n\t\tif (ch === \"}\" || ch === \"]\") {\n\t\t\tdepth++;\n\t\t} else if (ch === \"[\") {\n\t\t\tif (depth === 0) {\n\t\t\t\tfoundExtArray = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdepth--;\n\t\t} else if (ch === \"{\") {\n\t\t\tif (depth === 0 && foundExtArray) {\n\t\t\t\tconst objText = textBefore.slice(i);\n\t\t\t\tconst urlMatch = objText.match(/^\\{[\\s\\S]*?\"url\"\\s*:\\s*\"([^\"]+)\"/);\n\t\t\t\tif (urlMatch?.[1]?.includes(\"/\")) {\n\t\t\t\t\tparentExtUrl = urlMatch[1];\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (depth === 0) break;\n\t\t\tdepth--;\n\t\t}\n\t}\n\n\tif (parentExtUrl) {\n\t\treturn handleNestedExtensionSlices(\n\t\t\tparentExtUrl,\n\t\t\tpos,\n\t\t\tgetSDs,\n\t\t\tcompletionContext,\n\t\t);\n\t}\n\n\tif (!resourceType) return null;\n\n\t// Top-level extension URL completions\n\tconst path = ctx.fullPath;\n\tconst contextTypes: string[] = [\n\t\tresourceType,\n\t\t\"DomainResource\",\n\t\t\"Resource\",\n\t\t\"Element\",\n\t];\n\tconst extIdx = path.lastIndexOf(\"extension\");\n\tif (extIdx > 0) {\n\t\tlet currentRT = resourceType;\n\t\tfor (let i = 0; i < extIdx; i++) {\n\t\t\tconst seg = path[i];\n\t\t\tif (!seg) break;\n\t\t\tconst elements = await resolveElements([], currentRT, getSDs);\n\t\t\tconst el = elements.find((e) => fieldName(e) === seg);\n\t\t\tif (el?.type?.[0]?.code && !isPrimitiveType(el.type[0].code))\n\t\t\t\tcurrentRT = el.type[0].code;\n\t\t\telse break;\n\t\t}\n\t\tif (currentRT !== resourceType) {\n\t\t\tcontextTypes.length = 0;\n\t\t\tcontextTypes.push(\n\t\t\t\tcurrentRT,\n\t\t\t\t\"Element\",\n\t\t\t\t`${resourceType}.${path.slice(0, extIdx).join(\".\")}`,\n\t\t\t);\n\t\t}\n\t}\n\n\t// Profile extensions\n\tconst profileExtUrls: string[] = [];\n\tif (contextTypes.includes(resourceType)) {\n\t\tfor (const pUrl of profileUrls) {\n\t\t\tconst profileSD = await getCachedSD(pUrl, getSDs);\n\t\t\tif (!profileSD?.differential?.element) continue;\n\t\t\tfor (const el of profileSD.differential.element) {\n\t\t\t\tfor (const t of el.type ?? []) {\n\t\t\t\t\tif (t.code === \"Extension\") {\n\t\t\t\t\t\tfor (const p of t.profile ?? []) {\n\t\t\t\t\t\t\tconst clean = p.includes(\"|\") ? p.slice(0, p.indexOf(\"|\")) : p;\n\t\t\t\t\t\t\tif (!profileExtUrls.includes(clean)) profileExtUrls.push(clean);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconst bareWord = completionContext.matchBefore(/[\\w.:/-]*/);\n\tconst filter = bareWord?.text ?? \"\";\n\tconst searchParams: StructureDefinitionSearchParams = {\n\t\ttype: \"Extension\",\n\t\tderivation: \"constraint\",\n\t\t_elements: \"url,context\",\n\t\t_count: \"500\",\n\t};\n\tif (filter) searchParams._ilike = filter;\n\tconst results = await getCachedSDList(searchParams, getSDs);\n\n\tconst containerType = contextTypes[0];\n\tconst fhirPath = contextTypes.find((c) => c.includes(\".\"));\n\tconst contextExts = results.filter((sd) =>\n\t\tsd.context?.some(\n\t\t\t(c) => c.type === \"element\" && contextTypes.includes(c.expression),\n\t\t),\n\t);\n\tconst seen = new Set<string>();\n\tconst allExts: { url: string; boost: number }[] = [];\n\tif (contextTypes.includes(resourceType)) {\n\t\tfor (const u of profileExtUrls) {\n\t\t\tif (!seen.has(u)) {\n\t\t\t\tseen.add(u);\n\t\t\t\tallExts.push({ url: u, boost: 20 });\n\t\t\t}\n\t\t}\n\t}\n\tfor (const sd of contextExts) {\n\t\tconst u = sd.url ?? sd.type;\n\t\tif (seen.has(u)) continue;\n\t\tseen.add(u);\n\t\tconst ctxExprs =\n\t\t\tsd.context\n\t\t\t\t?.filter((c) => c.type === \"element\")\n\t\t\t\t.map((c) => c.expression) ?? [];\n\t\tlet boost = 0;\n\t\tif (fhirPath && ctxExprs.includes(fhirPath)) boost = 15;\n\t\telse if (containerType && ctxExprs.includes(containerType)) boost = 10;\n\t\telse if (ctxExprs.includes(resourceType)) boost = 5;\n\t\telse if (ctxExprs.some((e) => e === \"DomainResource\" || e === \"Resource\"))\n\t\t\tboost = 2;\n\t\telse if (ctxExprs.includes(\"Element\")) boost = 1;\n\t\tallExts.push({ url: u, boost });\n\t}\n\tconst lf = filter.toLowerCase();\n\tconst filtered = (\n\t\tlf ? allExts.filter((e) => e.url.toLowerCase().includes(lf)) : allExts\n\t).sort((a, b) => b.boost - a.boost);\n\tif (filtered.length > 0) {\n\t\tconst options: Completion[] = filtered.map((ext) => ({\n\t\t\tlabel: ext.url,\n\t\t\ttype: \"text\",\n\t\t\tboost: ext.boost,\n\t\t\tapply: (\n\t\t\t\tview: EditorView,\n\t\t\t\t_c: Completion,\n\t\t\t\tapplyFrom: number,\n\t\t\t\tapplyTo: number,\n\t\t\t) => {\n\t\t\t\tconst d = view.state.doc.toString();\n\t\t\t\tlet actualTo = applyTo;\n\t\t\t\tif (actualTo < d.length && d[actualTo] === '\"') actualTo++;\n\t\t\t\tview.dispatch({\n\t\t\t\t\tchanges: { from: applyFrom, to: actualTo, insert: `${ext.url}\"` },\n\t\t\t\t\tselection: { anchor: applyFrom + ext.url.length + 1 },\n\t\t\t\t});\n\t\t\t\tsetTimeout(async () => {\n\t\t\t\t\tconst fullSD = await getCachedSD(ext.url, getSDs);\n\t\t\t\t\tif (!fullSD) return;\n\t\t\t\t\tconst extInfo = analyzeExtensionSD(fullSD);\n\t\t\t\t\tif (!extInfo) return;\n\t\t\t\t\tconst cursorPos = view.state.selection.main.head;\n\t\t\t\t\tconst curDoc = view.state.doc.toString();\n\t\t\t\t\tconst after = curDoc.slice(cursorPos);\n\t\t\t\t\tif (!/^\\s*\\n\\s*\\}/.test(after)) return;\n\t\t\t\t\tconst lineObj = view.state.doc.lineAt(cursorPos);\n\t\t\t\t\tconst ind = lineObj.text.match(/^(\\s*)/)?.[1] ?? \"\";\n\t\t\t\t\tlet ins: string;\n\t\t\t\t\tlet cOff: number;\n\t\t\t\t\tif (extInfo.isNested) {\n\t\t\t\t\t\tconst inner = `${ind} `;\n\t\t\t\t\t\tconst innerInner = `${inner} `;\n\t\t\t\t\t\tins = `,\\n${ind}\"extension\": [\\n${inner}{\\n${innerInner}\"url\": \"\"\\n${inner}}\\n${ind}]`;\n\t\t\t\t\t\tcOff = ins.lastIndexOf('\"\"') + 1;\n\t\t\t\t\t} else if (extInfo.valueTypes.length === 1) {\n\t\t\t\t\t\tconst tc = extInfo.valueTypes[0]!;\n\t\t\t\t\t\tconst vf = `value${tc.charAt(0).toUpperCase()}${tc.slice(1)}`;\n\t\t\t\t\t\tif (FHIR_STRING_TYPES.has(tc) || tc === \"code\") {\n\t\t\t\t\t\t\tins = `,\\n${ind}\"${vf}\": \"\"`;\n\t\t\t\t\t\t\tcOff = ins.length - 1;\n\t\t\t\t\t\t} else if (FHIR_NUMBER_TYPES.has(tc)) {\n\t\t\t\t\t\t\tins = `,\\n${ind}\"${vf}\": `;\n\t\t\t\t\t\t\tcOff = ins.length;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst inner = `${ind} `;\n\t\t\t\t\t\t\tins = `,\\n${ind}\"${vf}\": {\\n${inner}\\n${ind}}`;\n\t\t\t\t\t\t\tcOff = ins.indexOf(`${inner}\\n${ind}`) + inner.length;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tview.dispatch({\n\t\t\t\t\t\tchanges: { from: cursorPos, insert: ins },\n\t\t\t\t\t\tselection: { anchor: cursorPos + cOff },\n\t\t\t\t\t});\n\t\t\t\t\tsetTimeout(() => startCompletion(view), 0);\n\t\t\t\t}, 10);\n\t\t\t},\n\t\t}));\n\t\treturn { from: bareWord?.from ?? pos, options, filter: false };\n\t}\n\treturn null;\n}\n\nasync function handleNestedExtensionSlices(\n\tparentExtUrl: string,\n\tpos: number,\n\tgetSDs: GetStructureDefinitions,\n\tcompletionContext: CompletionContext,\n): Promise<CompletionResult | null> {\n\tconst parentSD = await getCachedSD(parentExtUrl, getSDs);\n\tif (!parentSD) return null;\n\tconst info = analyzeExtensionSD(parentSD);\n\tif (!info?.slices.length) return null;\n\n\tconst word = completionContext.matchBefore(/[\\w.:/-]*/);\n\tconst filter = word?.text.toLowerCase() ?? \"\";\n\tconst matching = filter\n\t\t? info.slices.filter(\n\t\t\t\t(s) =>\n\t\t\t\t\ts.fixedUri.toLowerCase().includes(filter) ||\n\t\t\t\t\t(s.short?.toLowerCase().includes(filter) ?? false),\n\t\t\t)\n\t\t: info.slices;\n\n\tconst options: Completion[] = matching.map((slice) => {\n\t\tconst sliceElements = parentSD.differential?.element ?? [];\n\t\tlet sliceValueTypes: string[] = [];\n\t\tlet inSl = false;\n\t\tfor (const el of sliceElements) {\n\t\t\tif (\n\t\t\t\tel.path === \"Extension.extension\" &&\n\t\t\t\tel.sliceName === slice.sliceName\n\t\t\t) {\n\t\t\t\tinSl = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (inSl && el.path === \"Extension.extension.value[x]\") {\n\t\t\t\tsliceValueTypes = el.type?.map((t) => t.code) ?? [];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (inSl && el.path === \"Extension.extension\" && el.sliceName) break;\n\t\t}\n\t\treturn {\n\t\t\tlabel: slice.fixedUri,\n\t\t\t...(slice.short ? { info: slice.short } : {}),\n\t\t\ttype: \"text\",\n\t\t\tapply: (view: EditorView, _c: Completion, from: number, to: number) => {\n\t\t\t\tconst d = view.state.doc.toString();\n\t\t\t\tlet actualTo = to;\n\t\t\t\tif (actualTo < d.length && d[actualTo] === '\"') actualTo++;\n\t\t\t\tview.dispatch({\n\t\t\t\t\tchanges: { from, to: actualTo, insert: `${slice.fixedUri}\"` },\n\t\t\t\t\tselection: { anchor: from + slice.fixedUri.length + 1 },\n\t\t\t\t});\n\t\t\t\tif (sliceValueTypes.length === 1) {\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tconst cp = view.state.selection.main.head;\n\t\t\t\t\t\tconst cd = view.state.doc.toString();\n\t\t\t\t\t\tconst af = cd.slice(cp);\n\t\t\t\t\t\tif (!/^\\s*\\n\\s*\\}/.test(af)) return;\n\t\t\t\t\t\tconst lo = view.state.doc.lineAt(cp);\n\t\t\t\t\t\tconst ind = lo.text.match(/^(\\s*)/)?.[1] ?? \"\";\n\t\t\t\t\t\tconst tc = sliceValueTypes[0]!;\n\t\t\t\t\t\tconst vf = `value${tc.charAt(0).toUpperCase()}${tc.slice(1)}`;\n\t\t\t\t\t\tlet ins: string;\n\t\t\t\t\t\tlet cOff: number;\n\t\t\t\t\t\tif (FHIR_STRING_TYPES.has(tc) || tc === \"code\") {\n\t\t\t\t\t\t\tins = `,\\n${ind}\"${vf}\": \"\"`;\n\t\t\t\t\t\t\tcOff = ins.length - 1;\n\t\t\t\t\t\t} else if (FHIR_NUMBER_TYPES.has(tc)) {\n\t\t\t\t\t\t\tins = `,\\n${ind}\"${vf}\": `;\n\t\t\t\t\t\t\tcOff = ins.length;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst inner = `${ind} `;\n\t\t\t\t\t\t\tins = `,\\n${ind}\"${vf}\": {\\n${inner}\\n${ind}}`;\n\t\t\t\t\t\t\tcOff = ins.indexOf(`${inner}\\n${ind}`) + inner.length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tview.dispatch({\n\t\t\t\t\t\t\tchanges: { from: cp, insert: ins },\n\t\t\t\t\t\t\tselection: { anchor: cp + cOff },\n\t\t\t\t\t\t});\n\t\t\t\t\t\tsetTimeout(() => startCompletion(view), 0);\n\t\t\t\t\t}, 10);\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t});\n\tif (options.length > 0)\n\t\treturn { from: word?.from ?? pos, options, filter: false };\n\treturn null;\n}\n\n// ── Array item completion ──────────────────────────────────────────────\n\nasync function handleArrayItemCompletion(\n\tparentKey: string,\n\teffectivePath: string[],\n\tresourceType: string | undefined,\n\t_doc: string,\n\tpos: number,\n\tgetSDs: GetStructureDefinitions,\n\tcompletionContext: CompletionContext,\n\tprofileUrls: string[],\n): Promise<CompletionResult | null> {\n\tif (!resourceType) return null;\n\n\t// Parameters.parameter or part → snippet completions from profile slices\n\tif (\n\t\t(parentKey === \"parameter\" || parentKey === \"part\") &&\n\t\t(await isParametersType(resourceType, getSDs))\n\t) {\n\t\tconst slices =\n\t\t\tparentKey === \"parameter\"\n\t\t\t\t? await getParameterSlices(profileUrls, getSDs)\n\t\t\t\t: [];\n\n\t\tconst options: Completion[] = [];\n\n\t\tfor (const slice of slices) {\n\t\t\toptions.push({\n\t\t\t\tlabel: slice.fixedName,\n\t\t\t\ttype: \"text\",\n\t\t\t\tdetail:\n\t\t\t\t\tslice.min > 0 ? `${slice.min}..${slice.max}` : `0..${slice.max}`,\n\t\t\t\tboost: slice.min > 0 ? 2 : 0,\n\t\t\t\t...(slice.short ? { info: slice.short } : {}),\n\t\t\t\tapply: (view: EditorView, _c: Completion, from: number, to: number) => {\n\t\t\t\t\tconst line = view.state.doc.lineAt(from);\n\t\t\t\t\tconst indent = line.text.match(/^(\\s*)/)?.[1] ?? \"\";\n\t\t\t\t\tconst { text, cursorOffset } = buildParameterSnippet(\n\t\t\t\t\t\tslice.fixedName,\n\t\t\t\t\t\tslice.valueTypes,\n\t\t\t\t\t\tindent,\n\t\t\t\t\t);\n\n\t\t\t\t\tview.dispatch({\n\t\t\t\t\t\tchanges: { from, to, insert: text },\n\t\t\t\t\t\tselection: { anchor: from + cursorOffset },\n\t\t\t\t\t});\n\t\t\t\t\tsetTimeout(() => startCompletion(view), 0);\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\t// Generic parameter template (always available)\n\t\toptions.push({\n\t\t\tlabel: \"parameter\",\n\t\t\ttype: \"text\",\n\t\t\tboost: -1,\n\t\t\tinfo: \"Custom parameter\",\n\t\t\tapply: (view: EditorView, _c: Completion, from: number, to: number) => {\n\t\t\t\tconst line = view.state.doc.lineAt(from);\n\t\t\t\tconst indent = line.text.match(/^(\\s*)/)?.[1] ?? \"\";\n\t\t\t\tconst { text, cursorOffset } = buildParameterSnippet(\"\", [], indent);\n\t\t\t\tview.dispatch({\n\t\t\t\t\tchanges: { from, to, insert: text },\n\t\t\t\t\tselection: { anchor: from + cursorOffset },\n\t\t\t\t});\n\t\t\t\tsetTimeout(() => startCompletion(view), 0);\n\t\t\t},\n\t\t});\n\n\t\tconst word = completionContext.matchBefore(/[\\w]*/);\n\t\treturn { from: word?.from ?? pos, options };\n\t}\n\n\t// Get path excluding the array key itself\n\tconst parentPath =\n\t\teffectivePath.length > 0 &&\n\t\teffectivePath[effectivePath.length - 1] === parentKey\n\t\t\t? effectivePath.slice(0, -1)\n\t\t\t: effectivePath;\n\n\tconst targetType = await findCanonicalTargetType(\n\t\tparentPath,\n\t\tparentKey,\n\t\tresourceType,\n\t\tgetSDs,\n\t);\n\tif (targetType === \"StructureDefinition\") {\n\t\tconst allSDs = await getCachedSDList(\n\t\t\t{\n\t\t\t\ttype: `${resourceType},DomainResource,Resource`,\n\t\t\t\tderivation: \"constraint\",\n\t\t\t\t_elements: \"url,name\",\n\t\t\t\t_count: \"50\",\n\t\t\t},\n\t\t\tgetSDs,\n\t\t);\n\t\tconst seen = new Set<string>();\n\t\tconst uniqueSDs = allSDs.filter((sd) => {\n\t\t\tconst u = sd.url ?? sd.type;\n\t\t\tif (seen.has(u)) return false;\n\t\t\tseen.add(u);\n\t\t\treturn true;\n\t\t});\n\t\tif (uniqueSDs.length > 0) {\n\t\t\tconst quoteWord = completionContext.matchBefore(/\"[^\"]*/);\n\t\t\tconst bareWord = completionContext.matchBefore(/[\\w.:/-]*/);\n\t\t\tconst from = quoteWord?.from ?? bareWord?.from ?? pos;\n\t\t\tconst filter = quoteWord\n\t\t\t\t? quoteWord.text.replace(/^\"/, \"\").toLowerCase()\n\t\t\t\t: (bareWord?.text.toLowerCase() ?? \"\");\n\t\t\tconst filtered = filter\n\t\t\t\t? uniqueSDs.filter(\n\t\t\t\t\t\t(sd) =>\n\t\t\t\t\t\t\tsd.name?.toLowerCase().includes(filter) ||\n\t\t\t\t\t\t\tsd.url?.toLowerCase().includes(filter),\n\t\t\t\t\t)\n\t\t\t\t: uniqueSDs;\n\t\t\tconst options: Completion[] = filtered.map((sd) => {\n\t\t\t\tconst url = sd.url ?? sd.type;\n\t\t\t\treturn {\n\t\t\t\t\tlabel: url,\n\t\t\t\t\t...(sd.name ? { info: sd.name } : {}),\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\tapply: (\n\t\t\t\t\t\tview: EditorView,\n\t\t\t\t\t\t_c: Completion,\n\t\t\t\t\t\tapplyFrom: number,\n\t\t\t\t\t\tapplyTo: number,\n\t\t\t\t\t) => {\n\t\t\t\t\t\tconst d = view.state.doc.toString();\n\t\t\t\t\t\tlet actualTo = applyTo;\n\t\t\t\t\t\tif (actualTo < d.length && d[actualTo] === '\"') actualTo++;\n\t\t\t\t\t\tview.dispatch({\n\t\t\t\t\t\t\tchanges: { from: applyFrom, to: actualTo, insert: `\"${url}\"` },\n\t\t\t\t\t\t\tselection: { anchor: applyFrom + url.length + 2 },\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t});\n\t\t\tif (options.length > 0) {\n\t\t\t\treturn { from, options, filter: false };\n\t\t\t}\n\t\t}\n\t}\n\tif (targetType) return null;\n\treturn null;\n}\n\n// ── Property completion ────────────────────────────────────────────────\n\nasync function handlePropertyCompletion(\n\teffectivePath: string[],\n\tresourceType: string | undefined,\n\thasExplicitResourceType: boolean,\n\tdoc: string,\n\tpos: number,\n\tgetSDs: GetStructureDefinitions,\n\tcompletionContext: CompletionContext,\n\tctx: DocumentContext,\n): Promise<CompletionResult | null> {\n\tconst line = completionContext.state.doc.lineAt(pos);\n\tconst beforeCursor = line.text.slice(0, pos - line.from).trimStart();\n\n\t// Only auto-trigger property completions when user has started typing\n\tif (\n\t\t!completionContext.explicit &&\n\t\t/,\\s*\"?\\s*$/.test(beforeCursor) &&\n\t\t!completionContext.matchBefore(/\\w+/)\n\t)\n\t\treturn null;\n\n\tconst makeJsonRtCompletion = (): Completion => {\n\t\tconst c: Completion = {\n\t\t\tlabel: \"resourceType\",\n\t\t\ttype: \"property\",\n\t\t\tdetail: \"string\",\n\t\t\tboost: 10,\n\t\t\tapply: (view, _completion, from, to) => {\n\t\t\t\tconst d = view.state.doc.toString();\n\t\t\t\tlet actualFrom = from;\n\t\t\t\tlet actualTo = to;\n\t\t\t\tif (actualFrom > 0 && d[actualFrom - 1] === '\"') actualFrom--;\n\t\t\t\tif (actualTo < d.length && d[actualTo] === '\"') actualTo++;\n\t\t\t\tconst text = '\"resourceType\": \"\"';\n\t\t\t\tview.dispatch({\n\t\t\t\t\tchanges: { from: actualFrom, to: actualTo, insert: text },\n\t\t\t\t\tselection: { anchor: actualFrom + text.length - 1 },\n\t\t\t\t});\n\t\t\t},\n\t\t};\n\t\tc.info = \"FHIR resource type\";\n\t\treturn c;\n\t};\n\n\tlet completions: Completion[];\n\tif (resourceType) {\n\t\tconst elements = await resolveElements(effectivePath, resourceType, getSDs);\n\t\tconst isParams = await isParametersType(resourceType, getSDs);\n\t\tconst mapFn = isParams\n\t\t\t? (el: FhirElement) => toParameterPropertyCompletion(el)\n\t\t\t: toCompletion;\n\t\tcompletions = elementsToCompletions(elements, mapFn);\n\t\tif (!hasExplicitResourceType && effectivePath.length === 0) {\n\t\t\tcompletions = [makeJsonRtCompletion(), ...completions];\n\t\t}\n\t} else if (effectivePath.length === 0) {\n\t\tconst domainElements = await resolveElements(\n\t\t\teffectivePath,\n\t\t\t\"DomainResource\",\n\t\t\tgetSDs,\n\t\t);\n\t\tcompletions = [\n\t\t\tmakeJsonRtCompletion(),\n\t\t\t...elementsToCompletions(domainElements, toCompletion),\n\t\t];\n\t} else {\n\t\treturn null;\n\t}\n\n\t// Filter out properties already present in current object\n\tconst existingKeys = new Set(ctx.getScope(0).getKeys());\n\tcompletions = completions.filter((c) => !existingKeys.has(c.label));\n\n\tif (completions.length === 0) return null;\n\n\tconst word = completionContext.matchBefore(/\"?\\w*/);\n\tlet from = word?.from ?? pos;\n\tif (from < doc.length && doc[from] === '\"') from++;\n\n\treturn { from, options: completions, validFor: /^\\w*$/ };\n}\n\n// ── Thin wrapper ───────────────────────────────────────────────────────\n\n/** @internal — exported for tests only */\nexport function jsonCompletionSource(\n\tgetSDs: GetStructureDefinitions,\n\tresourceTypeHint?: string,\n\texpandValueSet?: ExpandValueSet,\n): CompletionSource {\n\treturn async (cc: CompletionContext): Promise<CompletionResult | null> => {\n\t\tconst ctx = buildJsonDocumentContext(cc.state.doc.toString(), cc.pos);\n\t\treturn fhirComplete(ctx, getSDs, resourceTypeHint, expandValueSet, cc);\n\t};\n}\n\n// ── Validation ─────────────────────────────────────────────────────────\n\ntype FhirDiagnostic = {\n\tfrom: number;\n\tto: number;\n\tmessage: string;\n};\n\nasync function validateFhirProperties(\n\tproperties: PropertyInfo[],\n\tgetSDs: GetStructureDefinitions,\n): Promise<FhirDiagnostic[]> {\n\tconst groups = new Map<\n\t\tstring,\n\t\t{ resourceType: string; path: string[]; props: PropertyInfo[] }\n\t>();\n\tfor (const prop of properties) {\n\t\tconst key = `${prop.resourceType}|${prop.path.join(\".\")}`;\n\t\tlet group = groups.get(key);\n\t\tif (!group) {\n\t\t\tgroup = {\n\t\t\t\tresourceType: prop.resourceType,\n\t\t\t\tpath: [...prop.path],\n\t\t\t\tprops: [],\n\t\t\t};\n\t\t\tgroups.set(key, group);\n\t\t}\n\t\tgroup.props.push(prop);\n\t}\n\n\tconst diagnostics: FhirDiagnostic[] = [];\n\n\tfor (const { resourceType, path, props } of groups.values()) {\n\t\tconst elements = await resolveElements(path, resourceType, getSDs);\n\t\tif (elements.length === 0) continue;\n\n\t\tconst validNames = new Set<string>();\n\t\tfor (const el of elements) {\n\t\t\tconst name = fieldName(el);\n\t\t\tvalidNames.add(name);\n\t\t\tconst typeCode = el.type?.[0]?.code;\n\t\t\tif (el.type?.length === 1 && typeCode && isPrimitiveType(typeCode)) {\n\t\t\t\tvalidNames.add(`_${name}`);\n\t\t\t}\n\t\t}\n\t\tif (path.length === 0) {\n\t\t\tvalidNames.add(\"resourceType\");\n\t\t}\n\n\t\tfor (const prop of props) {\n\t\t\tif (!validNames.has(prop.name)) {\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\tfrom: prop.from,\n\t\t\t\t\tto: prop.to,\n\t\t\t\t\tmessage: `Unknown property \"${prop.name}\"`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\treturn diagnostics;\n}\n\nfunction buildFhirValidationPlugin(\n\tgetSDs: GetStructureDefinitions,\n\tresourceTypeHint?: string,\n): Extension {\n\treturn ViewPlugin.define((view) => {\n\t\tlet timeout: ReturnType<typeof setTimeout> | null = null;\n\t\tlet destroyed = false;\n\n\t\tfunction hasActiveDiagnostics() {\n\t\t\ttry {\n\t\t\t\treturn view.state.field(fhirDiagnosticsField).messages.size > 0;\n\t\t\t} catch {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfunction scheduleCheck() {\n\t\t\tif (timeout) clearTimeout(timeout);\n\t\t\tconst delay = hasActiveDiagnostics() ? 0 : 1500;\n\t\t\ttimeout = setTimeout(() => check(), delay);\n\t\t}\n\n\t\tasync function check() {\n\t\t\tif (destroyed) return;\n\t\t\tconst currentDoc = view.state.doc.toString();\n\t\t\tconst tree =\n\t\t\t\tensureSyntaxTree(view.state, view.state.doc.length, 1000) ??\n\t\t\t\tsyntaxTree(view.state);\n\n\t\t\tconst { properties, emptyStrings } = walkJsonProperties(\n\t\t\t\tcurrentDoc,\n\t\t\t\ttree,\n\t\t\t\tresourceTypeHint ?? null,\n\t\t\t);\n\n\t\t\tif (!findRootJsonObject(currentDoc, tree)) {\n\t\t\t\ttry {\n\t\t\t\t\tview.dispatch({ effects: setFhirDiagnosticsEffect.of([]) });\n\t\t\t\t} catch {\n\t\t\t\t\t/* view destroyed */\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (properties.length === 0 && emptyStrings.length === 0) {\n\t\t\t\ttry {\n\t\t\t\t\tview.dispatch({ effects: setFhirDiagnosticsEffect.of([]) });\n\t\t\t\t} catch {\n\t\t\t\t\t/* view destroyed */\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst rawDiags = await validateFhirProperties(properties, getSDs);\n\t\t\tif (destroyed) return;\n\t\t\tif (view.state.doc.toString() !== currentDoc) return;\n\n\t\t\tfor (const es of emptyStrings) {\n\t\t\t\trawDiags.push({\n\t\t\t\t\tfrom: es.from,\n\t\t\t\t\tto: es.to,\n\t\t\t\t\tmessage: \"Value must not be empty\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst diags: FhirDiagnosticWithLine[] = rawDiags.map((d) => ({\n\t\t\t\t...d,\n\t\t\t\tline: view.state.doc.lineAt(d.from).number,\n\t\t\t}));\n\n\t\t\ttry {\n\t\t\t\tview.dispatch({ effects: setFhirDiagnosticsEffect.of(diags) });\n\t\t\t} catch {\n\t\t\t\t/* view destroyed */\n\t\t\t}\n\t\t}\n\n\t\tscheduleCheck();\n\n\t\treturn {\n\t\t\tupdate(update: ViewUpdate) {\n\t\t\t\tif (update.docChanged) {\n\t\t\t\t\tscheduleCheck();\n\t\t\t\t}\n\t\t\t},\n\t\t\tdestroy() {\n\t\t\t\tdestroyed = true;\n\t\t\t\tif (timeout) clearTimeout(timeout);\n\t\t\t},\n\t\t};\n\t});\n}\n\n// ── FHIR validation decorations ───────────────────────────────────────\n\ntype FhirDiagnosticWithLine = FhirDiagnostic & { line: number };\n\nconst setFhirDiagnosticsEffect = StateEffect.define<FhirDiagnosticWithLine[]>();\n\nconst fhirUnderline = Decoration.mark({ class: \"cm-fhir-error-underline\" });\nconst fhirErrorLineDecoration = Decoration.line({ class: \"cm-errorLine\" });\n\nclass FhirGutterMarker extends GutterMarker {\n\telementClass = \"cm-errorLineGutter\";\n}\nconst fhirGutterMarker = new FhirGutterMarker();\n\nexport const fhirDiagnosticsField = StateField.define<{\n\tmarks: RangeSet<Decoration>;\n\tlineDecos: RangeSet<Decoration>;\n\tgutterMarkers: RangeSet<GutterMarker>;\n\tmessages: Map<number, string>;\n}>({\n\tcreate() {\n\t\treturn {\n\t\t\tmarks: Decoration.none,\n\t\t\tlineDecos: Decoration.none,\n\t\t\tgutterMarkers: RangeSet.empty,\n\t\t\tmessages: new Map(),\n\t\t};\n\t},\n\tupdate(value, tr) {\n\t\tfor (const effect of tr.effects) {\n\t\t\tif (effect.is(setFhirDiagnosticsEffect)) {\n\t\t\t\tconst diags = effect.value;\n\t\t\t\tif (diags.length === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tmarks: Decoration.none,\n\t\t\t\t\t\tlineDecos: Decoration.none,\n\t\t\t\t\t\tgutterMarkers: RangeSet.empty,\n\t\t\t\t\t\tmessages: new Map(),\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst marks: { from: number; to: number; value: Decoration }[] = [];\n\t\t\t\tconst lineDecos: { from: number; to: number; value: Decoration }[] = [];\n\t\t\t\tconst gutter: { from: number; to: number; value: GutterMarker }[] = [];\n\t\t\t\tconst messages = new Map<number, string>();\n\n\t\t\t\tfor (const d of diags) {\n\t\t\t\t\tmarks.push(fhirUnderline.range(d.from, d.to));\n\t\t\t\t\tconst existing = messages.get(d.line);\n\t\t\t\t\tif (existing) {\n\t\t\t\t\t\tmessages.set(d.line, `${existing}\\n${d.message}`);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmessages.set(d.line, d.message);\n\t\t\t\t\t\tconst line = tr.state.doc.line(d.line);\n\t\t\t\t\t\tlineDecos.push(fhirErrorLineDecoration.range(line.from));\n\t\t\t\t\t\tgutter.push(fhirGutterMarker.range(line.from));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tmarks: Decoration.set(marks, true),\n\t\t\t\t\tlineDecos: Decoration.set(lineDecos, true),\n\t\t\t\t\tgutterMarkers: RangeSet.of(gutter, true),\n\t\t\t\t\tmessages,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\tif (tr.docChanged) {\n\t\t\ttry {\n\t\t\t\treturn {\n\t\t\t\t\tmarks: value.marks.map(tr.changes),\n\t\t\t\t\tlineDecos: value.lineDecos.map(tr.changes),\n\t\t\t\t\tgutterMarkers: value.gutterMarkers.map(tr.changes),\n\t\t\t\t\tmessages: value.messages,\n\t\t\t\t};\n\t\t\t} catch {\n\t\t\t\treturn {\n\t\t\t\t\tmarks: Decoration.none,\n\t\t\t\t\tlineDecos: Decoration.none,\n\t\t\t\t\tgutterMarkers: RangeSet.empty,\n\t\t\t\t\tmessages: new Map(),\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\treturn value;\n\t},\n\tprovide(field) {\n\t\treturn [\n\t\t\tEditorView.decorations.from(field, (v) => v.marks),\n\t\t\tEditorView.decorations.from(field, (v) => v.lineDecos),\n\t\t\tgutterLineClass.from(field, (v) => v.gutterMarkers),\n\t\t];\n\t},\n});\n\nconst fhirLinterTheme = EditorView.theme({\n\t\".cm-fhir-error-underline\": {\n\t\ttextDecorationLine: \"underline\",\n\t\ttextDecorationStyle: \"wavy\",\n\t\ttextDecorationColor: \"var(--color-text-error-primary)\",\n\t\ttextUnderlineOffset: \"3px\",\n\t},\n\t\".cm-lineNumbers .cm-gutterElement.cm-errorLineGutter\": {\n\t\tcolor: \"var(--color-text-error-primary)\",\n\t\tbackgroundColor:\n\t\t\t\"color-mix(in srgb, var(--color-text-error-primary) 7%, transparent)\",\n\t},\n});\n\n// ── Public API ─────────────────────────────────────────────────────────\n\nexport function buildFhirCompletionExtension(\n\tgetSDs: GetStructureDefinitions,\n\tresourceTypeHint?: string,\n\texpandValueSet?: ExpandValueSet,\n): Extension {\n\tconst jsonSource = jsonCompletionSource(\n\t\tgetSDs,\n\t\tresourceTypeHint,\n\t\texpandValueSet,\n\t);\n\n\tconst autoTrigger = EditorView.updateListener.of((update) => {\n\t\tif (!update.docChanged) return;\n\t\tif (completionStatus(update.view.state)) return;\n\t\tconst { state } = update.view;\n\t\tconst pos = state.selection.main.head;\n\t\tconst doc = state.doc.toString();\n\t\tconst line = state.doc.lineAt(pos);\n\t\tconst beforeCursor = line.text.slice(0, pos - line.from).trimStart();\n\t\t// Trigger on empty lines (including after snippet insertion),\n\t\t// after [ (array open), or after \" (string value start)\n\t\tconst shouldTrigger =\n\t\t\tbeforeCursor === \"\" ||\n\t\t\t(pos > 0 && doc[pos - 1] === \"[\") ||\n\t\t\t(pos > 0 && doc[pos - 1] === '\"' && pos > 1 && doc[pos - 2] !== \"\\\\\");\n\t\tif (!shouldTrigger) return;\n\t\t// Skip bulk replacements (e.g. tab switch, currentValue update)\n\t\t// but allow snippets — check only if the ENTIRE doc was replaced\n\t\tlet totalInserted = 0;\n\t\tupdate.changes.iterChanges((_fA, _tA, _fB, _tB, ins) => {\n\t\t\ttotalInserted += ins.length;\n\t\t});\n\t\tif (totalInserted > doc.length * 0.5) return;\n\t\tsetTimeout(() => startCompletion(update.view), 0);\n\t});\n\n\treturn [\n\t\tjsonLanguage.data.of({ autocomplete: jsonSource }),\n\t\tautoTrigger,\n\t\tfhirDiagnosticsField,\n\t\tfhirLinterTheme,\n\t\tbuildFhirValidationPlugin(getSDs, resourceTypeHint),\n\t];\n}\n"],"names":["completionStatus","startCompletion","jsonLanguage","ensureSyntaxTree","syntaxTree","RangeSet","StateEffect","StateField","Decoration","EditorView","GutterMarker","gutterLineClass","ViewPlugin","buildJsonDocumentContext","findRootJsonObject","walkJsonProperties","PRIMITIVE_TYPES","Set","isPrimitiveType","typeCode","has","startsWith","FHIR_STRING_TYPES","FHIR_NUMBER_TYPES","sdCache","Map","pendingRequests","listCache","pendingListRequests","SD_ELEMENTS","cacheKey","params","JSON","stringify","getCachedSDList","getSDs","key","get","pending","then","list","set","delete","sd","differential","element","type","catch","getCachedSD","isUrl","includes","searchByType","url","_elements","_count","derivation","fieldName","parts","path","split","length","replace","directChildren","elements","parentPath","prefix","filter","el","rest","slice","findElement","direct","find","name","toLowerCase","endsWith","baseName","typeSuffix","matchedType","t","code","undefined","collectAllElements","baseDefinition","base","baseEl","remappedPath","RegExp","basePath","some","e","push","resolveElements","resourceType","result","currentPath","currentElements","contentReference","typeResult","children","expanded","isChoiceType","charAt","toUpperCase","findResourceBoundary","i","snippetKind","isArray","max","buildSnippet","kind","indent","inner","innerInner","text","cursorOffset","indexOf","lastIndexOf","toCompletion","types","map","join","completion","label","detail","boost","min","apply","view","_completion","from","to","doc","state","toString","actualFrom","actualTo","afterName","match","insert","dispatch","changes","selection","anchor","line","lineAt","lineText","setTimeout","short","info","toParameterPropertyCompletion","elementsToCompletions","mapFn","completions","firstTypeCode","ext","analyzeExtensionSD","valueEl","isNested","valueTypes","slices","sliceName","urlEl","fixedUri","parametersTypeCache","isParametersType","baseType","pop","getParameterSlices","profileUrls","profileUrl","paramPath","current","flush","fixedName","s","fixedString","getFixedValues","effectivePath","valueKey","fhirPath","fixedCode","buildParameterSnippet","tc","vf","buildFhirElementPath","findProfileBinding","directPath","binding","valueSet","parentFhirPath","findExtensionBinding","pos","textBefore","urlMatches","matchAll","extUrl","parentUrlMatches","index","j","parentUrl","parentSD","inSlice","findBindingForValue","inExtension","p","extBinding","profileBinding","parentElements","findCanonicalTargetType","arrayKey","targetProfile","resolveReferenceTargets","lastKey","targets","profile","rt","fhirComplete","ctx","resourceTypeHint","expandValueSet","completionContext","hasExplicitResourceType","rtScope","getScope","level","fullPath","getString","rootRT","boundaryIdx","innerPath","innerScope","innerRT","getStringArray","cp","cursorPosition","handleValueCompletion","handleArrayItemCompletion","parentKey","isInsideArray","handlePropertyCompletion","_hasExplicitResourceType","sds","options","_c","d","word","matchBefore","validFor","vTypes","main","head","cd","after","test","lineObj","ind","ins","cOff","fixedVal","option","lastSeg","handleExtensionUrlCompletion","v","valueSetUrl","quoteWord","codes","c","display","applyFrom","applyTo","_effectivePath","urlKeyPos","scanEnd","parentExtUrl","depth","inStr","esc","foundExtArray","ch","objText","urlMatch","handleNestedExtensionSlices","contextTypes","extIdx","currentRT","seg","profileExtUrls","pUrl","profileSD","clean","bareWord","searchParams","_ilike","results","containerType","contextExts","context","expression","seen","allExts","u","add","ctxExprs","lf","filtered","sort","a","b","fullSD","extInfo","cursorPos","curDoc","matching","sliceElements","sliceValueTypes","inSl","af","lo","_doc","targetType","allSDs","uniqueSDs","beforeCursor","trimStart","explicit","makeJsonRtCompletion","isParams","domainElements","existingKeys","getKeys","jsonCompletionSource","cc","validateFhirProperties","properties","groups","prop","group","props","diagnostics","values","validNames","message","buildFhirValidationPlugin","define","timeout","destroyed","hasActiveDiagnostics","field","fhirDiagnosticsField","messages","size","scheduleCheck","clearTimeout","delay","check","currentDoc","tree","emptyStrings","effects","setFhirDiagnosticsEffect","of","rawDiags","es","diags","number","update","docChanged","destroy","fhirUnderline","mark","class","fhirErrorLineDecoration","FhirGutterMarker","elementClass","fhirGutterMarker","create","marks","none","lineDecos","gutterMarkers","empty","value","tr","effect","is","gutter","range","existing","provide","decorations","fhirLinterTheme","theme","textDecorationLine","textDecorationStyle","textDecorationColor","textUnderlineOffset","color","backgroundColor","buildFhirCompletionExtension","jsonSource","autoTrigger","updateListener","shouldTrigger","totalInserted","iterChanges","_fA","_tA","_fB","_tB","data","autocomplete"],"mappings":"AAAA,SAKCA,gBAAgB,EAChBC,eAAe,QACT,2BAA2B;AAClC,SAASC,YAAY,QAAQ,wBAAwB;AACrD,SAASC,gBAAgB,EAAEC,UAAU,QAAQ,uBAAuB;AACpE,SAECC,QAAQ,EACRC,WAAW,EACXC,UAAU,QACJ,oBAAoB;AAC3B,SACCC,UAAU,EACVC,UAAU,EACVC,YAAY,EACZC,eAAe,EACfC,UAAU,QAEJ,mBAAmB;AAC1B,SACCC,wBAAwB,EAExBC,kBAAkB,EAElBC,kBAAkB,QACZ,gBAAa;AAsDpB,0EAA0E;AAE1E,MAAMC,kBAAkB,IAAIC,IAAI;IAC/B;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACA;AAED,SAASC,gBAAgBC,QAAgB;IACxC,OACCH,gBAAgBI,GAAG,CAACD,aACpBA,SAASE,UAAU,CAAC;AAEtB;AAEA,MAAMC,oBAAoB,IAAIL,IAAI;IACjC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACA;AAED,MAAMM,oBAAoB,IAAIN,IAAI;IACjC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACA;AAED,0EAA0E;AAE1E,MAAMO,UAAU,IAAIC;AACpB,MAAMC,kBAAkB,IAAID;AAC5B,MAAME,YAAY,IAAIF;AACtB,MAAMG,sBAAsB,IAAIH;AAEhC,MAAMI,cAAc;AAEpB,SAASC,SAASC,MAAuC;IACxD,OAAOC,KAAKC,SAAS,CAACF;AACvB;AAEA,eAAeG,gBACdH,MAAuC,EACvCI,MAA+B;IAE/B,MAAMC,MAAMN,SAASC;IACrB,IAAIJ,UAAUP,GAAG,CAACgB,MAAM,OAAOT,UAAUU,GAAG,CAACD,QAAQ,EAAE;IAEvD,IAAIE,UAAUV,oBAAoBS,GAAG,CAACD;IACtC,IAAI,CAACE,SAAS;QACbA,UAAUH,OAAOJ,QACfQ,IAAI,CAAC,CAACC;YACNb,UAAUc,GAAG,CAACL,KAAKI;YACnBZ,oBAAoBc,MAAM,CAACN;YAC3B,KAAK,MAAMO,MAAMH,KAAM;gBACtB,IAAIG,GAAGC,YAAY,EAAEC,SAAS;oBAC7BrB,QAAQiB,GAAG,CAACE,GAAGG,IAAI,EAAEH;gBACtB;YACD;YACA,OAAOH;QACR,GACCO,KAAK,CAAC;YACNnB,oBAAoBc,MAAM,CAACN;YAC3BT,UAAUc,GAAG,CAACL,KAAK,EAAE;YACrB,OAAO,EAAE;QACV;QACDR,oBAAoBa,GAAG,CAACL,KAAKE;IAC9B;IACA,OAAOA;AACR;AAEA,eAAeU,YACdF,IAAY,EACZX,MAA+B;IAE/B,IAAIX,QAAQJ,GAAG,CAAC0B,OAAO,OAAOtB,QAAQa,GAAG,CAACS,SAAS;IAEnD,MAAMV,MAAM,CAAC,OAAO,EAAEU,MAAM;IAC5B,IAAIR,UAAUZ,gBAAgBW,GAAG,CAACD;IAClC,IAAI,CAACE,SAAS;QACb,MAAMW,QAAQH,KAAKI,QAAQ,CAAC;QAC5B,MAAMC,eAAe,CAACpB,SACrBI,OAAOJ,QAAQQ,IAAI,CAAC,CAACC,OAASA,IAAI,CAAC,EAAE,IAAI;QAE1CF,UAAU,AACTW,CAAAA,QACGE,aAAa;YAAEC,KAAKN;YAAMO,WAAWxB;YAAayB,QAAQ;QAAI,KAC9DH,aAAa;YACbL;YACAS,YAAY;YACZF,WAAWxB;YACXyB,QAAQ;QACT,GAAGf,IAAI,CACN,CAACI,KACAA,MACAQ,aAAa;gBACZL;gBACA,sBAAsB;gBACtBO,WAAWxB;gBACXyB,QAAQ;YACT,GACF,EAEDf,IAAI,CAAC,CAACI;YACNnB,QAAQiB,GAAG,CAACK,MAAMH;YAClBjB,gBAAgBgB,MAAM,CAACN;YACvB,OAAOO;QACR,GACCI,KAAK,CAAC;YACNrB,gBAAgBgB,MAAM,CAACN;YACvB,OAAO;QACR;QACDV,gBAAgBe,GAAG,CAACL,KAAKE;IAC1B;IACA,OAAOA;AACR;AAEA,0EAA0E;AAE1E,SAASkB,UAAUX,OAAoB;IACtC,MAAMY,QAAQZ,QAAQa,IAAI,CAACC,KAAK,CAAC;IACjC,OAAO,AAACF,CAAAA,KAAK,CAACA,MAAMG,MAAM,GAAG,EAAE,IAAI,EAAC,EAAGC,OAAO,CAAC,OAAO;AACvD;AAEA,SAASC,eACRC,QAAuB,EACvBC,UAAkB;IAElB,MAAMC,SAAS,GAAGD,WAAW,CAAC,CAAC;IAC/B,OAAOD,SAASG,MAAM,CAAC,CAACC;QACvB,IAAI,CAACA,GAAGT,IAAI,CAACrC,UAAU,CAAC4C,SAAS,OAAO;QACxC,MAAMG,OAAOD,GAAGT,IAAI,CAACW,KAAK,CAACJ,OAAOL,MAAM;QACxC,OAAO,CAACQ,KAAKlB,QAAQ,CAAC;IACvB;AACD;AAEA,SAASoB,YACRP,QAAuB,EACvBC,UAAkB,EAClB5B,GAAW;IAEX,MAAMmC,SAASR,SAASS,IAAI,CAAC,CAACL;QAC7B,IAAI,CAACA,GAAGT,IAAI,CAACrC,UAAU,CAAC,GAAG2C,WAAW,CAAC,CAAC,GAAG,OAAO;QAClD,MAAMS,OAAOjB,UAAUW;QACvB,OAAOM,SAASrC,OAAOqC,KAAKC,WAAW,OAAOtC,IAAIsC,WAAW;IAC9D;IACA,IAAIH,QAAQ,OAAOA;IAEnB,KAAK,MAAMJ,MAAMJ,SAAU;QAC1B,IAAI,CAACI,GAAGT,IAAI,CAACiB,QAAQ,CAAC,QAAQ;QAC9B,IAAI,CAACR,GAAGT,IAAI,CAACrC,UAAU,CAAC,GAAG2C,WAAW,CAAC,CAAC,GAAG;QAC3C,MAAMY,WAAWpB,UAAUW;QAC3B,IAAI,CAAC/B,IAAIsC,WAAW,GAAGrD,UAAU,CAACuD,SAASF,WAAW,KAAK;QAC3D,MAAMG,aAAazC,IAAIiC,KAAK,CAACO,SAAShB,MAAM,EAAEc,WAAW;QACzD,MAAMI,cAAcX,GAAGrB,IAAI,EAAE0B,KAC5B,CAACO,IAAMA,EAAEC,IAAI,CAACN,WAAW,OAAOG;QAEjC,IAAIC,aAAa;YAChB,OAAO;gBAAE,GAAGX,EAAE;gBAAErB,MAAM;oBAACgC;iBAAY;YAAC;QACrC;IACD;IACA,OAAOG;AACR;AAEA,0EAA0E;AAE1E,eAAeC,mBACdpC,IAAY,EACZX,MAA+B;IAE/B,MAAMQ,KAAK,MAAMK,YAAYF,MAAMX;IACnC,IAAI,CAACQ,IAAIC,cAAcC,SAAS,OAAO;IAEvC,MAAMkB,WAAW;WAAIpB,GAAGC,YAAY,CAACC,OAAO;KAAC;IAE7C,IAAIF,GAAGwC,cAAc,EAAE;QACtB,MAAMC,OAAO,MAAMF,mBAAmBvC,GAAGwC,cAAc,EAAEhD;QACzD,IAAIiD,MAAM;YACT,KAAK,MAAMC,UAAUD,KAAKrB,QAAQ,CAAE;gBACnC,MAAMuB,eAAeD,OAAO3B,IAAI,CAACG,OAAO,CACvC,IAAI0B,OAAO,CAAC,CAAC,EAAEH,KAAKI,QAAQ,EAAE,GAC9B7C,GAAGG,IAAI;gBAER,IAAI,CAACiB,SAAS0B,IAAI,CAAC,CAACC,IAAMA,EAAEhC,IAAI,KAAK4B,eAAe;oBACnDvB,SAAS4B,IAAI,CAAC;wBAAE,GAAGN,MAAM;wBAAE3B,MAAM4B;oBAAa;gBAC/C;YACD;QACD;IACD;IAEA,OAAO;QAAEvB;QAAUyB,UAAU7C,GAAGG,IAAI;IAAC;AACtC;AAEA,eAAe8C,gBACdlC,IAAc,EACdmC,YAAoB,EACpB1D,MAA+B;IAE/B,MAAM2D,SAAS,MAAMZ,mBAAmBW,cAAc1D;IACtD,IAAI,CAAC2D,QAAQ,OAAO,EAAE;IAEtB,IAAIC,cAAcF;IAClB,IAAIG,kBAAkBF,OAAO/B,QAAQ;IAErC,KAAK,MAAM3B,OAAOsB,KAAM;QACvB,IAAItB,QAAQ,gBAAgB,OAAO,EAAE;QAErC,MAAM+B,KAAKG,YAAY0B,iBAAiBD,aAAa3D;QACrD,IAAI,CAAC+B,IAAI,OAAO,EAAE;QAElB,IAAIA,GAAG8B,gBAAgB,EAAE;YACxBF,cAAc5B,GAAG8B,gBAAgB,CAACpC,OAAO,CAAC,MAAM;YAChD;QACD;QAEA,IAAI,CAACM,GAAGrB,IAAI,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE;QAC5B,MAAM3B,WAAWgD,GAAGrB,IAAI,CAAC,EAAE,CAACkC,IAAI;QAEhC,IAAI7D,aAAa,mBAAmB;YACnC4E,cAAc5B,GAAGT,IAAI;YACrB;QACD;QAEA,MAAMwC,aAAa,MAAMhB,mBAAmB/D,UAAUgB;QACtD,IAAI,CAAC+D,YAAY,OAAO,EAAE;QAC1BH,cAAcG,WAAWV,QAAQ;QACjCQ,kBAAkBE,WAAWnC,QAAQ;IACtC;IAEA,MAAMoC,WAAWrC,eAAekC,iBAAiBD;IACjD,MAAMK,WAA0B,EAAE;IAElC,KAAK,MAAMjC,MAAMgC,SAAU;QAC1B,MAAME,eAAelC,GAAGT,IAAI,CAACiB,QAAQ,CAAC;QACtC,IAAI0B,gBAAgBlC,GAAGrB,IAAI,IAAIqB,GAAGrB,IAAI,CAACc,MAAM,GAAG,GAAG;YAClD,KAAK,MAAMmB,KAAKZ,GAAGrB,IAAI,CAAE;gBACxBsD,SAAST,IAAI,CAAC;oBACb,GAAGxB,EAAE;oBACLT,MAAMS,GAAGT,IAAI,CAACG,OAAO,CACpB,OACAkB,EAAEC,IAAI,CAACsB,MAAM,CAAC,GAAGC,WAAW,KAAKxB,EAAEC,IAAI,CAACX,KAAK,CAAC;oBAE/CvB,MAAM;wBAACiC;qBAAE;gBACV;YACD;QACD,OAAO;YACNqB,SAAST,IAAI,CAACxB;QACf;IACD;IAEA,OAAOiC;AACR;AAEA,eAAeI,qBACd9C,IAAc,EACdmC,YAAoB,EACpB1D,MAA+B;IAE/B,IAAIuB,KAAKE,MAAM,KAAK,GAAG,OAAO;IAE9B,MAAMkC,SAAS,MAAMZ,mBAAmBW,cAAc1D;IACtD,IAAI,CAAC2D,QAAQ,OAAO;IAEpB,IAAIC,cAAcF;IAClB,IAAIG,kBAAkBF,OAAO/B,QAAQ;IAErC,IAAK,IAAI0C,IAAI,GAAGA,IAAI/C,KAAKE,MAAM,EAAE6C,IAAK;QACrC,MAAMrE,MAAMsB,IAAI,CAAC+C,EAAE;QACnB,IAAIrE,QAAQ,gBAAgB,OAAO;QAEnC,MAAM+B,KAAKG,YAAY0B,iBAAiBD,aAAa3D;QACrD,IAAI,CAAC+B,IAAI,OAAO;QAEhB,IAAIA,GAAGrB,IAAI,EAAE2C,KAAK,CAACV,IAAMA,EAAEC,IAAI,KAAK,aAAa;YAChD,OAAOyB;QACR;QAEA,IAAItC,GAAG8B,gBAAgB,EAAE;YACxBF,cAAc5B,GAAG8B,gBAAgB,CAACpC,OAAO,CAAC,MAAM;YAChD;QACD;QACA,IAAI,CAACM,GAAGrB,IAAI,EAAE,CAAC,EAAE,EAAE,OAAO;QAC1B,MAAM3B,WAAWgD,GAAGrB,IAAI,CAAC,EAAE,CAACkC,IAAI;QAChC,IAAI7D,aAAa,mBAAmB;YACnC4E,cAAc5B,GAAGT,IAAI;YACrB;QACD;QACA,MAAMwC,aAAa,MAAMhB,mBAAmB/D,UAAUgB;QACtD,IAAI,CAAC+D,YAAY,OAAO;QACxBH,cAAcG,WAAWV,QAAQ;QACjCQ,kBAAkBE,WAAWnC,QAAQ;IACtC;IACA,OAAO;AACR;AAaA,SAAS2C,YAAY7D,OAAoB;IACxC,MAAM8D,UAAU9D,QAAQ+D,GAAG,KAAK;IAChC,MAAMzF,WAAW0B,QAAQC,IAAI,EAAE,CAAC,EAAE,EAAEkC;IACpC,IAAI,CAAC7D,UAAU;QACd,IAAI0B,QAAQoD,gBAAgB,EAAE,OAAOU,UAAU,kBAAkB;QACjE,OAAO;IACR;IACA,IAAIxF,aAAa,eAAewF,SAAS,OAAO;IAChD,IAAIA,SACH,OAAOzF,gBAAgBC,YAAY,oBAAoB;IACxD,IAAII,kBAAkBH,GAAG,CAACD,WAAW,OAAO;IAC5C,IAAID,gBAAgBC,WAAW,OAAO;IACtC,OAAO;AACR;AAEA,SAAS0F,aACRpC,IAAY,EACZqC,IAAiB,EACjBC,MAAc;IAEd,MAAMC,QAAQ,GAAGD,OAAO,EAAE,CAAC;IAC3B,MAAME,aAAa,GAAGD,MAAM,EAAE,CAAC;IAC/B,OAAQF;QACP,KAAK;YAAiB;gBACrB,MAAMI,OAAO,CAAC,CAAC,EAAEzC,KAAK,MAAM,EAAEuC,MAAM,GAAG,EAAEC,WAAW,EAAE,EAAED,MAAM,GAAG,EAAED,OAAO,CAAC,CAAC;gBAC5E,OAAO;oBACNG;oBACAC,cAAcD,KAAKE,OAAO,CAACH,cAAcA,WAAWrD,MAAM;gBAC3D;YACD;QACA,KAAK;YAAmB;gBACvB,MAAMsD,OAAO,CAAC,CAAC,EAAEzC,KAAK,MAAM,EAAEuC,MAAM,GAAG,EAAEC,WAAW,WAAW,EAAED,MAAM,GAAG,EAAED,OAAO,CAAC,CAAC;gBACrF,OAAO;oBAAEG;oBAAMC,cAAcD,KAAKG,WAAW,CAAC,QAAQ;gBAAE;YACzD;QACA,KAAK;YAAmB;gBACvB,MAAMH,OAAO,CAAC,CAAC,EAAEzC,KAAK,MAAM,EAAEuC,MAAM,EAAE,EAAED,OAAO,CAAC,CAAC;gBACjD,OAAO;oBAAEG;oBAAMC,cAAcD,KAAKE,OAAO,CAAC,GAAGJ,MAAM,EAAE,CAAC,IAAIA,MAAMpD,MAAM;gBAAC;YACxE;QACA,KAAK;YAAU;gBACd,MAAMsD,OAAO,CAAC,CAAC,EAAEzC,KAAK,MAAM,EAAEuC,MAAM,EAAE,EAAED,OAAO,CAAC,CAAC;gBACjD,OAAO;oBAAEG;oBAAMC,cAAcD,KAAKE,OAAO,CAAC,GAAGJ,MAAM,EAAE,CAAC,IAAIA,MAAMpD,MAAM;gBAAC;YACxE;QACA,KAAK;YAAU;gBACd,MAAMsD,OAAO,CAAC,CAAC,EAAEzC,KAAK,KAAK,CAAC;gBAC5B,OAAO;oBAAEyC;oBAAMC,cAAcD,KAAKtD,MAAM,GAAG;gBAAE;YAC9C;QACA;YAAS;gBACR,MAAMsD,OAAO,CAAC,CAAC,EAAEzC,KAAK,GAAG,CAAC;gBAC1B,OAAO;oBAAEyC;oBAAMC,cAAcD,KAAKtD,MAAM;gBAAC;YAC1C;IACD;AACD;AAEA,SAAS0D,aAAazE,OAAoB;IACzC,MAAM4B,OAAOjB,UAAUX;IACvB,MAAM0E,QAAQ1E,QAAQC,IAAI,EAAE0E,IAAI,CAACzC,IAAMA,EAAEC,IAAI,EAAEyC,KAAK,UAAU;IAC9D,MAAMX,OAAOJ,YAAY7D;IAEzB,MAAM6E,aAAyB;QAC9BC,OAAOlD;QACP3B,MAAM;QACN8E,QAAQL;QACRM,OAAOhF,QAAQiF,GAAG,IAAIjF,QAAQiF,GAAG,GAAG,IAAI,IAAI;QAC5CC,OAAO,CAACC,MAAMC,aAAaC,MAAMC;YAChC,MAAMC,MAAMJ,KAAKK,KAAK,CAACD,GAAG,CAACE,QAAQ;YACnC,IAAIC,aAAaL;YACjB,IAAIM,WAAWL;YACf,IAAII,aAAa,KAAKH,GAAG,CAACG,aAAa,EAAE,KAAK,KAAKA;YACnD,IAAIC,WAAWJ,IAAIxE,MAAM,IAAIwE,GAAG,CAACI,SAAS,KAAK,KAAKA;YAEpD,MAAMC,YAAYL,IAAI/D,KAAK,CAACmE,UAAUE,KAAK,CAAC;YAC5C,IAAID,WAAW;gBACd,MAAME,SAAS,CAAC,CAAC,EAAElE,KAAK,CAAC,CAAC;gBAC1BuD,KAAKY,QAAQ,CAAC;oBACbC,SAAS;wBAAEX,MAAMK;wBAAYJ,IAAIK;wBAAUG;oBAAO;oBAClDG,WAAW;wBAAEC,QAAQR,aAAaI,OAAO/E,MAAM;oBAAC;gBACjD;gBACA;YACD;YAEA,MAAMoF,OAAOhB,KAAKK,KAAK,CAACD,GAAG,CAACa,MAAM,CAACV;YACnC,MAAMW,WAAWF,KAAK9B,IAAI;YAC1B,MAAMH,SAASmC,SAASR,KAAK,CAAC,WAAW,CAAC,EAAE,IAAI;YAEhD,MAAM,EAAExB,IAAI,EAAEC,YAAY,EAAE,GAAGN,aAAapC,MAAMqC,MAAMC;YAExDiB,KAAKY,QAAQ,CAAC;gBACbC,SAAS;oBAAEX,MAAMK;oBAAYJ,IAAIK;oBAAUG,QAAQzB;gBAAK;gBACxD4B,WAAW;oBAAEC,QAAQR,aAAapB;gBAAa;YAChD;YAEA,IACCL,SAAS,YACTA,SAAS,YACTA,SAAS,qBACTA,SAAS,mBACR;gBACDqC,WAAW,IAAMlJ,gBAAgB+H,OAAO;YACzC;QACD;IACD;IACA,IAAInF,QAAQuG,KAAK,EAAE1B,WAAW2B,IAAI,GAAGxG,QAAQuG,KAAK;IAClD,OAAO1B;AACR;AAEA,SAAS4B,8BAA8BzG,OAAoB;IAC1D,MAAM4B,OAAOjB,UAAUX;IACvB,IAAI4B,SAAS,eAAeA,SAAS,QAAQ,OAAO6C,aAAazE;IAEjE,MAAM0E,QAAQ1E,QAAQC,IAAI,EAAE0E,IAAI,CAACzC,IAAMA,EAAEC,IAAI,EAAEyC,KAAK,UAAU;IAC9D,MAAMC,aAAyB;QAC9BC,OAAOlD;QACP3B,MAAM;QACN8E,QAAQL;QACRM,OAAOhF,QAAQiF,GAAG,IAAIjF,QAAQiF,GAAG,GAAG,IAAI,IAAI;QAC5CC,OAAO,CAACC,MAAMC,aAAaC,MAAMC;YAChC,MAAMC,MAAMJ,KAAKK,KAAK,CAACD,GAAG,CAACE,QAAQ;YACnC,IAAIC,aAAaL;YACjB,IAAIM,WAAWL;YACf,IAAII,aAAa,KAAKH,GAAG,CAACG,aAAa,EAAE,KAAK,KAAKA;YACnD,IAAIC,WAAWJ,IAAIxE,MAAM,IAAIwE,GAAG,CAACI,SAAS,KAAK,KAAKA;YAEpD,MAAMC,YAAYL,IAAI/D,KAAK,CAACmE,UAAUE,KAAK,CAAC;YAC5C,IAAID,WAAW;gBACd,MAAME,SAAS,CAAC,CAAC,EAAElE,KAAK,CAAC,CAAC;gBAC1BuD,KAAKY,QAAQ,CAAC;oBACbC,SAAS;wBAAEX,MAAMK;wBAAYJ,IAAIK;wBAAUG;oBAAO;oBAClDG,WAAW;wBAAEC,QAAQR,aAAaI,OAAO/E,MAAM;oBAAC;gBACjD;gBACA;YACD;YAEA,MAAMoF,OAAOhB,KAAKK,KAAK,CAACD,GAAG,CAACa,MAAM,CAACV;YACnC,MAAMxB,SAASiC,KAAK9B,IAAI,CAACwB,KAAK,CAAC,WAAW,CAAC,EAAE,IAAI;YACjD,MAAM1B,QAAQ,GAAGD,OAAO,EAAE,CAAC;YAC3B,MAAME,aAAa,GAAGD,MAAM,EAAE,CAAC;YAC/B,MAAME,OAAO,CAAC,CAAC,EAAEzC,KAAK,MAAM,EAAEuC,MAAM,GAAG,EAAEC,WAAW,YAAY,EAAED,MAAM,GAAG,EAAED,OAAO,CAAC,CAAC;YACtFiB,KAAKY,QAAQ,CAAC;gBACbC,SAAS;oBAAEX,MAAMK;oBAAYJ,IAAIK;oBAAUG,QAAQzB;gBAAK;gBACxD4B,WAAW;oBAAEC,QAAQR,aAAarB,KAAKG,WAAW,CAAC,QAAQ;gBAAE;YAC9D;YACA8B,WAAW,IAAMlJ,gBAAgB+H,OAAO;QACzC;IACD;IACA,IAAInF,QAAQuG,KAAK,EAAE1B,WAAW2B,IAAI,GAAGxG,QAAQuG,KAAK;IAClD,OAAO1B;AACR;AAEA,SAAS6B,sBACRxF,QAAuB,EACvByF,KAAsC;IAEtC,MAAMC,cAA4B,EAAE;IACpC,KAAK,MAAMtF,MAAMJ,SAAU;QAC1B0F,YAAY9D,IAAI,CAAC6D,MAAMrF;QACvB,MAAMM,OAAOjB,UAAUW;QACvB,MAAMuF,gBAAgBvF,GAAGrB,IAAI,EAAE,CAAC,EAAE,EAAEkC;QACpC,IACCb,GAAGrB,IAAI,EAAEc,WAAW,KACpB8F,iBACA1I,gBAAgBI,GAAG,CAACsI,gBACnB;YACD,MAAMC,MAAkB;gBACvBhC,OAAO,CAAC,CAAC,EAAElD,MAAM;gBACjB3B,MAAM;gBACN8E,QAAQ;gBACRC,OAAO,CAAC;YACT;YACA8B,IAAIN,IAAI,GAAG;YACXI,YAAY9D,IAAI,CAACgE;QAClB;IACD;IACA,OAAOF;AACR;AAYA,SAASG,mBAAmBjH,EAAuB;IAClD,IAAI,CAACA,GAAGC,YAAY,EAAEC,SAAS,OAAO;IACtC,MAAMkB,WAAWpB,GAAGC,YAAY,CAACC,OAAO;IAExC,MAAMgH,UAAU9F,SAASS,IAAI,CAAC,CAACkB,IAAMA,EAAEhC,IAAI,KAAK;IAChD,MAAMoG,WAAWD,SAASjD,QAAQ;IAClC,MAAMmD,aAAaD,WAAW,EAAE,GAAID,SAAS/G,MAAM0E,IAAI,CAACzC,IAAMA,EAAEC,IAAI,KAAK,EAAE;IAE3E,MAAMgF,SAAkC,EAAE;IAC1C,KAAK,MAAM7F,MAAMJ,SAAU;QAC1B,IAAII,GAAGT,IAAI,KAAK,yBAAyBS,GAAG8F,SAAS,EAAE;YACtD,MAAMA,YAAY9F,GAAG8F,SAAS;YAC9B,MAAMC,QAAQnG,SAASS,IAAI,CAC1B,CAACkB,IACAA,EAAEhC,IAAI,KAAK,6BACXgC,EAAEyE,QAAQ,IACVpG,SAASqD,OAAO,CAAC1B,KAAK3B,SAASqD,OAAO,CAACjD;YAEzC,MAAMgG,WAAWD,OAAOC,YAAYF;YACpCD,OAAOrE,IAAI,CAAC;gBAAEsE;gBAAWE;gBAAUf,OAAOjF,GAAGiF,KAAK;YAAC;QACpD;IACD;IAEA,OAAO;QACNhG,KAAKT,GAAGS,GAAG,IAAIT,GAAGG,IAAI;QACtB2B,MAAM9B,GAAG8B,IAAI;QACbqF;QACAC;QACAC;IACD;AACD;AAEA,2EAA2E;AAE3E,MAAMI,sBAAsB,IAAI3I;AAEhC,eAAe4I,iBACdxE,YAAoB,EACpB1D,MAA+B;IAE/B,IAAI0D,iBAAiB,cAAc,OAAO;IAC1C,IAAIuE,oBAAoBhJ,GAAG,CAACyE,eAC3B,OAAOuE,oBAAoB/H,GAAG,CAACwD;IAEhC,MAAMlD,KAAK,MAAMK,YAAY6C,cAAc1D;IAC3C,IAAI,CAACQ,IAAIwC,gBAAgB;QACxBiF,oBAAoB3H,GAAG,CAACoD,cAAc;QACtC,OAAO;IACR;IACA,MAAMyE,WAAW3H,GAAGwC,cAAc,CAACxB,KAAK,CAAC,KAAK4G,GAAG,IAAI5G,MAAM,IAAI,CAAC,EAAE,IAAI;IACtE,MAAMmC,SAAS,MAAMuE,iBAAiBC,UAAUnI;IAChDiI,oBAAoB3H,GAAG,CAACoD,cAAcC;IACtC,OAAOA;AACR;AAWA,eAAe0E,mBACdC,WAAqB,EACrBtI,MAA+B;IAE/B,MAAM6H,SAA2B,EAAE;IAEnC,KAAK,MAAMU,cAAcD,YAAa;QACrC,MAAM9H,KAAK,MAAMK,YAAY0H,YAAYvI;QACzC,IAAI,CAACQ,IAAIC,cAAcC,SAAS;QAEhC,MAAMkB,WAAWpB,GAAGC,YAAY,CAACC,OAAO;QACxC,mFAAmF;QACnF,MAAM8H,YAAY,GAAGhI,GAAGG,IAAI,CAAC,UAAU,CAAC;QAExC,IAAI8H,UAOO;QAEX,MAAMC,QAAQ;YACb,IAAID,SAASE,WAAW;gBACvB,MAAMC,IAAoB;oBACzBd,WAAWW,QAAQX,SAAS;oBAC5Ba,WAAWF,QAAQE,SAAS;oBAC5BhD,KAAK8C,QAAQ9C,GAAG;oBAChBlB,KAAKgE,QAAQhE,GAAG;oBAChBmD,YAAYa,QAAQb,UAAU;gBAC/B;gBACA,IAAIa,QAAQxB,KAAK,IAAI,MAAM2B,EAAE3B,KAAK,GAAGwB,QAAQxB,KAAK;gBAClDY,OAAOrE,IAAI,CAACoF;YACb;QACD;QAEA,KAAK,MAAM5G,MAAMJ,SAAU;YAC1B,IAAII,GAAGT,IAAI,KAAKiH,aAAaxG,GAAG8F,SAAS,EAAE;gBAC1CY;gBACAD,UAAU;oBACTX,WAAW9F,GAAG8F,SAAS;oBACvBnC,KAAK3D,GAAG2D,GAAG,IAAI;oBACflB,KAAKzC,GAAGyC,GAAG,IAAI;oBACfkE,WAAW;oBACXf,YAAY,EAAE;oBACdX,OAAOjF,GAAGiF,KAAK;gBAChB;gBACA;YACD;YAEA,IAAI,CAACwB,SAAS;YAEd,IAAIzG,GAAGT,IAAI,KAAK,GAAGiH,UAAU,KAAK,CAAC,IAAIxG,GAAG6G,WAAW,EAAE;gBACtDJ,QAAQE,SAAS,GAAG3G,GAAG6G,WAAW;YACnC;YACA,IAAI7G,GAAGT,IAAI,KAAK,GAAGiH,UAAU,SAAS,CAAC,IAAIxG,GAAGrB,IAAI,EAAE;gBACnD8H,QAAQb,UAAU,GAAG5F,GAAGrB,IAAI,CAAC0E,GAAG,CAAC,CAACzC,IAAMA,EAAEC,IAAI;YAC/C;QACD;QAEA6F;IACD;IAEA,OAAOb;AACR;AAEA,0EAA0E;AAE1E,eAAeiB,eACdC,aAAuB,EACvBC,QAAgB,EAChBtF,YAAoB,EACpB4E,WAAqB,EACrBtI,MAA+B;IAE/B,KAAK,MAAMuI,cAAcD,YAAa;QACrC,MAAM9H,KAAK,MAAMK,YAAY0H,YAAYvI;QACzC,IAAI,CAACQ,IAAIC,cAAcC,SAAS;QAEhC,MAAMuI,WAAW,GAAGvF,aAAa,CAAC,EAAE;eAAIqF;YAAeC;SAAS,CAAC1D,IAAI,CAAC,MAAM;QAC5E,KAAK,MAAMtD,MAAMxB,GAAGC,YAAY,CAACC,OAAO,CAAE;YACzC,IAAIsB,GAAGT,IAAI,KAAK0H,UAAU;YAC1B,IAAIjH,GAAG6G,WAAW,IAAI,MAAM,OAAO7G,GAAG6G,WAAW;YACjD,IAAI7G,GAAGgG,QAAQ,IAAI,MAAM,OAAOhG,GAAGgG,QAAQ;YAC3C,IAAIhG,GAAGkH,SAAS,IAAI,MAAM,OAAOlH,GAAGkH,SAAS;QAC9C;IACD;IACA,OAAO;AACR;AAEA,wCAAwC,GACxC,OAAO,SAASC,sBACf7G,IAAY,EACZsF,UAAoB,EACpBhD,MAAc;IAEd,MAAMC,QAAQ,GAAGD,OAAO,EAAE,CAAC;IAE3B,IAAIgD,WAAWnG,MAAM,KAAK,KAAKtC,kBAAkBF,GAAG,CAAC2I,UAAU,CAAC,EAAE,GAAI;QACrE,MAAMwB,KAAKxB,UAAU,CAAC,EAAE;QACxB,MAAMyB,KAAK,CAAC,KAAK,EAAED,GAAGjF,MAAM,CAAC,GAAGC,WAAW,KAAKgF,GAAGlH,KAAK,CAAC,IAAI;QAC7D,MAAM6C,OAAO,CAAC,GAAG,EAAEF,MAAM,SAAS,EAAEvC,KAAK,IAAI,EAAEuC,MAAM,CAAC,EAAEwE,GAAG,OAAO,EAAEzE,OAAO,CAAC,CAAC;QAC7E,OAAO;YAAEG;YAAMC,cAAcD,KAAKG,WAAW,CAAC,QAAQ;QAAE;IACzD;IACA,IAAI0C,WAAWnG,MAAM,KAAK,KAAKrC,kBAAkBH,GAAG,CAAC2I,UAAU,CAAC,EAAE,GAAI;QACrE,MAAMwB,KAAKxB,UAAU,CAAC,EAAE;QACxB,MAAMyB,KAAK,CAAC,KAAK,EAAED,GAAGjF,MAAM,CAAC,GAAGC,WAAW,KAAKgF,GAAGlH,KAAK,CAAC,IAAI;QAC7D,MAAM6C,OAAO,CAAC,GAAG,EAAEF,MAAM,SAAS,EAAEvC,KAAK,IAAI,EAAEuC,MAAM,CAAC,EAAEwE,GAAG,KAAK,EAAEzE,OAAO,CAAC,CAAC;QAC3E,OAAO;YACNG;YACAC,cAAcD,KAAKE,OAAO,CAAC,CAAC,CAAC,EAAEoE,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,EAAEA,GAAG,GAAG,CAAC,CAAC5H,MAAM;QAC/D;IACD;IACA,IAAImG,WAAWnG,MAAM,KAAK,GAAG;QAC5B,MAAM2H,KAAKxB,UAAU,CAAC,EAAE;QACxB,MAAMyB,KAAK,CAAC,KAAK,EAAED,GAAGjF,MAAM,CAAC,GAAGC,WAAW,KAAKgF,GAAGlH,KAAK,CAAC,IAAI;QAC7D,MAAM4C,aAAa,GAAGD,MAAM,EAAE,CAAC;QAC/B,MAAME,OAAO,CAAC,GAAG,EAAEF,MAAM,SAAS,EAAEvC,KAAK,IAAI,EAAEuC,MAAM,CAAC,EAAEwE,GAAG,MAAM,EAAEvE,WAAW,EAAE,EAAED,MAAM,GAAG,EAAED,OAAO,CAAC,CAAC;QACtG,OAAO;YACNG;YACAC,cACCD,KAAKE,OAAO,CAAC,GAAGH,WAAW,EAAE,EAAED,MAAM,CAAC,CAAC,IAAIC,WAAWrD,MAAM;QAC9D;IACD;IACA,uDAAuD;IACvD,MAAMsD,OAAO,CAAC,GAAG,EAAEF,MAAM,SAAS,EAAEvC,KAAK,IAAI,EAAEuC,MAAM,mBAAmB,EAAED,OAAO,CAAC,CAAC;IACnF,IAAItC,SAAS,IAAI;QAChB,mCAAmC;QACnC,OAAO;YAAEyC;YAAMC,cAAcD,KAAKE,OAAO,CAAC,QAAQ;QAAE;IACrD;IACA,OAAO;QAAEF;QAAMC,cAAcD,KAAKG,WAAW,CAAC,QAAQ;IAAE;AACzD;AAEA,0EAA0E;AAE1E,SAASoE,qBACR5F,YAAoB,EACpBnC,IAAc,EACdyH,QAAgB;IAEhB,OAAO,GAAGtF,aAAa,CAAC,EAAE;WAAInC;QAAMyH;KAAS,CAAC1D,IAAI,CAAC,MAAM;AAC1D;AAEA,eAAeiE,mBACdjB,WAAqB,EACrB5E,YAAoB,EACpBnC,IAAc,EACdyH,QAAgB,EAChBhJ,MAA+B;IAE/B,IAAIsI,YAAY7G,MAAM,KAAK,GAAG,OAAO;IAErC,KAAK,MAAM8G,cAAcD,YAAa;QACrC,MAAM9H,KAAK,MAAMK,YAAY0H,YAAYvI;QACzC,IAAI,CAACQ,IAAIC,cAAcC,SAAS;QAEhC,MAAM8I,aAAaF,qBAAqB5F,cAAcnC,MAAMyH;QAC5D,KAAK,MAAMhH,MAAMxB,GAAGC,YAAY,CAACC,OAAO,CAAE;YACzC,IAAIsB,GAAGT,IAAI,KAAKiI,cAAcxH,GAAGyH,OAAO,EAAEC,UAAU;gBACnD,OAAO1H,GAAGyH,OAAO,CAACC,QAAQ;YAC3B;QACD;QAEA,IAAIV,aAAa,QAAQ;YACxB,IAAK,IAAI1E,IAAI/C,KAAKE,MAAM,EAAE6C,IAAI,GAAGA,IAAK;gBACrC,MAAMqF,iBAAiBL,qBACtB5F,cACAnC,KAAKW,KAAK,CAAC,GAAGoC,IAAI,IAClB/C,IAAI,CAAC+C,IAAI,EAAE;gBAEZ,KAAK,MAAMtC,MAAMxB,GAAGC,YAAY,CAACC,OAAO,CAAE;oBACzC,IAAIsB,GAAGT,IAAI,KAAKoI,kBAAkB3H,GAAGyH,OAAO,EAAEC,UAAU;wBACvD,OAAO1H,GAAGyH,OAAO,CAACC,QAAQ;oBAC3B;gBACD;YACD;QACD;IACD;IACA,OAAO;AACR;AAEA,eAAeE,qBACd3D,GAAW,EACX4D,GAAW,EACX7J,MAA+B;IAE/B,MAAM8J,aAAa7D,IAAI/D,KAAK,CAAC,GAAG2H;IAEhC,MAAME,aAAa;WAAID,WAAWE,QAAQ,CAAC;KAA0B;IACrE,IAAID,WAAWtI,MAAM,KAAK,GAAG,OAAO;IAEpC,IAAK,IAAI6C,IAAIyF,WAAWtI,MAAM,GAAG,GAAG6C,KAAK,GAAGA,IAAK;QAChD,MAAM2F,SAASF,UAAU,CAACzF,EAAE,AAAC,CAAC,EAAE;QAChC,IACC,CAAC2F,OAAOlJ,QAAQ,CAAC,2BACjB,CAACkJ,OAAOlJ,QAAQ,CAAC,cAChB;YACD,MAAMmJ,mBAAmB;mBACrBJ,WACD5H,KAAK,CAAC,GAAG6H,UAAU,CAACzF,EAAE,EAAE6F,OACxBH,QAAQ,CAAC;aACX;YACD,IAAK,IAAII,IAAIF,iBAAiBzI,MAAM,GAAG,GAAG2I,KAAK,GAAGA,IAAK;gBACtD,MAAMC,YAAYH,gBAAgB,CAACE,EAAE,AAAC,CAAC,EAAE;gBACzC,IAAI,CAACC,UAAUtJ,QAAQ,CAAC,MAAM;gBAC9B,MAAMuJ,WAAW,MAAMzJ,YAAYwJ,WAAWrK;gBAC9C,IAAI,CAACsK,UAAU7J,cAAcC,SAAS;gBACtC,IAAI6J,UAAU;gBACd,KAAK,MAAMvI,MAAMsI,SAAS7J,YAAY,CAACC,OAAO,CAAE;oBAC/C,IAAIsB,GAAGT,IAAI,KAAK,yBAAyBS,GAAG8F,SAAS,EAAE;wBACtD,MAAMC,QAAQuC,SAAS7J,YAAY,CAACC,OAAO,CAAC2B,IAAI,CAC/C,CAACkB,IACAA,EAAEhC,IAAI,KAAK,6BACXgC,EAAEyE,QAAQ,IACVsC,SAAS7J,YAAY,CAAEC,OAAO,CAACuE,OAAO,CAAC1B,KACtC+G,SAAS7J,YAAY,CAAEC,OAAO,CAACuE,OAAO,CAACjD;wBAE1C,IAAI,AAAC+F,CAAAA,OAAOC,YAAYhG,GAAG8F,SAAS,AAAD,MAAOmC,QAAQ;4BACjDM,UAAU;4BACV;wBACD;wBACA,IAAIA,SAAS;oBACd;oBACA,IACCA,WACAvI,GAAGT,IAAI,KAAK,kCACZS,GAAGyH,OAAO,EAAEC,UACX;wBACD,OAAO1H,GAAGyH,OAAO,CAACC,QAAQ;oBAC3B;gBACD;gBACA,IAAIa,SAAS;YACd;YACA;QACD;QACA,MAAM/J,KAAK,MAAMK,YAAYoJ,QAAQjK;QACrC,IAAI,CAACQ,IAAIC,cAAcC,SAAS;QAChC,KAAK,MAAMsB,MAAMxB,GAAGC,YAAY,CAACC,OAAO,CAAE;YACzC,IAAIsB,GAAGT,IAAI,KAAK,wBAAwBS,GAAGyH,OAAO,EAAEC,UAAU;gBAC7D,OAAO1H,GAAGyH,OAAO,CAACC,QAAQ;YAC3B;QACD;IACD;IACA,OAAO;AACR;AAEA,eAAec,oBACdjJ,IAAc,EACdyH,QAAgB,EAChBtF,YAAoB,EACpB1D,MAA+B,EAC/BsI,cAAwB,EAAE,EAC1BrC,GAAY,EACZ4D,GAAY;IAEZ,IAAI5D,OAAO,QAAQ4D,OAAO,MAAM;QAC/B,MAAMY,cAAclJ,KAAK+B,IAAI,CAC5B,CAACoH,IAAMA,MAAM,eAAeA,MAAM;QAEnC,IAAID,aAAa;YAChB,MAAME,aAAa,MAAMf,qBAAqB3D,KAAK4D,KAAK7J;YACxD,IAAI2K,YAAY,OAAOA;QACxB;IACD;IAEA,MAAMC,iBAAiB,MAAMrB,mBAC5BjB,aACA5E,cACAnC,MACAyH,UACAhJ;IAED,IAAI4K,gBAAgB,OAAOA;IAE3B,MAAMhJ,WAAW,MAAM6B,gBAAgBlC,MAAMmC,cAAc1D;IAC3D,KAAK,MAAMgC,MAAMJ,SAAU;QAC1B,IAAIP,UAAUW,QAAQgH,YAAYhH,GAAGyH,OAAO,EAAEC,UAAU;YACvD,OAAO1H,GAAGyH,OAAO,CAACC,QAAQ;QAC3B;IACD;IAEA,IAAIV,aAAa,QAAQ;QACxB,IAAK,IAAI1E,IAAI/C,KAAKE,MAAM,EAAE6C,IAAI,GAAGA,IAAK;YACrC,MAAMuG,iBAAiB,MAAMpH,gBAC5BlC,KAAKW,KAAK,CAAC,GAAGoC,IAAI,IAClBZ,cACA1D;YAED,KAAK,MAAMgC,MAAM6I,eAAgB;gBAChC,IAAIxJ,UAAUW,QAAQT,IAAI,CAAC+C,IAAI,EAAE,IAAItC,GAAGyH,OAAO,EAAEC,UAAU;oBAC1D,OAAO1H,GAAGyH,OAAO,CAACC,QAAQ;gBAC3B;YACD;QACD;IACD;IAEA,OAAO;AACR;AAEA,eAAeoB,wBACdvJ,IAAc,EACdwJ,QAAgB,EAChBrH,YAAoB,EACpB1D,MAA+B;IAE/B,MAAM4B,WAAW,MAAM6B,gBAAgBlC,MAAMmC,cAAc1D;IAC3D,KAAK,MAAMgC,MAAMJ,SAAU;QAC1B,IAAIP,UAAUW,QAAQ+I,UAAU;QAChC,IAAI/I,GAAGyC,GAAG,KAAK,KAAK;QACpB,MAAM7B,IAAIZ,GAAGrB,IAAI,EAAE,CAAC,EAAE;QACtB,IAAIiC,GAAGC,SAAS,eAAe,CAACD,EAAEoI,aAAa,EAAEvJ,QAAQ;QACzD,OAAOmB,EAAEoI,aAAa,CAAC,EAAE,EAAExJ,MAAM,KAAK4G,SAAS;IAChD;IACA,OAAO;AACR;AAEA,eAAe6C,wBACd1J,IAAc,EACdmC,YAAoB,EACpB1D,MAA+B;IAE/B,MAAM2D,SAAS,MAAMZ,mBAAmBW,cAAc1D;IACtD,IAAI,CAAC2D,QAAQ,OAAO;IAEpB,IAAIC,cAAcF;IAClB,IAAIG,kBAAkBF,OAAO/B,QAAQ;IAErC,IAAK,IAAI0C,IAAI,GAAGA,IAAI/C,KAAKE,MAAM,GAAG,GAAG6C,IAAK;QACzC,MAAMrE,MAAMsB,IAAI,CAAC+C,EAAE;QACnB,IAAIrE,QAAQ,gBAAgB,OAAO;QAEnC,MAAM+B,KAAKG,YAAY0B,iBAAiBD,aAAa3D;QACrD,IAAI,CAAC+B,IAAI,OAAO;QAEhB,IAAIA,GAAG8B,gBAAgB,EAAE;YACxBF,cAAc5B,GAAG8B,gBAAgB,CAACpC,OAAO,CAAC,MAAM;YAChD;QACD;QACA,IAAI,CAACM,GAAGrB,IAAI,EAAE,CAAC,EAAE,EAAE,OAAO;QAC1B,MAAM3B,WAAWgD,GAAGrB,IAAI,CAAC,EAAE,CAACkC,IAAI;QAChC,IAAI7D,aAAa,mBAAmB;YACnC4E,cAAc5B,GAAGT,IAAI;YACrB;QACD;QACA,MAAMwC,aAAa,MAAMhB,mBAAmB/D,UAAUgB;QACtD,IAAI,CAAC+D,YAAY,OAAO;QACxBH,cAAcG,WAAWV,QAAQ;QACjCQ,kBAAkBE,WAAWnC,QAAQ;IACtC;IAEA,MAAMsJ,UAAU3J,IAAI,CAACA,KAAKE,MAAM,GAAG,EAAE;IACrC,IAAI,CAACyJ,SAAS,OAAO;IAErB,MAAMlJ,KAAKG,YAAY0B,iBAAiBD,aAAasH;IACrD,IAAI,CAAClJ,IAAIrB,MAAM,OAAO;IAEtB,MAAMwK,UAAoB,EAAE;IAC5B,KAAK,MAAMvI,KAAKZ,GAAGrB,IAAI,CAAE;QACxB,IAAIiC,EAAEC,IAAI,KAAK,eAAeD,EAAEoI,aAAa,EAAE;YAC9C,KAAK,MAAMI,WAAWxI,EAAEoI,aAAa,CAAE;gBACtC,MAAMK,KAAKD,QAAQ5J,KAAK,CAAC,KAAK4G,GAAG;gBACjC,IAAIiD,IAAIF,QAAQ3H,IAAI,CAAC6H;YACtB;QACD;IACD;IACA,OAAOF,QAAQ1J,MAAM,GAAG,IAAI0J,UAAU;AACvC;AAEA,0EAA0E;AAE1E,eAAeG,aACdC,GAAoB,EACpBvL,MAA+B,EAC/BwL,gBAAoC,EACpCC,cAA0C,EAC1CC,iBAAoC;IAEpC,MAAM,EAAE7B,GAAG,EAAE5D,GAAG,EAAE,GAAGsF;IAErB,+DAA+D;IAC/D,2EAA2E;IAC3E,yEAAyE;IACzE,IAAI7H;IACJ,IAAIiI,0BAA0B;IAC9B,IAAIC,UAAUL,IAAIM,QAAQ,CAAC;IAC3B,IAAK,IAAIC,QAAQP,IAAIQ,QAAQ,CAACtK,MAAM,EAAEqK,SAAS,GAAGA,QAAS;QAC1D,MAAMlD,IAAI2C,IAAIM,QAAQ,CAACC;QACvB,MAAMT,KAAKzC,EAAEoD,SAAS,CAAC;QACvB,IAAIX,IAAI;YACP3H,eAAe2H;YACfM,0BAA0B;YAC1BC,UAAUhD;YACV;QACD;IACD;IACA,mDAAmD;IACnD,wEAAwE;IACxE,0EAA0E;IAC1E,IAAI,CAAClF,cAAc;QAClBA,eAAe8H;IAChB,OAAO,IAAIA,oBAAoBD,IAAIQ,QAAQ,CAACtK,MAAM,GAAG,GAAG;QACvD,uEAAuE;QACvE,qEAAqE;QACrE,wEAAwE;QACxE,MAAMwK,SAASV,IAAIM,QAAQ,CAACN,IAAIQ,QAAQ,CAACtK,MAAM,EAAEuK,SAAS,CAAC;QAC3D,IAAI,CAACC,QAAQ;YACZvI,eAAe8H;YACfG,0BAA0B;QAC3B;IACD;IAEA,IAAI5C,gBAAgBwC,IAAIQ,QAAQ;IAChC,IAAIzD,cAAwB,EAAE;IAE9B,yEAAyE;IACzE,IAAI5E,gBAAgBqF,cAActH,MAAM,GAAG,GAAG;QAC7C,MAAMyK,cAAc,MAAM7H,qBACzB0E,eACArF,cACA1D;QAED,IAAIkM,gBAAgB,MAAM;YACzB,MAAMC,YAAYpD,cAAc7G,KAAK,CAACgK,cAAc;YACpD,MAAME,aAAab,IAAIM,QAAQ,CAACM,UAAU1K,MAAM;YAChD,MAAM4K,UAAUD,WAAWJ,SAAS,CAAC;YACrCjD,gBAAgBoD;YAChB,IAAIE,SAAS;gBACZ3I,eAAe2I;gBACfV,0BAA0B;YAC3B,OAAO;gBACNjI,eAAe;gBACfiI,0BAA0B;YAC3B;YACArD,cAAc8D,WAAWE,cAAc,CAAC,QAAQ;QACjD,OAAO;YACNhE,cAAcsD,QAAQU,cAAc,CAAC,QAAQ;QAC9C;IACD,OAAO;QACNhE,cAAcsD,QAAQU,cAAc,CAAC,QAAQ;IAC9C;IAEA,kCAAkC;IAClC,MAAMC,KAAKhB,IAAIiB,cAAc;IAE7B,IAAID,GAAG5H,IAAI,KAAK,SAAS;QACxB,OAAO8H,sBACNF,GAAGtM,GAAG,EACN8I,eACArF,cACAiI,yBACArD,aACArC,KACA4D,KACA7J,QACAyL,gBACAC,mBACAH;IAEF;IAEA,IAAIgB,GAAG5H,IAAI,KAAK,cAAc;QAC7B,OAAO+H,0BACNH,GAAGI,SAAS,EACZ5D,eACArF,cACAuC,KACA4D,KACA7J,QACA0L,mBACApD;IAEF;IAEA,IAAIiE,GAAG5H,IAAI,KAAK,YAAY;QAC3B,iDAAiD;QACjD,IAAI4G,IAAIqB,aAAa,IAAI,OAAO;QAEhC,OAAOC,yBACN9D,eACArF,cACAiI,yBACA1F,KACA4D,KACA7J,QACA0L,mBACAH;IAEF;IAEA,OAAO;AACR;AAEA,0EAA0E;AAE1E,eAAekB,sBACdzD,QAAgB,EAChBD,aAAuB,EACvBrF,YAAgC,EAChCoJ,wBAAiC,EACjCxE,WAAqB,EACrBrC,GAAW,EACX4D,GAAW,EACX7J,MAA+B,EAC/ByL,cAA0C,EAC1CC,iBAAoC,EACpCH,GAAoB;IAEpB,qBAAqB;IACrB,IAAIvC,aAAa,gBAAgB;QAChC,MAAM+D,MAAM,MAAMhN,gBACjB;YACCqB,YAAY;YACZuD,MAAM;YACNzD,WAAW;YACXC,QAAQ;QACT,GACAnB;QAED,MAAMgN,UAAwBD,IAAI1H,GAAG,CAAC,CAAC7E,KAAQ,CAAA;gBAC9CgF,OAAOhF,GAAGG,IAAI;gBACdA,MAAM;gBACNiF,OAAO,CAACC,MAAkBoH,IAAgBlH,MAAcC;oBACvD,MAAMkH,IAAIrH,KAAKK,KAAK,CAACD,GAAG,CAACE,QAAQ;oBACjC,IAAIE,WAAWL;oBACf,IAAIK,WAAW6G,EAAEzL,MAAM,IAAIyL,CAAC,CAAC7G,SAAS,KAAK,KAAKA;oBAChDR,KAAKY,QAAQ,CAAC;wBACbC,SAAS;4BAAEX;4BAAMC,IAAIK;4BAAUG,QAAQ,GAAGhG,GAAGG,IAAI,CAAC,CAAC,CAAC;wBAAC;wBACrDgG,WAAW;4BAAEC,QAAQb,OAAOvF,GAAGG,IAAI,CAACc,MAAM,GAAG;wBAAE;oBAChD;gBACD;YACD,CAAA;QACA,IAAIuL,QAAQvL,MAAM,KAAK,GAAG,OAAO;QACjC,MAAM0L,OAAOzB,kBAAkB0B,WAAW,CAAC;QAC3C,OAAO;YAAErH,MAAMoH,MAAMpH,QAAQ8D;YAAKmD;YAASK,UAAU;QAAQ;IAC9D;IAEA,uDAAuD;IACvD,IACCrE,aAAa,UACbtF,gBACAqF,cAActH,MAAM,GAAG,KACvBsH,aAAa,CAACA,cAActH,MAAM,GAAG,EAAE,KAAK,eAC3C,MAAMyG,iBAAiBxE,cAAc1D,SACrC;QACD,MAAM6H,SAAS,MAAMQ,mBAAmBC,aAAatI;QACrD,IAAI6H,OAAOpG,MAAM,GAAG,GAAG;YACtB,MAAMuL,UAAwBnF,OAAOxC,GAAG,CAAC,CAACnD,QAAW,CAAA;oBACpDsD,OAAOtD,MAAMyG,SAAS;oBACtBhI,MAAM;oBACN8E,QAAQvD,MAAMyD,GAAG,GAAG,IAAI,aAAa;oBACrCD,OAAOxD,MAAMyD,GAAG,GAAG,IAAI,IAAI;oBAC3B,GAAIzD,MAAM+E,KAAK,GAAG;wBAAEC,MAAMhF,MAAM+E,KAAK;oBAAC,IAAI,CAAC,CAAC;oBAC5CrB,OAAO,CAACC,MAAkBoH,IAAgBlH,MAAcC;wBACvD,MAAMkH,IAAIrH,KAAKK,KAAK,CAACD,GAAG,CAACE,QAAQ;wBACjC,IAAIE,WAAWL;wBACf,IAAIK,WAAW6G,EAAEzL,MAAM,IAAIyL,CAAC,CAAC7G,SAAS,KAAK,KAAKA;wBAChDR,KAAKY,QAAQ,CAAC;4BACbC,SAAS;gCACRX;gCACAC,IAAIK;gCACJG,QAAQ,GAAGtE,MAAMyG,SAAS,CAAC,CAAC,CAAC;4BAC9B;4BACAhC,WAAW;gCAAEC,QAAQb,OAAO7D,MAAMyG,SAAS,CAAClH,MAAM,GAAG;4BAAE;wBACxD;wBACA,iDAAiD;wBACjD,MAAM6L,SAASpL,MAAM0F,UAAU;wBAC/B,IAAI0F,OAAO7L,MAAM,KAAK,GAAG6L,OAAO9J,IAAI,CAAC;wBACrC,IAAI8J,OAAO7L,MAAM,KAAK,GAAG;4BACxBuF,WAAW;gCACV,MAAMuF,KAAK1G,KAAKK,KAAK,CAACS,SAAS,CAAC4G,IAAI,CAACC,IAAI;gCACzC,MAAMC,KAAK5H,KAAKK,KAAK,CAACD,GAAG,CAACE,QAAQ;gCAClC,MAAMuH,QAAQD,GAAGvL,KAAK,CAACqK;gCACvB,IAAI,CAAC,cAAcoB,IAAI,CAACD,QAAQ;gCAChC,MAAME,UAAU/H,KAAKK,KAAK,CAACD,GAAG,CAACa,MAAM,CAACyF;gCACtC,MAAMsB,MAAMD,QAAQ7I,IAAI,CAACwB,KAAK,CAAC,WAAW,CAAC,EAAE,IAAI;gCACjD,MAAM6C,KAAKkE,MAAM,CAAC,EAAE;gCACpB,MAAMjE,KAAK,CAAC,KAAK,EAAED,GAAGjF,MAAM,CAAC,GAAGC,WAAW,KAAKgF,GAAGlH,KAAK,CAAC,IAAI;gCAC7D,IAAI4L;gCACJ,IAAIC;gCACJ,IAAI5O,kBAAkBF,GAAG,CAACmK,KAAK;oCAC9B0E,MAAM,CAAC,GAAG,EAAED,IAAI,CAAC,EAAExE,GAAG,KAAK,CAAC;oCAC5B0E,OAAOD,IAAIrM,MAAM,GAAG;gCACrB,OAAO,IAAIrC,kBAAkBH,GAAG,CAACmK,KAAK;oCACrC0E,MAAM,CAAC,GAAG,EAAED,IAAI,CAAC,EAAExE,GAAG,GAAG,CAAC;oCAC1B0E,OAAOD,IAAIrM,MAAM;gCAClB,OAAO;oCACN,MAAMoD,QAAQ,GAAGgJ,IAAI,EAAE,CAAC;oCACxBC,MAAM,CAAC,GAAG,EAAED,IAAI,CAAC,EAAExE,GAAG,MAAM,EAAExE,MAAM,EAAE,EAAEgJ,IAAI,CAAC,CAAC;oCAC9CE,OAAOD,IAAI7I,OAAO,CAAC,GAAGJ,MAAM,EAAE,EAAEgJ,IAAI,CAAC,CAAC,IAAIhJ,MAAMpD,MAAM;gCACvD;gCACAoE,KAAKY,QAAQ,CAAC;oCACbC,SAAS;wCAAEX,MAAMwG;wCAAI/F,QAAQsH;oCAAI;oCACjCnH,WAAW;wCAAEC,QAAQ2F,KAAKwB;oCAAK;gCAChC;gCACA/G,WAAW,IAAMlJ,gBAAgB+H,OAAO;4BACzC,GAAG;wBACJ;oBACD;gBACD,CAAA;YACA,MAAMsH,OAAOzB,kBAAkB0B,WAAW,CAAC;YAC3C,OAAO;gBAAErH,MAAMoH,MAAMpH,QAAQ8D;gBAAKmD;gBAASK,UAAU;YAAQ;QAC9D;IACD;IAEA,8DAA8D;IAC9D,IAAI3J,gBAAgB4E,YAAY7G,MAAM,GAAG,GAAG;QAC3C,MAAMuM,WAAW,MAAMlF,eACtBC,eACAC,UACAtF,cACA4E,aACAtI;QAED,IAAIgO,YAAY,MAAM;YACrB,MAAMC,SAAqB;gBAC1BzI,OAAOwI;gBACPrN,MAAM;gBACN+E,OAAO;gBACPE,OAAO,CAACC,MAAkBoH,IAAgBlH,MAAcC;oBACvD,MAAMkH,IAAIrH,KAAKK,KAAK,CAACD,GAAG,CAACE,QAAQ;oBACjC,IAAIE,WAAWL;oBACf,IAAIK,WAAW6G,EAAEzL,MAAM,IAAIyL,CAAC,CAAC7G,SAAS,KAAK,KAAKA;oBAChDR,KAAKY,QAAQ,CAAC;wBACbC,SAAS;4BAAEX;4BAAMC,IAAIK;4BAAUG,QAAQ,GAAGwH,SAAS,CAAC,CAAC;wBAAC;wBACtDrH,WAAW;4BAAEC,QAAQb,OAAOiI,SAASvM,MAAM,GAAG;wBAAE;oBACjD;gBACD;YACD;YACA,MAAM0L,OAAOzB,kBAAkB0B,WAAW,CAAC;YAC3C,OAAO;gBACNrH,MAAMoH,MAAMpH,QAAQ8D;gBACpBmD,SAAS;oBAACiB;iBAAO;gBACjBZ,UAAU;YACX;QACD;IACD;IAEA,kBAAkB;IAClB,IAAIrE,aAAa,eAAetF,cAAc;QAC7C,MAAMyH,UAAU,MAAMF,wBACrBlC,eACArF,cACA1D;QAED,IAAImL,SAAS;YACZ,MAAM6B,UAAwB7B,QAAQ9F,GAAG,CAAC,CAACgG,KAAQ,CAAA;oBAClD7F,OAAO,GAAG6F,GAAG,CAAC,CAAC;oBACf1K,MAAM;oBACNiF,OAAO,CAACC,MAAkBoH,IAAgBlH,MAAcC;wBACvDH,KAAKY,QAAQ,CAAC;4BACbC,SAAS;gCAAEX;gCAAMC;gCAAIQ,QAAQ,GAAG6E,GAAG,CAAC,CAAC;4BAAC;4BACtC1E,WAAW;gCAAEC,QAAQb,OAAOsF,GAAG5J,MAAM,GAAG;4BAAE;wBAC3C;oBACD;gBACD,CAAA;YACA,MAAM0L,OAAOzB,kBAAkB0B,WAAW,CAAC;YAC3C,OAAO;gBAAErH,MAAMoH,MAAMpH,QAAQ8D;gBAAKmD;gBAASK,UAAU;YAAW;QACjE;IACD;IAEA,sBAAsB;IACtB,IAAIrE,aAAa,OAAO;QACvB,MAAMkF,UAAU3C,IAAIQ,QAAQ,CAACR,IAAIQ,QAAQ,CAACtK,MAAM,GAAG,EAAE;QACrD,IAAIyM,YAAY,eAAeA,YAAY,qBAAqB;YAC/D,OAAOC,6BACNpF,eACArF,cACA4E,aACArC,KACA4D,KACA7J,QACA0L,mBACAH;QAEF;IACD;IAEA,gBAAgB;IAChB,IAAI7H,cAAc;QACjB,MAAM9B,WAAW,MAAM6B,gBAAgBsF,eAAerF,cAAc1D;QACpE,MAAMgC,KAAKJ,SAASS,IAAI,CAAC,CAACkB,IAAMlC,UAAUkC,OAAOyF;QACjD,IAAIhH,IAAIrB,MAAMc,WAAW,KAAKO,GAAGrB,IAAI,CAAC,EAAE,EAAEkC,SAAS,WAAW;YAC7D,MAAMsK,OAAOzB,kBAAkB0B,WAAW,CAAC;YAC3C,MAAMJ,UAAwB;gBAAC;gBAAQ;aAAQ,CAAC3H,GAAG,CAAC,CAAC+I,IAAO,CAAA;oBAC3D5I,OAAO4I;oBACPzN,MAAM;oBACNiF,OAAO,CAACC,MAAkBoH,IAAgBlH,MAAcC;wBACvD,MAAMkH,IAAIrH,KAAKK,KAAK,CAACD,GAAG,CAACE,QAAQ;wBACjC,IAAIC,aAAaL;wBACjB,IAAIM,WAAWL;wBACf,uCAAuC;wBACvC,IAAII,aAAa,KAAK8G,CAAC,CAAC9G,aAAa,EAAE,KAAK,KAAKA;wBACjD,IAAIC,WAAW6G,EAAEzL,MAAM,IAAIyL,CAAC,CAAC7G,SAAS,KAAK,KAAKA;wBAChDR,KAAKY,QAAQ,CAAC;4BACbC,SAAS;gCAAEX,MAAMK;gCAAYJ,IAAIK;gCAAUG,QAAQ4H;4BAAE;4BACrDzH,WAAW;gCAAEC,QAAQR,aAAagI,EAAE3M,MAAM;4BAAC;wBAC5C;oBACD;gBACD,CAAA;YACA,OAAO;gBAAEsE,MAAMoH,MAAMpH,QAAQ8D;gBAAKmD;gBAASK,UAAU;YAAQ;QAC9D;IACD;IAEA,sBAAsB;IACtB,IACCrE,aAAa,kBACbA,aAAa,eACbA,aAAa,SACbyC,kBACA/H,cACC;QACD,MAAM2K,cAAc,MAAM7D,oBACzBzB,eACAC,UACAtF,cACA1D,QACAsI,aACArC,KACA4D;QAED,IAAIwE,aAAa;YAChB,MAAMC,YAAY5C,kBAAkB0B,WAAW,CAAC;YAChD,MAAMrH,OAAOuI,WAAWvI,QAAQ8D;YAChC,MAAM9H,SAASuM,YAAYA,UAAUvJ,IAAI,CAACrD,OAAO,CAAC,MAAM,MAAM;YAC9D,IAAI;gBACH,MAAM6M,QAAQ,MAAM9C,eAAe4C,aAAatM;gBAChD,IAAIwM,MAAM9M,MAAM,GAAG,GAAG;oBACrB,MAAMuL,UAAwBuB,MAAMlJ,GAAG,CAAC,CAACmJ,IAAO,CAAA;4BAC/ChJ,OAAOgJ,EAAE3L,IAAI;4BACb,GAAI2L,EAAEC,OAAO,GAAG;gCAAEvH,MAAMsH,EAAEC,OAAO;4BAAC,IAAI,CAAC,CAAC;4BACxC9N,MAAM;4BACNiF,OAAO,CACNC,MACAoH,IACAyB,WACAC;gCAEA,MAAMzB,IAAIrH,KAAKK,KAAK,CAACD,GAAG,CAACE,QAAQ;gCACjC,IAAIC,aAAasI;gCACjB,IAAIrI,WAAWsI;gCACf,IAAIzB,CAAC,CAAC9G,WAAW,KAAK,KAAKA;gCAC3B,IAAIC,WAAW6G,EAAEzL,MAAM,IAAIyL,CAAC,CAAC7G,SAAS,KAAK,KAAKA;gCAChDR,KAAKY,QAAQ,CAAC;oCACbC,SAAS;wCACRX,MAAMK;wCACNJ,IAAIK;wCACJG,QAAQ,GAAGgI,EAAE3L,IAAI,CAAC,CAAC,CAAC;oCACrB;oCACA8D,WAAW;wCAAEC,QAAQR,aAAaoI,EAAE3L,IAAI,CAACpB,MAAM,GAAG;oCAAE;gCACrD;4BACD;wBACD,CAAA;oBACA,OAAO;wBAAEsE;wBAAMiH;wBAASjL,QAAQ;oBAAM;gBACvC;YACD,EAAE,OAAM;YACP,gBAAgB;YACjB;QACD;IACD;IAEA,OAAO;AACR;AAEA,0EAA0E;AAE1E,eAAeoM,6BACdS,cAAwB,EACxBlL,YAAgC,EAChC4E,WAAqB,EACrBrC,GAAW,EACX4D,GAAW,EACX7J,MAA+B,EAC/B0L,iBAAoC,EACpCH,GAAoB;IAEpB,8CAA8C;IAC9C,MAAMsD,YAAY5I,IAAIf,WAAW,CAAC,SAAS2E;IAC3C,IAAIiF,UAAUD,cAAc,CAAC,IAAIA,YAAYhF;IAC7C,IAAK,IAAIvF,IAAIwK,UAAU,GAAGxK,KAAK,GAAGA,IAAK;QACtC,MAAMkK,IAAIvI,GAAG,CAAC3B,EAAE;QAChB,IAAIkK,MAAM,KAAK;YACdM,UAAUxK;YACV;QACD;QACA,IAAIkK,MAAM,OAAOA,MAAM,OAAOA,MAAM,KAAK;IAC1C;IACA,MAAM1E,aAAa7D,IAAI/D,KAAK,CAAC,GAAG4M;IAChC,IAAIC,eAA8B;IAClC,IAAIC,QAAQ;IACZ,IAAIC,QAAQ;IACZ,IAAIC,MAAM;IACV,IAAIC,gBAAgB;IACpB,IAAK,IAAI7K,IAAIwF,WAAWrI,MAAM,GAAG,GAAG6C,KAAK,GAAGA,IAAK;QAChD,MAAM8K,KAAKtF,UAAU,CAACxF,EAAE;QACxB,IAAI4K,KAAK;YACRA,MAAM;YACN;QACD;QACA,IAAIE,OAAO,MAAM;YAChBF,MAAM;YACN;QACD;QACA,IAAIE,OAAO,KAAK;YACfH,QAAQ,CAACA;YACT;QACD;QACA,IAAIA,OAAO;QACX,IAAIG,OAAO,OAAOA,OAAO,KAAK;YAC7BJ;QACD,OAAO,IAAII,OAAO,KAAK;YACtB,IAAIJ,UAAU,GAAG;gBAChBG,gBAAgB;gBAChB;YACD;YACAH;QACD,OAAO,IAAII,OAAO,KAAK;YACtB,IAAIJ,UAAU,KAAKG,eAAe;gBACjC,MAAME,UAAUvF,WAAW5H,KAAK,CAACoC;gBACjC,MAAMgL,WAAWD,QAAQ9I,KAAK,CAAC;gBAC/B,IAAI+I,UAAU,CAAC,EAAE,EAAEvO,SAAS,MAAM;oBACjCgO,eAAeO,QAAQ,CAAC,EAAE;gBAC3B;gBACA;YACD;YACA,IAAIN,UAAU,GAAG;YACjBA;QACD;IACD;IAEA,IAAID,cAAc;QACjB,OAAOQ,4BACNR,cACAlF,KACA7J,QACA0L;IAEF;IAEA,IAAI,CAAChI,cAAc,OAAO;IAE1B,sCAAsC;IACtC,MAAMnC,OAAOgK,IAAIQ,QAAQ;IACzB,MAAMyD,eAAyB;QAC9B9L;QACA;QACA;QACA;KACA;IACD,MAAM+L,SAASlO,KAAK2D,WAAW,CAAC;IAChC,IAAIuK,SAAS,GAAG;QACf,IAAIC,YAAYhM;QAChB,IAAK,IAAIY,IAAI,GAAGA,IAAImL,QAAQnL,IAAK;YAChC,MAAMqL,MAAMpO,IAAI,CAAC+C,EAAE;YACnB,IAAI,CAACqL,KAAK;YACV,MAAM/N,WAAW,MAAM6B,gBAAgB,EAAE,EAAEiM,WAAW1P;YACtD,MAAMgC,KAAKJ,SAASS,IAAI,CAAC,CAACkB,IAAMlC,UAAUkC,OAAOoM;YACjD,IAAI3N,IAAIrB,MAAM,CAAC,EAAE,EAAEkC,QAAQ,CAAC9D,gBAAgBiD,GAAGrB,IAAI,CAAC,EAAE,CAACkC,IAAI,GAC1D6M,YAAY1N,GAAGrB,IAAI,CAAC,EAAE,CAACkC,IAAI;iBACvB;QACN;QACA,IAAI6M,cAAchM,cAAc;YAC/B8L,aAAa/N,MAAM,GAAG;YACtB+N,aAAahM,IAAI,CAChBkM,WACA,WACA,GAAGhM,aAAa,CAAC,EAAEnC,KAAKW,KAAK,CAAC,GAAGuN,QAAQnK,IAAI,CAAC,MAAM;QAEtD;IACD;IAEA,qBAAqB;IACrB,MAAMsK,iBAA2B,EAAE;IACnC,IAAIJ,aAAazO,QAAQ,CAAC2C,eAAe;QACxC,KAAK,MAAMmM,QAAQvH,YAAa;YAC/B,MAAMwH,YAAY,MAAMjP,YAAYgP,MAAM7P;YAC1C,IAAI,CAAC8P,WAAWrP,cAAcC,SAAS;YACvC,KAAK,MAAMsB,MAAM8N,UAAUrP,YAAY,CAACC,OAAO,CAAE;gBAChD,KAAK,MAAMkC,KAAKZ,GAAGrB,IAAI,IAAI,EAAE,CAAE;oBAC9B,IAAIiC,EAAEC,IAAI,KAAK,aAAa;wBAC3B,KAAK,MAAM6H,KAAK9H,EAAEwI,OAAO,IAAI,EAAE,CAAE;4BAChC,MAAM2E,QAAQrF,EAAE3J,QAAQ,CAAC,OAAO2J,EAAExI,KAAK,CAAC,GAAGwI,EAAEzF,OAAO,CAAC,QAAQyF;4BAC7D,IAAI,CAACkF,eAAe7O,QAAQ,CAACgP,QAAQH,eAAepM,IAAI,CAACuM;wBAC1D;oBACD;gBACD;YACD;QACD;IACD;IAEA,MAAMC,WAAWtE,kBAAkB0B,WAAW,CAAC;IAC/C,MAAMrL,SAASiO,UAAUjL,QAAQ;IACjC,MAAMkL,eAAgD;QACrDtP,MAAM;QACNS,YAAY;QACZF,WAAW;QACXC,QAAQ;IACT;IACA,IAAIY,QAAQkO,aAAaC,MAAM,GAAGnO;IAClC,MAAMoO,UAAU,MAAMpQ,gBAAgBkQ,cAAcjQ;IAEpD,MAAMoQ,gBAAgBZ,YAAY,CAAC,EAAE;IACrC,MAAMvG,WAAWuG,aAAanN,IAAI,CAAC,CAACmM,IAAMA,EAAEzN,QAAQ,CAAC;IACrD,MAAMsP,cAAcF,QAAQpO,MAAM,CAAC,CAACvB,KACnCA,GAAG8P,OAAO,EAAEhN,KACX,CAACkL,IAAMA,EAAE7N,IAAI,KAAK,aAAa6O,aAAazO,QAAQ,CAACyN,EAAE+B,UAAU;IAGnE,MAAMC,OAAO,IAAI1R;IACjB,MAAM2R,UAA4C,EAAE;IACpD,IAAIjB,aAAazO,QAAQ,CAAC2C,eAAe;QACxC,KAAK,MAAMgN,KAAKd,eAAgB;YAC/B,IAAI,CAACY,KAAKvR,GAAG,CAACyR,IAAI;gBACjBF,KAAKG,GAAG,CAACD;gBACTD,QAAQjN,IAAI,CAAC;oBAAEvC,KAAKyP;oBAAGhL,OAAO;gBAAG;YAClC;QACD;IACD;IACA,KAAK,MAAMlF,MAAM6P,YAAa;QAC7B,MAAMK,IAAIlQ,GAAGS,GAAG,IAAIT,GAAGG,IAAI;QAC3B,IAAI6P,KAAKvR,GAAG,CAACyR,IAAI;QACjBF,KAAKG,GAAG,CAACD;QACT,MAAME,WACLpQ,GAAG8P,OAAO,EACPvO,OAAO,CAACyM,IAAMA,EAAE7N,IAAI,KAAK,WAC1B0E,IAAI,CAACmJ,IAAMA,EAAE+B,UAAU,KAAK,EAAE;QACjC,IAAI7K,QAAQ;QACZ,IAAIuD,YAAY2H,SAAS7P,QAAQ,CAACkI,WAAWvD,QAAQ;aAChD,IAAI0K,iBAAiBQ,SAAS7P,QAAQ,CAACqP,gBAAgB1K,QAAQ;aAC/D,IAAIkL,SAAS7P,QAAQ,CAAC2C,eAAegC,QAAQ;aAC7C,IAAIkL,SAAStN,IAAI,CAAC,CAACC,IAAMA,MAAM,oBAAoBA,MAAM,aAC7DmC,QAAQ;aACJ,IAAIkL,SAAS7P,QAAQ,CAAC,YAAY2E,QAAQ;QAC/C+K,QAAQjN,IAAI,CAAC;YAAEvC,KAAKyP;YAAGhL;QAAM;IAC9B;IACA,MAAMmL,KAAK9O,OAAOQ,WAAW;IAC7B,MAAMuO,WAAW,AAChBD,CAAAA,KAAKJ,QAAQ1O,MAAM,CAAC,CAACwB,IAAMA,EAAEtC,GAAG,CAACsB,WAAW,GAAGxB,QAAQ,CAAC8P,OAAOJ,OAAM,EACpEM,IAAI,CAAC,CAACC,GAAGC,IAAMA,EAAEvL,KAAK,GAAGsL,EAAEtL,KAAK;IAClC,IAAIoL,SAASrP,MAAM,GAAG,GAAG;QACxB,MAAMuL,UAAwB8D,SAASzL,GAAG,CAAC,CAACmC,MAAS,CAAA;gBACpDhC,OAAOgC,IAAIvG,GAAG;gBACdN,MAAM;gBACN+E,OAAO8B,IAAI9B,KAAK;gBAChBE,OAAO,CACNC,MACAoH,IACAyB,WACAC;oBAEA,MAAMzB,IAAIrH,KAAKK,KAAK,CAACD,GAAG,CAACE,QAAQ;oBACjC,IAAIE,WAAWsI;oBACf,IAAItI,WAAW6G,EAAEzL,MAAM,IAAIyL,CAAC,CAAC7G,SAAS,KAAK,KAAKA;oBAChDR,KAAKY,QAAQ,CAAC;wBACbC,SAAS;4BAAEX,MAAM2I;4BAAW1I,IAAIK;4BAAUG,QAAQ,GAAGgB,IAAIvG,GAAG,CAAC,CAAC,CAAC;wBAAC;wBAChE0F,WAAW;4BAAEC,QAAQ8H,YAAYlH,IAAIvG,GAAG,CAACQ,MAAM,GAAG;wBAAE;oBACrD;oBACAuF,WAAW;wBACV,MAAMkK,SAAS,MAAMrQ,YAAY2G,IAAIvG,GAAG,EAAEjB;wBAC1C,IAAI,CAACkR,QAAQ;wBACb,MAAMC,UAAU1J,mBAAmByJ;wBACnC,IAAI,CAACC,SAAS;wBACd,MAAMC,YAAYvL,KAAKK,KAAK,CAACS,SAAS,CAAC4G,IAAI,CAACC,IAAI;wBAChD,MAAM6D,SAASxL,KAAKK,KAAK,CAACD,GAAG,CAACE,QAAQ;wBACtC,MAAMuH,QAAQ2D,OAAOnP,KAAK,CAACkP;wBAC3B,IAAI,CAAC,cAAczD,IAAI,CAACD,QAAQ;wBAChC,MAAME,UAAU/H,KAAKK,KAAK,CAACD,GAAG,CAACa,MAAM,CAACsK;wBACtC,MAAMvD,MAAMD,QAAQ7I,IAAI,CAACwB,KAAK,CAAC,WAAW,CAAC,EAAE,IAAI;wBACjD,IAAIuH;wBACJ,IAAIC;wBACJ,IAAIoD,QAAQxJ,QAAQ,EAAE;4BACrB,MAAM9C,QAAQ,GAAGgJ,IAAI,EAAE,CAAC;4BACxB,MAAM/I,aAAa,GAAGD,MAAM,EAAE,CAAC;4BAC/BiJ,MAAM,CAAC,GAAG,EAAED,IAAI,gBAAgB,EAAEhJ,MAAM,GAAG,EAAEC,WAAW,WAAW,EAAED,MAAM,GAAG,EAAEgJ,IAAI,CAAC,CAAC;4BACtFE,OAAOD,IAAI5I,WAAW,CAAC,QAAQ;wBAChC,OAAO,IAAIiM,QAAQvJ,UAAU,CAACnG,MAAM,KAAK,GAAG;4BAC3C,MAAM2H,KAAK+H,QAAQvJ,UAAU,CAAC,EAAE;4BAChC,MAAMyB,KAAK,CAAC,KAAK,EAAED,GAAGjF,MAAM,CAAC,GAAGC,WAAW,KAAKgF,GAAGlH,KAAK,CAAC,IAAI;4BAC7D,IAAI/C,kBAAkBF,GAAG,CAACmK,OAAOA,OAAO,QAAQ;gCAC/C0E,MAAM,CAAC,GAAG,EAAED,IAAI,CAAC,EAAExE,GAAG,KAAK,CAAC;gCAC5B0E,OAAOD,IAAIrM,MAAM,GAAG;4BACrB,OAAO,IAAIrC,kBAAkBH,GAAG,CAACmK,KAAK;gCACrC0E,MAAM,CAAC,GAAG,EAAED,IAAI,CAAC,EAAExE,GAAG,GAAG,CAAC;gCAC1B0E,OAAOD,IAAIrM,MAAM;4BAClB,OAAO;gCACN,MAAMoD,QAAQ,GAAGgJ,IAAI,EAAE,CAAC;gCACxBC,MAAM,CAAC,GAAG,EAAED,IAAI,CAAC,EAAExE,GAAG,MAAM,EAAExE,MAAM,EAAE,EAAEgJ,IAAI,CAAC,CAAC;gCAC9CE,OAAOD,IAAI7I,OAAO,CAAC,GAAGJ,MAAM,EAAE,EAAEgJ,KAAK,IAAIhJ,MAAMpD,MAAM;4BACtD;wBACD,OAAO;4BACN;wBACD;wBACAoE,KAAKY,QAAQ,CAAC;4BACbC,SAAS;gCAAEX,MAAMqL;gCAAW5K,QAAQsH;4BAAI;4BACxCnH,WAAW;gCAAEC,QAAQwK,YAAYrD;4BAAK;wBACvC;wBACA/G,WAAW,IAAMlJ,gBAAgB+H,OAAO;oBACzC,GAAG;gBACJ;YACD,CAAA;QACA,OAAO;YAAEE,MAAMiK,UAAUjK,QAAQ8D;YAAKmD;YAASjL,QAAQ;QAAM;IAC9D;IACA,OAAO;AACR;AAEA,eAAewN,4BACdR,YAAoB,EACpBlF,GAAW,EACX7J,MAA+B,EAC/B0L,iBAAoC;IAEpC,MAAMpB,WAAW,MAAMzJ,YAAYkO,cAAc/O;IACjD,IAAI,CAACsK,UAAU,OAAO;IACtB,MAAMpD,OAAOO,mBAAmB6C;IAChC,IAAI,CAACpD,MAAMW,OAAOpG,QAAQ,OAAO;IAEjC,MAAM0L,OAAOzB,kBAAkB0B,WAAW,CAAC;IAC3C,MAAMrL,SAASoL,MAAMpI,KAAKxC,iBAAiB;IAC3C,MAAM+O,WAAWvP,SACdmF,KAAKW,MAAM,CAAC9F,MAAM,CAClB,CAAC6G,IACAA,EAAEZ,QAAQ,CAACzF,WAAW,GAAGxB,QAAQ,CAACgB,WACjC6G,CAAAA,EAAE3B,KAAK,EAAE1E,cAAcxB,SAASgB,WAAW,KAAI,KAEjDmF,KAAKW,MAAM;IAEd,MAAMmF,UAAwBsE,SAASjM,GAAG,CAAC,CAACnD;QAC3C,MAAMqP,gBAAgBjH,SAAS7J,YAAY,EAAEC,WAAW,EAAE;QAC1D,IAAI8Q,kBAA4B,EAAE;QAClC,IAAIC,OAAO;QACX,KAAK,MAAMzP,MAAMuP,cAAe;YAC/B,IACCvP,GAAGT,IAAI,KAAK,yBACZS,GAAG8F,SAAS,KAAK5F,MAAM4F,SAAS,EAC/B;gBACD2J,OAAO;gBACP;YACD;YACA,IAAIA,QAAQzP,GAAGT,IAAI,KAAK,gCAAgC;gBACvDiQ,kBAAkBxP,GAAGrB,IAAI,EAAE0E,IAAI,CAACzC,IAAMA,EAAEC,IAAI,KAAK,EAAE;gBACnD;YACD;YACA,IAAI4O,QAAQzP,GAAGT,IAAI,KAAK,yBAAyBS,GAAG8F,SAAS,EAAE;QAChE;QACA,OAAO;YACNtC,OAAOtD,MAAM8F,QAAQ;YACrB,GAAI9F,MAAM+E,KAAK,GAAG;gBAAEC,MAAMhF,MAAM+E,KAAK;YAAC,IAAI,CAAC,CAAC;YAC5CtG,MAAM;YACNiF,OAAO,CAACC,MAAkBoH,IAAgBlH,MAAcC;gBACvD,MAAMkH,IAAIrH,KAAKK,KAAK,CAACD,GAAG,CAACE,QAAQ;gBACjC,IAAIE,WAAWL;gBACf,IAAIK,WAAW6G,EAAEzL,MAAM,IAAIyL,CAAC,CAAC7G,SAAS,KAAK,KAAKA;gBAChDR,KAAKY,QAAQ,CAAC;oBACbC,SAAS;wBAAEX;wBAAMC,IAAIK;wBAAUG,QAAQ,GAAGtE,MAAM8F,QAAQ,CAAC,CAAC,CAAC;oBAAC;oBAC5DrB,WAAW;wBAAEC,QAAQb,OAAO7D,MAAM8F,QAAQ,CAACvG,MAAM,GAAG;oBAAE;gBACvD;gBACA,IAAI+P,gBAAgB/P,MAAM,KAAK,GAAG;oBACjCuF,WAAW;wBACV,MAAMuF,KAAK1G,KAAKK,KAAK,CAACS,SAAS,CAAC4G,IAAI,CAACC,IAAI;wBACzC,MAAMC,KAAK5H,KAAKK,KAAK,CAACD,GAAG,CAACE,QAAQ;wBAClC,MAAMuL,KAAKjE,GAAGvL,KAAK,CAACqK;wBACpB,IAAI,CAAC,cAAcoB,IAAI,CAAC+D,KAAK;wBAC7B,MAAMC,KAAK9L,KAAKK,KAAK,CAACD,GAAG,CAACa,MAAM,CAACyF;wBACjC,MAAMsB,MAAM8D,GAAG5M,IAAI,CAACwB,KAAK,CAAC,WAAW,CAAC,EAAE,IAAI;wBAC5C,MAAM6C,KAAKoI,eAAe,CAAC,EAAE;wBAC7B,MAAMnI,KAAK,CAAC,KAAK,EAAED,GAAGjF,MAAM,CAAC,GAAGC,WAAW,KAAKgF,GAAGlH,KAAK,CAAC,IAAI;wBAC7D,IAAI4L;wBACJ,IAAIC;wBACJ,IAAI5O,kBAAkBF,GAAG,CAACmK,OAAOA,OAAO,QAAQ;4BAC/C0E,MAAM,CAAC,GAAG,EAAED,IAAI,CAAC,EAAExE,GAAG,KAAK,CAAC;4BAC5B0E,OAAOD,IAAIrM,MAAM,GAAG;wBACrB,OAAO,IAAIrC,kBAAkBH,GAAG,CAACmK,KAAK;4BACrC0E,MAAM,CAAC,GAAG,EAAED,IAAI,CAAC,EAAExE,GAAG,GAAG,CAAC;4BAC1B0E,OAAOD,IAAIrM,MAAM;wBAClB,OAAO;4BACN,MAAMoD,QAAQ,GAAGgJ,IAAI,EAAE,CAAC;4BACxBC,MAAM,CAAC,GAAG,EAAED,IAAI,CAAC,EAAExE,GAAG,MAAM,EAAExE,MAAM,EAAE,EAAEgJ,IAAI,CAAC,CAAC;4BAC9CE,OAAOD,IAAI7I,OAAO,CAAC,GAAGJ,MAAM,EAAE,EAAEgJ,KAAK,IAAIhJ,MAAMpD,MAAM;wBACtD;wBACAoE,KAAKY,QAAQ,CAAC;4BACbC,SAAS;gCAAEX,MAAMwG;gCAAI/F,QAAQsH;4BAAI;4BACjCnH,WAAW;gCAAEC,QAAQ2F,KAAKwB;4BAAK;wBAChC;wBACA/G,WAAW,IAAMlJ,gBAAgB+H,OAAO;oBACzC,GAAG;gBACJ;YACD;QACD;IACD;IACA,IAAImH,QAAQvL,MAAM,GAAG,GACpB,OAAO;QAAEsE,MAAMoH,MAAMpH,QAAQ8D;QAAKmD;QAASjL,QAAQ;IAAM;IAC1D,OAAO;AACR;AAEA,0EAA0E;AAE1E,eAAe2K,0BACdC,SAAiB,EACjB5D,aAAuB,EACvBrF,YAAgC,EAChCkO,IAAY,EACZ/H,GAAW,EACX7J,MAA+B,EAC/B0L,iBAAoC,EACpCpD,WAAqB;IAErB,IAAI,CAAC5E,cAAc,OAAO;IAE1B,yEAAyE;IACzE,IACC,AAACiJ,CAAAA,cAAc,eAAeA,cAAc,MAAK,KAChD,MAAMzE,iBAAiBxE,cAAc1D,SACrC;QACD,MAAM6H,SACL8E,cAAc,cACX,MAAMtE,mBAAmBC,aAAatI,UACtC,EAAE;QAEN,MAAMgN,UAAwB,EAAE;QAEhC,KAAK,MAAM9K,SAAS2F,OAAQ;YAC3BmF,QAAQxJ,IAAI,CAAC;gBACZgC,OAAOtD,MAAMyG,SAAS;gBACtBhI,MAAM;gBACN8E,QACCvD,MAAMyD,GAAG,GAAG,IAAI,GAAGzD,MAAMyD,GAAG,CAAC,EAAE,EAAEzD,MAAMuC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAEvC,MAAMuC,GAAG,EAAE;gBACjEiB,OAAOxD,MAAMyD,GAAG,GAAG,IAAI,IAAI;gBAC3B,GAAIzD,MAAM+E,KAAK,GAAG;oBAAEC,MAAMhF,MAAM+E,KAAK;gBAAC,IAAI,CAAC,CAAC;gBAC5CrB,OAAO,CAACC,MAAkBoH,IAAgBlH,MAAcC;oBACvD,MAAMa,OAAOhB,KAAKK,KAAK,CAACD,GAAG,CAACa,MAAM,CAACf;oBACnC,MAAMnB,SAASiC,KAAK9B,IAAI,CAACwB,KAAK,CAAC,WAAW,CAAC,EAAE,IAAI;oBACjD,MAAM,EAAExB,IAAI,EAAEC,YAAY,EAAE,GAAGmE,sBAC9BjH,MAAMyG,SAAS,EACfzG,MAAM0F,UAAU,EAChBhD;oBAGDiB,KAAKY,QAAQ,CAAC;wBACbC,SAAS;4BAAEX;4BAAMC;4BAAIQ,QAAQzB;wBAAK;wBAClC4B,WAAW;4BAAEC,QAAQb,OAAOf;wBAAa;oBAC1C;oBACAgC,WAAW,IAAMlJ,gBAAgB+H,OAAO;gBACzC;YACD;QACD;QAEA,gDAAgD;QAChDmH,QAAQxJ,IAAI,CAAC;YACZgC,OAAO;YACP7E,MAAM;YACN+E,OAAO,CAAC;YACRwB,MAAM;YACNtB,OAAO,CAACC,MAAkBoH,IAAgBlH,MAAcC;gBACvD,MAAMa,OAAOhB,KAAKK,KAAK,CAACD,GAAG,CAACa,MAAM,CAACf;gBACnC,MAAMnB,SAASiC,KAAK9B,IAAI,CAACwB,KAAK,CAAC,WAAW,CAAC,EAAE,IAAI;gBACjD,MAAM,EAAExB,IAAI,EAAEC,YAAY,EAAE,GAAGmE,sBAAsB,IAAI,EAAE,EAAEvE;gBAC7DiB,KAAKY,QAAQ,CAAC;oBACbC,SAAS;wBAAEX;wBAAMC;wBAAIQ,QAAQzB;oBAAK;oBAClC4B,WAAW;wBAAEC,QAAQb,OAAOf;oBAAa;gBAC1C;gBACAgC,WAAW,IAAMlJ,gBAAgB+H,OAAO;YACzC;QACD;QAEA,MAAMsH,OAAOzB,kBAAkB0B,WAAW,CAAC;QAC3C,OAAO;YAAErH,MAAMoH,MAAMpH,QAAQ8D;YAAKmD;QAAQ;IAC3C;IAEA,0CAA0C;IAC1C,MAAMnL,aACLkH,cAActH,MAAM,GAAG,KACvBsH,aAAa,CAACA,cAActH,MAAM,GAAG,EAAE,KAAKkL,YACzC5D,cAAc7G,KAAK,CAAC,GAAG,CAAC,KACxB6G;IAEJ,MAAM8I,aAAa,MAAM/G,wBACxBjJ,YACA8K,WACAjJ,cACA1D;IAED,IAAI6R,eAAe,uBAAuB;QACzC,MAAMC,SAAS,MAAM/R,gBACpB;YACCY,MAAM,GAAG+C,aAAa,wBAAwB,CAAC;YAC/CtC,YAAY;YACZF,WAAW;YACXC,QAAQ;QACT,GACAnB;QAED,MAAMwQ,OAAO,IAAI1R;QACjB,MAAMiT,YAAYD,OAAO/P,MAAM,CAAC,CAACvB;YAChC,MAAMkQ,IAAIlQ,GAAGS,GAAG,IAAIT,GAAGG,IAAI;YAC3B,IAAI6P,KAAKvR,GAAG,CAACyR,IAAI,OAAO;YACxBF,KAAKG,GAAG,CAACD;YACT,OAAO;QACR;QACA,IAAIqB,UAAUtQ,MAAM,GAAG,GAAG;YACzB,MAAM6M,YAAY5C,kBAAkB0B,WAAW,CAAC;YAChD,MAAM4C,WAAWtE,kBAAkB0B,WAAW,CAAC;YAC/C,MAAMrH,OAAOuI,WAAWvI,QAAQiK,UAAUjK,QAAQ8D;YAClD,MAAM9H,SAASuM,YACZA,UAAUvJ,IAAI,CAACrD,OAAO,CAAC,MAAM,IAAIa,WAAW,KAC3CyN,UAAUjL,KAAKxC,iBAAiB;YACpC,MAAMuO,WAAW/O,SACdgQ,UAAUhQ,MAAM,CAChB,CAACvB,KACAA,GAAG8B,IAAI,EAAEC,cAAcxB,SAASgB,WAChCvB,GAAGS,GAAG,EAAEsB,cAAcxB,SAASgB,WAEhCgQ;YACH,MAAM/E,UAAwB8D,SAASzL,GAAG,CAAC,CAAC7E;gBAC3C,MAAMS,MAAMT,GAAGS,GAAG,IAAIT,GAAGG,IAAI;gBAC7B,OAAO;oBACN6E,OAAOvE;oBACP,GAAIT,GAAG8B,IAAI,GAAG;wBAAE4E,MAAM1G,GAAG8B,IAAI;oBAAC,IAAI,CAAC,CAAC;oBACpC3B,MAAM;oBACNiF,OAAO,CACNC,MACAoH,IACAyB,WACAC;wBAEA,MAAMzB,IAAIrH,KAAKK,KAAK,CAACD,GAAG,CAACE,QAAQ;wBACjC,IAAIE,WAAWsI;wBACf,IAAItI,WAAW6G,EAAEzL,MAAM,IAAIyL,CAAC,CAAC7G,SAAS,KAAK,KAAKA;wBAChDR,KAAKY,QAAQ,CAAC;4BACbC,SAAS;gCAAEX,MAAM2I;gCAAW1I,IAAIK;gCAAUG,QAAQ,CAAC,CAAC,EAAEvF,IAAI,CAAC,CAAC;4BAAC;4BAC7D0F,WAAW;gCAAEC,QAAQ8H,YAAYzN,IAAIQ,MAAM,GAAG;4BAAE;wBACjD;oBACD;gBACD;YACD;YACA,IAAIuL,QAAQvL,MAAM,GAAG,GAAG;gBACvB,OAAO;oBAAEsE;oBAAMiH;oBAASjL,QAAQ;gBAAM;YACvC;QACD;IACD;IACA,IAAI8P,YAAY,OAAO;IACvB,OAAO;AACR;AAEA,0EAA0E;AAE1E,eAAehF,yBACd9D,aAAuB,EACvBrF,YAAgC,EAChCiI,uBAAgC,EAChC1F,GAAW,EACX4D,GAAW,EACX7J,MAA+B,EAC/B0L,iBAAoC,EACpCH,GAAoB;IAEpB,MAAM1E,OAAO6E,kBAAkBxF,KAAK,CAACD,GAAG,CAACa,MAAM,CAAC+C;IAChD,MAAMmI,eAAenL,KAAK9B,IAAI,CAAC7C,KAAK,CAAC,GAAG2H,MAAMhD,KAAKd,IAAI,EAAEkM,SAAS;IAElE,sEAAsE;IACtE,IACC,CAACvG,kBAAkBwG,QAAQ,IAC3B,aAAavE,IAAI,CAACqE,iBAClB,CAACtG,kBAAkB0B,WAAW,CAAC,QAE/B,OAAO;IAER,MAAM+E,uBAAuB;QAC5B,MAAM3D,IAAgB;YACrBhJ,OAAO;YACP7E,MAAM;YACN8E,QAAQ;YACRC,OAAO;YACPE,OAAO,CAACC,MAAMC,aAAaC,MAAMC;gBAChC,MAAMkH,IAAIrH,KAAKK,KAAK,CAACD,GAAG,CAACE,QAAQ;gBACjC,IAAIC,aAAaL;gBACjB,IAAIM,WAAWL;gBACf,IAAII,aAAa,KAAK8G,CAAC,CAAC9G,aAAa,EAAE,KAAK,KAAKA;gBACjD,IAAIC,WAAW6G,EAAEzL,MAAM,IAAIyL,CAAC,CAAC7G,SAAS,KAAK,KAAKA;gBAChD,MAAMtB,OAAO;gBACbc,KAAKY,QAAQ,CAAC;oBACbC,SAAS;wBAAEX,MAAMK;wBAAYJ,IAAIK;wBAAUG,QAAQzB;oBAAK;oBACxD4B,WAAW;wBAAEC,QAAQR,aAAarB,KAAKtD,MAAM,GAAG;oBAAE;gBACnD;YACD;QACD;QACA+M,EAAEtH,IAAI,GAAG;QACT,OAAOsH;IACR;IAEA,IAAIlH;IACJ,IAAI5D,cAAc;QACjB,MAAM9B,WAAW,MAAM6B,gBAAgBsF,eAAerF,cAAc1D;QACpE,MAAMoS,WAAW,MAAMlK,iBAAiBxE,cAAc1D;QACtD,MAAMqH,QAAQ+K,WACX,CAACpQ,KAAoBmF,8BAA8BnF,MACnDmD;QACHmC,cAAcF,sBAAsBxF,UAAUyF;QAC9C,IAAI,CAACsE,2BAA2B5C,cAActH,MAAM,KAAK,GAAG;YAC3D6F,cAAc;gBAAC6K;mBAA2B7K;aAAY;QACvD;IACD,OAAO,IAAIyB,cAActH,MAAM,KAAK,GAAG;QACtC,MAAM4Q,iBAAiB,MAAM5O,gBAC5BsF,eACA,kBACA/I;QAEDsH,cAAc;YACb6K;eACG/K,sBAAsBiL,gBAAgBlN;SACzC;IACF,OAAO;QACN,OAAO;IACR;IAEA,0DAA0D;IAC1D,MAAMmN,eAAe,IAAIxT,IAAIyM,IAAIM,QAAQ,CAAC,GAAG0G,OAAO;IACpDjL,cAAcA,YAAYvF,MAAM,CAAC,CAACyM,IAAM,CAAC8D,aAAarT,GAAG,CAACuP,EAAEhJ,KAAK;IAEjE,IAAI8B,YAAY7F,MAAM,KAAK,GAAG,OAAO;IAErC,MAAM0L,OAAOzB,kBAAkB0B,WAAW,CAAC;IAC3C,IAAIrH,OAAOoH,MAAMpH,QAAQ8D;IACzB,IAAI9D,OAAOE,IAAIxE,MAAM,IAAIwE,GAAG,CAACF,KAAK,KAAK,KAAKA;IAE5C,OAAO;QAAEA;QAAMiH,SAAS1F;QAAa+F,UAAU;IAAQ;AACxD;AAEA,0EAA0E;AAE1E,wCAAwC,GACxC,OAAO,SAASmF,qBACfxS,MAA+B,EAC/BwL,gBAAyB,EACzBC,cAA+B;IAE/B,OAAO,OAAOgH;QACb,MAAMlH,MAAM7M,yBAAyB+T,GAAGvM,KAAK,CAACD,GAAG,CAACE,QAAQ,IAAIsM,GAAG5I,GAAG;QACpE,OAAOyB,aAAaC,KAAKvL,QAAQwL,kBAAkBC,gBAAgBgH;IACpE;AACD;AAUA,eAAeC,uBACdC,UAA0B,EAC1B3S,MAA+B;IAE/B,MAAM4S,SAAS,IAAItT;IAInB,KAAK,MAAMuT,QAAQF,WAAY;QAC9B,MAAM1S,MAAM,GAAG4S,KAAKnP,YAAY,CAAC,CAAC,EAAEmP,KAAKtR,IAAI,CAAC+D,IAAI,CAAC,MAAM;QACzD,IAAIwN,QAAQF,OAAO1S,GAAG,CAACD;QACvB,IAAI,CAAC6S,OAAO;YACXA,QAAQ;gBACPpP,cAAcmP,KAAKnP,YAAY;gBAC/BnC,MAAM;uBAAIsR,KAAKtR,IAAI;iBAAC;gBACpBwR,OAAO,EAAE;YACV;YACAH,OAAOtS,GAAG,CAACL,KAAK6S;QACjB;QACAA,MAAMC,KAAK,CAACvP,IAAI,CAACqP;IAClB;IAEA,MAAMG,cAAgC,EAAE;IAExC,KAAK,MAAM,EAAEtP,YAAY,EAAEnC,IAAI,EAAEwR,KAAK,EAAE,IAAIH,OAAOK,MAAM,GAAI;QAC5D,MAAMrR,WAAW,MAAM6B,gBAAgBlC,MAAMmC,cAAc1D;QAC3D,IAAI4B,SAASH,MAAM,KAAK,GAAG;QAE3B,MAAMyR,aAAa,IAAIpU;QACvB,KAAK,MAAMkD,MAAMJ,SAAU;YAC1B,MAAMU,OAAOjB,UAAUW;YACvBkR,WAAWvC,GAAG,CAACrO;YACf,MAAMtD,WAAWgD,GAAGrB,IAAI,EAAE,CAAC,EAAE,EAAEkC;YAC/B,IAAIb,GAAGrB,IAAI,EAAEc,WAAW,KAAKzC,YAAYD,gBAAgBC,WAAW;gBACnEkU,WAAWvC,GAAG,CAAC,CAAC,CAAC,EAAErO,MAAM;YAC1B;QACD;QACA,IAAIf,KAAKE,MAAM,KAAK,GAAG;YACtByR,WAAWvC,GAAG,CAAC;QAChB;QAEA,KAAK,MAAMkC,QAAQE,MAAO;YACzB,IAAI,CAACG,WAAWjU,GAAG,CAAC4T,KAAKvQ,IAAI,GAAG;gBAC/B0Q,YAAYxP,IAAI,CAAC;oBAChBuC,MAAM8M,KAAK9M,IAAI;oBACfC,IAAI6M,KAAK7M,EAAE;oBACXmN,SAAS,CAAC,kBAAkB,EAAEN,KAAKvQ,IAAI,CAAC,CAAC,CAAC;gBAC3C;YACD;QACD;IACD;IAEA,OAAO0Q;AACR;AAEA,SAASI,0BACRpT,MAA+B,EAC/BwL,gBAAyB;IAEzB,OAAO/M,WAAW4U,MAAM,CAAC,CAACxN;QACzB,IAAIyN,UAAgD;QACpD,IAAIC,YAAY;QAEhB,SAASC;YACR,IAAI;gBACH,OAAO3N,KAAKK,KAAK,CAACuN,KAAK,CAACC,sBAAsBC,QAAQ,CAACC,IAAI,GAAG;YAC/D,EAAE,OAAM;gBACP,OAAO;YACR;QACD;QAEA,SAASC;YACR,IAAIP,SAASQ,aAAaR;YAC1B,MAAMS,QAAQP,yBAAyB,IAAI;YAC3CF,UAAUtM,WAAW,IAAMgN,SAASD;QACrC;QAEA,eAAeC;YACd,IAAIT,WAAW;YACf,MAAMU,aAAapO,KAAKK,KAAK,CAACD,GAAG,CAACE,QAAQ;YAC1C,MAAM+N,OACLlW,iBAAiB6H,KAAKK,KAAK,EAAEL,KAAKK,KAAK,CAACD,GAAG,CAACxE,MAAM,EAAE,SACpDxD,WAAW4H,KAAKK,KAAK;YAEtB,MAAM,EAAEyM,UAAU,EAAEwB,YAAY,EAAE,GAAGvV,mBACpCqV,YACAC,MACA1I,oBAAoB;YAGrB,IAAI,CAAC7M,mBAAmBsV,YAAYC,OAAO;gBAC1C,IAAI;oBACHrO,KAAKY,QAAQ,CAAC;wBAAE2N,SAASC,yBAAyBC,EAAE,CAAC,EAAE;oBAAE;gBAC1D,EAAE,OAAM;gBACP,kBAAkB,GACnB;gBACA;YACD;YAEA,IAAI3B,WAAWlR,MAAM,KAAK,KAAK0S,aAAa1S,MAAM,KAAK,GAAG;gBACzD,IAAI;oBACHoE,KAAKY,QAAQ,CAAC;wBAAE2N,SAASC,yBAAyBC,EAAE,CAAC,EAAE;oBAAE;gBAC1D,EAAE,OAAM;gBACP,kBAAkB,GACnB;gBACA;YACD;YAEA,MAAMC,WAAW,MAAM7B,uBAAuBC,YAAY3S;YAC1D,IAAIuT,WAAW;YACf,IAAI1N,KAAKK,KAAK,CAACD,GAAG,CAACE,QAAQ,OAAO8N,YAAY;YAE9C,KAAK,MAAMO,MAAML,aAAc;gBAC9BI,SAAS/Q,IAAI,CAAC;oBACbuC,MAAMyO,GAAGzO,IAAI;oBACbC,IAAIwO,GAAGxO,EAAE;oBACTmN,SAAS;gBACV;YACD;YAEA,MAAMsB,QAAkCF,SAASlP,GAAG,CAAC,CAAC6H,IAAO,CAAA;oBAC5D,GAAGA,CAAC;oBACJrG,MAAMhB,KAAKK,KAAK,CAACD,GAAG,CAACa,MAAM,CAACoG,EAAEnH,IAAI,EAAE2O,MAAM;gBAC3C,CAAA;YAEA,IAAI;gBACH7O,KAAKY,QAAQ,CAAC;oBAAE2N,SAASC,yBAAyBC,EAAE,CAACG;gBAAO;YAC7D,EAAE,OAAM;YACP,kBAAkB,GACnB;QACD;QAEAZ;QAEA,OAAO;YACNc,QAAOA,MAAkB;gBACxB,IAAIA,OAAOC,UAAU,EAAE;oBACtBf;gBACD;YACD;YACAgB;gBACCtB,YAAY;gBACZ,IAAID,SAASQ,aAAaR;YAC3B;QACD;IACD;AACD;AAMA,MAAMe,2BAA2BlW,YAAYkV,MAAM;AAEnD,MAAMyB,gBAAgBzW,WAAW0W,IAAI,CAAC;IAAEC,OAAO;AAA0B;AACzE,MAAMC,0BAA0B5W,WAAWwI,IAAI,CAAC;IAAEmO,OAAO;AAAe;AAExE,MAAME,yBAAyB3W;IAC9B4W,eAAe,qBAAqB;AACrC;AACA,MAAMC,mBAAmB,IAAIF;AAE7B,OAAO,MAAMxB,uBAAuBtV,WAAWiV,MAAM,CAKlD;IACFgC;QACC,OAAO;YACNC,OAAOjX,WAAWkX,IAAI;YACtBC,WAAWnX,WAAWkX,IAAI;YAC1BE,eAAevX,SAASwX,KAAK;YAC7B/B,UAAU,IAAIrU;QACf;IACD;IACAqV,QAAOgB,KAAK,EAAEC,EAAE;QACf,KAAK,MAAMC,UAAUD,GAAGxB,OAAO,CAAE;YAChC,IAAIyB,OAAOC,EAAE,CAACzB,2BAA2B;gBACxC,MAAMI,QAAQoB,OAAOF,KAAK;gBAC1B,IAAIlB,MAAMhT,MAAM,KAAK,GAAG;oBACvB,OAAO;wBACN6T,OAAOjX,WAAWkX,IAAI;wBACtBC,WAAWnX,WAAWkX,IAAI;wBAC1BE,eAAevX,SAASwX,KAAK;wBAC7B/B,UAAU,IAAIrU;oBACf;gBACD;gBAEA,MAAMgW,QAA2D,EAAE;gBACnE,MAAME,YAA+D,EAAE;gBACvE,MAAMO,SAA8D,EAAE;gBACtE,MAAMpC,WAAW,IAAIrU;gBAErB,KAAK,MAAM4N,KAAKuH,MAAO;oBACtBa,MAAM9R,IAAI,CAACsR,cAAckB,KAAK,CAAC9I,EAAEnH,IAAI,EAAEmH,EAAElH,EAAE;oBAC3C,MAAMiQ,WAAWtC,SAASzT,GAAG,CAACgN,EAAErG,IAAI;oBACpC,IAAIoP,UAAU;wBACbtC,SAASrT,GAAG,CAAC4M,EAAErG,IAAI,EAAE,GAAGoP,SAAS,EAAE,EAAE/I,EAAEiG,OAAO,EAAE;oBACjD,OAAO;wBACNQ,SAASrT,GAAG,CAAC4M,EAAErG,IAAI,EAAEqG,EAAEiG,OAAO;wBAC9B,MAAMtM,OAAO+O,GAAG1P,KAAK,CAACD,GAAG,CAACY,IAAI,CAACqG,EAAErG,IAAI;wBACrC2O,UAAUhS,IAAI,CAACyR,wBAAwBe,KAAK,CAACnP,KAAKd,IAAI;wBACtDgQ,OAAOvS,IAAI,CAAC4R,iBAAiBY,KAAK,CAACnP,KAAKd,IAAI;oBAC7C;gBACD;gBAEA,OAAO;oBACNuP,OAAOjX,WAAWiC,GAAG,CAACgV,OAAO;oBAC7BE,WAAWnX,WAAWiC,GAAG,CAACkV,WAAW;oBACrCC,eAAevX,SAASoW,EAAE,CAACyB,QAAQ;oBACnCpC;gBACD;YACD;QACD;QACA,IAAIiC,GAAGhB,UAAU,EAAE;YAClB,IAAI;gBACH,OAAO;oBACNU,OAAOK,MAAML,KAAK,CAACjQ,GAAG,CAACuQ,GAAGlP,OAAO;oBACjC8O,WAAWG,MAAMH,SAAS,CAACnQ,GAAG,CAACuQ,GAAGlP,OAAO;oBACzC+O,eAAeE,MAAMF,aAAa,CAACpQ,GAAG,CAACuQ,GAAGlP,OAAO;oBACjDiN,UAAUgC,MAAMhC,QAAQ;gBACzB;YACD,EAAE,OAAM;gBACP,OAAO;oBACN2B,OAAOjX,WAAWkX,IAAI;oBACtBC,WAAWnX,WAAWkX,IAAI;oBAC1BE,eAAevX,SAASwX,KAAK;oBAC7B/B,UAAU,IAAIrU;gBACf;YACD;QACD;QACA,OAAOqW;IACR;IACAO,SAAQzC,KAAK;QACZ,OAAO;YACNnV,WAAW6X,WAAW,CAACpQ,IAAI,CAAC0N,OAAO,CAACrF,IAAMA,EAAEkH,KAAK;YACjDhX,WAAW6X,WAAW,CAACpQ,IAAI,CAAC0N,OAAO,CAACrF,IAAMA,EAAEoH,SAAS;YACrDhX,gBAAgBuH,IAAI,CAAC0N,OAAO,CAACrF,IAAMA,EAAEqH,aAAa;SAClD;IACF;AACD,GAAG;AAEH,MAAMW,kBAAkB9X,WAAW+X,KAAK,CAAC;IACxC,4BAA4B;QAC3BC,oBAAoB;QACpBC,qBAAqB;QACrBC,qBAAqB;QACrBC,qBAAqB;IACtB;IACA,wDAAwD;QACvDC,OAAO;QACPC,iBACC;IACF;AACD;AAEA,0EAA0E;AAE1E,OAAO,SAASC,6BACf5W,MAA+B,EAC/BwL,gBAAyB,EACzBC,cAA+B;IAE/B,MAAMoL,aAAarE,qBAClBxS,QACAwL,kBACAC;IAGD,MAAMqL,cAAcxY,WAAWyY,cAAc,CAACzC,EAAE,CAAC,CAACK;QACjD,IAAI,CAACA,OAAOC,UAAU,EAAE;QACxB,IAAI/W,iBAAiB8W,OAAO9O,IAAI,CAACK,KAAK,GAAG;QACzC,MAAM,EAAEA,KAAK,EAAE,GAAGyO,OAAO9O,IAAI;QAC7B,MAAMgE,MAAM3D,MAAMS,SAAS,CAAC4G,IAAI,CAACC,IAAI;QACrC,MAAMvH,MAAMC,MAAMD,GAAG,CAACE,QAAQ;QAC9B,MAAMU,OAAOX,MAAMD,GAAG,CAACa,MAAM,CAAC+C;QAC9B,MAAMmI,eAAenL,KAAK9B,IAAI,CAAC7C,KAAK,CAAC,GAAG2H,MAAMhD,KAAKd,IAAI,EAAEkM,SAAS;QAClE,8DAA8D;QAC9D,wDAAwD;QACxD,MAAM+E,gBACLhF,iBAAiB,MAChBnI,MAAM,KAAK5D,GAAG,CAAC4D,MAAM,EAAE,KAAK,OAC5BA,MAAM,KAAK5D,GAAG,CAAC4D,MAAM,EAAE,KAAK,OAAOA,MAAM,KAAK5D,GAAG,CAAC4D,MAAM,EAAE,KAAK;QACjE,IAAI,CAACmN,eAAe;QACpB,gEAAgE;QAChE,iEAAiE;QACjE,IAAIC,gBAAgB;QACpBtC,OAAOjO,OAAO,CAACwQ,WAAW,CAAC,CAACC,KAAKC,KAAKC,KAAKC,KAAKxJ;YAC/CmJ,iBAAiBnJ,IAAIrM,MAAM;QAC5B;QACA,IAAIwV,gBAAgBhR,IAAIxE,MAAM,GAAG,KAAK;QACtCuF,WAAW,IAAMlJ,gBAAgB6W,OAAO9O,IAAI,GAAG;IAChD;IAEA,OAAO;QACN9H,aAAawZ,IAAI,CAACjD,EAAE,CAAC;YAAEkD,cAAcX;QAAW;QAChDC;QACApD;QACA0C;QACAhD,0BAA0BpT,QAAQwL;KAClC;AACF"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/code-editor/fhir-autocomplete.ts"],"sourcesContent":["import {\n\ttype Completion,\n\ttype CompletionContext,\n\ttype CompletionResult,\n\ttype CompletionSource,\n\tcompletionStatus,\n\tstartCompletion,\n} from \"@codemirror/autocomplete\";\nimport { jsonLanguage } from \"@codemirror/lang-json\";\nimport { ensureSyntaxTree, syntaxTree } from \"@codemirror/language\";\nimport {\n\ttype Extension,\n\tRangeSet,\n\tStateEffect,\n\tStateField,\n} from \"@codemirror/state\";\nimport {\n\tDecoration,\n\tEditorView,\n\tGutterMarker,\n\tgutterLineClass,\n\tViewPlugin,\n\ttype ViewUpdate,\n} from \"@codemirror/view\";\nimport {\n\tbuildJsonDocumentContext,\n\ttype DocumentContext,\n\tfindRootJsonObject,\n\ttype PropertyInfo,\n\twalkJsonProperties,\n} from \"./json-ast\";\n\n// ── Types ──────────────────────────────────────────────────────────────\n\ninterface FhirElementType {\n\tcode: string;\n\tprofile?: string[];\n\ttargetProfile?: string[];\n}\n\ninterface FhirElement {\n\tpath: string;\n\tshort?: string;\n\tdefinition?: string;\n\tmin?: number;\n\tmax?: string;\n\ttype?: FhirElementType[];\n\tbinding?: { valueSet: string; strength: string };\n\tcontentReference?: string;\n\tsliceName?: string;\n\tfixedUri?: string;\n\tfixedString?: string;\n\tfixedCode?: string;\n}\n\ninterface StructureDefinition {\n\ttype: string;\n\turl?: string;\n\tname?: string;\n\tbaseDefinition?: string;\n\tcontext?: { expression: string; type: string }[];\n\tdifferential?: { element: FhirElement[] };\n}\n\nexport interface StructureDefinitionSearchParams {\n\ttype?: string;\n\turl?: string;\n\tderivation?: string;\n\t\"derivation:missing\"?: string;\n\tkind?: string;\n\t_count?: string;\n\t_elements?: string;\n\t_ilike?: string;\n}\n\nexport type GetStructureDefinitions = (\n\tparams: StructureDefinitionSearchParams,\n) => Promise<StructureDefinition[]>;\n\nexport type ExpandValueSet = (\n\turl: string,\n\tfilter: string,\n) => Promise<{ code: string; display?: string; system?: string }[]>;\n\n// ── Constants ──────────────────────────────────────────────────────────\n\nconst PRIMITIVE_TYPES = new Set([\n\t\"boolean\",\n\t\"integer\",\n\t\"string\",\n\t\"decimal\",\n\t\"uri\",\n\t\"url\",\n\t\"canonical\",\n\t\"base64Binary\",\n\t\"instant\",\n\t\"date\",\n\t\"dateTime\",\n\t\"time\",\n\t\"code\",\n\t\"oid\",\n\t\"id\",\n\t\"markdown\",\n\t\"unsignedInt\",\n\t\"positiveInt\",\n\t\"uuid\",\n\t\"xhtml\",\n]);\n\nfunction isPrimitiveType(typeCode: string): boolean {\n\treturn (\n\t\tPRIMITIVE_TYPES.has(typeCode) ||\n\t\ttypeCode.startsWith(\"http://hl7.org/fhirpath/System.\")\n\t);\n}\n\nconst FHIR_STRING_TYPES = new Set([\n\t\"string\",\n\t\"code\",\n\t\"uri\",\n\t\"url\",\n\t\"canonical\",\n\t\"id\",\n\t\"markdown\",\n\t\"oid\",\n\t\"uuid\",\n\t\"base64Binary\",\n\t\"xhtml\",\n\t\"http://hl7.org/fhirpath/System.String\",\n]);\n\nconst FHIR_NUMBER_TYPES = new Set([\n\t\"boolean\",\n\t\"integer\",\n\t\"decimal\",\n\t\"positiveInt\",\n\t\"unsignedInt\",\n\t\"http://hl7.org/fhirpath/System.Boolean\",\n\t\"http://hl7.org/fhirpath/System.Integer\",\n\t\"http://hl7.org/fhirpath/System.Decimal\",\n]);\n\n// ── Cache ──────────────────────────────────────────────────────────────\n\nconst sdCache = new Map<string, StructureDefinition | null>();\nconst pendingRequests = new Map<string, Promise<StructureDefinition | null>>();\nconst listCache = new Map<string, StructureDefinition[]>();\nconst pendingListRequests = new Map<string, Promise<StructureDefinition[]>>();\n\nconst SD_ELEMENTS = \"differential,type,name,baseDefinition,url,context\";\n\nfunction cacheKey(params: StructureDefinitionSearchParams): string {\n\treturn JSON.stringify(params);\n}\n\nasync function getCachedSDList(\n\tparams: StructureDefinitionSearchParams,\n\tgetSDs: GetStructureDefinitions,\n): Promise<StructureDefinition[]> {\n\tconst key = cacheKey(params);\n\tif (listCache.has(key)) return listCache.get(key) ?? [];\n\n\tlet pending = pendingListRequests.get(key);\n\tif (!pending) {\n\t\tpending = getSDs(params)\n\t\t\t.then((list) => {\n\t\t\t\tlistCache.set(key, list);\n\t\t\t\tpendingListRequests.delete(key);\n\t\t\t\tfor (const sd of list) {\n\t\t\t\t\tif (sd.differential?.element) {\n\t\t\t\t\t\tsdCache.set(sd.type, sd);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn list;\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\tpendingListRequests.delete(key);\n\t\t\t\tlistCache.set(key, []);\n\t\t\t\treturn [];\n\t\t\t});\n\t\tpendingListRequests.set(key, pending);\n\t}\n\treturn pending;\n}\n\nasync function getCachedSD(\n\ttype: string,\n\tgetSDs: GetStructureDefinitions,\n): Promise<StructureDefinition | null> {\n\tif (sdCache.has(type)) return sdCache.get(type) ?? null;\n\n\tconst key = `single:${type}`;\n\tlet pending = pendingRequests.get(key);\n\tif (!pending) {\n\t\tconst isUrl = type.includes(\"/\");\n\t\tconst searchByType = (params: StructureDefinitionSearchParams) =>\n\t\t\tgetSDs(params).then((list) => list[0] ?? null);\n\n\t\tpending = (\n\t\t\tisUrl\n\t\t\t\t? searchByType({ url: type, _elements: SD_ELEMENTS, _count: \"1\" })\n\t\t\t\t: searchByType({\n\t\t\t\t\t\ttype,\n\t\t\t\t\t\tderivation: \"specialization\",\n\t\t\t\t\t\t_elements: SD_ELEMENTS,\n\t\t\t\t\t\t_count: \"1\",\n\t\t\t\t\t}).then(\n\t\t\t\t\t\t(sd) =>\n\t\t\t\t\t\t\tsd ??\n\t\t\t\t\t\t\tsearchByType({\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\t\"derivation:missing\": \"true\",\n\t\t\t\t\t\t\t\t_elements: SD_ELEMENTS,\n\t\t\t\t\t\t\t\t_count: \"1\",\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t)\n\t\t\t.then((sd) => {\n\t\t\t\tsdCache.set(type, sd);\n\t\t\t\tpendingRequests.delete(key);\n\t\t\t\treturn sd;\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\tpendingRequests.delete(key);\n\t\t\t\treturn null;\n\t\t\t});\n\t\tpendingRequests.set(key, pending);\n\t}\n\treturn pending;\n}\n\n// ── Element helpers ────────────────────────────────────────────────────\n\nfunction fieldName(element: FhirElement): string {\n\tconst parts = element.path.split(\".\");\n\treturn (parts[parts.length - 1] ?? \"\").replace(\"[x]\", \"\");\n}\n\nfunction directChildren(\n\telements: FhirElement[],\n\tparentPath: string,\n): FhirElement[] {\n\tconst prefix = `${parentPath}.`;\n\treturn elements.filter((el) => {\n\t\tif (!el.path.startsWith(prefix)) return false;\n\t\tconst rest = el.path.slice(prefix.length);\n\t\treturn !rest.includes(\".\");\n\t});\n}\n\nfunction findElement(\n\telements: FhirElement[],\n\tparentPath: string,\n\tkey: string,\n): FhirElement | undefined {\n\tconst direct = elements.find((el) => {\n\t\tif (!el.path.startsWith(`${parentPath}.`)) return false;\n\t\tconst name = fieldName(el);\n\t\treturn name === key || name.toLowerCase() === key.toLowerCase();\n\t});\n\tif (direct) return direct;\n\n\tfor (const el of elements) {\n\t\tif (!el.path.endsWith(\"[x]\")) continue;\n\t\tif (!el.path.startsWith(`${parentPath}.`)) continue;\n\t\tconst baseName = fieldName(el);\n\t\tif (!key.toLowerCase().startsWith(baseName.toLowerCase())) continue;\n\t\tconst typeSuffix = key.slice(baseName.length).toLowerCase();\n\t\tconst matchedType = el.type?.find(\n\t\t\t(t) => t.code.toLowerCase() === typeSuffix,\n\t\t);\n\t\tif (matchedType) {\n\t\t\treturn { ...el, type: [matchedType] };\n\t\t}\n\t}\n\treturn undefined;\n}\n\n// ── Resolve completions at path ────────────────────────────────────────\n\nasync function collectAllElements(\n\ttype: string,\n\tgetSDs: GetStructureDefinitions,\n): Promise<{ elements: FhirElement[]; basePath: string } | null> {\n\tconst sd = await getCachedSD(type, getSDs);\n\tif (!sd?.differential?.element) return null;\n\n\tconst elements = [...sd.differential.element];\n\n\tif (sd.baseDefinition) {\n\t\tconst base = await collectAllElements(sd.baseDefinition, getSDs);\n\t\tif (base) {\n\t\t\tfor (const baseEl of base.elements) {\n\t\t\t\tconst remappedPath = baseEl.path.replace(\n\t\t\t\t\tnew RegExp(`^${base.basePath}`),\n\t\t\t\t\tsd.type,\n\t\t\t\t);\n\t\t\t\tif (!elements.some((e) => e.path === remappedPath)) {\n\t\t\t\t\telements.push({ ...baseEl, path: remappedPath });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { elements, basePath: sd.type };\n}\n\nasync function resolveElements(\n\tpath: string[],\n\tresourceType: string,\n\tgetSDs: GetStructureDefinitions,\n): Promise<FhirElement[]> {\n\tconst result = await collectAllElements(resourceType, getSDs);\n\tif (!result) return [];\n\n\tlet currentPath = resourceType;\n\tlet currentElements = result.elements;\n\n\tfor (const key of path) {\n\t\tif (key === \"resourceType\") return [];\n\n\t\tconst el = findElement(currentElements, currentPath, key);\n\t\tif (!el) return [];\n\n\t\tif (el.contentReference) {\n\t\t\tcurrentPath = el.contentReference.replace(/^#/, \"\");\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!el.type?.[0]) return [];\n\t\tconst typeCode = el.type[0].code;\n\n\t\tif (typeCode === \"BackboneElement\") {\n\t\t\tcurrentPath = el.path;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst typeResult = await collectAllElements(typeCode, getSDs);\n\t\tif (!typeResult) return [];\n\t\tcurrentPath = typeResult.basePath;\n\t\tcurrentElements = typeResult.elements;\n\t}\n\n\tconst children = directChildren(currentElements, currentPath);\n\tconst expanded: FhirElement[] = [];\n\n\tfor (const el of children) {\n\t\tconst isChoiceType = el.path.endsWith(\"[x]\");\n\t\tif (isChoiceType && el.type && el.type.length > 0) {\n\t\t\tfor (const t of el.type) {\n\t\t\t\texpanded.push({\n\t\t\t\t\t...el,\n\t\t\t\t\tpath: el.path.replace(\n\t\t\t\t\t\t\"[x]\",\n\t\t\t\t\t\tt.code.charAt(0).toUpperCase() + t.code.slice(1),\n\t\t\t\t\t),\n\t\t\t\t\ttype: [t],\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\texpanded.push(el);\n\t\t}\n\t}\n\n\treturn expanded;\n}\n\nasync function findResourceBoundary(\n\tpath: string[],\n\tresourceType: string,\n\tgetSDs: GetStructureDefinitions,\n): Promise<number | null> {\n\tif (path.length === 0) return null;\n\n\tconst result = await collectAllElements(resourceType, getSDs);\n\tif (!result) return null;\n\n\tlet currentPath = resourceType;\n\tlet currentElements = result.elements;\n\n\tfor (let i = 0; i < path.length; i++) {\n\t\tconst key = path[i]!;\n\t\tif (key === \"resourceType\") return null;\n\n\t\tconst el = findElement(currentElements, currentPath, key);\n\t\tif (!el) return null;\n\n\t\tif (el.type?.some((t) => t.code === \"Resource\")) {\n\t\t\treturn i;\n\t\t}\n\n\t\tif (el.contentReference) {\n\t\t\tcurrentPath = el.contentReference.replace(/^#/, \"\");\n\t\t\tcontinue;\n\t\t}\n\t\tif (!el.type?.[0]) return null;\n\t\tconst typeCode = el.type[0].code;\n\t\tif (typeCode === \"BackboneElement\") {\n\t\t\tcurrentPath = el.path;\n\t\t\tcontinue;\n\t\t}\n\t\tconst typeResult = await collectAllElements(typeCode, getSDs);\n\t\tif (!typeResult) return null;\n\t\tcurrentPath = typeResult.basePath;\n\t\tcurrentElements = typeResult.elements;\n\t}\n\treturn null;\n}\n\n// ── Snippet & Completion Builders ──────────────────────────────────────\n\ntype SnippetKind =\n\t| \"array-complex\"\n\t| \"array-primitive\"\n\t| \"array-extension\"\n\t| \"object\"\n\t| \"string\"\n\t| \"number\"\n\t| \"bare\";\n\nfunction snippetKind(element: FhirElement): SnippetKind {\n\tconst isArray = element.max === \"*\";\n\tconst typeCode = element.type?.[0]?.code;\n\tif (!typeCode) {\n\t\tif (element.contentReference) return isArray ? \"array-complex\" : \"object\";\n\t\treturn \"bare\";\n\t}\n\tif (typeCode === \"Extension\" && isArray) return \"array-extension\";\n\tif (isArray)\n\t\treturn isPrimitiveType(typeCode) ? \"array-primitive\" : \"array-complex\";\n\tif (FHIR_NUMBER_TYPES.has(typeCode)) return \"number\";\n\tif (isPrimitiveType(typeCode)) return \"string\";\n\treturn \"object\";\n}\n\nfunction buildSnippet(\n\tname: string,\n\tkind: SnippetKind,\n\tindent: string,\n): { text: string; cursorOffset: number } {\n\tconst inner = `${indent} `;\n\tconst innerInner = `${inner} `;\n\tswitch (kind) {\n\t\tcase \"array-complex\": {\n\t\t\tconst text = `\"${name}\": [\\n${inner}{\\n${innerInner}\\n${inner}}\\n${indent}]`;\n\t\t\treturn {\n\t\t\t\ttext,\n\t\t\t\tcursorOffset: text.indexOf(innerInner) + innerInner.length,\n\t\t\t};\n\t\t}\n\t\tcase \"array-extension\": {\n\t\t\tconst text = `\"${name}\": [\\n${inner}{\\n${innerInner}\"url\": \"\"\\n${inner}}\\n${indent}]`;\n\t\t\treturn { text, cursorOffset: text.lastIndexOf('\"\"') + 1 };\n\t\t}\n\t\tcase \"array-primitive\": {\n\t\t\tconst text = `\"${name}\": [\\n${inner}\\n${indent}]`;\n\t\t\treturn { text, cursorOffset: text.indexOf(`${inner}\\n`) + inner.length };\n\t\t}\n\t\tcase \"object\": {\n\t\t\tconst text = `\"${name}\": {\\n${inner}\\n${indent}}`;\n\t\t\treturn { text, cursorOffset: text.indexOf(`${inner}\\n`) + inner.length };\n\t\t}\n\t\tcase \"string\": {\n\t\t\tconst text = `\"${name}\": \"\"`;\n\t\t\treturn { text, cursorOffset: text.length - 1 };\n\t\t}\n\t\tdefault: {\n\t\t\tconst text = `\"${name}\": `;\n\t\t\treturn { text, cursorOffset: text.length };\n\t\t}\n\t}\n}\n\nfunction toCompletion(element: FhirElement): Completion {\n\tconst name = fieldName(element);\n\tconst types = element.type?.map((t) => t.code).join(\" | \") ?? \"\";\n\tconst kind = snippetKind(element);\n\n\tconst completion: Completion = {\n\t\tlabel: name,\n\t\ttype: \"property\",\n\t\tdetail: types,\n\t\tboost: element.min && element.min > 0 ? 2 : 0,\n\t\tapply: (view, _completion, from, to) => {\n\t\t\tconst doc = view.state.doc.toString();\n\t\t\tlet actualFrom = from;\n\t\t\tlet actualTo = to;\n\t\t\tif (actualFrom > 0 && doc[actualFrom - 1] === '\"') actualFrom--;\n\t\t\tif (actualTo < doc.length && doc[actualTo] === '\"') actualTo++;\n\n\t\t\tconst afterName = doc.slice(actualTo).match(/^\\s*:/);\n\t\t\tif (afterName) {\n\t\t\t\tconst insert = `\"${name}\"`;\n\t\t\t\tview.dispatch({\n\t\t\t\t\tchanges: { from: actualFrom, to: actualTo, insert },\n\t\t\t\t\tselection: { anchor: actualFrom + insert.length },\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst line = view.state.doc.lineAt(actualFrom);\n\t\t\tconst lineText = line.text;\n\t\t\tconst indent = lineText.match(/^(\\s*)/)?.[1] ?? \"\";\n\n\t\t\tconst { text, cursorOffset } = buildSnippet(name, kind, indent);\n\n\t\t\tview.dispatch({\n\t\t\t\tchanges: { from: actualFrom, to: actualTo, insert: text },\n\t\t\t\tselection: { anchor: actualFrom + cursorOffset },\n\t\t\t});\n\n\t\t\tif (\n\t\t\t\tkind === \"string\" ||\n\t\t\t\tkind === \"number\" ||\n\t\t\t\tkind === \"array-primitive\" ||\n\t\t\t\tkind === \"array-extension\"\n\t\t\t) {\n\t\t\t\tsetTimeout(() => startCompletion(view), 0);\n\t\t\t}\n\t\t},\n\t};\n\tif (element.short) completion.info = element.short;\n\treturn completion;\n}\n\nfunction toParameterPropertyCompletion(element: FhirElement): Completion {\n\tconst name = fieldName(element);\n\tif (name !== \"parameter\" && name !== \"part\") return toCompletion(element);\n\n\tconst types = element.type?.map((t) => t.code).join(\" | \") ?? \"\";\n\tconst completion: Completion = {\n\t\tlabel: name,\n\t\ttype: \"property\",\n\t\tdetail: types,\n\t\tboost: element.min && element.min > 0 ? 2 : 0,\n\t\tapply: (view, _completion, from, to) => {\n\t\t\tconst doc = view.state.doc.toString();\n\t\t\tlet actualFrom = from;\n\t\t\tlet actualTo = to;\n\t\t\tif (actualFrom > 0 && doc[actualFrom - 1] === '\"') actualFrom--;\n\t\t\tif (actualTo < doc.length && doc[actualTo] === '\"') actualTo++;\n\n\t\t\tconst afterName = doc.slice(actualTo).match(/^\\s*:/);\n\t\t\tif (afterName) {\n\t\t\t\tconst insert = `\"${name}\"`;\n\t\t\t\tview.dispatch({\n\t\t\t\t\tchanges: { from: actualFrom, to: actualTo, insert },\n\t\t\t\t\tselection: { anchor: actualFrom + insert.length },\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst line = view.state.doc.lineAt(actualFrom);\n\t\t\tconst indent = line.text.match(/^(\\s*)/)?.[1] ?? \"\";\n\t\t\tconst inner = `${indent} `;\n\t\t\tconst innerInner = `${inner} `;\n\t\t\tconst text = `\"${name}\": [\\n${inner}{\\n${innerInner}\"name\": \"\"\\n${inner}}\\n${indent}]`;\n\t\t\tview.dispatch({\n\t\t\t\tchanges: { from: actualFrom, to: actualTo, insert: text },\n\t\t\t\tselection: { anchor: actualFrom + text.lastIndexOf('\"\"') + 1 },\n\t\t\t});\n\t\t\tsetTimeout(() => startCompletion(view), 0);\n\t\t},\n\t};\n\tif (element.short) completion.info = element.short;\n\treturn completion;\n}\n\nfunction elementsToCompletions(\n\telements: FhirElement[],\n\tmapFn: (el: FhirElement) => Completion,\n): Completion[] {\n\tconst completions: Completion[] = [];\n\tfor (const el of elements) {\n\t\tcompletions.push(mapFn(el));\n\t\tconst name = fieldName(el);\n\t\tconst firstTypeCode = el.type?.[0]?.code;\n\t\tif (\n\t\t\tel.type?.length === 1 &&\n\t\t\tfirstTypeCode &&\n\t\t\tPRIMITIVE_TYPES.has(firstTypeCode)\n\t\t) {\n\t\t\tconst ext: Completion = {\n\t\t\t\tlabel: `_${name}`,\n\t\t\t\ttype: \"property\",\n\t\t\t\tdetail: \"Element\",\n\t\t\t\tboost: -1,\n\t\t\t};\n\t\t\text.info = \"Primitive element extension\";\n\t\t\tcompletions.push(ext);\n\t\t}\n\t}\n\treturn completions;\n}\n\n// ── Extension helpers ──────────────────────────────────────────────────\n\ninterface ExtensionInfo {\n\turl: string;\n\tname?: string | undefined;\n\tisNested: boolean;\n\tvalueTypes: string[];\n\tslices: { sliceName: string; fixedUri: string; short?: string | undefined }[];\n}\n\nfunction analyzeExtensionSD(sd: StructureDefinition): ExtensionInfo | null {\n\tif (!sd.differential?.element) return null;\n\tconst elements = sd.differential.element;\n\n\tconst valueEl = elements.find((e) => e.path === \"Extension.value[x]\");\n\tconst isNested = valueEl?.max === \"0\";\n\tconst valueTypes = isNested ? [] : (valueEl?.type?.map((t) => t.code) ?? []);\n\n\tconst slices: ExtensionInfo[\"slices\"] = [];\n\tfor (const el of elements) {\n\t\tif (el.path === \"Extension.extension\" && el.sliceName) {\n\t\t\tconst sliceName = el.sliceName;\n\t\t\tconst urlEl = elements.find(\n\t\t\t\t(e) =>\n\t\t\t\t\te.path === \"Extension.extension.url\" &&\n\t\t\t\t\te.fixedUri &&\n\t\t\t\t\telements.indexOf(e) > elements.indexOf(el),\n\t\t\t);\n\t\t\tconst fixedUri = urlEl?.fixedUri ?? sliceName;\n\t\t\tslices.push({ sliceName, fixedUri, short: el.short });\n\t\t}\n\t}\n\n\treturn {\n\t\turl: sd.url ?? sd.type,\n\t\tname: sd.name,\n\t\tisNested,\n\t\tvalueTypes,\n\t\tslices,\n\t};\n}\n\n// ── Parameters slice helpers ────────────────────────────────────────────\n\nconst parametersTypeCache = new Map<string, boolean>();\n\nasync function isParametersType(\n\tresourceType: string,\n\tgetSDs: GetStructureDefinitions,\n): Promise<boolean> {\n\tif (resourceType === \"Parameters\") return true;\n\tif (parametersTypeCache.has(resourceType))\n\t\treturn parametersTypeCache.get(resourceType)!;\n\n\tconst sd = await getCachedSD(resourceType, getSDs);\n\tif (!sd?.baseDefinition) {\n\t\tparametersTypeCache.set(resourceType, false);\n\t\treturn false;\n\t}\n\tconst baseType = sd.baseDefinition.split(\"/\").pop()?.split(\"|\")[0] ?? \"\";\n\tconst result = await isParametersType(baseType, getSDs);\n\tparametersTypeCache.set(resourceType, result);\n\treturn result;\n}\n\ninterface ParameterSlice {\n\tsliceName: string;\n\tfixedName: string;\n\tmin: number;\n\tmax: string;\n\tvalueTypes: string[];\n\tshort?: string;\n}\n\nasync function getParameterSlices(\n\tprofileUrls: string[],\n\tgetSDs: GetStructureDefinitions,\n): Promise<ParameterSlice[]> {\n\tconst slices: ParameterSlice[] = [];\n\n\tfor (const profileUrl of profileUrls) {\n\t\tconst sd = await getCachedSD(profileUrl, getSDs);\n\t\tif (!sd?.differential?.element) continue;\n\n\t\tconst elements = sd.differential.element;\n\t\t// Find the parameter path dynamically: \"X.parameter\" where X is the profile's type\n\t\tconst paramPath = `${sd.type}.parameter`;\n\n\t\tlet current: {\n\t\t\tsliceName: string;\n\t\t\tmin: number;\n\t\t\tmax: string;\n\t\t\tfixedName: string | null;\n\t\t\tvalueTypes: string[];\n\t\t\tshort: string | undefined;\n\t\t} | null = null;\n\n\t\tconst flush = () => {\n\t\t\tif (current?.fixedName) {\n\t\t\t\tconst s: ParameterSlice = {\n\t\t\t\t\tsliceName: current.sliceName,\n\t\t\t\t\tfixedName: current.fixedName,\n\t\t\t\t\tmin: current.min,\n\t\t\t\t\tmax: current.max,\n\t\t\t\t\tvalueTypes: current.valueTypes,\n\t\t\t\t};\n\t\t\t\tif (current.short != null) s.short = current.short;\n\t\t\t\tslices.push(s);\n\t\t\t}\n\t\t};\n\n\t\tfor (const el of elements) {\n\t\t\tif (el.path === paramPath && el.sliceName) {\n\t\t\t\tflush();\n\t\t\t\tcurrent = {\n\t\t\t\t\tsliceName: el.sliceName,\n\t\t\t\t\tmin: el.min ?? 0,\n\t\t\t\t\tmax: el.max ?? \"*\",\n\t\t\t\t\tfixedName: null,\n\t\t\t\t\tvalueTypes: [],\n\t\t\t\t\tshort: el.short,\n\t\t\t\t};\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!current) continue;\n\n\t\t\tif (el.path === `${paramPath}.name` && el.fixedString) {\n\t\t\t\tcurrent.fixedName = el.fixedString;\n\t\t\t}\n\t\t\tif (el.path === `${paramPath}.value[x]` && el.type) {\n\t\t\t\tcurrent.valueTypes = el.type.map((t) => t.code);\n\t\t\t}\n\t\t}\n\n\t\tflush();\n\t}\n\n\treturn slices;\n}\n\n// ── Fixed value helpers ────────────────────────────────────────────────\n\nasync function getFixedValues(\n\teffectivePath: string[],\n\tvalueKey: string,\n\tresourceType: string,\n\tprofileUrls: string[],\n\tgetSDs: GetStructureDefinitions,\n): Promise<string | null> {\n\tfor (const profileUrl of profileUrls) {\n\t\tconst sd = await getCachedSD(profileUrl, getSDs);\n\t\tif (!sd?.differential?.element) continue;\n\n\t\tconst fhirPath = `${resourceType}.${[...effectivePath, valueKey].join(\".\")}`;\n\t\tfor (const el of sd.differential.element) {\n\t\t\tif (el.path !== fhirPath) continue;\n\t\t\tif (el.fixedString != null) return el.fixedString;\n\t\t\tif (el.fixedUri != null) return el.fixedUri;\n\t\t\tif (el.fixedCode != null) return el.fixedCode;\n\t\t}\n\t}\n\treturn null;\n}\n\n/** @internal — exported for tests only */\nexport function buildParameterSnippet(\n\tname: string,\n\tvalueTypes: string[],\n\tindent: string,\n): { text: string; cursorOffset: number } {\n\tconst inner = `${indent} `;\n\n\tif (valueTypes.length === 1 && FHIR_STRING_TYPES.has(valueTypes[0]!)) {\n\t\tconst tc = valueTypes[0]!;\n\t\tconst vf = `value${tc.charAt(0).toUpperCase()}${tc.slice(1)}`;\n\t\tconst text = `{\\n${inner}\"name\": \"${name}\",\\n${inner}\"${vf}\": \"\"\\n${indent}}`;\n\t\treturn { text, cursorOffset: text.lastIndexOf('\"\"') + 1 };\n\t}\n\tif (valueTypes.length === 1 && FHIR_NUMBER_TYPES.has(valueTypes[0]!)) {\n\t\tconst tc = valueTypes[0]!;\n\t\tconst vf = `value${tc.charAt(0).toUpperCase()}${tc.slice(1)}`;\n\t\tconst text = `{\\n${inner}\"name\": \"${name}\",\\n${inner}\"${vf}\": \\n${indent}}`;\n\t\treturn {\n\t\t\ttext,\n\t\t\tcursorOffset: text.indexOf(`\"${vf}\": \\n`) + `\"${vf}\": `.length,\n\t\t};\n\t}\n\tif (valueTypes.length === 1) {\n\t\tconst tc = valueTypes[0]!;\n\t\tconst vf = `value${tc.charAt(0).toUpperCase()}${tc.slice(1)}`;\n\t\tconst innerInner = `${inner} `;\n\t\tconst text = `{\\n${inner}\"name\": \"${name}\",\\n${inner}\"${vf}\": {\\n${innerInner}\\n${inner}}\\n${indent}}`;\n\t\treturn {\n\t\t\ttext,\n\t\t\tcursorOffset:\n\t\t\t\ttext.indexOf(`${innerInner}\\n${inner}}`) + innerInner.length,\n\t\t};\n\t}\n\t// Default to valueString when no value type constraint\n\tconst text = `{\\n${inner}\"name\": \"${name}\",\\n${inner}\"valueString\": \"\"\\n${indent}}`;\n\tif (name === \"\") {\n\t\t// Generic template: cursor in name\n\t\treturn { text, cursorOffset: text.indexOf('\"\"') + 1 };\n\t}\n\treturn { text, cursorOffset: text.lastIndexOf('\"\"') + 1 };\n}\n\n// ── Binding & Reference Resolution ─────────────────────────────────────\n\nfunction buildFhirElementPath(\n\tresourceType: string,\n\tpath: string[],\n\tvalueKey: string,\n): string {\n\treturn `${resourceType}.${[...path, valueKey].join(\".\")}`;\n}\n\nasync function findProfileBinding(\n\tprofileUrls: string[],\n\tresourceType: string,\n\tpath: string[],\n\tvalueKey: string,\n\tgetSDs: GetStructureDefinitions,\n): Promise<string | null> {\n\tif (profileUrls.length === 0) return null;\n\n\tfor (const profileUrl of profileUrls) {\n\t\tconst sd = await getCachedSD(profileUrl, getSDs);\n\t\tif (!sd?.differential?.element) continue;\n\n\t\tconst directPath = buildFhirElementPath(resourceType, path, valueKey);\n\t\tfor (const el of sd.differential.element) {\n\t\t\tif (el.path === directPath && el.binding?.valueSet) {\n\t\t\t\treturn el.binding.valueSet;\n\t\t\t}\n\t\t}\n\n\t\tif (valueKey === \"code\") {\n\t\t\tfor (let i = path.length; i > 0; i--) {\n\t\t\t\tconst parentFhirPath = buildFhirElementPath(\n\t\t\t\t\tresourceType,\n\t\t\t\t\tpath.slice(0, i - 1),\n\t\t\t\t\tpath[i - 1]!,\n\t\t\t\t);\n\t\t\t\tfor (const el of sd.differential.element) {\n\t\t\t\t\tif (el.path === parentFhirPath && el.binding?.valueSet) {\n\t\t\t\t\t\treturn el.binding.valueSet;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn null;\n}\n\nasync function findExtensionBinding(\n\tdoc: string,\n\tpos: number,\n\tgetSDs: GetStructureDefinitions,\n): Promise<string | null> {\n\tconst textBefore = doc.slice(0, pos);\n\n\tconst urlMatches = [...textBefore.matchAll(/\"url\"\\s*:\\s*\"([^\"]+)\"/g)];\n\tif (urlMatches.length === 0) return null;\n\n\tfor (let i = urlMatches.length - 1; i >= 0; i--) {\n\t\tconst extUrl = urlMatches[i]![1]!;\n\t\tif (\n\t\t\t!extUrl.includes(\"StructureDefinition/\") &&\n\t\t\t!extUrl.includes(\"Extension\")\n\t\t) {\n\t\t\tconst parentUrlMatches = [\n\t\t\t\t...textBefore\n\t\t\t\t\t.slice(0, urlMatches[i]?.index)\n\t\t\t\t\t.matchAll(/\"url\"\\s*:\\s*\"([^\"]+)\"/g),\n\t\t\t];\n\t\t\tfor (let j = parentUrlMatches.length - 1; j >= 0; j--) {\n\t\t\t\tconst parentUrl = parentUrlMatches[j]![1]!;\n\t\t\t\tif (!parentUrl.includes(\"/\")) continue;\n\t\t\t\tconst parentSD = await getCachedSD(parentUrl, getSDs);\n\t\t\t\tif (!parentSD?.differential?.element) continue;\n\t\t\t\tlet inSlice = false;\n\t\t\t\tfor (const el of parentSD.differential.element) {\n\t\t\t\t\tif (el.path === \"Extension.extension\" && el.sliceName) {\n\t\t\t\t\t\tconst urlEl = parentSD.differential.element.find(\n\t\t\t\t\t\t\t(e) =>\n\t\t\t\t\t\t\t\te.path === \"Extension.extension.url\" &&\n\t\t\t\t\t\t\t\te.fixedUri &&\n\t\t\t\t\t\t\t\tparentSD.differential!.element.indexOf(e) >\n\t\t\t\t\t\t\t\t\tparentSD.differential!.element.indexOf(el),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif ((urlEl?.fixedUri ?? el.sliceName) === extUrl) {\n\t\t\t\t\t\t\tinSlice = true;\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (inSlice) break;\n\t\t\t\t\t}\n\t\t\t\t\tif (\n\t\t\t\t\t\tinSlice &&\n\t\t\t\t\t\tel.path === \"Extension.extension.value[x]\" &&\n\t\t\t\t\t\tel.binding?.valueSet\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn el.binding.valueSet;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (inSlice) break;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tconst sd = await getCachedSD(extUrl, getSDs);\n\t\tif (!sd?.differential?.element) continue;\n\t\tfor (const el of sd.differential.element) {\n\t\t\tif (el.path === \"Extension.value[x]\" && el.binding?.valueSet) {\n\t\t\t\treturn el.binding.valueSet;\n\t\t\t}\n\t\t}\n\t}\n\treturn null;\n}\n\nasync function findBindingForValue(\n\tpath: string[],\n\tvalueKey: string,\n\tresourceType: string,\n\tgetSDs: GetStructureDefinitions,\n\tprofileUrls: string[] = [],\n\tdoc?: string,\n\tpos?: number,\n): Promise<string | null> {\n\tif (doc != null && pos != null) {\n\t\tconst inExtension = path.some(\n\t\t\t(p) => p === \"extension\" || p === \"modifierExtension\",\n\t\t);\n\t\tif (inExtension) {\n\t\t\tconst extBinding = await findExtensionBinding(doc, pos, getSDs);\n\t\t\tif (extBinding) return extBinding;\n\t\t}\n\t}\n\n\tconst profileBinding = await findProfileBinding(\n\t\tprofileUrls,\n\t\tresourceType,\n\t\tpath,\n\t\tvalueKey,\n\t\tgetSDs,\n\t);\n\tif (profileBinding) return profileBinding;\n\n\tconst elements = await resolveElements(path, resourceType, getSDs);\n\tfor (const el of elements) {\n\t\tif (fieldName(el) === valueKey && el.binding?.valueSet) {\n\t\t\treturn el.binding.valueSet;\n\t\t}\n\t}\n\n\tif (valueKey === \"code\") {\n\t\tfor (let i = path.length; i > 0; i--) {\n\t\t\tconst parentElements = await resolveElements(\n\t\t\t\tpath.slice(0, i - 1),\n\t\t\t\tresourceType,\n\t\t\t\tgetSDs,\n\t\t\t);\n\t\t\tfor (const el of parentElements) {\n\t\t\t\tif (fieldName(el) === path[i - 1] && el.binding?.valueSet) {\n\t\t\t\t\treturn el.binding.valueSet;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn null;\n}\n\nasync function findCanonicalTargetType(\n\tpath: string[],\n\tarrayKey: string,\n\tresourceType: string,\n\tgetSDs: GetStructureDefinitions,\n): Promise<string | null> {\n\tconst elements = await resolveElements(path, resourceType, getSDs);\n\tfor (const el of elements) {\n\t\tif (fieldName(el) !== arrayKey) continue;\n\t\tif (el.max !== \"*\") continue;\n\t\tconst t = el.type?.[0];\n\t\tif (t?.code !== \"canonical\" || !t.targetProfile?.length) continue;\n\t\treturn t.targetProfile[0]?.split(\"/\").pop() ?? null;\n\t}\n\treturn null;\n}\n\nasync function resolveReferenceTargets(\n\tpath: string[],\n\tresourceType: string,\n\tgetSDs: GetStructureDefinitions,\n): Promise<string[] | null> {\n\tconst result = await collectAllElements(resourceType, getSDs);\n\tif (!result) return null;\n\n\tlet currentPath = resourceType;\n\tlet currentElements = result.elements;\n\n\tfor (let i = 0; i < path.length - 1; i++) {\n\t\tconst key = path[i]!;\n\t\tif (key === \"resourceType\") return null;\n\n\t\tconst el = findElement(currentElements, currentPath, key);\n\t\tif (!el) return null;\n\n\t\tif (el.contentReference) {\n\t\t\tcurrentPath = el.contentReference.replace(/^#/, \"\");\n\t\t\tcontinue;\n\t\t}\n\t\tif (!el.type?.[0]) return null;\n\t\tconst typeCode = el.type[0].code;\n\t\tif (typeCode === \"BackboneElement\") {\n\t\t\tcurrentPath = el.path;\n\t\t\tcontinue;\n\t\t}\n\t\tconst typeResult = await collectAllElements(typeCode, getSDs);\n\t\tif (!typeResult) return null;\n\t\tcurrentPath = typeResult.basePath;\n\t\tcurrentElements = typeResult.elements;\n\t}\n\n\tconst lastKey = path[path.length - 1];\n\tif (!lastKey) return null;\n\n\tconst el = findElement(currentElements, currentPath, lastKey);\n\tif (!el?.type) return null;\n\n\tconst targets: string[] = [];\n\tfor (const t of el.type) {\n\t\tif (t.code === \"Reference\" && t.targetProfile) {\n\t\t\tfor (const profile of t.targetProfile) {\n\t\t\t\tconst rt = profile.split(\"/\").pop();\n\t\t\t\tif (rt) targets.push(rt);\n\t\t\t}\n\t\t}\n\t}\n\treturn targets.length > 0 ? targets : null;\n}\n\n// ── Unified completion handler ─────────────────────────────────────────\n\nasync function fhirComplete(\n\tctx: DocumentContext,\n\tgetSDs: GetStructureDefinitions,\n\tresourceTypeHint: string | undefined,\n\texpandValueSet: ExpandValueSet | undefined,\n\tcompletionContext: CompletionContext,\n): Promise<CompletionResult | null> {\n\tconst { pos, doc } = ctx;\n\n\t// 1. Resolve context: resourceType, effectivePath, profileUrls\n\t// Search from root (outermost scope) inward to find the root resourceType.\n\t// If not found in doc, fall back to resourceTypeHint (derived from URL).\n\tlet resourceType: string | undefined;\n\tlet hasExplicitResourceType = false;\n\tlet rtScope = ctx.getScope(0);\n\tfor (let level = ctx.fullPath.length; level >= 0; level--) {\n\t\tconst s = ctx.getScope(level);\n\t\tconst rt = s.getString(\"resourceType\");\n\t\tif (rt) {\n\t\t\tresourceType = rt;\n\t\t\thasExplicitResourceType = true;\n\t\t\trtScope = s;\n\t\t\tbreak;\n\t\t}\n\t}\n\t// If no resourceType found in any scope, use hint.\n\t// If found only in an inner scope (not the root), still prefer hint for\n\t// boundary detection — the inner RT will be picked up via getScope later.\n\tif (!resourceType) {\n\t\tresourceType = resourceTypeHint;\n\t\trtScope = ctx.getScope(ctx.fullPath.length);\n\t} else if (resourceTypeHint && ctx.fullPath.length > 0) {\n\t\t// Check if the found RT is actually from an inner scope, not the root.\n\t\t// If the root scope has no RT but hint is available, use hint as the\n\t\t// outer RT so that findResourceBoundary can resolve the path correctly.\n\t\tconst rootRT = ctx.getScope(ctx.fullPath.length).getString(\"resourceType\");\n\t\tif (!rootRT) {\n\t\t\tresourceType = resourceTypeHint;\n\t\t\thasExplicitResourceType = false;\n\t\t}\n\t}\n\n\tlet effectivePath = ctx.fullPath;\n\tlet profileUrls: string[] = [];\n\n\t// Detect Resource-typed boundary (e.g. contained, Bundle.entry.resource)\n\tif (resourceType && effectivePath.length > 0) {\n\t\tconst boundaryIdx = await findResourceBoundary(\n\t\t\teffectivePath,\n\t\t\tresourceType,\n\t\t\tgetSDs,\n\t\t);\n\t\tif (boundaryIdx !== null) {\n\t\t\tconst innerPath = effectivePath.slice(boundaryIdx + 1);\n\t\t\tconst innerScope = ctx.getScope(innerPath.length);\n\t\t\tconst innerRT = innerScope.getString(\"resourceType\");\n\t\t\teffectivePath = innerPath;\n\t\t\tif (innerRT) {\n\t\t\t\tresourceType = innerRT;\n\t\t\t\thasExplicitResourceType = true;\n\t\t\t} else {\n\t\t\t\tresourceType = \"DomainResource\";\n\t\t\t\thasExplicitResourceType = false;\n\t\t\t}\n\t\t\tprofileUrls = innerScope.getStringArray(\"meta\", \"profile\");\n\t\t} else {\n\t\t\tprofileUrls = rtScope.getStringArray(\"meta\", \"profile\");\n\t\t}\n\t} else {\n\t\tprofileUrls = rtScope.getStringArray(\"meta\", \"profile\");\n\t}\n\n\t// 2. Handle cursor position kinds\n\tconst cp = ctx.cursorPosition;\n\n\tif (cp.kind === \"value\") {\n\t\treturn handleValueCompletion(\n\t\t\tcp.key,\n\t\t\teffectivePath,\n\t\t\tresourceType,\n\t\t\thasExplicitResourceType,\n\t\t\tprofileUrls,\n\t\t\tdoc,\n\t\t\tpos,\n\t\t\tgetSDs,\n\t\t\texpandValueSet,\n\t\t\tcompletionContext,\n\t\t\tctx,\n\t\t);\n\t}\n\n\tif (cp.kind === \"array-item\") {\n\t\treturn handleArrayItemCompletion(\n\t\t\tcp.parentKey,\n\t\t\teffectivePath,\n\t\t\tresourceType,\n\t\t\tdoc,\n\t\t\tpos,\n\t\t\tgetSDs,\n\t\t\tcompletionContext,\n\t\t\tprofileUrls,\n\t\t);\n\t}\n\n\tif (cp.kind === \"property\") {\n\t\t// Don't offer property completions inside arrays\n\t\tif (ctx.isInsideArray()) return null;\n\n\t\treturn handlePropertyCompletion(\n\t\t\teffectivePath,\n\t\t\tresourceType,\n\t\t\thasExplicitResourceType,\n\t\t\tdoc,\n\t\t\tpos,\n\t\t\tgetSDs,\n\t\t\tcompletionContext,\n\t\t\tctx,\n\t\t);\n\t}\n\n\treturn null;\n}\n\n// ── Value completion ───────────────────────────────────────────────────\n\nasync function handleValueCompletion(\n\tvalueKey: string,\n\teffectivePath: string[],\n\tresourceType: string | undefined,\n\t_hasExplicitResourceType: boolean,\n\tprofileUrls: string[],\n\tdoc: string,\n\tpos: number,\n\tgetSDs: GetStructureDefinitions,\n\texpandValueSet: ExpandValueSet | undefined,\n\tcompletionContext: CompletionContext,\n\tctx: DocumentContext,\n): Promise<CompletionResult | null> {\n\t// resourceType value\n\tif (valueKey === \"resourceType\") {\n\t\tconst sds = await getCachedSDList(\n\t\t\t{\n\t\t\t\tderivation: \"specialization\",\n\t\t\t\tkind: \"resource\",\n\t\t\t\t_elements: \"type\",\n\t\t\t\t_count: \"500\",\n\t\t\t},\n\t\t\tgetSDs,\n\t\t);\n\t\tconst options: Completion[] = sds.map((sd) => ({\n\t\t\tlabel: sd.type,\n\t\t\ttype: \"type\",\n\t\t\tapply: (view: EditorView, _c: Completion, from: number, to: number) => {\n\t\t\t\tconst d = view.state.doc.toString();\n\t\t\t\tlet actualTo = to;\n\t\t\t\tif (actualTo < d.length && d[actualTo] === '\"') actualTo++;\n\t\t\t\tview.dispatch({\n\t\t\t\t\tchanges: { from, to: actualTo, insert: `${sd.type}\"` },\n\t\t\t\t\tselection: { anchor: from + sd.type.length + 1 },\n\t\t\t\t});\n\t\t\t},\n\t\t}));\n\t\tif (options.length === 0) return null;\n\t\tconst word = completionContext.matchBefore(/[\\w]*/);\n\t\treturn { from: word?.from ?? pos, options, validFor: /^\\w*$/ };\n\t}\n\n\t// Parameters.parameter.name → slice names from profile\n\tif (\n\t\tvalueKey === \"name\" &&\n\t\tresourceType &&\n\t\teffectivePath.length > 0 &&\n\t\teffectivePath[effectivePath.length - 1] === \"parameter\" &&\n\t\t(await isParametersType(resourceType, getSDs))\n\t) {\n\t\tconst slices = await getParameterSlices(profileUrls, getSDs);\n\t\tif (slices.length > 0) {\n\t\t\tconst options: Completion[] = slices.map((slice) => ({\n\t\t\t\tlabel: slice.fixedName,\n\t\t\t\ttype: \"text\",\n\t\t\t\tdetail: slice.min > 0 ? \"required\" : \"optional\",\n\t\t\t\tboost: slice.min > 0 ? 2 : 0,\n\t\t\t\t...(slice.short ? { info: slice.short } : {}),\n\t\t\t\tapply: (view: EditorView, _c: Completion, from: number, to: number) => {\n\t\t\t\t\tconst d = view.state.doc.toString();\n\t\t\t\t\tlet actualTo = to;\n\t\t\t\t\tif (actualTo < d.length && d[actualTo] === '\"') actualTo++;\n\t\t\t\t\tview.dispatch({\n\t\t\t\t\t\tchanges: {\n\t\t\t\t\t\t\tfrom,\n\t\t\t\t\t\t\tto: actualTo,\n\t\t\t\t\t\t\tinsert: `${slice.fixedName}\"`,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tselection: { anchor: from + slice.fixedName.length + 1 },\n\t\t\t\t\t});\n\t\t\t\t\t// Auto-insert value[x] field based on slice type\n\t\t\t\t\tconst vTypes = slice.valueTypes;\n\t\t\t\t\tif (vTypes.length === 0) vTypes.push(\"string\");\n\t\t\t\t\tif (vTypes.length === 1) {\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tconst cp = view.state.selection.main.head;\n\t\t\t\t\t\t\tconst cd = view.state.doc.toString();\n\t\t\t\t\t\t\tconst after = cd.slice(cp);\n\t\t\t\t\t\t\tif (!/^\\s*\\n\\s*\\}/.test(after)) return;\n\t\t\t\t\t\t\tconst lineObj = view.state.doc.lineAt(cp);\n\t\t\t\t\t\t\tconst ind = lineObj.text.match(/^(\\s*)/)?.[1] ?? \"\";\n\t\t\t\t\t\t\tconst tc = vTypes[0]!;\n\t\t\t\t\t\t\tconst vf = `value${tc.charAt(0).toUpperCase()}${tc.slice(1)}`;\n\t\t\t\t\t\t\tlet ins: string;\n\t\t\t\t\t\t\tlet cOff: number;\n\t\t\t\t\t\t\tif (FHIR_STRING_TYPES.has(tc)) {\n\t\t\t\t\t\t\t\tins = `,\\n${ind}\"${vf}\": \"\"`;\n\t\t\t\t\t\t\t\tcOff = ins.length - 1;\n\t\t\t\t\t\t\t} else if (FHIR_NUMBER_TYPES.has(tc)) {\n\t\t\t\t\t\t\t\tins = `,\\n${ind}\"${vf}\": `;\n\t\t\t\t\t\t\t\tcOff = ins.length;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst inner = `${ind} `;\n\t\t\t\t\t\t\t\tins = `,\\n${ind}\"${vf}\": {\\n${inner}\\n${ind}}`;\n\t\t\t\t\t\t\t\tcOff = ins.indexOf(`${inner}\\n${ind}}`) + inner.length;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tview.dispatch({\n\t\t\t\t\t\t\t\tchanges: { from: cp, insert: ins },\n\t\t\t\t\t\t\t\tselection: { anchor: cp + cOff },\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tsetTimeout(() => startCompletion(view), 0);\n\t\t\t\t\t\t}, 10);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t}));\n\t\t\tconst word = completionContext.matchBefore(/[\\w]*/);\n\t\t\treturn { from: word?.from ?? pos, options, validFor: /^\\w*$/ };\n\t\t}\n\t}\n\n\t// Fixed value from profile (fixedString, fixedUri, fixedCode)\n\tif (resourceType && profileUrls.length > 0) {\n\t\tconst fixedVal = await getFixedValues(\n\t\t\teffectivePath,\n\t\t\tvalueKey,\n\t\t\tresourceType,\n\t\t\tprofileUrls,\n\t\t\tgetSDs,\n\t\t);\n\t\tif (fixedVal != null) {\n\t\t\tconst option: Completion = {\n\t\t\t\tlabel: fixedVal,\n\t\t\t\ttype: \"text\",\n\t\t\t\tboost: 10,\n\t\t\t\tapply: (view: EditorView, _c: Completion, from: number, to: number) => {\n\t\t\t\t\tconst d = view.state.doc.toString();\n\t\t\t\t\tlet actualTo = to;\n\t\t\t\t\tif (actualTo < d.length && d[actualTo] === '\"') actualTo++;\n\t\t\t\t\tview.dispatch({\n\t\t\t\t\t\tchanges: { from, to: actualTo, insert: `${fixedVal}\"` },\n\t\t\t\t\t\tselection: { anchor: from + fixedVal.length + 1 },\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst word = completionContext.matchBefore(/[\\w.:/-]*/);\n\t\t\treturn {\n\t\t\t\tfrom: word?.from ?? pos,\n\t\t\t\toptions: [option],\n\t\t\t\tvalidFor: /^[\\w.:/-]*$/,\n\t\t\t};\n\t\t}\n\t}\n\n\t// reference value\n\tif (valueKey === \"reference\" && resourceType) {\n\t\tconst targets = await resolveReferenceTargets(\n\t\t\teffectivePath,\n\t\t\tresourceType,\n\t\t\tgetSDs,\n\t\t);\n\t\tif (targets) {\n\t\t\tconst options: Completion[] = targets.map((rt) => ({\n\t\t\t\tlabel: `${rt}/`,\n\t\t\t\ttype: \"type\",\n\t\t\t\tapply: (view: EditorView, _c: Completion, from: number, to: number) => {\n\t\t\t\t\tview.dispatch({\n\t\t\t\t\t\tchanges: { from, to, insert: `${rt}/` },\n\t\t\t\t\t\tselection: { anchor: from + rt.length + 1 },\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t}));\n\t\t\tconst word = completionContext.matchBefore(/[\\w/]*/);\n\t\t\treturn { from: word?.from ?? pos, options, validFor: /^[\\w/]*$/ };\n\t\t}\n\t}\n\n\t// Extension URL value\n\tif (valueKey === \"url\") {\n\t\tconst lastSeg = ctx.fullPath[ctx.fullPath.length - 1];\n\t\tif (lastSeg === \"extension\" || lastSeg === \"modifierExtension\") {\n\t\t\treturn handleExtensionUrlCompletion(\n\t\t\t\teffectivePath,\n\t\t\t\tresourceType,\n\t\t\t\tprofileUrls,\n\t\t\t\tdoc,\n\t\t\t\tpos,\n\t\t\t\tgetSDs,\n\t\t\t\tcompletionContext,\n\t\t\t\tctx,\n\t\t\t);\n\t\t}\n\t}\n\n\t// Boolean value\n\tif (resourceType) {\n\t\tconst elements = await resolveElements(effectivePath, resourceType, getSDs);\n\t\tconst el = elements.find((e) => fieldName(e) === valueKey);\n\t\tif (el?.type?.length === 1 && el.type[0]?.code === \"boolean\") {\n\t\t\tconst word = completionContext.matchBefore(/[\\w]*/);\n\t\t\tconst options: Completion[] = [\"true\", \"false\"].map((v) => ({\n\t\t\t\tlabel: v,\n\t\t\t\ttype: \"keyword\",\n\t\t\t\tapply: (view: EditorView, _c: Completion, from: number, to: number) => {\n\t\t\t\t\tconst d = view.state.doc.toString();\n\t\t\t\t\tlet actualFrom = from;\n\t\t\t\t\tlet actualTo = to;\n\t\t\t\t\t// Remove surrounding quotes if present\n\t\t\t\t\tif (actualFrom > 0 && d[actualFrom - 1] === '\"') actualFrom--;\n\t\t\t\t\tif (actualTo < d.length && d[actualTo] === '\"') actualTo++;\n\t\t\t\t\tview.dispatch({\n\t\t\t\t\t\tchanges: { from: actualFrom, to: actualTo, insert: v },\n\t\t\t\t\t\tselection: { anchor: actualFrom + v.length },\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t}));\n\t\t\treturn { from: word?.from ?? pos, options, validFor: /^\\w*$/ };\n\t\t}\n\t}\n\n\t// Terminology binding\n\tif (\n\t\tvalueKey !== \"resourceType\" &&\n\t\tvalueKey !== \"reference\" &&\n\t\tvalueKey !== \"url\" &&\n\t\texpandValueSet &&\n\t\tresourceType\n\t) {\n\t\tconst valueSetUrl = await findBindingForValue(\n\t\t\teffectivePath,\n\t\t\tvalueKey,\n\t\t\tresourceType,\n\t\t\tgetSDs,\n\t\t\tprofileUrls,\n\t\t\tdoc,\n\t\t\tpos,\n\t\t);\n\t\tif (valueSetUrl) {\n\t\t\tconst quoteWord = completionContext.matchBefore(/\"[\\w-]*/);\n\t\t\tconst from = quoteWord?.from ?? pos;\n\t\t\tconst filter = quoteWord ? quoteWord.text.replace(/^\"/, \"\") : \"\";\n\t\t\ttry {\n\t\t\t\tconst codes = await expandValueSet(valueSetUrl, filter);\n\t\t\t\tif (codes.length > 0) {\n\t\t\t\t\tconst options: Completion[] = codes.map((c) => ({\n\t\t\t\t\t\tlabel: c.code,\n\t\t\t\t\t\t...(c.display ? { info: c.display } : {}),\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\tapply: (\n\t\t\t\t\t\t\tview: EditorView,\n\t\t\t\t\t\t\t_c: Completion,\n\t\t\t\t\t\t\tapplyFrom: number,\n\t\t\t\t\t\t\tapplyTo: number,\n\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\tconst d = view.state.doc.toString();\n\t\t\t\t\t\t\tlet actualFrom = applyFrom;\n\t\t\t\t\t\t\tlet actualTo = applyTo;\n\t\t\t\t\t\t\tif (d[actualFrom] === '\"') actualFrom++;\n\t\t\t\t\t\t\tif (actualTo < d.length && d[actualTo] === '\"') actualTo++;\n\t\t\t\t\t\t\tview.dispatch({\n\t\t\t\t\t\t\t\tchanges: {\n\t\t\t\t\t\t\t\t\tfrom: actualFrom,\n\t\t\t\t\t\t\t\t\tto: actualTo,\n\t\t\t\t\t\t\t\t\tinsert: `${c.code}\"`,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tselection: { anchor: actualFrom + c.code.length + 1 },\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t}));\n\t\t\t\t\treturn { from, options, filter: false };\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// expand failed\n\t\t\t}\n\t\t}\n\t}\n\n\treturn null;\n}\n\n// ── Extension URL completion ───────────────────────────────────────────\n\nasync function handleExtensionUrlCompletion(\n\t_effectivePath: string[],\n\tresourceType: string | undefined,\n\tprofileUrls: string[],\n\tdoc: string,\n\tpos: number,\n\tgetSDs: GetStructureDefinitions,\n\tcompletionContext: CompletionContext,\n\tctx: DocumentContext,\n): Promise<CompletionResult | null> {\n\t// Check for nested extension (parent has url)\n\tconst urlKeyPos = doc.lastIndexOf('\"url\"', pos);\n\tlet scanEnd = urlKeyPos !== -1 ? urlKeyPos : pos;\n\tfor (let i = scanEnd - 1; i >= 0; i--) {\n\t\tconst c = doc[i];\n\t\tif (c === \"{\") {\n\t\t\tscanEnd = i;\n\t\t\tbreak;\n\t\t}\n\t\tif (c === \"}\" || c === \"]\" || c === \"[\") break;\n\t}\n\tconst textBefore = doc.slice(0, scanEnd);\n\tlet parentExtUrl: string | null = null;\n\tlet depth = 0;\n\tlet inStr = false;\n\tlet esc = false;\n\tlet foundExtArray = false;\n\tfor (let i = textBefore.length - 1; i >= 0; i--) {\n\t\tconst ch = textBefore[i];\n\t\tif (esc) {\n\t\t\tesc = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"\\\\\") {\n\t\t\tesc = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === '\"') {\n\t\t\tinStr = !inStr;\n\t\t\tcontinue;\n\t\t}\n\t\tif (inStr) continue;\n\t\tif (ch === \"}\" || ch === \"]\") {\n\t\t\tdepth++;\n\t\t} else if (ch === \"[\") {\n\t\t\tif (depth === 0) {\n\t\t\t\tfoundExtArray = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdepth--;\n\t\t} else if (ch === \"{\") {\n\t\t\tif (depth === 0 && foundExtArray) {\n\t\t\t\tconst objText = textBefore.slice(i);\n\t\t\t\tconst urlMatch = objText.match(/^\\{[\\s\\S]*?\"url\"\\s*:\\s*\"([^\"]+)\"/);\n\t\t\t\tif (urlMatch?.[1]?.includes(\"/\")) {\n\t\t\t\t\tparentExtUrl = urlMatch[1];\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (depth === 0) break;\n\t\t\tdepth--;\n\t\t}\n\t}\n\n\tif (parentExtUrl) {\n\t\treturn handleNestedExtensionSlices(\n\t\t\tparentExtUrl,\n\t\t\tpos,\n\t\t\tgetSDs,\n\t\t\tcompletionContext,\n\t\t);\n\t}\n\n\tif (!resourceType) return null;\n\n\t// Top-level extension URL completions\n\tconst path = ctx.fullPath;\n\tconst contextTypes: string[] = [\n\t\tresourceType,\n\t\t\"DomainResource\",\n\t\t\"Resource\",\n\t\t\"Element\",\n\t];\n\tconst extIdx = path.lastIndexOf(\"extension\");\n\tif (extIdx > 0) {\n\t\tlet currentRT = resourceType;\n\t\tfor (let i = 0; i < extIdx; i++) {\n\t\t\tconst seg = path[i];\n\t\t\tif (!seg) break;\n\t\t\tconst elements = await resolveElements([], currentRT, getSDs);\n\t\t\tconst el = elements.find((e) => fieldName(e) === seg);\n\t\t\tif (el?.type?.[0]?.code && !isPrimitiveType(el.type[0].code))\n\t\t\t\tcurrentRT = el.type[0].code;\n\t\t\telse break;\n\t\t}\n\t\tif (currentRT !== resourceType) {\n\t\t\tcontextTypes.length = 0;\n\t\t\tcontextTypes.push(\n\t\t\t\tcurrentRT,\n\t\t\t\t\"Element\",\n\t\t\t\t`${resourceType}.${path.slice(0, extIdx).join(\".\")}`,\n\t\t\t);\n\t\t}\n\t}\n\n\t// Profile extensions\n\tconst profileExtUrls: string[] = [];\n\tif (contextTypes.includes(resourceType)) {\n\t\tfor (const pUrl of profileUrls) {\n\t\t\tconst profileSD = await getCachedSD(pUrl, getSDs);\n\t\t\tif (!profileSD?.differential?.element) continue;\n\t\t\tfor (const el of profileSD.differential.element) {\n\t\t\t\tfor (const t of el.type ?? []) {\n\t\t\t\t\tif (t.code === \"Extension\") {\n\t\t\t\t\t\tfor (const p of t.profile ?? []) {\n\t\t\t\t\t\t\tconst clean = p.includes(\"|\") ? p.slice(0, p.indexOf(\"|\")) : p;\n\t\t\t\t\t\t\tif (!profileExtUrls.includes(clean)) profileExtUrls.push(clean);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconst bareWord = completionContext.matchBefore(/[\\w.:/-]*/);\n\tconst filter = bareWord?.text ?? \"\";\n\tconst searchParams: StructureDefinitionSearchParams = {\n\t\ttype: \"Extension\",\n\t\tderivation: \"constraint\",\n\t\t_elements: \"url,context\",\n\t\t_count: \"500\",\n\t};\n\tif (filter) searchParams._ilike = filter;\n\tconst results = await getCachedSDList(searchParams, getSDs);\n\n\tconst containerType = contextTypes[0];\n\tconst fhirPath = contextTypes.find((c) => c.includes(\".\"));\n\tconst contextExts = results.filter((sd) =>\n\t\tsd.context?.some(\n\t\t\t(c) => c.type === \"element\" && contextTypes.includes(c.expression),\n\t\t),\n\t);\n\tconst seen = new Set<string>();\n\tconst allExts: { url: string; boost: number }[] = [];\n\tif (contextTypes.includes(resourceType)) {\n\t\tfor (const u of profileExtUrls) {\n\t\t\tif (!seen.has(u)) {\n\t\t\t\tseen.add(u);\n\t\t\t\tallExts.push({ url: u, boost: 20 });\n\t\t\t}\n\t\t}\n\t}\n\tfor (const sd of contextExts) {\n\t\tconst u = sd.url ?? sd.type;\n\t\tif (seen.has(u)) continue;\n\t\tseen.add(u);\n\t\tconst ctxExprs =\n\t\t\tsd.context\n\t\t\t\t?.filter((c) => c.type === \"element\")\n\t\t\t\t.map((c) => c.expression) ?? [];\n\t\tlet boost = 0;\n\t\tif (fhirPath && ctxExprs.includes(fhirPath)) boost = 15;\n\t\telse if (containerType && ctxExprs.includes(containerType)) boost = 10;\n\t\telse if (ctxExprs.includes(resourceType)) boost = 5;\n\t\telse if (ctxExprs.some((e) => e === \"DomainResource\" || e === \"Resource\"))\n\t\t\tboost = 2;\n\t\telse if (ctxExprs.includes(\"Element\")) boost = 1;\n\t\tallExts.push({ url: u, boost });\n\t}\n\tconst lf = filter.toLowerCase();\n\tconst filtered = (\n\t\tlf ? allExts.filter((e) => e.url.toLowerCase().includes(lf)) : allExts\n\t).sort((a, b) => b.boost - a.boost);\n\tif (filtered.length > 0) {\n\t\tconst options: Completion[] = filtered.map((ext) => ({\n\t\t\tlabel: ext.url,\n\t\t\ttype: \"text\",\n\t\t\tboost: ext.boost,\n\t\t\tapply: (\n\t\t\t\tview: EditorView,\n\t\t\t\t_c: Completion,\n\t\t\t\tapplyFrom: number,\n\t\t\t\tapplyTo: number,\n\t\t\t) => {\n\t\t\t\tconst d = view.state.doc.toString();\n\t\t\t\tlet actualTo = applyTo;\n\t\t\t\tif (actualTo < d.length && d[actualTo] === '\"') actualTo++;\n\t\t\t\tview.dispatch({\n\t\t\t\t\tchanges: { from: applyFrom, to: actualTo, insert: `${ext.url}\"` },\n\t\t\t\t\tselection: { anchor: applyFrom + ext.url.length + 1 },\n\t\t\t\t});\n\t\t\t\tsetTimeout(async () => {\n\t\t\t\t\tconst fullSD = await getCachedSD(ext.url, getSDs);\n\t\t\t\t\tif (!fullSD) return;\n\t\t\t\t\tconst extInfo = analyzeExtensionSD(fullSD);\n\t\t\t\t\tif (!extInfo) return;\n\t\t\t\t\tconst cursorPos = view.state.selection.main.head;\n\t\t\t\t\tconst curDoc = view.state.doc.toString();\n\t\t\t\t\tconst after = curDoc.slice(cursorPos);\n\t\t\t\t\tif (!/^\\s*\\n\\s*\\}/.test(after)) return;\n\t\t\t\t\tconst lineObj = view.state.doc.lineAt(cursorPos);\n\t\t\t\t\tconst ind = lineObj.text.match(/^(\\s*)/)?.[1] ?? \"\";\n\t\t\t\t\tlet ins: string;\n\t\t\t\t\tlet cOff: number;\n\t\t\t\t\tif (extInfo.isNested) {\n\t\t\t\t\t\tconst inner = `${ind} `;\n\t\t\t\t\t\tconst innerInner = `${inner} `;\n\t\t\t\t\t\tins = `,\\n${ind}\"extension\": [\\n${inner}{\\n${innerInner}\"url\": \"\"\\n${inner}}\\n${ind}]`;\n\t\t\t\t\t\tcOff = ins.lastIndexOf('\"\"') + 1;\n\t\t\t\t\t} else if (extInfo.valueTypes.length === 1) {\n\t\t\t\t\t\tconst tc = extInfo.valueTypes[0]!;\n\t\t\t\t\t\tconst vf = `value${tc.charAt(0).toUpperCase()}${tc.slice(1)}`;\n\t\t\t\t\t\tif (FHIR_STRING_TYPES.has(tc) || tc === \"code\") {\n\t\t\t\t\t\t\tins = `,\\n${ind}\"${vf}\": \"\"`;\n\t\t\t\t\t\t\tcOff = ins.length - 1;\n\t\t\t\t\t\t} else if (FHIR_NUMBER_TYPES.has(tc)) {\n\t\t\t\t\t\t\tins = `,\\n${ind}\"${vf}\": `;\n\t\t\t\t\t\t\tcOff = ins.length;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst inner = `${ind} `;\n\t\t\t\t\t\t\tins = `,\\n${ind}\"${vf}\": {\\n${inner}\\n${ind}}`;\n\t\t\t\t\t\t\tcOff = ins.indexOf(`${inner}\\n${ind}`) + inner.length;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tview.dispatch({\n\t\t\t\t\t\tchanges: { from: cursorPos, insert: ins },\n\t\t\t\t\t\tselection: { anchor: cursorPos + cOff },\n\t\t\t\t\t});\n\t\t\t\t\tsetTimeout(() => startCompletion(view), 0);\n\t\t\t\t}, 10);\n\t\t\t},\n\t\t}));\n\t\treturn { from: bareWord?.from ?? pos, options, filter: false };\n\t}\n\treturn null;\n}\n\nasync function handleNestedExtensionSlices(\n\tparentExtUrl: string,\n\tpos: number,\n\tgetSDs: GetStructureDefinitions,\n\tcompletionContext: CompletionContext,\n): Promise<CompletionResult | null> {\n\tconst parentSD = await getCachedSD(parentExtUrl, getSDs);\n\tif (!parentSD) return null;\n\tconst info = analyzeExtensionSD(parentSD);\n\tif (!info?.slices.length) return null;\n\n\tconst word = completionContext.matchBefore(/[\\w.:/-]*/);\n\tconst filter = word?.text.toLowerCase() ?? \"\";\n\tconst matching = filter\n\t\t? info.slices.filter(\n\t\t\t\t(s) =>\n\t\t\t\t\ts.fixedUri.toLowerCase().includes(filter) ||\n\t\t\t\t\t(s.short?.toLowerCase().includes(filter) ?? false),\n\t\t\t)\n\t\t: info.slices;\n\n\tconst options: Completion[] = matching.map((slice) => {\n\t\tconst sliceElements = parentSD.differential?.element ?? [];\n\t\tlet sliceValueTypes: string[] = [];\n\t\tlet inSl = false;\n\t\tfor (const el of sliceElements) {\n\t\t\tif (\n\t\t\t\tel.path === \"Extension.extension\" &&\n\t\t\t\tel.sliceName === slice.sliceName\n\t\t\t) {\n\t\t\t\tinSl = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (inSl && el.path === \"Extension.extension.value[x]\") {\n\t\t\t\tsliceValueTypes = el.type?.map((t) => t.code) ?? [];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (inSl && el.path === \"Extension.extension\" && el.sliceName) break;\n\t\t}\n\t\treturn {\n\t\t\tlabel: slice.fixedUri,\n\t\t\t...(slice.short ? { info: slice.short } : {}),\n\t\t\ttype: \"text\",\n\t\t\tapply: (view: EditorView, _c: Completion, from: number, to: number) => {\n\t\t\t\tconst d = view.state.doc.toString();\n\t\t\t\tlet actualTo = to;\n\t\t\t\tif (actualTo < d.length && d[actualTo] === '\"') actualTo++;\n\t\t\t\tview.dispatch({\n\t\t\t\t\tchanges: { from, to: actualTo, insert: `${slice.fixedUri}\"` },\n\t\t\t\t\tselection: { anchor: from + slice.fixedUri.length + 1 },\n\t\t\t\t});\n\t\t\t\tif (sliceValueTypes.length === 1) {\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tconst cp = view.state.selection.main.head;\n\t\t\t\t\t\tconst cd = view.state.doc.toString();\n\t\t\t\t\t\tconst af = cd.slice(cp);\n\t\t\t\t\t\tif (!/^\\s*\\n\\s*\\}/.test(af)) return;\n\t\t\t\t\t\tconst lo = view.state.doc.lineAt(cp);\n\t\t\t\t\t\tconst ind = lo.text.match(/^(\\s*)/)?.[1] ?? \"\";\n\t\t\t\t\t\tconst tc = sliceValueTypes[0]!;\n\t\t\t\t\t\tconst vf = `value${tc.charAt(0).toUpperCase()}${tc.slice(1)}`;\n\t\t\t\t\t\tlet ins: string;\n\t\t\t\t\t\tlet cOff: number;\n\t\t\t\t\t\tif (FHIR_STRING_TYPES.has(tc) || tc === \"code\") {\n\t\t\t\t\t\t\tins = `,\\n${ind}\"${vf}\": \"\"`;\n\t\t\t\t\t\t\tcOff = ins.length - 1;\n\t\t\t\t\t\t} else if (FHIR_NUMBER_TYPES.has(tc)) {\n\t\t\t\t\t\t\tins = `,\\n${ind}\"${vf}\": `;\n\t\t\t\t\t\t\tcOff = ins.length;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst inner = `${ind} `;\n\t\t\t\t\t\t\tins = `,\\n${ind}\"${vf}\": {\\n${inner}\\n${ind}}`;\n\t\t\t\t\t\t\tcOff = ins.indexOf(`${inner}\\n${ind}`) + inner.length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tview.dispatch({\n\t\t\t\t\t\t\tchanges: { from: cp, insert: ins },\n\t\t\t\t\t\t\tselection: { anchor: cp + cOff },\n\t\t\t\t\t\t});\n\t\t\t\t\t\tsetTimeout(() => startCompletion(view), 0);\n\t\t\t\t\t}, 10);\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t});\n\tif (options.length > 0)\n\t\treturn { from: word?.from ?? pos, options, filter: false };\n\treturn null;\n}\n\n// ── Array item completion ──────────────────────────────────────────────\n\nasync function handleArrayItemCompletion(\n\tparentKey: string,\n\teffectivePath: string[],\n\tresourceType: string | undefined,\n\t_doc: string,\n\tpos: number,\n\tgetSDs: GetStructureDefinitions,\n\tcompletionContext: CompletionContext,\n\tprofileUrls: string[],\n): Promise<CompletionResult | null> {\n\tif (!resourceType) return null;\n\n\t// Parameters.parameter or part → snippet completions from profile slices\n\tif (\n\t\t(parentKey === \"parameter\" || parentKey === \"part\") &&\n\t\t(await isParametersType(resourceType, getSDs))\n\t) {\n\t\tconst slices =\n\t\t\tparentKey === \"parameter\"\n\t\t\t\t? await getParameterSlices(profileUrls, getSDs)\n\t\t\t\t: [];\n\n\t\tconst options: Completion[] = [];\n\n\t\tfor (const slice of slices) {\n\t\t\toptions.push({\n\t\t\t\tlabel: slice.fixedName,\n\t\t\t\ttype: \"text\",\n\t\t\t\tdetail:\n\t\t\t\t\tslice.min > 0 ? `${slice.min}..${slice.max}` : `0..${slice.max}`,\n\t\t\t\tboost: slice.min > 0 ? 2 : 0,\n\t\t\t\t...(slice.short ? { info: slice.short } : {}),\n\t\t\t\tapply: (view: EditorView, _c: Completion, from: number, to: number) => {\n\t\t\t\t\tconst line = view.state.doc.lineAt(from);\n\t\t\t\t\tconst indent = line.text.match(/^(\\s*)/)?.[1] ?? \"\";\n\t\t\t\t\tconst { text, cursorOffset } = buildParameterSnippet(\n\t\t\t\t\t\tslice.fixedName,\n\t\t\t\t\t\tslice.valueTypes,\n\t\t\t\t\t\tindent,\n\t\t\t\t\t);\n\n\t\t\t\t\tview.dispatch({\n\t\t\t\t\t\tchanges: { from, to, insert: text },\n\t\t\t\t\t\tselection: { anchor: from + cursorOffset },\n\t\t\t\t\t});\n\t\t\t\t\tsetTimeout(() => startCompletion(view), 0);\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\t// Generic parameter template (always available)\n\t\toptions.push({\n\t\t\tlabel: \"parameter\",\n\t\t\ttype: \"text\",\n\t\t\tboost: -1,\n\t\t\tinfo: \"Custom parameter\",\n\t\t\tapply: (view: EditorView, _c: Completion, from: number, to: number) => {\n\t\t\t\tconst line = view.state.doc.lineAt(from);\n\t\t\t\tconst indent = line.text.match(/^(\\s*)/)?.[1] ?? \"\";\n\t\t\t\tconst { text, cursorOffset } = buildParameterSnippet(\"\", [], indent);\n\t\t\t\tview.dispatch({\n\t\t\t\t\tchanges: { from, to, insert: text },\n\t\t\t\t\tselection: { anchor: from + cursorOffset },\n\t\t\t\t});\n\t\t\t\tsetTimeout(() => startCompletion(view), 0);\n\t\t\t},\n\t\t});\n\n\t\tconst word = completionContext.matchBefore(/[\\w]*/);\n\t\treturn { from: word?.from ?? pos, options };\n\t}\n\n\t// Get path excluding the array key itself\n\tconst parentPath =\n\t\teffectivePath.length > 0 &&\n\t\teffectivePath[effectivePath.length - 1] === parentKey\n\t\t\t? effectivePath.slice(0, -1)\n\t\t\t: effectivePath;\n\n\tconst targetType = await findCanonicalTargetType(\n\t\tparentPath,\n\t\tparentKey,\n\t\tresourceType,\n\t\tgetSDs,\n\t);\n\tif (targetType === \"StructureDefinition\") {\n\t\tconst allSDs = await getCachedSDList(\n\t\t\t{\n\t\t\t\ttype: `${resourceType},DomainResource,Resource`,\n\t\t\t\tderivation: \"constraint\",\n\t\t\t\t_elements: \"url,name\",\n\t\t\t\t_count: \"50\",\n\t\t\t},\n\t\t\tgetSDs,\n\t\t);\n\t\tconst seen = new Set<string>();\n\t\tconst uniqueSDs = allSDs.filter((sd) => {\n\t\t\tconst u = sd.url ?? sd.type;\n\t\t\tif (seen.has(u)) return false;\n\t\t\tseen.add(u);\n\t\t\treturn true;\n\t\t});\n\t\tif (uniqueSDs.length > 0) {\n\t\t\tconst quoteWord = completionContext.matchBefore(/\"[^\"]*/);\n\t\t\tconst bareWord = completionContext.matchBefore(/[\\w.:/-]*/);\n\t\t\tconst from = quoteWord?.from ?? bareWord?.from ?? pos;\n\t\t\tconst filter = quoteWord\n\t\t\t\t? quoteWord.text.replace(/^\"/, \"\").toLowerCase()\n\t\t\t\t: (bareWord?.text.toLowerCase() ?? \"\");\n\t\t\tconst filtered = filter\n\t\t\t\t? uniqueSDs.filter(\n\t\t\t\t\t\t(sd) =>\n\t\t\t\t\t\t\tsd.name?.toLowerCase().includes(filter) ||\n\t\t\t\t\t\t\tsd.url?.toLowerCase().includes(filter),\n\t\t\t\t\t)\n\t\t\t\t: uniqueSDs;\n\t\t\tconst options: Completion[] = filtered.map((sd) => {\n\t\t\t\tconst url = sd.url ?? sd.type;\n\t\t\t\treturn {\n\t\t\t\t\tlabel: url,\n\t\t\t\t\t...(sd.name ? { info: sd.name } : {}),\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\tapply: (\n\t\t\t\t\t\tview: EditorView,\n\t\t\t\t\t\t_c: Completion,\n\t\t\t\t\t\tapplyFrom: number,\n\t\t\t\t\t\tapplyTo: number,\n\t\t\t\t\t) => {\n\t\t\t\t\t\tconst d = view.state.doc.toString();\n\t\t\t\t\t\tlet actualTo = applyTo;\n\t\t\t\t\t\tif (actualTo < d.length && d[actualTo] === '\"') actualTo++;\n\t\t\t\t\t\tview.dispatch({\n\t\t\t\t\t\t\tchanges: { from: applyFrom, to: actualTo, insert: `\"${url}\"` },\n\t\t\t\t\t\t\tselection: { anchor: applyFrom + url.length + 2 },\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t});\n\t\t\tif (options.length > 0) {\n\t\t\t\treturn { from, options, filter: false };\n\t\t\t}\n\t\t}\n\t}\n\tif (targetType) return null;\n\treturn null;\n}\n\n// ── Property completion ────────────────────────────────────────────────\n\nasync function handlePropertyCompletion(\n\teffectivePath: string[],\n\tresourceType: string | undefined,\n\thasExplicitResourceType: boolean,\n\tdoc: string,\n\tpos: number,\n\tgetSDs: GetStructureDefinitions,\n\tcompletionContext: CompletionContext,\n\tctx: DocumentContext,\n): Promise<CompletionResult | null> {\n\tconst line = completionContext.state.doc.lineAt(pos);\n\tconst beforeCursor = line.text.slice(0, pos - line.from).trimStart();\n\n\t// Only auto-trigger property completions when user has started typing\n\tif (\n\t\t!completionContext.explicit &&\n\t\t/,\\s*\"?\\s*$/.test(beforeCursor) &&\n\t\t!completionContext.matchBefore(/\\w+/)\n\t)\n\t\treturn null;\n\n\tconst makeJsonRtCompletion = (): Completion => {\n\t\tconst c: Completion = {\n\t\t\tlabel: \"resourceType\",\n\t\t\ttype: \"property\",\n\t\t\tdetail: \"string\",\n\t\t\tboost: 10,\n\t\t\tapply: (view, _completion, from, to) => {\n\t\t\t\tconst d = view.state.doc.toString();\n\t\t\t\tlet actualFrom = from;\n\t\t\t\tlet actualTo = to;\n\t\t\t\tif (actualFrom > 0 && d[actualFrom - 1] === '\"') actualFrom--;\n\t\t\t\tif (actualTo < d.length && d[actualTo] === '\"') actualTo++;\n\t\t\t\tconst text = '\"resourceType\": \"\"';\n\t\t\t\tview.dispatch({\n\t\t\t\t\tchanges: { from: actualFrom, to: actualTo, insert: text },\n\t\t\t\t\tselection: { anchor: actualFrom + text.length - 1 },\n\t\t\t\t});\n\t\t\t},\n\t\t};\n\t\tc.info = \"FHIR resource type\";\n\t\treturn c;\n\t};\n\n\tlet completions: Completion[];\n\tif (resourceType) {\n\t\tconst elements = await resolveElements(effectivePath, resourceType, getSDs);\n\t\tconst isParams = await isParametersType(resourceType, getSDs);\n\t\tconst mapFn = isParams\n\t\t\t? (el: FhirElement) => toParameterPropertyCompletion(el)\n\t\t\t: toCompletion;\n\t\tcompletions = elementsToCompletions(elements, mapFn);\n\t\tif (!hasExplicitResourceType && effectivePath.length === 0) {\n\t\t\tcompletions = [makeJsonRtCompletion(), ...completions];\n\t\t}\n\t} else if (effectivePath.length === 0) {\n\t\tconst domainElements = await resolveElements(\n\t\t\teffectivePath,\n\t\t\t\"DomainResource\",\n\t\t\tgetSDs,\n\t\t);\n\t\tcompletions = [\n\t\t\tmakeJsonRtCompletion(),\n\t\t\t...elementsToCompletions(domainElements, toCompletion),\n\t\t];\n\t} else {\n\t\treturn null;\n\t}\n\n\t// Filter out properties already present in current object\n\tconst existingKeys = new Set(ctx.getScope(0).getKeys());\n\tcompletions = completions.filter((c) => !existingKeys.has(c.label));\n\n\tif (completions.length === 0) return null;\n\n\tconst word = completionContext.matchBefore(/\"?\\w*/);\n\tlet from = word?.from ?? pos;\n\tif (from < doc.length && doc[from] === '\"') from++;\n\n\treturn { from, options: completions, validFor: /^\\w*$/ };\n}\n\n// ── Thin wrapper ───────────────────────────────────────────────────────\n\n/** @internal — exported for tests only */\nexport function jsonCompletionSource(\n\tgetSDs: GetStructureDefinitions,\n\tresourceTypeHint?: string,\n\texpandValueSet?: ExpandValueSet,\n): CompletionSource {\n\treturn async (cc: CompletionContext): Promise<CompletionResult | null> => {\n\t\tconst ctx = buildJsonDocumentContext(cc.state.doc.toString(), cc.pos);\n\t\treturn fhirComplete(ctx, getSDs, resourceTypeHint, expandValueSet, cc);\n\t};\n}\n\n// ── Validation ─────────────────────────────────────────────────────────\n\ntype FhirDiagnostic = {\n\tfrom: number;\n\tto: number;\n\tmessage: string;\n};\n\nasync function validateFhirProperties(\n\tproperties: PropertyInfo[],\n\tgetSDs: GetStructureDefinitions,\n): Promise<FhirDiagnostic[]> {\n\tconst groups = new Map<\n\t\tstring,\n\t\t{ resourceType: string; path: string[]; props: PropertyInfo[] }\n\t>();\n\tfor (const prop of properties) {\n\t\tconst key = `${prop.resourceType}|${prop.path.join(\".\")}`;\n\t\tlet group = groups.get(key);\n\t\tif (!group) {\n\t\t\tgroup = {\n\t\t\t\tresourceType: prop.resourceType,\n\t\t\t\tpath: [...prop.path],\n\t\t\t\tprops: [],\n\t\t\t};\n\t\t\tgroups.set(key, group);\n\t\t}\n\t\tgroup.props.push(prop);\n\t}\n\n\tconst diagnostics: FhirDiagnostic[] = [];\n\n\tfor (const { resourceType, path, props } of groups.values()) {\n\t\tconst elements = await resolveElements(path, resourceType, getSDs);\n\t\tif (elements.length === 0) continue;\n\n\t\tconst validNames = new Set<string>();\n\t\tfor (const el of elements) {\n\t\t\tconst name = fieldName(el);\n\t\t\tvalidNames.add(name);\n\t\t\tconst typeCode = el.type?.[0]?.code;\n\t\t\tif (el.type?.length === 1 && typeCode && isPrimitiveType(typeCode)) {\n\t\t\t\tvalidNames.add(`_${name}`);\n\t\t\t}\n\t\t}\n\t\tif (path.length === 0) {\n\t\t\tvalidNames.add(\"resourceType\");\n\t\t}\n\n\t\tfor (const prop of props) {\n\t\t\tif (!validNames.has(prop.name)) {\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\tfrom: prop.from,\n\t\t\t\t\tto: prop.to,\n\t\t\t\t\tmessage: `Unknown property \"${prop.name}\"`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\treturn diagnostics;\n}\n\nfunction buildFhirValidationPlugin(\n\tgetSDs: GetStructureDefinitions,\n\tresourceTypeHint?: string,\n): Extension {\n\treturn ViewPlugin.define((view) => {\n\t\tlet timeout: ReturnType<typeof setTimeout> | null = null;\n\t\tlet destroyed = false;\n\n\t\tfunction hasActiveDiagnostics() {\n\t\t\ttry {\n\t\t\t\treturn view.state.field(fhirDiagnosticsField).messages.size > 0;\n\t\t\t} catch {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfunction scheduleCheck() {\n\t\t\tif (timeout) clearTimeout(timeout);\n\t\t\tconst delay = hasActiveDiagnostics() ? 0 : 1500;\n\t\t\ttimeout = setTimeout(() => check(), delay);\n\t\t}\n\n\t\tasync function check() {\n\t\t\tif (destroyed) return;\n\t\t\tconst currentDoc = view.state.doc.toString();\n\t\t\tconst tree =\n\t\t\t\tensureSyntaxTree(view.state, view.state.doc.length, 1000) ??\n\t\t\t\tsyntaxTree(view.state);\n\n\t\t\tconst { properties, emptyStrings } = walkJsonProperties(\n\t\t\t\tcurrentDoc,\n\t\t\t\ttree,\n\t\t\t\tresourceTypeHint ?? null,\n\t\t\t);\n\n\t\t\tif (!findRootJsonObject(currentDoc, tree)) {\n\t\t\t\ttry {\n\t\t\t\t\tview.dispatch({ effects: setFhirDiagnosticsEffect.of([]) });\n\t\t\t\t} catch {\n\t\t\t\t\t/* view destroyed */\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (properties.length === 0 && emptyStrings.length === 0) {\n\t\t\t\ttry {\n\t\t\t\t\tview.dispatch({ effects: setFhirDiagnosticsEffect.of([]) });\n\t\t\t\t} catch {\n\t\t\t\t\t/* view destroyed */\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst rawDiags = await validateFhirProperties(properties, getSDs);\n\t\t\tif (destroyed) return;\n\t\t\tif (view.state.doc.toString() !== currentDoc) return;\n\n\t\t\t// for (const es of emptyStrings) {\n\t\t\t// \trawDiags.push({\n\t\t\t// \t\tfrom: es.from,\n\t\t\t// \t\tto: es.to,\n\t\t\t// \t\tmessage: \"Value must not be empty\",\n\t\t\t// \t});\n\t\t\t// }\n\n\t\t\tconst diags: FhirDiagnosticWithLine[] = rawDiags.map((d) => ({\n\t\t\t\t...d,\n\t\t\t\tline: view.state.doc.lineAt(d.from).number,\n\t\t\t}));\n\n\t\t\ttry {\n\t\t\t\tview.dispatch({ effects: setFhirDiagnosticsEffect.of(diags) });\n\t\t\t} catch {\n\t\t\t\t/* view destroyed */\n\t\t\t}\n\t\t}\n\n\t\tscheduleCheck();\n\n\t\treturn {\n\t\t\tupdate(update: ViewUpdate) {\n\t\t\t\tif (update.docChanged) {\n\t\t\t\t\tscheduleCheck();\n\t\t\t\t}\n\t\t\t},\n\t\t\tdestroy() {\n\t\t\t\tdestroyed = true;\n\t\t\t\tif (timeout) clearTimeout(timeout);\n\t\t\t},\n\t\t};\n\t});\n}\n\n// ── FHIR validation decorations ───────────────────────────────────────\n\ntype FhirDiagnosticWithLine = FhirDiagnostic & { line: number };\n\nconst setFhirDiagnosticsEffect = StateEffect.define<FhirDiagnosticWithLine[]>();\n\nconst fhirUnderline = Decoration.mark({ class: \"cm-fhir-error-underline\" });\nconst fhirErrorLineDecoration = Decoration.line({ class: \"cm-errorLine\" });\n\nclass FhirGutterMarker extends GutterMarker {\n\telementClass = \"cm-errorLineGutter\";\n}\nconst fhirGutterMarker = new FhirGutterMarker();\n\nexport const fhirDiagnosticsField = StateField.define<{\n\tmarks: RangeSet<Decoration>;\n\tlineDecos: RangeSet<Decoration>;\n\tgutterMarkers: RangeSet<GutterMarker>;\n\tmessages: Map<number, string>;\n}>({\n\tcreate() {\n\t\treturn {\n\t\t\tmarks: Decoration.none,\n\t\t\tlineDecos: Decoration.none,\n\t\t\tgutterMarkers: RangeSet.empty,\n\t\t\tmessages: new Map(),\n\t\t};\n\t},\n\tupdate(value, tr) {\n\t\tfor (const effect of tr.effects) {\n\t\t\tif (effect.is(setFhirDiagnosticsEffect)) {\n\t\t\t\tconst diags = effect.value;\n\t\t\t\tif (diags.length === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tmarks: Decoration.none,\n\t\t\t\t\t\tlineDecos: Decoration.none,\n\t\t\t\t\t\tgutterMarkers: RangeSet.empty,\n\t\t\t\t\t\tmessages: new Map(),\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst marks: { from: number; to: number; value: Decoration }[] = [];\n\t\t\t\tconst lineDecos: { from: number; to: number; value: Decoration }[] = [];\n\t\t\t\tconst gutter: { from: number; to: number; value: GutterMarker }[] = [];\n\t\t\t\tconst messages = new Map<number, string>();\n\n\t\t\t\tfor (const d of diags) {\n\t\t\t\t\tmarks.push(fhirUnderline.range(d.from, d.to));\n\t\t\t\t\tconst existing = messages.get(d.line);\n\t\t\t\t\tif (existing) {\n\t\t\t\t\t\tmessages.set(d.line, `${existing}\\n${d.message}`);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmessages.set(d.line, d.message);\n\t\t\t\t\t\tconst line = tr.state.doc.line(d.line);\n\t\t\t\t\t\tlineDecos.push(fhirErrorLineDecoration.range(line.from));\n\t\t\t\t\t\tgutter.push(fhirGutterMarker.range(line.from));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tmarks: Decoration.set(marks, true),\n\t\t\t\t\tlineDecos: Decoration.set(lineDecos, true),\n\t\t\t\t\tgutterMarkers: RangeSet.of(gutter, true),\n\t\t\t\t\tmessages,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\tif (tr.docChanged) {\n\t\t\ttry {\n\t\t\t\treturn {\n\t\t\t\t\tmarks: value.marks.map(tr.changes),\n\t\t\t\t\tlineDecos: value.lineDecos.map(tr.changes),\n\t\t\t\t\tgutterMarkers: value.gutterMarkers.map(tr.changes),\n\t\t\t\t\tmessages: value.messages,\n\t\t\t\t};\n\t\t\t} catch {\n\t\t\t\treturn {\n\t\t\t\t\tmarks: Decoration.none,\n\t\t\t\t\tlineDecos: Decoration.none,\n\t\t\t\t\tgutterMarkers: RangeSet.empty,\n\t\t\t\t\tmessages: new Map(),\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\treturn value;\n\t},\n\tprovide(field) {\n\t\treturn [\n\t\t\tEditorView.decorations.from(field, (v) => v.marks),\n\t\t\tEditorView.decorations.from(field, (v) => v.lineDecos),\n\t\t\tgutterLineClass.from(field, (v) => v.gutterMarkers),\n\t\t];\n\t},\n});\n\nconst fhirLinterTheme = EditorView.theme({\n\t\".cm-fhir-error-underline\": {\n\t\ttextDecorationLine: \"underline\",\n\t\ttextDecorationStyle: \"wavy\",\n\t\ttextDecorationColor: \"var(--color-text-error-primary)\",\n\t\ttextUnderlineOffset: \"3px\",\n\t},\n\t\".cm-lineNumbers .cm-gutterElement.cm-errorLineGutter\": {\n\t\tcolor: \"var(--color-text-error-primary)\",\n\t\tbackgroundColor:\n\t\t\t\"color-mix(in srgb, var(--color-text-error-primary) 7%, transparent)\",\n\t},\n});\n\n// ── Public API ─────────────────────────────────────────────────────────\n\nexport function buildFhirCompletionExtension(\n\tgetSDs: GetStructureDefinitions,\n\tresourceTypeHint?: string,\n\texpandValueSet?: ExpandValueSet,\n): Extension {\n\tconst jsonSource = jsonCompletionSource(\n\t\tgetSDs,\n\t\tresourceTypeHint,\n\t\texpandValueSet,\n\t);\n\n\tconst autoTrigger = EditorView.updateListener.of((update) => {\n\t\tif (!update.docChanged) return;\n\t\tif (completionStatus(update.view.state)) return;\n\t\tconst { state } = update.view;\n\t\tconst pos = state.selection.main.head;\n\t\tconst doc = state.doc.toString();\n\t\tconst line = state.doc.lineAt(pos);\n\t\tconst beforeCursor = line.text.slice(0, pos - line.from).trimStart();\n\t\t// Trigger on empty lines (including after snippet insertion),\n\t\t// after [ (array open), or after \" (string value start)\n\t\tconst shouldTrigger =\n\t\t\tbeforeCursor === \"\" ||\n\t\t\t(pos > 0 && doc[pos - 1] === \"[\") ||\n\t\t\t(pos > 0 && doc[pos - 1] === '\"' && pos > 1 && doc[pos - 2] !== \"\\\\\");\n\t\tif (!shouldTrigger) return;\n\t\t// Skip bulk replacements (e.g. tab switch, currentValue update)\n\t\t// but allow snippets — check only if the ENTIRE doc was replaced\n\t\tlet totalInserted = 0;\n\t\tupdate.changes.iterChanges((_fA, _tA, _fB, _tB, ins) => {\n\t\t\ttotalInserted += ins.length;\n\t\t});\n\t\tif (totalInserted > doc.length * 0.5) return;\n\t\tsetTimeout(() => startCompletion(update.view), 0);\n\t});\n\n\treturn [\n\t\tjsonLanguage.data.of({ autocomplete: jsonSource }),\n\t\tautoTrigger,\n\t\tfhirDiagnosticsField,\n\t\tfhirLinterTheme,\n\t\tbuildFhirValidationPlugin(getSDs, resourceTypeHint),\n\t];\n}\n"],"names":["completionStatus","startCompletion","jsonLanguage","ensureSyntaxTree","syntaxTree","RangeSet","StateEffect","StateField","Decoration","EditorView","GutterMarker","gutterLineClass","ViewPlugin","buildJsonDocumentContext","findRootJsonObject","walkJsonProperties","PRIMITIVE_TYPES","Set","isPrimitiveType","typeCode","has","startsWith","FHIR_STRING_TYPES","FHIR_NUMBER_TYPES","sdCache","Map","pendingRequests","listCache","pendingListRequests","SD_ELEMENTS","cacheKey","params","JSON","stringify","getCachedSDList","getSDs","key","get","pending","then","list","set","delete","sd","differential","element","type","catch","getCachedSD","isUrl","includes","searchByType","url","_elements","_count","derivation","fieldName","parts","path","split","length","replace","directChildren","elements","parentPath","prefix","filter","el","rest","slice","findElement","direct","find","name","toLowerCase","endsWith","baseName","typeSuffix","matchedType","t","code","undefined","collectAllElements","baseDefinition","base","baseEl","remappedPath","RegExp","basePath","some","e","push","resolveElements","resourceType","result","currentPath","currentElements","contentReference","typeResult","children","expanded","isChoiceType","charAt","toUpperCase","findResourceBoundary","i","snippetKind","isArray","max","buildSnippet","kind","indent","inner","innerInner","text","cursorOffset","indexOf","lastIndexOf","toCompletion","types","map","join","completion","label","detail","boost","min","apply","view","_completion","from","to","doc","state","toString","actualFrom","actualTo","afterName","match","insert","dispatch","changes","selection","anchor","line","lineAt","lineText","setTimeout","short","info","toParameterPropertyCompletion","elementsToCompletions","mapFn","completions","firstTypeCode","ext","analyzeExtensionSD","valueEl","isNested","valueTypes","slices","sliceName","urlEl","fixedUri","parametersTypeCache","isParametersType","baseType","pop","getParameterSlices","profileUrls","profileUrl","paramPath","current","flush","fixedName","s","fixedString","getFixedValues","effectivePath","valueKey","fhirPath","fixedCode","buildParameterSnippet","tc","vf","buildFhirElementPath","findProfileBinding","directPath","binding","valueSet","parentFhirPath","findExtensionBinding","pos","textBefore","urlMatches","matchAll","extUrl","parentUrlMatches","index","j","parentUrl","parentSD","inSlice","findBindingForValue","inExtension","p","extBinding","profileBinding","parentElements","findCanonicalTargetType","arrayKey","targetProfile","resolveReferenceTargets","lastKey","targets","profile","rt","fhirComplete","ctx","resourceTypeHint","expandValueSet","completionContext","hasExplicitResourceType","rtScope","getScope","level","fullPath","getString","rootRT","boundaryIdx","innerPath","innerScope","innerRT","getStringArray","cp","cursorPosition","handleValueCompletion","handleArrayItemCompletion","parentKey","isInsideArray","handlePropertyCompletion","_hasExplicitResourceType","sds","options","_c","d","word","matchBefore","validFor","vTypes","main","head","cd","after","test","lineObj","ind","ins","cOff","fixedVal","option","lastSeg","handleExtensionUrlCompletion","v","valueSetUrl","quoteWord","codes","c","display","applyFrom","applyTo","_effectivePath","urlKeyPos","scanEnd","parentExtUrl","depth","inStr","esc","foundExtArray","ch","objText","urlMatch","handleNestedExtensionSlices","contextTypes","extIdx","currentRT","seg","profileExtUrls","pUrl","profileSD","clean","bareWord","searchParams","_ilike","results","containerType","contextExts","context","expression","seen","allExts","u","add","ctxExprs","lf","filtered","sort","a","b","fullSD","extInfo","cursorPos","curDoc","matching","sliceElements","sliceValueTypes","inSl","af","lo","_doc","targetType","allSDs","uniqueSDs","beforeCursor","trimStart","explicit","makeJsonRtCompletion","isParams","domainElements","existingKeys","getKeys","jsonCompletionSource","cc","validateFhirProperties","properties","groups","prop","group","props","diagnostics","values","validNames","message","buildFhirValidationPlugin","define","timeout","destroyed","hasActiveDiagnostics","field","fhirDiagnosticsField","messages","size","scheduleCheck","clearTimeout","delay","check","currentDoc","tree","emptyStrings","effects","setFhirDiagnosticsEffect","of","rawDiags","diags","number","update","docChanged","destroy","fhirUnderline","mark","class","fhirErrorLineDecoration","FhirGutterMarker","elementClass","fhirGutterMarker","create","marks","none","lineDecos","gutterMarkers","empty","value","tr","effect","is","gutter","range","existing","provide","decorations","fhirLinterTheme","theme","textDecorationLine","textDecorationStyle","textDecorationColor","textUnderlineOffset","color","backgroundColor","buildFhirCompletionExtension","jsonSource","autoTrigger","updateListener","shouldTrigger","totalInserted","iterChanges","_fA","_tA","_fB","_tB","data","autocomplete"],"mappings":"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"}
|