markdown-text-editor 1.8.0 → 2.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -3
- package/dist/markdown-text-editor.css +3 -0
- package/dist/markdown-text-editor.es.js +754 -769
- package/dist/markdown-text-editor.es.js.map +1 -1
- package/dist/markdown-text-editor.min.js +64 -63
- package/dist/markdown-text-editor.min.js.map +1 -1
- package/dist/markdown-text-editor.umd.js +64 -63
- package/dist/markdown-text-editor.umd.js.map +1 -1
- package/package.json +12 -9
- package/types/index.d.ts +112 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-text-editor.es.js","names":["Marked","DOMPurify","I","y","W","l","A","C","e","n","t","s","h","o","r","x","_e","N","$e","Le","ze","G","Ae","J","ce","he","Ee","V","Me","Y","Ie","Ce","ee","Be","de","De","qe","te","le","Ze","He","Ge","Ne","ke","Qe","$","B","Q","je","Fe","ge","Ue","Ke","We","fe","Xe","Je","Ye","me","et","tt","rt","st","ot","at","ut","pt","ct","ht","dt","xe","U","kt","gt","ft","ue","mt","xt","pe","Rt","ne","Tt","X","Ot","j","D","wt","be","O","Re","re","se","u","a","i","L","ie","q","Te","oe","Oe","p","c","d","yt","we","P","m","b","g","w","f","M","v","Z","ae","ye","Pe","K","H","Se","R","S","z","T","_","F","E","k","Pt","_OverloadYield","_arrayLikeToArray","_arrayWithHoles","_iterableToArrayLimit","_nonIterableRest","_slicedToArray","_unsupportedIterableToArray","AsyncGenerator","resume","settle","entries","setPrototypeOf","isFrozen","getPrototypeOf","getOwnPropertyDescriptor","freeze","seal","create","_ref","apply","construct","args","func","thisArg","Func","arrayForEach","unapply","arrayLastIndexOf","arrayPop","arrayPush","arraySplice","arrayIsArray","stringToLowerCase","stringToString","stringMatch","stringReplace","stringIndexOf","stringTrim","numberToString","booleanToString","bigintToString","symbolToString","objectHasOwnProperty","objectToString","regExpTest","typeErrorCreate","unconstruct","addToSet","transformCaseFunc","set","array","element","lcElement","cleanArray","index","clone","newObject","_ref2","object","_ref3","property","value","stringifyValue","valueAsRecord","valueToString","lookupGetter","stringified","desc","prop","fallbackValue","isRegex","html$1","svg$1","svgFilters","svgDisallowed","mathMl$1","mathMlDisallowed","text","html","svg","mathMl","xml","MUSTACHE_EXPR","ERB_EXPR","TMPLIT_EXPR","DATA_ATTR","ARIA_ATTR","IS_ALLOWED_URI","IS_SCRIPT_OR_DATA","ATTR_WHITESPACE","DOCTYPE_NAME","CUSTOM_ELEMENT","ELEMENT_MARKUP_PROBE","COMMENT_MARKUP_PROBE","FALLBACK_TAG_CLOSE","SELF_CLOSING_TAG","NODE_TYPE","LITERAL_TEXT_ELEMENT_NAMES","LITERAL_TEXT_ELEMENTS","LITERAL_TEXT_CLOSE","map","name","getGlobal","_createTrustedTypesPolicy","trustedTypes","suffix","ATTR_NAME","purifyHostElement","policyName","scriptUrl","_createHooksMap","_resolveSetOption","cfg","key","options","fallback","_resolveObjectOption","makeFallback","createDOMPurify","window","DOMPurify","root","document","originalDocument","currentScript","HTMLTemplateElement","Node","Element","NodeFilter","DOMParser","ElementPrototype","cloneNode","remove","removeAttributeNode","getNextSibling","getChildNodes","getParentNode","getShadowRoot","getAttributes","getNodeType","getNodeName","getOwnerDocument","_readNodeType","node","_readNodeName","template","trustedTypesPolicy","emptyHTML","defaultTrustedTypesPolicy","defaultTrustedTypesPolicyResolved","IN_TRUSTED_TYPES_POLICY","_assertNotInTrustedTypesPolicy","_createTrustedHTML","_createTrustedScriptURL","_getDefaultTrustedTypesPolicy","_document","implementation","createNodeIterator","createDocumentFragment","getElementsByTagName","importNode","hooks","MUSTACHE_EXPR$1","ERB_EXPR$1","TMPLIT_EXPR$1","DATA_ATTR$1","ARIA_ATTR$1","IS_SCRIPT_OR_DATA$1","ATTR_WHITESPACE$1","CUSTOM_ELEMENT$1","IS_ALLOWED_URI$1","ALLOWED_TAGS","DEFAULT_ALLOWED_TAGS","ALLOWED_ATTR","DEFAULT_ALLOWED_ATTR","CUSTOM_ELEMENT_HANDLING","FORBID_TAGS","FORBID_ATTR","EXTRA_ELEMENT_HANDLING","ALLOW_ARIA_ATTR","ALLOW_DATA_ATTR","ALLOW_UNKNOWN_PROTOCOLS","ALLOW_SELF_CLOSE_IN_ATTR","SAFE_FOR_TEMPLATES","SAFE_FOR_XML","WHOLE_DOCUMENT","SET_CONFIG","SET_CONFIG_ALLOWED_TAGS","SET_CONFIG_ALLOWED_ATTR","FORCE_BODY","RETURN_DOM","RETURN_DOM_FRAGMENT","RETURN_TRUSTED_TYPE","SANITIZE_DOM","SANITIZE_NAMED_PROPS","SANITIZE_NAMED_PROPS_PREFIX","KEEP_CONTENT","IN_PLACE","USE_PROFILES","FORBID_CONTENTS","DEFAULT_FORBID_CONTENTS","DATA_URI_TAGS","DEFAULT_DATA_URI_TAGS","URI_SAFE_ATTRIBUTES","DEFAULT_URI_SAFE_ATTRIBUTES","MATHML_NAMESPACE","SVG_NAMESPACE","HTML_NAMESPACE","NAMESPACE","IS_EMPTY_INPUT","ALLOWED_NAMESPACES","DEFAULT_ALLOWED_NAMESPACES","DEFAULT_MATHML_TEXT_INTEGRATION_POINTS","MATHML_TEXT_INTEGRATION_POINTS","DEFAULT_HTML_INTEGRATION_POINTS","HTML_INTEGRATION_POINTS","COMMON_SVG_AND_HTML_ELEMENTS","PARSER_MEDIA_TYPE","SUPPORTED_PARSER_MEDIA_TYPES","CONFIG","formElement","isRegexOrFunction","testValue","_parseConfig","customElementHandling","previousTrustedTypesPolicy","error","ALL_SVG_TAGS","ALL_MATHML_TAGS","_checkSvgNamespace","parent","tagName","parentTagName","_checkMathMlNamespace","_checkHtmlNamespace","_checkValidNamespace","_forceRemove","_stripAttributeNode","attribute","_neutralizeRoot","childNodes","snapshot","child","attributes","_removeAttribute","attr","_stripDisallowedAttributes","_neutralizeSubtree","stack","_isPatchLinkageAttribute","lcName","lcTag","_neutralizePatchLinkage","nodeType","_initDocument","doc","leadingWhitespace","dirty","matches","dirtyPayload","body","_createNodeIterator","_stripTemplateExpressions","_scrubTemplateExpressions2","walker","currentNode","templates","_isDocumentFragment","tmpl","_isClobbered","realTagName","_isNode","_executeHooks","data","_isUnsafeNode","_matchesNameCheck","check","_sanitizeDisallowedNode","_isBasicCustomElement","parentNode","childCount","hoisted","_forkSharedAllowlist","hookList","defaultSet","setConfigSet","_handleHookDetachedNode","_sanitizeElements","removed","content","_isValidAttribute","nameIsPermitted","RESERVED_CUSTOM_ELEMENT_NAMES","_applyTrustedTypesToAttribute","namespaceURI","_setAttributeValue","_sanitizeAttributes","hookEvent","attrValue","initValue","recreatedNamedProp","_sanitizeShadowDOM2","shadowNode","shadowIterator","fragment","innerSr","_sanitizeAttachedShadowRoots","item","isElement","rootName","sr","importedNode","returnNode","inPlace","nn","walkRoot","nodeIterator","entry","rootWasRemoved","serializedHTML","tag","hookFunction","entryPoint","purify_default","MakeTool","editor","title","btn","btnClass","iconHtml","event","btnWrapper","BoldTool","textarea","selectedText","selectionStart","selectionEnd","newText","offset","ItalicTool","StrikethroughTool","ULTool","OLTool","PreviewTool","previewWrapper","editorDiv","textareaWrapper","button","isMobile","CheckListTool","syntax","syntaxUnchecked","before","BlockQuoteTool","modal","mde","modalHTML","label","size","bodyHTML","LinkTool","fullText","after","urlMatch","match","prefillText","prefillUrl","modalElement","linkInput","linkTextInput","link","linkText","HeadingTool","popoverId","popoverContent","menu","headingClasses","level","li","wrapper","lineStart","lineEndRaw","lineEnd","lineText","existingLevel","cleanText","prefix","textStart","textEnd","uploadImage","formData","file","alt","params","res","uploadUrl","result","ImageTool","config","acceptFormats","type","isAltRequired","customParams","imageMatch","prefillAlt","fileInputTag","submitBtn","fileInputSelector","urlInputSelector","imgFileAltInput","hasFile","path","err","imgLink","UndoTool","undoRedoManager","RedoTool","IndentTool","indentManager","OutdentTool","CodeTool","CodeBlockTool","inner","HrTool","TableTool","flattenVariables","usable","out","variables","applyVariableSamples","samples","markdown","ICON","VariableTool","items","sublist","holder","variable","Toolbar","toolMapping","ToolClass","tool","toolName","toolInstance","previewToolInstance","Preview","container","Footer","pos","lines","parts","wordCount","Diff","callback","oldString","oldStr","newString","newStr","oldTokens","newTokens","done","newLen","oldLen","editLength","maxEditLength","maxExecutionTime","abortAfterTimestamp","bestPath","newPos","minDiagonalToConsider","maxDiagonalToConsider","execEditLength","diagonalPath","basePath","removePath","addPath","canAdd","addPathNewPos","canRemove","exec","ret","last","added","oldPosInc","oldPos","commonCount","left","right","chars","changeObjects","components","nextComponent","lastComponent","componentLen","componentPos","component","oldValue","characterDiff","diffChars","longestCommonPrefix","str1","str2","longestCommonSuffix","replacePrefix","string","oldPrefix","newPrefix","replaceSuffix","oldSuffix","newSuffix","removePrefix","removeSuffix","maximumOverlap","string2","overlapCount","string1","startA","endB","segment","segmentObj","segmenter","trailingWs","leadingAndTrailingWs","leadingWs","segments","firstSeg","lastSeg","extendedWordChars","tokenizeIncludingWhitespace","tokens","prevPart","part","token","changes","lastKeep","insertion","deletion","change","dedupeWhitespaceInChangeObjects","oldWsPrefix","oldWsSuffix","newWsPrefix","newWsSuffix","startKeep","commonWsPrefix","endKeep","commonWsSuffix","ws","newWsFull","delWsStart","delWsEnd","newWsStart","newWsEnd","endKeepWsPrefix","overlap","regex","tokenize","retLines","linesAndNewlines","line","isSentenceEndPunct","char","tokenStartI","undefinedReplacement","canonicalize","stringifyReplacer","replacer","obj","replacementStack","canonicalizedObj","sortedKeys","UndoRedoManager","modifier","isZ","isY","isShift","hasSelection","isDeletiveKey","lastChar","newValue","diff","lastStep","prevValue","redoStep","selection","IndentManager","renderCallback","open","close","charBefore","charAfter","lastNewline","currentLine","indent","startPos","endPos","indentedText","removedFromFirst","totalRemoved","unindentedText","newStart","newEnd","ListManager","olMatch","taskMatch","ulMatch","continuation","insert","cursor","DEFAULT_SHORTCUTS","ShortcutManager","ctrl","shift","shortcut","editorFocused","inFullscreen","headingBtn","previewBtn","FindReplace","withReplace","sel","start","end","panel","findRow","prevBtn","nextBtn","replaceToggle","closeBtn","replaceBtn","replaceAllBtn","svgHtml","query","searchValue","searchQuery","idx","lineHeight","linesBefore","rowsVisible","cs","mirror","marker","wRect","mRect","hl","replaceWith","escaped","flags","BARE_URL","PasteManager","dataTransfer","images","pasted","files","replacement","caret","defaultRenderer","MarkdownEditor","selector","fileInput","toolbar","footer","opts","theme","textareaContainer","previewInstance","ratio","render","md","sanitize","source","checkbox","count","col","words","selectionOffset","trailingLength","rowsInView","rawValue","newLines","lastLines","contentHeight","maxHeight","cls"],"sources":["../node_modules/marked/lib/marked.esm.js","../node_modules/dompurify/dist/purify.es.mjs","../src/components/toolbar/MakeTool.js","../src/components/toolbar/tools/BoldTool.js","../src/components/toolbar/tools/ItalicTool.js","../src/components/toolbar/tools/StrikethroughTool.js","../src/components/toolbar/tools/ULTool.js","../src/components/toolbar/tools/OLTool.js","../src/components/toolbar/tools/PreviewTool.js","../src/components/toolbar/tools/CheckListTool.js","../src/components/toolbar/tools/BlockQuoteTool.js","../src/components/modal.js","../src/components/toolbar/tools/LinkTool.js","../src/components/toolbar/tools/HeadingTool.js","../src/utils/imageUpload.js","../src/components/toolbar/tools/ImageTool.js","../src/components/toolbar/tools/UndoTool.js","../src/components/toolbar/tools/RedoTool.js","../src/components/toolbar/tools/IndentTool.js","../src/components/toolbar/tools/OutdentTool.js","../src/components/toolbar/tools/CodeTool.js","../src/components/toolbar/tools/CodeBlockTool.js","../src/components/toolbar/tools/HrTool.js","../src/components/toolbar/tools/TableTool.js","../src/utils/variables.js","../src/components/toolbar/tools/VariableTool.js","../src/components/toolbar/Toolbar.js","../src/components/Preview.js","../src/components/Footer.js","../node_modules/diff/libesm/diff/base.js","../node_modules/diff/libesm/diff/character.js","../node_modules/diff/libesm/util/string.js","../node_modules/diff/libesm/diff/word.js","../node_modules/diff/libesm/diff/line.js","../node_modules/diff/libesm/diff/sentence.js","../node_modules/diff/libesm/diff/css.js","../node_modules/diff/libesm/diff/json.js","../node_modules/diff/libesm/diff/array.js","../src/utils/UndoRedoManager.js","../src/utils/IndentManager.js","../src/utils/ListManager.js","../src/utils/ShortcutManager.js","../src/utils/FindReplace.js","../src/utils/PasteManager.js","../src/components/Editor.js"],"sourcesContent":["/**\n * marked v18.0.14 - a markdown parser\n * Copyright (c) 2018-2026, MarkedJS. (MIT License)\n * Copyright (c) 2011-2018, Christopher Jeffrey. (MIT License)\n * https://github.com/markedjs/marked\n */\n\n/**\n * DO NOT EDIT THIS FILE\n * The code in this file is generated from files in ./src/\n */\n\nfunction I(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var y=I();function W(l){y=l}var A={exec:()=>null};function C(l){let e=[];return t=>{let n=Math.max(0,Math.min(3,t-1)),s=e[n];return s||(s=l(n),e[n]=s),s}}function h(l,e=\"\"){let t=typeof l==\"string\"?l:l.source,n={replace:(s,r)=>{let o=typeof r==\"string\"?r:r.source;return o=o.replace(x.caret,\"$1\"),t=t.replace(s,o),n},getRegex:()=>new RegExp(t,e)};return n}var _e=((l=\"\")=>{try{return!!new RegExp(\"(?<=1)(?<!1)\"+l)}catch{return!1}})(),x={codeRemoveIndent:/^(?: {0,3}\\t| {1,4})/gm,outputLinkReplace:/\\\\([\\[\\]])/g,indentCodeCompensation:/^(\\s+)(?:```)/,beginningSpace:/^\\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,endingSpaceTabChar:/[ \\t]$/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\\n/g,tabCharGlobal:/\\t/g,leadingSpaceTab:/^[ \\t]+/,multipleSpaceGlobal:/\\s+/g,blankLine:/^[ \\t]*$/,doubleBlankLine:/\\n[ \\t]*\\n[ \\t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\\n {0,3}((?:=+|-+) *)(?=\\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \\t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\\[[ xX]\\] +\\S/,listReplaceTask:/^\\[[ xX]\\] +/,listTaskCheckbox:/\\[[ xX]\\]/,anyLine:/\\n.*\\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\\||\\| *$/g,tableRowBlankLine:/\\n[ \\t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\\s|>)/i,endPreScriptTag:/^<\\/(pre|code|kbd|script)(\\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/,unicodeAlphaNumeric:/[\\p{L}\\p{N}]/u,numericCharacterReference:/&#(?:(\\d{1,7})|[Xx]([A-Fa-f0-9]{1,6}));/g,escapeTest:/[&<>\"']/,escapeReplace:/[&<>\"']/g,escapeTestNoEncode:/[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/,escapeReplaceNoEncode:/[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/g,caret:/(^|[^\\[])\\^/g,percentDecode:/%25/g,findPipe:/\\|/g,splitPipe:/ \\|/,slashPipe:/\\\\\\|/g,carriageReturn:/\\r\\n|\\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\\S*/,endingNewline:/\\n$/,listItemRegex:l=>new RegExp(`^( {0,3}${l})((?:[\t ][^\\\\n]*)?(?:\\\\n|$))`),nextBulletRegex:C(l=>new RegExp(`^ {0,${l}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \t][^\\\\n]*)?(?:\\\\n|$))`)),hrRegex:C(l=>new RegExp(`^ {0,${l}}((?:-[ \t]*){3,}|(?:_[ \t]*){3,}|(?:\\\\*[ \t]*){3,})(?:\\\\n+|$)`)),fencesBeginRegex:C(l=>new RegExp(`^ {0,${l}}(?:\\`\\`\\`|~~~)`)),headingBeginRegex:C(l=>new RegExp(`^ {0,${l}}#`)),htmlBeginRegex:C(l=>new RegExp(`^ {0,${l}}(?:</?(?:${N})(?: +|$|/?>)|<(?:script|pre|style|textarea|!--))`,\"i\")),blockquoteBeginRegex:C(l=>new RegExp(`^ {0,${l}}>`))},$e=/^(?:[ \\t]*(?:\\n|$))+/,Le=/^((?: {4}| {0,3}\\t)[^\\n]+(?:\\n(?:[ \\t]*(?:\\n|$))*)?)+/,ze=/^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/,G=/^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/,Ae=/^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/,J=/ {0,3}(?:[*+-]|\\d{1,9}[.)])/,ce=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\\n(?!\\s*?\\n|bull |fences|blockquote|heading|hr|html|table))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,he=h(ce).replace(/bull/g,J).replace(/blockCode/g,/(?: {4}| {0,3}\\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\\s|$)/).replace(/hr/g,/ {0,3}(?:(?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/\\|table/g,\"\").getRegex(),Ee=h(ce).replace(/bull/g,J).replace(/blockCode/g,/(?: {4}| {0,3}\\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\\s|$)/).replace(/hr/g,/ {0,3}(?:(?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/table/g,/ {0,3}\\|?(?:[:\\- ]*\\|)+[\\:\\- ]*\\n/).getRegex(),V=/^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table|[ \\t]+\\n)[^\\n]+)*)/,Me=/^[^\\n]+/,Y=/(?!\\s*\\])(?:\\\\[\\s\\S]|[^\\[\\]\\\\])+/,Ie=h(/^ {0,3}\\[(label)\\]: *(?:\\n[ \\t]*)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n[ \\t]*)?| *\\n[ \\t]*)(title))? *(?:\\n+|$)/).replace(\"label\",Y).replace(\"title\",/(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/).getRegex(),Ce=h(/^(bull)([ \\t][^\\n]*?)?(?:\\n|$)/).replace(/bull/g,J).getRegex(),N=\"address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul\",ee=/<!--(?:-?>|[\\s\\S]*?(?:-->|$))/,Be=h(\"^ {0,3}(?:<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n*|$)|comment[^\\\\n]*(\\\\n+|$)|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>[^\\\\n]*\\\\n*|$)|<![A-Z][\\\\s\\\\S]*?(?:>[^\\\\n]*\\\\n*|$)|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>[^\\\\n]*\\\\n*|$)|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$)|<(?!script|pre|style|textarea)([a-z][a-z0-9-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$)|</(?!script|pre|style|textarea)[a-z][a-z0-9-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$))\",\"i\").replace(\"comment\",ee).replace(\"tag\",N).replace(\"attribute\",/ +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/).getRegex(),de=l=>h(V).replace(\"hr\",G).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"|lheading\",\"\").replace(\"|table\",\"\").replace(\"blockquote\",\" {0,3}>\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*(?:\\\\n|$))|~~~)[^\\\\n]*(?:\\\\n|$)\").replace(\"list\",l).replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",N).getRegex(),De=de(/ {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]/),qe=de(/ {0,3}(?:[*+-]|\\d{1,9}[.)])(?:[ \\t]|\\n|$)/),ve=h(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/).replace(\"paragraph\",qe).getRegex(),te={blockquote:ve,code:Le,def:Ie,fences:ze,heading:Ae,hr:G,html:Be,lheading:he,list:Ce,newline:$e,paragraph:De,table:A,text:Me},le=h(\"^ *([^\\\\n ].*)\\\\n {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)\").replace(\"hr\",G).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"blockquote\",\" {0,3}>\").replace(\"code\",\"(?: {4}| {0,3}\t)[^\\\\n]\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*(?:\\\\n|$))|~~~)[^\\\\n]*(?:\\\\n|$)\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)])[ \\\\t]\").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",N).getRegex(),Ze={...te,lheading:Ee,table:le,paragraph:h(V).replace(\"hr\",G).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"|lheading\",\"\").replace(\"table\",le).replace(\"blockquote\",\" {0,3}>\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*(?:\\\\n|$))|~~~)[^\\\\n]*(?:\\\\n|$)\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)])[ \\\\t]+[^ \\\\t\\\\n]\").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",N).getRegex()},He={...te,html:h(`^ *(?:comment *(?:\\\\n|\\\\s*$)|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)|<tag(?:\"[^\"]*\"|'[^']*'|\\\\s[^'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))`).replace(\"comment\",ee).replace(/tag/g,\"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b\").getRegex(),def:/^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,heading:/^(#{1,6})(.*)(?:\\n+|$)/,fences:A,lheading:/^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,paragraph:h(V).replace(\"hr\",G).replace(\"heading\",` *#{1,6} *[^\n]`).replace(\"lheading\",he).replace(\"|table\",\"\").replace(\"blockquote\",\" {0,3}>\").replace(\"|fences\",\"\").replace(\"|list\",\"\").replace(\"|html\",\"\").replace(\"|tag\",\"\").getRegex()},Ge=/^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/,Ne=/^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/,ke=/^( {2,}|\\\\)\\n(?!\\s*$)[ \\t]*/,Qe=/^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/,$=/[\\p{P}\\p{S}]/u,B=/[\\s\\p{P}\\p{S}]/u,Q=/[^\\s\\p{P}\\p{S}]/u,je=h(/^((?![*_])punctSpace)/,\"u\").replace(/punctSpace/g,B).getRegex(),Fe=/[\\p{Pi}\\p{Ps}\"']/u,ge=/(?!~)[\\p{P}\\p{S}]/u,Ue=/(?!~)[\\s\\p{P}\\p{S}]/u,Ke=/(?:[^\\s\\p{P}\\p{S}]|~)/u,We=h(/link|precode-code|html/,\"g\").replace(\"link\",/\\[(?:[^\\[\\]`]|(?<a>`+)[^`]+\\k<a>(?!`))*?\\]\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)]|\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)])*\\))*\\)/).replace(\"precode-\",_e?\"(?<!`)()\":\"(^^|[^`])\").replace(\"code\",/(?<b>`+)[^`]+\\k<b>(?!`)/).replace(\"html\",/<(?! )[^<>]*?>/).getRegex(),fe=/^(?:\\*+(?:((?!\\*)punct)|([^\\s*]))?)|^_+(?:((?!_)punct)|([^\\s_]))?/,Xe=h(fe,\"u\").replace(/punct/g,$).getRegex(),Je=h(fe,\"u\").replace(/punct/g,ge).getRegex(),Ve=/^(?:\\*+(?:((?!\\*)(?!openQuote)punct)|([^\\s*]))?)|^_+(?:((?!_)(?!openQuote)punct)|([^\\s_]))?/,Ye=h(Ve,\"u\").replace(/openQuote/g,Fe).replace(/punct/g,$).getRegex(),me=\"^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)|(?!\\\\*)punctSpace(\\\\*+)(?=notPunctSpace)|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)|notPunctSpace(\\\\*+)(?=notPunctSpace)\",et=h(me,\"gu\").replace(/notPunctSpace/g,Q).replace(/punctSpace/g,B).replace(/punct/g,$).getRegex(),tt=h(me,\"gu\").replace(/notPunctSpace/g,Ke).replace(/punctSpace/g,Ue).replace(/punct/g,ge).getRegex(),nt=\"^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)|(?!\\\\*)[\\\\s](\\\\*+)(?=notPunctSpace)|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)|(?:(?!\\\\*)punct|notPunctSpace)(\\\\*+)(?!\\\\*)(?=notPunctSpace)\",rt=h(nt,\"gu\").replace(/notPunctSpace/g,Q).replace(/punctSpace/g,B).replace(/punct/g,$).getRegex(),st=h(\"^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)\",\"gu\").replace(/notPunctSpace/g,Q).replace(/punctSpace/g,B).replace(/punct/g,$).getRegex(),it=\"^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)[\\\\s](_+)(?=notPunctSpace)|[\\\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)|(?:(?!_)punct|notPunctSpace)(_+)(?!_)(?=notPunctSpace)\",ot=h(it,\"gu\").replace(/notPunctSpace/g,Q).replace(/punctSpace/g,B).replace(/punct/g,$).getRegex(),at=h(/^~~?(?:((?!~)punct)|[^\\s~])/,\"u\").replace(/punct/g,$).getRegex(),lt=\"^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)\",ut=h(lt,\"gu\").replace(/notPunctSpace/g,Q).replace(/punctSpace/g,B).replace(/punct/g,$).getRegex(),pt=h(/\\\\(punct)/,\"gu\").replace(/punct/g,$).getRegex(),ct=h(/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/).replace(\"scheme\",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace(\"email\",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),ht=h(ee).replace(\"(?:-->|$)\",\"-->\").getRegex(),dt=h(\"^comment|^</[a-zA-Z][a-zA-Z0-9-]*\\\\s*>|^<[a-zA-Z][a-zA-Z0-9-]*(?:attribute)*?\\\\s*/?>|^<\\\\?[\\\\s\\\\S]*?\\\\?>|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>\").replace(\"comment\",ht).replace(\"attribute\",/\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/).getRegex(),xe=/\\[(?:\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]/,U=h(/(?:\\[(?:brackets|\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\\])|[^\\[\\]\\\\`])*?/).replace(\"brackets\",xe).getRegex(),kt=h(/^!?\\[(label)\\]\\(\\s*(href)(?:(?:[ \\t]+(?:\\n[ \\t]*)?|\\n[ \\t]*)(title))?\\s*\\)/).replace(\"label\",U).replace(\"href\",/<(?:\\\\.|[^\\n<>\\\\])+>|[^ \\t\\n\\x00-\\x1f]+|(?=\\))/).replace(\"title\",/\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/).getRegex(),gt=h(/^!?\\[(label)\\]\\[(ref)\\]/).replace(\"label\",U).replace(\"ref\",Y).getRegex(),ft=h(/^!?\\[(ref)\\](?:\\[\\])?/).replace(\"ref\",Y).getRegex(),ue=/(?!\\s*\\])(?:\\\\[\\s\\S]|[^\\[\\]\\\\]){1,999}/,mt=h(/(?:[^\\[\\]\\\\`]*(?:\\[(?:brackets|\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\\]))){0,999}?[^\\[\\]\\\\`]*?/).replace(\"brackets\",xe).getRegex(),xt=h(\"reflink|nolink(?!\\\\()\",\"g\").replace(\"reflink\",h(/^!?\\[(label)\\]\\[(ref)\\]/).replace(\"label\",mt).replace(\"ref\",ue).getRegex()).replace(\"nolink\",h(/^!?\\[(ref)\\](?:\\[\\])?/).replace(\"ref\",ue).getRegex()).getRegex(),pe=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,bt=/[A-Za-z0-9._+-]+@[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![\\w-])/,Rt=h(/(?:mailto:email|xmpp:email(?:\\/[A-Za-z0-9@.]+)?)/).replace(/email/g,bt).getRegex(),ne={_backpedal:A,anyPunctuation:pt,autolink:ct,blockSkip:We,br:ke,code:Ne,del:A,delLDelim:A,delRDelim:A,emStrongLDelim:Xe,emStrongRDelimAst:et,emStrongRDelimUnd:st,escape:Ge,link:kt,nolink:ft,punctuation:je,reflink:gt,reflinkSearch:xt,tag:dt,text:Qe,url:A},Tt={...ne,emStrongLDelim:Ye,emStrongRDelimAst:rt,emStrongRDelimUnd:ot,link:h(/^!?\\[(label)\\]\\((.*?)\\)/).replace(\"label\",U).getRegex(),reflink:h(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/).replace(\"label\",U).getRegex()},X={...ne,emStrongRDelimAst:tt,emStrongLDelim:Je,delLDelim:at,delRDelim:ut,url:h(/^emailProtocol|^((?:protocol):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/).replace(\"emailProtocol\",Rt).replace(\"protocol\",pe).replace(\"email\",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![\\w-])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,del:/^(~~?)(?=[^\\s~])((?:\\\\[\\s\\S]|[^\\\\])*?(?:\\\\[\\s\\S]|[^\\s~\\\\]))\\1(?=[^~]|$)/,text:h(/^(?:[^a-zA-Z0-9](?=emailProtocol)|(`+|~+|[^`~])(?:(?=[`~])|(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|protocol:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9](?=emailProtocol)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@))))/).replace(\"protocol\",pe).replace(/emailProtocol/g,/(?:mailto|xmpp):/).getRegex()},Ot={...X,br:h(ke).replace(\"{2,}\",\"*\").getRegex(),text:h(X.text).replace(\"\\\\b_\",\"\\\\b_| {2,}\\\\n\").replace(/\\{2,\\}/g,\"*\").getRegex()},j={normal:te,gfm:Ze,pedantic:He},D={normal:ne,gfm:X,breaks:Ot,pedantic:Tt};var wt={\"&\":\"&\",\"<\":\"<\",\">\":\">\",'\"':\""\",\"'\":\"'\"},be=l=>wt[l];function O(l,e){if(e){if(x.escapeTest.test(l))return l.replace(x.escapeReplace,be)}else if(x.escapeTestNoEncode.test(l))return l.replace(x.escapeReplaceNoEncode,be);return l}function Re(l){return l.replace(x.numericCharacterReference,(e,t,n)=>{let s=t===void 0?Number.parseInt(n,16):Number.parseInt(t,10);return s===0||s>1114111||s>=55296&&s<=57343?\"\\uFFFD\":String.fromCodePoint(s)})}function re(l){try{l=encodeURI(l).replace(x.percentDecode,\"%\")}catch{return null}return l}function se(l,e){let t=l.replace(x.findPipe,(r,o,i)=>{let u=!1,a=o;for(;--a>=0&&i[a]===\"\\\\\";)u=!u;return u?\"|\":\" |\"}),n=t.split(x.splitPipe),s=0;if(n[0].trim()||n.shift(),n.length>0&&!n.at(-1)?.trim()&&n.pop(),e)if(n.length>e)n.splice(e);else for(;n.length<e;)n.push(\"\");for(;s<n.length;s++)n[s]=n[s].trim().replace(x.slashPipe,\"|\");return n}function L(l,e,t){let n=l.length;if(n===0)return\"\";let s=0;for(;s<n;){let r=l.charAt(n-s-1);if(r===e&&!t)s++;else if(r!==e&&t)s++;else break}return l.slice(0,n-s)}function ie(l){let e=l.split(`\n`),t=e.length-1;for(;t>=0&&x.blankLine.test(e[t]);)t--;return e.length-t<=2?l:e.slice(0,t+1).join(`\n`)}function q(l){return l.trim().toLowerCase().toUpperCase().toLowerCase()}function Te(l,e){if(l.indexOf(e[1])===-1)return-1;let t=0;for(let n=0;n<l.length;n++)if(l[n]===\"\\\\\")n++;else if(l[n]===e[0])t++;else if(l[n]===e[1]&&(t--,t<0))return n;return t>0?-2:-1}function oe(l,e=0){let t=e,n=\"\";for(let s of l)if(s===\"\t\"){let r=4-t%4;n+=\" \".repeat(r),t+=r}else n+=s,t++;return n}function Oe(l,e,t,n,s){let r=e.href,o=e.title||null,i=l[1].replace(s.other.outputLinkReplace,\"$1\"),u=l[0].charAt(0)===\"!\";n.state.inLink=!0;let a=n.state.linkEmitted,p=n.state.inRawBlock;n.state.linkEmitted=!1;let c=n.inlineTokens(i),d=n.state.linkEmitted;if(n.state.linkEmitted=a,n.state.inLink=!1,!u){if(d){n.state.inRawBlock=p;return}n.state.linkEmitted=!0}return{type:u?\"image\":\"link\",raw:t,href:r,title:o,text:i,tokens:c}}function yt(l,e,t){let n=l.match(t.other.indentCodeCompensation);if(n===null)return e;let s=n[1];return e.split(`\n`).map(r=>{let o=r.match(t.other.beginningSpace);if(o===null)return r;let[i]=o;return r.slice(Math.min(i.length,s.length))}).join(`\n`)}function we(l,e,t,n){if(!e.includes(\"<\"))return!1;for(let s=0;s<e.length;s++){if(e[s]===\"\\\\\"){s++;continue}if(e[s]===\"`\"){let i=n.inline.code.exec(e.slice(s));if(i){s+=i[0].length-1;continue}}if(e[s]!==\"<\")continue;let r=l.slice(t+s),o=n.inline.tag.exec(r)||n.inline.autolink.exec(r);if(o){if(o[0].length>e.length-s)return!0;s+=o[0].length-1}}return!1}var P=class{options;rules;lexer;constructor(e){this.options=e||y}space(e){let t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:\"space\",raw:t[0]}}code(e){let t=this.rules.block.code.exec(e);if(t){let n=this.options.pedantic?t[0]:ie(t[0]),s=n.replace(this.rules.other.codeRemoveIndent,\"\");return{type:\"code\",raw:n,codeBlockStyle:\"indented\",text:s}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let n=t[0],s=yt(n,t[3]||\"\",this.rules);return{type:\"code\",raw:n,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,\"$1\"):t[2],text:s}}}heading(e){let t=this.rules.block.heading.exec(e);if(t){let n=t[2].trim();if(this.rules.other.endingHash.test(n)){let s=L(n,\"#\");(this.options.pedantic||!s||this.rules.other.endingSpaceTabChar.test(s))&&(n=s.trim())}return{type:\"heading\",raw:L(t[0],`\n`),depth:t[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(e){let t=this.rules.block.hr.exec(e);if(t)return{type:\"hr\",raw:L(t[0],`\n`)}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let n=L(t[0],`\n`).split(`\n`),s=\"\",r=\"\",o=[];for(;n.length>0;){let i=!1,u=[],a;for(a=0;a<n.length;a++)if(this.rules.other.blockquoteStart.test(n[a]))u.push(n[a]),i=!0;else if(!i)u.push(n[a]);else break;n=n.slice(a);let p=u.join(`\n`),c=p.replace(this.rules.other.blockquoteSetextReplace,`\n $1`).replace(this.rules.other.blockquoteSetextReplace2,\"\");s=s?`${s}\n${p}`:p,r=r?`${r}\n${c}`:c;let d=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(c,o,!0),this.lexer.state.top=d,n.length===0)break;let m=o.at(-1);if(m?.type===\"code\")break;if(m?.type===\"blockquote\"){let b=m,g=n.join(`\n`),w=b.raw+`\n`+g.replace(this.rules.other.blockquoteSetextReplace2,\"\"),f=this.blockquote(w);o[o.length-1]=f;let M=w.substring(f.raw.length).replace(/^\\n/,\"\"),v=M?M.split(`\n`).length:0,Z=v?n.slice(0,-v):n;Z.length>0&&(s=`${s}\n${Z.join(`\n`)}`),r=r.substring(0,r.length-b.text.length)+f.text;break}else if(m?.type===\"list\"){let b=m,g=b.raw+`\n`+n.join(`\n`),w=this.list(g);o[o.length-1]=w,s=s.substring(0,s.length-m.raw.length)+w.raw,r=r.substring(0,r.length-b.raw.length)+w.raw,n=g.substring(o.at(-1).raw.length).split(`\n`);continue}}return{type:\"blockquote\",raw:s,tokens:o,text:r}}}list(e){let t=this.rules.block.list.exec(e);if(t){let n=t[1].trim(),s=n.length>1,r={type:\"list\",raw:\"\",ordered:s,start:s?+n.slice(0,-1):\"\",loose:!1,items:[]};n=s?`\\\\d{1,9}\\\\${n.slice(-1)}`:`\\\\${n}`,this.options.pedantic&&(n=s?n:\"[*+-]\");let o=this.rules.other.listItemRegex(n),i=!1;for(;e;){let a=!1,p=\"\",c=\"\";if(!(t=o.exec(e))||this.rules.block.hr.test(e))break;p=t[0],e=e.substring(p.length);let d=t[2].split(`\n`,1)[0],m=t[1].length,b=this.options.pedantic?oe(d,m):d.replace(this.rules.other.leadingSpaceTab,M=>oe(M,m)),g=e.split(`\n`,1)[0],w=!b.trim(),f=0;if(this.options.pedantic?(f=2,c=b.trimStart()):w?f=m+1:(f=b.search(this.rules.other.nonSpaceChar),f=f>4?1:f,c=b.slice(f),f+=m),w&&this.rules.other.blankLine.test(g)&&(p+=g+`\n`,e=e.substring(g.length+1),a=!0),!a){let M=this.rules.other.nextBulletRegex(f),v=this.rules.other.hrRegex(f),Z=this.rules.other.fencesBeginRegex(f),ae=this.rules.other.headingBeginRegex(f),ye=this.rules.other.htmlBeginRegex(f),Pe=this.rules.other.blockquoteBeginRegex(f);for(;e;){let K=e.split(`\n`,1)[0],H;if(g=K,this.options.pedantic?(g=g.replace(this.rules.other.listReplaceNesting,\" \"),H=g):H=g.replace(this.rules.other.leadingSpaceTab,Se=>Se.replace(this.rules.other.tabCharGlobal,\" \")),Z.test(g)||ae.test(g)||ye.test(g)||Pe.test(g)||M.test(g)||v.test(g))break;if(H.search(this.rules.other.nonSpaceChar)>=f||!g.trim())c+=`\n`+H.slice(f);else{if(w||b.replace(this.rules.other.tabCharGlobal,\" \").search(this.rules.other.nonSpaceChar)>=4||Z.test(b)||ae.test(b)||v.test(b))break;c+=`\n`+g}w=!g.trim(),p+=K+`\n`,e=e.substring(K.length+1),b=H.slice(f)}}r.loose||(i?r.loose=!0:this.rules.other.doubleBlankLine.test(p)&&(i=!0)),r.items.push({type:\"list_item\",raw:p,task:!!this.options.gfm&&this.rules.other.listIsTask.test(c),loose:!1,text:c,tokens:[]}),r.raw+=p}let u=r.items.at(-1);if(u)u.raw=u.raw.trimEnd(),u.text=u.text.trimEnd();else return;r.raw=r.raw.trimEnd();for(let a of r.items)if(this.lexer.state.top=!1,a.tokens=this.lexer.blockTokens(a.text,[]),!r.loose){let p=a.tokens.filter(d=>d.type===\"space\"),c=p.length>0&&p.some(d=>this.rules.other.anyLine.test(d.raw));r.loose=c}for(let a of r.items){let p=a.tokens[0];if(a.task&&(p?.type===\"text\"||p?.type===\"paragraph\")){a.text=a.text.replace(this.rules.other.listReplaceTask,\"\"),p.raw=p.raw.replace(this.rules.other.listReplaceTask,\"\"),p.text=p.text.replace(this.rules.other.listReplaceTask,\"\");for(let d=this.lexer.inlineQueue.length-1;d>=0;d--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[d].src)){this.lexer.inlineQueue[d].src=this.lexer.inlineQueue[d].src.replace(this.rules.other.listReplaceTask,\"\");break}let c=this.rules.other.listTaskCheckbox.exec(a.raw);if(c){let d={type:\"checkbox\",raw:c[0]+\" \",checked:c[0]!==\"[ ]\"};a.checked=d.checked,r.loose?a.tokens[0]&&[\"paragraph\",\"text\"].includes(a.tokens[0].type)&&\"tokens\"in a.tokens[0]&&a.tokens[0].tokens?(a.tokens[0].raw=d.raw+a.tokens[0].raw,a.tokens[0].text=d.raw+a.tokens[0].text,a.tokens[0].tokens.unshift(d)):a.tokens.unshift({type:\"paragraph\",raw:d.raw,text:d.raw,tokens:[d]}):a.tokens.unshift(d)}}else a.task&&(a.task=!1)}if(r.loose)for(let a of r.items){a.loose=!0;for(let p of a.tokens)p.type===\"text\"&&(p.type=\"paragraph\")}return r}}html(e){let t=this.rules.block.html.exec(e);if(t){let n=ie(t[0]);return{type:\"html\",block:!0,raw:n,pre:t[1]===\"pre\"||t[1]===\"script\"||t[1]===\"style\",text:n}}}def(e){let t=this.rules.block.def.exec(e);if(t){let n=q(t[1]).replace(this.rules.other.multipleSpaceGlobal,\" \"),s=t[2]?t[2].replace(this.rules.other.hrefBrackets,\"$1\").replace(this.rules.inline.anyPunctuation,\"$1\"):\"\",r=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,\"$1\"):t[3];return{type:\"def\",tag:n,raw:L(t[0],`\n`),href:s,title:r}}}table(e){let t=this.rules.block.table.exec(e);if(!t||!this.rules.other.tableDelimiter.test(t[2]))return;let n=se(t[1]),s=t[2].replace(this.rules.other.tableAlignChars,\"\").split(\"|\"),r=t[3]?.trim()?t[3].replace(this.rules.other.tableRowBlankLine,\"\").split(`\n`):[],o={type:\"table\",raw:L(t[0],`\n`),header:[],align:[],rows:[]};if(n.length===s.length){for(let i of s)this.rules.other.tableAlignRight.test(i)?o.align.push(\"right\"):this.rules.other.tableAlignCenter.test(i)?o.align.push(\"center\"):this.rules.other.tableAlignLeft.test(i)?o.align.push(\"left\"):o.align.push(null);for(let i=0;i<n.length;i++)o.header.push({text:n[i],tokens:this.lexer.inline(n[i]),header:!0,align:o.align[i]});for(let i of r)o.rows.push(se(i,o.header.length).map((u,a)=>({text:u,tokens:this.lexer.inline(u),header:!1,align:o.align[a]})));return o}}lheading(e){let t=this.rules.block.lheading.exec(e);if(t){let n=t[1].trim();return{type:\"heading\",raw:L(t[0],`\n`),depth:t[2].charAt(0)===\"=\"?1:2,text:n,tokens:this.lexer.inline(n)}}}paragraph(e){let t=this.rules.block.paragraph.exec(e);if(t){let n=t[1].charAt(t[1].length-1)===`\n`?t[1].slice(0,-1):t[1];return{type:\"paragraph\",raw:t[0],text:n,tokens:this.lexer.inline(n)}}}text(e){let t=this.rules.block.text.exec(e);if(t)return{type:\"text\",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){let t=this.rules.inline.escape.exec(e);if(t)return{type:\"escape\",raw:t[0],text:t[1]}}tag(e){let t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&this.rules.other.startATag.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:\"html\",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){let t=this.rules.inline.link.exec(e);if(t){let n=t[0].charAt(0)===\"!\"?2:1;if(!this.options.pedantic&&we(e,t[1],n,this.rules))return;let s=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(s)){if(!this.rules.other.endAngleBracket.test(s))return;let i=L(s.slice(0,-1),\"\\\\\");if((s.length-i.length)%2===0)return}else{let i=Te(t[2],\"()\");if(i===-2)return;if(i>-1){let a=(t[0].indexOf(\"!\")===0?5:4)+t[1].length+i;t[2]=t[2].substring(0,i),t[0]=t[0].substring(0,a).trim(),t[3]=\"\"}}let r=t[2],o=\"\";if(this.options.pedantic){let i=this.rules.other.pedanticHrefTitle.exec(r);i&&(r=i[1],o=i[3])}else o=t[3]?t[3].slice(1,-1):\"\";return r=r.trim(),this.rules.other.startAngleBracket.test(r)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(s)?r=r.slice(1):r=r.slice(1,-1)),Oe(t,{href:r&&r.replace(this.rules.inline.anyPunctuation,\"$1\"),title:o&&o.replace(this.rules.inline.anyPunctuation,\"$1\")},t[0],this.lexer,this.rules)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){let s=n[0].charAt(0)===\"!\"?2:1;if(!this.options.pedantic&&we(e,n[1],s,this.rules))return;let r=(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal,\" \"),o=t[q(r)];if(!o){let i=n[0].charAt(0);return{type:\"text\",raw:i,text:i}}return Oe(n,o,n[0],this.lexer,this.rules)}}emStrong(e,t,n=\"\"){let s=this.rules.inline.emStrongLDelim.exec(e);if(!s||!s[1]&&!s[2]&&!s[3]&&!s[4]||s[4]&&n.match(this.rules.other.unicodeAlphaNumeric))return;if(!(s[1]||s[3]||\"\")||!n||this.rules.inline.punctuation.exec(n)){let o=[...s[0]].length-1,i,u,a=o,p=0,c=s[0][0],d=n===c,m=c===\"*\"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(m.lastIndex=0,t=t.slice(-1*e.length+o);(s=m.exec(t))!==null;){if(i=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!i)continue;if(u=[...i].length,s[3]||s[4]){a+=u;continue}else if(s[5]||s[6]){if(o%3&&!((o+u)%3)){p+=u;continue}if(d)break}if(a-=u,a>0)continue;u=Math.min(u,u+a+p);let b=[...s[0]][0].length,g=e.slice(0,o+s.index+b+u);if(Math.min(o,u)%2){let f=g.slice(1,-1);return{type:\"em\",raw:g,text:f,tokens:this.lexer.inlineTokens(f)}}let w=g.slice(2,-2);return{type:\"strong\",raw:g,text:w,tokens:this.lexer.inlineTokens(w)}}}}codespan(e){let t=this.rules.inline.code.exec(e);if(t){let n=t[2].replace(this.rules.other.newLineCharGlobal,\" \"),s=this.rules.other.nonSpaceChar.test(n),r=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return s&&r&&(n=n.substring(1,n.length-1)),{type:\"codespan\",raw:t[0],text:n}}}br(e){let t=this.rules.inline.br.exec(e);if(t)return{type:\"br\",raw:t[0]}}del(e,t,n=\"\"){let s=this.rules.inline.delLDelim.exec(e);if(!s)return;if(!(s[1]||\"\")||!n||this.rules.inline.punctuation.exec(n)){let o=[...s[0]].length-1,i,u,a=o,p=this.rules.inline.delRDelim;for(p.lastIndex=0,t=t.slice(-1*e.length+o);(s=p.exec(t))!==null;){if(i=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!i||(u=[...i].length,u!==o))continue;if(s[3]||s[4]){a+=u;continue}if(a-=u,a>0)continue;u=Math.min(u,u+a);let c=[...s[0]][0].length,d=e.slice(0,o+s.index+c+u),m=d.slice(o,-o);return{type:\"del\",raw:d,text:m,tokens:this.lexer.inlineTokens(m)}}}}autolink(e){let t=this.rules.inline.autolink.exec(e);if(t){let n,s;return t[2]===\"@\"?(n=t[1],s=\"mailto:\"+n):(n=t[1],s=n),{type:\"link\",raw:t[0],text:n,href:s,autolink:!0,tokens:[{type:\"text\",raw:n,text:n}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let n,s;if(t[2]===\"@\")n=t[0],s=\"mailto:\"+n;else{let r;do r=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??\"\";while(r!==t[0]);n=t[0],t[1]===\"www.\"?s=\"http://\"+t[0]:s=t[0]}return{type:\"link\",raw:t[0],text:n,href:s,autolink:!0,tokens:[{type:\"text\",raw:n,text:n}]}}}inlineText(e){let t=this.rules.inline.text.exec(e);if(t){let n=this.lexer.state.inRawBlock;return{type:\"text\",raw:t[0],text:n?t[0]:Re(t[0]),escaped:n}}}};var R=class l{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||y,this.options.tokenizer=this.options.tokenizer||new P,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,linkEmitted:!1,top:!0};let t={other:x,block:j.normal,inline:D.normal};this.options.pedantic?(t.block=j.pedantic,t.inline=D.pedantic):this.options.gfm&&(t.block=j.gfm,this.options.breaks?t.inline=D.breaks:t.inline=D.gfm),this.tokenizer.rules=t}static get rules(){return{block:j,inline:D}}static lex(e,t){return new l(t).lex(e)}static lexInline(e,t){return new l(t).inlineTokens(e)}lex(e){e=e.replace(x.carriageReturn,`\n`),this.blockTokens(e,this.tokens);for(let t=0;t<this.inlineQueue.length;t++){let n=this.inlineQueue[t];this.inlineTokens(n.src,n.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(e,t=[],n=!1){this.tokenizer.lexer=this,this.options.pedantic&&(e=e.replace(x.tabCharGlobal,\" \").replace(x.spaceLine,\"\"));let s=1/0;for(;e;){if(e.length<s)s=e.length;else{this.infiniteLoopError(e.charCodeAt(0));break}let r;if(this.options.extensions?.block?.some(i=>(r=i.call({lexer:this},e,t))?(e=e.substring(r.raw.length),t.push(r),!0):!1))continue;if(r=this.tokenizer.space(e)){e=e.substring(r.raw.length);let i=t.at(-1);r.raw.length===1&&i!==void 0?i.raw+=`\n`:t.push(r);continue}if(r=this.tokenizer.code(e)){e=e.substring(r.raw.length);let i=t.at(-1);i?.type===\"paragraph\"||i?.type===\"text\"?(i.raw+=(i.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,i.text+=`\n`+r.text,this.inlineQueue.at(-1).src=i.text):t.push(r);continue}if(r=this.tokenizer.fences(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.heading(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.hr(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.blockquote(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.list(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.html(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.def(e)){e=e.substring(r.raw.length);let i=t.at(-1);i?.type===\"paragraph\"||i?.type===\"text\"?(i.raw+=(i.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,i.text+=`\n`+r.raw,this.inlineQueue.at(-1).src=i.text):this.tokens.links[r.tag]||(this.tokens.links[r.tag]={href:r.href,title:r.title},t.push(r));continue}if(r=this.tokenizer.table(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.lheading(e)){e=e.substring(r.raw.length),t.push(r);continue}let o=e;if(this.options.extensions?.startBlock){let i=1/0,u=e.slice(1),a;this.options.extensions.startBlock.forEach(p=>{a=p.call({lexer:this},u),typeof a==\"number\"&&a>=0&&(i=Math.min(i,a))}),i<1/0&&i>=0&&(o=e.substring(0,i+1))}if(this.state.top&&(r=this.tokenizer.paragraph(o))){let i=t.at(-1);n&&i?.type===\"paragraph\"?(i.raw+=(i.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,i.text+=`\n`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=i.text):t.push(r),n=o.length!==e.length,e=e.substring(r.raw.length);continue}if(r=this.tokenizer.text(e)){e=e.substring(r.raw.length);let i=t.at(-1);i?.type===\"text\"?(i.raw+=(i.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,i.text+=`\n`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=i.text):t.push(r);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}linkInText(e){if(!e.includes(\"[\"))return!1;let t=this.tokenizer.rules.inline.link;for(let n of e.matchAll(this.tokenizer.rules.inline.blockSkip))if(t.test(n[0])&&e.charAt(n.index-1)!==\"!\")return!0;for(let n of e.matchAll(this.tokenizer.rules.inline.reflinkSearch)){let s=n[0],r=s.lastIndexOf(\"[\");if(!(s.charAt(0)===\"!\"||!Object.hasOwn(this.tokens.links,q(s.slice(r+1,-1))))&&!(r>1&&this.linkInText(s.slice(1,r-1))))return!0}return!1}inlineTokens(e,t=[]){this.tokenizer.lexer=this;let n=e;if(this.tokens.links&&e.includes(\"[\")){let i=this.tokenizer.rules.inline.reflinkSearch,u=a=>{let p=a.lastIndexOf(\"[\");if(!Object.hasOwn(this.tokens.links,q(a.slice(p+1,-1))))return a;if(p>1&&a.charAt(0)!==\"!\"){let c=a.slice(1,p-1);if(this.linkInText(c))return\"[\"+c.replace(i,u)+\"][\"+\"a\".repeat(a.length-p-2)+\"]\"}return\"[\"+\"a\".repeat(a.length-2)+\"]\"};n=n.replace(i,u)}n=n.replace(this.tokenizer.rules.inline.anyPunctuation,i=>\"+\".repeat(i.length)),n=n.replace(this.tokenizer.rules.inline.blockSkip,(i,u,a)=>{let p=a?a.length:0;return i.slice(0,p)+\"[\"+\"a\".repeat(i.length-p-2)+\"]\"}),n=this.options.hooks?.emStrongMask?.call({lexer:this},n)??n;let s=!1,r=\"\",o=1/0;for(;e;){if(e.length<o)o=e.length;else{this.infiniteLoopError(e.charCodeAt(0));break}s||(r=\"\"),s=!1;let i;if(this.options.extensions?.inline?.some(a=>(i=a.call({lexer:this},e,t))?(e=e.substring(i.raw.length),t.push(i),!0):!1))continue;if(i=this.tokenizer.escape(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.tag(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.link(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(i.raw.length);let a=t.at(-1);i.type===\"text\"&&a?.type===\"text\"?(a.raw+=i.raw,a.text+=i.text):t.push(i);continue}if(i=this.tokenizer.emStrong(e,n,r)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.codespan(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.br(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.del(e,n,r)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.autolink(e)){e=e.substring(i.raw.length),t.push(i);continue}if(!this.state.inLink&&(i=this.tokenizer.url(e))){e=e.substring(i.raw.length),t.push(i);continue}let u=e;if(this.options.extensions?.startInline){let a=1/0,p=e.slice(1),c;this.options.extensions.startInline.forEach(d=>{c=d.call({lexer:this},p),typeof c==\"number\"&&c>=0&&(a=Math.min(a,c))}),a<1/0&&a>=0&&(u=e.substring(0,a+1))}if(i=this.tokenizer.inlineText(u)){e=e.substring(i.raw.length),i.raw.slice(-1)!==\"_\"&&(r=i.raw.slice(-1)),s=!0;let a=t.at(-1);a?.type===\"text\"?(a.raw+=i.raw,a.text+=i.text):t.push(i);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return t}infiniteLoopError(e){let t=\"Infinite loop on byte: \"+e;if(this.options.silent)console.error(t);else throw new Error(t)}};var S=class{options;parser;constructor(e){this.options=e||y}space(e){return\"\"}code({text:e,lang:t,escaped:n}){let s=(t||\"\").match(x.notSpaceStart)?.[0],r=e?e.replace(x.endingNewline,\"\")+`\n`:\"\";return s?'<pre><code class=\"language-'+O(s)+'\">'+(n?r:O(r,!0))+`</code></pre>\n`:\"<pre><code>\"+(n?r:O(r,!0))+`</code></pre>\n`}blockquote({tokens:e}){return`<blockquote>\n${this.parser.parse(e)}</blockquote>\n`}html({text:e}){return e}def(e){return\"\"}heading({tokens:e,depth:t}){return`<h${t}>${this.parser.parseInline(e)}</h${t}>\n`}hr(e){return`<hr>\n`}list(e){let t=e.ordered,n=e.start,s=\"\";for(let i=0;i<e.items.length;i++){let u=e.items[i];s+=this.listitem(u)}let r=t?\"ol\":\"ul\",o=t&&n!==1?' start=\"'+n+'\"':\"\";return\"<\"+r+o+`>\n`+s+\"</\"+r+`>\n`}listitem(e){return`<li>${this.parser.parse(e.tokens)}</li>\n`}checkbox({checked:e}){return\"<input \"+(e?'checked=\"\" ':\"\")+'disabled=\"\" type=\"checkbox\"> '}paragraph({tokens:e}){return`<p>${this.parser.parseInline(e)}</p>\n`}table(e){let t=\"\",n=\"\";for(let r=0;r<e.header.length;r++)n+=this.tablecell(e.header[r]);t+=this.tablerow({text:n});let s=\"\";for(let r=0;r<e.rows.length;r++){let o=e.rows[r];n=\"\";for(let i=0;i<o.length;i++)n+=this.tablecell(o[i]);s+=this.tablerow({text:n})}return s&&(s=`<tbody>${s}</tbody>`),`<table>\n<thead>\n`+t+`</thead>\n`+s+`</table>\n`}tablerow({text:e}){return`<tr>\n${e}</tr>\n`}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?\"th\":\"td\";return(e.align?`<${n} align=\"${e.align}\">`:`<${n}>`)+t+`</${n}>\n`}strong({tokens:e}){return`<strong>${this.parser.parseInline(e)}</strong>`}em({tokens:e}){return`<em>${this.parser.parseInline(e)}</em>`}codespan({text:e}){return`<code>${O(e,!0)}</code>`}br(e){return\"<br>\"}del({tokens:e}){return`<del>${this.parser.parseInline(e)}</del>`}link({href:e,title:t,text:n,tokens:s,autolink:r}){let o=r?O(n,!0):this.parser.parseInline(s),i=re(e);if(i===null)return o;e=O(i,r);let u='<a href=\"'+e+'\"';return t&&(u+=' title=\"'+O(t)+'\"'),u+=\">\"+o+\"</a>\",u}image({href:e,title:t,text:n,tokens:s}){s&&(n=this.parser.parseInline(s,this.parser.textRenderer));let r=re(e);if(r===null)return O(n);e=r;let o=`<img src=\"${O(e)}\" alt=\"${O(n)}\"`;return t&&(o+=` title=\"${O(t)}\"`),o+=\">\",o}text(e){return\"tokens\"in e&&e.tokens?this.parser.parseInline(e.tokens):\"escaped\"in e&&e.escaped?e.text:O(e.text)}};var z=class{strong({text:e}){return e}em({text:e}){return e}codespan({text:e}){return e}del({text:e}){return e}html({text:e}){return e}text({text:e}){return e}link({text:e}){return\"\"+e}image({text:e}){return\"\"+e}br(){return\"\"}checkbox({raw:e}){return e}};var T=class l{options;renderer;textRenderer;constructor(e){this.options=e||y,this.options.renderer=this.options.renderer||new S,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new z}static parse(e,t){return new l(t).parse(e)}static parseInline(e,t){return new l(t).parseInline(e)}parse(e){this.renderer.parser=this;let t=\"\";for(let n=0;n<e.length;n++){let s=e[n];if(this.options.extensions?.renderers?.[s.type]){let o=s,i=this.options.extensions.renderers[o.type].call({parser:this},o);if(i!==!1||![\"space\",\"hr\",\"heading\",\"code\",\"table\",\"blockquote\",\"list\",\"checkbox\",\"html\",\"def\",\"paragraph\",\"text\"].includes(o.type)){t+=i||\"\";continue}}let r=s;switch(r.type){case\"space\":{t+=this.renderer.space(r);break}case\"hr\":{t+=this.renderer.hr(r);break}case\"heading\":{t+=this.renderer.heading(r);break}case\"code\":{t+=this.renderer.code(r);break}case\"table\":{t+=this.renderer.table(r);break}case\"blockquote\":{t+=this.renderer.blockquote(r);break}case\"list\":{t+=this.renderer.list(r);break}case\"checkbox\":{t+=this.renderer.checkbox(r);break}case\"html\":{t+=this.renderer.html(r);break}case\"def\":{t+=this.renderer.def(r);break}case\"paragraph\":{t+=this.renderer.paragraph(r);break}case\"text\":{t+=this.renderer.text(r);break}default:{let o='Token with \"'+r.type+'\" type was not found.';if(this.options.silent)return console.error(o),\"\";throw new Error(o)}}}return t}parseInline(e,t=this.renderer){this.renderer.parser=this;let n=\"\";for(let s=0;s<e.length;s++){let r=e[s];if(this.options.extensions?.renderers?.[r.type]){let i=this.options.extensions.renderers[r.type].call({parser:this},r);if(i!==!1||![\"escape\",\"html\",\"link\",\"image\",\"checkbox\",\"strong\",\"em\",\"codespan\",\"br\",\"del\",\"text\"].includes(r.type)){n+=i||\"\";continue}}let o=r;switch(o.type){case\"escape\":{n+=t.text(o);break}case\"html\":{n+=t.html(o);break}case\"link\":{n+=t.link(o);break}case\"image\":{n+=t.image(o);break}case\"checkbox\":{n+=t.checkbox(o);break}case\"strong\":{n+=t.strong(o);break}case\"em\":{n+=t.em(o);break}case\"codespan\":{n+=t.codespan(o);break}case\"br\":{n+=t.br(o);break}case\"del\":{n+=t.del(o);break}case\"text\":{n+=t.text(o);break}default:{let i='Token with \"'+o.type+'\" type was not found.';if(this.options.silent)return console.error(i),\"\";throw new Error(i)}}}return n}};var _=class{options;block;constructor(e){this.options=e||y}static passThroughHooks=new Set([\"preprocess\",\"postprocess\",\"processAllTokens\",\"emStrongMask\"]);static passThroughHooksRespectAsync=new Set([\"preprocess\",\"postprocess\",\"processAllTokens\"]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}emStrongMask(e){return e}provideLexer(e=this.block){return e?R.lex:R.lexInline}provideParser(e=this.block){return e?T.parse:T.parseInline}};var F=class{defaults=I();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=T;Renderer=S;TextRenderer=z;Lexer=R;Tokenizer=P;Hooks=_;constructor(...e){this.use(...e)}walkTokens(e,t){let n=[];for(let s of e)switch(n=n.concat(t.call(this,s)),s.type){case\"table\":{let r=s;for(let o of r.header)n=n.concat(this.walkTokens(o.tokens,t));for(let o of r.rows)for(let i of o)n=n.concat(this.walkTokens(i.tokens,t));break}case\"list\":{let r=s;n=n.concat(this.walkTokens(r.items,t));break}default:{let r=s;this.defaults.extensions?.childTokens?.[r.type]?this.defaults.extensions.childTokens[r.type].forEach(o=>{let i=r[o].flat(1/0);n=n.concat(this.walkTokens(i,t))}):r.tokens&&(n=n.concat(this.walkTokens(r.tokens,t)))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(n=>{let s={...n};if(s.async=this.defaults.async||s.async||!1,n.extensions&&(n.extensions.forEach(r=>{if(!r.name)throw new Error(\"extension name required\");if(\"renderer\"in r){let o=t.renderers[r.name];o?t.renderers[r.name]=function(...i){let u=r.renderer.apply(this,i);return u===!1&&(u=o.apply(this,i)),u}:t.renderers[r.name]=r.renderer}if(\"tokenizer\"in r){if(!r.level||r.level!==\"block\"&&r.level!==\"inline\")throw new Error(\"extension level must be 'block' or 'inline'\");let o=t[r.level];o?o.unshift(r.tokenizer):t[r.level]=[r.tokenizer],r.start&&(r.level===\"block\"?t.startBlock?t.startBlock.push(r.start):t.startBlock=[r.start]:r.level===\"inline\"&&(t.startInline?t.startInline.push(r.start):t.startInline=[r.start]))}\"childTokens\"in r&&r.childTokens&&(t.childTokens[r.name]=r.childTokens)}),s.extensions=t),n.renderer){let r=this.defaults.renderer||new S(this.defaults);for(let o in n.renderer){if(!(o in r))throw new Error(`renderer '${o}' does not exist`);if([\"options\",\"parser\"].includes(o))continue;let i=o,u=n.renderer[i],a=r[i];r[i]=(...p)=>{let c=u.apply(r,p);return c===!1&&(c=a.apply(r,p)),c||\"\"}}s.renderer=r}if(n.tokenizer){let r=this.defaults.tokenizer||new P(this.defaults);for(let o in n.tokenizer){if(!(o in r))throw new Error(`tokenizer '${o}' does not exist`);if([\"options\",\"rules\",\"lexer\"].includes(o))continue;let i=o,u=n.tokenizer[i],a=r[i];r[i]=(...p)=>{let c=u.apply(r,p);return c===!1&&(c=a.apply(r,p)),c}}s.tokenizer=r}if(n.hooks){let r=this.defaults.hooks||new _;for(let o in n.hooks){if(!(o in r))throw new Error(`hook '${o}' does not exist`);if([\"options\",\"block\"].includes(o))continue;let i=o,u=n.hooks[i],a=r[i];_.passThroughHooks.has(o)?r[i]=p=>{if(this.defaults.async&&_.passThroughHooksRespectAsync.has(o))return(async()=>{let d=await u.call(r,p);return a.call(r,d)})();let c=u.call(r,p);return a.call(r,c)}:r[i]=(...p)=>{if(this.defaults.async)return(async()=>{let d=await u.apply(r,p);return d===!1&&(d=await a.apply(r,p)),d})();let c=u.apply(r,p);return c===!1&&(c=a.apply(r,p)),c}}s.hooks=r}if(n.walkTokens){let r=this.defaults.walkTokens,o=n.walkTokens;s.walkTokens=function(i){let u=[];return u.push(o.call(this,i)),r&&(u=u.concat(r.call(this,i))),u}}this.defaults={...this.defaults,...s}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return R.lex(e,t??this.defaults)}parser(e,t){return T.parse(e,t??this.defaults)}parseMarkdown(e){return(n,s)=>{let r={...s},o={...this.defaults,...r},i=this.onError(!!o.silent,!!o.async);if(this.defaults.async===!0&&r.async===!1)return i(new Error(\"marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.\"));if(typeof n>\"u\"||n===null)return i(new Error(\"marked(): input parameter is undefined or null\"));if(typeof n!=\"string\")return i(new Error(\"marked(): input parameter is of type \"+Object.prototype.toString.call(n)+\", string expected\"));if(o.hooks&&(o.hooks.options=o,o.hooks.block=e),o.async)return(async()=>{let u=o.hooks?await o.hooks.preprocess(n):n,p=await(o.hooks?await o.hooks.provideLexer(e):e?R.lex:R.lexInline)(u,o),c=o.hooks?await o.hooks.processAllTokens(p):p;o.walkTokens&&await Promise.all(this.walkTokens(c,o.walkTokens));let m=await(o.hooks?await o.hooks.provideParser(e):e?T.parse:T.parseInline)(c,o);return o.hooks?await o.hooks.postprocess(m):m})().catch(i);try{o.hooks&&(n=o.hooks.preprocess(n));let a=(o.hooks?o.hooks.provideLexer(e):e?R.lex:R.lexInline)(n,o);o.hooks&&(a=o.hooks.processAllTokens(a)),o.walkTokens&&this.walkTokens(a,o.walkTokens);let c=(o.hooks?o.hooks.provideParser(e):e?T.parse:T.parseInline)(a,o);return o.hooks&&(c=o.hooks.postprocess(c)),c}catch(u){return i(u)}}}onError(e,t){return n=>{if(n.message+=`\nPlease report this to https://github.com/markedjs/marked.`,e){let s=\"<p>An error occurred:</p><pre>\"+O(n.message+\"\",!0)+\"</pre>\";return t?Promise.resolve(s):s}if(t)return Promise.reject(n);throw n}}};var E=new F;function k(l,e){return E.parse(l,e)}k.options=k.setOptions=function(l){return E.setOptions(l),k.defaults=E.defaults,W(k.defaults),k};k.getDefaults=I;k.defaults=y;function Pt(...l){return E.use(...l),k.defaults=E.defaults,W(k.defaults),k}k.use=Pt;k.walkTokens=function(l,e){return E.walkTokens(l,e)};k.parseInline=E.parseInline;k.Parser=T;k.parser=T.parse;k.Renderer=S;k.TextRenderer=z;k.Lexer=R;k.lexer=R.lex;k.Tokenizer=P;k.Hooks=_;k.parse=k;var gn=k.options,fn=k.setOptions,mn=k.walkTokens,xn=k.parseInline,bn=k,Rn=T.parse,Tn=R.lex;export{_ as Hooks,R as Lexer,F as Marked,T as Parser,S as Renderer,z as TextRenderer,P as Tokenizer,y as defaults,I as getDefaults,Tn as lexer,k as marked,gn as options,bn as parse,xn as parseInline,Rn as parser,fn as setOptions,Pt as use,mn as walkTokens};\n//# sourceMappingURL=marked.esm.js.map\n","/*! @license DOMPurify 3.4.16 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.16/LICENSE */\nfunction _OverloadYield(e, d) {\n\tthis.v = e, this.k = d;\n}\nfunction _arrayLikeToArray(r, a) {\n\t(null == a || a > r.length) && (a = r.length);\n\tfor (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n\treturn n;\n}\nfunction _arrayWithHoles(r) {\n\tif (Array.isArray(r)) return r;\n}\nfunction _iterableToArrayLimit(r, l) {\n\tvar t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n\tif (null != t) {\n\t\tvar e, n, i, u, a = [], f = !0, o = !1;\n\t\ttry {\n\t\t\tif (i = (t = t.call(r)).next, 0 === l) {\n\t\t\t\tif (Object(t) !== t) return;\n\t\t\t\tf = !1;\n\t\t\t} else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n\t\t} catch (r) {\n\t\t\to = !0, n = r;\n\t\t} finally {\n\t\t\ttry {\n\t\t\t\tif (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;\n\t\t\t} finally {\n\t\t\t\tif (o) throw n;\n\t\t\t}\n\t\t}\n\t\treturn a;\n\t}\n}\nfunction _nonIterableRest() {\n\tthrow new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */\nfunction _slicedToArray(r, e) {\n\treturn _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();\n}\nfunction _unsupportedIterableToArray(r, a) {\n\tif (r) {\n\t\tif (\"string\" == typeof r) return _arrayLikeToArray(r, a);\n\t\tvar t = {}.toString.call(r).slice(8, -1);\n\t\treturn \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;\n\t}\n}\nfunction AsyncGenerator(e) {\n\tvar t, n;\n\tfunction resume(t, n) {\n\t\ttry {\n\t\t\tvar r = e[t](n), o = r.value, u = o instanceof _OverloadYield;\n\t\t\tPromise.resolve(u ? o.v : o).then(function(n) {\n\t\t\t\tif (u) {\n\t\t\t\t\tvar i = \"return\" === t && o.k ? t : \"next\";\n\t\t\t\t\tif (!o.k || n.done) return resume(i, n);\n\t\t\t\t\tn = e[i](n).value;\n\t\t\t\t}\n\t\t\t\tsettle(!!r.done, n);\n\t\t\t}, function(e) {\n\t\t\t\tresume(\"throw\", e);\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tsettle(2, e);\n\t\t}\n\t}\n\tfunction settle(e, r) {\n\t\t2 === e ? t.reject(r) : t.resolve({\n\t\t\tvalue: r,\n\t\t\tdone: e\n\t\t}), (t = t.next) ? resume(t.key, t.arg) : n = null;\n\t}\n\tthis._invoke = function(e, r) {\n\t\treturn new Promise(function(o, u) {\n\t\t\tvar i = {\n\t\t\t\tkey: e,\n\t\t\t\targ: r,\n\t\t\t\tresolve: o,\n\t\t\t\treject: u,\n\t\t\t\tnext: null\n\t\t\t};\n\t\t\tn ? n = n.next = i : (t = n = i, resume(e, r));\n\t\t});\n\t}, \"function\" != typeof e.return && (this.return = void 0);\n}\nAsyncGenerator.prototype[\"function\" == typeof Symbol && Symbol.asyncIterator || \"@@asyncIterator\"] = function() {\n\treturn this;\n}, AsyncGenerator.prototype.next = function(e) {\n\treturn this._invoke(\"next\", e);\n}, AsyncGenerator.prototype.throw = function(e) {\n\treturn this._invoke(\"throw\", e);\n}, AsyncGenerator.prototype.return = function(e) {\n\treturn this._invoke(\"return\", e);\n};\nconst entries = Object.entries;\nconst setPrototypeOf = Object.setPrototypeOf;\nconst isFrozen = Object.isFrozen;\nconst getPrototypeOf = Object.getPrototypeOf;\nconst getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nlet freeze = Object.freeze;\nlet seal = Object.seal;\nlet create = Object.create;\nlet _ref = typeof Reflect !== \"undefined\" && Reflect;\nlet apply = _ref.apply;\nlet construct = _ref.construct;\nif (!freeze) freeze = function freeze(x) {\n\treturn x;\n};\nif (!seal) seal = function seal(x) {\n\treturn x;\n};\nif (!apply) apply = function apply(func, thisArg) {\n\tfor (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) args[_key - 2] = arguments[_key];\n\treturn func.apply(thisArg, args);\n};\nif (!construct) construct = function construct(Func) {\n\tfor (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) args[_key2 - 1] = arguments[_key2];\n\treturn new Func(...args);\n};\nconst arrayForEach = unapply(Array.prototype.forEach);\nArray.prototype.indexOf;\nconst arrayLastIndexOf = unapply(Array.prototype.lastIndexOf);\nconst arrayPop = unapply(Array.prototype.pop);\nconst arrayPush = unapply(Array.prototype.push);\nArray.prototype.slice;\nconst arraySplice = unapply(Array.prototype.splice);\nconst arrayIsArray = Array.isArray;\nconst stringToLowerCase = unapply(String.prototype.toLowerCase);\nconst stringToString = unapply(String.prototype.toString);\nconst stringMatch = unapply(String.prototype.match);\nconst stringReplace = unapply(String.prototype.replace);\nconst stringIndexOf = unapply(String.prototype.indexOf);\nconst stringTrim = unapply(String.prototype.trim);\nconst numberToString = unapply(Number.prototype.toString);\nconst booleanToString = unapply(Boolean.prototype.toString);\nconst bigintToString = typeof BigInt === \"undefined\" ? null : unapply(BigInt.prototype.toString);\nconst symbolToString = typeof Symbol === \"undefined\" ? null : unapply(Symbol.prototype.toString);\nconst objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);\nconst objectToString = unapply(Object.prototype.toString);\nconst regExpTest = unapply(RegExp.prototype.test);\nconst typeErrorCreate = unconstruct(TypeError);\n/**\n* Creates a new function that calls the given function with a specified thisArg and arguments.\n*\n* @param func - The function to be wrapped and called.\n* @returns A new function that calls the given function with a specified thisArg and arguments.\n*/\nfunction unapply(func) {\n\treturn function(thisArg) {\n\t\tif (thisArg instanceof RegExp) thisArg.lastIndex = 0;\n\t\tfor (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) args[_key3 - 1] = arguments[_key3];\n\t\treturn apply(func, thisArg, args);\n\t};\n}\n/**\n* Creates a new function that constructs an instance of the given constructor function with the provided arguments.\n*\n* @param func - The constructor function to be wrapped and called.\n* @returns A new function that constructs an instance of the given constructor function with the provided arguments.\n*/\nfunction unconstruct(Func) {\n\treturn function() {\n\t\tfor (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) args[_key4] = arguments[_key4];\n\t\treturn construct(Func, args);\n\t};\n}\n/**\n* Add properties to a lookup table\n*\n* @param set - The set to which elements will be added.\n* @param array - The array containing elements to be added to the set.\n* @param transformCaseFunc - An optional function to transform the case of each element before adding to the set.\n* @returns The modified set with added elements.\n*/\nfunction addToSet(set, array) {\n\tlet transformCaseFunc = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : stringToLowerCase;\n\tif (setPrototypeOf) setPrototypeOf(set, null);\n\tif (!arrayIsArray(array)) return set;\n\tlet l = array.length;\n\twhile (l--) {\n\t\tlet element = array[l];\n\t\tif (typeof element === \"string\") {\n\t\t\tconst lcElement = transformCaseFunc(element);\n\t\t\tif (lcElement !== element) {\n\t\t\t\tif (!isFrozen(array)) array[l] = lcElement;\n\t\t\t\telement = lcElement;\n\t\t\t}\n\t\t}\n\t\tset[element] = true;\n\t}\n\treturn set;\n}\n/**\n* Clean up an array to harden against CSPP\n*\n* @param array - The array to be cleaned.\n* @returns The cleaned version of the array\n*/\nfunction cleanArray(array) {\n\tfor (let index = 0; index < array.length; index++) if (!objectHasOwnProperty(array, index)) array[index] = null;\n\treturn array;\n}\n/**\n* Shallow clone an object\n*\n* @param object - The object to be cloned.\n* @returns A new object that copies the original.\n*/\nfunction clone(object) {\n\tconst newObject = create(null);\n\tfor (const _ref2 of entries(object)) {\n\t\tvar _ref3 = _slicedToArray(_ref2, 2);\n\t\tconst property = _ref3[0];\n\t\tconst value = _ref3[1];\n\t\tif (objectHasOwnProperty(object, property)) {\n\t\t\tif (arrayIsArray(value)) newObject[property] = cleanArray(value);\n\t\t\telse if (value && typeof value === \"object\" && value.constructor === Object) newObject[property] = clone(value);\n\t\t\telse newObject[property] = value;\n\t\t}\n\t}\n\treturn newObject;\n}\n/**\n* Convert non-node values into strings without depending on direct property access.\n*\n* @param value - The value to stringify.\n* @returns A string representation of the provided value.\n*/\nfunction stringifyValue(value) {\n\tswitch (typeof value) {\n\t\tcase \"string\": return value;\n\t\tcase \"number\": return numberToString(value);\n\t\tcase \"boolean\": return booleanToString(value);\n\t\tcase \"bigint\": return bigintToString ? bigintToString(value) : \"0\";\n\t\tcase \"symbol\": return symbolToString ? symbolToString(value) : \"Symbol()\";\n\t\tcase \"undefined\": return objectToString(value);\n\t\tcase \"function\":\n\t\tcase \"object\": {\n\t\t\tif (value === null) return objectToString(value);\n\t\t\tconst valueAsRecord = value;\n\t\t\tconst valueToString = lookupGetter(valueAsRecord, \"toString\");\n\t\t\tif (typeof valueToString === \"function\") {\n\t\t\t\tconst stringified = valueToString(valueAsRecord);\n\t\t\t\treturn typeof stringified === \"string\" ? stringified : objectToString(stringified);\n\t\t\t}\n\t\t\treturn objectToString(value);\n\t\t}\n\t\tdefault: return objectToString(value);\n\t}\n}\n/**\n* This method automatically checks if the prop is function or getter and behaves accordingly.\n*\n* @param object - The object to look up the getter function in its prototype chain.\n* @param prop - The property name for which to find the getter function.\n* @returns The getter function found in the prototype chain or a fallback function.\n*/\nfunction lookupGetter(object, prop) {\n\twhile (object !== null) {\n\t\tconst desc = getOwnPropertyDescriptor(object, prop);\n\t\tif (desc) {\n\t\t\tif (desc.get) return unapply(desc.get);\n\t\t\tif (typeof desc.value === \"function\") return unapply(desc.value);\n\t\t}\n\t\tobject = getPrototypeOf(object);\n\t}\n\tfunction fallbackValue() {\n\t\treturn null;\n\t}\n\treturn fallbackValue;\n}\nfunction isRegex(value) {\n\ttry {\n\t\tregExpTest(value, \"\");\n\t\treturn true;\n\t} catch (_unused) {\n\t\treturn false;\n\t}\n}\nconst html$1 = freeze([\n\t\"a\",\n\t\"abbr\",\n\t\"acronym\",\n\t\"address\",\n\t\"area\",\n\t\"article\",\n\t\"aside\",\n\t\"audio\",\n\t\"b\",\n\t\"bdi\",\n\t\"bdo\",\n\t\"big\",\n\t\"blink\",\n\t\"blockquote\",\n\t\"body\",\n\t\"br\",\n\t\"button\",\n\t\"canvas\",\n\t\"caption\",\n\t\"center\",\n\t\"cite\",\n\t\"code\",\n\t\"col\",\n\t\"colgroup\",\n\t\"content\",\n\t\"data\",\n\t\"datalist\",\n\t\"dd\",\n\t\"decorator\",\n\t\"del\",\n\t\"details\",\n\t\"dfn\",\n\t\"dialog\",\n\t\"dir\",\n\t\"div\",\n\t\"dl\",\n\t\"dt\",\n\t\"element\",\n\t\"em\",\n\t\"fieldset\",\n\t\"figcaption\",\n\t\"figure\",\n\t\"font\",\n\t\"footer\",\n\t\"form\",\n\t\"h1\",\n\t\"h2\",\n\t\"h3\",\n\t\"h4\",\n\t\"h5\",\n\t\"h6\",\n\t\"head\",\n\t\"header\",\n\t\"hgroup\",\n\t\"hr\",\n\t\"html\",\n\t\"i\",\n\t\"img\",\n\t\"input\",\n\t\"ins\",\n\t\"kbd\",\n\t\"label\",\n\t\"legend\",\n\t\"li\",\n\t\"main\",\n\t\"map\",\n\t\"mark\",\n\t\"marquee\",\n\t\"menu\",\n\t\"menuitem\",\n\t\"meter\",\n\t\"nav\",\n\t\"nobr\",\n\t\"ol\",\n\t\"optgroup\",\n\t\"option\",\n\t\"output\",\n\t\"p\",\n\t\"picture\",\n\t\"pre\",\n\t\"progress\",\n\t\"q\",\n\t\"rp\",\n\t\"rt\",\n\t\"ruby\",\n\t\"s\",\n\t\"samp\",\n\t\"search\",\n\t\"section\",\n\t\"select\",\n\t\"shadow\",\n\t\"slot\",\n\t\"small\",\n\t\"source\",\n\t\"spacer\",\n\t\"span\",\n\t\"strike\",\n\t\"strong\",\n\t\"style\",\n\t\"sub\",\n\t\"summary\",\n\t\"sup\",\n\t\"table\",\n\t\"tbody\",\n\t\"td\",\n\t\"template\",\n\t\"textarea\",\n\t\"tfoot\",\n\t\"th\",\n\t\"thead\",\n\t\"time\",\n\t\"tr\",\n\t\"track\",\n\t\"tt\",\n\t\"u\",\n\t\"ul\",\n\t\"var\",\n\t\"video\",\n\t\"wbr\"\n]);\nconst svg$1 = freeze([\n\t\"svg\",\n\t\"a\",\n\t\"altglyph\",\n\t\"altglyphdef\",\n\t\"altglyphitem\",\n\t\"animatecolor\",\n\t\"animatemotion\",\n\t\"animatetransform\",\n\t\"circle\",\n\t\"clippath\",\n\t\"defs\",\n\t\"desc\",\n\t\"ellipse\",\n\t\"enterkeyhint\",\n\t\"exportparts\",\n\t\"filter\",\n\t\"font\",\n\t\"g\",\n\t\"glyph\",\n\t\"glyphref\",\n\t\"hkern\",\n\t\"image\",\n\t\"inputmode\",\n\t\"line\",\n\t\"lineargradient\",\n\t\"marker\",\n\t\"mask\",\n\t\"metadata\",\n\t\"mpath\",\n\t\"part\",\n\t\"path\",\n\t\"pattern\",\n\t\"polygon\",\n\t\"polyline\",\n\t\"radialgradient\",\n\t\"rect\",\n\t\"stop\",\n\t\"style\",\n\t\"switch\",\n\t\"symbol\",\n\t\"text\",\n\t\"textpath\",\n\t\"title\",\n\t\"tref\",\n\t\"tspan\",\n\t\"view\",\n\t\"vkern\"\n]);\nconst svgFilters = freeze([\n\t\"feBlend\",\n\t\"feColorMatrix\",\n\t\"feComponentTransfer\",\n\t\"feComposite\",\n\t\"feConvolveMatrix\",\n\t\"feDiffuseLighting\",\n\t\"feDisplacementMap\",\n\t\"feDistantLight\",\n\t\"feDropShadow\",\n\t\"feFlood\",\n\t\"feFuncA\",\n\t\"feFuncB\",\n\t\"feFuncG\",\n\t\"feFuncR\",\n\t\"feGaussianBlur\",\n\t\"feImage\",\n\t\"feMerge\",\n\t\"feMergeNode\",\n\t\"feMorphology\",\n\t\"feOffset\",\n\t\"fePointLight\",\n\t\"feSpecularLighting\",\n\t\"feSpotLight\",\n\t\"feTile\",\n\t\"feTurbulence\"\n]);\nconst svgDisallowed = freeze([\n\t\"animate\",\n\t\"color-profile\",\n\t\"cursor\",\n\t\"discard\",\n\t\"font-face\",\n\t\"font-face-format\",\n\t\"font-face-name\",\n\t\"font-face-src\",\n\t\"font-face-uri\",\n\t\"foreignobject\",\n\t\"hatch\",\n\t\"hatchpath\",\n\t\"mesh\",\n\t\"meshgradient\",\n\t\"meshpatch\",\n\t\"meshrow\",\n\t\"missing-glyph\",\n\t\"script\",\n\t\"set\",\n\t\"solidcolor\",\n\t\"unknown\",\n\t\"use\"\n]);\nconst mathMl$1 = freeze([\n\t\"math\",\n\t\"menclose\",\n\t\"merror\",\n\t\"mfenced\",\n\t\"mfrac\",\n\t\"mglyph\",\n\t\"mi\",\n\t\"mlabeledtr\",\n\t\"mmultiscripts\",\n\t\"mn\",\n\t\"mo\",\n\t\"mover\",\n\t\"mpadded\",\n\t\"mphantom\",\n\t\"mroot\",\n\t\"mrow\",\n\t\"ms\",\n\t\"mspace\",\n\t\"msqrt\",\n\t\"mstyle\",\n\t\"msub\",\n\t\"msup\",\n\t\"msubsup\",\n\t\"mtable\",\n\t\"mtd\",\n\t\"mtext\",\n\t\"mtr\",\n\t\"munder\",\n\t\"munderover\",\n\t\"mprescripts\"\n]);\nconst mathMlDisallowed = freeze([\n\t\"maction\",\n\t\"maligngroup\",\n\t\"malignmark\",\n\t\"mlongdiv\",\n\t\"mscarries\",\n\t\"mscarry\",\n\t\"msgroup\",\n\t\"mstack\",\n\t\"msline\",\n\t\"msrow\",\n\t\"semantics\",\n\t\"annotation\",\n\t\"annotation-xml\",\n\t\"mprescripts\",\n\t\"none\"\n]);\nconst text = freeze([\"#text\"]);\nconst html = freeze([\n\t\"accept\",\n\t\"action\",\n\t\"align\",\n\t\"alt\",\n\t\"autocapitalize\",\n\t\"autocomplete\",\n\t\"autopictureinpicture\",\n\t\"autoplay\",\n\t\"background\",\n\t\"bgcolor\",\n\t\"border\",\n\t\"capture\",\n\t\"cellpadding\",\n\t\"cellspacing\",\n\t\"checked\",\n\t\"cite\",\n\t\"class\",\n\t\"clear\",\n\t\"color\",\n\t\"cols\",\n\t\"colspan\",\n\t\"command\",\n\t\"commandfor\",\n\t\"controls\",\n\t\"controlslist\",\n\t\"coords\",\n\t\"crossorigin\",\n\t\"datetime\",\n\t\"decoding\",\n\t\"default\",\n\t\"dir\",\n\t\"disabled\",\n\t\"disablepictureinpicture\",\n\t\"disableremoteplayback\",\n\t\"download\",\n\t\"draggable\",\n\t\"enctype\",\n\t\"enterkeyhint\",\n\t\"exportparts\",\n\t\"face\",\n\t\"for\",\n\t\"headers\",\n\t\"height\",\n\t\"hidden\",\n\t\"high\",\n\t\"href\",\n\t\"hreflang\",\n\t\"id\",\n\t\"inert\",\n\t\"inputmode\",\n\t\"integrity\",\n\t\"ismap\",\n\t\"kind\",\n\t\"label\",\n\t\"lang\",\n\t\"list\",\n\t\"loading\",\n\t\"loop\",\n\t\"low\",\n\t\"max\",\n\t\"maxlength\",\n\t\"media\",\n\t\"method\",\n\t\"min\",\n\t\"minlength\",\n\t\"multiple\",\n\t\"muted\",\n\t\"name\",\n\t\"nonce\",\n\t\"noshade\",\n\t\"novalidate\",\n\t\"nowrap\",\n\t\"open\",\n\t\"optimum\",\n\t\"part\",\n\t\"pattern\",\n\t\"placeholder\",\n\t\"playsinline\",\n\t\"popover\",\n\t\"popovertarget\",\n\t\"popovertargetaction\",\n\t\"poster\",\n\t\"preload\",\n\t\"pubdate\",\n\t\"radiogroup\",\n\t\"readonly\",\n\t\"rel\",\n\t\"required\",\n\t\"rev\",\n\t\"reversed\",\n\t\"role\",\n\t\"rows\",\n\t\"rowspan\",\n\t\"spellcheck\",\n\t\"scope\",\n\t\"selected\",\n\t\"shape\",\n\t\"size\",\n\t\"sizes\",\n\t\"slot\",\n\t\"span\",\n\t\"srclang\",\n\t\"start\",\n\t\"src\",\n\t\"srcset\",\n\t\"step\",\n\t\"style\",\n\t\"summary\",\n\t\"tabindex\",\n\t\"title\",\n\t\"translate\",\n\t\"type\",\n\t\"usemap\",\n\t\"valign\",\n\t\"value\",\n\t\"width\",\n\t\"wrap\",\n\t\"xmlns\"\n]);\nconst svg = freeze([\n\t\"accent-height\",\n\t\"accumulate\",\n\t\"additive\",\n\t\"alignment-baseline\",\n\t\"amplitude\",\n\t\"ascent\",\n\t\"attributename\",\n\t\"attributetype\",\n\t\"azimuth\",\n\t\"basefrequency\",\n\t\"baseline-shift\",\n\t\"begin\",\n\t\"bias\",\n\t\"by\",\n\t\"class\",\n\t\"clip\",\n\t\"clippathunits\",\n\t\"clip-path\",\n\t\"clip-rule\",\n\t\"color\",\n\t\"color-interpolation\",\n\t\"color-interpolation-filters\",\n\t\"color-profile\",\n\t\"color-rendering\",\n\t\"cx\",\n\t\"cy\",\n\t\"d\",\n\t\"dx\",\n\t\"dy\",\n\t\"diffuseconstant\",\n\t\"direction\",\n\t\"display\",\n\t\"divisor\",\n\t\"dominant-baseline\",\n\t\"dur\",\n\t\"edgemode\",\n\t\"elevation\",\n\t\"end\",\n\t\"exponent\",\n\t\"fill\",\n\t\"fill-opacity\",\n\t\"fill-rule\",\n\t\"filter\",\n\t\"filterunits\",\n\t\"flood-color\",\n\t\"flood-opacity\",\n\t\"font-family\",\n\t\"font-size\",\n\t\"font-size-adjust\",\n\t\"font-stretch\",\n\t\"font-style\",\n\t\"font-variant\",\n\t\"font-weight\",\n\t\"fx\",\n\t\"fy\",\n\t\"g1\",\n\t\"g2\",\n\t\"glyph-name\",\n\t\"glyphref\",\n\t\"gradientunits\",\n\t\"gradienttransform\",\n\t\"height\",\n\t\"href\",\n\t\"id\",\n\t\"image-rendering\",\n\t\"in\",\n\t\"in2\",\n\t\"intercept\",\n\t\"k\",\n\t\"k1\",\n\t\"k2\",\n\t\"k3\",\n\t\"k4\",\n\t\"kerning\",\n\t\"keypoints\",\n\t\"keysplines\",\n\t\"keytimes\",\n\t\"lang\",\n\t\"lengthadjust\",\n\t\"letter-spacing\",\n\t\"kernelmatrix\",\n\t\"kernelunitlength\",\n\t\"lighting-color\",\n\t\"local\",\n\t\"marker-end\",\n\t\"marker-mid\",\n\t\"marker-start\",\n\t\"markerheight\",\n\t\"markerunits\",\n\t\"markerwidth\",\n\t\"maskcontentunits\",\n\t\"maskunits\",\n\t\"max\",\n\t\"mask\",\n\t\"mask-type\",\n\t\"media\",\n\t\"method\",\n\t\"mode\",\n\t\"min\",\n\t\"name\",\n\t\"numoctaves\",\n\t\"offset\",\n\t\"operator\",\n\t\"opacity\",\n\t\"order\",\n\t\"orient\",\n\t\"orientation\",\n\t\"origin\",\n\t\"overflow\",\n\t\"paint-order\",\n\t\"path\",\n\t\"pathlength\",\n\t\"patterncontentunits\",\n\t\"patterntransform\",\n\t\"patternunits\",\n\t\"pointer-events\",\n\t\"points\",\n\t\"preservealpha\",\n\t\"preserveaspectratio\",\n\t\"primitiveunits\",\n\t\"r\",\n\t\"rx\",\n\t\"ry\",\n\t\"radius\",\n\t\"refx\",\n\t\"refy\",\n\t\"repeatcount\",\n\t\"repeatdur\",\n\t\"restart\",\n\t\"result\",\n\t\"rotate\",\n\t\"scale\",\n\t\"seed\",\n\t\"shape-rendering\",\n\t\"slope\",\n\t\"specularconstant\",\n\t\"specularexponent\",\n\t\"spreadmethod\",\n\t\"startoffset\",\n\t\"stddeviation\",\n\t\"stitchtiles\",\n\t\"stop-color\",\n\t\"stop-opacity\",\n\t\"stroke-dasharray\",\n\t\"stroke-dashoffset\",\n\t\"stroke-linecap\",\n\t\"stroke-linejoin\",\n\t\"stroke-miterlimit\",\n\t\"stroke-opacity\",\n\t\"stroke\",\n\t\"stroke-width\",\n\t\"style\",\n\t\"surfacescale\",\n\t\"systemlanguage\",\n\t\"tabindex\",\n\t\"tablevalues\",\n\t\"targetx\",\n\t\"targety\",\n\t\"transform\",\n\t\"transform-origin\",\n\t\"text-anchor\",\n\t\"text-decoration\",\n\t\"text-orientation\",\n\t\"text-rendering\",\n\t\"textlength\",\n\t\"type\",\n\t\"u1\",\n\t\"u2\",\n\t\"unicode\",\n\t\"values\",\n\t\"vector-effect\",\n\t\"viewbox\",\n\t\"visibility\",\n\t\"version\",\n\t\"vert-adv-y\",\n\t\"vert-origin-x\",\n\t\"vert-origin-y\",\n\t\"width\",\n\t\"word-spacing\",\n\t\"wrap\",\n\t\"writing-mode\",\n\t\"xchannelselector\",\n\t\"ychannelselector\",\n\t\"x\",\n\t\"x1\",\n\t\"x2\",\n\t\"xmlns\",\n\t\"y\",\n\t\"y1\",\n\t\"y2\",\n\t\"z\",\n\t\"zoomandpan\"\n]);\nconst mathMl = freeze([\n\t\"accent\",\n\t\"accentunder\",\n\t\"align\",\n\t\"bevelled\",\n\t\"close\",\n\t\"columnalign\",\n\t\"columnlines\",\n\t\"columnspacing\",\n\t\"columnspan\",\n\t\"denomalign\",\n\t\"depth\",\n\t\"dir\",\n\t\"display\",\n\t\"displaystyle\",\n\t\"encoding\",\n\t\"fence\",\n\t\"frame\",\n\t\"height\",\n\t\"href\",\n\t\"id\",\n\t\"largeop\",\n\t\"length\",\n\t\"linethickness\",\n\t\"lquote\",\n\t\"lspace\",\n\t\"mathbackground\",\n\t\"mathcolor\",\n\t\"mathsize\",\n\t\"mathvariant\",\n\t\"maxsize\",\n\t\"minsize\",\n\t\"movablelimits\",\n\t\"notation\",\n\t\"numalign\",\n\t\"open\",\n\t\"rowalign\",\n\t\"rowlines\",\n\t\"rowspacing\",\n\t\"rowspan\",\n\t\"rspace\",\n\t\"rquote\",\n\t\"scriptlevel\",\n\t\"scriptminsize\",\n\t\"scriptsizemultiplier\",\n\t\"selection\",\n\t\"separator\",\n\t\"separators\",\n\t\"stretchy\",\n\t\"subscriptshift\",\n\t\"supscriptshift\",\n\t\"symmetric\",\n\t\"voffset\",\n\t\"width\",\n\t\"xmlns\"\n]);\nconst xml = freeze([\n\t\"xlink:href\",\n\t\"xml:id\",\n\t\"xlink:title\",\n\t\"xml:space\",\n\t\"xmlns:xlink\"\n]);\nconst MUSTACHE_EXPR = seal(/{{[\\w\\W]*|^[\\w\\W]*}}/g);\nconst ERB_EXPR = seal(/<%[\\w\\W]*|^[\\w\\W]*%>/g);\nconst TMPLIT_EXPR = seal(/\\${[\\w\\W]*/g);\nconst DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]+$/);\nconst ARIA_ATTR = seal(/^aria-[\\-\\w]+$/);\nconst IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i);\nconst IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\nconst ATTR_WHITESPACE = seal(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g);\nconst DOCTYPE_NAME = seal(/^html$/i);\nconst CUSTOM_ELEMENT = seal(/^[a-z][.\\w]*(-[.\\w]+)+$/i);\nconst ELEMENT_MARKUP_PROBE = seal(/<[/\\w!]/g);\nconst COMMENT_MARKUP_PROBE = seal(/<[/\\w]/g);\nconst FALLBACK_TAG_CLOSE = seal(/<\\/no(script|embed|frames)/i);\nconst SELF_CLOSING_TAG = seal(/\\/>/i);\nconst NODE_TYPE = {\n\telement: 1,\n\tattribute: 2,\n\ttext: 3,\n\tcdataSection: 4,\n\tentityReference: 5,\n\tentityNode: 6,\n\tprocessingInstruction: 7,\n\tcomment: 8,\n\tdocument: 9,\n\tdocumentType: 10,\n\tdocumentFragment: 11,\n\tnotation: 12\n};\nconst LITERAL_TEXT_ELEMENT_NAMES = [\n\t\"style\",\n\t\"script\",\n\t\"xmp\",\n\t\"iframe\",\n\t\"noembed\",\n\t\"noframes\",\n\t\"plaintext\",\n\t\"noscript\"\n];\nconst LITERAL_TEXT_ELEMENTS = freeze(addToSet({}, LITERAL_TEXT_ELEMENT_NAMES));\nconst LITERAL_TEXT_CLOSE = function() {\n\tconst map = {};\n\tarrayForEach(LITERAL_TEXT_ELEMENT_NAMES, (name) => {\n\t\tmap[name] = seal(new RegExp(\"</\" + name + \"(?=[\\\\t\\\\n\\\\f\\\\r />])\", \"i\"));\n\t});\n\treturn freeze(map);\n}();\nconst getGlobal = function getGlobal() {\n\treturn typeof window === \"undefined\" ? null : window;\n};\n/**\n* Creates a no-op policy for internal use only.\n* Don't export this function outside this module!\n* @param trustedTypes The policy factory.\n* @param purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix).\n* @return The policy created (or null, if Trusted Types\n* are not supported or creating the policy failed).\n*/\nconst _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, purifyHostElement) {\n\tif (typeof trustedTypes !== \"object\" || typeof trustedTypes.createPolicy !== \"function\") return null;\n\tlet suffix = null;\n\tconst ATTR_NAME = \"data-tt-policy-suffix\";\n\tif (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) suffix = purifyHostElement.getAttribute(ATTR_NAME);\n\tconst policyName = \"dompurify\" + (suffix ? \"#\" + suffix : \"\");\n\ttry {\n\t\treturn trustedTypes.createPolicy(policyName, {\n\t\t\tcreateHTML(html) {\n\t\t\t\treturn html;\n\t\t\t},\n\t\t\tcreateScriptURL(scriptUrl) {\n\t\t\t\treturn scriptUrl;\n\t\t\t}\n\t\t});\n\t} catch (_) {\n\t\tconsole.warn(\"TrustedTypes policy \" + policyName + \" could not be created.\");\n\t\treturn null;\n\t}\n};\nconst _createHooksMap = function _createHooksMap() {\n\treturn {\n\t\tafterSanitizeAttributes: [],\n\t\tafterSanitizeElements: [],\n\t\tafterSanitizeShadowDOM: [],\n\t\tbeforeSanitizeAttributes: [],\n\t\tbeforeSanitizeElements: [],\n\t\tbeforeSanitizeShadowDOM: [],\n\t\tuponSanitizeAttribute: [],\n\t\tuponSanitizeElement: [],\n\t\tuponSanitizeShadowNode: []\n\t};\n};\n/**\n* Resolve a set-valued configuration option: a fresh set built from\n* cfg[key] when it is an own array property (seeded with a clone of\n* options.base when given, case-normalized via options.transform),\n* the fallback set otherwise.\n*\n* @param cfg the cloned, prototype-free configuration object\n* @param key the configuration property to read\n* @param fallback the set to use when the option is absent or not an array\n* @param options transform and optional base set to merge into\n* @returns the resolved set\n*/\nconst _resolveSetOption = function _resolveSetOption(cfg, key, fallback, options) {\n\treturn objectHasOwnProperty(cfg, key) && arrayIsArray(cfg[key]) ? addToSet(options.base ? clone(options.base) : {}, cfg[key], options.transform) : fallback;\n};\n/**\n* Resolve an object-valued configuration option: a prototype-free clone\n* of cfg[key] when it is an own, truthy object property, else a fresh\n* fallback built by makeFallback (fresh on every parse, so a previous\n* parse can never leak state into the next one).\n*\n* @param cfg the cloned, prototype-free configuration object\n* @param key the configuration property to read\n* @param makeFallback builds the fallback value when the option is absent\n* @returns the resolved object\n*/\nconst _resolveObjectOption = function _resolveObjectOption(cfg, key, makeFallback) {\n\tconst value = objectHasOwnProperty(cfg, key) ? cfg[key] : void 0;\n\treturn value && typeof value === \"object\" ? clone(value) : makeFallback();\n};\nfunction createDOMPurify() {\n\tlet window = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : getGlobal();\n\tconst DOMPurify = (root) => createDOMPurify(root);\n\tDOMPurify.version = \"3.4.16\";\n\tDOMPurify.removed = [];\n\tif (!window || !window.document || window.document.nodeType !== NODE_TYPE.document || !window.Element) {\n\t\tDOMPurify.isSupported = false;\n\t\treturn DOMPurify;\n\t}\n\tlet document = window.document;\n\tconst originalDocument = document;\n\tconst currentScript = originalDocument.currentScript;\n\twindow.DocumentFragment;\n\tconst HTMLTemplateElement = window.HTMLTemplateElement, Node = window.Node, Element = window.Element, NodeFilter = window.NodeFilter;\n\twindow.NamedNodeMap === void 0 && (window.NamedNodeMap || window.MozNamedAttrMap);\n\twindow.HTMLFormElement;\n\tconst DOMParser = window.DOMParser, trustedTypes = window.trustedTypes;\n\tconst ElementPrototype = Element.prototype;\n\tconst cloneNode = lookupGetter(ElementPrototype, \"cloneNode\");\n\tconst remove = lookupGetter(ElementPrototype, \"remove\");\n\tconst removeAttributeNode = lookupGetter(ElementPrototype, \"removeAttributeNode\");\n\tconst getNextSibling = lookupGetter(ElementPrototype, \"nextSibling\");\n\tconst getChildNodes = lookupGetter(ElementPrototype, \"childNodes\");\n\tconst getParentNode = lookupGetter(ElementPrototype, \"parentNode\");\n\tconst getShadowRoot = lookupGetter(ElementPrototype, \"shadowRoot\");\n\tconst getAttributes = lookupGetter(ElementPrototype, \"attributes\");\n\tconst getNodeType = Node && Node.prototype ? lookupGetter(Node.prototype, \"nodeType\") : null;\n\tconst getNodeName = Node && Node.prototype ? lookupGetter(Node.prototype, \"nodeName\") : null;\n\tconst getOwnerDocument = Node && Node.prototype ? lookupGetter(Node.prototype, \"ownerDocument\") : null;\n\tconst _readNodeType = function _readNodeType(node) {\n\t\treturn getNodeType ? getNodeType(node) : node.nodeType;\n\t};\n\tconst _readNodeName = function _readNodeName(node) {\n\t\treturn getNodeName ? getNodeName(node) : node.nodeName;\n\t};\n\tif (typeof HTMLTemplateElement === \"function\") {\n\t\tconst template = document.createElement(\"template\");\n\t\tif (template.content && template.content.ownerDocument) document = template.content.ownerDocument;\n\t}\n\tlet trustedTypesPolicy;\n\tlet emptyHTML = \"\";\n\tlet defaultTrustedTypesPolicy;\n\tlet defaultTrustedTypesPolicyResolved = false;\n\tlet IN_TRUSTED_TYPES_POLICY = 0;\n\tconst _assertNotInTrustedTypesPolicy = function _assertNotInTrustedTypesPolicy() {\n\t\tif (IN_TRUSTED_TYPES_POLICY > 0) throw typeErrorCreate(\"A configured TRUSTED_TYPES_POLICY callback (createHTML or createScriptURL) must not call DOMPurify.sanitize, as that causes infinite recursion. Do not pass a policy whose callbacks wrap DOMPurify as TRUSTED_TYPES_POLICY; see the \\\"DOMPurify and Trusted Types\\\" section of the README.\");\n\t};\n\tconst _createTrustedHTML = function _createTrustedHTML(html) {\n\t\t_assertNotInTrustedTypesPolicy();\n\t\tIN_TRUSTED_TYPES_POLICY++;\n\t\ttry {\n\t\t\treturn trustedTypesPolicy.createHTML(html);\n\t\t} finally {\n\t\t\tIN_TRUSTED_TYPES_POLICY--;\n\t\t}\n\t};\n\tconst _createTrustedScriptURL = function _createTrustedScriptURL(scriptUrl) {\n\t\t_assertNotInTrustedTypesPolicy();\n\t\tIN_TRUSTED_TYPES_POLICY++;\n\t\ttry {\n\t\t\treturn trustedTypesPolicy.createScriptURL(scriptUrl);\n\t\t} finally {\n\t\t\tIN_TRUSTED_TYPES_POLICY--;\n\t\t}\n\t};\n\tconst _getDefaultTrustedTypesPolicy = function _getDefaultTrustedTypesPolicy() {\n\t\tif (!defaultTrustedTypesPolicyResolved) {\n\t\t\tdefaultTrustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript);\n\t\t\tdefaultTrustedTypesPolicyResolved = true;\n\t\t}\n\t\treturn defaultTrustedTypesPolicy;\n\t};\n\tconst _document = document, implementation = _document.implementation, createNodeIterator = _document.createNodeIterator, createDocumentFragment = _document.createDocumentFragment, getElementsByTagName = _document.getElementsByTagName;\n\tconst importNode = originalDocument.importNode;\n\tlet hooks = _createHooksMap();\n\t/**\n\t* Expose whether this browser supports running the full DOMPurify.\n\t*/\n\tDOMPurify.isSupported = typeof entries === \"function\" && typeof getParentNode === \"function\" && implementation && implementation.createHTMLDocument !== void 0;\n\tconst MUSTACHE_EXPR$1 = MUSTACHE_EXPR, ERB_EXPR$1 = ERB_EXPR, TMPLIT_EXPR$1 = TMPLIT_EXPR, DATA_ATTR$1 = DATA_ATTR, ARIA_ATTR$1 = ARIA_ATTR, IS_SCRIPT_OR_DATA$1 = IS_SCRIPT_OR_DATA, ATTR_WHITESPACE$1 = ATTR_WHITESPACE, CUSTOM_ELEMENT$1 = CUSTOM_ELEMENT;\n\tlet IS_ALLOWED_URI$1 = IS_ALLOWED_URI;\n\t/**\n\t* We consider the elements and attributes below to be safe. Ideally\n\t* don't add any new ones but feel free to remove unwanted ones.\n\t*/\n\tlet ALLOWED_TAGS = null;\n\tconst DEFAULT_ALLOWED_TAGS = addToSet({}, [\n\t\t...html$1,\n\t\t...svg$1,\n\t\t...svgFilters,\n\t\t...mathMl$1,\n\t\t...text\n\t]);\n\tlet ALLOWED_ATTR = null;\n\tconst DEFAULT_ALLOWED_ATTR = addToSet({}, [\n\t\t...html,\n\t\t...svg,\n\t\t...mathMl,\n\t\t...xml\n\t]);\n\tlet CUSTOM_ELEMENT_HANDLING = Object.seal(create(null, {\n\t\ttagNameCheck: {\n\t\t\twritable: true,\n\t\t\tconfigurable: false,\n\t\t\tenumerable: true,\n\t\t\tvalue: null\n\t\t},\n\t\tattributeNameCheck: {\n\t\t\twritable: true,\n\t\t\tconfigurable: false,\n\t\t\tenumerable: true,\n\t\t\tvalue: null\n\t\t},\n\t\tallowCustomizedBuiltInElements: {\n\t\t\twritable: true,\n\t\t\tconfigurable: false,\n\t\t\tenumerable: true,\n\t\t\tvalue: false\n\t\t}\n\t}));\n\tlet FORBID_TAGS = null;\n\tlet FORBID_ATTR = null;\n\tconst EXTRA_ELEMENT_HANDLING = Object.seal(create(null, {\n\t\ttagCheck: {\n\t\t\twritable: true,\n\t\t\tconfigurable: false,\n\t\t\tenumerable: true,\n\t\t\tvalue: null\n\t\t},\n\t\tattributeCheck: {\n\t\t\twritable: true,\n\t\t\tconfigurable: false,\n\t\t\tenumerable: true,\n\t\t\tvalue: null\n\t\t}\n\t}));\n\tlet ALLOW_ARIA_ATTR = true;\n\tlet ALLOW_DATA_ATTR = true;\n\tlet ALLOW_UNKNOWN_PROTOCOLS = false;\n\tlet ALLOW_SELF_CLOSE_IN_ATTR = true;\n\tlet SAFE_FOR_TEMPLATES = false;\n\tlet SAFE_FOR_XML = true;\n\tlet WHOLE_DOCUMENT = false;\n\tlet SET_CONFIG = false;\n\tlet SET_CONFIG_ALLOWED_TAGS = null;\n\tlet SET_CONFIG_ALLOWED_ATTR = null;\n\tlet FORCE_BODY = false;\n\tlet RETURN_DOM = false;\n\tlet RETURN_DOM_FRAGMENT = false;\n\tlet RETURN_TRUSTED_TYPE = false;\n\tlet SANITIZE_DOM = true;\n\tlet SANITIZE_NAMED_PROPS = false;\n\tconst SANITIZE_NAMED_PROPS_PREFIX = \"user-content-\";\n\tlet KEEP_CONTENT = true;\n\tlet IN_PLACE = false;\n\tlet USE_PROFILES = {};\n\tlet FORBID_CONTENTS = null;\n\tconst DEFAULT_FORBID_CONTENTS = addToSet({}, [\n\t\t\"annotation-xml\",\n\t\t\"audio\",\n\t\t\"colgroup\",\n\t\t\"desc\",\n\t\t\"foreignobject\",\n\t\t\"head\",\n\t\t\"iframe\",\n\t\t\"math\",\n\t\t\"mi\",\n\t\t\"mn\",\n\t\t\"mo\",\n\t\t\"ms\",\n\t\t\"mtext\",\n\t\t\"noembed\",\n\t\t\"noframes\",\n\t\t\"noscript\",\n\t\t\"plaintext\",\n\t\t\"script\",\n\t\t\"selectedcontent\",\n\t\t\"style\",\n\t\t\"svg\",\n\t\t\"template\",\n\t\t\"thead\",\n\t\t\"title\",\n\t\t\"video\",\n\t\t\"xmp\"\n\t]);\n\tlet DATA_URI_TAGS = null;\n\tconst DEFAULT_DATA_URI_TAGS = addToSet({}, [\n\t\t\"audio\",\n\t\t\"video\",\n\t\t\"img\",\n\t\t\"source\",\n\t\t\"image\",\n\t\t\"track\"\n\t]);\n\tlet URI_SAFE_ATTRIBUTES = null;\n\tconst DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, [\n\t\t\"alt\",\n\t\t\"class\",\n\t\t\"for\",\n\t\t\"id\",\n\t\t\"label\",\n\t\t\"name\",\n\t\t\"pattern\",\n\t\t\"placeholder\",\n\t\t\"role\",\n\t\t\"summary\",\n\t\t\"title\",\n\t\t\"value\",\n\t\t\"style\",\n\t\t\"xmlns\"\n\t]);\n\tconst MATHML_NAMESPACE = \"http://www.w3.org/1998/Math/MathML\";\n\tconst SVG_NAMESPACE = \"http://www.w3.org/2000/svg\";\n\tconst HTML_NAMESPACE = \"http://www.w3.org/1999/xhtml\";\n\tlet NAMESPACE = HTML_NAMESPACE;\n\tlet IS_EMPTY_INPUT = false;\n\tlet ALLOWED_NAMESPACES = null;\n\tconst DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [\n\t\tMATHML_NAMESPACE,\n\t\tSVG_NAMESPACE,\n\t\tHTML_NAMESPACE\n\t], stringToString);\n\tconst DEFAULT_MATHML_TEXT_INTEGRATION_POINTS = freeze([\n\t\t\"mi\",\n\t\t\"mo\",\n\t\t\"mn\",\n\t\t\"ms\",\n\t\t\"mtext\"\n\t]);\n\tlet MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, DEFAULT_MATHML_TEXT_INTEGRATION_POINTS);\n\tconst DEFAULT_HTML_INTEGRATION_POINTS = freeze([\"annotation-xml\"]);\n\tlet HTML_INTEGRATION_POINTS = addToSet({}, DEFAULT_HTML_INTEGRATION_POINTS);\n\tconst COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, [\n\t\t\"title\",\n\t\t\"style\",\n\t\t\"font\",\n\t\t\"a\",\n\t\t\"script\"\n\t]);\n\tlet PARSER_MEDIA_TYPE = null;\n\tconst SUPPORTED_PARSER_MEDIA_TYPES = [\"application/xhtml+xml\", \"text/html\"];\n\tconst DEFAULT_PARSER_MEDIA_TYPE = \"text/html\";\n\tlet transformCaseFunc = null;\n\tlet CONFIG = null;\n\tconst formElement = document.createElement(\"form\");\n\tconst isRegexOrFunction = function isRegexOrFunction(testValue) {\n\t\treturn testValue instanceof RegExp || testValue instanceof Function;\n\t};\n\t/**\n\t* _parseConfig\n\t*\n\t* @param cfg optional config literal\n\t*/\n\tconst _parseConfig = function _parseConfig() {\n\t\tlet cfg = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};\n\t\tif (CONFIG && CONFIG === cfg) return;\n\t\tif (!cfg || typeof cfg !== \"object\") cfg = {};\n\t\tcfg = clone(cfg);\n\t\tPARSER_MEDIA_TYPE = SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? DEFAULT_PARSER_MEDIA_TYPE : cfg.PARSER_MEDIA_TYPE;\n\t\ttransformCaseFunc = PARSER_MEDIA_TYPE === \"application/xhtml+xml\" ? stringToString : stringToLowerCase;\n\t\tALLOWED_TAGS = _resolveSetOption(cfg, \"ALLOWED_TAGS\", DEFAULT_ALLOWED_TAGS, { transform: transformCaseFunc });\n\t\tALLOWED_ATTR = _resolveSetOption(cfg, \"ALLOWED_ATTR\", DEFAULT_ALLOWED_ATTR, { transform: transformCaseFunc });\n\t\tALLOWED_NAMESPACES = _resolveSetOption(cfg, \"ALLOWED_NAMESPACES\", DEFAULT_ALLOWED_NAMESPACES, { transform: stringToString });\n\t\tURI_SAFE_ATTRIBUTES = _resolveSetOption(cfg, \"ADD_URI_SAFE_ATTR\", DEFAULT_URI_SAFE_ATTRIBUTES, {\n\t\t\ttransform: transformCaseFunc,\n\t\t\tbase: DEFAULT_URI_SAFE_ATTRIBUTES\n\t\t});\n\t\tDATA_URI_TAGS = _resolveSetOption(cfg, \"ADD_DATA_URI_TAGS\", DEFAULT_DATA_URI_TAGS, {\n\t\t\ttransform: transformCaseFunc,\n\t\t\tbase: DEFAULT_DATA_URI_TAGS\n\t\t});\n\t\tFORBID_CONTENTS = _resolveSetOption(cfg, \"FORBID_CONTENTS\", DEFAULT_FORBID_CONTENTS, { transform: transformCaseFunc });\n\t\tFORBID_TAGS = _resolveSetOption(cfg, \"FORBID_TAGS\", clone({}), { transform: transformCaseFunc });\n\t\tFORBID_ATTR = _resolveSetOption(cfg, \"FORBID_ATTR\", clone({}), { transform: transformCaseFunc });\n\t\tUSE_PROFILES = objectHasOwnProperty(cfg, \"USE_PROFILES\") ? cfg.USE_PROFILES && typeof cfg.USE_PROFILES === \"object\" ? clone(cfg.USE_PROFILES) : cfg.USE_PROFILES : false;\n\t\tALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false;\n\t\tALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false;\n\t\tALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false;\n\t\tALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false;\n\t\tSAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false;\n\t\tSAFE_FOR_XML = cfg.SAFE_FOR_XML !== false;\n\t\tWHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false;\n\t\tRETURN_DOM = cfg.RETURN_DOM || false;\n\t\tRETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false;\n\t\tRETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false;\n\t\tFORCE_BODY = cfg.FORCE_BODY || false;\n\t\tSANITIZE_DOM = cfg.SANITIZE_DOM !== false;\n\t\tSANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false;\n\t\tKEEP_CONTENT = cfg.KEEP_CONTENT !== false;\n\t\tIN_PLACE = cfg.IN_PLACE || false;\n\t\tIS_ALLOWED_URI$1 = isRegex(cfg.ALLOWED_URI_REGEXP) ? cfg.ALLOWED_URI_REGEXP : IS_ALLOWED_URI;\n\t\tNAMESPACE = typeof cfg.NAMESPACE === \"string\" ? cfg.NAMESPACE : HTML_NAMESPACE;\n\t\tMATHML_TEXT_INTEGRATION_POINTS = _resolveObjectOption(cfg, \"MATHML_TEXT_INTEGRATION_POINTS\", () => addToSet({}, DEFAULT_MATHML_TEXT_INTEGRATION_POINTS));\n\t\tHTML_INTEGRATION_POINTS = _resolveObjectOption(cfg, \"HTML_INTEGRATION_POINTS\", () => addToSet({}, DEFAULT_HTML_INTEGRATION_POINTS));\n\t\tconst customElementHandling = _resolveObjectOption(cfg, \"CUSTOM_ELEMENT_HANDLING\", () => create(null));\n\t\tCUSTOM_ELEMENT_HANDLING = create(null);\n\t\tif (objectHasOwnProperty(customElementHandling, \"tagNameCheck\") && isRegexOrFunction(customElementHandling.tagNameCheck)) CUSTOM_ELEMENT_HANDLING.tagNameCheck = customElementHandling.tagNameCheck;\n\t\tif (objectHasOwnProperty(customElementHandling, \"attributeNameCheck\") && isRegexOrFunction(customElementHandling.attributeNameCheck)) CUSTOM_ELEMENT_HANDLING.attributeNameCheck = customElementHandling.attributeNameCheck;\n\t\tif (objectHasOwnProperty(customElementHandling, \"allowCustomizedBuiltInElements\") && typeof customElementHandling.allowCustomizedBuiltInElements === \"boolean\") CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = customElementHandling.allowCustomizedBuiltInElements;\n\t\tseal(CUSTOM_ELEMENT_HANDLING);\n\t\tif (SAFE_FOR_TEMPLATES) ALLOW_DATA_ATTR = false;\n\t\tif (RETURN_DOM_FRAGMENT) RETURN_DOM = true;\n\t\tif (USE_PROFILES) {\n\t\t\tALLOWED_TAGS = addToSet({}, text);\n\t\t\tALLOWED_ATTR = create(null);\n\t\t\tif (USE_PROFILES.html === true) {\n\t\t\t\taddToSet(ALLOWED_TAGS, html$1);\n\t\t\t\taddToSet(ALLOWED_ATTR, html);\n\t\t\t}\n\t\t\tif (USE_PROFILES.svg === true) {\n\t\t\t\taddToSet(ALLOWED_TAGS, svg$1);\n\t\t\t\taddToSet(ALLOWED_ATTR, svg);\n\t\t\t\taddToSet(ALLOWED_ATTR, xml);\n\t\t\t}\n\t\t\tif (USE_PROFILES.svgFilters === true) {\n\t\t\t\taddToSet(ALLOWED_TAGS, svgFilters);\n\t\t\t\taddToSet(ALLOWED_ATTR, svg);\n\t\t\t\taddToSet(ALLOWED_ATTR, xml);\n\t\t\t}\n\t\t\tif (USE_PROFILES.mathMl === true) {\n\t\t\t\taddToSet(ALLOWED_TAGS, mathMl$1);\n\t\t\t\taddToSet(ALLOWED_ATTR, mathMl);\n\t\t\t\taddToSet(ALLOWED_ATTR, xml);\n\t\t\t}\n\t\t}\n\t\tEXTRA_ELEMENT_HANDLING.tagCheck = null;\n\t\tEXTRA_ELEMENT_HANDLING.attributeCheck = null;\n\t\tif (objectHasOwnProperty(cfg, \"ADD_TAGS\")) {\n\t\t\tif (typeof cfg.ADD_TAGS === \"function\") EXTRA_ELEMENT_HANDLING.tagCheck = cfg.ADD_TAGS;\n\t\t\telse if (arrayIsArray(cfg.ADD_TAGS)) {\n\t\t\t\tif (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) ALLOWED_TAGS = clone(ALLOWED_TAGS);\n\t\t\t\taddToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n\t\t\t}\n\t\t}\n\t\tif (objectHasOwnProperty(cfg, \"ADD_ATTR\")) {\n\t\t\tif (typeof cfg.ADD_ATTR === \"function\") EXTRA_ELEMENT_HANDLING.attributeCheck = cfg.ADD_ATTR;\n\t\t\telse if (arrayIsArray(cfg.ADD_ATTR)) {\n\t\t\t\tif (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) ALLOWED_ATTR = clone(ALLOWED_ATTR);\n\t\t\t\taddToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n\t\t\t}\n\t\t}\n\t\tif (objectHasOwnProperty(cfg, \"ADD_FORBID_CONTENTS\") && arrayIsArray(cfg.ADD_FORBID_CONTENTS)) {\n\t\t\tif (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) FORBID_CONTENTS = clone(FORBID_CONTENTS);\n\t\t\taddToSet(FORBID_CONTENTS, cfg.ADD_FORBID_CONTENTS, transformCaseFunc);\n\t\t}\n\t\tif (KEEP_CONTENT) ALLOWED_TAGS[\"#text\"] = true;\n\t\tif (WHOLE_DOCUMENT) addToSet(ALLOWED_TAGS, [\n\t\t\t\"html\",\n\t\t\t\"head\",\n\t\t\t\"body\"\n\t\t]);\n\t\tif (ALLOWED_TAGS.table) {\n\t\t\taddToSet(ALLOWED_TAGS, [\"tbody\"]);\n\t\t\tdelete FORBID_TAGS.tbody;\n\t\t}\n\t\tif (cfg.TRUSTED_TYPES_POLICY) {\n\t\t\tif (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== \"function\") throw typeErrorCreate(\"TRUSTED_TYPES_POLICY configuration option must provide a \\\"createHTML\\\" hook.\");\n\t\t\tif (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== \"function\") throw typeErrorCreate(\"TRUSTED_TYPES_POLICY configuration option must provide a \\\"createScriptURL\\\" hook.\");\n\t\t\tconst previousTrustedTypesPolicy = trustedTypesPolicy;\n\t\t\ttrustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY;\n\t\t\ttry {\n\t\t\t\temptyHTML = _createTrustedHTML(\"\");\n\t\t\t} catch (error) {\n\t\t\t\ttrustedTypesPolicy = previousTrustedTypesPolicy;\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t} else if (cfg.TRUSTED_TYPES_POLICY === null) {\n\t\t\ttrustedTypesPolicy = void 0;\n\t\t\temptyHTML = \"\";\n\t\t} else {\n\t\t\tif (trustedTypesPolicy === void 0) trustedTypesPolicy = _getDefaultTrustedTypesPolicy();\n\t\t\tif (trustedTypesPolicy && typeof emptyHTML === \"string\") emptyHTML = _createTrustedHTML(\"\");\n\t\t}\n\t\tif (freeze) freeze(cfg);\n\t\tCONFIG = cfg;\n\t};\n\tconst ALL_SVG_TAGS = addToSet({}, [\n\t\t...svg$1,\n\t\t...svgFilters,\n\t\t...svgDisallowed\n\t]);\n\tconst ALL_MATHML_TAGS = addToSet({}, [...mathMl$1, ...mathMlDisallowed]);\n\t/**\n\t* Namespace rules for an element in the SVG namespace.\n\t*\n\t* @param tagName the element's lowercase tag name\n\t* @param parent the (possibly simulated) parent node\n\t* @param parentTagName the parent's lowercase tag name\n\t* @returns true if a spec-compliant parser could produce this element\n\t*/\n\tconst _checkSvgNamespace = function _checkSvgNamespace(tagName, parent, parentTagName) {\n\t\tif (parent.namespaceURI === HTML_NAMESPACE) return tagName === \"svg\";\n\t\tif (parent.namespaceURI === MATHML_NAMESPACE) return tagName === \"svg\" && (parentTagName === \"annotation-xml\" || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);\n\t\treturn Boolean(ALL_SVG_TAGS[tagName]);\n\t};\n\t/**\n\t* Namespace rules for an element in the MathML namespace.\n\t*\n\t* @param tagName the element's lowercase tag name\n\t* @param parent the (possibly simulated) parent node\n\t* @param parentTagName the parent's lowercase tag name\n\t* @returns true if a spec-compliant parser could produce this element\n\t*/\n\tconst _checkMathMlNamespace = function _checkMathMlNamespace(tagName, parent, parentTagName) {\n\t\tif (parent.namespaceURI === HTML_NAMESPACE) return tagName === \"math\";\n\t\tif (parent.namespaceURI === SVG_NAMESPACE) return tagName === \"math\" && HTML_INTEGRATION_POINTS[parentTagName];\n\t\treturn Boolean(ALL_MATHML_TAGS[tagName]);\n\t};\n\t/**\n\t* Namespace rules for an element in the HTML namespace.\n\t*\n\t* @param tagName the element's lowercase tag name\n\t* @param parent the (possibly simulated) parent node\n\t* @param parentTagName the parent's lowercase tag name\n\t* @returns true if a spec-compliant parser could produce this element\n\t*/\n\tconst _checkHtmlNamespace = function _checkHtmlNamespace(tagName, parent, parentTagName) {\n\t\tif (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) return false;\n\t\tif (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) return false;\n\t\treturn !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);\n\t};\n\t/**\n\t* @param element a DOM element whose namespace is being checked\n\t* @returns Return false if the element has a\n\t* namespace that a spec-compliant parser would never\n\t* return. Return true otherwise.\n\t*/\n\tconst _checkValidNamespace = function _checkValidNamespace(element) {\n\t\tlet parent = getParentNode(element);\n\t\tif (!parent || !parent.tagName) parent = {\n\t\t\tnamespaceURI: NAMESPACE,\n\t\t\ttagName: \"template\"\n\t\t};\n\t\tconst tagName = stringToLowerCase(element.tagName);\n\t\tconst parentTagName = stringToLowerCase(parent.tagName);\n\t\tif (!ALLOWED_NAMESPACES[element.namespaceURI]) return false;\n\t\tif (element.namespaceURI === SVG_NAMESPACE) return _checkSvgNamespace(tagName, parent, parentTagName);\n\t\tif (element.namespaceURI === MATHML_NAMESPACE) return _checkMathMlNamespace(tagName, parent, parentTagName);\n\t\tif (element.namespaceURI === HTML_NAMESPACE) return _checkHtmlNamespace(tagName, parent, parentTagName);\n\t\tif (PARSER_MEDIA_TYPE === \"application/xhtml+xml\" && ALLOWED_NAMESPACES[element.namespaceURI]) return true;\n\t\treturn false;\n\t};\n\t/**\n\t* _forceRemove\n\t*\n\t* @param node a DOM node\n\t*/\n\tconst _forceRemove = function _forceRemove(node) {\n\t\tarrayPush(DOMPurify.removed, { element: node });\n\t\ttry {\n\t\t\tgetParentNode(node).removeChild(node);\n\t\t} catch (_) {\n\t\t\tremove(node);\n\t\t\tif (!getParentNode(node)) throw typeErrorCreate(\"a node selected for removal could not be detached from its tree and cannot be safely returned; refusing to sanitize in place\");\n\t\t}\n\t};\n\t/**\n\t* _stripAttributeNode\n\t*\n\t* Remove a single Attr node case/namespace-exactly on an attribute-teardown\n\t* path. Name-based removeAttribute() ASCII-lowercases its lookup key for an\n\t* HTML element in an HTML document and so silently misses a case-preserved\n\t* handler (e.g. `ONERROR` off an XML/XHTML import) - the same defect\n\t* _removeAttribute() was fixed for, which a name-based call would reintroduce\n\t* on these IN_PLACE teardown paths. Unlike _removeAttribute this does not\n\t* record into DOMPurify.removed: the neutralize passes intentionally do not\n\t* book-keep. A clobbered/detached node falls back to best-effort name-based\n\t* removal.\n\t*\n\t* @param element the element to strip the attribute from\n\t* @param attribute the Attr node to remove\n\t* @param name the attribute's name, for the fallback path\n\t*/\n\tconst _stripAttributeNode = function _stripAttributeNode(element, attribute, name) {\n\t\ttry {\n\t\t\tremoveAttributeNode(element, attribute);\n\t\t} catch (_) {\n\t\t\ttry {\n\t\t\t\telement.removeAttribute(name);\n\t\t\t} catch (_) {}\n\t\t}\n\t};\n\t/**\n\t* _neutralizeRoot\n\t*\n\t* Fail-closed teardown of an in-place root after the sanitize walk aborts\n\t* (campaign-3 F2). An internal throw mid-walk — e.g. a page-registered\n\t* custom element's reaction detaches a node so `_forceRemove`'s deliberate\n\t* parentless guard throws, or any other re-entrant engine mutation — would\n\t* otherwise leave the caller's *live* tree half-sanitized, with everything\n\t* after the abort point still carrying its handlers. There is no safe way\n\t* to resume the walk (the tree mutated under us), so we strip the root bare:\n\t* remove every child and every attribute, then let the caller's catch see\n\t* the original error. Clobber-safe (cached `remove`/`childNodes`/`attributes`\n\t* getters; the root was already clobber-pre-flighted at the IN_PLACE entry).\n\t*\n\t* @param root the in-place root to empty\n\t*/\n\tconst _neutralizeRoot = function _neutralizeRoot(root) {\n\t\t_neutralizeSubtree(root);\n\t\tconst childNodes = getChildNodes(root);\n\t\tif (childNodes) {\n\t\t\tconst snapshot = [];\n\t\t\tarrayForEach(childNodes, (child) => {\n\t\t\t\tarrayPush(snapshot, child);\n\t\t\t});\n\t\t\tarrayForEach(snapshot, (child) => {\n\t\t\t\ttry {\n\t\t\t\t\tremove(child);\n\t\t\t\t} catch (_) {}\n\t\t\t});\n\t\t}\n\t\tconst attributes = getAttributes(root);\n\t\tif (attributes) for (let i = attributes.length - 1; i >= 0; --i) {\n\t\t\tconst attribute = attributes[i];\n\t\t\tconst name = attribute && attribute.name;\n\t\t\tif (typeof name === \"string\") _stripAttributeNode(root, attribute, name);\n\t\t}\n\t};\n\t/**\n\t* _removeAttribute\n\t*\n\t* Name-based getAttributeNode()/removeAttribute() ASCII-lowercase their\n\t* lookup key for HTML elements in an HTML document, so they silently miss an\n\t* attribute whose stored qualified name still contains uppercase ASCII\n\t* letters. That happens when the node came from a case-preserving source\n\t* (an XML/XHTML document imported via importNode(), or createAttributeNS()),\n\t* where e.g. `ONERROR` survives the walk: the policy check lowercases to\n\t* `onerror` and rejects it, but `removeAttribute('ONERROR')` looks up\n\t* `onerror` and finds nothing. Remove the exact Attr node instead, which is\n\t* case- and namespace-exact, and fall back to name-based removal only when\n\t* the caller could not supply the node.\n\t*\n\t* @param name an Attribute name\n\t* @param element a DOM node\n\t* @param attr the exact Attr node to remove, when the caller has it\n\t*/\n\tconst _removeAttribute = function _removeAttribute(name, element, attr) {\n\t\tif (!attr) try {\n\t\t\tattr = element.getAttributeNode(name);\n\t\t} catch (_) {\n\t\t\tattr = null;\n\t\t}\n\t\tarrayPush(DOMPurify.removed, {\n\t\t\tattribute: attr || null,\n\t\t\tfrom: element\n\t\t});\n\t\ttry {\n\t\t\tif (attr) removeAttributeNode(element, attr);\n\t\t\telse element.removeAttribute(name);\n\t\t} catch (_) {\n\t\t\ttry {\n\t\t\t\telement.removeAttribute(name);\n\t\t\t} catch (_) {}\n\t\t}\n\t\tif (name === \"is\") {\n\t\t\tif (RETURN_DOM || RETURN_DOM_FRAGMENT) try {\n\t\t\t\t_forceRemove(element);\n\t\t\t} catch (_) {}\n\t\t\telse try {\n\t\t\t\telement.setAttribute(name, \"\");\n\t\t\t} catch (_) {}\n\t\t}\n\t};\n\t/**\n\t* _stripDisallowedAttributes\n\t*\n\t* Removes every attribute the active configuration does not allow from a\n\t* single element, using the same allowlist as the main attribute pass (so\n\t* `on*` handlers go, but no `/^on/` blocklist is introduced). Used only to\n\t* neutralise nodes that are being discarded from an in-place tree.\n\t*\n\t* @param element the element to strip\n\t*/\n\tconst _stripDisallowedAttributes = function _stripDisallowedAttributes(element) {\n\t\tconst attributes = getAttributes(element);\n\t\tif (!attributes) return;\n\t\tfor (let i = attributes.length - 1; i >= 0; --i) {\n\t\t\tconst attribute = attributes[i];\n\t\t\tconst name = attribute && attribute.name;\n\t\t\tif (typeof name !== \"string\" || ALLOWED_ATTR[transformCaseFunc(name)]) continue;\n\t\t\t_stripAttributeNode(element, attribute, name);\n\t\t}\n\t};\n\t/**\n\t* _neutralizeSubtree\n\t*\n\t* Completes the audit-5 F1 fix across every removal path. The KEEP_CONTENT\n\t* move-hoist neutralises only disallowed-tag removals; clobber, mXSS-canary,\n\t* namespace, comment, processing-instruction and KEEP_CONTENT:false removals\n\t* all drop their subtree wholesale via `_forceRemove`. On the IN_PLACE path\n\t* those dropped nodes are detached from the caller's LIVE tree but a\n\t* handler-bearing original among them (an `<img onerror>`/`<video>` that was\n\t* loading) keeps its queued resource event, which fires in page scope after\n\t* sanitize returns. This walks a removed subtree and strips every attribute\n\t* the active configuration does not allow — so `on*` handlers are cancelled\n\t* through the SAME allowlist that governs kept nodes, not a separate `/^on/`\n\t* blocklist. Run synchronously before sanitize returns, i.e. before any\n\t* queued event can fire. Hook-free by design: these nodes leave the output,\n\t* so firing attribute hooks for them would be surprising. Clobber-safe reads;\n\t* a doomed clobbered node may shadow `removeAttribute` (its own attributes are\n\t* irrelevant — it is discarded — while its non-clobbered descendants, e.g.\n\t* the `<img>`, are reached and scrubbed).\n\t*\n\t* @param root the root of a removed subtree to neutralise\n\t*/\n\tconst _neutralizeSubtree = function _neutralizeSubtree(root) {\n\t\tconst stack = [root];\n\t\twhile (stack.length > 0) {\n\t\t\tconst node = stack.pop();\n\t\t\tif (_readNodeType(node) === NODE_TYPE.element) _stripDisallowedAttributes(node);\n\t\t\tconst childNodes = getChildNodes(node);\n\t\t\tif (childNodes) for (let i = childNodes.length - 1; i >= 0; --i) stack.push(childNodes[i]);\n\t\t}\n\t};\n\t/**\n\t* _neutralizePatchLinkage\n\t*\n\t* IN_PLACE entry pre-pass (declarative-partial-updates / streaming\n\t* hardening, https://github.com/WICG/declarative-partial-updates).\n\t*\n\t* The main walk strips patch linkage (`for`/`patchsrc`) and removes range\n\t* markers (PIs / markup comments) node-by-node, in document order, AS it\n\t* reaches each node. On a live in-place root that leaves a window: from the\n\t* moment the root is connected until the walk arrives at a given node, that\n\t* node's linkage is live. A patch applied on connection/stream can fire as\n\t* a microtask during the walk and inject or teleport an unsanitized DOM\n\t* range into a region the iterator has already passed and will not revisit,\n\t* so the post-return \"tree is sanitized\" contract is violated. Sweep the\n\t* whole tree once up front and sever every linkage before the walk begins,\n\t* closing that window.\n\t*\n\t* This CANNOT undo a patch that already fired before sanitize ran — that is\n\t* the irreducible \"do not IN_PLACE a live-connected attacker tree\" caveat —\n\t* but it closes everything from sanitize-start onward. Gated on SAFE_FOR_XML\n\t* to group with the rest of the declarative-partial-updates handling and\n\t* stay overridable, consistent with the codebase.\n\t*\n\t* Clobber-safe traversal (cached childNodes getter); per-node try/catch so a\n\t* clobbered root cannot defeat the sweep of its non-clobbered descendants.\n\t*\n\t* NOTE (pending real-Chrome confirmation, see test/declarative-patch-probe\n\t* .html Q1): this mirrors the existing policy of keeping `for` on\n\t* <label>/<output>. If the shipping feature can drive a patch through a\n\t* surviving `for`-on-label/output + `id` pair, this pre-pass and the\n\t* attribute check at _isBasicCustomElement's caller must additionally drop\n\t* that pair on the IN_PLACE path. Left as-is until the taxonomy is verified.\n\t*\n\t* @param root the in-place root to sweep\n\t*/\n\t/**\n\t* Central policy for declarative-partial-updates patch-linkage attributes,\n\t* shared by the _neutralizePatchLinkage pre-pass and _isValidAttribute so\n\t* the two sites cannot drift: `patchsrc` always links, `for` links\n\t* everywhere except on <label>/<output>, and the whole policy is gated on\n\t* SAFE_FOR_XML (see the rationale block in _isValidAttribute).\n\t*\n\t* @param lcName the transformCaseFunc'd attribute name\n\t* @param lcTag the transformCaseFunc'd tag name of the carrying element\n\t* @return true if the attribute is patch linkage and must be dropped\n\t*/\n\tconst _isPatchLinkageAttribute = function _isPatchLinkageAttribute(lcName, lcTag) {\n\t\tif (!SAFE_FOR_XML) return false;\n\t\tif (lcName === \"patchsrc\") return true;\n\t\treturn lcName === \"for\" && lcTag !== \"label\" && lcTag !== \"output\";\n\t};\n\tconst _neutralizePatchLinkage = function _neutralizePatchLinkage(root) {\n\t\tif (!SAFE_FOR_XML) return;\n\t\tconst stack = [root];\n\t\twhile (stack.length > 0) {\n\t\t\tconst node = stack.pop();\n\t\t\tconst nodeType = _readNodeType(node);\n\t\t\tif (nodeType === NODE_TYPE.processingInstruction || nodeType === NODE_TYPE.comment && regExpTest(COMMENT_MARKUP_PROBE, node.data)) {\n\t\t\t\ttry {\n\t\t\t\t\tremove(node);\n\t\t\t\t} catch (_) {}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (nodeType === NODE_TYPE.element) {\n\t\t\t\tconst element = node;\n\t\t\t\tconst lcTag = transformCaseFunc(_readNodeName(node));\n\t\t\t\ttry {\n\t\t\t\t\tif (element.hasAttribute && element.hasAttribute(\"patchsrc\")) element.removeAttribute(\"patchsrc\");\n\t\t\t\t\tif (element.hasAttribute && element.hasAttribute(\"for\") && _isPatchLinkageAttribute(\"for\", lcTag)) element.removeAttribute(\"for\");\n\t\t\t\t} catch (_) {}\n\t\t\t}\n\t\t\tconst childNodes = getChildNodes(node);\n\t\t\tif (childNodes) for (let i = childNodes.length - 1; i >= 0; --i) stack.push(childNodes[i]);\n\t\t}\n\t};\n\t/**\n\t* _initDocument\n\t*\n\t* @param dirty - a string of dirty markup\n\t* @return a DOM, filled with the dirty markup\n\t*/\n\tconst _initDocument = function _initDocument(dirty) {\n\t\tlet doc = null;\n\t\tlet leadingWhitespace = null;\n\t\tif (FORCE_BODY) dirty = \"<remove></remove>\" + dirty;\n\t\telse {\n\t\t\tconst matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n\t\t\tleadingWhitespace = matches && matches[0];\n\t\t}\n\t\tif (PARSER_MEDIA_TYPE === \"application/xhtml+xml\" && NAMESPACE === HTML_NAMESPACE) dirty = \"<html xmlns=\\\"http://www.w3.org/1999/xhtml\\\"><head></head><body>\" + dirty + \"</body></html>\";\n\t\tconst dirtyPayload = trustedTypesPolicy ? _createTrustedHTML(dirty) : dirty;\n\t\tif (NAMESPACE === HTML_NAMESPACE) try {\n\t\t\tdoc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n\t\t} catch (_) {}\n\t\tif (!doc || !doc.documentElement) {\n\t\t\tdoc = implementation.createDocument(NAMESPACE, \"template\", null);\n\t\t\ttry {\n\t\t\t\tdoc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;\n\t\t\t} catch (_) {}\n\t\t}\n\t\tconst body = doc.body || doc.documentElement;\n\t\tif (dirty && leadingWhitespace) body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);\n\t\tif (NAMESPACE === HTML_NAMESPACE) return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? \"html\" : \"body\")[0];\n\t\treturn WHOLE_DOCUMENT ? doc.documentElement : body;\n\t};\n\t/**\n\t* Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document.\n\t*\n\t* @param root The root element or node to start traversing on.\n\t* @return The created NodeIterator\n\t*/\n\tconst _createNodeIterator = function _createNodeIterator(root) {\n\t\tconst doc = getOwnerDocument ? getOwnerDocument(root) : root.ownerDocument;\n\t\treturn createNodeIterator.call(doc || root, root, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_PROCESSING_INSTRUCTION | NodeFilter.SHOW_CDATA_SECTION, null);\n\t};\n\t/**\n\t* Replace template expression syntax (mustache, ERB, template\n\t* literal) with a space; shared by all SAFE_FOR_TEMPLATES scrub\n\t* sites. Order matters: mustache, then ERB, then template literal.\n\t*\n\t* @param value the string to scrub\n\t* @returns the scrubbed string\n\t*/\n\tconst _stripTemplateExpressions = function _stripTemplateExpressions(value) {\n\t\tvalue = stringReplace(value, MUSTACHE_EXPR$1, \" \");\n\t\tvalue = stringReplace(value, ERB_EXPR$1, \" \");\n\t\tvalue = stringReplace(value, TMPLIT_EXPR$1, \" \");\n\t\treturn value;\n\t};\n\t/**\n\t* Strip template-engine expressions ({{...}}, ${...}, <%...%>) from the\n\t* character data of an element subtree. Used as the final safety net for\n\t* SAFE_FOR_TEMPLATES on every DOM-returning code path so that expressions\n\t* which only form after text-node normalization (e.g. fragments split across\n\t* stripped elements) cannot survive into a template-evaluating framework.\n\t*\n\t* Walks text/comment/CDATA/processing-instruction nodes and mutates `.data`\n\t* in place rather than round-tripping through innerHTML. This preserves\n\t* descendant node references (important for IN_PLACE callers), avoids a\n\t* serialize/reparse cycle, and reads literal character data — which means\n\t* `<%...%>` in text content matches the ERB regex against its real bytes\n\t* instead of the HTML-entity-escaped form innerHTML would produce.\n\t*\n\t* Attribute values are not visited here; SAFE_FOR_TEMPLATES handling for\n\t* attributes is performed during the per-node `_sanitizeAttributes` pass.\n\t*\n\t* @param node The root element whose character data should be scrubbed.\n\t*/\n\tconst _scrubTemplateExpressions2 = function _scrubTemplateExpressions(node) {\n\t\tvar _node$querySelectorAl;\n\t\tnode.normalize();\n\t\tconst doc = getOwnerDocument ? getOwnerDocument(node) : node.ownerDocument;\n\t\tconst walker = createNodeIterator.call(doc || node, node, NodeFilter.SHOW_TEXT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_CDATA_SECTION | NodeFilter.SHOW_PROCESSING_INSTRUCTION, null);\n\t\tlet currentNode = walker.nextNode();\n\t\twhile (currentNode) {\n\t\t\tcurrentNode.data = _stripTemplateExpressions(currentNode.data);\n\t\t\tcurrentNode = walker.nextNode();\n\t\t}\n\t\tconst templates = (_node$querySelectorAl = node.querySelectorAll) === null || _node$querySelectorAl === void 0 ? void 0 : _node$querySelectorAl.call(node, \"template\");\n\t\tif (templates) arrayForEach(templates, (tmpl) => {\n\t\t\tif (_isDocumentFragment(tmpl.content)) _scrubTemplateExpressions2(tmpl.content);\n\t\t});\n\t};\n\t/**\n\t* _isClobbered\n\t*\n\t* Detect DOM-clobbering on HTMLFormElement nodes. Form is the only HTML\n\t* interface with [LegacyOverrideBuiltIns]; a descendant element with a\n\t* `name` attribute matching a prototype property shadows that property\n\t* on direct reads. We use this check at the IN_PLACE entry-point and\n\t* during attribute sanitization to refuse clobbered forms.\n\t*\n\t* @param element element to check for clobbering attacks\n\t* @return true if clobbered, false if safe\n\t*/\n\tconst _isClobbered = function _isClobbered(element) {\n\t\tconst realTagName = getNodeName ? getNodeName(element) : null;\n\t\tif (typeof realTagName !== \"string\") return false;\n\t\tif (transformCaseFunc(realTagName) !== \"form\") return false;\n\t\treturn typeof element.nodeName !== \"string\" || typeof element.textContent !== \"string\" || typeof element.removeChild !== \"function\" || element.attributes !== getAttributes(element) || typeof element.removeAttribute !== \"function\" || typeof element.removeAttributeNode !== \"function\" || typeof element.getAttributeNode !== \"function\" || typeof element.setAttribute !== \"function\" || typeof element.namespaceURI !== \"string\" || typeof element.insertBefore !== \"function\" || typeof element.hasChildNodes !== \"function\" || element.nodeType !== getNodeType(element) || element.childNodes !== getChildNodes(element);\n\t};\n\t/**\n\t* Checks whether the given value is a DocumentFragment from any realm.\n\t*\n\t* The realm-independent replacement reads `nodeType` through the cached\n\t* Node.prototype getter and compares to the DOCUMENT_FRAGMENT_NODE\n\t* constant (11). nodeType is a numeric value resolved from the node's\n\t* internal slot, identical across realms for the same kind of node.\n\t*\n\t* @param value object to check\n\t* @return true if value is a DocumentFragment-shaped node from any realm\n\t*/\n\tconst _isDocumentFragment = function _isDocumentFragment(value) {\n\t\tif (!getNodeType || typeof value !== \"object\" || value === null) return false;\n\t\ttry {\n\t\t\treturn getNodeType(value) === NODE_TYPE.documentFragment;\n\t\t} catch (_) {\n\t\t\treturn false;\n\t\t}\n\t};\n\t/**\n\t* Checks whether the given object is a DOM node, including nodes that\n\t* originate from a different window/realm (e.g. an iframe's\n\t* contentDocument). The previous `value instanceof Node` check was\n\t* realm-bound: nodes from a different window failed it, causing\n\t* sanitize() to silently stringify them and reset IN_PLACE to false,\n\t* returning the original node unsanitized. See GHSA-4w3q-35jp-p934.\n\t*\n\t* @param value object to check whether it's a DOM node\n\t* @return true if value is a DOM node from any realm\n\t*/\n\tconst _isNode = function _isNode(value) {\n\t\tif (!getNodeType || typeof value !== \"object\" || value === null) return false;\n\t\ttry {\n\t\t\treturn typeof getNodeType(value) === \"number\";\n\t\t} catch (_) {\n\t\t\treturn false;\n\t\t}\n\t};\n\tfunction _executeHooks(hooks, currentNode, data) {\n\t\tif (hooks.length === 0) return;\n\t\tarrayForEach(hooks, (hook) => {\n\t\t\thook.call(DOMPurify, currentNode, data, CONFIG);\n\t\t});\n\t}\n\t/**\n\t* Structural-threat checks that condemn a node regardless of the\n\t* allowlists: mXSS via namespace confusion, risky CSS construction,\n\t* processing instructions, markup-bearing comments. Pure predicate;\n\t* the caller removes. Check order is load-bearing.\n\t*\n\t* @param currentNode the node to inspect\n\t* @param tagName the node's transformCaseFunc'd tag name\n\t* @return true if the node must be removed\n\t*/\n\tconst _isUnsafeNode = function _isUnsafeNode(currentNode, tagName) {\n\t\tif (SAFE_FOR_XML && currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(ELEMENT_MARKUP_PROBE, currentNode.textContent) && regExpTest(ELEMENT_MARKUP_PROBE, currentNode.innerHTML)) return true;\n\t\tif (SAFE_FOR_XML && currentNode.namespaceURI === HTML_NAMESPACE && LITERAL_TEXT_ELEMENTS[tagName] && (_isNode(currentNode.firstElementChild) || typeof currentNode.textContent === \"string\" && regExpTest(LITERAL_TEXT_CLOSE[tagName], currentNode.textContent))) return true;\n\t\tif (currentNode.nodeType === NODE_TYPE.processingInstruction) return true;\n\t\tif (SAFE_FOR_XML && currentNode.nodeType === NODE_TYPE.comment && regExpTest(COMMENT_MARKUP_PROBE, currentNode.data)) return true;\n\t\treturn false;\n\t};\n\t/**\n\t* Evaluate a CUSTOM_ELEMENT_HANDLING check (a RegExp or a predicate\n\t* function, per the validation in _parseConfig) against a name.\n\t* Additional arguments are forwarded to predicate functions - the\n\t* attributeNameCheck predicate receives the tag name as its second\n\t* argument. A null/absent check never matches.\n\t*\n\t* @param check the configured tagNameCheck / attributeNameCheck value\n\t* @param name the name to test\n\t* @param args extra arguments forwarded to a predicate function\n\t* @return true if the check matches the name\n\t*/\n\tconst _matchesNameCheck = function _matchesNameCheck(check, name) {\n\t\tif (check instanceof RegExp) return regExpTest(check, name);\n\t\tif (check instanceof Function) {\n\t\t\tfor (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) args[_key - 2] = arguments[_key];\n\t\t\treturn Boolean(check(name, ...args));\n\t\t}\n\t\treturn false;\n\t};\n\t/**\n\t* Handle a node whose tag is forbidden or not allowlisted: keep\n\t* allowed custom elements (false return exits _sanitizeElements\n\t* early - the namespace and fallback-tag removal checks are\n\t* intentionally skipped for kept custom elements), else hoist\n\t* content per KEEP_CONTENT and remove.\n\t*\n\t* A kept custom element is the ONLY case in which this function\n\t* returns false, so the caller uses that return value to run the\n\t* afterSanitizeElements hook on the kept element and keep the\n\t* element-hook lifecycle consistent with normal allowlisted\n\t* elements (GHSA-c2j3-45gr-mqc4).\n\t*\n\t* @param currentNode the disallowed node\n\t* @param tagName the node's transformCaseFunc'd tag name\n\t* @return true if the node was removed, false if kept\n\t*/\n\tconst _sanitizeDisallowedNode = function _sanitizeDisallowedNode(currentNode, tagName, root) {\n\t\tif (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName) && _matchesNameCheck(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) return false;\n\t\tif (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\n\t\t\tconst parentNode = getParentNode(currentNode);\n\t\t\tconst childNodes = getChildNodes(currentNode);\n\t\t\tif (childNodes && parentNode) {\n\t\t\t\tconst childCount = childNodes.length;\n\t\t\t\tfor (let i = childCount - 1; i >= 0; --i) {\n\t\t\t\t\tconst hoisted = currentNode === root ? cloneNode(childNodes[i], true) : childNodes[i];\n\t\t\t\t\tparentNode.insertBefore(hoisted, getNextSibling(currentNode));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t_forceRemove(currentNode);\n\t\treturn true;\n\t};\n\t/**\n\t* Fork a hook-mutable allowlist off its shared binding the first time a\n\t* (possibly lazily-installed) uponSanitize* hook is about to see it, so the\n\t* hook cannot widen the per-instance default or the setConfig binding by\n\t* reference and leak past the call. Returns the set unchanged once it is\n\t* already call-local, so repeated calls across elements are idempotent.\n\t*\n\t* @param hookList the uponSanitize* hook array for this event\n\t* @param set the current ALLOWED_TAGS / ALLOWED_ATTR binding\n\t* @param defaultSet the per-instance DEFAULT_ALLOWED_* constant\n\t* @param setConfigSet the captured setConfig() binding, or null\n\t* @return a call-local clone if a hook is present and set is still shared,\n\t* else set unchanged\n\t*/\n\tconst _forkSharedAllowlist = function _forkSharedAllowlist(hookList, set, defaultSet, setConfigSet) {\n\t\tif (hookList.length === 0) return set;\n\t\treturn set === defaultSet || set === setConfigSet ? clone(set) : set;\n\t};\n\t/**\n\t* Shared guard for a node that a hook has detached from the walk tree,\n\t* used after each element-hook site in _sanitizeElements. Detaching is a\n\t* long-standing user pattern (issue #469; draw.io-style foreignObject\n\t* filtering). Per the cached, unclobberable parentNode getter the node is\n\t* genuinely out of the tree, so it can reach neither the serialized\n\t* output nor an IN_PLACE live tree; treat it as removed and stop\n\t* processing it. Without this guard, the unsafe-node / namespace checks\n\t* would call _forceRemove on a parentless node and hit the REPORT-3\n\t* fail-closed throw — which exists for nodes DOMPurify wants gone but\n\t* *cannot* detach (clobbered / parentless roots), the opposite of a node\n\t* that is already safely gone. The walk root is exempt: a detached\n\t* IN_PLACE root is legitimate input and must still be fully sanitized,\n\t* and a kill-decision on it must keep hitting the REPORT-3 throw.\n\t*\n\t* Nodes detached by hooks stay the hook's responsibility for placement:\n\t* they are not recorded in DOMPurify.removed, so the post-walk IN_PLACE\n\t* pass (which iterates DOMPurify.removed) does not reach them. But a\n\t* hook-detached subtree can still hold a queued resource-event handler -\n\t* e.g. an <img onload> that began loading when the caller built the live\n\t* tree - which fires in page scope after sanitize returns even though the\n\t* handler never reached the returned tree. That is the audit-5 F1 hazard,\n\t* and the documented node.remove() hook pattern walks straight into it.\n\t* So on the IN_PLACE path we neutralize the detached subtree inline,\n\t* stripping its non-allow-listed attributes before returning, exactly as\n\t* the post-walk pass does for _forceRemove'd subtrees.\n\t*\n\t* @param currentNode the node a hook may have detached\n\t* @param root the current walk root\n\t* @return true if the node is detached and now handled, false otherwise\n\t*/\n\tconst _handleHookDetachedNode = function _handleHookDetachedNode(currentNode, root) {\n\t\tif (currentNode === root || getParentNode(currentNode) !== null) return false;\n\t\tif (IN_PLACE) _neutralizeSubtree(currentNode);\n\t\treturn true;\n\t};\n\t/**\n\t* _sanitizeElements\n\t*\n\t* @protect nodeName\n\t* @protect textContent\n\t* @protect removeChild\n\t* @param currentNode to check for permission to exist\n\t* @return true if node was killed, false if left alive\n\t*/\n\tconst _sanitizeElements = function _sanitizeElements(currentNode, root) {\n\t\t_executeHooks(hooks.beforeSanitizeElements, currentNode, null);\n\t\tif (_handleHookDetachedNode(currentNode, root)) return true;\n\t\tif (_isClobbered(currentNode)) {\n\t\t\t_forceRemove(currentNode);\n\t\t\treturn true;\n\t\t}\n\t\tconst tagName = transformCaseFunc(_readNodeName(currentNode));\n\t\tALLOWED_TAGS = _forkSharedAllowlist(hooks.uponSanitizeElement, ALLOWED_TAGS, DEFAULT_ALLOWED_TAGS, SET_CONFIG_ALLOWED_TAGS);\n\t\t_executeHooks(hooks.uponSanitizeElement, currentNode, {\n\t\t\ttagName,\n\t\t\tallowedTags: ALLOWED_TAGS\n\t\t});\n\t\tif (_handleHookDetachedNode(currentNode, root)) return true;\n\t\tif (_isUnsafeNode(currentNode, tagName)) {\n\t\t\t_forceRemove(currentNode);\n\t\t\treturn true;\n\t\t}\n\t\tif (FORBID_TAGS[tagName] || !(EXTRA_ELEMENT_HANDLING.tagCheck instanceof Function && EXTRA_ELEMENT_HANDLING.tagCheck(tagName)) && !ALLOWED_TAGS[tagName]) {\n\t\t\tconst removed = _sanitizeDisallowedNode(currentNode, tagName, root);\n\t\t\tif (removed === false) {\n\t\t\t\t_executeHooks(hooks.afterSanitizeElements, currentNode, null);\n\t\t\t\tif (_handleHookDetachedNode(currentNode, root)) return true;\n\t\t\t}\n\t\t\treturn removed;\n\t\t}\n\t\tif (_readNodeType(currentNode) === NODE_TYPE.element && !_checkValidNamespace(currentNode)) {\n\t\t\t_forceRemove(currentNode);\n\t\t\treturn true;\n\t\t}\n\t\tif ((tagName === \"noscript\" || tagName === \"noembed\" || tagName === \"noframes\") && regExpTest(FALLBACK_TAG_CLOSE, currentNode.innerHTML)) {\n\t\t\t_forceRemove(currentNode);\n\t\t\treturn true;\n\t\t}\n\t\tif (SAFE_FOR_TEMPLATES && currentNode.nodeType === NODE_TYPE.text) {\n\t\t\tconst content = _stripTemplateExpressions(currentNode.textContent);\n\t\t\tif (currentNode.textContent !== content) {\n\t\t\t\tarrayPush(DOMPurify.removed, { element: currentNode.cloneNode() });\n\t\t\t\tcurrentNode.textContent = content;\n\t\t\t}\n\t\t}\n\t\t_executeHooks(hooks.afterSanitizeElements, currentNode, null);\n\t\treturn _handleHookDetachedNode(currentNode, root);\n\t};\n\t/**\n\t* _isValidAttribute\n\t*\n\t* @param lcTag Lowercase tag name of containing element.\n\t* @param lcName Lowercase attribute name.\n\t* @param value Attribute value.\n\t* @return Returns true if `value` is valid, otherwise false.\n\t*/\n\tconst _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {\n\t\tif (FORBID_ATTR[lcName]) return false;\n\t\tif (_isPatchLinkageAttribute(lcName, lcTag)) return false;\n\t\tif (SANITIZE_DOM && (lcName === \"id\" || lcName === \"name\") && (value in document || value in formElement)) return false;\n\t\tconst nameIsPermitted = ALLOWED_ATTR[lcName] || EXTRA_ELEMENT_HANDLING.attributeCheck instanceof Function && EXTRA_ELEMENT_HANDLING.attributeCheck(lcName, lcTag);\n\t\tif (ALLOW_DATA_ATTR && regExpTest(DATA_ATTR$1, lcName)) return true;\n\t\tif (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR$1, lcName)) return true;\n\t\tif (!nameIsPermitted) return _isBasicCustomElement(lcTag) && _matchesNameCheck(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) && _matchesNameCheck(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName, lcTag) || lcName === \"is\" && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && _matchesNameCheck(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value);\n\t\tif (URI_SAFE_ATTRIBUTES[lcName]) return true;\n\t\tif (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE$1, \"\"))) return true;\n\t\tif ((lcName === \"src\" || lcName === \"xlink:href\" || lcName === \"href\") && lcTag !== \"script\" && stringIndexOf(value, \"data:\") === 0 && DATA_URI_TAGS[lcTag]) return true;\n\t\tif (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA$1, stringReplace(value, ATTR_WHITESPACE$1, \"\"))) return true;\n\t\treturn !value;\n\t};\n\tconst RESERVED_CUSTOM_ELEMENT_NAMES = addToSet({}, [\n\t\t\"annotation-xml\",\n\t\t\"color-profile\",\n\t\t\"font-face\",\n\t\t\"font-face-format\",\n\t\t\"font-face-name\",\n\t\t\"font-face-src\",\n\t\t\"font-face-uri\",\n\t\t\"missing-glyph\"\n\t]);\n\t/**\n\t* _isBasicCustomElement\n\t* checks if at least one dash is included in tagName, and it's not the first char\n\t* for more sophisticated checking see https://github.com/sindresorhus/validate-element-name\n\t*\n\t* @param tagName name of the tag of the node to sanitize\n\t* @returns Returns true if the tag name meets the basic criteria for a custom element, otherwise false.\n\t*/\n\tconst _isBasicCustomElement = function _isBasicCustomElement(tagName) {\n\t\treturn !RESERVED_CUSTOM_ELEMENT_NAMES[stringToLowerCase(tagName)] && regExpTest(CUSTOM_ELEMENT$1, tagName);\n\t};\n\t/**\n\t* Wrap an attribute value in the matching Trusted Types object when\n\t* the active policy requires it. Namespaced attributes pass through\n\t* unchanged (no TT support yet, see\n\t* https://bugs.chromium.org/p/chromium/issues/detail?id=1305293).\n\t*\n\t* @param lcTag lowercase tag name of the containing element\n\t* @param lcName lowercase attribute name\n\t* @param namespaceURI the attribute's namespace, if any\n\t* @param value the attribute value to wrap\n\t* @return the value, wrapped when Trusted Types demand it\n\t*/\n\tconst _applyTrustedTypesToAttribute = function _applyTrustedTypesToAttribute(lcTag, lcName, namespaceURI, value) {\n\t\tif (trustedTypesPolicy && typeof trustedTypes === \"object\" && typeof trustedTypes.getAttributeType === \"function\" && !namespaceURI) switch (trustedTypes.getAttributeType(lcTag, lcName)) {\n\t\t\tcase \"TrustedHTML\": return _createTrustedHTML(value);\n\t\t\tcase \"TrustedScriptURL\": return _createTrustedScriptURL(value);\n\t\t}\n\t\treturn value;\n\t};\n\t/**\n\t* Write a modified attribute value back onto the element. On\n\t* success, re-probe for clobbering introduced by the new value and\n\t* remove the element when found; otherwise, when this writeback is the\n\t* recreate half of the SANITIZE_NAMED_PROPS remove-and-recreate, pop the\n\t* removal entry that path recorded so it does not show as removed. On\n\t* failure, remove the attribute instead.\n\t*\n\t* Returns true only on a clean write (the value was set and the new value\n\t* introduced no clobbering). The caller uses that, together with its own\n\t* knowledge of whether this attribute pushed a DOMPurify.removed record, to\n\t* decide whether to pop that record. The pop must happen ONLY for the\n\t* named-prop remove-and-recreate; popping on any other value change (trim,\n\t* template scrubbing, Trusted Types) would consume an unrelated _forceRemove\n\t* subtree-cleanup record and let that detached subtree keep a live event\n\t* handler through the IN_PLACE neutralization pass (SO-001).\n\t*\n\t* @param currentNode the element carrying the attribute\n\t* @param name the attribute name as present on the element\n\t* @param namespaceURI the attribute's namespace, if any\n\t* @param value the new attribute value\n\t* @return true if the value was written without introducing clobbering\n\t*/\n\tconst _setAttributeValue = function _setAttributeValue(currentNode, name, namespaceURI, value) {\n\t\ttry {\n\t\t\tif (namespaceURI) currentNode.setAttributeNS(namespaceURI, name, value);\n\t\t\telse currentNode.setAttribute(name, value);\n\t\t\tif (_isClobbered(currentNode)) {\n\t\t\t\t_forceRemove(currentNode);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t} catch (_) {\n\t\t\t_removeAttribute(name, currentNode);\n\t\t\treturn false;\n\t\t}\n\t};\n\t/**\n\t* _sanitizeAttributes\n\t*\n\t* @protect attributes\n\t* @protect nodeName\n\t* @protect removeAttribute\n\t* @protect setAttribute\n\t*\n\t* @param currentNode to sanitize\n\t* @param root the current walk root\n\t*/\n\tconst _sanitizeAttributes = function _sanitizeAttributes(currentNode, root) {\n\t\t_executeHooks(hooks.beforeSanitizeAttributes, currentNode, null);\n\t\tif (_handleHookDetachedNode(currentNode, root)) return;\n\t\tconst attributes = currentNode.attributes;\n\t\tif (!attributes || _isClobbered(currentNode)) return;\n\t\tALLOWED_ATTR = _forkSharedAllowlist(hooks.uponSanitizeAttribute, ALLOWED_ATTR, DEFAULT_ALLOWED_ATTR, SET_CONFIG_ALLOWED_ATTR);\n\t\tconst hookEvent = {\n\t\t\tattrName: \"\",\n\t\t\tattrValue: \"\",\n\t\t\tkeepAttr: true,\n\t\t\tallowedAttributes: ALLOWED_ATTR,\n\t\t\tforceKeepAttr: void 0\n\t\t};\n\t\tlet l = attributes.length;\n\t\tconst lcTag = transformCaseFunc(currentNode.nodeName);\n\t\twhile (l--) {\n\t\t\tconst attr = attributes[l];\n\t\t\tconst name = attr.name, namespaceURI = attr.namespaceURI, attrValue = attr.value;\n\t\t\tconst lcName = transformCaseFunc(name);\n\t\t\tconst initValue = attrValue;\n\t\t\tlet value = name === \"value\" ? initValue : stringTrim(initValue);\n\t\t\tlet recreatedNamedProp = false;\n\t\t\thookEvent.attrName = lcName;\n\t\t\thookEvent.attrValue = value;\n\t\t\thookEvent.keepAttr = true;\n\t\t\thookEvent.forceKeepAttr = void 0;\n\t\t\t_executeHooks(hooks.uponSanitizeAttribute, currentNode, hookEvent);\n\t\t\tvalue = hookEvent.attrValue;\n\t\t\tif (SANITIZE_NAMED_PROPS && (lcName === \"id\" || lcName === \"name\") && stringIndexOf(value, SANITIZE_NAMED_PROPS_PREFIX) !== 0) {\n\t\t\t\t_removeAttribute(name, currentNode, attr);\n\t\t\t\tvalue = SANITIZE_NAMED_PROPS_PREFIX + value;\n\t\t\t\trecreatedNamedProp = true;\n\t\t\t}\n\t\t\tif (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i, value)) {\n\t\t\t\t_removeAttribute(name, currentNode, attr);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (lcName === \"attributename\" && stringMatch(value, \"href\")) {\n\t\t\t\t_removeAttribute(name, currentNode, attr);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (hookEvent.forceKeepAttr) continue;\n\t\t\tif (!hookEvent.keepAttr) {\n\t\t\t\t_removeAttribute(name, currentNode, attr);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(SELF_CLOSING_TAG, value)) {\n\t\t\t\t_removeAttribute(name, currentNode, attr);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (SAFE_FOR_TEMPLATES) value = _stripTemplateExpressions(value);\n\t\t\tif (!_isValidAttribute(lcTag, lcName, value)) {\n\t\t\t\t_removeAttribute(name, currentNode, attr);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvalue = _applyTrustedTypesToAttribute(lcTag, lcName, namespaceURI, value);\n\t\t\tif (value !== initValue) {\n\t\t\t\tif (_setAttributeValue(currentNode, name, namespaceURI, value) && recreatedNamedProp) arrayPop(DOMPurify.removed);\n\t\t\t}\n\t\t}\n\t\t_executeHooks(hooks.afterSanitizeAttributes, currentNode, null);\n\t\t_handleHookDetachedNode(currentNode, root);\n\t};\n\t/**\n\t* _sanitizeShadowDOM\n\t*\n\t* @param fragment to iterate over recursively\n\t*/\n\tconst _sanitizeShadowDOM2 = function _sanitizeShadowDOM(fragment) {\n\t\tlet shadowNode = null;\n\t\tconst shadowIterator = _createNodeIterator(fragment);\n\t\t_executeHooks(hooks.beforeSanitizeShadowDOM, fragment, null);\n\t\twhile (shadowNode = shadowIterator.nextNode()) {\n\t\t\t_executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null);\n\t\t\t_sanitizeElements(shadowNode, fragment);\n\t\t\t_sanitizeAttributes(shadowNode, fragment);\n\t\t\tif (_isDocumentFragment(shadowNode.content)) _sanitizeShadowDOM2(shadowNode.content);\n\t\t\tif (_readNodeType(shadowNode) === NODE_TYPE.element) {\n\t\t\t\tconst innerSr = getShadowRoot(shadowNode);\n\t\t\t\tif (_isDocumentFragment(innerSr)) {\n\t\t\t\t\t_sanitizeAttachedShadowRoots(innerSr);\n\t\t\t\t\t_sanitizeShadowDOM2(innerSr);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t_executeHooks(hooks.afterSanitizeShadowDOM, fragment, null);\n\t};\n\t/**\n\t* _sanitizeAttachedShadowRoots\n\t*\n\t* Walks `root` and feeds every attached shadow root we encounter into\n\t* the existing _sanitizeShadowDOM pipeline. The default node iterator\n\t* does not descend into shadow trees, so nodes inside an attached\n\t* shadow root would otherwise be skipped entirely.\n\t*\n\t* Two real input paths put attached shadow roots in front of us:\n\t* 1. IN_PLACE on a DOM node that already has shadow roots attached.\n\t* 2. DOM-node input where importNode(dirty, true) deep-clones the\n\t* shadow root because it was created with `clonable: true`.\n\t*\n\t* This pass runs once, up front, so the main iteration loop (and the\n\t* existing _sanitizeShadowDOM template-content recursion) stay\n\t* untouched — string-input paths are not affected.\n\t*\n\t* @param root the subtree root to walk for attached shadow roots\n\t*/\n\tconst _sanitizeAttachedShadowRoots = function _sanitizeAttachedShadowRoots(root) {\n\t\tconst stack = [{\n\t\t\tnode: root,\n\t\t\tshadow: null\n\t\t}];\n\t\twhile (stack.length > 0) {\n\t\t\tconst item = stack.pop();\n\t\t\tif (item.shadow) {\n\t\t\t\t_sanitizeShadowDOM2(item.shadow);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst node = item.node;\n\t\t\tconst isElement = _readNodeType(node) === NODE_TYPE.element;\n\t\t\tconst childNodes = getChildNodes(node);\n\t\t\tif (childNodes) for (let i = childNodes.length - 1; i >= 0; --i) stack.push({\n\t\t\t\tnode: childNodes[i],\n\t\t\t\tshadow: null\n\t\t\t});\n\t\t\tif (isElement) {\n\t\t\t\tconst rootName = getNodeName ? getNodeName(node) : null;\n\t\t\t\tif (typeof rootName === \"string\" && transformCaseFunc(rootName) === \"template\") {\n\t\t\t\t\tconst content = node.content;\n\t\t\t\t\tif (_isDocumentFragment(content)) stack.push({\n\t\t\t\t\t\tnode: content,\n\t\t\t\t\t\tshadow: null\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (isElement) {\n\t\t\t\tconst sr = getShadowRoot(node);\n\t\t\t\tif (_isDocumentFragment(sr)) stack.push({\n\t\t\t\t\tnode: null,\n\t\t\t\t\tshadow: sr\n\t\t\t\t}, {\n\t\t\t\t\tnode: sr,\n\t\t\t\t\tshadow: null\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t};\n\tDOMPurify.sanitize = function(dirty) {\n\t\tlet cfg = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};\n\t\tlet body = null;\n\t\tlet importedNode = null;\n\t\tlet currentNode = null;\n\t\tlet returnNode = null;\n\t\tIS_EMPTY_INPUT = !dirty;\n\t\tif (IS_EMPTY_INPUT) dirty = \"<!-->\";\n\t\tif (typeof dirty !== \"string\" && !_isNode(dirty)) {\n\t\t\tdirty = stringifyValue(dirty);\n\t\t\tif (typeof dirty !== \"string\") throw typeErrorCreate(\"dirty is not a string, aborting\");\n\t\t}\n\t\tif (!DOMPurify.isSupported) return dirty;\n\t\tif (SET_CONFIG) {\n\t\t\tALLOWED_TAGS = SET_CONFIG_ALLOWED_TAGS;\n\t\t\tALLOWED_ATTR = SET_CONFIG_ALLOWED_ATTR;\n\t\t} else _parseConfig(cfg);\n\t\tif (hooks.uponSanitizeElement.length > 0 || hooks.uponSanitizeAttribute.length > 0) ALLOWED_TAGS = clone(ALLOWED_TAGS);\n\t\tif (hooks.uponSanitizeAttribute.length > 0) ALLOWED_ATTR = clone(ALLOWED_ATTR);\n\t\tDOMPurify.removed = [];\n\t\tconst inPlace = IN_PLACE && typeof dirty !== \"string\" && _isNode(dirty);\n\t\tif (inPlace) {\n\t\t\t_neutralizePatchLinkage(dirty);\n\t\t\tconst nn = _readNodeName(dirty);\n\t\t\tif (typeof nn === \"string\") {\n\t\t\t\tconst tagName = transformCaseFunc(nn);\n\t\t\t\tif (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n\t\t\t\t\t_neutralizeRoot(dirty);\n\t\t\t\t\tthrow typeErrorCreate(\"root node is forbidden and cannot be sanitized in-place\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (_isClobbered(dirty)) {\n\t\t\t\t_neutralizeRoot(dirty);\n\t\t\t\tthrow typeErrorCreate(\"root node is clobbered and cannot be sanitized in-place\");\n\t\t\t}\n\t\t\ttry {\n\t\t\t\t_sanitizeAttachedShadowRoots(dirty);\n\t\t\t} catch (error) {\n\t\t\t\t_neutralizeRoot(dirty);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t} else if (_isNode(dirty)) {\n\t\t\tbody = _initDocument(\"<!---->\");\n\t\t\timportedNode = body.ownerDocument.importNode(dirty, true);\n\t\t\tif (importedNode.nodeType === NODE_TYPE.element && importedNode.nodeName === \"BODY\") body = importedNode;\n\t\t\telse if (importedNode.nodeName === \"HTML\") body = importedNode;\n\t\t\telse body.appendChild(importedNode);\n\t\t\t_sanitizeAttachedShadowRoots(body);\n\t\t} else {\n\t\t\tif (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT && dirty.indexOf(\"<\") === -1) return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? _createTrustedHTML(dirty) : dirty;\n\t\t\tbody = _initDocument(dirty);\n\t\t\tif (!body) return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : \"\";\n\t\t}\n\t\tif (body && FORCE_BODY) _forceRemove(body.firstChild);\n\t\tconst walkRoot = inPlace ? dirty : body;\n\t\ttry {\n\t\t\tconst nodeIterator = _createNodeIterator(walkRoot);\n\t\t\twhile (currentNode = nodeIterator.nextNode()) {\n\t\t\t\t_sanitizeElements(currentNode, walkRoot);\n\t\t\t\t_sanitizeAttributes(currentNode, walkRoot);\n\t\t\t\tif (_isDocumentFragment(currentNode.content)) _sanitizeShadowDOM2(currentNode.content);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (inPlace) {\n\t\t\t\t_neutralizeRoot(dirty);\n\t\t\t\tarrayForEach(DOMPurify.removed, (entry) => {\n\t\t\t\t\tif (entry.element) _neutralizeSubtree(entry.element);\n\t\t\t\t});\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t\tif (inPlace) {\n\t\t\tlet rootWasRemoved = false;\n\t\t\tarrayForEach(DOMPurify.removed, (entry) => {\n\t\t\t\tif (entry.element) {\n\t\t\t\t\tif (entry.element === dirty) rootWasRemoved = true;\n\t\t\t\t\t_neutralizeSubtree(entry.element);\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (rootWasRemoved) throw typeErrorCreate(\"a node selected for removal could not be safely returned; refusing to sanitize in place\");\n\t\t\tif (SAFE_FOR_TEMPLATES) _scrubTemplateExpressions2(dirty);\n\t\t\treturn dirty;\n\t\t}\n\t\tif (RETURN_DOM) {\n\t\t\tif (SAFE_FOR_TEMPLATES) _scrubTemplateExpressions2(body);\n\t\t\tif (RETURN_DOM_FRAGMENT) {\n\t\t\t\treturnNode = createDocumentFragment.call(body.ownerDocument);\n\t\t\t\twhile (body.firstChild) returnNode.appendChild(body.firstChild);\n\t\t\t} else returnNode = body;\n\t\t\tif (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) returnNode = importNode.call(originalDocument, returnNode, true);\n\t\t\treturn returnNode;\n\t\t}\n\t\tlet serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\n\t\tif (WHOLE_DOCUMENT && ALLOWED_TAGS[\"!doctype\"] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) serializedHTML = \"<!DOCTYPE \" + body.ownerDocument.doctype.name + \">\\n\" + serializedHTML;\n\t\tif (SAFE_FOR_TEMPLATES) serializedHTML = _stripTemplateExpressions(serializedHTML);\n\t\treturn trustedTypesPolicy && RETURN_TRUSTED_TYPE ? _createTrustedHTML(serializedHTML) : serializedHTML;\n\t};\n\tDOMPurify.setConfig = function() {\n\t\tlet cfg = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};\n\t\t_parseConfig(cfg);\n\t\tSET_CONFIG = true;\n\t\tSET_CONFIG_ALLOWED_TAGS = ALLOWED_TAGS;\n\t\tSET_CONFIG_ALLOWED_ATTR = ALLOWED_ATTR;\n\t};\n\tDOMPurify.clearConfig = function() {\n\t\tCONFIG = null;\n\t\tSET_CONFIG = false;\n\t\tSET_CONFIG_ALLOWED_TAGS = null;\n\t\tSET_CONFIG_ALLOWED_ATTR = null;\n\t\ttrustedTypesPolicy = defaultTrustedTypesPolicy;\n\t\temptyHTML = \"\";\n\t};\n\tDOMPurify.isValidAttribute = function(tag, attr, value) {\n\t\tif (!CONFIG) _parseConfig({});\n\t\tconst lcTag = transformCaseFunc(tag);\n\t\tconst lcName = transformCaseFunc(attr);\n\t\treturn _isValidAttribute(lcTag, lcName, value);\n\t};\n\tDOMPurify.addHook = function(entryPoint, hookFunction) {\n\t\tif (typeof hookFunction !== \"function\") return;\n\t\tif (!objectHasOwnProperty(hooks, entryPoint)) return;\n\t\tarrayPush(hooks[entryPoint], hookFunction);\n\t};\n\tDOMPurify.removeHook = function(entryPoint, hookFunction) {\n\t\tif (!objectHasOwnProperty(hooks, entryPoint)) return;\n\t\tif (hookFunction !== void 0) {\n\t\t\tconst index = arrayLastIndexOf(hooks[entryPoint], hookFunction);\n\t\t\treturn index === -1 ? void 0 : arraySplice(hooks[entryPoint], index, 1)[0];\n\t\t}\n\t\treturn arrayPop(hooks[entryPoint]);\n\t};\n\tDOMPurify.removeHooks = function(entryPoint) {\n\t\tif (!objectHasOwnProperty(hooks, entryPoint)) return;\n\t\thooks[entryPoint] = [];\n\t};\n\tDOMPurify.removeAllHooks = function() {\n\t\thooks = _createHooksMap();\n\t};\n\treturn DOMPurify;\n}\nvar purify_default = createDOMPurify();\nexport { purify_default as default };\n\n//# sourceMappingURL=purify.es.mjs.map","class MakeTool {\n constructor(editor, title) {\n this.editor = editor;\n this.defaultText = `${title} text`; // Default text if nothing is selected\n this.button = this.createButton();\n this.title = title\n }\n\n // Create a button element (can be overridden in child classes)\n createButton(iconHtml) {\n const btn = document.createElement('button');\n const btnClass = this.title ? `${this.title.replace(/ /g, '-')}-btn`.toLowerCase() : '';\n btn.innerHTML = iconHtml;\n const svg = btn.querySelector('svg');\n if (svg) svg.setAttribute('aria-hidden', 'true');\n btn.type = 'button';\n // The class stays keyed on the English title so styling and tests are\n // unaffected by translation; only what the user sees is translated.\n btn.title = this.title ? this.editor.label(this.title) : this.title;\n btn.className = `markdown-btn ${btnClass} fj:me-btn fj:me-btn-xs fj:me-btn-square fj:me-btn-ghost`;\n btn.addEventListener('click', (event) => this.applySyntax(event)); // Default to 'both', can change in child\n\n if(btnClass == 'preview-btn') {\n const btnWrapper = document.createElement('div');\n btnWrapper.className = 'fj:me-surface fj:me-surface-outline fj:border-base-soft fj:border-0 fj:border-l fj:sticky fj:-right-2 fj:px-1.5';\n btnWrapper.appendChild(btn);\n return btnWrapper;\n }\n \n return btn;\n }\n}\n\nexport default MakeTool;\n","import MakeTool from '../MakeTool.js';\n\nclass BoldTool extends MakeTool {\n constructor(editor) {\n super(editor, 'Bold');\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M7 5h6a3.5 3.5 0 0 1 0 7h-6l0 -7\" /><path d=\"M13 12h1a3.5 3.5 0 0 1 0 7h-7v-7\" /></svg>\n `)\n }\n\n applySyntax() {\n const textarea = this.editor.usertextarea;\n const { selectionStart, selectionEnd } = textarea;\n const value = textarea.value;\n const selectedText = value.substring(selectionStart, selectionEnd);\n\n let newText = '';\n let offset = 0;\n\n if (selectedText.startsWith('***') && selectedText.endsWith('***')) {\n // bold+italic selected → remove bold, keep italic\n newText = '*' + selectedText.slice(3, -3) + '*';\n } else if (selectedText.startsWith('**') && selectedText.endsWith('**')) {\n // full **text** selected → remove bold\n newText = selectedText.slice(2, -2);\n } else if (\n value.substring(selectionStart - 3, selectionStart) === '***' &&\n value.substring(selectionEnd, selectionEnd + 3) === '***'\n ) {\n // cursor inside ***text*** → remove bold, keep italic\n textarea.setSelectionRange(selectionStart - 3, selectionEnd + 3);\n this.editor.insertText(`*${selectedText}*`, 1, 1);\n return;\n } else if (\n value.substring(selectionStart - 2, selectionStart) === '**' &&\n value.substring(selectionEnd, selectionEnd + 2) === '**' &&\n value[selectionStart - 3] !== '*' &&\n value[selectionEnd + 2] !== '*'\n ) {\n // cursor inside **text** → remove bold\n textarea.setSelectionRange(selectionStart - 2, selectionEnd + 2);\n this.editor.insertText(selectedText, 0, 0);\n return;\n } else {\n newText = `**${selectedText || 'Bold text'}**`;\n if (!selectedText) offset = 2;\n }\n\n this.editor.insertText(newText, offset, offset);\n }\n}\n\nexport default BoldTool;\n","import MakeTool from '../MakeTool.js';\n\nclass ItalicTool extends MakeTool {\n constructor(editor) {\n // Call the parent constructor with the markdown syntax for italic (*)\n super(editor, 'Italic');\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M11 5l6 0\" /><path d=\"M7 19l6 0\" /><path d=\"M14 5l-4 14\" /></svg>\n `);\n }\n\n applySyntax() {\n const textarea = this.editor.usertextarea;\n const { selectionStart, selectionEnd } = textarea;\n const value = textarea.value;\n const selectedText = value.substring(selectionStart, selectionEnd);\n\n let newText = '';\n let offset = 0;\n\n if (selectedText.startsWith('***') && selectedText.endsWith('***')) {\n // bold+italic selected → remove italic, keep bold\n newText = '**' + selectedText.slice(3, -3) + '**';\n } else if (selectedText.startsWith('*') && selectedText.endsWith('*') && !selectedText.startsWith('**')) {\n // full *text* selected → remove italic\n newText = selectedText.slice(1, -1);\n } else if (\n value.substring(selectionStart - 3, selectionStart) === '***' &&\n value.substring(selectionEnd, selectionEnd + 3) === '***'\n ) {\n // cursor inside ***text*** → remove italic, keep bold\n textarea.setSelectionRange(selectionStart - 3, selectionEnd + 3);\n this.editor.insertText(`**${selectedText}**`, 2, 2);\n return;\n } else if (\n value[selectionStart - 1] === '*' &&\n value[selectionEnd] === '*' &&\n value[selectionStart - 2] !== '*' &&\n value[selectionEnd + 1] !== '*'\n ) {\n // cursor inside *text* → remove italic\n textarea.setSelectionRange(selectionStart - 1, selectionEnd + 1);\n this.editor.insertText(selectedText, 0, 0);\n return;\n } else {\n newText = `*${selectedText || 'Italic text'}*`;\n if (!selectedText) offset = 1;\n }\n\n this.editor.insertText(newText, offset, offset);\n }\n}\n\nexport default ItalicTool;","import MakeTool from '../MakeTool.js';\n\nclass StrikethroughTool extends MakeTool {\n constructor(editor) {\n // Call the parent constructor with the markdown syntax for strikethrough (~~)\n super(editor, 'Strikethrough');\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M5 12l14 0\" /><path d=\"M16 6.5a4 2 0 0 0 -4 -1.5h-1a3.5 3.5 0 0 0 0 7h2a3.5 3.5 0 0 1 0 7h-1.5a4 2 0 0 1 -4 -1.5\" /></svg>\n `);\n }\n\n applySyntax() {\n const textarea = this.editor.usertextarea;\n const { selectionStart, selectionEnd } = textarea;\n const value = textarea.value;\n const selectedText = value.substring(selectionStart, selectionEnd);\n\n const syntax = '~~';\n let newText = '';\n let offset = 0;\n\n if (selectedText.startsWith(syntax) && selectedText.endsWith(syntax)) {\n // full ~~text~~ selected → remove\n newText = selectedText.slice(syntax.length, -syntax.length);\n } else if (\n value.substring(selectionStart - 2, selectionStart) === syntax &&\n value.substring(selectionEnd, selectionEnd + 2) === syntax\n ) {\n // cursor inside ~~text~~ → remove\n textarea.setSelectionRange(selectionStart - 2, selectionEnd + 2);\n this.editor.insertText(selectedText, 0, 0);\n return;\n } else {\n newText = `${syntax}${selectedText || 'Strikethrough text'}${syntax}`;\n offset = syntax.length;\n }\n\n this.editor.insertText(newText, offset, offset);\n }\n}\n\nexport default StrikethroughTool;","import MakeTool from '../MakeTool.js';\n\nclass ULTool extends MakeTool {\n constructor(editor) {\n super(editor, 'Unordered list');\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M9 6l11 0\" /><path d=\"M9 12l11 0\" /><path d=\"M9 18l11 0\" /><path d=\"M5 6l0 .01\" /><path d=\"M5 12l0 .01\" /><path d=\"M5 18l0 .01\" /></svg>\n `);\n }\n \n applySyntax() {\n const textarea = this.editor.usertextarea;\n const { selectionStart, selectionEnd } = textarea;\n const value = textarea.value;\n const selectedText = value.substring(selectionStart, selectionEnd);\n\n const syntax = '- ';\n let newText = '';\n let offset = 0;\n\n if (selectedText.startsWith(syntax)) {\n newText = selectedText.slice(syntax.length);\n } else if (value.substring(selectionStart - syntax.length, selectionStart) === syntax) {\n textarea.setSelectionRange(selectionStart - syntax.length, selectionEnd);\n this.editor.insertText(selectedText, 0, 0);\n return;\n } else {\n newText = `${syntax}${selectedText || 'Unordered list'}`;\n offset = syntax.length;\n }\n\n this.editor.insertText(newText, offset);\n }\n}\n\n\nexport default ULTool;","import MakeTool from '../MakeTool.js';\n\nclass OLTool extends MakeTool {\n constructor(editor) {\n super(editor, 'Ordered list');\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M11 6h9\" /><path d=\"M11 12h9\" /><path d=\"M12 18h8\" /><path d=\"M4 16a2 2 0 1 1 4 0c0 .591 -.5 1 -1 1.5l-3 2.5h4\" /><path d=\"M6 10v-6l-2 2\" /></svg>\n `);\n }\n \n applySyntax() {\n const textarea = this.editor.usertextarea;\n const { selectionStart, selectionEnd } = textarea;\n const value = textarea.value;\n const selectedText = value.substring(selectionStart, selectionEnd);\n\n const syntax = '1. ';\n let newText = '';\n let offset = 0;\n\n if (selectedText.startsWith(syntax)) {\n newText = selectedText.slice(syntax.length);\n } else if (value.substring(selectionStart - syntax.length, selectionStart) === syntax) {\n textarea.setSelectionRange(selectionStart - syntax.length, selectionEnd);\n this.editor.insertText(selectedText, 0, 0);\n return;\n } else {\n newText = `${syntax}${selectedText || 'Ordered list'}`;\n offset = syntax.length;\n }\n\n this.editor.insertText(newText, offset);\n }\n}\n\n\nexport default OLTool;","// #components/Toolbar/tools/PreviewToggleTool.js\nimport MakeTool from '../MakeTool.js';\n\nclass PreviewTool extends MakeTool {\n constructor(editor) {\n // No markdown syntax for preview toggle, so we call the parent constructor with empty values\n super(editor, 'Preview');\n this.preview = true;\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M12 4v16\" /><path d=\"M3 5a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-14\" /><path d=\"M12 13l7.5 -7.5\" /><path d=\"M12 18l8 -8\" /><path d=\"M15 20l5 -5\" /><path d=\"M12 8l4 -4\" /></svg>\n `);\n const btn = this.button.querySelector('button');\n if (btn) btn.setAttribute('aria-pressed', 'false');\n }\n\n // Override applySyntax to handle preview toggling\n applySyntax() {\n const previewWrapper = this.editor.previewContent?.parentNode;\n const editorDiv = this.editor.markdownEditorDiv;\n\n if (!previewWrapper || !editorDiv) return;\n\n // Toggle the preview's visibility by switching between 'block' and 'hidden' classes\n if (this.editor.preview && this.preview) {\n this.enablePreview(previewWrapper, editorDiv);\n } else {\n this.disablePreview(previewWrapper, editorDiv);\n }\n }\n\n // Method to hide the preview (disable it)\n disablePreview(previewWrapper, editorDiv) {\n\n this.preview = true;\n\n const textareaWrapper = editorDiv.querySelector(\".textarea-wrapper\");\n\n editorDiv.parentNode.classList.remove('is-fullscreen');\n\n editorDiv.classList.remove('fj:md:grid-cols-2');\n previewWrapper.classList.add('fj:hidden');\n textareaWrapper.classList.remove(\"fj:hidden\", \"fj:md:grid\");\n\n textareaWrapper.querySelector(\"textarea\").classList.remove(\"fj:h-full!\");\n\n if(textareaWrapper.querySelector(\".display-layer\")){\n textareaWrapper.querySelector(\".display-layer\").classList.remove(\"fj:h-full!\");\n }\n\n previewWrapper.classList.remove('fj:min-h-0');\n\n document.querySelector(\"body\").classList.remove('fj:overflow-hidden');\n\n document.removeEventListener('keydown', this._escHandler);\n\n this.editor._autoGrow();\n\n this.editor.editorContainer.querySelectorAll('.markdown-btn').forEach(button => {\n if (!button.classList.contains('preview-btn')) {\n button.classList.remove('fj:pointer-events-none', 'fj:md:pointer-events-auto', 'fj:opacity-25', 'fj:md:opacity-100');\n button.removeAttribute('aria-disabled');\n } else {\n button.classList.remove('fj:me-btn-active');\n button.setAttribute('aria-pressed', 'false');\n }\n });\n\n }\n\n // Method to show the preview (enable it)\n enablePreview(previewWrapper, editorDiv) {\n\n this.preview = false;\n\n const textareaWrapper = editorDiv.querySelector(\".textarea-wrapper\");\n\n editorDiv.parentNode.classList.add('is-fullscreen');\n\n editorDiv.classList.add('fj:md:grid-cols-2');\n previewWrapper.classList.remove('fj:hidden');\n textareaWrapper.classList.add(\"fj:hidden\", \"fj:md:grid\");\n\n // Clear inline height set by _autoGrow. An inline style would beat\n // the height in the .is-fullscreen rule.\n this.editor.editorContainer.style.height = '';\n\n textareaWrapper.querySelector(\"textarea\").classList.add(\"fj:h-full!\");\n\n if(textareaWrapper.querySelector(\".display-layer\")){\n textareaWrapper.querySelector(\".display-layer\").classList.add(\"fj:h-full!\");\n }\n\n previewWrapper.classList.add('fj:min-h-0');\n\n document.querySelector(\"body\").classList.add('fj:overflow-hidden');\n\n this._escHandler = (e) => {\n if (e.key === 'Escape') this.applySyntax();\n };\n document.addEventListener('keydown', this._escHandler);\n\n this.editor.render();\n\n const isMobile = window.matchMedia('(max-width: 767px)').matches;\n this.editor.editorContainer.querySelectorAll('.markdown-btn').forEach(button => {\n if (!button.classList.contains('preview-btn')) {\n button.classList.add('fj:pointer-events-none', 'fj:md:pointer-events-auto', 'fj:opacity-25', 'fj:md:opacity-100');\n button.setAttribute('aria-disabled', isMobile ? 'true' : 'false');\n } else {\n button.classList.add('fj:me-btn-active');\n button.setAttribute('aria-pressed', 'true');\n }\n });\n }\n\n destroy() {\n if (!this.preview) {\n document.removeEventListener('keydown', this._escHandler);\n document.querySelector('body')?.classList.remove('fj:overflow-hidden');\n }\n }\n}\n\nexport default PreviewTool;\n","import MakeTool from '../MakeTool.js';\n\nclass CheckListTool extends MakeTool {\n constructor(editor) {\n super(editor, 'Check list');\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M3.5 5.5l1.5 1.5l2.5 -2.5\" /><path d=\"M3.5 11.5l1.5 1.5l2.5 -2.5\" /><path d=\"M3.5 17.5l1.5 1.5l2.5 -2.5\" /><path d=\"M11 6l9 0\" /><path d=\"M11 12l9 0\" /><path d=\"M11 18l9 0\" /></svg>\n `);\n }\n \n applySyntax() {\n const textarea = this.editor.usertextarea;\n const { selectionStart, selectionEnd } = textarea;\n const value = textarea.value;\n const selectedText = value.substring(selectionStart, selectionEnd);\n\n const syntax = '- [x] ';\n const syntaxUnchecked = '- [ ] ';\n let newText = '';\n let offset = 0;\n\n if (selectedText.startsWith(syntax) || selectedText.startsWith(syntaxUnchecked)) {\n newText = selectedText.slice(syntax.length);\n } else {\n const before = value.substring(selectionStart - syntax.length, selectionStart);\n if (before === syntax || before === syntaxUnchecked) {\n textarea.setSelectionRange(selectionStart - syntax.length, selectionEnd);\n this.editor.insertText(selectedText, 0, 0);\n return;\n }\n newText = `${syntax}${selectedText || 'Check list'}`;\n offset = syntax.length;\n }\n\n this.editor.insertText(newText, offset);\n }\n}\n\n\nexport default CheckListTool;","import MakeTool from '../MakeTool.js';\n\nclass BlockQuoteTool extends MakeTool {\n constructor(editor) {\n // Call the parent constructor with the markdown syntax for italic (*)\n super(editor, 'Blockquote');\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M10 11h-4a1 1 0 0 1 -1 -1v-3a1 1 0 0 1 1 -1h3a1 1 0 0 1 1 1v6c0 2.667 -1.333 4.333 -4 5\" /><path d=\"M19 11h-4a1 1 0 0 1 -1 -1v-3a1 1 0 0 1 1 -1h3a1 1 0 0 1 1 1v6c0 2.667 -1.333 4.333 -4 5\" /></svg>\n `);\n }\n\n applySyntax() {\n const textarea = this.editor.usertextarea;\n const { selectionStart, selectionEnd } = textarea;\n const value = textarea.value;\n const selectedText = value.substring(selectionStart, selectionEnd);\n\n const syntax = '>';\n let newText = '';\n let offset = 0;\n\n if (selectedText.startsWith(syntax)) {\n newText = selectedText.slice(syntax.length);\n } else if (value.substring(selectionStart - syntax.length, selectionStart) === syntax) {\n textarea.setSelectionRange(selectionStart - syntax.length, selectionEnd);\n this.editor.insertText(selectedText, 0, 0);\n return;\n } else {\n newText = `${syntax}${selectedText || 'Blockquote text'}`;\n if (!selectedText) offset = syntax.length;\n }\n\n this.editor.insertText(newText, offset);\n }\n}\n\nexport default BlockQuoteTool;","export function modal(event, size, bodyHTML, label = '') {\n const self = event.target;\n const mde = self.closest(\".markdown-editor-wrapper\");\n if (mde.querySelector(\".markdown-modal\")) {\n mde.querySelector(\".markdown-modal\").remove();\n }\n\n const ariaAttr = label ? `aria-label=\"${label}\"` : '';\n const modalHTML = `\n <dialog class=\"markdown-modal fj:me-modal fj:me-modal-top fj:lg:me-modal-middle fj:me-modal-center\" id=\"nezanuha_toggleModal\" ${ariaAttr}>\n <div class=\"fj:me-modal-content ${size}\">\n ${bodyHTML}\n </div>\n </dialog>\n `;\n\n if (!mde.querySelector(\".markdown-modal\")) {\n mde.insertAdjacentHTML(\"beforeend\", modalHTML);\n }\n\n const modal = mde.querySelector(\".markdown-modal\");\n modal.addEventListener('close', () => modal.remove());\n modal.showModal();\n return modal;\n}","import MakeTool from '../MakeTool.js';\nimport { modal } from '../../modal.js';\n\nclass LinkTool extends MakeTool {\n constructor(editor) {\n super(editor, 'Link');\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M9 15l6 -6\" /><path d=\"M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464\" /><path d=\"M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463\" /></svg>\n `);\n }\n\n // Apply link syntax [text](url)\n applySyntax(event) {\n let editor = this.editor;\n let textarea = editor.usertextarea;\n let { selectionStart, selectionEnd } = textarea;\n const fullText = textarea.value;\n\n // Auto-expand selection if the selected text is inside an existing link [text](url)\n const before = fullText.substring(0, selectionStart);\n const after = fullText.substring(selectionEnd);\n if (before.endsWith('[') && /^\\]\\([^)]+\\)/.test(after)) {\n const urlMatch = after.match(/^\\]\\(([^)]+)\\)/);\n if (urlMatch) {\n selectionStart = before.length - 1;\n selectionEnd = selectionEnd + urlMatch[0].length;\n textarea.setSelectionRange(selectionStart, selectionEnd);\n }\n }\n\n let selectedText = fullText.substring(selectionStart, selectionEnd);\n\n const linkRegex = /^\\[([^\\]]+)\\]\\(([^)]+)\\)$/;\n const match = selectedText && selectedText.match(linkRegex);\n\n const prefillText = match ? match[1] : selectedText;\n const prefillUrl = match ? match[2] : '';\n\n const bodyHTML = `\n <div class=\"fj:flex fj:justify-between fj:items-center fj:gap-3\">\n <div class=\"fj:font-medium\">${this.editor.label('Link')}</div>\n <button type=\"button\" class=\"modal-close-btn fj:me-btn fj:me-btn-ghost fj:me-btn-xs fj:me-btn-circle\" aria-label=\"${this.editor.label('Close')}\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/></svg>\n </button>\n </div>\n <form method=\"post\">\n <div class=\"fj:flex fj:flex-col fj:justify-center fj:gap-y-4.5 fj:mt-4\">\n <input type=\"url\" placeholder=\"${this.editor.label('URL')}\" class=\"link-input fj:me-input fj:w-full\" value=\"${prefillUrl}\" required>\n <input type=\"text\" placeholder=\"${this.editor.label('Link text')}\" class=\"link-text-input fj:me-input fj:w-full\" value=\"${prefillText}\" required>\n <button type=\"submit\" class=\"submit-link fj:me-btn fj:me-btn-sm fj:self-end\">${this.editor.label('Apply')}</button>\n </div>\n </form>`;\n\n const modalElement = modal(event, 'fj:max-w-sm', bodyHTML, 'Link');\n\n modalElement.querySelector(\".modal-close-btn\").addEventListener(\"click\", () => modalElement.close());\n\n modalElement.querySelector(\".submit-link\").addEventListener(\"click\", function(e) {\n e.preventDefault();\n const linkInput = modalElement.querySelector(\".link-input\");\n const linkTextInput = modalElement.querySelector(\".link-text-input\");\n\n if (!linkInput.validity.valid) {\n linkInput.reportValidity();\n } else if (!linkTextInput.validity.valid) {\n linkTextInput.reportValidity();\n } else {\n const link = linkInput.value;\n const linkText = linkTextInput.value || 'Link Text';\n editor.insertText(`[${linkText}](${link})`);\n modalElement.close();\n }\n });\n }\n \n}\n\nexport default LinkTool;","import MakeTool from '../MakeTool.js';\n\nclass HeadingTool extends MakeTool {\n constructor(editor) {\n super(editor, 'Heading');\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M7 12h10\" /><path d=\"M7 5v14\" /><path d=\"M17 5v14\" /><path d=\"M15 19h4\" /><path d=\"M15 5h4\" /><path d=\"M5 19h4\" /><path d=\"M5 5h4\" /></svg>\n `);\n }\n\n createButton(iconHtml) {\n const popoverId = `heading-popover-${Math.random().toString(36).slice(2, 7)}`;\n\n const btn = document.createElement('button');\n btn.innerHTML = iconHtml;\n const svg = btn.querySelector('svg');\n if (svg) svg.setAttribute('aria-hidden', 'true');\n btn.type = 'button';\n btn.title = this.editor.label('Heading');\n btn.setAttribute('aria-label', this.editor.label('Heading'));\n btn.setAttribute('aria-haspopup', 'menu');\n btn.className = 'markdown-btn heading-btn fj:me-btn fj:me-btn-xs fj:me-btn-square fj:me-btn-ghost fj:me-popover-toggle';\n btn.setAttribute('popovertarget', popoverId);\n\n const popoverContent = document.createElement('div');\n popoverContent.id = popoverId;\n popoverContent.setAttribute('role', 'menu');\n popoverContent.setAttribute('aria-label', this.editor.label('Heading level'));\n popoverContent.className = 'fj:me-popover-content';\n popoverContent.setAttribute('popover', '');\n\n const menu = document.createElement('ul');\n menu.className = 'fj:me-menu';\n menu.setAttribute('role', 'presentation');\n\n const headingClasses = ['fj:me-heading-xl', 'fj:me-heading-lg', 'fj:me-heading-md', 'fj:me-heading-sm', 'fj:me-heading-xs', 'fj:me-heading-xs'];\n\n for (let level = 1; level <= 6; level++) {\n const li = document.createElement('li');\n li.setAttribute('role', 'none');\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.setAttribute('role', 'menuitem');\n btn.className = `fj:me-menu-item ${headingClasses[level - 1]}`;\n btn.textContent = `${this.editor.label('Heading')} ${level}`;\n btn.addEventListener('click', () => {\n this.applyHeading(level);\n popoverContent.hidePopover();\n });\n li.appendChild(btn);\n menu.appendChild(li);\n }\n\n popoverContent.appendChild(menu);\n\n const wrapper = document.createElement('div');\n wrapper.className = 'fj:me-popover';\n wrapper.appendChild(btn);\n wrapper.appendChild(popoverContent);\n\n return wrapper;\n }\n\n applyHeading(level) {\n const textarea = this.editor.usertextarea;\n const { selectionStart, selectionEnd } = textarea;\n const value = textarea.value;\n\n // Always work on the full current line so existing heading prefixes are included\n const lineStart = value.lastIndexOf('\\n', selectionStart - 1) + 1;\n const lineEndRaw = value.indexOf('\\n', selectionEnd);\n const lineEnd = lineEndRaw === -1 ? value.length : lineEndRaw;\n\n const lineText = value.substring(lineStart, lineEnd);\n const existingLevel = (lineText.match(/^(#+)\\s/) || [])[1];\n const cleanText = lineText.replace(/^#+\\s*/, '');\n const prefix = `${'#'.repeat(level)} `;\n\n // Same level clicked again → remove heading\n const newText = (existingLevel && existingLevel.length === level)\n ? (cleanText || 'Heading')\n : (cleanText ? `${prefix}${cleanText}` : `${prefix}Heading`);\n\n textarea.value = `${value.substring(0, lineStart)}${newText}${value.substring(lineEnd)}`;\n textarea.focus();\n\n const textStart = lineStart + (newText === cleanText || newText === 'Heading' ? 0 : prefix.length);\n const textEnd = lineStart + newText.length;\n textarea.setSelectionRange(textStart, textEnd);\n\n this.editor.scrollToView();\n this.editor.render();\n this.editor.notifyChange();\n }\n\n applySyntax() {}\n}\n\nexport default HeadingTool;\n","/**\n * POSTs an image to the configured endpoint and returns where it was stored.\n *\n * Shared by the image modal and by paste/drop so both speak the same contract:\n * the server receives `image_file` plus any configured params, and answers with\n * { success, image_path, image_alt? }.\n */\nexport async function uploadImage(file, { uploadUrl, params = {}, alt = '' } = {}) {\n const formData = new FormData();\n formData.append('image_file', file);\n formData.append('image_alt', alt);\n for (const [key, value] of Object.entries(params)) {\n formData.append(key, value);\n }\n\n const res = await fetch(uploadUrl, { method: 'POST', body: formData });\n if (!res.ok) throw new Error(`Upload failed: ${res.status}`);\n\n const result = await res.json();\n if (!result.success || !result.image_path) {\n throw new Error(result.error || result.message || 'Image upload failed.');\n }\n\n return { path: result.image_path, alt: result.image_alt || '' };\n}\n","import MakeTool from '../MakeTool.js';\nimport { modal } from '../../modal.js';\nimport { uploadImage } from '../../../utils/imageUpload.js';\n\nclass ImageTool extends MakeTool {\n constructor(editor, config = {}) {\n super(editor, 'Image link');\n this.config = config;\n this.fileInputConfig = config.fileInput || false;\n // Logic: Respect config or default to true\n this.altInputConfig = config.altInput !== undefined ? config.altInput : { required: true };\n \n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M15 8h.01\" /><path d=\"M12.5 21h-6.5a3 3 0 0 1 -3 -3v-12a3 3 0 0 1 3 -3h12a3 3 0 0 1 3 3v6.5\" /><path d=\"M3 16l5 -5c.928 -.893 2.072 -.893 3 0l4 4\" /><path d=\"M14 14l1 -1c.67 -.644 1.45 -.824 2.182 -.54\" /><path d=\"M16 19h6\" /><path d=\"M19 16v6\" /></svg>\n `);\n }\n\n applySyntax(event) {\n const editor = this.editor;\n const textarea = editor.usertextarea;\n let { selectionStart, selectionEnd } = textarea;\n const fullText = textarea.value;\n\n // Auto-expand selection if the selected text is inside an existing image \n const before = fullText.substring(0, selectionStart);\n const after = fullText.substring(selectionEnd);\n if (before.endsWith('![') && /^\\]\\([^)]+\\)/.test(after)) {\n const urlMatch = after.match(/^\\]\\(([^)]+)\\)/);\n if (urlMatch) {\n selectionStart = before.length - 2;\n selectionEnd = selectionEnd + urlMatch[0].length;\n textarea.setSelectionRange(selectionStart, selectionEnd);\n }\n }\n\n const selectedText = fullText.substring(selectionStart, selectionEnd);\n\n const acceptFormats = this.fileInputConfig.accept\n ? this.fileInputConfig.accept.map(type => `image/${type}`).join(',')\n : 'image/*';\n\n const isAltRequired = typeof this.altInputConfig === 'boolean'\n ? this.altInputConfig\n : (this.altInputConfig.required !== false);\n\n const uploadUrl = this.fileInputConfig.uploadUrl || null;\n const customParams = this.fileInputConfig.params || {};\n\n const imageRegex = /^!\\[([^\\]]*)\\]\\(([^)]+)\\)$/;\n const imageMatch = selectedText && selectedText.match(imageRegex);\n const prefillAlt = imageMatch ? imageMatch[1] : selectedText;\n const prefillUrl = imageMatch ? imageMatch[2] : '';\n\n let fileInputTag = '';\n if (this.fileInputConfig) {\n fileInputTag = `\n <input type=\"file\" accept=\"${acceptFormats}\" class=\"img-file-input fj:me-input fj:w-full\">\n <div class=\"fj:me-divider fj:my-1\">OR</div>\n `;\n }\n\n const bodyHTML = `\n <div class=\"fj:flex fj:justify-between fj:items-center fj:gap-3\">\n <div class=\"fj:font-medium\">${editor.label('Image')}</div>\n <button type=\"button\" class=\"modal-close-btn fj:me-btn fj:me-btn-ghost fj:me-btn-xs fj:me-btn-circle\" aria-label=\"${editor.label('Close')}\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/></svg>\n </button>\n </div>\n <div class=\"fj:mt-4 fj:flex fj:flex-col fj:gap-y-4\">\n ${fileInputTag}\n <input type=\"url\" placeholder=\"${editor.label('URL')}\" class=\"img-link-input fj:me-input fj:w-full\" value=\"${prefillUrl}\" required>\n <input type=\"text\" placeholder=\"${editor.label('Alt text')}\" class=\"img-link-alt-input fj:me-input fj:w-full\" value=\"${prefillAlt}\" ${isAltRequired ? 'required' : ''}>\n <button type=\"button\" class=\"submit-img-link fj:me-btn fj:me-btn-sm fj:self-end\">${editor.label('Apply')}</button>\n </div>`;\n\n const modalElement = modal(event, 'fj:max-w-sm', bodyHTML, 'Image');\n modalElement.querySelector(\".modal-close-btn\").addEventListener(\"click\", () => modalElement.close());\n const submitBtn = modalElement.querySelector(\".submit-img-link\");\n\n submitBtn.addEventListener(\"click\", async (e) => {\n e.preventDefault();\n\n const fileInputSelector = modalElement.querySelector(\".img-file-input\");\n const urlInputSelector = modalElement.querySelector(\".img-link-input\");\n const imgFileAltInput = modalElement.querySelector(\".img-link-alt-input\");\n\n const hasFile = fileInputSelector?.files[0];\n\n // --- 1. PRE-VALIDATION ---\n // If we are uploading a file, the URL is currently empty, so we temporarily\n // disable the 'required' on URL just to check the Alt text.\n if (hasFile) {\n urlInputSelector.required = false; \n }\n\n // Check if Alt (and URL if no file) are valid according to config\n if (isAltRequired && !imgFileAltInput.validity.valid) {\n imgFileAltInput.reportValidity();\n if (hasFile) urlInputSelector.required = true; // Restore\n return;\n }\n\n if (!hasFile && !urlInputSelector.validity.valid) {\n urlInputSelector.reportValidity();\n return;\n }\n\n // --- 2. ASYNC UPLOAD ---\n if (hasFile && uploadUrl) {\n const file = fileInputSelector.files[0];\n submitBtn.disabled = true;\n submitBtn.textContent = editor.label('Uploading...');\n\n try {\n const { path, alt } = await uploadImage(file, {\n uploadUrl,\n params: customParams,\n alt: imgFileAltInput.value,\n });\n\n urlInputSelector.value = path;\n // Only take the server's suggestion when the user wrote nothing,\n // so a typed description is never silently replaced.\n if (alt && !imgFileAltInput.value.trim()) imgFileAltInput.value = alt;\n } catch (err) {\n alert(err.message || 'Upload failed.');\n submitBtn.disabled = false;\n submitBtn.textContent = editor.label('Apply');\n urlInputSelector.required = true; // Restore\n return;\n }\n\n submitBtn.disabled = false;\n submitBtn.textContent = editor.label('Apply');\n }\n\n // --- 3. FINAL INSERTION ---\n const imgLink = urlInputSelector.value;\n const imgLinkAlt = imgFileAltInput.value || '';\n const newText = ``;\n\n editor.insertText(newText);\n modalElement.close();\n });\n }\n}\n\nexport default ImageTool;","import MakeTool from '../MakeTool.js';\n\nclass UndoTool extends MakeTool {\n constructor(editor) {\n super(editor, 'Undo');\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M9 14l-4 -4l4 -4\" /><path d=\"M5 10h11a4 4 0 1 1 0 8h-1\" /></svg>\n `);\n }\n\n applySyntax() {\n // Check if Undo is available and perform the undo action\n const undoRedoManager = this.editor.undoRedoManager;\n if (undoRedoManager) {\n undoRedoManager.undo();\n }\n }\n}\n\nexport default UndoTool;","import MakeTool from '../MakeTool.js';\n\nclass RedoTool extends MakeTool {\n constructor(editor) {\n super(editor, 'Redo');\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M15 14l4 -4l-4 -4\" /><path d=\"M19 10h-11a4 4 0 1 0 0 8h1\" /></svg>\n `);\n }\n\n applySyntax() {\n // Check if Redo is available and perform the redo action\n const undoRedoManager = this.editor.undoRedoManager;\n if (undoRedoManager) {\n undoRedoManager.redo();\n }\n }\n}\n\nexport default RedoTool;\n","import MakeTool from '../MakeTool.js';\n\nclass IndentTool extends MakeTool {\n constructor(editor) {\n super(editor, 'Indent');\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M20 6l-11 0\" /><path d=\"M20 12l-7 0\" /><path d=\"M20 18l-11 0\" /><path d=\"M4 8l4 4l-4 4\" /></svg>\n `);\n }\n \n applySyntax() {\n const indentManager = this.editor.indentManager;\n if (indentManager) {\n indentManager.indent();\n this.editor.render();\n }\n }\n}\n\n\nexport default IndentTool;","import MakeTool from '../MakeTool.js';\n\nclass OutdentTool extends MakeTool {\n constructor(editor) {\n super(editor, 'Outdent');\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M20 6l-7 0\" /><path d=\"M20 12l-9 0\" /><path d=\"M20 18l-7 0\" /><path d=\"M8 8l-4 4l4 4\" /></svg>\n `);\n }\n \n applySyntax(e) {\n const indentManager = this.editor.indentManager;\n if (indentManager) {\n indentManager.outdent();\n this.editor.render();\n }\n }\n}\n\n\nexport default OutdentTool;","import MakeTool from '../MakeTool.js';\n\nclass CodeTool extends MakeTool {\n constructor(editor) {\n super(editor, 'Code');\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M7 8l-4 4l4 4\" /><path d=\"M17 8l4 4l-4 4\" /><path d=\"M14 4l-4 16\" /></svg>\n `);\n }\n\n applySyntax() {\n const textarea = this.editor.usertextarea;\n const { selectionStart, selectionEnd } = textarea;\n const value = textarea.value;\n const selectedText = value.substring(selectionStart, selectionEnd);\n\n // Toggle off: full `code` selected\n if (selectedText.startsWith('`') && selectedText.endsWith('`')) {\n this.editor.insertText(selectedText.slice(1, -1), 0, 0);\n return;\n }\n\n // Toggle off: cursor is inside `code`\n if (value[selectionStart - 1] === '`' && value[selectionEnd] === '`') {\n textarea.setSelectionRange(selectionStart - 1, selectionEnd + 1);\n this.editor.insertText(selectedText, 0, 0);\n return;\n }\n\n const newText = `\\`${selectedText || 'code'}\\``;\n this.editor.insertText(newText, 1, 1);\n }\n}\n\nexport default CodeTool;\n","import MakeTool from '../MakeTool.js';\n\nclass CodeBlockTool extends MakeTool {\n constructor(editor) {\n super(editor, 'Code Block');\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M8 9l3 3l-3 3\" /><path d=\"M13 15l3 0\" /><rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\" /></svg>\n `);\n }\n\n applySyntax() {\n const textarea = this.editor.usertextarea;\n const { selectionStart, selectionEnd } = textarea;\n const value = textarea.value;\n const selectedText = value.substring(selectionStart, selectionEnd);\n\n // Toggle off: full fenced block selected (``` ... ```)\n if (selectedText.startsWith('```') && selectedText.endsWith('```') && selectedText.length > 6) {\n const inner = selectedText.replace(/^```\\w*\\n?/, '').replace(/\\n?```$/, '');\n this.editor.insertText(inner, 0, 0);\n return;\n }\n\n const inner = selectedText || 'code';\n const newText = `\\`\\`\\`\\n${inner}\\n\\`\\`\\``;\n // offset 4 = past \"```\\n\"; trailing 4 = past \"\\n```\" — selects the inner content\n this.editor.insertText(newText, 4, 4);\n }\n}\n\nexport default CodeBlockTool;\n","import MakeTool from '../MakeTool.js';\n\nclass HrTool extends MakeTool {\n constructor(editor) {\n super(editor, 'Horizontal Rule');\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M4 12l16 0\" stroke-width=\"3\"/><path d=\"M4 7l6 0\" /><path d=\"M4 17l6 0\" /><path d=\"M14 7l6 0\" /><path d=\"M14 17l6 0\" /></svg>\n `);\n }\n\n applySyntax() {\n const textarea = this.editor.usertextarea;\n const { selectionStart } = textarea;\n const value = textarea.value;\n\n const atLineStart = selectionStart === 0 || value[selectionStart - 1] === '\\n';\n const text = atLineStart ? '---\\n' : '\\n\\n---\\n';\n this.editor.insertText(text, text.length, 0);\n }\n}\n\nexport default HrTool;\n","import MakeTool from '../MakeTool.js';\n\nclass TableTool extends MakeTool {\n constructor(editor) {\n super(editor, 'Table');\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M3 5a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-14z\" /><path d=\"M3 10h18\" /><path d=\"M10 3v18\" /></svg>\n `);\n }\n\n applySyntax() {\n const textarea = this.editor.usertextarea;\n const { selectionStart } = textarea;\n const value = textarea.value;\n\n const template = `| Column 1 | Column 2 | Column 3 |\\n| --- | --- | --- |\\n| Cell | Cell | Cell |\\n| Cell | Cell | Cell |`;\n const atLineStart = selectionStart === 0 || value[selectionStart - 1] === '\\n';\n const text = atLineStart ? template : `\\n${template}`;\n this.editor.insertText(text, text.length, 0);\n }\n}\n\nexport default TableTool;\n","/**\n * Variables are configured either flat or grouped, and the two forms can be\n * mixed in one list:\n *\n * { label: 'Customer Name', value: '{{customer.name}}', sample: 'Hannes' }\n * { label: 'Customer', items: [ { label: 'Email', value: '{{customer.email}}' } ] }\n *\n * Returns every usable leaf entry, dropping malformed ones rather than throwing,\n * so one bad line of config cannot take the whole editor down.\n */\nexport function flattenVariables(variables) {\n const usable = entry => entry && entry.label && typeof entry.value === 'string';\n const out = [];\n\n for (const entry of Array.isArray(variables) ? variables : []) {\n if (!entry) continue;\n if (Array.isArray(entry.items)) {\n out.push(...entry.items.filter(usable));\n } else if (usable(entry)) {\n out.push(entry);\n }\n }\n\n return out;\n}\n\n/**\n * Swaps each variable that declares a sample for that sample, so the preview can\n * show representative text. Variables without a sample are left as written.\n * Only ever applied to a copy on its way to the renderer; the textarea keeps the\n * real placeholders.\n */\nexport function applyVariableSamples(markdown, variables) {\n const samples = flattenVariables(variables).filter(v => typeof v.sample === 'string');\n if (!samples.length) return markdown;\n\n // Longest value first, so a variable that is a prefix of another cannot\n // consume it, e.g. {{user}} must not break {{user.email}}.\n return samples\n .slice()\n .sort((a, b) => b.value.length - a.value.length)\n .reduce((text, v) => text.split(v.value).join(v.sample), markdown);\n}\n","// #components/Toolbar/tools/VariableTool.js\nimport MakeTool from '../MakeTool.js';\nimport { flattenVariables } from '../../../utils/variables.js';\n\nconst ICON = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M7 4a2 2 0 0 0 -2 2v3a2 2 0 0 1 -2 2a2 2 0 0 1 2 2v3a2 2 0 0 0 2 2\" /><path d=\"M17 4a2 2 0 0 1 2 2v3a2 2 0 0 0 2 2a2 2 0 0 0 -2 2v3a2 2 0 0 1 -2 2\" /></svg>\n`;\n\nclass VariableTool extends MakeTool {\n constructor(editor) {\n // MakeTool's constructor calls createButton(), so read config from\n // this.editor there rather than from a field assigned after super()\n super(editor, 'Variables');\n }\n\n createButton() {\n // Parsed by the editor at construction; reading it here rather than from\n // the config argument avoids MakeTool's constructor ordering, which calls\n // createButton() before any field assigned after super() exists.\n const variables = this.editor.variables ?? [];\n\n // Nothing usable configured means no button at all, not an empty dropdown\n if (!flattenVariables(variables).length) return null;\n\n const popoverId = `variable-popover-${Math.random().toString(36).slice(2, 7)}`;\n\n const btn = document.createElement('button');\n btn.innerHTML = ICON;\n btn.querySelector('svg')?.setAttribute('aria-hidden', 'true');\n btn.type = 'button';\n btn.title = this.editor.label('Insert variable');\n btn.setAttribute('aria-label', this.editor.label('Insert variable'));\n btn.setAttribute('aria-haspopup', 'menu');\n btn.className = 'markdown-btn variable-btn fj:me-btn fj:me-btn-xs fj:me-btn-square fj:me-btn-ghost fj:me-popover-toggle';\n btn.setAttribute('popovertarget', popoverId);\n\n const popoverContent = document.createElement('div');\n popoverContent.id = popoverId;\n popoverContent.setAttribute('role', 'menu');\n popoverContent.setAttribute('aria-label', this.editor.label('Variables'));\n popoverContent.className = 'fj:me-popover-content';\n popoverContent.setAttribute('popover', '');\n\n const menu = document.createElement('ul');\n menu.className = 'fj:me-menu';\n menu.setAttribute('role', 'presentation');\n\n const usable = entry => entry && entry.label && typeof entry.value === 'string';\n\n for (const entry of variables) {\n if (!entry) continue;\n\n if (Array.isArray(entry.items)) {\n const items = entry.items.filter(usable);\n if (!items.length) continue;\n\n const title = document.createElement('li');\n title.className = 'fj:me-menu-title';\n title.setAttribute('role', 'presentation');\n title.textContent = entry.label ?? '';\n\n const sublist = document.createElement('ul');\n sublist.setAttribute('role', 'group');\n if (entry.label) sublist.setAttribute('aria-label', entry.label);\n items.forEach(item => sublist.appendChild(this.createItem(item, popoverContent)));\n\n const holder = document.createElement('li');\n holder.setAttribute('role', 'none');\n holder.appendChild(sublist);\n\n menu.appendChild(title);\n menu.appendChild(holder);\n } else if (usable(entry)) {\n menu.appendChild(this.createItem(entry, popoverContent));\n }\n }\n\n popoverContent.appendChild(menu);\n\n const wrapper = document.createElement('div');\n wrapper.className = 'fj:me-popover';\n wrapper.appendChild(btn);\n wrapper.appendChild(popoverContent);\n\n return wrapper;\n }\n\n createItem(variable, popoverContent) {\n const li = document.createElement('li');\n li.setAttribute('role', 'none');\n\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.setAttribute('role', 'menuitem');\n btn.className = 'fj:me-menu-item';\n // textContent, never innerHTML — labels come from user config\n btn.textContent = variable.label;\n btn.title = variable.value;\n btn.addEventListener('click', () => {\n // insertText handles focus, caret, scroll, re-render and onChange\n this.editor.insertText(variable.value, variable.value.length, 0);\n popoverContent.hidePopover();\n });\n\n li.appendChild(btn);\n return li;\n }\n\n applySyntax() {}\n}\n\nexport default VariableTool;\n","import BoldTool from './tools/BoldTool.js';\nimport ItalicTool from './tools/ItalicTool.js';\nimport StrikethroughTool from './tools/StrikethroughTool.js';\nimport ULTool from './tools/ULTool.js';\nimport OLTool from './tools/OLTool.js';\nimport PreviewTool from './tools/PreviewTool.js'\nimport CheckListTool from './tools/CheckListTool.js';\nimport BlockQuoteTool from './tools/BlockQuoteTool.js';\nimport LinkTool from './tools/LinkTool.js'\nimport HeadingTool from './tools/HeadingTool.js';\nimport ImageTool from './tools/ImageTool.js';\nimport UndoTool from './tools/UndoTool.js';\nimport RedoTool from './tools/RedoTool.js';\nimport IndentTool from './tools/IndentTool.js';\nimport OutdentTool from './tools/OutdentTool.js';\nimport CodeTool from './tools/CodeTool.js';\nimport CodeBlockTool from './tools/CodeBlockTool.js';\nimport HrTool from './tools/HrTool.js';\nimport TableTool from './tools/TableTool.js';\nimport VariableTool from './tools/VariableTool.js';\n\nclass Toolbar {\n constructor(editor, options) {\n this.editor = editor;\n this.options = options;\n this.toolbar = document.createElement('div');\n this.toolbar.className = 'toolbar not-prose fj:me-surface fj:me-surface-outline fj:border-base-soft fj:border-0 fj:border-b fj:flex fj:items-center fj:gap-x-1 fj:p-1.5 fj:overflow-x-auto';\n this.toolbar.setAttribute('role', 'toolbar');\n this.toolbar.setAttribute('aria-label', 'Editor toolbar');\n this.init();\n }\n\n init() {\n const toolMapping = {\n heading: HeadingTool,\n ul: ULTool,\n ol: OLTool,\n checklist: CheckListTool,\n bold: BoldTool,\n italic: ItalicTool,\n strikethrough: StrikethroughTool,\n blockquote: BlockQuoteTool,\n code: CodeTool,\n codeblock: CodeBlockTool,\n hr: HrTool,\n table: TableTool,\n link: LinkTool,\n image: ImageTool,\n undo: UndoTool,\n redo: RedoTool,\n indent: IndentTool,\n outdent: OutdentTool,\n variables: VariableTool\n };\n\n this.options.forEach(tool => {\n let ToolClass, config;\n \n if (typeof tool === 'string') {\n ToolClass = toolMapping[tool];\n } else if (typeof tool === 'object') {\n const toolName = Object.keys(tool)[0];\n config = tool[toolName];\n ToolClass = toolMapping[toolName];\n }\n \n if (ToolClass) {\n const toolInstance = new ToolClass(this.editor, config);\n // A tool may decline to render, e.g. variables with nothing configured\n if (toolInstance.button) this.toolbar.appendChild(toolInstance.button);\n }\n });\n\n // Append preview button at the end\n if (this.options.includes('preview')) {\n const previewToolInstance = new PreviewTool(this.editor);\n this.editor.previewTool = previewToolInstance;\n this.toolbar.appendChild(previewToolInstance.button);\n }\n\n this.editor.editorContainer.insertBefore(this.toolbar, this.editor.markdownEditorDiv);\n }\n}\n\nexport default Toolbar;\n","class Preview {\n constructor(container) {\n this.previewContainer = document.createElement('div');\n this.previewContainer.className = 'preview-wrapper fj:p-2 fj:hidden fj:me-surface fj:me-surface-outline fj:border-base-soft fj:border-0 fj:border-l';\n this.previewContainer.setAttribute('role', 'region');\n this.previewContainer.setAttribute('aria-label', 'Preview');\n this.previewContent = document.createElement('div');\n this.previewContent.className = 'preview-content fj:mte-prose fj:mte-prose-sm fj:md:mte-prose-base fj:me-prose-frutjam fj:p-1.5 fj:overflow-y-auto fj:h-full fj:max-w-full';\n this.previewContainer.appendChild(this.previewContent);\n container.appendChild(this.previewContainer);\n }\n\n getPreviewContent() {\n return this.previewContent;\n }\n}\n\nexport default Preview;","class Footer {\n constructor(container, options = {}) {\n this.options = options;\n\n this.footer = document.createElement('div');\n this.footer.className = 'editor-footer not-prose fj:me-surface fj:me-surface-outline fj:border-base-soft fj:border-0 fj:border-t fj:flex fj:justify-between fj:items-center fj:px-3 fj:py-1 fj:text-xs fj:opacity-60 fj:select-none';\n this.footer.setAttribute('aria-hidden', 'true');\n\n this.positionEl = document.createElement('span');\n this.charsEl = document.createElement('span');\n this.wordsEl = document.createElement('span');\n\n if (this.options.line || this.options.col) {\n this.footer.appendChild(this.positionEl);\n }\n if (this.options.chars) {\n this.footer.appendChild(this.charsEl);\n }\n if (this.options.words) {\n this.footer.appendChild(this.wordsEl);\n }\n\n container.appendChild(this.footer);\n }\n\n update(textarea) {\n const value = textarea.value;\n const pos = textarea.selectionStart ?? 0;\n\n if (this.options.line || this.options.col) {\n const lines = value.substring(0, pos).split('\\n');\n const parts = [];\n if (this.options.line) parts.push(`Ln ${lines.length}`);\n if (this.options.col) parts.push(`Col ${lines[lines.length - 1].length + 1}`);\n this.positionEl.textContent = parts.join(', ');\n }\n\n if (this.options.chars) {\n this.charsEl.textContent = `${value.length.toLocaleString()} chars`;\n }\n\n if (this.options.words) {\n const wordCount = value.trim() ? value.trim().split(/\\s+/).length : 0;\n this.wordsEl.textContent = `${wordCount.toLocaleString()} words`;\n }\n }\n}\n\nexport default Footer;\n","export default class Diff {\n diff(oldStr, newStr, \n // Type below is not accurate/complete - see above for full possibilities - but it compiles\n options = {}) {\n let callback;\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n else if ('callback' in options) {\n callback = options.callback;\n }\n // Allow subclasses to massage the input prior to running\n const oldString = this.castInput(oldStr, options);\n const newString = this.castInput(newStr, options);\n const oldTokens = this.removeEmpty(this.tokenize(oldString, options));\n const newTokens = this.removeEmpty(this.tokenize(newString, options));\n return this.diffWithOptionsObj(oldTokens, newTokens, options, callback);\n }\n diffWithOptionsObj(oldTokens, newTokens, options, callback) {\n var _a;\n const done = (value) => {\n value = this.postProcess(value, options);\n if (callback) {\n setTimeout(function () { callback(value); }, 0);\n return undefined;\n }\n else {\n return value;\n }\n };\n const newLen = newTokens.length, oldLen = oldTokens.length;\n let editLength = 1;\n let maxEditLength = newLen + oldLen;\n if (options.maxEditLength != null) {\n maxEditLength = Math.min(maxEditLength, options.maxEditLength);\n }\n const maxExecutionTime = (_a = options.timeout) !== null && _a !== void 0 ? _a : Infinity;\n const abortAfterTimestamp = Date.now() + maxExecutionTime;\n const bestPath = [{ oldPos: -1, lastComponent: undefined }];\n // Seed editLength = 0, i.e. the content starts with the same values\n let newPos = this.extractCommon(bestPath[0], newTokens, oldTokens, 0, options);\n if (bestPath[0].oldPos + 1 >= oldLen && newPos + 1 >= newLen) {\n // Identity per the equality and tokenizer\n return done(this.buildValues(bestPath[0].lastComponent, newTokens, oldTokens));\n }\n // Once we hit the right edge of the edit graph on some diagonal k, we can\n // definitely reach the end of the edit graph in no more than k edits, so\n // there's no point in considering any moves to diagonal k+1 any more (from\n // which we're guaranteed to need at least k+1 more edits).\n // Similarly, once we've reached the bottom of the edit graph, there's no\n // point considering moves to lower diagonals.\n // We record this fact by setting minDiagonalToConsider and\n // maxDiagonalToConsider to some finite value once we've hit the edge of\n // the edit graph.\n // This optimization is not faithful to the original algorithm presented in\n // Myers's paper, which instead pointlessly extends D-paths off the end of\n // the edit graph - see page 7 of Myers's paper which notes this point\n // explicitly and illustrates it with a diagram. This has major performance\n // implications for some common scenarios. For instance, to compute a diff\n // where the new text simply appends d characters on the end of the\n // original text of length n, the true Myers algorithm will take O(n+d^2)\n // time while this optimization needs only O(n+d) time.\n let minDiagonalToConsider = -Infinity, maxDiagonalToConsider = Infinity;\n // Main worker method. checks all permutations of a given edit length for acceptance.\n const execEditLength = () => {\n for (let diagonalPath = Math.max(minDiagonalToConsider, -editLength); diagonalPath <= Math.min(maxDiagonalToConsider, editLength); diagonalPath += 2) {\n let basePath;\n const removePath = bestPath[diagonalPath - 1], addPath = bestPath[diagonalPath + 1];\n if (removePath) {\n // No one else is going to attempt to use this value, clear it\n // @ts-expect-error - perf optimisation. This type-violating value will never be read.\n bestPath[diagonalPath - 1] = undefined;\n }\n let canAdd = false;\n if (addPath) {\n // what newPos will be after we do an insertion:\n const addPathNewPos = addPath.oldPos - diagonalPath;\n canAdd = addPath && 0 <= addPathNewPos && addPathNewPos < newLen;\n }\n const canRemove = removePath && removePath.oldPos + 1 < oldLen;\n if (!canAdd && !canRemove) {\n // If this path is a terminal then prune\n // @ts-expect-error - perf optimisation. This type-violating value will never be read.\n bestPath[diagonalPath] = undefined;\n continue;\n }\n // Select the diagonal that we want to branch from. We select the prior\n // path whose position in the old string is the farthest from the origin\n // and does not pass the bounds of the diff graph\n if (!canRemove || (canAdd && removePath.oldPos < addPath.oldPos)) {\n basePath = this.addToPath(addPath, true, false, 0, options);\n }\n else {\n basePath = this.addToPath(removePath, false, true, 1, options);\n }\n newPos = this.extractCommon(basePath, newTokens, oldTokens, diagonalPath, options);\n if (basePath.oldPos + 1 >= oldLen && newPos + 1 >= newLen) {\n // If we have hit the end of both strings, then we are done\n return done(this.buildValues(basePath.lastComponent, newTokens, oldTokens)) || true;\n }\n else {\n bestPath[diagonalPath] = basePath;\n if (basePath.oldPos + 1 >= oldLen) {\n maxDiagonalToConsider = Math.min(maxDiagonalToConsider, diagonalPath - 1);\n }\n if (newPos + 1 >= newLen) {\n minDiagonalToConsider = Math.max(minDiagonalToConsider, diagonalPath + 1);\n }\n }\n }\n editLength++;\n };\n // Performs the length of edit iteration. Is a bit fugly as this has to support the\n // sync and async mode which is never fun. Loops over execEditLength until a value\n // is produced, or until the edit length exceeds options.maxEditLength (if given),\n // in which case it will return undefined.\n if (callback) {\n (function exec() {\n setTimeout(function () {\n if (editLength > maxEditLength || Date.now() > abortAfterTimestamp) {\n return callback(undefined);\n }\n if (!execEditLength()) {\n exec();\n }\n }, 0);\n }());\n }\n else {\n while (editLength <= maxEditLength && Date.now() <= abortAfterTimestamp) {\n const ret = execEditLength();\n if (ret) {\n return ret;\n }\n }\n }\n }\n addToPath(path, added, removed, oldPosInc, options) {\n const last = path.lastComponent;\n if (last && !options.oneChangePerToken && last.added === added && last.removed === removed) {\n return {\n oldPos: path.oldPos + oldPosInc,\n lastComponent: { count: last.count + 1, added: added, removed: removed, previousComponent: last.previousComponent }\n };\n }\n else {\n return {\n oldPos: path.oldPos + oldPosInc,\n lastComponent: { count: 1, added: added, removed: removed, previousComponent: last }\n };\n }\n }\n extractCommon(basePath, newTokens, oldTokens, diagonalPath, options) {\n const newLen = newTokens.length, oldLen = oldTokens.length;\n let oldPos = basePath.oldPos, newPos = oldPos - diagonalPath, commonCount = 0;\n while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(oldTokens[oldPos + 1], newTokens[newPos + 1], options)) {\n newPos++;\n oldPos++;\n commonCount++;\n if (options.oneChangePerToken) {\n basePath.lastComponent = { count: 1, previousComponent: basePath.lastComponent, added: false, removed: false };\n }\n }\n if (commonCount && !options.oneChangePerToken) {\n basePath.lastComponent = { count: commonCount, previousComponent: basePath.lastComponent, added: false, removed: false };\n }\n basePath.oldPos = oldPos;\n return newPos;\n }\n equals(left, right, options) {\n if (options.comparator) {\n return options.comparator(left, right);\n }\n else {\n return left === right\n || (!!options.ignoreCase && left.toLowerCase() === right.toLowerCase());\n }\n }\n removeEmpty(array) {\n const ret = [];\n for (let i = 0; i < array.length; i++) {\n if (array[i]) {\n ret.push(array[i]);\n }\n }\n return ret;\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n castInput(value, options) {\n return value;\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n tokenize(value, options) {\n return Array.from(value);\n }\n join(chars) {\n // Assumes ValueT is string, which is the case for most subclasses.\n // When it's false, e.g. in diffArrays, this method needs to be overridden (e.g. with a no-op)\n // Yes, the casts are verbose and ugly, because this pattern - of having the base class SORT OF\n // assume tokens and values are strings, but not completely - is weird and janky.\n return chars.join('');\n }\n postProcess(changeObjects, \n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n options) {\n return changeObjects;\n }\n get useLongestToken() {\n return false;\n }\n buildValues(lastComponent, newTokens, oldTokens) {\n // First we convert our linked list of components in reverse order to an\n // array in the right order:\n const components = [];\n let nextComponent;\n while (lastComponent) {\n components.push(lastComponent);\n nextComponent = lastComponent.previousComponent;\n delete lastComponent.previousComponent;\n lastComponent = nextComponent;\n }\n components.reverse();\n const componentLen = components.length;\n let componentPos = 0, newPos = 0, oldPos = 0;\n for (; componentPos < componentLen; componentPos++) {\n const component = components[componentPos];\n if (!component.removed) {\n if (!component.added && this.useLongestToken) {\n let value = newTokens.slice(newPos, newPos + component.count);\n value = value.map(function (value, i) {\n const oldValue = oldTokens[oldPos + i];\n return oldValue.length > value.length ? oldValue : value;\n });\n component.value = this.join(value);\n }\n else {\n component.value = this.join(newTokens.slice(newPos, newPos + component.count));\n }\n newPos += component.count;\n // Common case\n if (!component.added) {\n oldPos += component.count;\n }\n }\n else {\n component.value = this.join(oldTokens.slice(oldPos, oldPos + component.count));\n oldPos += component.count;\n }\n }\n return components;\n }\n}\n","import Diff from './base.js';\nclass CharacterDiff extends Diff {\n}\nexport const characterDiff = new CharacterDiff();\nexport function diffChars(oldStr, newStr, options) {\n return characterDiff.diff(oldStr, newStr, options);\n}\n","export function longestCommonPrefix(str1, str2) {\n let i;\n for (i = 0; i < str1.length && i < str2.length; i++) {\n if (str1[i] != str2[i]) {\n return str1.slice(0, i);\n }\n }\n return str1.slice(0, i);\n}\nexport function longestCommonSuffix(str1, str2) {\n let i;\n // Unlike longestCommonPrefix, we need a special case to handle all scenarios\n // where we return the empty string since str1.slice(-0) will return the\n // entire string.\n if (!str1 || !str2 || str1[str1.length - 1] != str2[str2.length - 1]) {\n return '';\n }\n for (i = 0; i < str1.length && i < str2.length; i++) {\n if (str1[str1.length - (i + 1)] != str2[str2.length - (i + 1)]) {\n return str1.slice(-i);\n }\n }\n return str1.slice(-i);\n}\nexport function replacePrefix(string, oldPrefix, newPrefix) {\n if (string.slice(0, oldPrefix.length) != oldPrefix) {\n throw Error(`string ${JSON.stringify(string)} doesn't start with prefix ${JSON.stringify(oldPrefix)}; this is a bug`);\n }\n return newPrefix + string.slice(oldPrefix.length);\n}\nexport function replaceSuffix(string, oldSuffix, newSuffix) {\n if (!oldSuffix) {\n return string + newSuffix;\n }\n if (string.slice(-oldSuffix.length) != oldSuffix) {\n throw Error(`string ${JSON.stringify(string)} doesn't end with suffix ${JSON.stringify(oldSuffix)}; this is a bug`);\n }\n return string.slice(0, -oldSuffix.length) + newSuffix;\n}\nexport function removePrefix(string, oldPrefix) {\n return replacePrefix(string, oldPrefix, '');\n}\nexport function removeSuffix(string, oldSuffix) {\n return replaceSuffix(string, oldSuffix, '');\n}\nexport function maximumOverlap(string1, string2) {\n return string2.slice(0, overlapCount(string1, string2));\n}\n// Nicked from https://stackoverflow.com/a/60422853/1709587\nfunction overlapCount(a, b) {\n // Deal with cases where the strings differ in length\n let startA = 0;\n if (a.length > b.length) {\n startA = a.length - b.length;\n }\n let endB = b.length;\n if (a.length < b.length) {\n endB = a.length;\n }\n // Create a back-reference for each index\n // that should be followed in case of a mismatch.\n // We only need B to make these references:\n const map = Array(endB);\n let k = 0; // Index that lags behind j\n map[0] = 0;\n for (let j = 1; j < endB; j++) {\n if (b[j] == b[k]) {\n map[j] = map[k]; // skip over the same character (optional optimisation)\n }\n else {\n map[j] = k;\n }\n while (k > 0 && b[j] != b[k]) {\n k = map[k];\n }\n if (b[j] == b[k]) {\n k++;\n }\n }\n // Phase 2: use these references while iterating over A\n k = 0;\n for (let i = startA; i < a.length; i++) {\n while (k > 0 && a[i] != b[k]) {\n k = map[k];\n }\n if (a[i] == b[k]) {\n k++;\n }\n }\n return k;\n}\n/**\n * Returns true if the string consistently uses Windows line endings.\n */\nexport function hasOnlyWinLineEndings(string) {\n return string.includes('\\r\\n') && !string.startsWith('\\n') && !string.match(/[^\\r]\\n/);\n}\n/**\n * Returns true if the string consistently uses Unix line endings.\n */\nexport function hasOnlyUnixLineEndings(string) {\n return !string.includes('\\r\\n') && string.includes('\\n');\n}\n/**\n * Split a string into segments using a word segmenter, merging consecutive\n * segments if they are both whitespace segments. Whitespace segments can\n * appear adjacent to one another for two reasons:\n * - newlines always get their own segment\n * - where a diacritic is attached to a whitespace character in the text, the\n * segment ends after the diacritic, so e.g. \" \\u0300 \" becomes two segments.\n * This function therefore runs the segmenter's .segment() method and then\n * merges consecutive segments of whitespace into a single part.\n */\nexport function segment(string, segmenter) {\n const parts = [];\n for (const segmentObj of Array.from(segmenter.segment(string))) {\n const segment = segmentObj.segment;\n if (parts.length && (/\\s/).test(parts[parts.length - 1]) && (/\\s/).test(segment)) {\n parts[parts.length - 1] += segment;\n }\n else {\n parts.push(segment);\n }\n }\n return parts;\n}\n// The functions below take a `segmenter` argument so that, when called from\n// diffWords when it is using a segmenter, they can use a notion of what\n// constitutes \"whitespace\" that is consistent with the segmenter.\n//\n// USUALLY this will be identical to the result of the non-segmenter-based\n// logic, but it differs in at least one case: when whitespace characters are\n// modified by diacritics. A word segmenter considers these diacritics to be\n// part of the whitespace, whereas our non-segmenter-based logic does not.\n//\n// Because the segmenter-based approach necessarily requires segmenting the\n// entire string, we offer a leadingAndTrailingWs function to allow getting the\n// whitespace prefix AND whitespace suffix with a single call to the segmenter,\n// for efficiency's sake.\nexport function trailingWs(string, segmenter) {\n if (segmenter) {\n return leadingAndTrailingWs(string, segmenter)[1];\n }\n // Yes, this looks overcomplicated and dumb - why not replace the whole function with\n // return string.match(/\\s*$/)[0]\n // you ask? Because:\n // 1. the trap described at https://markamery.com/blog/quadratic-time-regexes/ would mean doing\n // this would cause this function to take O(n²) time in the worst case (specifically when\n // there is a massive run of NON-TRAILING whitespace in `string`), and\n // 2. the fix proposed in the same blog post, of using a negative lookbehind, is incompatible\n // with old Safari versions that we'd like to not break if possible (see\n // https://github.com/kpdecker/jsdiff/pull/550)\n // It feels absurd to do this with an explicit loop instead of a regex, but I really can't see a\n // better way that doesn't result in broken behaviour.\n let i;\n for (i = string.length - 1; i >= 0; i--) {\n if (!string[i].match(/\\s/)) {\n break;\n }\n }\n return string.substring(i + 1);\n}\nexport function leadingWs(string, segmenter) {\n if (segmenter) {\n return leadingAndTrailingWs(string, segmenter)[0];\n }\n // Thankfully the annoying considerations described in trailingWs don't apply here:\n const match = string.match(/^\\s*/);\n return match ? match[0] : '';\n}\nexport function leadingAndTrailingWs(string, segmenter) {\n if (!segmenter) {\n return [leadingWs(string), trailingWs(string)];\n }\n if (segmenter.resolvedOptions().granularity != 'word') {\n throw new Error('The segmenter passed must have a granularity of \"word\"');\n }\n const segments = segment(string, segmenter);\n const firstSeg = segments[0];\n const lastSeg = segments[segments.length - 1];\n const head = (/\\s/).test(firstSeg) ? firstSeg : '';\n const tail = (/\\s/).test(lastSeg) ? lastSeg : '';\n return [head, tail];\n}\n","import Diff from './base.js';\nimport { longestCommonPrefix, longestCommonSuffix, replacePrefix, replaceSuffix, removePrefix, removeSuffix, maximumOverlap, leadingWs, trailingWs, leadingAndTrailingWs, segment } from '../util/string.js';\n// Based on https://en.wikipedia.org/wiki/Latin_script_in_Unicode\n//\n// Chars/ranges counted as \"word\" characters by this regex are as follows:\n//\n// + U+00AD Soft hyphen\n// + 00C0–00FF (letters with diacritics from the Latin-1 Supplement), except:\n// - U+00D7 × Multiplication sign\n// - U+00F7 ÷ Division sign\n// + Latin Extended-A, 0100–017F\n// + Latin Extended-B, 0180–024F\n// + IPA Extensions, 0250–02AF\n// + Spacing Modifier Letters, 02B0–02FF, except:\n// - U+02C7 ˇ ˇ Caron\n// - U+02D8 ˘ ˘ Breve\n// - U+02D9 ˙ ˙ Dot Above\n// - U+02DA ˚ ˚ Ring Above\n// - U+02DB ˛ ˛ Ogonek\n// - U+02DC ˜ ˜ Small Tilde\n// - U+02DD ˝ ˝ Double Acute Accent\n// + Latin Extended Additional, 1E00–1EFF\nconst extendedWordChars = 'a-zA-Z0-9_\\\\u{AD}\\\\u{C0}-\\\\u{D6}\\\\u{D8}-\\\\u{F6}\\\\u{F8}-\\\\u{2C6}\\\\u{2C8}-\\\\u{2D7}\\\\u{2DE}-\\\\u{2FF}\\\\u{1E00}-\\\\u{1EFF}';\n// Each token is one of the following:\n// - A punctuation mark plus the surrounding whitespace\n// - A word plus the surrounding whitespace\n// - Pure whitespace (but only in the special case where the entire text\n// is just whitespace)\n//\n// We have to include surrounding whitespace in the tokens because the two\n// alternative approaches produce horribly broken results:\n// * If we just discard the whitespace, we can't fully reproduce the original\n// text from the sequence of tokens and any attempt to render the diff will\n// get the whitespace wrong.\n// * If we have separate tokens for whitespace, then in a typical text every\n// second token will be a single space character. But this often results in\n// the optimal diff between two texts being a perverse one that preserves\n// the spaces between words but deletes and reinserts actual common words.\n// See https://github.com/kpdecker/jsdiff/issues/160#issuecomment-1866099640\n// for an example.\n//\n// Keeping the surrounding whitespace of course has implications for .equals\n// and .join, not just .tokenize.\n// This regex does NOT fully implement the tokenization rules described above.\n// Instead, it gives runs of whitespace their own \"token\". The tokenize method\n// then handles stitching whitespace tokens onto adjacent word or punctuation\n// tokens.\nconst tokenizeIncludingWhitespace = new RegExp(`[${extendedWordChars}]+|\\\\s+|[^${extendedWordChars}]`, 'ug');\nclass WordDiff extends Diff {\n equals(left, right, options) {\n if (options.ignoreCase) {\n left = left.toLowerCase();\n right = right.toLowerCase();\n }\n return left.trim() === right.trim();\n }\n tokenize(value, options = {}) {\n let parts;\n if (options.intlSegmenter) {\n const segmenter = options.intlSegmenter;\n if (segmenter.resolvedOptions().granularity != 'word') {\n throw new Error('The segmenter passed must have a granularity of \"word\"');\n }\n // We want `parts` to be an array whose elements alternate between being\n // pure whitespace and being pure non-whitespace. This is ALMOST what the\n // segments returned by a word-based Intl.Segmenter already look like,\n // but not quite - see explanation in the docs of our custom segment()\n // function.\n parts = segment(value, segmenter);\n }\n else {\n parts = value.match(tokenizeIncludingWhitespace) || [];\n }\n const tokens = [];\n let prevPart = null;\n parts.forEach(part => {\n if ((/\\s/).test(part)) {\n if (prevPart == null) {\n tokens.push(part);\n }\n else {\n tokens.push(tokens.pop() + part);\n }\n }\n else if (prevPart != null && (/\\s/).test(prevPart)) {\n if (tokens[tokens.length - 1] == prevPart) {\n tokens.push(tokens.pop() + part);\n }\n else {\n tokens.push(prevPart + part);\n }\n }\n else {\n tokens.push(part);\n }\n prevPart = part;\n });\n return tokens;\n }\n join(tokens) {\n // Tokens being joined here will always have appeared consecutively in the\n // same text, so we can simply strip off the leading whitespace from all the\n // tokens except the first (and except any whitespace-only tokens - but such\n // a token will always be the first and only token anyway) and then join them\n // and the whitespace around words and punctuation will end up correct.\n return tokens.map((token, i) => {\n if (i == 0) {\n return token;\n }\n else {\n return token.replace((/^\\s+/), '');\n }\n }).join('');\n }\n postProcess(changes, options) {\n if (!changes || options.oneChangePerToken) {\n return changes;\n }\n let lastKeep = null;\n // Change objects representing any insertion or deletion since the last\n // \"keep\" change object. There can be at most one of each.\n let insertion = null;\n let deletion = null;\n changes.forEach(change => {\n if (change.added) {\n insertion = change;\n }\n else if (change.removed) {\n deletion = change;\n }\n else {\n if (insertion || deletion) { // May be false at start of text\n dedupeWhitespaceInChangeObjects(lastKeep, deletion, insertion, change, options.intlSegmenter);\n }\n lastKeep = change;\n insertion = null;\n deletion = null;\n }\n });\n if (insertion || deletion) {\n dedupeWhitespaceInChangeObjects(lastKeep, deletion, insertion, null, options.intlSegmenter);\n }\n return changes;\n }\n}\nexport const wordDiff = new WordDiff();\nexport function diffWords(oldStr, newStr, options) {\n // This option has never been documented and never will be (it's clearer to\n // just call `diffWordsWithSpace` directly if you need that behavior), but\n // has existed in jsdiff for a long time, so we retain support for it here\n // for the sake of backwards compatibility.\n if ((options === null || options === void 0 ? void 0 : options.ignoreWhitespace) != null && !options.ignoreWhitespace) {\n return diffWordsWithSpace(oldStr, newStr, options);\n }\n return wordDiff.diff(oldStr, newStr, options);\n}\nfunction dedupeWhitespaceInChangeObjects(startKeep, deletion, insertion, endKeep, segmenter) {\n // Before returning, we tidy up the leading and trailing whitespace of the\n // change objects to eliminate cases where trailing whitespace in one object\n // is repeated as leading whitespace in the next.\n // Below are examples of the outcomes we want here to explain the code.\n // I=insert, K=keep, D=delete\n // 1. diffing 'foo bar baz' vs 'foo baz'\n // Prior to cleanup, we have K:'foo ' D:' bar ' K:' baz'\n // After cleanup, we want: K:'foo ' D:'bar ' K:'baz'\n //\n // 2. Diffing 'foo bar baz' vs 'foo qux baz'\n // Prior to cleanup, we have K:'foo ' D:' bar ' I:' qux ' K:' baz'\n // After cleanup, we want K:'foo ' D:'bar' I:'qux' K:' baz'\n //\n // 3. Diffing 'foo\\nbar baz' vs 'foo baz'\n // Prior to cleanup, we have K:'foo ' D:'\\nbar ' K:' baz'\n // After cleanup, we want K'foo' D:'\\nbar' K:' baz'\n //\n // 4. Diffing 'foo baz' vs 'foo\\nbar baz'\n // Prior to cleanup, we have K:'foo\\n' I:'\\nbar ' K:' baz'\n // After cleanup, we ideally want K'foo' I:'\\nbar' K:' baz'\n // but don't actually manage this currently (the pre-cleanup change\n // objects don't contain enough information to make it possible).\n //\n // 5. Diffing 'foo bar baz' vs 'foo baz'\n // Prior to cleanup, we have K:'foo ' D:' bar ' K:' baz'\n // After cleanup, we want K:'foo ' D:' bar ' K:'baz'\n //\n // Our handling is unavoidably imperfect in the case where there's a single\n // indel between keeps and the whitespace has changed. For instance, consider\n // diffing 'foo\\tbar\\nbaz' vs 'foo baz'. Unless we create an extra change\n // object to represent the insertion of the space character (which isn't even\n // a token), we have no way to avoid losing information about the texts'\n // original whitespace in the result we return. Still, we do our best to\n // output something that will look sensible if we e.g. print it with\n // insertions in green and deletions in red.\n // Between two \"keep\" change objects (or before the first or after the last\n // change object), we can have either:\n // * A \"delete\" followed by an \"insert\"\n // * Just an \"insert\"\n // * Just a \"delete\"\n // We handle the three cases separately.\n if (deletion && insertion) {\n const [oldWsPrefix, oldWsSuffix] = leadingAndTrailingWs(deletion.value, segmenter);\n const [newWsPrefix, newWsSuffix] = leadingAndTrailingWs(insertion.value, segmenter);\n if (startKeep) {\n const commonWsPrefix = longestCommonPrefix(oldWsPrefix, newWsPrefix);\n startKeep.value = replaceSuffix(startKeep.value, newWsPrefix, commonWsPrefix);\n deletion.value = removePrefix(deletion.value, commonWsPrefix);\n insertion.value = removePrefix(insertion.value, commonWsPrefix);\n }\n if (endKeep) {\n const commonWsSuffix = longestCommonSuffix(oldWsSuffix, newWsSuffix);\n endKeep.value = replacePrefix(endKeep.value, newWsSuffix, commonWsSuffix);\n deletion.value = removeSuffix(deletion.value, commonWsSuffix);\n insertion.value = removeSuffix(insertion.value, commonWsSuffix);\n }\n }\n else if (insertion) {\n // The whitespaces all reflect what was in the new text rather than\n // the old, so we essentially have no information about whitespace\n // insertion or deletion. We just want to dedupe the whitespace.\n // We do that by having each change object keep its trailing\n // whitespace and deleting duplicate leading whitespace where\n // present.\n if (startKeep) {\n const ws = leadingWs(insertion.value, segmenter);\n insertion.value = insertion.value.substring(ws.length);\n }\n if (endKeep) {\n const ws = leadingWs(endKeep.value, segmenter);\n endKeep.value = endKeep.value.substring(ws.length);\n }\n // otherwise we've got a deletion and no insertion\n }\n else if (startKeep && endKeep) {\n const newWsFull = leadingWs(endKeep.value, segmenter), [delWsStart, delWsEnd] = leadingAndTrailingWs(deletion.value, segmenter);\n // Any whitespace that comes straight after startKeep in both the old and\n // new texts, assign to startKeep and remove from the deletion.\n const newWsStart = longestCommonPrefix(newWsFull, delWsStart);\n deletion.value = removePrefix(deletion.value, newWsStart);\n // Any whitespace that comes straight before endKeep in both the old and\n // new texts, and hasn't already been assigned to startKeep, assign to\n // endKeep and remove from the deletion.\n const newWsEnd = longestCommonSuffix(removePrefix(newWsFull, newWsStart), delWsEnd);\n deletion.value = removeSuffix(deletion.value, newWsEnd);\n endKeep.value = replacePrefix(endKeep.value, newWsFull, newWsEnd);\n // If there's any whitespace from the new text that HASN'T already been\n // assigned, assign it to the start:\n startKeep.value = replaceSuffix(startKeep.value, newWsFull, newWsFull.slice(0, newWsFull.length - newWsEnd.length));\n }\n else if (endKeep) {\n // We are at the start of the text. Preserve all the whitespace on\n // endKeep, and just remove whitespace from the end of deletion to the\n // extent that it overlaps with the start of endKeep.\n const endKeepWsPrefix = leadingWs(endKeep.value, segmenter);\n const deletionWsSuffix = trailingWs(deletion.value, segmenter);\n const overlap = maximumOverlap(deletionWsSuffix, endKeepWsPrefix);\n deletion.value = removeSuffix(deletion.value, overlap);\n }\n else if (startKeep) {\n // We are at the END of the text. Preserve all the whitespace on\n // startKeep, and just remove whitespace from the start of deletion to\n // the extent that it overlaps with the end of startKeep.\n const startKeepWsSuffix = trailingWs(startKeep.value, segmenter);\n const deletionWsPrefix = leadingWs(deletion.value, segmenter);\n const overlap = maximumOverlap(startKeepWsSuffix, deletionWsPrefix);\n deletion.value = removePrefix(deletion.value, overlap);\n }\n}\nclass WordsWithSpaceDiff extends Diff {\n tokenize(value) {\n // Slightly different to the tokenizeIncludingWhitespace regex used above in\n // that this one treats each individual newline as a distinct token, rather\n // than merging them into other surrounding whitespace. This was requested\n // in https://github.com/kpdecker/jsdiff/issues/180 &\n // https://github.com/kpdecker/jsdiff/issues/211\n const regex = new RegExp(`(\\\\r?\\\\n)|[${extendedWordChars}]+|[^\\\\S\\\\n\\\\r]+|[^${extendedWordChars}]`, 'ug');\n return value.match(regex) || [];\n }\n}\nexport const wordsWithSpaceDiff = new WordsWithSpaceDiff();\nexport function diffWordsWithSpace(oldStr, newStr, options) {\n return wordsWithSpaceDiff.diff(oldStr, newStr, options);\n}\n","import Diff from './base.js';\nimport { generateOptions } from '../util/params.js';\nclass LineDiff extends Diff {\n constructor() {\n super(...arguments);\n this.tokenize = tokenize;\n }\n equals(left, right, options) {\n // If we're ignoring whitespace, we need to normalise lines by stripping\n // whitespace before checking equality. (This has an annoying interaction\n // with newlineIsToken that requires special handling: if newlines get their\n // own token, then we DON'T want to trim the *newline* tokens down to empty\n // strings, since this would cause us to treat whitespace-only line content\n // as equal to a separator between lines, which would be weird and\n // inconsistent with the documented behavior of the options.)\n if (options.ignoreWhitespace) {\n if (!options.newlineIsToken || !left.includes('\\n')) {\n left = left.trim();\n }\n if (!options.newlineIsToken || !right.includes('\\n')) {\n right = right.trim();\n }\n }\n else if (options.ignoreNewlineAtEof && !options.newlineIsToken) {\n if (left.endsWith('\\n')) {\n left = left.slice(0, -1);\n }\n if (right.endsWith('\\n')) {\n right = right.slice(0, -1);\n }\n }\n return super.equals(left, right, options);\n }\n}\nexport const lineDiff = new LineDiff();\nexport function diffLines(oldStr, newStr, options) {\n return lineDiff.diff(oldStr, newStr, options);\n}\nexport function diffTrimmedLines(oldStr, newStr, options) {\n options = generateOptions(options, { ignoreWhitespace: true });\n return lineDiff.diff(oldStr, newStr, options);\n}\n// Exported standalone so it can be used from jsonDiff too.\nexport function tokenize(value, options) {\n if (options.stripTrailingCr) {\n // remove one \\r before \\n to match GNU diff's --strip-trailing-cr behavior\n value = value.replace(/\\r\\n/g, '\\n');\n }\n const retLines = [], linesAndNewlines = value.split(/(\\n|\\r\\n)/);\n // Ignore the final empty token that occurs if the string ends with a new line\n if (!linesAndNewlines[linesAndNewlines.length - 1]) {\n linesAndNewlines.pop();\n }\n // Merge the content and line separators into single tokens\n for (let i = 0; i < linesAndNewlines.length; i++) {\n const line = linesAndNewlines[i];\n if (i % 2 && !options.newlineIsToken) {\n retLines[retLines.length - 1] += line;\n }\n else {\n retLines.push(line);\n }\n }\n return retLines;\n}\n","import Diff from './base.js';\nfunction isSentenceEndPunct(char) {\n return char == '.' || char == '!' || char == '?';\n}\nclass SentenceDiff extends Diff {\n tokenize(value) {\n var _a;\n // If in future we drop support for environments that don't support lookbehinds, we can replace\n // this entire function with:\n // return value.split(/(?<=[.!?])(\\s+|$)/);\n // but until then, for similar reasons to the trailingWs function in string.ts, we are forced\n // to do this verbosely \"by hand\" instead of using a regex.\n const result = [];\n let tokenStartI = 0;\n for (let i = 0; i < value.length; i++) {\n if (i == value.length - 1) {\n result.push(value.slice(tokenStartI));\n break;\n }\n if (isSentenceEndPunct(value[i]) && value[i + 1].match(/\\s/)) {\n // We've hit a sentence break - i.e. a punctuation mark followed by whitespace.\n // We now want to push TWO tokens to the result:\n // 1. the sentence\n result.push(value.slice(tokenStartI, i + 1));\n // 2. the whitespace\n i = tokenStartI = i + 1;\n while ((_a = value[i + 1]) === null || _a === void 0 ? void 0 : _a.match(/\\s/)) {\n i++;\n }\n result.push(value.slice(tokenStartI, i + 1));\n // Then the next token (a sentence) starts on the character after the whitespace.\n // (It's okay if this is off the end of the string - then the outer loop will terminate\n // here anyway.)\n tokenStartI = i + 1;\n }\n }\n return result;\n }\n}\nexport const sentenceDiff = new SentenceDiff();\nexport function diffSentences(oldStr, newStr, options) {\n return sentenceDiff.diff(oldStr, newStr, options);\n}\n","import Diff from './base.js';\nclass CssDiff extends Diff {\n tokenize(value) {\n return value.split(/([{}:;,]|\\s+)/);\n }\n}\nexport const cssDiff = new CssDiff();\nexport function diffCss(oldStr, newStr, options) {\n return cssDiff.diff(oldStr, newStr, options);\n}\n","import Diff from './base.js';\nimport { tokenize } from './line.js';\nclass JsonDiff extends Diff {\n constructor() {\n super(...arguments);\n this.tokenize = tokenize;\n }\n get useLongestToken() {\n // Discriminate between two lines of pretty-printed, serialized JSON where one of them has a\n // dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output:\n return true;\n }\n castInput(value, options) {\n const { undefinedReplacement, stringifyReplacer = (k, v) => typeof v === 'undefined' ? undefinedReplacement : v } = options;\n return typeof value === 'string' ? value : JSON.stringify(canonicalize(value, null, null, stringifyReplacer), null, ' ');\n }\n equals(left, right, options) {\n return super.equals(left.replace(/,([\\r\\n])/g, '$1'), right.replace(/,([\\r\\n])/g, '$1'), options);\n }\n}\nexport const jsonDiff = new JsonDiff();\nexport function diffJson(oldStr, newStr, options) {\n return jsonDiff.diff(oldStr, newStr, options);\n}\n// This function handles the presence of circular references by bailing out when encountering an\n// object that is already on the \"stack\" of items being processed. Accepts an optional replacer\nexport function canonicalize(obj, stack, replacementStack, replacer, key) {\n stack = stack || [];\n replacementStack = replacementStack || [];\n if (replacer) {\n obj = replacer(key === undefined ? '' : key, obj);\n }\n let i;\n for (i = 0; i < stack.length; i += 1) {\n if (stack[i] === obj) {\n return replacementStack[i];\n }\n }\n let canonicalizedObj;\n if ('[object Array]' === Object.prototype.toString.call(obj)) {\n stack.push(obj);\n canonicalizedObj = new Array(obj.length);\n replacementStack.push(canonicalizedObj);\n for (i = 0; i < obj.length; i += 1) {\n canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack, replacer, String(i));\n }\n stack.pop();\n replacementStack.pop();\n return canonicalizedObj;\n }\n if (obj && obj.toJSON) {\n obj = obj.toJSON();\n }\n if (typeof obj === 'object' && obj !== null) {\n stack.push(obj);\n canonicalizedObj = {};\n replacementStack.push(canonicalizedObj);\n const sortedKeys = [];\n let key;\n for (key in obj) {\n /* istanbul ignore else */\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n sortedKeys.push(key);\n }\n }\n sortedKeys.sort();\n for (i = 0; i < sortedKeys.length; i += 1) {\n key = sortedKeys[i];\n canonicalizedObj[key] = canonicalize(obj[key], stack, replacementStack, replacer, key);\n }\n stack.pop();\n replacementStack.pop();\n }\n else {\n canonicalizedObj = obj;\n }\n return canonicalizedObj;\n}\n","import Diff from './base.js';\nclass ArrayDiff extends Diff {\n tokenize(value) {\n return value.slice();\n }\n join(value) {\n return value;\n }\n removeEmpty(value) {\n return value;\n }\n}\nexport const arrayDiff = new ArrayDiff();\nexport function diffArrays(oldArr, newArr, options) {\n return arrayDiff.diff(oldArr, newArr, options);\n}\n","import { diffChars } from 'diff';\n\nexport default class UndoRedoManager {\n constructor(editor) {\n this.editor = editor;\n this.textarea = editor.usertextarea;\n this.undoStack = [];\n this.redoStack = [];\n \n // Internal tracking\n this.lastValue = this.textarea.value;\n this.lastSelection = {\n selectionStart: this.textarea.selectionStart,\n selectionEnd: this.textarea.selectionEnd\n };\n\n // Settings\n this.debounceDelay = 1000;\n this.maxStackSize = 100;\n this._debounceTimer = null;\n\n this._bindEvents();\n }\n\n _bindEvents() {\n this._keydownHandler = (e) => this._onKeyDown(e);\n this._selectHandler = () => this._updateLastSelection();\n this._mousedownHandler = () => setTimeout(() => this._updateLastSelection(), 0);\n this._beforeinputHandler = (e) => {\n if (e.inputType === 'historyUndo') { e.preventDefault(); this.undo(); }\n else if (e.inputType === 'historyRedo') { e.preventDefault(); this.redo(); }\n };\n this._inputHandler = (e) => this._onInput(e);\n this._pasteHandler = () => this._saveState();\n this._blurHandler = () => this._saveState();\n\n this.textarea.addEventListener('keydown', this._keydownHandler);\n this.textarea.addEventListener('select', this._selectHandler);\n this.textarea.addEventListener('mousedown', this._mousedownHandler);\n this.textarea.addEventListener('beforeinput', this._beforeinputHandler);\n this.textarea.addEventListener('input', this._inputHandler);\n this.textarea.addEventListener('paste', this._pasteHandler);\n this.textarea.addEventListener('blur', this._blurHandler);\n }\n\n destroy() {\n clearTimeout(this._debounceTimer);\n this.textarea.removeEventListener('keydown', this._keydownHandler);\n this.textarea.removeEventListener('select', this._selectHandler);\n this.textarea.removeEventListener('mousedown', this._mousedownHandler);\n this.textarea.removeEventListener('beforeinput', this._beforeinputHandler);\n this.textarea.removeEventListener('input', this._inputHandler);\n this.textarea.removeEventListener('paste', this._pasteHandler);\n this.textarea.removeEventListener('blur', this._blurHandler);\n }\n\n _updateLastSelection() {\n // We only care about updating this if the value hasn't changed yet.\n // This marks the \"starting point\" for the next undo step.\n this.lastSelection = {\n selectionStart: this.textarea.selectionStart,\n selectionEnd: this.textarea.selectionEnd\n };\n }\n\n _onKeyDown(e) {\n const modifier = e.metaKey || e.ctrlKey;\n const isZ = e.key.toLowerCase() === 'z';\n const isY = e.key.toLowerCase() === 'y';\n const isShift = e.shiftKey;\n\n // 1. CRITICAL: Save state before selection is overwritten or deleted\n const hasSelection = this.textarea.selectionStart !== this.textarea.selectionEnd;\n const isDeletiveKey = e.key === 'Backspace' || e.key === 'Delete' || e.key === 'Enter';\n\n if (hasSelection && (e.key.length === 1 || isDeletiveKey)) {\n this._saveState();\n }\n\n // 2. Save state on structural keys (Enter, Delete, etc.) or generic Modifiers\n if (modifier || isDeletiveKey) {\n this._saveState();\n }\n\n // 3. UNDO: (Cmd+Z or Ctrl+Z)\n if (modifier && isZ && !isShift) {\n e.preventDefault();\n this.undo();\n } \n \n // 4. REDO: (Cmd+Shift+Z, Ctrl+Shift+Z, or Ctrl+Y)\n else if (modifier && ( (isShift && isZ) || (!e.metaKey && isY) )) {\n e.preventDefault();\n this.redo();\n }\n }\n\n _onInput(e) {\n clearTimeout(this._debounceTimer);\n const value = this.textarea.value;\n const lastChar = value[this.textarea.selectionStart - 1];\n \n if (lastChar && /[\\s.,;:!?()\\[\\]{}'\"`~]/.test(lastChar)) {\n this._saveState();\n } else {\n this._debounceTimer = setTimeout(() => this._saveState(), this.debounceDelay);\n }\n }\n\n _saveState() {\n const newValue = this.textarea.value || '';\n \n // 1. If nothing changed, exit immediately to save CPU\n if (newValue === this.lastValue) return;\n\n // 2. Clear any pending debounced timers so we don't save twice\n clearTimeout(this._debounceTimer);\n\n const diff = diffChars(this.lastValue, newValue);\n \n this.undoStack.push({\n diff,\n selection: { ...this.lastSelection }\n });\n\n // --- Performance Optimization: Max Depth ---\n // If the stack exceeds the limit, remove the oldest entry (bottom of stack)\n if (this.undoStack.length > this.maxStackSize) {\n this.undoStack.shift(); \n }\n\n this.lastValue = newValue;\n this._updateLastSelection();\n this.redoStack = []; // Standard: typing new text clears redo history\n }\n\n undo() {\n if (this.undoStack.length === 0) return;\n\n const lastStep = this.undoStack.pop();\n const prevValue = this._revertDiff(this.lastValue, lastStep.diff);\n\n this.redoStack.push({\n diff: lastStep.diff,\n selection: { \n selectionStart: this.textarea.selectionStart, \n selectionEnd: this.textarea.selectionEnd \n }\n });\n\n this._restoreState(prevValue, lastStep.selection);\n }\n\n redo() {\n if (this.redoStack.length === 0) return;\n\n const redoStep = this.redoStack.pop();\n const newValue = this._applyDiff(this.lastValue, redoStep.diff);\n\n this.undoStack.push({\n diff: redoStep.diff,\n selection: { ...this.lastSelection }\n });\n\n this._restoreState(newValue, redoStep.selection);\n }\n\n _applyDiff(oldValue, diff) {\n let newValue = '';\n diff.forEach(part => { if (!part.removed) newValue += part.value; });\n return newValue;\n }\n\n _revertDiff(currentValue, diff) {\n let oldValue = '';\n diff.forEach(part => { if (!part.added) oldValue += part.value; });\n return oldValue;\n }\n\n _restoreState(value, selection) {\n this.textarea.value = value;\n this.textarea.setSelectionRange(selection.selectionStart, selection.selectionEnd);\n this.lastValue = value;\n this.lastSelection = { ...selection };\n \n if (this.editor.render) this.editor.render();\n this.editor.notifyChange();\n this.textarea.focus();\n }\n}","export default class IndentManager {\n constructor(editor, renderCallback) {\n this.editor = editor;\n this.textarea = editor.usertextarea;\n this.renderCallback = renderCallback;\n this.pairs = {\n '{': '}',\n '[': ']',\n '(': ')',\n '<': '>',\n '\"': '\"',\n \"'\": \"'\"\n };\n this.init();\n }\n\n init() {\n this.textarea.addEventListener('keydown', (e) => {\n switch (e.key) {\n case 'Tab':\n e.preventDefault();\n e.shiftKey ? this.outdent() : this.indent();\n this._triggerUpdate();\n break;\n case 'Enter':\n this.autoIndent(e);\n break;\n case 'Backspace':\n this.handleBackspace(e);\n break;\n default:\n if (this.pairs[e.key]) this.handlePairs(e);\n }\n });\n }\n\n handlePairs(e) {\n const { textarea } = this;\n const { selectionStart, selectionEnd, value } = textarea;\n const char = e.key;\n\n // 1. Overtyping Logic\n // If the cursor is right before the closing character and the user types it\n if (selectionStart === selectionEnd && value[selectionStart] === char) {\n const isClosingChar = Object.values(this.pairs).includes(char);\n if (isClosingChar) {\n e.preventDefault();\n const newPos = selectionStart + 1;\n textarea.setSelectionRange(newPos, newPos);\n return; // Just move the cursor, don't trigger an update\n }\n }\n\n const open = char;\n const close = this.pairs[open];\n if (!close) return; // Not a paired character\n\n // 2. Selection Wrapping\n if (selectionStart !== selectionEnd) {\n e.preventDefault();\n const selectedText = value.substring(selectionStart, selectionEnd);\n const newValue = value.substring(0, selectionStart) + open + selectedText + close + value.substring(selectionEnd);\n \n textarea.value = newValue;\n textarea.setSelectionRange(selectionStart + 1, selectionEnd + 1);\n this._triggerUpdate();\n } \n \n // 3. Standard Pair Insertion\n else {\n e.preventDefault();\n const before = value.substring(0, selectionStart);\n const after = value.substring(selectionEnd);\n \n textarea.value = before + open + close + after;\n textarea.setSelectionRange(selectionStart + 1, selectionStart + 1);\n this._triggerUpdate();\n }\n }\n\n // Add this to your init() listener for 'keydown'\n handleBackspace(e) {\n const { textarea } = this;\n const { selectionStart, selectionEnd, value } = textarea;\n\n if (selectionStart === selectionEnd && selectionStart > 0) {\n const charBefore = value[selectionStart - 1];\n const charAfter = value[selectionStart];\n\n // If user deletes '(' when text is '()', delete the ')' too\n if (this.pairs[charBefore] === charAfter) {\n e.preventDefault();\n const before = value.substring(0, selectionStart - 1);\n const after = value.substring(selectionStart + 1);\n \n textarea.value = before + after;\n textarea.setSelectionRange(selectionStart - 1, selectionStart - 1);\n this._triggerUpdate();\n }\n }\n }\n\n autoIndent(e) {\n const { textarea } = this;\n const { selectionStart, value } = textarea;\n\n const lastNewline = value.lastIndexOf('\\n', selectionStart - 1);\n const currentLine = value.substring(lastNewline + 1, selectionStart);\n\n // Let ListManager handle list continuation\n if (/^(\\s*)([\\-\\*] |\\d+\\. )/.test(currentLine)) return;\n\n const indent = (currentLine.match(/^[ \\t]*/) || [''])[0];\n\n // EXTRA: If user hits Enter between { and }, add an extra indent level\n const charBefore = value[selectionStart - 1];\n const charAfter = value[selectionStart];\n \n if (charBefore === '{' && charAfter === '}') {\n e.preventDefault();\n const tab = '\\t'; // or ' '\n const insertion = '\\n' + indent + tab + '\\n' + indent;\n \n textarea.value = value.substring(0, selectionStart) + insertion + value.substring(selectionStart);\n \n // Put cursor on the middle (indented) line\n const newPos = selectionStart + indent.length + tab.length + 1;\n textarea.setSelectionRange(newPos, newPos);\n this._triggerUpdate();\n return;\n }\n\n if (indent.length > 0) {\n e.preventDefault();\n const insertion = '\\n' + indent;\n textarea.value = value.substring(0, selectionStart) + insertion + value.substring(textarea.selectionEnd);\n const newPos = selectionStart + insertion.length;\n textarea.setSelectionRange(newPos, newPos);\n this._triggerUpdate();\n }\n }\n\n _triggerUpdate() {\n if (typeof this.renderCallback === 'function') this.renderCallback();\n this.textarea.dispatchEvent(new Event('input', { bubbles: true }));\n }\n\n // Inside IndentManager class\n indent() {\n const { textarea } = this;\n const { selectionStart, selectionEnd, value } = textarea;\n\n const startPos = value.lastIndexOf('\\n', selectionStart - 1) + 1;\n let endPos = value.indexOf('\\n', selectionEnd);\n if (endPos === -1) endPos = value.length;\n\n const targetText = value.substring(startPos, endPos);\n const lines = targetText.split('\\n');\n const indentedText = lines.map(line => '\\t' + line).join('\\n');\n\n this._applyChange(\n value.substring(0, startPos) + indentedText + value.substring(endPos),\n selectionStart + 1,\n selectionEnd + lines.length\n );\n }\n\n outdent() {\n const { textarea } = this;\n const { selectionStart, selectionEnd, value } = textarea;\n\n // 1. Find the start and end of the affected lines\n const startPos = value.lastIndexOf('\\n', selectionStart - 1) + 1;\n let endPos = value.indexOf('\\n', selectionEnd);\n if (endPos === -1) endPos = value.length;\n\n const targetText = value.substring(startPos, endPos);\n const lines = targetText.split('\\n');\n \n let removedFromFirst = 0;\n let totalRemoved = 0;\n\n // 2. Process each line\n const unindentedText = lines.map((line, index) => {\n if (line.startsWith('\\t')) {\n if (index === 0) removedFromFirst = 1;\n totalRemoved++;\n return line.substring(1);\n } else if (line.startsWith(' ')) { // Optional: handle 4-space indent\n if (index === 0) removedFromFirst = 4;\n totalRemoved += 4;\n return line.substring(4);\n }\n return line;\n }).join('\\n');\n\n // 3. Apply the change to the DOM\n this._applyChange(\n value.substring(0, startPos) + unindentedText + value.substring(endPos),\n Math.max(startPos, selectionStart - removedFromFirst),\n Math.max(startPos, selectionEnd - totalRemoved)\n );\n }\n\n _applyChange(newValue, newStart, newEnd) {\n this.textarea.value = newValue;\n this.textarea.setSelectionRange(newStart, newEnd);\n }\n}","class ListManager {\n constructor(editor) {\n this.editor = editor;\n this.textarea = editor.usertextarea;\n\n this._keydownHandler = (e) => { if (e.key === 'Enter') this.handleEnter(e); };\n this.textarea.addEventListener('keydown', this._keydownHandler);\n }\n\n destroy() {\n this.textarea.removeEventListener('keydown', this._keydownHandler);\n }\n\n handleEnter(event) {\n const { selectionStart, value } = this.textarea;\n\n const lastNewline = value.lastIndexOf('\\n', selectionStart - 1);\n const lineStart = lastNewline + 1;\n const currentLine = value.substring(lineStart, selectionStart);\n\n // Patterns\n const olMatch = currentLine.match(/^(\\s*)(\\d+)\\.\\s/);\n const taskMatch = currentLine.match(/^(\\s*)([\\-\\*] )\\[[\\s xX]\\] /);\n const ulMatch = currentLine.match(/^(\\s*)([\\-\\*] )\\s*/);\n const isEmptyList = currentLine.match(/^(\\s*)(\\d+\\.\\s|[\\-\\*] \\[[\\s xX]\\] |[\\-\\*]\\s)$/);\n\n // Exit list if line is empty\n if (isEmptyList) {\n event.preventDefault();\n const before = value.substring(0, lineStart);\n const after = value.substring(selectionStart);\n this.textarea.value = before + \"\\n\" + after;\n this.textarea.setSelectionRange(lineStart + 1, lineStart + 1);\n this.editor.render();\n this.editor.notifyChange();\n return;\n }\n\n let continuation = null;\n if (olMatch) {\n continuation = `${olMatch[1]}${parseInt(olMatch[2]) + 1}. `;\n } else if (taskMatch) {\n continuation = `${taskMatch[1]}${taskMatch[2]}[ ] `;\n } else if (ulMatch) {\n continuation = `${ulMatch[1]}${ulMatch[2]}`;\n }\n\n if (continuation) {\n event.preventDefault();\n const insert = `\\n${continuation}`;\n const before = value.substring(0, selectionStart);\n const after = value.substring(selectionStart);\n this.textarea.value = before + insert + after;\n const cursor = selectionStart + insert.length;\n this.textarea.setSelectionRange(cursor, cursor);\n this.editor.render();\n this.editor.notifyChange();\n }\n }\n}\n\nexport default ListManager;","import BoldTool from '../components/toolbar/tools/BoldTool.js';\nimport ItalicTool from '../components/toolbar/tools/ItalicTool.js';\nimport StrikethroughTool from '../components/toolbar/tools/StrikethroughTool.js';\nimport CodeTool from '../components/toolbar/tools/CodeTool.js';\nimport LinkTool from '../components/toolbar/tools/LinkTool.js';\nimport HeadingTool from '../components/toolbar/tools/HeadingTool.js';\nimport ULTool from '../components/toolbar/tools/ULTool.js';\n\nconst DEFAULT_SHORTCUTS = [\n { key: 'b', ctrl: true, shift: false, ToolClass: BoldTool, label: 'Ctrl+B', btnClass: 'bold-btn' },\n { key: 'i', ctrl: true, shift: false, ToolClass: ItalicTool, label: 'Ctrl+I', btnClass: 'italic-btn' },\n { key: 'k', ctrl: true, shift: false, ToolClass: LinkTool, label: 'Ctrl+K', btnClass: 'link-btn' },\n { key: '`', ctrl: true, shift: false, ToolClass: CodeTool, label: 'Ctrl+`', btnClass: 'code-btn' },\n { key: 's', ctrl: true, shift: true, ToolClass: StrikethroughTool, label: 'Ctrl+Shift+S', btnClass: 'strikethrough-btn' },\n { key: 'l', ctrl: true, shift: false, ToolClass: ULTool, label: 'Ctrl+L', btnClass: 'ul-btn' },\n];\n\nexport default class ShortcutManager {\n constructor(editor) {\n this.editor = editor;\n this._handler = this._onKeyDown.bind(this);\n this._docHandler = this._onDocKeyDown.bind(this);\n editor.usertextarea.addEventListener('keydown', this._handler);\n document.addEventListener('keydown', this._docHandler);\n this._updateTooltips();\n }\n\n _onKeyDown(e) {\n const ctrl = e.ctrlKey || e.metaKey;\n const shift = e.shiftKey;\n const key = e.key.toLowerCase();\n\n // Fullscreen: Ctrl+Shift+F\n if (ctrl && shift && key === 'f') {\n e.preventDefault();\n this.editor.editorContainer.querySelector('.preview-btn')?.click();\n return;\n }\n\n // Heading shortcuts: Ctrl+1 / Ctrl+2 / Ctrl+3\n if (ctrl && !shift && ['1', '2', '3'].includes(e.key)) {\n e.preventDefault();\n new HeadingTool(this.editor).applyHeading(parseInt(e.key));\n return;\n }\n\n for (const shortcut of DEFAULT_SHORTCUTS) {\n if (key === shortcut.key && ctrl === shortcut.ctrl && shift === shortcut.shift) {\n e.preventDefault();\n new shortcut.ToolClass(this.editor).applySyntax(e);\n return;\n }\n }\n }\n\n _onDocKeyDown(e) {\n // F11 → toggle fullscreen when editor is focused or already in fullscreen\n if (e.key === 'F11') {\n const editorFocused = this.editor.editorContainer.contains(document.activeElement);\n const inFullscreen = this.editor.editorContainer.classList.contains('is-fullscreen');\n if (editorFocused || inFullscreen) {\n e.preventDefault();\n this.editor.editorContainer.querySelector('.preview-btn')?.click();\n }\n }\n }\n\n _updateTooltips() {\n for (const { btnClass, label } of DEFAULT_SHORTCUTS) {\n const btn = this.editor.editorContainer.querySelector(`.${btnClass}`);\n if (btn) btn.title += ` (${label})`;\n }\n const headingBtn = this.editor.editorContainer.querySelector('.heading-btn');\n if (headingBtn) headingBtn.title += ' (Ctrl+1/2/3)';\n const previewBtn = this.editor.editorContainer.querySelector('.preview-btn');\n if (previewBtn) previewBtn.title += ' (F11)';\n }\n\n destroy() {\n this.editor.usertextarea.removeEventListener('keydown', this._handler);\n document.removeEventListener('keydown', this._docHandler);\n }\n}\n","export default class FindReplace {\n constructor(editor) {\n this.editor = editor;\n this._matches = [];\n this._currentIndex = -1;\n this._caseSensitive = false;\n this._panel = null;\n this._findInput = null;\n this._replaceInput = null;\n this._countEl = null;\n this._replaceRow = null;\n this._caseSensitiveBtn = null;\n this._highlightEl = null;\n this._scrollHandler = null;\n\n this._taHandler = this._onTextareaKeyDown.bind(this);\n editor.usertextarea.addEventListener('keydown', this._taHandler);\n }\n\n _onTextareaKeyDown(e) {\n const ctrl = e.ctrlKey || e.metaKey;\n if (ctrl && e.key === 'f') {\n e.preventDefault();\n this.open(false);\n } else if (ctrl && e.key === 'h') {\n e.preventDefault();\n this.open(true);\n }\n }\n\n open(withReplace = false) {\n if (!this._panel) this._buildPanel();\n this._panel.hidden = false;\n if (withReplace) {\n this._replaceRow.hidden = false;\n }\n this._findInput.focus();\n this._findInput.select();\n\n const sel = this.editor.usertextarea.value.substring(\n this.editor.usertextarea.selectionStart,\n this.editor.usertextarea.selectionEnd\n );\n if (sel && !sel.includes('\\n')) {\n this._findInput.value = sel;\n }\n\n if (!this._scrollHandler) {\n this._scrollHandler = () => this._showMatchHighlight();\n this.editor.usertextarea.addEventListener('scroll', this._scrollHandler);\n }\n\n this._search();\n }\n\n close() {\n if (!this._panel) return;\n this._panel.hidden = true;\n this._clearMatchHighlight();\n\n if (this._scrollHandler) {\n this.editor.usertextarea.removeEventListener('scroll', this._scrollHandler);\n this._scrollHandler = null;\n }\n\n const textarea = this.editor.usertextarea;\n if (this._currentIndex !== -1 && this._matches.length) {\n const { start, end } = this._matches[this._currentIndex];\n textarea.focus();\n textarea.setSelectionRange(start, end);\n } else {\n textarea.focus();\n }\n\n this._matches = [];\n this._currentIndex = -1;\n }\n\n _buildPanel() {\n const panel = document.createElement('div');\n panel.className = 'find-replace-panel fj:absolute fj:top-1 fj:right-1 fj:z-20 fj:me-surface fj:me-surface-outline fj:me-surface-rounded fj:p-1.5 fj:flex fj:flex-col fj:gap-1 fj:shadow-lg';\n panel.setAttribute('role', 'search');\n panel.setAttribute('aria-label', 'Find and replace');\n\n // ── Find row ────────────────────────────────────────────────\n const findRow = document.createElement('div');\n findRow.className = 'fj:flex fj:items-center fj:gap-1';\n\n this._findInput = document.createElement('input');\n this._findInput.type = 'text';\n this._findInput.placeholder = 'Find';\n this._findInput.className = 'fj:me-input fj:me-input-xs fj:w-36';\n this._findInput.setAttribute('aria-label', 'Find');\n this._findInput.addEventListener('input', () => this._search());\n this._findInput.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') { e.shiftKey ? this._prev() : this._next(); }\n if (e.key === 'Escape') { e.preventDefault(); this.close(); }\n });\n\n this._countEl = document.createElement('span');\n this._countEl.className = 'fj:text-xs fj:opacity-50 fj:whitespace-nowrap fj:min-w-[3.5rem] fj:text-center fj:select-none';\n this._countEl.setAttribute('aria-live', 'polite');\n\n const prevBtn = this._iconBtn(\n 'Previous match',\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m18 15-6-6-6 6\"/></svg>`\n );\n prevBtn.addEventListener('click', () => this._prev());\n\n const nextBtn = this._iconBtn(\n 'Next match',\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m6 9 6 6 6-6\"/></svg>`\n );\n nextBtn.addEventListener('click', () => this._next());\n\n this._caseSensitiveBtn = document.createElement('button');\n this._caseSensitiveBtn.type = 'button';\n this._caseSensitiveBtn.className = 'fj:me-btn fj:me-btn-xs fj:me-btn-square fj:me-btn-ghost fj:text-xs fj:font-bold';\n this._caseSensitiveBtn.textContent = 'Aa';\n this._caseSensitiveBtn.setAttribute('aria-label', 'Match case');\n this._caseSensitiveBtn.setAttribute('aria-pressed', 'false');\n this._caseSensitiveBtn.title = 'Match case';\n this._caseSensitiveBtn.addEventListener('click', () => {\n this._caseSensitive = !this._caseSensitive;\n this._caseSensitiveBtn.setAttribute('aria-pressed', String(this._caseSensitive));\n this._caseSensitiveBtn.classList.toggle('fj:me-btn-active', this._caseSensitive);\n this._search();\n });\n\n const replaceToggle = document.createElement('button');\n replaceToggle.type = 'button';\n replaceToggle.className = 'fj:me-btn fj:me-btn-xs fj:me-btn-ghost fj:text-xs fj:px-1.5';\n replaceToggle.textContent = 'Replace';\n replaceToggle.setAttribute('aria-label', 'Toggle replace row');\n replaceToggle.addEventListener('click', () => {\n this._replaceRow.hidden = !this._replaceRow.hidden;\n if (!this._replaceRow.hidden) this._replaceInput.focus();\n });\n\n const closeBtn = this._iconBtn(\n 'Close',\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/></svg>`\n );\n closeBtn.addEventListener('click', () => this.close());\n\n findRow.append(this._findInput, this._countEl, prevBtn, nextBtn, this._caseSensitiveBtn, replaceToggle, closeBtn);\n\n // ── Replace row ─────────────────────────────────────────────\n this._replaceRow = document.createElement('div');\n this._replaceRow.className = 'fj:flex fj:items-center fj:gap-1';\n this._replaceRow.hidden = true;\n\n this._replaceInput = document.createElement('input');\n this._replaceInput.type = 'text';\n this._replaceInput.placeholder = 'Replace';\n this._replaceInput.className = 'fj:me-input fj:me-input-xs fj:w-36';\n this._replaceInput.setAttribute('aria-label', 'Replace with');\n this._replaceInput.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') this._replace();\n if (e.key === 'Escape') { e.preventDefault(); this.close(); }\n });\n\n const replaceBtn = document.createElement('button');\n replaceBtn.type = 'button';\n replaceBtn.className = 'fj:me-btn fj:me-btn-xs fj:me-btn-ghost fj:text-xs fj:px-1.5';\n replaceBtn.textContent = 'Replace';\n replaceBtn.addEventListener('click', () => this._replace());\n\n const replaceAllBtn = document.createElement('button');\n replaceAllBtn.type = 'button';\n replaceAllBtn.className = 'fj:me-btn fj:me-btn-xs fj:me-btn-ghost fj:text-xs fj:px-1.5';\n replaceAllBtn.textContent = 'All';\n replaceAllBtn.setAttribute('aria-label', 'Replace all');\n replaceAllBtn.addEventListener('click', () => this._replaceAll());\n\n this._replaceRow.append(this._replaceInput, replaceBtn, replaceAllBtn);\n\n panel.append(findRow, this._replaceRow);\n this.editor.markdownEditorDiv.appendChild(panel);\n this._panel = panel;\n }\n\n _iconBtn(label, svgHtml) {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'fj:me-btn fj:me-btn-xs fj:me-btn-square fj:me-btn-ghost';\n btn.setAttribute('aria-label', label);\n btn.innerHTML = svgHtml;\n const svg = btn.querySelector('svg');\n if (svg) svg.setAttribute('aria-hidden', 'true');\n return btn;\n }\n\n _search() {\n const query = this._findInput?.value ?? '';\n const value = this.editor.usertextarea.value;\n\n if (!query) {\n this._matches = [];\n this._currentIndex = -1;\n this._clearMatchHighlight();\n this._updateCount();\n return;\n }\n\n const searchValue = this._caseSensitive ? value : value.toLowerCase();\n const searchQuery = this._caseSensitive ? query : query.toLowerCase();\n this._matches = [];\n\n let pos = 0;\n while (pos <= searchValue.length - searchQuery.length) {\n const idx = searchValue.indexOf(searchQuery, pos);\n if (idx === -1) break;\n this._matches.push({ start: idx, end: idx + query.length });\n pos = idx + 1;\n }\n\n if (this._matches.length > 0) {\n this._currentIndex = Math.min(\n Math.max(this._currentIndex, 0),\n this._matches.length - 1\n );\n } else {\n this._currentIndex = -1;\n }\n\n this._selectCurrent();\n this._updateCount();\n }\n\n _next() {\n if (this._matches.length === 0) return;\n this._currentIndex = (this._currentIndex + 1) % this._matches.length;\n this._selectCurrent();\n this._updateCount();\n }\n\n _prev() {\n if (this._matches.length === 0) return;\n this._currentIndex = (this._currentIndex - 1 + this._matches.length) % this._matches.length;\n this._selectCurrent();\n this._updateCount();\n }\n\n _selectCurrent() {\n if (this._currentIndex === -1 || this._matches.length === 0) {\n this._clearMatchHighlight();\n return;\n }\n const { start } = this._matches[this._currentIndex];\n this._scrollToMatch(this.editor.usertextarea, start);\n this._showMatchHighlight();\n }\n\n _scrollToMatch(textarea, pos) {\n const lineHeight = parseInt(window.getComputedStyle(textarea).lineHeight) || 20;\n const linesBefore = textarea.value.substring(0, pos).split('\\n').length - 1;\n const rowsVisible = Math.floor(textarea.clientHeight / lineHeight);\n textarea.scrollTop = Math.max(0, (linesBefore - Math.floor(rowsVisible / 2)) * lineHeight);\n }\n\n _showMatchHighlight() {\n this._clearMatchHighlight();\n if (this._currentIndex === -1 || !this._matches.length) return;\n\n const { start, end } = this._matches[this._currentIndex];\n const textarea = this.editor.usertextarea;\n const cs = window.getComputedStyle(textarea);\n const wrapper = textarea.parentElement;\n\n // Mirror div replicates textarea layout to measure exact character positions\n const mirror = document.createElement('div');\n Object.assign(mirror.style, {\n position: 'absolute',\n visibility: 'hidden',\n pointerEvents: 'none',\n top: '0', left: '0', right: '0',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n overflowWrap: 'break-word',\n font: cs.font,\n lineHeight: cs.lineHeight,\n paddingTop: cs.paddingTop,\n paddingRight: cs.paddingRight,\n paddingBottom: cs.paddingBottom,\n paddingLeft: cs.paddingLeft,\n boxSizing: 'border-box',\n });\n\n const marker = document.createElement('span');\n marker.textContent = textarea.value.substring(start, end) || '';\n mirror.appendChild(document.createTextNode(textarea.value.substring(0, start)));\n mirror.appendChild(marker);\n mirror.appendChild(document.createTextNode(textarea.value.substring(end)));\n\n wrapper.appendChild(mirror);\n try {\n const wRect = wrapper.getBoundingClientRect();\n const mRect = marker.getBoundingClientRect();\n\n const hl = document.createElement('div');\n Object.assign(hl.style, {\n position: 'absolute',\n top: (mRect.top - wRect.top - textarea.scrollTop) + 'px',\n left: (mRect.left - wRect.left) + 'px',\n width: Math.max(mRect.width, 2) + 'px',\n height: mRect.height + 'px',\n background: 'color-mix(in oklch, var(--color-primary, oklch(0.6 0.2 250)), transparent 55%)',\n borderRadius: '2px',\n pointerEvents: 'none',\n zIndex: '2',\n });\n wrapper.appendChild(hl);\n this._highlightEl = hl;\n } finally {\n wrapper.removeChild(mirror);\n }\n }\n\n _clearMatchHighlight() {\n this._highlightEl?.remove();\n this._highlightEl = null;\n }\n\n _updateCount() {\n if (!this._countEl) return;\n if (this._matches.length === 0) {\n this._countEl.textContent = this._findInput?.value ? 'No results' : '';\n } else {\n this._countEl.textContent = `${this._currentIndex + 1} of ${this._matches.length}`;\n }\n }\n\n _replace() {\n if (this._currentIndex === -1) return;\n const { start, end } = this._matches[this._currentIndex];\n const textarea = this.editor.usertextarea;\n const replaceWith = this._replaceInput.value;\n\n textarea.value =\n textarea.value.substring(0, start) +\n replaceWith +\n textarea.value.substring(end);\n\n this.editor.render();\n this.editor.notifyChange();\n\n this._search();\n }\n\n _replaceAll() {\n const query = this._findInput?.value;\n if (!query) return;\n const replaceWith = this._replaceInput.value;\n const textarea = this.editor.usertextarea;\n\n const escaped = query.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const flags = this._caseSensitive ? 'g' : 'gi';\n textarea.value = textarea.value.replace(new RegExp(escaped, flags), replaceWith);\n\n this.editor.render();\n this.editor.notifyChange();\n\n this._currentIndex = 0;\n this._search();\n }\n\n destroy() {\n this.editor.usertextarea.removeEventListener('keydown', this._taHandler);\n if (this._scrollHandler) {\n this.editor.usertextarea.removeEventListener('scroll', this._scrollHandler);\n }\n this._clearMatchHighlight();\n this._panel?.remove();\n }\n}\n","import { uploadImage } from './imageUpload.js';\n\n// Deliberately strict: only a bare http(s) URL with no whitespace becomes a link.\n// Pasting a sentence that happens to contain a URL should paste as written.\nconst BARE_URL = /^https?:\\/\\/\\S+$/i;\n\n/**\n * Handles pasting and dropping into the textarea:\n *\n * - image files are uploaded and inserted, when image upload is configured\n * - a bare URL pasted over a selection becomes [selection](url)\n *\n * Anything else falls through to the browser's own paste.\n */\nexport default class PasteManager {\n constructor(editor) {\n this.editor = editor;\n this.textarea = editor.usertextarea;\n\n this._pasteHandler = (e) => this._onPaste(e);\n this._dropHandler = (e) => this._onDrop(e);\n this._dragOverHandler = (e) => { if (this._carriesFiles(e.dataTransfer)) e.preventDefault(); };\n\n this.textarea.addEventListener('paste', this._pasteHandler);\n this.textarea.addEventListener('drop', this._dropHandler);\n this.textarea.addEventListener('dragover', this._dragOverHandler);\n }\n\n destroy() {\n this.textarea.removeEventListener('paste', this._pasteHandler);\n this.textarea.removeEventListener('drop', this._dropHandler);\n this.textarea.removeEventListener('dragover', this._dragOverHandler);\n }\n\n _carriesFiles(dataTransfer) {\n return Array.from(dataTransfer?.types ?? []).includes('Files');\n }\n\n _imageFiles(dataTransfer) {\n return Array.from(dataTransfer?.files ?? []).filter(f => f.type?.startsWith('image/'));\n }\n\n _onPaste(event) {\n const images = this._imageFiles(event.clipboardData);\n if (images.length) {\n if (!this.editor.imageUpload) {\n // Nothing to prevent here, a textarea cannot paste an image anyway,\n // but say why nothing happened rather than leaving it a mystery.\n console.warn('[MarkdownEditor] An image was pasted but no upload endpoint is configured. Add { image: { fileInput: { uploadUrl: \"...\" } } } to the toolbar to enable it.');\n return;\n }\n event.preventDefault();\n this._uploadAll(images);\n return;\n }\n\n const pasted = event.clipboardData?.getData('text/plain')?.trim();\n const { selectionStart, selectionEnd } = this.textarea;\n const hasSelection = selectionEnd > selectionStart;\n\n if (pasted && hasSelection && BARE_URL.test(pasted)) {\n event.preventDefault();\n const selected = this.textarea.value.slice(selectionStart, selectionEnd);\n const link = `[${selected}](${pasted})`;\n this.editor.insertText(link, link.length, 0);\n }\n }\n\n _onDrop(event) {\n if (!this._carriesFiles(event.dataTransfer)) return;\n\n // Always swallow file drops. The browser's default is to navigate to the\n // dropped file, which would throw away everything the user has written,\n // and dragover has already advertised the textarea as a drop target.\n event.preventDefault();\n\n const images = this._imageFiles(event.dataTransfer);\n if (!images.length) return;\n\n if (!this.editor.imageUpload) {\n console.warn('[MarkdownEditor] An image was dropped but no upload endpoint is configured. Add { image: { fileInput: { uploadUrl: \"...\" } } } to the toolbar to enable it.');\n return;\n }\n\n this._uploadAll(images);\n }\n\n /**\n * Inserts a placeholder immediately so the editor does not appear frozen,\n * then swaps it for the real image once the upload resolves. Uploads run one\n * at a time so the placeholders stay in the order the files arrived.\n */\n async _uploadAll(files) {\n for (const file of files) {\n const token = `![${this.editor.label('Uploading...')}]()`;\n this.editor.insertText(token, token.length, 0);\n\n try {\n const { path, alt } = await uploadImage(file, this.editor.imageUpload);\n this._replace(token, ``);\n } catch (err) {\n // Leave a visible marker rather than silently removing the\n // placeholder. Without devtools open, a vanishing placeholder\n // looks like nothing happened at all.\n this._replace(token, `![${this.editor.label('Upload failed')}]()`);\n console.error('[MarkdownEditor] Image upload failed.', err);\n }\n }\n }\n\n _replace(token, replacement) {\n const textarea = this.textarea;\n const at = textarea.value.indexOf(token);\n if (at === -1) return; // the user deleted it while the upload was in flight\n\n textarea.value = textarea.value.slice(0, at) + replacement + textarea.value.slice(at + token.length);\n const caret = at + replacement.length;\n textarea.setSelectionRange(caret, caret);\n\n this.editor.render();\n this.editor.notifyChange();\n }\n}\n","import '../styles/main.css';\nimport { Marked } from 'marked';\nimport DOMPurify from 'dompurify';\nimport Toolbar from './toolbar/Toolbar.js';\nimport Preview from './Preview.js';\nimport Footer from './Footer.js';\nimport UndoRedoManager from '../utils/UndoRedoManager.js';\nimport IndentManager from '../utils/IndentManager.js';\nimport ListManager from '../utils/ListManager.js';\nimport ShortcutManager from '../utils/ShortcutManager.js';\nimport FindReplace from '../utils/FindReplace.js';\nimport PasteManager from '../utils/PasteManager.js';\nimport { applyVariableSamples } from '../utils/variables.js';\n\n// Own instance rather than marked.setOptions(), which would mutate the shared\n// singleton and silently change behaviour for a host app that also uses marked.\nconst defaultRenderer = new Marked({ breaks: true });\n\nclass MarkdownEditor {\n constructor(selector, options = {}) {\n this.usertextarea = typeof selector === 'string' ? document.querySelector(selector) : selector;\n this.options = options;\n this.mode = options.mode || 'plain';\n this.preview = (this.options.toolbar) ? this.options.toolbar.includes('preview') : true;\n this.footerOptions = this._parseFooterOptions(options.footer);\n this.variables = this._parseVariables(options.toolbar);\n this.imageUpload = this._parseImageUpload(options.toolbar);\n this.previewTimer = null;\n this.init();\n this.undoRedoManager = new UndoRedoManager(this);\n this.listManager = new ListManager(this);\n this.indentManager = new IndentManager(this);\n this.shortcutManager = new ShortcutManager(this);\n this.findReplace = new FindReplace(this);\n this.pasteManager = new PasteManager(this);\n }\n\n /**\n * Returns the translation for a UI string, or the string itself when none is\n * configured. Keyed by the English text, the way gettext is, so a tool does\n * not need to know anything about translation.\n */\n label(text) {\n return this.options.labels?.[text] ?? text;\n }\n\n /**\n * Upload settings live in the toolbar as { image: { fileInput: {...} } }, but\n * paste and drop need them before the toolbar exists. Read them up front, and\n * only when an upload endpoint is actually configured.\n */\n _parseImageUpload(toolbar) {\n const entry = (Array.isArray(toolbar) ? toolbar : [])\n .find(tool => tool && typeof tool === 'object' && tool.image);\n const fileInput = entry?.image?.fileInput;\n return fileInput?.uploadUrl ? fileInput : null;\n }\n\n /**\n * Variables are configured inline in the toolbar as { variables: [...] },\n * but the preview needs them before the toolbar exists, since createEditor()\n * renders first. Read them from the toolbar array at construction instead.\n */\n _parseVariables(toolbar) {\n const entry = (Array.isArray(toolbar) ? toolbar : [])\n .find(tool => tool && typeof tool === 'object' && Array.isArray(tool.variables));\n return entry ? entry.variables : [];\n }\n\n _parseFooterOptions(footer) {\n if (footer === false) return null;\n const opts = footer ?? {};\n return {\n line: opts.line !== false,\n col: opts.col !== false,\n chars: opts.chars !== false,\n words: opts.words === true,\n };\n }\n\n init() {\n this.createEditor();\n this.addToolbar();\n this.addFooter();\n this._toolbarH = this.editorContainer.querySelector('.toolbar')?.offsetHeight ?? 0;\n this._footerH = this.editorContainer.querySelector('.editor-footer')?.offsetHeight ?? 0;\n this._autoGrow();\n }\n\n createEditor() {\n if (!this.isTextareaValid()) return;\n\n this.applyDefaultAttributes();\n this.buildEditorLayout();\n this.addInputListener();\n this.render();\n }\n\n isTextareaValid() {\n return this.usertextarea.tagName === 'TEXTAREA';\n }\n\n applyDefaultAttributes() {\n const hasLabel = (this.usertextarea.id && document.querySelector(`label[for=\"${this.usertextarea.id}\"]`))\n || this.usertextarea.getAttribute('aria-label')\n || this.usertextarea.getAttribute('aria-labelledby');\n if (!hasLabel) {\n this.usertextarea.setAttribute('aria-label', this.options.label || 'Markdown editor');\n this._addedAriaLabel = true;\n }\n\n this.usertextarea.classList.add(\n \"editor-textarea\",\n \"fj:focus:ring-0\",\n \"fj:focus:outline-0\",\n \"fj:border-0\",\n \"fj:border-base-soft\",\n \"fj:px-4\",\n \"fj:py-2\",\n \"fj:max-w-full\",\n \"fj:w-full\",\n \"fj:h-full\",\n \"fj:bg-transparent\",\n \"fj:outline-0\",\n \"fj:appearance-none\",\n \"fj:overflow-y-auto\",\n );\n if (!this.usertextarea.hasAttribute('placeholder')) {\n this.usertextarea.placeholder = this.options.placeholder || 'Write your markdown...';\n }\n }\n\n buildEditorLayout() {\n this.editorContainer = document.createElement('div');\n this.editorContainer.className = `\n markdown-editor-wrapper\n fj:me-surface\n fj:me-surface-outline\n fj:me-surface-rounded\n fj:overflow-hidden\n fj:flex\n fj:flex-col\n `;\n const theme = this.options.theme\n ?? this.usertextarea.closest('[data-theme]')?.getAttribute('data-theme');\n if (theme) this.editorContainer.setAttribute('data-theme', theme);\n\n // Mirror the textarea's id so a single editor can be targeted in CSS.\n // Copied as a data attribute, not an id, so getElementById still\n // resolves to the textarea.\n if (this.usertextarea.id) this.editorContainer.dataset.editor = this.usertextarea.id;\n\n this.editorContainer.style.minHeight = (this.options.minHeight ?? 200) + 'px';\n\n this.usertextarea.parentNode.insertBefore(this.editorContainer, this.usertextarea);\n\n this.markdownEditorDiv = document.createElement('div');\n this.markdownEditorDiv.className = `editor-layout fj:relative fj:grid fj:grid-cols-1 fj:flex-1 fj:min-h-0`;\n this.editorContainer.appendChild(this.markdownEditorDiv);\n\n this.addTextareaWrapper();\n if (this.preview) this.addPreviewWrapper();\n }\n\n addTextareaWrapper() {\n const textareaContainer = document.createElement('div');\n textareaContainer.className = `\n textarea-wrapper\n not-prose\n fj:me-surface\n fj:h-full\n fj:min-h-0\n fj:relative\n fj:grid\n `;\n\n if(this.mode == 'hybrid'){\n this.displayLayer = document.createElement('div');\n this.displayLayer.setAttribute('data-placeholder', this.usertextarea.placeholder);\n this.displayLayer.setAttribute(\"aria-hidden\", true);\n this.displayLayer.className = `\n display-layer\n fj:px-4\n fj:py-2\n fj:whitespace-pre-wrap fj:wrap-break-word\n fj:pointer-events-none\n fj:absolute\n fj:inset-0\n fj:m-0\n fj:box-border\n fj:z-0\n fj:overflow-y-auto\n fj:empty:after:content-[attr(data-placeholder)]\n fj:empty:after:absolute\n fj:empty:after:inset-0\n fj:empty:after:px-4\n fj:empty:after:py-2\n fj:empty:after:text-[CanvasText]\n fj:empty:after:opacity-50\n `;\n\n this.usertextarea.className += `\n fj:text-transparent\n fj:caret-primary\n fj:resize-none\n fj:outline-none\n fj:m-0\n fj:box-border\n fj:relative\n fj:z-10\n `;\n\n textareaContainer.appendChild(this.displayLayer);\n }\n\n textareaContainer.appendChild(this.usertextarea);\n this.markdownEditorDiv.appendChild(textareaContainer);\n }\n\n \n\n addPreviewWrapper() {\n const previewInstance = new Preview(this.markdownEditorDiv);\n this.previewContent = previewInstance.getPreviewContent();\n }\n\n addInputListener() {\n this._inputHandler = () => {\n this._autoGrow();\n this.renderHybrid(); // Fast: Only Regex\n this.debouncedPreview(); // Slow: Heavy Markdown Parse\n this.notifyChange();\n };\n\n this._scrollHandler = () => {\n if (this._scrollRaf) return;\n this._scrollRaf = requestAnimationFrame(() => {\n this._scrollRaf = null;\n\n if (this.mode === 'hybrid') {\n // PIXEL PERFECT SYNC: Do not use ratios for the hybrid layer\n this.displayLayer.scrollTop = this.usertextarea.scrollTop;\n this.displayLayer.scrollLeft = this.usertextarea.scrollLeft;\n }\n\n if (this.preview && this.previewContent) {\n // RATIO SYNC: Use ratio only for the fully rendered preview\n const textarea = this.usertextarea;\n const ratio = textarea.scrollTop / (textarea.scrollHeight - textarea.clientHeight);\n this.previewContent.scrollTop = ratio * (this.previewContent.scrollHeight - this.previewContent.clientHeight);\n }\n });\n };\n\n this.usertextarea.addEventListener('input', this._inputHandler);\n this.usertextarea.addEventListener('scroll', this._scrollHandler);\n }\n\n debouncedPreview() {\n if (!this.preview) return;\n clearTimeout(this.previewTimer);\n this.previewTimer = setTimeout(() => {\n this.previewContent.innerHTML = this._renderMarkdown(this.usertextarea.value);\n this.wirePreviewCheckboxes();\n const textarea = this.usertextarea;\n const ratio = textarea.scrollTop / (textarea.scrollHeight - textarea.clientHeight);\n this.previewContent.scrollTop = ratio * (this.previewContent.scrollHeight - this.previewContent.clientHeight);\n }, 150); // 150ms delay feels instant but saves CPU\n }\n\n _renderMarkdown(markdown) {\n const render = this.options.renderer ?? (md => defaultRenderer.parse(md));\n const sanitize = this.options.sanitizer ?? (html => DOMPurify.sanitize(html));\n\n // Variables that declare a sample are shown as that sample in the preview.\n // Only this copy is affected; the textarea keeps the real placeholders.\n const source = applyVariableSamples(markdown, this.variables);\n const html = render(source);\n\n // Clickable checkboxes are matched by index against task-list lines, so a\n // custom renderer that emits none breaks them silently. Warn once.\n if (this.options.renderer && !this._taskListWarned\n && /^\\s*[-*] \\[[ xX]\\] /m.test(source) && !/type=[\"']?checkbox/.test(html)) {\n this._taskListWarned = true;\n console.warn('[MarkdownEditor] Task list syntax found, but the custom renderer emitted no checkboxes. Clickable checkboxes in the preview need a task-list plugin, e.g. markdown-it-task-lists.');\n }\n\n return sanitize(html);\n }\n\n wirePreviewCheckboxes() {\n const checkboxes = this.previewContent.querySelectorAll('input[type=\"checkbox\"]');\n checkboxes.forEach((checkbox, index) => {\n checkbox.removeAttribute('disabled');\n checkbox.addEventListener('click', (e) => {\n e.preventDefault();\n const lines = this.usertextarea.value.split('\\n');\n let count = 0;\n for (let i = 0; i < lines.length; i++) {\n if (/^(\\s*)([-*] \\[[ xX]\\] )/.test(lines[i])) {\n if (count === index) {\n if (checkbox.checked) {\n lines[i] = lines[i].replace(/\\[ \\]/, '[x]');\n } else {\n lines[i] = lines[i].replace(/\\[[xX]\\]/, '[ ]');\n }\n break;\n }\n count++;\n }\n }\n this.usertextarea.value = lines.join('\\n');\n this.render();\n this.notifyChange();\n });\n });\n }\n\n addFooter() {\n if (!this.footerOptions) return;\n const { line, col, chars, words } = this.footerOptions;\n if (!line && !col && !chars && !words) return;\n this.footer = new Footer(this.editorContainer, this.footerOptions);\n this.footer.update(this.usertextarea);\n\n this._footerUpdate = () => this.footer.update(this.usertextarea);\n this.usertextarea.addEventListener('input', this._footerUpdate);\n this.usertextarea.addEventListener('click', this._footerUpdate);\n this.usertextarea.addEventListener('keyup', this._footerUpdate);\n this.usertextarea.addEventListener('focus', this._footerUpdate);\n }\n\n addToolbar() {\n new Toolbar(\n this,\n this.options.toolbar ||\n [\n // History/System (Usually far left)\n 'undo', \n 'redo',\n \n // Block Structure\n 'heading', \n 'blockquote', \n \n // Lists & Indentation\n 'ul', \n 'ol', \n 'checklist', \n 'outdent', \n 'indent', \n \n // Inline Formatting\n 'bold',\n 'italic',\n 'strikethrough',\n 'code',\n\n // Block Formatting\n 'codeblock',\n 'hr',\n 'table',\n\n // Rich Media/Links\n 'link',\n 'image',\n \n // View/Preview (Usually far right)\n 'preview'\n ]\n );\n }\n\n insertText(text, selectionOffset = 0, trailingLength = 0) {\n const { selectionStart, selectionEnd } = this.usertextarea;\n const value = this.usertextarea.value;\n this.usertextarea.value = `${value.substring(0, selectionStart)}${text}${value.substring(selectionEnd)}`;\n this.usertextarea.focus();\n this.usertextarea.setSelectionRange(selectionStart + selectionOffset, selectionStart + text.length - trailingLength);\n\n // Scroll the textarea to the inserted text\n this.scrollToView();\n\n this.render();\n this.notifyChange();\n }\n\n scrollToView() {\n const textarea = this.usertextarea;\n const selectionStart = textarea.selectionStart;\n\n const lineHeight = parseInt(window.getComputedStyle(textarea).lineHeight);\n const currentLine = textarea.value.substring(0, selectionStart).split('\\n').length - 1;\n const rowsInView = Math.floor(textarea.clientHeight / lineHeight);\n textarea.scrollTop = (currentLine - Math.floor(rowsInView / 2)) * lineHeight;\n }\n \n\n _highlight(rawValue) {\n let out = rawValue\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n\n out = out\n .replace(/```(\\w+)?\\n([\\s\\S]*?)```/g,\n '<span class=\"fj:opacity-30\">```$1</span>\\n$2<span class=\"fj:opacity-30\">```</span>')\n .replace(/`([^`\\n]+)`/g,\n '<span class=\"fj:opacity-40\">`</span><span class=\"fj:text-accent\">$1</span><span class=\"fj:opacity-40\">`</span>')\n .replace(/^(#+ )(.*)$/gm,\n '<span class=\"fj:text-primary\"><span class=\"fj:opacity-40\">$1</span><span class=\"faux-bold\">$2</span></span>')\n .replace(/\\*\\*(.*?)\\*\\*/g,\n '<span class=\"fj:text-secondary\"><span class=\"fj:opacity-40\">**</span><span class=\"faux-bold\">$1</span><span class=\"fj:opacity-40\">**</span></span>')\n .replace(/^([\\s]*)([\\-\\*] |[\\d]+\\. |\\[[\\s xX]\\] )(.*)$/gm,\n '$1<span class=\"fj:text-primary\">$2</span>$3')\n .replace(/(\\*|_)(.*?)\\1/g,\n '<span class=\"fj:text-accent\"><span class=\"fj:opacity-40\">$1</span>$2<span class=\"fj:opacity-40\">$1</span></span>')\n .replace(/~~(.*?)~~/g,\n '<span class=\"fj:line-through fj:opacity-70\"><span class=\"fj:opacity-40\">~~</span>$1<span class=\"fj:opacity-40\">~~</span></span>')\n .replace(/(?<!~)(~)([^~]+)\\1(?!~)/g,\n '<span class=\"fj:line-through fj:opacity-70\"><span class=\"fj:opacity-40\">$1</span>$2<span class=\"fj:opacity-40\">$1</span></span>')\n .replace(/(!?\\[)(.*?)(\\]\\()(.*?)(\\))/g,\n '<span class=\"fj:opacity-40\">$1</span><span class=\"fj:text-primary\">$2</span><span class=\"fj:opacity-40\">$3</span><span class=\"fj:underline fj:opacity-50\">$4</span><span class=\"fj:opacity-50\">$5</span>');\n\n if (rawValue.endsWith('\\n')) out += ' ';\n return out;\n }\n\n renderHybrid() {\n if (this.mode !== 'hybrid') return;\n\n const rawValue = this.usertextarea.value;\n if (rawValue === this._lastRaw) return;\n this._lastRaw = rawValue;\n\n const highlighted = this._highlight(rawValue);\n const newLines = highlighted.split('\\n');\n const lastLines = this._lastLines;\n\n if (!lastLines || lastLines.length !== newLines.length) {\n this.displayLayer.innerHTML = '';\n this._lineNodes = newLines.map((line, i) => {\n const node = document.createElement('span');\n node.innerHTML = line + (i < newLines.length - 1 ? '\\n' : '');\n this.displayLayer.appendChild(node);\n return node;\n });\n this._lastLines = newLines.slice();\n return;\n }\n\n for (let i = 0; i < newLines.length; i++) {\n if (newLines[i] !== lastLines[i]) {\n this._lineNodes[i].innerHTML = newLines[i] + (i < newLines.length - 1 ? '\\n' : '');\n lastLines[i] = newLines[i];\n }\n }\n }\n\n _autoGrow() {\n if (this.editorContainer.classList.contains('is-fullscreen')) return;\n\n const textarea = this.usertextarea;\n // Shrink to 1px to measure natural content height (bypasses h-full)\n textarea.style.height = '1px';\n const contentHeight = textarea.scrollHeight;\n textarea.style.height = ''; // restore — h-full class takes over\n\n const maxHeight = this.options.maxHeight ?? 500;\n this.editorContainer.style.height = (Math.min(contentHeight, maxHeight) + this._toolbarH + this._footerH + 1) + 'px';\n }\n\n notifyChange() {\n if (this.options.onChange) this.options.onChange(this.usertextarea.value);\n }\n\n render() {\n this._autoGrow();\n this.renderHybrid();\n if (this.preview) {\n this.previewContent.innerHTML = this._renderMarkdown(this.usertextarea.value);\n this.wirePreviewCheckboxes();\n }\n }\n\n destroy() {\n this.shortcutManager?.destroy();\n this.findReplace?.destroy();\n this.previewTool?.destroy();\n this.undoRedoManager?.destroy();\n this.listManager?.destroy();\n this.pasteManager?.destroy();\n\n if (this._footerUpdate) {\n this.usertextarea.removeEventListener('input', this._footerUpdate);\n this.usertextarea.removeEventListener('click', this._footerUpdate);\n this.usertextarea.removeEventListener('keyup', this._footerUpdate);\n this.usertextarea.removeEventListener('focus', this._footerUpdate);\n }\n\n this.usertextarea.removeEventListener('input', this._inputHandler);\n this.usertextarea.removeEventListener('scroll', this._scrollHandler);\n\n const parent = this.editorContainer.parentNode;\n if (!parent) return;\n\n // Strip classes added by applyDefaultAttributes\n const addedClasses = [\n 'editor-textarea', 'fj:focus:ring-0', 'fj:focus:outline-0', 'fj:border-0',\n 'fj:border-base-soft', 'fj:px-4', 'fj:py-2', 'fj:max-w-full', 'fj:w-full',\n 'fj:h-full', 'fj:bg-transparent', 'fj:outline-0', 'fj:appearance-none', 'fj:overflow-y-auto',\n 'fj:text-transparent', 'fj:caret-primary', 'fj:resize-none', 'fj:outline-none',\n 'fj:m-0', 'fj:box-border', 'fj:relative', 'fj:z-10',\n ];\n addedClasses.forEach(cls => this.usertextarea.classList.remove(cls));\n\n if (this._addedAriaLabel) this.usertextarea.removeAttribute('aria-label');\n this.usertextarea.style.height = '';\n\n parent.insertBefore(this.usertextarea, this.editorContainer);\n this.editorContainer.remove();\n }\n}\n\nexport default MarkdownEditor;"],"x_google_ignoreList":[0,1,29,30,31,32,33,34,35,36,37],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"markdown-text-editor.es.js","names":["Marked","DOMPurify","I","P","W","l","A","C","e","n","t","s","h","o","r","x","_e","N","$e","Le","ze","G","Ae","J","he","de","Ee","V","Me","Y","Ie","Ce","ee","Be","ke","De","qe","te","ue","Ze","He","Ge","Ne","ge","Qe","$","B","Q","je","Fe","fe","Ue","Ke","We","me","Xe","Je","Ye","xe","et","tt","rt","st","ot","at","ut","pt","ct","ht","dt","be","U","kt","gt","ft","pe","mt","xt","ce","Rt","ne","Tt","X","Ot","j","D","wt","Re","O","Te","re","se","u","a","i","L","ie","q","oe","ae","Oe","p","c","d","Pt","we","y","m","b","g","w","f","M","v","Z","le","Pe","ye","K","H","Se","R","S","z","T","_","F","E","k","yt","_OverloadYield","_arrayLikeToArray","_arrayWithHoles","_iterableToArrayLimit","_nonIterableRest","_slicedToArray","_unsupportedIterableToArray","AsyncGenerator","resume","settle","entries","setPrototypeOf","isFrozen","getPrototypeOf","getOwnPropertyDescriptor","freeze","seal","create","_ref","apply","construct","args","func","thisArg","Func","arrayForEach","unapply","arrayLastIndexOf","arrayPop","arrayPush","arraySplice","arrayIsArray","stringToLowerCase","stringToString","stringMatch","stringReplace","stringIndexOf","stringTrim","numberToString","booleanToString","bigintToString","symbolToString","objectHasOwnProperty","objectToString","regExpTest","typeErrorCreate","unconstruct","addToSet","transformCaseFunc","set","array","element","lcElement","cleanArray","index","clone","newObject","_ref2","object","_ref3","property","value","stringifyValue","valueAsRecord","valueToString","lookupGetter","stringified","desc","prop","fallbackValue","isRegex","html$1","svg$1","svgFilters","svgDisallowed","mathMl$1","mathMlDisallowed","text","html","svg","mathMl","xml","MUSTACHE_EXPR","ERB_EXPR","TMPLIT_EXPR","DATA_ATTR","ARIA_ATTR","IS_ALLOWED_URI","IS_SCRIPT_OR_DATA","ATTR_WHITESPACE","DOCTYPE_NAME","CUSTOM_ELEMENT","ELEMENT_MARKUP_PROBE","COMMENT_MARKUP_PROBE","FALLBACK_TAG_CLOSE","SELF_CLOSING_TAG","NODE_TYPE","LITERAL_TEXT_ELEMENT_NAMES","LITERAL_TEXT_ELEMENTS","LITERAL_TEXT_CLOSE","map","name","getGlobal","_createTrustedTypesPolicy","trustedTypes","suffix","ATTR_NAME","purifyHostElement","policyName","scriptUrl","_createHooksMap","_resolveSetOption","cfg","key","options","fallback","_resolveObjectOption","makeFallback","createDOMPurify","window","DOMPurify","root","document","originalDocument","currentScript","HTMLTemplateElement","Node","Element","NodeFilter","DOMParser","ElementPrototype","cloneNode","remove","removeAttributeNode","getNextSibling","getChildNodes","getParentNode","getShadowRoot","getAttributes","getNodeType","getNodeName","getOwnerDocument","_readNodeType","node","_readNodeName","template","trustedTypesPolicy","emptyHTML","defaultTrustedTypesPolicy","defaultTrustedTypesPolicyResolved","IN_TRUSTED_TYPES_POLICY","_assertNotInTrustedTypesPolicy","_createTrustedHTML","_createTrustedScriptURL","_getDefaultTrustedTypesPolicy","_document","implementation","createNodeIterator","createDocumentFragment","getElementsByTagName","importNode","hooks","MUSTACHE_EXPR$1","ERB_EXPR$1","TMPLIT_EXPR$1","DATA_ATTR$1","ARIA_ATTR$1","IS_SCRIPT_OR_DATA$1","ATTR_WHITESPACE$1","CUSTOM_ELEMENT$1","IS_ALLOWED_URI$1","ALLOWED_TAGS","DEFAULT_ALLOWED_TAGS","ALLOWED_ATTR","DEFAULT_ALLOWED_ATTR","CUSTOM_ELEMENT_HANDLING","FORBID_TAGS","FORBID_ATTR","EXTRA_ELEMENT_HANDLING","ALLOW_ARIA_ATTR","ALLOW_DATA_ATTR","ALLOW_UNKNOWN_PROTOCOLS","ALLOW_SELF_CLOSE_IN_ATTR","SAFE_FOR_TEMPLATES","SAFE_FOR_XML","WHOLE_DOCUMENT","SET_CONFIG","SET_CONFIG_ALLOWED_TAGS","SET_CONFIG_ALLOWED_ATTR","FORCE_BODY","RETURN_DOM","RETURN_DOM_FRAGMENT","RETURN_TRUSTED_TYPE","SANITIZE_DOM","SANITIZE_NAMED_PROPS","SANITIZE_NAMED_PROPS_PREFIX","KEEP_CONTENT","IN_PLACE","USE_PROFILES","FORBID_CONTENTS","DEFAULT_FORBID_CONTENTS","DATA_URI_TAGS","DEFAULT_DATA_URI_TAGS","URI_SAFE_ATTRIBUTES","DEFAULT_URI_SAFE_ATTRIBUTES","MATHML_NAMESPACE","SVG_NAMESPACE","HTML_NAMESPACE","NAMESPACE","IS_EMPTY_INPUT","ALLOWED_NAMESPACES","DEFAULT_ALLOWED_NAMESPACES","DEFAULT_MATHML_TEXT_INTEGRATION_POINTS","MATHML_TEXT_INTEGRATION_POINTS","DEFAULT_HTML_INTEGRATION_POINTS","HTML_INTEGRATION_POINTS","COMMON_SVG_AND_HTML_ELEMENTS","PARSER_MEDIA_TYPE","SUPPORTED_PARSER_MEDIA_TYPES","CONFIG","formElement","isRegexOrFunction","testValue","_parseConfig","customElementHandling","previousTrustedTypesPolicy","error","ALL_SVG_TAGS","ALL_MATHML_TAGS","_checkSvgNamespace","parent","tagName","parentTagName","_checkMathMlNamespace","_checkHtmlNamespace","_checkValidNamespace","_forceRemove","_stripAttributeNode","attribute","_neutralizeRoot","childNodes","snapshot","child","attributes","_removeAttribute","attr","_stripDisallowedAttributes","_neutralizeSubtree","stack","_isPatchLinkageAttribute","lcName","lcTag","_neutralizePatchLinkage","nodeType","_initDocument","doc","leadingWhitespace","dirty","matches","dirtyPayload","body","_createNodeIterator","_stripTemplateExpressions","_scrubTemplateExpressions2","walker","currentNode","templates","_isDocumentFragment","tmpl","_isClobbered","realTagName","_isNode","_executeHooks","data","_isUnsafeNode","_matchesNameCheck","check","_sanitizeDisallowedNode","_isBasicCustomElement","parentNode","childCount","hoisted","_forkSharedAllowlist","hookList","defaultSet","setConfigSet","_handleHookDetachedNode","_sanitizeElements","removed","content","_isValidAttribute","nameIsPermitted","RESERVED_CUSTOM_ELEMENT_NAMES","_applyTrustedTypesToAttribute","namespaceURI","_setAttributeValue","_sanitizeAttributes","hookEvent","attrValue","initValue","recreatedNamedProp","_sanitizeShadowDOM2","shadowNode","shadowIterator","fragment","innerSr","_sanitizeAttachedShadowRoots","item","isElement","rootName","sr","importedNode","returnNode","inPlace","nn","walkRoot","nodeIterator","entry","rootWasRemoved","serializedHTML","tag","hookFunction","entryPoint","purify_default","Tool","editor","title","btn","btnClass","iconHtml","event","btnWrapper","BoldTool","textarea","selectedText","selectionStart","selectionEnd","newText","offset","ItalicTool","StrikethroughTool","ULTool","OLTool","PreviewTool","previewWrapper","editorDiv","textareaWrapper","button","isMobile","CheckListTool","syntax","syntaxUnchecked","before","BlockQuoteTool","modal","mde","modalHTML","label","size","bodyHTML","LinkTool","fullText","after","urlMatch","match","prefillText","prefillUrl","modalElement","linkInput","linkTextInput","link","linkText","ALL_LEVELS","parseLevels","levels","valid","HeadingTool","config","popoverId","popoverContent","menu","headingClasses","level","li","wrapper","lineStart","lineEndRaw","lineEnd","lineText","existingLevel","cleanText","prefix","textStart","textEnd","uploadImage","formData","file","alt","params","res","uploadUrl","result","ImageTool","acceptFormats","type","isAltRequired","customParams","imageMatch","prefillAlt","fileInputTag","submitBtn","fileInputSelector","urlInputSelector","imgFileAltInput","hasFile","path","err","imgLink","UndoTool","undoRedoManager","RedoTool","IndentTool","indentManager","OutdentTool","CodeTool","CodeBlockTool","inner","HrTool","TableTool","flattenVariables","usable","out","variables","applyVariableSamples","samples","markdown","ICON","VariableTool","items","sublist","holder","variable","CustomTool","Toolbar","standalone","tool","toolMapping","ToolClass","toolName","toolInstance","previewToolInstance","Preview","container","Footer","pos","lines","parts","wordCount","Diff","callback","oldString","oldStr","newString","newStr","oldTokens","newTokens","done","newLen","oldLen","editLength","maxEditLength","maxExecutionTime","abortAfterTimestamp","bestPath","newPos","minDiagonalToConsider","maxDiagonalToConsider","execEditLength","diagonalPath","basePath","removePath","addPath","canAdd","addPathNewPos","canRemove","exec","ret","last","added","oldPosInc","oldPos","commonCount","left","right","chars","changeObjects","components","nextComponent","lastComponent","componentLen","componentPos","component","oldValue","characterDiff","diffChars","longestCommonPrefix","str1","str2","longestCommonSuffix","replacePrefix","string","oldPrefix","newPrefix","replaceSuffix","oldSuffix","newSuffix","removePrefix","removeSuffix","maximumOverlap","string2","overlapCount","string1","startA","endB","segment","segmentObj","segmenter","trailingWs","leadingAndTrailingWs","leadingWs","segments","firstSeg","lastSeg","extendedWordChars","tokenizeIncludingWhitespace","tokens","prevPart","part","token","changes","lastKeep","insertion","deletion","change","dedupeWhitespaceInChangeObjects","oldWsPrefix","oldWsSuffix","newWsPrefix","newWsSuffix","startKeep","commonWsPrefix","endKeep","commonWsSuffix","ws","newWsFull","delWsStart","delWsEnd","newWsStart","newWsEnd","endKeepWsPrefix","overlap","regex","tokenize","retLines","linesAndNewlines","line","isSentenceEndPunct","char","tokenStartI","undefinedReplacement","canonicalize","stringifyReplacer","replacer","obj","replacementStack","canonicalizedObj","sortedKeys","UndoRedoManager","modifier","isZ","isY","isShift","hasSelection","isDeletiveKey","lastChar","newValue","diff","lastStep","prevValue","redoStep","selection","IndentManager","renderCallback","open","close","charBefore","charAfter","lastNewline","currentLine","indent","startPos","endPos","indentedText","removedFromFirst","totalRemoved","unindentedText","newStart","newEnd","ListManager","olMatch","taskMatch","ulMatch","continuation","insert","cursor","DEFAULT_SHORTCUTS","parseShortcut","spec","ShortcutManager","headingTool","ctrl","shift","combo","shortcut","editorFocused","inFullscreen","headingBtn","headingKeys","previewBtn","FindReplace","withReplace","sel","start","end","panel","findRow","prevBtn","nextBtn","replaceToggle","closeBtn","replaceBtn","replaceAllBtn","svgHtml","query","searchValue","searchQuery","idx","lineHeight","linesBefore","rowsVisible","cs","mirror","marker","wRect","mRect","hl","replaceWith","escaped","flags","BARE_URL","PasteManager","dataTransfer","images","pasted","files","replacement","caret","defaultRenderer","MarkdownEditor","selector","fileInput","toolbar","footer","opts","theme","textareaContainer","previewInstance","ratio","host","selectionOffset","trailingLength","tools","render","md","sanitize","source","checkbox","count","col","words","rowsInView","rawValue","newLines","lastLines","contentHeight","maxHeight","cls"],"sources":["../node_modules/marked/lib/marked.esm.js","../node_modules/dompurify/dist/purify.es.mjs","../src/components/toolbar/Tool.js","../src/components/toolbar/tools/BoldTool.js","../src/components/toolbar/tools/ItalicTool.js","../src/components/toolbar/tools/StrikethroughTool.js","../src/components/toolbar/tools/ULTool.js","../src/components/toolbar/tools/OLTool.js","../src/components/toolbar/tools/PreviewTool.js","../src/components/toolbar/tools/CheckListTool.js","../src/components/toolbar/tools/BlockQuoteTool.js","../src/components/modal.js","../src/components/toolbar/tools/LinkTool.js","../src/components/toolbar/tools/HeadingTool.js","../src/utils/imageUpload.js","../src/components/toolbar/tools/ImageTool.js","../src/components/toolbar/tools/UndoTool.js","../src/components/toolbar/tools/RedoTool.js","../src/components/toolbar/tools/IndentTool.js","../src/components/toolbar/tools/OutdentTool.js","../src/components/toolbar/tools/CodeTool.js","../src/components/toolbar/tools/CodeBlockTool.js","../src/components/toolbar/tools/HrTool.js","../src/components/toolbar/tools/TableTool.js","../src/utils/variables.js","../src/components/toolbar/tools/VariableTool.js","../src/components/toolbar/CustomTool.js","../src/components/toolbar/Toolbar.js","../src/components/Preview.js","../src/components/Footer.js","../node_modules/diff/libesm/diff/base.js","../node_modules/diff/libesm/diff/character.js","../node_modules/diff/libesm/util/string.js","../node_modules/diff/libesm/diff/word.js","../node_modules/diff/libesm/diff/line.js","../node_modules/diff/libesm/diff/sentence.js","../node_modules/diff/libesm/diff/css.js","../node_modules/diff/libesm/diff/json.js","../node_modules/diff/libesm/diff/array.js","../src/utils/UndoRedoManager.js","../src/utils/IndentManager.js","../src/utils/ListManager.js","../src/utils/ShortcutManager.js","../src/utils/FindReplace.js","../src/utils/PasteManager.js","../src/components/Editor.js"],"sourcesContent":["/**\n * marked v18.1.0 - a markdown parser\n * Copyright (c) 2018-2026, MarkedJS. (MIT License)\n * Copyright (c) 2011-2018, Christopher Jeffrey. (MIT License)\n * https://github.com/markedjs/marked\n */\n\n/**\n * DO NOT EDIT THIS FILE\n * The code in this file is generated from files in ./src/\n */\n\nfunction I(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var P=I();function W(l){P=l}var A={exec:()=>null};function C(l){let e=[];return t=>{let n=Math.max(0,Math.min(3,t-1)),s=e[n];return s||(s=l(n),e[n]=s),s}}function h(l,e=\"\"){let t=typeof l==\"string\"?l:l.source,n={replace:(s,r)=>{let o=typeof r==\"string\"?r:r.source;return o=o.replace(x.caret,\"$1\"),t=t.replace(s,o),n},getRegex:()=>new RegExp(t,e)};return n}var _e=((l=\"\")=>{try{return!!new RegExp(\"(?<=1)(?<!1)\"+l)}catch{return!1}})(),x={codeRemoveIndent:/^(?: {0,3}\\t| {1,4})/gm,outputLinkReplace:/\\\\([\\[\\]])/g,indentCodeCompensation:/^(\\s+)(?:```)/,beginningSpace:/^\\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,endingSpaceTabChar:/[ \\t]$/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\\n/g,tabCharGlobal:/\\t/g,leadingSpaceTab:/^[ \\t]+/,multipleSpaceGlobal:/\\s+/g,blankLine:/^[ \\t]*$/,doubleBlankLine:/\\n[ \\t]*\\n[ \\t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\\n {0,3}((?:=+|-+) *)(?=\\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \\t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\\[[ xX]\\] +\\S/,listReplaceTask:/^\\[[ xX]\\] +/,listTaskCheckbox:/\\[[ xX]\\]/,anyLine:/\\n.*\\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\\||\\| *$/g,tableRowBlankLine:/\\n[ \\t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\\s|>)/i,endPreScriptTag:/^<\\/(pre|code|kbd|script)(\\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/,unicodeAlphaNumeric:/[\\p{L}\\p{N}]/u,numericCharacterReference:/&#(?:(\\d{1,7})|[Xx]([A-Fa-f0-9]{1,6}));/g,escapeTest:/[&<>\"']/,escapeReplace:/[&<>\"']/g,escapeTestNoEncode:/[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/,escapeReplaceNoEncode:/[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/g,caret:/(^|[^\\[])\\^/g,percentDecode:/%25/g,findPipe:/\\|/g,splitPipe:/ \\|/,slashPipe:/\\\\\\|/g,carriageReturn:/\\r\\n|\\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\\S*/,endingNewline:/\\n$/,listItemRegex:l=>new RegExp(`^( {0,3}${l})((?:[\t ][^\\\\n]*)?(?:\\\\n|$))`),nextBulletRegex:C(l=>new RegExp(`^ {0,${l}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \t][^\\\\n]*)?(?:\\\\n|$))`)),hrRegex:C(l=>new RegExp(`^ {0,${l}}((?:-[ \t]*){3,}|(?:_[ \t]*){3,}|(?:\\\\*[ \t]*){3,})(?:\\\\n+|$)`)),fencesBeginRegex:C(l=>new RegExp(`^ {0,${l}}(?:\\`\\`\\`|~~~)`)),headingBeginRegex:C(l=>new RegExp(`^ {0,${l}}#`)),htmlBeginRegex:C(l=>new RegExp(`^ {0,${l}}(?:</?(?:${N})(?: +|$|/?>)|<(?:script|pre|style|textarea|!--))`,\"i\")),blockquoteBeginRegex:C(l=>new RegExp(`^ {0,${l}}>`))},$e=/^(?:[ \\t]*(?:\\n|$))+/,Le=/^((?: {4}| {0,3}\\t)[^\\n]+(?:\\n(?:[ \\t]*(?:\\n|$))*)?)+/,ze=/^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/,G=/^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/,Ae=/^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/,J=/ {0,3}(?:[*+-]|\\d{1,9}[.)])/,he=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\\n(?!\\s*?\\n|bull |fences|blockquote|heading|hr|html|table))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,de=h(he).replace(/bull/g,J).replace(/blockCode/g,/(?: {4}| {0,3}\\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\\s|$)/).replace(/hr/g,/ {0,3}(?:(?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/\\|table/g,\"\").getRegex(),Ee=h(he).replace(/bull/g,J).replace(/blockCode/g,/(?: {4}| {0,3}\\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\\s|$)/).replace(/hr/g,/ {0,3}(?:(?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/table/g,/ {0,3}\\|?(?:[:\\- ]*\\|)+[\\:\\- ]*\\n/).getRegex(),V=/^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table|[ \\t]+\\n)[^\\n]+)*)/,Me=/^[^\\n]+/,Y=/(?!\\s*\\])(?:\\\\[\\s\\S]|[^\\[\\]\\\\])+/,Ie=h(/^ {0,3}\\[(label)\\]: *(?:\\n[ \\t]*)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n[ \\t]*)?| *\\n[ \\t]*)(title))? *(?:\\n+|$)/).replace(\"label\",Y).replace(\"title\",/(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/).getRegex(),Ce=h(/^(bull)([ \\t][^\\n]*?)?(?:\\n|$)/).replace(/bull/g,J).getRegex(),N=\"address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul\",ee=/<!--(?:-?>|[\\s\\S]*?(?:-->|$))/,Be=h(\"^ {0,3}(?:<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n*|$)|comment[^\\\\n]*(\\\\n+|$)|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>[^\\\\n]*\\\\n*|$)|<![A-Z][\\\\s\\\\S]*?(?:>[^\\\\n]*\\\\n*|$)|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>[^\\\\n]*\\\\n*|$)|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$)|<(?!script|pre|style|textarea)([a-z][a-z0-9-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$)|</(?!script|pre|style|textarea)[a-z][a-z0-9-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$))\",\"i\").replace(\"comment\",ee).replace(\"tag\",N).replace(\"attribute\",/ +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/).getRegex(),ke=l=>h(V).replace(\"hr\",G).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"|lheading\",\"\").replace(\"|table\",\"\").replace(\"blockquote\",\" {0,3}>\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*(?:\\\\n|$))|~~~)[^\\\\n]*(?:\\\\n|$)\").replace(\"list\",l).replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",N).getRegex(),De=ke(/ {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]/),qe=ke(/ {0,3}(?:[*+-]|\\d{1,9}[.)])(?:[ \\t]|\\n|$)/),ve=h(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/).replace(\"paragraph\",qe).getRegex(),te={blockquote:ve,code:Le,def:Ie,fences:ze,heading:Ae,hr:G,html:Be,lheading:de,list:Ce,newline:$e,paragraph:De,table:A,text:Me},ue=h(\"^ *([^\\\\n ].*)\\\\n {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)\").replace(\"hr\",G).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"blockquote\",\" {0,3}>\").replace(\"code\",\"(?: {4}| {0,3}\t)[^\\\\n]\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*(?:\\\\n|$))|~~~)[^\\\\n]*(?:\\\\n|$)\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)])[ \\\\t]\").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",N).getRegex(),Ze={...te,lheading:Ee,table:ue,paragraph:h(V).replace(\"hr\",G).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"|lheading\",\"\").replace(\"table\",ue).replace(\"blockquote\",\" {0,3}>\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*(?:\\\\n|$))|~~~)[^\\\\n]*(?:\\\\n|$)\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)])[ \\\\t]+[^ \\\\t\\\\n]\").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",N).getRegex()},He={...te,html:h(`^ *(?:comment *(?:\\\\n|\\\\s*$)|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)|<tag(?:\"[^\"]*\"|'[^']*'|\\\\s[^'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))`).replace(\"comment\",ee).replace(/tag/g,\"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b\").getRegex(),def:/^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,heading:/^(#{1,6})(.*)(?:\\n+|$)/,fences:A,lheading:/^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,paragraph:h(V).replace(\"hr\",G).replace(\"heading\",` *#{1,6} *[^\n]`).replace(\"lheading\",de).replace(\"|table\",\"\").replace(\"blockquote\",\" {0,3}>\").replace(\"|fences\",\"\").replace(\"|list\",\"\").replace(\"|html\",\"\").replace(\"|tag\",\"\").getRegex()},Ge=/^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/,Ne=/^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/,ge=/^( {2,}|\\\\)\\n(?!\\s*$)[ \\t]*/,Qe=/^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/,$=/[\\p{P}\\p{S}]/u,B=/[\\s\\p{P}\\p{S}]/u,Q=/[^\\s\\p{P}\\p{S}]/u,je=h(/^((?![*_])punctSpace)/,\"u\").replace(/punctSpace/g,B).getRegex(),Fe=/[\\p{Pi}\\p{Ps}\"']/u,fe=/(?!~)[\\p{P}\\p{S}]/u,Ue=/(?!~)[\\s\\p{P}\\p{S}]/u,Ke=/(?:[^\\s\\p{P}\\p{S}]|~)/u,We=h(/link|precode-code|html/,\"g\").replace(\"link\",/\\[(?:[^\\[\\]`]|(?<a>`+)[^`]+\\k<a>(?!`))*?\\]\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)]|\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)])*\\))*\\)/).replace(\"precode-\",_e?\"(?<!`)()\":\"(^^|[^`])\").replace(\"code\",/(?<b>`+)[^`]+\\k<b>(?!`)/).replace(\"html\",/<(?! )[^<>]*?>/).getRegex(),me=/^(?:\\*+(?:((?!\\*)punct)|([^\\s*]))?)|^_+(?:((?!_)punct)|([^\\s_]))?/,Xe=h(me,\"u\").replace(/punct/g,$).getRegex(),Je=h(me,\"u\").replace(/punct/g,fe).getRegex(),Ve=/^(?:\\*+(?:((?!\\*)(?!openQuote)punct)|([^\\s*]))?)|^_+(?:((?!_)(?!openQuote)punct)|([^\\s_]))?/,Ye=h(Ve,\"u\").replace(/openQuote/g,Fe).replace(/punct/g,$).getRegex(),xe=\"^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)|(?!\\\\*)punctSpace(\\\\*+)(?=notPunctSpace)|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)|notPunctSpace(\\\\*+)(?=notPunctSpace)\",et=h(xe,\"gu\").replace(/notPunctSpace/g,Q).replace(/punctSpace/g,B).replace(/punct/g,$).getRegex(),tt=h(xe,\"gu\").replace(/notPunctSpace/g,Ke).replace(/punctSpace/g,Ue).replace(/punct/g,fe).getRegex(),nt=\"^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)|(?!\\\\*)[\\\\s](\\\\*+)(?=notPunctSpace)|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)|(?:(?!\\\\*)punct|notPunctSpace)(\\\\*+)(?!\\\\*)(?=notPunctSpace)\",rt=h(nt,\"gu\").replace(/notPunctSpace/g,Q).replace(/punctSpace/g,B).replace(/punct/g,$).getRegex(),st=h(\"^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)\",\"gu\").replace(/notPunctSpace/g,Q).replace(/punctSpace/g,B).replace(/punct/g,$).getRegex(),it=\"^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)[\\\\s](_+)(?=notPunctSpace)|[\\\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)|(?:(?!_)punct|notPunctSpace)(_+)(?!_)(?=notPunctSpace)\",ot=h(it,\"gu\").replace(/notPunctSpace/g,Q).replace(/punctSpace/g,B).replace(/punct/g,$).getRegex(),at=h(/^~~?(?:((?!~)punct)|[^\\s~])/,\"u\").replace(/punct/g,$).getRegex(),lt=\"^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)\",ut=h(lt,\"gu\").replace(/notPunctSpace/g,Q).replace(/punctSpace/g,B).replace(/punct/g,$).getRegex(),pt=h(/\\\\(punct)/,\"gu\").replace(/punct/g,$).getRegex(),ct=h(/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/).replace(\"scheme\",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace(\"email\",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),ht=h(ee).replace(\"(?:-->|$)\",\"-->\").getRegex(),dt=h(\"^comment|^</[a-zA-Z][a-zA-Z0-9-]*\\\\s*>|^<[a-zA-Z][a-zA-Z0-9-]*(?:attribute)*?\\\\s*/?>|^<\\\\?[\\\\s\\\\S]*?\\\\?>|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>\").replace(\"comment\",ht).replace(\"attribute\",/\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/).getRegex(),be=/\\[(?:\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]/,U=h(/(?:\\[(?:brackets|\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\\])|[^\\[\\]\\\\`])*?/).replace(\"brackets\",be).getRegex(),kt=h(/^!?\\[(label)\\]\\([ \\t\\n]*(href)(?:(?:[ \\t]+(?:\\n[ \\t]*)?|\\n[ \\t]*)(title))?[ \\t\\n]*\\)/).replace(\"label\",U).replace(\"href\",/<(?:\\\\.|[^\\n<>\\\\])+>|[^ \\t\\n\\x00-\\x1f]+|(?=\\))/).replace(\"title\",/\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/).getRegex(),gt=h(/^!?\\[(label)\\]\\[(ref)\\]/).replace(\"label\",U).replace(\"ref\",Y).getRegex(),ft=h(/^!?\\[(ref)\\](?:\\[\\])?/).replace(\"ref\",Y).getRegex(),pe=/(?!\\s*\\])(?:\\\\[\\s\\S]|[^\\[\\]\\\\]){1,999}/,mt=h(/(?:[^\\[\\]\\\\`]*(?:\\[(?:brackets|\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\\]))){0,999}?[^\\[\\]\\\\`]*?/).replace(\"brackets\",be).getRegex(),xt=h(\"reflink|nolink(?!\\\\()\",\"g\").replace(\"reflink\",h(/^!?\\[(label)\\]\\[(ref)\\]/).replace(\"label\",mt).replace(\"ref\",pe).getRegex()).replace(\"nolink\",h(/^!?\\[(ref)\\](?:\\[\\])?/).replace(\"ref\",pe).getRegex()).getRegex(),ce=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,bt=/[A-Za-z0-9._+-]+@[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![\\w-])/,Rt=h(/(?:mailto:email|xmpp:email(?:\\/[A-Za-z0-9@.]+)?)/).replace(/email/g,bt).getRegex(),ne={_backpedal:A,anyPunctuation:pt,autolink:ct,blockSkip:We,br:ge,code:Ne,del:A,delLDelim:A,delRDelim:A,emStrongLDelim:Xe,emStrongRDelimAst:et,emStrongRDelimUnd:st,escape:Ge,link:kt,nolink:ft,punctuation:je,reflink:gt,reflinkSearch:xt,tag:dt,text:Qe,url:A},Tt={...ne,emStrongLDelim:Ye,emStrongRDelimAst:rt,emStrongRDelimUnd:ot,link:h(/^!?\\[(label)\\]\\((.*?)\\)/).replace(\"label\",U).getRegex(),reflink:h(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/).replace(\"label\",U).getRegex()},X={...ne,emStrongRDelimAst:tt,emStrongLDelim:Je,delLDelim:at,delRDelim:ut,url:h(/^emailProtocol|^((?:protocol):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/).replace(\"emailProtocol\",Rt).replace(\"protocol\",ce).replace(\"email\",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![\\w-])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,del:/^(~~?)(?=[^\\s~])((?:\\\\[\\s\\S]|[^\\\\])*?(?:\\\\[\\s\\S]|[^\\s~\\\\]))\\1(?=[^~]|$)/,text:h(/^(?:[^a-zA-Z0-9](?=emailProtocol)|(`+|~+|[^`~])(?:(?=[`~])|(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|protocol:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9](?=emailProtocol)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@))))/).replace(\"protocol\",ce).replace(/emailProtocol/g,/(?:mailto|xmpp):/).getRegex()},Ot={...X,br:h(ge).replace(\"{2,}\",\"*\").getRegex(),text:h(X.text).replace(\"\\\\b_\",\"\\\\b_| {2,}\\\\n\").replace(/\\{2,\\}/g,\"*\").getRegex()},j={normal:te,gfm:Ze,pedantic:He},D={normal:ne,gfm:X,breaks:Ot,pedantic:Tt};var wt={\"&\":\"&\",\"<\":\"<\",\">\":\">\",'\"':\""\",\"'\":\"'\"},Re=l=>wt[l];function O(l,e){if(e){if(x.escapeTest.test(l))return l.replace(x.escapeReplace,Re)}else if(x.escapeTestNoEncode.test(l))return l.replace(x.escapeReplaceNoEncode,Re);return l}function Te(l){return l.replace(x.numericCharacterReference,(e,t,n)=>{let s=t===void 0?Number.parseInt(n,16):Number.parseInt(t,10);return s===0||s>1114111||s>=55296&&s<=57343?\"\\uFFFD\":String.fromCodePoint(s)})}function re(l){try{l=encodeURI(l).replace(x.percentDecode,\"%\")}catch{return null}return l}function se(l,e){let t=l.replace(x.findPipe,(r,o,i)=>{let u=!1,a=o;for(;--a>=0&&i[a]===\"\\\\\";)u=!u;return u?\"|\":\" |\"}),n=t.split(x.splitPipe),s=0;if(n[0].trim()||n.shift(),n.length>0&&!n.at(-1)?.trim()&&n.pop(),e)if(n.length>e)n.splice(e);else for(;n.length<e;)n.push(\"\");for(;s<n.length;s++)n[s]=n[s].trim().replace(x.slashPipe,\"|\");return n}function L(l,e,t){let n=l.length;if(n===0)return\"\";let s=0;for(;s<n;){let r=l.charAt(n-s-1);if(r===e&&!t)s++;else if(r!==e&&t)s++;else break}return l.slice(0,n-s)}function ie(l){let e=l.split(`\n`),t=e.length-1;for(;t>=0&&x.blankLine.test(e[t]);)t--;return e.length-t<=2?l:e.slice(0,t+1).join(`\n`)}function q(l){return l.trim().toLowerCase().toUpperCase().toLowerCase()}function oe(l,e){if(l.indexOf(e[0])===-1&&l.indexOf(e[1])===-1)return-1;let t=0;for(let n=0;n<l.length;n++)if(l[n]===\"\\\\\")n++;else if(l[n]===e[0])t++;else if(l[n]===e[1]&&(t--,t<0))return n;return t>0?-2:-1}function ae(l,e=0){let t=e,n=\"\";for(let s of l)if(s===\"\t\"){let r=4-t%4;n+=\" \".repeat(r),t+=r}else n+=s,t++;return n}function Oe(l,e,t,n,s){let r=e.href,o=e.title||null,i=l[1].replace(s.other.outputLinkReplace,\"$1\"),u=l[0].charAt(0)===\"!\";n.state.inLink=!0;let a=n.state.linkEmitted,p=n.state.inRawBlock;n.state.linkEmitted=!1;let c=n.inlineTokens(i),d=n.state.linkEmitted;if(n.state.linkEmitted=a,n.state.inLink=!1,!u){if(d){n.state.inRawBlock=p;return}n.state.linkEmitted=!0}return{type:u?\"image\":\"link\",raw:t,href:r,title:o,text:i,tokens:c}}function Pt(l,e,t){let n=l.match(t.other.indentCodeCompensation);if(n===null)return e;let s=n[1];return e.split(`\n`).map(r=>{let o=r.match(t.other.beginningSpace);if(o===null)return r;let[i]=o;return r.slice(Math.min(i.length,s.length))}).join(`\n`)}function we(l,e,t,n){if(!e.includes(\"<\"))return!1;for(let s=0;s<e.length;s++){if(e[s]===\"\\\\\"){s++;continue}if(e[s]===\"`\"){let i=n.inline.code.exec(e.slice(s));if(i){s+=i[0].length-1;continue}}if(e[s]!==\"<\")continue;let r=l.slice(t+s),o=n.inline.tag.exec(r)||n.inline.autolink.exec(r);if(o){if(o[0].length>e.length-s)return!0;s+=o[0].length-1}}return!1}var y=class{options;rules;lexer;constructor(e){this.options=e||P}space(e){let t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:\"space\",raw:t[0]}}code(e){let t=this.rules.block.code.exec(e);if(t){let n=this.options.pedantic?t[0]:ie(t[0]),s=n.replace(this.rules.other.codeRemoveIndent,\"\");return{type:\"code\",raw:n,codeBlockStyle:\"indented\",text:s}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let n=t[0],s=Pt(n,t[3]||\"\",this.rules);return{type:\"code\",raw:n,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,\"$1\"):t[2],text:s}}}heading(e){let t=this.rules.block.heading.exec(e);if(t){let n=t[2].trim();if(this.rules.other.endingHash.test(n)){let s=L(n,\"#\");(this.options.pedantic||!s||this.rules.other.endingSpaceTabChar.test(s))&&(n=s.trim())}return{type:\"heading\",raw:L(t[0],`\n`),depth:t[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(e){let t=this.rules.block.hr.exec(e);if(t)return{type:\"hr\",raw:L(t[0],`\n`)}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let n=L(t[0],`\n`).split(`\n`),s=\"\",r=\"\",o=[];for(;n.length>0;){let i=!1,u=[],a;for(a=0;a<n.length;a++)if(this.rules.other.blockquoteStart.test(n[a]))u.push(n[a]),i=!0;else if(!i)u.push(n[a]);else break;n=n.slice(a);let p=u.join(`\n`),c=p.replace(this.rules.other.blockquoteSetextReplace,`\n $1`).replace(this.rules.other.blockquoteSetextReplace2,\"\");s=s?`${s}\n${p}`:p,r=r?`${r}\n${c}`:c;let d=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(c,o,!0),this.lexer.state.top=d,n.length===0)break;let m=o.at(-1);if(m?.type===\"code\")break;if(m?.type===\"blockquote\"){let b=m,g=n.join(`\n`),w=b.raw+`\n`+g.replace(this.rules.other.blockquoteSetextReplace2,\"\"),f=this.blockquote(w);o[o.length-1]=f;let M=w.substring(f.raw.length).replace(/^\\n/,\"\"),v=M?M.split(`\n`).length:0,Z=v?n.slice(0,-v):n;Z.length>0&&(s=`${s}\n${Z.join(`\n`)}`),r=r.substring(0,r.length-b.text.length)+f.text;break}else if(m?.type===\"list\"){let b=m,g=b.raw+`\n`+n.join(`\n`),w=this.list(g);o[o.length-1]=w,s=s.substring(0,s.length-m.raw.length)+w.raw,r=r.substring(0,r.length-b.raw.length)+w.raw,n=g.substring(o.at(-1).raw.length).split(`\n`);continue}}return{type:\"blockquote\",raw:s,tokens:o,text:r}}}list(e){let t=this.rules.block.list.exec(e);if(t){let n=t[1].trim(),s=n.length>1,r={type:\"list\",raw:\"\",ordered:s,start:s?+n.slice(0,-1):\"\",loose:!1,items:[]};n=s?`\\\\d{1,9}\\\\${n.slice(-1)}`:`\\\\${n}`,this.options.pedantic&&(n=s?n:\"[*+-]\");let o=this.rules.other.listItemRegex(n),i=!1;for(;e;){let a=!1,p=\"\",c=\"\";if(!(t=o.exec(e))||this.rules.block.hr.test(e))break;p=t[0],e=e.substring(p.length);let d=t[2].split(`\n`,1)[0],m=t[1].length,b=this.options.pedantic?ae(d,m):d.replace(this.rules.other.leadingSpaceTab,M=>ae(M,m)),g=e.split(`\n`,1)[0],w=!b.trim(),f=0;if(this.options.pedantic?(f=2,c=b.trimStart()):w?f=m+1:(f=b.search(this.rules.other.nonSpaceChar),f=f>4?1:f,c=b.slice(f),f+=m),w&&this.rules.other.blankLine.test(g)&&(p+=g+`\n`,e=e.substring(g.length+1),a=!0),!a){let M=this.rules.other.nextBulletRegex(f),v=this.rules.other.hrRegex(f),Z=this.rules.other.fencesBeginRegex(f),le=this.rules.other.headingBeginRegex(f),Pe=this.rules.other.htmlBeginRegex(f),ye=this.rules.other.blockquoteBeginRegex(f);for(;e;){let K=e.split(`\n`,1)[0],H;if(g=K,this.options.pedantic?(g=g.replace(this.rules.other.listReplaceNesting,\" \"),H=g):H=g.replace(this.rules.other.leadingSpaceTab,Se=>Se.replace(this.rules.other.tabCharGlobal,\" \")),Z.test(g)||le.test(g)||Pe.test(g)||ye.test(g)||M.test(g)||v.test(g))break;if(H.search(this.rules.other.nonSpaceChar)>=f||!g.trim())c+=`\n`+H.slice(f);else{if(w||b.replace(this.rules.other.tabCharGlobal,\" \").search(this.rules.other.nonSpaceChar)>=4||Z.test(b)||le.test(b)||v.test(b))break;c+=`\n`+g}w=!g.trim(),p+=K+`\n`,e=e.substring(K.length+1),b=H.slice(f)}}r.loose||(i?r.loose=!0:this.rules.other.doubleBlankLine.test(p)&&(i=!0)),r.items.push({type:\"list_item\",raw:p,task:!!this.options.gfm&&this.rules.other.listIsTask.test(c),loose:!1,text:c,tokens:[]}),r.raw+=p}let u=r.items.at(-1);if(u)u.raw=u.raw.trimEnd(),u.text=u.text.trimEnd();else return;r.raw=r.raw.trimEnd();for(let a of r.items)if(this.lexer.state.top=!1,a.tokens=this.lexer.blockTokens(a.text,[]),!r.loose){let p=a.tokens.filter(d=>d.type===\"space\"),c=p.length>0&&p.some(d=>this.rules.other.anyLine.test(d.raw));r.loose=c}for(let a of r.items){let p=a.tokens[0];if(a.task&&(p?.type===\"text\"||p?.type===\"paragraph\")){a.text=a.text.replace(this.rules.other.listReplaceTask,\"\"),p.raw=p.raw.replace(this.rules.other.listReplaceTask,\"\"),p.text=p.text.replace(this.rules.other.listReplaceTask,\"\");for(let d=this.lexer.inlineQueue.length-1;d>=0;d--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[d].src)){this.lexer.inlineQueue[d].src=this.lexer.inlineQueue[d].src.replace(this.rules.other.listReplaceTask,\"\");break}let c=this.rules.other.listTaskCheckbox.exec(a.raw);if(c){let d={type:\"checkbox\",raw:c[0]+\" \",checked:c[0]!==\"[ ]\"};a.checked=d.checked,r.loose?a.tokens[0]&&[\"paragraph\",\"text\"].includes(a.tokens[0].type)&&\"tokens\"in a.tokens[0]&&a.tokens[0].tokens?(a.tokens[0].raw=d.raw+a.tokens[0].raw,a.tokens[0].text=d.raw+a.tokens[0].text,a.tokens[0].tokens.unshift(d)):a.tokens.unshift({type:\"paragraph\",raw:d.raw,text:d.raw,tokens:[d]}):a.tokens.unshift(d)}}else a.task&&(a.task=!1)}if(r.loose)for(let a of r.items){a.loose=!0;for(let p of a.tokens)p.type===\"text\"&&(p.type=\"paragraph\")}return r}}html(e){let t=this.rules.block.html.exec(e);if(t){let n=ie(t[0]);return{type:\"html\",block:!0,raw:n,pre:t[1]===\"pre\"||t[1]===\"script\"||t[1]===\"style\",text:n}}}def(e){let t=this.rules.block.def.exec(e);if(t){if(!this.rules.other.startAngleBracket.test(t[2])&&oe(t[2],\"()\")!==-1)return;let n=q(t[1]).replace(this.rules.other.multipleSpaceGlobal,\" \"),s=t[2]?t[2].replace(this.rules.other.hrefBrackets,\"$1\").replace(this.rules.inline.anyPunctuation,\"$1\"):\"\",r=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,\"$1\"):t[3];return{type:\"def\",tag:n,raw:L(t[0],`\n`),href:s,title:r}}}table(e){let t=this.rules.block.table.exec(e);if(!t||!this.rules.other.tableDelimiter.test(t[2]))return;let n=se(t[1]),s=t[2].replace(this.rules.other.tableAlignChars,\"\").split(\"|\"),r=t[3]?.trim()?t[3].replace(this.rules.other.tableRowBlankLine,\"\").split(`\n`):[],o={type:\"table\",raw:L(t[0],`\n`),header:[],align:[],rows:[]};if(n.length===s.length){for(let i of s)this.rules.other.tableAlignRight.test(i)?o.align.push(\"right\"):this.rules.other.tableAlignCenter.test(i)?o.align.push(\"center\"):this.rules.other.tableAlignLeft.test(i)?o.align.push(\"left\"):o.align.push(null);for(let i=0;i<n.length;i++)o.header.push({text:n[i],tokens:this.lexer.inline(n[i]),header:!0,align:o.align[i]});for(let i of r)o.rows.push(se(i,o.header.length).map((u,a)=>({text:u,tokens:this.lexer.inline(u),header:!1,align:o.align[a]})));return o}}lheading(e){let t=this.rules.block.lheading.exec(e);if(t){let n=t[1].trim();return{type:\"heading\",raw:L(t[0],`\n`),depth:t[2].charAt(0)===\"=\"?1:2,text:n,tokens:this.lexer.inline(n)}}}paragraph(e){let t=this.rules.block.paragraph.exec(e);if(t){let n=t[1].charAt(t[1].length-1)===`\n`?t[1].slice(0,-1):t[1];return{type:\"paragraph\",raw:t[0],text:n,tokens:this.lexer.inline(n)}}}text(e){let t=this.rules.block.text.exec(e);if(t)return{type:\"text\",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){let t=this.rules.inline.escape.exec(e);if(t)return{type:\"escape\",raw:t[0],text:t[1]}}tag(e){let t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&this.rules.other.startATag.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:\"html\",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){if(this.lexer.state.linkParenPossible===!1)return;let t=this.rules.inline.link.exec(e);if(t){let n=t[0].charAt(0)===\"!\"?2:1;if(!this.options.pedantic&&we(e,t[1],n,this.rules))return;let s=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(s)){if(!this.rules.other.endAngleBracket.test(s))return;let i=L(s.slice(0,-1),\"\\\\\");if((s.length-i.length)%2===0)return}else{let i=oe(t[2],\"()\");if(i===-2)return;if(i>-1){let a=(t[0].indexOf(\"!\")===0?5:4)+t[1].length+i;t[2]=t[2].substring(0,i),t[0]=t[0].substring(0,a).trim(),t[3]=\"\"}}let r=t[2],o=\"\";if(this.options.pedantic){let i=this.rules.other.pedanticHrefTitle.exec(r);i&&(r=i[1],o=i[3])}else o=t[3]?t[3].slice(1,-1):\"\";return r=r.trim(),this.rules.other.startAngleBracket.test(r)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(s)?r=r.slice(1):r=r.slice(1,-1)),Oe(t,{href:r&&r.replace(this.rules.inline.anyPunctuation,\"$1\"),title:o&&o.replace(this.rules.inline.anyPunctuation,\"$1\")},t[0],this.lexer,this.rules)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){let s=n[0].charAt(0)===\"!\"?2:1;if(!this.options.pedantic&&we(e,n[1],s,this.rules))return;let r=(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal,\" \"),o=t[q(r)];if(!o){let i=n[0].charAt(0);return{type:\"text\",raw:i,text:i}}return Oe(n,o,n[0],this.lexer,this.rules)}}emStrong(e,t,n=\"\"){let s=this.rules.inline.emStrongLDelim.exec(e);if(!s||!s[1]&&!s[2]&&!s[3]&&!s[4]||s[4]&&n.match(this.rules.other.unicodeAlphaNumeric))return;if(!(s[1]||s[3]||\"\")||!n||this.rules.inline.punctuation.exec(n)){let o=[...s[0]].length-1,i,u,a=o,p=0,c=s[0][0],d=n===c,m=c===\"*\"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(m.lastIndex=0,t=t.slice(-1*e.length+o);(s=m.exec(t))!==null;){if(i=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!i)continue;if(u=[...i].length,s[3]||s[4]){a+=u;continue}else if(s[5]||s[6]){if(o%3&&!((o+u)%3)){p+=u;continue}if(d)break}if(a-=u,a>0)continue;u=Math.min(u,u+a+p);let b=[...s[0]][0].length,g=e.slice(0,o+s.index+b+u);if(Math.min(o,u)%2){let f=g.slice(1,-1);return{type:\"em\",raw:g,text:f,tokens:this.lexer.inlineTokens(f)}}let w=g.slice(2,-2);return{type:\"strong\",raw:g,text:w,tokens:this.lexer.inlineTokens(w)}}}}codespan(e){let t=this.rules.inline.code.exec(e);if(t){let n=t[2].replace(this.rules.other.newLineCharGlobal,\" \"),s=this.rules.other.nonSpaceChar.test(n),r=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return s&&r&&(n=n.substring(1,n.length-1)),{type:\"codespan\",raw:t[0],text:n}}}br(e){let t=this.rules.inline.br.exec(e);if(t)return{type:\"br\",raw:t[0]}}del(e,t,n=\"\"){let s=this.rules.inline.delLDelim.exec(e);if(!s)return;if(!(s[1]||\"\")||!n||this.rules.inline.punctuation.exec(n)){let o=[...s[0]].length-1,i,u,a=o,p=this.rules.inline.delRDelim;for(p.lastIndex=0,t=t.slice(-1*e.length+o);(s=p.exec(t))!==null;){if(i=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!i||(u=[...i].length,u!==o))continue;if(s[3]||s[4]){a+=u;continue}if(a-=u,a>0)continue;u=Math.min(u,u+a);let c=[...s[0]][0].length,d=e.slice(0,o+s.index+c+u),m=d.slice(o,-o);return{type:\"del\",raw:d,text:m,tokens:this.lexer.inlineTokens(m)}}}}autolink(e){let t=this.rules.inline.autolink.exec(e);if(t){let n,s;return t[2]===\"@\"?(n=t[1],s=\"mailto:\"+n):(n=t[1],s=n),{type:\"link\",raw:t[0],text:n,href:s,autolink:!0,tokens:[{type:\"text\",raw:n,text:n}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let n,s;if(t[2]===\"@\")n=t[0],s=\"mailto:\"+n;else{let r;do r=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??\"\";while(r!==t[0]);n=t[0],t[1]===\"www.\"?s=\"http://\"+t[0]:s=t[0]}return{type:\"link\",raw:t[0],text:n,href:s,autolink:!0,tokens:[{type:\"text\",raw:n,text:n}]}}}inlineText(e){let t=this.rules.inline.text.exec(e);if(t){let n=this.lexer.state.inRawBlock;return{type:\"text\",raw:t[0],text:n?t[0]:Te(t[0]),escaped:n}}}};var R=class l{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||P,this.options.tokenizer=this.options.tokenizer||new y,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,linkEmitted:!1,linkParenPossible:!0,top:!0};let t={other:x,block:j.normal,inline:D.normal};this.options.pedantic?(t.block=j.pedantic,t.inline=D.pedantic):this.options.gfm&&(t.block=j.gfm,this.options.breaks?t.inline=D.breaks:t.inline=D.gfm),this.tokenizer.rules=t}static get rules(){return{block:j,inline:D}}static lex(e,t){return new l(t).lex(e)}static lexInline(e,t){return new l(t).inlineTokens(e)}lex(e){e=e.replace(x.carriageReturn,`\n`),this.blockTokens(e,this.tokens);for(let t=0;t<this.inlineQueue.length;t++){let n=this.inlineQueue[t];this.inlineTokens(n.src,n.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(e,t=[],n=!1){this.tokenizer.lexer=this,this.options.pedantic&&(e=e.replace(x.tabCharGlobal,\" \").replace(x.spaceLine,\"\"));let s=1/0;for(;e;){if(e.length<s)s=e.length;else{this.infiniteLoopError(e.charCodeAt(0));break}let r;if(this.options.extensions?.block?.some(i=>(r=i.call({lexer:this},e,t))?(e=e.substring(r.raw.length),t.push(r),!0):!1))continue;if(r=this.tokenizer.space(e)){e=e.substring(r.raw.length);let i=t.at(-1);r.raw.length===1&&i!==void 0?i.raw+=`\n`:t.push(r);continue}if(r=this.tokenizer.code(e)){e=e.substring(r.raw.length);let i=t.at(-1);i?.type===\"paragraph\"||i?.type===\"text\"?(i.raw+=(i.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,i.text+=`\n`+r.text,this.inlineQueue.at(-1).src=i.text):t.push(r);continue}if(r=this.tokenizer.fences(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.heading(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.hr(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.blockquote(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.list(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.html(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.def(e)){e=e.substring(r.raw.length);let i=t.at(-1);i?.type===\"paragraph\"||i?.type===\"text\"?(i.raw+=(i.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,i.text+=`\n`+r.raw,this.inlineQueue.at(-1).src=i.text):this.tokens.links[r.tag]||(this.tokens.links[r.tag]={href:r.href,title:r.title},t.push(r));continue}if(r=this.tokenizer.table(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.lheading(e)){e=e.substring(r.raw.length),t.push(r);continue}let o=e;if(this.options.extensions?.startBlock){let i=1/0,u=e.slice(1),a;this.options.extensions.startBlock.forEach(p=>{a=p.call({lexer:this},u),typeof a==\"number\"&&a>=0&&(i=Math.min(i,a))}),i<1/0&&i>=0&&(o=e.substring(0,i+1))}if(this.state.top&&(r=this.tokenizer.paragraph(o))){let i=t.at(-1);n&&i?.type===\"paragraph\"?(i.raw+=(i.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,i.text+=`\n`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=i.text):t.push(r),n=o.length!==e.length,e=e.substring(r.raw.length);continue}if(r=this.tokenizer.text(e)){e=e.substring(r.raw.length);let i=t.at(-1);i?.type===\"text\"?(i.raw+=(i.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,i.text+=`\n`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=i.text):t.push(r);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}linkInText(e){if(!e.includes(\"[\"))return!1;let t=this.tokenizer.rules.inline.link;for(let n of e.matchAll(this.tokenizer.rules.inline.blockSkip))if(t.test(n[0])&&e.charAt(n.index-1)!==\"!\")return!0;for(let n of e.matchAll(this.tokenizer.rules.inline.reflinkSearch)){let s=n[0],r=s.lastIndexOf(\"[\");if(!(s.charAt(0)===\"!\"||!Object.hasOwn(this.tokens.links,q(s.slice(r+1,-1))))&&!(r>1&&this.linkInText(s.slice(1,r-1))))return!0}return!1}inlineTokens(e,t=[]){this.tokenizer.lexer=this;let n=this.state.linkParenPossible;this.state.linkParenPossible=n&&e.includes(\")\");try{return this.#e(e,t)}finally{this.state.linkParenPossible=n}}#e(e,t){let n=e;if(this.tokens.links&&e.includes(\"[\")){let i=this.tokenizer.rules.inline.reflinkSearch,u=a=>{let p=a.lastIndexOf(\"[\");if(!Object.hasOwn(this.tokens.links,q(a.slice(p+1,-1))))return a;if(p>1&&a.charAt(0)!==\"!\"){let c=a.slice(1,p-1);if(this.linkInText(c))return\"[\"+c.replace(i,u)+\"][\"+\"a\".repeat(a.length-p-2)+\"]\"}return\"[\"+\"a\".repeat(a.length-2)+\"]\"};n=n.replace(i,u)}n=n.replace(this.tokenizer.rules.inline.anyPunctuation,i=>\"+\".repeat(i.length)),n=n.replace(this.tokenizer.rules.inline.blockSkip,(i,u,a)=>{let p=a?a.length:0;return i.slice(0,p)+\"[\"+\"a\".repeat(i.length-p-2)+\"]\"}),n=this.options.hooks?.emStrongMask?.call({lexer:this},n)??n;let s=!1,r=\"\",o=1/0;for(;e;){if(e.length<o)o=e.length;else{this.infiniteLoopError(e.charCodeAt(0));break}s||(r=\"\"),s=!1;let i;if(this.options.extensions?.inline?.some(a=>(i=a.call({lexer:this},e,t))?(e=e.substring(i.raw.length),t.push(i),!0):!1))continue;if(i=this.tokenizer.escape(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.tag(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.link(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(i.raw.length);let a=t.at(-1);i.type===\"text\"&&a?.type===\"text\"?(a.raw+=i.raw,a.text+=i.text):t.push(i);continue}if(i=this.tokenizer.emStrong(e,n,r)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.codespan(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.br(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.del(e,n,r)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.autolink(e)){e=e.substring(i.raw.length),t.push(i);continue}if(!this.state.inLink&&(i=this.tokenizer.url(e))){e=e.substring(i.raw.length),t.push(i);continue}let u=e;if(this.options.extensions?.startInline){let a=1/0,p=e.slice(1),c;this.options.extensions.startInline.forEach(d=>{c=d.call({lexer:this},p),typeof c==\"number\"&&c>=0&&(a=Math.min(a,c))}),a<1/0&&a>=0&&(u=e.substring(0,a+1))}if(i=this.tokenizer.inlineText(u)){e=e.substring(i.raw.length),i.raw.slice(-1)!==\"_\"&&(r=i.raw.slice(-1)),s=!0;let a=t.at(-1);a?.type===\"text\"?(a.raw+=i.raw,a.text+=i.text):t.push(i);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return t}infiniteLoopError(e){let t=\"Infinite loop on byte: \"+e;if(this.options.silent)console.error(t);else throw new Error(t)}};var S=class{options;parser;constructor(e){this.options=e||P}space(e){return\"\"}code({text:e,lang:t,escaped:n}){let s=(t||\"\").match(x.notSpaceStart)?.[0],r=e?e.replace(x.endingNewline,\"\")+`\n`:\"\";return s?'<pre><code class=\"language-'+O(s)+'\">'+(n?r:O(r,!0))+`</code></pre>\n`:\"<pre><code>\"+(n?r:O(r,!0))+`</code></pre>\n`}blockquote({tokens:e}){return`<blockquote>\n${this.parser.parse(e)}</blockquote>\n`}html({text:e}){return e}def(e){return\"\"}heading({tokens:e,depth:t}){return`<h${t}>${this.parser.parseInline(e)}</h${t}>\n`}hr(e){return`<hr>\n`}list(e){let t=e.ordered,n=e.start,s=\"\";for(let i=0;i<e.items.length;i++){let u=e.items[i];s+=this.listitem(u)}let r=t?\"ol\":\"ul\",o=t&&n!==1?' start=\"'+n+'\"':\"\";return\"<\"+r+o+`>\n`+s+\"</\"+r+`>\n`}listitem(e){return`<li>${this.parser.parse(e.tokens)}</li>\n`}checkbox({checked:e}){return\"<input \"+(e?'checked=\"\" ':\"\")+'disabled=\"\" type=\"checkbox\"> '}paragraph({tokens:e}){return`<p>${this.parser.parseInline(e)}</p>\n`}table(e){let t=\"\",n=\"\";for(let r=0;r<e.header.length;r++)n+=this.tablecell(e.header[r]);t+=this.tablerow({text:n});let s=\"\";for(let r=0;r<e.rows.length;r++){let o=e.rows[r];n=\"\";for(let i=0;i<o.length;i++)n+=this.tablecell(o[i]);s+=this.tablerow({text:n})}return s&&(s=`<tbody>${s}</tbody>`),`<table>\n<thead>\n`+t+`</thead>\n`+s+`</table>\n`}tablerow({text:e}){return`<tr>\n${e}</tr>\n`}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?\"th\":\"td\";return(e.align?`<${n} align=\"${e.align}\">`:`<${n}>`)+t+`</${n}>\n`}strong({tokens:e}){return`<strong>${this.parser.parseInline(e)}</strong>`}em({tokens:e}){return`<em>${this.parser.parseInline(e)}</em>`}codespan({text:e}){return`<code>${O(e,!0)}</code>`}br(e){return\"<br>\"}del({tokens:e}){return`<del>${this.parser.parseInline(e)}</del>`}link({href:e,title:t,text:n,tokens:s,autolink:r}){let o=r?O(n,!0):this.parser.parseInline(s),i=re(e);if(i===null)return o;e=O(i,r);let u='<a href=\"'+e+'\"';return t&&(u+=' title=\"'+O(t)+'\"'),u+=\">\"+o+\"</a>\",u}image({href:e,title:t,text:n,tokens:s}){s&&(n=this.parser.parseInline(s,this.parser.textRenderer));let r=re(e);if(r===null)return O(n);e=r;let o=`<img src=\"${O(e)}\" alt=\"${O(n)}\"`;return t&&(o+=` title=\"${O(t)}\"`),o+=\">\",o}text(e){return\"tokens\"in e&&e.tokens?this.parser.parseInline(e.tokens):\"escaped\"in e&&e.escaped?e.text:O(e.text)}};var z=class{strong({text:e}){return e}em({text:e}){return e}codespan({text:e}){return e}del({text:e}){return e}html({text:e}){return e}text({text:e}){return e}link({text:e}){return\"\"+e}image({text:e}){return\"\"+e}br(){return\"\"}checkbox({raw:e}){return e}};var T=class l{options;renderer;textRenderer;constructor(e){this.options=e||P,this.options.renderer=this.options.renderer||new S,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new z}static parse(e,t){return new l(t).parse(e)}static parseInline(e,t){return new l(t).parseInline(e)}parse(e){this.renderer.parser=this;let t=\"\";for(let n=0;n<e.length;n++){let s=e[n];if(this.options.extensions?.renderers?.[s.type]){let o=s,i=this.options.extensions.renderers[o.type].call({parser:this},o);if(i!==!1||![\"space\",\"hr\",\"heading\",\"code\",\"table\",\"blockquote\",\"list\",\"checkbox\",\"html\",\"def\",\"paragraph\",\"text\"].includes(o.type)){t+=i||\"\";continue}}let r=s;switch(r.type){case\"space\":{t+=this.renderer.space(r);break}case\"hr\":{t+=this.renderer.hr(r);break}case\"heading\":{t+=this.renderer.heading(r);break}case\"code\":{t+=this.renderer.code(r);break}case\"table\":{t+=this.renderer.table(r);break}case\"blockquote\":{t+=this.renderer.blockquote(r);break}case\"list\":{t+=this.renderer.list(r);break}case\"checkbox\":{t+=this.renderer.checkbox(r);break}case\"html\":{t+=this.renderer.html(r);break}case\"def\":{t+=this.renderer.def(r);break}case\"paragraph\":{t+=this.renderer.paragraph(r);break}case\"text\":{t+=this.renderer.text(r);break}default:{let o='Token with \"'+r.type+'\" type was not found.';if(this.options.silent)return console.error(o),\"\";throw new Error(o)}}}return t}parseInline(e,t=this.renderer){this.renderer.parser=this;let n=\"\";for(let s=0;s<e.length;s++){let r=e[s];if(this.options.extensions?.renderers?.[r.type]){let i=this.options.extensions.renderers[r.type].call({parser:this},r);if(i!==!1||![\"escape\",\"html\",\"link\",\"image\",\"checkbox\",\"strong\",\"em\",\"codespan\",\"br\",\"del\",\"text\"].includes(r.type)){n+=i||\"\";continue}}let o=r;switch(o.type){case\"escape\":{n+=t.text(o);break}case\"html\":{n+=t.html(o);break}case\"link\":{n+=t.link(o);break}case\"image\":{n+=t.image(o);break}case\"checkbox\":{n+=t.checkbox(o);break}case\"strong\":{n+=t.strong(o);break}case\"em\":{n+=t.em(o);break}case\"codespan\":{n+=t.codespan(o);break}case\"br\":{n+=t.br(o);break}case\"del\":{n+=t.del(o);break}case\"text\":{n+=t.text(o);break}default:{let i='Token with \"'+o.type+'\" type was not found.';if(this.options.silent)return console.error(i),\"\";throw new Error(i)}}}return n}};var _=class{options;block;constructor(e){this.options=e||P}static passThroughHooks=new Set([\"preprocess\",\"postprocess\",\"processAllTokens\",\"emStrongMask\"]);static passThroughHooksRespectAsync=new Set([\"preprocess\",\"postprocess\",\"processAllTokens\"]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}emStrongMask(e){return e}provideLexer(e=this.block){return e?R.lex:R.lexInline}provideParser(e=this.block){return e?T.parse:T.parseInline}};var F=class{defaults=I();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=T;Renderer=S;TextRenderer=z;Lexer=R;Tokenizer=y;Hooks=_;constructor(...e){this.use(...e)}walkTokens(e,t){let n=[];for(let s of e)switch(n=n.concat(t.call(this,s)),s.type){case\"table\":{let r=s;for(let o of r.header)n=n.concat(this.walkTokens(o.tokens,t));for(let o of r.rows)for(let i of o)n=n.concat(this.walkTokens(i.tokens,t));break}case\"list\":{let r=s;n=n.concat(this.walkTokens(r.items,t));break}default:{let r=s;this.defaults.extensions?.childTokens?.[r.type]?this.defaults.extensions.childTokens[r.type].forEach(o=>{let i=r[o].flat(1/0);n=n.concat(this.walkTokens(i,t))}):r.tokens&&(n=n.concat(this.walkTokens(r.tokens,t)))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(n=>{let s={...n};if(s.async=this.defaults.async||s.async||!1,n.extensions&&(n.extensions.forEach(r=>{if(!r.name)throw new Error(\"extension name required\");if(\"renderer\"in r){let o=t.renderers[r.name];o?t.renderers[r.name]=function(...i){let u=r.renderer.apply(this,i);return u===!1&&(u=o.apply(this,i)),u}:t.renderers[r.name]=r.renderer}if(\"tokenizer\"in r){if(!r.level||r.level!==\"block\"&&r.level!==\"inline\")throw new Error(\"extension level must be 'block' or 'inline'\");let o=t[r.level];o?o.unshift(r.tokenizer):t[r.level]=[r.tokenizer],r.start&&(r.level===\"block\"?t.startBlock?t.startBlock.push(r.start):t.startBlock=[r.start]:r.level===\"inline\"&&(t.startInline?t.startInline.push(r.start):t.startInline=[r.start]))}\"childTokens\"in r&&r.childTokens&&(t.childTokens[r.name]=r.childTokens)}),s.extensions=t),n.renderer){let r=this.defaults.renderer||new S(this.defaults);for(let o in n.renderer){if(!(o in r))throw new Error(`renderer '${o}' does not exist`);if([\"options\",\"parser\"].includes(o))continue;let i=o,u=n.renderer[i],a=r[i];r[i]=(...p)=>{let c=u.apply(r,p);return c===!1&&(c=a.apply(r,p)),c||\"\"}}s.renderer=r}if(n.tokenizer){let r=this.defaults.tokenizer||new y(this.defaults);for(let o in n.tokenizer){if(!(o in r))throw new Error(`tokenizer '${o}' does not exist`);if([\"options\",\"rules\",\"lexer\"].includes(o))continue;let i=o,u=n.tokenizer[i],a=r[i];r[i]=(...p)=>{let c=u.apply(r,p);return c===!1&&(c=a.apply(r,p)),c}}s.tokenizer=r}if(n.hooks){let r=this.defaults.hooks||new _;for(let o in n.hooks){if(!(o in r))throw new Error(`hook '${o}' does not exist`);if([\"options\",\"block\"].includes(o))continue;let i=o,u=n.hooks[i],a=r[i];_.passThroughHooks.has(o)?r[i]=p=>{if(this.defaults.async&&_.passThroughHooksRespectAsync.has(o))return(async()=>{let d=await u.call(r,p);return a.call(r,d)})();let c=u.call(r,p);return a.call(r,c)}:r[i]=(...p)=>{if(this.defaults.async)return(async()=>{let d=await u.apply(r,p);return d===!1&&(d=await a.apply(r,p)),d})();let c=u.apply(r,p);return c===!1&&(c=a.apply(r,p)),c}}s.hooks=r}if(n.walkTokens){let r=this.defaults.walkTokens,o=n.walkTokens;s.walkTokens=function(i){let u=[];return u.push(o.call(this,i)),r&&(u=u.concat(r.call(this,i))),u}}this.defaults={...this.defaults,...s}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return R.lex(e,t??this.defaults)}parser(e,t){return T.parse(e,t??this.defaults)}parseMarkdown(e){return(n,s)=>{let r={...s},o={...this.defaults,...r},i=this.onError(!!o.silent,!!o.async);if(this.defaults.async===!0&&r.async===!1)return i(new Error(\"marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.\"));if(typeof n>\"u\"||n===null)return i(new Error(\"marked(): input parameter is undefined or null\"));if(typeof n!=\"string\")return i(new Error(\"marked(): input parameter is of type \"+Object.prototype.toString.call(n)+\", string expected\"));if(o.hooks&&(o.hooks.options=o,o.hooks.block=e),o.async)return(async()=>{let u=o.hooks?await o.hooks.preprocess(n):n,p=await(o.hooks?await o.hooks.provideLexer(e):e?R.lex:R.lexInline)(u,o),c=o.hooks?await o.hooks.processAllTokens(p):p;o.walkTokens&&await Promise.all(this.walkTokens(c,o.walkTokens));let m=await(o.hooks?await o.hooks.provideParser(e):e?T.parse:T.parseInline)(c,o);return o.hooks?await o.hooks.postprocess(m):m})().catch(i);try{o.hooks&&(n=o.hooks.preprocess(n));let a=(o.hooks?o.hooks.provideLexer(e):e?R.lex:R.lexInline)(n,o);o.hooks&&(a=o.hooks.processAllTokens(a)),o.walkTokens&&this.walkTokens(a,o.walkTokens);let c=(o.hooks?o.hooks.provideParser(e):e?T.parse:T.parseInline)(a,o);return o.hooks&&(c=o.hooks.postprocess(c)),c}catch(u){return i(u)}}}onError(e,t){return n=>{if(n.message+=`\nPlease report this to https://github.com/markedjs/marked.`,e){let s=\"<p>An error occurred:</p><pre>\"+O(n.message+\"\",!0)+\"</pre>\";return t?Promise.resolve(s):s}if(t)return Promise.reject(n);throw n}}};var E=new F;function k(l,e){return E.parse(l,e)}k.options=k.setOptions=function(l){return E.setOptions(l),k.defaults=E.defaults,W(k.defaults),k};k.getDefaults=I;k.defaults=P;function yt(...l){return E.use(...l),k.defaults=E.defaults,W(k.defaults),k}k.use=yt;k.walkTokens=function(l,e){return E.walkTokens(l,e)};k.parseInline=E.parseInline;k.Parser=T;k.parser=T.parse;k.Renderer=S;k.TextRenderer=z;k.Lexer=R;k.lexer=R.lex;k.Tokenizer=y;k.Hooks=_;k.parse=k;var gn=k.options,fn=k.setOptions,mn=k.walkTokens,xn=k.parseInline,bn=k,Rn=T.parse,Tn=R.lex;export{_ as Hooks,R as Lexer,F as Marked,T as Parser,S as Renderer,z as TextRenderer,y as Tokenizer,P as defaults,I as getDefaults,Tn as lexer,k as marked,gn as options,bn as parse,xn as parseInline,Rn as parser,fn as setOptions,yt as use,mn as walkTokens};\n//# sourceMappingURL=marked.esm.js.map\n","/*! @license DOMPurify 3.4.16 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.16/LICENSE */\nfunction _OverloadYield(e, d) {\n\tthis.v = e, this.k = d;\n}\nfunction _arrayLikeToArray(r, a) {\n\t(null == a || a > r.length) && (a = r.length);\n\tfor (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n\treturn n;\n}\nfunction _arrayWithHoles(r) {\n\tif (Array.isArray(r)) return r;\n}\nfunction _iterableToArrayLimit(r, l) {\n\tvar t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n\tif (null != t) {\n\t\tvar e, n, i, u, a = [], f = !0, o = !1;\n\t\ttry {\n\t\t\tif (i = (t = t.call(r)).next, 0 === l) {\n\t\t\t\tif (Object(t) !== t) return;\n\t\t\t\tf = !1;\n\t\t\t} else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n\t\t} catch (r) {\n\t\t\to = !0, n = r;\n\t\t} finally {\n\t\t\ttry {\n\t\t\t\tif (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;\n\t\t\t} finally {\n\t\t\t\tif (o) throw n;\n\t\t\t}\n\t\t}\n\t\treturn a;\n\t}\n}\nfunction _nonIterableRest() {\n\tthrow new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */\nfunction _slicedToArray(r, e) {\n\treturn _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();\n}\nfunction _unsupportedIterableToArray(r, a) {\n\tif (r) {\n\t\tif (\"string\" == typeof r) return _arrayLikeToArray(r, a);\n\t\tvar t = {}.toString.call(r).slice(8, -1);\n\t\treturn \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;\n\t}\n}\nfunction AsyncGenerator(e) {\n\tvar t, n;\n\tfunction resume(t, n) {\n\t\ttry {\n\t\t\tvar r = e[t](n), o = r.value, u = o instanceof _OverloadYield;\n\t\t\tPromise.resolve(u ? o.v : o).then(function(n) {\n\t\t\t\tif (u) {\n\t\t\t\t\tvar i = \"return\" === t && o.k ? t : \"next\";\n\t\t\t\t\tif (!o.k || n.done) return resume(i, n);\n\t\t\t\t\tn = e[i](n).value;\n\t\t\t\t}\n\t\t\t\tsettle(!!r.done, n);\n\t\t\t}, function(e) {\n\t\t\t\tresume(\"throw\", e);\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tsettle(2, e);\n\t\t}\n\t}\n\tfunction settle(e, r) {\n\t\t2 === e ? t.reject(r) : t.resolve({\n\t\t\tvalue: r,\n\t\t\tdone: e\n\t\t}), (t = t.next) ? resume(t.key, t.arg) : n = null;\n\t}\n\tthis._invoke = function(e, r) {\n\t\treturn new Promise(function(o, u) {\n\t\t\tvar i = {\n\t\t\t\tkey: e,\n\t\t\t\targ: r,\n\t\t\t\tresolve: o,\n\t\t\t\treject: u,\n\t\t\t\tnext: null\n\t\t\t};\n\t\t\tn ? n = n.next = i : (t = n = i, resume(e, r));\n\t\t});\n\t}, \"function\" != typeof e.return && (this.return = void 0);\n}\nAsyncGenerator.prototype[\"function\" == typeof Symbol && Symbol.asyncIterator || \"@@asyncIterator\"] = function() {\n\treturn this;\n}, AsyncGenerator.prototype.next = function(e) {\n\treturn this._invoke(\"next\", e);\n}, AsyncGenerator.prototype.throw = function(e) {\n\treturn this._invoke(\"throw\", e);\n}, AsyncGenerator.prototype.return = function(e) {\n\treturn this._invoke(\"return\", e);\n};\nconst entries = Object.entries;\nconst setPrototypeOf = Object.setPrototypeOf;\nconst isFrozen = Object.isFrozen;\nconst getPrototypeOf = Object.getPrototypeOf;\nconst getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nlet freeze = Object.freeze;\nlet seal = Object.seal;\nlet create = Object.create;\nlet _ref = typeof Reflect !== \"undefined\" && Reflect;\nlet apply = _ref.apply;\nlet construct = _ref.construct;\nif (!freeze) freeze = function freeze(x) {\n\treturn x;\n};\nif (!seal) seal = function seal(x) {\n\treturn x;\n};\nif (!apply) apply = function apply(func, thisArg) {\n\tfor (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) args[_key - 2] = arguments[_key];\n\treturn func.apply(thisArg, args);\n};\nif (!construct) construct = function construct(Func) {\n\tfor (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) args[_key2 - 1] = arguments[_key2];\n\treturn new Func(...args);\n};\nconst arrayForEach = unapply(Array.prototype.forEach);\nArray.prototype.indexOf;\nconst arrayLastIndexOf = unapply(Array.prototype.lastIndexOf);\nconst arrayPop = unapply(Array.prototype.pop);\nconst arrayPush = unapply(Array.prototype.push);\nArray.prototype.slice;\nconst arraySplice = unapply(Array.prototype.splice);\nconst arrayIsArray = Array.isArray;\nconst stringToLowerCase = unapply(String.prototype.toLowerCase);\nconst stringToString = unapply(String.prototype.toString);\nconst stringMatch = unapply(String.prototype.match);\nconst stringReplace = unapply(String.prototype.replace);\nconst stringIndexOf = unapply(String.prototype.indexOf);\nconst stringTrim = unapply(String.prototype.trim);\nconst numberToString = unapply(Number.prototype.toString);\nconst booleanToString = unapply(Boolean.prototype.toString);\nconst bigintToString = typeof BigInt === \"undefined\" ? null : unapply(BigInt.prototype.toString);\nconst symbolToString = typeof Symbol === \"undefined\" ? null : unapply(Symbol.prototype.toString);\nconst objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);\nconst objectToString = unapply(Object.prototype.toString);\nconst regExpTest = unapply(RegExp.prototype.test);\nconst typeErrorCreate = unconstruct(TypeError);\n/**\n* Creates a new function that calls the given function with a specified thisArg and arguments.\n*\n* @param func - The function to be wrapped and called.\n* @returns A new function that calls the given function with a specified thisArg and arguments.\n*/\nfunction unapply(func) {\n\treturn function(thisArg) {\n\t\tif (thisArg instanceof RegExp) thisArg.lastIndex = 0;\n\t\tfor (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) args[_key3 - 1] = arguments[_key3];\n\t\treturn apply(func, thisArg, args);\n\t};\n}\n/**\n* Creates a new function that constructs an instance of the given constructor function with the provided arguments.\n*\n* @param func - The constructor function to be wrapped and called.\n* @returns A new function that constructs an instance of the given constructor function with the provided arguments.\n*/\nfunction unconstruct(Func) {\n\treturn function() {\n\t\tfor (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) args[_key4] = arguments[_key4];\n\t\treturn construct(Func, args);\n\t};\n}\n/**\n* Add properties to a lookup table\n*\n* @param set - The set to which elements will be added.\n* @param array - The array containing elements to be added to the set.\n* @param transformCaseFunc - An optional function to transform the case of each element before adding to the set.\n* @returns The modified set with added elements.\n*/\nfunction addToSet(set, array) {\n\tlet transformCaseFunc = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : stringToLowerCase;\n\tif (setPrototypeOf) setPrototypeOf(set, null);\n\tif (!arrayIsArray(array)) return set;\n\tlet l = array.length;\n\twhile (l--) {\n\t\tlet element = array[l];\n\t\tif (typeof element === \"string\") {\n\t\t\tconst lcElement = transformCaseFunc(element);\n\t\t\tif (lcElement !== element) {\n\t\t\t\tif (!isFrozen(array)) array[l] = lcElement;\n\t\t\t\telement = lcElement;\n\t\t\t}\n\t\t}\n\t\tset[element] = true;\n\t}\n\treturn set;\n}\n/**\n* Clean up an array to harden against CSPP\n*\n* @param array - The array to be cleaned.\n* @returns The cleaned version of the array\n*/\nfunction cleanArray(array) {\n\tfor (let index = 0; index < array.length; index++) if (!objectHasOwnProperty(array, index)) array[index] = null;\n\treturn array;\n}\n/**\n* Shallow clone an object\n*\n* @param object - The object to be cloned.\n* @returns A new object that copies the original.\n*/\nfunction clone(object) {\n\tconst newObject = create(null);\n\tfor (const _ref2 of entries(object)) {\n\t\tvar _ref3 = _slicedToArray(_ref2, 2);\n\t\tconst property = _ref3[0];\n\t\tconst value = _ref3[1];\n\t\tif (objectHasOwnProperty(object, property)) {\n\t\t\tif (arrayIsArray(value)) newObject[property] = cleanArray(value);\n\t\t\telse if (value && typeof value === \"object\" && value.constructor === Object) newObject[property] = clone(value);\n\t\t\telse newObject[property] = value;\n\t\t}\n\t}\n\treturn newObject;\n}\n/**\n* Convert non-node values into strings without depending on direct property access.\n*\n* @param value - The value to stringify.\n* @returns A string representation of the provided value.\n*/\nfunction stringifyValue(value) {\n\tswitch (typeof value) {\n\t\tcase \"string\": return value;\n\t\tcase \"number\": return numberToString(value);\n\t\tcase \"boolean\": return booleanToString(value);\n\t\tcase \"bigint\": return bigintToString ? bigintToString(value) : \"0\";\n\t\tcase \"symbol\": return symbolToString ? symbolToString(value) : \"Symbol()\";\n\t\tcase \"undefined\": return objectToString(value);\n\t\tcase \"function\":\n\t\tcase \"object\": {\n\t\t\tif (value === null) return objectToString(value);\n\t\t\tconst valueAsRecord = value;\n\t\t\tconst valueToString = lookupGetter(valueAsRecord, \"toString\");\n\t\t\tif (typeof valueToString === \"function\") {\n\t\t\t\tconst stringified = valueToString(valueAsRecord);\n\t\t\t\treturn typeof stringified === \"string\" ? stringified : objectToString(stringified);\n\t\t\t}\n\t\t\treturn objectToString(value);\n\t\t}\n\t\tdefault: return objectToString(value);\n\t}\n}\n/**\n* This method automatically checks if the prop is function or getter and behaves accordingly.\n*\n* @param object - The object to look up the getter function in its prototype chain.\n* @param prop - The property name for which to find the getter function.\n* @returns The getter function found in the prototype chain or a fallback function.\n*/\nfunction lookupGetter(object, prop) {\n\twhile (object !== null) {\n\t\tconst desc = getOwnPropertyDescriptor(object, prop);\n\t\tif (desc) {\n\t\t\tif (desc.get) return unapply(desc.get);\n\t\t\tif (typeof desc.value === \"function\") return unapply(desc.value);\n\t\t}\n\t\tobject = getPrototypeOf(object);\n\t}\n\tfunction fallbackValue() {\n\t\treturn null;\n\t}\n\treturn fallbackValue;\n}\nfunction isRegex(value) {\n\ttry {\n\t\tregExpTest(value, \"\");\n\t\treturn true;\n\t} catch (_unused) {\n\t\treturn false;\n\t}\n}\nconst html$1 = freeze([\n\t\"a\",\n\t\"abbr\",\n\t\"acronym\",\n\t\"address\",\n\t\"area\",\n\t\"article\",\n\t\"aside\",\n\t\"audio\",\n\t\"b\",\n\t\"bdi\",\n\t\"bdo\",\n\t\"big\",\n\t\"blink\",\n\t\"blockquote\",\n\t\"body\",\n\t\"br\",\n\t\"button\",\n\t\"canvas\",\n\t\"caption\",\n\t\"center\",\n\t\"cite\",\n\t\"code\",\n\t\"col\",\n\t\"colgroup\",\n\t\"content\",\n\t\"data\",\n\t\"datalist\",\n\t\"dd\",\n\t\"decorator\",\n\t\"del\",\n\t\"details\",\n\t\"dfn\",\n\t\"dialog\",\n\t\"dir\",\n\t\"div\",\n\t\"dl\",\n\t\"dt\",\n\t\"element\",\n\t\"em\",\n\t\"fieldset\",\n\t\"figcaption\",\n\t\"figure\",\n\t\"font\",\n\t\"footer\",\n\t\"form\",\n\t\"h1\",\n\t\"h2\",\n\t\"h3\",\n\t\"h4\",\n\t\"h5\",\n\t\"h6\",\n\t\"head\",\n\t\"header\",\n\t\"hgroup\",\n\t\"hr\",\n\t\"html\",\n\t\"i\",\n\t\"img\",\n\t\"input\",\n\t\"ins\",\n\t\"kbd\",\n\t\"label\",\n\t\"legend\",\n\t\"li\",\n\t\"main\",\n\t\"map\",\n\t\"mark\",\n\t\"marquee\",\n\t\"menu\",\n\t\"menuitem\",\n\t\"meter\",\n\t\"nav\",\n\t\"nobr\",\n\t\"ol\",\n\t\"optgroup\",\n\t\"option\",\n\t\"output\",\n\t\"p\",\n\t\"picture\",\n\t\"pre\",\n\t\"progress\",\n\t\"q\",\n\t\"rp\",\n\t\"rt\",\n\t\"ruby\",\n\t\"s\",\n\t\"samp\",\n\t\"search\",\n\t\"section\",\n\t\"select\",\n\t\"shadow\",\n\t\"slot\",\n\t\"small\",\n\t\"source\",\n\t\"spacer\",\n\t\"span\",\n\t\"strike\",\n\t\"strong\",\n\t\"style\",\n\t\"sub\",\n\t\"summary\",\n\t\"sup\",\n\t\"table\",\n\t\"tbody\",\n\t\"td\",\n\t\"template\",\n\t\"textarea\",\n\t\"tfoot\",\n\t\"th\",\n\t\"thead\",\n\t\"time\",\n\t\"tr\",\n\t\"track\",\n\t\"tt\",\n\t\"u\",\n\t\"ul\",\n\t\"var\",\n\t\"video\",\n\t\"wbr\"\n]);\nconst svg$1 = freeze([\n\t\"svg\",\n\t\"a\",\n\t\"altglyph\",\n\t\"altglyphdef\",\n\t\"altglyphitem\",\n\t\"animatecolor\",\n\t\"animatemotion\",\n\t\"animatetransform\",\n\t\"circle\",\n\t\"clippath\",\n\t\"defs\",\n\t\"desc\",\n\t\"ellipse\",\n\t\"enterkeyhint\",\n\t\"exportparts\",\n\t\"filter\",\n\t\"font\",\n\t\"g\",\n\t\"glyph\",\n\t\"glyphref\",\n\t\"hkern\",\n\t\"image\",\n\t\"inputmode\",\n\t\"line\",\n\t\"lineargradient\",\n\t\"marker\",\n\t\"mask\",\n\t\"metadata\",\n\t\"mpath\",\n\t\"part\",\n\t\"path\",\n\t\"pattern\",\n\t\"polygon\",\n\t\"polyline\",\n\t\"radialgradient\",\n\t\"rect\",\n\t\"stop\",\n\t\"style\",\n\t\"switch\",\n\t\"symbol\",\n\t\"text\",\n\t\"textpath\",\n\t\"title\",\n\t\"tref\",\n\t\"tspan\",\n\t\"view\",\n\t\"vkern\"\n]);\nconst svgFilters = freeze([\n\t\"feBlend\",\n\t\"feColorMatrix\",\n\t\"feComponentTransfer\",\n\t\"feComposite\",\n\t\"feConvolveMatrix\",\n\t\"feDiffuseLighting\",\n\t\"feDisplacementMap\",\n\t\"feDistantLight\",\n\t\"feDropShadow\",\n\t\"feFlood\",\n\t\"feFuncA\",\n\t\"feFuncB\",\n\t\"feFuncG\",\n\t\"feFuncR\",\n\t\"feGaussianBlur\",\n\t\"feImage\",\n\t\"feMerge\",\n\t\"feMergeNode\",\n\t\"feMorphology\",\n\t\"feOffset\",\n\t\"fePointLight\",\n\t\"feSpecularLighting\",\n\t\"feSpotLight\",\n\t\"feTile\",\n\t\"feTurbulence\"\n]);\nconst svgDisallowed = freeze([\n\t\"animate\",\n\t\"color-profile\",\n\t\"cursor\",\n\t\"discard\",\n\t\"font-face\",\n\t\"font-face-format\",\n\t\"font-face-name\",\n\t\"font-face-src\",\n\t\"font-face-uri\",\n\t\"foreignobject\",\n\t\"hatch\",\n\t\"hatchpath\",\n\t\"mesh\",\n\t\"meshgradient\",\n\t\"meshpatch\",\n\t\"meshrow\",\n\t\"missing-glyph\",\n\t\"script\",\n\t\"set\",\n\t\"solidcolor\",\n\t\"unknown\",\n\t\"use\"\n]);\nconst mathMl$1 = freeze([\n\t\"math\",\n\t\"menclose\",\n\t\"merror\",\n\t\"mfenced\",\n\t\"mfrac\",\n\t\"mglyph\",\n\t\"mi\",\n\t\"mlabeledtr\",\n\t\"mmultiscripts\",\n\t\"mn\",\n\t\"mo\",\n\t\"mover\",\n\t\"mpadded\",\n\t\"mphantom\",\n\t\"mroot\",\n\t\"mrow\",\n\t\"ms\",\n\t\"mspace\",\n\t\"msqrt\",\n\t\"mstyle\",\n\t\"msub\",\n\t\"msup\",\n\t\"msubsup\",\n\t\"mtable\",\n\t\"mtd\",\n\t\"mtext\",\n\t\"mtr\",\n\t\"munder\",\n\t\"munderover\",\n\t\"mprescripts\"\n]);\nconst mathMlDisallowed = freeze([\n\t\"maction\",\n\t\"maligngroup\",\n\t\"malignmark\",\n\t\"mlongdiv\",\n\t\"mscarries\",\n\t\"mscarry\",\n\t\"msgroup\",\n\t\"mstack\",\n\t\"msline\",\n\t\"msrow\",\n\t\"semantics\",\n\t\"annotation\",\n\t\"annotation-xml\",\n\t\"mprescripts\",\n\t\"none\"\n]);\nconst text = freeze([\"#text\"]);\nconst html = freeze([\n\t\"accept\",\n\t\"action\",\n\t\"align\",\n\t\"alt\",\n\t\"autocapitalize\",\n\t\"autocomplete\",\n\t\"autopictureinpicture\",\n\t\"autoplay\",\n\t\"background\",\n\t\"bgcolor\",\n\t\"border\",\n\t\"capture\",\n\t\"cellpadding\",\n\t\"cellspacing\",\n\t\"checked\",\n\t\"cite\",\n\t\"class\",\n\t\"clear\",\n\t\"color\",\n\t\"cols\",\n\t\"colspan\",\n\t\"command\",\n\t\"commandfor\",\n\t\"controls\",\n\t\"controlslist\",\n\t\"coords\",\n\t\"crossorigin\",\n\t\"datetime\",\n\t\"decoding\",\n\t\"default\",\n\t\"dir\",\n\t\"disabled\",\n\t\"disablepictureinpicture\",\n\t\"disableremoteplayback\",\n\t\"download\",\n\t\"draggable\",\n\t\"enctype\",\n\t\"enterkeyhint\",\n\t\"exportparts\",\n\t\"face\",\n\t\"for\",\n\t\"headers\",\n\t\"height\",\n\t\"hidden\",\n\t\"high\",\n\t\"href\",\n\t\"hreflang\",\n\t\"id\",\n\t\"inert\",\n\t\"inputmode\",\n\t\"integrity\",\n\t\"ismap\",\n\t\"kind\",\n\t\"label\",\n\t\"lang\",\n\t\"list\",\n\t\"loading\",\n\t\"loop\",\n\t\"low\",\n\t\"max\",\n\t\"maxlength\",\n\t\"media\",\n\t\"method\",\n\t\"min\",\n\t\"minlength\",\n\t\"multiple\",\n\t\"muted\",\n\t\"name\",\n\t\"nonce\",\n\t\"noshade\",\n\t\"novalidate\",\n\t\"nowrap\",\n\t\"open\",\n\t\"optimum\",\n\t\"part\",\n\t\"pattern\",\n\t\"placeholder\",\n\t\"playsinline\",\n\t\"popover\",\n\t\"popovertarget\",\n\t\"popovertargetaction\",\n\t\"poster\",\n\t\"preload\",\n\t\"pubdate\",\n\t\"radiogroup\",\n\t\"readonly\",\n\t\"rel\",\n\t\"required\",\n\t\"rev\",\n\t\"reversed\",\n\t\"role\",\n\t\"rows\",\n\t\"rowspan\",\n\t\"spellcheck\",\n\t\"scope\",\n\t\"selected\",\n\t\"shape\",\n\t\"size\",\n\t\"sizes\",\n\t\"slot\",\n\t\"span\",\n\t\"srclang\",\n\t\"start\",\n\t\"src\",\n\t\"srcset\",\n\t\"step\",\n\t\"style\",\n\t\"summary\",\n\t\"tabindex\",\n\t\"title\",\n\t\"translate\",\n\t\"type\",\n\t\"usemap\",\n\t\"valign\",\n\t\"value\",\n\t\"width\",\n\t\"wrap\",\n\t\"xmlns\"\n]);\nconst svg = freeze([\n\t\"accent-height\",\n\t\"accumulate\",\n\t\"additive\",\n\t\"alignment-baseline\",\n\t\"amplitude\",\n\t\"ascent\",\n\t\"attributename\",\n\t\"attributetype\",\n\t\"azimuth\",\n\t\"basefrequency\",\n\t\"baseline-shift\",\n\t\"begin\",\n\t\"bias\",\n\t\"by\",\n\t\"class\",\n\t\"clip\",\n\t\"clippathunits\",\n\t\"clip-path\",\n\t\"clip-rule\",\n\t\"color\",\n\t\"color-interpolation\",\n\t\"color-interpolation-filters\",\n\t\"color-profile\",\n\t\"color-rendering\",\n\t\"cx\",\n\t\"cy\",\n\t\"d\",\n\t\"dx\",\n\t\"dy\",\n\t\"diffuseconstant\",\n\t\"direction\",\n\t\"display\",\n\t\"divisor\",\n\t\"dominant-baseline\",\n\t\"dur\",\n\t\"edgemode\",\n\t\"elevation\",\n\t\"end\",\n\t\"exponent\",\n\t\"fill\",\n\t\"fill-opacity\",\n\t\"fill-rule\",\n\t\"filter\",\n\t\"filterunits\",\n\t\"flood-color\",\n\t\"flood-opacity\",\n\t\"font-family\",\n\t\"font-size\",\n\t\"font-size-adjust\",\n\t\"font-stretch\",\n\t\"font-style\",\n\t\"font-variant\",\n\t\"font-weight\",\n\t\"fx\",\n\t\"fy\",\n\t\"g1\",\n\t\"g2\",\n\t\"glyph-name\",\n\t\"glyphref\",\n\t\"gradientunits\",\n\t\"gradienttransform\",\n\t\"height\",\n\t\"href\",\n\t\"id\",\n\t\"image-rendering\",\n\t\"in\",\n\t\"in2\",\n\t\"intercept\",\n\t\"k\",\n\t\"k1\",\n\t\"k2\",\n\t\"k3\",\n\t\"k4\",\n\t\"kerning\",\n\t\"keypoints\",\n\t\"keysplines\",\n\t\"keytimes\",\n\t\"lang\",\n\t\"lengthadjust\",\n\t\"letter-spacing\",\n\t\"kernelmatrix\",\n\t\"kernelunitlength\",\n\t\"lighting-color\",\n\t\"local\",\n\t\"marker-end\",\n\t\"marker-mid\",\n\t\"marker-start\",\n\t\"markerheight\",\n\t\"markerunits\",\n\t\"markerwidth\",\n\t\"maskcontentunits\",\n\t\"maskunits\",\n\t\"max\",\n\t\"mask\",\n\t\"mask-type\",\n\t\"media\",\n\t\"method\",\n\t\"mode\",\n\t\"min\",\n\t\"name\",\n\t\"numoctaves\",\n\t\"offset\",\n\t\"operator\",\n\t\"opacity\",\n\t\"order\",\n\t\"orient\",\n\t\"orientation\",\n\t\"origin\",\n\t\"overflow\",\n\t\"paint-order\",\n\t\"path\",\n\t\"pathlength\",\n\t\"patterncontentunits\",\n\t\"patterntransform\",\n\t\"patternunits\",\n\t\"pointer-events\",\n\t\"points\",\n\t\"preservealpha\",\n\t\"preserveaspectratio\",\n\t\"primitiveunits\",\n\t\"r\",\n\t\"rx\",\n\t\"ry\",\n\t\"radius\",\n\t\"refx\",\n\t\"refy\",\n\t\"repeatcount\",\n\t\"repeatdur\",\n\t\"restart\",\n\t\"result\",\n\t\"rotate\",\n\t\"scale\",\n\t\"seed\",\n\t\"shape-rendering\",\n\t\"slope\",\n\t\"specularconstant\",\n\t\"specularexponent\",\n\t\"spreadmethod\",\n\t\"startoffset\",\n\t\"stddeviation\",\n\t\"stitchtiles\",\n\t\"stop-color\",\n\t\"stop-opacity\",\n\t\"stroke-dasharray\",\n\t\"stroke-dashoffset\",\n\t\"stroke-linecap\",\n\t\"stroke-linejoin\",\n\t\"stroke-miterlimit\",\n\t\"stroke-opacity\",\n\t\"stroke\",\n\t\"stroke-width\",\n\t\"style\",\n\t\"surfacescale\",\n\t\"systemlanguage\",\n\t\"tabindex\",\n\t\"tablevalues\",\n\t\"targetx\",\n\t\"targety\",\n\t\"transform\",\n\t\"transform-origin\",\n\t\"text-anchor\",\n\t\"text-decoration\",\n\t\"text-orientation\",\n\t\"text-rendering\",\n\t\"textlength\",\n\t\"type\",\n\t\"u1\",\n\t\"u2\",\n\t\"unicode\",\n\t\"values\",\n\t\"vector-effect\",\n\t\"viewbox\",\n\t\"visibility\",\n\t\"version\",\n\t\"vert-adv-y\",\n\t\"vert-origin-x\",\n\t\"vert-origin-y\",\n\t\"width\",\n\t\"word-spacing\",\n\t\"wrap\",\n\t\"writing-mode\",\n\t\"xchannelselector\",\n\t\"ychannelselector\",\n\t\"x\",\n\t\"x1\",\n\t\"x2\",\n\t\"xmlns\",\n\t\"y\",\n\t\"y1\",\n\t\"y2\",\n\t\"z\",\n\t\"zoomandpan\"\n]);\nconst mathMl = freeze([\n\t\"accent\",\n\t\"accentunder\",\n\t\"align\",\n\t\"bevelled\",\n\t\"close\",\n\t\"columnalign\",\n\t\"columnlines\",\n\t\"columnspacing\",\n\t\"columnspan\",\n\t\"denomalign\",\n\t\"depth\",\n\t\"dir\",\n\t\"display\",\n\t\"displaystyle\",\n\t\"encoding\",\n\t\"fence\",\n\t\"frame\",\n\t\"height\",\n\t\"href\",\n\t\"id\",\n\t\"largeop\",\n\t\"length\",\n\t\"linethickness\",\n\t\"lquote\",\n\t\"lspace\",\n\t\"mathbackground\",\n\t\"mathcolor\",\n\t\"mathsize\",\n\t\"mathvariant\",\n\t\"maxsize\",\n\t\"minsize\",\n\t\"movablelimits\",\n\t\"notation\",\n\t\"numalign\",\n\t\"open\",\n\t\"rowalign\",\n\t\"rowlines\",\n\t\"rowspacing\",\n\t\"rowspan\",\n\t\"rspace\",\n\t\"rquote\",\n\t\"scriptlevel\",\n\t\"scriptminsize\",\n\t\"scriptsizemultiplier\",\n\t\"selection\",\n\t\"separator\",\n\t\"separators\",\n\t\"stretchy\",\n\t\"subscriptshift\",\n\t\"supscriptshift\",\n\t\"symmetric\",\n\t\"voffset\",\n\t\"width\",\n\t\"xmlns\"\n]);\nconst xml = freeze([\n\t\"xlink:href\",\n\t\"xml:id\",\n\t\"xlink:title\",\n\t\"xml:space\",\n\t\"xmlns:xlink\"\n]);\nconst MUSTACHE_EXPR = seal(/{{[\\w\\W]*|^[\\w\\W]*}}/g);\nconst ERB_EXPR = seal(/<%[\\w\\W]*|^[\\w\\W]*%>/g);\nconst TMPLIT_EXPR = seal(/\\${[\\w\\W]*/g);\nconst DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]+$/);\nconst ARIA_ATTR = seal(/^aria-[\\-\\w]+$/);\nconst IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i);\nconst IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\nconst ATTR_WHITESPACE = seal(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g);\nconst DOCTYPE_NAME = seal(/^html$/i);\nconst CUSTOM_ELEMENT = seal(/^[a-z][.\\w]*(-[.\\w]+)+$/i);\nconst ELEMENT_MARKUP_PROBE = seal(/<[/\\w!]/g);\nconst COMMENT_MARKUP_PROBE = seal(/<[/\\w]/g);\nconst FALLBACK_TAG_CLOSE = seal(/<\\/no(script|embed|frames)/i);\nconst SELF_CLOSING_TAG = seal(/\\/>/i);\nconst NODE_TYPE = {\n\telement: 1,\n\tattribute: 2,\n\ttext: 3,\n\tcdataSection: 4,\n\tentityReference: 5,\n\tentityNode: 6,\n\tprocessingInstruction: 7,\n\tcomment: 8,\n\tdocument: 9,\n\tdocumentType: 10,\n\tdocumentFragment: 11,\n\tnotation: 12\n};\nconst LITERAL_TEXT_ELEMENT_NAMES = [\n\t\"style\",\n\t\"script\",\n\t\"xmp\",\n\t\"iframe\",\n\t\"noembed\",\n\t\"noframes\",\n\t\"plaintext\",\n\t\"noscript\"\n];\nconst LITERAL_TEXT_ELEMENTS = freeze(addToSet({}, LITERAL_TEXT_ELEMENT_NAMES));\nconst LITERAL_TEXT_CLOSE = function() {\n\tconst map = {};\n\tarrayForEach(LITERAL_TEXT_ELEMENT_NAMES, (name) => {\n\t\tmap[name] = seal(new RegExp(\"</\" + name + \"(?=[\\\\t\\\\n\\\\f\\\\r />])\", \"i\"));\n\t});\n\treturn freeze(map);\n}();\nconst getGlobal = function getGlobal() {\n\treturn typeof window === \"undefined\" ? null : window;\n};\n/**\n* Creates a no-op policy for internal use only.\n* Don't export this function outside this module!\n* @param trustedTypes The policy factory.\n* @param purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix).\n* @return The policy created (or null, if Trusted Types\n* are not supported or creating the policy failed).\n*/\nconst _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, purifyHostElement) {\n\tif (typeof trustedTypes !== \"object\" || typeof trustedTypes.createPolicy !== \"function\") return null;\n\tlet suffix = null;\n\tconst ATTR_NAME = \"data-tt-policy-suffix\";\n\tif (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) suffix = purifyHostElement.getAttribute(ATTR_NAME);\n\tconst policyName = \"dompurify\" + (suffix ? \"#\" + suffix : \"\");\n\ttry {\n\t\treturn trustedTypes.createPolicy(policyName, {\n\t\t\tcreateHTML(html) {\n\t\t\t\treturn html;\n\t\t\t},\n\t\t\tcreateScriptURL(scriptUrl) {\n\t\t\t\treturn scriptUrl;\n\t\t\t}\n\t\t});\n\t} catch (_) {\n\t\tconsole.warn(\"TrustedTypes policy \" + policyName + \" could not be created.\");\n\t\treturn null;\n\t}\n};\nconst _createHooksMap = function _createHooksMap() {\n\treturn {\n\t\tafterSanitizeAttributes: [],\n\t\tafterSanitizeElements: [],\n\t\tafterSanitizeShadowDOM: [],\n\t\tbeforeSanitizeAttributes: [],\n\t\tbeforeSanitizeElements: [],\n\t\tbeforeSanitizeShadowDOM: [],\n\t\tuponSanitizeAttribute: [],\n\t\tuponSanitizeElement: [],\n\t\tuponSanitizeShadowNode: []\n\t};\n};\n/**\n* Resolve a set-valued configuration option: a fresh set built from\n* cfg[key] when it is an own array property (seeded with a clone of\n* options.base when given, case-normalized via options.transform),\n* the fallback set otherwise.\n*\n* @param cfg the cloned, prototype-free configuration object\n* @param key the configuration property to read\n* @param fallback the set to use when the option is absent or not an array\n* @param options transform and optional base set to merge into\n* @returns the resolved set\n*/\nconst _resolveSetOption = function _resolveSetOption(cfg, key, fallback, options) {\n\treturn objectHasOwnProperty(cfg, key) && arrayIsArray(cfg[key]) ? addToSet(options.base ? clone(options.base) : {}, cfg[key], options.transform) : fallback;\n};\n/**\n* Resolve an object-valued configuration option: a prototype-free clone\n* of cfg[key] when it is an own, truthy object property, else a fresh\n* fallback built by makeFallback (fresh on every parse, so a previous\n* parse can never leak state into the next one).\n*\n* @param cfg the cloned, prototype-free configuration object\n* @param key the configuration property to read\n* @param makeFallback builds the fallback value when the option is absent\n* @returns the resolved object\n*/\nconst _resolveObjectOption = function _resolveObjectOption(cfg, key, makeFallback) {\n\tconst value = objectHasOwnProperty(cfg, key) ? cfg[key] : void 0;\n\treturn value && typeof value === \"object\" ? clone(value) : makeFallback();\n};\nfunction createDOMPurify() {\n\tlet window = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : getGlobal();\n\tconst DOMPurify = (root) => createDOMPurify(root);\n\tDOMPurify.version = \"3.4.16\";\n\tDOMPurify.removed = [];\n\tif (!window || !window.document || window.document.nodeType !== NODE_TYPE.document || !window.Element) {\n\t\tDOMPurify.isSupported = false;\n\t\treturn DOMPurify;\n\t}\n\tlet document = window.document;\n\tconst originalDocument = document;\n\tconst currentScript = originalDocument.currentScript;\n\twindow.DocumentFragment;\n\tconst HTMLTemplateElement = window.HTMLTemplateElement, Node = window.Node, Element = window.Element, NodeFilter = window.NodeFilter;\n\twindow.NamedNodeMap === void 0 && (window.NamedNodeMap || window.MozNamedAttrMap);\n\twindow.HTMLFormElement;\n\tconst DOMParser = window.DOMParser, trustedTypes = window.trustedTypes;\n\tconst ElementPrototype = Element.prototype;\n\tconst cloneNode = lookupGetter(ElementPrototype, \"cloneNode\");\n\tconst remove = lookupGetter(ElementPrototype, \"remove\");\n\tconst removeAttributeNode = lookupGetter(ElementPrototype, \"removeAttributeNode\");\n\tconst getNextSibling = lookupGetter(ElementPrototype, \"nextSibling\");\n\tconst getChildNodes = lookupGetter(ElementPrototype, \"childNodes\");\n\tconst getParentNode = lookupGetter(ElementPrototype, \"parentNode\");\n\tconst getShadowRoot = lookupGetter(ElementPrototype, \"shadowRoot\");\n\tconst getAttributes = lookupGetter(ElementPrototype, \"attributes\");\n\tconst getNodeType = Node && Node.prototype ? lookupGetter(Node.prototype, \"nodeType\") : null;\n\tconst getNodeName = Node && Node.prototype ? lookupGetter(Node.prototype, \"nodeName\") : null;\n\tconst getOwnerDocument = Node && Node.prototype ? lookupGetter(Node.prototype, \"ownerDocument\") : null;\n\tconst _readNodeType = function _readNodeType(node) {\n\t\treturn getNodeType ? getNodeType(node) : node.nodeType;\n\t};\n\tconst _readNodeName = function _readNodeName(node) {\n\t\treturn getNodeName ? getNodeName(node) : node.nodeName;\n\t};\n\tif (typeof HTMLTemplateElement === \"function\") {\n\t\tconst template = document.createElement(\"template\");\n\t\tif (template.content && template.content.ownerDocument) document = template.content.ownerDocument;\n\t}\n\tlet trustedTypesPolicy;\n\tlet emptyHTML = \"\";\n\tlet defaultTrustedTypesPolicy;\n\tlet defaultTrustedTypesPolicyResolved = false;\n\tlet IN_TRUSTED_TYPES_POLICY = 0;\n\tconst _assertNotInTrustedTypesPolicy = function _assertNotInTrustedTypesPolicy() {\n\t\tif (IN_TRUSTED_TYPES_POLICY > 0) throw typeErrorCreate(\"A configured TRUSTED_TYPES_POLICY callback (createHTML or createScriptURL) must not call DOMPurify.sanitize, as that causes infinite recursion. Do not pass a policy whose callbacks wrap DOMPurify as TRUSTED_TYPES_POLICY; see the \\\"DOMPurify and Trusted Types\\\" section of the README.\");\n\t};\n\tconst _createTrustedHTML = function _createTrustedHTML(html) {\n\t\t_assertNotInTrustedTypesPolicy();\n\t\tIN_TRUSTED_TYPES_POLICY++;\n\t\ttry {\n\t\t\treturn trustedTypesPolicy.createHTML(html);\n\t\t} finally {\n\t\t\tIN_TRUSTED_TYPES_POLICY--;\n\t\t}\n\t};\n\tconst _createTrustedScriptURL = function _createTrustedScriptURL(scriptUrl) {\n\t\t_assertNotInTrustedTypesPolicy();\n\t\tIN_TRUSTED_TYPES_POLICY++;\n\t\ttry {\n\t\t\treturn trustedTypesPolicy.createScriptURL(scriptUrl);\n\t\t} finally {\n\t\t\tIN_TRUSTED_TYPES_POLICY--;\n\t\t}\n\t};\n\tconst _getDefaultTrustedTypesPolicy = function _getDefaultTrustedTypesPolicy() {\n\t\tif (!defaultTrustedTypesPolicyResolved) {\n\t\t\tdefaultTrustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript);\n\t\t\tdefaultTrustedTypesPolicyResolved = true;\n\t\t}\n\t\treturn defaultTrustedTypesPolicy;\n\t};\n\tconst _document = document, implementation = _document.implementation, createNodeIterator = _document.createNodeIterator, createDocumentFragment = _document.createDocumentFragment, getElementsByTagName = _document.getElementsByTagName;\n\tconst importNode = originalDocument.importNode;\n\tlet hooks = _createHooksMap();\n\t/**\n\t* Expose whether this browser supports running the full DOMPurify.\n\t*/\n\tDOMPurify.isSupported = typeof entries === \"function\" && typeof getParentNode === \"function\" && implementation && implementation.createHTMLDocument !== void 0;\n\tconst MUSTACHE_EXPR$1 = MUSTACHE_EXPR, ERB_EXPR$1 = ERB_EXPR, TMPLIT_EXPR$1 = TMPLIT_EXPR, DATA_ATTR$1 = DATA_ATTR, ARIA_ATTR$1 = ARIA_ATTR, IS_SCRIPT_OR_DATA$1 = IS_SCRIPT_OR_DATA, ATTR_WHITESPACE$1 = ATTR_WHITESPACE, CUSTOM_ELEMENT$1 = CUSTOM_ELEMENT;\n\tlet IS_ALLOWED_URI$1 = IS_ALLOWED_URI;\n\t/**\n\t* We consider the elements and attributes below to be safe. Ideally\n\t* don't add any new ones but feel free to remove unwanted ones.\n\t*/\n\tlet ALLOWED_TAGS = null;\n\tconst DEFAULT_ALLOWED_TAGS = addToSet({}, [\n\t\t...html$1,\n\t\t...svg$1,\n\t\t...svgFilters,\n\t\t...mathMl$1,\n\t\t...text\n\t]);\n\tlet ALLOWED_ATTR = null;\n\tconst DEFAULT_ALLOWED_ATTR = addToSet({}, [\n\t\t...html,\n\t\t...svg,\n\t\t...mathMl,\n\t\t...xml\n\t]);\n\tlet CUSTOM_ELEMENT_HANDLING = Object.seal(create(null, {\n\t\ttagNameCheck: {\n\t\t\twritable: true,\n\t\t\tconfigurable: false,\n\t\t\tenumerable: true,\n\t\t\tvalue: null\n\t\t},\n\t\tattributeNameCheck: {\n\t\t\twritable: true,\n\t\t\tconfigurable: false,\n\t\t\tenumerable: true,\n\t\t\tvalue: null\n\t\t},\n\t\tallowCustomizedBuiltInElements: {\n\t\t\twritable: true,\n\t\t\tconfigurable: false,\n\t\t\tenumerable: true,\n\t\t\tvalue: false\n\t\t}\n\t}));\n\tlet FORBID_TAGS = null;\n\tlet FORBID_ATTR = null;\n\tconst EXTRA_ELEMENT_HANDLING = Object.seal(create(null, {\n\t\ttagCheck: {\n\t\t\twritable: true,\n\t\t\tconfigurable: false,\n\t\t\tenumerable: true,\n\t\t\tvalue: null\n\t\t},\n\t\tattributeCheck: {\n\t\t\twritable: true,\n\t\t\tconfigurable: false,\n\t\t\tenumerable: true,\n\t\t\tvalue: null\n\t\t}\n\t}));\n\tlet ALLOW_ARIA_ATTR = true;\n\tlet ALLOW_DATA_ATTR = true;\n\tlet ALLOW_UNKNOWN_PROTOCOLS = false;\n\tlet ALLOW_SELF_CLOSE_IN_ATTR = true;\n\tlet SAFE_FOR_TEMPLATES = false;\n\tlet SAFE_FOR_XML = true;\n\tlet WHOLE_DOCUMENT = false;\n\tlet SET_CONFIG = false;\n\tlet SET_CONFIG_ALLOWED_TAGS = null;\n\tlet SET_CONFIG_ALLOWED_ATTR = null;\n\tlet FORCE_BODY = false;\n\tlet RETURN_DOM = false;\n\tlet RETURN_DOM_FRAGMENT = false;\n\tlet RETURN_TRUSTED_TYPE = false;\n\tlet SANITIZE_DOM = true;\n\tlet SANITIZE_NAMED_PROPS = false;\n\tconst SANITIZE_NAMED_PROPS_PREFIX = \"user-content-\";\n\tlet KEEP_CONTENT = true;\n\tlet IN_PLACE = false;\n\tlet USE_PROFILES = {};\n\tlet FORBID_CONTENTS = null;\n\tconst DEFAULT_FORBID_CONTENTS = addToSet({}, [\n\t\t\"annotation-xml\",\n\t\t\"audio\",\n\t\t\"colgroup\",\n\t\t\"desc\",\n\t\t\"foreignobject\",\n\t\t\"head\",\n\t\t\"iframe\",\n\t\t\"math\",\n\t\t\"mi\",\n\t\t\"mn\",\n\t\t\"mo\",\n\t\t\"ms\",\n\t\t\"mtext\",\n\t\t\"noembed\",\n\t\t\"noframes\",\n\t\t\"noscript\",\n\t\t\"plaintext\",\n\t\t\"script\",\n\t\t\"selectedcontent\",\n\t\t\"style\",\n\t\t\"svg\",\n\t\t\"template\",\n\t\t\"thead\",\n\t\t\"title\",\n\t\t\"video\",\n\t\t\"xmp\"\n\t]);\n\tlet DATA_URI_TAGS = null;\n\tconst DEFAULT_DATA_URI_TAGS = addToSet({}, [\n\t\t\"audio\",\n\t\t\"video\",\n\t\t\"img\",\n\t\t\"source\",\n\t\t\"image\",\n\t\t\"track\"\n\t]);\n\tlet URI_SAFE_ATTRIBUTES = null;\n\tconst DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, [\n\t\t\"alt\",\n\t\t\"class\",\n\t\t\"for\",\n\t\t\"id\",\n\t\t\"label\",\n\t\t\"name\",\n\t\t\"pattern\",\n\t\t\"placeholder\",\n\t\t\"role\",\n\t\t\"summary\",\n\t\t\"title\",\n\t\t\"value\",\n\t\t\"style\",\n\t\t\"xmlns\"\n\t]);\n\tconst MATHML_NAMESPACE = \"http://www.w3.org/1998/Math/MathML\";\n\tconst SVG_NAMESPACE = \"http://www.w3.org/2000/svg\";\n\tconst HTML_NAMESPACE = \"http://www.w3.org/1999/xhtml\";\n\tlet NAMESPACE = HTML_NAMESPACE;\n\tlet IS_EMPTY_INPUT = false;\n\tlet ALLOWED_NAMESPACES = null;\n\tconst DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [\n\t\tMATHML_NAMESPACE,\n\t\tSVG_NAMESPACE,\n\t\tHTML_NAMESPACE\n\t], stringToString);\n\tconst DEFAULT_MATHML_TEXT_INTEGRATION_POINTS = freeze([\n\t\t\"mi\",\n\t\t\"mo\",\n\t\t\"mn\",\n\t\t\"ms\",\n\t\t\"mtext\"\n\t]);\n\tlet MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, DEFAULT_MATHML_TEXT_INTEGRATION_POINTS);\n\tconst DEFAULT_HTML_INTEGRATION_POINTS = freeze([\"annotation-xml\"]);\n\tlet HTML_INTEGRATION_POINTS = addToSet({}, DEFAULT_HTML_INTEGRATION_POINTS);\n\tconst COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, [\n\t\t\"title\",\n\t\t\"style\",\n\t\t\"font\",\n\t\t\"a\",\n\t\t\"script\"\n\t]);\n\tlet PARSER_MEDIA_TYPE = null;\n\tconst SUPPORTED_PARSER_MEDIA_TYPES = [\"application/xhtml+xml\", \"text/html\"];\n\tconst DEFAULT_PARSER_MEDIA_TYPE = \"text/html\";\n\tlet transformCaseFunc = null;\n\tlet CONFIG = null;\n\tconst formElement = document.createElement(\"form\");\n\tconst isRegexOrFunction = function isRegexOrFunction(testValue) {\n\t\treturn testValue instanceof RegExp || testValue instanceof Function;\n\t};\n\t/**\n\t* _parseConfig\n\t*\n\t* @param cfg optional config literal\n\t*/\n\tconst _parseConfig = function _parseConfig() {\n\t\tlet cfg = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};\n\t\tif (CONFIG && CONFIG === cfg) return;\n\t\tif (!cfg || typeof cfg !== \"object\") cfg = {};\n\t\tcfg = clone(cfg);\n\t\tPARSER_MEDIA_TYPE = SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? DEFAULT_PARSER_MEDIA_TYPE : cfg.PARSER_MEDIA_TYPE;\n\t\ttransformCaseFunc = PARSER_MEDIA_TYPE === \"application/xhtml+xml\" ? stringToString : stringToLowerCase;\n\t\tALLOWED_TAGS = _resolveSetOption(cfg, \"ALLOWED_TAGS\", DEFAULT_ALLOWED_TAGS, { transform: transformCaseFunc });\n\t\tALLOWED_ATTR = _resolveSetOption(cfg, \"ALLOWED_ATTR\", DEFAULT_ALLOWED_ATTR, { transform: transformCaseFunc });\n\t\tALLOWED_NAMESPACES = _resolveSetOption(cfg, \"ALLOWED_NAMESPACES\", DEFAULT_ALLOWED_NAMESPACES, { transform: stringToString });\n\t\tURI_SAFE_ATTRIBUTES = _resolveSetOption(cfg, \"ADD_URI_SAFE_ATTR\", DEFAULT_URI_SAFE_ATTRIBUTES, {\n\t\t\ttransform: transformCaseFunc,\n\t\t\tbase: DEFAULT_URI_SAFE_ATTRIBUTES\n\t\t});\n\t\tDATA_URI_TAGS = _resolveSetOption(cfg, \"ADD_DATA_URI_TAGS\", DEFAULT_DATA_URI_TAGS, {\n\t\t\ttransform: transformCaseFunc,\n\t\t\tbase: DEFAULT_DATA_URI_TAGS\n\t\t});\n\t\tFORBID_CONTENTS = _resolveSetOption(cfg, \"FORBID_CONTENTS\", DEFAULT_FORBID_CONTENTS, { transform: transformCaseFunc });\n\t\tFORBID_TAGS = _resolveSetOption(cfg, \"FORBID_TAGS\", clone({}), { transform: transformCaseFunc });\n\t\tFORBID_ATTR = _resolveSetOption(cfg, \"FORBID_ATTR\", clone({}), { transform: transformCaseFunc });\n\t\tUSE_PROFILES = objectHasOwnProperty(cfg, \"USE_PROFILES\") ? cfg.USE_PROFILES && typeof cfg.USE_PROFILES === \"object\" ? clone(cfg.USE_PROFILES) : cfg.USE_PROFILES : false;\n\t\tALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false;\n\t\tALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false;\n\t\tALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false;\n\t\tALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false;\n\t\tSAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false;\n\t\tSAFE_FOR_XML = cfg.SAFE_FOR_XML !== false;\n\t\tWHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false;\n\t\tRETURN_DOM = cfg.RETURN_DOM || false;\n\t\tRETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false;\n\t\tRETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false;\n\t\tFORCE_BODY = cfg.FORCE_BODY || false;\n\t\tSANITIZE_DOM = cfg.SANITIZE_DOM !== false;\n\t\tSANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false;\n\t\tKEEP_CONTENT = cfg.KEEP_CONTENT !== false;\n\t\tIN_PLACE = cfg.IN_PLACE || false;\n\t\tIS_ALLOWED_URI$1 = isRegex(cfg.ALLOWED_URI_REGEXP) ? cfg.ALLOWED_URI_REGEXP : IS_ALLOWED_URI;\n\t\tNAMESPACE = typeof cfg.NAMESPACE === \"string\" ? cfg.NAMESPACE : HTML_NAMESPACE;\n\t\tMATHML_TEXT_INTEGRATION_POINTS = _resolveObjectOption(cfg, \"MATHML_TEXT_INTEGRATION_POINTS\", () => addToSet({}, DEFAULT_MATHML_TEXT_INTEGRATION_POINTS));\n\t\tHTML_INTEGRATION_POINTS = _resolveObjectOption(cfg, \"HTML_INTEGRATION_POINTS\", () => addToSet({}, DEFAULT_HTML_INTEGRATION_POINTS));\n\t\tconst customElementHandling = _resolveObjectOption(cfg, \"CUSTOM_ELEMENT_HANDLING\", () => create(null));\n\t\tCUSTOM_ELEMENT_HANDLING = create(null);\n\t\tif (objectHasOwnProperty(customElementHandling, \"tagNameCheck\") && isRegexOrFunction(customElementHandling.tagNameCheck)) CUSTOM_ELEMENT_HANDLING.tagNameCheck = customElementHandling.tagNameCheck;\n\t\tif (objectHasOwnProperty(customElementHandling, \"attributeNameCheck\") && isRegexOrFunction(customElementHandling.attributeNameCheck)) CUSTOM_ELEMENT_HANDLING.attributeNameCheck = customElementHandling.attributeNameCheck;\n\t\tif (objectHasOwnProperty(customElementHandling, \"allowCustomizedBuiltInElements\") && typeof customElementHandling.allowCustomizedBuiltInElements === \"boolean\") CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = customElementHandling.allowCustomizedBuiltInElements;\n\t\tseal(CUSTOM_ELEMENT_HANDLING);\n\t\tif (SAFE_FOR_TEMPLATES) ALLOW_DATA_ATTR = false;\n\t\tif (RETURN_DOM_FRAGMENT) RETURN_DOM = true;\n\t\tif (USE_PROFILES) {\n\t\t\tALLOWED_TAGS = addToSet({}, text);\n\t\t\tALLOWED_ATTR = create(null);\n\t\t\tif (USE_PROFILES.html === true) {\n\t\t\t\taddToSet(ALLOWED_TAGS, html$1);\n\t\t\t\taddToSet(ALLOWED_ATTR, html);\n\t\t\t}\n\t\t\tif (USE_PROFILES.svg === true) {\n\t\t\t\taddToSet(ALLOWED_TAGS, svg$1);\n\t\t\t\taddToSet(ALLOWED_ATTR, svg);\n\t\t\t\taddToSet(ALLOWED_ATTR, xml);\n\t\t\t}\n\t\t\tif (USE_PROFILES.svgFilters === true) {\n\t\t\t\taddToSet(ALLOWED_TAGS, svgFilters);\n\t\t\t\taddToSet(ALLOWED_ATTR, svg);\n\t\t\t\taddToSet(ALLOWED_ATTR, xml);\n\t\t\t}\n\t\t\tif (USE_PROFILES.mathMl === true) {\n\t\t\t\taddToSet(ALLOWED_TAGS, mathMl$1);\n\t\t\t\taddToSet(ALLOWED_ATTR, mathMl);\n\t\t\t\taddToSet(ALLOWED_ATTR, xml);\n\t\t\t}\n\t\t}\n\t\tEXTRA_ELEMENT_HANDLING.tagCheck = null;\n\t\tEXTRA_ELEMENT_HANDLING.attributeCheck = null;\n\t\tif (objectHasOwnProperty(cfg, \"ADD_TAGS\")) {\n\t\t\tif (typeof cfg.ADD_TAGS === \"function\") EXTRA_ELEMENT_HANDLING.tagCheck = cfg.ADD_TAGS;\n\t\t\telse if (arrayIsArray(cfg.ADD_TAGS)) {\n\t\t\t\tif (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) ALLOWED_TAGS = clone(ALLOWED_TAGS);\n\t\t\t\taddToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n\t\t\t}\n\t\t}\n\t\tif (objectHasOwnProperty(cfg, \"ADD_ATTR\")) {\n\t\t\tif (typeof cfg.ADD_ATTR === \"function\") EXTRA_ELEMENT_HANDLING.attributeCheck = cfg.ADD_ATTR;\n\t\t\telse if (arrayIsArray(cfg.ADD_ATTR)) {\n\t\t\t\tif (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) ALLOWED_ATTR = clone(ALLOWED_ATTR);\n\t\t\t\taddToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n\t\t\t}\n\t\t}\n\t\tif (objectHasOwnProperty(cfg, \"ADD_FORBID_CONTENTS\") && arrayIsArray(cfg.ADD_FORBID_CONTENTS)) {\n\t\t\tif (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) FORBID_CONTENTS = clone(FORBID_CONTENTS);\n\t\t\taddToSet(FORBID_CONTENTS, cfg.ADD_FORBID_CONTENTS, transformCaseFunc);\n\t\t}\n\t\tif (KEEP_CONTENT) ALLOWED_TAGS[\"#text\"] = true;\n\t\tif (WHOLE_DOCUMENT) addToSet(ALLOWED_TAGS, [\n\t\t\t\"html\",\n\t\t\t\"head\",\n\t\t\t\"body\"\n\t\t]);\n\t\tif (ALLOWED_TAGS.table) {\n\t\t\taddToSet(ALLOWED_TAGS, [\"tbody\"]);\n\t\t\tdelete FORBID_TAGS.tbody;\n\t\t}\n\t\tif (cfg.TRUSTED_TYPES_POLICY) {\n\t\t\tif (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== \"function\") throw typeErrorCreate(\"TRUSTED_TYPES_POLICY configuration option must provide a \\\"createHTML\\\" hook.\");\n\t\t\tif (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== \"function\") throw typeErrorCreate(\"TRUSTED_TYPES_POLICY configuration option must provide a \\\"createScriptURL\\\" hook.\");\n\t\t\tconst previousTrustedTypesPolicy = trustedTypesPolicy;\n\t\t\ttrustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY;\n\t\t\ttry {\n\t\t\t\temptyHTML = _createTrustedHTML(\"\");\n\t\t\t} catch (error) {\n\t\t\t\ttrustedTypesPolicy = previousTrustedTypesPolicy;\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t} else if (cfg.TRUSTED_TYPES_POLICY === null) {\n\t\t\ttrustedTypesPolicy = void 0;\n\t\t\temptyHTML = \"\";\n\t\t} else {\n\t\t\tif (trustedTypesPolicy === void 0) trustedTypesPolicy = _getDefaultTrustedTypesPolicy();\n\t\t\tif (trustedTypesPolicy && typeof emptyHTML === \"string\") emptyHTML = _createTrustedHTML(\"\");\n\t\t}\n\t\tif (freeze) freeze(cfg);\n\t\tCONFIG = cfg;\n\t};\n\tconst ALL_SVG_TAGS = addToSet({}, [\n\t\t...svg$1,\n\t\t...svgFilters,\n\t\t...svgDisallowed\n\t]);\n\tconst ALL_MATHML_TAGS = addToSet({}, [...mathMl$1, ...mathMlDisallowed]);\n\t/**\n\t* Namespace rules for an element in the SVG namespace.\n\t*\n\t* @param tagName the element's lowercase tag name\n\t* @param parent the (possibly simulated) parent node\n\t* @param parentTagName the parent's lowercase tag name\n\t* @returns true if a spec-compliant parser could produce this element\n\t*/\n\tconst _checkSvgNamespace = function _checkSvgNamespace(tagName, parent, parentTagName) {\n\t\tif (parent.namespaceURI === HTML_NAMESPACE) return tagName === \"svg\";\n\t\tif (parent.namespaceURI === MATHML_NAMESPACE) return tagName === \"svg\" && (parentTagName === \"annotation-xml\" || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);\n\t\treturn Boolean(ALL_SVG_TAGS[tagName]);\n\t};\n\t/**\n\t* Namespace rules for an element in the MathML namespace.\n\t*\n\t* @param tagName the element's lowercase tag name\n\t* @param parent the (possibly simulated) parent node\n\t* @param parentTagName the parent's lowercase tag name\n\t* @returns true if a spec-compliant parser could produce this element\n\t*/\n\tconst _checkMathMlNamespace = function _checkMathMlNamespace(tagName, parent, parentTagName) {\n\t\tif (parent.namespaceURI === HTML_NAMESPACE) return tagName === \"math\";\n\t\tif (parent.namespaceURI === SVG_NAMESPACE) return tagName === \"math\" && HTML_INTEGRATION_POINTS[parentTagName];\n\t\treturn Boolean(ALL_MATHML_TAGS[tagName]);\n\t};\n\t/**\n\t* Namespace rules for an element in the HTML namespace.\n\t*\n\t* @param tagName the element's lowercase tag name\n\t* @param parent the (possibly simulated) parent node\n\t* @param parentTagName the parent's lowercase tag name\n\t* @returns true if a spec-compliant parser could produce this element\n\t*/\n\tconst _checkHtmlNamespace = function _checkHtmlNamespace(tagName, parent, parentTagName) {\n\t\tif (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) return false;\n\t\tif (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) return false;\n\t\treturn !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);\n\t};\n\t/**\n\t* @param element a DOM element whose namespace is being checked\n\t* @returns Return false if the element has a\n\t* namespace that a spec-compliant parser would never\n\t* return. Return true otherwise.\n\t*/\n\tconst _checkValidNamespace = function _checkValidNamespace(element) {\n\t\tlet parent = getParentNode(element);\n\t\tif (!parent || !parent.tagName) parent = {\n\t\t\tnamespaceURI: NAMESPACE,\n\t\t\ttagName: \"template\"\n\t\t};\n\t\tconst tagName = stringToLowerCase(element.tagName);\n\t\tconst parentTagName = stringToLowerCase(parent.tagName);\n\t\tif (!ALLOWED_NAMESPACES[element.namespaceURI]) return false;\n\t\tif (element.namespaceURI === SVG_NAMESPACE) return _checkSvgNamespace(tagName, parent, parentTagName);\n\t\tif (element.namespaceURI === MATHML_NAMESPACE) return _checkMathMlNamespace(tagName, parent, parentTagName);\n\t\tif (element.namespaceURI === HTML_NAMESPACE) return _checkHtmlNamespace(tagName, parent, parentTagName);\n\t\tif (PARSER_MEDIA_TYPE === \"application/xhtml+xml\" && ALLOWED_NAMESPACES[element.namespaceURI]) return true;\n\t\treturn false;\n\t};\n\t/**\n\t* _forceRemove\n\t*\n\t* @param node a DOM node\n\t*/\n\tconst _forceRemove = function _forceRemove(node) {\n\t\tarrayPush(DOMPurify.removed, { element: node });\n\t\ttry {\n\t\t\tgetParentNode(node).removeChild(node);\n\t\t} catch (_) {\n\t\t\tremove(node);\n\t\t\tif (!getParentNode(node)) throw typeErrorCreate(\"a node selected for removal could not be detached from its tree and cannot be safely returned; refusing to sanitize in place\");\n\t\t}\n\t};\n\t/**\n\t* _stripAttributeNode\n\t*\n\t* Remove a single Attr node case/namespace-exactly on an attribute-teardown\n\t* path. Name-based removeAttribute() ASCII-lowercases its lookup key for an\n\t* HTML element in an HTML document and so silently misses a case-preserved\n\t* handler (e.g. `ONERROR` off an XML/XHTML import) - the same defect\n\t* _removeAttribute() was fixed for, which a name-based call would reintroduce\n\t* on these IN_PLACE teardown paths. Unlike _removeAttribute this does not\n\t* record into DOMPurify.removed: the neutralize passes intentionally do not\n\t* book-keep. A clobbered/detached node falls back to best-effort name-based\n\t* removal.\n\t*\n\t* @param element the element to strip the attribute from\n\t* @param attribute the Attr node to remove\n\t* @param name the attribute's name, for the fallback path\n\t*/\n\tconst _stripAttributeNode = function _stripAttributeNode(element, attribute, name) {\n\t\ttry {\n\t\t\tremoveAttributeNode(element, attribute);\n\t\t} catch (_) {\n\t\t\ttry {\n\t\t\t\telement.removeAttribute(name);\n\t\t\t} catch (_) {}\n\t\t}\n\t};\n\t/**\n\t* _neutralizeRoot\n\t*\n\t* Fail-closed teardown of an in-place root after the sanitize walk aborts\n\t* (campaign-3 F2). An internal throw mid-walk — e.g. a page-registered\n\t* custom element's reaction detaches a node so `_forceRemove`'s deliberate\n\t* parentless guard throws, or any other re-entrant engine mutation — would\n\t* otherwise leave the caller's *live* tree half-sanitized, with everything\n\t* after the abort point still carrying its handlers. There is no safe way\n\t* to resume the walk (the tree mutated under us), so we strip the root bare:\n\t* remove every child and every attribute, then let the caller's catch see\n\t* the original error. Clobber-safe (cached `remove`/`childNodes`/`attributes`\n\t* getters; the root was already clobber-pre-flighted at the IN_PLACE entry).\n\t*\n\t* @param root the in-place root to empty\n\t*/\n\tconst _neutralizeRoot = function _neutralizeRoot(root) {\n\t\t_neutralizeSubtree(root);\n\t\tconst childNodes = getChildNodes(root);\n\t\tif (childNodes) {\n\t\t\tconst snapshot = [];\n\t\t\tarrayForEach(childNodes, (child) => {\n\t\t\t\tarrayPush(snapshot, child);\n\t\t\t});\n\t\t\tarrayForEach(snapshot, (child) => {\n\t\t\t\ttry {\n\t\t\t\t\tremove(child);\n\t\t\t\t} catch (_) {}\n\t\t\t});\n\t\t}\n\t\tconst attributes = getAttributes(root);\n\t\tif (attributes) for (let i = attributes.length - 1; i >= 0; --i) {\n\t\t\tconst attribute = attributes[i];\n\t\t\tconst name = attribute && attribute.name;\n\t\t\tif (typeof name === \"string\") _stripAttributeNode(root, attribute, name);\n\t\t}\n\t};\n\t/**\n\t* _removeAttribute\n\t*\n\t* Name-based getAttributeNode()/removeAttribute() ASCII-lowercase their\n\t* lookup key for HTML elements in an HTML document, so they silently miss an\n\t* attribute whose stored qualified name still contains uppercase ASCII\n\t* letters. That happens when the node came from a case-preserving source\n\t* (an XML/XHTML document imported via importNode(), or createAttributeNS()),\n\t* where e.g. `ONERROR` survives the walk: the policy check lowercases to\n\t* `onerror` and rejects it, but `removeAttribute('ONERROR')` looks up\n\t* `onerror` and finds nothing. Remove the exact Attr node instead, which is\n\t* case- and namespace-exact, and fall back to name-based removal only when\n\t* the caller could not supply the node.\n\t*\n\t* @param name an Attribute name\n\t* @param element a DOM node\n\t* @param attr the exact Attr node to remove, when the caller has it\n\t*/\n\tconst _removeAttribute = function _removeAttribute(name, element, attr) {\n\t\tif (!attr) try {\n\t\t\tattr = element.getAttributeNode(name);\n\t\t} catch (_) {\n\t\t\tattr = null;\n\t\t}\n\t\tarrayPush(DOMPurify.removed, {\n\t\t\tattribute: attr || null,\n\t\t\tfrom: element\n\t\t});\n\t\ttry {\n\t\t\tif (attr) removeAttributeNode(element, attr);\n\t\t\telse element.removeAttribute(name);\n\t\t} catch (_) {\n\t\t\ttry {\n\t\t\t\telement.removeAttribute(name);\n\t\t\t} catch (_) {}\n\t\t}\n\t\tif (name === \"is\") {\n\t\t\tif (RETURN_DOM || RETURN_DOM_FRAGMENT) try {\n\t\t\t\t_forceRemove(element);\n\t\t\t} catch (_) {}\n\t\t\telse try {\n\t\t\t\telement.setAttribute(name, \"\");\n\t\t\t} catch (_) {}\n\t\t}\n\t};\n\t/**\n\t* _stripDisallowedAttributes\n\t*\n\t* Removes every attribute the active configuration does not allow from a\n\t* single element, using the same allowlist as the main attribute pass (so\n\t* `on*` handlers go, but no `/^on/` blocklist is introduced). Used only to\n\t* neutralise nodes that are being discarded from an in-place tree.\n\t*\n\t* @param element the element to strip\n\t*/\n\tconst _stripDisallowedAttributes = function _stripDisallowedAttributes(element) {\n\t\tconst attributes = getAttributes(element);\n\t\tif (!attributes) return;\n\t\tfor (let i = attributes.length - 1; i >= 0; --i) {\n\t\t\tconst attribute = attributes[i];\n\t\t\tconst name = attribute && attribute.name;\n\t\t\tif (typeof name !== \"string\" || ALLOWED_ATTR[transformCaseFunc(name)]) continue;\n\t\t\t_stripAttributeNode(element, attribute, name);\n\t\t}\n\t};\n\t/**\n\t* _neutralizeSubtree\n\t*\n\t* Completes the audit-5 F1 fix across every removal path. The KEEP_CONTENT\n\t* move-hoist neutralises only disallowed-tag removals; clobber, mXSS-canary,\n\t* namespace, comment, processing-instruction and KEEP_CONTENT:false removals\n\t* all drop their subtree wholesale via `_forceRemove`. On the IN_PLACE path\n\t* those dropped nodes are detached from the caller's LIVE tree but a\n\t* handler-bearing original among them (an `<img onerror>`/`<video>` that was\n\t* loading) keeps its queued resource event, which fires in page scope after\n\t* sanitize returns. This walks a removed subtree and strips every attribute\n\t* the active configuration does not allow — so `on*` handlers are cancelled\n\t* through the SAME allowlist that governs kept nodes, not a separate `/^on/`\n\t* blocklist. Run synchronously before sanitize returns, i.e. before any\n\t* queued event can fire. Hook-free by design: these nodes leave the output,\n\t* so firing attribute hooks for them would be surprising. Clobber-safe reads;\n\t* a doomed clobbered node may shadow `removeAttribute` (its own attributes are\n\t* irrelevant — it is discarded — while its non-clobbered descendants, e.g.\n\t* the `<img>`, are reached and scrubbed).\n\t*\n\t* @param root the root of a removed subtree to neutralise\n\t*/\n\tconst _neutralizeSubtree = function _neutralizeSubtree(root) {\n\t\tconst stack = [root];\n\t\twhile (stack.length > 0) {\n\t\t\tconst node = stack.pop();\n\t\t\tif (_readNodeType(node) === NODE_TYPE.element) _stripDisallowedAttributes(node);\n\t\t\tconst childNodes = getChildNodes(node);\n\t\t\tif (childNodes) for (let i = childNodes.length - 1; i >= 0; --i) stack.push(childNodes[i]);\n\t\t}\n\t};\n\t/**\n\t* _neutralizePatchLinkage\n\t*\n\t* IN_PLACE entry pre-pass (declarative-partial-updates / streaming\n\t* hardening, https://github.com/WICG/declarative-partial-updates).\n\t*\n\t* The main walk strips patch linkage (`for`/`patchsrc`) and removes range\n\t* markers (PIs / markup comments) node-by-node, in document order, AS it\n\t* reaches each node. On a live in-place root that leaves a window: from the\n\t* moment the root is connected until the walk arrives at a given node, that\n\t* node's linkage is live. A patch applied on connection/stream can fire as\n\t* a microtask during the walk and inject or teleport an unsanitized DOM\n\t* range into a region the iterator has already passed and will not revisit,\n\t* so the post-return \"tree is sanitized\" contract is violated. Sweep the\n\t* whole tree once up front and sever every linkage before the walk begins,\n\t* closing that window.\n\t*\n\t* This CANNOT undo a patch that already fired before sanitize ran — that is\n\t* the irreducible \"do not IN_PLACE a live-connected attacker tree\" caveat —\n\t* but it closes everything from sanitize-start onward. Gated on SAFE_FOR_XML\n\t* to group with the rest of the declarative-partial-updates handling and\n\t* stay overridable, consistent with the codebase.\n\t*\n\t* Clobber-safe traversal (cached childNodes getter); per-node try/catch so a\n\t* clobbered root cannot defeat the sweep of its non-clobbered descendants.\n\t*\n\t* NOTE (pending real-Chrome confirmation, see test/declarative-patch-probe\n\t* .html Q1): this mirrors the existing policy of keeping `for` on\n\t* <label>/<output>. If the shipping feature can drive a patch through a\n\t* surviving `for`-on-label/output + `id` pair, this pre-pass and the\n\t* attribute check at _isBasicCustomElement's caller must additionally drop\n\t* that pair on the IN_PLACE path. Left as-is until the taxonomy is verified.\n\t*\n\t* @param root the in-place root to sweep\n\t*/\n\t/**\n\t* Central policy for declarative-partial-updates patch-linkage attributes,\n\t* shared by the _neutralizePatchLinkage pre-pass and _isValidAttribute so\n\t* the two sites cannot drift: `patchsrc` always links, `for` links\n\t* everywhere except on <label>/<output>, and the whole policy is gated on\n\t* SAFE_FOR_XML (see the rationale block in _isValidAttribute).\n\t*\n\t* @param lcName the transformCaseFunc'd attribute name\n\t* @param lcTag the transformCaseFunc'd tag name of the carrying element\n\t* @return true if the attribute is patch linkage and must be dropped\n\t*/\n\tconst _isPatchLinkageAttribute = function _isPatchLinkageAttribute(lcName, lcTag) {\n\t\tif (!SAFE_FOR_XML) return false;\n\t\tif (lcName === \"patchsrc\") return true;\n\t\treturn lcName === \"for\" && lcTag !== \"label\" && lcTag !== \"output\";\n\t};\n\tconst _neutralizePatchLinkage = function _neutralizePatchLinkage(root) {\n\t\tif (!SAFE_FOR_XML) return;\n\t\tconst stack = [root];\n\t\twhile (stack.length > 0) {\n\t\t\tconst node = stack.pop();\n\t\t\tconst nodeType = _readNodeType(node);\n\t\t\tif (nodeType === NODE_TYPE.processingInstruction || nodeType === NODE_TYPE.comment && regExpTest(COMMENT_MARKUP_PROBE, node.data)) {\n\t\t\t\ttry {\n\t\t\t\t\tremove(node);\n\t\t\t\t} catch (_) {}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (nodeType === NODE_TYPE.element) {\n\t\t\t\tconst element = node;\n\t\t\t\tconst lcTag = transformCaseFunc(_readNodeName(node));\n\t\t\t\ttry {\n\t\t\t\t\tif (element.hasAttribute && element.hasAttribute(\"patchsrc\")) element.removeAttribute(\"patchsrc\");\n\t\t\t\t\tif (element.hasAttribute && element.hasAttribute(\"for\") && _isPatchLinkageAttribute(\"for\", lcTag)) element.removeAttribute(\"for\");\n\t\t\t\t} catch (_) {}\n\t\t\t}\n\t\t\tconst childNodes = getChildNodes(node);\n\t\t\tif (childNodes) for (let i = childNodes.length - 1; i >= 0; --i) stack.push(childNodes[i]);\n\t\t}\n\t};\n\t/**\n\t* _initDocument\n\t*\n\t* @param dirty - a string of dirty markup\n\t* @return a DOM, filled with the dirty markup\n\t*/\n\tconst _initDocument = function _initDocument(dirty) {\n\t\tlet doc = null;\n\t\tlet leadingWhitespace = null;\n\t\tif (FORCE_BODY) dirty = \"<remove></remove>\" + dirty;\n\t\telse {\n\t\t\tconst matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n\t\t\tleadingWhitespace = matches && matches[0];\n\t\t}\n\t\tif (PARSER_MEDIA_TYPE === \"application/xhtml+xml\" && NAMESPACE === HTML_NAMESPACE) dirty = \"<html xmlns=\\\"http://www.w3.org/1999/xhtml\\\"><head></head><body>\" + dirty + \"</body></html>\";\n\t\tconst dirtyPayload = trustedTypesPolicy ? _createTrustedHTML(dirty) : dirty;\n\t\tif (NAMESPACE === HTML_NAMESPACE) try {\n\t\t\tdoc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n\t\t} catch (_) {}\n\t\tif (!doc || !doc.documentElement) {\n\t\t\tdoc = implementation.createDocument(NAMESPACE, \"template\", null);\n\t\t\ttry {\n\t\t\t\tdoc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;\n\t\t\t} catch (_) {}\n\t\t}\n\t\tconst body = doc.body || doc.documentElement;\n\t\tif (dirty && leadingWhitespace) body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);\n\t\tif (NAMESPACE === HTML_NAMESPACE) return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? \"html\" : \"body\")[0];\n\t\treturn WHOLE_DOCUMENT ? doc.documentElement : body;\n\t};\n\t/**\n\t* Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document.\n\t*\n\t* @param root The root element or node to start traversing on.\n\t* @return The created NodeIterator\n\t*/\n\tconst _createNodeIterator = function _createNodeIterator(root) {\n\t\tconst doc = getOwnerDocument ? getOwnerDocument(root) : root.ownerDocument;\n\t\treturn createNodeIterator.call(doc || root, root, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_PROCESSING_INSTRUCTION | NodeFilter.SHOW_CDATA_SECTION, null);\n\t};\n\t/**\n\t* Replace template expression syntax (mustache, ERB, template\n\t* literal) with a space; shared by all SAFE_FOR_TEMPLATES scrub\n\t* sites. Order matters: mustache, then ERB, then template literal.\n\t*\n\t* @param value the string to scrub\n\t* @returns the scrubbed string\n\t*/\n\tconst _stripTemplateExpressions = function _stripTemplateExpressions(value) {\n\t\tvalue = stringReplace(value, MUSTACHE_EXPR$1, \" \");\n\t\tvalue = stringReplace(value, ERB_EXPR$1, \" \");\n\t\tvalue = stringReplace(value, TMPLIT_EXPR$1, \" \");\n\t\treturn value;\n\t};\n\t/**\n\t* Strip template-engine expressions ({{...}}, ${...}, <%...%>) from the\n\t* character data of an element subtree. Used as the final safety net for\n\t* SAFE_FOR_TEMPLATES on every DOM-returning code path so that expressions\n\t* which only form after text-node normalization (e.g. fragments split across\n\t* stripped elements) cannot survive into a template-evaluating framework.\n\t*\n\t* Walks text/comment/CDATA/processing-instruction nodes and mutates `.data`\n\t* in place rather than round-tripping through innerHTML. This preserves\n\t* descendant node references (important for IN_PLACE callers), avoids a\n\t* serialize/reparse cycle, and reads literal character data — which means\n\t* `<%...%>` in text content matches the ERB regex against its real bytes\n\t* instead of the HTML-entity-escaped form innerHTML would produce.\n\t*\n\t* Attribute values are not visited here; SAFE_FOR_TEMPLATES handling for\n\t* attributes is performed during the per-node `_sanitizeAttributes` pass.\n\t*\n\t* @param node The root element whose character data should be scrubbed.\n\t*/\n\tconst _scrubTemplateExpressions2 = function _scrubTemplateExpressions(node) {\n\t\tvar _node$querySelectorAl;\n\t\tnode.normalize();\n\t\tconst doc = getOwnerDocument ? getOwnerDocument(node) : node.ownerDocument;\n\t\tconst walker = createNodeIterator.call(doc || node, node, NodeFilter.SHOW_TEXT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_CDATA_SECTION | NodeFilter.SHOW_PROCESSING_INSTRUCTION, null);\n\t\tlet currentNode = walker.nextNode();\n\t\twhile (currentNode) {\n\t\t\tcurrentNode.data = _stripTemplateExpressions(currentNode.data);\n\t\t\tcurrentNode = walker.nextNode();\n\t\t}\n\t\tconst templates = (_node$querySelectorAl = node.querySelectorAll) === null || _node$querySelectorAl === void 0 ? void 0 : _node$querySelectorAl.call(node, \"template\");\n\t\tif (templates) arrayForEach(templates, (tmpl) => {\n\t\t\tif (_isDocumentFragment(tmpl.content)) _scrubTemplateExpressions2(tmpl.content);\n\t\t});\n\t};\n\t/**\n\t* _isClobbered\n\t*\n\t* Detect DOM-clobbering on HTMLFormElement nodes. Form is the only HTML\n\t* interface with [LegacyOverrideBuiltIns]; a descendant element with a\n\t* `name` attribute matching a prototype property shadows that property\n\t* on direct reads. We use this check at the IN_PLACE entry-point and\n\t* during attribute sanitization to refuse clobbered forms.\n\t*\n\t* @param element element to check for clobbering attacks\n\t* @return true if clobbered, false if safe\n\t*/\n\tconst _isClobbered = function _isClobbered(element) {\n\t\tconst realTagName = getNodeName ? getNodeName(element) : null;\n\t\tif (typeof realTagName !== \"string\") return false;\n\t\tif (transformCaseFunc(realTagName) !== \"form\") return false;\n\t\treturn typeof element.nodeName !== \"string\" || typeof element.textContent !== \"string\" || typeof element.removeChild !== \"function\" || element.attributes !== getAttributes(element) || typeof element.removeAttribute !== \"function\" || typeof element.removeAttributeNode !== \"function\" || typeof element.getAttributeNode !== \"function\" || typeof element.setAttribute !== \"function\" || typeof element.namespaceURI !== \"string\" || typeof element.insertBefore !== \"function\" || typeof element.hasChildNodes !== \"function\" || element.nodeType !== getNodeType(element) || element.childNodes !== getChildNodes(element);\n\t};\n\t/**\n\t* Checks whether the given value is a DocumentFragment from any realm.\n\t*\n\t* The realm-independent replacement reads `nodeType` through the cached\n\t* Node.prototype getter and compares to the DOCUMENT_FRAGMENT_NODE\n\t* constant (11). nodeType is a numeric value resolved from the node's\n\t* internal slot, identical across realms for the same kind of node.\n\t*\n\t* @param value object to check\n\t* @return true if value is a DocumentFragment-shaped node from any realm\n\t*/\n\tconst _isDocumentFragment = function _isDocumentFragment(value) {\n\t\tif (!getNodeType || typeof value !== \"object\" || value === null) return false;\n\t\ttry {\n\t\t\treturn getNodeType(value) === NODE_TYPE.documentFragment;\n\t\t} catch (_) {\n\t\t\treturn false;\n\t\t}\n\t};\n\t/**\n\t* Checks whether the given object is a DOM node, including nodes that\n\t* originate from a different window/realm (e.g. an iframe's\n\t* contentDocument). The previous `value instanceof Node` check was\n\t* realm-bound: nodes from a different window failed it, causing\n\t* sanitize() to silently stringify them and reset IN_PLACE to false,\n\t* returning the original node unsanitized. See GHSA-4w3q-35jp-p934.\n\t*\n\t* @param value object to check whether it's a DOM node\n\t* @return true if value is a DOM node from any realm\n\t*/\n\tconst _isNode = function _isNode(value) {\n\t\tif (!getNodeType || typeof value !== \"object\" || value === null) return false;\n\t\ttry {\n\t\t\treturn typeof getNodeType(value) === \"number\";\n\t\t} catch (_) {\n\t\t\treturn false;\n\t\t}\n\t};\n\tfunction _executeHooks(hooks, currentNode, data) {\n\t\tif (hooks.length === 0) return;\n\t\tarrayForEach(hooks, (hook) => {\n\t\t\thook.call(DOMPurify, currentNode, data, CONFIG);\n\t\t});\n\t}\n\t/**\n\t* Structural-threat checks that condemn a node regardless of the\n\t* allowlists: mXSS via namespace confusion, risky CSS construction,\n\t* processing instructions, markup-bearing comments. Pure predicate;\n\t* the caller removes. Check order is load-bearing.\n\t*\n\t* @param currentNode the node to inspect\n\t* @param tagName the node's transformCaseFunc'd tag name\n\t* @return true if the node must be removed\n\t*/\n\tconst _isUnsafeNode = function _isUnsafeNode(currentNode, tagName) {\n\t\tif (SAFE_FOR_XML && currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(ELEMENT_MARKUP_PROBE, currentNode.textContent) && regExpTest(ELEMENT_MARKUP_PROBE, currentNode.innerHTML)) return true;\n\t\tif (SAFE_FOR_XML && currentNode.namespaceURI === HTML_NAMESPACE && LITERAL_TEXT_ELEMENTS[tagName] && (_isNode(currentNode.firstElementChild) || typeof currentNode.textContent === \"string\" && regExpTest(LITERAL_TEXT_CLOSE[tagName], currentNode.textContent))) return true;\n\t\tif (currentNode.nodeType === NODE_TYPE.processingInstruction) return true;\n\t\tif (SAFE_FOR_XML && currentNode.nodeType === NODE_TYPE.comment && regExpTest(COMMENT_MARKUP_PROBE, currentNode.data)) return true;\n\t\treturn false;\n\t};\n\t/**\n\t* Evaluate a CUSTOM_ELEMENT_HANDLING check (a RegExp or a predicate\n\t* function, per the validation in _parseConfig) against a name.\n\t* Additional arguments are forwarded to predicate functions - the\n\t* attributeNameCheck predicate receives the tag name as its second\n\t* argument. A null/absent check never matches.\n\t*\n\t* @param check the configured tagNameCheck / attributeNameCheck value\n\t* @param name the name to test\n\t* @param args extra arguments forwarded to a predicate function\n\t* @return true if the check matches the name\n\t*/\n\tconst _matchesNameCheck = function _matchesNameCheck(check, name) {\n\t\tif (check instanceof RegExp) return regExpTest(check, name);\n\t\tif (check instanceof Function) {\n\t\t\tfor (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) args[_key - 2] = arguments[_key];\n\t\t\treturn Boolean(check(name, ...args));\n\t\t}\n\t\treturn false;\n\t};\n\t/**\n\t* Handle a node whose tag is forbidden or not allowlisted: keep\n\t* allowed custom elements (false return exits _sanitizeElements\n\t* early - the namespace and fallback-tag removal checks are\n\t* intentionally skipped for kept custom elements), else hoist\n\t* content per KEEP_CONTENT and remove.\n\t*\n\t* A kept custom element is the ONLY case in which this function\n\t* returns false, so the caller uses that return value to run the\n\t* afterSanitizeElements hook on the kept element and keep the\n\t* element-hook lifecycle consistent with normal allowlisted\n\t* elements (GHSA-c2j3-45gr-mqc4).\n\t*\n\t* @param currentNode the disallowed node\n\t* @param tagName the node's transformCaseFunc'd tag name\n\t* @return true if the node was removed, false if kept\n\t*/\n\tconst _sanitizeDisallowedNode = function _sanitizeDisallowedNode(currentNode, tagName, root) {\n\t\tif (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName) && _matchesNameCheck(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) return false;\n\t\tif (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\n\t\t\tconst parentNode = getParentNode(currentNode);\n\t\t\tconst childNodes = getChildNodes(currentNode);\n\t\t\tif (childNodes && parentNode) {\n\t\t\t\tconst childCount = childNodes.length;\n\t\t\t\tfor (let i = childCount - 1; i >= 0; --i) {\n\t\t\t\t\tconst hoisted = currentNode === root ? cloneNode(childNodes[i], true) : childNodes[i];\n\t\t\t\t\tparentNode.insertBefore(hoisted, getNextSibling(currentNode));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t_forceRemove(currentNode);\n\t\treturn true;\n\t};\n\t/**\n\t* Fork a hook-mutable allowlist off its shared binding the first time a\n\t* (possibly lazily-installed) uponSanitize* hook is about to see it, so the\n\t* hook cannot widen the per-instance default or the setConfig binding by\n\t* reference and leak past the call. Returns the set unchanged once it is\n\t* already call-local, so repeated calls across elements are idempotent.\n\t*\n\t* @param hookList the uponSanitize* hook array for this event\n\t* @param set the current ALLOWED_TAGS / ALLOWED_ATTR binding\n\t* @param defaultSet the per-instance DEFAULT_ALLOWED_* constant\n\t* @param setConfigSet the captured setConfig() binding, or null\n\t* @return a call-local clone if a hook is present and set is still shared,\n\t* else set unchanged\n\t*/\n\tconst _forkSharedAllowlist = function _forkSharedAllowlist(hookList, set, defaultSet, setConfigSet) {\n\t\tif (hookList.length === 0) return set;\n\t\treturn set === defaultSet || set === setConfigSet ? clone(set) : set;\n\t};\n\t/**\n\t* Shared guard for a node that a hook has detached from the walk tree,\n\t* used after each element-hook site in _sanitizeElements. Detaching is a\n\t* long-standing user pattern (issue #469; draw.io-style foreignObject\n\t* filtering). Per the cached, unclobberable parentNode getter the node is\n\t* genuinely out of the tree, so it can reach neither the serialized\n\t* output nor an IN_PLACE live tree; treat it as removed and stop\n\t* processing it. Without this guard, the unsafe-node / namespace checks\n\t* would call _forceRemove on a parentless node and hit the REPORT-3\n\t* fail-closed throw — which exists for nodes DOMPurify wants gone but\n\t* *cannot* detach (clobbered / parentless roots), the opposite of a node\n\t* that is already safely gone. The walk root is exempt: a detached\n\t* IN_PLACE root is legitimate input and must still be fully sanitized,\n\t* and a kill-decision on it must keep hitting the REPORT-3 throw.\n\t*\n\t* Nodes detached by hooks stay the hook's responsibility for placement:\n\t* they are not recorded in DOMPurify.removed, so the post-walk IN_PLACE\n\t* pass (which iterates DOMPurify.removed) does not reach them. But a\n\t* hook-detached subtree can still hold a queued resource-event handler -\n\t* e.g. an <img onload> that began loading when the caller built the live\n\t* tree - which fires in page scope after sanitize returns even though the\n\t* handler never reached the returned tree. That is the audit-5 F1 hazard,\n\t* and the documented node.remove() hook pattern walks straight into it.\n\t* So on the IN_PLACE path we neutralize the detached subtree inline,\n\t* stripping its non-allow-listed attributes before returning, exactly as\n\t* the post-walk pass does for _forceRemove'd subtrees.\n\t*\n\t* @param currentNode the node a hook may have detached\n\t* @param root the current walk root\n\t* @return true if the node is detached and now handled, false otherwise\n\t*/\n\tconst _handleHookDetachedNode = function _handleHookDetachedNode(currentNode, root) {\n\t\tif (currentNode === root || getParentNode(currentNode) !== null) return false;\n\t\tif (IN_PLACE) _neutralizeSubtree(currentNode);\n\t\treturn true;\n\t};\n\t/**\n\t* _sanitizeElements\n\t*\n\t* @protect nodeName\n\t* @protect textContent\n\t* @protect removeChild\n\t* @param currentNode to check for permission to exist\n\t* @return true if node was killed, false if left alive\n\t*/\n\tconst _sanitizeElements = function _sanitizeElements(currentNode, root) {\n\t\t_executeHooks(hooks.beforeSanitizeElements, currentNode, null);\n\t\tif (_handleHookDetachedNode(currentNode, root)) return true;\n\t\tif (_isClobbered(currentNode)) {\n\t\t\t_forceRemove(currentNode);\n\t\t\treturn true;\n\t\t}\n\t\tconst tagName = transformCaseFunc(_readNodeName(currentNode));\n\t\tALLOWED_TAGS = _forkSharedAllowlist(hooks.uponSanitizeElement, ALLOWED_TAGS, DEFAULT_ALLOWED_TAGS, SET_CONFIG_ALLOWED_TAGS);\n\t\t_executeHooks(hooks.uponSanitizeElement, currentNode, {\n\t\t\ttagName,\n\t\t\tallowedTags: ALLOWED_TAGS\n\t\t});\n\t\tif (_handleHookDetachedNode(currentNode, root)) return true;\n\t\tif (_isUnsafeNode(currentNode, tagName)) {\n\t\t\t_forceRemove(currentNode);\n\t\t\treturn true;\n\t\t}\n\t\tif (FORBID_TAGS[tagName] || !(EXTRA_ELEMENT_HANDLING.tagCheck instanceof Function && EXTRA_ELEMENT_HANDLING.tagCheck(tagName)) && !ALLOWED_TAGS[tagName]) {\n\t\t\tconst removed = _sanitizeDisallowedNode(currentNode, tagName, root);\n\t\t\tif (removed === false) {\n\t\t\t\t_executeHooks(hooks.afterSanitizeElements, currentNode, null);\n\t\t\t\tif (_handleHookDetachedNode(currentNode, root)) return true;\n\t\t\t}\n\t\t\treturn removed;\n\t\t}\n\t\tif (_readNodeType(currentNode) === NODE_TYPE.element && !_checkValidNamespace(currentNode)) {\n\t\t\t_forceRemove(currentNode);\n\t\t\treturn true;\n\t\t}\n\t\tif ((tagName === \"noscript\" || tagName === \"noembed\" || tagName === \"noframes\") && regExpTest(FALLBACK_TAG_CLOSE, currentNode.innerHTML)) {\n\t\t\t_forceRemove(currentNode);\n\t\t\treturn true;\n\t\t}\n\t\tif (SAFE_FOR_TEMPLATES && currentNode.nodeType === NODE_TYPE.text) {\n\t\t\tconst content = _stripTemplateExpressions(currentNode.textContent);\n\t\t\tif (currentNode.textContent !== content) {\n\t\t\t\tarrayPush(DOMPurify.removed, { element: currentNode.cloneNode() });\n\t\t\t\tcurrentNode.textContent = content;\n\t\t\t}\n\t\t}\n\t\t_executeHooks(hooks.afterSanitizeElements, currentNode, null);\n\t\treturn _handleHookDetachedNode(currentNode, root);\n\t};\n\t/**\n\t* _isValidAttribute\n\t*\n\t* @param lcTag Lowercase tag name of containing element.\n\t* @param lcName Lowercase attribute name.\n\t* @param value Attribute value.\n\t* @return Returns true if `value` is valid, otherwise false.\n\t*/\n\tconst _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {\n\t\tif (FORBID_ATTR[lcName]) return false;\n\t\tif (_isPatchLinkageAttribute(lcName, lcTag)) return false;\n\t\tif (SANITIZE_DOM && (lcName === \"id\" || lcName === \"name\") && (value in document || value in formElement)) return false;\n\t\tconst nameIsPermitted = ALLOWED_ATTR[lcName] || EXTRA_ELEMENT_HANDLING.attributeCheck instanceof Function && EXTRA_ELEMENT_HANDLING.attributeCheck(lcName, lcTag);\n\t\tif (ALLOW_DATA_ATTR && regExpTest(DATA_ATTR$1, lcName)) return true;\n\t\tif (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR$1, lcName)) return true;\n\t\tif (!nameIsPermitted) return _isBasicCustomElement(lcTag) && _matchesNameCheck(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) && _matchesNameCheck(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName, lcTag) || lcName === \"is\" && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && _matchesNameCheck(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value);\n\t\tif (URI_SAFE_ATTRIBUTES[lcName]) return true;\n\t\tif (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE$1, \"\"))) return true;\n\t\tif ((lcName === \"src\" || lcName === \"xlink:href\" || lcName === \"href\") && lcTag !== \"script\" && stringIndexOf(value, \"data:\") === 0 && DATA_URI_TAGS[lcTag]) return true;\n\t\tif (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA$1, stringReplace(value, ATTR_WHITESPACE$1, \"\"))) return true;\n\t\treturn !value;\n\t};\n\tconst RESERVED_CUSTOM_ELEMENT_NAMES = addToSet({}, [\n\t\t\"annotation-xml\",\n\t\t\"color-profile\",\n\t\t\"font-face\",\n\t\t\"font-face-format\",\n\t\t\"font-face-name\",\n\t\t\"font-face-src\",\n\t\t\"font-face-uri\",\n\t\t\"missing-glyph\"\n\t]);\n\t/**\n\t* _isBasicCustomElement\n\t* checks if at least one dash is included in tagName, and it's not the first char\n\t* for more sophisticated checking see https://github.com/sindresorhus/validate-element-name\n\t*\n\t* @param tagName name of the tag of the node to sanitize\n\t* @returns Returns true if the tag name meets the basic criteria for a custom element, otherwise false.\n\t*/\n\tconst _isBasicCustomElement = function _isBasicCustomElement(tagName) {\n\t\treturn !RESERVED_CUSTOM_ELEMENT_NAMES[stringToLowerCase(tagName)] && regExpTest(CUSTOM_ELEMENT$1, tagName);\n\t};\n\t/**\n\t* Wrap an attribute value in the matching Trusted Types object when\n\t* the active policy requires it. Namespaced attributes pass through\n\t* unchanged (no TT support yet, see\n\t* https://bugs.chromium.org/p/chromium/issues/detail?id=1305293).\n\t*\n\t* @param lcTag lowercase tag name of the containing element\n\t* @param lcName lowercase attribute name\n\t* @param namespaceURI the attribute's namespace, if any\n\t* @param value the attribute value to wrap\n\t* @return the value, wrapped when Trusted Types demand it\n\t*/\n\tconst _applyTrustedTypesToAttribute = function _applyTrustedTypesToAttribute(lcTag, lcName, namespaceURI, value) {\n\t\tif (trustedTypesPolicy && typeof trustedTypes === \"object\" && typeof trustedTypes.getAttributeType === \"function\" && !namespaceURI) switch (trustedTypes.getAttributeType(lcTag, lcName)) {\n\t\t\tcase \"TrustedHTML\": return _createTrustedHTML(value);\n\t\t\tcase \"TrustedScriptURL\": return _createTrustedScriptURL(value);\n\t\t}\n\t\treturn value;\n\t};\n\t/**\n\t* Write a modified attribute value back onto the element. On\n\t* success, re-probe for clobbering introduced by the new value and\n\t* remove the element when found; otherwise, when this writeback is the\n\t* recreate half of the SANITIZE_NAMED_PROPS remove-and-recreate, pop the\n\t* removal entry that path recorded so it does not show as removed. On\n\t* failure, remove the attribute instead.\n\t*\n\t* Returns true only on a clean write (the value was set and the new value\n\t* introduced no clobbering). The caller uses that, together with its own\n\t* knowledge of whether this attribute pushed a DOMPurify.removed record, to\n\t* decide whether to pop that record. The pop must happen ONLY for the\n\t* named-prop remove-and-recreate; popping on any other value change (trim,\n\t* template scrubbing, Trusted Types) would consume an unrelated _forceRemove\n\t* subtree-cleanup record and let that detached subtree keep a live event\n\t* handler through the IN_PLACE neutralization pass (SO-001).\n\t*\n\t* @param currentNode the element carrying the attribute\n\t* @param name the attribute name as present on the element\n\t* @param namespaceURI the attribute's namespace, if any\n\t* @param value the new attribute value\n\t* @return true if the value was written without introducing clobbering\n\t*/\n\tconst _setAttributeValue = function _setAttributeValue(currentNode, name, namespaceURI, value) {\n\t\ttry {\n\t\t\tif (namespaceURI) currentNode.setAttributeNS(namespaceURI, name, value);\n\t\t\telse currentNode.setAttribute(name, value);\n\t\t\tif (_isClobbered(currentNode)) {\n\t\t\t\t_forceRemove(currentNode);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t} catch (_) {\n\t\t\t_removeAttribute(name, currentNode);\n\t\t\treturn false;\n\t\t}\n\t};\n\t/**\n\t* _sanitizeAttributes\n\t*\n\t* @protect attributes\n\t* @protect nodeName\n\t* @protect removeAttribute\n\t* @protect setAttribute\n\t*\n\t* @param currentNode to sanitize\n\t* @param root the current walk root\n\t*/\n\tconst _sanitizeAttributes = function _sanitizeAttributes(currentNode, root) {\n\t\t_executeHooks(hooks.beforeSanitizeAttributes, currentNode, null);\n\t\tif (_handleHookDetachedNode(currentNode, root)) return;\n\t\tconst attributes = currentNode.attributes;\n\t\tif (!attributes || _isClobbered(currentNode)) return;\n\t\tALLOWED_ATTR = _forkSharedAllowlist(hooks.uponSanitizeAttribute, ALLOWED_ATTR, DEFAULT_ALLOWED_ATTR, SET_CONFIG_ALLOWED_ATTR);\n\t\tconst hookEvent = {\n\t\t\tattrName: \"\",\n\t\t\tattrValue: \"\",\n\t\t\tkeepAttr: true,\n\t\t\tallowedAttributes: ALLOWED_ATTR,\n\t\t\tforceKeepAttr: void 0\n\t\t};\n\t\tlet l = attributes.length;\n\t\tconst lcTag = transformCaseFunc(currentNode.nodeName);\n\t\twhile (l--) {\n\t\t\tconst attr = attributes[l];\n\t\t\tconst name = attr.name, namespaceURI = attr.namespaceURI, attrValue = attr.value;\n\t\t\tconst lcName = transformCaseFunc(name);\n\t\t\tconst initValue = attrValue;\n\t\t\tlet value = name === \"value\" ? initValue : stringTrim(initValue);\n\t\t\tlet recreatedNamedProp = false;\n\t\t\thookEvent.attrName = lcName;\n\t\t\thookEvent.attrValue = value;\n\t\t\thookEvent.keepAttr = true;\n\t\t\thookEvent.forceKeepAttr = void 0;\n\t\t\t_executeHooks(hooks.uponSanitizeAttribute, currentNode, hookEvent);\n\t\t\tvalue = hookEvent.attrValue;\n\t\t\tif (SANITIZE_NAMED_PROPS && (lcName === \"id\" || lcName === \"name\") && stringIndexOf(value, SANITIZE_NAMED_PROPS_PREFIX) !== 0) {\n\t\t\t\t_removeAttribute(name, currentNode, attr);\n\t\t\t\tvalue = SANITIZE_NAMED_PROPS_PREFIX + value;\n\t\t\t\trecreatedNamedProp = true;\n\t\t\t}\n\t\t\tif (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i, value)) {\n\t\t\t\t_removeAttribute(name, currentNode, attr);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (lcName === \"attributename\" && stringMatch(value, \"href\")) {\n\t\t\t\t_removeAttribute(name, currentNode, attr);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (hookEvent.forceKeepAttr) continue;\n\t\t\tif (!hookEvent.keepAttr) {\n\t\t\t\t_removeAttribute(name, currentNode, attr);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(SELF_CLOSING_TAG, value)) {\n\t\t\t\t_removeAttribute(name, currentNode, attr);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (SAFE_FOR_TEMPLATES) value = _stripTemplateExpressions(value);\n\t\t\tif (!_isValidAttribute(lcTag, lcName, value)) {\n\t\t\t\t_removeAttribute(name, currentNode, attr);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvalue = _applyTrustedTypesToAttribute(lcTag, lcName, namespaceURI, value);\n\t\t\tif (value !== initValue) {\n\t\t\t\tif (_setAttributeValue(currentNode, name, namespaceURI, value) && recreatedNamedProp) arrayPop(DOMPurify.removed);\n\t\t\t}\n\t\t}\n\t\t_executeHooks(hooks.afterSanitizeAttributes, currentNode, null);\n\t\t_handleHookDetachedNode(currentNode, root);\n\t};\n\t/**\n\t* _sanitizeShadowDOM\n\t*\n\t* @param fragment to iterate over recursively\n\t*/\n\tconst _sanitizeShadowDOM2 = function _sanitizeShadowDOM(fragment) {\n\t\tlet shadowNode = null;\n\t\tconst shadowIterator = _createNodeIterator(fragment);\n\t\t_executeHooks(hooks.beforeSanitizeShadowDOM, fragment, null);\n\t\twhile (shadowNode = shadowIterator.nextNode()) {\n\t\t\t_executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null);\n\t\t\t_sanitizeElements(shadowNode, fragment);\n\t\t\t_sanitizeAttributes(shadowNode, fragment);\n\t\t\tif (_isDocumentFragment(shadowNode.content)) _sanitizeShadowDOM2(shadowNode.content);\n\t\t\tif (_readNodeType(shadowNode) === NODE_TYPE.element) {\n\t\t\t\tconst innerSr = getShadowRoot(shadowNode);\n\t\t\t\tif (_isDocumentFragment(innerSr)) {\n\t\t\t\t\t_sanitizeAttachedShadowRoots(innerSr);\n\t\t\t\t\t_sanitizeShadowDOM2(innerSr);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t_executeHooks(hooks.afterSanitizeShadowDOM, fragment, null);\n\t};\n\t/**\n\t* _sanitizeAttachedShadowRoots\n\t*\n\t* Walks `root` and feeds every attached shadow root we encounter into\n\t* the existing _sanitizeShadowDOM pipeline. The default node iterator\n\t* does not descend into shadow trees, so nodes inside an attached\n\t* shadow root would otherwise be skipped entirely.\n\t*\n\t* Two real input paths put attached shadow roots in front of us:\n\t* 1. IN_PLACE on a DOM node that already has shadow roots attached.\n\t* 2. DOM-node input where importNode(dirty, true) deep-clones the\n\t* shadow root because it was created with `clonable: true`.\n\t*\n\t* This pass runs once, up front, so the main iteration loop (and the\n\t* existing _sanitizeShadowDOM template-content recursion) stay\n\t* untouched — string-input paths are not affected.\n\t*\n\t* @param root the subtree root to walk for attached shadow roots\n\t*/\n\tconst _sanitizeAttachedShadowRoots = function _sanitizeAttachedShadowRoots(root) {\n\t\tconst stack = [{\n\t\t\tnode: root,\n\t\t\tshadow: null\n\t\t}];\n\t\twhile (stack.length > 0) {\n\t\t\tconst item = stack.pop();\n\t\t\tif (item.shadow) {\n\t\t\t\t_sanitizeShadowDOM2(item.shadow);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst node = item.node;\n\t\t\tconst isElement = _readNodeType(node) === NODE_TYPE.element;\n\t\t\tconst childNodes = getChildNodes(node);\n\t\t\tif (childNodes) for (let i = childNodes.length - 1; i >= 0; --i) stack.push({\n\t\t\t\tnode: childNodes[i],\n\t\t\t\tshadow: null\n\t\t\t});\n\t\t\tif (isElement) {\n\t\t\t\tconst rootName = getNodeName ? getNodeName(node) : null;\n\t\t\t\tif (typeof rootName === \"string\" && transformCaseFunc(rootName) === \"template\") {\n\t\t\t\t\tconst content = node.content;\n\t\t\t\t\tif (_isDocumentFragment(content)) stack.push({\n\t\t\t\t\t\tnode: content,\n\t\t\t\t\t\tshadow: null\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (isElement) {\n\t\t\t\tconst sr = getShadowRoot(node);\n\t\t\t\tif (_isDocumentFragment(sr)) stack.push({\n\t\t\t\t\tnode: null,\n\t\t\t\t\tshadow: sr\n\t\t\t\t}, {\n\t\t\t\t\tnode: sr,\n\t\t\t\t\tshadow: null\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t};\n\tDOMPurify.sanitize = function(dirty) {\n\t\tlet cfg = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};\n\t\tlet body = null;\n\t\tlet importedNode = null;\n\t\tlet currentNode = null;\n\t\tlet returnNode = null;\n\t\tIS_EMPTY_INPUT = !dirty;\n\t\tif (IS_EMPTY_INPUT) dirty = \"<!-->\";\n\t\tif (typeof dirty !== \"string\" && !_isNode(dirty)) {\n\t\t\tdirty = stringifyValue(dirty);\n\t\t\tif (typeof dirty !== \"string\") throw typeErrorCreate(\"dirty is not a string, aborting\");\n\t\t}\n\t\tif (!DOMPurify.isSupported) return dirty;\n\t\tif (SET_CONFIG) {\n\t\t\tALLOWED_TAGS = SET_CONFIG_ALLOWED_TAGS;\n\t\t\tALLOWED_ATTR = SET_CONFIG_ALLOWED_ATTR;\n\t\t} else _parseConfig(cfg);\n\t\tif (hooks.uponSanitizeElement.length > 0 || hooks.uponSanitizeAttribute.length > 0) ALLOWED_TAGS = clone(ALLOWED_TAGS);\n\t\tif (hooks.uponSanitizeAttribute.length > 0) ALLOWED_ATTR = clone(ALLOWED_ATTR);\n\t\tDOMPurify.removed = [];\n\t\tconst inPlace = IN_PLACE && typeof dirty !== \"string\" && _isNode(dirty);\n\t\tif (inPlace) {\n\t\t\t_neutralizePatchLinkage(dirty);\n\t\t\tconst nn = _readNodeName(dirty);\n\t\t\tif (typeof nn === \"string\") {\n\t\t\t\tconst tagName = transformCaseFunc(nn);\n\t\t\t\tif (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n\t\t\t\t\t_neutralizeRoot(dirty);\n\t\t\t\t\tthrow typeErrorCreate(\"root node is forbidden and cannot be sanitized in-place\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (_isClobbered(dirty)) {\n\t\t\t\t_neutralizeRoot(dirty);\n\t\t\t\tthrow typeErrorCreate(\"root node is clobbered and cannot be sanitized in-place\");\n\t\t\t}\n\t\t\ttry {\n\t\t\t\t_sanitizeAttachedShadowRoots(dirty);\n\t\t\t} catch (error) {\n\t\t\t\t_neutralizeRoot(dirty);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t} else if (_isNode(dirty)) {\n\t\t\tbody = _initDocument(\"<!---->\");\n\t\t\timportedNode = body.ownerDocument.importNode(dirty, true);\n\t\t\tif (importedNode.nodeType === NODE_TYPE.element && importedNode.nodeName === \"BODY\") body = importedNode;\n\t\t\telse if (importedNode.nodeName === \"HTML\") body = importedNode;\n\t\t\telse body.appendChild(importedNode);\n\t\t\t_sanitizeAttachedShadowRoots(body);\n\t\t} else {\n\t\t\tif (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT && dirty.indexOf(\"<\") === -1) return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? _createTrustedHTML(dirty) : dirty;\n\t\t\tbody = _initDocument(dirty);\n\t\t\tif (!body) return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : \"\";\n\t\t}\n\t\tif (body && FORCE_BODY) _forceRemove(body.firstChild);\n\t\tconst walkRoot = inPlace ? dirty : body;\n\t\ttry {\n\t\t\tconst nodeIterator = _createNodeIterator(walkRoot);\n\t\t\twhile (currentNode = nodeIterator.nextNode()) {\n\t\t\t\t_sanitizeElements(currentNode, walkRoot);\n\t\t\t\t_sanitizeAttributes(currentNode, walkRoot);\n\t\t\t\tif (_isDocumentFragment(currentNode.content)) _sanitizeShadowDOM2(currentNode.content);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (inPlace) {\n\t\t\t\t_neutralizeRoot(dirty);\n\t\t\t\tarrayForEach(DOMPurify.removed, (entry) => {\n\t\t\t\t\tif (entry.element) _neutralizeSubtree(entry.element);\n\t\t\t\t});\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t\tif (inPlace) {\n\t\t\tlet rootWasRemoved = false;\n\t\t\tarrayForEach(DOMPurify.removed, (entry) => {\n\t\t\t\tif (entry.element) {\n\t\t\t\t\tif (entry.element === dirty) rootWasRemoved = true;\n\t\t\t\t\t_neutralizeSubtree(entry.element);\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (rootWasRemoved) throw typeErrorCreate(\"a node selected for removal could not be safely returned; refusing to sanitize in place\");\n\t\t\tif (SAFE_FOR_TEMPLATES) _scrubTemplateExpressions2(dirty);\n\t\t\treturn dirty;\n\t\t}\n\t\tif (RETURN_DOM) {\n\t\t\tif (SAFE_FOR_TEMPLATES) _scrubTemplateExpressions2(body);\n\t\t\tif (RETURN_DOM_FRAGMENT) {\n\t\t\t\treturnNode = createDocumentFragment.call(body.ownerDocument);\n\t\t\t\twhile (body.firstChild) returnNode.appendChild(body.firstChild);\n\t\t\t} else returnNode = body;\n\t\t\tif (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) returnNode = importNode.call(originalDocument, returnNode, true);\n\t\t\treturn returnNode;\n\t\t}\n\t\tlet serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\n\t\tif (WHOLE_DOCUMENT && ALLOWED_TAGS[\"!doctype\"] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) serializedHTML = \"<!DOCTYPE \" + body.ownerDocument.doctype.name + \">\\n\" + serializedHTML;\n\t\tif (SAFE_FOR_TEMPLATES) serializedHTML = _stripTemplateExpressions(serializedHTML);\n\t\treturn trustedTypesPolicy && RETURN_TRUSTED_TYPE ? _createTrustedHTML(serializedHTML) : serializedHTML;\n\t};\n\tDOMPurify.setConfig = function() {\n\t\tlet cfg = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};\n\t\t_parseConfig(cfg);\n\t\tSET_CONFIG = true;\n\t\tSET_CONFIG_ALLOWED_TAGS = ALLOWED_TAGS;\n\t\tSET_CONFIG_ALLOWED_ATTR = ALLOWED_ATTR;\n\t};\n\tDOMPurify.clearConfig = function() {\n\t\tCONFIG = null;\n\t\tSET_CONFIG = false;\n\t\tSET_CONFIG_ALLOWED_TAGS = null;\n\t\tSET_CONFIG_ALLOWED_ATTR = null;\n\t\ttrustedTypesPolicy = defaultTrustedTypesPolicy;\n\t\temptyHTML = \"\";\n\t};\n\tDOMPurify.isValidAttribute = function(tag, attr, value) {\n\t\tif (!CONFIG) _parseConfig({});\n\t\tconst lcTag = transformCaseFunc(tag);\n\t\tconst lcName = transformCaseFunc(attr);\n\t\treturn _isValidAttribute(lcTag, lcName, value);\n\t};\n\tDOMPurify.addHook = function(entryPoint, hookFunction) {\n\t\tif (typeof hookFunction !== \"function\") return;\n\t\tif (!objectHasOwnProperty(hooks, entryPoint)) return;\n\t\tarrayPush(hooks[entryPoint], hookFunction);\n\t};\n\tDOMPurify.removeHook = function(entryPoint, hookFunction) {\n\t\tif (!objectHasOwnProperty(hooks, entryPoint)) return;\n\t\tif (hookFunction !== void 0) {\n\t\t\tconst index = arrayLastIndexOf(hooks[entryPoint], hookFunction);\n\t\t\treturn index === -1 ? void 0 : arraySplice(hooks[entryPoint], index, 1)[0];\n\t\t}\n\t\treturn arrayPop(hooks[entryPoint]);\n\t};\n\tDOMPurify.removeHooks = function(entryPoint) {\n\t\tif (!objectHasOwnProperty(hooks, entryPoint)) return;\n\t\thooks[entryPoint] = [];\n\t};\n\tDOMPurify.removeAllHooks = function() {\n\t\thooks = _createHooksMap();\n\t};\n\treturn DOMPurify;\n}\nvar purify_default = createDOMPurify();\nexport { purify_default as default };\n\n//# sourceMappingURL=purify.es.mjs.map","class Tool {\n constructor(editor, title) {\n this.editor = editor;\n this.defaultText = `${title} text`; // Default text if nothing is selected\n this.button = this.createButton();\n this.title = title\n }\n\n // Create a button element (can be overridden in child classes)\n createButton(iconHtml) {\n const btn = document.createElement('button');\n const btnClass = this.title ? `${this.title.replace(/ /g, '-')}-btn`.toLowerCase() : '';\n btn.innerHTML = iconHtml;\n const svg = btn.querySelector('svg');\n if (svg) svg.setAttribute('aria-hidden', 'true');\n btn.type = 'button';\n // The class stays keyed on the English title so styling and tests are\n // unaffected by translation; only what the user sees is translated.\n btn.title = this.title ? this.editor.label(this.title) : this.title;\n btn.className = `markdown-btn ${btnClass} fj:me-btn fj:me-btn-xs fj:me-btn-square fj:me-btn-ghost`;\n btn.addEventListener('click', (event) => this.applySyntax(event)); // Default to 'both', can change in child\n\n if(btnClass == 'preview-btn') {\n const btnWrapper = document.createElement('div');\n btnWrapper.className = 'fj:me-surface fj:me-surface-outline fj:border-base-soft fj:border-0 fj:border-l fj:sticky fj:-right-2 fj:px-1.5';\n btnWrapper.appendChild(btn);\n return btnWrapper;\n }\n \n return btn;\n }\n}\n\nexport default Tool;\n","import Tool from '../Tool.js';\n\nclass BoldTool extends Tool {\n constructor(editor) {\n super(editor, 'Bold');\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M7 5h6a3.5 3.5 0 0 1 0 7h-6l0 -7\" /><path d=\"M13 12h1a3.5 3.5 0 0 1 0 7h-7v-7\" /></svg>\n `)\n }\n\n applySyntax() {\n const textarea = this.editor.usertextarea;\n const { selectionStart, selectionEnd } = textarea;\n const value = textarea.value;\n const selectedText = value.substring(selectionStart, selectionEnd);\n\n let newText = '';\n let offset = 0;\n\n if (selectedText.startsWith('***') && selectedText.endsWith('***')) {\n // bold+italic selected → remove bold, keep italic\n newText = '*' + selectedText.slice(3, -3) + '*';\n } else if (selectedText.startsWith('**') && selectedText.endsWith('**')) {\n // full **text** selected → remove bold\n newText = selectedText.slice(2, -2);\n } else if (\n value.substring(selectionStart - 3, selectionStart) === '***' &&\n value.substring(selectionEnd, selectionEnd + 3) === '***'\n ) {\n // cursor inside ***text*** → remove bold, keep italic\n textarea.setSelectionRange(selectionStart - 3, selectionEnd + 3);\n this.editor.insertText(`*${selectedText}*`, 1, 1);\n return;\n } else if (\n value.substring(selectionStart - 2, selectionStart) === '**' &&\n value.substring(selectionEnd, selectionEnd + 2) === '**' &&\n value[selectionStart - 3] !== '*' &&\n value[selectionEnd + 2] !== '*'\n ) {\n // cursor inside **text** → remove bold\n textarea.setSelectionRange(selectionStart - 2, selectionEnd + 2);\n this.editor.insertText(selectedText, 0, 0);\n return;\n } else {\n newText = `**${selectedText || 'Bold text'}**`;\n if (!selectedText) offset = 2;\n }\n\n this.editor.insertText(newText, offset, offset);\n }\n}\n\nexport default BoldTool;\n","import Tool from '../Tool.js';\n\nclass ItalicTool extends Tool {\n constructor(editor) {\n // Call the parent constructor with the markdown syntax for italic (*)\n super(editor, 'Italic');\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M11 5l6 0\" /><path d=\"M7 19l6 0\" /><path d=\"M14 5l-4 14\" /></svg>\n `);\n }\n\n applySyntax() {\n const textarea = this.editor.usertextarea;\n const { selectionStart, selectionEnd } = textarea;\n const value = textarea.value;\n const selectedText = value.substring(selectionStart, selectionEnd);\n\n let newText = '';\n let offset = 0;\n\n if (selectedText.startsWith('***') && selectedText.endsWith('***')) {\n // bold+italic selected → remove italic, keep bold\n newText = '**' + selectedText.slice(3, -3) + '**';\n } else if (selectedText.startsWith('*') && selectedText.endsWith('*') && !selectedText.startsWith('**')) {\n // full *text* selected → remove italic\n newText = selectedText.slice(1, -1);\n } else if (\n value.substring(selectionStart - 3, selectionStart) === '***' &&\n value.substring(selectionEnd, selectionEnd + 3) === '***'\n ) {\n // cursor inside ***text*** → remove italic, keep bold\n textarea.setSelectionRange(selectionStart - 3, selectionEnd + 3);\n this.editor.insertText(`**${selectedText}**`, 2, 2);\n return;\n } else if (\n value[selectionStart - 1] === '*' &&\n value[selectionEnd] === '*' &&\n value[selectionStart - 2] !== '*' &&\n value[selectionEnd + 1] !== '*'\n ) {\n // cursor inside *text* → remove italic\n textarea.setSelectionRange(selectionStart - 1, selectionEnd + 1);\n this.editor.insertText(selectedText, 0, 0);\n return;\n } else {\n newText = `*${selectedText || 'Italic text'}*`;\n if (!selectedText) offset = 1;\n }\n\n this.editor.insertText(newText, offset, offset);\n }\n}\n\nexport default ItalicTool;","import Tool from '../Tool.js';\n\nclass StrikethroughTool extends Tool {\n constructor(editor) {\n // Call the parent constructor with the markdown syntax for strikethrough (~~)\n super(editor, 'Strikethrough');\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M5 12l14 0\" /><path d=\"M16 6.5a4 2 0 0 0 -4 -1.5h-1a3.5 3.5 0 0 0 0 7h2a3.5 3.5 0 0 1 0 7h-1.5a4 2 0 0 1 -4 -1.5\" /></svg>\n `);\n }\n\n applySyntax() {\n const textarea = this.editor.usertextarea;\n const { selectionStart, selectionEnd } = textarea;\n const value = textarea.value;\n const selectedText = value.substring(selectionStart, selectionEnd);\n\n const syntax = '~~';\n let newText = '';\n let offset = 0;\n\n if (selectedText.startsWith(syntax) && selectedText.endsWith(syntax)) {\n // full ~~text~~ selected → remove\n newText = selectedText.slice(syntax.length, -syntax.length);\n } else if (\n value.substring(selectionStart - 2, selectionStart) === syntax &&\n value.substring(selectionEnd, selectionEnd + 2) === syntax\n ) {\n // cursor inside ~~text~~ → remove\n textarea.setSelectionRange(selectionStart - 2, selectionEnd + 2);\n this.editor.insertText(selectedText, 0, 0);\n return;\n } else {\n newText = `${syntax}${selectedText || 'Strikethrough text'}${syntax}`;\n offset = syntax.length;\n }\n\n this.editor.insertText(newText, offset, offset);\n }\n}\n\nexport default StrikethroughTool;","import Tool from '../Tool.js';\n\nclass ULTool extends Tool {\n constructor(editor) {\n super(editor, 'Unordered list');\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M9 6l11 0\" /><path d=\"M9 12l11 0\" /><path d=\"M9 18l11 0\" /><path d=\"M5 6l0 .01\" /><path d=\"M5 12l0 .01\" /><path d=\"M5 18l0 .01\" /></svg>\n `);\n }\n \n applySyntax() {\n const textarea = this.editor.usertextarea;\n const { selectionStart, selectionEnd } = textarea;\n const value = textarea.value;\n const selectedText = value.substring(selectionStart, selectionEnd);\n\n const syntax = '- ';\n let newText = '';\n let offset = 0;\n\n if (selectedText.startsWith(syntax)) {\n newText = selectedText.slice(syntax.length);\n } else if (value.substring(selectionStart - syntax.length, selectionStart) === syntax) {\n textarea.setSelectionRange(selectionStart - syntax.length, selectionEnd);\n this.editor.insertText(selectedText, 0, 0);\n return;\n } else {\n newText = `${syntax}${selectedText || 'Unordered list'}`;\n offset = syntax.length;\n }\n\n this.editor.insertText(newText, offset);\n }\n}\n\n\nexport default ULTool;","import Tool from '../Tool.js';\n\nclass OLTool extends Tool {\n constructor(editor) {\n super(editor, 'Ordered list');\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M11 6h9\" /><path d=\"M11 12h9\" /><path d=\"M12 18h8\" /><path d=\"M4 16a2 2 0 1 1 4 0c0 .591 -.5 1 -1 1.5l-3 2.5h4\" /><path d=\"M6 10v-6l-2 2\" /></svg>\n `);\n }\n \n applySyntax() {\n const textarea = this.editor.usertextarea;\n const { selectionStart, selectionEnd } = textarea;\n const value = textarea.value;\n const selectedText = value.substring(selectionStart, selectionEnd);\n\n const syntax = '1. ';\n let newText = '';\n let offset = 0;\n\n if (selectedText.startsWith(syntax)) {\n newText = selectedText.slice(syntax.length);\n } else if (value.substring(selectionStart - syntax.length, selectionStart) === syntax) {\n textarea.setSelectionRange(selectionStart - syntax.length, selectionEnd);\n this.editor.insertText(selectedText, 0, 0);\n return;\n } else {\n newText = `${syntax}${selectedText || 'Ordered list'}`;\n offset = syntax.length;\n }\n\n this.editor.insertText(newText, offset);\n }\n}\n\n\nexport default OLTool;","// #components/Toolbar/tools/PreviewToggleTool.js\nimport Tool from '../Tool.js';\n\nclass PreviewTool extends Tool {\n constructor(editor) {\n // No markdown syntax for preview toggle, so we call the parent constructor with empty values\n super(editor, 'Preview');\n this.preview = true;\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M12 4v16\" /><path d=\"M3 5a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-14\" /><path d=\"M12 13l7.5 -7.5\" /><path d=\"M12 18l8 -8\" /><path d=\"M15 20l5 -5\" /><path d=\"M12 8l4 -4\" /></svg>\n `);\n const btn = this.button.querySelector('button');\n if (btn) btn.setAttribute('aria-pressed', 'false');\n }\n\n // Override applySyntax to handle preview toggling\n applySyntax() {\n const previewWrapper = this.editor.previewContent?.parentNode;\n const editorDiv = this.editor.markdownEditorDiv;\n\n if (!previewWrapper || !editorDiv) return;\n\n // Toggle the preview's visibility by switching between 'block' and 'hidden' classes\n if (this.editor.preview && this.preview) {\n this.enablePreview(previewWrapper, editorDiv);\n } else {\n this.disablePreview(previewWrapper, editorDiv);\n }\n }\n\n // Method to hide the preview (disable it)\n disablePreview(previewWrapper, editorDiv) {\n\n this.preview = true;\n\n const textareaWrapper = editorDiv.querySelector(\".textarea-wrapper\");\n\n editorDiv.parentNode.classList.remove('is-fullscreen');\n\n editorDiv.classList.remove('fj:md:grid-cols-2');\n previewWrapper.classList.add('fj:hidden');\n textareaWrapper.classList.remove(\"fj:hidden\", \"fj:md:grid\");\n\n textareaWrapper.querySelector(\"textarea\").classList.remove(\"fj:h-full!\");\n\n if(textareaWrapper.querySelector(\".display-layer\")){\n textareaWrapper.querySelector(\".display-layer\").classList.remove(\"fj:h-full!\");\n }\n\n previewWrapper.classList.remove('fj:min-h-0');\n\n document.querySelector(\"body\").classList.remove('fj:overflow-hidden');\n\n document.removeEventListener('keydown', this._escHandler);\n\n this.editor._autoGrow();\n\n this.editor.editorContainer.querySelectorAll('.markdown-btn').forEach(button => {\n if (!button.classList.contains('preview-btn')) {\n button.classList.remove('fj:pointer-events-none', 'fj:md:pointer-events-auto', 'fj:opacity-25', 'fj:md:opacity-100');\n button.removeAttribute('aria-disabled');\n } else {\n button.classList.remove('fj:me-btn-active');\n button.setAttribute('aria-pressed', 'false');\n }\n });\n\n }\n\n // Method to show the preview (enable it)\n enablePreview(previewWrapper, editorDiv) {\n\n this.preview = false;\n\n const textareaWrapper = editorDiv.querySelector(\".textarea-wrapper\");\n\n editorDiv.parentNode.classList.add('is-fullscreen');\n\n editorDiv.classList.add('fj:md:grid-cols-2');\n previewWrapper.classList.remove('fj:hidden');\n textareaWrapper.classList.add(\"fj:hidden\", \"fj:md:grid\");\n\n // Clear inline height set by _autoGrow. An inline style would beat\n // the height in the .is-fullscreen rule.\n this.editor.editorContainer.style.height = '';\n\n textareaWrapper.querySelector(\"textarea\").classList.add(\"fj:h-full!\");\n\n if(textareaWrapper.querySelector(\".display-layer\")){\n textareaWrapper.querySelector(\".display-layer\").classList.add(\"fj:h-full!\");\n }\n\n previewWrapper.classList.add('fj:min-h-0');\n\n document.querySelector(\"body\").classList.add('fj:overflow-hidden');\n\n this._escHandler = (e) => {\n if (e.key === 'Escape') this.applySyntax();\n };\n document.addEventListener('keydown', this._escHandler);\n\n this.editor.render();\n\n const isMobile = window.matchMedia('(max-width: 767px)').matches;\n this.editor.editorContainer.querySelectorAll('.markdown-btn').forEach(button => {\n if (!button.classList.contains('preview-btn')) {\n button.classList.add('fj:pointer-events-none', 'fj:md:pointer-events-auto', 'fj:opacity-25', 'fj:md:opacity-100');\n button.setAttribute('aria-disabled', isMobile ? 'true' : 'false');\n } else {\n button.classList.add('fj:me-btn-active');\n button.setAttribute('aria-pressed', 'true');\n }\n });\n }\n\n destroy() {\n if (!this.preview) {\n document.removeEventListener('keydown', this._escHandler);\n document.querySelector('body')?.classList.remove('fj:overflow-hidden');\n }\n }\n}\n\nexport default PreviewTool;\n","import Tool from '../Tool.js';\n\nclass CheckListTool extends Tool {\n constructor(editor) {\n super(editor, 'Check list');\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M3.5 5.5l1.5 1.5l2.5 -2.5\" /><path d=\"M3.5 11.5l1.5 1.5l2.5 -2.5\" /><path d=\"M3.5 17.5l1.5 1.5l2.5 -2.5\" /><path d=\"M11 6l9 0\" /><path d=\"M11 12l9 0\" /><path d=\"M11 18l9 0\" /></svg>\n `);\n }\n \n applySyntax() {\n const textarea = this.editor.usertextarea;\n const { selectionStart, selectionEnd } = textarea;\n const value = textarea.value;\n const selectedText = value.substring(selectionStart, selectionEnd);\n\n const syntax = '- [x] ';\n const syntaxUnchecked = '- [ ] ';\n let newText = '';\n let offset = 0;\n\n if (selectedText.startsWith(syntax) || selectedText.startsWith(syntaxUnchecked)) {\n newText = selectedText.slice(syntax.length);\n } else {\n const before = value.substring(selectionStart - syntax.length, selectionStart);\n if (before === syntax || before === syntaxUnchecked) {\n textarea.setSelectionRange(selectionStart - syntax.length, selectionEnd);\n this.editor.insertText(selectedText, 0, 0);\n return;\n }\n newText = `${syntax}${selectedText || 'Check list'}`;\n offset = syntax.length;\n }\n\n this.editor.insertText(newText, offset);\n }\n}\n\n\nexport default CheckListTool;","import Tool from '../Tool.js';\n\nclass BlockQuoteTool extends Tool {\n constructor(editor) {\n // Call the parent constructor with the markdown syntax for italic (*)\n super(editor, 'Blockquote');\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M10 11h-4a1 1 0 0 1 -1 -1v-3a1 1 0 0 1 1 -1h3a1 1 0 0 1 1 1v6c0 2.667 -1.333 4.333 -4 5\" /><path d=\"M19 11h-4a1 1 0 0 1 -1 -1v-3a1 1 0 0 1 1 -1h3a1 1 0 0 1 1 1v6c0 2.667 -1.333 4.333 -4 5\" /></svg>\n `);\n }\n\n applySyntax() {\n const textarea = this.editor.usertextarea;\n const { selectionStart, selectionEnd } = textarea;\n const value = textarea.value;\n const selectedText = value.substring(selectionStart, selectionEnd);\n\n const syntax = '>';\n let newText = '';\n let offset = 0;\n\n if (selectedText.startsWith(syntax)) {\n newText = selectedText.slice(syntax.length);\n } else if (value.substring(selectionStart - syntax.length, selectionStart) === syntax) {\n textarea.setSelectionRange(selectionStart - syntax.length, selectionEnd);\n this.editor.insertText(selectedText, 0, 0);\n return;\n } else {\n newText = `${syntax}${selectedText || 'Blockquote text'}`;\n if (!selectedText) offset = syntax.length;\n }\n\n this.editor.insertText(newText, offset);\n }\n}\n\nexport default BlockQuoteTool;","export function modal(event, size, bodyHTML, label = '') {\n const self = event.target;\n const mde = self.closest(\".markdown-editor-wrapper\");\n if (mde.querySelector(\".markdown-modal\")) {\n mde.querySelector(\".markdown-modal\").remove();\n }\n\n const ariaAttr = label ? `aria-label=\"${label}\"` : '';\n const modalHTML = `\n <dialog class=\"markdown-modal fj:me-modal fj:me-modal-top fj:lg:me-modal-middle fj:me-modal-center\" id=\"nezanuha_toggleModal\" ${ariaAttr}>\n <div class=\"fj:me-modal-content ${size}\">\n ${bodyHTML}\n </div>\n </dialog>\n `;\n\n if (!mde.querySelector(\".markdown-modal\")) {\n mde.insertAdjacentHTML(\"beforeend\", modalHTML);\n }\n\n const modal = mde.querySelector(\".markdown-modal\");\n modal.addEventListener('close', () => modal.remove());\n modal.showModal();\n return modal;\n}","import Tool from '../Tool.js';\nimport { modal } from '../../modal.js';\n\nclass LinkTool extends Tool {\n constructor(editor) {\n super(editor, 'Link');\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M9 15l6 -6\" /><path d=\"M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464\" /><path d=\"M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463\" /></svg>\n `);\n }\n\n // Apply link syntax [text](url)\n applySyntax(event) {\n let editor = this.editor;\n let textarea = editor.usertextarea;\n let { selectionStart, selectionEnd } = textarea;\n const fullText = textarea.value;\n\n // Auto-expand selection if the selected text is inside an existing link [text](url)\n const before = fullText.substring(0, selectionStart);\n const after = fullText.substring(selectionEnd);\n if (before.endsWith('[') && /^\\]\\([^)]+\\)/.test(after)) {\n const urlMatch = after.match(/^\\]\\(([^)]+)\\)/);\n if (urlMatch) {\n selectionStart = before.length - 1;\n selectionEnd = selectionEnd + urlMatch[0].length;\n textarea.setSelectionRange(selectionStart, selectionEnd);\n }\n }\n\n let selectedText = fullText.substring(selectionStart, selectionEnd);\n\n const linkRegex = /^\\[([^\\]]+)\\]\\(([^)]+)\\)$/;\n const match = selectedText && selectedText.match(linkRegex);\n\n const prefillText = match ? match[1] : selectedText;\n const prefillUrl = match ? match[2] : '';\n\n const bodyHTML = `\n <div class=\"fj:flex fj:justify-between fj:items-center fj:gap-3\">\n <div class=\"fj:font-medium\">${this.editor.label('Link')}</div>\n <button type=\"button\" class=\"modal-close-btn fj:me-btn fj:me-btn-ghost fj:me-btn-xs fj:me-btn-circle\" aria-label=\"${this.editor.label('Close')}\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/></svg>\n </button>\n </div>\n <form method=\"post\">\n <div class=\"fj:flex fj:flex-col fj:justify-center fj:gap-y-4.5 fj:mt-4\">\n <input type=\"url\" placeholder=\"${this.editor.label('URL')}\" class=\"link-input fj:me-input fj:w-full\" value=\"${prefillUrl}\" required>\n <input type=\"text\" placeholder=\"${this.editor.label('Link text')}\" class=\"link-text-input fj:me-input fj:w-full\" value=\"${prefillText}\" required>\n <button type=\"submit\" class=\"submit-link fj:me-btn fj:me-btn-sm fj:self-end\">${this.editor.label('Apply')}</button>\n </div>\n </form>`;\n\n const modalElement = modal(event, 'fj:max-w-sm', bodyHTML, 'Link');\n\n modalElement.querySelector(\".modal-close-btn\").addEventListener(\"click\", () => modalElement.close());\n\n modalElement.querySelector(\".submit-link\").addEventListener(\"click\", function(e) {\n e.preventDefault();\n const linkInput = modalElement.querySelector(\".link-input\");\n const linkTextInput = modalElement.querySelector(\".link-text-input\");\n\n if (!linkInput.validity.valid) {\n linkInput.reportValidity();\n } else if (!linkTextInput.validity.valid) {\n linkTextInput.reportValidity();\n } else {\n const link = linkInput.value;\n const linkText = linkTextInput.value || 'Link Text';\n editor.insertText(`[${linkText}](${link})`);\n modalElement.close();\n }\n });\n }\n \n}\n\nexport default LinkTool;","import Tool from '../Tool.js';\n\nconst ALL_LEVELS = [1, 2, 3, 4, 5, 6];\n\n/**\n * Accepts `{ levels: [2, 3, 4] }`. Anything outside 1-6, duplicated or not a\n * whole number is dropped, and a list with nothing usable in it falls back to\n * all six rather than rendering an empty menu.\n */\nfunction parseLevels(levels) {\n if (levels === undefined) return ALL_LEVELS;\n\n if (!Array.isArray(levels)) {\n console.warn('[MarkdownEditor] heading levels must be an array of numbers 1-6. Using all six.', levels);\n return ALL_LEVELS;\n }\n\n const valid = [...new Set(levels)]\n .filter(n => Number.isInteger(n) && n >= 1 && n <= 6)\n .sort((a, b) => a - b);\n\n if (valid.length !== levels.length) {\n console.warn('[MarkdownEditor] Ignored heading levels outside 1-6, or repeated.', levels);\n }\n if (!valid.length) {\n console.warn('[MarkdownEditor] No usable heading levels. Using all six.', levels);\n return ALL_LEVELS;\n }\n return valid;\n}\n\nclass HeadingTool extends Tool {\n constructor(editor, config = {}) {\n super(editor, 'Heading');\n // Tool's constructor already called createButton() before this line, so\n // that first button is built with the default levels and thrown away.\n // Assigning before the second call is what makes the config take effect.\n this.levels = parseLevels(config?.levels);\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M7 12h10\" /><path d=\"M7 5v14\" /><path d=\"M17 5v14\" /><path d=\"M15 19h4\" /><path d=\"M15 5h4\" /><path d=\"M5 19h4\" /><path d=\"M5 5h4\" /></svg>\n `);\n }\n\n createButton(iconHtml) {\n const popoverId = `heading-popover-${Math.random().toString(36).slice(2, 7)}`;\n\n const btn = document.createElement('button');\n btn.innerHTML = iconHtml;\n const svg = btn.querySelector('svg');\n if (svg) svg.setAttribute('aria-hidden', 'true');\n btn.type = 'button';\n btn.title = this.editor.label('Heading');\n btn.setAttribute('aria-label', this.editor.label('Heading'));\n btn.setAttribute('aria-haspopup', 'menu');\n btn.className = 'markdown-btn heading-btn fj:me-btn fj:me-btn-xs fj:me-btn-square fj:me-btn-ghost fj:me-popover-toggle';\n btn.setAttribute('popovertarget', popoverId);\n\n const popoverContent = document.createElement('div');\n popoverContent.id = popoverId;\n popoverContent.setAttribute('role', 'menu');\n popoverContent.setAttribute('aria-label', this.editor.label('Heading level'));\n popoverContent.className = 'fj:me-popover-content';\n popoverContent.setAttribute('popover', '');\n\n const menu = document.createElement('ul');\n menu.className = 'fj:me-menu';\n menu.setAttribute('role', 'presentation');\n\n const headingClasses = ['fj:me-heading-xl', 'fj:me-heading-lg', 'fj:me-heading-md', 'fj:me-heading-sm', 'fj:me-heading-xs', 'fj:me-heading-xs'];\n\n for (const level of (this.levels ?? ALL_LEVELS)) {\n const li = document.createElement('li');\n li.setAttribute('role', 'none');\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.setAttribute('role', 'menuitem');\n btn.className = `fj:me-menu-item ${headingClasses[level - 1]}`;\n btn.textContent = `${this.editor.label('Heading')} ${level}`;\n btn.addEventListener('click', () => {\n this.applyHeading(level);\n popoverContent.hidePopover();\n });\n li.appendChild(btn);\n menu.appendChild(li);\n }\n\n popoverContent.appendChild(menu);\n\n const wrapper = document.createElement('div');\n wrapper.className = 'fj:me-popover';\n wrapper.appendChild(btn);\n wrapper.appendChild(popoverContent);\n\n return wrapper;\n }\n\n applyHeading(level) {\n const textarea = this.editor.usertextarea;\n const { selectionStart, selectionEnd } = textarea;\n const value = textarea.value;\n\n // Always work on the full current line so existing heading prefixes are included\n const lineStart = value.lastIndexOf('\\n', selectionStart - 1) + 1;\n const lineEndRaw = value.indexOf('\\n', selectionEnd);\n const lineEnd = lineEndRaw === -1 ? value.length : lineEndRaw;\n\n const lineText = value.substring(lineStart, lineEnd);\n const existingLevel = (lineText.match(/^(#+)\\s/) || [])[1];\n const cleanText = lineText.replace(/^#+\\s*/, '');\n const prefix = `${'#'.repeat(level)} `;\n\n // Same level clicked again → remove heading\n const newText = (existingLevel && existingLevel.length === level)\n ? (cleanText || 'Heading')\n : (cleanText ? `${prefix}${cleanText}` : `${prefix}Heading`);\n\n textarea.value = `${value.substring(0, lineStart)}${newText}${value.substring(lineEnd)}`;\n textarea.focus();\n\n const textStart = lineStart + (newText === cleanText || newText === 'Heading' ? 0 : prefix.length);\n const textEnd = lineStart + newText.length;\n textarea.setSelectionRange(textStart, textEnd);\n\n this.editor.scrollToView();\n this.editor.render();\n this.editor.notifyChange();\n }\n\n applySyntax() {}\n}\n\nexport default HeadingTool;\n","/**\n * POSTs an image to the configured endpoint and returns where it was stored.\n *\n * Shared by the image modal and by paste/drop so both speak the same contract:\n * the server receives `image_file` plus any configured params, and answers with\n * { success, image_path, image_alt? }.\n */\nexport async function uploadImage(file, { uploadUrl, params = {}, alt = '' } = {}) {\n const formData = new FormData();\n formData.append('image_file', file);\n formData.append('image_alt', alt);\n for (const [key, value] of Object.entries(params)) {\n formData.append(key, value);\n }\n\n const res = await fetch(uploadUrl, { method: 'POST', body: formData });\n if (!res.ok) throw new Error(`Upload failed: ${res.status}`);\n\n const result = await res.json();\n if (!result.success || !result.image_path) {\n throw new Error(result.error || result.message || 'Image upload failed.');\n }\n\n return { path: result.image_path, alt: result.image_alt || '' };\n}\n","import Tool from '../Tool.js';\nimport { modal } from '../../modal.js';\nimport { uploadImage } from '../../../utils/imageUpload.js';\n\nclass ImageTool extends Tool {\n constructor(editor, config = {}) {\n super(editor, 'Image link');\n this.config = config;\n this.fileInputConfig = config.fileInput || false;\n // Logic: Respect config or default to true\n this.altInputConfig = config.altInput !== undefined ? config.altInput : { required: true };\n \n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M15 8h.01\" /><path d=\"M12.5 21h-6.5a3 3 0 0 1 -3 -3v-12a3 3 0 0 1 3 -3h12a3 3 0 0 1 3 3v6.5\" /><path d=\"M3 16l5 -5c.928 -.893 2.072 -.893 3 0l4 4\" /><path d=\"M14 14l1 -1c.67 -.644 1.45 -.824 2.182 -.54\" /><path d=\"M16 19h6\" /><path d=\"M19 16v6\" /></svg>\n `);\n }\n\n applySyntax(event) {\n const editor = this.editor;\n const textarea = editor.usertextarea;\n let { selectionStart, selectionEnd } = textarea;\n const fullText = textarea.value;\n\n // Auto-expand selection if the selected text is inside an existing image \n const before = fullText.substring(0, selectionStart);\n const after = fullText.substring(selectionEnd);\n if (before.endsWith('![') && /^\\]\\([^)]+\\)/.test(after)) {\n const urlMatch = after.match(/^\\]\\(([^)]+)\\)/);\n if (urlMatch) {\n selectionStart = before.length - 2;\n selectionEnd = selectionEnd + urlMatch[0].length;\n textarea.setSelectionRange(selectionStart, selectionEnd);\n }\n }\n\n const selectedText = fullText.substring(selectionStart, selectionEnd);\n\n const acceptFormats = this.fileInputConfig.accept\n ? this.fileInputConfig.accept.map(type => `image/${type}`).join(',')\n : 'image/*';\n\n const isAltRequired = typeof this.altInputConfig === 'boolean'\n ? this.altInputConfig\n : (this.altInputConfig.required !== false);\n\n const uploadUrl = this.fileInputConfig.uploadUrl || null;\n const customParams = this.fileInputConfig.params || {};\n\n const imageRegex = /^!\\[([^\\]]*)\\]\\(([^)]+)\\)$/;\n const imageMatch = selectedText && selectedText.match(imageRegex);\n const prefillAlt = imageMatch ? imageMatch[1] : selectedText;\n const prefillUrl = imageMatch ? imageMatch[2] : '';\n\n let fileInputTag = '';\n if (this.fileInputConfig) {\n fileInputTag = `\n <input type=\"file\" accept=\"${acceptFormats}\" class=\"img-file-input fj:me-input fj:w-full\">\n <div class=\"fj:me-divider fj:my-1\">OR</div>\n `;\n }\n\n const bodyHTML = `\n <div class=\"fj:flex fj:justify-between fj:items-center fj:gap-3\">\n <div class=\"fj:font-medium\">${editor.label('Image')}</div>\n <button type=\"button\" class=\"modal-close-btn fj:me-btn fj:me-btn-ghost fj:me-btn-xs fj:me-btn-circle\" aria-label=\"${editor.label('Close')}\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/></svg>\n </button>\n </div>\n <div class=\"fj:mt-4 fj:flex fj:flex-col fj:gap-y-4\">\n ${fileInputTag}\n <input type=\"url\" placeholder=\"${editor.label('URL')}\" class=\"img-link-input fj:me-input fj:w-full\" value=\"${prefillUrl}\" required>\n <input type=\"text\" placeholder=\"${editor.label('Alt text')}\" class=\"img-link-alt-input fj:me-input fj:w-full\" value=\"${prefillAlt}\" ${isAltRequired ? 'required' : ''}>\n <button type=\"button\" class=\"submit-img-link fj:me-btn fj:me-btn-sm fj:self-end\">${editor.label('Apply')}</button>\n </div>`;\n\n const modalElement = modal(event, 'fj:max-w-sm', bodyHTML, 'Image');\n modalElement.querySelector(\".modal-close-btn\").addEventListener(\"click\", () => modalElement.close());\n const submitBtn = modalElement.querySelector(\".submit-img-link\");\n\n submitBtn.addEventListener(\"click\", async (e) => {\n e.preventDefault();\n\n const fileInputSelector = modalElement.querySelector(\".img-file-input\");\n const urlInputSelector = modalElement.querySelector(\".img-link-input\");\n const imgFileAltInput = modalElement.querySelector(\".img-link-alt-input\");\n\n const hasFile = fileInputSelector?.files[0];\n\n // --- 1. PRE-VALIDATION ---\n // If we are uploading a file, the URL is currently empty, so we temporarily\n // disable the 'required' on URL just to check the Alt text.\n if (hasFile) {\n urlInputSelector.required = false; \n }\n\n // Check if Alt (and URL if no file) are valid according to config\n if (isAltRequired && !imgFileAltInput.validity.valid) {\n imgFileAltInput.reportValidity();\n if (hasFile) urlInputSelector.required = true; // Restore\n return;\n }\n\n if (!hasFile && !urlInputSelector.validity.valid) {\n urlInputSelector.reportValidity();\n return;\n }\n\n // --- 2. ASYNC UPLOAD ---\n if (hasFile && uploadUrl) {\n const file = fileInputSelector.files[0];\n submitBtn.disabled = true;\n submitBtn.textContent = editor.label('Uploading...');\n\n try {\n const { path, alt } = await uploadImage(file, {\n uploadUrl,\n params: customParams,\n alt: imgFileAltInput.value,\n });\n\n urlInputSelector.value = path;\n // Only take the server's suggestion when the user wrote nothing,\n // so a typed description is never silently replaced.\n if (alt && !imgFileAltInput.value.trim()) imgFileAltInput.value = alt;\n } catch (err) {\n alert(err.message || 'Upload failed.');\n submitBtn.disabled = false;\n submitBtn.textContent = editor.label('Apply');\n urlInputSelector.required = true; // Restore\n return;\n }\n\n submitBtn.disabled = false;\n submitBtn.textContent = editor.label('Apply');\n }\n\n // --- 3. FINAL INSERTION ---\n const imgLink = urlInputSelector.value;\n const imgLinkAlt = imgFileAltInput.value || '';\n const newText = ``;\n\n editor.insertText(newText);\n modalElement.close();\n });\n }\n}\n\nexport default ImageTool;","import Tool from '../Tool.js';\n\nclass UndoTool extends Tool {\n constructor(editor) {\n super(editor, 'Undo');\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M9 14l-4 -4l4 -4\" /><path d=\"M5 10h11a4 4 0 1 1 0 8h-1\" /></svg>\n `);\n }\n\n applySyntax() {\n // Check if Undo is available and perform the undo action\n const undoRedoManager = this.editor.undoRedoManager;\n if (undoRedoManager) {\n undoRedoManager.undo();\n }\n }\n}\n\nexport default UndoTool;","import Tool from '../Tool.js';\n\nclass RedoTool extends Tool {\n constructor(editor) {\n super(editor, 'Redo');\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M15 14l4 -4l-4 -4\" /><path d=\"M19 10h-11a4 4 0 1 0 0 8h1\" /></svg>\n `);\n }\n\n applySyntax() {\n // Check if Redo is available and perform the redo action\n const undoRedoManager = this.editor.undoRedoManager;\n if (undoRedoManager) {\n undoRedoManager.redo();\n }\n }\n}\n\nexport default RedoTool;\n","import Tool from '../Tool.js';\n\nclass IndentTool extends Tool {\n constructor(editor) {\n super(editor, 'Indent');\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M20 6l-11 0\" /><path d=\"M20 12l-7 0\" /><path d=\"M20 18l-11 0\" /><path d=\"M4 8l4 4l-4 4\" /></svg>\n `);\n }\n \n applySyntax() {\n const indentManager = this.editor.indentManager;\n if (indentManager) {\n indentManager.indent();\n this.editor.render();\n }\n }\n}\n\n\nexport default IndentTool;","import Tool from '../Tool.js';\n\nclass OutdentTool extends Tool {\n constructor(editor) {\n super(editor, 'Outdent');\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M20 6l-7 0\" /><path d=\"M20 12l-9 0\" /><path d=\"M20 18l-7 0\" /><path d=\"M8 8l-4 4l4 4\" /></svg>\n `);\n }\n \n applySyntax(e) {\n const indentManager = this.editor.indentManager;\n if (indentManager) {\n indentManager.outdent();\n this.editor.render();\n }\n }\n}\n\n\nexport default OutdentTool;","import Tool from '../Tool.js';\n\nclass CodeTool extends Tool {\n constructor(editor) {\n super(editor, 'Code');\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M7 8l-4 4l4 4\" /><path d=\"M17 8l4 4l-4 4\" /><path d=\"M14 4l-4 16\" /></svg>\n `);\n }\n\n applySyntax() {\n const textarea = this.editor.usertextarea;\n const { selectionStart, selectionEnd } = textarea;\n const value = textarea.value;\n const selectedText = value.substring(selectionStart, selectionEnd);\n\n // Toggle off: full `code` selected\n if (selectedText.startsWith('`') && selectedText.endsWith('`')) {\n this.editor.insertText(selectedText.slice(1, -1), 0, 0);\n return;\n }\n\n // Toggle off: cursor is inside `code`\n if (value[selectionStart - 1] === '`' && value[selectionEnd] === '`') {\n textarea.setSelectionRange(selectionStart - 1, selectionEnd + 1);\n this.editor.insertText(selectedText, 0, 0);\n return;\n }\n\n const newText = `\\`${selectedText || 'code'}\\``;\n this.editor.insertText(newText, 1, 1);\n }\n}\n\nexport default CodeTool;\n","import Tool from '../Tool.js';\n\nclass CodeBlockTool extends Tool {\n constructor(editor) {\n super(editor, 'Code Block');\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M8 9l3 3l-3 3\" /><path d=\"M13 15l3 0\" /><rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\" /></svg>\n `);\n }\n\n applySyntax() {\n const textarea = this.editor.usertextarea;\n const { selectionStart, selectionEnd } = textarea;\n const value = textarea.value;\n const selectedText = value.substring(selectionStart, selectionEnd);\n\n // Toggle off: full fenced block selected (``` ... ```)\n if (selectedText.startsWith('```') && selectedText.endsWith('```') && selectedText.length > 6) {\n const inner = selectedText.replace(/^```\\w*\\n?/, '').replace(/\\n?```$/, '');\n this.editor.insertText(inner, 0, 0);\n return;\n }\n\n const inner = selectedText || 'code';\n const newText = `\\`\\`\\`\\n${inner}\\n\\`\\`\\``;\n // offset 4 = past \"```\\n\"; trailing 4 = past \"\\n```\" — selects the inner content\n this.editor.insertText(newText, 4, 4);\n }\n}\n\nexport default CodeBlockTool;\n","import Tool from '../Tool.js';\n\nclass HrTool extends Tool {\n constructor(editor) {\n super(editor, 'Horizontal Rule');\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M4 12l16 0\" stroke-width=\"3\"/><path d=\"M4 7l6 0\" /><path d=\"M4 17l6 0\" /><path d=\"M14 7l6 0\" /><path d=\"M14 17l6 0\" /></svg>\n `);\n }\n\n applySyntax() {\n const textarea = this.editor.usertextarea;\n const { selectionStart } = textarea;\n const value = textarea.value;\n\n const atLineStart = selectionStart === 0 || value[selectionStart - 1] === '\\n';\n const text = atLineStart ? '---\\n' : '\\n\\n---\\n';\n this.editor.insertText(text, text.length, 0);\n }\n}\n\nexport default HrTool;\n","import Tool from '../Tool.js';\n\nclass TableTool extends Tool {\n constructor(editor) {\n super(editor, 'Table');\n this.button = this.createButton(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M3 5a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v14a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-14z\" /><path d=\"M3 10h18\" /><path d=\"M10 3v18\" /></svg>\n `);\n }\n\n applySyntax() {\n const textarea = this.editor.usertextarea;\n const { selectionStart } = textarea;\n const value = textarea.value;\n\n const template = `| Column 1 | Column 2 | Column 3 |\\n| --- | --- | --- |\\n| Cell | Cell | Cell |\\n| Cell | Cell | Cell |`;\n const atLineStart = selectionStart === 0 || value[selectionStart - 1] === '\\n';\n const text = atLineStart ? template : `\\n${template}`;\n this.editor.insertText(text, text.length, 0);\n }\n}\n\nexport default TableTool;\n","/**\n * Variables are configured either flat or grouped, and the two forms can be\n * mixed in one list:\n *\n * { label: 'Customer Name', value: '{{customer.name}}', sample: 'Hannes' }\n * { label: 'Customer', items: [ { label: 'Email', value: '{{customer.email}}' } ] }\n *\n * Returns every usable leaf entry, dropping malformed ones rather than throwing,\n * so one bad line of config cannot take the whole editor down.\n */\nexport function flattenVariables(variables) {\n const usable = entry => entry && entry.label && typeof entry.value === 'string';\n const out = [];\n\n for (const entry of Array.isArray(variables) ? variables : []) {\n if (!entry) continue;\n if (Array.isArray(entry.items)) {\n out.push(...entry.items.filter(usable));\n } else if (usable(entry)) {\n out.push(entry);\n }\n }\n\n return out;\n}\n\n/**\n * Swaps each variable that declares a sample for that sample, so the preview can\n * show representative text. Variables without a sample are left as written.\n * Only ever applied to a copy on its way to the renderer; the textarea keeps the\n * real placeholders.\n */\nexport function applyVariableSamples(markdown, variables) {\n const samples = flattenVariables(variables).filter(v => typeof v.sample === 'string');\n if (!samples.length) return markdown;\n\n // Longest value first, so a variable that is a prefix of another cannot\n // consume it, e.g. {{user}} must not break {{user.email}}.\n return samples\n .slice()\n .sort((a, b) => b.value.length - a.value.length)\n .reduce((text, v) => text.split(v.value).join(v.sample), markdown);\n}\n","// #components/Toolbar/tools/VariableTool.js\nimport Tool from '../Tool.js';\nimport { flattenVariables } from '../../../utils/variables.js';\n\nconst ICON = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M7 4a2 2 0 0 0 -2 2v3a2 2 0 0 1 -2 2a2 2 0 0 1 2 2v3a2 2 0 0 0 2 2\" /><path d=\"M17 4a2 2 0 0 1 2 2v3a2 2 0 0 0 2 2a2 2 0 0 0 -2 2v3a2 2 0 0 1 -2 2\" /></svg>\n`;\n\nclass VariableTool extends Tool {\n constructor(editor) {\n // Tool's constructor calls createButton(), so read config from\n // this.editor there rather than from a field assigned after super()\n super(editor, 'Variables');\n }\n\n createButton() {\n // Parsed by the editor at construction; reading it here rather than from\n // the config argument avoids Tool's constructor ordering, which calls\n // createButton() before any field assigned after super() exists.\n const variables = this.editor.variables ?? [];\n\n // Nothing usable configured means no button at all, not an empty dropdown\n if (!flattenVariables(variables).length) return null;\n\n const popoverId = `variable-popover-${Math.random().toString(36).slice(2, 7)}`;\n\n const btn = document.createElement('button');\n btn.innerHTML = ICON;\n btn.querySelector('svg')?.setAttribute('aria-hidden', 'true');\n btn.type = 'button';\n btn.title = this.editor.label('Insert variable');\n btn.setAttribute('aria-label', this.editor.label('Insert variable'));\n btn.setAttribute('aria-haspopup', 'menu');\n btn.className = 'markdown-btn variable-btn fj:me-btn fj:me-btn-xs fj:me-btn-square fj:me-btn-ghost fj:me-popover-toggle';\n btn.setAttribute('popovertarget', popoverId);\n\n const popoverContent = document.createElement('div');\n popoverContent.id = popoverId;\n popoverContent.setAttribute('role', 'menu');\n popoverContent.setAttribute('aria-label', this.editor.label('Variables'));\n popoverContent.className = 'fj:me-popover-content';\n popoverContent.setAttribute('popover', '');\n\n const menu = document.createElement('ul');\n menu.className = 'fj:me-menu';\n menu.setAttribute('role', 'presentation');\n\n const usable = entry => entry && entry.label && typeof entry.value === 'string';\n\n for (const entry of variables) {\n if (!entry) continue;\n\n if (Array.isArray(entry.items)) {\n const items = entry.items.filter(usable);\n if (!items.length) continue;\n\n const title = document.createElement('li');\n title.className = 'fj:me-menu-title';\n title.setAttribute('role', 'presentation');\n title.textContent = entry.label ?? '';\n\n const sublist = document.createElement('ul');\n sublist.setAttribute('role', 'group');\n if (entry.label) sublist.setAttribute('aria-label', entry.label);\n items.forEach(item => sublist.appendChild(this.createItem(item, popoverContent)));\n\n const holder = document.createElement('li');\n holder.setAttribute('role', 'none');\n holder.appendChild(sublist);\n\n menu.appendChild(title);\n menu.appendChild(holder);\n } else if (usable(entry)) {\n menu.appendChild(this.createItem(entry, popoverContent));\n }\n }\n\n popoverContent.appendChild(menu);\n\n const wrapper = document.createElement('div');\n wrapper.className = 'fj:me-popover';\n wrapper.appendChild(btn);\n wrapper.appendChild(popoverContent);\n\n return wrapper;\n }\n\n createItem(variable, popoverContent) {\n const li = document.createElement('li');\n li.setAttribute('role', 'none');\n\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.setAttribute('role', 'menuitem');\n btn.className = 'fj:me-menu-item';\n // textContent, never innerHTML — labels come from user config\n btn.textContent = variable.label;\n btn.title = variable.value;\n btn.addEventListener('click', () => {\n // insertText handles focus, caret, scroll, re-render and onChange\n this.editor.insertText(variable.value, variable.value.length, 0);\n popoverContent.hidePopover();\n });\n\n li.appendChild(btn);\n return li;\n }\n\n applySyntax() {}\n}\n\nexport default VariableTool;\n","import Tool from './Tool.js';\n\n/**\n * Wraps the declarative form of a custom tool:\n *\n * { custom: { title, icon, action(editor, event) {} } }\n *\n * so writing a toolbar button needs no class and no knowledge of Tool. The\n * class form stays available for tools that build their own markup, such as a\n * dropdown, which this cannot express.\n */\nclass CustomTool extends Tool {\n constructor(editor, config = {}) {\n super(editor, config.title || 'Custom');\n this.action = config.action;\n this.button = typeof this.action === 'function'\n ? this.createButton(config.icon || '')\n : null;\n // A tool that will not render must not claim a keyboard shortcut either,\n // or pressing it swallows the keystroke and throws on every press.\n this.shortcut = this.button ? config.shortcut : undefined; // e.g. 'Ctrl+Shift+K'\n\n if (!this.button) {\n console.warn('[MarkdownEditor] A custom tool needs an action function. Skipping it.', config);\n }\n }\n\n applySyntax(event) {\n this.action(this.editor, event);\n }\n}\n\nexport default CustomTool;\n","import BoldTool from './tools/BoldTool.js';\nimport ItalicTool from './tools/ItalicTool.js';\nimport StrikethroughTool from './tools/StrikethroughTool.js';\nimport ULTool from './tools/ULTool.js';\nimport OLTool from './tools/OLTool.js';\nimport PreviewTool from './tools/PreviewTool.js'\nimport CheckListTool from './tools/CheckListTool.js';\nimport BlockQuoteTool from './tools/BlockQuoteTool.js';\nimport LinkTool from './tools/LinkTool.js'\nimport HeadingTool from './tools/HeadingTool.js';\nimport ImageTool from './tools/ImageTool.js';\nimport UndoTool from './tools/UndoTool.js';\nimport RedoTool from './tools/RedoTool.js';\nimport IndentTool from './tools/IndentTool.js';\nimport OutdentTool from './tools/OutdentTool.js';\nimport CodeTool from './tools/CodeTool.js';\nimport CodeBlockTool from './tools/CodeBlockTool.js';\nimport HrTool from './tools/HrTool.js';\nimport TableTool from './tools/TableTool.js';\nimport VariableTool from './tools/VariableTool.js';\nimport CustomTool from './CustomTool.js';\n\nclass Toolbar {\n /**\n * @param standalone Built for another textarea by createToolbar(), so it\n * neither adds the preview button nor mounts itself.\n */\n constructor(editor, options, { standalone = false } = {}) {\n this.editor = editor;\n this.options = options;\n this.standalone = standalone;\n this.tools = [];\n this.toolbar = document.createElement('div');\n this.toolbar.className = standalone\n ? 'toolbar not-prose fj:flex fj:items-center fj:gap-x-1'\n : 'toolbar not-prose fj:me-surface fj:me-surface-outline fj:border-base-soft fj:border-0 fj:border-b fj:flex fj:items-center fj:gap-x-1 fj:p-1.5 fj:overflow-x-auto';\n this.toolbar.setAttribute('role', 'toolbar');\n this.toolbar.setAttribute('aria-label', editor.label('Editor toolbar'));\n this.init();\n }\n\n /** Lets the editor tear down tools that registered listeners of their own. */\n destroy() {\n this.tools.forEach(tool => tool.destroy?.());\n }\n\n init() {\n const toolMapping = {\n heading: HeadingTool,\n ul: ULTool,\n ol: OLTool,\n checklist: CheckListTool,\n bold: BoldTool,\n italic: ItalicTool,\n strikethrough: StrikethroughTool,\n blockquote: BlockQuoteTool,\n code: CodeTool,\n codeblock: CodeBlockTool,\n hr: HrTool,\n table: TableTool,\n link: LinkTool,\n image: ImageTool,\n undo: UndoTool,\n redo: RedoTool,\n indent: IndentTool,\n outdent: OutdentTool,\n variables: VariableTool\n };\n\n this.options.forEach(tool => {\n let ToolClass, config;\n\n if (typeof tool === 'string') {\n ToolClass = toolMapping[tool];\n } else if (typeof tool === 'function') {\n // A class of your own, extending MarkdownEditor.Tool\n ToolClass = tool;\n } else if (tool && typeof tool.tool === 'function') {\n // The same, with configuration: { tool: MyTool, config: {...} }\n ToolClass = tool.tool;\n config = tool.config;\n } else if (tool && tool.custom) {\n // Declarative: { custom: { title, icon, action } }, no class needed\n ToolClass = CustomTool;\n config = tool.custom;\n } else if (typeof tool === 'object') {\n const toolName = Object.keys(tool)[0];\n config = tool[toolName];\n ToolClass = toolMapping[toolName];\n }\n\n if (ToolClass) {\n const toolInstance = new ToolClass(this.editor, config);\n this.tools.push(toolInstance);\n // A tool may decline to render, e.g. variables with nothing configured\n if (toolInstance.button) this.toolbar.appendChild(toolInstance.button);\n }\n });\n\n // A standalone toolbar belongs to someone else's textarea: no preview\n // button, and the caller decides where to put it.\n if (this.standalone) return;\n\n // Append preview button at the end\n if (this.options.includes('preview')) {\n const previewToolInstance = new PreviewTool(this.editor);\n this.editor.previewTool = previewToolInstance;\n this.toolbar.appendChild(previewToolInstance.button);\n }\n\n this.editor.editorContainer.insertBefore(this.toolbar, this.editor.markdownEditorDiv);\n }\n}\n\nexport default Toolbar;\n","class Preview {\n constructor(container) {\n this.previewContainer = document.createElement('div');\n this.previewContainer.className = 'preview-wrapper fj:p-2 fj:hidden fj:me-surface fj:me-surface-outline fj:border-base-soft fj:border-0 fj:border-l';\n this.previewContainer.setAttribute('role', 'region');\n this.previewContainer.setAttribute('aria-label', 'Preview');\n this.previewContent = document.createElement('div');\n this.previewContent.className = 'preview-content fj:mte-prose fj:mte-prose-sm fj:md:mte-prose-base fj:me-prose-frutjam fj:p-1.5 fj:overflow-y-auto fj:h-full fj:max-w-full';\n this.previewContainer.appendChild(this.previewContent);\n container.appendChild(this.previewContainer);\n }\n\n getPreviewContent() {\n return this.previewContent;\n }\n}\n\nexport default Preview;","class Footer {\n constructor(container, options = {}) {\n this.options = options;\n\n this.footer = document.createElement('div');\n this.footer.className = 'editor-footer not-prose fj:me-surface fj:me-surface-outline fj:border-base-soft fj:border-0 fj:border-t fj:flex fj:justify-between fj:items-center fj:px-3 fj:py-1 fj:text-xs fj:opacity-60 fj:select-none';\n this.footer.setAttribute('aria-hidden', 'true');\n\n this.positionEl = document.createElement('span');\n this.charsEl = document.createElement('span');\n this.wordsEl = document.createElement('span');\n\n if (this.options.line || this.options.col) {\n this.footer.appendChild(this.positionEl);\n }\n if (this.options.chars) {\n this.footer.appendChild(this.charsEl);\n }\n if (this.options.words) {\n this.footer.appendChild(this.wordsEl);\n }\n\n container.appendChild(this.footer);\n }\n\n update(textarea) {\n const value = textarea.value;\n const pos = textarea.selectionStart ?? 0;\n\n if (this.options.line || this.options.col) {\n const lines = value.substring(0, pos).split('\\n');\n const parts = [];\n if (this.options.line) parts.push(`Ln ${lines.length}`);\n if (this.options.col) parts.push(`Col ${lines[lines.length - 1].length + 1}`);\n this.positionEl.textContent = parts.join(', ');\n }\n\n if (this.options.chars) {\n this.charsEl.textContent = `${value.length.toLocaleString()} chars`;\n }\n\n if (this.options.words) {\n const wordCount = value.trim() ? value.trim().split(/\\s+/).length : 0;\n this.wordsEl.textContent = `${wordCount.toLocaleString()} words`;\n }\n }\n}\n\nexport default Footer;\n","export default class Diff {\n diff(oldStr, newStr, \n // Type below is not accurate/complete - see above for full possibilities - but it compiles\n options = {}) {\n let callback;\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n else if ('callback' in options) {\n callback = options.callback;\n }\n // Allow subclasses to massage the input prior to running\n const oldString = this.castInput(oldStr, options);\n const newString = this.castInput(newStr, options);\n const oldTokens = this.removeEmpty(this.tokenize(oldString, options));\n const newTokens = this.removeEmpty(this.tokenize(newString, options));\n return this.diffWithOptionsObj(oldTokens, newTokens, options, callback);\n }\n diffWithOptionsObj(oldTokens, newTokens, options, callback) {\n var _a;\n const done = (value) => {\n value = this.postProcess(value, options);\n if (callback) {\n setTimeout(function () { callback(value); }, 0);\n return undefined;\n }\n else {\n return value;\n }\n };\n const newLen = newTokens.length, oldLen = oldTokens.length;\n let editLength = 1;\n let maxEditLength = newLen + oldLen;\n if (options.maxEditLength != null) {\n maxEditLength = Math.min(maxEditLength, options.maxEditLength);\n }\n const maxExecutionTime = (_a = options.timeout) !== null && _a !== void 0 ? _a : Infinity;\n const abortAfterTimestamp = Date.now() + maxExecutionTime;\n const bestPath = [{ oldPos: -1, lastComponent: undefined }];\n // Seed editLength = 0, i.e. the content starts with the same values\n let newPos = this.extractCommon(bestPath[0], newTokens, oldTokens, 0, options);\n if (bestPath[0].oldPos + 1 >= oldLen && newPos + 1 >= newLen) {\n // Identity per the equality and tokenizer\n return done(this.buildValues(bestPath[0].lastComponent, newTokens, oldTokens));\n }\n // Once we hit the right edge of the edit graph on some diagonal k, we can\n // definitely reach the end of the edit graph in no more than k edits, so\n // there's no point in considering any moves to diagonal k+1 any more (from\n // which we're guaranteed to need at least k+1 more edits).\n // Similarly, once we've reached the bottom of the edit graph, there's no\n // point considering moves to lower diagonals.\n // We record this fact by setting minDiagonalToConsider and\n // maxDiagonalToConsider to some finite value once we've hit the edge of\n // the edit graph.\n // This optimization is not faithful to the original algorithm presented in\n // Myers's paper, which instead pointlessly extends D-paths off the end of\n // the edit graph - see page 7 of Myers's paper which notes this point\n // explicitly and illustrates it with a diagram. This has major performance\n // implications for some common scenarios. For instance, to compute a diff\n // where the new text simply appends d characters on the end of the\n // original text of length n, the true Myers algorithm will take O(n+d^2)\n // time while this optimization needs only O(n+d) time.\n let minDiagonalToConsider = -Infinity, maxDiagonalToConsider = Infinity;\n // Main worker method. checks all permutations of a given edit length for acceptance.\n const execEditLength = () => {\n for (let diagonalPath = Math.max(minDiagonalToConsider, -editLength); diagonalPath <= Math.min(maxDiagonalToConsider, editLength); diagonalPath += 2) {\n let basePath;\n const removePath = bestPath[diagonalPath - 1], addPath = bestPath[diagonalPath + 1];\n if (removePath) {\n // No one else is going to attempt to use this value, clear it\n // @ts-expect-error - perf optimisation. This type-violating value will never be read.\n bestPath[diagonalPath - 1] = undefined;\n }\n let canAdd = false;\n if (addPath) {\n // what newPos will be after we do an insertion:\n const addPathNewPos = addPath.oldPos - diagonalPath;\n canAdd = addPath && 0 <= addPathNewPos && addPathNewPos < newLen;\n }\n const canRemove = removePath && removePath.oldPos + 1 < oldLen;\n if (!canAdd && !canRemove) {\n // If this path is a terminal then prune\n // @ts-expect-error - perf optimisation. This type-violating value will never be read.\n bestPath[diagonalPath] = undefined;\n continue;\n }\n // Select the diagonal that we want to branch from. We select the prior\n // path whose position in the old string is the farthest from the origin\n // and does not pass the bounds of the diff graph\n if (!canRemove || (canAdd && removePath.oldPos < addPath.oldPos)) {\n basePath = this.addToPath(addPath, true, false, 0, options);\n }\n else {\n basePath = this.addToPath(removePath, false, true, 1, options);\n }\n newPos = this.extractCommon(basePath, newTokens, oldTokens, diagonalPath, options);\n if (basePath.oldPos + 1 >= oldLen && newPos + 1 >= newLen) {\n // If we have hit the end of both strings, then we are done\n return done(this.buildValues(basePath.lastComponent, newTokens, oldTokens)) || true;\n }\n else {\n bestPath[diagonalPath] = basePath;\n if (basePath.oldPos + 1 >= oldLen) {\n maxDiagonalToConsider = Math.min(maxDiagonalToConsider, diagonalPath - 1);\n }\n if (newPos + 1 >= newLen) {\n minDiagonalToConsider = Math.max(minDiagonalToConsider, diagonalPath + 1);\n }\n }\n }\n editLength++;\n };\n // Performs the length of edit iteration. Is a bit fugly as this has to support the\n // sync and async mode which is never fun. Loops over execEditLength until a value\n // is produced, or until the edit length exceeds options.maxEditLength (if given),\n // in which case it will return undefined.\n if (callback) {\n (function exec() {\n setTimeout(function () {\n if (editLength > maxEditLength || Date.now() > abortAfterTimestamp) {\n return callback(undefined);\n }\n if (!execEditLength()) {\n exec();\n }\n }, 0);\n }());\n }\n else {\n while (editLength <= maxEditLength && Date.now() <= abortAfterTimestamp) {\n const ret = execEditLength();\n if (ret) {\n return ret;\n }\n }\n }\n }\n addToPath(path, added, removed, oldPosInc, options) {\n const last = path.lastComponent;\n if (last && !options.oneChangePerToken && last.added === added && last.removed === removed) {\n return {\n oldPos: path.oldPos + oldPosInc,\n lastComponent: { count: last.count + 1, added: added, removed: removed, previousComponent: last.previousComponent }\n };\n }\n else {\n return {\n oldPos: path.oldPos + oldPosInc,\n lastComponent: { count: 1, added: added, removed: removed, previousComponent: last }\n };\n }\n }\n extractCommon(basePath, newTokens, oldTokens, diagonalPath, options) {\n const newLen = newTokens.length, oldLen = oldTokens.length;\n let oldPos = basePath.oldPos, newPos = oldPos - diagonalPath, commonCount = 0;\n while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(oldTokens[oldPos + 1], newTokens[newPos + 1], options)) {\n newPos++;\n oldPos++;\n commonCount++;\n if (options.oneChangePerToken) {\n basePath.lastComponent = { count: 1, previousComponent: basePath.lastComponent, added: false, removed: false };\n }\n }\n if (commonCount && !options.oneChangePerToken) {\n basePath.lastComponent = { count: commonCount, previousComponent: basePath.lastComponent, added: false, removed: false };\n }\n basePath.oldPos = oldPos;\n return newPos;\n }\n equals(left, right, options) {\n if (options.comparator) {\n return options.comparator(left, right);\n }\n else {\n return left === right\n || (!!options.ignoreCase && left.toLowerCase() === right.toLowerCase());\n }\n }\n removeEmpty(array) {\n const ret = [];\n for (let i = 0; i < array.length; i++) {\n if (array[i]) {\n ret.push(array[i]);\n }\n }\n return ret;\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n castInput(value, options) {\n return value;\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n tokenize(value, options) {\n return Array.from(value);\n }\n join(chars) {\n // Assumes ValueT is string, which is the case for most subclasses.\n // When it's false, e.g. in diffArrays, this method needs to be overridden (e.g. with a no-op)\n // Yes, the casts are verbose and ugly, because this pattern - of having the base class SORT OF\n // assume tokens and values are strings, but not completely - is weird and janky.\n return chars.join('');\n }\n postProcess(changeObjects, \n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n options) {\n return changeObjects;\n }\n get useLongestToken() {\n return false;\n }\n buildValues(lastComponent, newTokens, oldTokens) {\n // First we convert our linked list of components in reverse order to an\n // array in the right order:\n const components = [];\n let nextComponent;\n while (lastComponent) {\n components.push(lastComponent);\n nextComponent = lastComponent.previousComponent;\n delete lastComponent.previousComponent;\n lastComponent = nextComponent;\n }\n components.reverse();\n const componentLen = components.length;\n let componentPos = 0, newPos = 0, oldPos = 0;\n for (; componentPos < componentLen; componentPos++) {\n const component = components[componentPos];\n if (!component.removed) {\n if (!component.added && this.useLongestToken) {\n let value = newTokens.slice(newPos, newPos + component.count);\n value = value.map(function (value, i) {\n const oldValue = oldTokens[oldPos + i];\n return oldValue.length > value.length ? oldValue : value;\n });\n component.value = this.join(value);\n }\n else {\n component.value = this.join(newTokens.slice(newPos, newPos + component.count));\n }\n newPos += component.count;\n // Common case\n if (!component.added) {\n oldPos += component.count;\n }\n }\n else {\n component.value = this.join(oldTokens.slice(oldPos, oldPos + component.count));\n oldPos += component.count;\n }\n }\n return components;\n }\n}\n","import Diff from './base.js';\nclass CharacterDiff extends Diff {\n}\nexport const characterDiff = new CharacterDiff();\nexport function diffChars(oldStr, newStr, options) {\n return characterDiff.diff(oldStr, newStr, options);\n}\n","export function longestCommonPrefix(str1, str2) {\n let i;\n for (i = 0; i < str1.length && i < str2.length; i++) {\n if (str1[i] != str2[i]) {\n return str1.slice(0, i);\n }\n }\n return str1.slice(0, i);\n}\nexport function longestCommonSuffix(str1, str2) {\n let i;\n // Unlike longestCommonPrefix, we need a special case to handle all scenarios\n // where we return the empty string since str1.slice(-0) will return the\n // entire string.\n if (!str1 || !str2 || str1[str1.length - 1] != str2[str2.length - 1]) {\n return '';\n }\n for (i = 0; i < str1.length && i < str2.length; i++) {\n if (str1[str1.length - (i + 1)] != str2[str2.length - (i + 1)]) {\n return str1.slice(-i);\n }\n }\n return str1.slice(-i);\n}\nexport function replacePrefix(string, oldPrefix, newPrefix) {\n if (string.slice(0, oldPrefix.length) != oldPrefix) {\n throw Error(`string ${JSON.stringify(string)} doesn't start with prefix ${JSON.stringify(oldPrefix)}; this is a bug`);\n }\n return newPrefix + string.slice(oldPrefix.length);\n}\nexport function replaceSuffix(string, oldSuffix, newSuffix) {\n if (!oldSuffix) {\n return string + newSuffix;\n }\n if (string.slice(-oldSuffix.length) != oldSuffix) {\n throw Error(`string ${JSON.stringify(string)} doesn't end with suffix ${JSON.stringify(oldSuffix)}; this is a bug`);\n }\n return string.slice(0, -oldSuffix.length) + newSuffix;\n}\nexport function removePrefix(string, oldPrefix) {\n return replacePrefix(string, oldPrefix, '');\n}\nexport function removeSuffix(string, oldSuffix) {\n return replaceSuffix(string, oldSuffix, '');\n}\nexport function maximumOverlap(string1, string2) {\n return string2.slice(0, overlapCount(string1, string2));\n}\n// Nicked from https://stackoverflow.com/a/60422853/1709587\nfunction overlapCount(a, b) {\n // Deal with cases where the strings differ in length\n let startA = 0;\n if (a.length > b.length) {\n startA = a.length - b.length;\n }\n let endB = b.length;\n if (a.length < b.length) {\n endB = a.length;\n }\n // Create a back-reference for each index\n // that should be followed in case of a mismatch.\n // We only need B to make these references:\n const map = Array(endB);\n let k = 0; // Index that lags behind j\n map[0] = 0;\n for (let j = 1; j < endB; j++) {\n if (b[j] == b[k]) {\n map[j] = map[k]; // skip over the same character (optional optimisation)\n }\n else {\n map[j] = k;\n }\n while (k > 0 && b[j] != b[k]) {\n k = map[k];\n }\n if (b[j] == b[k]) {\n k++;\n }\n }\n // Phase 2: use these references while iterating over A\n k = 0;\n for (let i = startA; i < a.length; i++) {\n while (k > 0 && a[i] != b[k]) {\n k = map[k];\n }\n if (a[i] == b[k]) {\n k++;\n }\n }\n return k;\n}\n/**\n * Returns true if the string consistently uses Windows line endings.\n */\nexport function hasOnlyWinLineEndings(string) {\n return string.includes('\\r\\n') && !string.startsWith('\\n') && !string.match(/[^\\r]\\n/);\n}\n/**\n * Returns true if the string consistently uses Unix line endings.\n */\nexport function hasOnlyUnixLineEndings(string) {\n return !string.includes('\\r\\n') && string.includes('\\n');\n}\n/**\n * Split a string into segments using a word segmenter, merging consecutive\n * segments if they are both whitespace segments. Whitespace segments can\n * appear adjacent to one another for two reasons:\n * - newlines always get their own segment\n * - where a diacritic is attached to a whitespace character in the text, the\n * segment ends after the diacritic, so e.g. \" \\u0300 \" becomes two segments.\n * This function therefore runs the segmenter's .segment() method and then\n * merges consecutive segments of whitespace into a single part.\n */\nexport function segment(string, segmenter) {\n const parts = [];\n for (const segmentObj of Array.from(segmenter.segment(string))) {\n const segment = segmentObj.segment;\n if (parts.length && (/\\s/).test(parts[parts.length - 1]) && (/\\s/).test(segment)) {\n parts[parts.length - 1] += segment;\n }\n else {\n parts.push(segment);\n }\n }\n return parts;\n}\n// The functions below take a `segmenter` argument so that, when called from\n// diffWords when it is using a segmenter, they can use a notion of what\n// constitutes \"whitespace\" that is consistent with the segmenter.\n//\n// USUALLY this will be identical to the result of the non-segmenter-based\n// logic, but it differs in at least one case: when whitespace characters are\n// modified by diacritics. A word segmenter considers these diacritics to be\n// part of the whitespace, whereas our non-segmenter-based logic does not.\n//\n// Because the segmenter-based approach necessarily requires segmenting the\n// entire string, we offer a leadingAndTrailingWs function to allow getting the\n// whitespace prefix AND whitespace suffix with a single call to the segmenter,\n// for efficiency's sake.\nexport function trailingWs(string, segmenter) {\n if (segmenter) {\n return leadingAndTrailingWs(string, segmenter)[1];\n }\n // Yes, this looks overcomplicated and dumb - why not replace the whole function with\n // return string.match(/\\s*$/)[0]\n // you ask? Because:\n // 1. the trap described at https://markamery.com/blog/quadratic-time-regexes/ would mean doing\n // this would cause this function to take O(n²) time in the worst case (specifically when\n // there is a massive run of NON-TRAILING whitespace in `string`), and\n // 2. the fix proposed in the same blog post, of using a negative lookbehind, is incompatible\n // with old Safari versions that we'd like to not break if possible (see\n // https://github.com/kpdecker/jsdiff/pull/550)\n // It feels absurd to do this with an explicit loop instead of a regex, but I really can't see a\n // better way that doesn't result in broken behaviour.\n let i;\n for (i = string.length - 1; i >= 0; i--) {\n if (!string[i].match(/\\s/)) {\n break;\n }\n }\n return string.substring(i + 1);\n}\nexport function leadingWs(string, segmenter) {\n if (segmenter) {\n return leadingAndTrailingWs(string, segmenter)[0];\n }\n // Thankfully the annoying considerations described in trailingWs don't apply here:\n const match = string.match(/^\\s*/);\n return match ? match[0] : '';\n}\nexport function leadingAndTrailingWs(string, segmenter) {\n if (!segmenter) {\n return [leadingWs(string), trailingWs(string)];\n }\n if (segmenter.resolvedOptions().granularity != 'word') {\n throw new Error('The segmenter passed must have a granularity of \"word\"');\n }\n const segments = segment(string, segmenter);\n const firstSeg = segments[0];\n const lastSeg = segments[segments.length - 1];\n const head = (/\\s/).test(firstSeg) ? firstSeg : '';\n const tail = (/\\s/).test(lastSeg) ? lastSeg : '';\n return [head, tail];\n}\n","import Diff from './base.js';\nimport { longestCommonPrefix, longestCommonSuffix, replacePrefix, replaceSuffix, removePrefix, removeSuffix, maximumOverlap, leadingWs, trailingWs, leadingAndTrailingWs, segment } from '../util/string.js';\n// Based on https://en.wikipedia.org/wiki/Latin_script_in_Unicode\n//\n// Chars/ranges counted as \"word\" characters by this regex are as follows:\n//\n// + U+00AD Soft hyphen\n// + 00C0–00FF (letters with diacritics from the Latin-1 Supplement), except:\n// - U+00D7 × Multiplication sign\n// - U+00F7 ÷ Division sign\n// + Latin Extended-A, 0100–017F\n// + Latin Extended-B, 0180–024F\n// + IPA Extensions, 0250–02AF\n// + Spacing Modifier Letters, 02B0–02FF, except:\n// - U+02C7 ˇ ˇ Caron\n// - U+02D8 ˘ ˘ Breve\n// - U+02D9 ˙ ˙ Dot Above\n// - U+02DA ˚ ˚ Ring Above\n// - U+02DB ˛ ˛ Ogonek\n// - U+02DC ˜ ˜ Small Tilde\n// - U+02DD ˝ ˝ Double Acute Accent\n// + Latin Extended Additional, 1E00–1EFF\nconst extendedWordChars = 'a-zA-Z0-9_\\\\u{AD}\\\\u{C0}-\\\\u{D6}\\\\u{D8}-\\\\u{F6}\\\\u{F8}-\\\\u{2C6}\\\\u{2C8}-\\\\u{2D7}\\\\u{2DE}-\\\\u{2FF}\\\\u{1E00}-\\\\u{1EFF}';\n// Each token is one of the following:\n// - A punctuation mark plus the surrounding whitespace\n// - A word plus the surrounding whitespace\n// - Pure whitespace (but only in the special case where the entire text\n// is just whitespace)\n//\n// We have to include surrounding whitespace in the tokens because the two\n// alternative approaches produce horribly broken results:\n// * If we just discard the whitespace, we can't fully reproduce the original\n// text from the sequence of tokens and any attempt to render the diff will\n// get the whitespace wrong.\n// * If we have separate tokens for whitespace, then in a typical text every\n// second token will be a single space character. But this often results in\n// the optimal diff between two texts being a perverse one that preserves\n// the spaces between words but deletes and reinserts actual common words.\n// See https://github.com/kpdecker/jsdiff/issues/160#issuecomment-1866099640\n// for an example.\n//\n// Keeping the surrounding whitespace of course has implications for .equals\n// and .join, not just .tokenize.\n// This regex does NOT fully implement the tokenization rules described above.\n// Instead, it gives runs of whitespace their own \"token\". The tokenize method\n// then handles stitching whitespace tokens onto adjacent word or punctuation\n// tokens.\nconst tokenizeIncludingWhitespace = new RegExp(`[${extendedWordChars}]+|\\\\s+|[^${extendedWordChars}]`, 'ug');\nclass WordDiff extends Diff {\n equals(left, right, options) {\n if (options.ignoreCase) {\n left = left.toLowerCase();\n right = right.toLowerCase();\n }\n return left.trim() === right.trim();\n }\n tokenize(value, options = {}) {\n let parts;\n if (options.intlSegmenter) {\n const segmenter = options.intlSegmenter;\n if (segmenter.resolvedOptions().granularity != 'word') {\n throw new Error('The segmenter passed must have a granularity of \"word\"');\n }\n // We want `parts` to be an array whose elements alternate between being\n // pure whitespace and being pure non-whitespace. This is ALMOST what the\n // segments returned by a word-based Intl.Segmenter already look like,\n // but not quite - see explanation in the docs of our custom segment()\n // function.\n parts = segment(value, segmenter);\n }\n else {\n parts = value.match(tokenizeIncludingWhitespace) || [];\n }\n const tokens = [];\n let prevPart = null;\n parts.forEach(part => {\n if ((/\\s/).test(part)) {\n if (prevPart == null) {\n tokens.push(part);\n }\n else {\n tokens.push(tokens.pop() + part);\n }\n }\n else if (prevPart != null && (/\\s/).test(prevPart)) {\n if (tokens[tokens.length - 1] == prevPart) {\n tokens.push(tokens.pop() + part);\n }\n else {\n tokens.push(prevPart + part);\n }\n }\n else {\n tokens.push(part);\n }\n prevPart = part;\n });\n return tokens;\n }\n join(tokens) {\n // Tokens being joined here will always have appeared consecutively in the\n // same text, so we can simply strip off the leading whitespace from all the\n // tokens except the first (and except any whitespace-only tokens - but such\n // a token will always be the first and only token anyway) and then join them\n // and the whitespace around words and punctuation will end up correct.\n return tokens.map((token, i) => {\n if (i == 0) {\n return token;\n }\n else {\n return token.replace((/^\\s+/), '');\n }\n }).join('');\n }\n postProcess(changes, options) {\n if (!changes || options.oneChangePerToken) {\n return changes;\n }\n let lastKeep = null;\n // Change objects representing any insertion or deletion since the last\n // \"keep\" change object. There can be at most one of each.\n let insertion = null;\n let deletion = null;\n changes.forEach(change => {\n if (change.added) {\n insertion = change;\n }\n else if (change.removed) {\n deletion = change;\n }\n else {\n if (insertion || deletion) { // May be false at start of text\n dedupeWhitespaceInChangeObjects(lastKeep, deletion, insertion, change, options.intlSegmenter);\n }\n lastKeep = change;\n insertion = null;\n deletion = null;\n }\n });\n if (insertion || deletion) {\n dedupeWhitespaceInChangeObjects(lastKeep, deletion, insertion, null, options.intlSegmenter);\n }\n return changes;\n }\n}\nexport const wordDiff = new WordDiff();\nexport function diffWords(oldStr, newStr, options) {\n // This option has never been documented and never will be (it's clearer to\n // just call `diffWordsWithSpace` directly if you need that behavior), but\n // has existed in jsdiff for a long time, so we retain support for it here\n // for the sake of backwards compatibility.\n if ((options === null || options === void 0 ? void 0 : options.ignoreWhitespace) != null && !options.ignoreWhitespace) {\n return diffWordsWithSpace(oldStr, newStr, options);\n }\n return wordDiff.diff(oldStr, newStr, options);\n}\nfunction dedupeWhitespaceInChangeObjects(startKeep, deletion, insertion, endKeep, segmenter) {\n // Before returning, we tidy up the leading and trailing whitespace of the\n // change objects to eliminate cases where trailing whitespace in one object\n // is repeated as leading whitespace in the next.\n // Below are examples of the outcomes we want here to explain the code.\n // I=insert, K=keep, D=delete\n // 1. diffing 'foo bar baz' vs 'foo baz'\n // Prior to cleanup, we have K:'foo ' D:' bar ' K:' baz'\n // After cleanup, we want: K:'foo ' D:'bar ' K:'baz'\n //\n // 2. Diffing 'foo bar baz' vs 'foo qux baz'\n // Prior to cleanup, we have K:'foo ' D:' bar ' I:' qux ' K:' baz'\n // After cleanup, we want K:'foo ' D:'bar' I:'qux' K:' baz'\n //\n // 3. Diffing 'foo\\nbar baz' vs 'foo baz'\n // Prior to cleanup, we have K:'foo ' D:'\\nbar ' K:' baz'\n // After cleanup, we want K'foo' D:'\\nbar' K:' baz'\n //\n // 4. Diffing 'foo baz' vs 'foo\\nbar baz'\n // Prior to cleanup, we have K:'foo\\n' I:'\\nbar ' K:' baz'\n // After cleanup, we ideally want K'foo' I:'\\nbar' K:' baz'\n // but don't actually manage this currently (the pre-cleanup change\n // objects don't contain enough information to make it possible).\n //\n // 5. Diffing 'foo bar baz' vs 'foo baz'\n // Prior to cleanup, we have K:'foo ' D:' bar ' K:' baz'\n // After cleanup, we want K:'foo ' D:' bar ' K:'baz'\n //\n // Our handling is unavoidably imperfect in the case where there's a single\n // indel between keeps and the whitespace has changed. For instance, consider\n // diffing 'foo\\tbar\\nbaz' vs 'foo baz'. Unless we create an extra change\n // object to represent the insertion of the space character (which isn't even\n // a token), we have no way to avoid losing information about the texts'\n // original whitespace in the result we return. Still, we do our best to\n // output something that will look sensible if we e.g. print it with\n // insertions in green and deletions in red.\n // Between two \"keep\" change objects (or before the first or after the last\n // change object), we can have either:\n // * A \"delete\" followed by an \"insert\"\n // * Just an \"insert\"\n // * Just a \"delete\"\n // We handle the three cases separately.\n if (deletion && insertion) {\n const [oldWsPrefix, oldWsSuffix] = leadingAndTrailingWs(deletion.value, segmenter);\n const [newWsPrefix, newWsSuffix] = leadingAndTrailingWs(insertion.value, segmenter);\n if (startKeep) {\n const commonWsPrefix = longestCommonPrefix(oldWsPrefix, newWsPrefix);\n startKeep.value = replaceSuffix(startKeep.value, newWsPrefix, commonWsPrefix);\n deletion.value = removePrefix(deletion.value, commonWsPrefix);\n insertion.value = removePrefix(insertion.value, commonWsPrefix);\n }\n if (endKeep) {\n const commonWsSuffix = longestCommonSuffix(oldWsSuffix, newWsSuffix);\n endKeep.value = replacePrefix(endKeep.value, newWsSuffix, commonWsSuffix);\n deletion.value = removeSuffix(deletion.value, commonWsSuffix);\n insertion.value = removeSuffix(insertion.value, commonWsSuffix);\n }\n }\n else if (insertion) {\n // The whitespaces all reflect what was in the new text rather than\n // the old, so we essentially have no information about whitespace\n // insertion or deletion. We just want to dedupe the whitespace.\n // We do that by having each change object keep its trailing\n // whitespace and deleting duplicate leading whitespace where\n // present.\n if (startKeep) {\n const ws = leadingWs(insertion.value, segmenter);\n insertion.value = insertion.value.substring(ws.length);\n }\n if (endKeep) {\n const ws = leadingWs(endKeep.value, segmenter);\n endKeep.value = endKeep.value.substring(ws.length);\n }\n // otherwise we've got a deletion and no insertion\n }\n else if (startKeep && endKeep) {\n const newWsFull = leadingWs(endKeep.value, segmenter), [delWsStart, delWsEnd] = leadingAndTrailingWs(deletion.value, segmenter);\n // Any whitespace that comes straight after startKeep in both the old and\n // new texts, assign to startKeep and remove from the deletion.\n const newWsStart = longestCommonPrefix(newWsFull, delWsStart);\n deletion.value = removePrefix(deletion.value, newWsStart);\n // Any whitespace that comes straight before endKeep in both the old and\n // new texts, and hasn't already been assigned to startKeep, assign to\n // endKeep and remove from the deletion.\n const newWsEnd = longestCommonSuffix(removePrefix(newWsFull, newWsStart), delWsEnd);\n deletion.value = removeSuffix(deletion.value, newWsEnd);\n endKeep.value = replacePrefix(endKeep.value, newWsFull, newWsEnd);\n // If there's any whitespace from the new text that HASN'T already been\n // assigned, assign it to the start:\n startKeep.value = replaceSuffix(startKeep.value, newWsFull, newWsFull.slice(0, newWsFull.length - newWsEnd.length));\n }\n else if (endKeep) {\n // We are at the start of the text. Preserve all the whitespace on\n // endKeep, and just remove whitespace from the end of deletion to the\n // extent that it overlaps with the start of endKeep.\n const endKeepWsPrefix = leadingWs(endKeep.value, segmenter);\n const deletionWsSuffix = trailingWs(deletion.value, segmenter);\n const overlap = maximumOverlap(deletionWsSuffix, endKeepWsPrefix);\n deletion.value = removeSuffix(deletion.value, overlap);\n }\n else if (startKeep) {\n // We are at the END of the text. Preserve all the whitespace on\n // startKeep, and just remove whitespace from the start of deletion to\n // the extent that it overlaps with the end of startKeep.\n const startKeepWsSuffix = trailingWs(startKeep.value, segmenter);\n const deletionWsPrefix = leadingWs(deletion.value, segmenter);\n const overlap = maximumOverlap(startKeepWsSuffix, deletionWsPrefix);\n deletion.value = removePrefix(deletion.value, overlap);\n }\n}\nclass WordsWithSpaceDiff extends Diff {\n tokenize(value) {\n // Slightly different to the tokenizeIncludingWhitespace regex used above in\n // that this one treats each individual newline as a distinct token, rather\n // than merging them into other surrounding whitespace. This was requested\n // in https://github.com/kpdecker/jsdiff/issues/180 &\n // https://github.com/kpdecker/jsdiff/issues/211\n const regex = new RegExp(`(\\\\r?\\\\n)|[${extendedWordChars}]+|[^\\\\S\\\\n\\\\r]+|[^${extendedWordChars}]`, 'ug');\n return value.match(regex) || [];\n }\n}\nexport const wordsWithSpaceDiff = new WordsWithSpaceDiff();\nexport function diffWordsWithSpace(oldStr, newStr, options) {\n return wordsWithSpaceDiff.diff(oldStr, newStr, options);\n}\n","import Diff from './base.js';\nimport { generateOptions } from '../util/params.js';\nclass LineDiff extends Diff {\n constructor() {\n super(...arguments);\n this.tokenize = tokenize;\n }\n equals(left, right, options) {\n // If we're ignoring whitespace, we need to normalise lines by stripping\n // whitespace before checking equality. (This has an annoying interaction\n // with newlineIsToken that requires special handling: if newlines get their\n // own token, then we DON'T want to trim the *newline* tokens down to empty\n // strings, since this would cause us to treat whitespace-only line content\n // as equal to a separator between lines, which would be weird and\n // inconsistent with the documented behavior of the options.)\n if (options.ignoreWhitespace) {\n if (!options.newlineIsToken || !left.includes('\\n')) {\n left = left.trim();\n }\n if (!options.newlineIsToken || !right.includes('\\n')) {\n right = right.trim();\n }\n }\n else if (options.ignoreNewlineAtEof && !options.newlineIsToken) {\n if (left.endsWith('\\n')) {\n left = left.slice(0, -1);\n }\n if (right.endsWith('\\n')) {\n right = right.slice(0, -1);\n }\n }\n return super.equals(left, right, options);\n }\n}\nexport const lineDiff = new LineDiff();\nexport function diffLines(oldStr, newStr, options) {\n return lineDiff.diff(oldStr, newStr, options);\n}\nexport function diffTrimmedLines(oldStr, newStr, options) {\n options = generateOptions(options, { ignoreWhitespace: true });\n return lineDiff.diff(oldStr, newStr, options);\n}\n// Exported standalone so it can be used from jsonDiff too.\nexport function tokenize(value, options) {\n if (options.stripTrailingCr) {\n // remove one \\r before \\n to match GNU diff's --strip-trailing-cr behavior\n value = value.replace(/\\r\\n/g, '\\n');\n }\n const retLines = [], linesAndNewlines = value.split(/(\\n|\\r\\n)/);\n // Ignore the final empty token that occurs if the string ends with a new line\n if (!linesAndNewlines[linesAndNewlines.length - 1]) {\n linesAndNewlines.pop();\n }\n // Merge the content and line separators into single tokens\n for (let i = 0; i < linesAndNewlines.length; i++) {\n const line = linesAndNewlines[i];\n if (i % 2 && !options.newlineIsToken) {\n retLines[retLines.length - 1] += line;\n }\n else {\n retLines.push(line);\n }\n }\n return retLines;\n}\n","import Diff from './base.js';\nfunction isSentenceEndPunct(char) {\n return char == '.' || char == '!' || char == '?';\n}\nclass SentenceDiff extends Diff {\n tokenize(value) {\n var _a;\n // If in future we drop support for environments that don't support lookbehinds, we can replace\n // this entire function with:\n // return value.split(/(?<=[.!?])(\\s+|$)/);\n // but until then, for similar reasons to the trailingWs function in string.ts, we are forced\n // to do this verbosely \"by hand\" instead of using a regex.\n const result = [];\n let tokenStartI = 0;\n for (let i = 0; i < value.length; i++) {\n if (i == value.length - 1) {\n result.push(value.slice(tokenStartI));\n break;\n }\n if (isSentenceEndPunct(value[i]) && value[i + 1].match(/\\s/)) {\n // We've hit a sentence break - i.e. a punctuation mark followed by whitespace.\n // We now want to push TWO tokens to the result:\n // 1. the sentence\n result.push(value.slice(tokenStartI, i + 1));\n // 2. the whitespace\n i = tokenStartI = i + 1;\n while ((_a = value[i + 1]) === null || _a === void 0 ? void 0 : _a.match(/\\s/)) {\n i++;\n }\n result.push(value.slice(tokenStartI, i + 1));\n // Then the next token (a sentence) starts on the character after the whitespace.\n // (It's okay if this is off the end of the string - then the outer loop will terminate\n // here anyway.)\n tokenStartI = i + 1;\n }\n }\n return result;\n }\n}\nexport const sentenceDiff = new SentenceDiff();\nexport function diffSentences(oldStr, newStr, options) {\n return sentenceDiff.diff(oldStr, newStr, options);\n}\n","import Diff from './base.js';\nclass CssDiff extends Diff {\n tokenize(value) {\n return value.split(/([{}:;,]|\\s+)/);\n }\n}\nexport const cssDiff = new CssDiff();\nexport function diffCss(oldStr, newStr, options) {\n return cssDiff.diff(oldStr, newStr, options);\n}\n","import Diff from './base.js';\nimport { tokenize } from './line.js';\nclass JsonDiff extends Diff {\n constructor() {\n super(...arguments);\n this.tokenize = tokenize;\n }\n get useLongestToken() {\n // Discriminate between two lines of pretty-printed, serialized JSON where one of them has a\n // dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output:\n return true;\n }\n castInput(value, options) {\n const { undefinedReplacement, stringifyReplacer = (k, v) => typeof v === 'undefined' ? undefinedReplacement : v } = options;\n return typeof value === 'string' ? value : JSON.stringify(canonicalize(value, null, null, stringifyReplacer), null, ' ');\n }\n equals(left, right, options) {\n return super.equals(left.replace(/,([\\r\\n])/g, '$1'), right.replace(/,([\\r\\n])/g, '$1'), options);\n }\n}\nexport const jsonDiff = new JsonDiff();\nexport function diffJson(oldStr, newStr, options) {\n return jsonDiff.diff(oldStr, newStr, options);\n}\n// This function handles the presence of circular references by bailing out when encountering an\n// object that is already on the \"stack\" of items being processed. Accepts an optional replacer\nexport function canonicalize(obj, stack, replacementStack, replacer, key) {\n stack = stack || [];\n replacementStack = replacementStack || [];\n if (replacer) {\n obj = replacer(key === undefined ? '' : key, obj);\n }\n let i;\n for (i = 0; i < stack.length; i += 1) {\n if (stack[i] === obj) {\n return replacementStack[i];\n }\n }\n let canonicalizedObj;\n if ('[object Array]' === Object.prototype.toString.call(obj)) {\n stack.push(obj);\n canonicalizedObj = new Array(obj.length);\n replacementStack.push(canonicalizedObj);\n for (i = 0; i < obj.length; i += 1) {\n canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack, replacer, String(i));\n }\n stack.pop();\n replacementStack.pop();\n return canonicalizedObj;\n }\n if (obj && obj.toJSON) {\n obj = obj.toJSON();\n }\n if (typeof obj === 'object' && obj !== null) {\n stack.push(obj);\n canonicalizedObj = {};\n replacementStack.push(canonicalizedObj);\n const sortedKeys = [];\n let key;\n for (key in obj) {\n /* istanbul ignore else */\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n sortedKeys.push(key);\n }\n }\n sortedKeys.sort();\n for (i = 0; i < sortedKeys.length; i += 1) {\n key = sortedKeys[i];\n canonicalizedObj[key] = canonicalize(obj[key], stack, replacementStack, replacer, key);\n }\n stack.pop();\n replacementStack.pop();\n }\n else {\n canonicalizedObj = obj;\n }\n return canonicalizedObj;\n}\n","import Diff from './base.js';\nclass ArrayDiff extends Diff {\n tokenize(value) {\n return value.slice();\n }\n join(value) {\n return value;\n }\n removeEmpty(value) {\n return value;\n }\n}\nexport const arrayDiff = new ArrayDiff();\nexport function diffArrays(oldArr, newArr, options) {\n return arrayDiff.diff(oldArr, newArr, options);\n}\n","import { diffChars } from 'diff';\n\nexport default class UndoRedoManager {\n constructor(editor) {\n this.editor = editor;\n this.textarea = editor.usertextarea;\n this.undoStack = [];\n this.redoStack = [];\n \n // Internal tracking\n this.lastValue = this.textarea.value;\n this.lastSelection = {\n selectionStart: this.textarea.selectionStart,\n selectionEnd: this.textarea.selectionEnd\n };\n\n // Settings\n this.debounceDelay = 1000;\n this.maxStackSize = 100;\n this._debounceTimer = null;\n\n this._bindEvents();\n }\n\n _bindEvents() {\n this._keydownHandler = (e) => this._onKeyDown(e);\n this._selectHandler = () => this._updateLastSelection();\n this._mousedownHandler = () => setTimeout(() => this._updateLastSelection(), 0);\n this._beforeinputHandler = (e) => {\n if (e.inputType === 'historyUndo') { e.preventDefault(); this.undo(); }\n else if (e.inputType === 'historyRedo') { e.preventDefault(); this.redo(); }\n };\n this._inputHandler = (e) => this._onInput(e);\n this._pasteHandler = () => this._saveState();\n this._blurHandler = () => this._saveState();\n\n this.textarea.addEventListener('keydown', this._keydownHandler);\n this.textarea.addEventListener('select', this._selectHandler);\n this.textarea.addEventListener('mousedown', this._mousedownHandler);\n this.textarea.addEventListener('beforeinput', this._beforeinputHandler);\n this.textarea.addEventListener('input', this._inputHandler);\n this.textarea.addEventListener('paste', this._pasteHandler);\n this.textarea.addEventListener('blur', this._blurHandler);\n }\n\n destroy() {\n clearTimeout(this._debounceTimer);\n this.textarea.removeEventListener('keydown', this._keydownHandler);\n this.textarea.removeEventListener('select', this._selectHandler);\n this.textarea.removeEventListener('mousedown', this._mousedownHandler);\n this.textarea.removeEventListener('beforeinput', this._beforeinputHandler);\n this.textarea.removeEventListener('input', this._inputHandler);\n this.textarea.removeEventListener('paste', this._pasteHandler);\n this.textarea.removeEventListener('blur', this._blurHandler);\n }\n\n _updateLastSelection() {\n // We only care about updating this if the value hasn't changed yet.\n // This marks the \"starting point\" for the next undo step.\n this.lastSelection = {\n selectionStart: this.textarea.selectionStart,\n selectionEnd: this.textarea.selectionEnd\n };\n }\n\n _onKeyDown(e) {\n const modifier = e.metaKey || e.ctrlKey;\n const isZ = e.key.toLowerCase() === 'z';\n const isY = e.key.toLowerCase() === 'y';\n const isShift = e.shiftKey;\n\n // 1. CRITICAL: Save state before selection is overwritten or deleted\n const hasSelection = this.textarea.selectionStart !== this.textarea.selectionEnd;\n const isDeletiveKey = e.key === 'Backspace' || e.key === 'Delete' || e.key === 'Enter';\n\n if (hasSelection && (e.key.length === 1 || isDeletiveKey)) {\n this._saveState();\n }\n\n // 2. Save state on structural keys (Enter, Delete, etc.) or generic Modifiers\n if (modifier || isDeletiveKey) {\n this._saveState();\n }\n\n // 3. UNDO: (Cmd+Z or Ctrl+Z)\n if (modifier && isZ && !isShift) {\n e.preventDefault();\n this.undo();\n } \n \n // 4. REDO: (Cmd+Shift+Z, Ctrl+Shift+Z, or Ctrl+Y)\n else if (modifier && ( (isShift && isZ) || (!e.metaKey && isY) )) {\n e.preventDefault();\n this.redo();\n }\n }\n\n _onInput(e) {\n clearTimeout(this._debounceTimer);\n const value = this.textarea.value;\n const lastChar = value[this.textarea.selectionStart - 1];\n \n if (lastChar && /[\\s.,;:!?()\\[\\]{}'\"`~]/.test(lastChar)) {\n this._saveState();\n } else {\n this._debounceTimer = setTimeout(() => this._saveState(), this.debounceDelay);\n }\n }\n\n _saveState() {\n const newValue = this.textarea.value || '';\n \n // 1. If nothing changed, exit immediately to save CPU\n if (newValue === this.lastValue) return;\n\n // 2. Clear any pending debounced timers so we don't save twice\n clearTimeout(this._debounceTimer);\n\n const diff = diffChars(this.lastValue, newValue);\n \n this.undoStack.push({\n diff,\n selection: { ...this.lastSelection }\n });\n\n // --- Performance Optimization: Max Depth ---\n // If the stack exceeds the limit, remove the oldest entry (bottom of stack)\n if (this.undoStack.length > this.maxStackSize) {\n this.undoStack.shift(); \n }\n\n this.lastValue = newValue;\n this._updateLastSelection();\n this.redoStack = []; // Standard: typing new text clears redo history\n }\n\n undo() {\n if (this.undoStack.length === 0) return;\n\n const lastStep = this.undoStack.pop();\n const prevValue = this._revertDiff(this.lastValue, lastStep.diff);\n\n this.redoStack.push({\n diff: lastStep.diff,\n selection: { \n selectionStart: this.textarea.selectionStart, \n selectionEnd: this.textarea.selectionEnd \n }\n });\n\n this._restoreState(prevValue, lastStep.selection);\n }\n\n redo() {\n if (this.redoStack.length === 0) return;\n\n const redoStep = this.redoStack.pop();\n const newValue = this._applyDiff(this.lastValue, redoStep.diff);\n\n this.undoStack.push({\n diff: redoStep.diff,\n selection: { ...this.lastSelection }\n });\n\n this._restoreState(newValue, redoStep.selection);\n }\n\n _applyDiff(oldValue, diff) {\n let newValue = '';\n diff.forEach(part => { if (!part.removed) newValue += part.value; });\n return newValue;\n }\n\n _revertDiff(currentValue, diff) {\n let oldValue = '';\n diff.forEach(part => { if (!part.added) oldValue += part.value; });\n return oldValue;\n }\n\n _restoreState(value, selection) {\n this.textarea.value = value;\n this.textarea.setSelectionRange(selection.selectionStart, selection.selectionEnd);\n this.lastValue = value;\n this.lastSelection = { ...selection };\n \n if (this.editor.render) this.editor.render();\n this.editor.notifyChange();\n this.textarea.focus();\n }\n}","export default class IndentManager {\n constructor(editor, renderCallback) {\n this.editor = editor;\n this.textarea = editor.usertextarea;\n this.renderCallback = renderCallback;\n this.pairs = {\n '{': '}',\n '[': ']',\n '(': ')',\n '<': '>',\n '\"': '\"',\n \"'\": \"'\"\n };\n this.init();\n }\n\n init() {\n this.textarea.addEventListener('keydown', (e) => {\n switch (e.key) {\n case 'Tab':\n e.preventDefault();\n e.shiftKey ? this.outdent() : this.indent();\n this._triggerUpdate();\n break;\n case 'Enter':\n this.autoIndent(e);\n break;\n case 'Backspace':\n this.handleBackspace(e);\n break;\n default:\n if (this.pairs[e.key]) this.handlePairs(e);\n }\n });\n }\n\n handlePairs(e) {\n const { textarea } = this;\n const { selectionStart, selectionEnd, value } = textarea;\n const char = e.key;\n\n // 1. Overtyping Logic\n // If the cursor is right before the closing character and the user types it\n if (selectionStart === selectionEnd && value[selectionStart] === char) {\n const isClosingChar = Object.values(this.pairs).includes(char);\n if (isClosingChar) {\n e.preventDefault();\n const newPos = selectionStart + 1;\n textarea.setSelectionRange(newPos, newPos);\n return; // Just move the cursor, don't trigger an update\n }\n }\n\n const open = char;\n const close = this.pairs[open];\n if (!close) return; // Not a paired character\n\n // 2. Selection Wrapping\n if (selectionStart !== selectionEnd) {\n e.preventDefault();\n const selectedText = value.substring(selectionStart, selectionEnd);\n const newValue = value.substring(0, selectionStart) + open + selectedText + close + value.substring(selectionEnd);\n \n textarea.value = newValue;\n textarea.setSelectionRange(selectionStart + 1, selectionEnd + 1);\n this._triggerUpdate();\n } \n \n // 3. Standard Pair Insertion\n else {\n e.preventDefault();\n const before = value.substring(0, selectionStart);\n const after = value.substring(selectionEnd);\n \n textarea.value = before + open + close + after;\n textarea.setSelectionRange(selectionStart + 1, selectionStart + 1);\n this._triggerUpdate();\n }\n }\n\n // Add this to your init() listener for 'keydown'\n handleBackspace(e) {\n const { textarea } = this;\n const { selectionStart, selectionEnd, value } = textarea;\n\n if (selectionStart === selectionEnd && selectionStart > 0) {\n const charBefore = value[selectionStart - 1];\n const charAfter = value[selectionStart];\n\n // If user deletes '(' when text is '()', delete the ')' too\n if (this.pairs[charBefore] === charAfter) {\n e.preventDefault();\n const before = value.substring(0, selectionStart - 1);\n const after = value.substring(selectionStart + 1);\n \n textarea.value = before + after;\n textarea.setSelectionRange(selectionStart - 1, selectionStart - 1);\n this._triggerUpdate();\n }\n }\n }\n\n autoIndent(e) {\n const { textarea } = this;\n const { selectionStart, value } = textarea;\n\n const lastNewline = value.lastIndexOf('\\n', selectionStart - 1);\n const currentLine = value.substring(lastNewline + 1, selectionStart);\n\n // Let ListManager handle list continuation\n if (/^(\\s*)([\\-\\*] |\\d+\\. )/.test(currentLine)) return;\n\n const indent = (currentLine.match(/^[ \\t]*/) || [''])[0];\n\n // EXTRA: If user hits Enter between { and }, add an extra indent level\n const charBefore = value[selectionStart - 1];\n const charAfter = value[selectionStart];\n \n if (charBefore === '{' && charAfter === '}') {\n e.preventDefault();\n const tab = '\\t'; // or ' '\n const insertion = '\\n' + indent + tab + '\\n' + indent;\n \n textarea.value = value.substring(0, selectionStart) + insertion + value.substring(selectionStart);\n \n // Put cursor on the middle (indented) line\n const newPos = selectionStart + indent.length + tab.length + 1;\n textarea.setSelectionRange(newPos, newPos);\n this._triggerUpdate();\n return;\n }\n\n if (indent.length > 0) {\n e.preventDefault();\n const insertion = '\\n' + indent;\n textarea.value = value.substring(0, selectionStart) + insertion + value.substring(textarea.selectionEnd);\n const newPos = selectionStart + insertion.length;\n textarea.setSelectionRange(newPos, newPos);\n this._triggerUpdate();\n }\n }\n\n _triggerUpdate() {\n if (typeof this.renderCallback === 'function') this.renderCallback();\n this.textarea.dispatchEvent(new Event('input', { bubbles: true }));\n }\n\n // Inside IndentManager class\n indent() {\n const { textarea } = this;\n const { selectionStart, selectionEnd, value } = textarea;\n\n const startPos = value.lastIndexOf('\\n', selectionStart - 1) + 1;\n let endPos = value.indexOf('\\n', selectionEnd);\n if (endPos === -1) endPos = value.length;\n\n const targetText = value.substring(startPos, endPos);\n const lines = targetText.split('\\n');\n const indentedText = lines.map(line => '\\t' + line).join('\\n');\n\n this._applyChange(\n value.substring(0, startPos) + indentedText + value.substring(endPos),\n selectionStart + 1,\n selectionEnd + lines.length\n );\n }\n\n outdent() {\n const { textarea } = this;\n const { selectionStart, selectionEnd, value } = textarea;\n\n // 1. Find the start and end of the affected lines\n const startPos = value.lastIndexOf('\\n', selectionStart - 1) + 1;\n let endPos = value.indexOf('\\n', selectionEnd);\n if (endPos === -1) endPos = value.length;\n\n const targetText = value.substring(startPos, endPos);\n const lines = targetText.split('\\n');\n \n let removedFromFirst = 0;\n let totalRemoved = 0;\n\n // 2. Process each line\n const unindentedText = lines.map((line, index) => {\n if (line.startsWith('\\t')) {\n if (index === 0) removedFromFirst = 1;\n totalRemoved++;\n return line.substring(1);\n } else if (line.startsWith(' ')) { // Optional: handle 4-space indent\n if (index === 0) removedFromFirst = 4;\n totalRemoved += 4;\n return line.substring(4);\n }\n return line;\n }).join('\\n');\n\n // 3. Apply the change to the DOM\n this._applyChange(\n value.substring(0, startPos) + unindentedText + value.substring(endPos),\n Math.max(startPos, selectionStart - removedFromFirst),\n Math.max(startPos, selectionEnd - totalRemoved)\n );\n }\n\n _applyChange(newValue, newStart, newEnd) {\n this.textarea.value = newValue;\n this.textarea.setSelectionRange(newStart, newEnd);\n }\n}","class ListManager {\n constructor(editor) {\n this.editor = editor;\n this.textarea = editor.usertextarea;\n\n this._keydownHandler = (e) => { if (e.key === 'Enter') this.handleEnter(e); };\n this.textarea.addEventListener('keydown', this._keydownHandler);\n }\n\n destroy() {\n this.textarea.removeEventListener('keydown', this._keydownHandler);\n }\n\n handleEnter(event) {\n const { selectionStart, value } = this.textarea;\n\n const lastNewline = value.lastIndexOf('\\n', selectionStart - 1);\n const lineStart = lastNewline + 1;\n const currentLine = value.substring(lineStart, selectionStart);\n\n // Patterns\n const olMatch = currentLine.match(/^(\\s*)(\\d+)\\.\\s/);\n const taskMatch = currentLine.match(/^(\\s*)([\\-\\*] )\\[[\\s xX]\\] /);\n const ulMatch = currentLine.match(/^(\\s*)([\\-\\*] )\\s*/);\n const isEmptyList = currentLine.match(/^(\\s*)(\\d+\\.\\s|[\\-\\*] \\[[\\s xX]\\] |[\\-\\*]\\s)$/);\n\n // Exit list if line is empty\n if (isEmptyList) {\n event.preventDefault();\n const before = value.substring(0, lineStart);\n const after = value.substring(selectionStart);\n this.textarea.value = before + \"\\n\" + after;\n this.textarea.setSelectionRange(lineStart + 1, lineStart + 1);\n this.editor.render();\n this.editor.notifyChange();\n return;\n }\n\n let continuation = null;\n if (olMatch) {\n continuation = `${olMatch[1]}${parseInt(olMatch[2]) + 1}. `;\n } else if (taskMatch) {\n continuation = `${taskMatch[1]}${taskMatch[2]}[ ] `;\n } else if (ulMatch) {\n continuation = `${ulMatch[1]}${ulMatch[2]}`;\n }\n\n if (continuation) {\n event.preventDefault();\n const insert = `\\n${continuation}`;\n const before = value.substring(0, selectionStart);\n const after = value.substring(selectionStart);\n this.textarea.value = before + insert + after;\n const cursor = selectionStart + insert.length;\n this.textarea.setSelectionRange(cursor, cursor);\n this.editor.render();\n this.editor.notifyChange();\n }\n }\n}\n\nexport default ListManager;","import BoldTool from '../components/toolbar/tools/BoldTool.js';\nimport ItalicTool from '../components/toolbar/tools/ItalicTool.js';\nimport StrikethroughTool from '../components/toolbar/tools/StrikethroughTool.js';\nimport CodeTool from '../components/toolbar/tools/CodeTool.js';\nimport LinkTool from '../components/toolbar/tools/LinkTool.js';\nimport HeadingTool from '../components/toolbar/tools/HeadingTool.js';\nimport ULTool from '../components/toolbar/tools/ULTool.js';\n\nconst DEFAULT_SHORTCUTS = [\n { key: 'b', ctrl: true, shift: false, ToolClass: BoldTool, label: 'Ctrl+B', btnClass: 'bold-btn' },\n { key: 'i', ctrl: true, shift: false, ToolClass: ItalicTool, label: 'Ctrl+I', btnClass: 'italic-btn' },\n { key: 'k', ctrl: true, shift: false, ToolClass: LinkTool, label: 'Ctrl+K', btnClass: 'link-btn' },\n { key: '`', ctrl: true, shift: false, ToolClass: CodeTool, label: 'Ctrl+`', btnClass: 'code-btn' },\n { key: 's', ctrl: true, shift: true, ToolClass: StrikethroughTool, label: 'Ctrl+Shift+S', btnClass: 'strikethrough-btn' },\n { key: 'l', ctrl: true, shift: false, ToolClass: ULTool, label: 'Ctrl+L', btnClass: 'ul-btn' },\n];\n\n/** Turns 'Ctrl+Shift+K' into something comparable against a keydown event. */\nfunction parseShortcut(spec) {\n const parts = String(spec).split('+').map(s => s.trim().toLowerCase());\n const key = parts.pop();\n if (!key) return null;\n return {\n key,\n ctrl: parts.includes('ctrl') || parts.includes('cmd') || parts.includes('meta'),\n shift: parts.includes('shift'),\n alt: parts.includes('alt'),\n };\n}\n\nexport default class ShortcutManager {\n constructor(editor) {\n this.editor = editor;\n // Shortcuts declared by tools, including custom ones. Collected once,\n // after the toolbar exists, so a tool only has to set this.shortcut.\n this.toolShortcuts = (editor.toolbarInstance?.tools ?? [])\n .filter(tool => tool.shortcut)\n .map(tool => ({ tool, combo: parseShortcut(tool.shortcut) }))\n .filter(entry => entry.combo);\n\n // Ctrl+1/2/3 must offer the same levels the dropdown does, or the\n // keyboard inserts a heading the toolbar says is unavailable. With no\n // heading tool in the toolbar there is nothing to disagree with, so the\n // shortcuts keep working on all six.\n const headingTool = (editor.toolbarInstance?.tools ?? [])\n .find(tool => tool instanceof HeadingTool);\n this.headingLevels = headingTool?.levels ?? [1, 2, 3, 4, 5, 6];\n\n this._handler = this._onKeyDown.bind(this);\n this._docHandler = this._onDocKeyDown.bind(this);\n editor.usertextarea.addEventListener('keydown', this._handler);\n document.addEventListener('keydown', this._docHandler);\n this._updateTooltips();\n }\n\n _onKeyDown(e) {\n const ctrl = e.ctrlKey || e.metaKey;\n const shift = e.shiftKey;\n const key = e.key.toLowerCase();\n\n // Fullscreen: Ctrl+Shift+F\n if (ctrl && shift && key === 'f') {\n e.preventDefault();\n this.editor.editorContainer.querySelector('.preview-btn')?.click();\n return;\n }\n\n // Heading shortcuts: Ctrl+1 / Ctrl+2 / Ctrl+3, for the levels on offer\n if (ctrl && !shift && ['1', '2', '3'].includes(e.key)\n && this.headingLevels.includes(parseInt(e.key))) {\n e.preventDefault();\n new HeadingTool(this.editor).applyHeading(parseInt(e.key));\n return;\n }\n\n // Tool-declared shortcuts win, so a custom tool can deliberately take\n // over a combination the editor would otherwise handle.\n for (const { tool, combo } of this.toolShortcuts) {\n if (key === combo.key && ctrl === combo.ctrl && shift === combo.shift && e.altKey === combo.alt) {\n e.preventDefault();\n tool.applySyntax(e);\n return;\n }\n }\n\n for (const shortcut of DEFAULT_SHORTCUTS) {\n if (key === shortcut.key && ctrl === shortcut.ctrl && shift === shortcut.shift) {\n e.preventDefault();\n new shortcut.ToolClass(this.editor).applySyntax(e);\n return;\n }\n }\n }\n\n _onDocKeyDown(e) {\n // F11 → toggle fullscreen when editor is focused or already in fullscreen\n if (e.key === 'F11') {\n const editorFocused = this.editor.editorContainer.contains(document.activeElement);\n const inFullscreen = this.editor.editorContainer.classList.contains('is-fullscreen');\n if (editorFocused || inFullscreen) {\n e.preventDefault();\n this.editor.editorContainer.querySelector('.preview-btn')?.click();\n }\n }\n }\n\n _updateTooltips() {\n for (const { btnClass, label } of DEFAULT_SHORTCUTS) {\n const btn = this.editor.editorContainer.querySelector(`.${btnClass}`);\n if (btn) btn.title += ` (${label})`;\n }\n const headingBtn = this.editor.editorContainer.querySelector('.heading-btn');\n const headingKeys = this.headingLevels.filter(n => n <= 3);\n if (headingBtn && headingKeys.length) {\n headingBtn.title += ` (Ctrl+${headingKeys.join('/')})`;\n }\n const previewBtn = this.editor.editorContainer.querySelector('.preview-btn');\n if (previewBtn) previewBtn.title += ' (F11)';\n\n // Tool-declared shortcuts get the same treatment as the built-ins\n for (const { tool } of this.toolShortcuts) {\n if (tool.button) tool.button.title += ` (${tool.shortcut})`;\n }\n }\n\n destroy() {\n this.editor.usertextarea.removeEventListener('keydown', this._handler);\n document.removeEventListener('keydown', this._docHandler);\n }\n}\n","export default class FindReplace {\n constructor(editor) {\n this.editor = editor;\n this._matches = [];\n this._currentIndex = -1;\n this._caseSensitive = false;\n this._panel = null;\n this._findInput = null;\n this._replaceInput = null;\n this._countEl = null;\n this._replaceRow = null;\n this._caseSensitiveBtn = null;\n this._highlightEl = null;\n this._scrollHandler = null;\n\n this._taHandler = this._onTextareaKeyDown.bind(this);\n editor.usertextarea.addEventListener('keydown', this._taHandler);\n }\n\n _onTextareaKeyDown(e) {\n const ctrl = e.ctrlKey || e.metaKey;\n if (ctrl && e.key === 'f') {\n e.preventDefault();\n this.open(false);\n } else if (ctrl && e.key === 'h') {\n e.preventDefault();\n this.open(true);\n }\n }\n\n open(withReplace = false) {\n if (!this._panel) this._buildPanel();\n this._panel.hidden = false;\n if (withReplace) {\n this._replaceRow.hidden = false;\n }\n this._findInput.focus();\n this._findInput.select();\n\n const sel = this.editor.usertextarea.value.substring(\n this.editor.usertextarea.selectionStart,\n this.editor.usertextarea.selectionEnd\n );\n if (sel && !sel.includes('\\n')) {\n this._findInput.value = sel;\n }\n\n if (!this._scrollHandler) {\n this._scrollHandler = () => this._showMatchHighlight();\n this.editor.usertextarea.addEventListener('scroll', this._scrollHandler);\n }\n\n this._search();\n }\n\n close() {\n if (!this._panel) return;\n this._panel.hidden = true;\n this._clearMatchHighlight();\n\n if (this._scrollHandler) {\n this.editor.usertextarea.removeEventListener('scroll', this._scrollHandler);\n this._scrollHandler = null;\n }\n\n const textarea = this.editor.usertextarea;\n if (this._currentIndex !== -1 && this._matches.length) {\n const { start, end } = this._matches[this._currentIndex];\n textarea.focus();\n textarea.setSelectionRange(start, end);\n } else {\n textarea.focus();\n }\n\n this._matches = [];\n this._currentIndex = -1;\n }\n\n _buildPanel() {\n const panel = document.createElement('div');\n panel.className = 'find-replace-panel fj:absolute fj:top-1 fj:right-1 fj:z-20 fj:me-surface fj:me-surface-outline fj:me-surface-rounded fj:p-1.5 fj:flex fj:flex-col fj:gap-1 fj:shadow-lg';\n panel.setAttribute('role', 'search');\n panel.setAttribute('aria-label', 'Find and replace');\n\n // ── Find row ────────────────────────────────────────────────\n const findRow = document.createElement('div');\n findRow.className = 'fj:flex fj:items-center fj:gap-1';\n\n this._findInput = document.createElement('input');\n this._findInput.type = 'text';\n this._findInput.placeholder = 'Find';\n this._findInput.className = 'fj:me-input fj:me-input-xs fj:w-36';\n this._findInput.setAttribute('aria-label', 'Find');\n this._findInput.addEventListener('input', () => this._search());\n this._findInput.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') { e.shiftKey ? this._prev() : this._next(); }\n if (e.key === 'Escape') { e.preventDefault(); this.close(); }\n });\n\n this._countEl = document.createElement('span');\n this._countEl.className = 'fj:text-xs fj:opacity-50 fj:whitespace-nowrap fj:min-w-[3.5rem] fj:text-center fj:select-none';\n this._countEl.setAttribute('aria-live', 'polite');\n\n const prevBtn = this._iconBtn(\n 'Previous match',\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m18 15-6-6-6 6\"/></svg>`\n );\n prevBtn.addEventListener('click', () => this._prev());\n\n const nextBtn = this._iconBtn(\n 'Next match',\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m6 9 6 6 6-6\"/></svg>`\n );\n nextBtn.addEventListener('click', () => this._next());\n\n this._caseSensitiveBtn = document.createElement('button');\n this._caseSensitiveBtn.type = 'button';\n this._caseSensitiveBtn.className = 'fj:me-btn fj:me-btn-xs fj:me-btn-square fj:me-btn-ghost fj:text-xs fj:font-bold';\n this._caseSensitiveBtn.textContent = 'Aa';\n this._caseSensitiveBtn.setAttribute('aria-label', 'Match case');\n this._caseSensitiveBtn.setAttribute('aria-pressed', 'false');\n this._caseSensitiveBtn.title = 'Match case';\n this._caseSensitiveBtn.addEventListener('click', () => {\n this._caseSensitive = !this._caseSensitive;\n this._caseSensitiveBtn.setAttribute('aria-pressed', String(this._caseSensitive));\n this._caseSensitiveBtn.classList.toggle('fj:me-btn-active', this._caseSensitive);\n this._search();\n });\n\n const replaceToggle = document.createElement('button');\n replaceToggle.type = 'button';\n replaceToggle.className = 'fj:me-btn fj:me-btn-xs fj:me-btn-ghost fj:text-xs fj:px-1.5';\n replaceToggle.textContent = 'Replace';\n replaceToggle.setAttribute('aria-label', 'Toggle replace row');\n replaceToggle.addEventListener('click', () => {\n this._replaceRow.hidden = !this._replaceRow.hidden;\n if (!this._replaceRow.hidden) this._replaceInput.focus();\n });\n\n const closeBtn = this._iconBtn(\n 'Close',\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/></svg>`\n );\n closeBtn.addEventListener('click', () => this.close());\n\n findRow.append(this._findInput, this._countEl, prevBtn, nextBtn, this._caseSensitiveBtn, replaceToggle, closeBtn);\n\n // ── Replace row ─────────────────────────────────────────────\n this._replaceRow = document.createElement('div');\n this._replaceRow.className = 'fj:flex fj:items-center fj:gap-1';\n this._replaceRow.hidden = true;\n\n this._replaceInput = document.createElement('input');\n this._replaceInput.type = 'text';\n this._replaceInput.placeholder = 'Replace';\n this._replaceInput.className = 'fj:me-input fj:me-input-xs fj:w-36';\n this._replaceInput.setAttribute('aria-label', 'Replace with');\n this._replaceInput.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') this._replace();\n if (e.key === 'Escape') { e.preventDefault(); this.close(); }\n });\n\n const replaceBtn = document.createElement('button');\n replaceBtn.type = 'button';\n replaceBtn.className = 'fj:me-btn fj:me-btn-xs fj:me-btn-ghost fj:text-xs fj:px-1.5';\n replaceBtn.textContent = 'Replace';\n replaceBtn.addEventListener('click', () => this._replace());\n\n const replaceAllBtn = document.createElement('button');\n replaceAllBtn.type = 'button';\n replaceAllBtn.className = 'fj:me-btn fj:me-btn-xs fj:me-btn-ghost fj:text-xs fj:px-1.5';\n replaceAllBtn.textContent = 'All';\n replaceAllBtn.setAttribute('aria-label', 'Replace all');\n replaceAllBtn.addEventListener('click', () => this._replaceAll());\n\n this._replaceRow.append(this._replaceInput, replaceBtn, replaceAllBtn);\n\n panel.append(findRow, this._replaceRow);\n this.editor.markdownEditorDiv.appendChild(panel);\n this._panel = panel;\n }\n\n _iconBtn(label, svgHtml) {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'fj:me-btn fj:me-btn-xs fj:me-btn-square fj:me-btn-ghost';\n btn.setAttribute('aria-label', label);\n btn.innerHTML = svgHtml;\n const svg = btn.querySelector('svg');\n if (svg) svg.setAttribute('aria-hidden', 'true');\n return btn;\n }\n\n _search() {\n const query = this._findInput?.value ?? '';\n const value = this.editor.usertextarea.value;\n\n if (!query) {\n this._matches = [];\n this._currentIndex = -1;\n this._clearMatchHighlight();\n this._updateCount();\n return;\n }\n\n const searchValue = this._caseSensitive ? value : value.toLowerCase();\n const searchQuery = this._caseSensitive ? query : query.toLowerCase();\n this._matches = [];\n\n let pos = 0;\n while (pos <= searchValue.length - searchQuery.length) {\n const idx = searchValue.indexOf(searchQuery, pos);\n if (idx === -1) break;\n this._matches.push({ start: idx, end: idx + query.length });\n pos = idx + 1;\n }\n\n if (this._matches.length > 0) {\n this._currentIndex = Math.min(\n Math.max(this._currentIndex, 0),\n this._matches.length - 1\n );\n } else {\n this._currentIndex = -1;\n }\n\n this._selectCurrent();\n this._updateCount();\n }\n\n _next() {\n if (this._matches.length === 0) return;\n this._currentIndex = (this._currentIndex + 1) % this._matches.length;\n this._selectCurrent();\n this._updateCount();\n }\n\n _prev() {\n if (this._matches.length === 0) return;\n this._currentIndex = (this._currentIndex - 1 + this._matches.length) % this._matches.length;\n this._selectCurrent();\n this._updateCount();\n }\n\n _selectCurrent() {\n if (this._currentIndex === -1 || this._matches.length === 0) {\n this._clearMatchHighlight();\n return;\n }\n const { start } = this._matches[this._currentIndex];\n this._scrollToMatch(this.editor.usertextarea, start);\n this._showMatchHighlight();\n }\n\n _scrollToMatch(textarea, pos) {\n const lineHeight = parseInt(window.getComputedStyle(textarea).lineHeight) || 20;\n const linesBefore = textarea.value.substring(0, pos).split('\\n').length - 1;\n const rowsVisible = Math.floor(textarea.clientHeight / lineHeight);\n textarea.scrollTop = Math.max(0, (linesBefore - Math.floor(rowsVisible / 2)) * lineHeight);\n }\n\n _showMatchHighlight() {\n this._clearMatchHighlight();\n if (this._currentIndex === -1 || !this._matches.length) return;\n\n const { start, end } = this._matches[this._currentIndex];\n const textarea = this.editor.usertextarea;\n const cs = window.getComputedStyle(textarea);\n const wrapper = textarea.parentElement;\n\n // Mirror div replicates textarea layout to measure exact character positions\n const mirror = document.createElement('div');\n Object.assign(mirror.style, {\n position: 'absolute',\n visibility: 'hidden',\n pointerEvents: 'none',\n top: '0', left: '0', right: '0',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n overflowWrap: 'break-word',\n font: cs.font,\n lineHeight: cs.lineHeight,\n paddingTop: cs.paddingTop,\n paddingRight: cs.paddingRight,\n paddingBottom: cs.paddingBottom,\n paddingLeft: cs.paddingLeft,\n boxSizing: 'border-box',\n });\n\n const marker = document.createElement('span');\n marker.textContent = textarea.value.substring(start, end) || '';\n mirror.appendChild(document.createTextNode(textarea.value.substring(0, start)));\n mirror.appendChild(marker);\n mirror.appendChild(document.createTextNode(textarea.value.substring(end)));\n\n wrapper.appendChild(mirror);\n try {\n const wRect = wrapper.getBoundingClientRect();\n const mRect = marker.getBoundingClientRect();\n\n const hl = document.createElement('div');\n Object.assign(hl.style, {\n position: 'absolute',\n top: (mRect.top - wRect.top - textarea.scrollTop) + 'px',\n left: (mRect.left - wRect.left) + 'px',\n width: Math.max(mRect.width, 2) + 'px',\n height: mRect.height + 'px',\n background: 'color-mix(in oklch, var(--color-primary, oklch(0.6 0.2 250)), transparent 55%)',\n borderRadius: '2px',\n pointerEvents: 'none',\n zIndex: '2',\n });\n wrapper.appendChild(hl);\n this._highlightEl = hl;\n } finally {\n wrapper.removeChild(mirror);\n }\n }\n\n _clearMatchHighlight() {\n this._highlightEl?.remove();\n this._highlightEl = null;\n }\n\n _updateCount() {\n if (!this._countEl) return;\n if (this._matches.length === 0) {\n this._countEl.textContent = this._findInput?.value ? 'No results' : '';\n } else {\n this._countEl.textContent = `${this._currentIndex + 1} of ${this._matches.length}`;\n }\n }\n\n _replace() {\n if (this._currentIndex === -1) return;\n const { start, end } = this._matches[this._currentIndex];\n const textarea = this.editor.usertextarea;\n const replaceWith = this._replaceInput.value;\n\n textarea.value =\n textarea.value.substring(0, start) +\n replaceWith +\n textarea.value.substring(end);\n\n this.editor.render();\n this.editor.notifyChange();\n\n this._search();\n }\n\n _replaceAll() {\n const query = this._findInput?.value;\n if (!query) return;\n const replaceWith = this._replaceInput.value;\n const textarea = this.editor.usertextarea;\n\n const escaped = query.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const flags = this._caseSensitive ? 'g' : 'gi';\n textarea.value = textarea.value.replace(new RegExp(escaped, flags), replaceWith);\n\n this.editor.render();\n this.editor.notifyChange();\n\n this._currentIndex = 0;\n this._search();\n }\n\n destroy() {\n this.editor.usertextarea.removeEventListener('keydown', this._taHandler);\n if (this._scrollHandler) {\n this.editor.usertextarea.removeEventListener('scroll', this._scrollHandler);\n }\n this._clearMatchHighlight();\n this._panel?.remove();\n }\n}\n","import { uploadImage } from './imageUpload.js';\n\n// Deliberately strict: only a bare http(s) URL with no whitespace becomes a link.\n// Pasting a sentence that happens to contain a URL should paste as written.\nconst BARE_URL = /^https?:\\/\\/\\S+$/i;\n\n/**\n * Handles pasting and dropping into the textarea:\n *\n * - image files are uploaded and inserted, when image upload is configured\n * - a bare URL pasted over a selection becomes [selection](url)\n *\n * Anything else falls through to the browser's own paste.\n */\nexport default class PasteManager {\n constructor(editor) {\n this.editor = editor;\n this.textarea = editor.usertextarea;\n\n this._pasteHandler = (e) => this._onPaste(e);\n this._dropHandler = (e) => this._onDrop(e);\n this._dragOverHandler = (e) => { if (this._carriesFiles(e.dataTransfer)) e.preventDefault(); };\n\n this.textarea.addEventListener('paste', this._pasteHandler);\n this.textarea.addEventListener('drop', this._dropHandler);\n this.textarea.addEventListener('dragover', this._dragOverHandler);\n }\n\n destroy() {\n this.textarea.removeEventListener('paste', this._pasteHandler);\n this.textarea.removeEventListener('drop', this._dropHandler);\n this.textarea.removeEventListener('dragover', this._dragOverHandler);\n }\n\n _carriesFiles(dataTransfer) {\n return Array.from(dataTransfer?.types ?? []).includes('Files');\n }\n\n _imageFiles(dataTransfer) {\n return Array.from(dataTransfer?.files ?? []).filter(f => f.type?.startsWith('image/'));\n }\n\n _onPaste(event) {\n const images = this._imageFiles(event.clipboardData);\n if (images.length) {\n if (!this.editor.imageUpload) {\n // Nothing to prevent here, a textarea cannot paste an image anyway,\n // but say why nothing happened rather than leaving it a mystery.\n console.warn('[MarkdownEditor] An image was pasted but no upload endpoint is configured. Add { image: { fileInput: { uploadUrl: \"...\" } } } to the toolbar to enable it.');\n return;\n }\n event.preventDefault();\n this._uploadAll(images);\n return;\n }\n\n const pasted = event.clipboardData?.getData('text/plain')?.trim();\n const { selectionStart, selectionEnd } = this.textarea;\n const hasSelection = selectionEnd > selectionStart;\n\n if (pasted && hasSelection && BARE_URL.test(pasted)) {\n event.preventDefault();\n const selected = this.textarea.value.slice(selectionStart, selectionEnd);\n const link = `[${selected}](${pasted})`;\n this.editor.insertText(link, link.length, 0);\n }\n }\n\n _onDrop(event) {\n if (!this._carriesFiles(event.dataTransfer)) return;\n\n // Always swallow file drops. The browser's default is to navigate to the\n // dropped file, which would throw away everything the user has written,\n // and dragover has already advertised the textarea as a drop target.\n event.preventDefault();\n\n const images = this._imageFiles(event.dataTransfer);\n if (!images.length) return;\n\n if (!this.editor.imageUpload) {\n console.warn('[MarkdownEditor] An image was dropped but no upload endpoint is configured. Add { image: { fileInput: { uploadUrl: \"...\" } } } to the toolbar to enable it.');\n return;\n }\n\n this._uploadAll(images);\n }\n\n /**\n * Inserts a placeholder immediately so the editor does not appear frozen,\n * then swaps it for the real image once the upload resolves. Uploads run one\n * at a time so the placeholders stay in the order the files arrived.\n */\n async _uploadAll(files) {\n for (const file of files) {\n const token = `![${this.editor.label('Uploading...')}]()`;\n this.editor.insertText(token, token.length, 0);\n\n try {\n const { path, alt } = await uploadImage(file, this.editor.imageUpload);\n this._replace(token, ``);\n } catch (err) {\n // Leave a visible marker rather than silently removing the\n // placeholder. Without devtools open, a vanishing placeholder\n // looks like nothing happened at all.\n this._replace(token, `![${this.editor.label('Upload failed')}]()`);\n console.error('[MarkdownEditor] Image upload failed.', err);\n }\n }\n }\n\n _replace(token, replacement) {\n const textarea = this.textarea;\n const at = textarea.value.indexOf(token);\n if (at === -1) return; // the user deleted it while the upload was in flight\n\n textarea.value = textarea.value.slice(0, at) + replacement + textarea.value.slice(at + token.length);\n const caret = at + replacement.length;\n textarea.setSelectionRange(caret, caret);\n\n this.editor.render();\n this.editor.notifyChange();\n }\n}\n","import '../styles/main.css';\nimport { Marked } from 'marked';\nimport DOMPurify from 'dompurify';\nimport Toolbar from './toolbar/Toolbar.js';\nimport Tool from './toolbar/Tool.js';\nimport { modal } from './modal.js';\nimport Preview from './Preview.js';\nimport Footer from './Footer.js';\nimport UndoRedoManager from '../utils/UndoRedoManager.js';\nimport IndentManager from '../utils/IndentManager.js';\nimport ListManager from '../utils/ListManager.js';\nimport ShortcutManager from '../utils/ShortcutManager.js';\nimport FindReplace from '../utils/FindReplace.js';\nimport PasteManager from '../utils/PasteManager.js';\nimport { applyVariableSamples } from '../utils/variables.js';\n\n// Own instance rather than marked.setOptions(), which would mutate the shared\n// singleton and silently change behaviour for a host app that also uses marked.\nconst defaultRenderer = new Marked({ breaks: true });\n\nclass MarkdownEditor {\n constructor(selector, options = {}) {\n this.usertextarea = typeof selector === 'string' ? document.querySelector(selector) : selector;\n this.options = options;\n this.mode = options.mode || 'plain';\n this.preview = (this.options.toolbar) ? this.options.toolbar.includes('preview') : true;\n this.footerOptions = this._parseFooterOptions(options.footer);\n this.variables = this._parseVariables(options.toolbar);\n this.imageUpload = this._parseImageUpload(options.toolbar);\n this.previewTimer = null;\n this.init();\n this.undoRedoManager = new UndoRedoManager(this);\n this.listManager = new ListManager(this);\n this.indentManager = new IndentManager(this);\n this.shortcutManager = new ShortcutManager(this);\n this.findReplace = new FindReplace(this);\n this.pasteManager = new PasteManager(this);\n this._warnIfStylesheetMissing();\n }\n\n /**\n * The stylesheet is a separate file, so forgetting it leaves a working but\n * unstyled editor with nothing in the console to explain why. main.css sets\n * --mte-css on the wrapper; if it does not resolve, the stylesheet never\n * loaded. Warn once per page rather than once per editor.\n */\n _warnIfStylesheetMissing() {\n if (MarkdownEditor._cssWarned) return;\n // A detached or hidden container cannot be measured, so take no view\n if (!this.editorContainer?.isConnected) return;\n\n if (getComputedStyle(this.editorContainer).getPropertyValue('--mte-css').trim()) return;\n\n MarkdownEditor._cssWarned = true;\n console.error(\n '[MarkdownEditor] Stylesheet not loaded, so the editor will look unstyled.\\n' +\n \" Bundlers: import 'markdown-text-editor/style.css'\\n\" +\n ' Browsers: <link rel=\"stylesheet\" href=\".../dist/markdown-text-editor.css\">'\n );\n }\n\n /**\n * Returns the translation for a UI string, or the string itself when none is\n * configured. Keyed by the English text, the way gettext is, so a tool does\n * not need to know anything about translation.\n */\n label(text) {\n return this.options.labels?.[text] ?? text;\n }\n\n /**\n * Upload settings live in the toolbar as { image: { fileInput: {...} } }, but\n * paste and drop need them before the toolbar exists. Read them up front, and\n * only when an upload endpoint is actually configured.\n */\n _parseImageUpload(toolbar) {\n const entry = (Array.isArray(toolbar) ? toolbar : [])\n .find(tool => tool && typeof tool === 'object' && tool.image);\n const fileInput = entry?.image?.fileInput;\n return fileInput?.uploadUrl ? fileInput : null;\n }\n\n /**\n * Variables are configured inline in the toolbar as { variables: [...] },\n * but the preview needs them before the toolbar exists, since createEditor()\n * renders first. Read them from the toolbar array at construction instead.\n */\n _parseVariables(toolbar) {\n const entry = (Array.isArray(toolbar) ? toolbar : [])\n .find(tool => tool && typeof tool === 'object' && Array.isArray(tool.variables));\n return entry ? entry.variables : [];\n }\n\n _parseFooterOptions(footer) {\n if (footer === false) return null;\n const opts = footer ?? {};\n return {\n line: opts.line !== false,\n col: opts.col !== false,\n chars: opts.chars !== false,\n words: opts.words === true,\n };\n }\n\n init() {\n this.createEditor();\n this.addToolbar();\n this.addFooter();\n this._toolbarH = this.editorContainer.querySelector('.toolbar')?.offsetHeight ?? 0;\n this._footerH = this.editorContainer.querySelector('.editor-footer')?.offsetHeight ?? 0;\n this._autoGrow();\n }\n\n createEditor() {\n if (!this.isTextareaValid()) return;\n\n this.applyDefaultAttributes();\n this.buildEditorLayout();\n this.addInputListener();\n this.render();\n }\n\n isTextareaValid() {\n return this.usertextarea.tagName === 'TEXTAREA';\n }\n\n applyDefaultAttributes() {\n const hasLabel = (this.usertextarea.id && document.querySelector(`label[for=\"${this.usertextarea.id}\"]`))\n || this.usertextarea.getAttribute('aria-label')\n || this.usertextarea.getAttribute('aria-labelledby');\n if (!hasLabel) {\n this.usertextarea.setAttribute('aria-label', this.options.label || 'Markdown editor');\n this._addedAriaLabel = true;\n }\n\n this.usertextarea.classList.add(\n \"editor-textarea\",\n \"fj:focus:ring-0\",\n \"fj:focus:outline-0\",\n \"fj:border-0\",\n \"fj:border-base-soft\",\n \"fj:px-4\",\n \"fj:py-2\",\n \"fj:max-w-full\",\n \"fj:w-full\",\n \"fj:h-full\",\n \"fj:bg-transparent\",\n \"fj:outline-0\",\n \"fj:appearance-none\",\n \"fj:overflow-y-auto\",\n );\n if (!this.usertextarea.hasAttribute('placeholder')) {\n this.usertextarea.placeholder = this.options.placeholder || 'Write your markdown...';\n }\n }\n\n buildEditorLayout() {\n this.editorContainer = document.createElement('div');\n this.editorContainer.className = `\n markdown-editor-wrapper\n fj:me-surface\n fj:me-surface-outline\n fj:me-surface-rounded\n fj:overflow-hidden\n fj:flex\n fj:flex-col\n `;\n const theme = this.options.theme\n ?? this.usertextarea.closest('[data-theme]')?.getAttribute('data-theme');\n if (theme) this.editorContainer.setAttribute('data-theme', theme);\n\n // Mirror the textarea's id so a single editor can be targeted in CSS.\n // Copied as a data attribute, not an id, so getElementById still\n // resolves to the textarea.\n if (this.usertextarea.id) this.editorContainer.dataset.editor = this.usertextarea.id;\n\n this.editorContainer.style.minHeight = (this.options.minHeight ?? 200) + 'px';\n\n this.usertextarea.parentNode.insertBefore(this.editorContainer, this.usertextarea);\n\n this.markdownEditorDiv = document.createElement('div');\n this.markdownEditorDiv.className = `editor-layout fj:relative fj:grid fj:grid-cols-1 fj:flex-1 fj:min-h-0`;\n this.editorContainer.appendChild(this.markdownEditorDiv);\n\n this.addTextareaWrapper();\n if (this.preview) this.addPreviewWrapper();\n }\n\n addTextareaWrapper() {\n const textareaContainer = document.createElement('div');\n textareaContainer.className = `\n textarea-wrapper\n not-prose\n fj:me-surface\n fj:h-full\n fj:min-h-0\n fj:relative\n fj:grid\n `;\n\n if(this.mode == 'hybrid'){\n this.displayLayer = document.createElement('div');\n this.displayLayer.setAttribute('data-placeholder', this.usertextarea.placeholder);\n this.displayLayer.setAttribute(\"aria-hidden\", true);\n this.displayLayer.className = `\n display-layer\n fj:px-4\n fj:py-2\n fj:whitespace-pre-wrap fj:wrap-break-word\n fj:pointer-events-none\n fj:absolute\n fj:inset-0\n fj:m-0\n fj:box-border\n fj:z-0\n fj:overflow-y-auto\n fj:empty:after:content-[attr(data-placeholder)]\n fj:empty:after:absolute\n fj:empty:after:inset-0\n fj:empty:after:px-4\n fj:empty:after:py-2\n fj:empty:after:text-[CanvasText]\n fj:empty:after:opacity-50\n `;\n\n this.usertextarea.className += `\n fj:text-transparent\n fj:caret-primary\n fj:resize-none\n fj:outline-none\n fj:m-0\n fj:box-border\n fj:relative\n fj:z-10\n `;\n\n textareaContainer.appendChild(this.displayLayer);\n }\n\n textareaContainer.appendChild(this.usertextarea);\n this.markdownEditorDiv.appendChild(textareaContainer);\n }\n\n \n\n addPreviewWrapper() {\n const previewInstance = new Preview(this.markdownEditorDiv);\n this.previewContent = previewInstance.getPreviewContent();\n }\n\n addInputListener() {\n this._inputHandler = () => {\n this._autoGrow();\n this.renderHybrid(); // Fast: Only Regex\n this.debouncedPreview(); // Slow: Heavy Markdown Parse\n this.notifyChange();\n };\n\n this._scrollHandler = () => {\n if (this._scrollRaf) return;\n this._scrollRaf = requestAnimationFrame(() => {\n this._scrollRaf = null;\n\n if (this.mode === 'hybrid') {\n // PIXEL PERFECT SYNC: Do not use ratios for the hybrid layer\n this.displayLayer.scrollTop = this.usertextarea.scrollTop;\n this.displayLayer.scrollLeft = this.usertextarea.scrollLeft;\n }\n\n if (this.preview && this.previewContent) {\n // RATIO SYNC: Use ratio only for the fully rendered preview\n const textarea = this.usertextarea;\n const ratio = textarea.scrollTop / (textarea.scrollHeight - textarea.clientHeight);\n this.previewContent.scrollTop = ratio * (this.previewContent.scrollHeight - this.previewContent.clientHeight);\n }\n });\n };\n\n this.usertextarea.addEventListener('input', this._inputHandler);\n this.usertextarea.addEventListener('scroll', this._scrollHandler);\n }\n\n debouncedPreview() {\n if (!this.preview) return;\n clearTimeout(this.previewTimer);\n this.previewTimer = setTimeout(() => {\n this.previewContent.innerHTML = this._renderMarkdown(this.usertextarea.value);\n this.wirePreviewCheckboxes();\n const textarea = this.usertextarea;\n const ratio = textarea.scrollTop / (textarea.scrollHeight - textarea.clientHeight);\n this.previewContent.scrollTop = ratio * (this.previewContent.scrollHeight - this.previewContent.clientHeight);\n }, 150); // 150ms delay feels instant but saves CPU\n }\n\n /**\n * Renders markdown to sanitized HTML exactly as the preview does, honouring\n * the configured renderer and sanitizer. Useful from a custom tool that has\n * to embed rendered content, such as a tooltip body.\n */\n renderMarkdown(markdown) {\n return this._renderMarkdown(markdown);\n }\n\n /**\n * Builds a small toolbar bound to another textarea, for a custom tool that\n * collects rich text in its own dialog. The tools are the real ones, so they\n * behave identically, and this replaces hand-rolling a fake editor object.\n *\n * Returns the toolbar element; append it wherever you like.\n */\n createToolbar(textarea, tools = ['bold', 'italic', 'strikethrough']) {\n const host = Object.create(this);\n\n // Only the target and the write path differ. Everything else, including\n // label() and the options, is inherited from the real editor.\n host.usertextarea = textarea;\n host.scrollToView = () => {};\n host.render = () => {};\n host.notifyChange = () => {};\n host.insertText = (text, selectionOffset = 0, trailingLength = 0) => {\n const { selectionStart, selectionEnd, value } = textarea;\n textarea.value = value.slice(0, selectionStart) + text + value.slice(selectionEnd);\n textarea.focus();\n textarea.setSelectionRange(\n selectionStart + selectionOffset,\n selectionStart + text.length - trailingLength,\n );\n };\n\n return new Toolbar(host, tools, { standalone: true }).toolbar;\n }\n\n _renderMarkdown(markdown) {\n const render = this.options.renderer ?? (md => defaultRenderer.parse(md));\n const sanitize = this.options.sanitizer ?? (html => DOMPurify.sanitize(html));\n\n // Variables that declare a sample are shown as that sample in the preview.\n // Only this copy is affected; the textarea keeps the real placeholders.\n const source = applyVariableSamples(markdown, this.variables);\n const html = render(source);\n\n // Clickable checkboxes are matched by index against task-list lines, so a\n // custom renderer that emits none breaks them silently. Warn once.\n if (this.options.renderer && !this._taskListWarned\n && /^\\s*[-*] \\[[ xX]\\] /m.test(source) && !/type=[\"']?checkbox/.test(html)) {\n this._taskListWarned = true;\n console.warn('[MarkdownEditor] Task list syntax found, but the custom renderer emitted no checkboxes. Clickable checkboxes in the preview need a task-list plugin, e.g. markdown-it-task-lists.');\n }\n\n return sanitize(html);\n }\n\n wirePreviewCheckboxes() {\n const checkboxes = this.previewContent.querySelectorAll('input[type=\"checkbox\"]');\n checkboxes.forEach((checkbox, index) => {\n checkbox.removeAttribute('disabled');\n checkbox.addEventListener('click', (e) => {\n e.preventDefault();\n const lines = this.usertextarea.value.split('\\n');\n let count = 0;\n for (let i = 0; i < lines.length; i++) {\n if (/^(\\s*)([-*] \\[[ xX]\\] )/.test(lines[i])) {\n if (count === index) {\n if (checkbox.checked) {\n lines[i] = lines[i].replace(/\\[ \\]/, '[x]');\n } else {\n lines[i] = lines[i].replace(/\\[[xX]\\]/, '[ ]');\n }\n break;\n }\n count++;\n }\n }\n this.usertextarea.value = lines.join('\\n');\n this.render();\n this.notifyChange();\n });\n });\n }\n\n addFooter() {\n if (!this.footerOptions) return;\n const { line, col, chars, words } = this.footerOptions;\n if (!line && !col && !chars && !words) return;\n this.footer = new Footer(this.editorContainer, this.footerOptions);\n this.footer.update(this.usertextarea);\n\n this._footerUpdate = () => this.footer.update(this.usertextarea);\n this.usertextarea.addEventListener('input', this._footerUpdate);\n this.usertextarea.addEventListener('click', this._footerUpdate);\n this.usertextarea.addEventListener('keyup', this._footerUpdate);\n this.usertextarea.addEventListener('focus', this._footerUpdate);\n }\n\n addToolbar() {\n this.toolbarInstance = new Toolbar(\n this,\n this.options.toolbar ||\n [\n // History/System (Usually far left)\n 'undo', \n 'redo',\n \n // Block Structure\n 'heading', \n 'blockquote', \n \n // Lists & Indentation\n 'ul', \n 'ol', \n 'checklist', \n 'outdent', \n 'indent', \n \n // Inline Formatting\n 'bold',\n 'italic',\n 'strikethrough',\n 'code',\n\n // Block Formatting\n 'codeblock',\n 'hr',\n 'table',\n\n // Rich Media/Links\n 'link',\n 'image',\n \n // View/Preview (Usually far right)\n 'preview'\n ]\n );\n }\n\n insertText(text, selectionOffset = 0, trailingLength = 0) {\n const { selectionStart, selectionEnd } = this.usertextarea;\n const value = this.usertextarea.value;\n this.usertextarea.value = `${value.substring(0, selectionStart)}${text}${value.substring(selectionEnd)}`;\n this.usertextarea.focus();\n this.usertextarea.setSelectionRange(selectionStart + selectionOffset, selectionStart + text.length - trailingLength);\n\n // Scroll the textarea to the inserted text\n this.scrollToView();\n\n this.render();\n this.notifyChange();\n }\n\n scrollToView() {\n const textarea = this.usertextarea;\n const selectionStart = textarea.selectionStart;\n\n const lineHeight = parseInt(window.getComputedStyle(textarea).lineHeight);\n const currentLine = textarea.value.substring(0, selectionStart).split('\\n').length - 1;\n const rowsInView = Math.floor(textarea.clientHeight / lineHeight);\n textarea.scrollTop = (currentLine - Math.floor(rowsInView / 2)) * lineHeight;\n }\n \n\n _highlight(rawValue) {\n let out = rawValue\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n\n out = out\n .replace(/```(\\w+)?\\n([\\s\\S]*?)```/g,\n '<span class=\"fj:opacity-30\">```$1</span>\\n$2<span class=\"fj:opacity-30\">```</span>')\n .replace(/`([^`\\n]+)`/g,\n '<span class=\"fj:opacity-40\">`</span><span class=\"fj:text-accent\">$1</span><span class=\"fj:opacity-40\">`</span>')\n .replace(/^(#+ )(.*)$/gm,\n '<span class=\"fj:text-primary\"><span class=\"fj:opacity-40\">$1</span><span class=\"faux-bold\">$2</span></span>')\n .replace(/\\*\\*(.*?)\\*\\*/g,\n '<span class=\"fj:text-secondary\"><span class=\"fj:opacity-40\">**</span><span class=\"faux-bold\">$1</span><span class=\"fj:opacity-40\">**</span></span>')\n .replace(/^([\\s]*)([\\-\\*] |[\\d]+\\. |\\[[\\s xX]\\] )(.*)$/gm,\n '$1<span class=\"fj:text-primary\">$2</span>$3')\n .replace(/(\\*|_)(.*?)\\1/g,\n '<span class=\"fj:text-accent\"><span class=\"fj:opacity-40\">$1</span>$2<span class=\"fj:opacity-40\">$1</span></span>')\n .replace(/~~(.*?)~~/g,\n '<span class=\"fj:line-through fj:opacity-70\"><span class=\"fj:opacity-40\">~~</span>$1<span class=\"fj:opacity-40\">~~</span></span>')\n .replace(/(?<!~)(~)([^~]+)\\1(?!~)/g,\n '<span class=\"fj:line-through fj:opacity-70\"><span class=\"fj:opacity-40\">$1</span>$2<span class=\"fj:opacity-40\">$1</span></span>')\n .replace(/(!?\\[)(.*?)(\\]\\()(.*?)(\\))/g,\n '<span class=\"fj:opacity-40\">$1</span><span class=\"fj:text-primary\">$2</span><span class=\"fj:opacity-40\">$3</span><span class=\"fj:underline fj:opacity-50\">$4</span><span class=\"fj:opacity-50\">$5</span>');\n\n if (rawValue.endsWith('\\n')) out += ' ';\n return out;\n }\n\n renderHybrid() {\n if (this.mode !== 'hybrid') return;\n\n const rawValue = this.usertextarea.value;\n if (rawValue === this._lastRaw) return;\n this._lastRaw = rawValue;\n\n const highlighted = this._highlight(rawValue);\n const newLines = highlighted.split('\\n');\n const lastLines = this._lastLines;\n\n if (!lastLines || lastLines.length !== newLines.length) {\n this.displayLayer.innerHTML = '';\n this._lineNodes = newLines.map((line, i) => {\n const node = document.createElement('span');\n node.innerHTML = line + (i < newLines.length - 1 ? '\\n' : '');\n this.displayLayer.appendChild(node);\n return node;\n });\n this._lastLines = newLines.slice();\n return;\n }\n\n for (let i = 0; i < newLines.length; i++) {\n if (newLines[i] !== lastLines[i]) {\n this._lineNodes[i].innerHTML = newLines[i] + (i < newLines.length - 1 ? '\\n' : '');\n lastLines[i] = newLines[i];\n }\n }\n }\n\n _autoGrow() {\n if (this.editorContainer.classList.contains('is-fullscreen')) return;\n\n const textarea = this.usertextarea;\n // Shrink to 1px to measure natural content height (bypasses h-full)\n textarea.style.height = '1px';\n const contentHeight = textarea.scrollHeight;\n textarea.style.height = ''; // restore — h-full class takes over\n\n const maxHeight = this.options.maxHeight ?? 500;\n this.editorContainer.style.height = (Math.min(contentHeight, maxHeight) + this._toolbarH + this._footerH + 1) + 'px';\n }\n\n notifyChange() {\n if (this.options.onChange) this.options.onChange(this.usertextarea.value);\n }\n\n render() {\n this._autoGrow();\n this.renderHybrid();\n if (this.preview) {\n this.previewContent.innerHTML = this._renderMarkdown(this.usertextarea.value);\n this.wirePreviewCheckboxes();\n }\n }\n\n destroy() {\n this.shortcutManager?.destroy();\n this.findReplace?.destroy();\n this.previewTool?.destroy();\n this.undoRedoManager?.destroy();\n this.listManager?.destroy();\n this.pasteManager?.destroy();\n // Reaches toolbar tools, including custom ones that added listeners\n this.toolbarInstance?.destroy();\n\n if (this._footerUpdate) {\n this.usertextarea.removeEventListener('input', this._footerUpdate);\n this.usertextarea.removeEventListener('click', this._footerUpdate);\n this.usertextarea.removeEventListener('keyup', this._footerUpdate);\n this.usertextarea.removeEventListener('focus', this._footerUpdate);\n }\n\n this.usertextarea.removeEventListener('input', this._inputHandler);\n this.usertextarea.removeEventListener('scroll', this._scrollHandler);\n\n const parent = this.editorContainer.parentNode;\n if (!parent) return;\n\n // Strip classes added by applyDefaultAttributes\n const addedClasses = [\n 'editor-textarea', 'fj:focus:ring-0', 'fj:focus:outline-0', 'fj:border-0',\n 'fj:border-base-soft', 'fj:px-4', 'fj:py-2', 'fj:max-w-full', 'fj:w-full',\n 'fj:h-full', 'fj:bg-transparent', 'fj:outline-0', 'fj:appearance-none', 'fj:overflow-y-auto',\n 'fj:text-transparent', 'fj:caret-primary', 'fj:resize-none', 'fj:outline-none',\n 'fj:m-0', 'fj:box-border', 'fj:relative', 'fj:z-10',\n ];\n addedClasses.forEach(cls => this.usertextarea.classList.remove(cls));\n\n if (this._addedAriaLabel) this.usertextarea.removeAttribute('aria-label');\n this.usertextarea.style.height = '';\n\n parent.insertBefore(this.usertextarea, this.editorContainer);\n this.editorContainer.remove();\n }\n}\n\n// Exposed so you can write your own toolbar tool without forking. Attached to\n// the class rather than exported by name, because adding a named export would\n// change the shape of the UMD and IIFE globals and break every <script> user.\nMarkdownEditor.Tool = Tool;\nMarkdownEditor.modal = modal;\n\nexport default MarkdownEditor;"],"ignoreList":[0,1,30,31,32,33,34,35,36,37,38],"mappings":"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"}
|