{
  "version": 3,
  "sources": ["ssg:https://framerusercontent.com/modules/iHAg5NNDzB38uLRZmObL/AYYlaW5ad8TRAyLHn07o/codemirror_autocomplete.js"],
  "sourcesContent": ["// @ts-nocheck\n/**\n * This file is generated inside FramerStudio. To update it run \"make build\"\n * inside \"./src/codeblock-dependencies\" and copy the file from \"./build\".\n */ // ../../node_modules/@codemirror/autocomplete/dist/index.js\nimport { Annotation, StateEffect, EditorSelection, codePointAt, codePointSize, fromCodePoint, Facet, combineConfig, StateField, Prec, Text, MapMode, RangeValue, RangeSet, CharCategory } from \"https://framerusercontent.com/modules/wFkXxZqfKOPeEQtsYrsa/Xcw7qvncyogRPQtf9aNn/codemirror_state.js\";\nimport { Direction, ViewPlugin, logException, getTooltip, showTooltip, EditorView, Decoration, WidgetType, keymap } from \"https://framerusercontent.com/modules/wKCR2JyUW8wZdYweJrou/EndxaPZLF2o4GndkIvF9/codemirror_view.js\";\nimport { syntaxTree, indentUnit } from \"https://framerusercontent.com/modules/aJsTBlWNkIaM900KNIXT/TeoF57xeGMuVMjiI2ooR/codemirror_language.js\";\nvar CompletionContext = class {\n  /**\n  Get the extent, content, and (if there is a token) type of the\n  token before `this.pos`.\n  */\n  tokenBefore(types) {\n    let token = syntaxTree(this.state).resolveInner(this.pos, -1);\n    while (token && types.indexOf(token.name) < 0) token = token.parent;\n    return token ? {\n      from: token.from,\n      to: this.pos,\n      text: this.state.sliceDoc(token.from, this.pos),\n      type: token.type\n    } : null;\n  } /**\n    Get the match of the given expression directly before the\n    cursor.\n    */\n  matchBefore(expr) {\n    let line = this.state.doc.lineAt(this.pos);\n    let start = Math.max(line.from, this.pos - 250);\n    let str = line.text.slice(start - line.from, this.pos - line.from);\n    let found = str.search(ensureAnchor(expr, false));\n    return found < 0 ? null : {\n      from: start + found,\n      to: this.pos,\n      text: str.slice(found)\n    };\n  } /**\n    Yields true when the query has been aborted. Can be useful in\n    asynchronous queries to avoid doing work that will be ignored.\n    */\n  get aborted() {\n    return this.abortListeners == null;\n  } /**\n    Allows you to register abort handlers, which will be called when\n    the query is\n    [aborted](https://codemirror.net/6/docs/ref/#autocomplete.CompletionContext.aborted).\n    */\n  addEventListener(type, listener) {\n    if (type == \"abort\" && this.abortListeners) this.abortListeners.push(listener);\n  } /**\n    Create a new completion context. (Mostly useful for testing\n    completion sources\u2014in the editor, the extension will create\n    these for you.)\n    */\n  constructor(state, pos, explicit) {\n    this.state = state;\n    this.pos = pos;\n    this.explicit = explicit;\n    this.abortListeners = [];\n  }\n};\nfunction toSet(chars) {\n  let flat = Object.keys(chars).join(\"\");\n  let words = /\\w/.test(flat);\n  if (words) flat = flat.replace(/\\w/g, \"\");\n  return `[${words ? \"\\\\w\" : \"\"}${flat.replace(/[^\\w\\s]/g, \"\\\\$&\")}]`;\n}\nfunction prefixMatch(options) {\n  let first = /* @__PURE__ */Object.create(null),\n    rest = /* @__PURE__ */Object.create(null);\n  for (let {\n    label\n  } of options) {\n    first[label[0]] = true;\n    for (let i = 1; i < label.length; i++) rest[label[i]] = true;\n  }\n  let source = toSet(first) + toSet(rest) + \"*$\";\n  return [new RegExp(\"^\" + source), new RegExp(source)];\n}\nfunction completeFromList(list) {\n  let options = list.map(o => typeof o == \"string\" ? {\n    label: o\n  } : o);\n  let [validFor, match] = options.every(o => /^\\w+$/.test(o.label)) ? [/\\w*$/, /\\w+$/] : prefixMatch(options);\n  return context => {\n    let token = context.matchBefore(match);\n    return token || context.explicit ? {\n      from: token ? token.from : context.pos,\n      options,\n      validFor\n    } : null;\n  };\n}\nfunction ifIn(nodes, source) {\n  return context => {\n    for (let pos = syntaxTree(context.state).resolveInner(context.pos, -1); pos; pos = pos.parent) {\n      if (nodes.indexOf(pos.name) > -1) return source(context);\n      if (pos.type.isTop) break;\n    }\n    return null;\n  };\n}\nfunction ifNotIn(nodes, source) {\n  return context => {\n    for (let pos = syntaxTree(context.state).resolveInner(context.pos, -1); pos; pos = pos.parent) {\n      if (nodes.indexOf(pos.name) > -1) return null;\n      if (pos.type.isTop) break;\n    }\n    return source(context);\n  };\n}\nvar Option = class {\n  constructor(completion, source, match, score2) {\n    this.completion = completion;\n    this.source = source;\n    this.match = match;\n    this.score = score2;\n  }\n};\nfunction cur(state) {\n  return state.selection.main.from;\n}\nfunction ensureAnchor(expr, start) {\n  var _a;\n  let {\n    source\n  } = expr;\n  let addStart = start && source[0] != \"^\",\n    addEnd = source[source.length - 1] != \"$\";\n  if (!addStart && !addEnd) return expr;\n  return new RegExp(`${addStart ? \"^\" : \"\"}(?:${source})${addEnd ? \"$\" : \"\"}`, (_a = expr.flags) !== null && _a !== void 0 ? _a : expr.ignoreCase ? \"i\" : \"\");\n}\nvar pickedCompletion = /* @__PURE__ */Annotation.define();\nfunction insertCompletionText(state, text, from, to) {\n  let {\n      main\n    } = state.selection,\n    fromOff = from - main.from,\n    toOff = to - main.from;\n  return Object.assign(Object.assign({}, state.changeByRange(range => {\n    if (range != main && from != to && state.sliceDoc(range.from + fromOff, range.from + toOff) != state.sliceDoc(from, to)) return {\n      range\n    };\n    return {\n      changes: {\n        from: range.from + fromOff,\n        to: to == main.from ? range.to : range.from + toOff,\n        insert: text\n      },\n      range: EditorSelection.cursor(range.from + fromOff + text.length)\n    };\n  })), {\n    userEvent: \"input.complete\"\n  });\n}\nvar SourceCache = /* @__PURE__ */new WeakMap();\nfunction asSource(source) {\n  if (!Array.isArray(source)) return source;\n  let known = SourceCache.get(source);\n  if (!known) SourceCache.set(source, known = completeFromList(source));\n  return known;\n}\nvar startCompletionEffect = /* @__PURE__ */StateEffect.define();\nvar closeCompletionEffect = /* @__PURE__ */StateEffect.define();\nvar FuzzyMatcher = class {\n  // Matches a given word (completion) against the pattern (input).\n  // Will return null for no match, and otherwise an array that starts\n  // with the match score, followed by any number of `from, to` pairs\n  // indicating the matched parts of `word`.\n  //\n  // The score is a number that is more negative the worse the match\n  // is. See `Penalty` above.\n  match(word) {\n    if (this.pattern.length == 0) return [-100];\n    if (word.length < this.pattern.length) return null;\n    let {\n      chars,\n      folded,\n      any,\n      precise,\n      byWord\n    } = this;\n    if (chars.length == 1) {\n      let first = codePointAt(word, 0),\n        firstSize = codePointSize(first);\n      let score2 = firstSize == word.length ? 0 : -100;\n      if (first == chars[0]) ;else if (first == folded[0]) score2 += -200;else return null;\n      return [score2, 0, firstSize];\n    }\n    let direct = word.indexOf(this.pattern);\n    if (direct == 0) return [word.length == this.pattern.length ? 0 : -100, 0, this.pattern.length];\n    let len = chars.length,\n      anyTo = 0;\n    if (direct < 0) {\n      for (let i = 0, e = Math.min(word.length, 200); i < e && anyTo < len;) {\n        let next = codePointAt(word, i);\n        if (next == chars[anyTo] || next == folded[anyTo]) any[anyTo++] = i;\n        i += codePointSize(next);\n      }\n      if (anyTo < len) return null;\n    }\n    let preciseTo = 0;\n    let byWordTo = 0,\n      byWordFolded = false;\n    let adjacentTo = 0,\n      adjacentStart = -1,\n      adjacentEnd = -1;\n    let hasLower = /[a-z]/.test(word),\n      wordAdjacent = true;\n    for (let i1 = 0, e1 = Math.min(word.length, 200), prevType = 0; i1 < e1 && byWordTo < len;) {\n      let next1 = codePointAt(word, i1);\n      if (direct < 0) {\n        if (preciseTo < len && next1 == chars[preciseTo]) precise[preciseTo++] = i1;\n        if (adjacentTo < len) {\n          if (next1 == chars[adjacentTo] || next1 == folded[adjacentTo]) {\n            if (adjacentTo == 0) adjacentStart = i1;\n            adjacentEnd = i1 + 1;\n            adjacentTo++;\n          } else {\n            adjacentTo = 0;\n          }\n        }\n      }\n      let ch,\n        type = next1 < 255 ? next1 >= 48 && next1 <= 57 || next1 >= 97 && next1 <= 122 ? 2 : next1 >= 65 && next1 <= 90 ? 1 : 0 : (ch = fromCodePoint(next1)) != ch.toLowerCase() ? 1 : ch != ch.toUpperCase() ? 2 : 0;\n      if (!i1 || type == 1 && hasLower || prevType == 0 && type != 0) {\n        if (chars[byWordTo] == next1 || folded[byWordTo] == next1 && (byWordFolded = true)) byWord[byWordTo++] = i1;else if (byWord.length) wordAdjacent = false;\n      }\n      prevType = type;\n      i1 += codePointSize(next1);\n    }\n    if (byWordTo == len && byWord[0] == 0 && wordAdjacent) return this.result(-100 + (byWordFolded ? -200 : 0), byWord, word);\n    if (adjacentTo == len && adjacentStart == 0) return [-200 - word.length + (adjacentEnd == word.length ? 0 : -100), 0, adjacentEnd];\n    if (direct > -1) return [-700 - word.length, direct, direct + this.pattern.length];\n    if (adjacentTo == len) return [-200 + -700 - word.length, adjacentStart, adjacentEnd];\n    if (byWordTo == len) return this.result(-100 + (byWordFolded ? -200 : 0) + -700 + (wordAdjacent ? 0 : -1100), byWord, word);\n    return chars.length == 2 ? null : this.result((any[0] ? -700 : 0) + -200 + -1100, any, word);\n  }\n  result(score2, positions, word) {\n    let result = [score2 - word.length],\n      i = 1;\n    for (let pos of positions) {\n      let to = pos + (this.astral ? codePointSize(codePointAt(word, pos)) : 1);\n      if (i > 1 && result[i - 1] == pos) result[i - 1] = to;else {\n        result[i++] = pos;\n        result[i++] = to;\n      }\n    }\n    return result;\n  }\n  constructor(pattern) {\n    this.pattern = pattern;\n    this.chars = [];\n    this.folded = [];\n    this.any = [];\n    this.precise = [];\n    this.byWord = [];\n    for (let p = 0; p < pattern.length;) {\n      let char = codePointAt(pattern, p),\n        size = codePointSize(char);\n      this.chars.push(char);\n      let part = pattern.slice(p, p + size),\n        upper = part.toUpperCase();\n      this.folded.push(codePointAt(upper == part ? part.toLowerCase() : upper, 0));\n      p += size;\n    }\n    this.astral = pattern.length != this.chars.length;\n  }\n};\nvar completionConfig = /* @__PURE__ */Facet.define({\n  combine(configs) {\n    return combineConfig(configs, {\n      activateOnTyping: true,\n      selectOnOpen: true,\n      override: null,\n      closeOnBlur: true,\n      maxRenderedOptions: 100,\n      defaultKeymap: true,\n      tooltipClass: () => \"\",\n      optionClass: () => \"\",\n      aboveCursor: false,\n      icons: true,\n      addToOptions: [],\n      positionInfo: defaultPositionInfo,\n      compareCompletions: (a, b) => a.label.localeCompare(b.label),\n      interactionDelay: 75\n    }, {\n      defaultKeymap: (a, b) => a && b,\n      closeOnBlur: (a, b) => a && b,\n      icons: (a, b) => a && b,\n      tooltipClass: (a, b) => c => joinClass(a(c), b(c)),\n      optionClass: (a, b) => c => joinClass(a(c), b(c)),\n      addToOptions: (a, b) => a.concat(b)\n    });\n  }\n});\nfunction joinClass(a, b) {\n  return a ? b ? a + \" \" + b : a : b;\n}\nfunction defaultPositionInfo(view, list, option, info, space) {\n  let rtl = view.textDirection == Direction.RTL,\n    left = rtl,\n    narrow = false;\n  let side = \"top\",\n    offset,\n    maxWidth;\n  let spaceLeft = list.left - space.left,\n    spaceRight = space.right - list.right;\n  let infoWidth = info.right - info.left,\n    infoHeight = info.bottom - info.top;\n  if (left && spaceLeft < Math.min(infoWidth, spaceRight)) left = false;else if (!left && spaceRight < Math.min(infoWidth, spaceLeft)) left = true;\n  if (infoWidth <= (left ? spaceLeft : spaceRight)) {\n    offset = Math.max(space.top, Math.min(option.top, space.bottom - infoHeight)) - list.top;\n    maxWidth = Math.min(400, left ? spaceLeft : spaceRight);\n  } else {\n    narrow = true;\n    maxWidth = Math.min(400, (rtl ? list.right : space.right - list.left) - 30);\n    let spaceBelow = space.bottom - list.bottom;\n    if (spaceBelow >= infoHeight || spaceBelow > list.top) {\n      offset = option.bottom - list.top;\n    } else {\n      side = \"bottom\";\n      offset = list.bottom - option.top;\n    }\n  }\n  return {\n    style: `${side}: ${offset}px; max-width: ${maxWidth}px`,\n    class: \"cm-completionInfo-\" + (narrow ? rtl ? \"left-narrow\" : \"right-narrow\" : left ? \"left\" : \"right\")\n  };\n}\nfunction moveCompletionSelection(forward, by = \"option\") {\n  return view => {\n    let cState = view.state.field(completionState, false);\n    if (!cState || !cState.open || cState.open.disabled || Date.now() - cState.open.timestamp < view.state.facet(completionConfig).interactionDelay) return false;\n    let step = 1,\n      tooltip;\n    if (by == \"page\" && (tooltip = getTooltip(view, cState.open.tooltip))) step = Math.max(2, Math.floor(tooltip.dom.offsetHeight / tooltip.dom.querySelector(\"li\").offsetHeight) - 1);\n    let {\n      length\n    } = cState.open.options;\n    let selected = cState.open.selected > -1 ? cState.open.selected + step * (forward ? 1 : -1) : forward ? 0 : length - 1;\n    if (selected < 0) selected = by == \"page\" ? 0 : length - 1;else if (selected >= length) selected = by == \"page\" ? length - 1 : 0;\n    view.dispatch({\n      effects: setSelectedEffect.of(selected)\n    });\n    return true;\n  };\n}\nvar acceptCompletion = view => {\n  let cState = view.state.field(completionState, false);\n  if (view.state.readOnly || !cState || !cState.open || cState.open.selected < 0 || Date.now() - cState.open.timestamp < view.state.facet(completionConfig).interactionDelay) return false;\n  if (!cState.open.disabled) return applyCompletion(view, cState.open.options[cState.open.selected]);\n  return true;\n};\nvar startCompletion = view => {\n  let cState = view.state.field(completionState, false);\n  if (!cState) return false;\n  view.dispatch({\n    effects: startCompletionEffect.of(true)\n  });\n  return true;\n};\nvar closeCompletion = view => {\n  let cState = view.state.field(completionState, false);\n  if (!cState || !cState.active.some(a => a.state != 0)) return false;\n  view.dispatch({\n    effects: closeCompletionEffect.of(null)\n  });\n  return true;\n};\nvar RunningQuery = class {\n  constructor(active, context) {\n    this.active = active;\n    this.context = context;\n    this.time = Date.now();\n    this.updates = [];\n    this.done = void 0;\n  }\n};\nvar DebounceTime = 50;\nvar MaxUpdateCount = 50;\nvar MinAbortTime = 1e3;\nvar completionPlugin = /* @__PURE__ */ViewPlugin.fromClass(class {\n  update(update) {\n    let cState = update.state.field(completionState);\n    if (!update.selectionSet && !update.docChanged && update.startState.field(completionState) == cState) return;\n    let doesReset = update.transactions.some(tr => {\n      return (tr.selection || tr.docChanged) && !getUserEvent(tr);\n    });\n    for (let i = 0; i < this.running.length; i++) {\n      let query = this.running[i];\n      if (doesReset || query.updates.length + update.transactions.length > MaxUpdateCount && Date.now() - query.time > MinAbortTime) {\n        for (let handler of query.context.abortListeners) {\n          try {\n            handler();\n          } catch (e) {\n            logException(this.view.state, e);\n          }\n        }\n        query.context.abortListeners = null;\n        this.running.splice(i--, 1);\n      } else {\n        query.updates.push(...update.transactions);\n      }\n    }\n    if (this.debounceUpdate > -1) clearTimeout(this.debounceUpdate);\n    this.debounceUpdate = cState.active.some(a => a.state == 1 && !this.running.some(q => q.active.source == a.source)) ? setTimeout(() => this.startUpdate(), DebounceTime) : -1;\n    if (this.composing != 0) for (let tr of update.transactions) {\n      if (getUserEvent(tr) == \"input\") this.composing = 2;else if (this.composing == 2 && tr.selection) this.composing = 3;\n    }\n  }\n  startUpdate() {\n    this.debounceUpdate = -1;\n    let {\n        state\n      } = this.view,\n      cState = state.field(completionState);\n    for (let active of cState.active) {\n      if (active.state == 1 && !this.running.some(r => r.active.source == active.source)) this.startQuery(active);\n    }\n  }\n  startQuery(active) {\n    let {\n        state\n      } = this.view,\n      pos = cur(state);\n    let context = new CompletionContext(state, pos, active.explicitPos == pos);\n    let pending = new RunningQuery(active, context);\n    this.running.push(pending);\n    Promise.resolve(active.source(context)).then(result => {\n      if (!pending.context.aborted) {\n        pending.done = result || null;\n        this.scheduleAccept();\n      }\n    }, err => {\n      this.view.dispatch({\n        effects: closeCompletionEffect.of(null)\n      });\n      logException(this.view.state, err);\n    });\n  }\n  scheduleAccept() {\n    if (this.running.every(q => q.done !== void 0)) this.accept();else if (this.debounceAccept < 0) this.debounceAccept = setTimeout(() => this.accept(), DebounceTime);\n  } // For each finished query in this.running, try to create a result\n  // or, if appropriate, restart the query.\n  accept() {\n    var _a;\n    if (this.debounceAccept > -1) clearTimeout(this.debounceAccept);\n    this.debounceAccept = -1;\n    let updated = [];\n    let conf = this.view.state.facet(completionConfig);\n    for (let i = 0; i < this.running.length; i++) {\n      let query = this.running[i];\n      if (query.done === void 0) continue;\n      this.running.splice(i--, 1);\n      if (query.done) {\n        let active = new ActiveResult(query.active.source, query.active.explicitPos, query.done, query.done.from, (_a = query.done.to) !== null && _a !== void 0 ? _a : cur(query.updates.length ? query.updates[0].startState : this.view.state));\n        for (let tr of query.updates) active = active.update(tr, conf);\n        if (active.hasResult()) {\n          updated.push(active);\n          continue;\n        }\n      }\n      let current = this.view.state.field(completionState).active.find(a => a.source == query.active.source);\n      if (current && current.state == 1) {\n        if (query.done == null) {\n          let active1 = new ActiveSource(query.active.source, 0);\n          for (let tr1 of query.updates) active1 = active1.update(tr1, conf);\n          if (active1.state != 1) updated.push(active1);\n        } else {\n          this.startQuery(current);\n        }\n      }\n    }\n    if (updated.length) this.view.dispatch({\n      effects: setActiveEffect.of(updated)\n    });\n  }\n  constructor(view) {\n    this.view = view;\n    this.debounceUpdate = -1;\n    this.running = [];\n    this.debounceAccept = -1;\n    this.composing = 0;\n    for (let active of view.state.field(completionState).active) if (active.state == 1) this.startQuery(active);\n  }\n}, {\n  eventHandlers: {\n    blur(event) {\n      let state = this.view.state.field(completionState, false);\n      if (state && state.tooltip && this.view.state.facet(completionConfig).closeOnBlur) {\n        let dialog = state.open && getTooltip(this.view, state.open.tooltip);\n        if (!dialog || !dialog.dom.contains(event.relatedTarget)) this.view.dispatch({\n          effects: closeCompletionEffect.of(null)\n        });\n      }\n    },\n    compositionstart() {\n      this.composing = 1;\n    },\n    compositionend() {\n      if (this.composing == 3) {\n        setTimeout(() => this.view.dispatch({\n          effects: startCompletionEffect.of(false)\n        }), 20);\n      }\n      this.composing = 0;\n    }\n  }\n});\nfunction applyCompletion(view, option) {\n  const apply = option.completion.apply || option.completion.label;\n  let result = view.state.field(completionState).active.find(a => a.source == option.source);\n  if (!(result instanceof ActiveResult)) return false;\n  if (typeof apply == \"string\") view.dispatch(Object.assign(Object.assign({}, insertCompletionText(view.state, apply, result.from, result.to)), {\n    annotations: pickedCompletion.of(option.completion)\n  }));else apply(view, option.completion, result.from, result.to);\n  return true;\n}\nfunction optionContent(config2) {\n  let content = config2.addToOptions.slice();\n  if (config2.icons) content.push({\n    render(completion) {\n      let icon = document.createElement(\"div\");\n      icon.classList.add(\"cm-completionIcon\");\n      if (completion.type) icon.classList.add(...completion.type.split(/\\s+/g).map(cls => \"cm-completionIcon-\" + cls));\n      icon.setAttribute(\"aria-hidden\", \"true\");\n      return icon;\n    },\n    position: 20\n  });\n  content.push({\n    render(completion, _s, match) {\n      let labelElt = document.createElement(\"span\");\n      labelElt.className = \"cm-completionLabel\";\n      let {\n          label\n        } = completion,\n        off = 0;\n      for (let j = 1; j < match.length;) {\n        let from = match[j++],\n          to = match[j++];\n        if (from > off) labelElt.appendChild(document.createTextNode(label.slice(off, from)));\n        let span = labelElt.appendChild(document.createElement(\"span\"));\n        span.appendChild(document.createTextNode(label.slice(from, to)));\n        span.className = \"cm-completionMatchedText\";\n        off = to;\n      }\n      if (off < label.length) labelElt.appendChild(document.createTextNode(label.slice(off)));\n      return labelElt;\n    },\n    position: 50\n  }, {\n    render(completion) {\n      if (!completion.detail) return null;\n      let detailElt = document.createElement(\"span\");\n      detailElt.className = \"cm-completionDetail\";\n      detailElt.textContent = completion.detail;\n      return detailElt;\n    },\n    position: 80\n  });\n  return content.sort((a, b) => a.position - b.position).map(a => a.render);\n}\nfunction rangeAroundSelected(total, selected, max) {\n  if (total <= max) return {\n    from: 0,\n    to: total\n  };\n  if (selected < 0) selected = 0;\n  if (selected <= total >> 1) {\n    let off2 = Math.floor(selected / max);\n    return {\n      from: off2 * max,\n      to: (off2 + 1) * max\n    };\n  }\n  let off = Math.floor((total - selected) / max);\n  return {\n    from: total - (off + 1) * max,\n    to: total - off * max\n  };\n}\nvar CompletionTooltip = class {\n  mount() {\n    this.updateSel();\n  }\n  update(update) {\n    var _a, _b, _c;\n    let cState = update.state.field(this.stateField);\n    let prevState = update.startState.field(this.stateField);\n    this.updateTooltipClass(update.state);\n    if (cState != prevState) {\n      this.updateSel();\n      if (((_a = cState.open) === null || _a === void 0 ? void 0 : _a.disabled) != ((_b = prevState.open) === null || _b === void 0 ? void 0 : _b.disabled)) this.dom.classList.toggle(\"cm-tooltip-autocomplete-disabled\", !!((_c = cState.open) === null || _c === void 0 ? void 0 : _c.disabled));\n    }\n  }\n  updateTooltipClass(state) {\n    let cls = this.tooltipClass(state);\n    if (cls != this.currentClass) {\n      for (let c of this.currentClass.split(\" \")) if (c) this.dom.classList.remove(c);\n      for (let c1 of cls.split(\" \")) if (c1) this.dom.classList.add(c1);\n      this.currentClass = cls;\n    }\n  }\n  positioned(space) {\n    this.space = space;\n    if (this.info) this.view.requestMeasure(this.placeInfoReq);\n  }\n  updateSel() {\n    let cState = this.view.state.field(this.stateField),\n      open = cState.open;\n    if (open.selected > -1 && open.selected < this.range.from || open.selected >= this.range.to) {\n      this.range = rangeAroundSelected(open.options.length, open.selected, this.view.state.facet(completionConfig).maxRenderedOptions);\n      this.list.remove();\n      this.list = this.dom.appendChild(this.createListBox(open.options, cState.id, this.range));\n      this.list.addEventListener(\"scroll\", () => {\n        if (this.info) this.view.requestMeasure(this.placeInfoReq);\n      });\n    }\n    if (this.updateSelectedOption(open.selected)) {\n      if (this.info) {\n        this.info.remove();\n        this.info = null;\n      }\n      let {\n        completion\n      } = open.options[open.selected];\n      let {\n        info\n      } = completion;\n      if (!info) return;\n      let infoResult = typeof info === \"string\" ? document.createTextNode(info) : info(completion);\n      if (!infoResult) return;\n      if (\"then\" in infoResult) {\n        infoResult.then(node => {\n          if (node && this.view.state.field(this.stateField, false) == cState) this.addInfoPane(node);\n        }).catch(e => logException(this.view.state, e, \"completion info\"));\n      } else {\n        this.addInfoPane(infoResult);\n      }\n    }\n  }\n  addInfoPane(content) {\n    let dom = this.info = document.createElement(\"div\");\n    dom.className = \"cm-tooltip cm-completionInfo\";\n    dom.appendChild(content);\n    this.dom.appendChild(dom);\n    this.view.requestMeasure(this.placeInfoReq);\n  }\n  updateSelectedOption(selected) {\n    let set = null;\n    for (let opt = this.list.firstChild, i = this.range.from; opt; opt = opt.nextSibling, i++) {\n      if (opt.nodeName != \"LI\" || !opt.id) {\n        i--;\n      } else if (i == selected) {\n        if (!opt.hasAttribute(\"aria-selected\")) {\n          opt.setAttribute(\"aria-selected\", \"true\");\n          set = opt;\n        }\n      } else {\n        if (opt.hasAttribute(\"aria-selected\")) opt.removeAttribute(\"aria-selected\");\n      }\n    }\n    if (set) scrollIntoView(this.list, set);\n    return set;\n  }\n  measureInfo() {\n    let sel = this.dom.querySelector(\"[aria-selected]\");\n    if (!sel || !this.info) return null;\n    let listRect = this.dom.getBoundingClientRect();\n    let infoRect = this.info.getBoundingClientRect();\n    let selRect = sel.getBoundingClientRect();\n    let space = this.space;\n    if (!space) {\n      let win = this.dom.ownerDocument.defaultView || window;\n      space = {\n        left: 0,\n        top: 0,\n        right: win.innerWidth,\n        bottom: win.innerHeight\n      };\n    }\n    if (selRect.top > Math.min(space.bottom, listRect.bottom) - 10 || selRect.bottom < Math.max(space.top, listRect.top) + 10) return null;\n    return this.view.state.facet(completionConfig).positionInfo(this.view, listRect, selRect, infoRect, space);\n  }\n  placeInfo(pos) {\n    if (this.info) {\n      if (pos) {\n        if (pos.style) this.info.style.cssText = pos.style;\n        this.info.className = \"cm-tooltip cm-completionInfo \" + (pos.class || \"\");\n      } else {\n        this.info.style.cssText = \"top: -1e6px\";\n      }\n    }\n  }\n  createListBox(options, id, range) {\n    const ul = document.createElement(\"ul\");\n    ul.id = id;\n    ul.setAttribute(\"role\", \"listbox\");\n    ul.setAttribute(\"aria-expanded\", \"true\");\n    ul.setAttribute(\"aria-label\", this.view.state.phrase(\"Completions\"));\n    let curSection = null;\n    for (let i = range.from; i < range.to; i++) {\n      let {\n          completion,\n          match\n        } = options[i],\n        {\n          section\n        } = completion;\n      if (section) {\n        let name = typeof section == \"string\" ? section : section.name;\n        if (name != curSection && (i > range.from || range.from == 0)) {\n          curSection = name;\n          if (typeof section != \"string\" && section.header) {\n            ul.appendChild(section.header(section));\n          } else {\n            let header = ul.appendChild(document.createElement(\"completion-section\"));\n            header.textContent = name;\n          }\n        }\n      }\n      const li = ul.appendChild(document.createElement(\"li\"));\n      li.id = id + \"-\" + i;\n      li.setAttribute(\"role\", \"option\");\n      let cls = this.optionClass(completion);\n      if (cls) li.className = cls;\n      for (let source of this.optionContent) {\n        let node = source(completion, this.view.state, match);\n        if (node) li.appendChild(node);\n      }\n    }\n    if (range.from) ul.classList.add(\"cm-completionListIncompleteTop\");\n    if (range.to < options.length) ul.classList.add(\"cm-completionListIncompleteBottom\");\n    return ul;\n  }\n  constructor(view, stateField) {\n    this.view = view;\n    this.stateField = stateField;\n    this.info = null;\n    this.placeInfoReq = {\n      read: () => this.measureInfo(),\n      write: pos => this.placeInfo(pos),\n      key: this\n    };\n    this.space = null;\n    this.currentClass = \"\";\n    let cState = view.state.field(stateField);\n    let {\n      options,\n      selected\n    } = cState.open;\n    let config2 = view.state.facet(completionConfig);\n    this.optionContent = optionContent(config2);\n    this.optionClass = config2.optionClass;\n    this.tooltipClass = config2.tooltipClass;\n    this.range = rangeAroundSelected(options.length, selected, config2.maxRenderedOptions);\n    this.dom = document.createElement(\"div\");\n    this.dom.className = \"cm-tooltip-autocomplete\";\n    this.updateTooltipClass(view.state);\n    this.dom.addEventListener(\"mousedown\", e => {\n      for (let dom = e.target, match; dom && dom != this.dom; dom = dom.parentNode) {\n        if (dom.nodeName == \"LI\" && (match = /-(\\d+)$/.exec(dom.id)) && +match[1] < options.length) {\n          applyCompletion(view, options[+match[1]]);\n          e.preventDefault();\n          return;\n        }\n      }\n    });\n    this.dom.addEventListener(\"focusout\", e => {\n      let state = view.state.field(this.stateField, false);\n      if (state && state.tooltip && view.state.facet(completionConfig).closeOnBlur && e.relatedTarget != view.contentDOM) view.dispatch({\n        effects: closeCompletionEffect.of(null)\n      });\n    });\n    this.list = this.dom.appendChild(this.createListBox(options, cState.id, this.range));\n    this.list.addEventListener(\"scroll\", () => {\n      if (this.info) this.view.requestMeasure(this.placeInfoReq);\n    });\n  }\n};\nfunction completionTooltip(stateField) {\n  return view => new CompletionTooltip(view, stateField);\n}\nfunction scrollIntoView(container, element) {\n  let parent = container.getBoundingClientRect();\n  let self = element.getBoundingClientRect();\n  if (self.top < parent.top) container.scrollTop -= parent.top - self.top;else if (self.bottom > parent.bottom) container.scrollTop += self.bottom - parent.bottom;\n}\nfunction score(option) {\n  return (option.boost || 0) * 100 + (option.apply ? 10 : 0) + (option.info ? 5 : 0) + (option.type ? 1 : 0);\n}\nfunction sortOptions(active, state) {\n  let options = [];\n  let sections = null;\n  let addOption = option => {\n    options.push(option);\n    let {\n      section\n    } = option.completion;\n    if (section) {\n      if (!sections) sections = [];\n      let name = typeof section == \"string\" ? section : section.name;\n      if (!sections.some(s => s.name == name)) sections.push(typeof section == \"string\" ? {\n        name\n      } : section);\n    }\n  };\n  for (let a of active) if (a.hasResult()) {\n    if (a.result.filter === false) {\n      let getMatch = a.result.getMatch;\n      for (let option of a.result.options) {\n        let match = [1e9 - options.length];\n        if (getMatch) for (let n of getMatch(option)) match.push(n);\n        addOption(new Option(option, a.source, match, match[0]));\n      }\n    } else {\n      let matcher = new FuzzyMatcher(state.sliceDoc(a.from, a.to)),\n        match1;\n      for (let option1 of a.result.options) if (match1 = matcher.match(option1.label)) {\n        addOption(new Option(option1, a.source, match1, match1[0] + (option1.boost || 0)));\n      }\n    }\n  }\n  if (sections) {\n    let sectionOrder = /* @__PURE__ */Object.create(null),\n      pos = 0;\n    let cmp = (a, b) => {\n      var _a, _b;\n      return ((_a = a.rank) !== null && _a !== void 0 ? _a : 1e9) - ((_b = b.rank) !== null && _b !== void 0 ? _b : 1e9) || (a.name < b.name ? -1 : 1);\n    };\n    for (let s of sections.sort(cmp)) {\n      pos -= 1e5;\n      sectionOrder[s.name] = pos;\n    }\n    for (let option2 of options) {\n      let {\n        section\n      } = option2.completion;\n      if (section) option2.score += sectionOrder[typeof section == \"string\" ? section : section.name];\n    }\n  }\n  let result = [],\n    prev = null;\n  let compare = state.facet(completionConfig).compareCompletions;\n  for (let opt of options.sort((a, b) => b.score - a.score || compare(a.completion, b.completion))) {\n    if (!prev || prev.label != opt.completion.label || prev.detail != opt.completion.detail || prev.type != null && opt.completion.type != null && prev.type != opt.completion.type || prev.apply != opt.completion.apply) result.push(opt);else if (score(opt.completion) > score(prev)) result[result.length - 1] = opt;\n    prev = opt.completion;\n  }\n  return result;\n}\nvar CompletionDialog = class {\n  setSelected(selected, id) {\n    return selected == this.selected || selected >= this.options.length ? this : new CompletionDialog(this.options, makeAttrs(id, selected), this.tooltip, this.timestamp, selected, this.disabled);\n  }\n  static build(active, state, id, prev, conf) {\n    let options = sortOptions(active, state);\n    if (!options.length) {\n      return prev && active.some(a => a.state == 1) ? new CompletionDialog(prev.options, prev.attrs, prev.tooltip, prev.timestamp, prev.selected, true) : null;\n    }\n    let selected = state.facet(completionConfig).selectOnOpen ? 0 : -1;\n    if (prev && prev.selected != selected && prev.selected != -1) {\n      let selectedValue = prev.options[prev.selected].completion;\n      for (let i = 0; i < options.length; i++) if (options[i].completion == selectedValue) {\n        selected = i;\n        break;\n      }\n    }\n    return new CompletionDialog(options, makeAttrs(id, selected), {\n      pos: active.reduce((a, b) => b.hasResult() ? Math.min(a, b.from) : a, 1e8),\n      create: completionTooltip(completionState),\n      above: conf.aboveCursor\n    }, prev ? prev.timestamp : Date.now(), selected, false);\n  }\n  map(changes) {\n    return new CompletionDialog(this.options, this.attrs, Object.assign(Object.assign({}, this.tooltip), {\n      pos: changes.mapPos(this.tooltip.pos)\n    }), this.timestamp, this.selected, this.disabled);\n  }\n  constructor(options, attrs, tooltip, timestamp, selected, disabled) {\n    this.options = options;\n    this.attrs = attrs;\n    this.tooltip = tooltip;\n    this.timestamp = timestamp;\n    this.selected = selected;\n    this.disabled = disabled;\n  }\n};\nvar CompletionState = class {\n  static start() {\n    return new CompletionState(none, \"cm-ac-\" + Math.floor(Math.random() * 2e6).toString(36), null);\n  }\n  update(tr) {\n    let {\n        state\n      } = tr,\n      conf = state.facet(completionConfig);\n    let sources = conf.override || state.languageDataAt(\"autocomplete\", cur(state)).map(asSource);\n    let active = sources.map(source => {\n      let value = this.active.find(s => s.source == source) || new ActiveSource(source, this.active.some(a => a.state != 0) ? 1 : 0);\n      return value.update(tr, conf);\n    });\n    if (active.length == this.active.length && active.every((a, i) => a == this.active[i])) active = this.active;\n    let open = this.open;\n    if (open && tr.docChanged) open = open.map(tr.changes);\n    if (tr.selection || active.some(a => a.hasResult() && tr.changes.touchesRange(a.from, a.to)) || !sameResults(active, this.active)) open = CompletionDialog.build(active, state, this.id, open, conf);else if (open && open.disabled && !active.some(a => a.state == 1)) open = null;\n    if (!open && active.every(a => a.state != 1) && active.some(a => a.hasResult())) active = active.map(a => a.hasResult() ? new ActiveSource(a.source, 0) : a);\n    for (let effect of tr.effects) if (effect.is(setSelectedEffect)) open = open && open.setSelected(effect.value, this.id);\n    return active == this.active && open == this.open ? this : new CompletionState(active, this.id, open);\n  }\n  get tooltip() {\n    return this.open ? this.open.tooltip : null;\n  }\n  get attrs() {\n    return this.open ? this.open.attrs : baseAttrs;\n  }\n  constructor(active, id, open) {\n    this.active = active;\n    this.id = id;\n    this.open = open;\n  }\n};\nfunction sameResults(a, b) {\n  if (a == b) return true;\n  for (let iA = 0, iB = 0;;) {\n    while (iA < a.length && !a[iA].hasResult) iA++;\n    while (iB < b.length && !b[iB].hasResult) iB++;\n    let endA = iA == a.length,\n      endB = iB == b.length;\n    if (endA || endB) return endA == endB;\n    if (a[iA++].result != b[iB++].result) return false;\n  }\n}\nvar baseAttrs = {\n  \"aria-autocomplete\": \"list\"\n};\nfunction makeAttrs(id, selected) {\n  let result = {\n    \"aria-autocomplete\": \"list\",\n    \"aria-haspopup\": \"listbox\",\n    \"aria-controls\": id\n  };\n  if (selected > -1) result[\"aria-activedescendant\"] = id + \"-\" + selected;\n  return result;\n}\nvar none = [];\nfunction getUserEvent(tr) {\n  return tr.isUserEvent(\"input.type\") ? \"input\" : tr.isUserEvent(\"delete.backward\") ? \"delete\" : null;\n}\nvar ActiveSource = class {\n  hasResult() {\n    return false;\n  }\n  update(tr, conf) {\n    let event = getUserEvent(tr),\n      value = this;\n    if (event) value = value.handleUserEvent(tr, event, conf);else if (tr.docChanged) value = value.handleChange(tr);else if (tr.selection && value.state != 0) value = new ActiveSource(value.source, 0);\n    for (let effect of tr.effects) {\n      if (effect.is(startCompletionEffect)) value = new ActiveSource(value.source, 1, effect.value ? cur(tr.state) : -1);else if (effect.is(closeCompletionEffect)) value = new ActiveSource(value.source, 0);else if (effect.is(setActiveEffect)) {\n        for (let active of effect.value) if (active.source == value.source) value = active;\n      }\n    }\n    return value;\n  }\n  handleUserEvent(tr, type, conf) {\n    return type == \"delete\" || !conf.activateOnTyping ? this.map(tr.changes) : new ActiveSource(this.source, 1);\n  }\n  handleChange(tr) {\n    return tr.changes.touchesRange(cur(tr.startState)) ? new ActiveSource(this.source, 0) : this.map(tr.changes);\n  }\n  map(changes) {\n    return changes.empty || this.explicitPos < 0 ? this : new ActiveSource(this.source, this.state, changes.mapPos(this.explicitPos));\n  }\n  constructor(source, state, explicitPos = -1) {\n    this.source = source;\n    this.state = state;\n    this.explicitPos = explicitPos;\n  }\n};\nvar ActiveResult = class extends ActiveSource {\n  hasResult() {\n    return true;\n  }\n  handleUserEvent(tr, type, conf) {\n    var _a;\n    let from = tr.changes.mapPos(this.from),\n      to = tr.changes.mapPos(this.to, 1);\n    let pos = cur(tr.state);\n    if ((this.explicitPos < 0 ? pos <= from : pos < this.from) || pos > to || type == \"delete\" && cur(tr.startState) == this.from) return new ActiveSource(this.source, type == \"input\" && conf.activateOnTyping ? 1 : 0);\n    let explicitPos = this.explicitPos < 0 ? -1 : tr.changes.mapPos(this.explicitPos),\n      updated;\n    if (checkValid(this.result.validFor, tr.state, from, to)) return new ActiveResult(this.source, explicitPos, this.result, from, to);\n    if (this.result.update && (updated = this.result.update(this.result, from, to, new CompletionContext(tr.state, pos, explicitPos >= 0)))) return new ActiveResult(this.source, explicitPos, updated, updated.from, (_a = updated.to) !== null && _a !== void 0 ? _a : cur(tr.state));\n    return new ActiveSource(this.source, 1, explicitPos);\n  }\n  handleChange(tr) {\n    return tr.changes.touchesRange(this.from, this.to) ? new ActiveSource(this.source, 0) : this.map(tr.changes);\n  }\n  map(mapping) {\n    return mapping.empty ? this : new ActiveResult(this.source, this.explicitPos < 0 ? -1 : mapping.mapPos(this.explicitPos), this.result, mapping.mapPos(this.from), mapping.mapPos(this.to, 1));\n  }\n  constructor(source, explicitPos, result, from, to) {\n    super(source, 2, explicitPos);\n    this.result = result;\n    this.from = from;\n    this.to = to;\n  }\n};\nfunction checkValid(validFor, state, from, to) {\n  if (!validFor) return false;\n  let text = state.sliceDoc(from, to);\n  return typeof validFor == \"function\" ? validFor(text, from, to, state) : ensureAnchor(validFor, true).test(text);\n}\nvar setActiveEffect = /* @__PURE__ */StateEffect.define({\n  map(sources, mapping) {\n    return sources.map(s => s.map(mapping));\n  }\n});\nvar setSelectedEffect = /* @__PURE__ */StateEffect.define();\nvar completionState = /* @__PURE__ */StateField.define({\n  create() {\n    return CompletionState.start();\n  },\n  update(value, tr) {\n    return value.update(tr);\n  },\n  provide: f => [showTooltip.from(f, val => val.tooltip), EditorView.contentAttributes.from(f, state => state.attrs)]\n});\nvar baseTheme = /* @__PURE__ */EditorView.baseTheme({\n  \".cm-tooltip.cm-tooltip-autocomplete\": {\n    \"& > ul\": {\n      fontFamily: \"monospace\",\n      whiteSpace: \"nowrap\",\n      overflow: \"hidden auto\",\n      maxWidth_fallback: \"700px\",\n      maxWidth: \"min(700px, 95vw)\",\n      minWidth: \"250px\",\n      maxHeight: \"10em\",\n      height: \"100%\",\n      listStyle: \"none\",\n      margin: 0,\n      padding: 0,\n      \"& > li, & > completion-section\": {\n        padding: \"1px 3px\",\n        lineHeight: 1.2\n      },\n      \"& > li\": {\n        overflowX: \"hidden\",\n        textOverflow: \"ellipsis\",\n        cursor: \"pointer\"\n      },\n      \"& > completion-section\": {\n        display: \"list-item\",\n        borderBottom: \"1px solid silver\",\n        paddingLeft: \"0.5em\",\n        opacity: .7\n      }\n    }\n  },\n  \"&light .cm-tooltip-autocomplete ul li[aria-selected]\": {\n    background: \"#17c\",\n    color: \"white\"\n  },\n  \"&light .cm-tooltip-autocomplete-disabled ul li[aria-selected]\": {\n    background: \"#777\"\n  },\n  \"&dark .cm-tooltip-autocomplete ul li[aria-selected]\": {\n    background: \"#347\",\n    color: \"white\"\n  },\n  \"&dark .cm-tooltip-autocomplete-disabled ul li[aria-selected]\": {\n    background: \"#444\"\n  },\n  \".cm-completionListIncompleteTop:before, .cm-completionListIncompleteBottom:after\": {\n    content: '\"\\xb7\\xb7\\xb7\"',\n    opacity: .5,\n    display: \"block\",\n    textAlign: \"center\"\n  },\n  \".cm-tooltip.cm-completionInfo\": {\n    position: \"absolute\",\n    padding: \"3px 9px\",\n    width: \"max-content\",\n    maxWidth: `${400}px`,\n    boxSizing: \"border-box\"\n  },\n  \".cm-completionInfo.cm-completionInfo-left\": {\n    right: \"100%\"\n  },\n  \".cm-completionInfo.cm-completionInfo-right\": {\n    left: \"100%\"\n  },\n  \".cm-completionInfo.cm-completionInfo-left-narrow\": {\n    right: `${30}px`\n  },\n  \".cm-completionInfo.cm-completionInfo-right-narrow\": {\n    left: `${30}px`\n  },\n  \"&light .cm-snippetField\": {\n    backgroundColor: \"#00000022\"\n  },\n  \"&dark .cm-snippetField\": {\n    backgroundColor: \"#ffffff22\"\n  },\n  \".cm-snippetFieldPosition\": {\n    verticalAlign: \"text-top\",\n    width: 0,\n    height: \"1.15em\",\n    display: \"inline-block\",\n    margin: \"0 -0.7px -.7em\",\n    borderLeft: \"1.4px dotted #888\"\n  },\n  \".cm-completionMatchedText\": {\n    textDecoration: \"underline\"\n  },\n  \".cm-completionDetail\": {\n    marginLeft: \"0.5em\",\n    fontStyle: \"italic\"\n  },\n  \".cm-completionIcon\": {\n    fontSize: \"90%\",\n    width: \".8em\",\n    display: \"inline-block\",\n    textAlign: \"center\",\n    paddingRight: \".6em\",\n    opacity: \"0.6\",\n    boxSizing: \"content-box\"\n  },\n  \".cm-completionIcon-function, .cm-completionIcon-method\": {\n    \"&:after\": {\n      content: \"'\u0192'\"\n    }\n  },\n  \".cm-completionIcon-class\": {\n    \"&:after\": {\n      content: \"'\u25CB'\"\n    }\n  },\n  \".cm-completionIcon-interface\": {\n    \"&:after\": {\n      content: \"'\u25CC'\"\n    }\n  },\n  \".cm-completionIcon-variable\": {\n    \"&:after\": {\n      content: \"'\uD835\uDC65'\"\n    }\n  },\n  \".cm-completionIcon-constant\": {\n    \"&:after\": {\n      content: \"'\uD835\uDC36'\"\n    }\n  },\n  \".cm-completionIcon-type\": {\n    \"&:after\": {\n      content: \"'\uD835\uDC61'\"\n    }\n  },\n  \".cm-completionIcon-enum\": {\n    \"&:after\": {\n      content: \"'\u222A'\"\n    }\n  },\n  \".cm-completionIcon-property\": {\n    \"&:after\": {\n      content: \"'\u25A1'\"\n    }\n  },\n  \".cm-completionIcon-keyword\": {\n    \"&:after\": {\n      content: \"'\uD83D\uDD11\uFE0E'\"\n    }\n  },\n  \".cm-completionIcon-namespace\": {\n    \"&:after\": {\n      content: \"'\u25A2'\"\n    }\n  },\n  \".cm-completionIcon-text\": {\n    \"&:after\": {\n      content: \"'abc'\",\n      fontSize: \"50%\",\n      verticalAlign: \"middle\"\n    }\n  }\n});\nvar FieldPos = class {\n  constructor(field, line, from, to) {\n    this.field = field;\n    this.line = line;\n    this.from = from;\n    this.to = to;\n  }\n};\nvar FieldRange = class {\n  map(changes) {\n    let from = changes.mapPos(this.from, -1, MapMode.TrackDel);\n    let to = changes.mapPos(this.to, 1, MapMode.TrackDel);\n    return from == null || to == null ? null : new FieldRange(this.field, from, to);\n  }\n  constructor(field, from, to) {\n    this.field = field;\n    this.from = from;\n    this.to = to;\n  }\n};\nvar Snippet = class {\n  instantiate(state, pos) {\n    let text = [],\n      lineStart = [pos];\n    let lineObj = state.doc.lineAt(pos),\n      baseIndent = /^\\s*/.exec(lineObj.text)[0];\n    for (let line of this.lines) {\n      if (text.length) {\n        let indent = baseIndent,\n          tabs = /^\\t*/.exec(line)[0].length;\n        for (let i = 0; i < tabs; i++) indent += state.facet(indentUnit);\n        lineStart.push(pos + indent.length - tabs);\n        line = indent + line.slice(tabs);\n      }\n      text.push(line);\n      pos += line.length + 1;\n    }\n    let ranges = this.fieldPositions.map(pos2 => new FieldRange(pos2.field, lineStart[pos2.line] + pos2.from, lineStart[pos2.line] + pos2.to));\n    return {\n      text,\n      ranges\n    };\n  }\n  static parse(template) {\n    let fields = [];\n    let lines = [],\n      positions = [],\n      m;\n    for (let line of template.split(/\\r\\n?|\\n/)) {\n      while (m = /[#$]\\{(?:(\\d+)(?::([^}]*))?|([^}]*))\\}/.exec(line)) {\n        let seq = m[1] ? +m[1] : null,\n          name = m[2] || m[3] || \"\",\n          found = -1;\n        for (let i = 0; i < fields.length; i++) {\n          if (seq != null ? fields[i].seq == seq : name ? fields[i].name == name : false) found = i;\n        }\n        if (found < 0) {\n          let i1 = 0;\n          while (i1 < fields.length && (seq == null || fields[i1].seq != null && fields[i1].seq < seq)) i1++;\n          fields.splice(i1, 0, {\n            seq,\n            name\n          });\n          found = i1;\n          for (let pos of positions) if (pos.field >= found) pos.field++;\n        }\n        positions.push(new FieldPos(found, lines.length, m.index, m.index + name.length));\n        line = line.slice(0, m.index) + name + line.slice(m.index + m[0].length);\n      }\n      for (let esc; esc = /\\\\([{}])/.exec(line);) {\n        line = line.slice(0, esc.index) + esc[1] + line.slice(esc.index + esc[0].length);\n        for (let pos1 of positions) if (pos1.line == lines.length && pos1.from > esc.index) {\n          pos1.from--;\n          pos1.to--;\n        }\n      }\n      lines.push(line);\n    }\n    return new Snippet(lines, positions);\n  }\n  constructor(lines, fieldPositions) {\n    this.lines = lines;\n    this.fieldPositions = fieldPositions;\n  }\n};\nvar fieldMarker = /* @__PURE__ */Decoration.widget({\n  widget: /* @__PURE__ */new class extends WidgetType {\n    toDOM() {\n      let span = document.createElement(\"span\");\n      span.className = \"cm-snippetFieldPosition\";\n      return span;\n    }\n    ignoreEvent() {\n      return false;\n    }\n  }()\n});\nvar fieldRange = /* @__PURE__ */Decoration.mark({\n  class: \"cm-snippetField\"\n});\nvar ActiveSnippet = class {\n  map(changes) {\n    let ranges = [];\n    for (let r of this.ranges) {\n      let mapped = r.map(changes);\n      if (!mapped) return null;\n      ranges.push(mapped);\n    }\n    return new ActiveSnippet(ranges, this.active);\n  }\n  selectionInsideField(sel) {\n    return sel.ranges.every(range => this.ranges.some(r => r.field == this.active && r.from <= range.from && r.to >= range.to));\n  }\n  constructor(ranges, active) {\n    this.ranges = ranges;\n    this.active = active;\n    this.deco = Decoration.set(ranges.map(r => (r.from == r.to ? fieldMarker : fieldRange).range(r.from, r.to)));\n  }\n};\nvar setActive = /* @__PURE__ */StateEffect.define({\n  map(value, changes) {\n    return value && value.map(changes);\n  }\n});\nvar moveToField = /* @__PURE__ */StateEffect.define();\nvar snippetState = /* @__PURE__ */StateField.define({\n  create() {\n    return null;\n  },\n  update(value, tr) {\n    for (let effect of tr.effects) {\n      if (effect.is(setActive)) return effect.value;\n      if (effect.is(moveToField) && value) return new ActiveSnippet(value.ranges, effect.value);\n    }\n    if (value && tr.docChanged) value = value.map(tr.changes);\n    if (value && tr.selection && !value.selectionInsideField(tr.selection)) value = null;\n    return value;\n  },\n  provide: f => EditorView.decorations.from(f, val => val ? val.deco : Decoration.none)\n});\nfunction fieldSelection(ranges, field) {\n  return EditorSelection.create(ranges.filter(r => r.field == field).map(r => EditorSelection.range(r.from, r.to)));\n}\nfunction snippet(template) {\n  let snippet2 = Snippet.parse(template);\n  return (editor, completion, from, to) => {\n    let {\n      text,\n      ranges\n    } = snippet2.instantiate(editor.state, from);\n    let spec = {\n      changes: {\n        from,\n        to,\n        insert: Text.of(text)\n      },\n      scrollIntoView: true,\n      annotations: completion ? pickedCompletion.of(completion) : void 0\n    };\n    if (ranges.length) spec.selection = fieldSelection(ranges, 0);\n    if (ranges.length > 1) {\n      let active = new ActiveSnippet(ranges, 0);\n      let effects = spec.effects = [setActive.of(active)];\n      if (editor.state.field(snippetState, false) === void 0) effects.push(StateEffect.appendConfig.of([snippetState, addSnippetKeymap, snippetPointerHandler, baseTheme]));\n    }\n    editor.dispatch(editor.state.update(spec));\n  };\n}\nfunction moveField(dir) {\n  return ({\n    state,\n    dispatch\n  }) => {\n    let active = state.field(snippetState, false);\n    if (!active || dir < 0 && active.active == 0) return false;\n    let next = active.active + dir,\n      last = dir > 0 && !active.ranges.some(r => r.field == next + dir);\n    dispatch(state.update({\n      selection: fieldSelection(active.ranges, next),\n      effects: setActive.of(last ? null : new ActiveSnippet(active.ranges, next))\n    }));\n    return true;\n  };\n}\nvar clearSnippet = ({\n  state,\n  dispatch\n}) => {\n  let active = state.field(snippetState, false);\n  if (!active) return false;\n  dispatch(state.update({\n    effects: setActive.of(null)\n  }));\n  return true;\n};\nvar nextSnippetField = /* @__PURE__ */moveField(1);\nvar prevSnippetField = /* @__PURE__ */moveField(-1);\nfunction hasNextSnippetField(state) {\n  let active = state.field(snippetState, false);\n  return !!(active && active.ranges.some(r => r.field == active.active + 1));\n}\nfunction hasPrevSnippetField(state) {\n  let active = state.field(snippetState, false);\n  return !!(active && active.active > 0);\n}\nvar defaultSnippetKeymap = [{\n  key: \"Tab\",\n  run: nextSnippetField,\n  shift: prevSnippetField\n}, {\n  key: \"Escape\",\n  run: clearSnippet\n}];\nvar snippetKeymap = /* @__PURE__ */Facet.define({\n  combine(maps) {\n    return maps.length ? maps[0] : defaultSnippetKeymap;\n  }\n});\nvar addSnippetKeymap = /* @__PURE__ */Prec.highest( /* @__PURE__ */keymap.compute([snippetKeymap], state => state.facet(snippetKeymap)));\nfunction snippetCompletion(template, completion) {\n  return Object.assign(Object.assign({}, completion), {\n    apply: snippet(template)\n  });\n}\nvar snippetPointerHandler = /* @__PURE__ */EditorView.domEventHandlers({\n  mousedown(event, view) {\n    let active = view.state.field(snippetState, false),\n      pos;\n    if (!active || (pos = view.posAtCoords({\n      x: event.clientX,\n      y: event.clientY\n    })) == null) return false;\n    let match = active.ranges.find(r => r.from <= pos && r.to >= pos);\n    if (!match || match.field == active.active) return false;\n    view.dispatch({\n      selection: fieldSelection(active.ranges, match.field),\n      effects: setActive.of(active.ranges.some(r => r.field > match.field) ? new ActiveSnippet(active.ranges, match.field) : null)\n    });\n    return true;\n  }\n});\nfunction wordRE(wordChars) {\n  let escaped = wordChars.replace(/[\\\\[.+*?(){|^$]/g, \"\\\\$&\");\n  try {\n    return new RegExp(`[\\\\p{Alphabetic}\\\\p{Number}_${escaped}]+`, \"ug\");\n  } catch (_a) {\n    return new RegExp(`[w${escaped}]`, \"g\");\n  }\n}\nfunction mapRE(re, f) {\n  return new RegExp(f(re.source), re.unicode ? \"u\" : \"\");\n}\nvar wordCaches = /* @__PURE__ */Object.create(null);\nfunction wordCache(wordChars) {\n  return wordCaches[wordChars] || (wordCaches[wordChars] = /* @__PURE__ */new WeakMap());\n}\nfunction storeWords(doc, wordRE2, result, seen, ignoreAt) {\n  for (let lines = doc.iterLines(), pos = 0; !lines.next().done;) {\n    let {\n        value\n      } = lines,\n      m;\n    wordRE2.lastIndex = 0;\n    while (m = wordRE2.exec(value)) {\n      if (!seen[m[0]] && pos + m.index != ignoreAt) {\n        result.push({\n          type: \"text\",\n          label: m[0]\n        });\n        seen[m[0]] = true;\n        if (result.length >= 2e3) return;\n      }\n    }\n    pos += value.length + 1;\n  }\n}\nfunction collectWords(doc, cache, wordRE2, to, ignoreAt) {\n  let big = doc.length >= 1e3;\n  let cached = big && cache.get(doc);\n  if (cached) return cached;\n  let result = [],\n    seen = /* @__PURE__ */Object.create(null);\n  if (doc.children) {\n    let pos = 0;\n    for (let ch of doc.children) {\n      if (ch.length >= 1e3) {\n        for (let c of collectWords(ch, cache, wordRE2, to - pos, ignoreAt - pos)) {\n          if (!seen[c.label]) {\n            seen[c.label] = true;\n            result.push(c);\n          }\n        }\n      } else {\n        storeWords(ch, wordRE2, result, seen, ignoreAt - pos);\n      }\n      pos += ch.length + 1;\n    }\n  } else {\n    storeWords(doc, wordRE2, result, seen, ignoreAt);\n  }\n  if (big && result.length < 2e3) cache.set(doc, result);\n  return result;\n}\nvar completeAnyWord = context => {\n  let wordChars = context.state.languageDataAt(\"wordChars\", context.pos).join(\"\");\n  let re = wordRE(wordChars);\n  let token = context.matchBefore(mapRE(re, s => s + \"$\"));\n  if (!token && !context.explicit) return null;\n  let from = token ? token.from : context.pos;\n  let options = collectWords(context.state.doc, wordCache(wordChars), re, 5e4, from);\n  return {\n    from,\n    options,\n    validFor: mapRE(re, s => \"^\" + s)\n  };\n};\nvar defaults = {\n  brackets: [\"(\", \"[\", \"{\", \"'\", '\"'],\n  before: \")]}:;>\",\n  stringPrefixes: []\n};\nvar closeBracketEffect = /* @__PURE__ */StateEffect.define({\n  map(value, mapping) {\n    let mapped = mapping.mapPos(value, -1, MapMode.TrackAfter);\n    return mapped == null ? void 0 : mapped;\n  }\n});\nvar closedBracket = /* @__PURE__ */new class extends RangeValue {}();\nclosedBracket.startSide = 1;\nclosedBracket.endSide = -1;\nvar bracketState = /* @__PURE__ */StateField.define({\n  create() {\n    return RangeSet.empty;\n  },\n  update(value, tr) {\n    if (tr.selection) {\n      let lineStart = tr.state.doc.lineAt(tr.selection.main.head).from;\n      let prevLineStart = tr.startState.doc.lineAt(tr.startState.selection.main.head).from;\n      if (lineStart != tr.changes.mapPos(prevLineStart, -1)) value = RangeSet.empty;\n    }\n    value = value.map(tr.changes);\n    for (let effect of tr.effects) if (effect.is(closeBracketEffect)) value = value.update({\n      add: [closedBracket.range(effect.value, effect.value + 1)]\n    });\n    return value;\n  }\n});\nfunction closeBrackets() {\n  return [inputHandler, bracketState];\n}\nvar definedClosing = \"()[]{}<>\";\nfunction closing(ch) {\n  for (let i = 0; i < definedClosing.length; i += 2) if (definedClosing.charCodeAt(i) == ch) return definedClosing.charAt(i + 1);\n  return fromCodePoint(ch < 128 ? ch : ch + 1);\n}\nfunction config(state, pos) {\n  return state.languageDataAt(\"closeBrackets\", pos)[0] || defaults;\n}\nvar android = typeof navigator == \"object\" && /* @__PURE__ */ /Android\\b/.test(navigator.userAgent);\nvar inputHandler = /* @__PURE__ */EditorView.inputHandler.of((view, from, to, insert) => {\n  if ((android ? view.composing : view.compositionStarted) || view.state.readOnly) return false;\n  let sel = view.state.selection.main;\n  if (insert.length > 2 || insert.length == 2 && codePointSize(codePointAt(insert, 0)) == 1 || from != sel.from || to != sel.to) return false;\n  let tr = insertBracket(view.state, insert);\n  if (!tr) return false;\n  view.dispatch(tr);\n  return true;\n});\nvar deleteBracketPair = ({\n  state,\n  dispatch\n}) => {\n  if (state.readOnly) return false;\n  let conf = config(state, state.selection.main.head);\n  let tokens = conf.brackets || defaults.brackets;\n  let dont = null,\n    changes = state.changeByRange(range => {\n      if (range.empty) {\n        let before = prevChar(state.doc, range.head);\n        for (let token of tokens) {\n          if (token == before && nextChar(state.doc, range.head) == closing(codePointAt(token, 0))) return {\n            changes: {\n              from: range.head - token.length,\n              to: range.head + token.length\n            },\n            range: EditorSelection.cursor(range.head - token.length)\n          };\n        }\n      }\n      return {\n        range: dont = range\n      };\n    });\n  if (!dont) dispatch(state.update(changes, {\n    scrollIntoView: true,\n    userEvent: \"delete.backward\"\n  }));\n  return !dont;\n};\nvar closeBracketsKeymap = [{\n  key: \"Backspace\",\n  run: deleteBracketPair\n}];\nfunction insertBracket(state, bracket) {\n  let conf = config(state, state.selection.main.head);\n  let tokens = conf.brackets || defaults.brackets;\n  for (let tok of tokens) {\n    let closed = closing(codePointAt(tok, 0));\n    if (bracket == tok) return closed == tok ? handleSame(state, tok, tokens.indexOf(tok + tok + tok) > -1, conf) : handleOpen(state, tok, closed, conf.before || defaults.before);\n    if (bracket == closed && closedBracketAt(state, state.selection.main.from)) return handleClose(state, tok, closed);\n  }\n  return null;\n}\nfunction closedBracketAt(state, pos) {\n  let found = false;\n  state.field(bracketState).between(0, state.doc.length, from => {\n    if (from == pos) found = true;\n  });\n  return found;\n}\nfunction nextChar(doc, pos) {\n  let next = doc.sliceString(pos, pos + 2);\n  return next.slice(0, codePointSize(codePointAt(next, 0)));\n}\nfunction prevChar(doc, pos) {\n  let prev = doc.sliceString(pos - 2, pos);\n  return codePointSize(codePointAt(prev, 0)) == prev.length ? prev : prev.slice(1);\n}\nfunction handleOpen(state, open, close, closeBefore) {\n  let dont = null,\n    changes = state.changeByRange(range => {\n      if (!range.empty) return {\n        changes: [{\n          insert: open,\n          from: range.from\n        }, {\n          insert: close,\n          from: range.to\n        }],\n        effects: closeBracketEffect.of(range.to + open.length),\n        range: EditorSelection.range(range.anchor + open.length, range.head + open.length)\n      };\n      let next = nextChar(state.doc, range.head);\n      if (!next || /\\s/.test(next) || closeBefore.indexOf(next) > -1) return {\n        changes: {\n          insert: open + close,\n          from: range.head\n        },\n        effects: closeBracketEffect.of(range.head + open.length),\n        range: EditorSelection.cursor(range.head + open.length)\n      };\n      return {\n        range: dont = range\n      };\n    });\n  return dont ? null : state.update(changes, {\n    scrollIntoView: true,\n    userEvent: \"input.type\"\n  });\n}\nfunction handleClose(state, _open, close) {\n  let dont = null,\n    changes = state.changeByRange(range => {\n      if (range.empty && nextChar(state.doc, range.head) == close) return {\n        changes: {\n          from: range.head,\n          to: range.head + close.length,\n          insert: close\n        },\n        range: EditorSelection.cursor(range.head + close.length)\n      };\n      return dont = {\n        range\n      };\n    });\n  return dont ? null : state.update(changes, {\n    scrollIntoView: true,\n    userEvent: \"input.type\"\n  });\n}\nfunction handleSame(state, token, allowTriple, config2) {\n  let stringPrefixes = config2.stringPrefixes || defaults.stringPrefixes;\n  let dont = null,\n    changes = state.changeByRange(range => {\n      if (!range.empty) return {\n        changes: [{\n          insert: token,\n          from: range.from\n        }, {\n          insert: token,\n          from: range.to\n        }],\n        effects: closeBracketEffect.of(range.to + token.length),\n        range: EditorSelection.range(range.anchor + token.length, range.head + token.length)\n      };\n      let pos = range.head,\n        next = nextChar(state.doc, pos),\n        start;\n      if (next == token) {\n        if (nodeStart(state, pos)) {\n          return {\n            changes: {\n              insert: token + token,\n              from: pos\n            },\n            effects: closeBracketEffect.of(pos + token.length),\n            range: EditorSelection.cursor(pos + token.length)\n          };\n        } else if (closedBracketAt(state, pos)) {\n          let isTriple = allowTriple && state.sliceDoc(pos, pos + token.length * 3) == token + token + token;\n          let content = isTriple ? token + token + token : token;\n          return {\n            changes: {\n              from: pos,\n              to: pos + content.length,\n              insert: content\n            },\n            range: EditorSelection.cursor(pos + content.length)\n          };\n        }\n      } else if (allowTriple && state.sliceDoc(pos - 2 * token.length, pos) == token + token && (start = canStartStringAt(state, pos - 2 * token.length, stringPrefixes)) > -1 && nodeStart(state, start)) {\n        return {\n          changes: {\n            insert: token + token + token + token,\n            from: pos\n          },\n          effects: closeBracketEffect.of(pos + token.length),\n          range: EditorSelection.cursor(pos + token.length)\n        };\n      } else if (state.charCategorizer(pos)(next) != CharCategory.Word) {\n        if (canStartStringAt(state, pos, stringPrefixes) > -1 && !probablyInString(state, pos, token, stringPrefixes)) return {\n          changes: {\n            insert: token + token,\n            from: pos\n          },\n          effects: closeBracketEffect.of(pos + token.length),\n          range: EditorSelection.cursor(pos + token.length)\n        };\n      }\n      return {\n        range: dont = range\n      };\n    });\n  return dont ? null : state.update(changes, {\n    scrollIntoView: true,\n    userEvent: \"input.type\"\n  });\n}\nfunction nodeStart(state, pos) {\n  let tree = syntaxTree(state).resolveInner(pos + 1);\n  return tree.parent && tree.from == pos;\n}\nfunction probablyInString(state, pos, quoteToken, prefixes) {\n  let node = syntaxTree(state).resolveInner(pos, -1);\n  let maxPrefix = prefixes.reduce((m, p) => Math.max(m, p.length), 0);\n  for (let i = 0; i < 5; i++) {\n    let start = state.sliceDoc(node.from, Math.min(node.to, node.from + quoteToken.length + maxPrefix));\n    let quotePos = start.indexOf(quoteToken);\n    if (!quotePos || quotePos > -1 && prefixes.indexOf(start.slice(0, quotePos)) > -1) {\n      let first = node.firstChild;\n      while (first && first.from == node.from && first.to - first.from > quoteToken.length + quotePos) {\n        if (state.sliceDoc(first.to - quoteToken.length, first.to) == quoteToken) return false;\n        first = first.firstChild;\n      }\n      return true;\n    }\n    let parent = node.to == pos && node.parent;\n    if (!parent) break;\n    node = parent;\n  }\n  return false;\n}\nfunction canStartStringAt(state, pos, prefixes) {\n  let charCat = state.charCategorizer(pos);\n  if (charCat(state.sliceDoc(pos - 1, pos)) != CharCategory.Word) return pos;\n  for (let prefix of prefixes) {\n    let start = pos - prefix.length;\n    if (state.sliceDoc(start, pos) == prefix && charCat(state.sliceDoc(start - 1, start)) != CharCategory.Word) return start;\n  }\n  return -1;\n}\nfunction autocompletion(config2 = {}) {\n  return [completionState, completionConfig.of(config2), completionPlugin, completionKeymapExt, baseTheme];\n}\nvar completionKeymap = [{\n  key: \"Ctrl-Space\",\n  run: startCompletion\n}, {\n  key: \"Escape\",\n  run: closeCompletion\n}, {\n  key: \"ArrowDown\",\n  run: /* @__PURE__ */moveCompletionSelection(true)\n}, {\n  key: \"ArrowUp\",\n  run: /* @__PURE__ */moveCompletionSelection(false)\n}, {\n  key: \"PageDown\",\n  run: /* @__PURE__ */moveCompletionSelection(true, \"page\")\n}, {\n  key: \"PageUp\",\n  run: /* @__PURE__ */moveCompletionSelection(false, \"page\")\n}, {\n  key: \"Enter\",\n  run: acceptCompletion\n}];\nvar completionKeymapExt = /* @__PURE__ */Prec.highest( /* @__PURE__ */keymap.computeN([completionConfig], state => state.facet(completionConfig).defaultKeymap ? [completionKeymap] : []));\nfunction completionStatus(state) {\n  let cState = state.field(completionState, false);\n  return cState && cState.active.some(a => a.state == 1) ? \"pending\" : cState && cState.active.some(a => a.state != 0) ? \"active\" : null;\n}\nvar completionArrayCache = /* @__PURE__ */new WeakMap();\nfunction currentCompletions(state) {\n  var _a;\n  let open = (_a = state.field(completionState, false)) === null || _a === void 0 ? void 0 : _a.open;\n  if (!open || open.disabled) return [];\n  let completions = completionArrayCache.get(open.options);\n  if (!completions) completionArrayCache.set(open.options, completions = open.options.map(o => o.completion));\n  return completions;\n}\nfunction selectedCompletion(state) {\n  var _a;\n  let open = (_a = state.field(completionState, false)) === null || _a === void 0 ? void 0 : _a.open;\n  return open && !open.disabled && open.selected >= 0 ? open.options[open.selected].completion : null;\n}\nfunction selectedCompletionIndex(state) {\n  var _a;\n  let open = (_a = state.field(completionState, false)) === null || _a === void 0 ? void 0 : _a.open;\n  return open && !open.disabled && open.selected >= 0 ? open.selected : null;\n}\nfunction setSelectedCompletion(index) {\n  return setSelectedEffect.of(index);\n}\nexport { CompletionContext, acceptCompletion, autocompletion, clearSnippet, closeBrackets, closeBracketsKeymap, closeCompletion, completeAnyWord, completeFromList, completionKeymap, completionStatus, currentCompletions, deleteBracketPair, hasNextSnippetField, hasPrevSnippetField, ifIn, ifNotIn, insertBracket, insertCompletionText, moveCompletionSelection, nextSnippetField, pickedCompletion, prevSnippetField, selectedCompletion, selectedCompletionIndex, setSelectedCompletion, snippet, snippetCompletion, snippetKeymap, startCompletion };\nexport const __FramerMetadata__ = {\n  \"exports\": {\n    \"snippetKeymap\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"hasPrevSnippetField\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"CompletionContext\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"selectedCompletion\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"autocompletion\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"closeBracketsKeymap\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"snippet\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"deleteBracketPair\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"completeAnyWord\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"nextSnippetField\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"pickedCompletion\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"acceptCompletion\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"setSelectedCompletion\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"closeBrackets\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"completionStatus\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"prevSnippetField\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"startCompletion\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"hasNextSnippetField\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"currentCompletions\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"ifNotIn\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"ifIn\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"insertBracket\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"closeCompletion\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"snippetCompletion\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"selectedCompletionIndex\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"completeFromList\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"insertCompletionText\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"moveCompletionSelection\": {\n      \"type\": \"function\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"clearSnippet\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"completionKeymap\": {\n      \"type\": \"variable\",\n      \"annotations\": {\n        \"framerContractVersion\": \"1\"\n      }\n    },\n    \"__FramerMetadata__\": {\n      \"type\": \"variable\"\n    }\n  }\n};"],
  "mappings": "uNA6DA,SAASA,EAAMC,EAAO,CACpB,IAAIC,EAAO,OAAO,KAAKD,CAAK,EAAE,KAAK,EAAE,EACjCE,EAAQ,KAAK,KAAKD,CAAI,EAC1B,OAAIC,IAAOD,EAAOA,EAAK,QAAQ,MAAO,EAAE,GACjC,IAAIC,EAAQ,MAAQ,KAAKD,EAAK,QAAQ,WAAY,MAAM,IACjE,CACA,SAASE,EAAYC,EAAS,CAC5B,IAAIC,EAAuB,OAAO,OAAO,IAAI,EAC3CC,EAAsB,OAAO,OAAO,IAAI,EAC1C,OAAS,CACP,MAAAC,CACF,IAAKH,EAAS,CACZC,EAAME,EAAM,CAAC,CAAC,EAAI,GAClB,QAASC,EAAI,EAAGA,EAAID,EAAM,OAAQC,IAAKF,EAAKC,EAAMC,CAAC,CAAC,EAAI,GAE1D,IAAIC,EAASV,EAAMM,CAAK,EAAIN,EAAMO,CAAI,EAAI,KAC1C,MAAO,CAAC,IAAI,OAAO,IAAMG,CAAM,EAAG,IAAI,OAAOA,CAAM,CAAC,CACtD,CACA,SAASC,GAAiBC,EAAM,CAC9B,IAAIP,EAAUO,EAAK,IAAIC,GAAK,OAAOA,GAAK,SAAW,CACjD,MAAOA,CACT,EAAIA,CAAC,EACD,CAACC,EAAUC,CAAK,EAAIV,EAAQ,MAAMQ,GAAK,QAAQ,KAAKA,EAAE,KAAK,CAAC,EAAI,CAAC,OAAQ,MAAM,EAAIT,EAAYC,CAAO,EAC1G,OAAOW,GAAW,CAChB,IAAIC,EAAQD,EAAQ,YAAYD,CAAK,EACrC,OAAOE,GAASD,EAAQ,SAAW,CACjC,KAAMC,EAAQA,EAAM,KAAOD,EAAQ,IACnC,QAAAX,EACA,SAAAS,CACF,EAAI,IACN,CACF,CAUA,SAASI,GAAQC,EAAOC,EAAQ,CAC9B,OAAOC,GAAW,CAChB,QAASC,EAAMC,EAAWF,EAAQ,KAAK,EAAE,aAAaA,EAAQ,IAAK,EAAE,EAAGC,EAAKA,EAAMA,EAAI,OAAQ,CAC7F,GAAIH,EAAM,QAAQG,EAAI,IAAI,EAAI,GAAI,OAAO,KACzC,GAAIA,EAAI,KAAK,MAAO,MAEtB,OAAOF,EAAOC,CAAO,CACvB,CACF,CAsBA,IAAIG,GAAkCC,EAAW,OAAO,EAi4BxD,IAAIC,GAA2BC,EAAW,UAAU,CAClD,sCAAuC,CACrC,SAAU,CACR,WAAY,YACZ,WAAY,SACZ,SAAU,cACV,kBAAmB,QACnB,SAAU,mBACV,SAAU,QACV,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,EACR,QAAS,EACT,iCAAkC,CAChC,QAAS,UACT,WAAY,GACd,EACA,SAAU,CACR,UAAW,SACX,aAAc,WACd,OAAQ,SACV,EACA,yBAA0B,CACxB,QAAS,YACT,aAAc,mBACd,YAAa,QACb,QAAS,EACX,CACF,CACF,EACA,uDAAwD,CACtD,WAAY,OACZ,MAAO,OACT,EACA,gEAAiE,CAC/D,WAAY,MACd,EACA,sDAAuD,CACrD,WAAY,OACZ,MAAO,OACT,EACA,+DAAgE,CAC9D,WAAY,MACd,EACA,mFAAoF,CAClF,QAAS,iBACT,QAAS,GACT,QAAS,QACT,UAAW,QACb,EACA,gCAAiC,CAC/B,SAAU,WACV,QAAS,UACT,MAAO,cACP,SAAU,QACV,UAAW,YACb,EACA,4CAA6C,CAC3C,MAAO,MACT,EACA,6CAA8C,CAC5C,KAAM,MACR,EACA,mDAAoD,CAClD,MAAO,MACT,EACA,oDAAqD,CACnD,KAAM,MACR,EACA,0BAA2B,CACzB,gBAAiB,WACnB,EACA,yBAA0B,CACxB,gBAAiB,WACnB,EACA,2BAA4B,CAC1B,cAAe,WACf,MAAO,EACP,OAAQ,SACR,QAAS,eACT,OAAQ,iBACR,WAAY,mBACd,EACA,4BAA6B,CAC3B,eAAgB,WAClB,EACA,uBAAwB,CACtB,WAAY,QACZ,UAAW,QACb,EACA,qBAAsB,CACpB,SAAU,MACV,MAAO,OACP,QAAS,eACT,UAAW,SACX,aAAc,OACd,QAAS,MACT,UAAW,aACb,EACA,yDAA0D,CACxD,UAAW,CACT,QAAS,UACX,CACF,EACA,2BAA4B,CAC1B,UAAW,CACT,QAAS,UACX,CACF,EACA,+BAAgC,CAC9B,UAAW,CACT,QAAS,UACX,CACF,EACA,8BAA+B,CAC7B,UAAW,CACT,QAAS,aACX,CACF,EACA,8BAA+B,CAC7B,UAAW,CACT,QAAS,aACX,CACF,EACA,0BAA2B,CACzB,UAAW,CACT,QAAS,aACX,CACF,EACA,0BAA2B,CACzB,UAAW,CACT,QAAS,UACX,CACF,EACA,8BAA+B,CAC7B,UAAW,CACT,QAAS,UACX,CACF,EACA,6BAA8B,CAC5B,UAAW,CACT,QAAS,mBACX,CACF,EACA,+BAAgC,CAC9B,UAAW,CACT,QAAS,UACX,CACF,EACA,0BAA2B,CACzB,UAAW,CACT,QAAS,QACT,SAAU,MACV,cAAe,QACjB,CACF,CACF,CAAC,EACGC,GAAW,KAAM,CACnB,YAAYC,EAAOC,EAAMC,EAAMC,EAAI,CACjC,KAAK,MAAQH,EACb,KAAK,KAAOC,EACZ,KAAK,KAAOC,EACZ,KAAK,GAAKC,CACZ,CACF,EACIC,EAAa,KAAM,CACrB,IAAIC,EAAS,CACX,IAAIH,EAAOG,EAAQ,OAAO,KAAK,KAAM,GAAIC,EAAQ,QAAQ,EACrDH,EAAKE,EAAQ,OAAO,KAAK,GAAI,EAAGC,EAAQ,QAAQ,EACpD,OAAOJ,GAAQ,MAAQC,GAAM,KAAO,KAAO,IAAIC,EAAW,KAAK,MAAOF,EAAMC,CAAE,CAChF,CACA,YAAYH,EAAOE,EAAMC,EAAI,CAC3B,KAAK,MAAQH,EACb,KAAK,KAAOE,EACZ,KAAK,GAAKC,CACZ,CACF,EACII,EAAU,KAAM,CAClB,YAAYC,EAAOC,EAAK,CACtB,IAAIC,EAAO,CAAC,EACVC,EAAY,CAACF,CAAG,EACdG,EAAUJ,EAAM,IAAI,OAAOC,CAAG,EAChCI,EAAa,OAAO,KAAKD,EAAQ,IAAI,EAAE,CAAC,EAC1C,QAASX,KAAQ,KAAK,MAAO,CAC3B,GAAIS,EAAK,OAAQ,CACf,IAAII,EAASD,EACXE,EAAO,OAAO,KAAKd,CAAI,EAAE,CAAC,EAAE,OAC9B,QAASe,EAAI,EAAGA,EAAID,EAAMC,IAAKF,GAAUN,EAAM,MAAMS,CAAU,EAC/DN,EAAU,KAAKF,EAAMK,EAAO,OAASC,CAAI,EACzCd,EAAOa,EAASb,EAAK,MAAMc,CAAI,EAEjCL,EAAK,KAAKT,CAAI,EACdQ,GAAOR,EAAK,OAAS,EAEvB,IAAIiB,EAAS,KAAK,eAAe,IAAIC,GAAQ,IAAIf,EAAWe,EAAK,MAAOR,EAAUQ,EAAK,IAAI,EAAIA,EAAK,KAAMR,EAAUQ,EAAK,IAAI,EAAIA,EAAK,EAAE,CAAC,EACzI,MAAO,CACL,KAAAT,EACA,OAAAQ,CACF,CACF,CACA,OAAO,MAAME,EAAU,CACrB,IAAIC,EAAS,CAAC,EACVC,EAAQ,CAAC,EACXC,EAAY,CAAC,EACbC,EACF,QAASvB,KAAQmB,EAAS,MAAM,UAAU,EAAG,CAC3C,KAAOI,EAAI,yCAAyC,KAAKvB,CAAI,GAAG,CAC9D,IAAIwB,EAAMD,EAAE,CAAC,EAAI,CAACA,EAAE,CAAC,EAAI,KACvBE,EAAOF,EAAE,CAAC,GAAKA,EAAE,CAAC,GAAK,GACvBG,EAAQ,GACV,QAASX,EAAI,EAAGA,EAAIK,EAAO,OAAQL,KAC7BS,GAAO,KAAOJ,EAAOL,CAAC,EAAE,KAAOS,EAAMC,GAAOL,EAAOL,CAAC,EAAE,MAAQU,KAAcC,EAAQX,GAE1F,GAAIW,EAAQ,EAAG,CACb,IAAIC,EAAK,EACT,KAAOA,EAAKP,EAAO,SAAWI,GAAO,MAAQJ,EAAOO,CAAE,EAAE,KAAO,MAAQP,EAAOO,CAAE,EAAE,IAAMH,IAAMG,IAC9FP,EAAO,OAAOO,EAAI,EAAG,CACnB,IAAAH,EACA,KAAAC,CACF,CAAC,EACDC,EAAQC,EACR,QAASnB,KAAOc,EAAed,EAAI,OAASkB,GAAOlB,EAAI,QAEzDc,EAAU,KAAK,IAAIxB,GAAS4B,EAAOL,EAAM,OAAQE,EAAE,MAAOA,EAAE,MAAQE,EAAK,MAAM,CAAC,EAChFzB,EAAOA,EAAK,MAAM,EAAGuB,EAAE,KAAK,EAAIE,EAAOzB,EAAK,MAAMuB,EAAE,MAAQA,EAAE,CAAC,EAAE,MAAM,EAEzE,QAASK,EAAKA,EAAM,WAAW,KAAK5B,CAAI,GAAI,CAC1CA,EAAOA,EAAK,MAAM,EAAG4B,EAAI,KAAK,EAAIA,EAAI,CAAC,EAAI5B,EAAK,MAAM4B,EAAI,MAAQA,EAAI,CAAC,EAAE,MAAM,EAC/E,QAASC,KAAQP,EAAeO,EAAK,MAAQR,EAAM,QAAUQ,EAAK,KAAOD,EAAI,QAC3EC,EAAK,OACLA,EAAK,MAGTR,EAAM,KAAKrB,CAAI,EAEjB,OAAO,IAAIM,EAAQe,EAAOC,CAAS,CACrC,CACA,YAAYD,EAAOS,EAAgB,CACjC,KAAK,MAAQT,EACb,KAAK,eAAiBS,CACxB,CACF,EACIC,GAA6BC,EAAW,OAAO,CACjD,OAAuB,IAAI,cAAcC,CAAW,CAClD,OAAQ,CACN,IAAIC,EAAO,SAAS,cAAc,MAAM,EACxC,OAAAA,EAAK,UAAY,0BACVA,CACT,CACA,aAAc,CACZ,MAAO,EACT,CACF,CACF,CAAC,EACGC,GAA4BH,EAAW,KAAK,CAC9C,MAAO,iBACT,CAAC,EACGI,EAAgB,KAAM,CACxB,IAAIhC,EAAS,CACX,IAAIa,EAAS,CAAC,EACd,QAASoB,KAAK,KAAK,OAAQ,CACzB,IAAIC,EAASD,EAAE,IAAIjC,CAAO,EAC1B,GAAI,CAACkC,EAAQ,OAAO,KACpBrB,EAAO,KAAKqB,CAAM,EAEpB,OAAO,IAAIF,EAAcnB,EAAQ,KAAK,MAAM,CAC9C,CACA,qBAAqBsB,EAAK,CACxB,OAAOA,EAAI,OAAO,MAAMC,GAAS,KAAK,OAAO,KAAKH,GAAKA,EAAE,OAAS,KAAK,QAAUA,EAAE,MAAQG,EAAM,MAAQH,EAAE,IAAMG,EAAM,EAAE,CAAC,CAC5H,CACA,YAAYvB,EAAQwB,EAAQ,CAC1B,KAAK,OAASxB,EACd,KAAK,OAASwB,EACd,KAAK,KAAOT,EAAW,IAAIf,EAAO,IAAIoB,IAAMA,EAAE,MAAQA,EAAE,GAAKN,GAAcI,IAAY,MAAME,EAAE,KAAMA,EAAE,EAAE,CAAC,CAAC,CAC7G,CACF,EACIK,EAA2BC,EAAY,OAAO,CAChD,IAAIC,EAAOxC,EAAS,CAClB,OAAOwC,GAASA,EAAM,IAAIxC,CAAO,CACnC,CACF,CAAC,EACGyC,GAA6BF,EAAY,OAAO,EAChDG,EAA8BC,EAAW,OAAO,CAClD,QAAS,CACP,OAAO,IACT,EACA,OAAOH,EAAOI,EAAI,CAChB,QAASC,KAAUD,EAAG,QAAS,CAC7B,GAAIC,EAAO,GAAGP,CAAS,EAAG,OAAOO,EAAO,MACxC,GAAIA,EAAO,GAAGJ,EAAW,GAAKD,EAAO,OAAO,IAAIR,EAAcQ,EAAM,OAAQK,EAAO,KAAK,EAE1F,OAAIL,GAASI,EAAG,aAAYJ,EAAQA,EAAM,IAAII,EAAG,OAAO,GACpDJ,GAASI,EAAG,WAAa,CAACJ,EAAM,qBAAqBI,EAAG,SAAS,IAAGJ,EAAQ,MACzEA,CACT,EACA,QAASM,GAAKrD,EAAW,YAAY,KAAKqD,EAAGC,GAAOA,EAAMA,EAAI,KAAOnB,EAAW,IAAI,CACtF,CAAC,EACD,SAASoB,EAAenC,EAAQlB,EAAO,CACrC,OAAOsD,EAAgB,OAAOpC,EAAO,OAAOoB,GAAKA,EAAE,OAAStC,CAAK,EAAE,IAAIsC,GAAKgB,EAAgB,MAAMhB,EAAE,KAAMA,EAAE,EAAE,CAAC,CAAC,CAClH,CACA,SAASiB,GAAQnC,EAAU,CACzB,IAAIoC,EAAWjD,EAAQ,MAAMa,CAAQ,EACrC,MAAO,CAACqC,EAAQC,EAAYxD,EAAMC,IAAO,CACvC,GAAI,CACF,KAAAO,EACA,OAAAQ,CACF,EAAIsC,EAAS,YAAYC,EAAO,MAAOvD,CAAI,EACvCyD,EAAO,CACT,QAAS,CACP,KAAAzD,EACA,GAAAC,EACA,OAAQyD,EAAK,GAAGlD,CAAI,CACtB,EACA,eAAgB,GAChB,YAAagD,EAAaG,GAAiB,GAAGH,CAAU,EAAI,MAC9D,EAEA,GADIxC,EAAO,SAAQyC,EAAK,UAAYN,EAAenC,EAAQ,CAAC,GACxDA,EAAO,OAAS,EAAG,CACrB,IAAIwB,EAAS,IAAIL,EAAcnB,EAAQ,CAAC,EACpC4C,EAAUH,EAAK,QAAU,CAAChB,EAAU,GAAGD,CAAM,CAAC,EAC9Ce,EAAO,MAAM,MAAMV,EAAc,EAAK,IAAM,QAAQe,EAAQ,KAAKlB,EAAY,aAAa,GAAG,CAACG,EAAcgB,GAAkBC,GAAuBnE,EAAS,CAAC,CAAC,EAEtK4D,EAAO,SAASA,EAAO,MAAM,OAAOE,CAAI,CAAC,CAC3C,CACF,CACA,SAASM,EAAUC,EAAK,CACtB,MAAO,CAAC,CACN,MAAA1D,EACA,SAAA2D,CACF,IAAM,CACJ,IAAIzB,EAASlC,EAAM,MAAMuC,EAAc,EAAK,EAC5C,GAAI,CAACL,GAAUwB,EAAM,GAAKxB,EAAO,QAAU,EAAG,MAAO,GACrD,IAAI0B,EAAO1B,EAAO,OAASwB,EACzBG,EAAOH,EAAM,GAAK,CAACxB,EAAO,OAAO,KAAKJ,GAAKA,EAAE,OAAS8B,EAAOF,CAAG,EAClE,OAAAC,EAAS3D,EAAM,OAAO,CACpB,UAAW6C,EAAeX,EAAO,OAAQ0B,CAAI,EAC7C,QAASzB,EAAU,GAAG0B,EAAO,KAAO,IAAIhC,EAAcK,EAAO,OAAQ0B,CAAI,CAAC,CAC5E,CAAC,CAAC,EACK,EACT,CACF,CACA,IAAIE,GAAe,CAAC,CAClB,MAAA9D,EACA,SAAA2D,CACF,IACe3D,EAAM,MAAMuC,EAAc,EAAK,GAE5CoB,EAAS3D,EAAM,OAAO,CACpB,QAASmC,EAAU,GAAG,IAAI,CAC5B,CAAC,CAAC,EACK,IAJa,GAMlB4B,GAAkCN,EAAU,CAAC,EAC7CO,GAAkCP,EAAU,EAAE,EASlD,IAAIQ,GAAuB,CAAC,CAC1B,IAAK,MACL,IAAKC,GACL,MAAOC,EACT,EAAG,CACD,IAAK,SACL,IAAKC,EACP,CAAC,EACGC,EAA+BC,EAAM,OAAO,CAC9C,QAAQC,EAAM,CACZ,OAAOA,EAAK,OAASA,EAAK,CAAC,EAAIN,EACjC,CACF,CAAC,EACGO,GAAkCC,EAAK,QAAwBC,EAAO,QAAQ,CAACL,CAAa,EAAGM,GAASA,EAAM,MAAMN,CAAa,CAAC,CAAC,EACvI,SAASO,GAAkBC,EAAUC,EAAY,CAC/C,OAAO,OAAO,OAAO,OAAO,OAAO,CAAC,EAAGA,CAAU,EAAG,CAClD,MAAOC,GAAQF,CAAQ,CACzB,CAAC,CACH,CACA,IAAIG,GAAuCC,EAAW,iBAAiB,CACrE,UAAUC,EAAOC,EAAM,CACrB,IAAIC,EAASD,EAAK,MAAM,MAAME,EAAc,EAAK,EAC/CC,EACF,GAAI,CAACF,IAAWE,EAAMH,EAAK,YAAY,CACrC,EAAGD,EAAM,QACT,EAAGA,EAAM,OACX,CAAC,IAAM,KAAM,MAAO,GACpB,IAAIK,EAAQH,EAAO,OAAO,KAAKI,GAAKA,EAAE,MAAQF,GAAOE,EAAE,IAAMF,CAAG,EAChE,MAAI,CAACC,GAASA,EAAM,OAASH,EAAO,OAAe,IACnDD,EAAK,SAAS,CACZ,UAAWM,EAAeL,EAAO,OAAQG,EAAM,KAAK,EACpD,QAASG,EAAU,GAAGN,EAAO,OAAO,KAAKI,GAAKA,EAAE,MAAQD,EAAM,KAAK,EAAI,IAAII,EAAcP,EAAO,OAAQG,EAAM,KAAK,EAAI,IAAI,CAC7H,CAAC,EACM,GACT,CACF,CAAC,EA4ED,IAAIK,EAAW,CACb,SAAU,CAAC,IAAK,IAAK,IAAK,IAAK,GAAG,EAClC,OAAQ,SACR,eAAgB,CAAC,CACnB,EACIC,EAAoCC,EAAY,OAAO,CACzD,IAAIC,EAAOC,EAAS,CAClB,IAAIC,EAASD,EAAQ,OAAOD,EAAO,GAAIG,EAAQ,UAAU,EACzD,OAAOD,GAAiB,MAC1B,CACF,CAAC,EACGE,EAA+B,IAAI,cAAcC,CAAW,CAAC,EACjED,EAAc,UAAY,EAC1BA,EAAc,QAAU,GACxB,IAAIE,EAA8BC,EAAW,OAAO,CAClD,QAAS,CACP,OAAOC,EAAS,KAClB,EACA,OAAOR,EAAOS,EAAI,CAChB,GAAIA,EAAG,UAAW,CAChB,IAAIC,EAAYD,EAAG,MAAM,IAAI,OAAOA,EAAG,UAAU,KAAK,IAAI,EAAE,KACxDE,EAAgBF,EAAG,WAAW,IAAI,OAAOA,EAAG,WAAW,UAAU,KAAK,IAAI,EAAE,KAC5EC,GAAaD,EAAG,QAAQ,OAAOE,EAAe,EAAE,IAAGX,EAAQQ,EAAS,OAE1ER,EAAQA,EAAM,IAAIS,EAAG,OAAO,EAC5B,QAASG,KAAUH,EAAG,QAAaG,EAAO,GAAGd,CAAkB,IAAGE,EAAQA,EAAM,OAAO,CACrF,IAAK,CAACI,EAAc,MAAMQ,EAAO,MAAOA,EAAO,MAAQ,CAAC,CAAC,CAC3D,CAAC,GACD,OAAOZ,CACT,CACF,CAAC,EACD,SAASa,IAAgB,CACvB,MAAO,CAACC,GAAcR,CAAY,CACpC,CACA,IAAIS,EAAiB,WACrB,SAASC,EAAQC,EAAI,CACnB,QAASC,EAAI,EAAGA,EAAIH,EAAe,OAAQG,GAAK,EAAG,GAAIH,EAAe,WAAWG,CAAC,GAAKD,EAAI,OAAOF,EAAe,OAAOG,EAAI,CAAC,EAC7H,OAAOC,EAAcF,EAAK,IAAMA,EAAKA,EAAK,CAAC,CAC7C,CACA,SAASG,EAAOC,EAAOC,EAAK,CAC1B,OAAOD,EAAM,eAAe,gBAAiBC,CAAG,EAAE,CAAC,GAAKzB,CAC1D,CACA,IAAI0B,GAAU,OAAOC,GAAa,UAA4B,YAAY,KAAKA,EAAU,SAAS,EAC9FV,GAA8BW,EAAW,aAAa,GAAG,CAACC,EAAMC,EAAMC,EAAIC,IAAW,CACvF,IAAKN,GAAUG,EAAK,UAAYA,EAAK,qBAAuBA,EAAK,MAAM,SAAU,MAAO,GACxF,IAAII,EAAMJ,EAAK,MAAM,UAAU,KAC/B,GAAIG,EAAO,OAAS,GAAKA,EAAO,QAAU,GAAKE,EAAcC,EAAYH,EAAQ,CAAC,CAAC,GAAK,GAAKF,GAAQG,EAAI,MAAQF,GAAME,EAAI,GAAI,MAAO,GACtI,IAAIrB,EAAKwB,GAAcP,EAAK,MAAOG,CAAM,EACzC,OAAKpB,GACLiB,EAAK,SAASjB,CAAE,EACT,IAFS,EAGlB,CAAC,EACGyB,GAAoB,CAAC,CACvB,MAAAb,EACA,SAAAc,CACF,IAAM,CACJ,GAAId,EAAM,SAAU,MAAO,GAE3B,IAAIe,EADOhB,EAAOC,EAAOA,EAAM,UAAU,KAAK,IAAI,EAChC,UAAYxB,EAAS,SACnCwC,EAAO,KACTC,EAAUjB,EAAM,cAAckB,GAAS,CACrC,GAAIA,EAAM,MAAO,CACf,IAAIC,EAASC,GAASpB,EAAM,IAAKkB,EAAM,IAAI,EAC3C,QAASG,KAASN,EAChB,GAAIM,GAASF,GAAUG,EAAStB,EAAM,IAAKkB,EAAM,IAAI,GAAKvB,EAAQgB,EAAYU,EAAO,CAAC,CAAC,EAAG,MAAO,CAC/F,QAAS,CACP,KAAMH,EAAM,KAAOG,EAAM,OACzB,GAAIH,EAAM,KAAOG,EAAM,MACzB,EACA,MAAOE,EAAgB,OAAOL,EAAM,KAAOG,EAAM,MAAM,CACzD,EAGJ,MAAO,CACL,MAAOL,EAAOE,CAChB,CACF,CAAC,EACH,OAAKF,GAAMF,EAASd,EAAM,OAAOiB,EAAS,CACxC,eAAgB,GAChB,UAAW,iBACb,CAAC,CAAC,EACK,CAACD,CACV,EACIQ,GAAsB,CAAC,CACzB,IAAK,YACL,IAAKX,EACP,CAAC,EACD,SAASD,GAAcZ,EAAOyB,EAAS,CACrC,IAAIC,EAAO3B,EAAOC,EAAOA,EAAM,UAAU,KAAK,IAAI,EAC9Ce,EAASW,EAAK,UAAYlD,EAAS,SACvC,QAASmD,KAAOZ,EAAQ,CACtB,IAAIa,EAASjC,EAAQgB,EAAYgB,EAAK,CAAC,CAAC,EACxC,GAAIF,GAAWE,EAAK,OAAOC,GAAUD,EAAME,GAAW7B,EAAO2B,EAAKZ,EAAO,QAAQY,EAAMA,EAAMA,CAAG,EAAI,GAAID,CAAI,EAAII,GAAW9B,EAAO2B,EAAKC,EAAQF,EAAK,QAAUlD,EAAS,MAAM,EAC7K,GAAIiD,GAAWG,GAAUG,EAAgB/B,EAAOA,EAAM,UAAU,KAAK,IAAI,EAAG,OAAOgC,GAAYhC,EAAO2B,EAAKC,CAAM,EAEnH,OAAO,IACT,CACA,SAASG,EAAgB/B,EAAOC,EAAK,CACnC,IAAIgC,EAAQ,GACZ,OAAAjC,EAAM,MAAMf,CAAY,EAAE,QAAQ,EAAGe,EAAM,IAAI,OAAQM,GAAQ,CACzDA,GAAQL,IAAKgC,EAAQ,GAC3B,CAAC,EACMA,CACT,CACA,SAASX,EAASY,EAAKjC,EAAK,CAC1B,IAAIkC,EAAOD,EAAI,YAAYjC,EAAKA,EAAM,CAAC,EACvC,OAAOkC,EAAK,MAAM,EAAGzB,EAAcC,EAAYwB,EAAM,CAAC,CAAC,CAAC,CAC1D,CACA,SAASf,GAASc,EAAKjC,EAAK,CAC1B,IAAImC,EAAOF,EAAI,YAAYjC,EAAM,EAAGA,CAAG,EACvC,OAAOS,EAAcC,EAAYyB,EAAM,CAAC,CAAC,GAAKA,EAAK,OAASA,EAAOA,EAAK,MAAM,CAAC,CACjF,CACA,SAASN,GAAW9B,EAAOqC,EAAMC,EAAOC,EAAa,CACnD,IAAIvB,EAAO,KACTC,EAAUjB,EAAM,cAAckB,GAAS,CACrC,GAAI,CAACA,EAAM,MAAO,MAAO,CACvB,QAAS,CAAC,CACR,OAAQmB,EACR,KAAMnB,EAAM,IACd,EAAG,CACD,OAAQoB,EACR,KAAMpB,EAAM,EACd,CAAC,EACD,QAASzC,EAAmB,GAAGyC,EAAM,GAAKmB,EAAK,MAAM,EACrD,MAAOd,EAAgB,MAAML,EAAM,OAASmB,EAAK,OAAQnB,EAAM,KAAOmB,EAAK,MAAM,CACnF,EACA,IAAIF,EAAOb,EAAStB,EAAM,IAAKkB,EAAM,IAAI,EACzC,MAAI,CAACiB,GAAQ,KAAK,KAAKA,CAAI,GAAKI,EAAY,QAAQJ,CAAI,EAAI,GAAW,CACrE,QAAS,CACP,OAAQE,EAAOC,EACf,KAAMpB,EAAM,IACd,EACA,QAASzC,EAAmB,GAAGyC,EAAM,KAAOmB,EAAK,MAAM,EACvD,MAAOd,EAAgB,OAAOL,EAAM,KAAOmB,EAAK,MAAM,CACxD,EACO,CACL,MAAOrB,EAAOE,CAChB,CACF,CAAC,EACH,OAAOF,EAAO,KAAOhB,EAAM,OAAOiB,EAAS,CACzC,eAAgB,GAChB,UAAW,YACb,CAAC,CACH,CACA,SAASe,GAAYhC,EAAOwC,EAAOF,EAAO,CACxC,IAAItB,EAAO,KACTC,EAAUjB,EAAM,cAAckB,GACxBA,EAAM,OAASI,EAAStB,EAAM,IAAKkB,EAAM,IAAI,GAAKoB,EAAc,CAClE,QAAS,CACP,KAAMpB,EAAM,KACZ,GAAIA,EAAM,KAAOoB,EAAM,OACvB,OAAQA,CACV,EACA,MAAOf,EAAgB,OAAOL,EAAM,KAAOoB,EAAM,MAAM,CACzD,EACOtB,EAAO,CACZ,MAAAE,CACF,CACD,EACH,OAAOF,EAAO,KAAOhB,EAAM,OAAOiB,EAAS,CACzC,eAAgB,GAChB,UAAW,YACb,CAAC,CACH,CACA,SAASY,GAAW7B,EAAOqB,EAAOoB,EAAaC,EAAS,CACtD,IAAIC,EAAiBD,EAAQ,gBAAkBlE,EAAS,eACpDwC,EAAO,KACTC,EAAUjB,EAAM,cAAckB,GAAS,CACrC,GAAI,CAACA,EAAM,MAAO,MAAO,CACvB,QAAS,CAAC,CACR,OAAQG,EACR,KAAMH,EAAM,IACd,EAAG,CACD,OAAQG,EACR,KAAMH,EAAM,EACd,CAAC,EACD,QAASzC,EAAmB,GAAGyC,EAAM,GAAKG,EAAM,MAAM,EACtD,MAAOE,EAAgB,MAAML,EAAM,OAASG,EAAM,OAAQH,EAAM,KAAOG,EAAM,MAAM,CACrF,EACA,IAAIpB,EAAMiB,EAAM,KACdiB,EAAOb,EAAStB,EAAM,IAAKC,CAAG,EAC9B2C,EACF,GAAIT,GAAQd,EAAO,CACjB,GAAIwB,EAAU7C,EAAOC,CAAG,EACtB,MAAO,CACL,QAAS,CACP,OAAQoB,EAAQA,EAChB,KAAMpB,CACR,EACA,QAASxB,EAAmB,GAAGwB,EAAMoB,EAAM,MAAM,EACjD,MAAOE,EAAgB,OAAOtB,EAAMoB,EAAM,MAAM,CAClD,EACK,GAAIU,EAAgB/B,EAAOC,CAAG,EAAG,CAEtC,IAAI6C,EADWL,GAAezC,EAAM,SAASC,EAAKA,EAAMoB,EAAM,OAAS,CAAC,GAAKA,EAAQA,EAAQA,EACpEA,EAAQA,EAAQA,EAAQA,EACjD,MAAO,CACL,QAAS,CACP,KAAMpB,EACN,GAAIA,EAAM6C,EAAQ,OAClB,OAAQA,CACV,EACA,MAAOvB,EAAgB,OAAOtB,EAAM6C,EAAQ,MAAM,CACpD,OAEG,IAAIL,GAAezC,EAAM,SAASC,EAAM,EAAIoB,EAAM,OAAQpB,CAAG,GAAKoB,EAAQA,IAAUuB,EAAQG,EAAiB/C,EAAOC,EAAM,EAAIoB,EAAM,OAAQsB,CAAc,GAAK,IAAME,EAAU7C,EAAO4C,CAAK,EAChM,MAAO,CACL,QAAS,CACP,OAAQvB,EAAQA,EAAQA,EAAQA,EAChC,KAAMpB,CACR,EACA,QAASxB,EAAmB,GAAGwB,EAAMoB,EAAM,MAAM,EACjD,MAAOE,EAAgB,OAAOtB,EAAMoB,EAAM,MAAM,CAClD,EACK,GAAIrB,EAAM,gBAAgBC,CAAG,EAAEkC,CAAI,GAAKa,EAAa,MACtDD,EAAiB/C,EAAOC,EAAK0C,CAAc,EAAI,IAAM,CAACM,GAAiBjD,EAAOC,EAAKoB,EAAOsB,CAAc,EAAG,MAAO,CACpH,QAAS,CACP,OAAQtB,EAAQA,EAChB,KAAMpB,CACR,EACA,QAASxB,EAAmB,GAAGwB,EAAMoB,EAAM,MAAM,EACjD,MAAOE,EAAgB,OAAOtB,EAAMoB,EAAM,MAAM,CAClD,EAEF,MAAO,CACL,MAAOL,EAAOE,CAChB,CACF,CAAC,EACH,OAAOF,EAAO,KAAOhB,EAAM,OAAOiB,EAAS,CACzC,eAAgB,GAChB,UAAW,YACb,CAAC,CACH,CACA,SAAS4B,EAAU7C,EAAOC,EAAK,CAC7B,IAAIiD,EAAOC,EAAWnD,CAAK,EAAE,aAAaC,EAAM,CAAC,EACjD,OAAOiD,EAAK,QAAUA,EAAK,MAAQjD,CACrC,CACA,SAASgD,GAAiBjD,EAAOC,EAAKmD,EAAYC,EAAU,CAC1D,IAAIC,EAAOH,EAAWnD,CAAK,EAAE,aAAaC,EAAK,EAAE,EAC7CsD,EAAYF,EAAS,OAAO,CAACG,EAAGC,IAAM,KAAK,IAAID,EAAGC,EAAE,MAAM,EAAG,CAAC,EAClE,QAAS5D,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,IAAI+C,EAAQ5C,EAAM,SAASsD,EAAK,KAAM,KAAK,IAAIA,EAAK,GAAIA,EAAK,KAAOF,EAAW,OAASG,CAAS,CAAC,EAC9FG,EAAWd,EAAM,QAAQQ,CAAU,EACvC,GAAI,CAACM,GAAYA,EAAW,IAAML,EAAS,QAAQT,EAAM,MAAM,EAAGc,CAAQ,CAAC,EAAI,GAAI,CACjF,IAAIC,EAAQL,EAAK,WACjB,KAAOK,GAASA,EAAM,MAAQL,EAAK,MAAQK,EAAM,GAAKA,EAAM,KAAOP,EAAW,OAASM,GAAU,CAC/F,GAAI1D,EAAM,SAAS2D,EAAM,GAAKP,EAAW,OAAQO,EAAM,EAAE,GAAKP,EAAY,MAAO,GACjFO,EAAQA,EAAM,WAEhB,MAAO,GAET,IAAIC,EAASN,EAAK,IAAMrD,GAAOqD,EAAK,OACpC,GAAI,CAACM,EAAQ,MACbN,EAAOM,EAET,MAAO,EACT,CACA,SAASb,EAAiB/C,EAAOC,EAAKoD,EAAU,CAC9C,IAAIQ,EAAU7D,EAAM,gBAAgBC,CAAG,EACvC,GAAI4D,EAAQ7D,EAAM,SAASC,EAAM,EAAGA,CAAG,CAAC,GAAK+C,EAAa,KAAM,OAAO/C,EACvE,QAAS6D,KAAUT,EAAU,CAC3B,IAAIT,EAAQ3C,EAAM6D,EAAO,OACzB,GAAI9D,EAAM,SAAS4C,EAAO3C,CAAG,GAAK6D,GAAUD,EAAQ7D,EAAM,SAAS4C,EAAQ,EAAGA,CAAK,CAAC,GAAKI,EAAa,KAAM,OAAOJ,EAErH,MAAO,EACT",
  "names": ["toSet", "chars", "flat", "words", "prefixMatch", "options", "first", "rest", "label", "i", "source", "completeFromList", "list", "o", "validFor", "match", "context", "token", "ifNotIn", "nodes", "source", "context", "pos", "syntaxTree", "pickedCompletion", "Annotation", "baseTheme", "EditorView", "FieldPos", "field", "line", "from", "to", "FieldRange", "changes", "MapMode", "Snippet", "state", "pos", "text", "lineStart", "lineObj", "baseIndent", "indent", "tabs", "i", "indentUnit", "ranges", "pos2", "template", "fields", "lines", "positions", "m", "seq", "name", "found", "i1", "esc", "pos1", "fieldPositions", "fieldMarker", "Decoration", "WidgetType", "span", "fieldRange", "ActiveSnippet", "r", "mapped", "sel", "range", "active", "setActive", "StateEffect", "value", "moveToField", "snippetState", "StateField", "tr", "effect", "f", "val", "fieldSelection", "EditorSelection", "snippet", "snippet2", "editor", "completion", "spec", "Text", "pickedCompletion", "effects", "addSnippetKeymap", "snippetPointerHandler", "moveField", "dir", "dispatch", "next", "last", "clearSnippet", "nextSnippetField", "prevSnippetField", "defaultSnippetKeymap", "nextSnippetField", "prevSnippetField", "clearSnippet", "snippetKeymap", "Facet", "maps", "addSnippetKeymap", "Prec", "keymap", "state", "snippetCompletion", "template", "completion", "snippet", "snippetPointerHandler", "EditorView", "event", "view", "active", "snippetState", "pos", "match", "r", "fieldSelection", "setActive", "ActiveSnippet", "defaults", "closeBracketEffect", "StateEffect", "value", "mapping", "mapped", "MapMode", "closedBracket", "RangeValue", "bracketState", "StateField", "RangeSet", "tr", "lineStart", "prevLineStart", "effect", "closeBrackets", "inputHandler", "definedClosing", "closing", "ch", "i", "fromCodePoint", "config", "state", "pos", "android", "navigator", "EditorView", "view", "from", "to", "insert", "sel", "codePointSize", "codePointAt", "insertBracket", "deleteBracketPair", "dispatch", "tokens", "dont", "changes", "range", "before", "prevChar", "token", "nextChar", "EditorSelection", "closeBracketsKeymap", "bracket", "conf", "tok", "closed", "handleSame", "handleOpen", "closedBracketAt", "handleClose", "found", "doc", "next", "prev", "open", "close", "closeBefore", "_open", "allowTriple", "config2", "stringPrefixes", "start", "nodeStart", "content", "canStartStringAt", "CharCategory", "probablyInString", "tree", "syntaxTree", "quoteToken", "prefixes", "node", "maxPrefix", "m", "p", "quotePos", "first", "parent", "charCat", "prefix"]
}
