{"version":3,"file":"chat-with-context.umd.cjs","sources":["../node_modules/solid-js/dist/solid.js","../node_modules/solid-js/web/dist/web.js","../node_modules/component-register/dist/component-register.js","../node_modules/solid-element/dist/index.js","../node_modules/marked/lib/marked.esm.js","../node_modules/dompurify/dist/purify.es.mjs","../node_modules/highlight.js/lib/core.js","../src/utils.tsx","../src/highlight.ts","../src/assets/arrow-up.svg","../src/assets/x.svg","../src/assets/edit.svg","../src/assets/square.svg","../src/assets/thumbs-down.svg","../src/assets/thumbs-up.svg","../src/providers.ts","../src/chat-with-context.tsx"],"sourcesContent":["let taskIdCounter = 1,\n  isCallbackScheduled = false,\n  isPerformingWork = false,\n  taskQueue = [],\n  currentTask = null,\n  shouldYieldToHost = null,\n  yieldInterval = 5,\n  deadline = 0,\n  maxYieldInterval = 300,\n  scheduleCallback = null,\n  scheduledCallback = null;\nconst maxSigned31BitInt = 1073741823;\nfunction setupScheduler() {\n  const channel = new MessageChannel(),\n    port = channel.port2;\n  scheduleCallback = () => port.postMessage(null);\n  channel.port1.onmessage = () => {\n    if (scheduledCallback !== null) {\n      const currentTime = performance.now();\n      deadline = currentTime + yieldInterval;\n      const hasTimeRemaining = true;\n      try {\n        const hasMoreWork = scheduledCallback(hasTimeRemaining, currentTime);\n        if (!hasMoreWork) {\n          scheduledCallback = null;\n        } else port.postMessage(null);\n      } catch (error) {\n        port.postMessage(null);\n        throw error;\n      }\n    }\n  };\n  if (navigator && navigator.scheduling && navigator.scheduling.isInputPending) {\n    const scheduling = navigator.scheduling;\n    shouldYieldToHost = () => {\n      const currentTime = performance.now();\n      if (currentTime >= deadline) {\n        if (scheduling.isInputPending()) {\n          return true;\n        }\n        return currentTime >= maxYieldInterval;\n      } else {\n        return false;\n      }\n    };\n  } else {\n    shouldYieldToHost = () => performance.now() >= deadline;\n  }\n}\nfunction enqueue(taskQueue, task) {\n  function findIndex() {\n    let m = 0;\n    let n = taskQueue.length - 1;\n    while (m <= n) {\n      const k = (n + m) >> 1;\n      const cmp = task.expirationTime - taskQueue[k].expirationTime;\n      if (cmp > 0) m = k + 1;\n      else if (cmp < 0) n = k - 1;\n      else return k;\n    }\n    return m;\n  }\n  taskQueue.splice(findIndex(), 0, task);\n}\nfunction requestCallback(fn, options) {\n  if (!scheduleCallback) setupScheduler();\n  let startTime = performance.now(),\n    timeout = maxSigned31BitInt;\n  if (options && options.timeout) timeout = options.timeout;\n  const newTask = {\n    id: taskIdCounter++,\n    fn,\n    startTime,\n    expirationTime: startTime + timeout\n  };\n  enqueue(taskQueue, newTask);\n  if (!isCallbackScheduled && !isPerformingWork) {\n    isCallbackScheduled = true;\n    scheduledCallback = flushWork;\n    scheduleCallback();\n  }\n  return newTask;\n}\nfunction cancelCallback(task) {\n  task.fn = null;\n}\nfunction flushWork(hasTimeRemaining, initialTime) {\n  isCallbackScheduled = false;\n  isPerformingWork = true;\n  try {\n    return workLoop(hasTimeRemaining, initialTime);\n  } finally {\n    currentTask = null;\n    isPerformingWork = false;\n  }\n}\nfunction workLoop(hasTimeRemaining, initialTime) {\n  let currentTime = initialTime;\n  currentTask = taskQueue[0] || null;\n  while (currentTask !== null) {\n    if (currentTask.expirationTime > currentTime && (!hasTimeRemaining || shouldYieldToHost())) {\n      break;\n    }\n    const callback = currentTask.fn;\n    if (callback !== null) {\n      currentTask.fn = null;\n      const didUserCallbackTimeout = currentTask.expirationTime <= currentTime;\n      callback(didUserCallbackTimeout);\n      currentTime = performance.now();\n      if (currentTask === taskQueue[0]) {\n        taskQueue.shift();\n      }\n    } else taskQueue.shift();\n    currentTask = taskQueue[0] || null;\n  }\n  return currentTask !== null;\n}\n\nconst sharedConfig = {\n  context: undefined,\n  registry: undefined,\n  effects: undefined,\n  done: false,\n  getContextId() {\n    return getContextId(this.context.count);\n  },\n  getNextContextId() {\n    return getContextId(this.context.count++);\n  }\n};\nfunction getContextId(count) {\n  const num = String(count),\n    len = num.length - 1;\n  return sharedConfig.context.id + (len ? String.fromCharCode(96 + len) : \"\") + num;\n}\nfunction setHydrateContext(context) {\n  sharedConfig.context = context;\n}\nfunction nextHydrateContext() {\n  return {\n    ...sharedConfig.context,\n    id: sharedConfig.getNextContextId(),\n    count: 0\n  };\n}\n\nconst IS_DEV = false;\nconst equalFn = (a, b) => a === b;\nconst $PROXY = Symbol(\"solid-proxy\");\nconst SUPPORTS_PROXY = typeof Proxy === \"function\";\nconst $TRACK = Symbol(\"solid-track\");\nconst $DEVCOMP = Symbol(\"solid-dev-component\");\nconst signalOptions = {\n  equals: equalFn\n};\nlet ERROR = null;\nlet runEffects = runQueue;\nconst STALE = 1;\nconst PENDING = 2;\nconst UNOWNED = {\n  owned: null,\n  cleanups: null,\n  context: null,\n  owner: null\n};\nconst NO_INIT = {};\nvar Owner = null;\nlet Transition = null;\nlet Scheduler = null;\nlet ExternalSourceConfig = null;\nlet Listener = null;\nlet Updates = null;\nlet Effects = null;\nlet ExecCount = 0;\nfunction createRoot(fn, detachedOwner) {\n  const listener = Listener,\n    owner = Owner,\n    unowned = fn.length === 0,\n    current = detachedOwner === undefined ? owner : detachedOwner,\n    root = unowned\n      ? UNOWNED\n      : {\n          owned: null,\n          cleanups: null,\n          context: current ? current.context : null,\n          owner: current\n        },\n    updateFn = unowned ? fn : () => fn(() => untrack(() => cleanNode(root)));\n  Owner = root;\n  Listener = null;\n  try {\n    return runUpdates(updateFn, true);\n  } finally {\n    Listener = listener;\n    Owner = owner;\n  }\n}\nfunction createSignal(value, options) {\n  options = options ? Object.assign({}, signalOptions, options) : signalOptions;\n  const s = {\n    value,\n    observers: null,\n    observerSlots: null,\n    comparator: options.equals || undefined\n  };\n  const setter = value => {\n    if (typeof value === \"function\") {\n      if (Transition && Transition.running && Transition.sources.has(s)) value = value(s.tValue);\n      else value = value(s.value);\n    }\n    return writeSignal(s, value);\n  };\n  return [readSignal.bind(s), setter];\n}\nfunction createComputed(fn, value, options) {\n  const c = createComputation(fn, value, true, STALE);\n  if (Scheduler && Transition && Transition.running) Updates.push(c);\n  else updateComputation(c);\n}\nfunction createRenderEffect(fn, value, options) {\n  const c = createComputation(fn, value, false, STALE);\n  if (Scheduler && Transition && Transition.running) Updates.push(c);\n  else updateComputation(c);\n}\nfunction createEffect(fn, value, options) {\n  runEffects = runUserEffects;\n  const c = createComputation(fn, value, false, STALE),\n    s = SuspenseContext && useContext(SuspenseContext);\n  if (s) c.suspense = s;\n  if (!options || !options.render) c.user = true;\n  Effects ? Effects.push(c) : updateComputation(c);\n}\nfunction createReaction(onInvalidate, options) {\n  let fn;\n  const c = createComputation(\n      () => {\n        fn ? fn() : untrack(onInvalidate);\n        fn = undefined;\n      },\n      undefined,\n      false,\n      0\n    ),\n    s = SuspenseContext && useContext(SuspenseContext);\n  if (s) c.suspense = s;\n  c.user = true;\n  return tracking => {\n    fn = tracking;\n    updateComputation(c);\n  };\n}\nfunction createMemo(fn, value, options) {\n  options = options ? Object.assign({}, signalOptions, options) : signalOptions;\n  const c = createComputation(fn, value, true, 0);\n  c.observers = null;\n  c.observerSlots = null;\n  c.comparator = options.equals || undefined;\n  if (Scheduler && Transition && Transition.running) {\n    c.tState = STALE;\n    Updates.push(c);\n  } else updateComputation(c);\n  return readSignal.bind(c);\n}\nfunction isPromise(v) {\n  return v && typeof v === \"object\" && \"then\" in v;\n}\nfunction createResource(pSource, pFetcher, pOptions) {\n  let source;\n  let fetcher;\n  let options;\n  if (typeof pFetcher === \"function\") {\n    source = pSource;\n    fetcher = pFetcher;\n    options = pOptions || {};\n  } else {\n    source = true;\n    fetcher = pSource;\n    options = pFetcher || {};\n  }\n  let pr = null,\n    initP = NO_INIT,\n    id = null,\n    loadedUnderTransition = false,\n    scheduled = false,\n    resolved = \"initialValue\" in options,\n    dynamic = typeof source === \"function\" && createMemo(source);\n  const contexts = new Set(),\n    [value, setValue] = (options.storage || createSignal)(options.initialValue),\n    [error, setError] = createSignal(undefined),\n    [track, trigger] = createSignal(undefined, {\n      equals: false\n    }),\n    [state, setState] = createSignal(resolved ? \"ready\" : \"unresolved\");\n  if (sharedConfig.context) {\n    id = sharedConfig.getNextContextId();\n    if (options.ssrLoadFrom === \"initial\") initP = options.initialValue;\n    else if (sharedConfig.load && sharedConfig.has(id)) initP = sharedConfig.load(id);\n  }\n  function loadEnd(p, v, error, key) {\n    if (pr === p) {\n      pr = null;\n      key !== undefined && (resolved = true);\n      if ((p === initP || v === initP) && options.onHydrated)\n        queueMicrotask(() =>\n          options.onHydrated(key, {\n            value: v\n          })\n        );\n      initP = NO_INIT;\n      if (Transition && p && loadedUnderTransition) {\n        Transition.promises.delete(p);\n        loadedUnderTransition = false;\n        runUpdates(() => {\n          Transition.running = true;\n          completeLoad(v, error);\n        }, false);\n      } else completeLoad(v, error);\n    }\n    return v;\n  }\n  function completeLoad(v, err) {\n    runUpdates(() => {\n      if (err === undefined) setValue(() => v);\n      setState(err !== undefined ? \"errored\" : resolved ? \"ready\" : \"unresolved\");\n      setError(err);\n      for (const c of contexts.keys()) c.decrement();\n      contexts.clear();\n    }, false);\n  }\n  function read() {\n    const c = SuspenseContext && useContext(SuspenseContext),\n      v = value(),\n      err = error();\n    if (err !== undefined && !pr) throw err;\n    if (Listener && !Listener.user && c) {\n      createComputed(() => {\n        track();\n        if (pr) {\n          if (c.resolved && Transition && loadedUnderTransition) Transition.promises.add(pr);\n          else if (!contexts.has(c)) {\n            c.increment();\n            contexts.add(c);\n          }\n        }\n      });\n    }\n    return v;\n  }\n  function load(refetching = true) {\n    if (refetching !== false && scheduled) return;\n    scheduled = false;\n    const lookup = dynamic ? dynamic() : source;\n    loadedUnderTransition = Transition && Transition.running;\n    if (lookup == null || lookup === false) {\n      loadEnd(pr, untrack(value));\n      return;\n    }\n    if (Transition && pr) Transition.promises.delete(pr);\n    const p =\n      initP !== NO_INIT\n        ? initP\n        : untrack(() =>\n            fetcher(lookup, {\n              value: value(),\n              refetching\n            })\n          );\n    if (!isPromise(p)) {\n      loadEnd(pr, p, undefined, lookup);\n      return p;\n    }\n    pr = p;\n    if (\"value\" in p) {\n      if (p.status === \"success\") loadEnd(pr, p.value, undefined, lookup);\n      else loadEnd(pr, undefined, castError(p.value), lookup);\n      return p;\n    }\n    scheduled = true;\n    queueMicrotask(() => (scheduled = false));\n    runUpdates(() => {\n      setState(resolved ? \"refreshing\" : \"pending\");\n      trigger();\n    }, false);\n    return p.then(\n      v => loadEnd(p, v, undefined, lookup),\n      e => loadEnd(p, undefined, castError(e), lookup)\n    );\n  }\n  Object.defineProperties(read, {\n    state: {\n      get: () => state()\n    },\n    error: {\n      get: () => error()\n    },\n    loading: {\n      get() {\n        const s = state();\n        return s === \"pending\" || s === \"refreshing\";\n      }\n    },\n    latest: {\n      get() {\n        if (!resolved) return read();\n        const err = error();\n        if (err && !pr) throw err;\n        return value();\n      }\n    }\n  });\n  if (dynamic) createComputed(() => load(false));\n  else load(false);\n  return [\n    read,\n    {\n      refetch: load,\n      mutate: setValue\n    }\n  ];\n}\nfunction createDeferred(source, options) {\n  let t,\n    timeout = options ? options.timeoutMs : undefined;\n  const node = createComputation(\n    () => {\n      if (!t || !t.fn)\n        t = requestCallback(\n          () => setDeferred(() => node.value),\n          timeout !== undefined\n            ? {\n                timeout\n              }\n            : undefined\n        );\n      return source();\n    },\n    undefined,\n    true\n  );\n  const [deferred, setDeferred] = createSignal(\n    Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value,\n    options\n  );\n  updateComputation(node);\n  setDeferred(() =>\n    Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value\n  );\n  return deferred;\n}\nfunction createSelector(source, fn = equalFn, options) {\n  const subs = new Map();\n  const node = createComputation(\n    p => {\n      const v = source();\n      for (const [key, val] of subs.entries())\n        if (fn(key, v) !== fn(key, p)) {\n          for (const c of val.values()) {\n            c.state = STALE;\n            if (c.pure) Updates.push(c);\n            else Effects.push(c);\n          }\n        }\n      return v;\n    },\n    undefined,\n    true,\n    STALE\n  );\n  updateComputation(node);\n  return key => {\n    const listener = Listener;\n    if (listener) {\n      let l;\n      if ((l = subs.get(key))) l.add(listener);\n      else subs.set(key, (l = new Set([listener])));\n      onCleanup(() => {\n        l.delete(listener);\n        !l.size && subs.delete(key);\n      });\n    }\n    return fn(\n      key,\n      Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value\n    );\n  };\n}\nfunction batch(fn) {\n  return runUpdates(fn, false);\n}\nfunction untrack(fn) {\n  if (!ExternalSourceConfig && Listener === null) return fn();\n  const listener = Listener;\n  Listener = null;\n  try {\n    if (ExternalSourceConfig) return ExternalSourceConfig.untrack(fn);\n    return fn();\n  } finally {\n    Listener = listener;\n  }\n}\nfunction on(deps, fn, options) {\n  const isArray = Array.isArray(deps);\n  let prevInput;\n  let defer = options && options.defer;\n  return prevValue => {\n    let input;\n    if (isArray) {\n      input = Array(deps.length);\n      for (let i = 0; i < deps.length; i++) input[i] = deps[i]();\n    } else input = deps();\n    if (defer) {\n      defer = false;\n      return prevValue;\n    }\n    const result = untrack(() => fn(input, prevInput, prevValue));\n    prevInput = input;\n    return result;\n  };\n}\nfunction onMount(fn) {\n  createEffect(() => untrack(fn));\n}\nfunction onCleanup(fn) {\n  if (Owner === null);\n  else if (Owner.cleanups === null) Owner.cleanups = [fn];\n  else Owner.cleanups.push(fn);\n  return fn;\n}\nfunction catchError(fn, handler) {\n  ERROR || (ERROR = Symbol(\"error\"));\n  Owner = createComputation(undefined, undefined, true);\n  Owner.context = {\n    ...Owner.context,\n    [ERROR]: [handler]\n  };\n  if (Transition && Transition.running) Transition.sources.add(Owner);\n  try {\n    return fn();\n  } catch (err) {\n    handleError(err);\n  } finally {\n    Owner = Owner.owner;\n  }\n}\nfunction getListener() {\n  return Listener;\n}\nfunction getOwner() {\n  return Owner;\n}\nfunction runWithOwner(o, fn) {\n  const prev = Owner;\n  const prevListener = Listener;\n  Owner = o;\n  Listener = null;\n  try {\n    return runUpdates(fn, true);\n  } catch (err) {\n    handleError(err);\n  } finally {\n    Owner = prev;\n    Listener = prevListener;\n  }\n}\nfunction enableScheduling(scheduler = requestCallback) {\n  Scheduler = scheduler;\n}\nfunction startTransition(fn) {\n  if (Transition && Transition.running) {\n    fn();\n    return Transition.done;\n  }\n  const l = Listener;\n  const o = Owner;\n  return Promise.resolve().then(() => {\n    Listener = l;\n    Owner = o;\n    let t;\n    if (Scheduler || SuspenseContext) {\n      t =\n        Transition ||\n        (Transition = {\n          sources: new Set(),\n          effects: [],\n          promises: new Set(),\n          disposed: new Set(),\n          queue: new Set(),\n          running: true\n        });\n      t.done || (t.done = new Promise(res => (t.resolve = res)));\n      t.running = true;\n    }\n    runUpdates(fn, false);\n    Listener = Owner = null;\n    return t ? t.done : undefined;\n  });\n}\nconst [transPending, setTransPending] = /*@__PURE__*/ createSignal(false);\nfunction useTransition() {\n  return [transPending, startTransition];\n}\nfunction resumeEffects(e) {\n  Effects.push.apply(Effects, e);\n  e.length = 0;\n}\nfunction createContext(defaultValue, options) {\n  const id = Symbol(\"context\");\n  return {\n    id,\n    Provider: createProvider(id),\n    defaultValue\n  };\n}\nfunction useContext(context) {\n  let value;\n  return Owner && Owner.context && (value = Owner.context[context.id]) !== undefined\n    ? value\n    : context.defaultValue;\n}\nfunction children(fn) {\n  const children = createMemo(fn);\n  const memo = createMemo(() => resolveChildren(children()));\n  memo.toArray = () => {\n    const c = memo();\n    return Array.isArray(c) ? c : c != null ? [c] : [];\n  };\n  return memo;\n}\nlet SuspenseContext;\nfunction getSuspenseContext() {\n  return SuspenseContext || (SuspenseContext = createContext());\n}\nfunction enableExternalSource(factory, untrack = fn => fn()) {\n  if (ExternalSourceConfig) {\n    const { factory: oldFactory, untrack: oldUntrack } = ExternalSourceConfig;\n    ExternalSourceConfig = {\n      factory: (fn, trigger) => {\n        const oldSource = oldFactory(fn, trigger);\n        const source = factory(x => oldSource.track(x), trigger);\n        return {\n          track: x => source.track(x),\n          dispose() {\n            source.dispose();\n            oldSource.dispose();\n          }\n        };\n      },\n      untrack: fn => oldUntrack(() => untrack(fn))\n    };\n  } else {\n    ExternalSourceConfig = {\n      factory,\n      untrack\n    };\n  }\n}\nfunction readSignal() {\n  const runningTransition = Transition && Transition.running;\n  if (this.sources && (runningTransition ? this.tState : this.state)) {\n    if ((runningTransition ? this.tState : this.state) === STALE) updateComputation(this);\n    else {\n      const updates = Updates;\n      Updates = null;\n      runUpdates(() => lookUpstream(this), false);\n      Updates = updates;\n    }\n  }\n  if (Listener) {\n    const sSlot = this.observers ? this.observers.length : 0;\n    if (!Listener.sources) {\n      Listener.sources = [this];\n      Listener.sourceSlots = [sSlot];\n    } else {\n      Listener.sources.push(this);\n      Listener.sourceSlots.push(sSlot);\n    }\n    if (!this.observers) {\n      this.observers = [Listener];\n      this.observerSlots = [Listener.sources.length - 1];\n    } else {\n      this.observers.push(Listener);\n      this.observerSlots.push(Listener.sources.length - 1);\n    }\n  }\n  if (runningTransition && Transition.sources.has(this)) return this.tValue;\n  return this.value;\n}\nfunction writeSignal(node, value, isComp) {\n  let current =\n    Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value;\n  if (!node.comparator || !node.comparator(current, value)) {\n    if (Transition) {\n      const TransitionRunning = Transition.running;\n      if (TransitionRunning || (!isComp && Transition.sources.has(node))) {\n        Transition.sources.add(node);\n        node.tValue = value;\n      }\n      if (!TransitionRunning) node.value = value;\n    } else node.value = value;\n    if (node.observers && node.observers.length) {\n      runUpdates(() => {\n        for (let i = 0; i < node.observers.length; i += 1) {\n          const o = node.observers[i];\n          const TransitionRunning = Transition && Transition.running;\n          if (TransitionRunning && Transition.disposed.has(o)) continue;\n          if (TransitionRunning ? !o.tState : !o.state) {\n            if (o.pure) Updates.push(o);\n            else Effects.push(o);\n            if (o.observers) markDownstream(o);\n          }\n          if (!TransitionRunning) o.state = STALE;\n          else o.tState = STALE;\n        }\n        if (Updates.length > 10e5) {\n          Updates = [];\n          if (IS_DEV);\n          throw new Error();\n        }\n      }, false);\n    }\n  }\n  return value;\n}\nfunction updateComputation(node) {\n  if (!node.fn) return;\n  cleanNode(node);\n  const time = ExecCount;\n  runComputation(\n    node,\n    Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value,\n    time\n  );\n  if (Transition && !Transition.running && Transition.sources.has(node)) {\n    queueMicrotask(() => {\n      runUpdates(() => {\n        Transition && (Transition.running = true);\n        Listener = Owner = node;\n        runComputation(node, node.tValue, time);\n        Listener = Owner = null;\n      }, false);\n    });\n  }\n}\nfunction runComputation(node, value, time) {\n  let nextValue;\n  const owner = Owner,\n    listener = Listener;\n  Listener = Owner = node;\n  try {\n    nextValue = node.fn(value);\n  } catch (err) {\n    if (node.pure) {\n      if (Transition && Transition.running) {\n        node.tState = STALE;\n        node.tOwned && node.tOwned.forEach(cleanNode);\n        node.tOwned = undefined;\n      } else {\n        node.state = STALE;\n        node.owned && node.owned.forEach(cleanNode);\n        node.owned = null;\n      }\n    }\n    node.updatedAt = time + 1;\n    return handleError(err);\n  } finally {\n    Listener = listener;\n    Owner = owner;\n  }\n  if (!node.updatedAt || node.updatedAt <= time) {\n    if (node.updatedAt != null && \"observers\" in node) {\n      writeSignal(node, nextValue, true);\n    } else if (Transition && Transition.running && node.pure) {\n      Transition.sources.add(node);\n      node.tValue = nextValue;\n    } else node.value = nextValue;\n    node.updatedAt = time;\n  }\n}\nfunction createComputation(fn, init, pure, state = STALE, options) {\n  const c = {\n    fn,\n    state: state,\n    updatedAt: null,\n    owned: null,\n    sources: null,\n    sourceSlots: null,\n    cleanups: null,\n    value: init,\n    owner: Owner,\n    context: Owner ? Owner.context : null,\n    pure\n  };\n  if (Transition && Transition.running) {\n    c.state = 0;\n    c.tState = state;\n  }\n  if (Owner === null);\n  else if (Owner !== UNOWNED) {\n    if (Transition && Transition.running && Owner.pure) {\n      if (!Owner.tOwned) Owner.tOwned = [c];\n      else Owner.tOwned.push(c);\n    } else {\n      if (!Owner.owned) Owner.owned = [c];\n      else Owner.owned.push(c);\n    }\n  }\n  if (ExternalSourceConfig && c.fn) {\n    const [track, trigger] = createSignal(undefined, {\n      equals: false\n    });\n    const ordinary = ExternalSourceConfig.factory(c.fn, trigger);\n    onCleanup(() => ordinary.dispose());\n    const triggerInTransition = () => startTransition(trigger).then(() => inTransition.dispose());\n    const inTransition = ExternalSourceConfig.factory(c.fn, triggerInTransition);\n    c.fn = x => {\n      track();\n      return Transition && Transition.running ? inTransition.track(x) : ordinary.track(x);\n    };\n  }\n  return c;\n}\nfunction runTop(node) {\n  const runningTransition = Transition && Transition.running;\n  if ((runningTransition ? node.tState : node.state) === 0) return;\n  if ((runningTransition ? node.tState : node.state) === PENDING) return lookUpstream(node);\n  if (node.suspense && untrack(node.suspense.inFallback)) return node.suspense.effects.push(node);\n  const ancestors = [node];\n  while ((node = node.owner) && (!node.updatedAt || node.updatedAt < ExecCount)) {\n    if (runningTransition && Transition.disposed.has(node)) return;\n    if (runningTransition ? node.tState : node.state) ancestors.push(node);\n  }\n  for (let i = ancestors.length - 1; i >= 0; i--) {\n    node = ancestors[i];\n    if (runningTransition) {\n      let top = node,\n        prev = ancestors[i + 1];\n      while ((top = top.owner) && top !== prev) {\n        if (Transition.disposed.has(top)) return;\n      }\n    }\n    if ((runningTransition ? node.tState : node.state) === STALE) {\n      updateComputation(node);\n    } else if ((runningTransition ? node.tState : node.state) === PENDING) {\n      const updates = Updates;\n      Updates = null;\n      runUpdates(() => lookUpstream(node, ancestors[0]), false);\n      Updates = updates;\n    }\n  }\n}\nfunction runUpdates(fn, init) {\n  if (Updates) return fn();\n  let wait = false;\n  if (!init) Updates = [];\n  if (Effects) wait = true;\n  else Effects = [];\n  ExecCount++;\n  try {\n    const res = fn();\n    completeUpdates(wait);\n    return res;\n  } catch (err) {\n    if (!wait) Effects = null;\n    Updates = null;\n    handleError(err);\n  }\n}\nfunction completeUpdates(wait) {\n  if (Updates) {\n    if (Scheduler && Transition && Transition.running) scheduleQueue(Updates);\n    else runQueue(Updates);\n    Updates = null;\n  }\n  if (wait) return;\n  let res;\n  if (Transition) {\n    if (!Transition.promises.size && !Transition.queue.size) {\n      const sources = Transition.sources;\n      const disposed = Transition.disposed;\n      Effects.push.apply(Effects, Transition.effects);\n      res = Transition.resolve;\n      for (const e of Effects) {\n        \"tState\" in e && (e.state = e.tState);\n        delete e.tState;\n      }\n      Transition = null;\n      runUpdates(() => {\n        for (const d of disposed) cleanNode(d);\n        for (const v of sources) {\n          v.value = v.tValue;\n          if (v.owned) {\n            for (let i = 0, len = v.owned.length; i < len; i++) cleanNode(v.owned[i]);\n          }\n          if (v.tOwned) v.owned = v.tOwned;\n          delete v.tValue;\n          delete v.tOwned;\n          v.tState = 0;\n        }\n        setTransPending(false);\n      }, false);\n    } else if (Transition.running) {\n      Transition.running = false;\n      Transition.effects.push.apply(Transition.effects, Effects);\n      Effects = null;\n      setTransPending(true);\n      return;\n    }\n  }\n  const e = Effects;\n  Effects = null;\n  if (e.length) runUpdates(() => runEffects(e), false);\n  if (res) res();\n}\nfunction runQueue(queue) {\n  for (let i = 0; i < queue.length; i++) runTop(queue[i]);\n}\nfunction scheduleQueue(queue) {\n  for (let i = 0; i < queue.length; i++) {\n    const item = queue[i];\n    const tasks = Transition.queue;\n    if (!tasks.has(item)) {\n      tasks.add(item);\n      Scheduler(() => {\n        tasks.delete(item);\n        runUpdates(() => {\n          Transition.running = true;\n          runTop(item);\n        }, false);\n        Transition && (Transition.running = false);\n      });\n    }\n  }\n}\nfunction runUserEffects(queue) {\n  let i,\n    userLength = 0;\n  for (i = 0; i < queue.length; i++) {\n    const e = queue[i];\n    if (!e.user) runTop(e);\n    else queue[userLength++] = e;\n  }\n  if (sharedConfig.context) {\n    if (sharedConfig.count) {\n      sharedConfig.effects || (sharedConfig.effects = []);\n      sharedConfig.effects.push(...queue.slice(0, userLength));\n      return;\n    }\n    setHydrateContext();\n  }\n  if (sharedConfig.effects && (sharedConfig.done || !sharedConfig.count)) {\n    queue = [...sharedConfig.effects, ...queue];\n    userLength += sharedConfig.effects.length;\n    delete sharedConfig.effects;\n  }\n  for (i = 0; i < userLength; i++) runTop(queue[i]);\n}\nfunction lookUpstream(node, ignore) {\n  const runningTransition = Transition && Transition.running;\n  if (runningTransition) node.tState = 0;\n  else node.state = 0;\n  for (let i = 0; i < node.sources.length; i += 1) {\n    const source = node.sources[i];\n    if (source.sources) {\n      const state = runningTransition ? source.tState : source.state;\n      if (state === STALE) {\n        if (source !== ignore && (!source.updatedAt || source.updatedAt < ExecCount))\n          runTop(source);\n      } else if (state === PENDING) lookUpstream(source, ignore);\n    }\n  }\n}\nfunction markDownstream(node) {\n  const runningTransition = Transition && Transition.running;\n  for (let i = 0; i < node.observers.length; i += 1) {\n    const o = node.observers[i];\n    if (runningTransition ? !o.tState : !o.state) {\n      if (runningTransition) o.tState = PENDING;\n      else o.state = PENDING;\n      if (o.pure) Updates.push(o);\n      else Effects.push(o);\n      o.observers && markDownstream(o);\n    }\n  }\n}\nfunction cleanNode(node) {\n  let i;\n  if (node.sources) {\n    while (node.sources.length) {\n      const source = node.sources.pop(),\n        index = node.sourceSlots.pop(),\n        obs = source.observers;\n      if (obs && obs.length) {\n        const n = obs.pop(),\n          s = source.observerSlots.pop();\n        if (index < obs.length) {\n          n.sourceSlots[s] = index;\n          obs[index] = n;\n          source.observerSlots[index] = s;\n        }\n      }\n    }\n  }\n  if (node.tOwned) {\n    for (i = node.tOwned.length - 1; i >= 0; i--) cleanNode(node.tOwned[i]);\n    delete node.tOwned;\n  }\n  if (Transition && Transition.running && node.pure) {\n    reset(node, true);\n  } else if (node.owned) {\n    for (i = node.owned.length - 1; i >= 0; i--) cleanNode(node.owned[i]);\n    node.owned = null;\n  }\n  if (node.cleanups) {\n    for (i = node.cleanups.length - 1; i >= 0; i--) node.cleanups[i]();\n    node.cleanups = null;\n  }\n  if (Transition && Transition.running) node.tState = 0;\n  else node.state = 0;\n}\nfunction reset(node, top) {\n  if (!top) {\n    node.tState = 0;\n    Transition.disposed.add(node);\n  }\n  if (node.owned) {\n    for (let i = 0; i < node.owned.length; i++) reset(node.owned[i]);\n  }\n}\nfunction castError(err) {\n  if (err instanceof Error) return err;\n  return new Error(typeof err === \"string\" ? err : \"Unknown error\", {\n    cause: err\n  });\n}\nfunction runErrors(err, fns, owner) {\n  try {\n    for (const f of fns) f(err);\n  } catch (e) {\n    handleError(e, (owner && owner.owner) || null);\n  }\n}\nfunction handleError(err, owner = Owner) {\n  const fns = ERROR && owner && owner.context && owner.context[ERROR];\n  const error = castError(err);\n  if (!fns) throw error;\n  if (Effects)\n    Effects.push({\n      fn() {\n        runErrors(error, fns, owner);\n      },\n      state: STALE\n    });\n  else runErrors(error, fns, owner);\n}\nfunction resolveChildren(children) {\n  if (typeof children === \"function\" && !children.length) return resolveChildren(children());\n  if (Array.isArray(children)) {\n    const results = [];\n    for (let i = 0; i < children.length; i++) {\n      const result = resolveChildren(children[i]);\n      Array.isArray(result) ? results.push.apply(results, result) : results.push(result);\n    }\n    return results;\n  }\n  return children;\n}\nfunction createProvider(id, options) {\n  return function provider(props) {\n    let res;\n    createRenderEffect(\n      () =>\n        (res = untrack(() => {\n          Owner.context = {\n            ...Owner.context,\n            [id]: props.value\n          };\n          return children(() => props.children);\n        })),\n      undefined\n    );\n    return res;\n  };\n}\nfunction onError(fn) {\n  ERROR || (ERROR = Symbol(\"error\"));\n  if (Owner === null);\n  else if (Owner.context === null || !Owner.context[ERROR]) {\n    Owner.context = {\n      ...Owner.context,\n      [ERROR]: [fn]\n    };\n    mutateContext(Owner, ERROR, [fn]);\n  } else Owner.context[ERROR].push(fn);\n}\nfunction mutateContext(o, key, value) {\n  if (o.owned) {\n    for (let i = 0; i < o.owned.length; i++) {\n      if (o.owned[i].context === o.context) mutateContext(o.owned[i], key, value);\n      if (!o.owned[i].context) {\n        o.owned[i].context = o.context;\n        mutateContext(o.owned[i], key, value);\n      } else if (!o.owned[i].context[key]) {\n        o.owned[i].context[key] = value;\n        mutateContext(o.owned[i], key, value);\n      }\n    }\n  }\n}\n\nfunction observable(input) {\n  return {\n    subscribe(observer) {\n      if (!(observer instanceof Object) || observer == null) {\n        throw new TypeError(\"Expected the observer to be an object.\");\n      }\n      const handler =\n        typeof observer === \"function\" ? observer : observer.next && observer.next.bind(observer);\n      if (!handler) {\n        return {\n          unsubscribe() {}\n        };\n      }\n      const dispose = createRoot(disposer => {\n        createEffect(() => {\n          const v = input();\n          untrack(() => handler(v));\n        });\n        return disposer;\n      });\n      if (getOwner()) onCleanup(dispose);\n      return {\n        unsubscribe() {\n          dispose();\n        }\n      };\n    },\n    [Symbol.observable || \"@@observable\"]() {\n      return this;\n    }\n  };\n}\nfunction from(producer, initalValue = undefined) {\n  const [s, set] = createSignal(initalValue, {\n    equals: false\n  });\n  if (\"subscribe\" in producer) {\n    const unsub = producer.subscribe(v => set(() => v));\n    onCleanup(() => (\"unsubscribe\" in unsub ? unsub.unsubscribe() : unsub()));\n  } else {\n    const clean = producer(set);\n    onCleanup(clean);\n  }\n  return s;\n}\n\nconst FALLBACK = Symbol(\"fallback\");\nfunction dispose(d) {\n  for (let i = 0; i < d.length; i++) d[i]();\n}\nfunction mapArray(list, mapFn, options = {}) {\n  let items = [],\n    mapped = [],\n    disposers = [],\n    len = 0,\n    indexes = mapFn.length > 1 ? [] : null;\n  onCleanup(() => dispose(disposers));\n  return () => {\n    let newItems = list() || [],\n      newLen = newItems.length,\n      i,\n      j;\n    newItems[$TRACK];\n    return untrack(() => {\n      let newIndices, newIndicesNext, temp, tempdisposers, tempIndexes, start, end, newEnd, item;\n      if (newLen === 0) {\n        if (len !== 0) {\n          dispose(disposers);\n          disposers = [];\n          items = [];\n          mapped = [];\n          len = 0;\n          indexes && (indexes = []);\n        }\n        if (options.fallback) {\n          items = [FALLBACK];\n          mapped[0] = createRoot(disposer => {\n            disposers[0] = disposer;\n            return options.fallback();\n          });\n          len = 1;\n        }\n      } else if (len === 0) {\n        mapped = new Array(newLen);\n        for (j = 0; j < newLen; j++) {\n          items[j] = newItems[j];\n          mapped[j] = createRoot(mapper);\n        }\n        len = newLen;\n      } else {\n        temp = new Array(newLen);\n        tempdisposers = new Array(newLen);\n        indexes && (tempIndexes = new Array(newLen));\n        for (\n          start = 0, end = Math.min(len, newLen);\n          start < end && items[start] === newItems[start];\n          start++\n        );\n        for (\n          end = len - 1, newEnd = newLen - 1;\n          end >= start && newEnd >= start && items[end] === newItems[newEnd];\n          end--, newEnd--\n        ) {\n          temp[newEnd] = mapped[end];\n          tempdisposers[newEnd] = disposers[end];\n          indexes && (tempIndexes[newEnd] = indexes[end]);\n        }\n        newIndices = new Map();\n        newIndicesNext = new Array(newEnd + 1);\n        for (j = newEnd; j >= start; j--) {\n          item = newItems[j];\n          i = newIndices.get(item);\n          newIndicesNext[j] = i === undefined ? -1 : i;\n          newIndices.set(item, j);\n        }\n        for (i = start; i <= end; i++) {\n          item = items[i];\n          j = newIndices.get(item);\n          if (j !== undefined && j !== -1) {\n            temp[j] = mapped[i];\n            tempdisposers[j] = disposers[i];\n            indexes && (tempIndexes[j] = indexes[i]);\n            j = newIndicesNext[j];\n            newIndices.set(item, j);\n          } else disposers[i]();\n        }\n        for (j = start; j < newLen; j++) {\n          if (j in temp) {\n            mapped[j] = temp[j];\n            disposers[j] = tempdisposers[j];\n            if (indexes) {\n              indexes[j] = tempIndexes[j];\n              indexes[j](j);\n            }\n          } else mapped[j] = createRoot(mapper);\n        }\n        mapped = mapped.slice(0, (len = newLen));\n        items = newItems.slice(0);\n      }\n      return mapped;\n    });\n    function mapper(disposer) {\n      disposers[j] = disposer;\n      if (indexes) {\n        const [s, set] = createSignal(j);\n        indexes[j] = set;\n        return mapFn(newItems[j], s);\n      }\n      return mapFn(newItems[j]);\n    }\n  };\n}\nfunction indexArray(list, mapFn, options = {}) {\n  let items = [],\n    mapped = [],\n    disposers = [],\n    signals = [],\n    len = 0,\n    i;\n  onCleanup(() => dispose(disposers));\n  return () => {\n    const newItems = list() || [],\n      newLen = newItems.length;\n    newItems[$TRACK];\n    return untrack(() => {\n      if (newLen === 0) {\n        if (len !== 0) {\n          dispose(disposers);\n          disposers = [];\n          items = [];\n          mapped = [];\n          len = 0;\n          signals = [];\n        }\n        if (options.fallback) {\n          items = [FALLBACK];\n          mapped[0] = createRoot(disposer => {\n            disposers[0] = disposer;\n            return options.fallback();\n          });\n          len = 1;\n        }\n        return mapped;\n      }\n      if (items[0] === FALLBACK) {\n        disposers[0]();\n        disposers = [];\n        items = [];\n        mapped = [];\n        len = 0;\n      }\n      for (i = 0; i < newLen; i++) {\n        if (i < items.length && items[i] !== newItems[i]) {\n          signals[i](() => newItems[i]);\n        } else if (i >= items.length) {\n          mapped[i] = createRoot(mapper);\n        }\n      }\n      for (; i < items.length; i++) {\n        disposers[i]();\n      }\n      len = signals.length = disposers.length = newLen;\n      items = newItems.slice(0);\n      return (mapped = mapped.slice(0, len));\n    });\n    function mapper(disposer) {\n      disposers[i] = disposer;\n      const [s, set] = createSignal(newItems[i]);\n      signals[i] = set;\n      return mapFn(s, i);\n    }\n  };\n}\n\nlet hydrationEnabled = false;\nfunction enableHydration() {\n  hydrationEnabled = true;\n}\nfunction createComponent(Comp, props) {\n  if (hydrationEnabled) {\n    if (sharedConfig.context) {\n      const c = sharedConfig.context;\n      setHydrateContext(nextHydrateContext());\n      const r = untrack(() => Comp(props || {}));\n      setHydrateContext(c);\n      return r;\n    }\n  }\n  return untrack(() => Comp(props || {}));\n}\nfunction trueFn() {\n  return true;\n}\nconst propTraps = {\n  get(_, property, receiver) {\n    if (property === $PROXY) return receiver;\n    return _.get(property);\n  },\n  has(_, property) {\n    if (property === $PROXY) return true;\n    return _.has(property);\n  },\n  set: trueFn,\n  deleteProperty: trueFn,\n  getOwnPropertyDescriptor(_, property) {\n    return {\n      configurable: true,\n      enumerable: true,\n      get() {\n        return _.get(property);\n      },\n      set: trueFn,\n      deleteProperty: trueFn\n    };\n  },\n  ownKeys(_) {\n    return _.keys();\n  }\n};\nfunction resolveSource(s) {\n  return !(s = typeof s === \"function\" ? s() : s) ? {} : s;\n}\nfunction resolveSources() {\n  for (let i = 0, length = this.length; i < length; ++i) {\n    const v = this[i]();\n    if (v !== undefined) return v;\n  }\n}\nfunction mergeProps(...sources) {\n  let proxy = false;\n  for (let i = 0; i < sources.length; i++) {\n    const s = sources[i];\n    proxy = proxy || (!!s && $PROXY in s);\n    sources[i] = typeof s === \"function\" ? ((proxy = true), createMemo(s)) : s;\n  }\n  if (SUPPORTS_PROXY && proxy) {\n    return new Proxy(\n      {\n        get(property) {\n          for (let i = sources.length - 1; i >= 0; i--) {\n            const v = resolveSource(sources[i])[property];\n            if (v !== undefined) return v;\n          }\n        },\n        has(property) {\n          for (let i = sources.length - 1; i >= 0; i--) {\n            if (property in resolveSource(sources[i])) return true;\n          }\n          return false;\n        },\n        keys() {\n          const keys = [];\n          for (let i = 0; i < sources.length; i++)\n            keys.push(...Object.keys(resolveSource(sources[i])));\n          return [...new Set(keys)];\n        }\n      },\n      propTraps\n    );\n  }\n  const sourcesMap = {};\n  const defined = Object.create(null);\n  for (let i = sources.length - 1; i >= 0; i--) {\n    const source = sources[i];\n    if (!source) continue;\n    const sourceKeys = Object.getOwnPropertyNames(source);\n    for (let i = sourceKeys.length - 1; i >= 0; i--) {\n      const key = sourceKeys[i];\n      if (key === \"__proto__\" || key === \"constructor\") continue;\n      const desc = Object.getOwnPropertyDescriptor(source, key);\n      if (!defined[key]) {\n        defined[key] = desc.get\n          ? {\n              enumerable: true,\n              configurable: true,\n              get: resolveSources.bind((sourcesMap[key] = [desc.get.bind(source)]))\n            }\n          : desc.value !== undefined\n          ? desc\n          : undefined;\n      } else {\n        const sources = sourcesMap[key];\n        if (sources) {\n          if (desc.get) sources.push(desc.get.bind(source));\n          else if (desc.value !== undefined) sources.push(() => desc.value);\n        }\n      }\n    }\n  }\n  const target = {};\n  const definedKeys = Object.keys(defined);\n  for (let i = definedKeys.length - 1; i >= 0; i--) {\n    const key = definedKeys[i],\n      desc = defined[key];\n    if (desc && desc.get) Object.defineProperty(target, key, desc);\n    else target[key] = desc ? desc.value : undefined;\n  }\n  return target;\n}\nfunction splitProps(props, ...keys) {\n  if (SUPPORTS_PROXY && $PROXY in props) {\n    const blocked = new Set(keys.length > 1 ? keys.flat() : keys[0]);\n    const res = keys.map(k => {\n      return new Proxy(\n        {\n          get(property) {\n            return k.includes(property) ? props[property] : undefined;\n          },\n          has(property) {\n            return k.includes(property) && property in props;\n          },\n          keys() {\n            return k.filter(property => property in props);\n          }\n        },\n        propTraps\n      );\n    });\n    res.push(\n      new Proxy(\n        {\n          get(property) {\n            return blocked.has(property) ? undefined : props[property];\n          },\n          has(property) {\n            return blocked.has(property) ? false : property in props;\n          },\n          keys() {\n            return Object.keys(props).filter(k => !blocked.has(k));\n          }\n        },\n        propTraps\n      )\n    );\n    return res;\n  }\n  const otherObject = {};\n  const objects = keys.map(() => ({}));\n  for (const propName of Object.getOwnPropertyNames(props)) {\n    const desc = Object.getOwnPropertyDescriptor(props, propName);\n    const isDefaultDesc =\n      !desc.get && !desc.set && desc.enumerable && desc.writable && desc.configurable;\n    let blocked = false;\n    let objectIndex = 0;\n    for (const k of keys) {\n      if (k.includes(propName)) {\n        blocked = true;\n        isDefaultDesc\n          ? (objects[objectIndex][propName] = desc.value)\n          : Object.defineProperty(objects[objectIndex], propName, desc);\n      }\n      ++objectIndex;\n    }\n    if (!blocked) {\n      isDefaultDesc\n        ? (otherObject[propName] = desc.value)\n        : Object.defineProperty(otherObject, propName, desc);\n    }\n  }\n  return [...objects, otherObject];\n}\nfunction lazy(fn) {\n  let comp;\n  let p;\n  const wrap = props => {\n    const ctx = sharedConfig.context;\n    if (ctx) {\n      const [s, set] = createSignal();\n      sharedConfig.count || (sharedConfig.count = 0);\n      sharedConfig.count++;\n      (p || (p = fn())).then(mod => {\n        !sharedConfig.done && setHydrateContext(ctx);\n        sharedConfig.count--;\n        set(() => mod.default);\n        setHydrateContext();\n      });\n      comp = s;\n    } else if (!comp) {\n      const [s] = createResource(() => (p || (p = fn())).then(mod => mod.default));\n      comp = s;\n    }\n    let Comp;\n    return createMemo(() =>\n      (Comp = comp())\n        ? untrack(() => {\n            if (IS_DEV);\n            if (!ctx || sharedConfig.done) return Comp(props);\n            const c = sharedConfig.context;\n            setHydrateContext(ctx);\n            const r = Comp(props);\n            setHydrateContext(c);\n            return r;\n          })\n        : \"\"\n    );\n  };\n  wrap.preload = () => p || ((p = fn()).then(mod => (comp = () => mod.default)), p);\n  return wrap;\n}\nlet counter = 0;\nfunction createUniqueId() {\n  const ctx = sharedConfig.context;\n  return ctx ? sharedConfig.getNextContextId() : `cl-${counter++}`;\n}\n\nconst narrowedError = name => `Stale read from <${name}>.`;\nfunction For(props) {\n  const fallback = \"fallback\" in props && {\n    fallback: () => props.fallback\n  };\n  return createMemo(mapArray(() => props.each, props.children, fallback || undefined));\n}\nfunction Index(props) {\n  const fallback = \"fallback\" in props && {\n    fallback: () => props.fallback\n  };\n  return createMemo(indexArray(() => props.each, props.children, fallback || undefined));\n}\nfunction Show(props) {\n  const keyed = props.keyed;\n  const conditionValue = createMemo(() => props.when, undefined, undefined);\n  const condition = keyed\n    ? conditionValue\n    : createMemo(conditionValue, undefined, {\n        equals: (a, b) => !a === !b\n      });\n  return createMemo(\n    () => {\n      const c = condition();\n      if (c) {\n        const child = props.children;\n        const fn = typeof child === \"function\" && child.length > 0;\n        return fn\n          ? untrack(() =>\n              child(\n                keyed\n                  ? c\n                  : () => {\n                      if (!untrack(condition)) throw narrowedError(\"Show\");\n                      return conditionValue();\n                    }\n              )\n            )\n          : child;\n      }\n      return props.fallback;\n    },\n    undefined,\n    undefined\n  );\n}\nfunction Switch(props) {\n  const chs = children(() => props.children);\n  const switchFunc = createMemo(() => {\n    const ch = chs();\n    const mps = Array.isArray(ch) ? ch : [ch];\n    let func = () => undefined;\n    for (let i = 0; i < mps.length; i++) {\n      const index = i;\n      const mp = mps[i];\n      const prevFunc = func;\n      const conditionValue = createMemo(\n        () => (prevFunc() ? undefined : mp.when),\n        undefined,\n        undefined\n      );\n      const condition = mp.keyed\n        ? conditionValue\n        : createMemo(conditionValue, undefined, {\n            equals: (a, b) => !a === !b\n          });\n      func = () => prevFunc() || (condition() ? [index, conditionValue, mp] : undefined);\n    }\n    return func;\n  });\n  return createMemo(\n    () => {\n      const sel = switchFunc()();\n      if (!sel) return props.fallback;\n      const [index, conditionValue, mp] = sel;\n      const child = mp.children;\n      const fn = typeof child === \"function\" && child.length > 0;\n      return fn\n        ? untrack(() =>\n            child(\n              mp.keyed\n                ? conditionValue()\n                : () => {\n                    if (untrack(switchFunc)()?.[0] !== index) throw narrowedError(\"Match\");\n                    return conditionValue();\n                  }\n            )\n          )\n        : child;\n    },\n    undefined,\n    undefined\n  );\n}\nfunction Match(props) {\n  return props;\n}\nlet Errors;\nfunction resetErrorBoundaries() {\n  Errors && [...Errors].forEach(fn => fn());\n}\nfunction ErrorBoundary(props) {\n  let err;\n  if (sharedConfig.context && sharedConfig.load)\n    err = sharedConfig.load(sharedConfig.getContextId());\n  const [errored, setErrored] = createSignal(err, undefined);\n  Errors || (Errors = new Set());\n  Errors.add(setErrored);\n  onCleanup(() => Errors.delete(setErrored));\n  return createMemo(\n    () => {\n      let e;\n      if ((e = errored())) {\n        const f = props.fallback;\n        return typeof f === \"function\" && f.length ? untrack(() => f(e, () => setErrored())) : f;\n      }\n      return catchError(() => props.children, setErrored);\n    },\n    undefined,\n    undefined\n  );\n}\n\nconst suspenseListEquals = (a, b) =>\n  a.showContent === b.showContent && a.showFallback === b.showFallback;\nconst SuspenseListContext = /* #__PURE__ */ createContext();\nfunction SuspenseList(props) {\n  let [wrapper, setWrapper] = createSignal(() => ({\n      inFallback: false\n    })),\n    show;\n  const listContext = useContext(SuspenseListContext);\n  const [registry, setRegistry] = createSignal([]);\n  if (listContext) {\n    show = listContext.register(createMemo(() => wrapper()().inFallback));\n  }\n  const resolved = createMemo(\n    prev => {\n      const reveal = props.revealOrder,\n        tail = props.tail,\n        { showContent = true, showFallback = true } = show ? show() : {},\n        reg = registry(),\n        reverse = reveal === \"backwards\";\n      if (reveal === \"together\") {\n        const all = reg.every(inFallback => !inFallback());\n        const res = reg.map(() => ({\n          showContent: all && showContent,\n          showFallback\n        }));\n        res.inFallback = !all;\n        return res;\n      }\n      let stop = false;\n      let inFallback = prev.inFallback;\n      const res = [];\n      for (let i = 0, len = reg.length; i < len; i++) {\n        const n = reverse ? len - i - 1 : i,\n          s = reg[n]();\n        if (!stop && !s) {\n          res[n] = {\n            showContent,\n            showFallback\n          };\n        } else {\n          const next = !stop;\n          if (next) inFallback = true;\n          res[n] = {\n            showContent: next,\n            showFallback: !tail || (next && tail === \"collapsed\") ? showFallback : false\n          };\n          stop = true;\n        }\n      }\n      if (!stop) inFallback = false;\n      res.inFallback = inFallback;\n      return res;\n    },\n    {\n      inFallback: false\n    }\n  );\n  setWrapper(() => resolved);\n  return createComponent(SuspenseListContext.Provider, {\n    value: {\n      register: inFallback => {\n        let index;\n        setRegistry(registry => {\n          index = registry.length;\n          return [...registry, inFallback];\n        });\n        return createMemo(() => resolved()[index], undefined, {\n          equals: suspenseListEquals\n        });\n      }\n    },\n    get children() {\n      return props.children;\n    }\n  });\n}\nfunction Suspense(props) {\n  let counter = 0,\n    show,\n    ctx,\n    p,\n    flicker,\n    error;\n  const [inFallback, setFallback] = createSignal(false),\n    SuspenseContext = getSuspenseContext(),\n    store = {\n      increment: () => {\n        if (++counter === 1) setFallback(true);\n      },\n      decrement: () => {\n        if (--counter === 0) setFallback(false);\n      },\n      inFallback,\n      effects: [],\n      resolved: false\n    },\n    owner = getOwner();\n  if (sharedConfig.context && sharedConfig.load) {\n    const key = sharedConfig.getContextId();\n    let ref = sharedConfig.load(key);\n    if (ref) {\n      if (typeof ref !== \"object\" || ref.status !== \"success\") p = ref;\n      else sharedConfig.gather(key);\n    }\n    if (p && p !== \"$$f\") {\n      const [s, set] = createSignal(undefined, {\n        equals: false\n      });\n      flicker = s;\n      p.then(\n        () => {\n          if (sharedConfig.done) return set();\n          sharedConfig.gather(key);\n          setHydrateContext(ctx);\n          set();\n          setHydrateContext();\n        },\n        err => {\n          error = err;\n          set();\n        }\n      );\n    }\n  }\n  const listContext = useContext(SuspenseListContext);\n  if (listContext) show = listContext.register(store.inFallback);\n  let dispose;\n  onCleanup(() => dispose && dispose());\n  return createComponent(SuspenseContext.Provider, {\n    value: store,\n    get children() {\n      return createMemo(() => {\n        if (error) throw error;\n        ctx = sharedConfig.context;\n        if (flicker) {\n          flicker();\n          return (flicker = undefined);\n        }\n        if (ctx && p === \"$$f\") setHydrateContext();\n        const rendered = createMemo(() => props.children);\n        return createMemo(prev => {\n          const inFallback = store.inFallback(),\n            { showContent = true, showFallback = true } = show ? show() : {};\n          if ((!inFallback || (p && p !== \"$$f\")) && showContent) {\n            store.resolved = true;\n            dispose && dispose();\n            dispose = ctx = p = undefined;\n            resumeEffects(store.effects);\n            return rendered();\n          }\n          if (!showFallback) return;\n          if (dispose) return prev;\n          return createRoot(disposer => {\n            dispose = disposer;\n            if (ctx) {\n              setHydrateContext({\n                id: ctx.id + \"F\",\n                count: 0\n              });\n              ctx = undefined;\n            }\n            return props.fallback;\n          }, owner);\n        });\n      });\n    }\n  });\n}\n\nconst DEV = undefined;\n\nexport {\n  $DEVCOMP,\n  $PROXY,\n  $TRACK,\n  DEV,\n  ErrorBoundary,\n  For,\n  Index,\n  Match,\n  Show,\n  Suspense,\n  SuspenseList,\n  Switch,\n  batch,\n  cancelCallback,\n  catchError,\n  children,\n  createComponent,\n  createComputed,\n  createContext,\n  createDeferred,\n  createEffect,\n  createMemo,\n  createReaction,\n  createRenderEffect,\n  createResource,\n  createRoot,\n  createSelector,\n  createSignal,\n  createUniqueId,\n  enableExternalSource,\n  enableHydration,\n  enableScheduling,\n  equalFn,\n  from,\n  getListener,\n  getOwner,\n  indexArray,\n  lazy,\n  mapArray,\n  mergeProps,\n  observable,\n  on,\n  onCleanup,\n  onError,\n  onMount,\n  requestCallback,\n  resetErrorBoundaries,\n  runWithOwner,\n  sharedConfig,\n  splitProps,\n  startTransition,\n  untrack,\n  useContext,\n  useTransition\n};\n","import {\n  createRoot,\n  createRenderEffect,\n  untrack,\n  sharedConfig,\n  enableHydration,\n  getOwner,\n  createEffect,\n  runWithOwner,\n  createMemo,\n  createSignal,\n  onCleanup,\n  splitProps\n} from \"solid-js\";\nexport {\n  ErrorBoundary,\n  For,\n  Index,\n  Match,\n  Show,\n  Suspense,\n  SuspenseList,\n  Switch,\n  createComponent,\n  createRenderEffect as effect,\n  getOwner,\n  createMemo as memo,\n  mergeProps,\n  untrack\n} from \"solid-js\";\n\nconst booleans = [\n  \"allowfullscreen\",\n  \"async\",\n  \"autofocus\",\n  \"autoplay\",\n  \"checked\",\n  \"controls\",\n  \"default\",\n  \"disabled\",\n  \"formnovalidate\",\n  \"hidden\",\n  \"indeterminate\",\n  \"inert\",\n  \"ismap\",\n  \"loop\",\n  \"multiple\",\n  \"muted\",\n  \"nomodule\",\n  \"novalidate\",\n  \"open\",\n  \"playsinline\",\n  \"readonly\",\n  \"required\",\n  \"reversed\",\n  \"seamless\",\n  \"selected\"\n];\nconst Properties = /*#__PURE__*/ new Set([\n  \"className\",\n  \"value\",\n  \"readOnly\",\n  \"formNoValidate\",\n  \"isMap\",\n  \"noModule\",\n  \"playsInline\",\n  ...booleans\n]);\nconst ChildProperties = /*#__PURE__*/ new Set([\n  \"innerHTML\",\n  \"textContent\",\n  \"innerText\",\n  \"children\"\n]);\nconst Aliases = /*#__PURE__*/ Object.assign(Object.create(null), {\n  className: \"class\",\n  htmlFor: \"for\"\n});\nconst PropAliases = /*#__PURE__*/ Object.assign(Object.create(null), {\n  class: \"className\",\n  formnovalidate: {\n    $: \"formNoValidate\",\n    BUTTON: 1,\n    INPUT: 1\n  },\n  ismap: {\n    $: \"isMap\",\n    IMG: 1\n  },\n  nomodule: {\n    $: \"noModule\",\n    SCRIPT: 1\n  },\n  playsinline: {\n    $: \"playsInline\",\n    VIDEO: 1\n  },\n  readonly: {\n    $: \"readOnly\",\n    INPUT: 1,\n    TEXTAREA: 1\n  }\n});\nfunction getPropAlias(prop, tagName) {\n  const a = PropAliases[prop];\n  return typeof a === \"object\" ? (a[tagName] ? a[\"$\"] : undefined) : a;\n}\nconst DelegatedEvents = /*#__PURE__*/ new Set([\n  \"beforeinput\",\n  \"click\",\n  \"dblclick\",\n  \"contextmenu\",\n  \"focusin\",\n  \"focusout\",\n  \"input\",\n  \"keydown\",\n  \"keyup\",\n  \"mousedown\",\n  \"mousemove\",\n  \"mouseout\",\n  \"mouseover\",\n  \"mouseup\",\n  \"pointerdown\",\n  \"pointermove\",\n  \"pointerout\",\n  \"pointerover\",\n  \"pointerup\",\n  \"touchend\",\n  \"touchmove\",\n  \"touchstart\"\n]);\nconst SVGElements = /*#__PURE__*/ new Set([\n  \"altGlyph\",\n  \"altGlyphDef\",\n  \"altGlyphItem\",\n  \"animate\",\n  \"animateColor\",\n  \"animateMotion\",\n  \"animateTransform\",\n  \"circle\",\n  \"clipPath\",\n  \"color-profile\",\n  \"cursor\",\n  \"defs\",\n  \"desc\",\n  \"ellipse\",\n  \"feBlend\",\n  \"feColorMatrix\",\n  \"feComponentTransfer\",\n  \"feComposite\",\n  \"feConvolveMatrix\",\n  \"feDiffuseLighting\",\n  \"feDisplacementMap\",\n  \"feDistantLight\",\n  \"feDropShadow\",\n  \"feFlood\",\n  \"feFuncA\",\n  \"feFuncB\",\n  \"feFuncG\",\n  \"feFuncR\",\n  \"feGaussianBlur\",\n  \"feImage\",\n  \"feMerge\",\n  \"feMergeNode\",\n  \"feMorphology\",\n  \"feOffset\",\n  \"fePointLight\",\n  \"feSpecularLighting\",\n  \"feSpotLight\",\n  \"feTile\",\n  \"feTurbulence\",\n  \"filter\",\n  \"font\",\n  \"font-face\",\n  \"font-face-format\",\n  \"font-face-name\",\n  \"font-face-src\",\n  \"font-face-uri\",\n  \"foreignObject\",\n  \"g\",\n  \"glyph\",\n  \"glyphRef\",\n  \"hkern\",\n  \"image\",\n  \"line\",\n  \"linearGradient\",\n  \"marker\",\n  \"mask\",\n  \"metadata\",\n  \"missing-glyph\",\n  \"mpath\",\n  \"path\",\n  \"pattern\",\n  \"polygon\",\n  \"polyline\",\n  \"radialGradient\",\n  \"rect\",\n  \"set\",\n  \"stop\",\n  \"svg\",\n  \"switch\",\n  \"symbol\",\n  \"text\",\n  \"textPath\",\n  \"tref\",\n  \"tspan\",\n  \"use\",\n  \"view\",\n  \"vkern\"\n]);\nconst SVGNamespace = {\n  xlink: \"http://www.w3.org/1999/xlink\",\n  xml: \"http://www.w3.org/XML/1998/namespace\"\n};\nconst DOMElements = /*#__PURE__*/ new Set([\n  \"html\",\n  \"base\",\n  \"head\",\n  \"link\",\n  \"meta\",\n  \"style\",\n  \"title\",\n  \"body\",\n  \"address\",\n  \"article\",\n  \"aside\",\n  \"footer\",\n  \"header\",\n  \"main\",\n  \"nav\",\n  \"section\",\n  \"body\",\n  \"blockquote\",\n  \"dd\",\n  \"div\",\n  \"dl\",\n  \"dt\",\n  \"figcaption\",\n  \"figure\",\n  \"hr\",\n  \"li\",\n  \"ol\",\n  \"p\",\n  \"pre\",\n  \"ul\",\n  \"a\",\n  \"abbr\",\n  \"b\",\n  \"bdi\",\n  \"bdo\",\n  \"br\",\n  \"cite\",\n  \"code\",\n  \"data\",\n  \"dfn\",\n  \"em\",\n  \"i\",\n  \"kbd\",\n  \"mark\",\n  \"q\",\n  \"rp\",\n  \"rt\",\n  \"ruby\",\n  \"s\",\n  \"samp\",\n  \"small\",\n  \"span\",\n  \"strong\",\n  \"sub\",\n  \"sup\",\n  \"time\",\n  \"u\",\n  \"var\",\n  \"wbr\",\n  \"area\",\n  \"audio\",\n  \"img\",\n  \"map\",\n  \"track\",\n  \"video\",\n  \"embed\",\n  \"iframe\",\n  \"object\",\n  \"param\",\n  \"picture\",\n  \"portal\",\n  \"source\",\n  \"svg\",\n  \"math\",\n  \"canvas\",\n  \"noscript\",\n  \"script\",\n  \"del\",\n  \"ins\",\n  \"caption\",\n  \"col\",\n  \"colgroup\",\n  \"table\",\n  \"tbody\",\n  \"td\",\n  \"tfoot\",\n  \"th\",\n  \"thead\",\n  \"tr\",\n  \"button\",\n  \"datalist\",\n  \"fieldset\",\n  \"form\",\n  \"input\",\n  \"label\",\n  \"legend\",\n  \"meter\",\n  \"optgroup\",\n  \"option\",\n  \"output\",\n  \"progress\",\n  \"select\",\n  \"textarea\",\n  \"details\",\n  \"dialog\",\n  \"menu\",\n  \"summary\",\n  \"details\",\n  \"slot\",\n  \"template\",\n  \"acronym\",\n  \"applet\",\n  \"basefont\",\n  \"bgsound\",\n  \"big\",\n  \"blink\",\n  \"center\",\n  \"content\",\n  \"dir\",\n  \"font\",\n  \"frame\",\n  \"frameset\",\n  \"hgroup\",\n  \"image\",\n  \"keygen\",\n  \"marquee\",\n  \"menuitem\",\n  \"nobr\",\n  \"noembed\",\n  \"noframes\",\n  \"plaintext\",\n  \"rb\",\n  \"rtc\",\n  \"shadow\",\n  \"spacer\",\n  \"strike\",\n  \"tt\",\n  \"xmp\",\n  \"a\",\n  \"abbr\",\n  \"acronym\",\n  \"address\",\n  \"applet\",\n  \"area\",\n  \"article\",\n  \"aside\",\n  \"audio\",\n  \"b\",\n  \"base\",\n  \"basefont\",\n  \"bdi\",\n  \"bdo\",\n  \"bgsound\",\n  \"big\",\n  \"blink\",\n  \"blockquote\",\n  \"body\",\n  \"br\",\n  \"button\",\n  \"canvas\",\n  \"caption\",\n  \"center\",\n  \"cite\",\n  \"code\",\n  \"col\",\n  \"colgroup\",\n  \"content\",\n  \"data\",\n  \"datalist\",\n  \"dd\",\n  \"del\",\n  \"details\",\n  \"dfn\",\n  \"dialog\",\n  \"dir\",\n  \"div\",\n  \"dl\",\n  \"dt\",\n  \"em\",\n  \"embed\",\n  \"fieldset\",\n  \"figcaption\",\n  \"figure\",\n  \"font\",\n  \"footer\",\n  \"form\",\n  \"frame\",\n  \"frameset\",\n  \"head\",\n  \"header\",\n  \"hgroup\",\n  \"hr\",\n  \"html\",\n  \"i\",\n  \"iframe\",\n  \"image\",\n  \"img\",\n  \"input\",\n  \"ins\",\n  \"kbd\",\n  \"keygen\",\n  \"label\",\n  \"legend\",\n  \"li\",\n  \"link\",\n  \"main\",\n  \"map\",\n  \"mark\",\n  \"marquee\",\n  \"menu\",\n  \"menuitem\",\n  \"meta\",\n  \"meter\",\n  \"nav\",\n  \"nobr\",\n  \"noembed\",\n  \"noframes\",\n  \"noscript\",\n  \"object\",\n  \"ol\",\n  \"optgroup\",\n  \"option\",\n  \"output\",\n  \"p\",\n  \"param\",\n  \"picture\",\n  \"plaintext\",\n  \"portal\",\n  \"pre\",\n  \"progress\",\n  \"q\",\n  \"rb\",\n  \"rp\",\n  \"rt\",\n  \"rtc\",\n  \"ruby\",\n  \"s\",\n  \"samp\",\n  \"script\",\n  \"section\",\n  \"select\",\n  \"shadow\",\n  \"slot\",\n  \"small\",\n  \"source\",\n  \"spacer\",\n  \"span\",\n  \"strike\",\n  \"strong\",\n  \"style\",\n  \"sub\",\n  \"summary\",\n  \"sup\",\n  \"table\",\n  \"tbody\",\n  \"td\",\n  \"template\",\n  \"textarea\",\n  \"tfoot\",\n  \"th\",\n  \"thead\",\n  \"time\",\n  \"title\",\n  \"tr\",\n  \"track\",\n  \"tt\",\n  \"u\",\n  \"ul\",\n  \"var\",\n  \"video\",\n  \"wbr\",\n  \"xmp\",\n  \"input\",\n  \"h1\",\n  \"h2\",\n  \"h3\",\n  \"h4\",\n  \"h5\",\n  \"h6\"\n]);\n\nfunction reconcileArrays(parentNode, a, b) {\n  let bLength = b.length,\n    aEnd = a.length,\n    bEnd = bLength,\n    aStart = 0,\n    bStart = 0,\n    after = a[aEnd - 1].nextSibling,\n    map = null;\n  while (aStart < aEnd || bStart < bEnd) {\n    if (a[aStart] === b[bStart]) {\n      aStart++;\n      bStart++;\n      continue;\n    }\n    while (a[aEnd - 1] === b[bEnd - 1]) {\n      aEnd--;\n      bEnd--;\n    }\n    if (aEnd === aStart) {\n      const node = bEnd < bLength ? (bStart ? b[bStart - 1].nextSibling : b[bEnd - bStart]) : after;\n      while (bStart < bEnd) parentNode.insertBefore(b[bStart++], node);\n    } else if (bEnd === bStart) {\n      while (aStart < aEnd) {\n        if (!map || !map.has(a[aStart])) a[aStart].remove();\n        aStart++;\n      }\n    } else if (a[aStart] === b[bEnd - 1] && b[bStart] === a[aEnd - 1]) {\n      const node = a[--aEnd].nextSibling;\n      parentNode.insertBefore(b[bStart++], a[aStart++].nextSibling);\n      parentNode.insertBefore(b[--bEnd], node);\n      a[aEnd] = b[bEnd];\n    } else {\n      if (!map) {\n        map = new Map();\n        let i = bStart;\n        while (i < bEnd) map.set(b[i], i++);\n      }\n      const index = map.get(a[aStart]);\n      if (index != null) {\n        if (bStart < index && index < bEnd) {\n          let i = aStart,\n            sequence = 1,\n            t;\n          while (++i < aEnd && i < bEnd) {\n            if ((t = map.get(a[i])) == null || t !== index + sequence) break;\n            sequence++;\n          }\n          if (sequence > index - bStart) {\n            const node = a[aStart];\n            while (bStart < index) parentNode.insertBefore(b[bStart++], node);\n          } else parentNode.replaceChild(b[bStart++], a[aStart++]);\n        } else aStart++;\n      } else a[aStart++].remove();\n    }\n  }\n}\n\nconst $$EVENTS = \"_$DX_DELEGATE\";\nfunction render(code, element, init, options = {}) {\n  let disposer;\n  createRoot(dispose => {\n    disposer = dispose;\n    element === document\n      ? code()\n      : insert(element, code(), element.firstChild ? null : undefined, init);\n  }, options.owner);\n  return () => {\n    disposer();\n    element.textContent = \"\";\n  };\n}\nfunction template(html, isImportNode, isSVG, isMathML) {\n  let node;\n  const create = () => {\n    const t = isMathML\n      ? document.createElementNS(\"http://www.w3.org/1998/Math/MathML\", \"template\")\n      : document.createElement(\"template\");\n    t.innerHTML = html;\n    return isSVG ? t.content.firstChild.firstChild : isMathML ? t.firstChild : t.content.firstChild;\n  };\n  const fn = isImportNode\n    ? () => untrack(() => document.importNode(node || (node = create()), true))\n    : () => (node || (node = create())).cloneNode(true);\n  fn.cloneNode = fn;\n  return fn;\n}\nfunction delegateEvents(eventNames, document = window.document) {\n  const e = document[$$EVENTS] || (document[$$EVENTS] = new Set());\n  for (let i = 0, l = eventNames.length; i < l; i++) {\n    const name = eventNames[i];\n    if (!e.has(name)) {\n      e.add(name);\n      document.addEventListener(name, eventHandler);\n    }\n  }\n}\nfunction clearDelegatedEvents(document = window.document) {\n  if (document[$$EVENTS]) {\n    for (let name of document[$$EVENTS].keys()) document.removeEventListener(name, eventHandler);\n    delete document[$$EVENTS];\n  }\n}\nfunction setProperty(node, name, value) {\n  if (isHydrating(node)) return;\n  node[name] = value;\n}\nfunction setAttribute(node, name, value) {\n  if (isHydrating(node)) return;\n  if (value == null) node.removeAttribute(name);\n  else node.setAttribute(name, value);\n}\nfunction setAttributeNS(node, namespace, name, value) {\n  if (isHydrating(node)) return;\n  if (value == null) node.removeAttributeNS(namespace, name);\n  else node.setAttributeNS(namespace, name, value);\n}\nfunction setBoolAttribute(node, name, value) {\n  if (isHydrating(node)) return;\n  value ? node.setAttribute(name, \"\") : node.removeAttribute(name);\n}\nfunction className(node, value) {\n  if (isHydrating(node)) return;\n  if (value == null) node.removeAttribute(\"class\");\n  else node.className = value;\n}\nfunction addEventListener(node, name, handler, delegate) {\n  if (delegate) {\n    if (Array.isArray(handler)) {\n      node[`$$${name}`] = handler[0];\n      node[`$$${name}Data`] = handler[1];\n    } else node[`$$${name}`] = handler;\n  } else if (Array.isArray(handler)) {\n    const handlerFn = handler[0];\n    node.addEventListener(name, (handler[0] = e => handlerFn.call(node, handler[1], e)));\n  } else node.addEventListener(name, handler, typeof handler !== \"function\" && handler);\n}\nfunction classList(node, value, prev = {}) {\n  const classKeys = Object.keys(value || {}),\n    prevKeys = Object.keys(prev);\n  let i, len;\n  for (i = 0, len = prevKeys.length; i < len; i++) {\n    const key = prevKeys[i];\n    if (!key || key === \"undefined\" || value[key]) continue;\n    toggleClassKey(node, key, false);\n    delete prev[key];\n  }\n  for (i = 0, len = classKeys.length; i < len; i++) {\n    const key = classKeys[i],\n      classValue = !!value[key];\n    if (!key || key === \"undefined\" || prev[key] === classValue || !classValue) continue;\n    toggleClassKey(node, key, true);\n    prev[key] = classValue;\n  }\n  return prev;\n}\nfunction style(node, value, prev) {\n  if (!value) return prev ? setAttribute(node, \"style\") : value;\n  const nodeStyle = node.style;\n  if (typeof value === \"string\") return (nodeStyle.cssText = value);\n  typeof prev === \"string\" && (nodeStyle.cssText = prev = undefined);\n  prev || (prev = {});\n  value || (value = {});\n  let v, s;\n  for (s in prev) {\n    value[s] == null && nodeStyle.removeProperty(s);\n    delete prev[s];\n  }\n  for (s in value) {\n    v = value[s];\n    if (v !== prev[s]) {\n      nodeStyle.setProperty(s, v);\n      prev[s] = v;\n    }\n  }\n  return prev;\n}\nfunction spread(node, props = {}, isSVG, skipChildren) {\n  const prevProps = {};\n  if (!skipChildren) {\n    createRenderEffect(\n      () => (prevProps.children = insertExpression(node, props.children, prevProps.children))\n    );\n  }\n  createRenderEffect(() => typeof props.ref === \"function\" && use(props.ref, node));\n  createRenderEffect(() => assign(node, props, isSVG, true, prevProps, true));\n  return prevProps;\n}\nfunction dynamicProperty(props, key) {\n  const src = props[key];\n  Object.defineProperty(props, key, {\n    get() {\n      return src();\n    },\n    enumerable: true\n  });\n  return props;\n}\nfunction use(fn, element, arg) {\n  return untrack(() => fn(element, arg));\n}\nfunction insert(parent, accessor, marker, initial) {\n  if (marker !== undefined && !initial) initial = [];\n  if (typeof accessor !== \"function\") return insertExpression(parent, accessor, initial, marker);\n  createRenderEffect(current => insertExpression(parent, accessor(), current, marker), initial);\n}\nfunction assign(node, props, isSVG, skipChildren, prevProps = {}, skipRef = false) {\n  props || (props = {});\n  for (const prop in prevProps) {\n    if (!(prop in props)) {\n      if (prop === \"children\") continue;\n      prevProps[prop] = assignProp(node, prop, null, prevProps[prop], isSVG, skipRef, props);\n    }\n  }\n  for (const prop in props) {\n    if (prop === \"children\") {\n      if (!skipChildren) insertExpression(node, props.children);\n      continue;\n    }\n    const value = props[prop];\n    prevProps[prop] = assignProp(node, prop, value, prevProps[prop], isSVG, skipRef, props);\n  }\n}\nfunction hydrate$1(code, element, options = {}) {\n  if (globalThis._$HY.done) return render(code, element, [...element.childNodes], options);\n  sharedConfig.completed = globalThis._$HY.completed;\n  sharedConfig.events = globalThis._$HY.events;\n  sharedConfig.load = id => globalThis._$HY.r[id];\n  sharedConfig.has = id => id in globalThis._$HY.r;\n  sharedConfig.gather = root => gatherHydratable(element, root);\n  sharedConfig.registry = new Map();\n  sharedConfig.context = {\n    id: options.renderId || \"\",\n    count: 0\n  };\n  try {\n    gatherHydratable(element, options.renderId);\n    return render(code, element, [...element.childNodes], options);\n  } finally {\n    sharedConfig.context = null;\n  }\n}\nfunction getNextElement(template) {\n  let node,\n    key,\n    hydrating = isHydrating();\n  if (!hydrating || !(node = sharedConfig.registry.get((key = getHydrationKey())))) {\n    return template();\n  }\n  if (sharedConfig.completed) sharedConfig.completed.add(node);\n  sharedConfig.registry.delete(key);\n  return node;\n}\nfunction getNextMatch(el, nodeName) {\n  while (el && el.localName !== nodeName) el = el.nextSibling;\n  return el;\n}\nfunction getNextMarker(start) {\n  let end = start,\n    count = 0,\n    current = [];\n  if (isHydrating(start)) {\n    while (end) {\n      if (end.nodeType === 8) {\n        const v = end.nodeValue;\n        if (v === \"$\") count++;\n        else if (v === \"/\") {\n          if (count === 0) return [end, current];\n          count--;\n        }\n      }\n      current.push(end);\n      end = end.nextSibling;\n    }\n  }\n  return [end, current];\n}\nfunction runHydrationEvents() {\n  if (sharedConfig.events && !sharedConfig.events.queued) {\n    queueMicrotask(() => {\n      const { completed, events } = sharedConfig;\n      if (!events) return;\n      events.queued = false;\n      while (events.length) {\n        const [el, e] = events[0];\n        if (!completed.has(el)) return;\n        events.shift();\n        eventHandler(e);\n      }\n      if (sharedConfig.done) {\n        sharedConfig.events = _$HY.events = null;\n        sharedConfig.completed = _$HY.completed = null;\n      }\n    });\n    sharedConfig.events.queued = true;\n  }\n}\nfunction isHydrating(node) {\n  return !!sharedConfig.context && !sharedConfig.done && (!node || node.isConnected);\n}\nfunction toPropertyName(name) {\n  return name.toLowerCase().replace(/-([a-z])/g, (_, w) => w.toUpperCase());\n}\nfunction toggleClassKey(node, key, value) {\n  const classNames = key.trim().split(/\\s+/);\n  for (let i = 0, nameLen = classNames.length; i < nameLen; i++)\n    node.classList.toggle(classNames[i], value);\n}\nfunction assignProp(node, prop, value, prev, isSVG, skipRef, props) {\n  let isCE, isProp, isChildProp, propAlias, forceProp;\n  if (prop === \"style\") return style(node, value, prev);\n  if (prop === \"classList\") return classList(node, value, prev);\n  if (value === prev) return prev;\n  if (prop === \"ref\") {\n    if (!skipRef) value(node);\n  } else if (prop.slice(0, 3) === \"on:\") {\n    const e = prop.slice(3);\n    prev && node.removeEventListener(e, prev, typeof prev !== \"function\" && prev);\n    value && node.addEventListener(e, value, typeof value !== \"function\" && value);\n  } else if (prop.slice(0, 10) === \"oncapture:\") {\n    const e = prop.slice(10);\n    prev && node.removeEventListener(e, prev, true);\n    value && node.addEventListener(e, value, true);\n  } else if (prop.slice(0, 2) === \"on\") {\n    const name = prop.slice(2).toLowerCase();\n    const delegate = DelegatedEvents.has(name);\n    if (!delegate && prev) {\n      const h = Array.isArray(prev) ? prev[0] : prev;\n      node.removeEventListener(name, h);\n    }\n    if (delegate || value) {\n      addEventListener(node, name, value, delegate);\n      delegate && delegateEvents([name]);\n    }\n  } else if (prop.slice(0, 5) === \"attr:\") {\n    setAttribute(node, prop.slice(5), value);\n  } else if (prop.slice(0, 5) === \"bool:\") {\n    setBoolAttribute(node, prop.slice(5), value);\n  } else if (\n    (forceProp = prop.slice(0, 5) === \"prop:\") ||\n    (isChildProp = ChildProperties.has(prop)) ||\n    (!isSVG &&\n      ((propAlias = getPropAlias(prop, node.tagName)) || (isProp = Properties.has(prop)))) ||\n    (isCE = node.nodeName.includes(\"-\") || \"is\" in props)\n  ) {\n    if (forceProp) {\n      prop = prop.slice(5);\n      isProp = true;\n    } else if (isHydrating(node)) return value;\n    if (prop === \"class\" || prop === \"className\") className(node, value);\n    else if (isCE && !isProp && !isChildProp) node[toPropertyName(prop)] = value;\n    else node[propAlias || prop] = value;\n  } else {\n    const ns = isSVG && prop.indexOf(\":\") > -1 && SVGNamespace[prop.split(\":\")[0]];\n    if (ns) setAttributeNS(node, ns, prop, value);\n    else setAttribute(node, Aliases[prop] || prop, value);\n  }\n  return value;\n}\nfunction eventHandler(e) {\n  if (sharedConfig.registry && sharedConfig.events) {\n    if (sharedConfig.events.find(([el, ev]) => ev === e)) return;\n  }\n  let node = e.target;\n  const key = `$$${e.type}`;\n  const oriTarget = e.target;\n  const oriCurrentTarget = e.currentTarget;\n  const retarget = value =>\n    Object.defineProperty(e, \"target\", {\n      configurable: true,\n      value\n    });\n  const handleNode = () => {\n    const handler = node[key];\n    if (handler && !node.disabled) {\n      const data = node[`${key}Data`];\n      data !== undefined ? handler.call(node, data, e) : handler.call(node, e);\n      if (e.cancelBubble) return;\n    }\n    node.host &&\n      typeof node.host !== \"string\" &&\n      !node.host._$host &&\n      node.contains(e.target) &&\n      retarget(node.host);\n    return true;\n  };\n  const walkUpTree = () => {\n    while (handleNode() && (node = node._$host || node.parentNode || node.host));\n  };\n  Object.defineProperty(e, \"currentTarget\", {\n    configurable: true,\n    get() {\n      return node || document;\n    }\n  });\n  if (sharedConfig.registry && !sharedConfig.done) sharedConfig.done = _$HY.done = true;\n  if (e.composedPath) {\n    const path = e.composedPath();\n    retarget(path[0]);\n    for (let i = 0; i < path.length - 2; i++) {\n      node = path[i];\n      if (!handleNode()) break;\n      if (node._$host) {\n        node = node._$host;\n        walkUpTree();\n        break;\n      }\n      if (node.parentNode === oriCurrentTarget) {\n        break;\n      }\n    }\n  } else walkUpTree();\n  retarget(oriTarget);\n}\nfunction insertExpression(parent, value, current, marker, unwrapArray) {\n  const hydrating = isHydrating(parent);\n  if (hydrating) {\n    !current && (current = [...parent.childNodes]);\n    let cleaned = [];\n    for (let i = 0; i < current.length; i++) {\n      const node = current[i];\n      if (node.nodeType === 8 && node.data.slice(0, 2) === \"!$\") node.remove();\n      else cleaned.push(node);\n    }\n    current = cleaned;\n  }\n  while (typeof current === \"function\") current = current();\n  if (value === current) return current;\n  const t = typeof value,\n    multi = marker !== undefined;\n  parent = (multi && current[0] && current[0].parentNode) || parent;\n  if (t === \"string\" || t === \"number\") {\n    if (hydrating) return current;\n    if (t === \"number\") {\n      value = value.toString();\n      if (value === current) return current;\n    }\n    if (multi) {\n      let node = current[0];\n      if (node && node.nodeType === 3) {\n        node.data !== value && (node.data = value);\n      } else node = document.createTextNode(value);\n      current = cleanChildren(parent, current, marker, node);\n    } else {\n      if (current !== \"\" && typeof current === \"string\") {\n        current = parent.firstChild.data = value;\n      } else current = parent.textContent = value;\n    }\n  } else if (value == null || t === \"boolean\") {\n    if (hydrating) return current;\n    current = cleanChildren(parent, current, marker);\n  } else if (t === \"function\") {\n    createRenderEffect(() => {\n      let v = value();\n      while (typeof v === \"function\") v = v();\n      current = insertExpression(parent, v, current, marker);\n    });\n    return () => current;\n  } else if (Array.isArray(value)) {\n    const array = [];\n    const currentArray = current && Array.isArray(current);\n    if (normalizeIncomingArray(array, value, current, unwrapArray)) {\n      createRenderEffect(() => (current = insertExpression(parent, array, current, marker, true)));\n      return () => current;\n    }\n    if (hydrating) {\n      if (!array.length) return current;\n      if (marker === undefined) return (current = [...parent.childNodes]);\n      let node = array[0];\n      if (node.parentNode !== parent) return current;\n      const nodes = [node];\n      while ((node = node.nextSibling) !== marker) nodes.push(node);\n      return (current = nodes);\n    }\n    if (array.length === 0) {\n      current = cleanChildren(parent, current, marker);\n      if (multi) return current;\n    } else if (currentArray) {\n      if (current.length === 0) {\n        appendNodes(parent, array, marker);\n      } else reconcileArrays(parent, current, array);\n    } else {\n      current && cleanChildren(parent);\n      appendNodes(parent, array);\n    }\n    current = array;\n  } else if (value.nodeType) {\n    if (hydrating && value.parentNode) return (current = multi ? [value] : value);\n    if (Array.isArray(current)) {\n      if (multi) return (current = cleanChildren(parent, current, marker, value));\n      cleanChildren(parent, current, null, value);\n    } else if (current == null || current === \"\" || !parent.firstChild) {\n      parent.appendChild(value);\n    } else parent.replaceChild(value, parent.firstChild);\n    current = value;\n  } else;\n  return current;\n}\nfunction normalizeIncomingArray(normalized, array, current, unwrap) {\n  let dynamic = false;\n  for (let i = 0, len = array.length; i < len; i++) {\n    let item = array[i],\n      prev = current && current[normalized.length],\n      t;\n    if (item == null || item === true || item === false);\n    else if ((t = typeof item) === \"object\" && item.nodeType) {\n      normalized.push(item);\n    } else if (Array.isArray(item)) {\n      dynamic = normalizeIncomingArray(normalized, item, prev) || dynamic;\n    } else if (t === \"function\") {\n      if (unwrap) {\n        while (typeof item === \"function\") item = item();\n        dynamic =\n          normalizeIncomingArray(\n            normalized,\n            Array.isArray(item) ? item : [item],\n            Array.isArray(prev) ? prev : [prev]\n          ) || dynamic;\n      } else {\n        normalized.push(item);\n        dynamic = true;\n      }\n    } else {\n      const value = String(item);\n      if (prev && prev.nodeType === 3 && prev.data === value) normalized.push(prev);\n      else normalized.push(document.createTextNode(value));\n    }\n  }\n  return dynamic;\n}\nfunction appendNodes(parent, array, marker = null) {\n  for (let i = 0, len = array.length; i < len; i++) parent.insertBefore(array[i], marker);\n}\nfunction cleanChildren(parent, current, marker, replacement) {\n  if (marker === undefined) return (parent.textContent = \"\");\n  const node = replacement || document.createTextNode(\"\");\n  if (current.length) {\n    let inserted = false;\n    for (let i = current.length - 1; i >= 0; i--) {\n      const el = current[i];\n      if (node !== el) {\n        const isParent = el.parentNode === parent;\n        if (!inserted && !i)\n          isParent ? parent.replaceChild(node, el) : parent.insertBefore(node, marker);\n        else isParent && el.remove();\n      } else inserted = true;\n    }\n  } else parent.insertBefore(node, marker);\n  return [node];\n}\nfunction gatherHydratable(element, root) {\n  const templates = element.querySelectorAll(`*[data-hk]`);\n  for (let i = 0; i < templates.length; i++) {\n    const node = templates[i];\n    const key = node.getAttribute(\"data-hk\");\n    if ((!root || key.startsWith(root)) && !sharedConfig.registry.has(key))\n      sharedConfig.registry.set(key, node);\n  }\n}\nfunction getHydrationKey() {\n  return sharedConfig.getNextContextId();\n}\nfunction NoHydration(props) {\n  return sharedConfig.context ? undefined : props.children;\n}\nfunction Hydration(props) {\n  return props.children;\n}\nconst voidFn = () => undefined;\nconst RequestContext = Symbol();\nfunction innerHTML(parent, content) {\n  !sharedConfig.context && (parent.innerHTML = content);\n}\n\nfunction throwInBrowser(func) {\n  const err = new Error(`${func.name} is not supported in the browser, returning undefined`);\n  console.error(err);\n}\nfunction renderToString(fn, options) {\n  throwInBrowser(renderToString);\n}\nfunction renderToStringAsync(fn, options) {\n  throwInBrowser(renderToStringAsync);\n}\nfunction renderToStream(fn, options) {\n  throwInBrowser(renderToStream);\n}\nfunction ssr(template, ...nodes) {}\nfunction ssrElement(name, props, children, needsId) {}\nfunction ssrClassList(value) {}\nfunction ssrStyle(value) {}\nfunction ssrAttribute(key, value) {}\nfunction ssrHydrationKey() {}\nfunction resolveSSRNode(node) {}\nfunction escape(html) {}\nfunction ssrSpread(props, isSVG, skipChildren) {}\n\nconst isServer = false;\nconst isDev = false;\nconst SVG_NAMESPACE = \"http://www.w3.org/2000/svg\";\nfunction createElement(tagName, isSVG = false) {\n  return isSVG ? document.createElementNS(SVG_NAMESPACE, tagName) : document.createElement(tagName);\n}\nconst hydrate = (...args) => {\n  enableHydration();\n  return hydrate$1(...args);\n};\nfunction Portal(props) {\n  const { useShadow } = props,\n    marker = document.createTextNode(\"\"),\n    mount = () => props.mount || document.body,\n    owner = getOwner();\n  let content;\n  let hydrating = !!sharedConfig.context;\n  createEffect(\n    () => {\n      if (hydrating) getOwner().user = hydrating = false;\n      content || (content = runWithOwner(owner, () => createMemo(() => props.children)));\n      const el = mount();\n      if (el instanceof HTMLHeadElement) {\n        const [clean, setClean] = createSignal(false);\n        const cleanup = () => setClean(true);\n        createRoot(dispose => insert(el, () => (!clean() ? content() : dispose()), null));\n        onCleanup(cleanup);\n      } else {\n        const container = createElement(props.isSVG ? \"g\" : \"div\", props.isSVG),\n          renderRoot =\n            useShadow && container.attachShadow\n              ? container.attachShadow({\n                  mode: \"open\"\n                })\n              : container;\n        Object.defineProperty(container, \"_$host\", {\n          get() {\n            return marker.parentNode;\n          },\n          configurable: true\n        });\n        insert(renderRoot, content);\n        el.appendChild(container);\n        props.ref && props.ref(container);\n        onCleanup(() => el.removeChild(container));\n      }\n    },\n    undefined,\n    {\n      render: !hydrating\n    }\n  );\n  return marker;\n}\nfunction createDynamic(component, props) {\n  const cached = createMemo(component);\n  return createMemo(() => {\n    const component = cached();\n    switch (typeof component) {\n      case \"function\":\n        return untrack(() => component(props));\n      case \"string\":\n        const isSvg = SVGElements.has(component);\n        const el = sharedConfig.context ? getNextElement() : createElement(component, isSvg);\n        spread(el, props, isSvg);\n        return el;\n    }\n  });\n}\nfunction Dynamic(props) {\n  const [, others] = splitProps(props, [\"component\"]);\n  return createDynamic(() => props.component, others);\n}\n\nexport {\n  Aliases,\n  voidFn as Assets,\n  ChildProperties,\n  DOMElements,\n  DelegatedEvents,\n  Dynamic,\n  Hydration,\n  voidFn as HydrationScript,\n  NoHydration,\n  Portal,\n  Properties,\n  RequestContext,\n  SVGElements,\n  SVGNamespace,\n  addEventListener,\n  assign,\n  classList,\n  className,\n  clearDelegatedEvents,\n  createDynamic,\n  delegateEvents,\n  dynamicProperty,\n  escape,\n  voidFn as generateHydrationScript,\n  voidFn as getAssets,\n  getHydrationKey,\n  getNextElement,\n  getNextMarker,\n  getNextMatch,\n  getPropAlias,\n  voidFn as getRequestEvent,\n  hydrate,\n  innerHTML,\n  insert,\n  isDev,\n  isServer,\n  render,\n  renderToStream,\n  renderToString,\n  renderToStringAsync,\n  resolveSSRNode,\n  runHydrationEvents,\n  setAttribute,\n  setAttributeNS,\n  setBoolAttribute,\n  setProperty,\n  spread,\n  ssr,\n  ssrAttribute,\n  ssrClassList,\n  ssrElement,\n  ssrHydrationKey,\n  ssrSpread,\n  ssrStyle,\n  style,\n  template,\n  use,\n  voidFn as useAssets\n};\n","function cloneProps(props) {\n  const propKeys = Object.keys(props);\n  return propKeys.reduce((memo, k) => {\n    const prop = props[k];\n    memo[k] = Object.assign({}, prop);\n    if (isObject(prop.value) && !isFunction(prop.value) && !Array.isArray(prop.value)) memo[k].value = Object.assign({}, prop.value);\n    if (Array.isArray(prop.value)) memo[k].value = prop.value.slice(0);\n    return memo;\n  }, {});\n}\nfunction normalizePropDefs(props) {\n  if (!props) return {};\n  const propKeys = Object.keys(props);\n  return propKeys.reduce((memo, k) => {\n    const v = props[k];\n    memo[k] = !(isObject(v) && \"value\" in v) ? {\n      value: v\n    } : v;\n    memo[k].attribute || (memo[k].attribute = toAttribute(k));\n    memo[k].parse = \"parse\" in memo[k] ? memo[k].parse : typeof memo[k].value !== \"string\";\n    return memo;\n  }, {});\n}\nfunction propValues(props) {\n  const propKeys = Object.keys(props);\n  return propKeys.reduce((memo, k) => {\n    memo[k] = props[k].value;\n    return memo;\n  }, {});\n}\nfunction initializeProps(element, propDefinition) {\n  const props = cloneProps(propDefinition),\n    propKeys = Object.keys(propDefinition);\n  propKeys.forEach(key => {\n    const prop = props[key],\n      attr = element.getAttribute(prop.attribute),\n      value = element[key];\n    if (attr != null) prop.value = prop.parse ? parseAttributeValue(attr) : attr;\n    if (value != null) prop.value = Array.isArray(value) ? value.slice(0) : value;\n    prop.reflect && reflect(element, prop.attribute, prop.value, !!prop.parse);\n    Object.defineProperty(element, key, {\n      get() {\n        return prop.value;\n      },\n      set(val) {\n        const oldValue = prop.value;\n        prop.value = val;\n        prop.reflect && reflect(this, prop.attribute, prop.value, !!prop.parse);\n        for (let i = 0, l = this.__propertyChangedCallbacks.length; i < l; i++) {\n          this.__propertyChangedCallbacks[i](key, val, oldValue);\n        }\n      },\n      enumerable: true,\n      configurable: true\n    });\n  });\n  return props;\n}\nfunction parseAttributeValue(value) {\n  if (!value) return;\n  try {\n    return JSON.parse(value);\n  } catch (err) {\n    return value;\n  }\n}\nfunction reflect(node, attribute, value, parse) {\n  if (value == null || value === false) return node.removeAttribute(attribute);\n  let reflect = parse ? JSON.stringify(value) : value;\n  node.__updating[attribute] = true;\n  if (reflect === \"true\") reflect = \"\";\n  node.setAttribute(attribute, reflect);\n  Promise.resolve().then(() => delete node.__updating[attribute]);\n}\nfunction toAttribute(propName) {\n  return propName.replace(/\\.?([A-Z]+)/g, (x, y) => \"-\" + y.toLowerCase()).replace(\"_\", \"-\").replace(/^-/, \"\");\n}\nfunction toProperty(attr) {\n  return attr.toLowerCase().replace(/(-)([a-z])/g, test => test.toUpperCase().replace(\"-\", \"\"));\n}\nfunction isObject(obj) {\n  return obj != null && (typeof obj === \"object\" || typeof obj === \"function\");\n}\nfunction isFunction(val) {\n  return Object.prototype.toString.call(val) === \"[object Function]\";\n}\nfunction isConstructor(f) {\n  return typeof f === \"function\" && f.toString().indexOf(\"class\") === 0;\n}\nfunction reloadElement(node) {\n  let callback = null;\n  while (callback = node.__releaseCallbacks.pop()) callback(node);\n  delete node.__initialized;\n  node.renderRoot.textContent = \"\";\n  node.connectedCallback();\n}\n\nlet currentElement;\nfunction getCurrentElement() {\n  return currentElement;\n}\nfunction noShadowDOM() {\n  Object.defineProperty(currentElement, \"renderRoot\", {\n    value: currentElement\n  });\n}\nfunction createElementType(BaseElement, propDefinition) {\n  const propKeys = Object.keys(propDefinition);\n  return class CustomElement extends BaseElement {\n    static get observedAttributes() {\n      return propKeys.map(k => propDefinition[k].attribute);\n    }\n    constructor() {\n      super();\n      this.__initialized = false;\n      this.__released = false;\n      this.__releaseCallbacks = [];\n      this.__propertyChangedCallbacks = [];\n      this.__updating = {};\n      this.props = {};\n    }\n    connectedCallback() {\n      if (this.__initialized) return;\n      this.__releaseCallbacks = [];\n      this.__propertyChangedCallbacks = [];\n      this.__updating = {};\n      this.props = initializeProps(this, propDefinition);\n      const props = propValues(this.props),\n        ComponentType = this.Component,\n        outerElement = currentElement;\n      try {\n        currentElement = this;\n        this.__initialized = true;\n        if (isConstructor(ComponentType)) new ComponentType(props, {\n          element: this\n        });else ComponentType(props, {\n          element: this\n        });\n      } finally {\n        currentElement = outerElement;\n      }\n    }\n    async disconnectedCallback() {\n      // prevent premature releasing when element is only temporarely removed from DOM\n      await Promise.resolve();\n      if (this.isConnected) return;\n      this.__propertyChangedCallbacks.length = 0;\n      let callback = null;\n      while (callback = this.__releaseCallbacks.pop()) callback(this);\n      delete this.__initialized;\n      this.__released = true;\n    }\n    attributeChangedCallback(name, oldVal, newVal) {\n      if (!this.__initialized) return;\n      if (this.__updating[name]) return;\n      name = this.lookupProp(name);\n      if (name in propDefinition) {\n        if (newVal == null && !this[name]) return;\n        this[name] = propDefinition[name].parse ? parseAttributeValue(newVal) : newVal;\n      }\n    }\n    lookupProp(attrName) {\n      if (!propDefinition) return;\n      return propKeys.find(k => attrName === k || attrName === propDefinition[k].attribute);\n    }\n    get renderRoot() {\n      return this.shadowRoot || this.attachShadow({\n        mode: \"open\"\n      });\n    }\n    addReleaseCallback(fn) {\n      this.__releaseCallbacks.push(fn);\n    }\n    addPropertyChangedCallback(fn) {\n      this.__propertyChangedCallbacks.push(fn);\n    }\n  };\n}\n\nfunction createMixin(mixinFn) {\n  return ComponentType => (props, options) => {\n    options = mixinFn(options);\n    if (isConstructor(ComponentType)) return new ComponentType(props, options);\n    return ComponentType(props, options);\n  };\n}\nfunction compose(...fns) {\n  if (fns.length === 0) return i => i;\n  if (fns.length === 1) return fns[0];\n  return fns.reduce((a, b) => (...args) => a(b(...args)));\n}\n\nconst EC = Symbol('element-context');\nfunction lookupContext(element, context) {\n  return element[EC] && element[EC][context.id] || (element.host || element.parentNode) && lookupContext(element.host || element.parentNode, context);\n}\nfunction createContext(initFn) {\n  return {\n    id: Symbol('context'),\n    initFn\n  };\n}\n\n// Direct\nfunction provide(context, value, element = getCurrentElement()) {\n  element[EC] || (element[EC] = {});\n  return element[EC][context.id] = context.initFn ? context.initFn(value) : value;\n}\nfunction consume(context, element = getCurrentElement()) {\n  return lookupContext(element, context);\n}\n\n// HOCs\nfunction withProvider(context, value) {\n  return createMixin(options => {\n    const {\n      element\n    } = options;\n    provide(context, value, element);\n    return options;\n  });\n}\nfunction withConsumer(context, key) {\n  return createMixin(options => {\n    const {\n      element\n    } = options;\n    options = Object.assign({}, options, {\n      [key]: lookupContext(element, context)\n    });\n    return options;\n  });\n}\n\nfunction walk(root, call) {\n  call(root);\n  if (root.shadowRoot) walk(root.shadowRoot, call);\n  let child = root.firstChild;\n  while (child) {\n    child.nodeType === 1 && walk(child, call);\n    child = child.nextSibling;\n  }\n}\nfunction hot(module, tagName) {\n  if (module.hot) {\n    function update(possibleError) {\n      if (possibleError && possibleError instanceof Error) {\n        console.error(possibleError);\n        return;\n      }\n      walk(document.body, node => node.localName === tagName && setTimeout(() => reloadElement(node), 0));\n    }\n\n    // handle both Parcel and Webpack style\n    module.hot.accept(update);\n    if (module.hot.status && module.hot.status() === 'apply') {\n      update();\n    }\n  }\n}\n\nfunction register(tag, props = {}, options = {}) {\n  const {\n    BaseElement = HTMLElement,\n    extension,\n    customElements = window.customElements\n  } = options;\n  return ComponentType => {\n    if (!tag) throw new Error(\"tag is required to register a Component\");\n    let ElementType = customElements.get(tag);\n    if (ElementType) {\n      // Consider disabling this in a production mode\n      ElementType.prototype.Component = ComponentType;\n      return ElementType;\n    }\n    ElementType = createElementType(BaseElement, normalizePropDefs(props));\n    ElementType.prototype.Component = ComponentType;\n    ElementType.prototype.registeredTag = tag;\n    customElements.define(tag, ElementType, extension);\n    return ElementType;\n  };\n}\n\nexport { compose, consume, createContext, createMixin, getCurrentElement, hot, isConstructor, isFunction, isObject, noShadowDOM, provide, register, reloadElement, toAttribute, toProperty, withConsumer, withProvider };\n","import { register } from \"component-register\";\nexport { hot, getCurrentElement, noShadowDOM } from \"component-register\";\nimport { createRoot, createSignal } from \"solid-js\";\nimport { insert } from \"solid-js/web\";\nfunction createProps(raw) {\n  const keys = Object.keys(raw);\n  const props = {};\n  for (let i = 0; i < keys.length; i++) {\n    const [get, set] = createSignal(raw[keys[i]]);\n    Object.defineProperty(props, keys[i], {\n      get,\n      set(v) {\n        set(() => v);\n      }\n    });\n  }\n  return props;\n}\nfunction lookupContext(el) {\n  if (el.assignedSlot && el.assignedSlot._$owner) return el.assignedSlot._$owner;\n  let next = el.parentNode;\n  while (next && !next._$owner && !(next.assignedSlot && next.assignedSlot._$owner))\n    next = next.parentNode;\n  return next && next.assignedSlot ? next.assignedSlot._$owner : el._$owner;\n}\nfunction withSolid(ComponentType) {\n  return (rawProps, options) => {\n    const { element } = options;\n    return createRoot(dispose => {\n      const props = createProps(rawProps);\n      element.addPropertyChangedCallback((key, val) => (props[key] = val));\n      element.addReleaseCallback(() => {\n        element.renderRoot.textContent = \"\";\n        dispose();\n      });\n      const comp = ComponentType(props, options);\n      return insert(element.renderRoot, comp);\n    }, lookupContext(element));\n  };\n}\nfunction customElement(tag, props, ComponentType) {\n  if (arguments.length === 2) {\n    ComponentType = props;\n    props = {};\n  }\n  return register(tag, props)(withSolid(ComponentType));\n}\nexport { withSolid, customElement };\n","/**\n * marked v15.0.3 - a markdown parser\n * Copyright (c) 2011-2024, Christopher Jeffrey. (MIT Licensed)\n * https://github.com/markedjs/marked\n */\n\n/**\n * DO NOT EDIT THIS FILE\n * The code in this file is generated from files in ./src/\n */\n\n/**\n * Gets the original marked default options.\n */\nfunction _getDefaults() {\n    return {\n        async: false,\n        breaks: false,\n        extensions: null,\n        gfm: true,\n        hooks: null,\n        pedantic: false,\n        renderer: null,\n        silent: false,\n        tokenizer: null,\n        walkTokens: null,\n    };\n}\nlet _defaults = _getDefaults();\nfunction changeDefaults(newDefaults) {\n    _defaults = newDefaults;\n}\n\nconst noopTest = { exec: () => null };\nfunction edit(regex, opt = '') {\n    let source = typeof regex === 'string' ? regex : regex.source;\n    const obj = {\n        replace: (name, val) => {\n            let valSource = typeof val === 'string' ? val : val.source;\n            valSource = valSource.replace(other.caret, '$1');\n            source = source.replace(name, valSource);\n            return obj;\n        },\n        getRegex: () => {\n            return new RegExp(source, opt);\n        },\n    };\n    return obj;\n}\nconst other = {\n    codeRemoveIndent: /^(?: {1,4}| {0,3}\\t)/gm,\n    outputLinkReplace: /\\\\([\\[\\]])/g,\n    indentCodeCompensation: /^(\\s+)(?:```)/,\n    beginningSpace: /^\\s+/,\n    endingHash: /#$/,\n    startingSpaceChar: /^ /,\n    endingSpaceChar: / $/,\n    nonSpaceChar: /[^ ]/,\n    newLineCharGlobal: /\\n/g,\n    tabCharGlobal: /\\t/g,\n    multipleSpaceGlobal: /\\s+/g,\n    blankLine: /^[ \\t]*$/,\n    doubleBlankLine: /\\n[ \\t]*\\n[ \\t]*$/,\n    blockquoteStart: /^ {0,3}>/,\n    blockquoteSetextReplace: /\\n {0,3}((?:=+|-+) *)(?=\\n|$)/g,\n    blockquoteSetextReplace2: /^ {0,3}>[ \\t]?/gm,\n    listReplaceTabs: /^\\t+/,\n    listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g,\n    listIsTask: /^\\[[ xX]\\] /,\n    listReplaceTask: /^\\[[ xX]\\] +/,\n    anyLine: /\\n.*\\n/,\n    hrefBrackets: /^<(.*)>$/,\n    tableDelimiter: /[:|]/,\n    tableAlignChars: /^\\||\\| *$/g,\n    tableRowBlankLine: /\\n[ \\t]*$/,\n    tableAlignRight: /^ *-+: *$/,\n    tableAlignCenter: /^ *:-+: *$/,\n    tableAlignLeft: /^ *:-+ *$/,\n    startATag: /^<a /i,\n    endATag: /^<\\/a>/i,\n    startPreScriptTag: /^<(pre|code|kbd|script)(\\s|>)/i,\n    endPreScriptTag: /^<\\/(pre|code|kbd|script)(\\s|>)/i,\n    startAngleBracket: /^</,\n    endAngleBracket: />$/,\n    pedanticHrefTitle: /^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/,\n    unicodeAlphaNumeric: /[\\p{L}\\p{N}]/u,\n    escapeTest: /[&<>\"']/,\n    escapeReplace: /[&<>\"']/g,\n    escapeTestNoEncode: /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/,\n    escapeReplaceNoEncode: /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/g,\n    unescapeTest: /&(#(?:\\d+)|(?:#x[0-9A-Fa-f]+)|(?:\\w+));?/ig,\n    caret: /(^|[^\\[])\\^/g,\n    percentDecode: /%25/g,\n    findPipe: /\\|/g,\n    splitPipe: / \\|/,\n    slashPipe: /\\\\\\|/g,\n    carriageReturn: /\\r\\n|\\r/g,\n    spaceLine: /^ +$/gm,\n    notSpaceStart: /^\\S*/,\n    endingNewline: /\\n$/,\n    listItemRegex: (bull) => new RegExp(`^( {0,3}${bull})((?:[\\t ][^\\\\n]*)?(?:\\\\n|$))`),\n    nextBulletRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \\t][^\\\\n]*)?(?:\\\\n|$))`),\n    hrRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`),\n    fencesBeginRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:\\`\\`\\`|~~~)`),\n    headingBeginRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}#`),\n    htmlBeginRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}<(?:[a-z].*>|!--)`, 'i'),\n};\n/**\n * Block-Level Grammar\n */\nconst newline = /^(?:[ \\t]*(?:\\n|$))+/;\nconst blockCode = /^((?: {4}| {0,3}\\t)[^\\n]+(?:\\n(?:[ \\t]*(?:\\n|$))*)?)+/;\nconst fences = /^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/;\nconst hr = /^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/;\nconst heading = /^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/;\nconst bullet = /(?:[*+-]|\\d{1,9}[.)])/;\nconst lheading = edit(/^(?!bull |blockCode|fences|blockquote|heading|html)((?:.|\\n(?!\\s*?\\n|bull |blockCode|fences|blockquote|heading|html))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/)\n    .replace(/bull/g, bullet) // lists can interrupt\n    .replace(/blockCode/g, /(?: {4}| {0,3}\\t)/) // indented code blocks can interrupt\n    .replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/) // fenced code blocks can interrupt\n    .replace(/blockquote/g, / {0,3}>/) // blockquote can interrupt\n    .replace(/heading/g, / {0,3}#{1,6}/) // ATX heading can interrupt\n    .replace(/html/g, / {0,3}<[^\\n>]+>\\n/) // block html can interrupt\n    .getRegex();\nconst _paragraph = /^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\\n)[^\\n]+)*)/;\nconst blockText = /^[^\\n]+/;\nconst _blockLabel = /(?!\\s*\\])(?:\\\\.|[^\\[\\]\\\\])+/;\nconst def = edit(/^ {0,3}\\[(label)\\]: *(?:\\n[ \\t]*)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n[ \\t]*)?| *\\n[ \\t]*)(title))? *(?:\\n+|$)/)\n    .replace('label', _blockLabel)\n    .replace('title', /(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/)\n    .getRegex();\nconst list = edit(/^( {0,3}bull)([ \\t][^\\n]+?)?(?:\\n|$)/)\n    .replace(/bull/g, bullet)\n    .getRegex();\nconst _tag = 'address|article|aside|base|basefont|blockquote|body|caption'\n    + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'\n    + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'\n    + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'\n    + '|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title'\n    + '|tr|track|ul';\nconst _comment = /<!--(?:-?>|[\\s\\S]*?(?:-->|$))/;\nconst html = edit('^ {0,3}(?:' // optional indentation\n    + '<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n+|$)' // (1)\n    + '|comment[^\\\\n]*(\\\\n+|$)' // (2)\n    + '|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>\\\\n*|$)' // (3)\n    + '|<![A-Z][\\\\s\\\\S]*?(?:>\\\\n*|$)' // (4)\n    + '|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>\\\\n*|$)' // (5)\n    + '|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n[ \\t]*)+\\\\n|$)' // (6)\n    + '|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \\t]*)+\\\\n|$)' // (7) open tag\n    + '|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \\t]*)+\\\\n|$)' // (7) closing tag\n    + ')', 'i')\n    .replace('comment', _comment)\n    .replace('tag', _tag)\n    .replace('attribute', / +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/)\n    .getRegex();\nconst paragraph = edit(_paragraph)\n    .replace('hr', hr)\n    .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n    .replace('|lheading', '') // setext headings don't interrupt commonmark paragraphs\n    .replace('|table', '')\n    .replace('blockquote', ' {0,3}>')\n    .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n    .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n    .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n    .replace('tag', _tag) // pars can be interrupted by type (6) html blocks\n    .getRegex();\nconst blockquote = edit(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/)\n    .replace('paragraph', paragraph)\n    .getRegex();\n/**\n * Normal Block Grammar\n */\nconst blockNormal = {\n    blockquote,\n    code: blockCode,\n    def,\n    fences,\n    heading,\n    hr,\n    html,\n    lheading,\n    list,\n    newline,\n    paragraph,\n    table: noopTest,\n    text: blockText,\n};\n/**\n * GFM Block Grammar\n */\nconst gfmTable = edit('^ *([^\\\\n ].*)\\\\n' // Header\n    + ' {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)' // Align\n    + '(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)') // Cells\n    .replace('hr', hr)\n    .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n    .replace('blockquote', ' {0,3}>')\n    .replace('code', '(?: {4}| {0,3}\\t)[^\\\\n]')\n    .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n    .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n    .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n    .replace('tag', _tag) // tables can be interrupted by type (6) html blocks\n    .getRegex();\nconst blockGfm = {\n    ...blockNormal,\n    table: gfmTable,\n    paragraph: edit(_paragraph)\n        .replace('hr', hr)\n        .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n        .replace('|lheading', '') // setext headings don't interrupt commonmark paragraphs\n        .replace('table', gfmTable) // interrupt paragraphs with table\n        .replace('blockquote', ' {0,3}>')\n        .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n        .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n        .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n        .replace('tag', _tag) // pars can be interrupted by type (6) html blocks\n        .getRegex(),\n};\n/**\n * Pedantic grammar (original John Gruber's loose markdown specification)\n */\nconst blockPedantic = {\n    ...blockNormal,\n    html: edit('^ *(?:comment *(?:\\\\n|\\\\s*$)'\n        + '|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)' // closed tag\n        + '|<tag(?:\"[^\"]*\"|\\'[^\\']*\\'|\\\\s[^\\'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))')\n        .replace('comment', _comment)\n        .replace(/tag/g, '(?!(?:'\n        + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'\n        + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'\n        + '\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b')\n        .getRegex(),\n    def: /^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,\n    heading: /^(#{1,6})(.*)(?:\\n+|$)/,\n    fences: noopTest, // fences not supported\n    lheading: /^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n    paragraph: edit(_paragraph)\n        .replace('hr', hr)\n        .replace('heading', ' *#{1,6} *[^\\n]')\n        .replace('lheading', lheading)\n        .replace('|table', '')\n        .replace('blockquote', ' {0,3}>')\n        .replace('|fences', '')\n        .replace('|list', '')\n        .replace('|html', '')\n        .replace('|tag', '')\n        .getRegex(),\n};\n/**\n * Inline-Level Grammar\n */\nconst escape$1 = /^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/;\nconst inlineCode = /^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/;\nconst br = /^( {2,}|\\\\)\\n(?!\\s*$)/;\nconst inlineText = /^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/;\n// list of unicode punctuation marks, plus any missing characters from CommonMark spec\nconst _punctuation = /[\\p{P}\\p{S}]/u;\nconst _punctuationOrSpace = /[\\s\\p{P}\\p{S}]/u;\nconst _notPunctuationOrSpace = /[^\\s\\p{P}\\p{S}]/u;\nconst punctuation = edit(/^((?![*_])punctSpace)/, 'u')\n    .replace(/punctSpace/g, _punctuationOrSpace).getRegex();\n// sequences em should skip over [title](link), `code`, <html>\nconst blockSkip = /\\[[^[\\]]*?\\]\\((?:\\\\.|[^\\\\\\(\\)]|\\((?:\\\\.|[^\\\\\\(\\)])*\\))*\\)|`[^`]*?`|<[^<>]*?>/g;\nconst emStrongLDelim = edit(/^(?:\\*+(?:((?!\\*)punct)|[^\\s*]))|^_+(?:((?!_)punct)|([^\\s_]))/, 'u')\n    .replace(/punct/g, _punctuation)\n    .getRegex();\nconst emStrongRDelimAst = edit('^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)' // Skip orphan inside strong\n    + '|[^*]+(?=[^*])' // Consume to delim\n    + '|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)' // (1) #*** can only be a Right Delimiter\n    + '|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)' // (2) a***#, a*** can only be a Right Delimiter\n    + '|(?!\\\\*)punctSpace(\\\\*+)(?=notPunctSpace)' // (3) #***a, ***a can only be Left Delimiter\n    + '|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)' // (4) ***# can only be Left Delimiter\n    + '|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)' // (5) #***# can be either Left or Right Delimiter\n    + '|notPunctSpace(\\\\*+)(?=notPunctSpace)', 'gu') // (6) a***a can be either Left or Right Delimiter\n    .replace(/notPunctSpace/g, _notPunctuationOrSpace)\n    .replace(/punctSpace/g, _punctuationOrSpace)\n    .replace(/punct/g, _punctuation)\n    .getRegex();\n// (6) Not allowed for _\nconst emStrongRDelimUnd = edit('^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)' // Skip orphan inside strong\n    + '|[^_]+(?=[^_])' // Consume to delim\n    + '|(?!_)punct(_+)(?=[\\\\s]|$)' // (1) #___ can only be a Right Delimiter\n    + '|notPunctSpace(_+)(?!_)(?=punctSpace|$)' // (2) a___#, a___ can only be a Right Delimiter\n    + '|(?!_)punctSpace(_+)(?=notPunctSpace)' // (3) #___a, ___a can only be Left Delimiter\n    + '|[\\\\s](_+)(?!_)(?=punct)' // (4) ___# can only be Left Delimiter\n    + '|(?!_)punct(_+)(?!_)(?=punct)', 'gu') // (5) #___# can be either Left or Right Delimiter\n    .replace(/notPunctSpace/g, _notPunctuationOrSpace)\n    .replace(/punctSpace/g, _punctuationOrSpace)\n    .replace(/punct/g, _punctuation)\n    .getRegex();\nconst anyPunctuation = edit(/\\\\(punct)/, 'gu')\n    .replace(/punct/g, _punctuation)\n    .getRegex();\nconst autolink = edit(/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/)\n    .replace('scheme', /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/)\n    .replace('email', /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/)\n    .getRegex();\nconst _inlineComment = edit(_comment).replace('(?:-->|$)', '-->').getRegex();\nconst tag = edit('^comment'\n    + '|^</[a-zA-Z][\\\\w:-]*\\\\s*>' // self-closing tag\n    + '|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>' // open tag\n    + '|^<\\\\?[\\\\s\\\\S]*?\\\\?>' // processing instruction, e.g. <?php ?>\n    + '|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>' // declaration, e.g. <!DOCTYPE html>\n    + '|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>') // CDATA section\n    .replace('comment', _inlineComment)\n    .replace('attribute', /\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/)\n    .getRegex();\nconst _inlineLabel = /(?:\\[(?:\\\\.|[^\\[\\]\\\\])*\\]|\\\\.|`[^`]*`|[^\\[\\]\\\\`])*?/;\nconst link = edit(/^!?\\[(label)\\]\\(\\s*(href)(?:\\s+(title))?\\s*\\)/)\n    .replace('label', _inlineLabel)\n    .replace('href', /<(?:\\\\.|[^\\n<>\\\\])+>|[^\\s\\x00-\\x1f]*/)\n    .replace('title', /\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/)\n    .getRegex();\nconst reflink = edit(/^!?\\[(label)\\]\\[(ref)\\]/)\n    .replace('label', _inlineLabel)\n    .replace('ref', _blockLabel)\n    .getRegex();\nconst nolink = edit(/^!?\\[(ref)\\](?:\\[\\])?/)\n    .replace('ref', _blockLabel)\n    .getRegex();\nconst reflinkSearch = edit('reflink|nolink(?!\\\\()', 'g')\n    .replace('reflink', reflink)\n    .replace('nolink', nolink)\n    .getRegex();\n/**\n * Normal Inline Grammar\n */\nconst inlineNormal = {\n    _backpedal: noopTest, // only used for GFM url\n    anyPunctuation,\n    autolink,\n    blockSkip,\n    br,\n    code: inlineCode,\n    del: noopTest,\n    emStrongLDelim,\n    emStrongRDelimAst,\n    emStrongRDelimUnd,\n    escape: escape$1,\n    link,\n    nolink,\n    punctuation,\n    reflink,\n    reflinkSearch,\n    tag,\n    text: inlineText,\n    url: noopTest,\n};\n/**\n * Pedantic Inline Grammar\n */\nconst inlinePedantic = {\n    ...inlineNormal,\n    link: edit(/^!?\\[(label)\\]\\((.*?)\\)/)\n        .replace('label', _inlineLabel)\n        .getRegex(),\n    reflink: edit(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/)\n        .replace('label', _inlineLabel)\n        .getRegex(),\n};\n/**\n * GFM Inline Grammar\n */\nconst inlineGfm = {\n    ...inlineNormal,\n    escape: edit(escape$1).replace('])', '~|])').getRegex(),\n    url: edit(/^((?:ftp|https?):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/, 'i')\n        .replace('email', /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/)\n        .getRegex(),\n    _backpedal: /(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,\n    del: /^(~~?)(?=[^\\s~])((?:\\\\.|[^\\\\])*?(?:\\\\.|[^\\s~\\\\]))\\1(?=[^~]|$)/,\n    text: /^([`~]+|[^`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|https?:\\/\\/|ftp:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)))/,\n};\n/**\n * GFM + Line Breaks Inline Grammar\n */\nconst inlineBreaks = {\n    ...inlineGfm,\n    br: edit(br).replace('{2,}', '*').getRegex(),\n    text: edit(inlineGfm.text)\n        .replace('\\\\b_', '\\\\b_| {2,}\\\\n')\n        .replace(/\\{2,\\}/g, '*')\n        .getRegex(),\n};\n/**\n * exports\n */\nconst block = {\n    normal: blockNormal,\n    gfm: blockGfm,\n    pedantic: blockPedantic,\n};\nconst inline = {\n    normal: inlineNormal,\n    gfm: inlineGfm,\n    breaks: inlineBreaks,\n    pedantic: inlinePedantic,\n};\n\n/**\n * Helpers\n */\nconst escapeReplacements = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#39;',\n};\nconst getEscapeReplacement = (ch) => escapeReplacements[ch];\nfunction escape(html, encode) {\n    if (encode) {\n        if (other.escapeTest.test(html)) {\n            return html.replace(other.escapeReplace, getEscapeReplacement);\n        }\n    }\n    else {\n        if (other.escapeTestNoEncode.test(html)) {\n            return html.replace(other.escapeReplaceNoEncode, getEscapeReplacement);\n        }\n    }\n    return html;\n}\nfunction cleanUrl(href) {\n    try {\n        href = encodeURI(href).replace(other.percentDecode, '%');\n    }\n    catch {\n        return null;\n    }\n    return href;\n}\nfunction splitCells(tableRow, count) {\n    // ensure that every cell-delimiting pipe has a space\n    // before it to distinguish it from an escaped pipe\n    const row = tableRow.replace(other.findPipe, (match, offset, str) => {\n        let escaped = false;\n        let curr = offset;\n        while (--curr >= 0 && str[curr] === '\\\\')\n            escaped = !escaped;\n        if (escaped) {\n            // odd number of slashes means | is escaped\n            // so we leave it alone\n            return '|';\n        }\n        else {\n            // add space before unescaped |\n            return ' |';\n        }\n    }), cells = row.split(other.splitPipe);\n    let i = 0;\n    // First/last cell in a row cannot be empty if it has no leading/trailing pipe\n    if (!cells[0].trim()) {\n        cells.shift();\n    }\n    if (cells.length > 0 && !cells.at(-1)?.trim()) {\n        cells.pop();\n    }\n    if (count) {\n        if (cells.length > count) {\n            cells.splice(count);\n        }\n        else {\n            while (cells.length < count)\n                cells.push('');\n        }\n    }\n    for (; i < cells.length; i++) {\n        // leading or trailing whitespace is ignored per the gfm spec\n        cells[i] = cells[i].trim().replace(other.slashPipe, '|');\n    }\n    return cells;\n}\n/**\n * Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').\n * /c*$/ is vulnerable to REDOS.\n *\n * @param str\n * @param c\n * @param invert Remove suffix of non-c chars instead. Default falsey.\n */\nfunction rtrim(str, c, invert) {\n    const l = str.length;\n    if (l === 0) {\n        return '';\n    }\n    // Length of suffix matching the invert condition.\n    let suffLen = 0;\n    // Step left until we fail to match the invert condition.\n    while (suffLen < l) {\n        const currChar = str.charAt(l - suffLen - 1);\n        if (currChar === c && !invert) {\n            suffLen++;\n        }\n        else if (currChar !== c && invert) {\n            suffLen++;\n        }\n        else {\n            break;\n        }\n    }\n    return str.slice(0, l - suffLen);\n}\nfunction findClosingBracket(str, b) {\n    if (str.indexOf(b[1]) === -1) {\n        return -1;\n    }\n    let level = 0;\n    for (let i = 0; i < str.length; i++) {\n        if (str[i] === '\\\\') {\n            i++;\n        }\n        else if (str[i] === b[0]) {\n            level++;\n        }\n        else if (str[i] === b[1]) {\n            level--;\n            if (level < 0) {\n                return i;\n            }\n        }\n    }\n    return -1;\n}\n\nfunction outputLink(cap, link, raw, lexer, rules) {\n    const href = link.href;\n    const title = link.title || null;\n    const text = cap[1].replace(rules.other.outputLinkReplace, '$1');\n    if (cap[0].charAt(0) !== '!') {\n        lexer.state.inLink = true;\n        const token = {\n            type: 'link',\n            raw,\n            href,\n            title,\n            text,\n            tokens: lexer.inlineTokens(text),\n        };\n        lexer.state.inLink = false;\n        return token;\n    }\n    return {\n        type: 'image',\n        raw,\n        href,\n        title,\n        text,\n    };\n}\nfunction indentCodeCompensation(raw, text, rules) {\n    const matchIndentToCode = raw.match(rules.other.indentCodeCompensation);\n    if (matchIndentToCode === null) {\n        return text;\n    }\n    const indentToCode = matchIndentToCode[1];\n    return text\n        .split('\\n')\n        .map(node => {\n        const matchIndentInNode = node.match(rules.other.beginningSpace);\n        if (matchIndentInNode === null) {\n            return node;\n        }\n        const [indentInNode] = matchIndentInNode;\n        if (indentInNode.length >= indentToCode.length) {\n            return node.slice(indentToCode.length);\n        }\n        return node;\n    })\n        .join('\\n');\n}\n/**\n * Tokenizer\n */\nclass _Tokenizer {\n    options;\n    rules; // set by the lexer\n    lexer; // set by the lexer\n    constructor(options) {\n        this.options = options || _defaults;\n    }\n    space(src) {\n        const cap = this.rules.block.newline.exec(src);\n        if (cap && cap[0].length > 0) {\n            return {\n                type: 'space',\n                raw: cap[0],\n            };\n        }\n    }\n    code(src) {\n        const cap = this.rules.block.code.exec(src);\n        if (cap) {\n            const text = cap[0].replace(this.rules.other.codeRemoveIndent, '');\n            return {\n                type: 'code',\n                raw: cap[0],\n                codeBlockStyle: 'indented',\n                text: !this.options.pedantic\n                    ? rtrim(text, '\\n')\n                    : text,\n            };\n        }\n    }\n    fences(src) {\n        const cap = this.rules.block.fences.exec(src);\n        if (cap) {\n            const raw = cap[0];\n            const text = indentCodeCompensation(raw, cap[3] || '', this.rules);\n            return {\n                type: 'code',\n                raw,\n                lang: cap[2] ? cap[2].trim().replace(this.rules.inline.anyPunctuation, '$1') : cap[2],\n                text,\n            };\n        }\n    }\n    heading(src) {\n        const cap = this.rules.block.heading.exec(src);\n        if (cap) {\n            let text = cap[2].trim();\n            // remove trailing #s\n            if (this.rules.other.endingHash.test(text)) {\n                const trimmed = rtrim(text, '#');\n                if (this.options.pedantic) {\n                    text = trimmed.trim();\n                }\n                else if (!trimmed || this.rules.other.endingSpaceChar.test(trimmed)) {\n                    // CommonMark requires space before trailing #s\n                    text = trimmed.trim();\n                }\n            }\n            return {\n                type: 'heading',\n                raw: cap[0],\n                depth: cap[1].length,\n                text,\n                tokens: this.lexer.inline(text),\n            };\n        }\n    }\n    hr(src) {\n        const cap = this.rules.block.hr.exec(src);\n        if (cap) {\n            return {\n                type: 'hr',\n                raw: rtrim(cap[0], '\\n'),\n            };\n        }\n    }\n    blockquote(src) {\n        const cap = this.rules.block.blockquote.exec(src);\n        if (cap) {\n            let lines = rtrim(cap[0], '\\n').split('\\n');\n            let raw = '';\n            let text = '';\n            const tokens = [];\n            while (lines.length > 0) {\n                let inBlockquote = false;\n                const currentLines = [];\n                let i;\n                for (i = 0; i < lines.length; i++) {\n                    // get lines up to a continuation\n                    if (this.rules.other.blockquoteStart.test(lines[i])) {\n                        currentLines.push(lines[i]);\n                        inBlockquote = true;\n                    }\n                    else if (!inBlockquote) {\n                        currentLines.push(lines[i]);\n                    }\n                    else {\n                        break;\n                    }\n                }\n                lines = lines.slice(i);\n                const currentRaw = currentLines.join('\\n');\n                const currentText = currentRaw\n                    // precede setext continuation with 4 spaces so it isn't a setext\n                    .replace(this.rules.other.blockquoteSetextReplace, '\\n    $1')\n                    .replace(this.rules.other.blockquoteSetextReplace2, '');\n                raw = raw ? `${raw}\\n${currentRaw}` : currentRaw;\n                text = text ? `${text}\\n${currentText}` : currentText;\n                // parse blockquote lines as top level tokens\n                // merge paragraphs if this is a continuation\n                const top = this.lexer.state.top;\n                this.lexer.state.top = true;\n                this.lexer.blockTokens(currentText, tokens, true);\n                this.lexer.state.top = top;\n                // if there is no continuation then we are done\n                if (lines.length === 0) {\n                    break;\n                }\n                const lastToken = tokens.at(-1);\n                if (lastToken?.type === 'code') {\n                    // blockquote continuation cannot be preceded by a code block\n                    break;\n                }\n                else if (lastToken?.type === 'blockquote') {\n                    // include continuation in nested blockquote\n                    const oldToken = lastToken;\n                    const newText = oldToken.raw + '\\n' + lines.join('\\n');\n                    const newToken = this.blockquote(newText);\n                    tokens[tokens.length - 1] = newToken;\n                    raw = raw.substring(0, raw.length - oldToken.raw.length) + newToken.raw;\n                    text = text.substring(0, text.length - oldToken.text.length) + newToken.text;\n                    break;\n                }\n                else if (lastToken?.type === 'list') {\n                    // include continuation in nested list\n                    const oldToken = lastToken;\n                    const newText = oldToken.raw + '\\n' + lines.join('\\n');\n                    const newToken = this.list(newText);\n                    tokens[tokens.length - 1] = newToken;\n                    raw = raw.substring(0, raw.length - lastToken.raw.length) + newToken.raw;\n                    text = text.substring(0, text.length - oldToken.raw.length) + newToken.raw;\n                    lines = newText.substring(tokens.at(-1).raw.length).split('\\n');\n                    continue;\n                }\n            }\n            return {\n                type: 'blockquote',\n                raw,\n                tokens,\n                text,\n            };\n        }\n    }\n    list(src) {\n        let cap = this.rules.block.list.exec(src);\n        if (cap) {\n            let bull = cap[1].trim();\n            const isordered = bull.length > 1;\n            const list = {\n                type: 'list',\n                raw: '',\n                ordered: isordered,\n                start: isordered ? +bull.slice(0, -1) : '',\n                loose: false,\n                items: [],\n            };\n            bull = isordered ? `\\\\d{1,9}\\\\${bull.slice(-1)}` : `\\\\${bull}`;\n            if (this.options.pedantic) {\n                bull = isordered ? bull : '[*+-]';\n            }\n            // Get next list item\n            const itemRegex = this.rules.other.listItemRegex(bull);\n            let endsWithBlankLine = false;\n            // Check if current bullet point can start a new List Item\n            while (src) {\n                let endEarly = false;\n                let raw = '';\n                let itemContents = '';\n                if (!(cap = itemRegex.exec(src))) {\n                    break;\n                }\n                if (this.rules.block.hr.test(src)) { // End list if bullet was actually HR (possibly move into itemRegex?)\n                    break;\n                }\n                raw = cap[0];\n                src = src.substring(raw.length);\n                let line = cap[2].split('\\n', 1)[0].replace(this.rules.other.listReplaceTabs, (t) => ' '.repeat(3 * t.length));\n                let nextLine = src.split('\\n', 1)[0];\n                let blankLine = !line.trim();\n                let indent = 0;\n                if (this.options.pedantic) {\n                    indent = 2;\n                    itemContents = line.trimStart();\n                }\n                else if (blankLine) {\n                    indent = cap[1].length + 1;\n                }\n                else {\n                    indent = cap[2].search(this.rules.other.nonSpaceChar); // Find first non-space char\n                    indent = indent > 4 ? 1 : indent; // Treat indented code blocks (> 4 spaces) as having only 1 indent\n                    itemContents = line.slice(indent);\n                    indent += cap[1].length;\n                }\n                if (blankLine && this.rules.other.blankLine.test(nextLine)) { // Items begin with at most one blank line\n                    raw += nextLine + '\\n';\n                    src = src.substring(nextLine.length + 1);\n                    endEarly = true;\n                }\n                if (!endEarly) {\n                    const nextBulletRegex = this.rules.other.nextBulletRegex(indent);\n                    const hrRegex = this.rules.other.hrRegex(indent);\n                    const fencesBeginRegex = this.rules.other.fencesBeginRegex(indent);\n                    const headingBeginRegex = this.rules.other.headingBeginRegex(indent);\n                    const htmlBeginRegex = this.rules.other.htmlBeginRegex(indent);\n                    // Check if following lines should be included in List Item\n                    while (src) {\n                        const rawLine = src.split('\\n', 1)[0];\n                        let nextLineWithoutTabs;\n                        nextLine = rawLine;\n                        // Re-align to follow commonmark nesting rules\n                        if (this.options.pedantic) {\n                            nextLine = nextLine.replace(this.rules.other.listReplaceNesting, '  ');\n                            nextLineWithoutTabs = nextLine;\n                        }\n                        else {\n                            nextLineWithoutTabs = nextLine.replace(this.rules.other.tabCharGlobal, '    ');\n                        }\n                        // End list item if found code fences\n                        if (fencesBeginRegex.test(nextLine)) {\n                            break;\n                        }\n                        // End list item if found start of new heading\n                        if (headingBeginRegex.test(nextLine)) {\n                            break;\n                        }\n                        // End list item if found start of html block\n                        if (htmlBeginRegex.test(nextLine)) {\n                            break;\n                        }\n                        // End list item if found start of new bullet\n                        if (nextBulletRegex.test(nextLine)) {\n                            break;\n                        }\n                        // Horizontal rule found\n                        if (hrRegex.test(nextLine)) {\n                            break;\n                        }\n                        if (nextLineWithoutTabs.search(this.rules.other.nonSpaceChar) >= indent || !nextLine.trim()) { // Dedent if possible\n                            itemContents += '\\n' + nextLineWithoutTabs.slice(indent);\n                        }\n                        else {\n                            // not enough indentation\n                            if (blankLine) {\n                                break;\n                            }\n                            // paragraph continuation unless last line was a different block level element\n                            if (line.replace(this.rules.other.tabCharGlobal, '    ').search(this.rules.other.nonSpaceChar) >= 4) { // indented code block\n                                break;\n                            }\n                            if (fencesBeginRegex.test(line)) {\n                                break;\n                            }\n                            if (headingBeginRegex.test(line)) {\n                                break;\n                            }\n                            if (hrRegex.test(line)) {\n                                break;\n                            }\n                            itemContents += '\\n' + nextLine;\n                        }\n                        if (!blankLine && !nextLine.trim()) { // Check if current line is blank\n                            blankLine = true;\n                        }\n                        raw += rawLine + '\\n';\n                        src = src.substring(rawLine.length + 1);\n                        line = nextLineWithoutTabs.slice(indent);\n                    }\n                }\n                if (!list.loose) {\n                    // If the previous item ended with a blank line, the list is loose\n                    if (endsWithBlankLine) {\n                        list.loose = true;\n                    }\n                    else if (this.rules.other.doubleBlankLine.test(raw)) {\n                        endsWithBlankLine = true;\n                    }\n                }\n                let istask = null;\n                let ischecked;\n                // Check for task list items\n                if (this.options.gfm) {\n                    istask = this.rules.other.listIsTask.exec(itemContents);\n                    if (istask) {\n                        ischecked = istask[0] !== '[ ] ';\n                        itemContents = itemContents.replace(this.rules.other.listReplaceTask, '');\n                    }\n                }\n                list.items.push({\n                    type: 'list_item',\n                    raw,\n                    task: !!istask,\n                    checked: ischecked,\n                    loose: false,\n                    text: itemContents,\n                    tokens: [],\n                });\n                list.raw += raw;\n            }\n            // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic\n            const lastItem = list.items.at(-1);\n            if (lastItem) {\n                lastItem.raw = lastItem.raw.trimEnd();\n                lastItem.text = lastItem.text.trimEnd();\n            }\n            list.raw = list.raw.trimEnd();\n            // Item child tokens handled here at end because we needed to have the final item to trim it first\n            for (let i = 0; i < list.items.length; i++) {\n                this.lexer.state.top = false;\n                list.items[i].tokens = this.lexer.blockTokens(list.items[i].text, []);\n                if (!list.loose) {\n                    // Check if list should be loose\n                    const spacers = list.items[i].tokens.filter(t => t.type === 'space');\n                    const hasMultipleLineBreaks = spacers.length > 0 && spacers.some(t => this.rules.other.anyLine.test(t.raw));\n                    list.loose = hasMultipleLineBreaks;\n                }\n            }\n            // Set all items to loose if list is loose\n            if (list.loose) {\n                for (let i = 0; i < list.items.length; i++) {\n                    list.items[i].loose = true;\n                }\n            }\n            return list;\n        }\n    }\n    html(src) {\n        const cap = this.rules.block.html.exec(src);\n        if (cap) {\n            const token = {\n                type: 'html',\n                block: true,\n                raw: cap[0],\n                pre: cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style',\n                text: cap[0],\n            };\n            return token;\n        }\n    }\n    def(src) {\n        const cap = this.rules.block.def.exec(src);\n        if (cap) {\n            const tag = cap[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal, ' ');\n            const href = cap[2] ? cap[2].replace(this.rules.other.hrefBrackets, '$1').replace(this.rules.inline.anyPunctuation, '$1') : '';\n            const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline.anyPunctuation, '$1') : cap[3];\n            return {\n                type: 'def',\n                tag,\n                raw: cap[0],\n                href,\n                title,\n            };\n        }\n    }\n    table(src) {\n        const cap = this.rules.block.table.exec(src);\n        if (!cap) {\n            return;\n        }\n        if (!this.rules.other.tableDelimiter.test(cap[2])) {\n            // delimiter row must have a pipe (|) or colon (:) otherwise it is a setext heading\n            return;\n        }\n        const headers = splitCells(cap[1]);\n        const aligns = cap[2].replace(this.rules.other.tableAlignChars, '').split('|');\n        const rows = cap[3]?.trim() ? cap[3].replace(this.rules.other.tableRowBlankLine, '').split('\\n') : [];\n        const item = {\n            type: 'table',\n            raw: cap[0],\n            header: [],\n            align: [],\n            rows: [],\n        };\n        if (headers.length !== aligns.length) {\n            // header and align columns must be equal, rows can be different.\n            return;\n        }\n        for (const align of aligns) {\n            if (this.rules.other.tableAlignRight.test(align)) {\n                item.align.push('right');\n            }\n            else if (this.rules.other.tableAlignCenter.test(align)) {\n                item.align.push('center');\n            }\n            else if (this.rules.other.tableAlignLeft.test(align)) {\n                item.align.push('left');\n            }\n            else {\n                item.align.push(null);\n            }\n        }\n        for (let i = 0; i < headers.length; i++) {\n            item.header.push({\n                text: headers[i],\n                tokens: this.lexer.inline(headers[i]),\n                header: true,\n                align: item.align[i],\n            });\n        }\n        for (const row of rows) {\n            item.rows.push(splitCells(row, item.header.length).map((cell, i) => {\n                return {\n                    text: cell,\n                    tokens: this.lexer.inline(cell),\n                    header: false,\n                    align: item.align[i],\n                };\n            }));\n        }\n        return item;\n    }\n    lheading(src) {\n        const cap = this.rules.block.lheading.exec(src);\n        if (cap) {\n            return {\n                type: 'heading',\n                raw: cap[0],\n                depth: cap[2].charAt(0) === '=' ? 1 : 2,\n                text: cap[1],\n                tokens: this.lexer.inline(cap[1]),\n            };\n        }\n    }\n    paragraph(src) {\n        const cap = this.rules.block.paragraph.exec(src);\n        if (cap) {\n            const text = cap[1].charAt(cap[1].length - 1) === '\\n'\n                ? cap[1].slice(0, -1)\n                : cap[1];\n            return {\n                type: 'paragraph',\n                raw: cap[0],\n                text,\n                tokens: this.lexer.inline(text),\n            };\n        }\n    }\n    text(src) {\n        const cap = this.rules.block.text.exec(src);\n        if (cap) {\n            return {\n                type: 'text',\n                raw: cap[0],\n                text: cap[0],\n                tokens: this.lexer.inline(cap[0]),\n            };\n        }\n    }\n    escape(src) {\n        const cap = this.rules.inline.escape.exec(src);\n        if (cap) {\n            return {\n                type: 'escape',\n                raw: cap[0],\n                text: cap[1],\n            };\n        }\n    }\n    tag(src) {\n        const cap = this.rules.inline.tag.exec(src);\n        if (cap) {\n            if (!this.lexer.state.inLink && this.rules.other.startATag.test(cap[0])) {\n                this.lexer.state.inLink = true;\n            }\n            else if (this.lexer.state.inLink && this.rules.other.endATag.test(cap[0])) {\n                this.lexer.state.inLink = false;\n            }\n            if (!this.lexer.state.inRawBlock && this.rules.other.startPreScriptTag.test(cap[0])) {\n                this.lexer.state.inRawBlock = true;\n            }\n            else if (this.lexer.state.inRawBlock && this.rules.other.endPreScriptTag.test(cap[0])) {\n                this.lexer.state.inRawBlock = false;\n            }\n            return {\n                type: 'html',\n                raw: cap[0],\n                inLink: this.lexer.state.inLink,\n                inRawBlock: this.lexer.state.inRawBlock,\n                block: false,\n                text: cap[0],\n            };\n        }\n    }\n    link(src) {\n        const cap = this.rules.inline.link.exec(src);\n        if (cap) {\n            const trimmedUrl = cap[2].trim();\n            if (!this.options.pedantic && this.rules.other.startAngleBracket.test(trimmedUrl)) {\n                // commonmark requires matching angle brackets\n                if (!(this.rules.other.endAngleBracket.test(trimmedUrl))) {\n                    return;\n                }\n                // ending angle bracket cannot be escaped\n                const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\\\');\n                if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {\n                    return;\n                }\n            }\n            else {\n                // find closing parenthesis\n                const lastParenIndex = findClosingBracket(cap[2], '()');\n                if (lastParenIndex > -1) {\n                    const start = cap[0].indexOf('!') === 0 ? 5 : 4;\n                    const linkLen = start + cap[1].length + lastParenIndex;\n                    cap[2] = cap[2].substring(0, lastParenIndex);\n                    cap[0] = cap[0].substring(0, linkLen).trim();\n                    cap[3] = '';\n                }\n            }\n            let href = cap[2];\n            let title = '';\n            if (this.options.pedantic) {\n                // split pedantic href and title\n                const link = this.rules.other.pedanticHrefTitle.exec(href);\n                if (link) {\n                    href = link[1];\n                    title = link[3];\n                }\n            }\n            else {\n                title = cap[3] ? cap[3].slice(1, -1) : '';\n            }\n            href = href.trim();\n            if (this.rules.other.startAngleBracket.test(href)) {\n                if (this.options.pedantic && !(this.rules.other.endAngleBracket.test(trimmedUrl))) {\n                    // pedantic allows starting angle bracket without ending angle bracket\n                    href = href.slice(1);\n                }\n                else {\n                    href = href.slice(1, -1);\n                }\n            }\n            return outputLink(cap, {\n                href: href ? href.replace(this.rules.inline.anyPunctuation, '$1') : href,\n                title: title ? title.replace(this.rules.inline.anyPunctuation, '$1') : title,\n            }, cap[0], this.lexer, this.rules);\n        }\n    }\n    reflink(src, links) {\n        let cap;\n        if ((cap = this.rules.inline.reflink.exec(src))\n            || (cap = this.rules.inline.nolink.exec(src))) {\n            const linkString = (cap[2] || cap[1]).replace(this.rules.other.multipleSpaceGlobal, ' ');\n            const link = links[linkString.toLowerCase()];\n            if (!link) {\n                const text = cap[0].charAt(0);\n                return {\n                    type: 'text',\n                    raw: text,\n                    text,\n                };\n            }\n            return outputLink(cap, link, cap[0], this.lexer, this.rules);\n        }\n    }\n    emStrong(src, maskedSrc, prevChar = '') {\n        let match = this.rules.inline.emStrongLDelim.exec(src);\n        if (!match)\n            return;\n        // _ can't be between two alphanumerics. \\p{L}\\p{N} includes non-english alphabet/numbers as well\n        if (match[3] && prevChar.match(this.rules.other.unicodeAlphaNumeric))\n            return;\n        const nextChar = match[1] || match[2] || '';\n        if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) {\n            // unicode Regex counts emoji as 1 char; spread into array for proper count (used multiple times below)\n            const lLength = [...match[0]].length - 1;\n            let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;\n            const endReg = match[0][0] === '*' ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd;\n            endReg.lastIndex = 0;\n            // Clip maskedSrc to same section of string as src (move to lexer?)\n            maskedSrc = maskedSrc.slice(-1 * src.length + lLength);\n            while ((match = endReg.exec(maskedSrc)) != null) {\n                rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];\n                if (!rDelim)\n                    continue; // skip single * in __abc*abc__\n                rLength = [...rDelim].length;\n                if (match[3] || match[4]) { // found another Left Delim\n                    delimTotal += rLength;\n                    continue;\n                }\n                else if (match[5] || match[6]) { // either Left or Right Delim\n                    if (lLength % 3 && !((lLength + rLength) % 3)) {\n                        midDelimTotal += rLength;\n                        continue; // CommonMark Emphasis Rules 9-10\n                    }\n                }\n                delimTotal -= rLength;\n                if (delimTotal > 0)\n                    continue; // Haven't found enough closing delimiters\n                // Remove extra characters. *a*** -> *a*\n                rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);\n                // char length can be >1 for unicode characters;\n                const lastCharLength = [...match[0]][0].length;\n                const raw = src.slice(0, lLength + match.index + lastCharLength + rLength);\n                // Create `em` if smallest delimiter has odd char count. *a***\n                if (Math.min(lLength, rLength) % 2) {\n                    const text = raw.slice(1, -1);\n                    return {\n                        type: 'em',\n                        raw,\n                        text,\n                        tokens: this.lexer.inlineTokens(text),\n                    };\n                }\n                // Create 'strong' if smallest delimiter has even char count. **a***\n                const text = raw.slice(2, -2);\n                return {\n                    type: 'strong',\n                    raw,\n                    text,\n                    tokens: this.lexer.inlineTokens(text),\n                };\n            }\n        }\n    }\n    codespan(src) {\n        const cap = this.rules.inline.code.exec(src);\n        if (cap) {\n            let text = cap[2].replace(this.rules.other.newLineCharGlobal, ' ');\n            const hasNonSpaceChars = this.rules.other.nonSpaceChar.test(text);\n            const hasSpaceCharsOnBothEnds = this.rules.other.startingSpaceChar.test(text) && this.rules.other.endingSpaceChar.test(text);\n            if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {\n                text = text.substring(1, text.length - 1);\n            }\n            return {\n                type: 'codespan',\n                raw: cap[0],\n                text,\n            };\n        }\n    }\n    br(src) {\n        const cap = this.rules.inline.br.exec(src);\n        if (cap) {\n            return {\n                type: 'br',\n                raw: cap[0],\n            };\n        }\n    }\n    del(src) {\n        const cap = this.rules.inline.del.exec(src);\n        if (cap) {\n            return {\n                type: 'del',\n                raw: cap[0],\n                text: cap[2],\n                tokens: this.lexer.inlineTokens(cap[2]),\n            };\n        }\n    }\n    autolink(src) {\n        const cap = this.rules.inline.autolink.exec(src);\n        if (cap) {\n            let text, href;\n            if (cap[2] === '@') {\n                text = cap[1];\n                href = 'mailto:' + text;\n            }\n            else {\n                text = cap[1];\n                href = text;\n            }\n            return {\n                type: 'link',\n                raw: cap[0],\n                text,\n                href,\n                tokens: [\n                    {\n                        type: 'text',\n                        raw: text,\n                        text,\n                    },\n                ],\n            };\n        }\n    }\n    url(src) {\n        let cap;\n        if (cap = this.rules.inline.url.exec(src)) {\n            let text, href;\n            if (cap[2] === '@') {\n                text = cap[0];\n                href = 'mailto:' + text;\n            }\n            else {\n                // do extended autolink path validation\n                let prevCapZero;\n                do {\n                    prevCapZero = cap[0];\n                    cap[0] = this.rules.inline._backpedal.exec(cap[0])?.[0] ?? '';\n                } while (prevCapZero !== cap[0]);\n                text = cap[0];\n                if (cap[1] === 'www.') {\n                    href = 'http://' + cap[0];\n                }\n                else {\n                    href = cap[0];\n                }\n            }\n            return {\n                type: 'link',\n                raw: cap[0],\n                text,\n                href,\n                tokens: [\n                    {\n                        type: 'text',\n                        raw: text,\n                        text,\n                    },\n                ],\n            };\n        }\n    }\n    inlineText(src) {\n        const cap = this.rules.inline.text.exec(src);\n        if (cap) {\n            const escaped = this.lexer.state.inRawBlock;\n            return {\n                type: 'text',\n                raw: cap[0],\n                text: cap[0],\n                escaped,\n            };\n        }\n    }\n}\n\n/**\n * Block Lexer\n */\nclass _Lexer {\n    tokens;\n    options;\n    state;\n    tokenizer;\n    inlineQueue;\n    constructor(options) {\n        // TokenList cannot be created in one go\n        this.tokens = [];\n        this.tokens.links = Object.create(null);\n        this.options = options || _defaults;\n        this.options.tokenizer = this.options.tokenizer || new _Tokenizer();\n        this.tokenizer = this.options.tokenizer;\n        this.tokenizer.options = this.options;\n        this.tokenizer.lexer = this;\n        this.inlineQueue = [];\n        this.state = {\n            inLink: false,\n            inRawBlock: false,\n            top: true,\n        };\n        const rules = {\n            other,\n            block: block.normal,\n            inline: inline.normal,\n        };\n        if (this.options.pedantic) {\n            rules.block = block.pedantic;\n            rules.inline = inline.pedantic;\n        }\n        else if (this.options.gfm) {\n            rules.block = block.gfm;\n            if (this.options.breaks) {\n                rules.inline = inline.breaks;\n            }\n            else {\n                rules.inline = inline.gfm;\n            }\n        }\n        this.tokenizer.rules = rules;\n    }\n    /**\n     * Expose Rules\n     */\n    static get rules() {\n        return {\n            block,\n            inline,\n        };\n    }\n    /**\n     * Static Lex Method\n     */\n    static lex(src, options) {\n        const lexer = new _Lexer(options);\n        return lexer.lex(src);\n    }\n    /**\n     * Static Lex Inline Method\n     */\n    static lexInline(src, options) {\n        const lexer = new _Lexer(options);\n        return lexer.inlineTokens(src);\n    }\n    /**\n     * Preprocessing\n     */\n    lex(src) {\n        src = src.replace(other.carriageReturn, '\\n');\n        this.blockTokens(src, this.tokens);\n        for (let i = 0; i < this.inlineQueue.length; i++) {\n            const next = this.inlineQueue[i];\n            this.inlineTokens(next.src, next.tokens);\n        }\n        this.inlineQueue = [];\n        return this.tokens;\n    }\n    blockTokens(src, tokens = [], lastParagraphClipped = false) {\n        if (this.options.pedantic) {\n            src = src.replace(other.tabCharGlobal, '    ').replace(other.spaceLine, '');\n        }\n        while (src) {\n            let token;\n            if (this.options.extensions?.block?.some((extTokenizer) => {\n                if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n                    src = src.substring(token.raw.length);\n                    tokens.push(token);\n                    return true;\n                }\n                return false;\n            })) {\n                continue;\n            }\n            // newline\n            if (token = this.tokenizer.space(src)) {\n                src = src.substring(token.raw.length);\n                const lastToken = tokens.at(-1);\n                if (token.raw.length === 1 && lastToken !== undefined) {\n                    // if there's a single \\n as a spacer, it's terminating the last line,\n                    // so move it there so that we don't get unnecessary paragraph tags\n                    lastToken.raw += '\\n';\n                }\n                else {\n                    tokens.push(token);\n                }\n                continue;\n            }\n            // code\n            if (token = this.tokenizer.code(src)) {\n                src = src.substring(token.raw.length);\n                const lastToken = tokens.at(-1);\n                // An indented code block cannot interrupt a paragraph.\n                if (lastToken?.type === 'paragraph' || lastToken?.type === 'text') {\n                    lastToken.raw += '\\n' + token.raw;\n                    lastToken.text += '\\n' + token.text;\n                    this.inlineQueue.at(-1).src = lastToken.text;\n                }\n                else {\n                    tokens.push(token);\n                }\n                continue;\n            }\n            // fences\n            if (token = this.tokenizer.fences(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // heading\n            if (token = this.tokenizer.heading(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // hr\n            if (token = this.tokenizer.hr(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // blockquote\n            if (token = this.tokenizer.blockquote(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // list\n            if (token = this.tokenizer.list(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // html\n            if (token = this.tokenizer.html(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // def\n            if (token = this.tokenizer.def(src)) {\n                src = src.substring(token.raw.length);\n                const lastToken = tokens.at(-1);\n                if (lastToken?.type === 'paragraph' || lastToken?.type === 'text') {\n                    lastToken.raw += '\\n' + token.raw;\n                    lastToken.text += '\\n' + token.raw;\n                    this.inlineQueue.at(-1).src = lastToken.text;\n                }\n                else if (!this.tokens.links[token.tag]) {\n                    this.tokens.links[token.tag] = {\n                        href: token.href,\n                        title: token.title,\n                    };\n                }\n                continue;\n            }\n            // table (gfm)\n            if (token = this.tokenizer.table(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // lheading\n            if (token = this.tokenizer.lheading(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // top-level paragraph\n            // prevent paragraph consuming extensions by clipping 'src' to extension start\n            let cutSrc = src;\n            if (this.options.extensions?.startBlock) {\n                let startIndex = Infinity;\n                const tempSrc = src.slice(1);\n                let tempStart;\n                this.options.extensions.startBlock.forEach((getStartIndex) => {\n                    tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n                    if (typeof tempStart === 'number' && tempStart >= 0) {\n                        startIndex = Math.min(startIndex, tempStart);\n                    }\n                });\n                if (startIndex < Infinity && startIndex >= 0) {\n                    cutSrc = src.substring(0, startIndex + 1);\n                }\n            }\n            if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {\n                const lastToken = tokens.at(-1);\n                if (lastParagraphClipped && lastToken?.type === 'paragraph') {\n                    lastToken.raw += '\\n' + token.raw;\n                    lastToken.text += '\\n' + token.text;\n                    this.inlineQueue.pop();\n                    this.inlineQueue.at(-1).src = lastToken.text;\n                }\n                else {\n                    tokens.push(token);\n                }\n                lastParagraphClipped = cutSrc.length !== src.length;\n                src = src.substring(token.raw.length);\n                continue;\n            }\n            // text\n            if (token = this.tokenizer.text(src)) {\n                src = src.substring(token.raw.length);\n                const lastToken = tokens.at(-1);\n                if (lastToken?.type === 'text') {\n                    lastToken.raw += '\\n' + token.raw;\n                    lastToken.text += '\\n' + token.text;\n                    this.inlineQueue.pop();\n                    this.inlineQueue.at(-1).src = lastToken.text;\n                }\n                else {\n                    tokens.push(token);\n                }\n                continue;\n            }\n            if (src) {\n                const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n                if (this.options.silent) {\n                    console.error(errMsg);\n                    break;\n                }\n                else {\n                    throw new Error(errMsg);\n                }\n            }\n        }\n        this.state.top = true;\n        return tokens;\n    }\n    inline(src, tokens = []) {\n        this.inlineQueue.push({ src, tokens });\n        return tokens;\n    }\n    /**\n     * Lexing/Compiling\n     */\n    inlineTokens(src, tokens = []) {\n        // String with links masked to avoid interference with em and strong\n        let maskedSrc = src;\n        let match = null;\n        // Mask out reflinks\n        if (this.tokens.links) {\n            const links = Object.keys(this.tokens.links);\n            if (links.length > 0) {\n                while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {\n                    if (links.includes(match[0].slice(match[0].lastIndexOf('[') + 1, -1))) {\n                        maskedSrc = maskedSrc.slice(0, match.index)\n                            + '[' + 'a'.repeat(match[0].length - 2) + ']'\n                            + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);\n                    }\n                }\n            }\n        }\n        // Mask out other blocks\n        while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {\n            maskedSrc = maskedSrc.slice(0, match.index) + '[' + 'a'.repeat(match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);\n        }\n        // Mask out escaped characters\n        while ((match = this.tokenizer.rules.inline.anyPunctuation.exec(maskedSrc)) != null) {\n            maskedSrc = maskedSrc.slice(0, match.index) + '++' + maskedSrc.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);\n        }\n        let keepPrevChar = false;\n        let prevChar = '';\n        while (src) {\n            if (!keepPrevChar) {\n                prevChar = '';\n            }\n            keepPrevChar = false;\n            let token;\n            // extensions\n            if (this.options.extensions?.inline?.some((extTokenizer) => {\n                if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n                    src = src.substring(token.raw.length);\n                    tokens.push(token);\n                    return true;\n                }\n                return false;\n            })) {\n                continue;\n            }\n            // escape\n            if (token = this.tokenizer.escape(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // tag\n            if (token = this.tokenizer.tag(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // link\n            if (token = this.tokenizer.link(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // reflink, nolink\n            if (token = this.tokenizer.reflink(src, this.tokens.links)) {\n                src = src.substring(token.raw.length);\n                const lastToken = tokens.at(-1);\n                if (token.type === 'text' && lastToken?.type === 'text') {\n                    lastToken.raw += token.raw;\n                    lastToken.text += token.text;\n                }\n                else {\n                    tokens.push(token);\n                }\n                continue;\n            }\n            // em & strong\n            if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // code\n            if (token = this.tokenizer.codespan(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // br\n            if (token = this.tokenizer.br(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // del (gfm)\n            if (token = this.tokenizer.del(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // autolink\n            if (token = this.tokenizer.autolink(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // url (gfm)\n            if (!this.state.inLink && (token = this.tokenizer.url(src))) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // text\n            // prevent inlineText consuming extensions by clipping 'src' to extension start\n            let cutSrc = src;\n            if (this.options.extensions?.startInline) {\n                let startIndex = Infinity;\n                const tempSrc = src.slice(1);\n                let tempStart;\n                this.options.extensions.startInline.forEach((getStartIndex) => {\n                    tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n                    if (typeof tempStart === 'number' && tempStart >= 0) {\n                        startIndex = Math.min(startIndex, tempStart);\n                    }\n                });\n                if (startIndex < Infinity && startIndex >= 0) {\n                    cutSrc = src.substring(0, startIndex + 1);\n                }\n            }\n            if (token = this.tokenizer.inlineText(cutSrc)) {\n                src = src.substring(token.raw.length);\n                if (token.raw.slice(-1) !== '_') { // Track prevChar before string of ____ started\n                    prevChar = token.raw.slice(-1);\n                }\n                keepPrevChar = true;\n                const lastToken = tokens.at(-1);\n                if (lastToken?.type === 'text') {\n                    lastToken.raw += token.raw;\n                    lastToken.text += token.text;\n                }\n                else {\n                    tokens.push(token);\n                }\n                continue;\n            }\n            if (src) {\n                const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n                if (this.options.silent) {\n                    console.error(errMsg);\n                    break;\n                }\n                else {\n                    throw new Error(errMsg);\n                }\n            }\n        }\n        return tokens;\n    }\n}\n\n/**\n * Renderer\n */\nclass _Renderer {\n    options;\n    parser; // set by the parser\n    constructor(options) {\n        this.options = options || _defaults;\n    }\n    space(token) {\n        return '';\n    }\n    code({ text, lang, escaped }) {\n        const langString = (lang || '').match(other.notSpaceStart)?.[0];\n        const code = text.replace(other.endingNewline, '') + '\\n';\n        if (!langString) {\n            return '<pre><code>'\n                + (escaped ? code : escape(code, true))\n                + '</code></pre>\\n';\n        }\n        return '<pre><code class=\"language-'\n            + escape(langString)\n            + '\">'\n            + (escaped ? code : escape(code, true))\n            + '</code></pre>\\n';\n    }\n    blockquote({ tokens }) {\n        const body = this.parser.parse(tokens);\n        return `<blockquote>\\n${body}</blockquote>\\n`;\n    }\n    html({ text }) {\n        return text;\n    }\n    heading({ tokens, depth }) {\n        return `<h${depth}>${this.parser.parseInline(tokens)}</h${depth}>\\n`;\n    }\n    hr(token) {\n        return '<hr>\\n';\n    }\n    list(token) {\n        const ordered = token.ordered;\n        const start = token.start;\n        let body = '';\n        for (let j = 0; j < token.items.length; j++) {\n            const item = token.items[j];\n            body += this.listitem(item);\n        }\n        const type = ordered ? 'ol' : 'ul';\n        const startAttr = (ordered && start !== 1) ? (' start=\"' + start + '\"') : '';\n        return '<' + type + startAttr + '>\\n' + body + '</' + type + '>\\n';\n    }\n    listitem(item) {\n        let itemBody = '';\n        if (item.task) {\n            const checkbox = this.checkbox({ checked: !!item.checked });\n            if (item.loose) {\n                if (item.tokens[0]?.type === 'paragraph') {\n                    item.tokens[0].text = checkbox + ' ' + item.tokens[0].text;\n                    if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === 'text') {\n                        item.tokens[0].tokens[0].text = checkbox + ' ' + escape(item.tokens[0].tokens[0].text);\n                        item.tokens[0].tokens[0].escaped = true;\n                    }\n                }\n                else {\n                    item.tokens.unshift({\n                        type: 'text',\n                        raw: checkbox + ' ',\n                        text: checkbox + ' ',\n                        escaped: true,\n                    });\n                }\n            }\n            else {\n                itemBody += checkbox + ' ';\n            }\n        }\n        itemBody += this.parser.parse(item.tokens, !!item.loose);\n        return `<li>${itemBody}</li>\\n`;\n    }\n    checkbox({ checked }) {\n        return '<input '\n            + (checked ? 'checked=\"\" ' : '')\n            + 'disabled=\"\" type=\"checkbox\">';\n    }\n    paragraph({ tokens }) {\n        return `<p>${this.parser.parseInline(tokens)}</p>\\n`;\n    }\n    table(token) {\n        let header = '';\n        // header\n        let cell = '';\n        for (let j = 0; j < token.header.length; j++) {\n            cell += this.tablecell(token.header[j]);\n        }\n        header += this.tablerow({ text: cell });\n        let body = '';\n        for (let j = 0; j < token.rows.length; j++) {\n            const row = token.rows[j];\n            cell = '';\n            for (let k = 0; k < row.length; k++) {\n                cell += this.tablecell(row[k]);\n            }\n            body += this.tablerow({ text: cell });\n        }\n        if (body)\n            body = `<tbody>${body}</tbody>`;\n        return '<table>\\n'\n            + '<thead>\\n'\n            + header\n            + '</thead>\\n'\n            + body\n            + '</table>\\n';\n    }\n    tablerow({ text }) {\n        return `<tr>\\n${text}</tr>\\n`;\n    }\n    tablecell(token) {\n        const content = this.parser.parseInline(token.tokens);\n        const type = token.header ? 'th' : 'td';\n        const tag = token.align\n            ? `<${type} align=\"${token.align}\">`\n            : `<${type}>`;\n        return tag + content + `</${type}>\\n`;\n    }\n    /**\n     * span level renderer\n     */\n    strong({ tokens }) {\n        return `<strong>${this.parser.parseInline(tokens)}</strong>`;\n    }\n    em({ tokens }) {\n        return `<em>${this.parser.parseInline(tokens)}</em>`;\n    }\n    codespan({ text }) {\n        return `<code>${escape(text, true)}</code>`;\n    }\n    br(token) {\n        return '<br>';\n    }\n    del({ tokens }) {\n        return `<del>${this.parser.parseInline(tokens)}</del>`;\n    }\n    link({ href, title, tokens }) {\n        const text = this.parser.parseInline(tokens);\n        const cleanHref = cleanUrl(href);\n        if (cleanHref === null) {\n            return text;\n        }\n        href = cleanHref;\n        let out = '<a href=\"' + href + '\"';\n        if (title) {\n            out += ' title=\"' + (escape(title)) + '\"';\n        }\n        out += '>' + text + '</a>';\n        return out;\n    }\n    image({ href, title, text }) {\n        const cleanHref = cleanUrl(href);\n        if (cleanHref === null) {\n            return escape(text);\n        }\n        href = cleanHref;\n        let out = `<img src=\"${href}\" alt=\"${text}\"`;\n        if (title) {\n            out += ` title=\"${escape(title)}\"`;\n        }\n        out += '>';\n        return out;\n    }\n    text(token) {\n        return 'tokens' in token && token.tokens\n            ? this.parser.parseInline(token.tokens)\n            : ('escaped' in token && token.escaped ? token.text : escape(token.text));\n    }\n}\n\n/**\n * TextRenderer\n * returns only the textual part of the token\n */\nclass _TextRenderer {\n    // no need for block level renderers\n    strong({ text }) {\n        return text;\n    }\n    em({ text }) {\n        return text;\n    }\n    codespan({ text }) {\n        return text;\n    }\n    del({ text }) {\n        return text;\n    }\n    html({ text }) {\n        return text;\n    }\n    text({ text }) {\n        return text;\n    }\n    link({ text }) {\n        return '' + text;\n    }\n    image({ text }) {\n        return '' + text;\n    }\n    br() {\n        return '';\n    }\n}\n\n/**\n * Parsing & Compiling\n */\nclass _Parser {\n    options;\n    renderer;\n    textRenderer;\n    constructor(options) {\n        this.options = options || _defaults;\n        this.options.renderer = this.options.renderer || new _Renderer();\n        this.renderer = this.options.renderer;\n        this.renderer.options = this.options;\n        this.renderer.parser = this;\n        this.textRenderer = new _TextRenderer();\n    }\n    /**\n     * Static Parse Method\n     */\n    static parse(tokens, options) {\n        const parser = new _Parser(options);\n        return parser.parse(tokens);\n    }\n    /**\n     * Static Parse Inline Method\n     */\n    static parseInline(tokens, options) {\n        const parser = new _Parser(options);\n        return parser.parseInline(tokens);\n    }\n    /**\n     * Parse Loop\n     */\n    parse(tokens, top = true) {\n        let out = '';\n        for (let i = 0; i < tokens.length; i++) {\n            const anyToken = tokens[i];\n            // Run any renderer extensions\n            if (this.options.extensions?.renderers?.[anyToken.type]) {\n                const genericToken = anyToken;\n                const ret = this.options.extensions.renderers[genericToken.type].call({ parser: this }, genericToken);\n                if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'html', 'paragraph', 'text'].includes(genericToken.type)) {\n                    out += ret || '';\n                    continue;\n                }\n            }\n            const token = anyToken;\n            switch (token.type) {\n                case 'space': {\n                    out += this.renderer.space(token);\n                    continue;\n                }\n                case 'hr': {\n                    out += this.renderer.hr(token);\n                    continue;\n                }\n                case 'heading': {\n                    out += this.renderer.heading(token);\n                    continue;\n                }\n                case 'code': {\n                    out += this.renderer.code(token);\n                    continue;\n                }\n                case 'table': {\n                    out += this.renderer.table(token);\n                    continue;\n                }\n                case 'blockquote': {\n                    out += this.renderer.blockquote(token);\n                    continue;\n                }\n                case 'list': {\n                    out += this.renderer.list(token);\n                    continue;\n                }\n                case 'html': {\n                    out += this.renderer.html(token);\n                    continue;\n                }\n                case 'paragraph': {\n                    out += this.renderer.paragraph(token);\n                    continue;\n                }\n                case 'text': {\n                    let textToken = token;\n                    let body = this.renderer.text(textToken);\n                    while (i + 1 < tokens.length && tokens[i + 1].type === 'text') {\n                        textToken = tokens[++i];\n                        body += '\\n' + this.renderer.text(textToken);\n                    }\n                    if (top) {\n                        out += this.renderer.paragraph({\n                            type: 'paragraph',\n                            raw: body,\n                            text: body,\n                            tokens: [{ type: 'text', raw: body, text: body, escaped: true }],\n                        });\n                    }\n                    else {\n                        out += body;\n                    }\n                    continue;\n                }\n                default: {\n                    const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n                    if (this.options.silent) {\n                        console.error(errMsg);\n                        return '';\n                    }\n                    else {\n                        throw new Error(errMsg);\n                    }\n                }\n            }\n        }\n        return out;\n    }\n    /**\n     * Parse Inline Tokens\n     */\n    parseInline(tokens, renderer = this.renderer) {\n        let out = '';\n        for (let i = 0; i < tokens.length; i++) {\n            const anyToken = tokens[i];\n            // Run any renderer extensions\n            if (this.options.extensions?.renderers?.[anyToken.type]) {\n                const ret = this.options.extensions.renderers[anyToken.type].call({ parser: this }, anyToken);\n                if (ret !== false || !['escape', 'html', 'link', 'image', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(anyToken.type)) {\n                    out += ret || '';\n                    continue;\n                }\n            }\n            const token = anyToken;\n            switch (token.type) {\n                case 'escape': {\n                    out += renderer.text(token);\n                    break;\n                }\n                case 'html': {\n                    out += renderer.html(token);\n                    break;\n                }\n                case 'link': {\n                    out += renderer.link(token);\n                    break;\n                }\n                case 'image': {\n                    out += renderer.image(token);\n                    break;\n                }\n                case 'strong': {\n                    out += renderer.strong(token);\n                    break;\n                }\n                case 'em': {\n                    out += renderer.em(token);\n                    break;\n                }\n                case 'codespan': {\n                    out += renderer.codespan(token);\n                    break;\n                }\n                case 'br': {\n                    out += renderer.br(token);\n                    break;\n                }\n                case 'del': {\n                    out += renderer.del(token);\n                    break;\n                }\n                case 'text': {\n                    out += renderer.text(token);\n                    break;\n                }\n                default: {\n                    const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n                    if (this.options.silent) {\n                        console.error(errMsg);\n                        return '';\n                    }\n                    else {\n                        throw new Error(errMsg);\n                    }\n                }\n            }\n        }\n        return out;\n    }\n}\n\nclass _Hooks {\n    options;\n    block;\n    constructor(options) {\n        this.options = options || _defaults;\n    }\n    static passThroughHooks = new Set([\n        'preprocess',\n        'postprocess',\n        'processAllTokens',\n    ]);\n    /**\n     * Process markdown before marked\n     */\n    preprocess(markdown) {\n        return markdown;\n    }\n    /**\n     * Process HTML after marked is finished\n     */\n    postprocess(html) {\n        return html;\n    }\n    /**\n     * Process all tokens before walk tokens\n     */\n    processAllTokens(tokens) {\n        return tokens;\n    }\n    /**\n     * Provide function to tokenize markdown\n     */\n    provideLexer() {\n        return this.block ? _Lexer.lex : _Lexer.lexInline;\n    }\n    /**\n     * Provide function to parse tokens\n     */\n    provideParser() {\n        return this.block ? _Parser.parse : _Parser.parseInline;\n    }\n}\n\nclass Marked {\n    defaults = _getDefaults();\n    options = this.setOptions;\n    parse = this.parseMarkdown(true);\n    parseInline = this.parseMarkdown(false);\n    Parser = _Parser;\n    Renderer = _Renderer;\n    TextRenderer = _TextRenderer;\n    Lexer = _Lexer;\n    Tokenizer = _Tokenizer;\n    Hooks = _Hooks;\n    constructor(...args) {\n        this.use(...args);\n    }\n    /**\n     * Run callback for every token\n     */\n    walkTokens(tokens, callback) {\n        let values = [];\n        for (const token of tokens) {\n            values = values.concat(callback.call(this, token));\n            switch (token.type) {\n                case 'table': {\n                    const tableToken = token;\n                    for (const cell of tableToken.header) {\n                        values = values.concat(this.walkTokens(cell.tokens, callback));\n                    }\n                    for (const row of tableToken.rows) {\n                        for (const cell of row) {\n                            values = values.concat(this.walkTokens(cell.tokens, callback));\n                        }\n                    }\n                    break;\n                }\n                case 'list': {\n                    const listToken = token;\n                    values = values.concat(this.walkTokens(listToken.items, callback));\n                    break;\n                }\n                default: {\n                    const genericToken = token;\n                    if (this.defaults.extensions?.childTokens?.[genericToken.type]) {\n                        this.defaults.extensions.childTokens[genericToken.type].forEach((childTokens) => {\n                            const tokens = genericToken[childTokens].flat(Infinity);\n                            values = values.concat(this.walkTokens(tokens, callback));\n                        });\n                    }\n                    else if (genericToken.tokens) {\n                        values = values.concat(this.walkTokens(genericToken.tokens, callback));\n                    }\n                }\n            }\n        }\n        return values;\n    }\n    use(...args) {\n        const extensions = this.defaults.extensions || { renderers: {}, childTokens: {} };\n        args.forEach((pack) => {\n            // copy options to new object\n            const opts = { ...pack };\n            // set async to true if it was set to true before\n            opts.async = this.defaults.async || opts.async || false;\n            // ==-- Parse \"addon\" extensions --== //\n            if (pack.extensions) {\n                pack.extensions.forEach((ext) => {\n                    if (!ext.name) {\n                        throw new Error('extension name required');\n                    }\n                    if ('renderer' in ext) { // Renderer extensions\n                        const prevRenderer = extensions.renderers[ext.name];\n                        if (prevRenderer) {\n                            // Replace extension with func to run new extension but fall back if false\n                            extensions.renderers[ext.name] = function (...args) {\n                                let ret = ext.renderer.apply(this, args);\n                                if (ret === false) {\n                                    ret = prevRenderer.apply(this, args);\n                                }\n                                return ret;\n                            };\n                        }\n                        else {\n                            extensions.renderers[ext.name] = ext.renderer;\n                        }\n                    }\n                    if ('tokenizer' in ext) { // Tokenizer Extensions\n                        if (!ext.level || (ext.level !== 'block' && ext.level !== 'inline')) {\n                            throw new Error(\"extension level must be 'block' or 'inline'\");\n                        }\n                        const extLevel = extensions[ext.level];\n                        if (extLevel) {\n                            extLevel.unshift(ext.tokenizer);\n                        }\n                        else {\n                            extensions[ext.level] = [ext.tokenizer];\n                        }\n                        if (ext.start) { // Function to check for start of token\n                            if (ext.level === 'block') {\n                                if (extensions.startBlock) {\n                                    extensions.startBlock.push(ext.start);\n                                }\n                                else {\n                                    extensions.startBlock = [ext.start];\n                                }\n                            }\n                            else if (ext.level === 'inline') {\n                                if (extensions.startInline) {\n                                    extensions.startInline.push(ext.start);\n                                }\n                                else {\n                                    extensions.startInline = [ext.start];\n                                }\n                            }\n                        }\n                    }\n                    if ('childTokens' in ext && ext.childTokens) { // Child tokens to be visited by walkTokens\n                        extensions.childTokens[ext.name] = ext.childTokens;\n                    }\n                });\n                opts.extensions = extensions;\n            }\n            // ==-- Parse \"overwrite\" extensions --== //\n            if (pack.renderer) {\n                const renderer = this.defaults.renderer || new _Renderer(this.defaults);\n                for (const prop in pack.renderer) {\n                    if (!(prop in renderer)) {\n                        throw new Error(`renderer '${prop}' does not exist`);\n                    }\n                    if (['options', 'parser'].includes(prop)) {\n                        // ignore options property\n                        continue;\n                    }\n                    const rendererProp = prop;\n                    const rendererFunc = pack.renderer[rendererProp];\n                    const prevRenderer = renderer[rendererProp];\n                    // Replace renderer with func to run extension, but fall back if false\n                    renderer[rendererProp] = (...args) => {\n                        let ret = rendererFunc.apply(renderer, args);\n                        if (ret === false) {\n                            ret = prevRenderer.apply(renderer, args);\n                        }\n                        return ret || '';\n                    };\n                }\n                opts.renderer = renderer;\n            }\n            if (pack.tokenizer) {\n                const tokenizer = this.defaults.tokenizer || new _Tokenizer(this.defaults);\n                for (const prop in pack.tokenizer) {\n                    if (!(prop in tokenizer)) {\n                        throw new Error(`tokenizer '${prop}' does not exist`);\n                    }\n                    if (['options', 'rules', 'lexer'].includes(prop)) {\n                        // ignore options, rules, and lexer properties\n                        continue;\n                    }\n                    const tokenizerProp = prop;\n                    const tokenizerFunc = pack.tokenizer[tokenizerProp];\n                    const prevTokenizer = tokenizer[tokenizerProp];\n                    // Replace tokenizer with func to run extension, but fall back if false\n                    // @ts-expect-error cannot type tokenizer function dynamically\n                    tokenizer[tokenizerProp] = (...args) => {\n                        let ret = tokenizerFunc.apply(tokenizer, args);\n                        if (ret === false) {\n                            ret = prevTokenizer.apply(tokenizer, args);\n                        }\n                        return ret;\n                    };\n                }\n                opts.tokenizer = tokenizer;\n            }\n            // ==-- Parse Hooks extensions --== //\n            if (pack.hooks) {\n                const hooks = this.defaults.hooks || new _Hooks();\n                for (const prop in pack.hooks) {\n                    if (!(prop in hooks)) {\n                        throw new Error(`hook '${prop}' does not exist`);\n                    }\n                    if (['options', 'block'].includes(prop)) {\n                        // ignore options and block properties\n                        continue;\n                    }\n                    const hooksProp = prop;\n                    const hooksFunc = pack.hooks[hooksProp];\n                    const prevHook = hooks[hooksProp];\n                    if (_Hooks.passThroughHooks.has(prop)) {\n                        // @ts-expect-error cannot type hook function dynamically\n                        hooks[hooksProp] = (arg) => {\n                            if (this.defaults.async) {\n                                return Promise.resolve(hooksFunc.call(hooks, arg)).then(ret => {\n                                    return prevHook.call(hooks, ret);\n                                });\n                            }\n                            const ret = hooksFunc.call(hooks, arg);\n                            return prevHook.call(hooks, ret);\n                        };\n                    }\n                    else {\n                        // @ts-expect-error cannot type hook function dynamically\n                        hooks[hooksProp] = (...args) => {\n                            let ret = hooksFunc.apply(hooks, args);\n                            if (ret === false) {\n                                ret = prevHook.apply(hooks, args);\n                            }\n                            return ret;\n                        };\n                    }\n                }\n                opts.hooks = hooks;\n            }\n            // ==-- Parse WalkTokens extensions --== //\n            if (pack.walkTokens) {\n                const walkTokens = this.defaults.walkTokens;\n                const packWalktokens = pack.walkTokens;\n                opts.walkTokens = function (token) {\n                    let values = [];\n                    values.push(packWalktokens.call(this, token));\n                    if (walkTokens) {\n                        values = values.concat(walkTokens.call(this, token));\n                    }\n                    return values;\n                };\n            }\n            this.defaults = { ...this.defaults, ...opts };\n        });\n        return this;\n    }\n    setOptions(opt) {\n        this.defaults = { ...this.defaults, ...opt };\n        return this;\n    }\n    lexer(src, options) {\n        return _Lexer.lex(src, options ?? this.defaults);\n    }\n    parser(tokens, options) {\n        return _Parser.parse(tokens, options ?? this.defaults);\n    }\n    parseMarkdown(blockType) {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        const parse = (src, options) => {\n            const origOpt = { ...options };\n            const opt = { ...this.defaults, ...origOpt };\n            const throwError = this.onError(!!opt.silent, !!opt.async);\n            // throw error if an extension set async to true but parse was called with async: false\n            if (this.defaults.async === true && origOpt.async === false) {\n                return throwError(new Error('marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.'));\n            }\n            // throw error in case of non string input\n            if (typeof src === 'undefined' || src === null) {\n                return throwError(new Error('marked(): input parameter is undefined or null'));\n            }\n            if (typeof src !== 'string') {\n                return throwError(new Error('marked(): input parameter is of type '\n                    + Object.prototype.toString.call(src) + ', string expected'));\n            }\n            if (opt.hooks) {\n                opt.hooks.options = opt;\n                opt.hooks.block = blockType;\n            }\n            const lexer = opt.hooks ? opt.hooks.provideLexer() : (blockType ? _Lexer.lex : _Lexer.lexInline);\n            const parser = opt.hooks ? opt.hooks.provideParser() : (blockType ? _Parser.parse : _Parser.parseInline);\n            if (opt.async) {\n                return Promise.resolve(opt.hooks ? opt.hooks.preprocess(src) : src)\n                    .then(src => lexer(src, opt))\n                    .then(tokens => opt.hooks ? opt.hooks.processAllTokens(tokens) : tokens)\n                    .then(tokens => opt.walkTokens ? Promise.all(this.walkTokens(tokens, opt.walkTokens)).then(() => tokens) : tokens)\n                    .then(tokens => parser(tokens, opt))\n                    .then(html => opt.hooks ? opt.hooks.postprocess(html) : html)\n                    .catch(throwError);\n            }\n            try {\n                if (opt.hooks) {\n                    src = opt.hooks.preprocess(src);\n                }\n                let tokens = lexer(src, opt);\n                if (opt.hooks) {\n                    tokens = opt.hooks.processAllTokens(tokens);\n                }\n                if (opt.walkTokens) {\n                    this.walkTokens(tokens, opt.walkTokens);\n                }\n                let html = parser(tokens, opt);\n                if (opt.hooks) {\n                    html = opt.hooks.postprocess(html);\n                }\n                return html;\n            }\n            catch (e) {\n                return throwError(e);\n            }\n        };\n        return parse;\n    }\n    onError(silent, async) {\n        return (e) => {\n            e.message += '\\nPlease report this to https://github.com/markedjs/marked.';\n            if (silent) {\n                const msg = '<p>An error occurred:</p><pre>'\n                    + escape(e.message + '', true)\n                    + '</pre>';\n                if (async) {\n                    return Promise.resolve(msg);\n                }\n                return msg;\n            }\n            if (async) {\n                return Promise.reject(e);\n            }\n            throw e;\n        };\n    }\n}\n\nconst markedInstance = new Marked();\nfunction marked(src, opt) {\n    return markedInstance.parse(src, opt);\n}\n/**\n * Sets the default options.\n *\n * @param options Hash of options\n */\nmarked.options =\n    marked.setOptions = function (options) {\n        markedInstance.setOptions(options);\n        marked.defaults = markedInstance.defaults;\n        changeDefaults(marked.defaults);\n        return marked;\n    };\n/**\n * Gets the original marked default options.\n */\nmarked.getDefaults = _getDefaults;\nmarked.defaults = _defaults;\n/**\n * Use Extension\n */\nmarked.use = function (...args) {\n    markedInstance.use(...args);\n    marked.defaults = markedInstance.defaults;\n    changeDefaults(marked.defaults);\n    return marked;\n};\n/**\n * Run callback for every token\n */\nmarked.walkTokens = function (tokens, callback) {\n    return markedInstance.walkTokens(tokens, callback);\n};\n/**\n * Compiles markdown to HTML without enclosing `p` tag.\n *\n * @param src String of markdown source to be compiled\n * @param options Hash of options\n * @return String of compiled HTML\n */\nmarked.parseInline = markedInstance.parseInline;\n/**\n * Expose\n */\nmarked.Parser = _Parser;\nmarked.parser = _Parser.parse;\nmarked.Renderer = _Renderer;\nmarked.TextRenderer = _TextRenderer;\nmarked.Lexer = _Lexer;\nmarked.lexer = _Lexer.lex;\nmarked.Tokenizer = _Tokenizer;\nmarked.Hooks = _Hooks;\nmarked.parse = marked;\nconst options = marked.options;\nconst setOptions = marked.setOptions;\nconst use = marked.use;\nconst walkTokens = marked.walkTokens;\nconst parseInline = marked.parseInline;\nconst parse = marked;\nconst parser = _Parser.parse;\nconst lexer = _Lexer.lex;\n\nexport { _Hooks as Hooks, _Lexer as Lexer, Marked, _Parser as Parser, _Renderer as Renderer, _TextRenderer as TextRenderer, _Tokenizer as Tokenizer, _defaults as defaults, _getDefaults as getDefaults, lexer, marked, options, parse, parseInline, parser, setOptions, use, walkTokens };\n//# sourceMappingURL=marked.esm.js.map\n","/*! @license DOMPurify 3.2.4 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.4/LICENSE */\n\nconst {\n  entries,\n  setPrototypeOf,\n  isFrozen,\n  getPrototypeOf,\n  getOwnPropertyDescriptor\n} = Object;\nlet {\n  freeze,\n  seal,\n  create\n} = Object; // eslint-disable-line import/no-mutable-exports\nlet {\n  apply,\n  construct\n} = typeof Reflect !== 'undefined' && Reflect;\nif (!freeze) {\n  freeze = function freeze(x) {\n    return x;\n  };\n}\nif (!seal) {\n  seal = function seal(x) {\n    return x;\n  };\n}\nif (!apply) {\n  apply = function apply(fun, thisValue, args) {\n    return fun.apply(thisValue, args);\n  };\n}\nif (!construct) {\n  construct = function construct(Func, args) {\n    return new Func(...args);\n  };\n}\nconst arrayForEach = unapply(Array.prototype.forEach);\nconst arrayLastIndexOf = unapply(Array.prototype.lastIndexOf);\nconst arrayPop = unapply(Array.prototype.pop);\nconst arrayPush = unapply(Array.prototype.push);\nconst arraySplice = unapply(Array.prototype.splice);\nconst stringToLowerCase = unapply(String.prototype.toLowerCase);\nconst stringToString = unapply(String.prototype.toString);\nconst stringMatch = unapply(String.prototype.match);\nconst stringReplace = unapply(String.prototype.replace);\nconst stringIndexOf = unapply(String.prototype.indexOf);\nconst stringTrim = unapply(String.prototype.trim);\nconst objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);\nconst regExpTest = unapply(RegExp.prototype.test);\nconst typeErrorCreate = unconstruct(TypeError);\n/**\n * Creates a new function that calls the given function with a specified thisArg and arguments.\n *\n * @param func - The function to be wrapped and called.\n * @returns A new function that calls the given function with a specified thisArg and arguments.\n */\nfunction unapply(func) {\n  return function (thisArg) {\n    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      args[_key - 1] = arguments[_key];\n    }\n    return apply(func, thisArg, args);\n  };\n}\n/**\n * Creates a new function that constructs an instance of the given constructor function with the provided arguments.\n *\n * @param func - The constructor function to be wrapped and called.\n * @returns A new function that constructs an instance of the given constructor function with the provided arguments.\n */\nfunction unconstruct(func) {\n  return function () {\n    for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n      args[_key2] = arguments[_key2];\n    }\n    return construct(func, args);\n  };\n}\n/**\n * Add properties to a lookup table\n *\n * @param set - The set to which elements will be added.\n * @param array - The array containing elements to be added to the set.\n * @param transformCaseFunc - An optional function to transform the case of each element before adding to the set.\n * @returns The modified set with added elements.\n */\nfunction addToSet(set, array) {\n  let transformCaseFunc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : stringToLowerCase;\n  if (setPrototypeOf) {\n    // Make 'in' and truthy checks like Boolean(set.constructor)\n    // independent of any properties defined on Object.prototype.\n    // Prevent prototype setters from intercepting set as a this value.\n    setPrototypeOf(set, null);\n  }\n  let l = array.length;\n  while (l--) {\n    let element = array[l];\n    if (typeof element === 'string') {\n      const lcElement = transformCaseFunc(element);\n      if (lcElement !== element) {\n        // Config presets (e.g. tags.js, attrs.js) are immutable.\n        if (!isFrozen(array)) {\n          array[l] = lcElement;\n        }\n        element = lcElement;\n      }\n    }\n    set[element] = true;\n  }\n  return set;\n}\n/**\n * Clean up an array to harden against CSPP\n *\n * @param array - The array to be cleaned.\n * @returns The cleaned version of the array\n */\nfunction cleanArray(array) {\n  for (let index = 0; index < array.length; index++) {\n    const isPropertyExist = objectHasOwnProperty(array, index);\n    if (!isPropertyExist) {\n      array[index] = null;\n    }\n  }\n  return array;\n}\n/**\n * Shallow clone an object\n *\n * @param object - The object to be cloned.\n * @returns A new object that copies the original.\n */\nfunction clone(object) {\n  const newObject = create(null);\n  for (const [property, value] of entries(object)) {\n    const isPropertyExist = objectHasOwnProperty(object, property);\n    if (isPropertyExist) {\n      if (Array.isArray(value)) {\n        newObject[property] = cleanArray(value);\n      } else if (value && typeof value === 'object' && value.constructor === Object) {\n        newObject[property] = clone(value);\n      } else {\n        newObject[property] = value;\n      }\n    }\n  }\n  return newObject;\n}\n/**\n * This method automatically checks if the prop is function or getter and behaves accordingly.\n *\n * @param object - The object to look up the getter function in its prototype chain.\n * @param prop - The property name for which to find the getter function.\n * @returns The getter function found in the prototype chain or a fallback function.\n */\nfunction lookupGetter(object, prop) {\n  while (object !== null) {\n    const desc = getOwnPropertyDescriptor(object, prop);\n    if (desc) {\n      if (desc.get) {\n        return unapply(desc.get);\n      }\n      if (typeof desc.value === 'function') {\n        return unapply(desc.value);\n      }\n    }\n    object = getPrototypeOf(object);\n  }\n  function fallbackValue() {\n    return null;\n  }\n  return fallbackValue;\n}\n\nconst html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'section', 'select', 'shadow', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']);\nconst svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);\nconst svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']);\n// List of SVG elements that are disallowed by default.\n// We still need to know them so that we can do namespace\n// checks properly in case one wants to add them to\n// allow-list.\nconst svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'foreignobject', 'hatch', 'hatchpath', 'mesh', 'meshgradient', 'meshpatch', 'meshrow', 'missing-glyph', 'script', 'set', 'solidcolor', 'unknown', 'use']);\nconst mathMl$1 = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover', 'mprescripts']);\n// Similarly to SVG, we want to know all MathML elements,\n// even those that we disallow by default.\nconst mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);\nconst text = freeze(['#text']);\n\nconst html = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'pattern', 'placeholder', 'playsinline', 'popover', 'popovertarget', 'popovertargetaction', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'wrap', 'xmlns', 'slot']);\nconst svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'amplitude', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dur', 'edgemode', 'elevation', 'end', 'exponent', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'intercept', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'slope', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'tablevalues', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']);\nconst mathMl = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnsalign', 'columnlines', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lspace', 'lquote', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']);\nconst xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);\n\n// eslint-disable-next-line unicorn/better-regex\nconst MUSTACHE_EXPR = seal(/\\{\\{[\\w\\W]*|[\\w\\W]*\\}\\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode\nconst ERB_EXPR = seal(/<%[\\w\\W]*|[\\w\\W]*%>/gm);\nconst TMPLIT_EXPR = seal(/\\$\\{[\\w\\W]*/gm); // eslint-disable-line unicorn/better-regex\nconst DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]+$/); // eslint-disable-line no-useless-escape\nconst ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\nconst IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n);\nconst IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\nconst ATTR_WHITESPACE = seal(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n);\nconst DOCTYPE_NAME = seal(/^html$/i);\nconst CUSTOM_ELEMENT = seal(/^[a-z][.\\w]*(-[.\\w]+)+$/i);\n\nvar EXPRESSIONS = /*#__PURE__*/Object.freeze({\n  __proto__: null,\n  ARIA_ATTR: ARIA_ATTR,\n  ATTR_WHITESPACE: ATTR_WHITESPACE,\n  CUSTOM_ELEMENT: CUSTOM_ELEMENT,\n  DATA_ATTR: DATA_ATTR,\n  DOCTYPE_NAME: DOCTYPE_NAME,\n  ERB_EXPR: ERB_EXPR,\n  IS_ALLOWED_URI: IS_ALLOWED_URI,\n  IS_SCRIPT_OR_DATA: IS_SCRIPT_OR_DATA,\n  MUSTACHE_EXPR: MUSTACHE_EXPR,\n  TMPLIT_EXPR: TMPLIT_EXPR\n});\n\n/* eslint-disable @typescript-eslint/indent */\n// https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\nconst NODE_TYPE = {\n  element: 1,\n  attribute: 2,\n  text: 3,\n  cdataSection: 4,\n  entityReference: 5,\n  // Deprecated\n  entityNode: 6,\n  // Deprecated\n  progressingInstruction: 7,\n  comment: 8,\n  document: 9,\n  documentType: 10,\n  documentFragment: 11,\n  notation: 12 // Deprecated\n};\nconst getGlobal = function getGlobal() {\n  return typeof window === 'undefined' ? null : window;\n};\n/**\n * Creates a no-op policy for internal use only.\n * Don't export this function outside this module!\n * @param trustedTypes The policy factory.\n * @param purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix).\n * @return The policy created (or null, if Trusted Types\n * are not supported or creating the policy failed).\n */\nconst _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, purifyHostElement) {\n  if (typeof trustedTypes !== 'object' || typeof trustedTypes.createPolicy !== 'function') {\n    return null;\n  }\n  // Allow the callers to control the unique policy name\n  // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n  // Policy creation with duplicate names throws in Trusted Types.\n  let suffix = null;\n  const ATTR_NAME = 'data-tt-policy-suffix';\n  if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) {\n    suffix = purifyHostElement.getAttribute(ATTR_NAME);\n  }\n  const policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n  try {\n    return trustedTypes.createPolicy(policyName, {\n      createHTML(html) {\n        return html;\n      },\n      createScriptURL(scriptUrl) {\n        return scriptUrl;\n      }\n    });\n  } catch (_) {\n    // Policy creation failed (most likely another DOMPurify script has\n    // already run). Skip creating the policy, as this will only cause errors\n    // if TT are enforced.\n    console.warn('TrustedTypes policy ' + policyName + ' could not be created.');\n    return null;\n  }\n};\nconst _createHooksMap = function _createHooksMap() {\n  return {\n    afterSanitizeAttributes: [],\n    afterSanitizeElements: [],\n    afterSanitizeShadowDOM: [],\n    beforeSanitizeAttributes: [],\n    beforeSanitizeElements: [],\n    beforeSanitizeShadowDOM: [],\n    uponSanitizeAttribute: [],\n    uponSanitizeElement: [],\n    uponSanitizeShadowNode: []\n  };\n};\nfunction createDOMPurify() {\n  let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();\n  const DOMPurify = root => createDOMPurify(root);\n  DOMPurify.version = '3.2.4';\n  DOMPurify.removed = [];\n  if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document || !window.Element) {\n    // Not running in a browser, provide a factory function\n    // so that you can pass your own Window\n    DOMPurify.isSupported = false;\n    return DOMPurify;\n  }\n  let {\n    document\n  } = window;\n  const originalDocument = document;\n  const currentScript = originalDocument.currentScript;\n  const {\n    DocumentFragment,\n    HTMLTemplateElement,\n    Node,\n    Element,\n    NodeFilter,\n    NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap,\n    HTMLFormElement,\n    DOMParser,\n    trustedTypes\n  } = window;\n  const ElementPrototype = Element.prototype;\n  const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n  const remove = lookupGetter(ElementPrototype, 'remove');\n  const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n  const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n  const getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n  // As per issue #47, the web-components registry is inherited by a\n  // new document created via createHTMLDocument. As per the spec\n  // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n  // a new empty registry is used when creating a template contents owner\n  // document, so we use that as our parent document to ensure nothing\n  // is inherited.\n  if (typeof HTMLTemplateElement === 'function') {\n    const template = document.createElement('template');\n    if (template.content && template.content.ownerDocument) {\n      document = template.content.ownerDocument;\n    }\n  }\n  let trustedTypesPolicy;\n  let emptyHTML = '';\n  const {\n    implementation,\n    createNodeIterator,\n    createDocumentFragment,\n    getElementsByTagName\n  } = document;\n  const {\n    importNode\n  } = originalDocument;\n  let hooks = _createHooksMap();\n  /**\n   * Expose whether this browser supports running the full DOMPurify.\n   */\n  DOMPurify.isSupported = typeof entries === 'function' && typeof getParentNode === 'function' && implementation && implementation.createHTMLDocument !== undefined;\n  const {\n    MUSTACHE_EXPR,\n    ERB_EXPR,\n    TMPLIT_EXPR,\n    DATA_ATTR,\n    ARIA_ATTR,\n    IS_SCRIPT_OR_DATA,\n    ATTR_WHITESPACE,\n    CUSTOM_ELEMENT\n  } = EXPRESSIONS;\n  let {\n    IS_ALLOWED_URI: IS_ALLOWED_URI$1\n  } = EXPRESSIONS;\n  /**\n   * We consider the elements and attributes below to be safe. Ideally\n   * don't add any new ones but feel free to remove unwanted ones.\n   */\n  /* allowed element names */\n  let ALLOWED_TAGS = null;\n  const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]);\n  /* Allowed attribute names */\n  let ALLOWED_ATTR = null;\n  const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]);\n  /*\n   * Configure how DOMPurify should handle custom elements and their attributes as well as customized built-in elements.\n   * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n   * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n   * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n   */\n  let CUSTOM_ELEMENT_HANDLING = Object.seal(create(null, {\n    tagNameCheck: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: null\n    },\n    attributeNameCheck: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: null\n    },\n    allowCustomizedBuiltInElements: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: false\n    }\n  }));\n  /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n  let FORBID_TAGS = null;\n  /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n  let FORBID_ATTR = null;\n  /* Decide if ARIA attributes are okay */\n  let ALLOW_ARIA_ATTR = true;\n  /* Decide if custom data attributes are okay */\n  let ALLOW_DATA_ATTR = true;\n  /* Decide if unknown protocols are okay */\n  let ALLOW_UNKNOWN_PROTOCOLS = false;\n  /* Decide if self-closing tags in attributes are allowed.\n   * Usually removed due to a mXSS issue in jQuery 3.0 */\n  let ALLOW_SELF_CLOSE_IN_ATTR = true;\n  /* Output should be safe for common template engines.\n   * This means, DOMPurify removes data attributes, mustaches and ERB\n   */\n  let SAFE_FOR_TEMPLATES = false;\n  /* Output should be safe even for XML used within HTML and alike.\n   * This means, DOMPurify removes comments when containing risky content.\n   */\n  let SAFE_FOR_XML = true;\n  /* Decide if document with <html>... should be returned */\n  let WHOLE_DOCUMENT = false;\n  /* Track whether config is already set on this instance of DOMPurify. */\n  let SET_CONFIG = false;\n  /* Decide if all elements (e.g. style, script) must be children of\n   * document.body. By default, browsers might move them to document.head */\n  let FORCE_BODY = false;\n  /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n   * string (or a TrustedHTML object if Trusted Types are supported).\n   * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n   */\n  let RETURN_DOM = false;\n  /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n   * string  (or a TrustedHTML object if Trusted Types are supported) */\n  let RETURN_DOM_FRAGMENT = false;\n  /* Try to return a Trusted Type object instead of a string, return a string in\n   * case Trusted Types are not supported  */\n  let RETURN_TRUSTED_TYPE = false;\n  /* Output should be free from DOM clobbering attacks?\n   * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n   */\n  let SANITIZE_DOM = true;\n  /* Achieve full DOM Clobbering protection by isolating the namespace of named\n   * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n   *\n   * HTML/DOM spec rules that enable DOM Clobbering:\n   *   - Named Access on Window (§7.3.3)\n   *   - DOM Tree Accessors (§3.1.5)\n   *   - Form Element Parent-Child Relations (§4.10.3)\n   *   - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n   *   - HTMLCollection (§4.2.10.2)\n   *\n   * Namespace isolation is implemented by prefixing `id` and `name` attributes\n   * with a constant string, i.e., `user-content-`\n   */\n  let SANITIZE_NAMED_PROPS = false;\n  const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n  /* Keep element content when removing element? */\n  let KEEP_CONTENT = true;\n  /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n   * of importing it into a new Document and returning a sanitized copy */\n  let IN_PLACE = false;\n  /* Allow usage of profiles like html, svg and mathMl */\n  let USE_PROFILES = {};\n  /* Tags to ignore content of when KEEP_CONTENT is true */\n  let FORBID_CONTENTS = null;\n  const DEFAULT_FORBID_CONTENTS = addToSet({}, ['annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'noscript', 'plaintext', 'script', 'style', 'svg', 'template', 'thead', 'title', 'video', 'xmp']);\n  /* Tags that are safe for data: URIs */\n  let DATA_URI_TAGS = null;\n  const DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);\n  /* Attributes safe for values like \"javascript:\" */\n  let URI_SAFE_ATTRIBUTES = null;\n  const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']);\n  const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n  const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n  const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n  /* Document namespace */\n  let NAMESPACE = HTML_NAMESPACE;\n  let IS_EMPTY_INPUT = false;\n  /* Allowed XHTML+XML namespaces */\n  let ALLOWED_NAMESPACES = null;\n  const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString);\n  let MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']);\n  let HTML_INTEGRATION_POINTS = addToSet({}, ['annotation-xml']);\n  // Certain elements are allowed in both SVG and HTML\n  // namespace. We need to specify them explicitly\n  // so that they don't get erroneously deleted from\n  // HTML namespace.\n  const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']);\n  /* Parsing of strict XHTML documents */\n  let PARSER_MEDIA_TYPE = null;\n  const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];\n  const DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\n  let transformCaseFunc = null;\n  /* Keep a reference to config to pass to hooks */\n  let CONFIG = null;\n  /* Ideally, do not touch anything below this line */\n  /* ______________________________________________ */\n  const formElement = document.createElement('form');\n  const isRegexOrFunction = function isRegexOrFunction(testValue) {\n    return testValue instanceof RegExp || testValue instanceof Function;\n  };\n  /**\n   * _parseConfig\n   *\n   * @param cfg optional config literal\n   */\n  // eslint-disable-next-line complexity\n  const _parseConfig = function _parseConfig() {\n    let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    if (CONFIG && CONFIG === cfg) {\n      return;\n    }\n    /* Shield configuration object from tampering */\n    if (!cfg || typeof cfg !== 'object') {\n      cfg = {};\n    }\n    /* Shield configuration object from prototype pollution */\n    cfg = clone(cfg);\n    PARSER_MEDIA_TYPE =\n    // eslint-disable-next-line unicorn/prefer-includes\n    SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? DEFAULT_PARSER_MEDIA_TYPE : cfg.PARSER_MEDIA_TYPE;\n    // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.\n    transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase;\n    /* Set configuration parameters */\n    ALLOWED_TAGS = objectHasOwnProperty(cfg, 'ALLOWED_TAGS') ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS;\n    ALLOWED_ATTR = objectHasOwnProperty(cfg, 'ALLOWED_ATTR') ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR;\n    ALLOWED_NAMESPACES = objectHasOwnProperty(cfg, 'ALLOWED_NAMESPACES') ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString) : DEFAULT_ALLOWED_NAMESPACES;\n    URI_SAFE_ATTRIBUTES = objectHasOwnProperty(cfg, 'ADD_URI_SAFE_ATTR') ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), cfg.ADD_URI_SAFE_ATTR, transformCaseFunc) : DEFAULT_URI_SAFE_ATTRIBUTES;\n    DATA_URI_TAGS = objectHasOwnProperty(cfg, 'ADD_DATA_URI_TAGS') ? addToSet(clone(DEFAULT_DATA_URI_TAGS), cfg.ADD_DATA_URI_TAGS, transformCaseFunc) : DEFAULT_DATA_URI_TAGS;\n    FORBID_CONTENTS = objectHasOwnProperty(cfg, 'FORBID_CONTENTS') ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS;\n    FORBID_TAGS = objectHasOwnProperty(cfg, 'FORBID_TAGS') ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : {};\n    FORBID_ATTR = objectHasOwnProperty(cfg, 'FORBID_ATTR') ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : {};\n    USE_PROFILES = objectHasOwnProperty(cfg, 'USE_PROFILES') ? cfg.USE_PROFILES : false;\n    ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\n    ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\n    ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\n    ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true\n    SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\n    SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false; // Default true\n    WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\n    RETURN_DOM = cfg.RETURN_DOM || false; // Default false\n    RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\n    RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\n    FORCE_BODY = cfg.FORCE_BODY || false; // Default false\n    SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\n    SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false\n    KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n    IN_PLACE = cfg.IN_PLACE || false; // Default false\n    IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI;\n    NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n    MATHML_TEXT_INTEGRATION_POINTS = cfg.MATHML_TEXT_INTEGRATION_POINTS || MATHML_TEXT_INTEGRATION_POINTS;\n    HTML_INTEGRATION_POINTS = cfg.HTML_INTEGRATION_POINTS || HTML_INTEGRATION_POINTS;\n    CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};\n    if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) {\n      CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;\n    }\n    if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) {\n      CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck;\n    }\n    if (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === 'boolean') {\n      CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements;\n    }\n    if (SAFE_FOR_TEMPLATES) {\n      ALLOW_DATA_ATTR = false;\n    }\n    if (RETURN_DOM_FRAGMENT) {\n      RETURN_DOM = true;\n    }\n    /* Parse profile info */\n    if (USE_PROFILES) {\n      ALLOWED_TAGS = addToSet({}, text);\n      ALLOWED_ATTR = [];\n      if (USE_PROFILES.html === true) {\n        addToSet(ALLOWED_TAGS, html$1);\n        addToSet(ALLOWED_ATTR, html);\n      }\n      if (USE_PROFILES.svg === true) {\n        addToSet(ALLOWED_TAGS, svg$1);\n        addToSet(ALLOWED_ATTR, svg);\n        addToSet(ALLOWED_ATTR, xml);\n      }\n      if (USE_PROFILES.svgFilters === true) {\n        addToSet(ALLOWED_TAGS, svgFilters);\n        addToSet(ALLOWED_ATTR, svg);\n        addToSet(ALLOWED_ATTR, xml);\n      }\n      if (USE_PROFILES.mathMl === true) {\n        addToSet(ALLOWED_TAGS, mathMl$1);\n        addToSet(ALLOWED_ATTR, mathMl);\n        addToSet(ALLOWED_ATTR, xml);\n      }\n    }\n    /* Merge configuration parameters */\n    if (cfg.ADD_TAGS) {\n      if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n        ALLOWED_TAGS = clone(ALLOWED_TAGS);\n      }\n      addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n    }\n    if (cfg.ADD_ATTR) {\n      if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n        ALLOWED_ATTR = clone(ALLOWED_ATTR);\n      }\n      addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n    }\n    if (cfg.ADD_URI_SAFE_ATTR) {\n      addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);\n    }\n    if (cfg.FORBID_CONTENTS) {\n      if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n        FORBID_CONTENTS = clone(FORBID_CONTENTS);\n      }\n      addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);\n    }\n    /* Add #text in case KEEP_CONTENT is set to true */\n    if (KEEP_CONTENT) {\n      ALLOWED_TAGS['#text'] = true;\n    }\n    /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\n    if (WHOLE_DOCUMENT) {\n      addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);\n    }\n    /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\n    if (ALLOWED_TAGS.table) {\n      addToSet(ALLOWED_TAGS, ['tbody']);\n      delete FORBID_TAGS.tbody;\n    }\n    if (cfg.TRUSTED_TYPES_POLICY) {\n      if (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== 'function') {\n        throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createHTML\" hook.');\n      }\n      if (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== 'function') {\n        throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createScriptURL\" hook.');\n      }\n      // Overwrite existing TrustedTypes policy.\n      trustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY;\n      // Sign local variables required by `sanitize`.\n      emptyHTML = trustedTypesPolicy.createHTML('');\n    } else {\n      // Uninitialized policy, attempt to initialize the internal dompurify policy.\n      if (trustedTypesPolicy === undefined) {\n        trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript);\n      }\n      // If creating the internal policy succeeded sign internal variables.\n      if (trustedTypesPolicy !== null && typeof emptyHTML === 'string') {\n        emptyHTML = trustedTypesPolicy.createHTML('');\n      }\n    }\n    // Prevent further manipulation of configuration.\n    // Not available in IE8, Safari 5, etc.\n    if (freeze) {\n      freeze(cfg);\n    }\n    CONFIG = cfg;\n  };\n  /* Keep track of all possible SVG and MathML tags\n   * so that we can perform the namespace checks\n   * correctly. */\n  const ALL_SVG_TAGS = addToSet({}, [...svg$1, ...svgFilters, ...svgDisallowed]);\n  const ALL_MATHML_TAGS = addToSet({}, [...mathMl$1, ...mathMlDisallowed]);\n  /**\n   * @param element a DOM element whose namespace is being checked\n   * @returns Return false if the element has a\n   *  namespace that a spec-compliant parser would never\n   *  return. Return true otherwise.\n   */\n  const _checkValidNamespace = function _checkValidNamespace(element) {\n    let parent = getParentNode(element);\n    // In JSDOM, if we're inside shadow DOM, then parentNode\n    // can be null. We just simulate parent in this case.\n    if (!parent || !parent.tagName) {\n      parent = {\n        namespaceURI: NAMESPACE,\n        tagName: 'template'\n      };\n    }\n    const tagName = stringToLowerCase(element.tagName);\n    const parentTagName = stringToLowerCase(parent.tagName);\n    if (!ALLOWED_NAMESPACES[element.namespaceURI]) {\n      return false;\n    }\n    if (element.namespaceURI === SVG_NAMESPACE) {\n      // The only way to switch from HTML namespace to SVG\n      // is via <svg>. If it happens via any other tag, then\n      // it should be killed.\n      if (parent.namespaceURI === HTML_NAMESPACE) {\n        return tagName === 'svg';\n      }\n      // The only way to switch from MathML to SVG is via`\n      // svg if parent is either <annotation-xml> or MathML\n      // text integration points.\n      if (parent.namespaceURI === MATHML_NAMESPACE) {\n        return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);\n      }\n      // We only allow elements that are defined in SVG\n      // spec. All others are disallowed in SVG namespace.\n      return Boolean(ALL_SVG_TAGS[tagName]);\n    }\n    if (element.namespaceURI === MATHML_NAMESPACE) {\n      // The only way to switch from HTML namespace to MathML\n      // is via <math>. If it happens via any other tag, then\n      // it should be killed.\n      if (parent.namespaceURI === HTML_NAMESPACE) {\n        return tagName === 'math';\n      }\n      // The only way to switch from SVG to MathML is via\n      // <math> and HTML integration points\n      if (parent.namespaceURI === SVG_NAMESPACE) {\n        return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n      }\n      // We only allow elements that are defined in MathML\n      // spec. All others are disallowed in MathML namespace.\n      return Boolean(ALL_MATHML_TAGS[tagName]);\n    }\n    if (element.namespaceURI === HTML_NAMESPACE) {\n      // The only way to switch from SVG to HTML is via\n      // HTML integration points, and from MathML to HTML\n      // is via MathML text integration points\n      if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {\n        return false;\n      }\n      if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {\n        return false;\n      }\n      // We disallow tags that are specific for MathML\n      // or SVG and should never appear in HTML namespace\n      return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);\n    }\n    // For XHTML and XML documents that support custom namespaces\n    if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && ALLOWED_NAMESPACES[element.namespaceURI]) {\n      return true;\n    }\n    // The code should never reach this place (this means\n    // that the element somehow got namespace that is not\n    // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).\n    // Return false just in case.\n    return false;\n  };\n  /**\n   * _forceRemove\n   *\n   * @param node a DOM node\n   */\n  const _forceRemove = function _forceRemove(node) {\n    arrayPush(DOMPurify.removed, {\n      element: node\n    });\n    try {\n      // eslint-disable-next-line unicorn/prefer-dom-node-remove\n      getParentNode(node).removeChild(node);\n    } catch (_) {\n      remove(node);\n    }\n  };\n  /**\n   * _removeAttribute\n   *\n   * @param name an Attribute name\n   * @param element a DOM node\n   */\n  const _removeAttribute = function _removeAttribute(name, element) {\n    try {\n      arrayPush(DOMPurify.removed, {\n        attribute: element.getAttributeNode(name),\n        from: element\n      });\n    } catch (_) {\n      arrayPush(DOMPurify.removed, {\n        attribute: null,\n        from: element\n      });\n    }\n    element.removeAttribute(name);\n    // We void attribute values for unremovable \"is\" attributes\n    if (name === 'is') {\n      if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n        try {\n          _forceRemove(element);\n        } catch (_) {}\n      } else {\n        try {\n          element.setAttribute(name, '');\n        } catch (_) {}\n      }\n    }\n  };\n  /**\n   * _initDocument\n   *\n   * @param dirty - a string of dirty markup\n   * @return a DOM, filled with the dirty markup\n   */\n  const _initDocument = function _initDocument(dirty) {\n    /* Create a HTML document */\n    let doc = null;\n    let leadingWhitespace = null;\n    if (FORCE_BODY) {\n      dirty = '<remove></remove>' + dirty;\n    } else {\n      /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\n      const matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n      leadingWhitespace = matches && matches[0];\n    }\n    if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && NAMESPACE === HTML_NAMESPACE) {\n      // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)\n      dirty = '<html xmlns=\"http://www.w3.org/1999/xhtml\"><head></head><body>' + dirty + '</body></html>';\n    }\n    const dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;\n    /*\n     * Use the DOMParser API by default, fallback later if needs be\n     * DOMParser not work for svg when has multiple root element.\n     */\n    if (NAMESPACE === HTML_NAMESPACE) {\n      try {\n        doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n      } catch (_) {}\n    }\n    /* Use createHTMLDocument in case DOMParser is not available */\n    if (!doc || !doc.documentElement) {\n      doc = implementation.createDocument(NAMESPACE, 'template', null);\n      try {\n        doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;\n      } catch (_) {\n        // Syntax error if dirtyPayload is invalid xml\n      }\n    }\n    const body = doc.body || doc.documentElement;\n    if (dirty && leadingWhitespace) {\n      body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);\n    }\n    /* Work on whole document or just its body */\n    if (NAMESPACE === HTML_NAMESPACE) {\n      return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];\n    }\n    return WHOLE_DOCUMENT ? doc.documentElement : body;\n  };\n  /**\n   * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document.\n   *\n   * @param root The root element or node to start traversing on.\n   * @return The created NodeIterator\n   */\n  const _createNodeIterator = function _createNodeIterator(root) {\n    return createNodeIterator.call(root.ownerDocument || root, root,\n    // eslint-disable-next-line no-bitwise\n    NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_PROCESSING_INSTRUCTION | NodeFilter.SHOW_CDATA_SECTION, null);\n  };\n  /**\n   * _isClobbered\n   *\n   * @param element element to check for clobbering attacks\n   * @return true if clobbered, false if safe\n   */\n  const _isClobbered = function _isClobbered(element) {\n    return element instanceof HTMLFormElement && (typeof element.nodeName !== 'string' || typeof element.textContent !== 'string' || typeof element.removeChild !== 'function' || !(element.attributes instanceof NamedNodeMap) || typeof element.removeAttribute !== 'function' || typeof element.setAttribute !== 'function' || typeof element.namespaceURI !== 'string' || typeof element.insertBefore !== 'function' || typeof element.hasChildNodes !== 'function');\n  };\n  /**\n   * Checks whether the given object is a DOM node.\n   *\n   * @param value object to check whether it's a DOM node\n   * @return true is object is a DOM node\n   */\n  const _isNode = function _isNode(value) {\n    return typeof Node === 'function' && value instanceof Node;\n  };\n  function _executeHooks(hooks, currentNode, data) {\n    arrayForEach(hooks, hook => {\n      hook.call(DOMPurify, currentNode, data, CONFIG);\n    });\n  }\n  /**\n   * _sanitizeElements\n   *\n   * @protect nodeName\n   * @protect textContent\n   * @protect removeChild\n   * @param currentNode to check for permission to exist\n   * @return true if node was killed, false if left alive\n   */\n  const _sanitizeElements = function _sanitizeElements(currentNode) {\n    let content = null;\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeElements, currentNode, null);\n    /* Check if element is clobbered or can clobber */\n    if (_isClobbered(currentNode)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Now let's check the element's type and name */\n    const tagName = transformCaseFunc(currentNode.nodeName);\n    /* Execute a hook if present */\n    _executeHooks(hooks.uponSanitizeElement, currentNode, {\n      tagName,\n      allowedTags: ALLOWED_TAGS\n    });\n    /* Detect mXSS attempts abusing namespace confusion */\n    if (currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(/<[/\\w]/g, currentNode.innerHTML) && regExpTest(/<[/\\w]/g, currentNode.textContent)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Remove any occurrence of processing instructions */\n    if (currentNode.nodeType === NODE_TYPE.progressingInstruction) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Remove any kind of possibly harmful comments */\n    if (SAFE_FOR_XML && currentNode.nodeType === NODE_TYPE.comment && regExpTest(/<[/\\w]/g, currentNode.data)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Remove element if anything forbids its presence */\n    if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n      /* Check if we have a custom element to handle */\n      if (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName)) {\n        if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) {\n          return false;\n        }\n        if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) {\n          return false;\n        }\n      }\n      /* Keep content except for bad-listed elements */\n      if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\n        const parentNode = getParentNode(currentNode) || currentNode.parentNode;\n        const childNodes = getChildNodes(currentNode) || currentNode.childNodes;\n        if (childNodes && parentNode) {\n          const childCount = childNodes.length;\n          for (let i = childCount - 1; i >= 0; --i) {\n            const childClone = cloneNode(childNodes[i], true);\n            childClone.__removalCount = (currentNode.__removalCount || 0) + 1;\n            parentNode.insertBefore(childClone, getNextSibling(currentNode));\n          }\n        }\n      }\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Check whether element has a valid namespace */\n    if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Make sure that older browsers don't get fallback-tag mXSS */\n    if ((tagName === 'noscript' || tagName === 'noembed' || tagName === 'noframes') && regExpTest(/<\\/no(script|embed|frames)/i, currentNode.innerHTML)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Sanitize element content to be template-safe */\n    if (SAFE_FOR_TEMPLATES && currentNode.nodeType === NODE_TYPE.text) {\n      /* Get the element's text content */\n      content = currentNode.textContent;\n      arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n        content = stringReplace(content, expr, ' ');\n      });\n      if (currentNode.textContent !== content) {\n        arrayPush(DOMPurify.removed, {\n          element: currentNode.cloneNode()\n        });\n        currentNode.textContent = content;\n      }\n    }\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeElements, currentNode, null);\n    return false;\n  };\n  /**\n   * _isValidAttribute\n   *\n   * @param lcTag Lowercase tag name of containing element.\n   * @param lcName Lowercase attribute name.\n   * @param value Attribute value.\n   * @return Returns true if `value` is valid, otherwise false.\n   */\n  // eslint-disable-next-line complexity\n  const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {\n    /* Make sure attribute cannot clobber */\n    if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {\n      return false;\n    }\n    /* Allow valid data-* attributes: At least one character after \"-\"\n        (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)\n        XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)\n        We don't need to check the value; it's always URI safe. */\n    if (ALLOW_DATA_ATTR && !FORBID_ATTR[lcName] && regExpTest(DATA_ATTR, lcName)) ; else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR, lcName)) ; else if (!ALLOWED_ATTR[lcName] || FORBID_ATTR[lcName]) {\n      if (\n      // First condition does a very basic check if a) it's basically a valid custom element tagname AND\n      // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n      // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck\n      _isBasicCustomElement(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName)) ||\n      // Alternative, second condition checks if it's an `is`-attribute, AND\n      // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n      lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))) ; else {\n        return false;\n      }\n      /* Check value is safe. First, is attr inert? If so, is safe */\n    } else if (URI_SAFE_ATTRIBUTES[lcName]) ; else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]) ; else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if (value) {\n      return false;\n    } else ;\n    return true;\n  };\n  /**\n   * _isBasicCustomElement\n   * checks if at least one dash is included in tagName, and it's not the first char\n   * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name\n   *\n   * @param tagName name of the tag of the node to sanitize\n   * @returns Returns true if the tag name meets the basic criteria for a custom element, otherwise false.\n   */\n  const _isBasicCustomElement = function _isBasicCustomElement(tagName) {\n    return tagName !== 'annotation-xml' && stringMatch(tagName, CUSTOM_ELEMENT);\n  };\n  /**\n   * _sanitizeAttributes\n   *\n   * @protect attributes\n   * @protect nodeName\n   * @protect removeAttribute\n   * @protect setAttribute\n   *\n   * @param currentNode to sanitize\n   */\n  const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeAttributes, currentNode, null);\n    const {\n      attributes\n    } = currentNode;\n    /* Check if we have attributes; if not we might have a text node */\n    if (!attributes || _isClobbered(currentNode)) {\n      return;\n    }\n    const hookEvent = {\n      attrName: '',\n      attrValue: '',\n      keepAttr: true,\n      allowedAttributes: ALLOWED_ATTR,\n      forceKeepAttr: undefined\n    };\n    let l = attributes.length;\n    /* Go backwards over all attributes; safely remove bad ones */\n    while (l--) {\n      const attr = attributes[l];\n      const {\n        name,\n        namespaceURI,\n        value: attrValue\n      } = attr;\n      const lcName = transformCaseFunc(name);\n      let value = name === 'value' ? attrValue : stringTrim(attrValue);\n      /* Execute a hook if present */\n      hookEvent.attrName = lcName;\n      hookEvent.attrValue = value;\n      hookEvent.keepAttr = true;\n      hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set\n      _executeHooks(hooks.uponSanitizeAttribute, currentNode, hookEvent);\n      value = hookEvent.attrValue;\n      /* Full DOM Clobbering protection via namespace isolation,\n       * Prefix id and name attributes with `user-content-`\n       */\n      if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name')) {\n        // Remove the attribute with this value\n        _removeAttribute(name, currentNode);\n        // Prefix the value and later re-create the attribute with the sanitized value\n        value = SANITIZE_NAMED_PROPS_PREFIX + value;\n      }\n      /* Work around a security issue with comments inside attributes */\n      if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\\/(style|title)/i, value)) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Did the hooks approve of the attribute? */\n      if (hookEvent.forceKeepAttr) {\n        continue;\n      }\n      /* Remove attribute */\n      _removeAttribute(name, currentNode);\n      /* Did the hooks approve of the attribute? */\n      if (!hookEvent.keepAttr) {\n        continue;\n      }\n      /* Work around a security issue in jQuery 3.0 */\n      if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(/\\/>/i, value)) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Sanitize attribute content to be template-safe */\n      if (SAFE_FOR_TEMPLATES) {\n        arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n          value = stringReplace(value, expr, ' ');\n        });\n      }\n      /* Is `value` valid for this attribute? */\n      const lcTag = transformCaseFunc(currentNode.nodeName);\n      if (!_isValidAttribute(lcTag, lcName, value)) {\n        continue;\n      }\n      /* Handle attributes that require Trusted Types */\n      if (trustedTypesPolicy && typeof trustedTypes === 'object' && typeof trustedTypes.getAttributeType === 'function') {\n        if (namespaceURI) ; else {\n          switch (trustedTypes.getAttributeType(lcTag, lcName)) {\n            case 'TrustedHTML':\n              {\n                value = trustedTypesPolicy.createHTML(value);\n                break;\n              }\n            case 'TrustedScriptURL':\n              {\n                value = trustedTypesPolicy.createScriptURL(value);\n                break;\n              }\n          }\n        }\n      }\n      /* Handle invalid data-* attribute set by try-catching it */\n      try {\n        if (namespaceURI) {\n          currentNode.setAttributeNS(namespaceURI, name, value);\n        } else {\n          /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. \"x-schema\". */\n          currentNode.setAttribute(name, value);\n        }\n        if (_isClobbered(currentNode)) {\n          _forceRemove(currentNode);\n        } else {\n          arrayPop(DOMPurify.removed);\n        }\n      } catch (_) {}\n    }\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeAttributes, currentNode, null);\n  };\n  /**\n   * _sanitizeShadowDOM\n   *\n   * @param fragment to iterate over recursively\n   */\n  const _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) {\n    let shadowNode = null;\n    const shadowIterator = _createNodeIterator(fragment);\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeShadowDOM, fragment, null);\n    while (shadowNode = shadowIterator.nextNode()) {\n      /* Execute a hook if present */\n      _executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null);\n      /* Sanitize tags and elements */\n      _sanitizeElements(shadowNode);\n      /* Check attributes next */\n      _sanitizeAttributes(shadowNode);\n      /* Deep shadow DOM detected */\n      if (shadowNode.content instanceof DocumentFragment) {\n        _sanitizeShadowDOM(shadowNode.content);\n      }\n    }\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeShadowDOM, fragment, null);\n  };\n  // eslint-disable-next-line complexity\n  DOMPurify.sanitize = function (dirty) {\n    let cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    let body = null;\n    let importedNode = null;\n    let currentNode = null;\n    let returnNode = null;\n    /* Make sure we have a string to sanitize.\n      DO NOT return early, as this will return the wrong type if\n      the user has requested a DOM object rather than a string */\n    IS_EMPTY_INPUT = !dirty;\n    if (IS_EMPTY_INPUT) {\n      dirty = '<!-->';\n    }\n    /* Stringify, in case dirty is an object */\n    if (typeof dirty !== 'string' && !_isNode(dirty)) {\n      if (typeof dirty.toString === 'function') {\n        dirty = dirty.toString();\n        if (typeof dirty !== 'string') {\n          throw typeErrorCreate('dirty is not a string, aborting');\n        }\n      } else {\n        throw typeErrorCreate('toString is not a function');\n      }\n    }\n    /* Return dirty HTML if DOMPurify cannot run */\n    if (!DOMPurify.isSupported) {\n      return dirty;\n    }\n    /* Assign config vars */\n    if (!SET_CONFIG) {\n      _parseConfig(cfg);\n    }\n    /* Clean up removed elements */\n    DOMPurify.removed = [];\n    /* Check if dirty is correctly typed for IN_PLACE */\n    if (typeof dirty === 'string') {\n      IN_PLACE = false;\n    }\n    if (IN_PLACE) {\n      /* Do some early pre-sanitization to avoid unsafe root nodes */\n      if (dirty.nodeName) {\n        const tagName = transformCaseFunc(dirty.nodeName);\n        if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n          throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');\n        }\n      }\n    } else if (dirty instanceof Node) {\n      /* If dirty is a DOM element, append to an empty document to avoid\n         elements being stripped by the parser */\n      body = _initDocument('<!---->');\n      importedNode = body.ownerDocument.importNode(dirty, true);\n      if (importedNode.nodeType === NODE_TYPE.element && importedNode.nodeName === 'BODY') {\n        /* Node is already a body, use as is */\n        body = importedNode;\n      } else if (importedNode.nodeName === 'HTML') {\n        body = importedNode;\n      } else {\n        // eslint-disable-next-line unicorn/prefer-dom-node-append\n        body.appendChild(importedNode);\n      }\n    } else {\n      /* Exit directly if we have nothing to do */\n      if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT &&\n      // eslint-disable-next-line unicorn/prefer-includes\n      dirty.indexOf('<') === -1) {\n        return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty;\n      }\n      /* Initialize the document to work on */\n      body = _initDocument(dirty);\n      /* Check we have a DOM node from the data */\n      if (!body) {\n        return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';\n      }\n    }\n    /* Remove first element node (ours) if FORCE_BODY is set */\n    if (body && FORCE_BODY) {\n      _forceRemove(body.firstChild);\n    }\n    /* Get node iterator */\n    const nodeIterator = _createNodeIterator(IN_PLACE ? dirty : body);\n    /* Now start iterating over the created document */\n    while (currentNode = nodeIterator.nextNode()) {\n      /* Sanitize tags and elements */\n      _sanitizeElements(currentNode);\n      /* Check attributes next */\n      _sanitizeAttributes(currentNode);\n      /* Shadow DOM detected, sanitize it */\n      if (currentNode.content instanceof DocumentFragment) {\n        _sanitizeShadowDOM(currentNode.content);\n      }\n    }\n    /* If we sanitized `dirty` in-place, return it. */\n    if (IN_PLACE) {\n      return dirty;\n    }\n    /* Return sanitized string or DOM */\n    if (RETURN_DOM) {\n      if (RETURN_DOM_FRAGMENT) {\n        returnNode = createDocumentFragment.call(body.ownerDocument);\n        while (body.firstChild) {\n          // eslint-disable-next-line unicorn/prefer-dom-node-append\n          returnNode.appendChild(body.firstChild);\n        }\n      } else {\n        returnNode = body;\n      }\n      if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) {\n        /*\n          AdoptNode() is not used because internal state is not reset\n          (e.g. the past names map of a HTMLFormElement), this is safe\n          in theory but we would rather not risk another attack vector.\n          The state that is cloned by importNode() is explicitly defined\n          by the specs.\n        */\n        returnNode = importNode.call(originalDocument, returnNode, true);\n      }\n      return returnNode;\n    }\n    let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\n    /* Serialize doctype if allowed */\n    if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {\n      serializedHTML = '<!DOCTYPE ' + body.ownerDocument.doctype.name + '>\\n' + serializedHTML;\n    }\n    /* Sanitize final string template-safe */\n    if (SAFE_FOR_TEMPLATES) {\n      arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n        serializedHTML = stringReplace(serializedHTML, expr, ' ');\n      });\n    }\n    return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;\n  };\n  DOMPurify.setConfig = function () {\n    let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    _parseConfig(cfg);\n    SET_CONFIG = true;\n  };\n  DOMPurify.clearConfig = function () {\n    CONFIG = null;\n    SET_CONFIG = false;\n  };\n  DOMPurify.isValidAttribute = function (tag, attr, value) {\n    /* Initialize shared config vars if necessary. */\n    if (!CONFIG) {\n      _parseConfig({});\n    }\n    const lcTag = transformCaseFunc(tag);\n    const lcName = transformCaseFunc(attr);\n    return _isValidAttribute(lcTag, lcName, value);\n  };\n  DOMPurify.addHook = function (entryPoint, hookFunction) {\n    if (typeof hookFunction !== 'function') {\n      return;\n    }\n    arrayPush(hooks[entryPoint], hookFunction);\n  };\n  DOMPurify.removeHook = function (entryPoint, hookFunction) {\n    if (hookFunction !== undefined) {\n      const index = arrayLastIndexOf(hooks[entryPoint], hookFunction);\n      return index === -1 ? undefined : arraySplice(hooks[entryPoint], index, 1)[0];\n    }\n    return arrayPop(hooks[entryPoint]);\n  };\n  DOMPurify.removeHooks = function (entryPoint) {\n    hooks[entryPoint] = [];\n  };\n  DOMPurify.removeAllHooks = function () {\n    hooks = _createHooksMap();\n  };\n  return DOMPurify;\n}\nvar purify = createDOMPurify();\n\nexport { purify as default };\n//# sourceMappingURL=purify.es.mjs.map\n","/* eslint-disable no-multi-assign */\n\nfunction deepFreeze(obj) {\n  if (obj instanceof Map) {\n    obj.clear =\n      obj.delete =\n      obj.set =\n        function () {\n          throw new Error('map is read-only');\n        };\n  } else if (obj instanceof Set) {\n    obj.add =\n      obj.clear =\n      obj.delete =\n        function () {\n          throw new Error('set is read-only');\n        };\n  }\n\n  // Freeze self\n  Object.freeze(obj);\n\n  Object.getOwnPropertyNames(obj).forEach((name) => {\n    const prop = obj[name];\n    const type = typeof prop;\n\n    // Freeze prop if it is an object or function and also not already frozen\n    if ((type === 'object' || type === 'function') && !Object.isFrozen(prop)) {\n      deepFreeze(prop);\n    }\n  });\n\n  return obj;\n}\n\n/** @typedef {import('highlight.js').CallbackResponse} CallbackResponse */\n/** @typedef {import('highlight.js').CompiledMode} CompiledMode */\n/** @implements CallbackResponse */\n\nclass Response {\n  /**\n   * @param {CompiledMode} mode\n   */\n  constructor(mode) {\n    // eslint-disable-next-line no-undefined\n    if (mode.data === undefined) mode.data = {};\n\n    this.data = mode.data;\n    this.isMatchIgnored = false;\n  }\n\n  ignoreMatch() {\n    this.isMatchIgnored = true;\n  }\n}\n\n/**\n * @param {string} value\n * @returns {string}\n */\nfunction escapeHTML(value) {\n  return value\n    .replace(/&/g, '&amp;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;')\n    .replace(/\"/g, '&quot;')\n    .replace(/'/g, '&#x27;');\n}\n\n/**\n * performs a shallow merge of multiple objects into one\n *\n * @template T\n * @param {T} original\n * @param {Record<string,any>[]} objects\n * @returns {T} a single new object\n */\nfunction inherit$1(original, ...objects) {\n  /** @type Record<string,any> */\n  const result = Object.create(null);\n\n  for (const key in original) {\n    result[key] = original[key];\n  }\n  objects.forEach(function(obj) {\n    for (const key in obj) {\n      result[key] = obj[key];\n    }\n  });\n  return /** @type {T} */ (result);\n}\n\n/**\n * @typedef {object} Renderer\n * @property {(text: string) => void} addText\n * @property {(node: Node) => void} openNode\n * @property {(node: Node) => void} closeNode\n * @property {() => string} value\n */\n\n/** @typedef {{scope?: string, language?: string, sublanguage?: boolean}} Node */\n/** @typedef {{walk: (r: Renderer) => void}} Tree */\n/** */\n\nconst SPAN_CLOSE = '</span>';\n\n/**\n * Determines if a node needs to be wrapped in <span>\n *\n * @param {Node} node */\nconst emitsWrappingTags = (node) => {\n  // rarely we can have a sublanguage where language is undefined\n  // TODO: track down why\n  return !!node.scope;\n};\n\n/**\n *\n * @param {string} name\n * @param {{prefix:string}} options\n */\nconst scopeToCSSClass = (name, { prefix }) => {\n  // sub-language\n  if (name.startsWith(\"language:\")) {\n    return name.replace(\"language:\", \"language-\");\n  }\n  // tiered scope: comment.line\n  if (name.includes(\".\")) {\n    const pieces = name.split(\".\");\n    return [\n      `${prefix}${pieces.shift()}`,\n      ...(pieces.map((x, i) => `${x}${\"_\".repeat(i + 1)}`))\n    ].join(\" \");\n  }\n  // simple scope\n  return `${prefix}${name}`;\n};\n\n/** @type {Renderer} */\nclass HTMLRenderer {\n  /**\n   * Creates a new HTMLRenderer\n   *\n   * @param {Tree} parseTree - the parse tree (must support `walk` API)\n   * @param {{classPrefix: string}} options\n   */\n  constructor(parseTree, options) {\n    this.buffer = \"\";\n    this.classPrefix = options.classPrefix;\n    parseTree.walk(this);\n  }\n\n  /**\n   * Adds texts to the output stream\n   *\n   * @param {string} text */\n  addText(text) {\n    this.buffer += escapeHTML(text);\n  }\n\n  /**\n   * Adds a node open to the output stream (if needed)\n   *\n   * @param {Node} node */\n  openNode(node) {\n    if (!emitsWrappingTags(node)) return;\n\n    const className = scopeToCSSClass(node.scope,\n      { prefix: this.classPrefix });\n    this.span(className);\n  }\n\n  /**\n   * Adds a node close to the output stream (if needed)\n   *\n   * @param {Node} node */\n  closeNode(node) {\n    if (!emitsWrappingTags(node)) return;\n\n    this.buffer += SPAN_CLOSE;\n  }\n\n  /**\n   * returns the accumulated buffer\n  */\n  value() {\n    return this.buffer;\n  }\n\n  // helpers\n\n  /**\n   * Builds a span element\n   *\n   * @param {string} className */\n  span(className) {\n    this.buffer += `<span class=\"${className}\">`;\n  }\n}\n\n/** @typedef {{scope?: string, language?: string, children: Node[]} | string} Node */\n/** @typedef {{scope?: string, language?: string, children: Node[]} } DataNode */\n/** @typedef {import('highlight.js').Emitter} Emitter */\n/**  */\n\n/** @returns {DataNode} */\nconst newNode = (opts = {}) => {\n  /** @type DataNode */\n  const result = { children: [] };\n  Object.assign(result, opts);\n  return result;\n};\n\nclass TokenTree {\n  constructor() {\n    /** @type DataNode */\n    this.rootNode = newNode();\n    this.stack = [this.rootNode];\n  }\n\n  get top() {\n    return this.stack[this.stack.length - 1];\n  }\n\n  get root() { return this.rootNode; }\n\n  /** @param {Node} node */\n  add(node) {\n    this.top.children.push(node);\n  }\n\n  /** @param {string} scope */\n  openNode(scope) {\n    /** @type Node */\n    const node = newNode({ scope });\n    this.add(node);\n    this.stack.push(node);\n  }\n\n  closeNode() {\n    if (this.stack.length > 1) {\n      return this.stack.pop();\n    }\n    // eslint-disable-next-line no-undefined\n    return undefined;\n  }\n\n  closeAllNodes() {\n    while (this.closeNode());\n  }\n\n  toJSON() {\n    return JSON.stringify(this.rootNode, null, 4);\n  }\n\n  /**\n   * @typedef { import(\"./html_renderer\").Renderer } Renderer\n   * @param {Renderer} builder\n   */\n  walk(builder) {\n    // this does not\n    return this.constructor._walk(builder, this.rootNode);\n    // this works\n    // return TokenTree._walk(builder, this.rootNode);\n  }\n\n  /**\n   * @param {Renderer} builder\n   * @param {Node} node\n   */\n  static _walk(builder, node) {\n    if (typeof node === \"string\") {\n      builder.addText(node);\n    } else if (node.children) {\n      builder.openNode(node);\n      node.children.forEach((child) => this._walk(builder, child));\n      builder.closeNode(node);\n    }\n    return builder;\n  }\n\n  /**\n   * @param {Node} node\n   */\n  static _collapse(node) {\n    if (typeof node === \"string\") return;\n    if (!node.children) return;\n\n    if (node.children.every(el => typeof el === \"string\")) {\n      // node.text = node.children.join(\"\");\n      // delete node.children;\n      node.children = [node.children.join(\"\")];\n    } else {\n      node.children.forEach((child) => {\n        TokenTree._collapse(child);\n      });\n    }\n  }\n}\n\n/**\n  Currently this is all private API, but this is the minimal API necessary\n  that an Emitter must implement to fully support the parser.\n\n  Minimal interface:\n\n  - addText(text)\n  - __addSublanguage(emitter, subLanguageName)\n  - startScope(scope)\n  - endScope()\n  - finalize()\n  - toHTML()\n\n*/\n\n/**\n * @implements {Emitter}\n */\nclass TokenTreeEmitter extends TokenTree {\n  /**\n   * @param {*} options\n   */\n  constructor(options) {\n    super();\n    this.options = options;\n  }\n\n  /**\n   * @param {string} text\n   */\n  addText(text) {\n    if (text === \"\") { return; }\n\n    this.add(text);\n  }\n\n  /** @param {string} scope */\n  startScope(scope) {\n    this.openNode(scope);\n  }\n\n  endScope() {\n    this.closeNode();\n  }\n\n  /**\n   * @param {Emitter & {root: DataNode}} emitter\n   * @param {string} name\n   */\n  __addSublanguage(emitter, name) {\n    /** @type DataNode */\n    const node = emitter.root;\n    if (name) node.scope = `language:${name}`;\n\n    this.add(node);\n  }\n\n  toHTML() {\n    const renderer = new HTMLRenderer(this, this.options);\n    return renderer.value();\n  }\n\n  finalize() {\n    this.closeAllNodes();\n    return true;\n  }\n}\n\n/**\n * @param {string} value\n * @returns {RegExp}\n * */\n\n/**\n * @param {RegExp | string } re\n * @returns {string}\n */\nfunction source(re) {\n  if (!re) return null;\n  if (typeof re === \"string\") return re;\n\n  return re.source;\n}\n\n/**\n * @param {RegExp | string } re\n * @returns {string}\n */\nfunction lookahead(re) {\n  return concat('(?=', re, ')');\n}\n\n/**\n * @param {RegExp | string } re\n * @returns {string}\n */\nfunction anyNumberOfTimes(re) {\n  return concat('(?:', re, ')*');\n}\n\n/**\n * @param {RegExp | string } re\n * @returns {string}\n */\nfunction optional(re) {\n  return concat('(?:', re, ')?');\n}\n\n/**\n * @param {...(RegExp | string) } args\n * @returns {string}\n */\nfunction concat(...args) {\n  const joined = args.map((x) => source(x)).join(\"\");\n  return joined;\n}\n\n/**\n * @param { Array<string | RegExp | Object> } args\n * @returns {object}\n */\nfunction stripOptionsFromArgs(args) {\n  const opts = args[args.length - 1];\n\n  if (typeof opts === 'object' && opts.constructor === Object) {\n    args.splice(args.length - 1, 1);\n    return opts;\n  } else {\n    return {};\n  }\n}\n\n/** @typedef { {capture?: boolean} } RegexEitherOptions */\n\n/**\n * Any of the passed expresssions may match\n *\n * Creates a huge this | this | that | that match\n * @param {(RegExp | string)[] | [...(RegExp | string)[], RegexEitherOptions]} args\n * @returns {string}\n */\nfunction either(...args) {\n  /** @type { object & {capture?: boolean} }  */\n  const opts = stripOptionsFromArgs(args);\n  const joined = '('\n    + (opts.capture ? \"\" : \"?:\")\n    + args.map((x) => source(x)).join(\"|\") + \")\";\n  return joined;\n}\n\n/**\n * @param {RegExp | string} re\n * @returns {number}\n */\nfunction countMatchGroups(re) {\n  return (new RegExp(re.toString() + '|')).exec('').length - 1;\n}\n\n/**\n * Does lexeme start with a regular expression match at the beginning\n * @param {RegExp} re\n * @param {string} lexeme\n */\nfunction startsWith(re, lexeme) {\n  const match = re && re.exec(lexeme);\n  return match && match.index === 0;\n}\n\n// BACKREF_RE matches an open parenthesis or backreference. To avoid\n// an incorrect parse, it additionally matches the following:\n// - [...] elements, where the meaning of parentheses and escapes change\n// - other escape sequences, so we do not misparse escape sequences as\n//   interesting elements\n// - non-matching or lookahead parentheses, which do not capture. These\n//   follow the '(' with a '?'.\nconst BACKREF_RE = /\\[(?:[^\\\\\\]]|\\\\.)*\\]|\\(\\??|\\\\([1-9][0-9]*)|\\\\./;\n\n// **INTERNAL** Not intended for outside usage\n// join logically computes regexps.join(separator), but fixes the\n// backreferences so they continue to match.\n// it also places each individual regular expression into it's own\n// match group, keeping track of the sequencing of those match groups\n// is currently an exercise for the caller. :-)\n/**\n * @param {(string | RegExp)[]} regexps\n * @param {{joinWith: string}} opts\n * @returns {string}\n */\nfunction _rewriteBackreferences(regexps, { joinWith }) {\n  let numCaptures = 0;\n\n  return regexps.map((regex) => {\n    numCaptures += 1;\n    const offset = numCaptures;\n    let re = source(regex);\n    let out = '';\n\n    while (re.length > 0) {\n      const match = BACKREF_RE.exec(re);\n      if (!match) {\n        out += re;\n        break;\n      }\n      out += re.substring(0, match.index);\n      re = re.substring(match.index + match[0].length);\n      if (match[0][0] === '\\\\' && match[1]) {\n        // Adjust the backreference.\n        out += '\\\\' + String(Number(match[1]) + offset);\n      } else {\n        out += match[0];\n        if (match[0] === '(') {\n          numCaptures++;\n        }\n      }\n    }\n    return out;\n  }).map(re => `(${re})`).join(joinWith);\n}\n\n/** @typedef {import('highlight.js').Mode} Mode */\n/** @typedef {import('highlight.js').ModeCallback} ModeCallback */\n\n// Common regexps\nconst MATCH_NOTHING_RE = /\\b\\B/;\nconst IDENT_RE = '[a-zA-Z]\\\\w*';\nconst UNDERSCORE_IDENT_RE = '[a-zA-Z_]\\\\w*';\nconst NUMBER_RE = '\\\\b\\\\d+(\\\\.\\\\d+)?';\nconst C_NUMBER_RE = '(-?)(\\\\b0[xX][a-fA-F0-9]+|(\\\\b\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)'; // 0x..., 0..., decimal, float\nconst BINARY_NUMBER_RE = '\\\\b(0b[01]+)'; // 0b...\nconst RE_STARTERS_RE = '!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~';\n\n/**\n* @param { Partial<Mode> & {binary?: string | RegExp} } opts\n*/\nconst SHEBANG = (opts = {}) => {\n  const beginShebang = /^#![ ]*\\//;\n  if (opts.binary) {\n    opts.begin = concat(\n      beginShebang,\n      /.*\\b/,\n      opts.binary,\n      /\\b.*/);\n  }\n  return inherit$1({\n    scope: 'meta',\n    begin: beginShebang,\n    end: /$/,\n    relevance: 0,\n    /** @type {ModeCallback} */\n    \"on:begin\": (m, resp) => {\n      if (m.index !== 0) resp.ignoreMatch();\n    }\n  }, opts);\n};\n\n// Common modes\nconst BACKSLASH_ESCAPE = {\n  begin: '\\\\\\\\[\\\\s\\\\S]', relevance: 0\n};\nconst APOS_STRING_MODE = {\n  scope: 'string',\n  begin: '\\'',\n  end: '\\'',\n  illegal: '\\\\n',\n  contains: [BACKSLASH_ESCAPE]\n};\nconst QUOTE_STRING_MODE = {\n  scope: 'string',\n  begin: '\"',\n  end: '\"',\n  illegal: '\\\\n',\n  contains: [BACKSLASH_ESCAPE]\n};\nconst PHRASAL_WORDS_MODE = {\n  begin: /\\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\\b/\n};\n/**\n * Creates a comment mode\n *\n * @param {string | RegExp} begin\n * @param {string | RegExp} end\n * @param {Mode | {}} [modeOptions]\n * @returns {Partial<Mode>}\n */\nconst COMMENT = function(begin, end, modeOptions = {}) {\n  const mode = inherit$1(\n    {\n      scope: 'comment',\n      begin,\n      end,\n      contains: []\n    },\n    modeOptions\n  );\n  mode.contains.push({\n    scope: 'doctag',\n    // hack to avoid the space from being included. the space is necessary to\n    // match here to prevent the plain text rule below from gobbling up doctags\n    begin: '[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)',\n    end: /(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,\n    excludeBegin: true,\n    relevance: 0\n  });\n  const ENGLISH_WORD = either(\n    // list of common 1 and 2 letter words in English\n    \"I\",\n    \"a\",\n    \"is\",\n    \"so\",\n    \"us\",\n    \"to\",\n    \"at\",\n    \"if\",\n    \"in\",\n    \"it\",\n    \"on\",\n    // note: this is not an exhaustive list of contractions, just popular ones\n    /[A-Za-z]+['](d|ve|re|ll|t|s|n)/, // contractions - can't we'd they're let's, etc\n    /[A-Za-z]+[-][a-z]+/, // `no-way`, etc.\n    /[A-Za-z][a-z]{2,}/ // allow capitalized words at beginning of sentences\n  );\n  // looking like plain text, more likely to be a comment\n  mode.contains.push(\n    {\n      // TODO: how to include \", (, ) without breaking grammars that use these for\n      // comment delimiters?\n      // begin: /[ ]+([()\"]?([A-Za-z'-]{3,}|is|a|I|so|us|[tT][oO]|at|if|in|it|on)[.]?[()\":]?([.][ ]|[ ]|\\))){3}/\n      // ---\n\n      // this tries to find sequences of 3 english words in a row (without any\n      // \"programming\" type syntax) this gives us a strong signal that we've\n      // TRULY found a comment - vs perhaps scanning with the wrong language.\n      // It's possible to find something that LOOKS like the start of the\n      // comment - but then if there is no readable text - good chance it is a\n      // false match and not a comment.\n      //\n      // for a visual example please see:\n      // https://github.com/highlightjs/highlight.js/issues/2827\n\n      begin: concat(\n        /[ ]+/, // necessary to prevent us gobbling up doctags like /* @author Bob Mcgill */\n        '(',\n        ENGLISH_WORD,\n        /[.]?[:]?([.][ ]|[ ])/,\n        '){3}') // look for 3 words in a row\n    }\n  );\n  return mode;\n};\nconst C_LINE_COMMENT_MODE = COMMENT('//', '$');\nconst C_BLOCK_COMMENT_MODE = COMMENT('/\\\\*', '\\\\*/');\nconst HASH_COMMENT_MODE = COMMENT('#', '$');\nconst NUMBER_MODE = {\n  scope: 'number',\n  begin: NUMBER_RE,\n  relevance: 0\n};\nconst C_NUMBER_MODE = {\n  scope: 'number',\n  begin: C_NUMBER_RE,\n  relevance: 0\n};\nconst BINARY_NUMBER_MODE = {\n  scope: 'number',\n  begin: BINARY_NUMBER_RE,\n  relevance: 0\n};\nconst REGEXP_MODE = {\n  scope: \"regexp\",\n  begin: /\\/(?=[^/\\n]*\\/)/,\n  end: /\\/[gimuy]*/,\n  contains: [\n    BACKSLASH_ESCAPE,\n    {\n      begin: /\\[/,\n      end: /\\]/,\n      relevance: 0,\n      contains: [BACKSLASH_ESCAPE]\n    }\n  ]\n};\nconst TITLE_MODE = {\n  scope: 'title',\n  begin: IDENT_RE,\n  relevance: 0\n};\nconst UNDERSCORE_TITLE_MODE = {\n  scope: 'title',\n  begin: UNDERSCORE_IDENT_RE,\n  relevance: 0\n};\nconst METHOD_GUARD = {\n  // excludes method names from keyword processing\n  begin: '\\\\.\\\\s*' + UNDERSCORE_IDENT_RE,\n  relevance: 0\n};\n\n/**\n * Adds end same as begin mechanics to a mode\n *\n * Your mode must include at least a single () match group as that first match\n * group is what is used for comparison\n * @param {Partial<Mode>} mode\n */\nconst END_SAME_AS_BEGIN = function(mode) {\n  return Object.assign(mode,\n    {\n      /** @type {ModeCallback} */\n      'on:begin': (m, resp) => { resp.data._beginMatch = m[1]; },\n      /** @type {ModeCallback} */\n      'on:end': (m, resp) => { if (resp.data._beginMatch !== m[1]) resp.ignoreMatch(); }\n    });\n};\n\nvar MODES = /*#__PURE__*/Object.freeze({\n  __proto__: null,\n  APOS_STRING_MODE: APOS_STRING_MODE,\n  BACKSLASH_ESCAPE: BACKSLASH_ESCAPE,\n  BINARY_NUMBER_MODE: BINARY_NUMBER_MODE,\n  BINARY_NUMBER_RE: BINARY_NUMBER_RE,\n  COMMENT: COMMENT,\n  C_BLOCK_COMMENT_MODE: C_BLOCK_COMMENT_MODE,\n  C_LINE_COMMENT_MODE: C_LINE_COMMENT_MODE,\n  C_NUMBER_MODE: C_NUMBER_MODE,\n  C_NUMBER_RE: C_NUMBER_RE,\n  END_SAME_AS_BEGIN: END_SAME_AS_BEGIN,\n  HASH_COMMENT_MODE: HASH_COMMENT_MODE,\n  IDENT_RE: IDENT_RE,\n  MATCH_NOTHING_RE: MATCH_NOTHING_RE,\n  METHOD_GUARD: METHOD_GUARD,\n  NUMBER_MODE: NUMBER_MODE,\n  NUMBER_RE: NUMBER_RE,\n  PHRASAL_WORDS_MODE: PHRASAL_WORDS_MODE,\n  QUOTE_STRING_MODE: QUOTE_STRING_MODE,\n  REGEXP_MODE: REGEXP_MODE,\n  RE_STARTERS_RE: RE_STARTERS_RE,\n  SHEBANG: SHEBANG,\n  TITLE_MODE: TITLE_MODE,\n  UNDERSCORE_IDENT_RE: UNDERSCORE_IDENT_RE,\n  UNDERSCORE_TITLE_MODE: UNDERSCORE_TITLE_MODE\n});\n\n/**\n@typedef {import('highlight.js').CallbackResponse} CallbackResponse\n@typedef {import('highlight.js').CompilerExt} CompilerExt\n*/\n\n// Grammar extensions / plugins\n// See: https://github.com/highlightjs/highlight.js/issues/2833\n\n// Grammar extensions allow \"syntactic sugar\" to be added to the grammar modes\n// without requiring any underlying changes to the compiler internals.\n\n// `compileMatch` being the perfect small example of now allowing a grammar\n// author to write `match` when they desire to match a single expression rather\n// than being forced to use `begin`.  The extension then just moves `match` into\n// `begin` when it runs.  Ie, no features have been added, but we've just made\n// the experience of writing (and reading grammars) a little bit nicer.\n\n// ------\n\n// TODO: We need negative look-behind support to do this properly\n/**\n * Skip a match if it has a preceding dot\n *\n * This is used for `beginKeywords` to prevent matching expressions such as\n * `bob.keyword.do()`. The mode compiler automatically wires this up as a\n * special _internal_ 'on:begin' callback for modes with `beginKeywords`\n * @param {RegExpMatchArray} match\n * @param {CallbackResponse} response\n */\nfunction skipIfHasPrecedingDot(match, response) {\n  const before = match.input[match.index - 1];\n  if (before === \".\") {\n    response.ignoreMatch();\n  }\n}\n\n/**\n *\n * @type {CompilerExt}\n */\nfunction scopeClassName(mode, _parent) {\n  // eslint-disable-next-line no-undefined\n  if (mode.className !== undefined) {\n    mode.scope = mode.className;\n    delete mode.className;\n  }\n}\n\n/**\n * `beginKeywords` syntactic sugar\n * @type {CompilerExt}\n */\nfunction beginKeywords(mode, parent) {\n  if (!parent) return;\n  if (!mode.beginKeywords) return;\n\n  // for languages with keywords that include non-word characters checking for\n  // a word boundary is not sufficient, so instead we check for a word boundary\n  // or whitespace - this does no harm in any case since our keyword engine\n  // doesn't allow spaces in keywords anyways and we still check for the boundary\n  // first\n  mode.begin = '\\\\b(' + mode.beginKeywords.split(' ').join('|') + ')(?!\\\\.)(?=\\\\b|\\\\s)';\n  mode.__beforeBegin = skipIfHasPrecedingDot;\n  mode.keywords = mode.keywords || mode.beginKeywords;\n  delete mode.beginKeywords;\n\n  // prevents double relevance, the keywords themselves provide\n  // relevance, the mode doesn't need to double it\n  // eslint-disable-next-line no-undefined\n  if (mode.relevance === undefined) mode.relevance = 0;\n}\n\n/**\n * Allow `illegal` to contain an array of illegal values\n * @type {CompilerExt}\n */\nfunction compileIllegal(mode, _parent) {\n  if (!Array.isArray(mode.illegal)) return;\n\n  mode.illegal = either(...mode.illegal);\n}\n\n/**\n * `match` to match a single expression for readability\n * @type {CompilerExt}\n */\nfunction compileMatch(mode, _parent) {\n  if (!mode.match) return;\n  if (mode.begin || mode.end) throw new Error(\"begin & end are not supported with match\");\n\n  mode.begin = mode.match;\n  delete mode.match;\n}\n\n/**\n * provides the default 1 relevance to all modes\n * @type {CompilerExt}\n */\nfunction compileRelevance(mode, _parent) {\n  // eslint-disable-next-line no-undefined\n  if (mode.relevance === undefined) mode.relevance = 1;\n}\n\n// allow beforeMatch to act as a \"qualifier\" for the match\n// the full match begin must be [beforeMatch][begin]\nconst beforeMatchExt = (mode, parent) => {\n  if (!mode.beforeMatch) return;\n  // starts conflicts with endsParent which we need to make sure the child\n  // rule is not matched multiple times\n  if (mode.starts) throw new Error(\"beforeMatch cannot be used with starts\");\n\n  const originalMode = Object.assign({}, mode);\n  Object.keys(mode).forEach((key) => { delete mode[key]; });\n\n  mode.keywords = originalMode.keywords;\n  mode.begin = concat(originalMode.beforeMatch, lookahead(originalMode.begin));\n  mode.starts = {\n    relevance: 0,\n    contains: [\n      Object.assign(originalMode, { endsParent: true })\n    ]\n  };\n  mode.relevance = 0;\n\n  delete originalMode.beforeMatch;\n};\n\n// keywords that should have no default relevance value\nconst COMMON_KEYWORDS = [\n  'of',\n  'and',\n  'for',\n  'in',\n  'not',\n  'or',\n  'if',\n  'then',\n  'parent', // common variable name\n  'list', // common variable name\n  'value' // common variable name\n];\n\nconst DEFAULT_KEYWORD_SCOPE = \"keyword\";\n\n/**\n * Given raw keywords from a language definition, compile them.\n *\n * @param {string | Record<string,string|string[]> | Array<string>} rawKeywords\n * @param {boolean} caseInsensitive\n */\nfunction compileKeywords(rawKeywords, caseInsensitive, scopeName = DEFAULT_KEYWORD_SCOPE) {\n  /** @type {import(\"highlight.js/private\").KeywordDict} */\n  const compiledKeywords = Object.create(null);\n\n  // input can be a string of keywords, an array of keywords, or a object with\n  // named keys representing scopeName (which can then point to a string or array)\n  if (typeof rawKeywords === 'string') {\n    compileList(scopeName, rawKeywords.split(\" \"));\n  } else if (Array.isArray(rawKeywords)) {\n    compileList(scopeName, rawKeywords);\n  } else {\n    Object.keys(rawKeywords).forEach(function(scopeName) {\n      // collapse all our objects back into the parent object\n      Object.assign(\n        compiledKeywords,\n        compileKeywords(rawKeywords[scopeName], caseInsensitive, scopeName)\n      );\n    });\n  }\n  return compiledKeywords;\n\n  // ---\n\n  /**\n   * Compiles an individual list of keywords\n   *\n   * Ex: \"for if when while|5\"\n   *\n   * @param {string} scopeName\n   * @param {Array<string>} keywordList\n   */\n  function compileList(scopeName, keywordList) {\n    if (caseInsensitive) {\n      keywordList = keywordList.map(x => x.toLowerCase());\n    }\n    keywordList.forEach(function(keyword) {\n      const pair = keyword.split('|');\n      compiledKeywords[pair[0]] = [scopeName, scoreForKeyword(pair[0], pair[1])];\n    });\n  }\n}\n\n/**\n * Returns the proper score for a given keyword\n *\n * Also takes into account comment keywords, which will be scored 0 UNLESS\n * another score has been manually assigned.\n * @param {string} keyword\n * @param {string} [providedScore]\n */\nfunction scoreForKeyword(keyword, providedScore) {\n  // manual scores always win over common keywords\n  // so you can force a score of 1 if you really insist\n  if (providedScore) {\n    return Number(providedScore);\n  }\n\n  return commonKeyword(keyword) ? 0 : 1;\n}\n\n/**\n * Determines if a given keyword is common or not\n *\n * @param {string} keyword */\nfunction commonKeyword(keyword) {\n  return COMMON_KEYWORDS.includes(keyword.toLowerCase());\n}\n\n/*\n\nFor the reasoning behind this please see:\nhttps://github.com/highlightjs/highlight.js/issues/2880#issuecomment-747275419\n\n*/\n\n/**\n * @type {Record<string, boolean>}\n */\nconst seenDeprecations = {};\n\n/**\n * @param {string} message\n */\nconst error = (message) => {\n  console.error(message);\n};\n\n/**\n * @param {string} message\n * @param {any} args\n */\nconst warn = (message, ...args) => {\n  console.log(`WARN: ${message}`, ...args);\n};\n\n/**\n * @param {string} version\n * @param {string} message\n */\nconst deprecated = (version, message) => {\n  if (seenDeprecations[`${version}/${message}`]) return;\n\n  console.log(`Deprecated as of ${version}. ${message}`);\n  seenDeprecations[`${version}/${message}`] = true;\n};\n\n/* eslint-disable no-throw-literal */\n\n/**\n@typedef {import('highlight.js').CompiledMode} CompiledMode\n*/\n\nconst MultiClassError = new Error();\n\n/**\n * Renumbers labeled scope names to account for additional inner match\n * groups that otherwise would break everything.\n *\n * Lets say we 3 match scopes:\n *\n *   { 1 => ..., 2 => ..., 3 => ... }\n *\n * So what we need is a clean match like this:\n *\n *   (a)(b)(c) => [ \"a\", \"b\", \"c\" ]\n *\n * But this falls apart with inner match groups:\n *\n * (a)(((b)))(c) => [\"a\", \"b\", \"b\", \"b\", \"c\" ]\n *\n * Our scopes are now \"out of alignment\" and we're repeating `b` 3 times.\n * What needs to happen is the numbers are remapped:\n *\n *   { 1 => ..., 2 => ..., 5 => ... }\n *\n * We also need to know that the ONLY groups that should be output\n * are 1, 2, and 5.  This function handles this behavior.\n *\n * @param {CompiledMode} mode\n * @param {Array<RegExp | string>} regexes\n * @param {{key: \"beginScope\"|\"endScope\"}} opts\n */\nfunction remapScopeNames(mode, regexes, { key }) {\n  let offset = 0;\n  const scopeNames = mode[key];\n  /** @type Record<number,boolean> */\n  const emit = {};\n  /** @type Record<number,string> */\n  const positions = {};\n\n  for (let i = 1; i <= regexes.length; i++) {\n    positions[i + offset] = scopeNames[i];\n    emit[i + offset] = true;\n    offset += countMatchGroups(regexes[i - 1]);\n  }\n  // we use _emit to keep track of which match groups are \"top-level\" to avoid double\n  // output from inside match groups\n  mode[key] = positions;\n  mode[key]._emit = emit;\n  mode[key]._multi = true;\n}\n\n/**\n * @param {CompiledMode} mode\n */\nfunction beginMultiClass(mode) {\n  if (!Array.isArray(mode.begin)) return;\n\n  if (mode.skip || mode.excludeBegin || mode.returnBegin) {\n    error(\"skip, excludeBegin, returnBegin not compatible with beginScope: {}\");\n    throw MultiClassError;\n  }\n\n  if (typeof mode.beginScope !== \"object\" || mode.beginScope === null) {\n    error(\"beginScope must be object\");\n    throw MultiClassError;\n  }\n\n  remapScopeNames(mode, mode.begin, { key: \"beginScope\" });\n  mode.begin = _rewriteBackreferences(mode.begin, { joinWith: \"\" });\n}\n\n/**\n * @param {CompiledMode} mode\n */\nfunction endMultiClass(mode) {\n  if (!Array.isArray(mode.end)) return;\n\n  if (mode.skip || mode.excludeEnd || mode.returnEnd) {\n    error(\"skip, excludeEnd, returnEnd not compatible with endScope: {}\");\n    throw MultiClassError;\n  }\n\n  if (typeof mode.endScope !== \"object\" || mode.endScope === null) {\n    error(\"endScope must be object\");\n    throw MultiClassError;\n  }\n\n  remapScopeNames(mode, mode.end, { key: \"endScope\" });\n  mode.end = _rewriteBackreferences(mode.end, { joinWith: \"\" });\n}\n\n/**\n * this exists only to allow `scope: {}` to be used beside `match:`\n * Otherwise `beginScope` would necessary and that would look weird\n\n  {\n    match: [ /def/, /\\w+/ ]\n    scope: { 1: \"keyword\" , 2: \"title\" }\n  }\n\n * @param {CompiledMode} mode\n */\nfunction scopeSugar(mode) {\n  if (mode.scope && typeof mode.scope === \"object\" && mode.scope !== null) {\n    mode.beginScope = mode.scope;\n    delete mode.scope;\n  }\n}\n\n/**\n * @param {CompiledMode} mode\n */\nfunction MultiClass(mode) {\n  scopeSugar(mode);\n\n  if (typeof mode.beginScope === \"string\") {\n    mode.beginScope = { _wrap: mode.beginScope };\n  }\n  if (typeof mode.endScope === \"string\") {\n    mode.endScope = { _wrap: mode.endScope };\n  }\n\n  beginMultiClass(mode);\n  endMultiClass(mode);\n}\n\n/**\n@typedef {import('highlight.js').Mode} Mode\n@typedef {import('highlight.js').CompiledMode} CompiledMode\n@typedef {import('highlight.js').Language} Language\n@typedef {import('highlight.js').HLJSPlugin} HLJSPlugin\n@typedef {import('highlight.js').CompiledLanguage} CompiledLanguage\n*/\n\n// compilation\n\n/**\n * Compiles a language definition result\n *\n * Given the raw result of a language definition (Language), compiles this so\n * that it is ready for highlighting code.\n * @param {Language} language\n * @returns {CompiledLanguage}\n */\nfunction compileLanguage(language) {\n  /**\n   * Builds a regex with the case sensitivity of the current language\n   *\n   * @param {RegExp | string} value\n   * @param {boolean} [global]\n   */\n  function langRe(value, global) {\n    return new RegExp(\n      source(value),\n      'm'\n      + (language.case_insensitive ? 'i' : '')\n      + (language.unicodeRegex ? 'u' : '')\n      + (global ? 'g' : '')\n    );\n  }\n\n  /**\n    Stores multiple regular expressions and allows you to quickly search for\n    them all in a string simultaneously - returning the first match.  It does\n    this by creating a huge (a|b|c) regex - each individual item wrapped with ()\n    and joined by `|` - using match groups to track position.  When a match is\n    found checking which position in the array has content allows us to figure\n    out which of the original regexes / match groups triggered the match.\n\n    The match object itself (the result of `Regex.exec`) is returned but also\n    enhanced by merging in any meta-data that was registered with the regex.\n    This is how we keep track of which mode matched, and what type of rule\n    (`illegal`, `begin`, end, etc).\n  */\n  class MultiRegex {\n    constructor() {\n      this.matchIndexes = {};\n      // @ts-ignore\n      this.regexes = [];\n      this.matchAt = 1;\n      this.position = 0;\n    }\n\n    // @ts-ignore\n    addRule(re, opts) {\n      opts.position = this.position++;\n      // @ts-ignore\n      this.matchIndexes[this.matchAt] = opts;\n      this.regexes.push([opts, re]);\n      this.matchAt += countMatchGroups(re) + 1;\n    }\n\n    compile() {\n      if (this.regexes.length === 0) {\n        // avoids the need to check length every time exec is called\n        // @ts-ignore\n        this.exec = () => null;\n      }\n      const terminators = this.regexes.map(el => el[1]);\n      this.matcherRe = langRe(_rewriteBackreferences(terminators, { joinWith: '|' }), true);\n      this.lastIndex = 0;\n    }\n\n    /** @param {string} s */\n    exec(s) {\n      this.matcherRe.lastIndex = this.lastIndex;\n      const match = this.matcherRe.exec(s);\n      if (!match) { return null; }\n\n      // eslint-disable-next-line no-undefined\n      const i = match.findIndex((el, i) => i > 0 && el !== undefined);\n      // @ts-ignore\n      const matchData = this.matchIndexes[i];\n      // trim off any earlier non-relevant match groups (ie, the other regex\n      // match groups that make up the multi-matcher)\n      match.splice(0, i);\n\n      return Object.assign(match, matchData);\n    }\n  }\n\n  /*\n    Created to solve the key deficiently with MultiRegex - there is no way to\n    test for multiple matches at a single location.  Why would we need to do\n    that?  In the future a more dynamic engine will allow certain matches to be\n    ignored.  An example: if we matched say the 3rd regex in a large group but\n    decided to ignore it - we'd need to started testing again at the 4th\n    regex... but MultiRegex itself gives us no real way to do that.\n\n    So what this class creates MultiRegexs on the fly for whatever search\n    position they are needed.\n\n    NOTE: These additional MultiRegex objects are created dynamically.  For most\n    grammars most of the time we will never actually need anything more than the\n    first MultiRegex - so this shouldn't have too much overhead.\n\n    Say this is our search group, and we match regex3, but wish to ignore it.\n\n      regex1 | regex2 | regex3 | regex4 | regex5    ' ie, startAt = 0\n\n    What we need is a new MultiRegex that only includes the remaining\n    possibilities:\n\n      regex4 | regex5                               ' ie, startAt = 3\n\n    This class wraps all that complexity up in a simple API... `startAt` decides\n    where in the array of expressions to start doing the matching. It\n    auto-increments, so if a match is found at position 2, then startAt will be\n    set to 3.  If the end is reached startAt will return to 0.\n\n    MOST of the time the parser will be setting startAt manually to 0.\n  */\n  class ResumableMultiRegex {\n    constructor() {\n      // @ts-ignore\n      this.rules = [];\n      // @ts-ignore\n      this.multiRegexes = [];\n      this.count = 0;\n\n      this.lastIndex = 0;\n      this.regexIndex = 0;\n    }\n\n    // @ts-ignore\n    getMatcher(index) {\n      if (this.multiRegexes[index]) return this.multiRegexes[index];\n\n      const matcher = new MultiRegex();\n      this.rules.slice(index).forEach(([re, opts]) => matcher.addRule(re, opts));\n      matcher.compile();\n      this.multiRegexes[index] = matcher;\n      return matcher;\n    }\n\n    resumingScanAtSamePosition() {\n      return this.regexIndex !== 0;\n    }\n\n    considerAll() {\n      this.regexIndex = 0;\n    }\n\n    // @ts-ignore\n    addRule(re, opts) {\n      this.rules.push([re, opts]);\n      if (opts.type === \"begin\") this.count++;\n    }\n\n    /** @param {string} s */\n    exec(s) {\n      const m = this.getMatcher(this.regexIndex);\n      m.lastIndex = this.lastIndex;\n      let result = m.exec(s);\n\n      // The following is because we have no easy way to say \"resume scanning at the\n      // existing position but also skip the current rule ONLY\". What happens is\n      // all prior rules are also skipped which can result in matching the wrong\n      // thing. Example of matching \"booger\":\n\n      // our matcher is [string, \"booger\", number]\n      //\n      // ....booger....\n\n      // if \"booger\" is ignored then we'd really need a regex to scan from the\n      // SAME position for only: [string, number] but ignoring \"booger\" (if it\n      // was the first match), a simple resume would scan ahead who knows how\n      // far looking only for \"number\", ignoring potential string matches (or\n      // future \"booger\" matches that might be valid.)\n\n      // So what we do: We execute two matchers, one resuming at the same\n      // position, but the second full matcher starting at the position after:\n\n      //     /--- resume first regex match here (for [number])\n      //     |/---- full match here for [string, \"booger\", number]\n      //     vv\n      // ....booger....\n\n      // Which ever results in a match first is then used. So this 3-4 step\n      // process essentially allows us to say \"match at this position, excluding\n      // a prior rule that was ignored\".\n      //\n      // 1. Match \"booger\" first, ignore. Also proves that [string] does non match.\n      // 2. Resume matching for [number]\n      // 3. Match at index + 1 for [string, \"booger\", number]\n      // 4. If #2 and #3 result in matches, which came first?\n      if (this.resumingScanAtSamePosition()) {\n        if (result && result.index === this.lastIndex) ; else { // use the second matcher result\n          const m2 = this.getMatcher(0);\n          m2.lastIndex = this.lastIndex + 1;\n          result = m2.exec(s);\n        }\n      }\n\n      if (result) {\n        this.regexIndex += result.position + 1;\n        if (this.regexIndex === this.count) {\n          // wrap-around to considering all matches again\n          this.considerAll();\n        }\n      }\n\n      return result;\n    }\n  }\n\n  /**\n   * Given a mode, builds a huge ResumableMultiRegex that can be used to walk\n   * the content and find matches.\n   *\n   * @param {CompiledMode} mode\n   * @returns {ResumableMultiRegex}\n   */\n  function buildModeRegex(mode) {\n    const mm = new ResumableMultiRegex();\n\n    mode.contains.forEach(term => mm.addRule(term.begin, { rule: term, type: \"begin\" }));\n\n    if (mode.terminatorEnd) {\n      mm.addRule(mode.terminatorEnd, { type: \"end\" });\n    }\n    if (mode.illegal) {\n      mm.addRule(mode.illegal, { type: \"illegal\" });\n    }\n\n    return mm;\n  }\n\n  /** skip vs abort vs ignore\n   *\n   * @skip   - The mode is still entered and exited normally (and contains rules apply),\n   *           but all content is held and added to the parent buffer rather than being\n   *           output when the mode ends.  Mostly used with `sublanguage` to build up\n   *           a single large buffer than can be parsed by sublanguage.\n   *\n   *             - The mode begin ands ends normally.\n   *             - Content matched is added to the parent mode buffer.\n   *             - The parser cursor is moved forward normally.\n   *\n   * @abort  - A hack placeholder until we have ignore.  Aborts the mode (as if it\n   *           never matched) but DOES NOT continue to match subsequent `contains`\n   *           modes.  Abort is bad/suboptimal because it can result in modes\n   *           farther down not getting applied because an earlier rule eats the\n   *           content but then aborts.\n   *\n   *             - The mode does not begin.\n   *             - Content matched by `begin` is added to the mode buffer.\n   *             - The parser cursor is moved forward accordingly.\n   *\n   * @ignore - Ignores the mode (as if it never matched) and continues to match any\n   *           subsequent `contains` modes.  Ignore isn't technically possible with\n   *           the current parser implementation.\n   *\n   *             - The mode does not begin.\n   *             - Content matched by `begin` is ignored.\n   *             - The parser cursor is not moved forward.\n   */\n\n  /**\n   * Compiles an individual mode\n   *\n   * This can raise an error if the mode contains certain detectable known logic\n   * issues.\n   * @param {Mode} mode\n   * @param {CompiledMode | null} [parent]\n   * @returns {CompiledMode | never}\n   */\n  function compileMode(mode, parent) {\n    const cmode = /** @type CompiledMode */ (mode);\n    if (mode.isCompiled) return cmode;\n\n    [\n      scopeClassName,\n      // do this early so compiler extensions generally don't have to worry about\n      // the distinction between match/begin\n      compileMatch,\n      MultiClass,\n      beforeMatchExt\n    ].forEach(ext => ext(mode, parent));\n\n    language.compilerExtensions.forEach(ext => ext(mode, parent));\n\n    // __beforeBegin is considered private API, internal use only\n    mode.__beforeBegin = null;\n\n    [\n      beginKeywords,\n      // do this later so compiler extensions that come earlier have access to the\n      // raw array if they wanted to perhaps manipulate it, etc.\n      compileIllegal,\n      // default to 1 relevance if not specified\n      compileRelevance\n    ].forEach(ext => ext(mode, parent));\n\n    mode.isCompiled = true;\n\n    let keywordPattern = null;\n    if (typeof mode.keywords === \"object\" && mode.keywords.$pattern) {\n      // we need a copy because keywords might be compiled multiple times\n      // so we can't go deleting $pattern from the original on the first\n      // pass\n      mode.keywords = Object.assign({}, mode.keywords);\n      keywordPattern = mode.keywords.$pattern;\n      delete mode.keywords.$pattern;\n    }\n    keywordPattern = keywordPattern || /\\w+/;\n\n    if (mode.keywords) {\n      mode.keywords = compileKeywords(mode.keywords, language.case_insensitive);\n    }\n\n    cmode.keywordPatternRe = langRe(keywordPattern, true);\n\n    if (parent) {\n      if (!mode.begin) mode.begin = /\\B|\\b/;\n      cmode.beginRe = langRe(cmode.begin);\n      if (!mode.end && !mode.endsWithParent) mode.end = /\\B|\\b/;\n      if (mode.end) cmode.endRe = langRe(cmode.end);\n      cmode.terminatorEnd = source(cmode.end) || '';\n      if (mode.endsWithParent && parent.terminatorEnd) {\n        cmode.terminatorEnd += (mode.end ? '|' : '') + parent.terminatorEnd;\n      }\n    }\n    if (mode.illegal) cmode.illegalRe = langRe(/** @type {RegExp | string} */ (mode.illegal));\n    if (!mode.contains) mode.contains = [];\n\n    mode.contains = [].concat(...mode.contains.map(function(c) {\n      return expandOrCloneMode(c === 'self' ? mode : c);\n    }));\n    mode.contains.forEach(function(c) { compileMode(/** @type Mode */ (c), cmode); });\n\n    if (mode.starts) {\n      compileMode(mode.starts, parent);\n    }\n\n    cmode.matcher = buildModeRegex(cmode);\n    return cmode;\n  }\n\n  if (!language.compilerExtensions) language.compilerExtensions = [];\n\n  // self is not valid at the top-level\n  if (language.contains && language.contains.includes('self')) {\n    throw new Error(\"ERR: contains `self` is not supported at the top-level of a language.  See documentation.\");\n  }\n\n  // we need a null object, which inherit will guarantee\n  language.classNameAliases = inherit$1(language.classNameAliases || {});\n\n  return compileMode(/** @type Mode */ (language));\n}\n\n/**\n * Determines if a mode has a dependency on it's parent or not\n *\n * If a mode does have a parent dependency then often we need to clone it if\n * it's used in multiple places so that each copy points to the correct parent,\n * where-as modes without a parent can often safely be re-used at the bottom of\n * a mode chain.\n *\n * @param {Mode | null} mode\n * @returns {boolean} - is there a dependency on the parent?\n * */\nfunction dependencyOnParent(mode) {\n  if (!mode) return false;\n\n  return mode.endsWithParent || dependencyOnParent(mode.starts);\n}\n\n/**\n * Expands a mode or clones it if necessary\n *\n * This is necessary for modes with parental dependenceis (see notes on\n * `dependencyOnParent`) and for nodes that have `variants` - which must then be\n * exploded into their own individual modes at compile time.\n *\n * @param {Mode} mode\n * @returns {Mode | Mode[]}\n * */\nfunction expandOrCloneMode(mode) {\n  if (mode.variants && !mode.cachedVariants) {\n    mode.cachedVariants = mode.variants.map(function(variant) {\n      return inherit$1(mode, { variants: null }, variant);\n    });\n  }\n\n  // EXPAND\n  // if we have variants then essentially \"replace\" the mode with the variants\n  // this happens in compileMode, where this function is called from\n  if (mode.cachedVariants) {\n    return mode.cachedVariants;\n  }\n\n  // CLONE\n  // if we have dependencies on parents then we need a unique\n  // instance of ourselves, so we can be reused with many\n  // different parents without issue\n  if (dependencyOnParent(mode)) {\n    return inherit$1(mode, { starts: mode.starts ? inherit$1(mode.starts) : null });\n  }\n\n  if (Object.isFrozen(mode)) {\n    return inherit$1(mode);\n  }\n\n  // no special dependency issues, just return ourselves\n  return mode;\n}\n\nvar version = \"11.10.0\";\n\nclass HTMLInjectionError extends Error {\n  constructor(reason, html) {\n    super(reason);\n    this.name = \"HTMLInjectionError\";\n    this.html = html;\n  }\n}\n\n/*\nSyntax highlighting with language autodetection.\nhttps://highlightjs.org/\n*/\n\n\n\n/**\n@typedef {import('highlight.js').Mode} Mode\n@typedef {import('highlight.js').CompiledMode} CompiledMode\n@typedef {import('highlight.js').CompiledScope} CompiledScope\n@typedef {import('highlight.js').Language} Language\n@typedef {import('highlight.js').HLJSApi} HLJSApi\n@typedef {import('highlight.js').HLJSPlugin} HLJSPlugin\n@typedef {import('highlight.js').PluginEvent} PluginEvent\n@typedef {import('highlight.js').HLJSOptions} HLJSOptions\n@typedef {import('highlight.js').LanguageFn} LanguageFn\n@typedef {import('highlight.js').HighlightedHTMLElement} HighlightedHTMLElement\n@typedef {import('highlight.js').BeforeHighlightContext} BeforeHighlightContext\n@typedef {import('highlight.js/private').MatchType} MatchType\n@typedef {import('highlight.js/private').KeywordData} KeywordData\n@typedef {import('highlight.js/private').EnhancedMatch} EnhancedMatch\n@typedef {import('highlight.js/private').AnnotatedError} AnnotatedError\n@typedef {import('highlight.js').AutoHighlightResult} AutoHighlightResult\n@typedef {import('highlight.js').HighlightOptions} HighlightOptions\n@typedef {import('highlight.js').HighlightResult} HighlightResult\n*/\n\n\nconst escape = escapeHTML;\nconst inherit = inherit$1;\nconst NO_MATCH = Symbol(\"nomatch\");\nconst MAX_KEYWORD_HITS = 7;\n\n/**\n * @param {any} hljs - object that is extended (legacy)\n * @returns {HLJSApi}\n */\nconst HLJS = function(hljs) {\n  // Global internal variables used within the highlight.js library.\n  /** @type {Record<string, Language>} */\n  const languages = Object.create(null);\n  /** @type {Record<string, string>} */\n  const aliases = Object.create(null);\n  /** @type {HLJSPlugin[]} */\n  const plugins = [];\n\n  // safe/production mode - swallows more errors, tries to keep running\n  // even if a single syntax or parse hits a fatal error\n  let SAFE_MODE = true;\n  const LANGUAGE_NOT_FOUND = \"Could not find the language '{}', did you forget to load/include a language module?\";\n  /** @type {Language} */\n  const PLAINTEXT_LANGUAGE = { disableAutodetect: true, name: 'Plain text', contains: [] };\n\n  // Global options used when within external APIs. This is modified when\n  // calling the `hljs.configure` function.\n  /** @type HLJSOptions */\n  let options = {\n    ignoreUnescapedHTML: false,\n    throwUnescapedHTML: false,\n    noHighlightRe: /^(no-?highlight)$/i,\n    languageDetectRe: /\\blang(?:uage)?-([\\w-]+)\\b/i,\n    classPrefix: 'hljs-',\n    cssSelector: 'pre code',\n    languages: null,\n    // beta configuration options, subject to change, welcome to discuss\n    // https://github.com/highlightjs/highlight.js/issues/1086\n    __emitter: TokenTreeEmitter\n  };\n\n  /* Utility functions */\n\n  /**\n   * Tests a language name to see if highlighting should be skipped\n   * @param {string} languageName\n   */\n  function shouldNotHighlight(languageName) {\n    return options.noHighlightRe.test(languageName);\n  }\n\n  /**\n   * @param {HighlightedHTMLElement} block - the HTML element to determine language for\n   */\n  function blockLanguage(block) {\n    let classes = block.className + ' ';\n\n    classes += block.parentNode ? block.parentNode.className : '';\n\n    // language-* takes precedence over non-prefixed class names.\n    const match = options.languageDetectRe.exec(classes);\n    if (match) {\n      const language = getLanguage(match[1]);\n      if (!language) {\n        warn(LANGUAGE_NOT_FOUND.replace(\"{}\", match[1]));\n        warn(\"Falling back to no-highlight mode for this block.\", block);\n      }\n      return language ? match[1] : 'no-highlight';\n    }\n\n    return classes\n      .split(/\\s+/)\n      .find((_class) => shouldNotHighlight(_class) || getLanguage(_class));\n  }\n\n  /**\n   * Core highlighting function.\n   *\n   * OLD API\n   * highlight(lang, code, ignoreIllegals, continuation)\n   *\n   * NEW API\n   * highlight(code, {lang, ignoreIllegals})\n   *\n   * @param {string} codeOrLanguageName - the language to use for highlighting\n   * @param {string | HighlightOptions} optionsOrCode - the code to highlight\n   * @param {boolean} [ignoreIllegals] - whether to ignore illegal matches, default is to bail\n   *\n   * @returns {HighlightResult} Result - an object that represents the result\n   * @property {string} language - the language name\n   * @property {number} relevance - the relevance score\n   * @property {string} value - the highlighted HTML code\n   * @property {string} code - the original raw code\n   * @property {CompiledMode} top - top of the current mode stack\n   * @property {boolean} illegal - indicates whether any illegal matches were found\n  */\n  function highlight(codeOrLanguageName, optionsOrCode, ignoreIllegals) {\n    let code = \"\";\n    let languageName = \"\";\n    if (typeof optionsOrCode === \"object\") {\n      code = codeOrLanguageName;\n      ignoreIllegals = optionsOrCode.ignoreIllegals;\n      languageName = optionsOrCode.language;\n    } else {\n      // old API\n      deprecated(\"10.7.0\", \"highlight(lang, code, ...args) has been deprecated.\");\n      deprecated(\"10.7.0\", \"Please use highlight(code, options) instead.\\nhttps://github.com/highlightjs/highlight.js/issues/2277\");\n      languageName = codeOrLanguageName;\n      code = optionsOrCode;\n    }\n\n    // https://github.com/highlightjs/highlight.js/issues/3149\n    // eslint-disable-next-line no-undefined\n    if (ignoreIllegals === undefined) { ignoreIllegals = true; }\n\n    /** @type {BeforeHighlightContext} */\n    const context = {\n      code,\n      language: languageName\n    };\n    // the plugin can change the desired language or the code to be highlighted\n    // just be changing the object it was passed\n    fire(\"before:highlight\", context);\n\n    // a before plugin can usurp the result completely by providing it's own\n    // in which case we don't even need to call highlight\n    const result = context.result\n      ? context.result\n      : _highlight(context.language, context.code, ignoreIllegals);\n\n    result.code = context.code;\n    // the plugin can change anything in result to suite it\n    fire(\"after:highlight\", result);\n\n    return result;\n  }\n\n  /**\n   * private highlight that's used internally and does not fire callbacks\n   *\n   * @param {string} languageName - the language to use for highlighting\n   * @param {string} codeToHighlight - the code to highlight\n   * @param {boolean?} [ignoreIllegals] - whether to ignore illegal matches, default is to bail\n   * @param {CompiledMode?} [continuation] - current continuation mode, if any\n   * @returns {HighlightResult} - result of the highlight operation\n  */\n  function _highlight(languageName, codeToHighlight, ignoreIllegals, continuation) {\n    const keywordHits = Object.create(null);\n\n    /**\n     * Return keyword data if a match is a keyword\n     * @param {CompiledMode} mode - current mode\n     * @param {string} matchText - the textual match\n     * @returns {KeywordData | false}\n     */\n    function keywordData(mode, matchText) {\n      return mode.keywords[matchText];\n    }\n\n    function processKeywords() {\n      if (!top.keywords) {\n        emitter.addText(modeBuffer);\n        return;\n      }\n\n      let lastIndex = 0;\n      top.keywordPatternRe.lastIndex = 0;\n      let match = top.keywordPatternRe.exec(modeBuffer);\n      let buf = \"\";\n\n      while (match) {\n        buf += modeBuffer.substring(lastIndex, match.index);\n        const word = language.case_insensitive ? match[0].toLowerCase() : match[0];\n        const data = keywordData(top, word);\n        if (data) {\n          const [kind, keywordRelevance] = data;\n          emitter.addText(buf);\n          buf = \"\";\n\n          keywordHits[word] = (keywordHits[word] || 0) + 1;\n          if (keywordHits[word] <= MAX_KEYWORD_HITS) relevance += keywordRelevance;\n          if (kind.startsWith(\"_\")) {\n            // _ implied for relevance only, do not highlight\n            // by applying a class name\n            buf += match[0];\n          } else {\n            const cssClass = language.classNameAliases[kind] || kind;\n            emitKeyword(match[0], cssClass);\n          }\n        } else {\n          buf += match[0];\n        }\n        lastIndex = top.keywordPatternRe.lastIndex;\n        match = top.keywordPatternRe.exec(modeBuffer);\n      }\n      buf += modeBuffer.substring(lastIndex);\n      emitter.addText(buf);\n    }\n\n    function processSubLanguage() {\n      if (modeBuffer === \"\") return;\n      /** @type HighlightResult */\n      let result = null;\n\n      if (typeof top.subLanguage === 'string') {\n        if (!languages[top.subLanguage]) {\n          emitter.addText(modeBuffer);\n          return;\n        }\n        result = _highlight(top.subLanguage, modeBuffer, true, continuations[top.subLanguage]);\n        continuations[top.subLanguage] = /** @type {CompiledMode} */ (result._top);\n      } else {\n        result = highlightAuto(modeBuffer, top.subLanguage.length ? top.subLanguage : null);\n      }\n\n      // Counting embedded language score towards the host language may be disabled\n      // with zeroing the containing mode relevance. Use case in point is Markdown that\n      // allows XML everywhere and makes every XML snippet to have a much larger Markdown\n      // score.\n      if (top.relevance > 0) {\n        relevance += result.relevance;\n      }\n      emitter.__addSublanguage(result._emitter, result.language);\n    }\n\n    function processBuffer() {\n      if (top.subLanguage != null) {\n        processSubLanguage();\n      } else {\n        processKeywords();\n      }\n      modeBuffer = '';\n    }\n\n    /**\n     * @param {string} text\n     * @param {string} scope\n     */\n    function emitKeyword(keyword, scope) {\n      if (keyword === \"\") return;\n\n      emitter.startScope(scope);\n      emitter.addText(keyword);\n      emitter.endScope();\n    }\n\n    /**\n     * @param {CompiledScope} scope\n     * @param {RegExpMatchArray} match\n     */\n    function emitMultiClass(scope, match) {\n      let i = 1;\n      const max = match.length - 1;\n      while (i <= max) {\n        if (!scope._emit[i]) { i++; continue; }\n        const klass = language.classNameAliases[scope[i]] || scope[i];\n        const text = match[i];\n        if (klass) {\n          emitKeyword(text, klass);\n        } else {\n          modeBuffer = text;\n          processKeywords();\n          modeBuffer = \"\";\n        }\n        i++;\n      }\n    }\n\n    /**\n     * @param {CompiledMode} mode - new mode to start\n     * @param {RegExpMatchArray} match\n     */\n    function startNewMode(mode, match) {\n      if (mode.scope && typeof mode.scope === \"string\") {\n        emitter.openNode(language.classNameAliases[mode.scope] || mode.scope);\n      }\n      if (mode.beginScope) {\n        // beginScope just wraps the begin match itself in a scope\n        if (mode.beginScope._wrap) {\n          emitKeyword(modeBuffer, language.classNameAliases[mode.beginScope._wrap] || mode.beginScope._wrap);\n          modeBuffer = \"\";\n        } else if (mode.beginScope._multi) {\n          // at this point modeBuffer should just be the match\n          emitMultiClass(mode.beginScope, match);\n          modeBuffer = \"\";\n        }\n      }\n\n      top = Object.create(mode, { parent: { value: top } });\n      return top;\n    }\n\n    /**\n     * @param {CompiledMode } mode - the mode to potentially end\n     * @param {RegExpMatchArray} match - the latest match\n     * @param {string} matchPlusRemainder - match plus remainder of content\n     * @returns {CompiledMode | void} - the next mode, or if void continue on in current mode\n     */\n    function endOfMode(mode, match, matchPlusRemainder) {\n      let matched = startsWith(mode.endRe, matchPlusRemainder);\n\n      if (matched) {\n        if (mode[\"on:end\"]) {\n          const resp = new Response(mode);\n          mode[\"on:end\"](match, resp);\n          if (resp.isMatchIgnored) matched = false;\n        }\n\n        if (matched) {\n          while (mode.endsParent && mode.parent) {\n            mode = mode.parent;\n          }\n          return mode;\n        }\n      }\n      // even if on:end fires an `ignore` it's still possible\n      // that we might trigger the end node because of a parent mode\n      if (mode.endsWithParent) {\n        return endOfMode(mode.parent, match, matchPlusRemainder);\n      }\n    }\n\n    /**\n     * Handle matching but then ignoring a sequence of text\n     *\n     * @param {string} lexeme - string containing full match text\n     */\n    function doIgnore(lexeme) {\n      if (top.matcher.regexIndex === 0) {\n        // no more regexes to potentially match here, so we move the cursor forward one\n        // space\n        modeBuffer += lexeme[0];\n        return 1;\n      } else {\n        // no need to move the cursor, we still have additional regexes to try and\n        // match at this very spot\n        resumeScanAtSamePosition = true;\n        return 0;\n      }\n    }\n\n    /**\n     * Handle the start of a new potential mode match\n     *\n     * @param {EnhancedMatch} match - the current match\n     * @returns {number} how far to advance the parse cursor\n     */\n    function doBeginMatch(match) {\n      const lexeme = match[0];\n      const newMode = match.rule;\n\n      const resp = new Response(newMode);\n      // first internal before callbacks, then the public ones\n      const beforeCallbacks = [newMode.__beforeBegin, newMode[\"on:begin\"]];\n      for (const cb of beforeCallbacks) {\n        if (!cb) continue;\n        cb(match, resp);\n        if (resp.isMatchIgnored) return doIgnore(lexeme);\n      }\n\n      if (newMode.skip) {\n        modeBuffer += lexeme;\n      } else {\n        if (newMode.excludeBegin) {\n          modeBuffer += lexeme;\n        }\n        processBuffer();\n        if (!newMode.returnBegin && !newMode.excludeBegin) {\n          modeBuffer = lexeme;\n        }\n      }\n      startNewMode(newMode, match);\n      return newMode.returnBegin ? 0 : lexeme.length;\n    }\n\n    /**\n     * Handle the potential end of mode\n     *\n     * @param {RegExpMatchArray} match - the current match\n     */\n    function doEndMatch(match) {\n      const lexeme = match[0];\n      const matchPlusRemainder = codeToHighlight.substring(match.index);\n\n      const endMode = endOfMode(top, match, matchPlusRemainder);\n      if (!endMode) { return NO_MATCH; }\n\n      const origin = top;\n      if (top.endScope && top.endScope._wrap) {\n        processBuffer();\n        emitKeyword(lexeme, top.endScope._wrap);\n      } else if (top.endScope && top.endScope._multi) {\n        processBuffer();\n        emitMultiClass(top.endScope, match);\n      } else if (origin.skip) {\n        modeBuffer += lexeme;\n      } else {\n        if (!(origin.returnEnd || origin.excludeEnd)) {\n          modeBuffer += lexeme;\n        }\n        processBuffer();\n        if (origin.excludeEnd) {\n          modeBuffer = lexeme;\n        }\n      }\n      do {\n        if (top.scope) {\n          emitter.closeNode();\n        }\n        if (!top.skip && !top.subLanguage) {\n          relevance += top.relevance;\n        }\n        top = top.parent;\n      } while (top !== endMode.parent);\n      if (endMode.starts) {\n        startNewMode(endMode.starts, match);\n      }\n      return origin.returnEnd ? 0 : lexeme.length;\n    }\n\n    function processContinuations() {\n      const list = [];\n      for (let current = top; current !== language; current = current.parent) {\n        if (current.scope) {\n          list.unshift(current.scope);\n        }\n      }\n      list.forEach(item => emitter.openNode(item));\n    }\n\n    /** @type {{type?: MatchType, index?: number, rule?: Mode}}} */\n    let lastMatch = {};\n\n    /**\n     *  Process an individual match\n     *\n     * @param {string} textBeforeMatch - text preceding the match (since the last match)\n     * @param {EnhancedMatch} [match] - the match itself\n     */\n    function processLexeme(textBeforeMatch, match) {\n      const lexeme = match && match[0];\n\n      // add non-matched text to the current mode buffer\n      modeBuffer += textBeforeMatch;\n\n      if (lexeme == null) {\n        processBuffer();\n        return 0;\n      }\n\n      // we've found a 0 width match and we're stuck, so we need to advance\n      // this happens when we have badly behaved rules that have optional matchers to the degree that\n      // sometimes they can end up matching nothing at all\n      // Ref: https://github.com/highlightjs/highlight.js/issues/2140\n      if (lastMatch.type === \"begin\" && match.type === \"end\" && lastMatch.index === match.index && lexeme === \"\") {\n        // spit the \"skipped\" character that our regex choked on back into the output sequence\n        modeBuffer += codeToHighlight.slice(match.index, match.index + 1);\n        if (!SAFE_MODE) {\n          /** @type {AnnotatedError} */\n          const err = new Error(`0 width match regex (${languageName})`);\n          err.languageName = languageName;\n          err.badRule = lastMatch.rule;\n          throw err;\n        }\n        return 1;\n      }\n      lastMatch = match;\n\n      if (match.type === \"begin\") {\n        return doBeginMatch(match);\n      } else if (match.type === \"illegal\" && !ignoreIllegals) {\n        // illegal match, we do not continue processing\n        /** @type {AnnotatedError} */\n        const err = new Error('Illegal lexeme \"' + lexeme + '\" for mode \"' + (top.scope || '<unnamed>') + '\"');\n        err.mode = top;\n        throw err;\n      } else if (match.type === \"end\") {\n        const processed = doEndMatch(match);\n        if (processed !== NO_MATCH) {\n          return processed;\n        }\n      }\n\n      // edge case for when illegal matches $ (end of line) which is technically\n      // a 0 width match but not a begin/end match so it's not caught by the\n      // first handler (when ignoreIllegals is true)\n      if (match.type === \"illegal\" && lexeme === \"\") {\n        // advance so we aren't stuck in an infinite loop\n        return 1;\n      }\n\n      // infinite loops are BAD, this is a last ditch catch all. if we have a\n      // decent number of iterations yet our index (cursor position in our\n      // parsing) still 3x behind our index then something is very wrong\n      // so we bail\n      if (iterations > 100000 && iterations > match.index * 3) {\n        const err = new Error('potential infinite loop, way more iterations than matches');\n        throw err;\n      }\n\n      /*\n      Why might be find ourselves here?  An potential end match that was\n      triggered but could not be completed.  IE, `doEndMatch` returned NO_MATCH.\n      (this could be because a callback requests the match be ignored, etc)\n\n      This causes no real harm other than stopping a few times too many.\n      */\n\n      modeBuffer += lexeme;\n      return lexeme.length;\n    }\n\n    const language = getLanguage(languageName);\n    if (!language) {\n      error(LANGUAGE_NOT_FOUND.replace(\"{}\", languageName));\n      throw new Error('Unknown language: \"' + languageName + '\"');\n    }\n\n    const md = compileLanguage(language);\n    let result = '';\n    /** @type {CompiledMode} */\n    let top = continuation || md;\n    /** @type Record<string,CompiledMode> */\n    const continuations = {}; // keep continuations for sub-languages\n    const emitter = new options.__emitter(options);\n    processContinuations();\n    let modeBuffer = '';\n    let relevance = 0;\n    let index = 0;\n    let iterations = 0;\n    let resumeScanAtSamePosition = false;\n\n    try {\n      if (!language.__emitTokens) {\n        top.matcher.considerAll();\n\n        for (;;) {\n          iterations++;\n          if (resumeScanAtSamePosition) {\n            // only regexes not matched previously will now be\n            // considered for a potential match\n            resumeScanAtSamePosition = false;\n          } else {\n            top.matcher.considerAll();\n          }\n          top.matcher.lastIndex = index;\n\n          const match = top.matcher.exec(codeToHighlight);\n          // console.log(\"match\", match[0], match.rule && match.rule.begin)\n\n          if (!match) break;\n\n          const beforeMatch = codeToHighlight.substring(index, match.index);\n          const processedCount = processLexeme(beforeMatch, match);\n          index = match.index + processedCount;\n        }\n        processLexeme(codeToHighlight.substring(index));\n      } else {\n        language.__emitTokens(codeToHighlight, emitter);\n      }\n\n      emitter.finalize();\n      result = emitter.toHTML();\n\n      return {\n        language: languageName,\n        value: result,\n        relevance,\n        illegal: false,\n        _emitter: emitter,\n        _top: top\n      };\n    } catch (err) {\n      if (err.message && err.message.includes('Illegal')) {\n        return {\n          language: languageName,\n          value: escape(codeToHighlight),\n          illegal: true,\n          relevance: 0,\n          _illegalBy: {\n            message: err.message,\n            index,\n            context: codeToHighlight.slice(index - 100, index + 100),\n            mode: err.mode,\n            resultSoFar: result\n          },\n          _emitter: emitter\n        };\n      } else if (SAFE_MODE) {\n        return {\n          language: languageName,\n          value: escape(codeToHighlight),\n          illegal: false,\n          relevance: 0,\n          errorRaised: err,\n          _emitter: emitter,\n          _top: top\n        };\n      } else {\n        throw err;\n      }\n    }\n  }\n\n  /**\n   * returns a valid highlight result, without actually doing any actual work,\n   * auto highlight starts with this and it's possible for small snippets that\n   * auto-detection may not find a better match\n   * @param {string} code\n   * @returns {HighlightResult}\n   */\n  function justTextHighlightResult(code) {\n    const result = {\n      value: escape(code),\n      illegal: false,\n      relevance: 0,\n      _top: PLAINTEXT_LANGUAGE,\n      _emitter: new options.__emitter(options)\n    };\n    result._emitter.addText(code);\n    return result;\n  }\n\n  /**\n  Highlighting with language detection. Accepts a string with the code to\n  highlight. Returns an object with the following properties:\n\n  - language (detected language)\n  - relevance (int)\n  - value (an HTML string with highlighting markup)\n  - secondBest (object with the same structure for second-best heuristically\n    detected language, may be absent)\n\n    @param {string} code\n    @param {Array<string>} [languageSubset]\n    @returns {AutoHighlightResult}\n  */\n  function highlightAuto(code, languageSubset) {\n    languageSubset = languageSubset || options.languages || Object.keys(languages);\n    const plaintext = justTextHighlightResult(code);\n\n    const results = languageSubset.filter(getLanguage).filter(autoDetection).map(name =>\n      _highlight(name, code, false)\n    );\n    results.unshift(plaintext); // plaintext is always an option\n\n    const sorted = results.sort((a, b) => {\n      // sort base on relevance\n      if (a.relevance !== b.relevance) return b.relevance - a.relevance;\n\n      // always award the tie to the base language\n      // ie if C++ and Arduino are tied, it's more likely to be C++\n      if (a.language && b.language) {\n        if (getLanguage(a.language).supersetOf === b.language) {\n          return 1;\n        } else if (getLanguage(b.language).supersetOf === a.language) {\n          return -1;\n        }\n      }\n\n      // otherwise say they are equal, which has the effect of sorting on\n      // relevance while preserving the original ordering - which is how ties\n      // have historically been settled, ie the language that comes first always\n      // wins in the case of a tie\n      return 0;\n    });\n\n    const [best, secondBest] = sorted;\n\n    /** @type {AutoHighlightResult} */\n    const result = best;\n    result.secondBest = secondBest;\n\n    return result;\n  }\n\n  /**\n   * Builds new class name for block given the language name\n   *\n   * @param {HTMLElement} element\n   * @param {string} [currentLang]\n   * @param {string} [resultLang]\n   */\n  function updateClassName(element, currentLang, resultLang) {\n    const language = (currentLang && aliases[currentLang]) || resultLang;\n\n    element.classList.add(\"hljs\");\n    element.classList.add(`language-${language}`);\n  }\n\n  /**\n   * Applies highlighting to a DOM node containing code.\n   *\n   * @param {HighlightedHTMLElement} element - the HTML element to highlight\n  */\n  function highlightElement(element) {\n    /** @type HTMLElement */\n    let node = null;\n    const language = blockLanguage(element);\n\n    if (shouldNotHighlight(language)) return;\n\n    fire(\"before:highlightElement\",\n      { el: element, language });\n\n    if (element.dataset.highlighted) {\n      console.log(\"Element previously highlighted. To highlight again, first unset `dataset.highlighted`.\", element);\n      return;\n    }\n\n    // we should be all text, no child nodes (unescaped HTML) - this is possibly\n    // an HTML injection attack - it's likely too late if this is already in\n    // production (the code has likely already done its damage by the time\n    // we're seeing it)... but we yell loudly about this so that hopefully it's\n    // more likely to be caught in development before making it to production\n    if (element.children.length > 0) {\n      if (!options.ignoreUnescapedHTML) {\n        console.warn(\"One of your code blocks includes unescaped HTML. This is a potentially serious security risk.\");\n        console.warn(\"https://github.com/highlightjs/highlight.js/wiki/security\");\n        console.warn(\"The element with unescaped HTML:\");\n        console.warn(element);\n      }\n      if (options.throwUnescapedHTML) {\n        const err = new HTMLInjectionError(\n          \"One of your code blocks includes unescaped HTML.\",\n          element.innerHTML\n        );\n        throw err;\n      }\n    }\n\n    node = element;\n    const text = node.textContent;\n    const result = language ? highlight(text, { language, ignoreIllegals: true }) : highlightAuto(text);\n\n    element.innerHTML = result.value;\n    element.dataset.highlighted = \"yes\";\n    updateClassName(element, language, result.language);\n    element.result = {\n      language: result.language,\n      // TODO: remove with version 11.0\n      re: result.relevance,\n      relevance: result.relevance\n    };\n    if (result.secondBest) {\n      element.secondBest = {\n        language: result.secondBest.language,\n        relevance: result.secondBest.relevance\n      };\n    }\n\n    fire(\"after:highlightElement\", { el: element, result, text });\n  }\n\n  /**\n   * Updates highlight.js global options with the passed options\n   *\n   * @param {Partial<HLJSOptions>} userOptions\n   */\n  function configure(userOptions) {\n    options = inherit(options, userOptions);\n  }\n\n  // TODO: remove v12, deprecated\n  const initHighlighting = () => {\n    highlightAll();\n    deprecated(\"10.6.0\", \"initHighlighting() deprecated.  Use highlightAll() now.\");\n  };\n\n  // TODO: remove v12, deprecated\n  function initHighlightingOnLoad() {\n    highlightAll();\n    deprecated(\"10.6.0\", \"initHighlightingOnLoad() deprecated.  Use highlightAll() now.\");\n  }\n\n  let wantsHighlight = false;\n\n  /**\n   * auto-highlights all pre>code elements on the page\n   */\n  function highlightAll() {\n    // if we are called too early in the loading process\n    if (document.readyState === \"loading\") {\n      wantsHighlight = true;\n      return;\n    }\n\n    const blocks = document.querySelectorAll(options.cssSelector);\n    blocks.forEach(highlightElement);\n  }\n\n  function boot() {\n    // if a highlight was requested before DOM was loaded, do now\n    if (wantsHighlight) highlightAll();\n  }\n\n  // make sure we are in the browser environment\n  if (typeof window !== 'undefined' && window.addEventListener) {\n    window.addEventListener('DOMContentLoaded', boot, false);\n  }\n\n  /**\n   * Register a language grammar module\n   *\n   * @param {string} languageName\n   * @param {LanguageFn} languageDefinition\n   */\n  function registerLanguage(languageName, languageDefinition) {\n    let lang = null;\n    try {\n      lang = languageDefinition(hljs);\n    } catch (error$1) {\n      error(\"Language definition for '{}' could not be registered.\".replace(\"{}\", languageName));\n      // hard or soft error\n      if (!SAFE_MODE) { throw error$1; } else { error(error$1); }\n      // languages that have serious errors are replaced with essentially a\n      // \"plaintext\" stand-in so that the code blocks will still get normal\n      // css classes applied to them - and one bad language won't break the\n      // entire highlighter\n      lang = PLAINTEXT_LANGUAGE;\n    }\n    // give it a temporary name if it doesn't have one in the meta-data\n    if (!lang.name) lang.name = languageName;\n    languages[languageName] = lang;\n    lang.rawDefinition = languageDefinition.bind(null, hljs);\n\n    if (lang.aliases) {\n      registerAliases(lang.aliases, { languageName });\n    }\n  }\n\n  /**\n   * Remove a language grammar module\n   *\n   * @param {string} languageName\n   */\n  function unregisterLanguage(languageName) {\n    delete languages[languageName];\n    for (const alias of Object.keys(aliases)) {\n      if (aliases[alias] === languageName) {\n        delete aliases[alias];\n      }\n    }\n  }\n\n  /**\n   * @returns {string[]} List of language internal names\n   */\n  function listLanguages() {\n    return Object.keys(languages);\n  }\n\n  /**\n   * @param {string} name - name of the language to retrieve\n   * @returns {Language | undefined}\n   */\n  function getLanguage(name) {\n    name = (name || '').toLowerCase();\n    return languages[name] || languages[aliases[name]];\n  }\n\n  /**\n   *\n   * @param {string|string[]} aliasList - single alias or list of aliases\n   * @param {{languageName: string}} opts\n   */\n  function registerAliases(aliasList, { languageName }) {\n    if (typeof aliasList === 'string') {\n      aliasList = [aliasList];\n    }\n    aliasList.forEach(alias => { aliases[alias.toLowerCase()] = languageName; });\n  }\n\n  /**\n   * Determines if a given language has auto-detection enabled\n   * @param {string} name - name of the language\n   */\n  function autoDetection(name) {\n    const lang = getLanguage(name);\n    return lang && !lang.disableAutodetect;\n  }\n\n  /**\n   * Upgrades the old highlightBlock plugins to the new\n   * highlightElement API\n   * @param {HLJSPlugin} plugin\n   */\n  function upgradePluginAPI(plugin) {\n    // TODO: remove with v12\n    if (plugin[\"before:highlightBlock\"] && !plugin[\"before:highlightElement\"]) {\n      plugin[\"before:highlightElement\"] = (data) => {\n        plugin[\"before:highlightBlock\"](\n          Object.assign({ block: data.el }, data)\n        );\n      };\n    }\n    if (plugin[\"after:highlightBlock\"] && !plugin[\"after:highlightElement\"]) {\n      plugin[\"after:highlightElement\"] = (data) => {\n        plugin[\"after:highlightBlock\"](\n          Object.assign({ block: data.el }, data)\n        );\n      };\n    }\n  }\n\n  /**\n   * @param {HLJSPlugin} plugin\n   */\n  function addPlugin(plugin) {\n    upgradePluginAPI(plugin);\n    plugins.push(plugin);\n  }\n\n  /**\n   * @param {HLJSPlugin} plugin\n   */\n  function removePlugin(plugin) {\n    const index = plugins.indexOf(plugin);\n    if (index !== -1) {\n      plugins.splice(index, 1);\n    }\n  }\n\n  /**\n   *\n   * @param {PluginEvent} event\n   * @param {any} args\n   */\n  function fire(event, args) {\n    const cb = event;\n    plugins.forEach(function(plugin) {\n      if (plugin[cb]) {\n        plugin[cb](args);\n      }\n    });\n  }\n\n  /**\n   * DEPRECATED\n   * @param {HighlightedHTMLElement} el\n   */\n  function deprecateHighlightBlock(el) {\n    deprecated(\"10.7.0\", \"highlightBlock will be removed entirely in v12.0\");\n    deprecated(\"10.7.0\", \"Please use highlightElement now.\");\n\n    return highlightElement(el);\n  }\n\n  /* Interface definition */\n  Object.assign(hljs, {\n    highlight,\n    highlightAuto,\n    highlightAll,\n    highlightElement,\n    // TODO: Remove with v12 API\n    highlightBlock: deprecateHighlightBlock,\n    configure,\n    initHighlighting,\n    initHighlightingOnLoad,\n    registerLanguage,\n    unregisterLanguage,\n    listLanguages,\n    getLanguage,\n    registerAliases,\n    autoDetection,\n    inherit,\n    addPlugin,\n    removePlugin\n  });\n\n  hljs.debugMode = function() { SAFE_MODE = false; };\n  hljs.safeMode = function() { SAFE_MODE = true; };\n  hljs.versionString = version;\n\n  hljs.regex = {\n    concat: concat,\n    lookahead: lookahead,\n    either: either,\n    optional: optional,\n    anyNumberOfTimes: anyNumberOfTimes\n  };\n\n  for (const key in MODES) {\n    // @ts-ignore\n    if (typeof MODES[key] === \"object\") {\n      // @ts-ignore\n      deepFreeze(MODES[key]);\n    }\n  }\n\n  // merge all the modes/regexes into our main object\n  Object.assign(hljs, MODES);\n\n  return hljs;\n};\n\n// Other names for the variable may break build script\nconst highlight = HLJS({});\n\n// returns a new instance of the highlighter to be used for extensions\n// check https://github.com/wooorm/lowlight/issues/47\nhighlight.newInstance = () => HLJS({});\n\nmodule.exports = highlight;\nhighlight.HighlightJS = highlight;\nhighlight.default = highlight;\n","export const queryLinkLabels = {\n  label: \"Run or edit the query\",\n  title: \"Open the SPARQL query in an editor in a new tab\",\n};\n\nexport function getEditorUrl(query: string, endpointUrl: string = \"\") {\n  return `https://sib-swiss.github.io/sparql-editor/?${endpointUrl ? `endpoint=${endpointUrl}&` : \"\"}query=${encodeURIComponent(query)}`;\n}\n\n// Get filters for color hex here: https://codepen.io/sosuke/pen/Pjoqqp\nexport const style = `chat-with-context {\n  button:hover {\n    filter: brightness(90%);\n  }\n}\n.iconBtn {\n  filter: invert(44%) sepia(22%) saturate(496%) hue-rotate(176deg) brightness(93%) contrast(79%);\n}`;\n\n// // A function to extract a SPARQL query from markdown text\n// export function extractSparqlQuery(markdownContent: string) {\n//   // Regular expression to match SPARQL queries within code blocks\n//   const queryRegex = /```sparql([\\s\\S]*?)```/g;\n//   const queries = [...markdownContent.matchAll(queryRegex)].map(match => match[1].trim());\n\n//   // Get the last SPARQL query\n//   const lastQuery = queries.length > 0 ? queries[queries.length - 1] : null;\n//   if (!lastQuery) return null;\n\n//   const endpointRegex = /#.*(https?:\\/\\/[^\\s]+)/i;\n//   const endpointMatch = lastQuery.match(endpointRegex);\n//   const endpointUrl = endpointMatch ? endpointMatch[1] : null;\n//   if (!endpointUrl) return null;\n//   return getEditorUrl(lastQuery, endpointUrl);\n// }\n","/*\nLanguage: Turtle\nAuthor: Mark Ellis <mark.ellis@stardog.com>, Vladimir Alexiev <vladimir.alexiev@ontotext.com>\nCategory: common\nDescription: Terse RDF Triple Language for the semantic web\nWebsite: https://www.w3.org/TR/turtle/\n\nLanguage: SPARQL\nRequires: turtle.js\nAuthor: Mark Ellis <mark.ellis@stardog.com>, Vladimir Alexiev <vladimir.alexiev@ontotext.com>\nCategory: common\nDescription: SPARQL Protocol and RDF Query Language for the semantic web\nWebsite: https://www.w3.org/TR/sparql11-query/, http://www.w3.org/TR/sparql11-update/, https://www.w3.org/TR/sparql11-federated-query/, http://rawgit2.com/VladimirAlexiev/grammar-diagrams/master/sparql-grammar.xhtml\n\nIt's quite horrible highlighting https://github.com/highlightjs/highlightjs-turtle Variables are same colors as prefixed URIs...\nThere is also https://github.com/redmer/highlightjs-sparql but it is even worse because it imports a ttl language that does not exist, hats off\n*/\n\nexport function hljsDefineTurtle(hljs: any) {\n  var KEYWORDS = {\n    keyword: \"base|10 prefix|10 @base|10 @prefix|10\",\n    literal: \"true|0 false|0\",\n    built_in: \"a|0\",\n  };\n\n  var IRI_LITERAL = {\n    // https://www.w3.org/TR/turtle/#grammar-production-IRIREF\n    className: \"literal\",\n    relevance: 1, // XML tags look also like relative IRIs\n    begin: /</,\n    end: />/,\n    // eslint-disable-next-line no-control-regex\n    illegal: /[^\\x00-\\x20<>\"{}|^`]/, // TODO: https://www.w3.org/TR/turtle/#grammar-production-UCHAR\n  };\n\n  // https://www.w3.org/TR/turtle/#terminals\n  var PN_CHARS_BASE =\n    \"A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\u10000-\\uEFFFF\";\n  var PN_CHARS_U = PN_CHARS_BASE + \"_\";\n  var PN_CHARS = \"-\" + PN_CHARS_U + \"0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040\";\n  var BLANK_NODE_LABEL = \"_:[\" + PN_CHARS_U + \"0-9]([\" + PN_CHARS + \".]*[\" + PN_CHARS + \"])?\";\n  var PN_PREFIX = \"[\" + PN_CHARS_BASE + \"]([\" + PN_CHARS + \".]*[\" + PN_CHARS + \"])?\";\n  var PERCENT = \"%[0-9A-Fa-f][0-9A-Fa-f]\";\n  var PN_LOCAL_ESC = \"\\\\\\\\[_~.!$&'()*+,;=/?#@%-]\";\n  var PLX = PERCENT + \"|\" + PN_LOCAL_ESC;\n  var PNAME_NS = \"(\" + PN_PREFIX + \")?:\";\n  var PN_LOCAL =\n    \"([\" + PN_CHARS_U + \":0-9]|\" + PLX + \")([\" + PN_CHARS + \".:]|\" + PLX + \")*([\" + PN_CHARS + \":]|\" + PLX + \")?\";\n  var PNAME_LN = PNAME_NS + PN_LOCAL;\n  var PNAME_NS_or_LN = PNAME_NS + \"(\" + PN_LOCAL + \")?\";\n\n  var PNAME = {\n    begin: PNAME_NS_or_LN,\n    relevance: 0,\n    className: \"symbol\",\n  };\n\n  var BLANK_NODE = {\n    begin: BLANK_NODE_LABEL,\n    relevance: 10,\n    className: \"template-variable\",\n  };\n\n  var LANGTAG = {\n    begin: /@[a-zA-Z]+([a-zA-Z0-9-]+)*/,\n    className: \"type\",\n    relevance: 5, // also catches objectivec keywords like: @protocol, @optional\n  };\n\n  var DATATYPE = {\n    begin: \"\\\\^\\\\^\" + PNAME_LN,\n    className: \"type\",\n    relevance: 10,\n  };\n\n  var TRIPLE_APOS_STRING = {\n    begin: /'''/,\n    end: /'''/,\n    className: \"string\",\n    relevance: 0,\n  };\n\n  var TRIPLE_QUOTE_STRING = {\n    begin: /\"\"\"/,\n    end: /\"\"\"/,\n    className: \"string\",\n    relevance: 0,\n  };\n\n  var APOS_STRING_LITERAL = JSON.parse(JSON.stringify(hljs.APOS_STRING_MODE));\n  APOS_STRING_LITERAL.relevance = 0;\n\n  var QUOTE_STRING_LITERAL = JSON.parse(JSON.stringify(hljs.QUOTE_STRING_MODE));\n  QUOTE_STRING_LITERAL.relevance = 0;\n\n  var NUMBER = JSON.parse(JSON.stringify(hljs.C_NUMBER_MODE));\n  NUMBER.relevance = 0;\n\n  return {\n    case_insensitive: true,\n    keywords: KEYWORDS,\n    aliases: [\"turtle\", \"ttl\", \"n3\", \"ntriples\", \"shex\", \"trig\"],\n    contains: [\n      LANGTAG,\n      DATATYPE,\n      IRI_LITERAL,\n      BLANK_NODE,\n      PNAME,\n      TRIPLE_APOS_STRING,\n      TRIPLE_QUOTE_STRING, // order matters\n      APOS_STRING_LITERAL,\n      QUOTE_STRING_LITERAL,\n      NUMBER,\n      hljs.HASH_COMMENT_MODE,\n    ],\n    exports: {\n      LANGTAG: LANGTAG,\n      DATATYPE: DATATYPE,\n      IRI_LITERAL: IRI_LITERAL,\n      BLANK_NODE: BLANK_NODE,\n      PNAME: PNAME,\n      TRIPLE_APOS_STRING: TRIPLE_APOS_STRING,\n      TRIPLE_QUOTE_STRING: TRIPLE_QUOTE_STRING,\n      APOS_STRING_LITERAL: APOS_STRING_LITERAL,\n      QUOTE_STRING_LITERAL: QUOTE_STRING_LITERAL,\n      NUMBER: NUMBER,\n      KEYWORDS: KEYWORDS,\n    },\n  };\n}\n\nexport function hljsDefineSparql(hljs: any) {\n  var ttl = hljs.getLanguage(\"ttl\").exports;\n  var KEYWORDS = {\n    keyword:\n      \"base|10 prefix|10 @base|10 @prefix|10 add all as|0 ask bind by|0 clear construct|10 copymove create data default define delete describe distinct drop exists filter from|0 graph|10 group having in|0 insert limit load minus named|10 not offset optional order reduced select|0 service silent to union using values where with|0\",\n    function:\n      \"abs asc avg bound ceil coalesce concat containsstrbefore count dayhours desc encode_for_uri floor group_concat if|0 iri isblank isiri isliteral isnumeric isuri langdatatype langmatches lcase max md5 min|0 minutes month now rand regex replace round sameterm sample seconds separator sha1 sha256 sha384 sha512 str strafter strdt strends strlang strlen strstarts struuid substr sum then timezone tz ucase uribnode uuid year\",\n    literal: \"true|0 false|0\",\n    built_in: \"a|0\",\n  };\n\n  var VARIABLE = {\n    className: \"variable\",\n    begin: \"[?$]\" + hljs.IDENT_RE,\n    relevance: 0,\n  };\n\n  var JSON_QUOTE_STRING = {\n    begin: /\"\"\"\\s*\\{/, // TODO why can't I write (?=\\{)\n    end: /\"\"\"/,\n    subLanguage: \"json\",\n    excludeBegin: true,\n    excludeEnd: true,\n    relevance: 0,\n  };\n\n  var JSON_APOS_STRING = {\n    begin: /'''\\s*\\{/, // TODO why can't I write (?=\\{)\n    end: /'''/,\n    subLanguage: \"json\",\n    excludeBegin: true,\n    excludeEnd: true,\n    relevance: 0,\n  };\n\n  return {\n    case_insensitive: true,\n    keywords: KEYWORDS,\n    aliases: [\"sparql\", \"rql\", \"rq\", \"ru\"],\n    contains: [\n      ttl.LANGTAG,\n      ttl.DATATYPE,\n      ttl.IRI_LITERAL,\n      ttl.BLANK_NODE,\n      ttl.PNAME,\n      VARIABLE,\n      JSON_QUOTE_STRING, // order matters\n      JSON_APOS_STRING,\n      ttl.TRIPLE_QUOTE_STRING,\n      ttl.TRIPLE_APOS_STRING,\n      ttl.QUOTE_STRING_LITERAL,\n      ttl.APOS_STRING_LITERAL,\n      ttl.NUMBER,\n      hljs.HASH_COMMENT_MODE,\n    ],\n  };\n}\n\n// window.hljsDefineSparql = hljsDefineSparql;\n","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20class='lucide%20lucide-arrow-up-icon%20lucide-arrow-up'%3e%3cpath%20d='m5%2012%207-7%207%207'/%3e%3cpath%20d='M12%2019V5'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20class='feather%20feather-x'%3e%3cline%20x1='18'%20y1='6'%20x2='6'%20y2='18'%3e%3c/line%3e%3cline%20x1='6'%20y1='6'%20x2='18'%20y2='18'%3e%3c/line%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20class='feather%20feather-edit'%3e%3cpath%20d='M11%204H4a2%202%200%200%200-2%202v14a2%202%200%200%200%202%202h14a2%202%200%200%200%202-2v-7'%3e%3c/path%3e%3cpath%20d='M18.5%202.5a2.121%202.121%200%200%201%203%203L12%2015l-4%201%201-4%209.5-9.5z'%3e%3c/path%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20class='feather%20feather-square'%3e%3crect%20x='3'%20y='3'%20width='18'%20height='18'%20rx='2'%20ry='2'%3e%3c/rect%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20class='feather%20feather-thumbs-down'%3e%3cpath%20d='M10%2015v4a3%203%200%200%200%203%203l4-9V2H5.72a2%202%200%200%200-2%201.7l-1.38%209a2%202%200%200%200%202%202.3zm7-13h2.67A2.31%202.31%200%200%201%2022%204v7a2.31%202.31%200%200%201-2.33%202H17'%3e%3c/path%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%20class='feather%20feather-thumbs-up'%3e%3cpath%20d='M14%209V5a3%203%200%200%200-3-3l-4%209v11h11.28a2%202%200%200%200%202-1.7l1.38-9a2%202%200%200%200-2-2.3zM7%2022H4a2%202%200%200%201-2-2v-7a2%202%200%200%201%202-2h3'%3e%3c/path%3e%3c/svg%3e\"","import {Accessor, createSignal, Setter} from \"solid-js\";\n\nimport {getEditorUrl, queryLinkLabels} from \"./utils\";\n\ntype Links = {\n  url: string;\n  label: string;\n  title: string;\n};\n\ntype Step = {\n  node_id: string;\n  label: string;\n  details: string; // Details about the step as markdown string\n  substeps?: {label: string; details: string}[];\n};\n\nexport type Message = {\n  role: \"assistant\" | \"user\";\n  content: Accessor<string>;\n  setContent: Setter<string>;\n  steps: Accessor<Step[]>;\n  setSteps: Setter<Step[]>;\n  links: Accessor<Links[]>;\n  setLinks: Setter<Links[]>;\n};\n\nexport class ChatState {\n  apiUrl: string;\n  apiKey: string;\n  model: string;\n  messages: Accessor<Message[]>;\n  setMessages: Setter<Message[]>;\n  abortController: AbortController;\n  onMessageUpdate: () => void;\n\n  constructor({apiUrl = \"\", apiKey = \"\", model = \"\"}: {apiUrl?: string; apiKey?: string; model?: string}) {\n    this.apiUrl = apiUrl;\n    this.apiKey = apiKey;\n    this.model = model;\n\n    const [messages, setMessages] = createSignal<Message[]>([]);\n    this.messages = messages;\n    this.setMessages = setMessages;\n    this.abortController = new AbortController();\n    this.onMessageUpdate = () => {};\n  }\n\n  abortRequest = () => {\n    this.abortController.abort();\n    this.abortController = new AbortController();\n  };\n\n  lastMsg = () => this.messages()[this.messages().length - 1];\n\n  scrollToInput = () => {};\n\n  appendMessage = (msgContent: string, role: \"assistant\" | \"user\" = \"assistant\") => {\n    const [content, setContent] = createSignal(msgContent);\n    const [steps, setSteps] = createSignal<Step[]>([]);\n    const [links, setLinks] = createSignal<Links[]>([]);\n    const newMsg: Message = {content, setContent, steps, setSteps, role, links, setLinks};\n    // const query = extractSparqlQuery(msgContent);\n    // if (query) newMsg.setLinks([{url: query, ...queryLinkLabels}]);\n    this.setMessages(messages => [...messages, newMsg]);\n  };\n\n  appendContentToLastMsg = (newContent: string, newline: boolean = false) => {\n    this.lastMsg().setContent(content => content + (newline ? \"\\n\\n\" : \"\") + newContent);\n    this.onMessageUpdate();\n  };\n\n  appendStepToLastMsg = (\n    node_id: string,\n    label: string,\n    details: string = \"\",\n    substeps: {label: string; details: string}[] = [],\n  ) => {\n    this.lastMsg().setSteps(steps => [...steps, {node_id, label, details, substeps}]);\n    this.scrollToInput();\n    this.onMessageUpdate();\n    // this.inputTextEl.scrollIntoView({behavior: \"smooth\"});\n  };\n}\n\n// Stream a response from various LLM agent providers (OpenAI-like, LangGraph, LangServe)\nexport async function streamResponse(state: ChatState, question: string) {\n  state.appendMessage(question, \"user\");\n  // Query LangGraph through our custom API\n  await streamCustomLangGraph(state);\n  // if (state.apiUrl.endsWith(\":2024/\") || state.apiUrl.endsWith(\":8123/\")) {\n  //   // Query LangGraph API\n  //   await streamLangGraphApi(state);\n  // } else if (state.apiUrl.endsWith(\"/completions/\")) {\n  //   // Query the OpenAI-compatible chat API\n  //   await streamOpenAILikeApi(state);\n  // } else {\n  //   // Query LangGraph through our custom API\n  //   await streamCustomLangGraph(state);\n  // }\n}\n\nasync function processLangGraphChunk(state: ChatState, chunk: any) {\n  if (chunk.event === \"error\") {\n    throw new Error(`An error occurred. Please try again. ${chunk.data.error}: ${chunk.data.message}`);\n  }\n  // console.log(chunk);\n  // Handle updates to the state (nodes that are retrieving stuff without querying the LLM usually)\n  if (chunk.event === \"updates\") {\n    // console.log(\"UPDATES\", chunk);\n    for (const nodeId of Object.keys(chunk.data)) {\n      const nodeData = chunk.data[nodeId];\n      if (!nodeData) continue;\n      if (nodeData.steps) {\n        // Handle most generic steps output sent by the agent\n        for (const step of nodeData.steps) {\n          // console.log(\"STEP\", step);\n          // Handle step specific to post-generation validation\n          if (step.type === \"recall\") {\n            // When `recall` is called, the model will re-generate the response, so we create a new message\n            // state.lastMsg().setContent(\"\");\n            state.appendMessage(\"\", \"assistant\");\n          } else if (step.fixed_message) {\n            // If the update contains a message with a fix\n            state.lastMsg().setContent(step.fixed_message);\n          }\n          state.appendStepToLastMsg(nodeId, step.label, step.details, step.substeps);\n        }\n      }\n      if (nodeData.structured_output) {\n        // Special case to handle things extracted from output\n        // Here we add links to open the SPARQL query in an editor\n        if (nodeData.structured_output.sparql_query) {\n          state.lastMsg().setLinks([\n            {\n              url: getEditorUrl(\n                nodeData.structured_output.sparql_query,\n                nodeData.structured_output.sparql_endpoint_url,\n              ),\n              ...queryLinkLabels,\n            },\n          ]);\n        }\n      }\n    }\n  }\n  // Handle messages from the model\n  if (chunk.event === \"messages\") {\n    const [msg, metadata] = chunk.data;\n    if (metadata.structured_output_format) return;\n    // console.log(\"MESSAGES\", msg, metadata);\n    // if (msg.tool_calls?.length > 0) {\n    //   // Tools calls requested by the model\n    //   const toolNames = msg.tool_calls.map((tool_call: any) => tool_call.name).join(\", \");\n    //   if (toolNames) state.appendStepToLastMsg(metadata.langgraph_node, `🔧 Calling tool ${toolNames}`);\n    //   console.log(\"TOOL call\", msg, metadata);\n    // }\n    if (msg.content && msg.type === \"tool\") {\n      // If tool called by model\n      // console.log(\"TOOL res\", msg, metadata);\n      const name = msg.name ? msg.name.replace(/_/g, \" \").replace(/^\\w/, (c: string) => c.toUpperCase()) : \"Tool\";\n      const icon = msg.name.includes(\"resources\") ? \"📚\" : msg.name.includes(\"execute\") ? \"📡\" : \"🔧\";\n      state.appendMessage(\"\", \"assistant\");\n      state.appendStepToLastMsg(metadata.langgraph_node, `${icon} ${name}`, msg.content);\n    } else if (msg.content === \"</think>\" && msg.type === \"AIMessageChunk\") {\n      // Putting thinking process in a separate step\n      state.appendContentToLastMsg(msg.content);\n      state.appendStepToLastMsg(metadata.langgraph_node, \"💭 Thought process\", state.lastMsg().content());\n      state.lastMsg().setContent(\"\");\n    } else if (msg.content && msg.type === \"AIMessageChunk\" && metadata.langgraph_node === \"call_model\") {\n      // This will only stream response from the langgraph node \"call_model\"\n      // console.log(\"AIMessageChunk\", msg, metadata);\n      state.appendContentToLastMsg(msg.content);\n    }\n  }\n}\n\nasync function streamCustomLangGraph(state: ChatState) {\n  const response = await fetch(`${state.apiUrl}`, {\n    method: \"POST\",\n    headers: {\n      \"Content-Type\": \"application/json\",\n      Authorization: `Bearer ${state.apiKey}`,\n    },\n    signal: state.abortController.signal,\n    body: JSON.stringify({\n      messages: state.messages().map(({content, role}) => ({content: content(), role})),\n      stream: true,\n      ...(state.model ? {model: state.model} : {}),\n    }),\n  });\n\n  state.appendMessage(\"\", \"assistant\");\n  const reader = response.body?.getReader()!;\n  const decoder = new TextDecoder(\"utf-8\");\n  let buffer = \"\"; // Buffer for incomplete chunks\n  // Iterate stream response\n  while (true) {\n    if (reader) {\n      const {value, done} = await reader.read();\n      if (done) break;\n      const chunkStr = decoder.decode(value, {stream: true});\n      buffer += chunkStr;\n      let lines = buffer.split(\"\\n\");\n      // Keep the last line if it's incomplete\n      buffer = lines.pop() || \"\";\n      for (const line of lines.filter(line => line.trim() !== \"\")) {\n        if (line === \"data: [DONE]\") return;\n        if (line.startsWith(\"data: \")) {\n          try {\n            const json = JSON.parse(line.substring(6));\n            processLangGraphChunk(state, json);\n          } catch (e) {\n            console.log(\"Error parsing line\", e, line);\n          }\n        }\n      }\n    }\n  }\n}\n\n// // Types of objects used when interacting with LLM agents\n// type RefenceDocument = {\n//   page_content: string;\n//   metadata: {\n//     doc_type: string;\n//     endpoint_url: string;\n//     question: string;\n//     answer: string;\n//     score: number;\n//   };\n// };\n\n// // NOTE: experimental, kept for reference, would need to be updated to properly uses steps output\n// import {Client} from \"@langchain/langgraph-sdk\";\n// import { RemoteGraph } from \"@langchain/langgraph/remote\";\n// import { isAIMessageChunk } from \"@langchain/core/messages\";\n// async function streamLangGraphApi(state: ChatState) {\n//   const client = new Client({apiUrl: state.apiUrl});\n//   const graphName = \"agent\";\n\n//   // https://langchain-ai.github.io/langgraphjs/how-tos/stream-tokens\n//   // https://langchain-ai.github.io/langgraph/cloud/how-tos/stream_messages\n//   // https://langchain-ai.github.io/langgraph/concepts/streaming/\n//   const thread = await client.threads.create();\n//   const streamResponse = client.runs.stream(thread[\"thread_id\"], graphName, {\n//     // input: {messages: [{role: \"human\", content: \"what is 3 times 6?\"}]},\n//     // input: {messages: [{role: \"human\", content: question}]},\n//     input: {messages: state.messages().map(({content, role}) => ({content: content(), role}))},\n//     config: {configurable: {}},\n//     streamMode: [\"messages-tuple\", \"updates\"],\n//     signal: state.abortController.signal,\n//   });\n//   state.appendMessage(\"\", \"assistant\");\n//   for await (const chunk of streamResponse) {\n//     processLangGraphChunk(state, chunk);\n//   }\n// }\n\n// async function streamOpenAILikeApi(state: ChatState) {\n//   // Experimental, would need to be updated to properly uses steps output\n//   const response = await fetch(`${state.apiUrl}chat/completions`, {\n//     method: \"POST\",\n//     headers: {\n//       \"Content-Type\": \"application/json\",\n//       Authorization: `Bearer ${state.apiKey}`,\n//     },\n//     signal: state.abortController.signal,\n//     body: JSON.stringify({\n//       messages: state.messages().map(({content, role}) => ({content: content(), role})),\n//       model: state.model,\n//       // model: \"azure_ai/mistral-large\",\n//       max_tokens: 500,\n//       stream: true,\n//       // api_key: state.apiKey,\n//     }),\n//   });\n\n//   state.appendMessage(\"\", \"assistant\");\n//   const reader = response.body?.getReader()!;\n//   const decoder = new TextDecoder(\"utf-8\");\n//   let partialLine = \"\"; // Buffer for incomplete lines\n\n//   // Iterate stream response\n//   while (true) {\n//     if (reader) {\n//       const {value, done} = await reader.read();\n//       if (done) break;\n//       const chunkStr = decoder.decode(value, {stream: true});\n//       // Combine with any leftover data from the previous iteration\n//       const combined = partialLine + chunkStr;\n//       if (partialLine) partialLine = \"\";\n//       for (const line of combined.split(\"\\n\").filter(line => line.trim() !== \"\")) {\n//         if (line === \"data: [DONE]\") return;\n//         if (line.startsWith(\"data: \")) {\n//           // console.log(line)\n//           try {\n//             const json = JSON.parse(line.substring(6));\n//             if (json.retrieved_docs) {\n//               state.appendStepToLastMsg(\n//                 `📚️ Using ${json.retrieved_docs.length} documents`,\n//                 \"retrieve\",\n//                 json.retrieved_docs,\n//               );\n//             } else {\n//               const newContent = json.choices[0].delta?.content;\n//               if (newContent) {\n//                 // console.log(newContent);\n//                 state.appendContentToLastMsg(newContent);\n//               }\n//             }\n//           } catch {\n//             partialLine = line;\n//           }\n//         }\n//       }\n//     }\n//   }\n\n//   // Extract query once message complete\n//   // const query = extractSparqlQuery(state.lastMsg().content());\n//   // if (query) state.lastMsg().setLinks([{url: query, ...queryLinkLabels}]);\n// }\n","import {createSignal, For, createEffect} from \"solid-js\";\nimport {customElement, noShadowDOM} from \"solid-element\";\nimport {marked} from \"marked\";\nimport DOMPurify from \"dompurify\";\nimport hljs from \"highlight.js/lib/core\";\nimport \"highlight.js/styles/default.min.css\";\n\nimport {style} from \"./utils\";\nimport {hljsDefineSparql, hljsDefineTurtle} from \"./highlight\";\nimport arrowUpIcon from \"./assets/arrow-up.svg\";\nimport xIcon from \"./assets/x.svg\";\nimport editIcon from \"./assets/edit.svg\";\nimport squareIcon from \"./assets/square.svg\";\nimport thumbsDownIcon from \"./assets/thumbs-down.svg\";\nimport thumbsUpIcon from \"./assets/thumbs-up.svg\";\nimport \"./style.css\";\nimport {streamResponse, ChatState} from \"./providers\";\n// import json from \"highlight.js/lib/languages/json\";\n\n// Get icons svg from https://feathericons.com/\n// SolidJS custom element: https://github.com/solidjs/solid/blob/main/src/solid-element/README.md\n// https://github.com/solidjs/templates/tree/main/ts-tailwindcss\n\n/**\n * Custom element to create a chat interface with a context-aware assistant.\n * @example <chat-with-context api=\"http://localhost:8000/\"></chat-with-context>\n */\ncustomElement(\n  \"chat-with-context\",\n  {chatEndpoint: \"\", examples: \"\", apiKey: \"\", feedbackEndpoint: \"\", model: \"\"},\n  props => {\n    noShadowDOM();\n    hljs.registerLanguage(\"ttl\", hljsDefineTurtle);\n    hljs.registerLanguage(\"sparql\", hljsDefineSparql);\n    // hljs.registerLanguage(\"json\", json);\n\n    const [examples, setExamples] = createSignal<string[]>([]);\n    const [warningMsg, setWarningMsg] = createSignal(\"\");\n    const [loading, setLoading] = createSignal(false);\n    const [dialogOpen, setDialogOpen] = createSignal(\"\");\n    const [selectedDocsTab, setSelectedDocsTab] = createSignal(\"\");\n\n    const [feedbackEndpoint, setFeedbackEndpoint] = createSignal(\"\");\n    const [feedbackSent, setFeedbackSent] = createSignal(false);\n\n    const state = new ChatState({});\n    let chatContainerEl!: HTMLDivElement;\n    let inputTextEl!: HTMLTextAreaElement;\n\n    marked.use({\n      gfm: true, // Includes autolinker\n    });\n\n    createEffect(() => {\n      if (props.chatEndpoint === \"\") setWarningMsg(\"Please provide an API URL for the chat component to work.\");\n      state.apiUrl = props.chatEndpoint;\n      state.apiKey = props.apiKey;\n      state.model = props.model;\n      // Prevent automatic scrolling when typing — keep the window where it is.\n      state.scrollToInput = () => {};\n      state.onMessageUpdate = () => highlightAll();\n      setExamples(props.examples.split(\",\").map(value => value.trim()));\n      setFeedbackEndpoint(props.feedbackEndpoint);\n      fixInputHeight();\n    });\n\n    const openDialog = (dialogId: string) => {\n      setDialogOpen(dialogId);\n      (document.getElementById(dialogId) as HTMLDialogElement).showModal();\n      history.pushState({dialogOpen: true}, \"\");\n      document.body.style.overflow = \"hidden\";\n      highlightAll();\n    };\n\n    const closeDialog = () => {\n      document.body.style.overflow = \"\";\n      const dialogEl = document.getElementById(dialogOpen()) as HTMLDialogElement;\n      if (dialogEl) dialogEl.close();\n      setDialogOpen(\"\");\n      // history.back();\n    };\n\n    // Close open dialogs with the browser navigation \"go back one page\" button\n    createEffect(() => {\n      window.addEventListener(\"popstate\", event => {\n        if (dialogOpen()) {\n          event.preventDefault();\n          closeDialog();\n        }\n      });\n    });\n\n    const highlightAll = () => {\n      document.querySelectorAll(\"pre code:not(.hljs)\").forEach(block => {\n        hljs.highlightElement(block as HTMLElement);\n      });\n    };\n\n    // Send the user input to the chat API\n    async function submitInput(question: string) {\n      if (!question.trim()) return;\n      if (loading()) return;\n      inputTextEl.value = \"\";\n      setLoading(true);\n      setWarningMsg(\"\");\n      setTimeout(() => fixInputHeight(), 0);\n      const startTime = Date.now();\n      try {\n        await streamResponse(state, question);\n      } catch (error) {\n        if (error instanceof Error && error.name !== \"AbortError\") {\n          console.error(\"An error occurred when querying the API:\", error);\n          setWarningMsg(\"An error occurred when querying the API. Please try again or contact an admin.\");\n        }\n      }\n      setLoading(false);\n      setFeedbackSent(false);\n      highlightAll();\n      state.scrollToInput();\n      console.log(`Request completed in ${(Date.now() - startTime) / 1000} seconds`);\n    }\n\n    function sendFeedback(positive: boolean) {\n      fetch(feedbackEndpoint(), {\n        method: \"POST\",\n        headers: {\"Content-Type\": \"application/json\"},\n        body: JSON.stringify({\n          like: positive,\n          messages: state.messages().map(msg => ({\n            role: msg.role,\n            content: msg.content(),\n            steps: msg.steps().map(step => ({\n              label: step.label,\n              details: step.details,\n              node_id: step.node_id,\n              substeps: step.substeps,\n            })),\n          })),\n        }),\n      });\n      setFeedbackSent(true);\n    }\n\n    // Fix input height to fit content\n    function fixInputHeight() {\n      // Preserve window scroll position to avoid jumping when the textarea grows.\n      const scrollX = window.scrollX || window.pageXOffset;\n      const scrollY = window.scrollY || window.pageYOffset;\n      inputTextEl.style.height = \"auto\";\n      inputTextEl.style.height = inputTextEl.scrollHeight + \"px\";\n      // Restore scroll position (do it twice to be robust against layout changes)\n      window.scrollTo(scrollX, scrollY);\n      setTimeout(() => window.scrollTo(scrollX, scrollY), 0);\n    }\n\n    return (\n      <div\n        class={`chat-with-context w-full h-full flex flex-col ${state.messages().length === 0 ? \"justify-center\" : \"\"}`}\n      >\n        <style>{style}</style>\n        {/* Main chat container */}\n        <div ref={chatContainerEl} class={`overflow-y-auto ${state.messages().length !== 0 ? \"flex-grow\" : \"\"}`}>\n          <For each={state.messages()}>\n            {(msg, iMsg) => (\n              <div class={`w-full flex flex-col flex-grow ${msg.role === \"user\" ? \"items-end\" : \"\"}`}>\n                <div class={`py-2.5 mb-2 ${msg.role === \"user\" ? \"bg-gray-300 rounded-3xl px-5\" : \"\"}`}>\n                  <div class=\"flex flex-col items-start\">\n                    <For each={msg.steps()}>\n                      {(step, iStep) =>\n                        step.substeps && step.substeps.length > 0 ? (\n                          <>\n                            {/* Dialog to show more details about a step with substeps (e.g. retrieved documents) */}\n                            <button\n                              class=\"text-gray-600 ml-8 mb-4 px-3 py-1 border border-gray-300 rounded-lg bg-gray-100 hover:bg-gray-200 transition-colors\"\n                              title={`Click to see the documents used to generate the response\\n\\nNode: ${step.node_id}`}\n                              onClick={() => {\n                                setSelectedDocsTab(step.substeps?.[0]?.label || \"\");\n                                openDialog(`step-dialog-${iMsg()}-${iStep()}`);\n                              }}\n                            >\n                              {step.label}\n                            </button>\n                            <dialog\n                              id={`step-dialog-${iMsg()}-${iStep()}`}\n                              class=\"bg-white dark:bg-gray-800 m-3 rounded-3xl shadow-md w-full\"\n                              onClose={() => closeDialog()}\n                            >\n                              <button\n                                id={`close-dialog-${iMsg()}-${iStep()}`}\n                                class=\"fixed top-2 right-8 m-3 px-2 text-xl text-slate-500 bg-gray-200 dark:bg-gray-700 rounded-3xl\"\n                                title=\"Close documents details\"\n                                onClick={() => closeDialog()}\n                              >\n                                <img src={xIcon} alt=\"Close the dialog\" class=\"iconBtn\" />\n                              </button>\n                              <article class=\"prose max-w-full p-3\">\n                                <div class=\"flex space-x-2 mb-4\">\n                                  <For each={step.substeps.map(substep => substep.label)}>\n                                    {label => (\n                                      <button\n                                        class={`px-4 py-2 rounded-lg transition-all ${\n                                          selectedDocsTab() === label\n                                            ? \"bg-gray-600 text-white shadow-md\"\n                                            : \"bg-gray-200 text-gray-700 hover:bg-gray-300\"\n                                        }`}\n                                        onClick={() => {\n                                          setSelectedDocsTab(label);\n                                          highlightAll();\n                                        }}\n                                        title={`Show ${label}`}\n                                      >\n                                        {label}\n                                      </button>\n                                    )}\n                                  </For>\n                                </div>\n                                <For each={step.substeps.filter(substep => substep.label === selectedDocsTab())}>\n                                  {substep => (\n                                    <article\n                                      class=\"prose max-w-full\"\n                                      // eslint-disable-next-line solid/no-innerhtml\n                                      innerHTML={DOMPurify.sanitize(marked.parse(substep.details) as string, {\n                                        ADD_TAGS: [\"think\"],\n                                      })}\n                                    />\n                                  )}\n                                </For>\n                              </article>\n                            </dialog>\n                          </>\n                        ) : step.details ? (\n                          <>\n                            {/* Dialog to show more details about a step in markdown */}\n                            <button\n                              class=\"text-gray-600 ml-8 mb-4 px-3 py-1 border border-gray-300 rounded-lg bg-gray-100 hover:bg-gray-200 transition-colors\"\n                              title={`Click to see the documents used to generate the response\\n\\nNode: ${step.node_id}`}\n                              onClick={() => {\n                                openDialog(`step-dialog-${iMsg()}-${iStep()}`);\n                              }}\n                            >\n                              {step.label}\n                            </button>\n                            <dialog\n                              id={`step-dialog-${iMsg()}-${iStep()}`}\n                              class=\"bg-white dark:bg-gray-800 m-3 rounded-3xl shadow-md w-full\"\n                              onClose={() => closeDialog()}\n                            >\n                              <button\n                                id={`close-dialog-${iMsg()}-${iStep()}`}\n                                class=\"fixed top-2 right-8 m-3 px-2 text-xl text-slate-500 bg-gray-200 dark:bg-gray-700 rounded-3xl\"\n                                title=\"Close step details\"\n                                onClick={() => closeDialog()}\n                              >\n                                <img src={xIcon} alt=\"Close the dialog\" class=\"iconBtn\" />\n                              </button>\n                              <article\n                                class=\"prose max-w-full p-6\"\n                                // eslint-disable-next-line solid/no-innerhtml\n                                innerHTML={DOMPurify.sanitize(marked.parse(step.details) as string, {\n                                  ADD_TAGS: [\"think\"],\n                                })}\n                              />\n                            </dialog>\n                          </>\n                        ) : (\n                          // Display basic step without details\n                          <p class=\"text-gray-400 ml-8 mb-4\" title={`Node: ${step.node_id}`}>\n                            {step.label}\n                          </p>\n                        )\n                      }\n                    </For>\n                  </div>\n                  <article\n                    class=\"prose max-w-full\"\n                    // eslint-disable-next-line solid/no-innerhtml\n                    innerHTML={DOMPurify.sanitize(marked.parse(msg.content()) as string, {ADD_TAGS: [\"think\"]})}\n                    // innerHTML={marked.parse(msg.content()) as string}\n                  />\n\n                  {/* Add links, e.g. to Run or edit the query */}\n                  <For each={msg.links()}>\n                    {link => (\n                      <a href={link.url} title={link.title} target=\"_blank\" class=\"hover:text-inherit\">\n                        <button class=\"my-3 mr-1 px-3 py-1 text-sm bg-gray-300 dark:bg-gray-700 rounded-3xl align-middle\">\n                          {link.label}\n                        </button>\n                      </a>\n                    )}\n                  </For>\n                  {/* Show feedback buttons only for last message */}\n                  {feedbackEndpoint() &&\n                    msg.role === \"assistant\" &&\n                    iMsg() === state.messages().length - 1 &&\n                    state.lastMsg().content() &&\n                    !feedbackSent() && (\n                      <>\n                        <button\n                          class=\"mr-1 my-3 px-3 py-1 text-sm hover:bg-gray-300 dark:hover:bg-gray-800 rounded-3xl align-middle\"\n                          title=\"Report a good response\"\n                          onClick={() => sendFeedback(true)}\n                        >\n                          <img src={thumbsUpIcon} alt=\"Thumbs up\" height=\"20px\" width=\"20px\" class=\"iconBtn\" />\n                        </button>\n                        <button\n                          class=\"my-3 px-3 py-1 text-sm hover:bg-gray-300 dark:hover:bg-gray-800 rounded-3xl align-middle\"\n                          title=\"Report a bad response\"\n                          onClick={() => sendFeedback(false)}\n                        >\n                          <img src={thumbsDownIcon} alt=\"Thumbs down\" height=\"20px\" width=\"20px\" class=\"iconBtn\" />\n                        </button>\n                      </>\n                    )}\n                </div>\n              </div>\n            )}\n          </For>\n        </div>\n\n        {/* Warning message */}\n        {warningMsg() && (\n          <div class=\"text-center\">\n            <div class=\"bg-orange-300 p-2 text-orange-900 text-sm rounded-3xl font-semibold mb-2 inline-block\">\n              {warningMsg()}\n            </div>\n          </div>\n        )}\n\n        {/* Input text box */}\n        <form\n          class=\"p-2 flex\"\n          onSubmit={event => {\n            event.preventDefault();\n            // Only abort if it's a click event (not from pressing Enter)\n            if (event.type === \"submit\" && event.submitter && loading()) {\n              state.abortRequest();\n            }\n            submitInput(inputTextEl.value);\n          }}\n        >\n          <div class=\"container flex mx-auto max-w-5xl items-start space-x-2\">\n            {/* input wrapper: relative so we can absolutely position the send button inside */}\n            <div class=\"relative flex-grow\">\n              <textarea\n                ref={inputTextEl}\n                autofocus\n                class=\"w-full px-4 pr-14 py-2 h-auto border border-slate-400 bg-slate-200 dark:bg-slate-700 dark:border-slate-500 rounded-3xl focus:outline-none focus:ring focus:ring-blue-200 dark:focus:ring-blue-400 overflow-y-hidden resize-none\"\n                style={{\"overflow-anchor\": \"none\"}}\n                placeholder=\"Ask your question\"\n                rows=\"1\"\n                onKeyDown={event => {\n                  if (event.key === \"Enter\" && !event.shiftKey) {\n                    event.preventDefault();\n                    submitInput(inputTextEl.value);\n                  }\n                }}\n                onInput={() => fixInputHeight()}\n              />\n\n              {/* send button positioned inside the input, anchored to the textarea bottom */}\n              <button\n                type=\"submit\"\n                title={loading() ? \"Stop generation\" : \"Send question\"}\n                class=\"absolute right-2 bottom-1.5 w-8 h-8 flex items-center justify-center rounded-full text-slate-500 bg-slate-100 dark:text-slate-400 dark:bg-slate-700 border border-slate-300 dark:border-slate-600 shadow-sm\"\n                aria-label={loading() ? \"Stop generation\" : \"Send question\"}\n              >\n                {loading() ? (\n                  <img src={squareIcon} alt=\"Stop generation\" class=\"iconBtn w-4 h-4\" />\n                ) : (\n                  <img src={arrowUpIcon} alt=\"Send question\" class=\"iconBtn w-4 h-4\" />\n                )}\n              </button>\n            </div>\n\n            {/* Start new conversation button moved outside the growing textarea area and aligned to textarea bottom */}\n            <div class=\"flex-shrink-0 self-end mb-1.5\">\n              <button\n                title=\"Start a new conversation\"\n                class=\"w-8 h-8 flex items-center justify-center rounded-full text-slate-500 bg-slate-100 dark:text-slate-400 dark:bg-slate-700 border border-slate-300 dark:border-slate-600 shadow-sm\"\n                onClick={() => state.setMessages([])}\n                type=\"button\"\n                aria-label=\"Start a new conversation\"\n              >\n                <img src={editIcon} alt=\"Start a new conversation\" class=\"iconBtn w-4 h-4\" />\n              </button>\n            </div>\n          </div>\n        </form>\n\n        {/* List of examples */}\n        {state.messages().length < 1 && (\n          <div class=\"py-2 px-4 justify-center items-center text-sm flex flex-col space-y-2\">\n            <For each={examples()}>\n              {example => (\n                <button\n                  onClick={() => submitInput(example)}\n                  class=\"px-5 py-2.5 bg-slate-200 text-slate-600 rounded-3xl\"\n                >\n                  {example}\n                </button>\n              )}\n            </For>\n          </div>\n        )}\n      </div>\n    );\n  },\n);\n"],"names":["equalFn","a","b","$TRACK","signalOptions","runEffects","runQueue","STALE","PENDING","UNOWNED","Owner","Transition","ExternalSourceConfig","Listener","Updates","Effects","ExecCount","createRoot","fn","detachedOwner","listener","owner","unowned","current","root","updateFn","untrack","cleanNode","runUpdates","createSignal","value","options","s","setter","writeSignal","readSignal","createRenderEffect","c","createComputation","updateComputation","createEffect","runUserEffects","createMemo","onCleanup","updates","lookUpstream","sSlot","node","isComp","i","o","TransitionRunning","markDownstream","time","runComputation","nextValue","err","handleError","init","pure","state","runTop","ancestors","wait","res","completeUpdates","queue","userLength","e","ignore","source","index","obs","n","castError","FALLBACK","dispose","d","mapArray","list","mapFn","items","mapped","disposers","len","indexes","newItems","newLen","j","newIndices","newIndicesNext","temp","tempdisposers","tempIndexes","start","end","newEnd","item","disposer","mapper","set","createComponent","Comp","props","For","fallback","reconcileArrays","parentNode","bLength","aEnd","bEnd","aStart","bStart","after","map","sequence","t","$$EVENTS","template","html","isImportNode","isSVG","isMathML","create","delegateEvents","eventNames","document","l","name","eventHandler","setAttribute","className","use","element","arg","insert","parent","accessor","marker","initial","insertExpression","key","oriTarget","oriCurrentTarget","retarget","handleNode","handler","data","walkUpTree","path","unwrapArray","multi","cleanChildren","v","array","currentArray","normalizeIncomingArray","appendNodes","normalized","unwrap","dynamic","prev","replacement","inserted","el","isParent","cloneProps","memo","k","prop","isObject","isFunction","normalizePropDefs","toAttribute","propValues","initializeProps","propDefinition","attr","parseAttributeValue","reflect","val","oldValue","attribute","parse","propName","x","y","obj","isConstructor","f","currentElement","noShadowDOM","createElementType","BaseElement","propKeys","ComponentType","outerElement","callback","oldVal","newVal","attrName","register","tag","extension","customElements","ElementType","createProps","raw","keys","get","lookupContext","next","withSolid","rawProps","comp","customElement","_getDefaults","_defaults","changeDefaults","newDefaults","noopTest","edit","regex","opt","valSource","other","bull","indent","newline","blockCode","fences","hr","heading","bullet","lheading","_paragraph","blockText","_blockLabel","def","_tag","_comment","paragraph","blockNormal","gfmTable","blockGfm","blockPedantic","escape$1","inlineCode","br","inlineText","_punctuation","_punctuationOrSpace","_notPunctuationOrSpace","punctuation","blockSkip","emStrongLDelim","emStrongRDelimAst","emStrongRDelimUnd","anyPunctuation","autolink","_inlineComment","_inlineLabel","link","reflink","nolink","reflinkSearch","inlineNormal","inlinePedantic","inlineGfm","inlineBreaks","block","inline","escapeReplacements","getEscapeReplacement","ch","escape","encode","cleanUrl","href","splitCells","tableRow","count","row","match","offset","str","escaped","curr","cells","rtrim","invert","suffLen","findClosingBracket","level","outputLink","cap","lexer","rules","title","text","token","indentCodeCompensation","matchIndentToCode","indentToCode","matchIndentInNode","indentInNode","_Tokenizer","src","trimmed","lines","tokens","inBlockquote","currentLines","currentRaw","currentText","top","lastToken","oldToken","newText","newToken","isordered","itemRegex","endsWithBlankLine","endEarly","itemContents","line","nextLine","blankLine","nextBulletRegex","hrRegex","fencesBeginRegex","headingBeginRegex","htmlBeginRegex","rawLine","nextLineWithoutTabs","istask","ischecked","lastItem","spacers","hasMultipleLineBreaks","headers","aligns","rows","align","cell","trimmedUrl","rtrimSlash","lastParenIndex","linkLen","links","linkString","maskedSrc","prevChar","lLength","rDelim","rLength","delimTotal","midDelimTotal","endReg","lastCharLength","hasNonSpaceChars","hasSpaceCharsOnBothEnds","prevCapZero","_Lexer","lastParagraphClipped","extTokenizer","cutSrc","startIndex","tempSrc","tempStart","getStartIndex","errMsg","keepPrevChar","_Renderer","lang","langString","code","depth","ordered","body","type","startAttr","itemBody","checkbox","checked","header","content","cleanHref","out","_TextRenderer","_Parser","anyToken","genericToken","ret","textToken","renderer","_Hooks","markdown","Marked","args","values","tableToken","listToken","childTokens","extensions","pack","opts","ext","prevRenderer","extLevel","rendererProp","rendererFunc","tokenizer","tokenizerProp","tokenizerFunc","prevTokenizer","hooks","hooksProp","hooksFunc","prevHook","walkTokens","packWalktokens","blockType","origOpt","throwError","parser","silent","async","msg","markedInstance","marked","entries","setPrototypeOf","isFrozen","getPrototypeOf","getOwnPropertyDescriptor","freeze","seal","apply","construct","fun","thisValue","Func","arrayForEach","unapply","arrayLastIndexOf","arrayPop","arrayPush","arraySplice","stringToLowerCase","stringToString","stringMatch","stringReplace","stringIndexOf","stringTrim","objectHasOwnProperty","regExpTest","typeErrorCreate","unconstruct","func","thisArg","_len","_key","_len2","_key2","addToSet","transformCaseFunc","lcElement","cleanArray","clone","object","newObject","property","lookupGetter","desc","fallbackValue","html$1","svg$1","svgFilters","svgDisallowed","mathMl$1","mathMlDisallowed","svg","mathMl","xml","MUSTACHE_EXPR","ERB_EXPR","TMPLIT_EXPR","DATA_ATTR","ARIA_ATTR","IS_ALLOWED_URI","IS_SCRIPT_OR_DATA","ATTR_WHITESPACE","DOCTYPE_NAME","CUSTOM_ELEMENT","EXPRESSIONS","NODE_TYPE","getGlobal","_createTrustedTypesPolicy","trustedTypes","purifyHostElement","suffix","ATTR_NAME","policyName","scriptUrl","_createHooksMap","createDOMPurify","window","DOMPurify","originalDocument","currentScript","DocumentFragment","HTMLTemplateElement","Node","Element","NodeFilter","NamedNodeMap","HTMLFormElement","DOMParser","ElementPrototype","cloneNode","remove","getNextSibling","getChildNodes","getParentNode","trustedTypesPolicy","emptyHTML","implementation","createNodeIterator","createDocumentFragment","getElementsByTagName","importNode","IS_ALLOWED_URI$1","ALLOWED_TAGS","DEFAULT_ALLOWED_TAGS","ALLOWED_ATTR","DEFAULT_ALLOWED_ATTR","CUSTOM_ELEMENT_HANDLING","FORBID_TAGS","FORBID_ATTR","ALLOW_ARIA_ATTR","ALLOW_DATA_ATTR","ALLOW_UNKNOWN_PROTOCOLS","ALLOW_SELF_CLOSE_IN_ATTR","SAFE_FOR_TEMPLATES","SAFE_FOR_XML","WHOLE_DOCUMENT","SET_CONFIG","FORCE_BODY","RETURN_DOM","RETURN_DOM_FRAGMENT","RETURN_TRUSTED_TYPE","SANITIZE_DOM","SANITIZE_NAMED_PROPS","SANITIZE_NAMED_PROPS_PREFIX","KEEP_CONTENT","IN_PLACE","USE_PROFILES","FORBID_CONTENTS","DEFAULT_FORBID_CONTENTS","DATA_URI_TAGS","DEFAULT_DATA_URI_TAGS","URI_SAFE_ATTRIBUTES","DEFAULT_URI_SAFE_ATTRIBUTES","MATHML_NAMESPACE","SVG_NAMESPACE","HTML_NAMESPACE","NAMESPACE","IS_EMPTY_INPUT","ALLOWED_NAMESPACES","DEFAULT_ALLOWED_NAMESPACES","MATHML_TEXT_INTEGRATION_POINTS","HTML_INTEGRATION_POINTS","COMMON_SVG_AND_HTML_ELEMENTS","PARSER_MEDIA_TYPE","SUPPORTED_PARSER_MEDIA_TYPES","DEFAULT_PARSER_MEDIA_TYPE","CONFIG","formElement","isRegexOrFunction","testValue","_parseConfig","cfg","ALL_SVG_TAGS","ALL_MATHML_TAGS","_checkValidNamespace","tagName","parentTagName","_forceRemove","_removeAttribute","_initDocument","dirty","doc","leadingWhitespace","matches","dirtyPayload","_createNodeIterator","_isClobbered","_isNode","_executeHooks","currentNode","hook","_sanitizeElements","_isBasicCustomElement","childNodes","childCount","childClone","expr","_isValidAttribute","lcTag","lcName","_sanitizeAttributes","attributes","hookEvent","namespaceURI","attrValue","_sanitizeShadowDOM","fragment","shadowNode","shadowIterator","importedNode","returnNode","nodeIterator","serializedHTML","entryPoint","hookFunction","purify","deepFreeze","Response","mode","escapeHTML","inherit$1","original","objects","result","SPAN_CLOSE","emitsWrappingTags","scopeToCSSClass","prefix","pieces","HTMLRenderer","parseTree","newNode","TokenTree","scope","builder","child","TokenTreeEmitter","emitter","re","lookahead","concat","anyNumberOfTimes","optional","stripOptionsFromArgs","either","countMatchGroups","startsWith","lexeme","BACKREF_RE","_rewriteBackreferences","regexps","joinWith","numCaptures","MATCH_NOTHING_RE","IDENT_RE","UNDERSCORE_IDENT_RE","NUMBER_RE","C_NUMBER_RE","BINARY_NUMBER_RE","RE_STARTERS_RE","SHEBANG","beginShebang","resp","BACKSLASH_ESCAPE","APOS_STRING_MODE","QUOTE_STRING_MODE","PHRASAL_WORDS_MODE","COMMENT","begin","modeOptions","ENGLISH_WORD","C_LINE_COMMENT_MODE","C_BLOCK_COMMENT_MODE","HASH_COMMENT_MODE","NUMBER_MODE","C_NUMBER_MODE","BINARY_NUMBER_MODE","REGEXP_MODE","TITLE_MODE","UNDERSCORE_TITLE_MODE","METHOD_GUARD","MODES","m","skipIfHasPrecedingDot","response","scopeClassName","_parent","beginKeywords","compileIllegal","compileMatch","compileRelevance","beforeMatchExt","originalMode","COMMON_KEYWORDS","DEFAULT_KEYWORD_SCOPE","compileKeywords","rawKeywords","caseInsensitive","scopeName","compiledKeywords","compileList","keywordList","keyword","pair","scoreForKeyword","providedScore","commonKeyword","seenDeprecations","error","message","warn","deprecated","version","MultiClassError","remapScopeNames","regexes","scopeNames","emit","positions","beginMultiClass","endMultiClass","scopeSugar","MultiClass","compileLanguage","language","langRe","global","MultiRegex","terminators","matchData","ResumableMultiRegex","matcher","m2","buildModeRegex","mm","term","compileMode","cmode","keywordPattern","expandOrCloneMode","dependencyOnParent","variant","HTMLInjectionError","reason","inherit","NO_MATCH","MAX_KEYWORD_HITS","HLJS","hljs","languages","aliases","plugins","SAFE_MODE","LANGUAGE_NOT_FOUND","PLAINTEXT_LANGUAGE","shouldNotHighlight","languageName","blockLanguage","classes","getLanguage","_class","highlight","codeOrLanguageName","optionsOrCode","ignoreIllegals","context","fire","_highlight","codeToHighlight","continuation","keywordHits","keywordData","matchText","processKeywords","modeBuffer","lastIndex","buf","word","kind","keywordRelevance","relevance","cssClass","emitKeyword","processSubLanguage","continuations","highlightAuto","processBuffer","emitMultiClass","max","klass","startNewMode","endOfMode","matchPlusRemainder","matched","doIgnore","resumeScanAtSamePosition","doBeginMatch","newMode","beforeCallbacks","cb","doEndMatch","endMode","origin","processContinuations","lastMatch","processLexeme","textBeforeMatch","processed","iterations","md","beforeMatch","processedCount","justTextHighlightResult","languageSubset","plaintext","results","autoDetection","sorted","best","secondBest","updateClassName","currentLang","resultLang","highlightElement","configure","userOptions","initHighlighting","highlightAll","initHighlightingOnLoad","wantsHighlight","boot","registerLanguage","languageDefinition","error$1","registerAliases","unregisterLanguage","alias","listLanguages","aliasList","upgradePluginAPI","plugin","addPlugin","removePlugin","event","deprecateHighlightBlock","core","queryLinkLabels","label","getEditorUrl","query","endpointUrl","encodeURIComponent","style","hljsDefineTurtle","KEYWORDS","IRI_LITERAL","PN_CHARS_BASE","PN_CHARS_U","PN_CHARS","BLANK_NODE_LABEL","PN_PREFIX","PERCENT","PN_LOCAL_ESC","PLX","PNAME_NS","PN_LOCAL","PNAME_LN","PNAME_NS_or_LN","PNAME","BLANK_NODE","LANGTAG","DATATYPE","TRIPLE_APOS_STRING","TRIPLE_QUOTE_STRING","APOS_STRING_LITERAL","QUOTE_STRING_LITERAL","NUMBER","hljsDefineSparql","ttl","VARIABLE","JSON_QUOTE_STRING","JSON_APOS_STRING","arrowUpIcon","xIcon","editIcon","squareIcon","thumbsDownIcon","thumbsUpIcon","ChatState","apiUrl","apiKey","model","msgContent","role","setContent","steps","setSteps","setLinks","newMsg","messages","newContent","node_id","details","substeps","setMessages","streamResponse","question","streamCustomLangGraph","processLangGraphChunk","chunk","nodeId","nodeData","step","metadata","icon","reader","decoder","buffer","done","chunkStr","json","chatEndpoint","examples","feedbackEndpoint","setExamples","warningMsg","setWarningMsg","loading","setLoading","dialogOpen","setDialogOpen","selectedDocsTab","setSelectedDocsTab","setFeedbackEndpoint","feedbackSent","setFeedbackSent","chatContainerEl","inputTextEl","gfm","scrollToInput","onMessageUpdate","split","trim","fixInputHeight","openDialog","dialogId","getElementById","showModal","history","pushState","overflow","closeDialog","dialogEl","close","addEventListener","preventDefault","querySelectorAll","forEach","submitInput","startTime","Date","now","Error","console","log","sendFeedback","positive","fetch","method","JSON","stringify","like","scrollX","pageXOffset","scrollY","pageYOffset","height","scrollHeight","scrollTo","setTimeout","_el$","_tmpl$","_el$2","firstChild","_el$3","nextSibling","_el$4","_el$5","_el$6","_el$7","_el$8","_el$9","_el$10","_el$11","_$insert","_ref$","_$use","_$createComponent","each","children","iMsg","_el$12","_tmpl$2","_el$13","_el$14","_el$15","iStep","length","_el$16","_tmpl$3","$$click","_$effect","_$setAttribute","_el$17","_tmpl$4","_el$18","_el$19","_el$20","_el$21","substep","_el$22","_tmpl$5","_$className","filter","_el$23","_tmpl$6","innerHTML","sanitize","ADD_TAGS","_p$","_v$8","_v$9","undefined","_el$24","_el$25","_tmpl$7","_el$26","_el$27","_el$28","_v$10","_v$11","_v$12","_el$29","_tmpl$8","_el$30","_tmpl$9","_el$31","_v$13","url","_v$14","_c$4","_$memo","lastMsg","_el$32","_tmpl$10","_el$33","_el$34","_tmpl$11","_el$35","_v$5","_v$6","_v$7","_c$","_el$36","_tmpl$12","_el$37","submitter","abortRequest","$$input","$$keydown","shiftKey","_ref$2","setProperty","_c$2","_el$38","_tmpl$13","_el$39","_tmpl$14","_c$3","_el$40","_tmpl$15","_el$41","_tmpl$16","example","_v$","_v$2","_v$3","_v$4","_$delegateEvents"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6]}