-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathmain.js.map
1 lines (1 loc) · 198 KB
/
main.js.map
1
{"version":3,"file":"main.js","sources":["../node_modules/solid-js/dist/solid.js","../node_modules/solid-js/web/dist/web.js","../node_modules/dompurify/src/utils.js","../node_modules/dompurify/src/tags.js","../node_modules/dompurify/src/attrs.js","../node_modules/dompurify/src/regexp.js","../node_modules/dompurify/src/purify.js","../node_modules/atom-ide-base/src-commons-ui/MarkdownRenderer.ts","../node_modules/atom-ide-base/src-commons-ui/float-pane/MarkdownView.tsx","../node_modules/atom-ide-base/src-commons-ui/float-pane/SnippetView.tsx","../node_modules/atom-ide-base/src-commons-ui/float-pane/ReactView.tsx","../node_modules/atom-ide-base/src-commons-ui/float-pane/ViewContainer.tsx","../node_modules/atom-ide-base/src-commons-atom/ProviderRegistry.ts","../node_modules/atom-ide-base/src-commons-ui/float-pane/selectable-overlay.ts","../lib/datatip-manager.tsx","../lib/main.ts"],"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 let k = n + m >> 1;\n let cmp = task.expirationTime - taskQueue[k].expirationTime;\n if (cmp > 0) m = k + 1;else if (cmp < 0) n = k - 1;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 = {};\nfunction setHydrateContext(context) {\n sharedConfig.context = context;\n}\nfunction nextHydrateContext() {\n return { ...sharedConfig.context,\n id: `${sharedConfig.context.id}${sharedConfig.context.count++}.`,\n count: 0\n };\n}\n\nconst equalFn = (a, b) => a === b;\nlet ERROR = null;\nlet runEffects = runQueue;\nconst NOTPENDING = {};\nconst STALE = 1;\nconst PENDING = 2;\nconst UNOWNED = {\n owned: null,\n cleanups: null,\n context: null,\n owner: null\n};\nconst [transPending, setTransPending] = createSignal(false);\nvar Owner = null;\nvar Listener = null;\nlet Pending = null;\nlet Updates = null;\nlet Effects = null;\nlet Transition = null;\nlet ExecCount = 0;\nfunction createRoot(fn, detachedOwner) {\n detachedOwner && (Owner = detachedOwner);\n const listener = Listener,\n owner = Owner,\n root = fn.length === 0 && !false ? UNOWNED : {\n owned: null,\n cleanups: null,\n context: null,\n owner,\n attached: !!detachedOwner\n };\n Owner = root;\n Listener = null;\n let result;\n try {\n runUpdates(() => result = fn(() => cleanNode(root)), true);\n } finally {\n Listener = listener;\n Owner = owner;\n }\n return result;\n}\nfunction createSignal(value, areEqual = true, options) {\n const s = {\n value,\n observers: null,\n observerSlots: null,\n pending: NOTPENDING,\n comparator: areEqual ? typeof areEqual === \"function\" ? areEqual : equalFn : undefined\n };\n return [readSignal.bind(s), writeSignal.bind(s)];\n}\nfunction createComputed(fn, value) {\n updateComputation(createComputation(fn, value, true));\n}\nfunction createRenderEffect(fn, value) {\n updateComputation(createComputation(fn, value, false));\n}\nfunction createEffect(fn, value) {\n runEffects = runUserEffects;\n const c = createComputation(fn, value, false),\n s = SuspenseContext && lookup(Owner, SuspenseContext.id);\n if (s) c.suspense = s;\n c.user = true;\n Effects && Effects.push(c);\n}\nfunction resumeEffects(e) {\n Transition && (Transition.running = true);\n Effects.push.apply(Effects, e);\n e.length = 0;\n}\nfunction createMemo(fn, value, areEqual = true) {\n const c = createComputation(fn, value, true);\n c.pending = NOTPENDING;\n c.observers = null;\n c.observerSlots = null;\n c.state = 0;\n c.comparator = areEqual ? typeof areEqual === \"function\" ? areEqual : equalFn : undefined;\n updateComputation(c);\n return readSignal.bind(c);\n}\nfunction createDeferred(source, options) {\n let t,\n timeout = options ? options.timeoutMs : undefined;\n const [deferred, setDeferred] = createSignal();\n const node = createComputation(() => {\n if (!t || !t.fn) t = requestCallback(() => setDeferred(node.value), timeout !== undefined ? {\n timeout\n } : undefined);\n return source();\n }, undefined, true);\n updateComputation(node);\n setDeferred(node.value);\n return deferred;\n}\nfunction createSelector(source, fn = equalFn) {\n let subs = new Map();\n const node = createComputation(p => {\n const v = source();\n for (const key of subs.keys()) if (fn(key, v) || p !== undefined && fn(key, p)) {\n const l = subs.get(key);\n for (const c of l.values()) {\n c.state = STALE;\n if (c.pure) Updates.push(c);else Effects.push(c);\n }\n }\n return v;\n }, undefined, true);\n updateComputation(node);\n return key => {\n let listener;\n if (listener = Listener) {\n let l;\n if (l = subs.get(key)) l.add(listener);else subs.set(key, l = new Set([listener]));\n onCleanup(() => {\n l.size > 1 ? l.delete(listener) : subs.delete(key);\n });\n }\n return fn(key, node.value);\n };\n}\nfunction batch(fn) {\n if (Pending) return fn();\n const q = Pending = [],\n result = fn();\n Pending = null;\n runUpdates(() => {\n for (let i = 0; i < q.length; i += 1) {\n const data = q[i];\n if (data.pending !== NOTPENDING) {\n const pending = data.pending;\n data.pending = NOTPENDING;\n writeSignal.call(data, pending);\n }\n }\n }, false);\n return result;\n}\nfunction useTransition() {\n return [transPending, (fn, cb) => {\n if (SuspenseContext) {\n Transition || (Transition = {\n sources: new Set(),\n effects: [],\n promises: new Set(),\n disposed: new Set(),\n running: true,\n cb: []\n });\n cb && Transition.cb.push(cb);\n Transition.running = true;\n }\n batch(fn);\n if (!SuspenseContext && cb) cb();\n }];\n}\nfunction untrack(fn) {\n let result,\n listener = Listener;\n Listener = null;\n result = fn();\n Listener = listener;\n return result;\n}\nfunction on(...args) {\n const fn = args.pop();\n let deps;\n let isArray = true;\n let prev;\n if (args.length < 2) {\n deps = args[0];\n isArray = false;\n } else deps = args;\n return prevResult => {\n let value;\n if (isArray) {\n value = [];\n if (!prev) prev = [];\n for (let i = 0; i < deps.length; i++) value.push(deps[i]());\n } else value = deps();\n const result = untrack(() => fn(value, prev, prevResult));\n prev = value;\n return result;\n };\n}\nfunction onMount(fn) {\n createEffect(() => untrack(fn));\n}\nfunction onCleanup(fn) {\n if (Owner === null) ;else if (Owner.cleanups === null) Owner.cleanups = [fn];else Owner.cleanups.push(fn);\n return fn;\n}\nfunction onError(fn) {\n ERROR || (ERROR = Symbol(\"error\"));\n if (Owner === null) ;else if (Owner.context === null) Owner.context = {\n [ERROR]: [fn]\n };else if (!Owner.context[ERROR]) Owner.context[ERROR] = [fn];else Owner.context[ERROR].push(fn);\n}\nfunction getListener() {\n return Listener;\n}\nfunction getOwner() {\n return Owner;\n}\nfunction runWithOwner(o, fn) {\n const prev = Owner;\n Owner = o;\n try {\n return fn();\n } finally {\n Owner = prev;\n }\n}\nfunction createContext(defaultValue) {\n const id = Symbol(\"context\");\n return {\n id,\n Provider: createProvider(id),\n defaultValue\n };\n}\nfunction useContext(context) {\n return lookup(Owner, context.id) || context.defaultValue;\n}\nfunction children(fn) {\n const children = createMemo(fn);\n return createMemo(() => resolveChildren(children()));\n}\nlet SuspenseContext;\nfunction getSuspenseContext() {\n return SuspenseContext || (SuspenseContext = createContext({}));\n}\nfunction createResource(fn, fetcher, options = {}) {\n if (arguments.length === 2) {\n if (typeof fetcher === \"object\") {\n options = fetcher;\n fetcher = fn;\n fn = true;\n }\n } else if (arguments.length === 1) {\n fetcher = fn;\n fn = true;\n }\n const contexts = new Set(),\n [s, set] = createSignal(options.initialValue),\n [track, trigger] = createSignal(undefined, false),\n [loading, setLoading] = createSignal(false),\n [error, setError] = createSignal();\n let err = undefined,\n pr = null,\n initP = null,\n id = null,\n loadedUnderTransition = false,\n dynamic = typeof fn === \"function\";\n if (sharedConfig.context) {\n id = `${sharedConfig.context.id}${sharedConfig.context.count++}`;\n if (sharedConfig.context.loadResource) {\n initP = sharedConfig.context.loadResource(id);\n } else if (sharedConfig.resources && id && id in sharedConfig.resources) {\n initP = sharedConfig.resources[id];\n delete sharedConfig.resources[id];\n }\n }\n function loadEnd(p, v, e) {\n if (pr === p) {\n setError(err = e);\n pr = null;\n if (Transition && p && loadedUnderTransition) {\n Transition.promises.delete(p);\n loadedUnderTransition = false;\n runUpdates(() => {\n Transition.running = true;\n if (!Transition.promises.size) {\n Effects.push.apply(Effects, Transition.effects);\n Transition.effects = [];\n }\n completeLoad(v);\n }, false);\n } else completeLoad(v);\n }\n return v;\n }\n function completeLoad(v) {\n batch(() => {\n set(v);\n setLoading(false);\n for (let c of contexts.keys()) c.decrement();\n contexts.clear();\n });\n }\n function read() {\n const c = SuspenseContext && lookup(Owner, SuspenseContext.id),\n v = s();\n if (err) throw err;\n if (Listener && !Listener.user && c) {\n createComputed(() => {\n track();\n if (pr) {\n if (c.resolved && Transition) Transition.promises.add(pr);else if (!contexts.has(c)) {\n c.increment();\n contexts.add(c);\n }\n }\n });\n }\n return v;\n }\n function load() {\n setError(err = undefined);\n let lookup = dynamic ? fn() : fn;\n loadedUnderTransition = Transition && Transition.running;\n if (lookup == null || lookup === false) {\n loadEnd(pr, untrack(s));\n return;\n }\n if (Transition && pr) Transition.promises.delete(pr);\n const p = initP || fetcher(lookup, s);\n initP = null;\n if (typeof p !== \"object\" || !(\"then\" in p)) {\n loadEnd(pr, p);\n return;\n }\n pr = p;\n batch(() => {\n setLoading(true);\n trigger();\n });\n p.then(v => loadEnd(p, v), e => loadEnd(p, e, e));\n }\n Object.defineProperties(read, {\n loading: {\n get() {\n return loading();\n }\n },\n error: {\n get() {\n return error();\n }\n }\n });\n if (dynamic) createComputed(load);else load();\n return [read, {\n refetch: load,\n mutate: set\n }];\n}\nfunction readSignal() {\n if (this.state && this.sources) {\n const updates = Updates;\n Updates = null;\n this.state === STALE ? updateComputation(this) : lookDownstream(this);\n Updates = updates;\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 (Transition && Transition.running && Transition.sources.has(this)) return this.tValue;\n return this.value;\n}\nfunction writeSignal(value, isComp) {\n if (this.comparator) {\n if (Transition && Transition.running && Transition.sources.has(this)) {\n if (this.comparator(this.tValue, value)) return value;\n } else if (this.comparator(this.value, value)) return value;\n }\n if (Pending) {\n if (this.pending === NOTPENDING) Pending.push(this);\n this.pending = value;\n return value;\n }\n if (Transition) {\n if (Transition.running || !isComp && Transition.sources.has(this)) {\n Transition.sources.add(this);\n this.tValue = value;\n }\n if (!Transition.running) this.value = value;\n } else this.value = value;\n if (this.observers && (!Updates || this.observers.length)) {\n runUpdates(() => {\n for (let i = 0; i < this.observers.length; i += 1) {\n const o = this.observers[i];\n if (Transition && Transition.running && Transition.disposed.has(o)) continue;\n if (o.observers && o.state !== PENDING) markUpstream(o);\n o.state = STALE;\n if (o.pure) Updates.push(o);else Effects.push(o);\n }\n if (Updates.length > 10e5) {\n Updates = [];\n throw new Error(\"Potential Infinite Loop Detected.\");\n }\n }, false);\n }\n return value;\n}\nfunction updateComputation(node) {\n if (!node.fn) return;\n cleanNode(node);\n const owner = Owner,\n listener = Listener,\n time = ExecCount;\n Listener = Owner = node;\n runComputation(node, node.value, time);\n if (Transition && !Transition.running && Transition.sources.has(node)) {\n Transition.running = true;\n runComputation(node, node.tValue, time);\n Transition.running = false;\n }\n Listener = listener;\n Owner = owner;\n}\nfunction runComputation(node, value, time) {\n let nextValue;\n try {\n nextValue = node.fn(value);\n } catch (err) {\n handleError(err);\n }\n if (!node.updatedAt || node.updatedAt <= time) {\n if (node.observers && node.observers.length) {\n writeSignal.call(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) {\n const c = {\n fn,\n state: STALE,\n updatedAt: null,\n owned: null,\n sources: null,\n sourceSlots: null,\n cleanups: null,\n value: init,\n owner: Owner,\n context: null,\n pure\n };\n if (Owner === null) ;else if (Owner !== UNOWNED) {\n if (Transition && Transition.running && Owner.pure) {\n if (!Owner.tOwned) Owner.tOwned = [c];else Owner.tOwned.push(c);\n } else {\n if (!Owner.owned) Owner.owned = [c];else Owner.owned.push(c);\n }\n }\n return c;\n}\nfunction runTop(node) {\n let top = node.state === STALE && node,\n pending;\n if (node.suspense && untrack(node.suspense.inFallback)) return node.suspense.effects.push(node);\n const runningTransition = Transition && Transition.running;\n while ((node.fn || runningTransition && node.attached) && (node = node.owner)) {\n if (runningTransition && Transition.disposed.has(node)) return;\n if (node.state === PENDING) pending = node;else if (node.state === STALE) {\n top = node;\n pending = undefined;\n }\n }\n if (pending) {\n const updates = Updates;\n Updates = null;\n lookDownstream(pending);\n Updates = updates;\n if (!top || top.state !== STALE) return;\n if (runningTransition) {\n node = top;\n while ((node.fn || node.attached) && (node = node.owner)) {\n if (Transition.disposed.has(node)) return;\n }\n }\n }\n top && updateComputation(top);\n}\nfunction runUpdates(fn, init) {\n if (Updates) return fn();\n let wait = false;\n if (!init) Updates = [];\n if (Effects) wait = true;else Effects = [];\n ExecCount++;\n try {\n fn();\n } catch (err) {\n handleError(err);\n } finally {\n completeUpdates(wait);\n }\n}\nfunction completeUpdates(wait) {\n if (Updates) {\n runQueue(Updates);\n Updates = null;\n }\n if (wait) return;\n let cbs;\n if (Transition && Transition.running) {\n if (Transition.promises.size) {\n Transition.running = false;\n Transition.effects.push.apply(Transition.effects, Effects);\n Effects = null;\n setTransPending(true);\n return;\n }\n const sources = Transition.sources;\n cbs = Transition.cb;\n Transition = null;\n batch(() => {\n sources.forEach(v => {\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 });\n setTransPending(false);\n });\n }\n if (Effects.length) batch(() => {\n runEffects(Effects);\n Effects = null;\n });else {\n Effects = null;\n }\n if (cbs) cbs.forEach(cb => cb());\n}\nfunction runQueue(queue) {\n for (let i = 0; i < queue.length; i++) runTop(queue[i]);\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);else queue[userLength++] = e;\n }\n const resume = queue.length;\n for (i = 0; i < userLength; i++) runTop(queue[i]);\n for (i = resume; i < queue.length; i++) runTop(queue[i]);\n}\nfunction lookDownstream(node) {\n 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 if (source.state === STALE) runTop(source);else if (source.state === PENDING) lookDownstream(source);\n }\n }\n}\nfunction markUpstream(node) {\n for (let i = 0; i < node.observers.length; i += 1) {\n const o = node.observers[i];\n if (!o.state) {\n o.state = PENDING;\n o.observers && markUpstream(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 (Transition && Transition.running && node.pure) {\n if (node.tOwned) {\n for (i = 0; i < node.tOwned.length; i++) cleanNode(node.tOwned[i]);\n delete node.tOwned;\n }\n reset(node, true);\n } else if (node.owned) {\n for (i = 0; i < node.owned.length; i++) cleanNode(node.owned[i]);\n node.owned = null;\n }\n if (node.cleanups) {\n for (i = 0; i < node.cleanups.length; i++) node.cleanups[i]();\n node.cleanups = null;\n }\n node.state = 0;\n node.context = null;\n}\nfunction reset(node, top) {\n if (!top) {\n node.state = 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 handleError(err) {\n const fns = ERROR && lookup(Owner, ERROR);\n if (!fns) throw err;\n fns.forEach(f => f(err));\n}\nfunction lookup(owner, key) {\n return owner && (owner.context && owner.context[key] || owner.owner && lookup(owner.owner, key));\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 let 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) {\n return function provider(props) {\n return createMemo(() => {\n Owner.context = {\n [id]: props.value\n };\n return children(() => props.children);\n });\n };\n}\n\nconst $RAW = Symbol(\"state-raw\"),\n $NODE = Symbol(\"state-node\"),\n $PROXY = Symbol(\"state-proxy\"),\n $NAME = Symbol(\"state-name\");\nfunction wrap$1(value, name) {\n let p = value[$PROXY];\n if (!p) {\n Object.defineProperty(value, $PROXY, {\n value: p = new Proxy(value, proxyTraps$1)\n });\n let keys = Object.keys(value),\n desc = Object.getOwnPropertyDescriptors(value);\n for (let i = 0, l = keys.length; i < l; i++) {\n const prop = keys[i];\n if (desc[prop].get) {\n const get = desc[prop].get.bind(p);\n Object.defineProperty(value, prop, {\n get\n });\n }\n }\n }\n return p;\n}\nfunction isWrappable(obj) {\n return obj != null && typeof obj === \"object\" && (!obj.__proto__ || obj.__proto__ === Object.prototype || Array.isArray(obj));\n}\nfunction unwrap(item, set = new Set()) {\n let result, unwrapped, v, prop;\n if (result = item != null && item[$RAW]) return result;\n if (!isWrappable(item) || set.has(item)) return item;\n if (Array.isArray(item)) {\n if (Object.isFrozen(item)) item = item.slice(0);else set.add(item);\n for (let i = 0, l = item.length; i < l; i++) {\n v = item[i];\n if ((unwrapped = unwrap(v, set)) !== v) item[i] = unwrapped;\n }\n } else {\n if (Object.isFrozen(item)) item = Object.assign({}, item);else set.add(item);\n let keys = Object.keys(item),\n desc = Object.getOwnPropertyDescriptors(item);\n for (let i = 0, l = keys.length; i < l; i++) {\n prop = keys[i];\n if (desc[prop].get) continue;\n v = item[prop];\n if ((unwrapped = unwrap(v, set)) !== v) item[prop] = unwrapped;\n }\n }\n return item;\n}\nfunction getDataNodes(target) {\n let nodes = target[$NODE];\n if (!nodes) Object.defineProperty(target, $NODE, {\n value: nodes = {}\n });\n return nodes;\n}\nfunction proxyDescriptor(target, property) {\n const desc = Reflect.getOwnPropertyDescriptor(target, property);\n if (!desc || desc.get || property === $PROXY || property === $NODE || property === $NAME) return desc;\n delete desc.value;\n delete desc.writable;\n desc.get = () => target[$PROXY][property];\n return desc;\n}\nfunction createDataNode() {\n const [s, set] = createSignal(undefined, false);\n s.set = set;\n return s;\n}\nconst proxyTraps$1 = {\n get(target, property, receiver) {\n if (property === $RAW) return target;\n if (property === $PROXY) return receiver;\n const value = target[property];\n if (property === $NODE || property === \"__proto__\") return value;\n const wrappable = isWrappable(value);\n if (Listener && (typeof value !== \"function\" || target.hasOwnProperty(property))) {\n let nodes, node;\n if (wrappable && (nodes = getDataNodes(value))) {\n node = nodes._ || (nodes._ = createDataNode());\n node();\n }\n nodes = getDataNodes(target);\n node = nodes[property] || (nodes[property] = createDataNode());\n node();\n }\n return wrappable ? wrap$1(value) : value;\n },\n set() {\n return true;\n },\n deleteProperty() {\n return true;\n },\n getOwnPropertyDescriptor: proxyDescriptor\n};\nfunction setProperty(state, property, value) {\n if (state[property] === value) return;\n const array = Array.isArray(state);\n const len = state.length;\n const notify = array || !(property in state);\n if (value === undefined) {\n delete state[property];\n } else state[property] = value;\n let nodes = getDataNodes(state),\n node;\n (node = nodes[property]) && node.set();\n if (array && state.length !== len) (node = nodes.length) && node.set();\n notify && (node = nodes._) && node.set();\n}\nfunction mergeState(state, value) {\n const keys = Object.keys(value);\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n setProperty(state, key, value[key]);\n }\n}\nfunction updatePath(current, path, traversed = []) {\n let part,\n prev = current;\n if (path.length > 1) {\n part = path.shift();\n const partType = typeof part,\n isArray = Array.isArray(current);\n if (Array.isArray(part)) {\n for (let i = 0; i < part.length; i++) {\n updatePath(current, [part[i]].concat(path), [part[i]].concat(traversed));\n }\n return;\n } else if (isArray && partType === \"function\") {\n for (let i = 0; i < current.length; i++) {\n if (part(current[i], i)) updatePath(current, [i].concat(path), [i].concat(traversed));\n }\n return;\n } else if (isArray && partType === \"object\") {\n const {\n from = 0,\n to = current.length - 1,\n by = 1\n } = part;\n for (let i = from; i <= to; i += by) {\n updatePath(current, [i].concat(path), [i].concat(traversed));\n }\n return;\n } else if (path.length > 1) {\n updatePath(current[part], path, [part].concat(traversed));\n return;\n }\n prev = current[part];\n traversed = [part].concat(traversed);\n }\n let value = path[0];\n if (typeof value === \"function\") {\n value = value(prev, traversed);\n if (value === prev) return;\n }\n if (part === undefined && value == undefined) return;\n value = unwrap(value);\n if (part === undefined || isWrappable(prev) && isWrappable(value) && !Array.isArray(value)) {\n mergeState(prev, value);\n } else setProperty(current, part, value);\n}\nfunction createState(state, options) {\n const unwrappedState = unwrap(state || {});\n const wrappedState = wrap$1(unwrappedState);\n function setState(...args) {\n batch(() => updatePath(unwrappedState, args));\n }\n return [wrappedState, setState];\n}\n\nconst proxyTraps = {\n get(target, property, receiver) {\n if (property === $RAW) return target;\n if (property === $PROXY) return receiver;\n const value = target[property];\n if (property === $NODE || property === \"__proto__\") return value;\n const wrappable = isWrappable(value);\n if (Listener && (typeof value !== \"function\" || target.hasOwnProperty(property))) {\n let nodes, node;\n if (wrappable && (nodes = getDataNodes(value))) {\n node = nodes._ || (nodes._ = createDataNode());\n node();\n }\n nodes = getDataNodes(target);\n node = nodes[property] || (nodes[property] = createDataNode());\n node();\n }\n return wrappable ? wrap(value) : value;\n },\n set(target, property, value) {\n setProperty(target, property, unwrap(value));\n return true;\n },\n deleteProperty(target, property) {\n setProperty(target, property, undefined);\n return true;\n },\n getOwnPropertyDescriptor: proxyDescriptor\n};\nfunction wrap(value, name) {\n let p = value[$PROXY];\n if (!p) {\n Object.defineProperty(value, $PROXY, {\n value: p = new Proxy(value, proxyTraps)\n });\n let keys = Object.keys(value),\n desc = Object.getOwnPropertyDescriptors(value);\n for (let i = 0, l = keys.length; i < l; i++) {\n const prop = keys[i];\n if (desc[prop].get) {\n const get = desc[prop].get.bind(p);\n Object.defineProperty(value, prop, {\n get\n });\n }\n if (desc[prop].set) {\n const og = desc[prop].set,\n set = v => batch(() => og.call(p, v));\n Object.defineProperty(value, prop, {\n set\n });\n }\n }\n }\n return p;\n}\nfunction createMutable(state, options) {\n const unwrappedState = unwrap(state || {});\n const wrappedState = wrap(unwrappedState);\n return wrappedState;\n}\n\nfunction applyState(target, parent, property, merge, key) {\n let previous = parent[property];\n if (target === previous) return;\n if (!isWrappable(target) || !isWrappable(previous) || key && target[key] !== previous[key]) {\n target !== previous && setProperty(parent, property, target);\n return;\n }\n if (Array.isArray(target)) {\n if (target.length && previous.length && (!merge || key && target[0][key] != null)) {\n let i, j, start, end, newEnd, item, newIndicesNext, keyVal;\n for (start = 0, end = Math.min(previous.length, target.length); start < end && (previous[start] === target[start] || key && previous[start][key] === target[start][key]); start++) {\n applyState(target[start], previous, start, merge, key);\n }\n const temp = new Array(target.length),\n newIndices = new Map();\n for (end = previous.length - 1, newEnd = target.length - 1; end >= start && newEnd >= start && (previous[end] === target[newEnd] || key && previous[end][key] === target[newEnd][key]); end--, newEnd--) {\n temp[newEnd] = previous[end];\n }\n if (start > newEnd || start > end) {\n for (j = start; j <= newEnd; j++) setProperty(previous, j, target[j]);\n for (; j < target.length; j++) {\n setProperty(previous, j, temp[j]);\n applyState(target[j], previous, j, merge, key);\n }\n if (previous.length > target.length) setProperty(previous, \"length\", target.length);\n return;\n }\n newIndicesNext = new Array(newEnd + 1);\n for (j = newEnd; j >= start; j--) {\n item = target[j];\n keyVal = key ? item[key] : item;\n i = newIndices.get(keyVal);\n newIndicesNext[j] = i === undefined ? -1 : i;\n newIndices.set(keyVal, j);\n }\n for (i = start; i <= end; i++) {\n item = previous[i];\n keyVal = key ? item[key] : item;\n j = newIndices.get(keyVal);\n if (j !== undefined && j !== -1) {\n temp[j] = previous[i];\n j = newIndicesNext[j];\n newIndices.set(keyVal, j);\n }\n }\n for (j = start; j < target.length; j++) {\n if (j in temp) {\n setProperty(previous, j, temp[j]);\n applyState(target[j], previous, j, merge, key);\n } else setProperty(previous, j, target[j]);\n }\n } else {\n for (let i = 0, len = target.length; i < len; i++) {\n applyState(target[i], previous, i, merge, key);\n }\n }\n if (previous.length > target.length) setProperty(previous, \"length\", target.length);\n return;\n }\n const targetKeys = Object.keys(target);\n for (let i = 0, len = targetKeys.length; i < len; i++) {\n applyState(target[targetKeys[i]], previous, targetKeys[i], merge, key);\n }\n const previousKeys = Object.keys(previous);\n for (let i = 0, len = previousKeys.length; i < len; i++) {\n if (target[previousKeys[i]] === undefined) setProperty(previous, previousKeys[i], undefined);\n }\n}\nfunction reconcile(value, options = {}) {\n const {\n merge,\n key = \"id\"\n } = options,\n v = unwrap(value);\n return state => {\n if (!isWrappable(state) || !isWrappable(v)) return v;\n applyState(v, {\n state\n }, \"state\", merge, key);\n return state;\n };\n}\nconst setterTraps = {\n get(target, property) {\n if (property === $RAW) return target;\n const value = target[property];\n return isWrappable(value) ? new Proxy(value, setterTraps) : value;\n },\n set(target, property, value) {\n setProperty(target, property, unwrap(value));\n return true;\n },\n deleteProperty(target, property) {\n setProperty(target, property, undefined);\n return true;\n }\n};\nfunction produce(fn) {\n return state => {\n if (isWrappable(state)) fn(new Proxy(state, setterTraps));\n return state;\n };\n}\n\nconst FALLBACK = Symbol(\"fallback\");\nfunction mapArray(list, mapFn, options = {}) {\n let items = [],\n mapped = [],\n disposers = [],\n len = 0,\n indexes = mapFn.length > 1 ? [] : null,\n ctx = Owner;\n onCleanup(() => {\n for (let i = 0, length = disposers.length; i < length; i++) disposers[i]();\n });\n return () => {\n let newItems = list() || [],\n i,\n j;\n return untrack(() => {\n let newLen = newItems.length,\n newIndices,\n newIndicesNext,\n temp,\n tempdisposers,\n tempIndexes,\n start,\n end,\n newEnd,\n item;\n if (newLen === 0) {\n if (len !== 0) {\n for (i = 0; i < len; i++) disposers[i]();\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 }, ctx);\n len = 1;\n }\n }\n else if (len === 0) {\n for (j = 0; j < newLen; j++) {\n items[j] = newItems[j];\n mapped[j] = createRoot(mapper, ctx);\n }\n len = newLen;\n } else {\n temp = new Array(newLen);\n tempdisposers = new Array(newLen);\n indexes && (tempIndexes = new Array(newLen));\n for (start = 0, end = Math.min(len, newLen); start < end && items[start] === newItems[start]; start++);\n for (end = len - 1, newEnd = newLen - 1; end >= start && newEnd >= start && items[end] === newItems[newEnd]; end--, newEnd--) {\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, ctx);\n }\n len = mapped.length = 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 ctx = Owner;\n onCleanup(() => {\n for (let i = 0, length = disposers.length; i < length; i++) disposers[i]();\n });\n return () => {\n const newItems = list() || [];\n return untrack(() => {\n if (newItems.length === 0) {\n if (len !== 0) {\n for (i = 0; i < len; i++) disposers[i]();\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 }, ctx);\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 < newItems.length; 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, ctx);\n }\n }\n for (; i < items.length; i++) {\n disposers[i]();\n }\n len = mapped.length = signals.length = disposers.length = newItems.length;\n items = newItems.slice(0);\n return mapped;\n });\n function mapper(disposer) {\n disposers[i] = disposer;\n const [s, set] = createSignal(newItems[i], false);\n signals[i] = set;\n return mapFn(s, i);\n }\n };\n}\n\nfunction createComponent(Comp, props) {\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 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 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 mergeProps(...sources) {\n return new Proxy({\n get(property) {\n for (let i = sources.length - 1; i >= 0; i--) {\n const v = 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 sources[i]) return true;\n }\n return false;\n },\n keys() {\n const keys = [];\n for (let i = 0; i < sources.length; i++) keys.push(...Object.keys(sources[i]));\n return [...new Set(keys)];\n }\n }, propTraps);\n}\nfunction splitProps(props, ...keys) {\n const blocked = new Set(keys.flat());\n const descriptors = Object.getOwnPropertyDescriptors(props);\n const res = keys.map(k => {\n const clone = {};\n for (let i = 0; i < k.length; i++) {\n const key = k[i];\n if (descriptors[key]) Object.defineProperty(clone, key, descriptors[key]);\n }\n return clone;\n });\n res.push(new Proxy({\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 }, propTraps));\n return res;\n}\nfunction lazy(fn) {\n let p;\n const wrap = props => {\n const ctx = sharedConfig.context;\n let comp;\n if (ctx && sharedConfig.resources) {\n ctx.count++;\n const [s, set] = createSignal();\n (p || (p = fn())).then(mod => {\n setHydrateContext(ctx);\n set(mod.default);\n setHydrateContext(undefined);\n });\n comp = s;\n } else {\n const [s] = createResource(() => (p || (p = fn())).then(mod => mod.default));\n comp = s;\n }\n let Comp;\n return createMemo(() => (Comp = comp()) && untrack(() => {\n if (!ctx) 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 wrap.preload = () => (p || (p = fn())).then(mod => mod.default);\n return wrap;\n}\n\nfunction For(props) {\n const fallback = \"fallback\" in props && {\n fallback: () => props.fallback\n };\n return createMemo(mapArray(() => props.each, props.children, fallback ? fallback : undefined), undefined, false);\n}\nfunction Index(props) {\n const fallback = \"fallback\" in props && {\n fallback: () => props.fallback\n };\n return createMemo(indexArray(() => props.each, props.children, fallback ? fallback : undefined), undefined, false);\n}\nfunction Show(props) {\n let strictEqual = false;\n const condition = createMemo(() => props.when, undefined, (a, b) => strictEqual ? a === b : !a === !b);\n return createMemo(() => {\n const c = condition();\n if (c) {\n const child = props.children;\n return (strictEqual = typeof child === \"function\" && child.length > 0) ? untrack(() => child(c)) : child;\n }\n return props.fallback;\n });\n}\nfunction Switch(props) {\n let strictEqual = false;\n const conditions = children(() => props.children),\n evalConditions = createMemo(() => {\n let conds = conditions();\n if (!Array.isArray(conds)) conds = [conds];\n for (let i = 0; i < conds.length; i++) {\n const c = conds[i].when;\n if (c) return [i, c, conds[i]];\n }\n return [-1];\n }, undefined, (a, b) => a && a[0] === b[0] && (strictEqual ? a[1] === b[1] : !a[1] === !b[1]) && a[2] === b[2]);\n return createMemo(() => {\n const [index, when, cond] = evalConditions();\n if (index < 0) return props.fallback;\n const c = cond.children;\n return (strictEqual = typeof c === \"function\" && c.length > 0) ? untrack(() => c(when)) : c;\n });\n}\nfunction Match(props) {\n return props;\n}\nfunction ErrorBoundary(props) {\n const [errored, setErrored] = createSignal();\n onError(setErrored);\n let e;\n return createMemo(() => {\n if ((e = errored()) != null) {\n const f = props.fallback;\n return typeof f === \"function\" && f.length ? untrack(() => f(e, () => setErrored(null))) : f;\n }\n return props.children;\n });\n}\n\nconst SuspenseListContext = createContext();\nfunction SuspenseList(props) {\n let index = 0,\n suspenseSetter,\n showContent,\n showFallback;\n const listContext = useContext(SuspenseListContext);\n if (listContext) {\n const [inFallback, setFallback] = createSignal(false);\n suspenseSetter = setFallback;\n [showContent, showFallback] = listContext.register(inFallback);\n }\n const registry = [],\n comp = createComponent(SuspenseListContext.Provider, {\n value: {\n register: inFallback => {\n const [showingContent, showContent] = createSignal(false),\n [showingFallback, showFallback] = createSignal(false);\n registry[index++] = {\n inFallback,\n showContent,\n showFallback\n };\n return [showingContent, showingFallback];\n }\n },\n get children() {\n return props.children;\n }\n });\n createComputed(() => {\n const reveal = props.revealOrder,\n tail = props.tail,\n visibleContent = showContent ? showContent() : true,\n visibleFallback = showFallback ? showFallback() : true,\n reverse = reveal === \"backwards\";\n if (reveal === \"together\") {\n const all = registry.every(i => !i.inFallback());\n suspenseSetter && suspenseSetter(!all);\n registry.forEach(i => {\n i.showContent(all && visibleContent);\n i.showFallback(visibleFallback);\n });\n return;\n }\n let stop = false;\n for (let i = 0, len = registry.length; i < len; i++) {\n const n = reverse ? len - i - 1 : i,\n s = registry[n].inFallback();\n if (!stop && !s) {\n registry[n].showContent(visibleContent);\n registry[n].showFallback(visibleFallback);\n } else {\n const next = !stop;\n if (next && suspenseSetter) suspenseSetter(true);\n if (!tail || next && tail === \"collapsed\") {\n registry[n].showFallback(visibleFallback);\n } else registry[n].showFallback(false);\n stop = true;\n registry[n].showContent(next);\n }\n }\n if (!stop && suspenseSetter) suspenseSetter(false);\n });\n return comp;\n}\nfunction Suspense(props) {\n let counter = 0,\n showContent,\n showFallback;\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 const listContext = useContext(SuspenseListContext);\n if (listContext) [showContent, showFallback] = listContext.register(store.inFallback);\n return createComponent(SuspenseContext.Provider, {\n value: store,\n get children() {\n const rendered = untrack(() => props.children);\n return createMemo(() => {\n const inFallback = store.inFallback(),\n visibleContent = showContent ? showContent() : true,\n visibleFallback = showFallback ? showFallback() : true;\n if (!inFallback && visibleContent) {\n store.resolved = true;\n resumeEffects(store.effects);\n return rendered;\n }\n if (!visibleFallback) return;\n return props.fallback;\n });\n }\n });\n}\n\nfunction awaitSuspense() {}\nlet DEV;\n\nexport { $RAW, DEV, ErrorBoundary, For, Index, Match, Show, Suspense, SuspenseList, Switch, awaitSuspense, batch, cancelCallback, children, createComponent, createComputed, createContext, createDeferred, createEffect, createMemo, createMutable, createRenderEffect, createResource, createRoot, createSelector, createSignal, createState, equalFn, getListener, getOwner, indexArray, lazy, mapArray, mergeProps, on, onCleanup, onError, onMount, produce, reconcile, requestCallback, runWithOwner, sharedConfig, splitProps, untrack, unwrap, useContext, useTransition };\n","import { createMemo, createRoot, createRenderEffect, sharedConfig, createSignal, onCleanup, splitProps, untrack } from 'solid-js';\nexport { ErrorBoundary, For, Index, Match, Show, Suspense, SuspenseList, Switch, createComponent, createRenderEffect as effect, getOwner, mergeProps } from 'solid-js';\n\nconst booleans = [\"allowfullscreen\", \"allowpaymentrequest\", \"async\", \"autofocus\", \"autoplay\", \"checked\", \"controls\", \"default\", \"disabled\", \"formnovalidate\", \"hidden\", \"ismap\", \"itemscope\", \"loop\", \"multiple\", \"muted\", \"nomodule\", \"novalidate\", \"open\", \"playsinline\", \"readonly\", \"required\", \"reversed\", \"seamless\", \"selected\", \"truespeed\"];\nconst Properties = new Set([\"className\", \"indeterminate\", \"value\", ...booleans]);\nconst ChildProperties = new Set([\"innerHTML\", \"textContent\", \"innerText\", \"children\"]);\nconst Aliases = {\n className: \"class\",\n htmlFor: \"for\"\n};\nconst DelegatedEvents = new Set([\"beforeinput\", \"click\", \"dblclick\", \"focusin\", \"focusout\", \"input\", \"keydown\", \"keyup\", \"mousedown\", \"mousemove\", \"mouseout\", \"mouseover\", \"mouseup\", \"pointerdown\", \"pointermove\", \"pointerout\", \"pointerover\", \"pointerup\", \"touchend\", \"touchmove\", \"touchstart\"]);\nconst SVGElements = new Set([\n\"altGlyph\", \"altGlyphDef\", \"altGlyphItem\", \"animate\", \"animateColor\", \"animateMotion\", \"animateTransform\", \"circle\", \"clipPath\", \"color-profile\", \"cursor\", \"defs\", \"desc\", \"ellipse\", \"feBlend\", \"feColorMatrix\", \"feComponentTransfer\", \"feComposite\", \"feConvolveMatrix\", \"feDiffuseLighting\", \"feDisplacementMap\", \"feDistantLight\", \"feFlood\", \"feFuncA\", \"feFuncB\", \"feFuncG\", \"feFuncR\", \"feGaussianBlur\", \"feImage\", \"feMerge\", \"feMergeNode\", \"feMorphology\", \"feOffset\", \"fePointLight\", \"feSpecularLighting\", \"feSpotLight\", \"feTile\", \"feTurbulence\", \"filter\", \"font\", \"font-face\", \"font-face-format\", \"font-face-name\", \"font-face-src\", \"font-face-uri\", \"foreignObject\", \"g\", \"glyph\", \"glyphRef\", \"hkern\", \"image\", \"line\", \"linearGradient\", \"marker\", \"mask\", \"metadata\", \"missing-glyph\", \"mpath\", \"path\", \"pattern\", \"polygon\", \"polyline\", \"radialGradient\", \"rect\",\n\"set\", \"stop\",\n\"svg\", \"switch\", \"symbol\", \"text\", \"textPath\",\n\"tref\", \"tspan\", \"use\", \"view\", \"vkern\"]);\nconst SVGNamespace = {\n xlink: \"http://www.w3.org/1999/xlink\",\n xml: \"http://www.w3.org/XML/1998/namespace\"\n};\n\nfunction memo(fn, equal) {\n return createMemo(fn, undefined, equal);\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 (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])) parentNode.removeChild(a[aStart]);\n aStart++;\n }\n } else if (a[aStart] === b[bStart]) {\n aStart++;\n bStart++;\n } else if (a[aEnd - 1] === b[bEnd - 1]) {\n aEnd--;\n bEnd--;\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 parentNode.removeChild(a[aStart++]);\n }\n }\n}\n\nconst $$EVENTS = Symbol(\"delegated-events\");\nfunction render(code, element, init) {\n let disposer;\n createRoot(dispose => {\n disposer = dispose;\n insert(element, code(), element.firstChild ? null : undefined, init);\n });\n return () => {\n disposer();\n element.textContent = \"\";\n };\n}\nfunction template(html, check, isSVG) {\n const t = document.createElement(\"template\");\n t.innerHTML = html;\n if (check && t.innerHTML.split(\"<\").length - 1 !== check) throw `Template html does not match input:\\n${t.innerHTML}\\n\\n${html}`;\n let node = t.content.firstChild;\n if (isSVG) node = node.firstChild;\n return node;\n}\nfunction delegateEvents(eventNames) {\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() {\n if (document[$$EVENTS]) {\n for (let name of document[$$EVENTS].keys()) document.removeEventListener(name, eventHandler);\n delete document[$$EVENTS];\n }\n}\nfunction setAttribute(node, name, value) {\n if (value == null) node.removeAttribute(name);else node.setAttribute(name, value);\n}\nfunction setAttributeNS(node, namespace, name, value) {\n if (value == null) node.removeAttributeNS(namespace, name);else node.setAttributeNS(namespace, name, 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 node.addEventListener(name, e => handler[0](handler[1], e));\n } else node.addEventListener(name, 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\" || key in value) 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) continue;\n toggleClassKey(node, key, classValue);\n prev[key] = classValue;\n }\n return value;\n}\nfunction style(node, value, prev = {}) {\n const nodeStyle = node.style;\n if (typeof value === \"string\") return nodeStyle.cssText = value;\n typeof prev === \"string\" && (prev = {});\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, accessor, isSVG, skipChildren) {\n if (typeof accessor === \"function\") {\n createRenderEffect(current => spreadExpression(node, accessor(), current, isSVG, skipChildren));\n } else spreadExpression(node, accessor, undefined, isSVG, skipChildren);\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 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 = {}) {\n let isCE, isProp, isChildProp;\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 if (value === prevProps[prop]) continue;\n if (prop === \"style\") {\n style(node, value, prevProps[prop]);\n } else if (prop === \"class\" && !isSVG) {\n node.className = value;\n } else if (prop === \"classList\") {\n classList(node, value, prevProps[prop]);\n } else if (prop === \"ref\") {\n value(node);\n } else if (prop.slice(0, 3) === \"on:\") {\n node.addEventListener(prop.slice(3), value);\n } else if (prop.slice(0, 10) === \"oncapture:\") {\n node.addEventListener(prop.slice(10), value, true);\n } else if (prop.slice(0, 2) === \"on\") {\n const name = prop.slice(2).toLowerCase();\n const delegate = DelegatedEvents.has(name);\n addEventListener(node, name, value, delegate);\n delegate && delegateEvents([name]);\n } else if ((isChildProp = ChildProperties.has(prop)) || !isSVG && (isProp = Properties.has(prop)) || (isCE = node.nodeName.includes(\"-\"))) {\n if (isCE && !isProp && !isChildProp) node[toPropertyName(prop)] = value;else node[prop] = value;\n } else {\n const ns = isSVG && prop.indexOf(\":\") > -1 && SVGNamespace[prop.split(\":\")[0]];\n if (ns) setAttributeNS(node, ns, prop, value);else setAttribute(node, Aliases[prop] || prop, value);\n }\n prevProps[prop] = value;\n }\n}\nfunction hydrate(code, element) {\n sharedConfig.resources = globalThis._$HYDRATION.resources;\n sharedConfig.completed = globalThis._$HYDRATION.completed;\n sharedConfig.events = globalThis._$HYDRATION.events;\n sharedConfig.context = {\n id: \"\",\n count: 0,\n loadResource: globalThis._$HYDRATION.loadResource\n };\n sharedConfig.registry = new Map();\n gatherHydratable(element);\n const dispose = render(code, element, [...element.childNodes]);\n sharedConfig.context = null;\n return dispose;\n}\nfunction gatherHydratable(element) {\n const templates = element.querySelectorAll(`*[data-hk]`);\n for (let i = 0; i < templates.length; i++) {\n const node = templates[i];\n sharedConfig.registry.set(node.getAttribute(\"data-hk\"), node);\n }\n}\nfunction getNextElement(template) {\n let node, key;\n if (!sharedConfig.context || !(node = sharedConfig.registry.get(key = getHydrationKey()))) {\n return template.cloneNode(true);\n }\n if (sharedConfig.completed) sharedConfig.completed.add(node);\n sharedConfig.registry.delete(key);\n return node;\n}\nfunction getNextMarker(start) {\n let end = start,\n count = 0,\n current = [];\n if (sharedConfig.context) {\n while (end) {\n if (end.nodeType === 8) {\n const v = end.nodeValue;\n if (v === \"#\") count++;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 {\n completed,\n events\n } = sharedConfig;\n events.queued = false;\n while (events.length) {\n const [el, e] = events[0];\n if (!completed.has(el)) return;\n eventHandler(e);\n events.shift();\n }\n });\n sharedConfig.events.queued = true;\n }\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.split(/\\s+/);\n for (let i = 0, nameLen = classNames.length; i < nameLen; i++) node.classList.toggle(classNames[i], value);\n}\nfunction eventHandler(e) {\n const key = `$$${e.type}`;\n let node = e.composedPath && e.composedPath()[0] || e.target;\n if (e.target !== node) {\n Object.defineProperty(e, \"target\", {\n configurable: true,\n value: node\n });\n }\n Object.defineProperty(e, \"currentTarget\", {\n configurable: true,\n get() {\n return node;\n }\n });\n while (node !== null) {\n const handler = node[key];\n if (handler) {\n const data = node[`${key}Data`];\n data !== undefined ? handler(data, e) : handler(e);\n if (e.cancelBubble) return;\n }\n node = node.host && node.host !== node && node.host instanceof Node ? node.host : node.parentNode;\n }\n}\nfunction spreadExpression(node, props, prevProps = {}, isSVG, skipChildren) {\n if (!skipChildren && \"children\" in props) {\n createRenderEffect(() => prevProps.children = insertExpression(node, props.children, prevProps.children));\n }\n createRenderEffect(() => assign(node, props, isSVG, true, prevProps));\n return prevProps;\n}\nfunction insertExpression(parent, value, current, marker, unwrapArray) {\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 (t === \"number\") value = value.toString();\n if (multi) {\n let node = current[0];\n if (node && node.nodeType === 3) {\n 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 (sharedConfig.context) 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 if (normalizeIncomingArray(array, value, unwrapArray)) {\n createRenderEffect(() => current = insertExpression(parent, array, current, marker, true));\n return () => current;\n }\n if (sharedConfig.context && current.length) return current;\n if (array.length === 0) {\n current = cleanChildren(parent, current, marker);\n if (multi) return current;\n } else {\n if (Array.isArray(current)) {\n if (current.length === 0) {\n appendNodes(parent, array, marker);\n } else reconcileArrays(parent, current, array);\n } else if (current == null || current === \"\") {\n appendNodes(parent, array);\n } else {\n reconcileArrays(parent, multi && current || [parent.firstChild], array);\n }\n }\n current = array;\n } else if (value instanceof Node) {\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 console.warn(`Skipped inserting`, value);\n return current;\n}\nfunction normalizeIncomingArray(normalized, array, unwrap) {\n let dynamic = false;\n for (let i = 0, len = array.length; i < len; i++) {\n let item = array[i],\n t;\n if (item instanceof Node) {\n normalized.push(item);\n } else if (item == null || item === true || item === false) ; else if (Array.isArray(item)) {\n dynamic = normalizeIncomingArray(normalized, item) || dynamic;\n } else if ((t = typeof item) === \"string\") {\n normalized.push(document.createTextNode(item));\n } else if (t === \"function\") {\n if (unwrap) {\n while (typeof item === \"function\") item = item();\n dynamic = normalizeIncomingArray(normalized, Array.isArray(item) ? item : [item]) || dynamic;\n } else {\n normalized.push(item);\n dynamic = true;\n }\n } else normalized.push(document.createTextNode(item.toString()));\n }\n return dynamic;\n}\nfunction appendNodes(parent, array, marker) {\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) isParent ? parent.replaceChild(node, el) : parent.insertBefore(node, marker);else isParent && parent.removeChild(el);\n } else inserted = true;\n }\n } else parent.insertBefore(node, marker);\n return [node];\n}\nfunction getHydrationKey() {\n const hydrate = sharedConfig.context;\n return `${hydrate.id}${hydrate.count++}`;\n}\n\nfunction renderToString(fn, options) {}\nfunction renderToStringAsync(fn, options) {}\nfunction renderToNodeStream(fn, options) {}\nfunction renderToWebStream(fn, options) {}\nfunction ssr(template, ...nodes) {}\nfunction resolveSSRNode(node) {}\nfunction ssrClassList(value) {}\nfunction ssrStyle(value) {}\nfunction ssrSpread(accessor) {}\nfunction ssrBoolean(key, value) {}\nfunction escape(html) {}\n\nconst isServer = 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}\nfunction Portal(props) {\n const {\n useShadow\n } = props,\n marker = document.createTextNode(\"\"),\n mount = props.mount || document.body;\n function renderPortal() {\n if (sharedConfig.context) {\n const [s, set] = createSignal(false);\n queueMicrotask(() => set(true));\n return () => s() && props.children;\n } else return () => props.children;\n }\n if (mount instanceof HTMLHeadElement) {\n const [clean, setClean] = createSignal(false);\n const cleanup = () => setClean(true);\n createRoot(dispose => insert(mount, () => !clean() ? renderPortal()() : dispose(), null));\n onCleanup(() => {\n if (sharedConfig.context) queueMicrotask(cleanup);else cleanup();\n });\n } else {\n const container = createElement(props.isSVG ? \"g\" : \"div\", props.isSVG),\n renderRoot = useShadow && container.attachShadow ? container.attachShadow({\n mode: \"open\"\n }) : container;\n Object.defineProperty(container, \"host\", {\n get() {\n return marker.parentNode;\n }\n });\n insert(renderRoot, renderPortal());\n mount.appendChild(container);\n props.ref && props.ref(container);\n onCleanup(() => mount.removeChild(container));\n }\n return marker;\n}\nfunction Dynamic(props) {\n const [p, others] = splitProps(props, [\"component\"]);\n return createMemo(() => {\n const component = p.component;\n switch (typeof component) {\n case \"function\":\n return untrack(() => component(others));\n case \"string\":\n const isSvg = SVGElements.has(component);\n const el = createElement(component, isSvg);\n spread(el, others, isSvg);\n return el;\n }\n });\n}\n\nexport { Aliases, ChildProperties, DelegatedEvents, Dynamic, Portal, Properties, SVGElements, SVGNamespace, addEventListener, assign, classList, clearDelegatedEvents, delegateEvents, dynamicProperty, escape, gatherHydratable, getHydrationKey, getNextElement, getNextMarker, hydrate, insert, isServer, memo, render, renderToNodeStream, renderToString, renderToStringAsync, renderToWebStream, resolveSSRNode, runHydrationEvents, setAttribute, setAttributeNS, spread, ssr, ssrBoolean, ssrClassList, ssrSpread, ssrStyle, style, template };\n","const {\n hasOwnProperty,\n setPrototypeOf,\n isFrozen,\n getPrototypeOf,\n getOwnPropertyDescriptor,\n} = Object;\n\nlet { freeze, seal, create } = Object; // eslint-disable-line import/no-mutable-exports\nlet { apply, construct } = typeof Reflect !== 'undefined' && Reflect;\n\nif (!apply) {\n apply = function (fun, thisValue, args) {\n return fun.apply(thisValue, args);\n };\n}\n\nif (!freeze) {\n freeze = function (x) {\n return x;\n };\n}\n\nif (!seal) {\n seal = function (x) {\n return x;\n };\n}\n\nif (!construct) {\n construct = function (Func, args) {\n return new Func(...args);\n };\n}\n\nconst arrayForEach = unapply(Array.prototype.forEach);\nconst arrayIndexOf = unapply(Array.prototype.indexOf);\nconst arrayPop = unapply(Array.prototype.pop);\nconst arrayPush = unapply(Array.prototype.push);\nconst arraySlice = unapply(Array.prototype.slice);\n\nconst stringToLowerCase = unapply(String.prototype.toLowerCase);\nconst stringMatch = unapply(String.prototype.match);\nconst stringReplace = unapply(String.prototype.replace);\nconst stringIndexOf = unapply(String.prototype.indexOf);\nconst stringTrim = unapply(String.prototype.trim);\n\nconst regExpTest = unapply(RegExp.prototype.test);\n\nconst typeErrorCreate = unconstruct(TypeError);\n\nexport function unapply(func) {\n return (thisArg, ...args) => apply(func, thisArg, args);\n}\n\nexport function unconstruct(func) {\n return (...args) => construct(func, args);\n}\n\n/* Add properties to a lookup table */\nexport function addToSet(set, array) {\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\n let l = array.length;\n while (l--) {\n let element = array[l];\n if (typeof element === 'string') {\n const lcElement = stringToLowerCase(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\n element = lcElement;\n }\n }\n\n set[element] = true;\n }\n\n return set;\n}\n\n/* Shallow clone an object */\nexport function clone(object) {\n const newObject = create(null);\n\n let property;\n for (property in object) {\n if (apply(hasOwnProperty, object, [property])) {\n newObject[property] = object[property];\n }\n }\n\n return newObject;\n}\n\n/* IE10 doesn't support __lookupGetter__ so lets'\n * simulate it. It also automatically checks\n * if the prop is function or getter and behaves\n * accordingly. */\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\n if (typeof desc.value === 'function') {\n return unapply(desc.value);\n }\n }\n\n object = getPrototypeOf(object);\n }\n\n function fallbackValue(element) {\n console.warn('fallback value for', element);\n return null;\n }\n\n return fallbackValue;\n}\n\nexport {\n // Array\n arrayForEach,\n arrayIndexOf,\n arrayPop,\n arrayPush,\n arraySlice,\n // Object\n freeze,\n getPrototypeOf,\n getOwnPropertyDescriptor,\n hasOwnProperty,\n isFrozen,\n setPrototypeOf,\n seal,\n // RegExp\n regExpTest,\n // String\n stringIndexOf,\n stringMatch,\n stringReplace,\n stringToLowerCase,\n stringTrim,\n // Errors\n typeErrorCreate,\n // Other\n lookupGetter,\n};\n","import { freeze } from './utils.js';\n\nexport const html = freeze([\n 'a',\n 'abbr',\n 'acronym',\n 'address',\n 'area',\n 'article',\n 'aside',\n 'audio',\n 'b',\n 'bdi',\n 'bdo',\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 'decorator',\n 'del',\n 'details',\n 'dfn',\n 'dialog',\n 'dir',\n 'div',\n 'dl',\n 'dt',\n 'element',\n 'em',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'font',\n 'footer',\n 'form',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'head',\n 'header',\n 'hgroup',\n 'hr',\n 'html',\n 'i',\n 'img',\n 'input',\n 'ins',\n 'kbd',\n 'label',\n 'legend',\n 'li',\n 'main',\n 'map',\n 'mark',\n 'marquee',\n 'menu',\n 'menuitem',\n 'meter',\n 'nav',\n 'nobr',\n 'ol',\n 'optgroup',\n 'option',\n 'output',\n 'p',\n 'picture',\n 'pre',\n 'progress',\n 'q',\n 'rp',\n 'rt',\n 'ruby',\n 's',\n 'samp',\n 'section',\n 'select',\n 'shadow',\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 'tr',\n 'track',\n 'tt',\n 'u',\n 'ul',\n 'var',\n 'video',\n 'wbr',\n]);\n\n// SVG\nexport const svg = freeze([\n 'svg',\n 'a',\n 'altglyph',\n 'altglyphdef',\n 'altglyphitem',\n 'animatecolor',\n 'animatemotion',\n 'animatetransform',\n 'circle',\n 'clippath',\n 'defs',\n 'desc',\n 'ellipse',\n 'filter',\n 'font',\n 'g',\n 'glyph',\n 'glyphref',\n 'hkern',\n 'image',\n 'line',\n 'lineargradient',\n 'marker',\n 'mask',\n 'metadata',\n 'mpath',\n 'path',\n 'pattern',\n 'polygon',\n 'polyline',\n 'radialgradient',\n 'rect',\n 'stop',\n 'style',\n 'switch',\n 'symbol',\n 'text',\n 'textpath',\n 'title',\n 'tref',\n 'tspan',\n 'view',\n 'vkern',\n]);\n\nexport const svgFilters = freeze([\n 'feBlend',\n 'feColorMatrix',\n 'feComponentTransfer',\n 'feComposite',\n 'feConvolveMatrix',\n 'feDiffuseLighting',\n 'feDisplacementMap',\n 'feDistantLight',\n 'feFlood',\n 'feFuncA',\n 'feFuncB',\n 'feFuncG',\n 'feFuncR',\n 'feGaussianBlur',\n 'feMerge',\n 'feMergeNode',\n 'feMorphology',\n 'feOffset',\n 'fePointLight',\n 'feSpecularLighting',\n 'feSpotLight',\n 'feTile',\n 'feTurbulence',\n]);\n\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.\nexport const svgDisallowed = freeze([\n 'animate',\n 'color-profile',\n 'cursor',\n 'discard',\n 'fedropshadow',\n 'feimage',\n 'font-face',\n 'font-face-format',\n 'font-face-name',\n 'font-face-src',\n 'font-face-uri',\n 'foreignobject',\n 'hatch',\n 'hatchpath',\n 'mesh',\n 'meshgradient',\n 'meshpatch',\n 'meshrow',\n 'missing-glyph',\n 'script',\n 'set',\n 'solidcolor',\n 'unknown',\n 'use',\n]);\n\nexport const mathMl = freeze([\n 'math',\n 'menclose',\n 'merror',\n 'mfenced',\n 'mfrac',\n 'mglyph',\n 'mi',\n 'mlabeledtr',\n 'mmultiscripts',\n 'mn',\n 'mo',\n 'mover',\n 'mpadded',\n 'mphantom',\n 'mroot',\n 'mrow',\n 'ms',\n 'mspace',\n 'msqrt',\n 'mstyle',\n 'msub',\n 'msup',\n 'msubsup',\n 'mtable',\n 'mtd',\n 'mtext',\n 'mtr',\n 'munder',\n 'munderover',\n]);\n\n// Similarly to SVG, we want to know all MathML elements,\n// even those that we disallow by default.\nexport const mathMlDisallowed = freeze([\n 'maction',\n 'maligngroup',\n 'malignmark',\n 'mlongdiv',\n 'mscarries',\n 'mscarry',\n 'msgroup',\n 'mstack',\n 'msline',\n 'msrow',\n 'semantics',\n 'annotation',\n 'annotation-xml',\n 'mprescripts',\n 'none',\n]);\n\nexport const text = freeze(['#text']);\n","import { freeze } from './utils.js';\n\nexport const html = freeze([\n 'accept',\n 'action',\n 'align',\n 'alt',\n 'autocapitalize',\n 'autocomplete',\n 'autopictureinpicture',\n 'autoplay',\n 'background',\n 'bgcolor',\n 'border',\n 'capture',\n 'cellpadding',\n 'cellspacing',\n 'checked',\n 'cite',\n 'class',\n 'clear',\n 'color',\n 'cols',\n 'colspan',\n 'controls',\n 'controlslist',\n 'coords',\n 'crossorigin',\n 'datetime',\n 'decoding',\n 'default',\n 'dir',\n 'disabled',\n 'disablepictureinpicture',\n 'disableremoteplayback',\n 'download',\n 'draggable',\n 'enctype',\n 'enterkeyhint',\n 'face',\n 'for',\n 'headers',\n 'height',\n 'hidden',\n 'high',\n 'href',\n 'hreflang',\n 'id',\n 'inputmode',\n 'integrity',\n 'ismap',\n 'kind',\n 'label',\n 'lang',\n 'list',\n 'loading',\n 'loop',\n 'low',\n 'max',\n 'maxlength',\n 'media',\n 'method',\n 'min',\n 'minlength',\n 'multiple',\n 'muted',\n 'name',\n 'noshade',\n 'novalidate',\n 'nowrap',\n 'open',\n 'optimum',\n 'pattern',\n 'placeholder',\n 'playsinline',\n 'poster',\n 'preload',\n 'pubdate',\n 'radiogroup',\n 'readonly',\n 'rel',\n 'required',\n 'rev',\n 'reversed',\n 'role',\n 'rows',\n 'rowspan',\n 'spellcheck',\n 'scope',\n 'selected',\n 'shape',\n 'size',\n 'sizes',\n 'span',\n 'srclang',\n 'start',\n 'src',\n 'srcset',\n 'step',\n 'style',\n 'summary',\n 'tabindex',\n 'title',\n 'translate',\n 'type',\n 'usemap',\n 'valign',\n 'value',\n 'width',\n 'xmlns',\n 'slot',\n]);\n\nexport const svg = freeze([\n 'accent-height',\n 'accumulate',\n 'additive',\n 'alignment-baseline',\n 'ascent',\n 'attributename',\n 'attributetype',\n 'azimuth',\n 'basefrequency',\n 'baseline-shift',\n 'begin',\n 'bias',\n 'by',\n 'class',\n 'clip',\n 'clippathunits',\n 'clip-path',\n 'clip-rule',\n 'color',\n 'color-interpolation',\n 'color-interpolation-filters',\n 'color-profile',\n 'color-rendering',\n 'cx',\n 'cy',\n 'd',\n 'dx',\n 'dy',\n 'diffuseconstant',\n 'direction',\n 'display',\n 'divisor',\n 'dur',\n 'edgemode',\n 'elevation',\n 'end',\n 'fill',\n 'fill-opacity',\n 'fill-rule',\n 'filter',\n 'filterunits',\n 'flood-color',\n 'flood-opacity',\n 'font-family',\n 'font-size',\n 'font-size-adjust',\n 'font-stretch',\n 'font-style',\n 'font-variant',\n 'font-weight',\n 'fx',\n 'fy',\n 'g1',\n 'g2',\n 'glyph-name',\n 'glyphref',\n 'gradientunits',\n 'gradienttransform',\n 'height',\n 'href',\n 'id',\n 'image-rendering',\n 'in',\n 'in2',\n 'k',\n 'k1',\n 'k2',\n 'k3',\n 'k4',\n 'kerning',\n 'keypoints',\n 'keysplines',\n 'keytimes',\n 'lang',\n 'lengthadjust',\n 'letter-spacing',\n 'kernelmatrix',\n 'kernelunitlength',\n 'lighting-color',\n 'local',\n 'marker-end',\n 'marker-mid',\n 'marker-start',\n 'markerheight',\n 'markerunits',\n 'markerwidth',\n 'maskcontentunits',\n 'maskunits',\n 'max',\n 'mask',\n 'media',\n 'method',\n 'mode',\n 'min',\n 'name',\n 'numoctaves',\n 'offset',\n 'operator',\n 'opacity',\n 'order',\n 'orient',\n 'orientation',\n 'origin',\n 'overflow',\n 'paint-order',\n 'path',\n 'pathlength',\n 'patterncontentunits',\n 'patterntransform',\n 'patternunits',\n 'points',\n 'preservealpha',\n 'preserveaspectratio',\n 'primitiveunits',\n 'r',\n 'rx',\n 'ry',\n 'radius',\n 'refx',\n 'refy',\n 'repeatcount',\n 'repeatdur',\n 'restart',\n 'result',\n 'rotate',\n 'scale',\n 'seed',\n 'shape-rendering',\n 'specularconstant',\n 'specularexponent',\n 'spreadmethod',\n 'startoffset',\n 'stddeviation',\n 'stitchtiles',\n 'stop-color',\n 'stop-opacity',\n 'stroke-dasharray',\n 'stroke-dashoffset',\n 'stroke-linecap',\n 'stroke-linejoin',\n 'stroke-miterlimit',\n 'stroke-opacity',\n 'stroke',\n 'stroke-width',\n 'style',\n 'surfacescale',\n 'systemlanguage',\n 'tabindex',\n 'targetx',\n 'targety',\n 'transform',\n 'text-anchor',\n 'text-decoration',\n 'text-rendering',\n 'textlength',\n 'type',\n 'u1',\n 'u2',\n 'unicode',\n 'values',\n 'viewbox',\n 'visibility',\n 'version',\n 'vert-adv-y',\n 'vert-origin-x',\n 'vert-origin-y',\n 'width',\n 'word-spacing',\n 'wrap',\n 'writing-mode',\n 'xchannelselector',\n 'ychannelselector',\n 'x',\n 'x1',\n 'x2',\n 'xmlns',\n 'y',\n 'y1',\n 'y2',\n 'z',\n 'zoomandpan',\n]);\n\nexport const mathMl = freeze([\n 'accent',\n 'accentunder',\n 'align',\n 'bevelled',\n 'close',\n 'columnsalign',\n 'columnlines',\n 'columnspan',\n 'denomalign',\n 'depth',\n 'dir',\n 'display',\n 'displaystyle',\n 'encoding',\n 'fence',\n 'frame',\n 'height',\n 'href',\n 'id',\n 'largeop',\n 'length',\n 'linethickness',\n 'lspace',\n 'lquote',\n 'mathbackground',\n 'mathcolor',\n 'mathsize',\n 'mathvariant',\n 'maxsize',\n 'minsize',\n 'movablelimits',\n 'notation',\n 'numalign',\n 'open',\n 'rowalign',\n 'rowlines',\n 'rowspacing',\n 'rowspan',\n 'rspace',\n 'rquote',\n 'scriptlevel',\n 'scriptminsize',\n 'scriptsizemultiplier',\n 'selection',\n 'separator',\n 'separators',\n 'stretchy',\n 'subscriptshift',\n 'supscriptshift',\n 'symmetric',\n 'voffset',\n 'width',\n 'xmlns',\n]);\n\nexport const xml = freeze([\n 'xlink:href',\n 'xml:id',\n 'xlink:title',\n 'xml:space',\n 'xmlns:xlink',\n]);\n","import { seal } from './utils.js';\n\n// eslint-disable-next-line unicorn/better-regex\nexport const MUSTACHE_EXPR = seal(/\\{\\{[\\s\\S]*|[\\s\\S]*\\}\\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode\nexport const ERB_EXPR = seal(/<%[\\s\\S]*|[\\s\\S]*%>/gm);\nexport const DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]/); // eslint-disable-line no-useless-escape\nexport const ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\nexport const IS_ALLOWED_URI = seal(\n /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n);\nexport const IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\nexport const ATTR_WHITESPACE = seal(\n /[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n);\n","import * as TAGS from './tags.js';\nimport * as ATTRS from './attrs.js';\nimport * as EXPRESSIONS from './regexp.js';\nimport {\n addToSet,\n clone,\n freeze,\n arrayForEach,\n arrayPop,\n arrayPush,\n stringMatch,\n stringReplace,\n stringToLowerCase,\n stringIndexOf,\n stringTrim,\n regExpTest,\n typeErrorCreate,\n lookupGetter,\n} from './utils.js';\n\nconst getGlobal = () => (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 {?TrustedTypePolicyFactory} trustedTypes The policy factory.\n * @param {Document} document The document object (to determine policy name suffix)\n * @return {?TrustedTypePolicy} The policy created (or null, if Trusted Types\n * are not supported).\n */\nconst _createTrustedTypesPolicy = function (trustedTypes, document) {\n if (\n typeof trustedTypes !== 'object' ||\n typeof trustedTypes.createPolicy !== 'function'\n ) {\n return null;\n }\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 (\n document.currentScript &&\n document.currentScript.hasAttribute(ATTR_NAME)\n ) {\n suffix = document.currentScript.getAttribute(ATTR_NAME);\n }\n\n const policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n\n try {\n return trustedTypes.createPolicy(policyName, {\n createHTML(html) {\n return html;\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(\n 'TrustedTypes policy ' + policyName + ' could not be created.'\n );\n return null;\n }\n};\n\nfunction createDOMPurify(window = getGlobal()) {\n const DOMPurify = (root) => createDOMPurify(root);\n\n /**\n * Version label, exposed for easier checks\n * if DOMPurify is up to date or not\n */\n DOMPurify.version = VERSION;\n\n /**\n * Array of elements that DOMPurify removed during sanitation.\n * Empty if nothing was removed.\n */\n DOMPurify.removed = [];\n\n if (!window || !window.document || window.document.nodeType !== 9) {\n // Not running in a browser, provide a factory function\n // so that you can pass your own Window\n DOMPurify.isSupported = false;\n\n return DOMPurify;\n }\n\n const originalDocument = window.document;\n\n let { document } = window;\n const {\n DocumentFragment,\n HTMLTemplateElement,\n Node,\n Element,\n NodeFilter,\n NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap,\n Text,\n Comment,\n DOMParser,\n trustedTypes,\n } = window;\n\n const ElementPrototype = Element.prototype;\n\n const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n const getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n\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\n const trustedTypesPolicy = _createTrustedTypesPolicy(\n trustedTypes,\n originalDocument\n );\n const emptyHTML =\n trustedTypesPolicy && RETURN_TRUSTED_TYPE\n ? trustedTypesPolicy.createHTML('')\n : '';\n\n const { implementation, createNodeIterator, createDocumentFragment } =\n document;\n const { importNode } = originalDocument;\n\n let documentMode = {};\n try {\n documentMode = clone(document).documentMode ? document.documentMode : {};\n } catch (_) {}\n\n let hooks = {};\n\n /**\n * Expose whether this browser supports running the full DOMPurify.\n */\n DOMPurify.isSupported =\n typeof getParentNode === 'function' &&\n implementation &&\n typeof implementation.createHTMLDocument !== 'undefined' &&\n documentMode !== 9;\n\n const {\n MUSTACHE_EXPR,\n ERB_EXPR,\n DATA_ATTR,\n ARIA_ATTR,\n IS_SCRIPT_OR_DATA,\n ATTR_WHITESPACE,\n } = EXPRESSIONS;\n\n let { IS_ALLOWED_URI } = EXPRESSIONS;\n\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\n /* allowed element names */\n let ALLOWED_TAGS = null;\n const DEFAULT_ALLOWED_TAGS = addToSet({}, [\n ...TAGS.html,\n ...TAGS.svg,\n ...TAGS.svgFilters,\n ...TAGS.mathMl,\n ...TAGS.text,\n ]);\n\n /* Allowed attribute names */\n let ALLOWED_ATTR = null;\n const DEFAULT_ALLOWED_ATTR = addToSet({}, [\n ...ATTRS.html,\n ...ATTRS.svg,\n ...ATTRS.mathMl,\n ...ATTRS.xml,\n ]);\n\n /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n let FORBID_TAGS = null;\n\n /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n let FORBID_ATTR = null;\n\n /* Decide if ARIA attributes are okay */\n let ALLOW_ARIA_ATTR = true;\n\n /* Decide if custom data attributes are okay */\n let ALLOW_DATA_ATTR = true;\n\n /* Decide if unknown protocols are okay */\n let ALLOW_UNKNOWN_PROTOCOLS = false;\n\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\n /* Decide if document with <html>... should be returned */\n let WHOLE_DOCUMENT = false;\n\n /* Track whether config is already set on this instance of DOMPurify. */\n let SET_CONFIG = false;\n\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\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\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\n /* If `RETURN_DOM` or `RETURN_DOM_FRAGMENT` is enabled, decide if the returned DOM\n * `Node` is imported into the current `Document`. If this flag is not enabled the\n * `Node` will belong (its ownerDocument) to a fresh `HTMLDocument`, created by\n * DOMPurify.\n *\n * This defaults to `true` starting DOMPurify 2.2.0. Note that setting it to `false`\n * might cause XSS from attacks hidden in closed shadowroots in case the browser\n * supports Declarative Shadow: DOM https://web.dev/declarative-shadow-dom/\n */\n let RETURN_DOM_IMPORT = true;\n\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\n /* Output should be free from DOM clobbering attacks? */\n let SANITIZE_DOM = true;\n\n /* Keep element content when removing element? */\n let KEEP_CONTENT = true;\n\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\n /* Allow usage of profiles like html, svg and mathMl */\n let USE_PROFILES = {};\n\n /* Tags to ignore content of when KEEP_CONTENT is true */\n const FORBID_CONTENTS = addToSet({}, [\n 'annotation-xml',\n 'audio',\n 'colgroup',\n 'desc',\n 'foreignobject',\n 'head',\n 'iframe',\n 'math',\n 'mi',\n 'mn',\n 'mo',\n 'ms',\n 'mtext',\n 'noembed',\n 'noframes',\n 'noscript',\n 'plaintext',\n 'script',\n 'style',\n 'svg',\n 'template',\n 'thead',\n 'title',\n 'video',\n 'xmp',\n ]);\n\n /* Tags that are safe for data: URIs */\n let DATA_URI_TAGS = null;\n const DEFAULT_DATA_URI_TAGS = addToSet({}, [\n 'audio',\n 'video',\n 'img',\n 'source',\n 'image',\n 'track',\n ]);\n\n /* Attributes safe for values like \"javascript:\" */\n let URI_SAFE_ATTRIBUTES = null;\n const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, [\n 'alt',\n 'class',\n 'for',\n 'id',\n 'label',\n 'name',\n 'pattern',\n 'placeholder',\n 'summary',\n 'title',\n 'value',\n 'style',\n 'xmlns',\n ]);\n\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\n /* Keep a reference to config to pass to hooks */\n let CONFIG = null;\n\n /* Ideally, do not touch anything below this line */\n /* ______________________________________________ */\n\n const formElement = document.createElement('form');\n\n /**\n * _parseConfig\n *\n * @param {Object} cfg optional config literal\n */\n // eslint-disable-next-line complexity\n const _parseConfig = function (cfg) {\n if (CONFIG && CONFIG === cfg) {\n return;\n }\n\n /* Shield configuration object from tampering */\n if (!cfg || typeof cfg !== 'object') {\n cfg = {};\n }\n\n /* Shield configuration object from prototype pollution */\n cfg = clone(cfg);\n\n /* Set configuration parameters */\n ALLOWED_TAGS =\n 'ALLOWED_TAGS' in cfg\n ? addToSet({}, cfg.ALLOWED_TAGS)\n : DEFAULT_ALLOWED_TAGS;\n ALLOWED_ATTR =\n 'ALLOWED_ATTR' in cfg\n ? addToSet({}, cfg.ALLOWED_ATTR)\n : DEFAULT_ALLOWED_ATTR;\n URI_SAFE_ATTRIBUTES =\n 'ADD_URI_SAFE_ATTR' in cfg\n ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), cfg.ADD_URI_SAFE_ATTR)\n : DEFAULT_URI_SAFE_ATTRIBUTES;\n DATA_URI_TAGS =\n 'ADD_DATA_URI_TAGS' in cfg\n ? addToSet(clone(DEFAULT_DATA_URI_TAGS), cfg.ADD_DATA_URI_TAGS)\n : DEFAULT_DATA_URI_TAGS;\n FORBID_TAGS = 'FORBID_TAGS' in cfg ? addToSet({}, cfg.FORBID_TAGS) : {};\n FORBID_ATTR = 'FORBID_ATTR' in cfg ? addToSet({}, cfg.FORBID_ATTR) : {};\n USE_PROFILES = 'USE_PROFILES' in cfg ? 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 SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\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_DOM_IMPORT = cfg.RETURN_DOM_IMPORT !== false; // Default true\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 KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n IN_PLACE = cfg.IN_PLACE || false; // Default false\n IS_ALLOWED_URI = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI;\n NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n if (SAFE_FOR_TEMPLATES) {\n ALLOW_DATA_ATTR = false;\n }\n\n if (RETURN_DOM_FRAGMENT) {\n RETURN_DOM = true;\n }\n\n /* Parse profile info */\n if (USE_PROFILES) {\n ALLOWED_TAGS = addToSet({}, [...TAGS.text]);\n ALLOWED_ATTR = [];\n if (USE_PROFILES.html === true) {\n addToSet(ALLOWED_TAGS, TAGS.html);\n addToSet(ALLOWED_ATTR, ATTRS.html);\n }\n\n if (USE_PROFILES.svg === true) {\n addToSet(ALLOWED_TAGS, TAGS.svg);\n addToSet(ALLOWED_ATTR, ATTRS.svg);\n addToSet(ALLOWED_ATTR, ATTRS.xml);\n }\n\n if (USE_PROFILES.svgFilters === true) {\n addToSet(ALLOWED_TAGS, TAGS.svgFilters);\n addToSet(ALLOWED_ATTR, ATTRS.svg);\n addToSet(ALLOWED_ATTR, ATTRS.xml);\n }\n\n if (USE_PROFILES.mathMl === true) {\n addToSet(ALLOWED_TAGS, TAGS.mathMl);\n addToSet(ALLOWED_ATTR, ATTRS.mathMl);\n addToSet(ALLOWED_ATTR, ATTRS.xml);\n }\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\n addToSet(ALLOWED_TAGS, cfg.ADD_TAGS);\n }\n\n if (cfg.ADD_ATTR) {\n if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n ALLOWED_ATTR = clone(ALLOWED_ATTR);\n }\n\n addToSet(ALLOWED_ATTR, cfg.ADD_ATTR);\n }\n\n if (cfg.ADD_URI_SAFE_ATTR) {\n addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR);\n }\n\n /* Add #text in case KEEP_CONTENT is set to true */\n if (KEEP_CONTENT) {\n ALLOWED_TAGS['#text'] = true;\n }\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\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\n // Prevent further manipulation of configuration.\n // Not available in IE8, Safari 5, etc.\n if (freeze) {\n freeze(cfg);\n }\n\n CONFIG = cfg;\n };\n\n const MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, [\n 'mi',\n 'mo',\n 'mn',\n 'ms',\n 'mtext',\n ]);\n\n const HTML_INTEGRATION_POINTS = addToSet({}, [\n 'foreignobject',\n 'desc',\n 'title',\n 'annotation-xml',\n ]);\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({}, TAGS.svg);\n addToSet(ALL_SVG_TAGS, TAGS.svgFilters);\n addToSet(ALL_SVG_TAGS, TAGS.svgDisallowed);\n\n const ALL_MATHML_TAGS = addToSet({}, TAGS.mathMl);\n addToSet(ALL_MATHML_TAGS, TAGS.mathMlDisallowed);\n\n /**\n *\n *\n * @param {Element} element a DOM element whose namespace is being checked\n * @returns {boolean} 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 (element) {\n let parent = getParentNode(element);\n\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: HTML_NAMESPACE,\n tagName: 'template',\n };\n }\n\n const tagName = stringToLowerCase(element.tagName);\n const parentTagName = stringToLowerCase(parent.tagName);\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\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 (\n tagName === 'svg' &&\n (parentTagName === 'annotation-xml' ||\n MATHML_TEXT_INTEGRATION_POINTS[parentTagName])\n );\n }\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\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\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\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\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 (\n parent.namespaceURI === SVG_NAMESPACE &&\n !HTML_INTEGRATION_POINTS[parentTagName]\n ) {\n return false;\n }\n\n if (\n parent.namespaceURI === MATHML_NAMESPACE &&\n !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]\n ) {\n return false;\n }\n\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 erronously deleted from\n // HTML namespace.\n const commonSvgAndHTMLElements = addToSet({}, [\n 'title',\n 'style',\n 'font',\n 'a',\n 'script',\n ]);\n\n // We disallow tags that are specific for MathML\n // or SVG and should never appear in HTML namespace\n return (\n !ALL_MATHML_TAGS[tagName] &&\n (commonSvgAndHTMLElements[tagName] || !ALL_SVG_TAGS[tagName])\n );\n }\n\n // The code should never reach this place (this means\n // that the element somehow got namespace that is not\n // HTML, SVG or MathML). Return false just in case.\n return false;\n };\n\n /**\n * _forceRemove\n *\n * @param {Node} node a DOM node\n */\n const _forceRemove = function (node) {\n arrayPush(DOMPurify.removed, { element: node });\n try {\n // eslint-disable-next-line unicorn/prefer-dom-node-remove\n node.parentNode.removeChild(node);\n } catch (_) {\n try {\n node.outerHTML = emptyHTML;\n } catch (_) {\n node.remove();\n }\n }\n };\n\n /**\n * _removeAttribute\n *\n * @param {String} name an Attribute name\n * @param {Node} node a DOM node\n */\n const _removeAttribute = function (name, node) {\n try {\n arrayPush(DOMPurify.removed, {\n attribute: node.getAttributeNode(name),\n from: node,\n });\n } catch (_) {\n arrayPush(DOMPurify.removed, {\n attribute: null,\n from: node,\n });\n }\n\n node.removeAttribute(name);\n\n // We void attribute values for unremovable \"is\"\" attributes\n if (name === 'is' && !ALLOWED_ATTR[name]) {\n if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n try {\n _forceRemove(node);\n } catch (_) {}\n } else {\n try {\n node.setAttribute(name, '');\n } catch (_) {}\n }\n }\n };\n\n /**\n * _initDocument\n *\n * @param {String} dirty a string of dirty markup\n * @return {Document} a DOM, filled with the dirty markup\n */\n const _initDocument = function (dirty) {\n /* Create a HTML document */\n let doc;\n let leadingWhitespace;\n\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\n const dirtyPayload = trustedTypesPolicy\n ? trustedTypesPolicy.createHTML(dirty)\n : 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, 'text/html');\n } catch (_) {}\n }\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 ? '' : dirtyPayload;\n } catch (_) {\n // Syntax error if dirtyPayload is invalid xml\n }\n }\n\n const body = doc.body || doc.documentElement;\n\n if (dirty && leadingWhitespace) {\n body.insertBefore(\n document.createTextNode(leadingWhitespace),\n body.childNodes[0] || null\n );\n }\n\n /* Work on whole document or just its body */\n return WHOLE_DOCUMENT ? doc.documentElement : body;\n };\n\n /**\n * _createIterator\n *\n * @param {Document} root document/fragment to create iterator for\n * @return {Iterator} iterator instance\n */\n const _createIterator = function (root) {\n return createNodeIterator.call(\n root.ownerDocument || root,\n root,\n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT,\n null,\n false\n );\n };\n\n /**\n * _isClobbered\n *\n * @param {Node} elm element to check for clobbering attacks\n * @return {Boolean} true if clobbered, false if safe\n */\n const _isClobbered = function (elm) {\n if (elm instanceof Text || elm instanceof Comment) {\n return false;\n }\n\n if (\n typeof elm.nodeName !== 'string' ||\n typeof elm.textContent !== 'string' ||\n typeof elm.removeChild !== 'function' ||\n !(elm.attributes instanceof NamedNodeMap) ||\n typeof elm.removeAttribute !== 'function' ||\n typeof elm.setAttribute !== 'function' ||\n typeof elm.namespaceURI !== 'string' ||\n typeof elm.insertBefore !== 'function'\n ) {\n return true;\n }\n\n return false;\n };\n\n /**\n * _isNode\n *\n * @param {Node} obj object to check whether it's a DOM node\n * @return {Boolean} true is object is a DOM node\n */\n const _isNode = function (object) {\n return typeof Node === 'object'\n ? object instanceof Node\n : object &&\n typeof object === 'object' &&\n typeof object.nodeType === 'number' &&\n typeof object.nodeName === 'string';\n };\n\n /**\n * _executeHook\n * Execute user configurable hooks\n *\n * @param {String} entryPoint Name of the hook's entry point\n * @param {Node} currentNode node to work on with the hook\n * @param {Object} data additional hook parameters\n */\n const _executeHook = function (entryPoint, currentNode, data) {\n if (!hooks[entryPoint]) {\n return;\n }\n\n arrayForEach(hooks[entryPoint], (hook) => {\n hook.call(DOMPurify, currentNode, data, CONFIG);\n });\n };\n\n /**\n * _sanitizeElements\n *\n * @protect nodeName\n * @protect textContent\n * @protect removeChild\n *\n * @param {Node} currentNode to check for permission to exist\n * @return {Boolean} true if node was killed, false if left alive\n */\n const _sanitizeElements = function (currentNode) {\n let content;\n\n /* Execute a hook if present */\n _executeHook('beforeSanitizeElements', currentNode, null);\n\n /* Check if element is clobbered or can clobber */\n if (_isClobbered(currentNode)) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Check if tagname contains Unicode */\n if (stringMatch(currentNode.nodeName, /[\\u0080-\\uFFFF]/)) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Now let's check the element's type and name */\n const tagName = stringToLowerCase(currentNode.nodeName);\n\n /* Execute a hook if present */\n _executeHook('uponSanitizeElement', currentNode, {\n tagName,\n allowedTags: ALLOWED_TAGS,\n });\n\n /* Detect mXSS attempts abusing namespace confusion */\n if (\n !_isNode(currentNode.firstElementChild) &&\n (!_isNode(currentNode.content) ||\n !_isNode(currentNode.content.firstElementChild)) &&\n regExpTest(/<[/\\w]/g, currentNode.innerHTML) &&\n regExpTest(/<[/\\w]/g, currentNode.textContent)\n ) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Remove element if anything forbids its presence */\n if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\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\n if (childNodes && parentNode) {\n const childCount = childNodes.length;\n\n for (let i = childCount - 1; i >= 0; --i) {\n parentNode.insertBefore(\n cloneNode(childNodes[i], true),\n getNextSibling(currentNode)\n );\n }\n }\n }\n\n _forceRemove(currentNode);\n return true;\n }\n\n /* Check whether element has a valid namespace */\n if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {\n _forceRemove(currentNode);\n return true;\n }\n\n if (\n (tagName === 'noscript' || tagName === 'noembed') &&\n regExpTest(/<\\/no(script|embed)/i, currentNode.innerHTML)\n ) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Sanitize element content to be template-safe */\n if (SAFE_FOR_TEMPLATES && currentNode.nodeType === 3) {\n /* Get the element's text content */\n content = currentNode.textContent;\n content = stringReplace(content, MUSTACHE_EXPR, ' ');\n content = stringReplace(content, ERB_EXPR, ' ');\n if (currentNode.textContent !== content) {\n arrayPush(DOMPurify.removed, { element: currentNode.cloneNode() });\n currentNode.textContent = content;\n }\n }\n\n /* Execute a hook if present */\n _executeHook('afterSanitizeElements', currentNode, null);\n\n return false;\n };\n\n /**\n * _isValidAttribute\n *\n * @param {string} lcTag Lowercase tag name of containing element.\n * @param {string} lcName Lowercase attribute name.\n * @param {string} value Attribute value.\n * @return {Boolean} Returns true if `value` is valid, otherwise false.\n */\n // eslint-disable-next-line complexity\n const _isValidAttribute = function (lcTag, lcName, value) {\n /* Make sure attribute cannot clobber */\n if (\n SANITIZE_DOM &&\n (lcName === 'id' || lcName === 'name') &&\n (value in document || value in formElement)\n ) {\n return false;\n }\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 && regExpTest(DATA_ATTR, lcName)) {\n // This attribute is safe\n } else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR, lcName)) {\n // This attribute is safe\n /* Otherwise, check the name is permitted */\n } else if (!ALLOWED_ATTR[lcName] || FORBID_ATTR[lcName]) {\n return false;\n\n /* Check value is safe. First, is attr inert? If so, is safe */\n } else if (URI_SAFE_ATTRIBUTES[lcName]) {\n // This attribute is safe\n /* Check no script, data or unknown possibly unsafe URI\n unless we know URI values are safe for that attribute */\n } else if (\n regExpTest(IS_ALLOWED_URI, stringReplace(value, ATTR_WHITESPACE, ''))\n ) {\n // This attribute is safe\n /* Keep image data URIs alive if src/xlink:href is allowed */\n /* Further prevent gadget XSS for dynamically built script tags */\n } else if (\n (lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') &&\n lcTag !== 'script' &&\n stringIndexOf(value, 'data:') === 0 &&\n DATA_URI_TAGS[lcTag]\n ) {\n // This attribute is safe\n /* Allow unknown protocols: This provides support for links that\n are handled by protocol handlers which may be unknown ahead of\n time, e.g. fb:, spotify: */\n } else if (\n ALLOW_UNKNOWN_PROTOCOLS &&\n !regExpTest(IS_SCRIPT_OR_DATA, stringReplace(value, ATTR_WHITESPACE, ''))\n ) {\n // This attribute is safe\n /* Check for binary attributes */\n // eslint-disable-next-line no-negated-condition\n } else if (!value) {\n // Binary attributes are safe at this point\n /* Anything else, presume unsafe, do not add it back */\n } else {\n return false;\n }\n\n return true;\n };\n\n /**\n * _sanitizeAttributes\n *\n * @protect attributes\n * @protect nodeName\n * @protect removeAttribute\n * @protect setAttribute\n *\n * @param {Node} currentNode to sanitize\n */\n const _sanitizeAttributes = function (currentNode) {\n let attr;\n let value;\n let lcName;\n let l;\n /* Execute a hook if present */\n _executeHook('beforeSanitizeAttributes', currentNode, null);\n\n const { attributes } = currentNode;\n\n /* Check if we have attributes; if not we might have a text node */\n if (!attributes) {\n return;\n }\n\n const hookEvent = {\n attrName: '',\n attrValue: '',\n keepAttr: true,\n allowedAttributes: ALLOWED_ATTR,\n };\n l = attributes.length;\n\n /* Go backwards over all attributes; safely remove bad ones */\n while (l--) {\n attr = attributes[l];\n const { name, namespaceURI } = attr;\n value = stringTrim(attr.value);\n lcName = stringToLowerCase(name);\n\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 _executeHook('uponSanitizeAttribute', currentNode, hookEvent);\n value = hookEvent.attrValue;\n /* Did the hooks approve of the attribute? */\n if (hookEvent.forceKeepAttr) {\n continue;\n }\n\n /* Remove attribute */\n _removeAttribute(name, currentNode);\n\n /* Did the hooks approve of the attribute? */\n if (!hookEvent.keepAttr) {\n continue;\n }\n\n /* Work around a security issue in jQuery 3.0 */\n if (regExpTest(/\\/>/i, value)) {\n _removeAttribute(name, currentNode);\n continue;\n }\n\n /* Sanitize attribute content to be template-safe */\n if (SAFE_FOR_TEMPLATES) {\n value = stringReplace(value, MUSTACHE_EXPR, ' ');\n value = stringReplace(value, ERB_EXPR, ' ');\n }\n\n /* Is `value` valid for this attribute? */\n const lcTag = currentNode.nodeName.toLowerCase();\n if (!_isValidAttribute(lcTag, lcName, value)) {\n continue;\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\n arrayPop(DOMPurify.removed);\n } catch (_) {}\n }\n\n /* Execute a hook if present */\n _executeHook('afterSanitizeAttributes', currentNode, null);\n };\n\n /**\n * _sanitizeShadowDOM\n *\n * @param {DocumentFragment} fragment to iterate over recursively\n */\n const _sanitizeShadowDOM = function (fragment) {\n let shadowNode;\n const shadowIterator = _createIterator(fragment);\n\n /* Execute a hook if present */\n _executeHook('beforeSanitizeShadowDOM', fragment, null);\n\n while ((shadowNode = shadowIterator.nextNode())) {\n /* Execute a hook if present */\n _executeHook('uponSanitizeShadowNode', shadowNode, null);\n\n /* Sanitize tags and elements */\n if (_sanitizeElements(shadowNode)) {\n continue;\n }\n\n /* Deep shadow DOM detected */\n if (shadowNode.content instanceof DocumentFragment) {\n _sanitizeShadowDOM(shadowNode.content);\n }\n\n /* Check attributes, sanitize if necessary */\n _sanitizeAttributes(shadowNode);\n }\n\n /* Execute a hook if present */\n _executeHook('afterSanitizeShadowDOM', fragment, null);\n };\n\n /**\n * Sanitize\n * Public method providing core sanitation functionality\n *\n * @param {String|Node} dirty string or DOM node\n * @param {Object} configuration object\n */\n // eslint-disable-next-line complexity\n DOMPurify.sanitize = function (dirty, cfg) {\n let body;\n let importedNode;\n let currentNode;\n let oldNode;\n let returnNode;\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\n /* Stringify, in case dirty is an object */\n if (typeof dirty !== 'string' && !_isNode(dirty)) {\n // eslint-disable-next-line no-negated-condition\n if (typeof dirty.toString !== 'function') {\n throw typeErrorCreate('toString is not a function');\n } else {\n dirty = dirty.toString();\n if (typeof dirty !== 'string') {\n throw typeErrorCreate('dirty is not a string, aborting');\n }\n }\n }\n\n /* Check we can run. Otherwise fall back or ignore */\n if (!DOMPurify.isSupported) {\n if (\n typeof window.toStaticHTML === 'object' ||\n typeof window.toStaticHTML === 'function'\n ) {\n if (typeof dirty === 'string') {\n return window.toStaticHTML(dirty);\n }\n\n if (_isNode(dirty)) {\n return window.toStaticHTML(dirty.outerHTML);\n }\n }\n\n return dirty;\n }\n\n /* Assign config vars */\n if (!SET_CONFIG) {\n _parseConfig(cfg);\n }\n\n /* Clean up removed elements */\n DOMPurify.removed = [];\n\n /* Check if dirty is correctly typed for IN_PLACE */\n if (typeof dirty === 'string') {\n IN_PLACE = false;\n }\n\n if (IN_PLACE) {\n /* No special handling necessary for in-place sanitization */\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 === 1 && 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 (\n !RETURN_DOM &&\n !SAFE_FOR_TEMPLATES &&\n !WHOLE_DOCUMENT &&\n // eslint-disable-next-line unicorn/prefer-includes\n dirty.indexOf('<') === -1\n ) {\n return trustedTypesPolicy && RETURN_TRUSTED_TYPE\n ? trustedTypesPolicy.createHTML(dirty)\n : dirty;\n }\n\n /* Initialize the document to work on */\n body = _initDocument(dirty);\n\n /* Check we have a DOM node from the data */\n if (!body) {\n return RETURN_DOM ? null : emptyHTML;\n }\n }\n\n /* Remove first element node (ours) if FORCE_BODY is set */\n if (body && FORCE_BODY) {\n _forceRemove(body.firstChild);\n }\n\n /* Get node iterator */\n const nodeIterator = _createIterator(IN_PLACE ? dirty : body);\n\n /* Now start iterating over the created document */\n while ((currentNode = nodeIterator.nextNode())) {\n /* Fix IE's strange behavior with manipulated textNodes #89 */\n if (currentNode.nodeType === 3 && currentNode === oldNode) {\n continue;\n }\n\n /* Sanitize tags and elements */\n if (_sanitizeElements(currentNode)) {\n continue;\n }\n\n /* Shadow DOM detected, sanitize it */\n if (currentNode.content instanceof DocumentFragment) {\n _sanitizeShadowDOM(currentNode.content);\n }\n\n /* Check attributes, sanitize if necessary */\n _sanitizeAttributes(currentNode);\n\n oldNode = currentNode;\n }\n\n oldNode = null;\n\n /* If we sanitized `dirty` in-place, return it. */\n if (IN_PLACE) {\n return dirty;\n }\n\n /* Return sanitized string or DOM */\n if (RETURN_DOM) {\n if (RETURN_DOM_FRAGMENT) {\n returnNode = createDocumentFragment.call(body.ownerDocument);\n\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\n if (RETURN_DOM_IMPORT) {\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\n return returnNode;\n }\n\n let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\n\n /* Sanitize final string template-safe */\n if (SAFE_FOR_TEMPLATES) {\n serializedHTML = stringReplace(serializedHTML, MUSTACHE_EXPR, ' ');\n serializedHTML = stringReplace(serializedHTML, ERB_EXPR, ' ');\n }\n\n return trustedTypesPolicy && RETURN_TRUSTED_TYPE\n ? trustedTypesPolicy.createHTML(serializedHTML)\n : serializedHTML;\n };\n\n /**\n * Public method to set the configuration once\n * setConfig\n *\n * @param {Object} cfg configuration object\n */\n DOMPurify.setConfig = function (cfg) {\n _parseConfig(cfg);\n SET_CONFIG = true;\n };\n\n /**\n * Public method to remove the configuration\n * clearConfig\n *\n */\n DOMPurify.clearConfig = function () {\n CONFIG = null;\n SET_CONFIG = false;\n };\n\n /**\n * Public method to check if an attribute value is valid.\n * Uses last set config, if any. Otherwise, uses config defaults.\n * isValidAttribute\n *\n * @param {string} tag Tag name of containing element.\n * @param {string} attr Attribute name.\n * @param {string} value Attribute value.\n * @return {Boolean} Returns true if `value` is valid. Otherwise, returns false.\n */\n DOMPurify.isValidAttribute = function (tag, attr, value) {\n /* Initialize shared config vars if necessary. */\n if (!CONFIG) {\n _parseConfig({});\n }\n\n const lcTag = stringToLowerCase(tag);\n const lcName = stringToLowerCase(attr);\n return _isValidAttribute(lcTag, lcName, value);\n };\n\n /**\n * AddHook\n * Public method to add DOMPurify hooks\n *\n * @param {String} entryPoint entry point for the hook to add\n * @param {Function} hookFunction function to execute\n */\n DOMPurify.addHook = function (entryPoint, hookFunction) {\n if (typeof hookFunction !== 'function') {\n return;\n }\n\n hooks[entryPoint] = hooks[entryPoint] || [];\n arrayPush(hooks[entryPoint], hookFunction);\n };\n\n /**\n * RemoveHook\n * Public method to remove a DOMPurify hook at a given entryPoint\n * (pops it from the stack of hooks if more are present)\n *\n * @param {String} entryPoint entry point for the hook to remove\n */\n DOMPurify.removeHook = function (entryPoint) {\n if (hooks[entryPoint]) {\n arrayPop(hooks[entryPoint]);\n }\n };\n\n /**\n * RemoveHooks\n * Public method to remove all DOMPurify hooks at a given entryPoint\n *\n * @param {String} entryPoint entry point for the hooks to remove\n */\n DOMPurify.removeHooks = function (entryPoint) {\n if (hooks[entryPoint]) {\n hooks[entryPoint] = [];\n }\n };\n\n /**\n * RemoveAllHooks\n * Public method to remove all DOMPurify hooks\n *\n */\n DOMPurify.removeAllHooks = function () {\n hooks = {};\n };\n\n return DOMPurify;\n}\n\nexport default createDOMPurify();\n","// Use built-in markdown renderer when the markdown service is not available\n\nimport { MarkdownService } from \"../types-packages/main\"\n\nlet render: MarkdownService[\"render\"] | undefined = undefined\n\nexport async function getMarkdownRenderer() {\n if (!render) {\n //@ts-ignore\n render = (await import(\"atom-ide-markdown-service/modules/renderer\")).render\n }\n return render\n}\n","import { createSignal, onMount } from \"solid-js\"\nimport DOMPurify from \"dompurify\"\nimport { MarkdownService } from \"../../types-packages/main\"\nimport { getMarkdownRenderer } from \"../MarkdownRenderer\"\n\nexport interface Props {\n markdown: Array<string> | string\n grammarName?: string\n renderer?: MarkdownService\n containerClassName: string\n contentClassName: string\n // already rendered markdown\n html?: Array<string> | string\n}\n\n/**\n * A react component that can hosts markdown texts\n */\nexport function MarkdownView(props: Props) {\n const [getMarkdown, setMarkdown] = createSignal(\"\")\n\n /**\n Calls `getDocumentationHtml` to convert Markdown to markdown\n */\n onMount(async () => {\n setMarkdown((await renderMarkdown(props.markdown, props.grammarName, props.renderer)) ?? \"\")\n })\n\n return (\n <div className={props.containerClassName} onWheel={onWheel}>\n <div className={props.contentClassName} innerHTML={getMarkdown()} />\n </div>\n )\n}\n\n/**\n * handles the mouse wheel event to enable scrolling over long text\n * @param evt the mouse wheel event being triggered\n */\nfunction onWheel(evt: WheelEvent) {\n return evt.stopPropagation()\n}\n\n/**\n * convert the markdown documentation to markdown\n * @param markdownTexts the documentation text in markdown format to be converted\n * @param grammarName the default grammar used for embedded code samples\n * @param renderer markdown service to be used for rendering\n * @return a promise object to track the asynchronous operation\n */\nexport async function renderMarkdown(\n markdownTexts: Array<string> | string,\n grammarName: string = atom.workspace.getActiveTextEditor()?.getGrammar().scopeName?.toLowerCase() || \"\",\n renderer?: MarkdownService\n): Promise<string | null> {\n if (markdownTexts === undefined) {\n return null\n }\n\n let markdownText = \"\"\n // if Array\n if (Array.isArray(markdownTexts)) {\n if (markdownTexts.length === 0) {\n return null\n }\n markdownText = (markdownTexts as Array<string>).join(\"\\r\\n\")\n }\n // if string\n else {\n markdownText = markdownTexts\n }\n if (renderer) {\n return DOMPurify.sanitize(await renderer.render(markdownText, grammarName))\n } else {\n // Use built-in markdown renderer (it already does sanitization)\n const render = await getMarkdownRenderer()\n return render(markdownText, grammarName)\n }\n}\n","import { createSignal, onMount } from \"solid-js\"\nimport DOMPurify from \"dompurify\"\nimport { MarkdownService } from \"../../types-packages/main\"\nimport { getMarkdownRenderer } from \"../MarkdownRenderer\"\n\nexport interface Props {\n snippet: Array<string> | string\n grammarName?: string\n renderer?: MarkdownService\n containerClassName: string\n contentClassName: string\n}\n\n/**\n * A React component that hosts a code snippet with syntax highlighting\n */\nexport function SnippetView(props: Props) {\n const [getSnippet, setSnippet] = createSignal(\"\")\n\n onMount(async () => {\n setSnippet((await getSnippetHtml(props.snippet, props.grammarName, props.renderer)) ?? \"\")\n })\n\n return (\n <div className={props.containerClassName} onWheel={onWheel}>\n <div className={props.contentClassName} innerHTML={getSnippet()} />\n </div>\n )\n}\n\n/**\n * handles the mouse wheel event to enable scrolling over long text\n * @param evt the mouse wheel event being triggered\n */\nfunction onWheel(evt: WheelEvent) {\n return evt.stopPropagation()\n}\n\nconst regexPremeable = /^\\s*<([!?])([a-z]+)?\\s*/i\nconst regexLSPPrefix = /^\\((method|property|parameter|alias)\\)\\W/\n\n/**\n * converts a given code snippet into syntax formatted HTML\n * @param snippets the code snippet to be converted\n * @param grammarName the name of the grammar to be used for syntax highlighting\n * @param renderer markdown service to be used for rendering\n * @return a promise object to track the asynchronous operation\n */\nexport async function getSnippetHtml(\n snipetsGiven: Array<string> | string,\n grammarName: string = atom.workspace.getActiveTextEditor()?.getGrammar().scopeName?.toLowerCase() || \"\",\n renderer?: MarkdownService\n): Promise<string | null> {\n if (snipetsGiven === undefined) {\n return null\n }\n let snippets = snipetsGiven\n\n // if string\n if (typeof snippets === \"string\") {\n snippets = [snippets]\n }\n\n // if Array\n if (Array.isArray(snippets)) {\n if (snippets.length === 0) {\n return null\n }\n const markdown = snippets\n .map((snippet) => {\n const snp = snippet\n .replace(regexPremeable, \"\") // remove any preamble from the line\n .replace(regexLSPPrefix, \"\") // remove LSP prefix\n return `\\`\\`\\`\\n${snp}\\n\\`\\`\\``\n })\n .join(\"\\n\")\n\n if (renderer) {\n return DOMPurify.sanitize(await renderer.render(markdown, grammarName))\n } else {\n // Use built-in markdown renderer (it already does sanitization)\n const render = await getMarkdownRenderer()\n return render(markdown, grammarName)\n }\n } else {\n return null\n }\n}\n","export interface Props {\n component: () => React.ReactElement\n containerClassName: string\n contentClassName: string\n}\n\nlet render: typeof import(\"react-dom\").render | undefined\n\n/**\n * A react component that can host an externally given React component\n */\nexport function ReactView(props: Props) {\n if (render === undefined) {\n render = require(\"react-dom\").render\n }\n const content = document.createElement(\"div\")\n content.className = props.contentClassName\n return (\n <div className={props.containerClassName}>\n {(render!(props.component(), content) as HTMLElement | void) || undefined}\n </div>\n )\n}\n","import { MarkdownView, Props as MarkdownViewProps } from \"./MarkdownView\"\nimport { SnippetView, Props as SnippetViewProps } from \"./SnippetView\"\nimport { ReactView, Props as ReactViewProps } from \"./ReactView\"\n\nexport const DATATIP_ACTIONS = Object.freeze({\n PIN: \"PIN\",\n CLOSE: \"CLOSE\",\n})\n\nconst IconsForAction = {\n [DATATIP_ACTIONS.PIN]: \"pin\",\n [DATATIP_ACTIONS.CLOSE]: \"x\",\n}\n\nexport interface Props {\n component?: ReactViewProps\n markdown?: MarkdownViewProps\n snippet?: SnippetViewProps\n action?: string\n actionTitle?: string\n className?: string\n onActionClick?: (event: any) => void\n onMouseDown?: (event: any) => void\n onClickCapture?: (event: any) => void\n}\n\n/**\n * a component for a decoration pane\n */\nexport function ViewContainer(props: Props) {\n return (\n <div className={props.className ?? \"datatip-element\"} {...props.onMouseDown} {...props.onClickCapture}>\n {props.component !== undefined ? <ReactView {...props.component} /> : undefined}\n {props.snippet !== undefined ? <SnippetView {...props.snippet} /> : undefined}\n {props.markdown !== undefined ? <MarkdownView {...props.markdown} /> : undefined}\n {props.action !== undefined ? (\n <div\n className={`datatip-pin-button icon-${IconsForAction[props.action]}`}\n onClick={() => {\n props.onActionClick?.(event)\n }}\n title={props.actionTitle}\n />\n ) : undefined}\n </div>\n )\n}\n","import { Disposable, TextEditor } from \"atom\"\nimport { Provider as ProviderTypes, BusySignalProvider, FindReferencesProvider } from \"../types-packages/main.d\"\n\nexport class ProviderRegistry<Provider extends Exclude<ProviderTypes, BusySignalProvider | FindReferencesProvider>> {\n private providers: Array<Provider>\n\n constructor() {\n this.providers = []\n }\n\n addProvider(provider: Provider): Disposable {\n const index = this.providers.findIndex((p) => provider.priority > p.priority)\n if (index === -1) {\n this.providers.push(provider)\n } else {\n this.providers.splice(index, 0, provider)\n }\n return new Disposable(() => {\n this.removeProvider(provider)\n })\n }\n\n removeProvider(provider: Provider): void {\n const index = this.providers.indexOf(provider)\n if (index !== -1) {\n this.providers.splice(index, 1)\n }\n }\n\n // TODO deprecate since there can be N providers.\n getProviderForEditor(editor: TextEditor): Provider | null {\n const grammar = editor.getGrammar().scopeName\n return this.findProvider(grammar)\n }\n\n // TODO create an ordering or priority aware util to prefer instead.\n getAllProvidersForEditor(editor: TextEditor): Iterable<Provider> {\n const grammar = editor.getGrammar().scopeName\n return this.findAllProviders(grammar)\n }\n\n findProvider(grammar: string): Provider | null {\n for (const provider of this.findAllProviders(grammar)) {\n return provider\n }\n return null\n }\n\n /**\n * Iterates over all providers matching the grammar, in priority order.\n */\n *findAllProviders(grammar: string): Iterable<Provider> {\n for (const provider of this.providers) {\n if (provider.grammarScopes == null || provider.grammarScopes.indexOf(grammar) !== -1) {\n yield provider\n }\n }\n }\n}\n","import type { TextEditor, TextEditorComponent } from \"atom\"\n\n/** makes the text selectable and copyable\n *\n * Note: you can directly add `user-select: text` (and `pointer-events: all`) in CSS for better performance\n */\nexport function makeOverlaySelectable(editor: TextEditor, overlayElement: HTMLElement, focusFix = true) {\n // allow the browser to handle selecting\n overlayElement.setAttribute(\"tabindex\", \"-1\")\n\n // make it selectable\n if (!overlayElement.style.userSelect || overlayElement.style.userSelect === \"none\") {\n overlayElement.style.userSelect = \"text\"\n }\n\n if (focusFix) {\n // fix overlay focus issue\n overlayFocusFix(editor, overlayElement)\n }\n\n // add copy keybindings\n overlayElement.classList.add(\"native-key-bindings\")\n}\n\n/**\n * - focus on the datatip once the text is selected (cursor gets disabled temporarily)\n * - remove focus once mouse leaves\n */\nexport function overlayFocusFix(editor: TextEditor, element: HTMLElement) {\n const editorComponent = atom.views.getView(editor).getComponent()\n element.addEventListener(\"mousedown\", () => {\n blurEditor(editorComponent)\n element.addEventListener(\"mouseleave\", () => {\n focusEditor(editorComponent)\n })\n })\n}\n\nexport function focusEditor(editorComponent: TextEditorComponent) {\n // @ts-ignore internal api\n editorComponent?.didFocus()\n}\n\nexport function blurEditor(editorComponent: TextEditorComponent) {\n // @ts-ignore internal api\n editorComponent?.didBlurHiddenInput({\n relatedTarget: null,\n })\n}\n\n/*\n██████ ███████ ██████ ██████ ███████ ██████ █████ ████████ ███████ ██████\n██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██\n██ ██ █████ ██████ ██████ █████ ██ ███████ ██ █████ ██ ██\n██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██\n██████ ███████ ██ ██ ██ ███████ ██████ ██ ██ ██ ███████ ██████\n*/\n\n/** @deprecated use `makeOverlaySelectable` instead.\n *\n * Makes the overlay component copyable\n * - you should call `makeOverlaySelectable` before this\n * - If your element already has mouseenter and mouseleav listeners, directly use `copyListener`\n */\nexport function makeOverLayCopyable(element: HTMLElement) {\n element.addEventListener(\"mouseenter\", () => {\n element.addEventListener(\"keydown\", copyListener)\n })\n\n element.addEventListener(\"mouseleave\", () => {\n element.removeEventListener(\"keydown\", copyListener)\n })\n}\n\n/** @deprecated use `makeOverlaySelectable` instead.\n *\n * A manual copy listener\n * Usage. Add the listener to your mouse enter and mouseleave listeners\n ```ts\n element.addEventListener(\"mouseenter\", () => {element.addEventListener(\"keydown\", copyListener)}`\n element.addEventListener(\"mouseleave\", () => {element.removeEventListener(\"keydown\", copyListener)}`\n ```\n*/\nexport async function copyListener(event: KeyboardEvent) {\n event.preventDefault()\n if (event.ctrlKey && event.key === \"c\") {\n const text = document.getSelection()?.toString() ?? \"\"\n await navigator.clipboard.writeText(text)\n }\n} // TODO we should not need to manually listen for copy paste\n","import {\n CompositeDisposable,\n Disposable,\n Range,\n Point,\n TextEditor,\n TextEditorElement,\n CommandEvent,\n CursorPositionChangedEvent,\n} from \"atom\"\nimport type { Datatip, DatatipProvider, ReactComponentDatatip } from \"atom-ide-base\"\nimport { ViewContainer, Props as ViewContainerProps } from \"atom-ide-base/src-commons-ui/float-pane/ViewContainer\"\nimport { render } from \"solid-js/web\"\nimport { ProviderRegistry } from \"atom-ide-base/src-commons-atom/ProviderRegistry\"\nimport { makeOverlaySelectable } from \"atom-ide-base/src-commons-ui/float-pane/selectable-overlay\"\n\nexport class DataTipManager {\n /** Holds a reference to disposable items from this data tip manager */\n subscriptions: CompositeDisposable = new CompositeDisposable()\n\n /** Holds a list of registered data tip providers */\n providerRegistry: ProviderRegistry<DatatipProvider> = new ProviderRegistry()\n\n /** Holds a weak reference to all watched Atom text editors */\n watchedEditors: WeakSet<TextEditor> = new WeakSet()\n\n /** Holds a reference to the current watched Atom text editor */\n editor: TextEditor | null = null\n\n /** Holds a reference to the current watched Atom text editor viewbuffer */\n editorView: TextEditorElement | null = null\n\n /** Holds a reference to all disposable items for the current watched Atom text editor */\n editorSubscriptions: CompositeDisposable | null = null\n\n /** Holds a reference to all disposable items for the current data tip */\n dataTipMarkerDisposables: CompositeDisposable | null = null\n\n /** Config flag denoting if the data tip should be shown when moving the cursor on screen */\n showDataTipOnCursorMove = false\n\n /** Config flag denoting if the data tip should be shown when moving the mouse cursor around */\n showDataTipOnMouseMove = true\n\n /** Holds the range of the current data tip to prevent unnecessary show/hide calls */\n currentMarkerRange: Range | null = null\n\n /**\n * To optimize show/hide calls we set a timeout of hoverTime for the mouse movement only if the mouse pointer is not\n * moving for more than hoverTime the data tip functionality is triggered\n */\n mouseMoveTimer?: number\n\n /**\n * To optimize show/hide calls we set a timeout of hoverTime for the cursor movement only if the cursor is not moving\n * for more than hoverTime the data tip functionality is triggered\n */\n cursorMoveTimer?: number\n\n /**\n * The time that the mouse/cursor should hover/stay to show a datatip. Also specifies the time that the datatip is\n * still shown when the mouse/cursor moves [ms].\n */\n hoverTime = atom.config.get(\"atom-ide-datatip.hoverTime\") as number\n\n constructor() {\n /** The mouse move event handler that evaluates the screen position and eventually shows a data tip */\n this.onMouseMoveEvt = this.onMouseMoveEvt.bind(this)\n\n /** The cursor move event handler that evaluates the cursor position and eventually shows a data tip */\n this.onCursorMoveEvt = this.onCursorMoveEvt.bind(this)\n }\n\n /** Initialization routine retrieving a reference to the markdown service */\n initialize() {\n this.subscriptions.add(\n atom.workspace.observeTextEditors((editor) => {\n const disposable = this.watchEditor(editor)\n editor.onDidDestroy(() => disposable?.dispose())\n }),\n atom.commands.add(\"atom-text-editor\", {\n \"datatip:toggle\": (evt) => this.onCommandEvt(evt),\n }),\n atom.config.observe(\"atom-ide-datatip.showDataTipOnCursorMove\", (toggleSwitch) => {\n this.showDataTipOnCursorMove = toggleSwitch\n // forces update of internal editor tracking\n const editor = this.editor\n this.editor = null\n this.updateCurrentEditor(editor)\n }),\n atom.config.observe(\"atom-ide-datatip.showDataTipOnMouseMove\", (toggleSwitch) => {\n this.showDataTipOnMouseMove = toggleSwitch\n // forces update of internal editor tracking\n const editor = this.editor\n this.editor = null\n this.updateCurrentEditor(editor)\n })\n )\n }\n\n /** Dispose function to clean up any disposable references used */\n dispose() {\n if (this.dataTipMarkerDisposables) {\n this.dataTipMarkerDisposables.dispose()\n }\n this.dataTipMarkerDisposables = null\n\n if (this.editorSubscriptions) {\n this.editorSubscriptions.dispose()\n }\n this.editorSubscriptions = null\n\n this.subscriptions.dispose()\n }\n\n /** Returns the provider registry as a consumable service */\n get datatipService() {\n return this.providerRegistry\n }\n\n /**\n * Checks and setups an Atom Text editor instance for tracking cursor/mouse movements\n *\n * @param editor A valid Atom Text editor instance\n */\n watchEditor(editor: TextEditor) {\n if (this.watchedEditors.has(editor)) {\n return\n }\n const editorView = atom.views.getView(editor)\n if (editorView.hasFocus()) {\n this.updateCurrentEditor(editor)\n }\n const focusListener = () => this.updateCurrentEditor(editor)\n editorView.addEventListener(\"focus\", focusListener)\n const blurListener = () => this.unmountDataTip()\n editorView.addEventListener(\"blur\", blurListener)\n\n const disposable = new Disposable(() => {\n editorView.removeEventListener(\"focus\", focusListener)\n editorView.removeEventListener(\"blur\", blurListener)\n if (this.editor === editor) {\n this.updateCurrentEditor(null)\n }\n })\n\n this.watchedEditors.add(editor)\n this.subscriptions.add(disposable)\n\n return new Disposable(() => {\n disposable.dispose()\n this.subscriptions.remove(disposable)\n this.watchedEditors.delete(editor)\n })\n }\n\n /**\n * Updates the internal references to a specific Atom Text editor instance in case it has been decided to track this instance\n *\n * @param editor The Atom Text editor instance to be tracked\n */\n updateCurrentEditor(editor: TextEditor | null) {\n if (editor === this.editor) {\n return\n }\n if (this.editorSubscriptions) {\n this.editorSubscriptions.dispose()\n }\n this.editorSubscriptions = null\n\n // Stop tracking editor + buffer; close any left-overs\n this.unmountDataTip()\n this.editor = null\n this.editorView = null\n\n if (editor === null || !atom.workspace.isTextEditor(editor)) {\n return\n }\n\n this.editor = editor\n this.editorView = atom.views.getView(this.editor)\n\n if (this.showDataTipOnMouseMove) {\n this.editorView.addEventListener(\"mousemove\", this.onMouseMoveEvt)\n }\n\n this.editorSubscriptions = new CompositeDisposable()\n\n this.editorSubscriptions.add(\n this.editor.onDidChangeCursorPosition(this.onCursorMoveEvt),\n this.editor.getBuffer().onDidChangeText((evt) => {\n // make sure to remove any datatip as long as we are typing\n if (evt.changes.length === 0) {\n return\n }\n this.unmountDataTip()\n }),\n new Disposable(() => {\n this.editorView?.removeEventListener(\"mousemove\", this.onMouseMoveEvt)\n })\n )\n }\n\n /**\n * The central cursor movement event handler\n *\n * @param evt The cursor move event\n */\n onCursorMoveEvt(event: CursorPositionChangedEvent) {\n if (this.cursorMoveTimer !== undefined) {\n clearTimeout(this.cursorMoveTimer)\n }\n\n this.cursorMoveTimer = setTimeout(\n async (evt: CursorPositionChangedEvent) => {\n if (evt.textChanged || !this.showDataTipOnCursorMove) {\n return\n }\n // @ts-ignore internal API\n const editor = evt.cursor.editor as TextEditor\n const position = evt.cursor.getBufferPosition()\n if (this.currentMarkerRange === null || !this.currentMarkerRange.containsPoint(position)) {\n await this.showDataTip(editor, position)\n }\n },\n this.hoverTime,\n event\n )\n }\n\n /** The central mouse movement event handler */\n onMouseMoveEvt(event: MouseEvent) {\n if (this.mouseMoveTimer !== undefined) {\n clearTimeout(this.mouseMoveTimer)\n }\n\n this.mouseMoveTimer = setTimeout(\n async (evt: MouseEvent) => {\n if (this.editorView === null || this.editor === null) {\n return\n }\n\n const component = this.editorView.getComponent()\n // the screen position returned here is always capped to the max width of the text in this row\n const screenPosition = component.screenPositionForMouseEvent(evt)\n // the coordinates below represent X and Y positions on the screen of where the mouse event\n // occured and where the capped screenPosition is located\n const coordinates = {\n mouse: component.pixelPositionForMouseEvent(evt),\n screen: component.pixelPositionForScreenPosition(screenPosition),\n }\n const distance = Math.abs(coordinates.mouse.left - coordinates.screen.left)\n\n // If the distance between the coordinates is greater than the default character width, it\n // means the mouse event occured quite far away from where the text ends on that row. Do not\n // show the datatip in such situations and hide any existing datatips (the mouse moved more to\n // the right, away from the actual text)\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore: internal API\n if (distance >= this.editor.getDefaultCharWidth()) {\n return this.unmountDataTip()\n }\n\n const point = this.editor.bufferPositionForScreenPosition(screenPosition)\n if (this.currentMarkerRange === null || !this.currentMarkerRange.containsPoint(point)) {\n await this.showDataTip(this.editor, point)\n }\n },\n this.hoverTime,\n event\n )\n }\n\n /**\n * The central command event handler\n *\n * @param evt Command event\n */\n async onCommandEvt(evt: CommandEvent<TextEditorElement>) {\n const editor = evt.currentTarget.getModel()\n\n if (atom.workspace.isTextEditor(editor)) {\n const position = evt.currentTarget.getModel().getCursorBufferPosition()\n\n const isTooltipOpenForPosition = this.currentMarkerRange?.containsPoint(position)\n if (isTooltipOpenForPosition === true) {\n return this.unmountDataTip()\n }\n\n await this.showDataTip(editor, position)\n }\n }\n\n /**\n * Evaluates the responsible DatatipProvider to call for data tip information at a given position in a specific Atom Text editor\n *\n * @param editor The Atom Text editor instance to be used\n * @param position The cursor or mouse position within the text editor to qualify for a data tip\n * @param evt The original event triggering this data tip evaluation\n * @returns A promise object to track the asynchronous operation\n */\n async showDataTip(editor: TextEditor, position: Point): Promise<void> {\n try {\n let datatip: Datatip | null = null\n for (const provider of this.providerRegistry.getAllProvidersForEditor(editor)) {\n // we only need one and we want to process them synchronously\n // eslint-disable-next-line no-await-in-loop\n const providerTip = await provider.datatip(editor, position)\n if (providerTip) {\n datatip = providerTip\n break\n }\n }\n if (!datatip) {\n this.unmountDataTip()\n } else {\n // omit update of UI if the range is the same as the current one\n if (this.currentMarkerRange !== null && datatip.range.intersectsWith(this.currentMarkerRange)) {\n return\n }\n // make sure we are still on the same position\n if (!datatip.range.containsPoint(position)) {\n return\n }\n\n // clear last data tip\n this.unmountDataTip()\n\n // store marker range\n this.currentMarkerRange = datatip.range\n\n if (\"component\" in datatip) {\n const element = document.createElement(\"div\")\n render(\n () => (\n <ViewContainer\n component={{\n component: (datatip as ReactComponentDatatip).component,\n containerClassName: \"datatip-component-container\",\n contentClassName: \"datatip-component\",\n }}\n className=\"datatip-element select-list popover-list\"\n />\n ),\n element\n )\n this.dataTipMarkerDisposables = this.mountDataTipWithMarker(editor, datatip.range, position, element)\n } else if (datatip.markedStrings.length > 0) {\n const grammar = editor.getGrammar().scopeName.toLowerCase()\n\n const snippetData: string[] = []\n const markdownData: string[] = []\n for (const markedString of datatip.markedStrings) {\n if (markedString.type === \"snippet\") {\n snippetData.push(markedString.value)\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n } else if (markedString.type === \"markdown\") {\n markdownData.push(markedString.value)\n }\n }\n\n let snippet: ViewContainerProps[\"snippet\"] | undefined = undefined\n let markdown: ViewContainerProps[\"markdown\"] | undefined = undefined\n if (snippetData.length > 0) {\n snippet = {\n snippet: snippetData,\n grammarName: grammar,\n containerClassName: \"datatip-snippet-container\",\n contentClassName: \"datatip-snippet\",\n }\n }\n if (markdownData.length > 0) {\n markdown = {\n markdown: markdownData,\n grammarName: grammar,\n containerClassName: \"datatip-markdown-container\",\n contentClassName: \"datatip-markdown\",\n }\n }\n const element = document.createElement(\"div\")\n render(\n () => (\n <ViewContainer\n snippet={snippet}\n markdown={markdown}\n className=\"datatip-element select-list popover-list\"\n />\n ),\n element\n )\n this.dataTipMarkerDisposables = this.mountDataTipWithMarker(editor, datatip.range, position, element)\n }\n }\n } catch (err) {\n this.unmountDataTip()\n console.error(err)\n }\n }\n\n /**\n * Mounts / displays a data tip view component at a specific position in a given Atom Text editor\n *\n * @param editor The Atom Text editor instance to host the data tip view\n * @param range The range for which the data tip component is valid\n * @param position The position on which to show the data tip view\n * @param view The data tip component to display\n * @returns A composite object to release references at a later stage\n */\n mountDataTipWithMarker(\n editor: TextEditor,\n range: Range,\n position: Point,\n element: HTMLElement\n ): CompositeDisposable | null {\n const disposables = new CompositeDisposable()\n\n // Highlight the text indicated by the datatip's range.\n const highlightMarker = editor.markBufferRange(range, {\n invalidate: \"never\",\n })\n\n // OPTIMIZATION:\n // if there is an highligh overlay already on the same position, skip adding the highlight\n const decorations = editor.getOverlayDecorations().filter((decoration) => {\n return decoration.isType(\"highligh\") && decoration.getMarker().compare(highlightMarker) === 1\n })\n if (decorations.length > 0) {\n highlightMarker.destroy()\n // END OPTIMIZATION\n } else {\n // Actual Highlighting\n disposables.add(new Disposable(() => highlightMarker.destroy()))\n\n editor.decorateMarker(highlightMarker, {\n type: \"highlight\",\n class: \"datatip-highlight-region\",\n })\n }\n\n // The actual datatip should appear at the trigger position.\n const overlayMarker = editor.markBufferRange(new Range(position, position), {\n invalidate: \"never\",\n })\n\n // makes overlay selectable\n makeOverlaySelectable(editor, element)\n\n editor.decorateMarker(overlayMarker, {\n type: \"overlay\",\n class: \"datatip-overlay\",\n position: \"tail\",\n item: element,\n })\n disposables.add(new Disposable(() => overlayMarker.destroy()))\n\n if (this.showDataTipOnMouseMove) {\n element.addEventListener(\"mouseenter\", () => {\n this.editorView?.removeEventListener(\"mousemove\", this.onMouseMoveEvt)\n })\n\n element.addEventListener(\"mouseleave\", () => {\n this.editorView?.addEventListener(\"mousemove\", this.onMouseMoveEvt)\n })\n\n disposables.add(\n new Disposable(() => {\n this.editorView?.addEventListener(\"mousemove\", this.onMouseMoveEvt)\n })\n )\n }\n\n // TODO move this code to atom-ide-base\n element.addEventListener(\"wheel\", onMouseWheel, { passive: true })\n\n return disposables\n }\n\n /** Unmounts / hides the most recent data tip view component */\n unmountDataTip() {\n this.currentMarkerRange = null\n this.dataTipMarkerDisposables?.dispose()\n this.dataTipMarkerDisposables = null\n }\n}\n\n/**\n * Handles the mouse wheel event to enable scrolling over long text\n *\n * @param evt The mouse wheel event being triggered\n */\nfunction onMouseWheel(evt: WheelEvent) {\n evt.stopPropagation()\n}\n","import { CompositeDisposable } from \"atom\"\nimport { DataTipManager } from \"./datatip-manager\"\nimport type { DatatipService } from \"atom-ide-base\"\n\nexport { default as config } from \"./config.json\"\n\n/** [subscriptions description] */\nconst subscriptions: CompositeDisposable = new CompositeDisposable()\n/** [datatipManager description] */\nlet datatipManager: DataTipManager | undefined\n\n/** Called by Atom when activating an extension */\nexport function activate() {\n // Events subscribed to in atom's system can be easily cleaned up with a CompositeDisposable\n if (datatipManager === undefined) {\n datatipManager = new DataTipManager()\n }\n subscriptions.add(datatipManager)\n\n install_deps()\n .then(() => {\n datatipManager!.initialize()\n })\n .catch((e) => {\n console.error(e)\n })\n}\n\nasync function install_deps() {\n // install package-deps if not loaded\n if (!atom.packages.isPackageLoaded(\"busy-signal\")) {\n // Dynamic import https://mariusschulz.com/blog/dynamic-import-expressions-in-typescript\n const atom_package_deps = await import(\"atom-package-deps\")\n try {\n await atom_package_deps.install(\"atom-ide-datatip\", true)\n } catch (err) {\n atom.notifications.addError(err)\n }\n }\n}\n\n/** Called by Atom when deactivating an extension */\nexport function deactivate() {\n subscriptions.dispose()\n}\n\n/**\n * Called by IDE extensions to retrieve the Datatip service for registration\n *\n * @returns The current DataTipManager instance\n */\nexport function provideDatatipService(): DatatipService {\n return datatipManager!.datatipService\n}\n"],"names":["equalFn","a","b","runEffects","runQueue","NOTPENDING","UNOWNED","owned","cleanups","context","owner","createSignal","Owner","Listener","Pending","Updates","Effects","ExecCount","value","areEqual","options","s","observers","observerSlots","pending","comparator","undefined","readSignal","bind","writeSignal","createRenderEffect","fn","updateComputation","createComputation","untrack","result","listener","onMount","runUserEffects","c","user","push","createEffect","this","state","sources","updates","lookDownstream","sSlot","length","sourceSlots","isComp","runUpdates","i","o","markUpstream","pure","Error","node","cleanNode","time","nextValue","err","handleError","updatedAt","call","runComputation","init","runTop","top","suspense","inFallback","effects","wait","q","data","batch","completeUpdates","queue","userLength","e","resume","source","pop","index","obs","n","$PROXY","Symbol","createComponent","Comp","props","trueFn","propTraps","get","_","property","receiver","has","set","deleteProperty","getOwnPropertyDescriptor","configurable","enumerable","ownKeys","keys","mergeProps","Proxy","[object Object]","v","Object","Set","Properties","ChildProperties","Aliases","className","htmlFor","DelegatedEvents","SVGNamespace","xlink","xml","memo","equal","createMemo","reconcileArrays","parentNode","bLength","aEnd","bEnd","aStart","bStart","after","nextSibling","map","insertBefore","removeChild","Map","t","sequence","replaceChild","$$EVENTS","render","code","element","disposer","detachedOwner","root","attached","createRoot","dispose","insert","firstChild","textContent","template","html","check","isSVG","document","createElement","innerHTML","split","content","delegateEvents","eventNames","l","name","add","addEventListener","eventHandler","setAttribute","removeAttribute","setAttributeNS","namespace","removeAttributeNS","handler","delegate","Array","isArray","classList","prev","classKeys","prevKeys","len","key","toggleClassKey","classValue","style","nodeStyle","cssText","removeProperty","setProperty","spread","accessor","skipChildren","current","spreadExpression","parent","marker","initial","insertExpression","classNames","nameLen","toggle","type","composedPath","target","defineProperty","cancelBubble","host","Node","prevProps","children","isCE","isProp","isChildProp","prop","slice","toLowerCase","nodeName","includes","replace","w","toUpperCase","ns","indexOf","assign","unwrapArray","multi","toString","nodeType","createTextNode","cleanChildren","array","normalizeIncomingArray","appendNodes","appendChild","console","warn","normalized","unwrap","dynamic","item","replacement","inserted","el","isParent","hasOwnProperty","setPrototypeOf","isFrozen","getPrototypeOf","freeze","seal","create","Reflect","apply","construct","fun","thisValue","args","x","Func","func","arrayForEach","unapply","prototype","forEach","arrayPop","arrayPush","stringToLowerCase","String","stringMatch","match","stringReplace","stringIndexOf","stringTrim","trim","regExpTest","RegExp","test","typeErrorCreate","TypeError","thisArg","addToSet","lcElement","clone","object","newObject","lookupGetter","desc","svg","svgFilters","svgDisallowed","mathMl","mathMlDisallowed","text","MUSTACHE_EXPR","ERB_EXPR","DATA_ATTR","ARIA_ATTR","IS_ALLOWED_URI","IS_SCRIPT_OR_DATA","ATTR_WHITESPACE","getGlobal","window","_createTrustedTypesPolicy","trustedTypes","createPolicy","suffix","ATTR_NAME","currentScript","hasAttribute","getAttribute","policyName","createDOMPurify","DOMPurify","version","VERSION","removed","isSupported","originalDocument","DocumentFragment","HTMLTemplateElement","Element","NodeFilter","NamedNodeMap","MozNamedAttrMap","Text","Comment","DOMParser","ElementPrototype","cloneNode","getNextSibling","getChildNodes","getParentNode","ownerDocument","trustedTypesPolicy","emptyHTML","RETURN_TRUSTED_TYPE","createHTML","implementation","createNodeIterator","createDocumentFragment","importNode","documentMode","hooks","createHTMLDocument","EXPRESSIONS","ALLOWED_TAGS","DEFAULT_ALLOWED_TAGS","TAGS","ALLOWED_ATTR","DEFAULT_ALLOWED_ATTR","ATTRS","FORBID_TAGS","FORBID_ATTR","ALLOW_ARIA_ATTR","ALLOW_DATA_ATTR","ALLOW_UNKNOWN_PROTOCOLS","SAFE_FOR_TEMPLATES","WHOLE_DOCUMENT","SET_CONFIG","FORCE_BODY","RETURN_DOM","RETURN_DOM_FRAGMENT","RETURN_DOM_IMPORT","SANITIZE_DOM","KEEP_CONTENT","IN_PLACE","USE_PROFILES","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","CONFIG","formElement","_parseConfig","cfg","ADD_URI_SAFE_ATTR","ADD_DATA_URI_TAGS","ALLOWED_URI_REGEXP","ADD_TAGS","ADD_ATTR","table","tbody","MATHML_TEXT_INTEGRATION_POINTS","HTML_INTEGRATION_POINTS","ALL_SVG_TAGS","ALL_MATHML_TAGS","_checkValidNamespace","tagName","parentTagName","namespaceURI","Boolean","commonSvgAndHTMLElements","_forceRemove","outerHTML","remove","_removeAttribute","getAttributeNode","_initDocument","dirty","doc","leadingWhitespace","matches","dirtyPayload","parseFromString","documentElement","createDocument","body","childNodes","_createIterator","SHOW_ELEMENT","SHOW_COMMENT","SHOW_TEXT","_isClobbered","elm","attributes","_isNode","_executeHook","entryPoint","currentNode","hook","_sanitizeElements","firstElementChild","_isValidAttribute","lcTag","lcName","_sanitizeAttributes","attr","hookEvent","attrName","attrValue","keepAttr","forceKeepAttr","_sanitizeShadowDOM","fragment","shadowNode","shadowIterator","nextNode","sanitize","importedNode","oldNode","returnNode","_typeof","toStaticHTML","nodeIterator","serializedHTML","setConfig","clearConfig","isValidAttribute","tag","addHook","hookFunction","removeHook","removeHooks","removeAllHooks","async","getMarkdownRenderer","Promise","MarkdownView","getMarkdown","setMarkdown","markdownTexts","grammarName","atom","workspace","getActiveTextEditor","getGrammar","scopeName","renderer","markdownText","join","renderMarkdown","markdown","onWheel","containerClassName","contentClassName","evt","stopPropagation","SnippetView","getSnippet","setSnippet","snipetsGiven","snippets","snippet","regexPremeable","regexLSPPrefix","getSnippetHtml","ReactView","require","component","DATATIP_ACTIONS","PIN","CLOSE","IconsForAction","ViewContainer","onMouseDown","onClickCapture","_c$","_c$2","_c$3","action","_c$4","onActionClick","event","actionTitle","ProviderRegistry","constructor","providers","addProvider","provider","findIndex","p","priority","splice","Disposable","removeProvider","getProviderForEditor","editor","grammar","findProvider","getAllProvidersForEditor","findAllProviders","grammarScopes","makeOverlaySelectable","overlayElement","focusFix","userSelect","editorComponent","views","getView","getComponent","didBlurHiddenInput","relatedTarget","blurEditor","didFocus","focusEditor","overlayFocusFix","DataTipManager","subscriptions","CompositeDisposable","providerRegistry","watchedEditors","WeakSet","editorView","editorSubscriptions","dataTipMarkerDisposables","showDataTipOnCursorMove","showDataTipOnMouseMove","currentMarkerRange","mouseMoveTimer","cursorMoveTimer","hoverTime","config","onMouseMoveEvt","onCursorMoveEvt","initialize","observeTextEditors","disposable","watchEditor","onDidDestroy","commands","onCommandEvt","observe","toggleSwitch","updateCurrentEditor","hasFocus","focusListener","blurListener","unmountDataTip","removeEventListener","delete","isTextEditor","onDidChangeCursorPosition","getBuffer","onDidChangeText","changes","clearTimeout","setTimeout","textChanged","cursor","position","getBufferPosition","containsPoint","showDataTip","screenPosition","screenPositionForMouseEvent","coordinates","pixelPositionForMouseEvent","pixelPositionForScreenPosition","Math","abs","left","getDefaultCharWidth","point","bufferPositionForScreenPosition","currentTarget","getModel","getCursorBufferPosition","_this$currentMarkerRa","datatip","providerTip","range","intersectsWith","mountDataTipWithMarker","markedStrings","snippetData","markdownData","markedString","error","disposables","highlightMarker","markBufferRange","invalidate","getOverlayDecorations","filter","decoration","isType","getMarker","compare","destroy","decorateMarker","class","overlayMarker","Range","onMouseWheel","passive","datatipManager","packages","isPackageLoaded","atom_package_deps","install","notifications","addError","install_deps","then","catch","datatipService"],"mappings":"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GAAQM,OAAOL,UAAUW,MAEtCC,GAAab,GAAQc,OAAOb,UAAUc,MAEtCC,IAMsBlB,GANQmB,UAO3B,sCAAItB,gDAASH,GAAUM,GAAMH,KAL/B,SAASK,GAAQF,UACf,SAACoB,8BAAYvB,0DAASJ,GAAMO,EAAMoB,EAASvB,IAQ7C,SAASwB,GAASvL,EAAKqI,GACxBe,OAIapJ,EAAK,cAGlBiE,EAAIoE,EAAMvL,OACPmH,KAAK,KACNrB,EAAUyF,EAAMpE,MACG,iBAAZrB,EAAsB,KACzB4I,EAAYf,GAAkB7H,GAChC4I,IAAc5I,IAEXyG,GAAShB,OACNpE,GAAKuH,KAGHA,KAIV5I,IAAW,SAGV5C,EAIF,SAASyL,GAAMC,OACdC,EAAYlC,GAAO,MAErB5J,aACCA,KAAY6L,EACX/B,GAAMR,GAAgBuC,EAAQ,CAAC7L,QACvBA,GAAY6L,EAAO7L,WAI1B8L,EAOT,SAASC,GAAaF,EAAQtE,QACV,OAAXsE,GAAiB,KAChBG,EAAO3L,GAAyBwL,EAAQtE,MAC1CyE,EAAM,IACJA,EAAKlM,WACAyK,GAAQyB,EAAKlM,QAGI,mBAAfkM,EAAK9Q,aACPqP,GAAQyB,EAAK9Q,SAIfuO,GAAeoC,mBAGH9I,kBACb8F,KAAK,qBAAsB9F,GAC5B,MC3HJ,IAAMW,GAAOgG,GAAO,CACzB,IACA,OACA,UACA,UACA,OACA,UACA,QACA,QACA,IACA,MACA,MACA,MACA,QACA,aACA,OACA,KACA,SACA,SACA,UACA,SACA,OACA,OACA,MACA,WACA,UACA,OACA,WACA,KACA,YACA,MACA,UACA,MACA,SACA,MACA,MACA,KACA,KACA,UACA,KACA,WACA,aACA,SACA,OACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,SACA,SACA,KACA,OACA,IACA,MACA,QACA,MACA,MACA,QACA,SACA,KACA,OACA,MACA,OACA,UACA,OACA,WACA,QACA,MACA,OACA,KACA,WACA,SACA,SACA,IACA,UACA,MACA,WACA,IACA,KACA,KACA,OACA,IACA,OACA,UACA,SACA,SACA,QACA,SACA,SACA,OACA,SACA,SACA,QACA,MACA,UACA,MACA,QACA,QACA,KACA,WACA,WACA,QACA,KACA,QACA,OACA,KACA,QACA,KACA,IACA,KACA,MACA,QACA,QAIWuC,GAAMvC,GAAO,CACxB,MACA,IACA,WACA,cACA,eACA,eACA,gBACA,mBACA,SACA,WACA,OACA,OACA,UACA,SACA,OACA,IACA,QACA,WACA,QACA,QACA,OACA,iBACA,SACA,OACA,WACA,QACA,OACA,UACA,UACA,WACA,iBACA,OACA,OACA,QACA,SACA,SACA,OACA,WACA,QACA,OACA,QACA,OACA,UAGWwC,GAAaxC,GAAO,CAC/B,UACA,gBACA,sBACA,cACA,mBACA,oBACA,oBACA,iBACA,UACA,UACA,UACA,UACA,UACA,iBACA,UACA,cACA,eACA,WACA,eACA,qBACA,cACA,SACA,iBAOWyC,GAAgBzC,GAAO,CAClC,UACA,gBACA,SACA,UACA,eACA,UACA,YACA,mBACA,iBACA,gBACA,gBACA,gBACA,QACA,YACA,OACA,eACA,YACA,UACA,gBACA,SACA,MACA,aACA,UACA,QAGW0C,GAAS1C,GAAO,CAC3B,OACA,WACA,SACA,UACA,QACA,SACA,KACA,aACA,gBACA,KACA,KACA,QACA,UACA,WACA,QACA,OACA,KACA,SACA,QACA,SACA,OACA,OACA,UACA,SACA,MACA,QACA,MACA,SACA,eAKW2C,GAAmB3C,GAAO,CACrC,UACA,cACA,aACA,WACA,YACA,UACA,UACA,SACA,SACA,QACA,YACA,aACA,iBACA,cACA,SAGW4C,GAAO5C,GAAO,CAAC,UCpRfhG,GAAOgG,GAAO,CACzB,SACA,SACA,QACA,MACA,iBACA,eACA,uBACA,WACA,aACA,UACA,SACA,UACA,cACA,cACA,UACA,OACA,QACA,QACA,QACA,OACA,UACA,WACA,eACA,SACA,cACA,WACA,WACA,UACA,MACA,WACA,0BACA,wBACA,WACA,YACA,UACA,eACA,OACA,MACA,UACA,SACA,SACA,OACA,OACA,WACA,KACA,YACA,YACA,QACA,OACA,QACA,OACA,OACA,UACA,OACA,MACA,MACA,YACA,QACA,SACA,MACA,YACA,WACA,QACA,OACA,UACA,aACA,SACA,OACA,UACA,UACA,cACA,cACA,SACA,UACA,UACA,aACA,WACA,MACA,WACA,MACA,WACA,OACA,OACA,UACA,aACA,QACA,WACA,QACA,OACA,QACA,OACA,UACA,QACA,MACA,SACA,OACA,QACA,UACA,WACA,QACA,YACA,OACA,SACA,SACA,QACA,QACA,QACA,SAGWuC,GAAMvC,GAAO,CACxB,gBACA,aACA,WACA,qBACA,SACA,gBACA,gBACA,UACA,gBACA,iBACA,QACA,OACA,KACA,QACA,OACA,gBACA,YACA,YACA,QACA,sBACA,8BACA,gBACA,kBACA,KACA,KACA,IACA,KACA,KACA,kBACA,YACA,UACA,UACA,MACA,WACA,YACA,MACA,OACA,eACA,YACA,SACA,cACA,cACA,gBACA,cACA,YACA,mBACA,eACA,aACA,eACA,cACA,KACA,KACA,KACA,KACA,aACA,WACA,gBACA,oBACA,SACA,OACA,KACA,kBACA,KACA,MACA,IACA,KACA,KACA,KACA,KACA,UACA,YACA,aACA,WACA,OACA,eACA,iBACA,eACA,mBACA,iBACA,QACA,aACA,aACA,eACA,eACA,cACA,cACA,mBACA,YACA,MACA,OACA,QACA,SACA,OACA,MACA,OACA,aACA,SACA,WACA,UACA,QACA,SACA,cACA,SACA,WACA,cACA,OACA,aACA,sBACA,mBACA,eACA,SACA,gBACA,sBACA,iBACA,IACA,KACA,KACA,SACA,OACA,OACA,cACA,YACA,UACA,SACA,SACA,QACA,OACA,kBACA,mBACA,mBACA,eACA,cACA,eACA,cACA,aACA,eACA,mBACA,oBACA,iBACA,kBACA,oBACA,iBACA,SACA,eACA,QACA,eACA,iBACA,WACA,UACA,UACA,YACA,cACA,kBACA,iBACA,aACA,OACA,KACA,KACA,UACA,SACA,UACA,aACA,UACA,aACA,gBACA,gBACA,QACA,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"}